ixgbe.c revision 1.327 1 /* $NetBSD: ixgbe.c,v 1.327 2023/09/13 07:28:51 msaitoh Exp $ */
2
3 /******************************************************************************
4
5 Copyright (c) 2001-2017, Intel Corporation
6 All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13
14 2. Redistributions in binary form must reproduce the above copyright
15 notice, this list of conditions and the following disclaimer in the
16 documentation and/or other materials provided with the distribution.
17
18 3. Neither the name of the Intel Corporation nor the names of its
19 contributors may be used to endorse or promote products derived from
20 this software without specific prior written permission.
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 POSSIBILITY OF SUCH DAMAGE.
33
34 ******************************************************************************/
35 /*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 331224 2018-03-19 20:55:05Z erj $*/
36
37 /*
38 * Copyright (c) 2011 The NetBSD Foundation, Inc.
39 * All rights reserved.
40 *
41 * This code is derived from software contributed to The NetBSD Foundation
42 * by Coyote Point Systems, Inc.
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 * notice, this list of conditions and the following disclaimer.
49 * 2. Redistributions in binary form must reproduce the above copyright
50 * notice, this list of conditions and the following disclaimer in the
51 * documentation and/or other materials provided with the distribution.
52 *
53 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
54 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
55 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
57 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
58 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
59 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
60 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
61 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
62 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
63 * POSSIBILITY OF SUCH DAMAGE.
64 */
65
66 #include <sys/cdefs.h>
67 __KERNEL_RCSID(0, "$NetBSD: ixgbe.c,v 1.327 2023/09/13 07:28:51 msaitoh Exp $");
68
69 #ifdef _KERNEL_OPT
70 #include "opt_inet.h"
71 #include "opt_inet6.h"
72 #include "opt_net_mpsafe.h"
73 #endif
74
75 #include "ixgbe.h"
76 #include "ixgbe_phy.h"
77 #include "ixgbe_sriov.h"
78
79 #include <sys/cprng.h>
80 #include <dev/mii/mii.h>
81 #include <dev/mii/miivar.h>
82
83 /************************************************************************
84 * Driver version
85 ************************************************************************/
86 static const char ixgbe_driver_version[] = "4.0.1-k";
87 /* XXX NetBSD: + 3.3.24 */
88
89 /************************************************************************
90 * PCI Device ID Table
91 *
92 * Used by probe to select devices to load on
93 * Last field stores an index into ixgbe_strings
94 * Last entry must be all 0s
95 *
96 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
97 ************************************************************************/
98 static const ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
99 {
100 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
101 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
102 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
103 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
104 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
105 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
106 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_BX, 0, 0, 0},
107 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
108 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
109 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
110 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
111 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
112 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KR, 0, 0, 0},
113 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
114 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
115 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
116 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_EM, 0, 0, 0},
117 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
118 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
119 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
120 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
121 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
122 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0},
123 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
124 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0},
125 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF_QP, 0, 0, 0},
126 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_QSFP_SF_QP, 0, 0, 0},
127 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0},
128 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1, 0, 0, 0},
129 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T, 0, 0, 0},
130 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T1, 0, 0, 0},
131 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KR, 0, 0, 0},
132 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KX4, 0, 0, 0},
133 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_10G_T, 0, 0, 0},
134 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_1G_T, 0, 0, 0},
135 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_SFP, 0, 0, 0},
136 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_XFI, 0, 0, 0},
137 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR, 0, 0, 0},
138 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR_L, 0, 0, 0},
139 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP, 0, 0, 0},
140 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP_N, 0, 0, 0},
141 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP, 0, 0, 0},
142 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP_N, 0, 0, 0},
143 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII, 0, 0, 0},
144 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII_L, 0, 0, 0},
145 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_10G_T, 0, 0, 0},
146 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T, 0, 0, 0},
147 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L, 0, 0, 0},
148 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_BYPASS, 0, 0, 0},
149 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS, 0, 0, 0},
150 /* required last entry */
151 {0, 0, 0, 0, 0}
152 };
153
154 /************************************************************************
155 * Table of branding strings
156 ************************************************************************/
157 static const char *ixgbe_strings[] = {
158 "Intel(R) PRO/10GbE PCI-Express Network Driver"
159 };
160
161 /************************************************************************
162 * Function prototypes
163 ************************************************************************/
164 static int ixgbe_probe(device_t, cfdata_t, void *);
165 static void ixgbe_quirks(struct adapter *);
166 static void ixgbe_attach(device_t, device_t, void *);
167 static int ixgbe_detach(device_t, int);
168 #if 0
169 static int ixgbe_shutdown(device_t);
170 #endif
171 static bool ixgbe_suspend(device_t, const pmf_qual_t *);
172 static bool ixgbe_resume(device_t, const pmf_qual_t *);
173 static int ixgbe_ifflags_cb(struct ethercom *);
174 static int ixgbe_ioctl(struct ifnet *, u_long, void *);
175 static int ixgbe_init(struct ifnet *);
176 static void ixgbe_init_locked(struct adapter *);
177 static void ixgbe_ifstop(struct ifnet *, int);
178 static void ixgbe_stop_locked(void *);
179 static void ixgbe_init_device_features(struct adapter *);
180 static int ixgbe_check_fan_failure(struct adapter *, u32, bool);
181 static void ixgbe_add_media_types(struct adapter *);
182 static void ixgbe_media_status(struct ifnet *, struct ifmediareq *);
183 static int ixgbe_media_change(struct ifnet *);
184 static int ixgbe_allocate_pci_resources(struct adapter *,
185 const struct pci_attach_args *);
186 static void ixgbe_free_deferred_handlers(struct adapter *);
187 static void ixgbe_get_slot_info(struct adapter *);
188 static int ixgbe_allocate_msix(struct adapter *,
189 const struct pci_attach_args *);
190 static int ixgbe_allocate_legacy(struct adapter *,
191 const struct pci_attach_args *);
192 static int ixgbe_configure_interrupts(struct adapter *);
193 static void ixgbe_free_pciintr_resources(struct adapter *);
194 static void ixgbe_free_pci_resources(struct adapter *);
195 static void ixgbe_local_timer(void *);
196 static void ixgbe_handle_timer(struct work *, void *);
197 static void ixgbe_recovery_mode_timer(void *);
198 static void ixgbe_handle_recovery_mode_timer(struct work *, void *);
199 static int ixgbe_setup_interface(device_t, struct adapter *);
200 static void ixgbe_config_gpie(struct adapter *);
201 static void ixgbe_config_dmac(struct adapter *);
202 static void ixgbe_config_delay_values(struct adapter *);
203 static void ixgbe_schedule_admin_tasklet(struct adapter *);
204 static void ixgbe_config_link(struct adapter *);
205 static void ixgbe_check_wol_support(struct adapter *);
206 static int ixgbe_setup_low_power_mode(struct adapter *);
207 #if 0
208 static void ixgbe_rearm_queues(struct adapter *, u64);
209 #endif
210
211 static void ixgbe_initialize_transmit_units(struct adapter *);
212 static void ixgbe_initialize_receive_units(struct adapter *);
213 static void ixgbe_enable_rx_drop(struct adapter *);
214 static void ixgbe_disable_rx_drop(struct adapter *);
215 static void ixgbe_initialize_rss_mapping(struct adapter *);
216
217 static void ixgbe_enable_intr(struct adapter *);
218 static void ixgbe_disable_intr(struct adapter *);
219 static void ixgbe_update_stats_counters(struct adapter *);
220 static void ixgbe_set_rxfilter(struct adapter *);
221 static void ixgbe_update_link_status(struct adapter *);
222 static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
223 static void ixgbe_configure_ivars(struct adapter *);
224 static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
225 static void ixgbe_eitr_write(struct adapter *, uint32_t, uint32_t);
226
227 static void ixgbe_setup_vlan_hw_tagging(struct adapter *);
228 static void ixgbe_setup_vlan_hw_support(struct adapter *);
229 static int ixgbe_vlan_cb(struct ethercom *, uint16_t, bool);
230 static int ixgbe_register_vlan(struct adapter *, u16);
231 static int ixgbe_unregister_vlan(struct adapter *, u16);
232
233 static void ixgbe_add_device_sysctls(struct adapter *);
234 static void ixgbe_add_hw_stats(struct adapter *);
235 static void ixgbe_clear_evcnt(struct adapter *);
236 static int ixgbe_set_flowcntl(struct adapter *, int);
237 static int ixgbe_set_advertise(struct adapter *, int);
238 static int ixgbe_get_default_advertise(struct adapter *);
239
240 /* Sysctl handlers */
241 static int ixgbe_sysctl_flowcntl(SYSCTLFN_PROTO);
242 static int ixgbe_sysctl_advertise(SYSCTLFN_PROTO);
243 static int ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
244 static int ixgbe_sysctl_dmac(SYSCTLFN_PROTO);
245 static int ixgbe_sysctl_phy_temp(SYSCTLFN_PROTO);
246 static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_PROTO);
247 #ifdef IXGBE_DEBUG
248 static int ixgbe_sysctl_power_state(SYSCTLFN_PROTO);
249 static int ixgbe_sysctl_print_rss_config(SYSCTLFN_PROTO);
250 #endif
251 static int ixgbe_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
252 static int ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
253 static int ixgbe_sysctl_rdh_handler(SYSCTLFN_PROTO);
254 static int ixgbe_sysctl_rdt_handler(SYSCTLFN_PROTO);
255 static int ixgbe_sysctl_tdt_handler(SYSCTLFN_PROTO);
256 static int ixgbe_sysctl_tdh_handler(SYSCTLFN_PROTO);
257 static int ixgbe_sysctl_eee_state(SYSCTLFN_PROTO);
258 static int ixgbe_sysctl_debug(SYSCTLFN_PROTO);
259 static int ixgbe_sysctl_rx_copy_len(SYSCTLFN_PROTO);
260 static int ixgbe_sysctl_tx_process_limit(SYSCTLFN_PROTO);
261 static int ixgbe_sysctl_rx_process_limit(SYSCTLFN_PROTO);
262 static int ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
263 static int ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
264
265 /* Interrupt functions */
266 static int ixgbe_msix_que(void *);
267 static int ixgbe_msix_admin(void *);
268 static void ixgbe_intr_admin_common(struct adapter *, u32, u32 *);
269 static int ixgbe_legacy_irq(void *);
270
271 /* Event handlers running on workqueue */
272 static void ixgbe_handle_que(void *);
273 static void ixgbe_handle_link(void *);
274 static void ixgbe_handle_msf(void *);
275 static void ixgbe_handle_mod(void *, bool);
276 static void ixgbe_handle_phy(void *);
277
278 /* Deferred workqueue handlers */
279 static void ixgbe_handle_admin(struct work *, void *);
280 static void ixgbe_handle_que_work(struct work *, void *);
281
282 static const ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
283
284 /************************************************************************
285 * NetBSD Device Interface Entry Points
286 ************************************************************************/
287 CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
288 ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
289 DVF_DETACH_SHUTDOWN);
290
291 #if 0
292 devclass_t ix_devclass;
293 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
294
295 MODULE_DEPEND(ix, pci, 1, 1, 1);
296 MODULE_DEPEND(ix, ether, 1, 1, 1);
297 #ifdef DEV_NETMAP
298 MODULE_DEPEND(ix, netmap, 1, 1, 1);
299 #endif
300 #endif
301
302 /*
303 * TUNEABLE PARAMETERS:
304 */
305
306 /*
307 * AIM: Adaptive Interrupt Moderation
308 * which means that the interrupt rate
309 * is varied over time based on the
310 * traffic for that interrupt vector
311 */
312 static bool ixgbe_enable_aim = true;
313 #define SYSCTL_INT(_a1, _a2, _a3, _a4, _a5, _a6, _a7)
314 SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RDTUN, &ixgbe_enable_aim, 0,
315 "Enable adaptive interrupt moderation");
316
317 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
318 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
319 &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
320
321 /* How many packets rxeof tries to clean at a time */
322 static int ixgbe_rx_process_limit = 256;
323 SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
324 &ixgbe_rx_process_limit, 0, "Maximum number of received packets to process at a time, -1 means unlimited");
325
326 /* How many packets txeof tries to clean at a time */
327 static int ixgbe_tx_process_limit = 256;
328 SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
329 &ixgbe_tx_process_limit, 0,
330 "Maximum number of sent packets to process at a time, -1 means unlimited");
331
332 /* Flow control setting, default to full */
333 static int ixgbe_flow_control = ixgbe_fc_full;
334 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
335 &ixgbe_flow_control, 0, "Default flow control used for all adapters");
336
337 /* Which packet processing uses workqueue or softint */
338 static bool ixgbe_txrx_workqueue = false;
339
340 /*
341 * Smart speed setting, default to on
342 * this only works as a compile option
343 * right now as its during attach, set
344 * this to 'ixgbe_smart_speed_off' to
345 * disable.
346 */
347 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
348
349 /*
350 * MSI-X should be the default for best performance,
351 * but this allows it to be forced off for testing.
352 */
353 static int ixgbe_enable_msix = 1;
354 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
355 "Enable MSI-X interrupts");
356
357 /*
358 * Number of Queues, can be set to 0,
359 * it then autoconfigures based on the
360 * number of cpus with a max of 8. This
361 * can be overridden manually here.
362 */
363 static int ixgbe_num_queues = 0;
364 SYSCTL_INT(_hw_ix, OID_AUTO, num_queues, CTLFLAG_RDTUN, &ixgbe_num_queues, 0,
365 "Number of queues to configure, 0 indicates autoconfigure");
366
367 /*
368 * Number of TX descriptors per ring,
369 * setting higher than RX as this seems
370 * the better performing choice.
371 */
372 static int ixgbe_txd = PERFORM_TXD;
373 SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
374 "Number of transmit descriptors per queue");
375
376 /* Number of RX descriptors per ring */
377 static int ixgbe_rxd = PERFORM_RXD;
378 SYSCTL_INT(_hw_ix, OID_AUTO, rxd, CTLFLAG_RDTUN, &ixgbe_rxd, 0,
379 "Number of receive descriptors per queue");
380
381 /*
382 * Defining this on will allow the use
383 * of unsupported SFP+ modules, note that
384 * doing so you are on your own :)
385 */
386 static int allow_unsupported_sfp = false;
387 #define TUNABLE_INT(__x, __y)
388 TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
389
390 /*
391 * Not sure if Flow Director is fully baked,
392 * so we'll default to turning it off.
393 */
394 static int ixgbe_enable_fdir = 0;
395 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
396 "Enable Flow Director");
397
398 /* Legacy Transmit (single queue) */
399 static int ixgbe_enable_legacy_tx = 0;
400 SYSCTL_INT(_hw_ix, OID_AUTO, enable_legacy_tx, CTLFLAG_RDTUN,
401 &ixgbe_enable_legacy_tx, 0, "Enable Legacy TX flow");
402
403 /* Receive-Side Scaling */
404 static int ixgbe_enable_rss = 1;
405 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
406 "Enable Receive-Side Scaling (RSS)");
407
408 #if 0
409 static int (*ixgbe_start_locked)(struct ifnet *, struct tx_ring *);
410 static int (*ixgbe_ring_empty)(struct ifnet *, pcq_t *);
411 #endif
412
413 #ifdef NET_MPSAFE
414 #define IXGBE_MPSAFE 1
415 #define IXGBE_CALLOUT_FLAGS CALLOUT_MPSAFE
416 #define IXGBE_SOFTINT_FLAGS SOFTINT_MPSAFE
417 #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE
418 #define IXGBE_TASKLET_WQ_FLAGS WQ_MPSAFE
419 #else
420 #define IXGBE_CALLOUT_FLAGS 0
421 #define IXGBE_SOFTINT_FLAGS 0
422 #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU
423 #define IXGBE_TASKLET_WQ_FLAGS 0
424 #endif
425 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
426
427 /* Interval between reports of errors */
428 static const struct timeval ixgbe_errlog_intrvl = { 60, 0 }; /* 60s */
429
430 /************************************************************************
431 * ixgbe_initialize_rss_mapping
432 ************************************************************************/
433 static void
434 ixgbe_initialize_rss_mapping(struct adapter *adapter)
435 {
436 struct ixgbe_hw *hw = &adapter->hw;
437 u32 reta = 0, mrqc, rss_key[10];
438 int queue_id, table_size, index_mult;
439 int i, j;
440 u32 rss_hash_config;
441
442 /* force use default RSS key. */
443 #ifdef __NetBSD__
444 rss_getkey((uint8_t *) &rss_key);
445 #else
446 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
447 /* Fetch the configured RSS key */
448 rss_getkey((uint8_t *) &rss_key);
449 } else {
450 /* set up random bits */
451 cprng_fast(&rss_key, sizeof(rss_key));
452 }
453 #endif
454
455 /* Set multiplier for RETA setup and table size based on MAC */
456 index_mult = 0x1;
457 table_size = 128;
458 switch (adapter->hw.mac.type) {
459 case ixgbe_mac_82598EB:
460 index_mult = 0x11;
461 break;
462 case ixgbe_mac_X550:
463 case ixgbe_mac_X550EM_x:
464 case ixgbe_mac_X550EM_a:
465 table_size = 512;
466 break;
467 default:
468 break;
469 }
470
471 /* Set up the redirection table */
472 for (i = 0, j = 0; i < table_size; i++, j++) {
473 if (j == adapter->num_queues)
474 j = 0;
475
476 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
477 /*
478 * Fetch the RSS bucket id for the given indirection
479 * entry. Cap it at the number of configured buckets
480 * (which is num_queues.)
481 */
482 queue_id = rss_get_indirection_to_bucket(i);
483 queue_id = queue_id % adapter->num_queues;
484 } else
485 queue_id = (j * index_mult);
486
487 /*
488 * The low 8 bits are for hash value (n+0);
489 * The next 8 bits are for hash value (n+1), etc.
490 */
491 reta = reta >> 8;
492 reta = reta | (((uint32_t) queue_id) << 24);
493 if ((i & 3) == 3) {
494 if (i < 128)
495 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
496 else
497 IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
498 reta);
499 reta = 0;
500 }
501 }
502
503 /* Now fill our hash function seeds */
504 for (i = 0; i < 10; i++)
505 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
506
507 /* Perform hash on these packet types */
508 if (adapter->feat_en & IXGBE_FEATURE_RSS)
509 rss_hash_config = rss_gethashconfig();
510 else {
511 /*
512 * Disable UDP - IP fragments aren't currently being handled
513 * and so we end up with a mix of 2-tuple and 4-tuple
514 * traffic.
515 */
516 rss_hash_config = RSS_HASHTYPE_RSS_IPV4
517 | RSS_HASHTYPE_RSS_TCP_IPV4
518 | RSS_HASHTYPE_RSS_IPV6
519 | RSS_HASHTYPE_RSS_TCP_IPV6
520 | RSS_HASHTYPE_RSS_IPV6_EX
521 | RSS_HASHTYPE_RSS_TCP_IPV6_EX;
522 }
523
524 mrqc = IXGBE_MRQC_RSSEN;
525 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
526 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
527 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
528 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
529 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
530 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
531 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
532 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
533 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
534 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
535 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
536 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
537 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
538 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
539 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
540 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
541 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
542 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
543 mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
544 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
545 } /* ixgbe_initialize_rss_mapping */
546
547 /************************************************************************
548 * ixgbe_initialize_receive_units - Setup receive registers and features.
549 ************************************************************************/
550 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
551
552 static void
553 ixgbe_initialize_receive_units(struct adapter *adapter)
554 {
555 struct rx_ring *rxr = adapter->rx_rings;
556 struct ixgbe_hw *hw = &adapter->hw;
557 struct ifnet *ifp = adapter->ifp;
558 int i, j;
559 u32 bufsz, fctrl, srrctl, rxcsum;
560 u32 hlreg;
561
562 /*
563 * Make sure receives are disabled while
564 * setting up the descriptor ring
565 */
566 ixgbe_disable_rx(hw);
567
568 /* Enable broadcasts */
569 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
570 fctrl |= IXGBE_FCTRL_BAM;
571 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
572 fctrl |= IXGBE_FCTRL_DPF;
573 fctrl |= IXGBE_FCTRL_PMCF;
574 }
575 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
576
577 /* Set for Jumbo Frames? */
578 hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
579 if (ifp->if_mtu > ETHERMTU)
580 hlreg |= IXGBE_HLREG0_JUMBOEN;
581 else
582 hlreg &= ~IXGBE_HLREG0_JUMBOEN;
583
584 #ifdef DEV_NETMAP
585 /* CRC stripping is conditional in Netmap */
586 if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
587 (ifp->if_capenable & IFCAP_NETMAP) &&
588 !ix_crcstrip)
589 hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
590 else
591 #endif /* DEV_NETMAP */
592 hlreg |= IXGBE_HLREG0_RXCRCSTRP;
593
594 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
595
596 bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
597 IXGBE_SRRCTL_BSIZEPKT_SHIFT;
598
599 for (i = 0; i < adapter->num_queues; i++, rxr++) {
600 u64 rdba = rxr->rxdma.dma_paddr;
601 u32 reg;
602 int regnum = i / 4; /* 1 register per 4 queues */
603 int regshift = i % 4; /* 4 bits per 1 queue */
604 j = rxr->me;
605
606 /* Setup the Base and Length of the Rx Descriptor Ring */
607 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
608 (rdba & 0x00000000ffffffffULL));
609 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
610 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
611 adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
612
613 /* Set up the SRRCTL register */
614 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
615 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
616 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
617 srrctl |= bufsz;
618 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
619
620 /* Set RQSMR (Receive Queue Statistic Mapping) register */
621 reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(regnum));
622 reg &= ~(0x000000ffUL << (regshift * 8));
623 reg |= i << (regshift * 8);
624 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(regnum), reg);
625
626 /*
627 * Set DROP_EN iff we have no flow control and >1 queue.
628 * Note that srrctl was cleared shortly before during reset,
629 * so we do not need to clear the bit, but do it just in case
630 * this code is moved elsewhere.
631 */
632 if ((adapter->num_queues > 1) &&
633 (adapter->hw.fc.requested_mode == ixgbe_fc_none))
634 srrctl |= IXGBE_SRRCTL_DROP_EN;
635 else
636 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
637
638 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
639
640 /* Setup the HW Rx Head and Tail Descriptor Pointers */
641 IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
642 IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
643
644 /* Set the driver rx tail address */
645 rxr->tail = IXGBE_RDT(rxr->me);
646 }
647
648 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
649 u32 psrtype = IXGBE_PSRTYPE_TCPHDR
650 | IXGBE_PSRTYPE_UDPHDR
651 | IXGBE_PSRTYPE_IPV4HDR
652 | IXGBE_PSRTYPE_IPV6HDR;
653 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
654 }
655
656 rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
657
658 ixgbe_initialize_rss_mapping(adapter);
659
660 if (adapter->num_queues > 1) {
661 /* RSS and RX IPP Checksum are mutually exclusive */
662 rxcsum |= IXGBE_RXCSUM_PCSD;
663 }
664
665 if (ifp->if_capenable & IFCAP_RXCSUM)
666 rxcsum |= IXGBE_RXCSUM_PCSD;
667
668 /* This is useful for calculating UDP/IP fragment checksums */
669 if (!(rxcsum & IXGBE_RXCSUM_PCSD))
670 rxcsum |= IXGBE_RXCSUM_IPPCSE;
671
672 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
673
674 } /* ixgbe_initialize_receive_units */
675
676 /************************************************************************
677 * ixgbe_initialize_transmit_units - Enable transmit units.
678 ************************************************************************/
679 static void
680 ixgbe_initialize_transmit_units(struct adapter *adapter)
681 {
682 struct tx_ring *txr = adapter->tx_rings;
683 struct ixgbe_hw *hw = &adapter->hw;
684 int i;
685
686 INIT_DEBUGOUT("ixgbe_initialize_transmit_units");
687
688 /* Setup the Base and Length of the Tx Descriptor Ring */
689 for (i = 0; i < adapter->num_queues; i++, txr++) {
690 u64 tdba = txr->txdma.dma_paddr;
691 u32 txctrl = 0;
692 u32 tqsmreg, reg;
693 int regnum = i / 4; /* 1 register per 4 queues */
694 int regshift = i % 4; /* 4 bits per 1 queue */
695 int j = txr->me;
696
697 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
698 (tdba & 0x00000000ffffffffULL));
699 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
700 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
701 adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
702
703 /*
704 * Set TQSMR (Transmit Queue Statistic Mapping) register.
705 * Register location is different between 82598 and others.
706 */
707 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
708 tqsmreg = IXGBE_TQSMR(regnum);
709 else
710 tqsmreg = IXGBE_TQSM(regnum);
711 reg = IXGBE_READ_REG(hw, tqsmreg);
712 reg &= ~(0x000000ffUL << (regshift * 8));
713 reg |= i << (regshift * 8);
714 IXGBE_WRITE_REG(hw, tqsmreg, reg);
715
716 /* Setup the HW Tx Head and Tail descriptor pointers */
717 IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
718 IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
719
720 /* Cache the tail address */
721 txr->tail = IXGBE_TDT(j);
722
723 txr->txr_no_space = false;
724
725 /* Disable Head Writeback */
726 /*
727 * Note: for X550 series devices, these registers are actually
728 * prefixed with TPH_ instead of DCA_, but the addresses and
729 * fields remain the same.
730 */
731 switch (hw->mac.type) {
732 case ixgbe_mac_82598EB:
733 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
734 break;
735 default:
736 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
737 break;
738 }
739 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
740 switch (hw->mac.type) {
741 case ixgbe_mac_82598EB:
742 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
743 break;
744 default:
745 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
746 break;
747 }
748
749 }
750
751 if (hw->mac.type != ixgbe_mac_82598EB) {
752 u32 dmatxctl, rttdcs;
753
754 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
755 dmatxctl |= IXGBE_DMATXCTL_TE;
756 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
757 /* Disable arbiter to set MTQC */
758 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
759 rttdcs |= IXGBE_RTTDCS_ARBDIS;
760 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
761 IXGBE_WRITE_REG(hw, IXGBE_MTQC,
762 ixgbe_get_mtqc(adapter->iov_mode));
763 rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
764 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
765 }
766
767 return;
768 } /* ixgbe_initialize_transmit_units */
769
770 static void
771 ixgbe_quirks(struct adapter *adapter)
772 {
773 device_t dev = adapter->dev;
774 struct ixgbe_hw *hw = &adapter->hw;
775 const char *vendor, *product;
776
777 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) {
778 /*
779 * Quirk for inverted logic of SFP+'s MOD_ABS on GIGABYTE
780 * MA10-ST0.
781 */
782 vendor = pmf_get_platform("system-vendor");
783 product = pmf_get_platform("system-product");
784
785 if ((vendor == NULL) || (product == NULL))
786 return;
787
788 if ((strcmp(vendor, "GIGABYTE") == 0) &&
789 (strcmp(product, "MA10-ST0") == 0)) {
790 aprint_verbose_dev(dev,
791 "Enable SFP+ MOD_ABS inverse quirk\n");
792 adapter->hw.quirks |= IXGBE_QUIRK_MOD_ABS_INVERT;
793 }
794 }
795 }
796
797 /************************************************************************
798 * ixgbe_attach - Device initialization routine
799 *
800 * Called when the driver is being loaded.
801 * Identifies the type of hardware, allocates all resources
802 * and initializes the hardware.
803 *
804 * return 0 on success, positive on failure
805 ************************************************************************/
806 static void
807 ixgbe_attach(device_t parent, device_t dev, void *aux)
808 {
809 struct adapter *adapter;
810 struct ixgbe_hw *hw;
811 int error = -1;
812 u32 ctrl_ext;
813 u16 high, low, nvmreg;
814 pcireg_t id, subid;
815 const ixgbe_vendor_info_t *ent;
816 struct pci_attach_args *pa = aux;
817 bool unsupported_sfp = false;
818 const char *str;
819 char wqname[MAXCOMLEN];
820 char buf[256];
821
822 INIT_DEBUGOUT("ixgbe_attach: begin");
823
824 /* Allocate, clear, and link in our adapter structure */
825 adapter = device_private(dev);
826 adapter->hw.back = adapter;
827 adapter->dev = dev;
828 hw = &adapter->hw;
829 adapter->osdep.pc = pa->pa_pc;
830 adapter->osdep.tag = pa->pa_tag;
831 if (pci_dma64_available(pa))
832 adapter->osdep.dmat = pa->pa_dmat64;
833 else
834 adapter->osdep.dmat = pa->pa_dmat;
835 adapter->osdep.attached = false;
836 adapter->osdep.detaching = false;
837
838 ent = ixgbe_lookup(pa);
839
840 KASSERT(ent != NULL);
841
842 aprint_normal(": %s, Version - %s\n",
843 ixgbe_strings[ent->index], ixgbe_driver_version);
844
845 /* Core Lock Init */
846 IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
847
848 /* Set up the timer callout and workqueue */
849 callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
850 snprintf(wqname, sizeof(wqname), "%s-timer", device_xname(dev));
851 error = workqueue_create(&adapter->timer_wq, wqname,
852 ixgbe_handle_timer, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
853 IXGBE_TASKLET_WQ_FLAGS);
854 if (error) {
855 aprint_error_dev(dev,
856 "could not create timer workqueue (%d)\n", error);
857 goto err_out;
858 }
859
860 /* Determine hardware revision */
861 id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
862 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
863
864 hw->vendor_id = PCI_VENDOR(id);
865 hw->device_id = PCI_PRODUCT(id);
866 hw->revision_id =
867 PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
868 hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
869 hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
870
871 /* Set quirk flags */
872 ixgbe_quirks(adapter);
873
874 /*
875 * Make sure BUSMASTER is set
876 */
877 ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
878
879 /* Do base PCI setup - map BAR0 */
880 if (ixgbe_allocate_pci_resources(adapter, pa)) {
881 aprint_error_dev(dev, "Allocation of PCI resources failed\n");
882 error = ENXIO;
883 goto err_out;
884 }
885
886 /* let hardware know driver is loaded */
887 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
888 ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
889 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
890
891 /*
892 * Initialize the shared code
893 */
894 if (ixgbe_init_shared_code(hw) != 0) {
895 aprint_error_dev(dev,
896 "Unable to initialize the shared code\n");
897 error = ENXIO;
898 goto err_out;
899 }
900
901 switch (hw->mac.type) {
902 case ixgbe_mac_82598EB:
903 str = "82598EB";
904 break;
905 case ixgbe_mac_82599EB:
906 str = "82599EB";
907 break;
908 case ixgbe_mac_X540:
909 str = "X540";
910 break;
911 case ixgbe_mac_X550:
912 str = "X550";
913 break;
914 case ixgbe_mac_X550EM_x:
915 str = "X550EM X";
916 break;
917 case ixgbe_mac_X550EM_a:
918 str = "X550EM A";
919 break;
920 default:
921 str = "Unknown";
922 break;
923 }
924 aprint_normal_dev(dev, "device %s\n", str);
925
926 hw->allow_unsupported_sfp = allow_unsupported_sfp;
927
928 /* Pick up the 82599 settings */
929 if (hw->mac.type != ixgbe_mac_82598EB)
930 hw->phy.smart_speed = ixgbe_smart_speed;
931
932 /* Set the right number of segments */
933 KASSERT(IXGBE_82599_SCATTER_MAX >= IXGBE_SCATTER_DEFAULT);
934 adapter->num_segs = IXGBE_SCATTER_DEFAULT;
935
936 /* Ensure SW/FW semaphore is free */
937 ixgbe_init_swfw_semaphore(hw);
938
939 hw->mac.ops.set_lan_id(hw);
940 ixgbe_init_device_features(adapter);
941
942 if (ixgbe_configure_interrupts(adapter)) {
943 error = ENXIO;
944 goto err_out;
945 }
946
947 /* Allocate multicast array memory. */
948 adapter->mta = malloc(sizeof(*adapter->mta) *
949 MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_WAITOK);
950
951 /* Enable WoL (if supported) */
952 ixgbe_check_wol_support(adapter);
953
954 /* Register for VLAN events */
955 ether_set_vlan_cb(&adapter->osdep.ec, ixgbe_vlan_cb);
956
957 /* Verify adapter fan is still functional (if applicable) */
958 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
959 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
960 ixgbe_check_fan_failure(adapter, esdp, FALSE);
961 }
962
963 /* Set an initial default flow control value */
964 hw->fc.requested_mode = ixgbe_flow_control;
965
966 /* Do descriptor calc and sanity checks */
967 if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
968 ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
969 aprint_error_dev(dev, "TXD config issue, using default!\n");
970 adapter->num_tx_desc = DEFAULT_TXD;
971 } else
972 adapter->num_tx_desc = ixgbe_txd;
973
974 if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
975 ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
976 aprint_error_dev(dev, "RXD config issue, using default!\n");
977 adapter->num_rx_desc = DEFAULT_RXD;
978 } else
979 adapter->num_rx_desc = ixgbe_rxd;
980
981 /* Sysctls for limiting the amount of work done in the taskqueues */
982 adapter->rx_process_limit
983 = (ixgbe_rx_process_limit <= adapter->num_rx_desc)
984 ? ixgbe_rx_process_limit : adapter->num_rx_desc;
985 adapter->tx_process_limit
986 = (ixgbe_tx_process_limit <= adapter->num_tx_desc)
987 ? ixgbe_tx_process_limit : adapter->num_tx_desc;
988
989 /* Set default high limit of copying mbuf in rxeof */
990 adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
991
992 /* Allocate our TX/RX Queues */
993 if (ixgbe_allocate_queues(adapter)) {
994 error = ENOMEM;
995 goto err_out;
996 }
997
998 hw->phy.reset_if_overtemp = TRUE;
999 error = ixgbe_reset_hw(hw);
1000 hw->phy.reset_if_overtemp = FALSE;
1001 if (error == IXGBE_ERR_SFP_NOT_PRESENT)
1002 error = IXGBE_SUCCESS;
1003 else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
1004 aprint_error_dev(dev,
1005 "Unsupported SFP+ module type was detected.\n");
1006 unsupported_sfp = true;
1007 error = IXGBE_SUCCESS;
1008 } else if (error) {
1009 aprint_error_dev(dev,
1010 "Hardware initialization failed(error = %d)\n", error);
1011 error = EIO;
1012 goto err_late;
1013 }
1014
1015 /* Make sure we have a good EEPROM before we read from it */
1016 if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
1017 aprint_error_dev(dev, "The EEPROM Checksum Is Not Valid\n");
1018 error = EIO;
1019 goto err_late;
1020 }
1021
1022 aprint_normal("%s:", device_xname(dev));
1023 /* NVM Image Version */
1024 high = low = 0;
1025 switch (hw->mac.type) {
1026 case ixgbe_mac_82598EB:
1027 /*
1028 * Print version from the dev starter version (0x29). The
1029 * location is the same as newer device's IXGBE_NVM_MAP_VER.
1030 */
1031 hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
1032 if (nvmreg == 0xffff)
1033 break;
1034 high = (nvmreg >> 12) & 0x0f;
1035 low = (nvmreg >> 4) & 0xff;
1036 id = nvmreg & 0x0f;
1037 /*
1038 * The following output might not be correct. Some 82598 cards
1039 * have 0x1070 or 0x2090. 82598 spec update notes about 2.9.0.
1040 */
1041 aprint_normal(" NVM Image Version %u.%u.%u,", high, low, id);
1042 break;
1043 case ixgbe_mac_X540:
1044 case ixgbe_mac_X550EM_a:
1045 hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
1046 if (nvmreg == 0xffff)
1047 break;
1048 high = (nvmreg >> 12) & 0x0f;
1049 low = (nvmreg >> 4) & 0xff;
1050 id = nvmreg & 0x0f;
1051 aprint_normal(" NVM Image Version %u.", high);
1052 if (hw->mac.type == ixgbe_mac_X540)
1053 str = "%x";
1054 else
1055 str = "%02x";
1056 aprint_normal(str, low);
1057 aprint_normal(" ID 0x%x,", id);
1058 break;
1059 case ixgbe_mac_X550EM_x:
1060 case ixgbe_mac_X550:
1061 hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
1062 if (nvmreg == 0xffff)
1063 break;
1064 high = (nvmreg >> 12) & 0x0f;
1065 low = nvmreg & 0xff;
1066 aprint_normal(" NVM Image Version %u.%02x,", high, low);
1067 break;
1068 default:
1069 break;
1070 }
1071 hw->eeprom.nvm_image_ver_high = high;
1072 hw->eeprom.nvm_image_ver_low = low;
1073
1074 /* PHY firmware revision */
1075 switch (hw->mac.type) {
1076 case ixgbe_mac_X540:
1077 case ixgbe_mac_X550:
1078 hw->eeprom.ops.read(hw, IXGBE_PHYFW_REV, &nvmreg);
1079 if (nvmreg == 0xffff)
1080 break;
1081 high = (nvmreg >> 12) & 0x0f;
1082 low = (nvmreg >> 4) & 0xff;
1083 id = nvmreg & 0x000f;
1084 aprint_normal(" PHY FW Revision %u.", high);
1085 if (hw->mac.type == ixgbe_mac_X540)
1086 str = "%x";
1087 else
1088 str = "%02x";
1089 aprint_normal(str, low);
1090 aprint_normal(" ID 0x%x,", id);
1091 break;
1092 default:
1093 break;
1094 }
1095
1096 /* NVM Map version & OEM NVM Image version */
1097 switch (hw->mac.type) {
1098 case ixgbe_mac_X550:
1099 case ixgbe_mac_X550EM_x:
1100 case ixgbe_mac_X550EM_a:
1101 hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
1102 if (nvmreg != 0xffff) {
1103 high = (nvmreg >> 12) & 0x0f;
1104 low = nvmreg & 0x00ff;
1105 aprint_normal(" NVM Map version %u.%02x,", high, low);
1106 }
1107 hw->eeprom.ops.read(hw, IXGBE_OEM_NVM_IMAGE_VER, &nvmreg);
1108 if (nvmreg != 0xffff) {
1109 high = (nvmreg >> 12) & 0x0f;
1110 low = nvmreg & 0x00ff;
1111 aprint_verbose(" OEM NVM Image version %u.%02x,", high,
1112 low);
1113 }
1114 break;
1115 default:
1116 break;
1117 }
1118
1119 /* Print the ETrackID */
1120 hw->eeprom.ops.read(hw, IXGBE_ETRACKID_H, &high);
1121 hw->eeprom.ops.read(hw, IXGBE_ETRACKID_L, &low);
1122 aprint_normal(" ETrackID %08x\n", ((uint32_t)high << 16) | low);
1123
1124 /* Printed Board Assembly number */
1125 error = ixgbe_read_pba_string(hw, buf, IXGBE_PBANUM_LENGTH);
1126 aprint_normal_dev(dev, "PBA number %s\n", error ? "unknown" : buf);
1127
1128 if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
1129 error = ixgbe_allocate_msix(adapter, pa);
1130 if (error) {
1131 /* Free allocated queue structures first */
1132 ixgbe_free_queues(adapter);
1133
1134 /* Fallback to legacy interrupt */
1135 if (adapter->feat_cap & IXGBE_FEATURE_MSI)
1136 adapter->feat_en |= IXGBE_FEATURE_MSI;
1137 adapter->num_queues = 1;
1138
1139 /* Allocate our TX/RX Queues again */
1140 if (ixgbe_allocate_queues(adapter)) {
1141 error = ENOMEM;
1142 goto err_out;
1143 }
1144 }
1145 }
1146
1147 /* Recovery mode */
1148 switch (adapter->hw.mac.type) {
1149 case ixgbe_mac_X550:
1150 case ixgbe_mac_X550EM_x:
1151 case ixgbe_mac_X550EM_a:
1152 /* >= 2.00 */
1153 if (hw->eeprom.nvm_image_ver_high >= 2) {
1154 adapter->feat_cap |= IXGBE_FEATURE_RECOVERY_MODE;
1155 adapter->feat_en |= IXGBE_FEATURE_RECOVERY_MODE;
1156 }
1157 break;
1158 default:
1159 break;
1160 }
1161
1162 if ((adapter->feat_en & IXGBE_FEATURE_MSIX) == 0)
1163 error = ixgbe_allocate_legacy(adapter, pa);
1164 if (error)
1165 goto err_late;
1166
1167 /* Tasklets for Link, SFP, Multispeed Fiber and Flow Director */
1168 mutex_init(&(adapter)->admin_mtx, MUTEX_DEFAULT, IPL_NET);
1169 snprintf(wqname, sizeof(wqname), "%s-admin", device_xname(dev));
1170 error = workqueue_create(&adapter->admin_wq, wqname,
1171 ixgbe_handle_admin, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
1172 IXGBE_TASKLET_WQ_FLAGS);
1173 if (error) {
1174 aprint_error_dev(dev,
1175 "could not create admin workqueue (%d)\n", error);
1176 goto err_out;
1177 }
1178
1179 error = ixgbe_start_hw(hw);
1180 switch (error) {
1181 case IXGBE_ERR_EEPROM_VERSION:
1182 aprint_error_dev(dev,
1183 "This device is a pre-production adapter/"
1184 "LOM. Please be aware there may be issues associated "
1185 "with your hardware.\nIf you are experiencing problems "
1186 "please contact your Intel or hardware representative "
1187 "who provided you with this hardware.\n");
1188 break;
1189 default:
1190 break;
1191 }
1192
1193 /* Setup OS specific network interface */
1194 if (ixgbe_setup_interface(dev, adapter) != 0)
1195 goto err_late;
1196
1197 /*
1198 * Print PHY ID only for copper PHY. On device which has SFP(+) cage
1199 * and a module is inserted, phy.id is not MII PHY id but SFF 8024 ID.
1200 */
1201 if (hw->phy.media_type == ixgbe_media_type_copper) {
1202 uint16_t id1, id2;
1203 int oui, model, rev;
1204 char descr[MII_MAX_DESCR_LEN];
1205
1206 id1 = hw->phy.id >> 16;
1207 id2 = hw->phy.id & 0xffff;
1208 oui = MII_OUI(id1, id2);
1209 model = MII_MODEL(id2);
1210 rev = MII_REV(id2);
1211 mii_get_descr(descr, sizeof(descr), oui, model);
1212 if (descr[0])
1213 aprint_normal_dev(dev, "PHY: %s, rev. %d\n",
1214 descr, rev);
1215 else
1216 aprint_normal_dev(dev,
1217 "PHY OUI 0x%06x, model 0x%04x, rev. %d\n",
1218 oui, model, rev);
1219 }
1220
1221 /* Enable EEE power saving */
1222 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
1223 hw->mac.ops.setup_eee(hw,
1224 adapter->feat_en & IXGBE_FEATURE_EEE);
1225
1226 /* Enable power to the phy. */
1227 if (!unsupported_sfp) {
1228 /* Enable the optics for 82599 SFP+ fiber */
1229 ixgbe_enable_tx_laser(hw);
1230
1231 /*
1232 * XXX Currently, ixgbe_set_phy_power() supports only copper
1233 * PHY, so it's not required to test with !unsupported_sfp.
1234 */
1235 ixgbe_set_phy_power(hw, TRUE);
1236 }
1237
1238 /* Initialize statistics */
1239 ixgbe_update_stats_counters(adapter);
1240
1241 /* Check PCIE slot type/speed/width */
1242 ixgbe_get_slot_info(adapter);
1243
1244 /*
1245 * Do time init and sysctl init here, but
1246 * only on the first port of a bypass adapter.
1247 */
1248 ixgbe_bypass_init(adapter);
1249
1250 /* Set an initial dmac value */
1251 adapter->dmac = 0;
1252 /* Set initial advertised speeds (if applicable) */
1253 adapter->advertise = ixgbe_get_default_advertise(adapter);
1254
1255 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
1256 ixgbe_define_iov_schemas(dev, &error);
1257
1258 /* Add sysctls */
1259 ixgbe_add_device_sysctls(adapter);
1260 ixgbe_add_hw_stats(adapter);
1261
1262 /* For Netmap */
1263 adapter->init_locked = ixgbe_init_locked;
1264 adapter->stop_locked = ixgbe_stop_locked;
1265
1266 if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
1267 ixgbe_netmap_attach(adapter);
1268
1269 snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
1270 aprint_verbose_dev(dev, "feature cap %s\n", buf);
1271 snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
1272 aprint_verbose_dev(dev, "feature ena %s\n", buf);
1273
1274 if (pmf_device_register(dev, ixgbe_suspend, ixgbe_resume))
1275 pmf_class_network_register(dev, adapter->ifp);
1276 else
1277 aprint_error_dev(dev, "couldn't establish power handler\n");
1278
1279 /* Init recovery mode timer and state variable */
1280 if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE) {
1281 adapter->recovery_mode = 0;
1282
1283 /* Set up the timer callout */
1284 callout_init(&adapter->recovery_mode_timer,
1285 IXGBE_CALLOUT_FLAGS);
1286 snprintf(wqname, sizeof(wqname), "%s-recovery",
1287 device_xname(dev));
1288 error = workqueue_create(&adapter->recovery_mode_timer_wq,
1289 wqname, ixgbe_handle_recovery_mode_timer, adapter,
1290 IXGBE_WORKQUEUE_PRI, IPL_NET, IXGBE_TASKLET_WQ_FLAGS);
1291 if (error) {
1292 aprint_error_dev(dev, "could not create "
1293 "recovery_mode_timer workqueue (%d)\n", error);
1294 goto err_out;
1295 }
1296
1297 /* Start the task */
1298 callout_reset(&adapter->recovery_mode_timer, hz,
1299 ixgbe_recovery_mode_timer, adapter);
1300 }
1301
1302 INIT_DEBUGOUT("ixgbe_attach: end");
1303 adapter->osdep.attached = true;
1304
1305 return;
1306
1307 err_late:
1308 ixgbe_free_queues(adapter);
1309 err_out:
1310 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
1311 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
1312 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
1313 ixgbe_free_deferred_handlers(adapter);
1314 ixgbe_free_pci_resources(adapter);
1315 if (adapter->mta != NULL)
1316 free(adapter->mta, M_DEVBUF);
1317 mutex_destroy(&(adapter)->admin_mtx); /* XXX appropriate order? */
1318 IXGBE_CORE_LOCK_DESTROY(adapter);
1319
1320 return;
1321 } /* ixgbe_attach */
1322
1323 /************************************************************************
1324 * ixgbe_check_wol_support
1325 *
1326 * Checks whether the adapter's ports are capable of
1327 * Wake On LAN by reading the adapter's NVM.
1328 *
1329 * Sets each port's hw->wol_enabled value depending
1330 * on the value read here.
1331 ************************************************************************/
1332 static void
1333 ixgbe_check_wol_support(struct adapter *adapter)
1334 {
1335 struct ixgbe_hw *hw = &adapter->hw;
1336 u16 dev_caps = 0;
1337
1338 /* Find out WoL support for port */
1339 adapter->wol_support = hw->wol_enabled = 0;
1340 ixgbe_get_device_caps(hw, &dev_caps);
1341 if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
1342 ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
1343 hw->bus.func == 0))
1344 adapter->wol_support = hw->wol_enabled = 1;
1345
1346 /* Save initial wake up filter configuration */
1347 adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
1348
1349 return;
1350 } /* ixgbe_check_wol_support */
1351
1352 /************************************************************************
1353 * ixgbe_setup_interface
1354 *
1355 * Setup networking device structure and register an interface.
1356 ************************************************************************/
1357 static int
1358 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
1359 {
1360 struct ethercom *ec = &adapter->osdep.ec;
1361 struct ifnet *ifp;
1362
1363 INIT_DEBUGOUT("ixgbe_setup_interface: begin");
1364
1365 ifp = adapter->ifp = &ec->ec_if;
1366 strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
1367 ifp->if_baudrate = IF_Gbps(10);
1368 ifp->if_init = ixgbe_init;
1369 ifp->if_stop = ixgbe_ifstop;
1370 ifp->if_softc = adapter;
1371 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1372 #ifdef IXGBE_MPSAFE
1373 ifp->if_extflags = IFEF_MPSAFE;
1374 #endif
1375 ifp->if_ioctl = ixgbe_ioctl;
1376 #if __FreeBSD_version >= 1100045
1377 /* TSO parameters */
1378 ifp->if_hw_tsomax = 65518;
1379 ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
1380 ifp->if_hw_tsomaxsegsize = 2048;
1381 #endif
1382 if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
1383 #if 0
1384 ixgbe_start_locked = ixgbe_legacy_start_locked;
1385 #endif
1386 } else {
1387 ifp->if_transmit = ixgbe_mq_start;
1388 #if 0
1389 ixgbe_start_locked = ixgbe_mq_start_locked;
1390 #endif
1391 }
1392 ifp->if_start = ixgbe_legacy_start;
1393 IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
1394 IFQ_SET_READY(&ifp->if_snd);
1395
1396 if_initialize(ifp);
1397 adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
1398 ether_ifattach(ifp, adapter->hw.mac.addr);
1399 aprint_normal_dev(dev, "Ethernet address %s\n",
1400 ether_sprintf(adapter->hw.mac.addr));
1401 /*
1402 * We use per TX queue softint, so if_deferred_start_init() isn't
1403 * used.
1404 */
1405 ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
1406
1407 adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1408
1409 /*
1410 * Tell the upper layer(s) we support long frames.
1411 */
1412 ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1413
1414 /* Set capability flags */
1415 ifp->if_capabilities |= IFCAP_RXCSUM
1416 | IFCAP_TXCSUM
1417 | IFCAP_TSOv4
1418 | IFCAP_TSOv6;
1419 ifp->if_capenable = 0;
1420
1421 ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
1422 | ETHERCAP_VLAN_HWCSUM
1423 | ETHERCAP_JUMBO_MTU
1424 | ETHERCAP_VLAN_MTU;
1425
1426 /* Enable the above capabilities by default */
1427 ec->ec_capenable = ec->ec_capabilities;
1428
1429 /*
1430 * Don't turn this on by default, if vlans are
1431 * created on another pseudo device (eg. lagg)
1432 * then vlan events are not passed thru, breaking
1433 * operation, but with HW FILTER off it works. If
1434 * using vlans directly on the ixgbe driver you can
1435 * enable this and get full hardware tag filtering.
1436 */
1437 ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
1438
1439 /*
1440 * Specify the media types supported by this adapter and register
1441 * callbacks to update media and link information
1442 */
1443 ec->ec_ifmedia = &adapter->media;
1444 ifmedia_init_with_lock(&adapter->media, IFM_IMASK, ixgbe_media_change,
1445 ixgbe_media_status, &adapter->core_mtx);
1446
1447 adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
1448 ixgbe_add_media_types(adapter);
1449
1450 /* Set autoselect media by default */
1451 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1452
1453 if_register(ifp);
1454
1455 return (0);
1456 } /* ixgbe_setup_interface */
1457
1458 /************************************************************************
1459 * ixgbe_add_media_types
1460 ************************************************************************/
1461 static void
1462 ixgbe_add_media_types(struct adapter *adapter)
1463 {
1464 struct ixgbe_hw *hw = &adapter->hw;
1465 u64 layer;
1466
1467 layer = adapter->phy_layer;
1468
1469 #define ADD(mm, dd) \
1470 ifmedia_add(&adapter->media, IFM_ETHER | (mm), (dd), NULL);
1471
1472 ADD(IFM_NONE, 0);
1473
1474 /* Media types with matching NetBSD media defines */
1475 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
1476 ADD(IFM_10G_T | IFM_FDX, 0);
1477 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
1478 ADD(IFM_1000_T | IFM_FDX, 0);
1479 if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
1480 ADD(IFM_100_TX | IFM_FDX, 0);
1481 if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
1482 ADD(IFM_10_T | IFM_FDX, 0);
1483
1484 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
1485 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
1486 ADD(IFM_10G_TWINAX | IFM_FDX, 0);
1487
1488 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
1489 ADD(IFM_10G_LR | IFM_FDX, 0);
1490 if (hw->phy.multispeed_fiber)
1491 ADD(IFM_1000_LX | IFM_FDX, 0);
1492 }
1493 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
1494 ADD(IFM_10G_SR | IFM_FDX, 0);
1495 if (hw->phy.multispeed_fiber)
1496 ADD(IFM_1000_SX | IFM_FDX, 0);
1497 } else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
1498 ADD(IFM_1000_SX | IFM_FDX, 0);
1499 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
1500 ADD(IFM_10G_CX4 | IFM_FDX, 0);
1501
1502 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
1503 ADD(IFM_10G_KR | IFM_FDX, 0);
1504 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4)
1505 ADD(IFM_10G_KX4 | IFM_FDX, 0);
1506 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
1507 ADD(IFM_1000_KX | IFM_FDX, 0);
1508 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX)
1509 ADD(IFM_2500_KX | IFM_FDX, 0);
1510 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_T)
1511 ADD(IFM_2500_T | IFM_FDX, 0);
1512 if (layer & IXGBE_PHYSICAL_LAYER_5GBASE_T)
1513 ADD(IFM_5000_T | IFM_FDX, 0);
1514 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
1515 ADD(IFM_1000_BX10 | IFM_FDX, 0);
1516 /* XXX no ifmedia_set? */
1517
1518 ADD(IFM_AUTO, 0);
1519
1520 #undef ADD
1521 } /* ixgbe_add_media_types */
1522
1523 /************************************************************************
1524 * ixgbe_is_sfp
1525 ************************************************************************/
1526 static inline bool
1527 ixgbe_is_sfp(struct ixgbe_hw *hw)
1528 {
1529 switch (hw->mac.type) {
1530 case ixgbe_mac_82598EB:
1531 if (hw->phy.type == ixgbe_phy_nl)
1532 return (TRUE);
1533 return (FALSE);
1534 case ixgbe_mac_82599EB:
1535 case ixgbe_mac_X550EM_x:
1536 case ixgbe_mac_X550EM_a:
1537 switch (hw->mac.ops.get_media_type(hw)) {
1538 case ixgbe_media_type_fiber:
1539 case ixgbe_media_type_fiber_qsfp:
1540 return (TRUE);
1541 default:
1542 return (FALSE);
1543 }
1544 default:
1545 return (FALSE);
1546 }
1547 } /* ixgbe_is_sfp */
1548
1549 static void
1550 ixgbe_schedule_admin_tasklet(struct adapter *adapter)
1551 {
1552
1553 KASSERT(mutex_owned(&adapter->admin_mtx));
1554
1555 if (__predict_true(adapter->osdep.detaching == false)) {
1556 if (adapter->admin_pending == 0)
1557 workqueue_enqueue(adapter->admin_wq,
1558 &adapter->admin_wc, NULL);
1559 adapter->admin_pending = 1;
1560 }
1561 }
1562
1563 /************************************************************************
1564 * ixgbe_config_link
1565 ************************************************************************/
1566 static void
1567 ixgbe_config_link(struct adapter *adapter)
1568 {
1569 struct ixgbe_hw *hw = &adapter->hw;
1570 u32 autoneg, err = 0;
1571 u32 task_requests = 0;
1572 bool sfp, negotiate = false;
1573
1574 sfp = ixgbe_is_sfp(hw);
1575
1576 if (sfp) {
1577 if (hw->phy.multispeed_fiber) {
1578 ixgbe_enable_tx_laser(hw);
1579 task_requests |= IXGBE_REQUEST_TASK_MSF_WOI;
1580 }
1581 task_requests |= IXGBE_REQUEST_TASK_MOD_WOI;
1582
1583 mutex_enter(&adapter->admin_mtx);
1584 adapter->task_requests |= task_requests;
1585 ixgbe_schedule_admin_tasklet(adapter);
1586 mutex_exit(&adapter->admin_mtx);
1587 } else {
1588 struct ifmedia *ifm = &adapter->media;
1589
1590 if (hw->mac.ops.check_link)
1591 err = ixgbe_check_link(hw, &adapter->link_speed,
1592 &adapter->link_up, FALSE);
1593 if (err)
1594 return;
1595
1596 /*
1597 * Check if it's the first call. If it's the first call,
1598 * get value for auto negotiation.
1599 */
1600 autoneg = hw->phy.autoneg_advertised;
1601 if ((IFM_SUBTYPE(ifm->ifm_cur->ifm_media) != IFM_NONE)
1602 && ((!autoneg) && (hw->mac.ops.get_link_capabilities)))
1603 err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
1604 &negotiate);
1605 if (err)
1606 return;
1607 if (hw->mac.ops.setup_link)
1608 err = hw->mac.ops.setup_link(hw, autoneg,
1609 adapter->link_up);
1610 }
1611 } /* ixgbe_config_link */
1612
1613 /************************************************************************
1614 * ixgbe_update_stats_counters - Update board statistics counters.
1615 ************************************************************************/
1616 static void
1617 ixgbe_update_stats_counters(struct adapter *adapter)
1618 {
1619 struct ifnet *ifp = adapter->ifp;
1620 struct ixgbe_hw *hw = &adapter->hw;
1621 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1622 u32 missed_rx = 0, bprc, lxontxc, lxofftxc;
1623 u64 total, total_missed_rx = 0;
1624 uint64_t crcerrs, illerrc, rlec, ruc, rfc, roc, rjc;
1625 unsigned int queue_counters;
1626 int i;
1627
1628 IXGBE_EVC_REGADD2(hw, stats, IXGBE_CRCERRS, crcerrs);
1629 IXGBE_EVC_REGADD2(hw, stats, IXGBE_ILLERRC, illerrc);
1630
1631 IXGBE_EVC_REGADD(hw, stats, IXGBE_ERRBC, errbc);
1632 IXGBE_EVC_REGADD(hw, stats, IXGBE_MSPDC, mspdc);
1633 if (hw->mac.type >= ixgbe_mac_X550)
1634 IXGBE_EVC_REGADD(hw, stats, IXGBE_MBSDC, mbsdc);
1635
1636 /* 16 registers exist */
1637 queue_counters = uimin(__arraycount(stats->qprc), adapter->num_queues);
1638 for (i = 0; i < queue_counters; i++) {
1639 IXGBE_EVC_REGADD(hw, stats, IXGBE_QPRC(i), qprc[i]);
1640 IXGBE_EVC_REGADD(hw, stats, IXGBE_QPTC(i), qptc[i]);
1641 if (hw->mac.type >= ixgbe_mac_82599EB)
1642 IXGBE_EVC_REGADD(hw, stats, IXGBE_QPRDC(i), qprdc[i]);
1643 }
1644
1645 /* 8 registers exist */
1646 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1647 uint32_t mp;
1648
1649 /* MPC */
1650 mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
1651 /* global total per queue */
1652 IXGBE_EVC_ADD(&stats->mpc[i], mp);
1653 /* running comprehensive total for stats display */
1654 total_missed_rx += mp;
1655
1656 if (hw->mac.type == ixgbe_mac_82598EB)
1657 IXGBE_EVC_REGADD(hw, stats, IXGBE_RNBC(i), rnbc[i]);
1658
1659 IXGBE_EVC_REGADD(hw, stats, IXGBE_PXONTXC(i), pxontxc[i]);
1660 IXGBE_EVC_REGADD(hw, stats, IXGBE_PXOFFTXC(i), pxofftxc[i]);
1661 if (hw->mac.type >= ixgbe_mac_82599EB) {
1662 IXGBE_EVC_REGADD(hw, stats,
1663 IXGBE_PXONRXCNT(i), pxonrxc[i]);
1664 IXGBE_EVC_REGADD(hw, stats,
1665 IXGBE_PXOFFRXCNT(i), pxoffrxc[i]);
1666 IXGBE_EVC_REGADD(hw, stats,
1667 IXGBE_PXON2OFFCNT(i), pxon2offc[i]);
1668 } else {
1669 IXGBE_EVC_REGADD(hw, stats,
1670 IXGBE_PXONRXC(i), pxonrxc[i]);
1671 IXGBE_EVC_REGADD(hw, stats,
1672 IXGBE_PXOFFRXC(i), pxoffrxc[i]);
1673 }
1674 }
1675 IXGBE_EVC_ADD(&stats->mpctotal, total_missed_rx);
1676
1677 /* Document says M[LR]FC are valid when link is up and 10Gbps */
1678 if ((adapter->link_active == LINK_STATE_UP)
1679 && (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)) {
1680 IXGBE_EVC_REGADD(hw, stats, IXGBE_MLFC, mlfc);
1681 IXGBE_EVC_REGADD(hw, stats, IXGBE_MRFC, mrfc);
1682 }
1683 if (hw->mac.type == ixgbe_mac_X550EM_a)
1684 IXGBE_EVC_REGADD(hw, stats, IXGBE_LINK_DN_CNT, link_dn_cnt);
1685 IXGBE_EVC_REGADD2(hw, stats, IXGBE_RLEC, rlec);
1686
1687 /* Hardware workaround, gprc counts missed packets */
1688 IXGBE_EVC_ADD(&stats->gprc,
1689 IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx);
1690
1691 IXGBE_EVC_REGADD2(hw, stats, IXGBE_LXONTXC, lxontxc);
1692 IXGBE_EVC_REGADD2(hw, stats, IXGBE_LXOFFTXC, lxofftxc);
1693 total = lxontxc + lxofftxc;
1694
1695 if (hw->mac.type != ixgbe_mac_82598EB) {
1696 IXGBE_EVC_ADD(&stats->gorc, IXGBE_READ_REG(hw, IXGBE_GORCL) +
1697 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32));
1698 IXGBE_EVC_ADD(&stats->gotc, IXGBE_READ_REG(hw, IXGBE_GOTCL) +
1699 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32)
1700 - total * ETHER_MIN_LEN);
1701 IXGBE_EVC_ADD(&stats->tor, IXGBE_READ_REG(hw, IXGBE_TORL) +
1702 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32));
1703 IXGBE_EVC_REGADD(hw, stats, IXGBE_LXONRXCNT, lxonrxc);
1704 IXGBE_EVC_REGADD(hw, stats, IXGBE_LXOFFRXCNT, lxoffrxc);
1705 } else {
1706 IXGBE_EVC_REGADD(hw, stats, IXGBE_LXONRXC, lxonrxc);
1707 IXGBE_EVC_REGADD(hw, stats, IXGBE_LXOFFRXC, lxoffrxc);
1708 /* 82598 only has a counter in the high register */
1709 IXGBE_EVC_REGADD(hw, stats, IXGBE_GORCH, gorc);
1710 IXGBE_EVC_ADD(&stats->gotc, IXGBE_READ_REG(hw, IXGBE_GOTCH)
1711 - total * ETHER_MIN_LEN);
1712 IXGBE_EVC_REGADD(hw, stats, IXGBE_TORH, tor);
1713 }
1714
1715 /*
1716 * Workaround: mprc hardware is incorrectly counting
1717 * broadcasts, so for now we subtract those.
1718 */
1719 IXGBE_EVC_REGADD2(hw, stats, IXGBE_BPRC, bprc);
1720 IXGBE_EVC_ADD(&stats->mprc, IXGBE_READ_REG(hw, IXGBE_MPRC)
1721 - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0));
1722
1723 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC64, prc64);
1724 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC127, prc127);
1725 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC255, prc255);
1726 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC511, prc511);
1727 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC1023, prc1023);
1728 IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC1522, prc1522);
1729
1730 IXGBE_EVC_ADD(&stats->gptc, IXGBE_READ_REG(hw, IXGBE_GPTC) - total);
1731 IXGBE_EVC_ADD(&stats->mptc, IXGBE_READ_REG(hw, IXGBE_MPTC) - total);
1732 IXGBE_EVC_ADD(&stats->ptc64, IXGBE_READ_REG(hw, IXGBE_PTC64) - total);
1733
1734 IXGBE_EVC_REGADD2(hw, stats, IXGBE_RUC, ruc);
1735 IXGBE_EVC_REGADD2(hw, stats, IXGBE_RFC, rfc);
1736 IXGBE_EVC_REGADD2(hw, stats, IXGBE_ROC, roc);
1737 IXGBE_EVC_REGADD2(hw, stats, IXGBE_RJC, rjc);
1738
1739 IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPRC, mngprc);
1740 IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPDC, mngpdc);
1741 IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPTC, mngptc);
1742 IXGBE_EVC_REGADD(hw, stats, IXGBE_TPR, tpr);
1743 IXGBE_EVC_REGADD(hw, stats, IXGBE_TPT, tpt);
1744 IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC127, ptc127);
1745 IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC255, ptc255);
1746 IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC511, ptc511);
1747 IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC1023, ptc1023);
1748 IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC1522, ptc1522);
1749 IXGBE_EVC_REGADD(hw, stats, IXGBE_BPTC, bptc);
1750 IXGBE_EVC_REGADD(hw, stats, IXGBE_XEC, xec);
1751 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCCRC, fccrc);
1752 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCLAST, fclast);
1753 /* Only read FCOE on 82599 */
1754 if (hw->mac.type != ixgbe_mac_82598EB) {
1755 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOERPDC, fcoerpdc);
1756 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEPRC, fcoeprc);
1757 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEPTC, fcoeptc);
1758 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEDWRC, fcoedwrc);
1759 IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEDWTC, fcoedwtc);
1760 }
1761
1762 /*
1763 * Fill out the OS statistics structure. Only RX errors are required
1764 * here because all TX counters are incremented in the TX path and
1765 * normal RX counters are prepared in ether_input().
1766 */
1767 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
1768 if_statadd_ref(nsr, if_iqdrops, total_missed_rx);
1769
1770 /*
1771 * Aggregate following types of errors as RX errors:
1772 * - CRC error count,
1773 * - illegal byte error count,
1774 * - length error count,
1775 * - undersized packets count,
1776 * - fragmented packets count,
1777 * - oversized packets count,
1778 * - jabber count.
1779 */
1780 if_statadd_ref(nsr, if_ierrors,
1781 crcerrs + illerrc + rlec + ruc + rfc + roc + rjc);
1782
1783 IF_STAT_PUTREF(ifp);
1784 } /* ixgbe_update_stats_counters */
1785
1786 /************************************************************************
1787 * ixgbe_add_hw_stats
1788 *
1789 * Add sysctl variables, one per statistic, to the system.
1790 ************************************************************************/
1791 static void
1792 ixgbe_add_hw_stats(struct adapter *adapter)
1793 {
1794 device_t dev = adapter->dev;
1795 const struct sysctlnode *rnode, *cnode;
1796 struct sysctllog **log = &adapter->sysctllog;
1797 struct tx_ring *txr = adapter->tx_rings;
1798 struct rx_ring *rxr = adapter->rx_rings;
1799 struct ixgbe_hw *hw = &adapter->hw;
1800 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1801 const char *xname = device_xname(dev);
1802 int i;
1803
1804 /* Driver Statistics */
1805 evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
1806 NULL, xname, "Driver tx dma soft fail EFBIG");
1807 evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
1808 NULL, xname, "m_defrag() failed");
1809 evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
1810 NULL, xname, "Driver tx dma hard fail EFBIG");
1811 evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
1812 NULL, xname, "Driver tx dma hard fail EINVAL");
1813 evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
1814 NULL, xname, "Driver tx dma hard fail other");
1815 evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
1816 NULL, xname, "Driver tx dma soft fail EAGAIN");
1817 evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
1818 NULL, xname, "Driver tx dma soft fail ENOMEM");
1819 evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
1820 NULL, xname, "Watchdog timeouts");
1821 evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
1822 NULL, xname, "TSO errors");
1823 evcnt_attach_dynamic(&adapter->admin_irqev, EVCNT_TYPE_INTR,
1824 NULL, xname, "Admin MSI-X IRQ Handled");
1825 evcnt_attach_dynamic(&adapter->link_workev, EVCNT_TYPE_INTR,
1826 NULL, xname, "Link event");
1827 evcnt_attach_dynamic(&adapter->mod_workev, EVCNT_TYPE_INTR,
1828 NULL, xname, "SFP+ module event");
1829 evcnt_attach_dynamic(&adapter->msf_workev, EVCNT_TYPE_INTR,
1830 NULL, xname, "Multispeed event");
1831 evcnt_attach_dynamic(&adapter->phy_workev, EVCNT_TYPE_INTR,
1832 NULL, xname, "External PHY event");
1833
1834 /* Max number of traffic class is 8 */
1835 KASSERT(IXGBE_DCB_MAX_TRAFFIC_CLASS == 8);
1836 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1837 snprintf(adapter->tcs[i].evnamebuf,
1838 sizeof(adapter->tcs[i].evnamebuf), "%s tc%d", xname, i);
1839 if (i < __arraycount(stats->mpc)) {
1840 evcnt_attach_dynamic(&stats->mpc[i],
1841 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1842 "RX Missed Packet Count");
1843 if (hw->mac.type == ixgbe_mac_82598EB)
1844 evcnt_attach_dynamic(&stats->rnbc[i],
1845 EVCNT_TYPE_MISC, NULL,
1846 adapter->tcs[i].evnamebuf,
1847 "Receive No Buffers");
1848 }
1849 if (i < __arraycount(stats->pxontxc)) {
1850 evcnt_attach_dynamic(&stats->pxontxc[i],
1851 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1852 "pxontxc");
1853 evcnt_attach_dynamic(&stats->pxonrxc[i],
1854 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1855 "pxonrxc");
1856 evcnt_attach_dynamic(&stats->pxofftxc[i],
1857 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1858 "pxofftxc");
1859 evcnt_attach_dynamic(&stats->pxoffrxc[i],
1860 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1861 "pxoffrxc");
1862 if (hw->mac.type >= ixgbe_mac_82599EB)
1863 evcnt_attach_dynamic(&stats->pxon2offc[i],
1864 EVCNT_TYPE_MISC, NULL,
1865 adapter->tcs[i].evnamebuf,
1866 "pxon2offc");
1867 }
1868 }
1869
1870 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
1871 #ifdef LRO
1872 struct lro_ctrl *lro = &rxr->lro;
1873 #endif
1874
1875 snprintf(adapter->queues[i].evnamebuf,
1876 sizeof(adapter->queues[i].evnamebuf), "%s q%d", xname, i);
1877 snprintf(adapter->queues[i].namebuf,
1878 sizeof(adapter->queues[i].namebuf), "q%d", i);
1879
1880 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
1881 aprint_error_dev(dev,
1882 "could not create sysctl root\n");
1883 break;
1884 }
1885
1886 if (sysctl_createv(log, 0, &rnode, &rnode,
1887 0, CTLTYPE_NODE,
1888 adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
1889 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
1890 break;
1891
1892 if (sysctl_createv(log, 0, &rnode, &cnode,
1893 CTLFLAG_READWRITE, CTLTYPE_INT,
1894 "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
1895 ixgbe_sysctl_interrupt_rate_handler, 0,
1896 (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
1897 break;
1898
1899 if (sysctl_createv(log, 0, &rnode, &cnode,
1900 CTLFLAG_READONLY, CTLTYPE_INT,
1901 "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
1902 ixgbe_sysctl_tdh_handler, 0, (void *)txr,
1903 0, CTL_CREATE, CTL_EOL) != 0)
1904 break;
1905
1906 if (sysctl_createv(log, 0, &rnode, &cnode,
1907 CTLFLAG_READONLY, CTLTYPE_INT,
1908 "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
1909 ixgbe_sysctl_tdt_handler, 0, (void *)txr,
1910 0, CTL_CREATE, CTL_EOL) != 0)
1911 break;
1912
1913 if (sysctl_createv(log, 0, &rnode, &cnode,
1914 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
1915 SYSCTL_DESCR("Receive Descriptor next to check"),
1916 ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
1917 CTL_CREATE, CTL_EOL) != 0)
1918 break;
1919
1920 if (sysctl_createv(log, 0, &rnode, &cnode,
1921 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
1922 SYSCTL_DESCR("Receive Descriptor next to refresh"),
1923 ixgbe_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
1924 CTL_CREATE, CTL_EOL) != 0)
1925 break;
1926
1927 if (sysctl_createv(log, 0, &rnode, &cnode,
1928 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
1929 SYSCTL_DESCR("Receive Descriptor Head"),
1930 ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
1931 CTL_CREATE, CTL_EOL) != 0)
1932 break;
1933
1934 if (sysctl_createv(log, 0, &rnode, &cnode,
1935 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
1936 SYSCTL_DESCR("Receive Descriptor Tail"),
1937 ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
1938 CTL_CREATE, CTL_EOL) != 0)
1939 break;
1940
1941 evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
1942 NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
1943 evcnt_attach_dynamic(&adapter->queues[i].handleq,
1944 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1945 "Handled queue in softint");
1946 evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
1947 NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
1948 if (i < __arraycount(stats->qbtc))
1949 evcnt_attach_dynamic(&stats->qbtc[i], EVCNT_TYPE_MISC,
1950 NULL, adapter->queues[i].evnamebuf,
1951 "qbtc");
1952 evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
1953 NULL, adapter->queues[i].evnamebuf,
1954 "Queue Packets Transmitted");
1955 if (i < __arraycount(stats->qptc))
1956 evcnt_attach_dynamic(&stats->qptc[i], EVCNT_TYPE_MISC,
1957 NULL, adapter->queues[i].evnamebuf,
1958 "qptc");
1959 #ifndef IXGBE_LEGACY_TX
1960 evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
1961 NULL, adapter->queues[i].evnamebuf,
1962 "Packets dropped in pcq");
1963 #endif
1964 evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
1965 NULL, adapter->queues[i].evnamebuf,
1966 "TX Queue No Descriptor Available");
1967 evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
1968 NULL, adapter->queues[i].evnamebuf, "TSO");
1969
1970 evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
1971 NULL, adapter->queues[i].evnamebuf,
1972 "Queue Bytes Received");
1973 if (i < __arraycount(stats->qbrc))
1974 evcnt_attach_dynamic(&stats->qbrc[i], EVCNT_TYPE_MISC,
1975 NULL, adapter->queues[i].evnamebuf,
1976 "qbrc");
1977 evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
1978 NULL, adapter->queues[i].evnamebuf,
1979 "Queue Packets Received");
1980 if (i < __arraycount(stats->qprc))
1981 evcnt_attach_dynamic(&stats->qprc[i], EVCNT_TYPE_MISC,
1982 NULL, adapter->queues[i].evnamebuf,
1983 "qprc");
1984 if ((i < __arraycount(stats->qprdc)) &&
1985 (hw->mac.type >= ixgbe_mac_82599EB))
1986 evcnt_attach_dynamic(&stats->qprdc[i],
1987 EVCNT_TYPE_MISC, NULL,
1988 adapter->queues[i].evnamebuf,
1989 "qprdc");
1990
1991 evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
1992 NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
1993 evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
1994 NULL, adapter->queues[i].evnamebuf, "Rx discarded");
1995 evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
1996 NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
1997 #ifdef LRO
1998 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
1999 CTLFLAG_RD, &lro->lro_queued, 0,
2000 "LRO Queued");
2001 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
2002 CTLFLAG_RD, &lro->lro_flushed, 0,
2003 "LRO Flushed");
2004 #endif /* LRO */
2005 }
2006
2007 /* MAC stats get their own sub node */
2008
2009 snprintf(stats->namebuf,
2010 sizeof(stats->namebuf), "%s MAC Statistics", xname);
2011
2012 evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
2013 stats->namebuf, "rx csum offload - IP");
2014 evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
2015 stats->namebuf, "rx csum offload - L4");
2016 evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
2017 stats->namebuf, "rx csum offload - IP bad");
2018 evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
2019 stats->namebuf, "rx csum offload - L4 bad");
2020 evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
2021 stats->namebuf, "Interrupt conditions zero");
2022 evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
2023 stats->namebuf, "Legacy interrupts");
2024
2025 evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
2026 stats->namebuf, "CRC Errors");
2027 evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
2028 stats->namebuf, "Illegal Byte Errors");
2029 evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
2030 stats->namebuf, "Byte Errors");
2031 evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
2032 stats->namebuf, "MAC Short Packets Discarded");
2033 if (hw->mac.type >= ixgbe_mac_X550)
2034 evcnt_attach_dynamic(&stats->mbsdc, EVCNT_TYPE_MISC, NULL,
2035 stats->namebuf, "Bad SFD");
2036 evcnt_attach_dynamic(&stats->mpctotal, EVCNT_TYPE_MISC, NULL,
2037 stats->namebuf, "Total Packets Missed");
2038 evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
2039 stats->namebuf, "MAC Local Faults");
2040 evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
2041 stats->namebuf, "MAC Remote Faults");
2042 if (hw->mac.type == ixgbe_mac_X550EM_a)
2043 evcnt_attach_dynamic(&stats->link_dn_cnt, EVCNT_TYPE_MISC,
2044 NULL, stats->namebuf, "Link down event in the MAC");
2045 evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
2046 stats->namebuf, "Receive Length Errors");
2047 evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
2048 stats->namebuf, "Link XON Transmitted");
2049 evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
2050 stats->namebuf, "Link XON Received");
2051 evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
2052 stats->namebuf, "Link XOFF Transmitted");
2053 evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
2054 stats->namebuf, "Link XOFF Received");
2055
2056 /* Packet Reception Stats */
2057 evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
2058 stats->namebuf, "Total Octets Received");
2059 evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
2060 stats->namebuf, "Good Octets Received");
2061 evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
2062 stats->namebuf, "Total Packets Received");
2063 evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
2064 stats->namebuf, "Good Packets Received");
2065 evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
2066 stats->namebuf, "Multicast Packets Received");
2067 evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
2068 stats->namebuf, "Broadcast Packets Received");
2069 evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
2070 stats->namebuf, "64 byte frames received ");
2071 evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
2072 stats->namebuf, "65-127 byte frames received");
2073 evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
2074 stats->namebuf, "128-255 byte frames received");
2075 evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
2076 stats->namebuf, "256-511 byte frames received");
2077 evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
2078 stats->namebuf, "512-1023 byte frames received");
2079 evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
2080 stats->namebuf, "1023-1522 byte frames received");
2081 evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
2082 stats->namebuf, "Receive Undersized");
2083 evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
2084 stats->namebuf, "Fragmented Packets Received ");
2085 evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
2086 stats->namebuf, "Oversized Packets Received");
2087 evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
2088 stats->namebuf, "Received Jabber");
2089 evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
2090 stats->namebuf, "Management Packets Received");
2091 evcnt_attach_dynamic(&stats->mngpdc, EVCNT_TYPE_MISC, NULL,
2092 stats->namebuf, "Management Packets Dropped");
2093 evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
2094 stats->namebuf, "Checksum Errors");
2095
2096 /* Packet Transmission Stats */
2097 evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
2098 stats->namebuf, "Good Octets Transmitted");
2099 evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
2100 stats->namebuf, "Total Packets Transmitted");
2101 evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
2102 stats->namebuf, "Good Packets Transmitted");
2103 evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
2104 stats->namebuf, "Broadcast Packets Transmitted");
2105 evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
2106 stats->namebuf, "Multicast Packets Transmitted");
2107 evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
2108 stats->namebuf, "Management Packets Transmitted");
2109 evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
2110 stats->namebuf, "64 byte frames transmitted ");
2111 evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
2112 stats->namebuf, "65-127 byte frames transmitted");
2113 evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
2114 stats->namebuf, "128-255 byte frames transmitted");
2115 evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
2116 stats->namebuf, "256-511 byte frames transmitted");
2117 evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
2118 stats->namebuf, "512-1023 byte frames transmitted");
2119 evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
2120 stats->namebuf, "1024-1522 byte frames transmitted");
2121 } /* ixgbe_add_hw_stats */
2122
2123 static void
2124 ixgbe_clear_evcnt(struct adapter *adapter)
2125 {
2126 struct tx_ring *txr = adapter->tx_rings;
2127 struct rx_ring *rxr = adapter->rx_rings;
2128 struct ixgbe_hw *hw = &adapter->hw;
2129 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
2130 int i;
2131
2132 IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, 0);
2133 IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, 0);
2134 IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, 0);
2135 IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, 0);
2136 IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, 0);
2137 IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, 0);
2138 IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, 0);
2139 IXGBE_EVC_STORE(&adapter->tso_err, 0);
2140 IXGBE_EVC_STORE(&adapter->watchdog_events, 0);
2141 IXGBE_EVC_STORE(&adapter->admin_irqev, 0);
2142 IXGBE_EVC_STORE(&adapter->link_workev, 0);
2143 IXGBE_EVC_STORE(&adapter->mod_workev, 0);
2144 IXGBE_EVC_STORE(&adapter->msf_workev, 0);
2145 IXGBE_EVC_STORE(&adapter->phy_workev, 0);
2146
2147 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
2148 if (i < __arraycount(stats->mpc)) {
2149 IXGBE_EVC_STORE(&stats->mpc[i], 0);
2150 if (hw->mac.type == ixgbe_mac_82598EB)
2151 IXGBE_EVC_STORE(&stats->rnbc[i], 0);
2152 }
2153 if (i < __arraycount(stats->pxontxc)) {
2154 IXGBE_EVC_STORE(&stats->pxontxc[i], 0);
2155 IXGBE_EVC_STORE(&stats->pxonrxc[i], 0);
2156 IXGBE_EVC_STORE(&stats->pxofftxc[i], 0);
2157 IXGBE_EVC_STORE(&stats->pxoffrxc[i], 0);
2158 if (hw->mac.type >= ixgbe_mac_82599EB)
2159 IXGBE_EVC_STORE(&stats->pxon2offc[i], 0);
2160 }
2161 }
2162
2163 txr = adapter->tx_rings;
2164 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
2165 IXGBE_EVC_STORE(&adapter->queues[i].irqs, 0);
2166 IXGBE_EVC_STORE(&adapter->queues[i].handleq, 0);
2167 IXGBE_EVC_STORE(&adapter->queues[i].req, 0);
2168 IXGBE_EVC_STORE(&txr->total_packets, 0);
2169 #ifndef IXGBE_LEGACY_TX
2170 IXGBE_EVC_STORE(&txr->pcq_drops, 0);
2171 #endif
2172 IXGBE_EVC_STORE(&txr->no_desc_avail, 0);
2173 IXGBE_EVC_STORE(&txr->tso_tx, 0);
2174 txr->q_efbig_tx_dma_setup = 0;
2175 txr->q_mbuf_defrag_failed = 0;
2176 txr->q_efbig2_tx_dma_setup = 0;
2177 txr->q_einval_tx_dma_setup = 0;
2178 txr->q_other_tx_dma_setup = 0;
2179 txr->q_eagain_tx_dma_setup = 0;
2180 txr->q_enomem_tx_dma_setup = 0;
2181 txr->q_tso_err = 0;
2182
2183 if (i < __arraycount(stats->qprc)) {
2184 IXGBE_EVC_STORE(&stats->qprc[i], 0);
2185 IXGBE_EVC_STORE(&stats->qptc[i], 0);
2186 IXGBE_EVC_STORE(&stats->qbrc[i], 0);
2187 IXGBE_EVC_STORE(&stats->qbtc[i], 0);
2188 if (hw->mac.type >= ixgbe_mac_82599EB)
2189 IXGBE_EVC_STORE(&stats->qprdc[i], 0);
2190 }
2191
2192 IXGBE_EVC_STORE(&rxr->rx_packets, 0);
2193 IXGBE_EVC_STORE(&rxr->rx_bytes, 0);
2194 IXGBE_EVC_STORE(&rxr->rx_copies, 0);
2195 IXGBE_EVC_STORE(&rxr->no_mbuf, 0);
2196 IXGBE_EVC_STORE(&rxr->rx_discarded, 0);
2197 }
2198 IXGBE_EVC_STORE(&stats->ipcs, 0);
2199 IXGBE_EVC_STORE(&stats->l4cs, 0);
2200 IXGBE_EVC_STORE(&stats->ipcs_bad, 0);
2201 IXGBE_EVC_STORE(&stats->l4cs_bad, 0);
2202 IXGBE_EVC_STORE(&stats->intzero, 0);
2203 IXGBE_EVC_STORE(&stats->legint, 0);
2204 IXGBE_EVC_STORE(&stats->crcerrs, 0);
2205 IXGBE_EVC_STORE(&stats->illerrc, 0);
2206 IXGBE_EVC_STORE(&stats->errbc, 0);
2207 IXGBE_EVC_STORE(&stats->mspdc, 0);
2208 if (hw->mac.type >= ixgbe_mac_X550)
2209 IXGBE_EVC_STORE(&stats->mbsdc, 0);
2210 IXGBE_EVC_STORE(&stats->mpctotal, 0);
2211 IXGBE_EVC_STORE(&stats->mlfc, 0);
2212 IXGBE_EVC_STORE(&stats->mrfc, 0);
2213 if (hw->mac.type == ixgbe_mac_X550EM_a)
2214 IXGBE_EVC_STORE(&stats->link_dn_cnt, 0);
2215 IXGBE_EVC_STORE(&stats->rlec, 0);
2216 IXGBE_EVC_STORE(&stats->lxontxc, 0);
2217 IXGBE_EVC_STORE(&stats->lxonrxc, 0);
2218 IXGBE_EVC_STORE(&stats->lxofftxc, 0);
2219 IXGBE_EVC_STORE(&stats->lxoffrxc, 0);
2220
2221 /* Packet Reception Stats */
2222 IXGBE_EVC_STORE(&stats->tor, 0);
2223 IXGBE_EVC_STORE(&stats->gorc, 0);
2224 IXGBE_EVC_STORE(&stats->tpr, 0);
2225 IXGBE_EVC_STORE(&stats->gprc, 0);
2226 IXGBE_EVC_STORE(&stats->mprc, 0);
2227 IXGBE_EVC_STORE(&stats->bprc, 0);
2228 IXGBE_EVC_STORE(&stats->prc64, 0);
2229 IXGBE_EVC_STORE(&stats->prc127, 0);
2230 IXGBE_EVC_STORE(&stats->prc255, 0);
2231 IXGBE_EVC_STORE(&stats->prc511, 0);
2232 IXGBE_EVC_STORE(&stats->prc1023, 0);
2233 IXGBE_EVC_STORE(&stats->prc1522, 0);
2234 IXGBE_EVC_STORE(&stats->ruc, 0);
2235 IXGBE_EVC_STORE(&stats->rfc, 0);
2236 IXGBE_EVC_STORE(&stats->roc, 0);
2237 IXGBE_EVC_STORE(&stats->rjc, 0);
2238 IXGBE_EVC_STORE(&stats->mngprc, 0);
2239 IXGBE_EVC_STORE(&stats->mngpdc, 0);
2240 IXGBE_EVC_STORE(&stats->xec, 0);
2241
2242 /* Packet Transmission Stats */
2243 IXGBE_EVC_STORE(&stats->gotc, 0);
2244 IXGBE_EVC_STORE(&stats->tpt, 0);
2245 IXGBE_EVC_STORE(&stats->gptc, 0);
2246 IXGBE_EVC_STORE(&stats->bptc, 0);
2247 IXGBE_EVC_STORE(&stats->mptc, 0);
2248 IXGBE_EVC_STORE(&stats->mngptc, 0);
2249 IXGBE_EVC_STORE(&stats->ptc64, 0);
2250 IXGBE_EVC_STORE(&stats->ptc127, 0);
2251 IXGBE_EVC_STORE(&stats->ptc255, 0);
2252 IXGBE_EVC_STORE(&stats->ptc511, 0);
2253 IXGBE_EVC_STORE(&stats->ptc1023, 0);
2254 IXGBE_EVC_STORE(&stats->ptc1522, 0);
2255 }
2256
2257 /************************************************************************
2258 * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
2259 *
2260 * Retrieves the TDH value from the hardware
2261 ************************************************************************/
2262 static int
2263 ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
2264 {
2265 struct sysctlnode node = *rnode;
2266 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2267 struct adapter *adapter;
2268 uint32_t val;
2269
2270 if (!txr)
2271 return (0);
2272
2273 adapter = txr->adapter;
2274 if (ixgbe_fw_recovery_mode_swflag(adapter))
2275 return (EPERM);
2276
2277 val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me));
2278 node.sysctl_data = &val;
2279 return sysctl_lookup(SYSCTLFN_CALL(&node));
2280 } /* ixgbe_sysctl_tdh_handler */
2281
2282 /************************************************************************
2283 * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
2284 *
2285 * Retrieves the TDT value from the hardware
2286 ************************************************************************/
2287 static int
2288 ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
2289 {
2290 struct sysctlnode node = *rnode;
2291 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2292 struct adapter *adapter;
2293 uint32_t val;
2294
2295 if (!txr)
2296 return (0);
2297
2298 adapter = txr->adapter;
2299 if (ixgbe_fw_recovery_mode_swflag(adapter))
2300 return (EPERM);
2301
2302 val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me));
2303 node.sysctl_data = &val;
2304 return sysctl_lookup(SYSCTLFN_CALL(&node));
2305 } /* ixgbe_sysctl_tdt_handler */
2306
2307 /************************************************************************
2308 * ixgbe_sysctl_next_to_check_handler - Receive Descriptor next to check
2309 * handler function
2310 *
2311 * Retrieves the next_to_check value
2312 ************************************************************************/
2313 static int
2314 ixgbe_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
2315 {
2316 struct sysctlnode node = *rnode;
2317 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2318 struct adapter *adapter;
2319 uint32_t val;
2320
2321 if (!rxr)
2322 return (0);
2323
2324 adapter = rxr->adapter;
2325 if (ixgbe_fw_recovery_mode_swflag(adapter))
2326 return (EPERM);
2327
2328 val = rxr->next_to_check;
2329 node.sysctl_data = &val;
2330 return sysctl_lookup(SYSCTLFN_CALL(&node));
2331 } /* ixgbe_sysctl_next_to_check_handler */
2332
2333 /************************************************************************
2334 * ixgbe_sysctl_next_to_refresh_handler - Receive Descriptor next to check
2335 * handler function
2336 *
2337 * Retrieves the next_to_refresh value
2338 ************************************************************************/
2339 static int
2340 ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
2341 {
2342 struct sysctlnode node = *rnode;
2343 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2344 struct adapter *adapter;
2345 uint32_t val;
2346
2347 if (!rxr)
2348 return (0);
2349
2350 adapter = rxr->adapter;
2351 if (ixgbe_fw_recovery_mode_swflag(adapter))
2352 return (EPERM);
2353
2354 val = rxr->next_to_refresh;
2355 node.sysctl_data = &val;
2356 return sysctl_lookup(SYSCTLFN_CALL(&node));
2357 } /* ixgbe_sysctl_next_to_refresh_handler */
2358
2359 /************************************************************************
2360 * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
2361 *
2362 * Retrieves the RDH value from the hardware
2363 ************************************************************************/
2364 static int
2365 ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
2366 {
2367 struct sysctlnode node = *rnode;
2368 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2369 struct adapter *adapter;
2370 uint32_t val;
2371
2372 if (!rxr)
2373 return (0);
2374
2375 adapter = rxr->adapter;
2376 if (ixgbe_fw_recovery_mode_swflag(adapter))
2377 return (EPERM);
2378
2379 val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDH(rxr->me));
2380 node.sysctl_data = &val;
2381 return sysctl_lookup(SYSCTLFN_CALL(&node));
2382 } /* ixgbe_sysctl_rdh_handler */
2383
2384 /************************************************************************
2385 * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
2386 *
2387 * Retrieves the RDT value from the hardware
2388 ************************************************************************/
2389 static int
2390 ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
2391 {
2392 struct sysctlnode node = *rnode;
2393 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2394 struct adapter *adapter;
2395 uint32_t val;
2396
2397 if (!rxr)
2398 return (0);
2399
2400 adapter = rxr->adapter;
2401 if (ixgbe_fw_recovery_mode_swflag(adapter))
2402 return (EPERM);
2403
2404 val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDT(rxr->me));
2405 node.sysctl_data = &val;
2406 return sysctl_lookup(SYSCTLFN_CALL(&node));
2407 } /* ixgbe_sysctl_rdt_handler */
2408
2409 static int
2410 ixgbe_vlan_cb(struct ethercom *ec, uint16_t vid, bool set)
2411 {
2412 struct ifnet *ifp = &ec->ec_if;
2413 struct adapter *adapter = ifp->if_softc;
2414 int rv;
2415
2416 if (set)
2417 rv = ixgbe_register_vlan(adapter, vid);
2418 else
2419 rv = ixgbe_unregister_vlan(adapter, vid);
2420
2421 if (rv != 0)
2422 return rv;
2423
2424 /*
2425 * Control VLAN HW tagging when ec_nvlan is changed from 1 to 0
2426 * or 0 to 1.
2427 */
2428 if ((set && (ec->ec_nvlans == 1)) || (!set && (ec->ec_nvlans == 0)))
2429 ixgbe_setup_vlan_hw_tagging(adapter);
2430
2431 return rv;
2432 }
2433
2434 /************************************************************************
2435 * ixgbe_register_vlan
2436 *
2437 * Run via vlan config EVENT, it enables us to use the
2438 * HW Filter table since we can get the vlan id. This
2439 * just creates the entry in the soft version of the
2440 * VFTA, init will repopulate the real table.
2441 ************************************************************************/
2442 static int
2443 ixgbe_register_vlan(struct adapter *adapter, u16 vtag)
2444 {
2445 u16 index, bit;
2446 int error;
2447
2448 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2449 return EINVAL;
2450
2451 IXGBE_CORE_LOCK(adapter);
2452 index = (vtag >> 5) & 0x7F;
2453 bit = vtag & 0x1F;
2454 adapter->shadow_vfta[index] |= ((u32)1 << bit);
2455 error = adapter->hw.mac.ops.set_vfta(&adapter->hw, vtag, 0, true,
2456 true);
2457 IXGBE_CORE_UNLOCK(adapter);
2458 if (error != 0)
2459 error = EACCES;
2460
2461 return error;
2462 } /* ixgbe_register_vlan */
2463
2464 /************************************************************************
2465 * ixgbe_unregister_vlan
2466 *
2467 * Run via vlan unconfig EVENT, remove our entry in the soft vfta.
2468 ************************************************************************/
2469 static int
2470 ixgbe_unregister_vlan(struct adapter *adapter, u16 vtag)
2471 {
2472 u16 index, bit;
2473 int error;
2474
2475 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2476 return EINVAL;
2477
2478 IXGBE_CORE_LOCK(adapter);
2479 index = (vtag >> 5) & 0x7F;
2480 bit = vtag & 0x1F;
2481 adapter->shadow_vfta[index] &= ~((u32)1 << bit);
2482 error = adapter->hw.mac.ops.set_vfta(&adapter->hw, vtag, 0, false,
2483 true);
2484 IXGBE_CORE_UNLOCK(adapter);
2485 if (error != 0)
2486 error = EACCES;
2487
2488 return error;
2489 } /* ixgbe_unregister_vlan */
2490
2491 static void
2492 ixgbe_setup_vlan_hw_tagging(struct adapter *adapter)
2493 {
2494 struct ethercom *ec = &adapter->osdep.ec;
2495 struct ixgbe_hw *hw = &adapter->hw;
2496 struct rx_ring *rxr;
2497 u32 ctrl;
2498 int i;
2499 bool hwtagging;
2500
2501 /* Enable HW tagging only if any vlan is attached */
2502 hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
2503 && VLAN_ATTACHED(ec);
2504
2505 /* Setup the queues for vlans */
2506 for (i = 0; i < adapter->num_queues; i++) {
2507 rxr = &adapter->rx_rings[i];
2508 /*
2509 * On 82599 and later, the VLAN enable is per/queue in RXDCTL.
2510 */
2511 if (hw->mac.type != ixgbe_mac_82598EB) {
2512 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
2513 if (hwtagging)
2514 ctrl |= IXGBE_RXDCTL_VME;
2515 else
2516 ctrl &= ~IXGBE_RXDCTL_VME;
2517 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
2518 }
2519 rxr->vtag_strip = hwtagging ? TRUE : FALSE;
2520 }
2521
2522 /* VLAN hw tagging for 82598 */
2523 if (hw->mac.type == ixgbe_mac_82598EB) {
2524 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2525 if (hwtagging)
2526 ctrl |= IXGBE_VLNCTRL_VME;
2527 else
2528 ctrl &= ~IXGBE_VLNCTRL_VME;
2529 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
2530 }
2531 } /* ixgbe_setup_vlan_hw_tagging */
2532
2533 static void
2534 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
2535 {
2536 struct ethercom *ec = &adapter->osdep.ec;
2537 struct ixgbe_hw *hw = &adapter->hw;
2538 int i;
2539 u32 ctrl;
2540 struct vlanid_list *vlanidp;
2541
2542 /*
2543 * This function is called from both if_init and ifflags_cb()
2544 * on NetBSD.
2545 */
2546
2547 /*
2548 * Part 1:
2549 * Setup VLAN HW tagging
2550 */
2551 ixgbe_setup_vlan_hw_tagging(adapter);
2552
2553 /*
2554 * Part 2:
2555 * Setup VLAN HW filter
2556 */
2557 /* Cleanup shadow_vfta */
2558 for (i = 0; i < IXGBE_VFTA_SIZE; i++)
2559 adapter->shadow_vfta[i] = 0;
2560 /* Generate shadow_vfta from ec_vids */
2561 ETHER_LOCK(ec);
2562 SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
2563 uint32_t idx;
2564
2565 idx = vlanidp->vid / 32;
2566 KASSERT(idx < IXGBE_VFTA_SIZE);
2567 adapter->shadow_vfta[idx] |= (u32)1 << (vlanidp->vid % 32);
2568 }
2569 ETHER_UNLOCK(ec);
2570 for (i = 0; i < IXGBE_VFTA_SIZE; i++)
2571 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), adapter->shadow_vfta[i]);
2572
2573 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2574 /* Enable the Filter Table if enabled */
2575 if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER)
2576 ctrl |= IXGBE_VLNCTRL_VFE;
2577 else
2578 ctrl &= ~IXGBE_VLNCTRL_VFE;
2579 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
2580 } /* ixgbe_setup_vlan_hw_support */
2581
2582 /************************************************************************
2583 * ixgbe_get_slot_info
2584 *
2585 * Get the width and transaction speed of
2586 * the slot this adapter is plugged into.
2587 ************************************************************************/
2588 static void
2589 ixgbe_get_slot_info(struct adapter *adapter)
2590 {
2591 device_t dev = adapter->dev;
2592 struct ixgbe_hw *hw = &adapter->hw;
2593 u32 offset;
2594 u16 link;
2595 int bus_info_valid = TRUE;
2596
2597 /* Some devices are behind an internal bridge */
2598 switch (hw->device_id) {
2599 case IXGBE_DEV_ID_82599_SFP_SF_QP:
2600 case IXGBE_DEV_ID_82599_QSFP_SF_QP:
2601 goto get_parent_info;
2602 default:
2603 break;
2604 }
2605
2606 ixgbe_get_bus_info(hw);
2607
2608 /*
2609 * Some devices don't use PCI-E, but there is no need
2610 * to display "Unknown" for bus speed and width.
2611 */
2612 switch (hw->mac.type) {
2613 case ixgbe_mac_X550EM_x:
2614 case ixgbe_mac_X550EM_a:
2615 return;
2616 default:
2617 goto display;
2618 }
2619
2620 get_parent_info:
2621 /*
2622 * For the Quad port adapter we need to parse back
2623 * up the PCI tree to find the speed of the expansion
2624 * slot into which this adapter is plugged. A bit more work.
2625 */
2626 dev = device_parent(device_parent(dev));
2627 #if 0
2628 #ifdef IXGBE_DEBUG
2629 device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
2630 pci_get_slot(dev), pci_get_function(dev));
2631 #endif
2632 dev = device_parent(device_parent(dev));
2633 #ifdef IXGBE_DEBUG
2634 device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
2635 pci_get_slot(dev), pci_get_function(dev));
2636 #endif
2637 #endif
2638 /* Now get the PCI Express Capabilities offset */
2639 if (pci_get_capability(adapter->osdep.pc, adapter->osdep.tag,
2640 PCI_CAP_PCIEXPRESS, &offset, NULL)) {
2641 /*
2642 * Hmm...can't get PCI-Express capabilities.
2643 * Falling back to default method.
2644 */
2645 bus_info_valid = FALSE;
2646 ixgbe_get_bus_info(hw);
2647 goto display;
2648 }
2649 /* ...and read the Link Status Register */
2650 link = pci_conf_read(adapter->osdep.pc, adapter->osdep.tag,
2651 offset + PCIE_LCSR) >> 16;
2652 ixgbe_set_pci_config_data_generic(hw, link);
2653
2654 display:
2655 device_printf(dev, "PCI Express Bus: Speed %s Width %s\n",
2656 ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s" :
2657 (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s" :
2658 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s" :
2659 "Unknown"),
2660 ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "x8" :
2661 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "x4" :
2662 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "x1" :
2663 "Unknown"));
2664
2665 if (bus_info_valid) {
2666 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2667 ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
2668 (hw->bus.speed == ixgbe_bus_speed_2500))) {
2669 device_printf(dev, "PCI-Express bandwidth available"
2670 " for this card\n is not sufficient for"
2671 " optimal performance.\n");
2672 device_printf(dev, "For optimal performance a x8 "
2673 "PCIE, or x4 PCIE Gen2 slot is required.\n");
2674 }
2675 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2676 ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
2677 (hw->bus.speed < ixgbe_bus_speed_8000))) {
2678 device_printf(dev, "PCI-Express bandwidth available"
2679 " for this card\n is not sufficient for"
2680 " optimal performance.\n");
2681 device_printf(dev, "For optimal performance a x8 "
2682 "PCIE Gen3 slot is required.\n");
2683 }
2684 } else
2685 device_printf(dev,
2686 "Unable to determine slot speed/width. The speed/width "
2687 "reported are that of the internal switch.\n");
2688
2689 return;
2690 } /* ixgbe_get_slot_info */
2691
2692 /************************************************************************
2693 * ixgbe_enable_queue - Queue Interrupt Enabler
2694 ************************************************************************/
2695 static inline void
2696 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
2697 {
2698 struct ixgbe_hw *hw = &adapter->hw;
2699 struct ix_queue *que = &adapter->queues[vector];
2700 u64 queue = 1ULL << vector;
2701 u32 mask;
2702
2703 mutex_enter(&que->dc_mtx);
2704 if (que->disabled_count > 0 && --que->disabled_count > 0)
2705 goto out;
2706
2707 if (hw->mac.type == ixgbe_mac_82598EB) {
2708 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2709 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
2710 } else {
2711 mask = (queue & 0xFFFFFFFF);
2712 if (mask)
2713 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
2714 mask = (queue >> 32);
2715 if (mask)
2716 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
2717 }
2718 out:
2719 mutex_exit(&que->dc_mtx);
2720 } /* ixgbe_enable_queue */
2721
2722 /************************************************************************
2723 * ixgbe_disable_queue_internal
2724 ************************************************************************/
2725 static inline void
2726 ixgbe_disable_queue_internal(struct adapter *adapter, u32 vector, bool nestok)
2727 {
2728 struct ixgbe_hw *hw = &adapter->hw;
2729 struct ix_queue *que = &adapter->queues[vector];
2730 u64 queue = 1ULL << vector;
2731 u32 mask;
2732
2733 mutex_enter(&que->dc_mtx);
2734
2735 if (que->disabled_count > 0) {
2736 if (nestok)
2737 que->disabled_count++;
2738 goto out;
2739 }
2740 que->disabled_count++;
2741
2742 if (hw->mac.type == ixgbe_mac_82598EB) {
2743 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2744 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
2745 } else {
2746 mask = (queue & 0xFFFFFFFF);
2747 if (mask)
2748 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
2749 mask = (queue >> 32);
2750 if (mask)
2751 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
2752 }
2753 out:
2754 mutex_exit(&que->dc_mtx);
2755 } /* ixgbe_disable_queue_internal */
2756
2757 /************************************************************************
2758 * ixgbe_disable_queue
2759 ************************************************************************/
2760 static inline void
2761 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
2762 {
2763
2764 ixgbe_disable_queue_internal(adapter, vector, true);
2765 } /* ixgbe_disable_queue */
2766
2767 /************************************************************************
2768 * ixgbe_sched_handle_que - schedule deferred packet processing
2769 ************************************************************************/
2770 static inline void
2771 ixgbe_sched_handle_que(struct adapter *adapter, struct ix_queue *que)
2772 {
2773
2774 if (que->txrx_use_workqueue) {
2775 /*
2776 * adapter->que_wq is bound to each CPU instead of
2777 * each NIC queue to reduce workqueue kthread. As we
2778 * should consider about interrupt affinity in this
2779 * function, the workqueue kthread must be WQ_PERCPU.
2780 * If create WQ_PERCPU workqueue kthread for each NIC
2781 * queue, that number of created workqueue kthread is
2782 * (number of used NIC queue) * (number of CPUs) =
2783 * (number of CPUs) ^ 2 most often.
2784 *
2785 * The same NIC queue's interrupts are avoided by
2786 * masking the queue's interrupt. And different
2787 * NIC queue's interrupts use different struct work
2788 * (que->wq_cookie). So, "enqueued flag" to avoid
2789 * twice workqueue_enqueue() is not required .
2790 */
2791 workqueue_enqueue(adapter->que_wq, &que->wq_cookie, curcpu());
2792 } else
2793 softint_schedule(que->que_si);
2794 }
2795
2796 /************************************************************************
2797 * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2798 ************************************************************************/
2799 static int
2800 ixgbe_msix_que(void *arg)
2801 {
2802 struct ix_queue *que = arg;
2803 struct adapter *adapter = que->adapter;
2804 struct ifnet *ifp = adapter->ifp;
2805 struct tx_ring *txr = que->txr;
2806 struct rx_ring *rxr = que->rxr;
2807 u32 newitr = 0;
2808
2809 /* Protect against spurious interrupts */
2810 if ((ifp->if_flags & IFF_RUNNING) == 0)
2811 return 0;
2812
2813 ixgbe_disable_queue(adapter, que->msix);
2814 IXGBE_EVC_ADD(&que->irqs, 1);
2815
2816 /*
2817 * Don't change "que->txrx_use_workqueue" from this point to avoid
2818 * flip-flopping softint/workqueue mode in one deferred processing.
2819 */
2820 que->txrx_use_workqueue = adapter->txrx_use_workqueue;
2821
2822 IXGBE_TX_LOCK(txr);
2823 ixgbe_txeof(txr);
2824 IXGBE_TX_UNLOCK(txr);
2825
2826 /* Do AIM now? */
2827
2828 if (adapter->enable_aim == false)
2829 goto no_calc;
2830 /*
2831 * Do Adaptive Interrupt Moderation:
2832 * - Write out last calculated setting
2833 * - Calculate based on average size over
2834 * the last interval.
2835 */
2836 if (que->eitr_setting)
2837 ixgbe_eitr_write(adapter, que->msix, que->eitr_setting);
2838
2839 que->eitr_setting = 0;
2840
2841 /* Idle, do nothing */
2842 if ((txr->bytes == 0) && (rxr->bytes == 0))
2843 goto no_calc;
2844
2845 if ((txr->bytes) && (txr->packets))
2846 newitr = txr->bytes/txr->packets;
2847 if ((rxr->bytes) && (rxr->packets))
2848 newitr = uimax(newitr, (rxr->bytes / rxr->packets));
2849 newitr += 24; /* account for hardware frame, crc */
2850
2851 /* set an upper boundary */
2852 newitr = uimin(newitr, 3000);
2853
2854 /* Be nice to the mid range */
2855 if ((newitr > 300) && (newitr < 1200))
2856 newitr = (newitr / 3);
2857 else
2858 newitr = (newitr / 2);
2859
2860 /*
2861 * When RSC is used, ITR interval must be larger than RSC_DELAY.
2862 * Currently, we use 2us for RSC_DELAY. The minimum value is always
2863 * greater than 2us on 100M (and 10M?(not documented)), but it's not
2864 * on 1G and higher.
2865 */
2866 if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
2867 && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL))
2868 if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
2869 newitr = IXGBE_MIN_RSC_EITR_10G1G;
2870
2871 /* save for next interrupt */
2872 que->eitr_setting = newitr;
2873
2874 /* Reset state */
2875 txr->bytes = 0;
2876 txr->packets = 0;
2877 rxr->bytes = 0;
2878 rxr->packets = 0;
2879
2880 no_calc:
2881 ixgbe_sched_handle_que(adapter, que);
2882
2883 return 1;
2884 } /* ixgbe_msix_que */
2885
2886 /************************************************************************
2887 * ixgbe_media_status - Media Ioctl callback
2888 *
2889 * Called whenever the user queries the status of
2890 * the interface using ifconfig.
2891 ************************************************************************/
2892 static void
2893 ixgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2894 {
2895 struct adapter *adapter = ifp->if_softc;
2896 struct ixgbe_hw *hw = &adapter->hw;
2897 int layer;
2898
2899 INIT_DEBUGOUT("ixgbe_media_status: begin");
2900 ixgbe_update_link_status(adapter);
2901
2902 ifmr->ifm_status = IFM_AVALID;
2903 ifmr->ifm_active = IFM_ETHER;
2904
2905 if (adapter->link_active != LINK_STATE_UP) {
2906 ifmr->ifm_active |= IFM_NONE;
2907 return;
2908 }
2909
2910 ifmr->ifm_status |= IFM_ACTIVE;
2911 layer = adapter->phy_layer;
2912
2913 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2914 layer & IXGBE_PHYSICAL_LAYER_5GBASE_T ||
2915 layer & IXGBE_PHYSICAL_LAYER_2500BASE_T ||
2916 layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2917 layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2918 layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2919 switch (adapter->link_speed) {
2920 case IXGBE_LINK_SPEED_10GB_FULL:
2921 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2922 break;
2923 case IXGBE_LINK_SPEED_5GB_FULL:
2924 ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
2925 break;
2926 case IXGBE_LINK_SPEED_2_5GB_FULL:
2927 ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
2928 break;
2929 case IXGBE_LINK_SPEED_1GB_FULL:
2930 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2931 break;
2932 case IXGBE_LINK_SPEED_100_FULL:
2933 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2934 break;
2935 case IXGBE_LINK_SPEED_10_FULL:
2936 ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2937 break;
2938 }
2939 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2940 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2941 switch (adapter->link_speed) {
2942 case IXGBE_LINK_SPEED_10GB_FULL:
2943 ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2944 break;
2945 }
2946 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2947 switch (adapter->link_speed) {
2948 case IXGBE_LINK_SPEED_10GB_FULL:
2949 ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2950 break;
2951 case IXGBE_LINK_SPEED_1GB_FULL:
2952 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2953 break;
2954 }
2955 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2956 switch (adapter->link_speed) {
2957 case IXGBE_LINK_SPEED_10GB_FULL:
2958 ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2959 break;
2960 case IXGBE_LINK_SPEED_1GB_FULL:
2961 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2962 break;
2963 }
2964 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2965 layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2966 switch (adapter->link_speed) {
2967 case IXGBE_LINK_SPEED_10GB_FULL:
2968 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2969 break;
2970 case IXGBE_LINK_SPEED_1GB_FULL:
2971 ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2972 break;
2973 }
2974 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2975 switch (adapter->link_speed) {
2976 case IXGBE_LINK_SPEED_10GB_FULL:
2977 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2978 break;
2979 }
2980 /*
2981 * XXX: These need to use the proper media types once
2982 * they're added.
2983 */
2984 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2985 switch (adapter->link_speed) {
2986 case IXGBE_LINK_SPEED_10GB_FULL:
2987 ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2988 break;
2989 case IXGBE_LINK_SPEED_2_5GB_FULL:
2990 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2991 break;
2992 case IXGBE_LINK_SPEED_1GB_FULL:
2993 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2994 break;
2995 }
2996 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2997 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2998 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2999 switch (adapter->link_speed) {
3000 case IXGBE_LINK_SPEED_10GB_FULL:
3001 ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
3002 break;
3003 case IXGBE_LINK_SPEED_2_5GB_FULL:
3004 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
3005 break;
3006 case IXGBE_LINK_SPEED_1GB_FULL:
3007 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
3008 break;
3009 }
3010
3011 /* If nothing is recognized... */
3012 #if 0
3013 if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
3014 ifmr->ifm_active |= IFM_UNKNOWN;
3015 #endif
3016
3017 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
3018
3019 /* Display current flow control setting used on link */
3020 if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
3021 hw->fc.current_mode == ixgbe_fc_full)
3022 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
3023 if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
3024 hw->fc.current_mode == ixgbe_fc_full)
3025 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
3026
3027 return;
3028 } /* ixgbe_media_status */
3029
3030 /************************************************************************
3031 * ixgbe_media_change - Media Ioctl callback
3032 *
3033 * Called when the user changes speed/duplex using
3034 * media/mediopt option with ifconfig.
3035 ************************************************************************/
3036 static int
3037 ixgbe_media_change(struct ifnet *ifp)
3038 {
3039 struct adapter *adapter = ifp->if_softc;
3040 struct ifmedia *ifm = &adapter->media;
3041 struct ixgbe_hw *hw = &adapter->hw;
3042 ixgbe_link_speed speed = 0;
3043 ixgbe_link_speed link_caps = 0;
3044 bool negotiate = false;
3045 s32 err = IXGBE_NOT_IMPLEMENTED;
3046
3047 INIT_DEBUGOUT("ixgbe_media_change: begin");
3048
3049 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
3050 return (EINVAL);
3051
3052 if (hw->phy.media_type == ixgbe_media_type_backplane)
3053 return (EPERM);
3054
3055 /*
3056 * We don't actually need to check against the supported
3057 * media types of the adapter; ifmedia will take care of
3058 * that for us.
3059 */
3060 switch (IFM_SUBTYPE(ifm->ifm_media)) {
3061 case IFM_AUTO:
3062 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
3063 &negotiate);
3064 if (err != IXGBE_SUCCESS) {
3065 device_printf(adapter->dev, "Unable to determine "
3066 "supported advertise speeds\n");
3067 return (ENODEV);
3068 }
3069 speed |= link_caps;
3070 break;
3071 case IFM_10G_T:
3072 case IFM_10G_LRM:
3073 case IFM_10G_LR:
3074 case IFM_10G_TWINAX:
3075 case IFM_10G_SR:
3076 case IFM_10G_CX4:
3077 case IFM_10G_KR:
3078 case IFM_10G_KX4:
3079 speed |= IXGBE_LINK_SPEED_10GB_FULL;
3080 break;
3081 case IFM_5000_T:
3082 speed |= IXGBE_LINK_SPEED_5GB_FULL;
3083 break;
3084 case IFM_2500_T:
3085 case IFM_2500_KX:
3086 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
3087 break;
3088 case IFM_1000_T:
3089 case IFM_1000_LX:
3090 case IFM_1000_SX:
3091 case IFM_1000_KX:
3092 speed |= IXGBE_LINK_SPEED_1GB_FULL;
3093 break;
3094 case IFM_100_TX:
3095 speed |= IXGBE_LINK_SPEED_100_FULL;
3096 break;
3097 case IFM_10_T:
3098 speed |= IXGBE_LINK_SPEED_10_FULL;
3099 break;
3100 case IFM_NONE:
3101 break;
3102 default:
3103 goto invalid;
3104 }
3105
3106 hw->mac.autotry_restart = TRUE;
3107 hw->mac.ops.setup_link(hw, speed, TRUE);
3108 adapter->advertise = 0;
3109 if (IFM_SUBTYPE(ifm->ifm_media) != IFM_AUTO) {
3110 if ((speed & IXGBE_LINK_SPEED_10GB_FULL) != 0)
3111 adapter->advertise |= 1 << 2;
3112 if ((speed & IXGBE_LINK_SPEED_1GB_FULL) != 0)
3113 adapter->advertise |= 1 << 1;
3114 if ((speed & IXGBE_LINK_SPEED_100_FULL) != 0)
3115 adapter->advertise |= 1 << 0;
3116 if ((speed & IXGBE_LINK_SPEED_10_FULL) != 0)
3117 adapter->advertise |= 1 << 3;
3118 if ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) != 0)
3119 adapter->advertise |= 1 << 4;
3120 if ((speed & IXGBE_LINK_SPEED_5GB_FULL) != 0)
3121 adapter->advertise |= 1 << 5;
3122 }
3123
3124 return (0);
3125
3126 invalid:
3127 device_printf(adapter->dev, "Invalid media type!\n");
3128
3129 return (EINVAL);
3130 } /* ixgbe_media_change */
3131
3132 /************************************************************************
3133 * ixgbe_msix_admin - Link status change ISR (MSI-X)
3134 ************************************************************************/
3135 static int
3136 ixgbe_msix_admin(void *arg)
3137 {
3138 struct adapter *adapter = arg;
3139 struct ixgbe_hw *hw = &adapter->hw;
3140 u32 eicr;
3141 u32 eims_orig;
3142 u32 eims_disable = 0;
3143
3144 IXGBE_EVC_ADD(&adapter->admin_irqev, 1);
3145
3146 eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
3147 /* Pause other interrupts */
3148 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_MSIX_OTHER_CLEAR_MASK);
3149
3150 /*
3151 * First get the cause.
3152 *
3153 * The specifications of 82598, 82599, X540 and X550 say EICS register
3154 * is write only. However, Linux says it is a workaround for silicon
3155 * errata to read EICS instead of EICR to get interrupt cause.
3156 * At least, reading EICR clears lower 16bits of EIMS on 82598.
3157 */
3158 eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
3159 /* Be sure the queue bits are not cleared */
3160 eicr &= ~IXGBE_EICR_RTX_QUEUE;
3161 /* Clear all OTHER interrupts with write */
3162 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
3163
3164 ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
3165
3166 /* Re-enable some OTHER interrupts */
3167 IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig & ~eims_disable);
3168
3169 return 1;
3170 } /* ixgbe_msix_admin */
3171
3172 static void
3173 ixgbe_intr_admin_common(struct adapter *adapter, u32 eicr, u32 *eims_disable)
3174 {
3175 struct ixgbe_hw *hw = &adapter->hw;
3176 u32 task_requests = 0;
3177 s32 retval;
3178
3179 /* Link status change */
3180 if (eicr & IXGBE_EICR_LSC) {
3181 task_requests |= IXGBE_REQUEST_TASK_LSC;
3182 *eims_disable |= IXGBE_EIMS_LSC;
3183 }
3184
3185 if (ixgbe_is_sfp(hw)) {
3186 u32 eicr_mask;
3187
3188 /* Pluggable optics-related interrupt */
3189 if (hw->mac.type >= ixgbe_mac_X540)
3190 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3191 else
3192 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3193
3194 /*
3195 * An interrupt might not arrive when a module is inserted.
3196 * When an link status change interrupt occurred and the driver
3197 * still regard SFP as unplugged, issue the module softint
3198 * and then issue LSC interrupt.
3199 */
3200 if ((eicr & eicr_mask)
3201 || ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
3202 && (eicr & IXGBE_EICR_LSC))) {
3203 task_requests |= IXGBE_REQUEST_TASK_MOD;
3204 *eims_disable |= IXGBE_EIMS_LSC;
3205 }
3206
3207 if ((hw->mac.type == ixgbe_mac_82599EB) &&
3208 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3209 task_requests |= IXGBE_REQUEST_TASK_MSF;
3210 *eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
3211 }
3212 }
3213
3214 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
3215 #ifdef IXGBE_FDIR
3216 if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
3217 (eicr & IXGBE_EICR_FLOW_DIR)) {
3218 if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1)) {
3219 task_requests |= IXGBE_REQUEST_TASK_FDIR;
3220 /* Disable the interrupt */
3221 *eims_disable |= IXGBE_EIMS_FLOW_DIR;
3222 }
3223 }
3224 #endif
3225
3226 if (eicr & IXGBE_EICR_ECC) {
3227 if (ratecheck(&adapter->lasterr_time,
3228 &ixgbe_errlog_intrvl))
3229 device_printf(adapter->dev,
3230 "CRITICAL: ECC ERROR!! Please Reboot!!\n");
3231 }
3232
3233 /* Check for over temp condition */
3234 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
3235 switch (adapter->hw.mac.type) {
3236 case ixgbe_mac_X550EM_a:
3237 if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
3238 break;
3239 retval = hw->phy.ops.check_overtemp(hw);
3240 if (retval != IXGBE_ERR_OVERTEMP)
3241 break;
3242 if (ratecheck(&adapter->lasterr_time,
3243 &ixgbe_errlog_intrvl)) {
3244 device_printf(adapter->dev,
3245 "CRITICAL: OVER TEMP!! "
3246 "PHY IS SHUT DOWN!!\n");
3247 device_printf(adapter->dev,
3248 "System shutdown required!\n");
3249 }
3250 break;
3251 default:
3252 if (!(eicr & IXGBE_EICR_TS))
3253 break;
3254 retval = hw->phy.ops.check_overtemp(hw);
3255 if (retval != IXGBE_ERR_OVERTEMP)
3256 break;
3257 if (ratecheck(&adapter->lasterr_time,
3258 &ixgbe_errlog_intrvl)) {
3259 device_printf(adapter->dev,
3260 "CRITICAL: OVER TEMP!! "
3261 "PHY IS SHUT DOWN!!\n");
3262 device_printf(adapter->dev,
3263 "System shutdown required!\n");
3264 }
3265 break;
3266 }
3267 }
3268
3269 /* Check for VF message */
3270 if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
3271 (eicr & IXGBE_EICR_MAILBOX)) {
3272 task_requests |= IXGBE_REQUEST_TASK_MBX;
3273 *eims_disable |= IXGBE_EIMS_MAILBOX;
3274 }
3275 }
3276
3277 /* Check for fan failure */
3278 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3279 ixgbe_check_fan_failure(adapter, eicr, true);
3280
3281 /* External PHY interrupt */
3282 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3283 (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
3284 task_requests |= IXGBE_REQUEST_TASK_PHY;
3285 *eims_disable |= IXGBE_EICR_GPI_SDP0_X540;
3286 }
3287
3288 if (task_requests != 0) {
3289 mutex_enter(&adapter->admin_mtx);
3290 adapter->task_requests |= task_requests;
3291 ixgbe_schedule_admin_tasklet(adapter);
3292 mutex_exit(&adapter->admin_mtx);
3293 }
3294 }
3295
3296 static void
3297 ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
3298 {
3299
3300 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
3301 itr |= itr << 16;
3302 else
3303 itr |= IXGBE_EITR_CNT_WDIS;
3304
3305 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(index), itr);
3306 }
3307
3308
3309 /************************************************************************
3310 * ixgbe_sysctl_interrupt_rate_handler
3311 ************************************************************************/
3312 static int
3313 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
3314 {
3315 struct sysctlnode node = *rnode;
3316 struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
3317 struct adapter *adapter;
3318 uint32_t reg, usec, rate;
3319 int error;
3320
3321 if (que == NULL)
3322 return 0;
3323
3324 adapter = que->adapter;
3325 if (ixgbe_fw_recovery_mode_swflag(adapter))
3326 return (EPERM);
3327
3328 reg = IXGBE_READ_REG(&adapter->hw, IXGBE_EITR(que->msix));
3329 usec = ((reg & 0x0FF8) >> 3);
3330 if (usec > 0)
3331 rate = 500000 / usec;
3332 else
3333 rate = 0;
3334 node.sysctl_data = &rate;
3335 error = sysctl_lookup(SYSCTLFN_CALL(&node));
3336 if (error || newp == NULL)
3337 return error;
3338 reg &= ~0xfff; /* default, no limitation */
3339 if (rate > 0 && rate < 500000) {
3340 if (rate < 1000)
3341 rate = 1000;
3342 reg |= ((4000000 / rate) & 0xff8);
3343 /*
3344 * When RSC is used, ITR interval must be larger than
3345 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
3346 * The minimum value is always greater than 2us on 100M
3347 * (and 10M?(not documented)), but it's not on 1G and higher.
3348 */
3349 if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
3350 && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
3351 if ((adapter->num_queues > 1)
3352 && (reg < IXGBE_MIN_RSC_EITR_10G1G))
3353 return EINVAL;
3354 }
3355 ixgbe_max_interrupt_rate = rate;
3356 } else
3357 ixgbe_max_interrupt_rate = 0;
3358 ixgbe_eitr_write(adapter, que->msix, reg);
3359
3360 return (0);
3361 } /* ixgbe_sysctl_interrupt_rate_handler */
3362
3363 const struct sysctlnode *
3364 ixgbe_sysctl_instance(struct adapter *adapter)
3365 {
3366 const char *dvname;
3367 struct sysctllog **log;
3368 int rc;
3369 const struct sysctlnode *rnode;
3370
3371 if (adapter->sysctltop != NULL)
3372 return adapter->sysctltop;
3373
3374 log = &adapter->sysctllog;
3375 dvname = device_xname(adapter->dev);
3376
3377 if ((rc = sysctl_createv(log, 0, NULL, &rnode,
3378 0, CTLTYPE_NODE, dvname,
3379 SYSCTL_DESCR("ixgbe information and settings"),
3380 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
3381 goto err;
3382
3383 return rnode;
3384 err:
3385 device_printf(adapter->dev,
3386 "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
3387 return NULL;
3388 }
3389
3390 /************************************************************************
3391 * ixgbe_add_device_sysctls
3392 ************************************************************************/
3393 static void
3394 ixgbe_add_device_sysctls(struct adapter *adapter)
3395 {
3396 device_t dev = adapter->dev;
3397 struct ixgbe_hw *hw = &adapter->hw;
3398 struct sysctllog **log;
3399 const struct sysctlnode *rnode, *cnode;
3400
3401 log = &adapter->sysctllog;
3402
3403 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
3404 aprint_error_dev(dev, "could not create sysctl root\n");
3405 return;
3406 }
3407
3408 if (sysctl_createv(log, 0, &rnode, &cnode,
3409 CTLFLAG_READWRITE, CTLTYPE_INT,
3410 "debug", SYSCTL_DESCR("Debug Info"),
3411 ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL)
3412 != 0)
3413 aprint_error_dev(dev, "could not create sysctl\n");
3414
3415 if (sysctl_createv(log, 0, &rnode, &cnode,
3416 CTLFLAG_READWRITE, CTLTYPE_INT,
3417 "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
3418 ixgbe_sysctl_rx_copy_len, 0,
3419 (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
3420 aprint_error_dev(dev, "could not create sysctl\n");
3421
3422 if (sysctl_createv(log, 0, &rnode, &cnode,
3423 CTLFLAG_READONLY, CTLTYPE_INT,
3424 "num_tx_desc", SYSCTL_DESCR("Number of TX descriptors"),
3425 NULL, 0, &adapter->num_tx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
3426 aprint_error_dev(dev, "could not create sysctl\n");
3427
3428 if (sysctl_createv(log, 0, &rnode, &cnode,
3429 CTLFLAG_READONLY, CTLTYPE_INT,
3430 "num_rx_desc", SYSCTL_DESCR("Number of RX descriptors"),
3431 NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
3432 aprint_error_dev(dev, "could not create sysctl\n");
3433
3434 if (sysctl_createv(log, 0, &rnode, &cnode,
3435 CTLFLAG_READWRITE, CTLTYPE_INT, "rx_process_limit",
3436 SYSCTL_DESCR("max number of RX packets to process"),
3437 ixgbe_sysctl_rx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
3438 CTL_EOL) != 0)
3439 aprint_error_dev(dev, "could not create sysctl\n");
3440
3441 if (sysctl_createv(log, 0, &rnode, &cnode,
3442 CTLFLAG_READWRITE, CTLTYPE_INT, "tx_process_limit",
3443 SYSCTL_DESCR("max number of TX packets to process"),
3444 ixgbe_sysctl_tx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
3445 CTL_EOL) != 0)
3446 aprint_error_dev(dev, "could not create sysctl\n");
3447
3448 if (sysctl_createv(log, 0, &rnode, &cnode,
3449 CTLFLAG_READONLY, CTLTYPE_INT,
3450 "num_queues", SYSCTL_DESCR("Number of queues"),
3451 NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
3452 aprint_error_dev(dev, "could not create sysctl\n");
3453
3454 /* Sysctls for all devices */
3455 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3456 CTLTYPE_INT, "fc", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_SET_FC),
3457 ixgbe_sysctl_flowcntl, 0, (void *)adapter, 0, CTL_CREATE,
3458 CTL_EOL) != 0)
3459 aprint_error_dev(dev, "could not create sysctl\n");
3460
3461 adapter->enable_aim = ixgbe_enable_aim;
3462 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3463 CTLTYPE_BOOL, "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
3464 NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
3465 aprint_error_dev(dev, "could not create sysctl\n");
3466
3467 if (sysctl_createv(log, 0, &rnode, &cnode,
3468 CTLFLAG_READWRITE, CTLTYPE_INT,
3469 "advertise_speed", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_ADV_SPEED),
3470 ixgbe_sysctl_advertise, 0, (void *)adapter, 0, CTL_CREATE,
3471 CTL_EOL) != 0)
3472 aprint_error_dev(dev, "could not create sysctl\n");
3473
3474 /*
3475 * If each "que->txrx_use_workqueue" is changed in sysctl handler,
3476 * it causesflip-flopping softint/workqueue mode in one deferred
3477 * processing. Therefore, preempt_disable()/preempt_enable() are
3478 * required in ixgbe_sched_handle_que() to avoid
3479 * KASSERT(ixgbe_sched_handle_que()) in softint_schedule().
3480 * I think changing "que->txrx_use_workqueue" in interrupt handler
3481 * is lighter than doing preempt_disable()/preempt_enable() in every
3482 * ixgbe_sched_handle_que().
3483 */
3484 adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
3485 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3486 CTLTYPE_BOOL, "txrx_workqueue",
3487 SYSCTL_DESCR("Use workqueue for packet processing"),
3488 NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE,
3489 CTL_EOL) != 0)
3490 aprint_error_dev(dev, "could not create sysctl\n");
3491
3492 #ifdef IXGBE_DEBUG
3493 /* testing sysctls (for all devices) */
3494 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3495 CTLTYPE_INT, "power_state", SYSCTL_DESCR("PCI Power State"),
3496 ixgbe_sysctl_power_state, 0, (void *)adapter, 0, CTL_CREATE,
3497 CTL_EOL) != 0)
3498 aprint_error_dev(dev, "could not create sysctl\n");
3499
3500 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READONLY,
3501 CTLTYPE_STRING, "print_rss_config",
3502 SYSCTL_DESCR("Prints RSS Configuration"),
3503 ixgbe_sysctl_print_rss_config, 0, (void *)adapter, 0, CTL_CREATE,
3504 CTL_EOL) != 0)
3505 aprint_error_dev(dev, "could not create sysctl\n");
3506 #endif
3507 /* for X550 series devices */
3508 if (hw->mac.type >= ixgbe_mac_X550)
3509 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3510 CTLTYPE_INT, "dmac", SYSCTL_DESCR("DMA Coalesce"),
3511 ixgbe_sysctl_dmac, 0, (void *)adapter, 0, CTL_CREATE,
3512 CTL_EOL) != 0)
3513 aprint_error_dev(dev, "could not create sysctl\n");
3514
3515 /* for WoL-capable devices */
3516 if (adapter->wol_support) {
3517 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3518 CTLTYPE_BOOL, "wol_enable",
3519 SYSCTL_DESCR("Enable/Disable Wake on LAN"),
3520 ixgbe_sysctl_wol_enable, 0, (void *)adapter, 0, CTL_CREATE,
3521 CTL_EOL) != 0)
3522 aprint_error_dev(dev, "could not create sysctl\n");
3523
3524 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3525 CTLTYPE_INT, "wufc",
3526 SYSCTL_DESCR("Enable/Disable Wake Up Filters"),
3527 ixgbe_sysctl_wufc, 0, (void *)adapter, 0, CTL_CREATE,
3528 CTL_EOL) != 0)
3529 aprint_error_dev(dev, "could not create sysctl\n");
3530 }
3531
3532 /* for X552/X557-AT devices */
3533 if ((hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) ||
3534 (hw->device_id == IXGBE_DEV_ID_X550EM_A_10G_T)) {
3535 const struct sysctlnode *phy_node;
3536
3537 if (sysctl_createv(log, 0, &rnode, &phy_node, 0, CTLTYPE_NODE,
3538 "phy", SYSCTL_DESCR("External PHY sysctls"),
3539 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) {
3540 aprint_error_dev(dev, "could not create sysctl\n");
3541 return;
3542 }
3543
3544 if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3545 CTLTYPE_INT, "temp",
3546 SYSCTL_DESCR("Current External PHY Temperature (Celsius)"),
3547 ixgbe_sysctl_phy_temp, 0, (void *)adapter, 0, CTL_CREATE,
3548 CTL_EOL) != 0)
3549 aprint_error_dev(dev, "could not create sysctl\n");
3550
3551 if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3552 CTLTYPE_INT, "overtemp_occurred",
3553 SYSCTL_DESCR(
3554 "External PHY High Temperature Event Occurred"),
3555 ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
3556 CTL_CREATE, CTL_EOL) != 0)
3557 aprint_error_dev(dev, "could not create sysctl\n");
3558 }
3559
3560 if ((hw->mac.type == ixgbe_mac_X550EM_a)
3561 && (hw->phy.type == ixgbe_phy_fw))
3562 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3563 CTLTYPE_BOOL, "force_10_100_autonego",
3564 SYSCTL_DESCR("Force autonego on 10M and 100M"),
3565 NULL, 0, &hw->phy.force_10_100_autonego, 0,
3566 CTL_CREATE, CTL_EOL) != 0)
3567 aprint_error_dev(dev, "could not create sysctl\n");
3568
3569 if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
3570 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3571 CTLTYPE_INT, "eee_state",
3572 SYSCTL_DESCR("EEE Power Save State"),
3573 ixgbe_sysctl_eee_state, 0, (void *)adapter, 0, CTL_CREATE,
3574 CTL_EOL) != 0)
3575 aprint_error_dev(dev, "could not create sysctl\n");
3576 }
3577 } /* ixgbe_add_device_sysctls */
3578
3579 /************************************************************************
3580 * ixgbe_allocate_pci_resources
3581 ************************************************************************/
3582 static int
3583 ixgbe_allocate_pci_resources(struct adapter *adapter,
3584 const struct pci_attach_args *pa)
3585 {
3586 pcireg_t memtype, csr;
3587 device_t dev = adapter->dev;
3588 bus_addr_t addr;
3589 int flags;
3590
3591 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
3592 switch (memtype) {
3593 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
3594 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
3595 adapter->osdep.mem_bus_space_tag = pa->pa_memt;
3596 if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
3597 memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
3598 goto map_err;
3599 if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
3600 aprint_normal_dev(dev, "clearing prefetchable bit\n");
3601 flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
3602 }
3603 if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
3604 adapter->osdep.mem_size, flags,
3605 &adapter->osdep.mem_bus_space_handle) != 0) {
3606 map_err:
3607 adapter->osdep.mem_size = 0;
3608 aprint_error_dev(dev, "unable to map BAR0\n");
3609 return ENXIO;
3610 }
3611 /*
3612 * Enable address decoding for memory range in case BIOS or
3613 * UEFI don't set it.
3614 */
3615 csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
3616 PCI_COMMAND_STATUS_REG);
3617 csr |= PCI_COMMAND_MEM_ENABLE;
3618 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
3619 csr);
3620 break;
3621 default:
3622 aprint_error_dev(dev, "unexpected type on BAR0\n");
3623 return ENXIO;
3624 }
3625
3626 return (0);
3627 } /* ixgbe_allocate_pci_resources */
3628
3629 static void
3630 ixgbe_free_deferred_handlers(struct adapter *adapter)
3631 {
3632 struct ix_queue *que = adapter->queues;
3633 struct tx_ring *txr = adapter->tx_rings;
3634 int i;
3635
3636 for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
3637 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
3638 if (txr->txr_si != NULL)
3639 softint_disestablish(txr->txr_si);
3640 }
3641 if (que->que_si != NULL)
3642 softint_disestablish(que->que_si);
3643 }
3644 if (adapter->txr_wq != NULL)
3645 workqueue_destroy(adapter->txr_wq);
3646 if (adapter->txr_wq_enqueued != NULL)
3647 percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
3648 if (adapter->que_wq != NULL)
3649 workqueue_destroy(adapter->que_wq);
3650
3651 if (adapter->admin_wq != NULL) {
3652 workqueue_destroy(adapter->admin_wq);
3653 adapter->admin_wq = NULL;
3654 }
3655 if (adapter->timer_wq != NULL) {
3656 workqueue_destroy(adapter->timer_wq);
3657 adapter->timer_wq = NULL;
3658 }
3659 if (adapter->recovery_mode_timer_wq != NULL) {
3660 /*
3661 * ixgbe_ifstop() doesn't call the workqueue_wait() for
3662 * the recovery_mode_timer workqueue, so call it here.
3663 */
3664 workqueue_wait(adapter->recovery_mode_timer_wq,
3665 &adapter->recovery_mode_timer_wc);
3666 atomic_store_relaxed(&adapter->recovery_mode_timer_pending, 0);
3667 workqueue_destroy(adapter->recovery_mode_timer_wq);
3668 adapter->recovery_mode_timer_wq = NULL;
3669 }
3670 } /* ixgbe_free_deferred_handlers */
3671
3672 /************************************************************************
3673 * ixgbe_detach - Device removal routine
3674 *
3675 * Called when the driver is being removed.
3676 * Stops the adapter and deallocates all the resources
3677 * that were allocated for driver operation.
3678 *
3679 * return 0 on success, positive on failure
3680 ************************************************************************/
3681 static int
3682 ixgbe_detach(device_t dev, int flags)
3683 {
3684 struct adapter *adapter = device_private(dev);
3685 struct rx_ring *rxr = adapter->rx_rings;
3686 struct tx_ring *txr = adapter->tx_rings;
3687 struct ixgbe_hw *hw = &adapter->hw;
3688 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
3689 u32 ctrl_ext;
3690 int i;
3691
3692 INIT_DEBUGOUT("ixgbe_detach: begin");
3693 if (adapter->osdep.attached == false)
3694 return 0;
3695
3696 if (ixgbe_pci_iov_detach(dev) != 0) {
3697 device_printf(dev, "SR-IOV in use; detach first.\n");
3698 return (EBUSY);
3699 }
3700
3701 if (VLAN_ATTACHED(&adapter->osdep.ec) &&
3702 (flags & (DETACH_SHUTDOWN | DETACH_FORCE)) == 0) {
3703 aprint_error_dev(dev, "VLANs in use, detach first\n");
3704 return (EBUSY);
3705 }
3706
3707 ether_ifdetach(adapter->ifp);
3708
3709 adapter->osdep.detaching = true;
3710 /*
3711 * Stop the interface. ixgbe_setup_low_power_mode() calls
3712 * ixgbe_ifstop(), so it's not required to call ixgbe_ifstop()
3713 * directly.
3714 */
3715 ixgbe_setup_low_power_mode(adapter);
3716
3717 callout_halt(&adapter->timer, NULL);
3718 if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
3719 callout_halt(&adapter->recovery_mode_timer, NULL);
3720
3721 workqueue_wait(adapter->admin_wq, &adapter->admin_wc);
3722 atomic_store_relaxed(&adapter->admin_pending, 0);
3723 workqueue_wait(adapter->timer_wq, &adapter->timer_wc);
3724 atomic_store_relaxed(&adapter->timer_pending, 0);
3725
3726 pmf_device_deregister(dev);
3727
3728 ixgbe_free_deferred_handlers(adapter);
3729
3730 /* let hardware know driver is unloading */
3731 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
3732 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
3733 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
3734
3735 if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
3736 netmap_detach(adapter->ifp);
3737
3738 ixgbe_free_pci_resources(adapter);
3739 #if 0 /* XXX the NetBSD port is probably missing something here */
3740 bus_generic_detach(dev);
3741 #endif
3742 if_detach(adapter->ifp);
3743 ifmedia_fini(&adapter->media);
3744 if_percpuq_destroy(adapter->ipq);
3745
3746 sysctl_teardown(&adapter->sysctllog);
3747 evcnt_detach(&adapter->efbig_tx_dma_setup);
3748 evcnt_detach(&adapter->mbuf_defrag_failed);
3749 evcnt_detach(&adapter->efbig2_tx_dma_setup);
3750 evcnt_detach(&adapter->einval_tx_dma_setup);
3751 evcnt_detach(&adapter->other_tx_dma_setup);
3752 evcnt_detach(&adapter->eagain_tx_dma_setup);
3753 evcnt_detach(&adapter->enomem_tx_dma_setup);
3754 evcnt_detach(&adapter->watchdog_events);
3755 evcnt_detach(&adapter->tso_err);
3756 evcnt_detach(&adapter->admin_irqev);
3757 evcnt_detach(&adapter->link_workev);
3758 evcnt_detach(&adapter->mod_workev);
3759 evcnt_detach(&adapter->msf_workev);
3760 evcnt_detach(&adapter->phy_workev);
3761
3762 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
3763 if (i < __arraycount(stats->mpc)) {
3764 evcnt_detach(&stats->mpc[i]);
3765 if (hw->mac.type == ixgbe_mac_82598EB)
3766 evcnt_detach(&stats->rnbc[i]);
3767 }
3768 if (i < __arraycount(stats->pxontxc)) {
3769 evcnt_detach(&stats->pxontxc[i]);
3770 evcnt_detach(&stats->pxonrxc[i]);
3771 evcnt_detach(&stats->pxofftxc[i]);
3772 evcnt_detach(&stats->pxoffrxc[i]);
3773 if (hw->mac.type >= ixgbe_mac_82599EB)
3774 evcnt_detach(&stats->pxon2offc[i]);
3775 }
3776 }
3777
3778 txr = adapter->tx_rings;
3779 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
3780 evcnt_detach(&adapter->queues[i].irqs);
3781 evcnt_detach(&adapter->queues[i].handleq);
3782 evcnt_detach(&adapter->queues[i].req);
3783 evcnt_detach(&txr->total_packets);
3784 #ifndef IXGBE_LEGACY_TX
3785 evcnt_detach(&txr->pcq_drops);
3786 #endif
3787 evcnt_detach(&txr->no_desc_avail);
3788 evcnt_detach(&txr->tso_tx);
3789
3790 if (i < __arraycount(stats->qprc)) {
3791 evcnt_detach(&stats->qprc[i]);
3792 evcnt_detach(&stats->qptc[i]);
3793 evcnt_detach(&stats->qbrc[i]);
3794 evcnt_detach(&stats->qbtc[i]);
3795 if (hw->mac.type >= ixgbe_mac_82599EB)
3796 evcnt_detach(&stats->qprdc[i]);
3797 }
3798
3799 evcnt_detach(&rxr->rx_packets);
3800 evcnt_detach(&rxr->rx_bytes);
3801 evcnt_detach(&rxr->rx_copies);
3802 evcnt_detach(&rxr->no_mbuf);
3803 evcnt_detach(&rxr->rx_discarded);
3804 }
3805 evcnt_detach(&stats->ipcs);
3806 evcnt_detach(&stats->l4cs);
3807 evcnt_detach(&stats->ipcs_bad);
3808 evcnt_detach(&stats->l4cs_bad);
3809 evcnt_detach(&stats->intzero);
3810 evcnt_detach(&stats->legint);
3811 evcnt_detach(&stats->crcerrs);
3812 evcnt_detach(&stats->illerrc);
3813 evcnt_detach(&stats->errbc);
3814 evcnt_detach(&stats->mspdc);
3815 if (hw->mac.type >= ixgbe_mac_X550)
3816 evcnt_detach(&stats->mbsdc);
3817 evcnt_detach(&stats->mpctotal);
3818 evcnt_detach(&stats->mlfc);
3819 evcnt_detach(&stats->mrfc);
3820 if (hw->mac.type == ixgbe_mac_X550EM_a)
3821 evcnt_detach(&stats->link_dn_cnt);
3822 evcnt_detach(&stats->rlec);
3823 evcnt_detach(&stats->lxontxc);
3824 evcnt_detach(&stats->lxonrxc);
3825 evcnt_detach(&stats->lxofftxc);
3826 evcnt_detach(&stats->lxoffrxc);
3827
3828 /* Packet Reception Stats */
3829 evcnt_detach(&stats->tor);
3830 evcnt_detach(&stats->gorc);
3831 evcnt_detach(&stats->tpr);
3832 evcnt_detach(&stats->gprc);
3833 evcnt_detach(&stats->mprc);
3834 evcnt_detach(&stats->bprc);
3835 evcnt_detach(&stats->prc64);
3836 evcnt_detach(&stats->prc127);
3837 evcnt_detach(&stats->prc255);
3838 evcnt_detach(&stats->prc511);
3839 evcnt_detach(&stats->prc1023);
3840 evcnt_detach(&stats->prc1522);
3841 evcnt_detach(&stats->ruc);
3842 evcnt_detach(&stats->rfc);
3843 evcnt_detach(&stats->roc);
3844 evcnt_detach(&stats->rjc);
3845 evcnt_detach(&stats->mngprc);
3846 evcnt_detach(&stats->mngpdc);
3847 evcnt_detach(&stats->xec);
3848
3849 /* Packet Transmission Stats */
3850 evcnt_detach(&stats->gotc);
3851 evcnt_detach(&stats->tpt);
3852 evcnt_detach(&stats->gptc);
3853 evcnt_detach(&stats->bptc);
3854 evcnt_detach(&stats->mptc);
3855 evcnt_detach(&stats->mngptc);
3856 evcnt_detach(&stats->ptc64);
3857 evcnt_detach(&stats->ptc127);
3858 evcnt_detach(&stats->ptc255);
3859 evcnt_detach(&stats->ptc511);
3860 evcnt_detach(&stats->ptc1023);
3861 evcnt_detach(&stats->ptc1522);
3862
3863 ixgbe_free_queues(adapter);
3864 free(adapter->mta, M_DEVBUF);
3865
3866 mutex_destroy(&adapter->admin_mtx); /* XXX appropriate order? */
3867 IXGBE_CORE_LOCK_DESTROY(adapter);
3868
3869 return (0);
3870 } /* ixgbe_detach */
3871
3872 /************************************************************************
3873 * ixgbe_setup_low_power_mode - LPLU/WoL preparation
3874 *
3875 * Prepare the adapter/port for LPLU and/or WoL
3876 ************************************************************************/
3877 static int
3878 ixgbe_setup_low_power_mode(struct adapter *adapter)
3879 {
3880 struct ixgbe_hw *hw = &adapter->hw;
3881 device_t dev = adapter->dev;
3882 struct ifnet *ifp = adapter->ifp;
3883 s32 error = 0;
3884
3885 /* Limit power management flow to X550EM baseT */
3886 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
3887 hw->phy.ops.enter_lplu) {
3888 /* X550EM baseT adapters need a special LPLU flow */
3889 hw->phy.reset_disable = true;
3890 ixgbe_ifstop(ifp, 1);
3891 error = hw->phy.ops.enter_lplu(hw);
3892 if (error)
3893 device_printf(dev,
3894 "Error entering LPLU: %d\n", error);
3895 hw->phy.reset_disable = false;
3896 } else {
3897 /* Just stop for other adapters */
3898 ixgbe_ifstop(ifp, 1);
3899 }
3900
3901 IXGBE_CORE_LOCK(adapter);
3902
3903 if (!hw->wol_enabled) {
3904 ixgbe_set_phy_power(hw, FALSE);
3905 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3906 IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
3907 } else {
3908 /* Turn off support for APM wakeup. (Using ACPI instead) */
3909 IXGBE_WRITE_REG(hw, IXGBE_GRC_BY_MAC(hw),
3910 IXGBE_READ_REG(hw, IXGBE_GRC_BY_MAC(hw)) & ~(u32)2);
3911
3912 /*
3913 * Clear Wake Up Status register to prevent any previous wakeup
3914 * events from waking us up immediately after we suspend.
3915 */
3916 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3917
3918 /*
3919 * Program the Wakeup Filter Control register with user filter
3920 * settings
3921 */
3922 IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
3923
3924 /* Enable wakeups and power management in Wakeup Control */
3925 IXGBE_WRITE_REG(hw, IXGBE_WUC,
3926 IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
3927 }
3928
3929 IXGBE_CORE_UNLOCK(adapter);
3930
3931 return error;
3932 } /* ixgbe_setup_low_power_mode */
3933
3934 /************************************************************************
3935 * ixgbe_shutdown - Shutdown entry point
3936 ************************************************************************/
3937 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
3938 static int
3939 ixgbe_shutdown(device_t dev)
3940 {
3941 struct adapter *adapter = device_private(dev);
3942 int error = 0;
3943
3944 INIT_DEBUGOUT("ixgbe_shutdown: begin");
3945
3946 error = ixgbe_setup_low_power_mode(adapter);
3947
3948 return (error);
3949 } /* ixgbe_shutdown */
3950 #endif
3951
3952 /************************************************************************
3953 * ixgbe_suspend
3954 *
3955 * From D0 to D3
3956 ************************************************************************/
3957 static bool
3958 ixgbe_suspend(device_t dev, const pmf_qual_t *qual)
3959 {
3960 struct adapter *adapter = device_private(dev);
3961 int error = 0;
3962
3963 INIT_DEBUGOUT("ixgbe_suspend: begin");
3964
3965 error = ixgbe_setup_low_power_mode(adapter);
3966
3967 return (error);
3968 } /* ixgbe_suspend */
3969
3970 /************************************************************************
3971 * ixgbe_resume
3972 *
3973 * From D3 to D0
3974 ************************************************************************/
3975 static bool
3976 ixgbe_resume(device_t dev, const pmf_qual_t *qual)
3977 {
3978 struct adapter *adapter = device_private(dev);
3979 struct ifnet *ifp = adapter->ifp;
3980 struct ixgbe_hw *hw = &adapter->hw;
3981 u32 wus;
3982
3983 INIT_DEBUGOUT("ixgbe_resume: begin");
3984
3985 IXGBE_CORE_LOCK(adapter);
3986
3987 /* Read & clear WUS register */
3988 wus = IXGBE_READ_REG(hw, IXGBE_WUS);
3989 if (wus)
3990 device_printf(dev, "Woken up by (WUS): %#010x\n",
3991 IXGBE_READ_REG(hw, IXGBE_WUS));
3992 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3993 /* And clear WUFC until next low-power transition */
3994 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3995
3996 /*
3997 * Required after D3->D0 transition;
3998 * will re-advertise all previous advertised speeds
3999 */
4000 if (ifp->if_flags & IFF_UP)
4001 ixgbe_init_locked(adapter);
4002
4003 IXGBE_CORE_UNLOCK(adapter);
4004
4005 return true;
4006 } /* ixgbe_resume */
4007
4008 /*
4009 * Set the various hardware offload abilities.
4010 *
4011 * This takes the ifnet's if_capenable flags (e.g. set by the user using
4012 * ifconfig) and indicates to the OS via the ifnet's if_hwassist field what
4013 * mbuf offload flags the driver will understand.
4014 */
4015 static void
4016 ixgbe_set_if_hwassist(struct adapter *adapter)
4017 {
4018 /* XXX */
4019 }
4020
4021 /************************************************************************
4022 * ixgbe_init_locked - Init entry point
4023 *
4024 * Used in two ways: It is used by the stack as an init
4025 * entry point in network interface structure. It is also
4026 * used by the driver as a hw/sw initialization routine to
4027 * get to a consistent state.
4028 *
4029 * return 0 on success, positive on failure
4030 ************************************************************************/
4031 static void
4032 ixgbe_init_locked(struct adapter *adapter)
4033 {
4034 struct ifnet *ifp = adapter->ifp;
4035 device_t dev = adapter->dev;
4036 struct ixgbe_hw *hw = &adapter->hw;
4037 struct ix_queue *que;
4038 struct tx_ring *txr;
4039 struct rx_ring *rxr;
4040 u32 txdctl, mhadd;
4041 u32 rxdctl, rxctrl;
4042 u32 ctrl_ext;
4043 bool unsupported_sfp = false;
4044 int i, j, error;
4045
4046 /* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
4047
4048 KASSERT(mutex_owned(&adapter->core_mtx));
4049 INIT_DEBUGOUT("ixgbe_init_locked: begin");
4050
4051 hw->need_unsupported_sfp_recovery = false;
4052 hw->adapter_stopped = FALSE;
4053 ixgbe_stop_adapter(hw);
4054 callout_stop(&adapter->timer);
4055 if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
4056 callout_stop(&adapter->recovery_mode_timer);
4057 for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
4058 que->disabled_count = 0;
4059
4060 /* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
4061 adapter->max_frame_size =
4062 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
4063
4064 /* Queue indices may change with IOV mode */
4065 ixgbe_align_all_queue_indices(adapter);
4066
4067 /* reprogram the RAR[0] in case user changed it. */
4068 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
4069
4070 /* Get the latest mac address, User can use a LAA */
4071 memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
4072 IXGBE_ETH_LENGTH_OF_ADDRESS);
4073 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
4074 hw->addr_ctrl.rar_used_count = 1;
4075
4076 /* Set hardware offload abilities from ifnet flags */
4077 ixgbe_set_if_hwassist(adapter);
4078
4079 /* Prepare transmit descriptors and buffers */
4080 if (ixgbe_setup_transmit_structures(adapter)) {
4081 device_printf(dev, "Could not setup transmit structures\n");
4082 ixgbe_stop_locked(adapter);
4083 return;
4084 }
4085
4086 ixgbe_init_hw(hw);
4087
4088 ixgbe_initialize_iov(adapter);
4089
4090 ixgbe_initialize_transmit_units(adapter);
4091
4092 /* Setup Multicast table */
4093 ixgbe_set_rxfilter(adapter);
4094
4095 /* Use fixed buffer size, even for jumbo frames */
4096 adapter->rx_mbuf_sz = MCLBYTES;
4097
4098 /* Prepare receive descriptors and buffers */
4099 error = ixgbe_setup_receive_structures(adapter);
4100 if (error) {
4101 device_printf(dev,
4102 "Could not setup receive structures (err = %d)\n", error);
4103 ixgbe_stop_locked(adapter);
4104 return;
4105 }
4106
4107 /* Configure RX settings */
4108 ixgbe_initialize_receive_units(adapter);
4109
4110 /* Initialize variable holding task enqueue requests interrupts */
4111 adapter->task_requests = 0;
4112
4113 /* Enable SDP & MSI-X interrupts based on adapter */
4114 ixgbe_config_gpie(adapter);
4115
4116 /* Set MTU size */
4117 if (ifp->if_mtu > ETHERMTU) {
4118 /* aka IXGBE_MAXFRS on 82599 and newer */
4119 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
4120 mhadd &= ~IXGBE_MHADD_MFS_MASK;
4121 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
4122 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
4123 }
4124
4125 /* Now enable all the queues */
4126 for (i = 0; i < adapter->num_queues; i++) {
4127 txr = &adapter->tx_rings[i];
4128 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
4129 txdctl |= IXGBE_TXDCTL_ENABLE;
4130 /* Set WTHRESH to 8, burst writeback */
4131 txdctl |= IXGBE_TX_WTHRESH << IXGBE_TXDCTL_WTHRESH_SHIFT;
4132 /*
4133 * When the internal queue falls below PTHRESH (32),
4134 * start prefetching as long as there are at least
4135 * HTHRESH (1) buffers ready. The values are taken
4136 * from the Intel linux driver 3.8.21.
4137 * Prefetching enables tx line rate even with 1 queue.
4138 */
4139 txdctl |= (32 << 0) | (1 << 8);
4140 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
4141 }
4142
4143 for (i = 0; i < adapter->num_queues; i++) {
4144 rxr = &adapter->rx_rings[i];
4145 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
4146 if (hw->mac.type == ixgbe_mac_82598EB) {
4147 /*
4148 * PTHRESH = 21
4149 * HTHRESH = 4
4150 * WTHRESH = 8
4151 */
4152 rxdctl &= ~0x3FFFFF;
4153 rxdctl |= 0x080420;
4154 }
4155 rxdctl |= IXGBE_RXDCTL_ENABLE;
4156 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
4157 for (j = 0; j < 10; j++) {
4158 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
4159 IXGBE_RXDCTL_ENABLE)
4160 break;
4161 else
4162 msec_delay(1);
4163 }
4164 IXGBE_WRITE_BARRIER(hw);
4165
4166 /*
4167 * In netmap mode, we must preserve the buffers made
4168 * available to userspace before the if_init()
4169 * (this is true by default on the TX side, because
4170 * init makes all buffers available to userspace).
4171 *
4172 * netmap_reset() and the device specific routines
4173 * (e.g. ixgbe_setup_receive_rings()) map these
4174 * buffers at the end of the NIC ring, so here we
4175 * must set the RDT (tail) register to make sure
4176 * they are not overwritten.
4177 *
4178 * In this driver the NIC ring starts at RDH = 0,
4179 * RDT points to the last slot available for reception (?),
4180 * so RDT = num_rx_desc - 1 means the whole ring is available.
4181 */
4182 #ifdef DEV_NETMAP
4183 if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
4184 (ifp->if_capenable & IFCAP_NETMAP)) {
4185 struct netmap_adapter *na = NA(adapter->ifp);
4186 struct netmap_kring *kring = na->rx_rings[i];
4187 int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
4188
4189 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
4190 } else
4191 #endif /* DEV_NETMAP */
4192 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me),
4193 adapter->num_rx_desc - 1);
4194 }
4195
4196 /* Enable Receive engine */
4197 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
4198 if (hw->mac.type == ixgbe_mac_82598EB)
4199 rxctrl |= IXGBE_RXCTRL_DMBYPS;
4200 rxctrl |= IXGBE_RXCTRL_RXEN;
4201 ixgbe_enable_rx_dma(hw, rxctrl);
4202
4203 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4204 atomic_store_relaxed(&adapter->timer_pending, 0);
4205 if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
4206 callout_reset(&adapter->recovery_mode_timer, hz,
4207 ixgbe_recovery_mode_timer, adapter);
4208
4209 /* Set up MSI/MSI-X routing */
4210 if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4211 ixgbe_configure_ivars(adapter);
4212 /* Set up auto-mask */
4213 if (hw->mac.type == ixgbe_mac_82598EB)
4214 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4215 else {
4216 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
4217 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
4218 }
4219 } else { /* Simple settings for Legacy/MSI */
4220 ixgbe_set_ivar(adapter, 0, 0, 0);
4221 ixgbe_set_ivar(adapter, 0, 0, 1);
4222 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4223 }
4224
4225 ixgbe_init_fdir(adapter);
4226
4227 /*
4228 * Check on any SFP devices that
4229 * need to be kick-started
4230 */
4231 if (hw->phy.type == ixgbe_phy_none) {
4232 error = hw->phy.ops.identify(hw);
4233 if (error == IXGBE_ERR_SFP_NOT_SUPPORTED)
4234 unsupported_sfp = true;
4235 } else if (hw->phy.type == ixgbe_phy_sfp_unsupported)
4236 unsupported_sfp = true;
4237
4238 if (unsupported_sfp)
4239 device_printf(dev,
4240 "Unsupported SFP+ module type was detected.\n");
4241
4242 /* Set moderation on the Link interrupt */
4243 ixgbe_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
4244
4245 /* Enable EEE power saving */
4246 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
4247 hw->mac.ops.setup_eee(hw,
4248 adapter->feat_en & IXGBE_FEATURE_EEE);
4249
4250 /* Enable power to the phy. */
4251 if (!unsupported_sfp) {
4252 ixgbe_set_phy_power(hw, TRUE);
4253
4254 /* Config/Enable Link */
4255 ixgbe_config_link(adapter);
4256 }
4257
4258 /* Hardware Packet Buffer & Flow Control setup */
4259 ixgbe_config_delay_values(adapter);
4260
4261 /* Initialize the FC settings */
4262 ixgbe_start_hw(hw);
4263
4264 /* Set up VLAN support and filter */
4265 ixgbe_setup_vlan_hw_support(adapter);
4266
4267 /* Setup DMA Coalescing */
4268 ixgbe_config_dmac(adapter);
4269
4270 /* OK to schedule workqueues. */
4271 adapter->schedule_wqs_ok = true;
4272
4273 /* And now turn on interrupts */
4274 ixgbe_enable_intr(adapter);
4275
4276 /* Enable the use of the MBX by the VF's */
4277 if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
4278 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
4279 ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
4280 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
4281 }
4282
4283 /* Update saved flags. See ixgbe_ifflags_cb() */
4284 adapter->if_flags = ifp->if_flags;
4285 adapter->ec_capenable = adapter->osdep.ec.ec_capenable;
4286
4287 /* Now inform the stack we're ready */
4288 ifp->if_flags |= IFF_RUNNING;
4289
4290 return;
4291 } /* ixgbe_init_locked */
4292
4293 /************************************************************************
4294 * ixgbe_init
4295 ************************************************************************/
4296 static int
4297 ixgbe_init(struct ifnet *ifp)
4298 {
4299 struct adapter *adapter = ifp->if_softc;
4300
4301 IXGBE_CORE_LOCK(adapter);
4302 ixgbe_init_locked(adapter);
4303 IXGBE_CORE_UNLOCK(adapter);
4304
4305 return 0; /* XXX ixgbe_init_locked cannot fail? really? */
4306 } /* ixgbe_init */
4307
4308 /************************************************************************
4309 * ixgbe_set_ivar
4310 *
4311 * Setup the correct IVAR register for a particular MSI-X interrupt
4312 * (yes this is all very magic and confusing :)
4313 * - entry is the register array entry
4314 * - vector is the MSI-X vector for this queue
4315 * - type is RX/TX/MISC
4316 ************************************************************************/
4317 static void
4318 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
4319 {
4320 struct ixgbe_hw *hw = &adapter->hw;
4321 u32 ivar, index;
4322
4323 vector |= IXGBE_IVAR_ALLOC_VAL;
4324
4325 switch (hw->mac.type) {
4326 case ixgbe_mac_82598EB:
4327 if (type == -1)
4328 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
4329 else
4330 entry += (type * 64);
4331 index = (entry >> 2) & 0x1F;
4332 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4333 ivar &= ~(0xffUL << (8 * (entry & 0x3)));
4334 ivar |= ((u32)vector << (8 * (entry & 0x3)));
4335 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
4336 break;
4337 case ixgbe_mac_82599EB:
4338 case ixgbe_mac_X540:
4339 case ixgbe_mac_X550:
4340 case ixgbe_mac_X550EM_x:
4341 case ixgbe_mac_X550EM_a:
4342 if (type == -1) { /* MISC IVAR */
4343 index = (entry & 1) * 8;
4344 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4345 ivar &= ~(0xffUL << index);
4346 ivar |= ((u32)vector << index);
4347 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4348 } else { /* RX/TX IVARS */
4349 index = (16 * (entry & 1)) + (8 * type);
4350 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
4351 ivar &= ~(0xffUL << index);
4352 ivar |= ((u32)vector << index);
4353 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
4354 }
4355 break;
4356 default:
4357 break;
4358 }
4359 } /* ixgbe_set_ivar */
4360
4361 /************************************************************************
4362 * ixgbe_configure_ivars
4363 ************************************************************************/
4364 static void
4365 ixgbe_configure_ivars(struct adapter *adapter)
4366 {
4367 struct ix_queue *que = adapter->queues;
4368 u32 newitr;
4369
4370 if (ixgbe_max_interrupt_rate > 0)
4371 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
4372 else {
4373 /*
4374 * Disable DMA coalescing if interrupt moderation is
4375 * disabled.
4376 */
4377 adapter->dmac = 0;
4378 newitr = 0;
4379 }
4380
4381 for (int i = 0; i < adapter->num_queues; i++, que++) {
4382 struct rx_ring *rxr = &adapter->rx_rings[i];
4383 struct tx_ring *txr = &adapter->tx_rings[i];
4384 /* First the RX queue entry */
4385 ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
4386 /* ... and the TX */
4387 ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
4388 /* Set an Initial EITR value */
4389 ixgbe_eitr_write(adapter, que->msix, newitr);
4390 /*
4391 * To eliminate influence of the previous state.
4392 * At this point, Tx/Rx interrupt handler
4393 * (ixgbe_msix_que()) cannot be called, so both
4394 * IXGBE_TX_LOCK and IXGBE_RX_LOCK are not required.
4395 */
4396 que->eitr_setting = 0;
4397 }
4398
4399 /* For the Link interrupt */
4400 ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
4401 } /* ixgbe_configure_ivars */
4402
4403 /************************************************************************
4404 * ixgbe_config_gpie
4405 ************************************************************************/
4406 static void
4407 ixgbe_config_gpie(struct adapter *adapter)
4408 {
4409 struct ixgbe_hw *hw = &adapter->hw;
4410 u32 gpie;
4411
4412 gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
4413
4414 if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4415 /* Enable Enhanced MSI-X mode */
4416 gpie |= IXGBE_GPIE_MSIX_MODE
4417 | IXGBE_GPIE_EIAME
4418 | IXGBE_GPIE_PBA_SUPPORT
4419 | IXGBE_GPIE_OCD;
4420 }
4421
4422 /* Fan Failure Interrupt */
4423 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
4424 gpie |= IXGBE_SDP1_GPIEN;
4425
4426 /* Thermal Sensor Interrupt */
4427 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
4428 gpie |= IXGBE_SDP0_GPIEN_X540;
4429
4430 /* Link detection */
4431 switch (hw->mac.type) {
4432 case ixgbe_mac_82599EB:
4433 gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
4434 break;
4435 case ixgbe_mac_X550EM_x:
4436 case ixgbe_mac_X550EM_a:
4437 gpie |= IXGBE_SDP0_GPIEN_X540;
4438 break;
4439 default:
4440 break;
4441 }
4442
4443 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
4444
4445 } /* ixgbe_config_gpie */
4446
4447 /************************************************************************
4448 * ixgbe_config_delay_values
4449 *
4450 * Requires adapter->max_frame_size to be set.
4451 ************************************************************************/
4452 static void
4453 ixgbe_config_delay_values(struct adapter *adapter)
4454 {
4455 struct ixgbe_hw *hw = &adapter->hw;
4456 u32 rxpb, frame, size, tmp;
4457
4458 frame = adapter->max_frame_size;
4459
4460 /* Calculate High Water */
4461 switch (hw->mac.type) {
4462 case ixgbe_mac_X540:
4463 case ixgbe_mac_X550:
4464 case ixgbe_mac_X550EM_x:
4465 case ixgbe_mac_X550EM_a:
4466 tmp = IXGBE_DV_X540(frame, frame);
4467 break;
4468 default:
4469 tmp = IXGBE_DV(frame, frame);
4470 break;
4471 }
4472 size = IXGBE_BT2KB(tmp);
4473 rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
4474 hw->fc.high_water[0] = rxpb - size;
4475
4476 /* Now calculate Low Water */
4477 switch (hw->mac.type) {
4478 case ixgbe_mac_X540:
4479 case ixgbe_mac_X550:
4480 case ixgbe_mac_X550EM_x:
4481 case ixgbe_mac_X550EM_a:
4482 tmp = IXGBE_LOW_DV_X540(frame);
4483 break;
4484 default:
4485 tmp = IXGBE_LOW_DV(frame);
4486 break;
4487 }
4488 hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
4489
4490 hw->fc.pause_time = IXGBE_FC_PAUSE;
4491 hw->fc.send_xon = TRUE;
4492 } /* ixgbe_config_delay_values */
4493
4494 /************************************************************************
4495 * ixgbe_set_rxfilter - Multicast Update
4496 *
4497 * Called whenever multicast address list is updated.
4498 ************************************************************************/
4499 static void
4500 ixgbe_set_rxfilter(struct adapter *adapter)
4501 {
4502 struct ixgbe_mc_addr *mta;
4503 struct ifnet *ifp = adapter->ifp;
4504 u8 *update_ptr;
4505 int mcnt = 0;
4506 u32 fctrl;
4507 struct ethercom *ec = &adapter->osdep.ec;
4508 struct ether_multi *enm;
4509 struct ether_multistep step;
4510
4511 KASSERT(mutex_owned(&adapter->core_mtx));
4512 IOCTL_DEBUGOUT("ixgbe_set_rxfilter: begin");
4513
4514 mta = adapter->mta;
4515 bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
4516
4517 ETHER_LOCK(ec);
4518 ec->ec_flags &= ~ETHER_F_ALLMULTI;
4519 ETHER_FIRST_MULTI(step, ec, enm);
4520 while (enm != NULL) {
4521 if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
4522 (memcmp(enm->enm_addrlo, enm->enm_addrhi,
4523 ETHER_ADDR_LEN) != 0)) {
4524 ec->ec_flags |= ETHER_F_ALLMULTI;
4525 break;
4526 }
4527 bcopy(enm->enm_addrlo,
4528 mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
4529 mta[mcnt].vmdq = adapter->pool;
4530 mcnt++;
4531 ETHER_NEXT_MULTI(step, enm);
4532 }
4533
4534 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
4535 if (ifp->if_flags & IFF_PROMISC)
4536 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4537 else if (ec->ec_flags & ETHER_F_ALLMULTI) {
4538 fctrl |= IXGBE_FCTRL_MPE;
4539 fctrl &= ~IXGBE_FCTRL_UPE;
4540 } else
4541 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4542
4543 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
4544
4545 /* Update multicast filter entries only when it's not ALLMULTI */
4546 if ((ec->ec_flags & ETHER_F_ALLMULTI) == 0) {
4547 ETHER_UNLOCK(ec);
4548 update_ptr = (u8 *)mta;
4549 ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
4550 ixgbe_mc_array_itr, TRUE);
4551 } else
4552 ETHER_UNLOCK(ec);
4553 } /* ixgbe_set_rxfilter */
4554
4555 /************************************************************************
4556 * ixgbe_mc_array_itr
4557 *
4558 * An iterator function needed by the multicast shared code.
4559 * It feeds the shared code routine the addresses in the
4560 * array of ixgbe_set_rxfilter() one by one.
4561 ************************************************************************/
4562 static u8 *
4563 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
4564 {
4565 struct ixgbe_mc_addr *mta;
4566
4567 mta = (struct ixgbe_mc_addr *)*update_ptr;
4568 *vmdq = mta->vmdq;
4569
4570 *update_ptr = (u8*)(mta + 1);
4571
4572 return (mta->addr);
4573 } /* ixgbe_mc_array_itr */
4574
4575 /************************************************************************
4576 * ixgbe_local_timer - Timer routine
4577 *
4578 * Checks for link status, updates statistics,
4579 * and runs the watchdog check.
4580 ************************************************************************/
4581 static void
4582 ixgbe_local_timer(void *arg)
4583 {
4584 struct adapter *adapter = arg;
4585
4586 if (adapter->schedule_wqs_ok) {
4587 if (atomic_cas_uint(&adapter->timer_pending, 0, 1) == 0)
4588 workqueue_enqueue(adapter->timer_wq,
4589 &adapter->timer_wc, NULL);
4590 }
4591 }
4592
4593 static void
4594 ixgbe_handle_timer(struct work *wk, void *context)
4595 {
4596 struct adapter *adapter = context;
4597 struct ixgbe_hw *hw = &adapter->hw;
4598 device_t dev = adapter->dev;
4599 struct ix_queue *que = adapter->queues;
4600 u64 queues = 0;
4601 u64 v0, v1, v2, v3, v4, v5, v6, v7;
4602 int hung = 0;
4603 int i;
4604
4605 IXGBE_CORE_LOCK(adapter);
4606
4607 /* Check for pluggable optics */
4608 if (ixgbe_is_sfp(hw)) {
4609 bool sched_mod_task = false;
4610
4611 if (hw->mac.type == ixgbe_mac_82598EB) {
4612 /*
4613 * On 82598EB, SFP+'s MOD_ABS pin is not connected to
4614 * any GPIO(SDP). So just schedule TASK_MOD.
4615 */
4616 sched_mod_task = true;
4617 } else {
4618 bool was_full, is_full;
4619
4620 was_full =
4621 hw->phy.sfp_type != ixgbe_sfp_type_not_present;
4622 is_full = ixgbe_sfp_cage_full(hw);
4623
4624 /* Do probe if cage state changed */
4625 if (was_full ^ is_full)
4626 sched_mod_task = true;
4627 }
4628 if (sched_mod_task) {
4629 mutex_enter(&adapter->admin_mtx);
4630 adapter->task_requests |= IXGBE_REQUEST_TASK_MOD_WOI;
4631 ixgbe_schedule_admin_tasklet(adapter);
4632 mutex_exit(&adapter->admin_mtx);
4633 }
4634 }
4635
4636 ixgbe_update_link_status(adapter);
4637 ixgbe_update_stats_counters(adapter);
4638
4639 /* Update some event counters */
4640 v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
4641 que = adapter->queues;
4642 for (i = 0; i < adapter->num_queues; i++, que++) {
4643 struct tx_ring *txr = que->txr;
4644
4645 v0 += txr->q_efbig_tx_dma_setup;
4646 v1 += txr->q_mbuf_defrag_failed;
4647 v2 += txr->q_efbig2_tx_dma_setup;
4648 v3 += txr->q_einval_tx_dma_setup;
4649 v4 += txr->q_other_tx_dma_setup;
4650 v5 += txr->q_eagain_tx_dma_setup;
4651 v6 += txr->q_enomem_tx_dma_setup;
4652 v7 += txr->q_tso_err;
4653 }
4654 IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, v0);
4655 IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, v1);
4656 IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, v2);
4657 IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, v3);
4658 IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, v4);
4659 IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, v5);
4660 IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, v6);
4661 IXGBE_EVC_STORE(&adapter->tso_err, v7);
4662
4663 /*
4664 * Check the TX queues status
4665 * - mark hung queues so we don't schedule on them
4666 * - watchdog only if all queues show hung
4667 */
4668 que = adapter->queues;
4669 for (i = 0; i < adapter->num_queues; i++, que++) {
4670 /* Keep track of queues with work for soft irq */
4671 if (que->txr->busy)
4672 queues |= 1ULL << que->me;
4673 /*
4674 * Each time txeof runs without cleaning, but there
4675 * are uncleaned descriptors it increments busy. If
4676 * we get to the MAX we declare it hung.
4677 */
4678 if (que->busy == IXGBE_QUEUE_HUNG) {
4679 ++hung;
4680 /* Mark the queue as inactive */
4681 adapter->active_queues &= ~(1ULL << que->me);
4682 continue;
4683 } else {
4684 /* Check if we've come back from hung */
4685 if ((adapter->active_queues & (1ULL << que->me)) == 0)
4686 adapter->active_queues |= 1ULL << que->me;
4687 }
4688 if (que->busy >= IXGBE_MAX_TX_BUSY) {
4689 device_printf(dev,
4690 "Warning queue %d appears to be hung!\n", i);
4691 que->txr->busy = IXGBE_QUEUE_HUNG;
4692 ++hung;
4693 }
4694 }
4695
4696 /* Only truly watchdog if all queues show hung */
4697 if (hung == adapter->num_queues)
4698 goto watchdog;
4699 #if 0 /* XXX Avoid unexpectedly disabling interrupt forever (PR#53294) */
4700 else if (queues != 0) { /* Force an IRQ on queues with work */
4701 que = adapter->queues;
4702 for (i = 0; i < adapter->num_queues; i++, que++) {
4703 mutex_enter(&que->dc_mtx);
4704 if (que->disabled_count == 0)
4705 ixgbe_rearm_queues(adapter,
4706 queues & ((u64)1 << i));
4707 mutex_exit(&que->dc_mtx);
4708 }
4709 }
4710 #endif
4711
4712 atomic_store_relaxed(&adapter->timer_pending, 0);
4713 IXGBE_CORE_UNLOCK(adapter);
4714 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4715 return;
4716
4717 watchdog:
4718 device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
4719 adapter->ifp->if_flags &= ~IFF_RUNNING;
4720 IXGBE_EVC_ADD(&adapter->watchdog_events, 1);
4721 ixgbe_init_locked(adapter);
4722 IXGBE_CORE_UNLOCK(adapter);
4723 } /* ixgbe_handle_timer */
4724
4725 /************************************************************************
4726 * ixgbe_recovery_mode_timer - Recovery mode timer routine
4727 ************************************************************************/
4728 static void
4729 ixgbe_recovery_mode_timer(void *arg)
4730 {
4731 struct adapter *adapter = arg;
4732
4733 if (__predict_true(adapter->osdep.detaching == false)) {
4734 if (atomic_cas_uint(&adapter->recovery_mode_timer_pending,
4735 0, 1) == 0) {
4736 workqueue_enqueue(adapter->recovery_mode_timer_wq,
4737 &adapter->recovery_mode_timer_wc, NULL);
4738 }
4739 }
4740 }
4741
4742 static void
4743 ixgbe_handle_recovery_mode_timer(struct work *wk, void *context)
4744 {
4745 struct adapter *adapter = context;
4746 struct ixgbe_hw *hw = &adapter->hw;
4747
4748 IXGBE_CORE_LOCK(adapter);
4749 if (ixgbe_fw_recovery_mode(hw)) {
4750 if (atomic_cas_uint(&adapter->recovery_mode, 0, 1) == 0) {
4751 /* Firmware error detected, entering recovery mode */
4752 device_printf(adapter->dev,
4753 "Firmware recovery mode detected. Limiting "
4754 "functionality. Refer to the Intel(R) Ethernet "
4755 "Adapters and Devices User Guide for details on "
4756 "firmware recovery mode.\n");
4757
4758 if (hw->adapter_stopped == FALSE)
4759 ixgbe_stop_locked(adapter);
4760 }
4761 } else
4762 atomic_cas_uint(&adapter->recovery_mode, 1, 0);
4763
4764 atomic_store_relaxed(&adapter->recovery_mode_timer_pending, 0);
4765 callout_reset(&adapter->recovery_mode_timer, hz,
4766 ixgbe_recovery_mode_timer, adapter);
4767 IXGBE_CORE_UNLOCK(adapter);
4768 } /* ixgbe_handle_recovery_mode_timer */
4769
4770 /************************************************************************
4771 * ixgbe_handle_mod - Tasklet for SFP module interrupts
4772 * bool int_en: true if it's called when the interrupt is enabled.
4773 ************************************************************************/
4774 static void
4775 ixgbe_handle_mod(void *context, bool int_en)
4776 {
4777 struct adapter *adapter = context;
4778 struct ixgbe_hw *hw = &adapter->hw;
4779 device_t dev = adapter->dev;
4780 enum ixgbe_sfp_type last_sfp_type;
4781 u32 err;
4782 bool last_unsupported_sfp_recovery;
4783
4784 KASSERT(mutex_owned(&adapter->core_mtx));
4785
4786 last_sfp_type = hw->phy.sfp_type;
4787 last_unsupported_sfp_recovery = hw->need_unsupported_sfp_recovery;
4788 IXGBE_EVC_ADD(&adapter->mod_workev, 1);
4789 if (adapter->hw.need_crosstalk_fix) {
4790 if ((hw->mac.type != ixgbe_mac_82598EB) &&
4791 !ixgbe_sfp_cage_full(hw))
4792 goto out;
4793 }
4794
4795 err = hw->phy.ops.identify_sfp(hw);
4796 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4797 if (last_unsupported_sfp_recovery == false)
4798 device_printf(dev,
4799 "Unsupported SFP+ module type was detected.\n");
4800 goto out;
4801 }
4802
4803 if (hw->need_unsupported_sfp_recovery) {
4804 device_printf(dev, "Recovering from unsupported SFP\n");
4805 /*
4806 * We could recover the status by calling setup_sfp(),
4807 * setup_link() and some others. It's complex and might not
4808 * work correctly on some unknown cases. To avoid such type of
4809 * problem, call ixgbe_init_locked(). It's simple and safe
4810 * approach.
4811 */
4812 ixgbe_init_locked(adapter);
4813 } else if ((hw->phy.sfp_type != ixgbe_sfp_type_not_present) &&
4814 (hw->phy.sfp_type != last_sfp_type)) {
4815 /* A module is inserted and changed. */
4816
4817 if (hw->mac.type == ixgbe_mac_82598EB)
4818 err = hw->phy.ops.reset(hw);
4819 else {
4820 err = hw->mac.ops.setup_sfp(hw);
4821 hw->phy.sfp_setup_needed = FALSE;
4822 }
4823 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4824 device_printf(dev,
4825 "Setup failure - unsupported SFP+ module type.\n");
4826 goto out;
4827 }
4828 }
4829
4830 out:
4831 /* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
4832 adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
4833
4834 /* Adjust media types shown in ifconfig */
4835 IXGBE_CORE_UNLOCK(adapter);
4836 ifmedia_removeall(&adapter->media);
4837 ixgbe_add_media_types(adapter);
4838 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
4839 IXGBE_CORE_LOCK(adapter);
4840
4841 /*
4842 * Don't schedule MSF event if the chip is 82598. 82598 doesn't support
4843 * MSF. At least, calling ixgbe_handle_msf on 82598 DA makes the link
4844 * flap because the function calls setup_link().
4845 */
4846 if (hw->mac.type != ixgbe_mac_82598EB) {
4847 mutex_enter(&adapter->admin_mtx);
4848 if (int_en)
4849 adapter->task_requests |= IXGBE_REQUEST_TASK_MSF;
4850 else
4851 adapter->task_requests |= IXGBE_REQUEST_TASK_MSF_WOI;
4852 mutex_exit(&adapter->admin_mtx);
4853 }
4854
4855 /*
4856 * Don't call ixgbe_schedule_admin_tasklet() because we are on
4857 * the workqueue now.
4858 */
4859 } /* ixgbe_handle_mod */
4860
4861
4862 /************************************************************************
4863 * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
4864 ************************************************************************/
4865 static void
4866 ixgbe_handle_msf(void *context)
4867 {
4868 struct adapter *adapter = context;
4869 struct ixgbe_hw *hw = &adapter->hw;
4870 u32 autoneg;
4871 bool negotiate;
4872
4873 KASSERT(mutex_owned(&adapter->core_mtx));
4874
4875 IXGBE_EVC_ADD(&adapter->msf_workev, 1);
4876
4877 autoneg = hw->phy.autoneg_advertised;
4878 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
4879 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
4880 if (hw->mac.ops.setup_link)
4881 hw->mac.ops.setup_link(hw, autoneg, TRUE);
4882 } /* ixgbe_handle_msf */
4883
4884 /************************************************************************
4885 * ixgbe_handle_phy - Tasklet for external PHY interrupts
4886 ************************************************************************/
4887 static void
4888 ixgbe_handle_phy(void *context)
4889 {
4890 struct adapter *adapter = context;
4891 struct ixgbe_hw *hw = &adapter->hw;
4892 int error;
4893
4894 KASSERT(mutex_owned(&adapter->core_mtx));
4895
4896 IXGBE_EVC_ADD(&adapter->phy_workev, 1);
4897 error = hw->phy.ops.handle_lasi(hw);
4898 if (error == IXGBE_ERR_OVERTEMP)
4899 device_printf(adapter->dev,
4900 "CRITICAL: EXTERNAL PHY OVER TEMP!! "
4901 " PHY will downshift to lower power state!\n");
4902 else if (error)
4903 device_printf(adapter->dev,
4904 "Error handling LASI interrupt: %d\n", error);
4905 } /* ixgbe_handle_phy */
4906
4907 static void
4908 ixgbe_handle_admin(struct work *wk, void *context)
4909 {
4910 struct adapter *adapter = context;
4911 struct ifnet *ifp = adapter->ifp;
4912 struct ixgbe_hw *hw = &adapter->hw;
4913 u32 task_requests;
4914 u32 eims_enable = 0;
4915
4916 mutex_enter(&adapter->admin_mtx);
4917 adapter->admin_pending = 0;
4918 task_requests = adapter->task_requests;
4919 adapter->task_requests = 0;
4920 mutex_exit(&adapter->admin_mtx);
4921
4922 /*
4923 * Hold the IFNET_LOCK across this entire call. This will
4924 * prevent additional changes to adapter->phy_layer
4925 * and serialize calls to this tasklet. We cannot hold the
4926 * CORE_LOCK while calling into the ifmedia functions as
4927 * they call ifmedia_lock() and the lock is CORE_LOCK.
4928 */
4929 IFNET_LOCK(ifp);
4930 IXGBE_CORE_LOCK(adapter);
4931 if ((task_requests & IXGBE_REQUEST_TASK_LSC) != 0) {
4932 ixgbe_handle_link(adapter);
4933 eims_enable |= IXGBE_EIMS_LSC;
4934 }
4935 if ((task_requests & IXGBE_REQUEST_TASK_MOD_WOI) != 0)
4936 ixgbe_handle_mod(adapter, false);
4937 if ((task_requests & IXGBE_REQUEST_TASK_MOD) != 0) {
4938 ixgbe_handle_mod(adapter, true);
4939 if (hw->mac.type >= ixgbe_mac_X540)
4940 eims_enable |= IXGBE_EICR_GPI_SDP0_X540;
4941 else
4942 eims_enable |= IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
4943 }
4944 if ((task_requests
4945 & (IXGBE_REQUEST_TASK_MSF_WOI | IXGBE_REQUEST_TASK_MSF)) != 0) {
4946 ixgbe_handle_msf(adapter);
4947 if (((task_requests & IXGBE_REQUEST_TASK_MSF) != 0) &&
4948 (hw->mac.type == ixgbe_mac_82599EB))
4949 eims_enable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
4950 }
4951 if ((task_requests & IXGBE_REQUEST_TASK_PHY) != 0) {
4952 ixgbe_handle_phy(adapter);
4953 eims_enable |= IXGBE_EICR_GPI_SDP0_X540;
4954 }
4955 if ((task_requests & IXGBE_REQUEST_TASK_FDIR) != 0) {
4956 ixgbe_reinit_fdir(adapter);
4957 eims_enable |= IXGBE_EIMS_FLOW_DIR;
4958 }
4959 #if 0 /* notyet */
4960 if ((task_requests & IXGBE_REQUEST_TASK_MBX) != 0) {
4961 ixgbe_handle_mbx(adapter);
4962 eims_enable |= IXGBE_EIMS_MAILBOX;
4963 }
4964 #endif
4965 IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_enable);
4966
4967 IXGBE_CORE_UNLOCK(adapter);
4968 IFNET_UNLOCK(ifp);
4969 } /* ixgbe_handle_admin */
4970
4971 static void
4972 ixgbe_ifstop(struct ifnet *ifp, int disable)
4973 {
4974 struct adapter *adapter = ifp->if_softc;
4975
4976 IXGBE_CORE_LOCK(adapter);
4977 ixgbe_stop_locked(adapter);
4978 IXGBE_CORE_UNLOCK(adapter);
4979
4980 workqueue_wait(adapter->timer_wq, &adapter->timer_wc);
4981 atomic_store_relaxed(&adapter->timer_pending, 0);
4982 }
4983
4984 /************************************************************************
4985 * ixgbe_stop_locked - Stop the hardware
4986 *
4987 * Disables all traffic on the adapter by issuing a
4988 * global reset on the MAC and deallocates TX/RX buffers.
4989 ************************************************************************/
4990 static void
4991 ixgbe_stop_locked(void *arg)
4992 {
4993 struct ifnet *ifp;
4994 struct adapter *adapter = arg;
4995 struct ixgbe_hw *hw = &adapter->hw;
4996
4997 ifp = adapter->ifp;
4998
4999 KASSERT(mutex_owned(&adapter->core_mtx));
5000
5001 INIT_DEBUGOUT("ixgbe_stop_locked: begin\n");
5002 ixgbe_disable_intr(adapter);
5003 callout_stop(&adapter->timer);
5004
5005 /* Don't schedule workqueues. */
5006 adapter->schedule_wqs_ok = false;
5007
5008 /* Let the stack know...*/
5009 ifp->if_flags &= ~IFF_RUNNING;
5010
5011 ixgbe_reset_hw(hw);
5012 hw->adapter_stopped = FALSE;
5013 ixgbe_stop_adapter(hw);
5014 if (hw->mac.type == ixgbe_mac_82599EB)
5015 ixgbe_stop_mac_link_on_d3_82599(hw);
5016 /* Turn off the laser - noop with no optics */
5017 ixgbe_disable_tx_laser(hw);
5018
5019 /* Update the stack */
5020 adapter->link_up = FALSE;
5021 ixgbe_update_link_status(adapter);
5022
5023 /* reprogram the RAR[0] in case user changed it. */
5024 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
5025
5026 return;
5027 } /* ixgbe_stop_locked */
5028
5029 /************************************************************************
5030 * ixgbe_update_link_status - Update OS on link state
5031 *
5032 * Note: Only updates the OS on the cached link state.
5033 * The real check of the hardware only happens with
5034 * a link interrupt.
5035 ************************************************************************/
5036 static void
5037 ixgbe_update_link_status(struct adapter *adapter)
5038 {
5039 struct ifnet *ifp = adapter->ifp;
5040 device_t dev = adapter->dev;
5041 struct ixgbe_hw *hw = &adapter->hw;
5042
5043 KASSERT(mutex_owned(&adapter->core_mtx));
5044
5045 if (adapter->link_up) {
5046 if (adapter->link_active != LINK_STATE_UP) {
5047 /*
5048 * To eliminate influence of the previous state
5049 * in the same way as ixgbe_init_locked().
5050 */
5051 struct ix_queue *que = adapter->queues;
5052 for (int i = 0; i < adapter->num_queues; i++, que++)
5053 que->eitr_setting = 0;
5054
5055 if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL){
5056 /*
5057 * Discard count for both MAC Local Fault and
5058 * Remote Fault because those registers are
5059 * valid only when the link speed is up and
5060 * 10Gbps.
5061 */
5062 IXGBE_READ_REG(hw, IXGBE_MLFC);
5063 IXGBE_READ_REG(hw, IXGBE_MRFC);
5064 }
5065
5066 if (bootverbose) {
5067 const char *bpsmsg;
5068
5069 switch (adapter->link_speed) {
5070 case IXGBE_LINK_SPEED_10GB_FULL:
5071 bpsmsg = "10 Gbps";
5072 break;
5073 case IXGBE_LINK_SPEED_5GB_FULL:
5074 bpsmsg = "5 Gbps";
5075 break;
5076 case IXGBE_LINK_SPEED_2_5GB_FULL:
5077 bpsmsg = "2.5 Gbps";
5078 break;
5079 case IXGBE_LINK_SPEED_1GB_FULL:
5080 bpsmsg = "1 Gbps";
5081 break;
5082 case IXGBE_LINK_SPEED_100_FULL:
5083 bpsmsg = "100 Mbps";
5084 break;
5085 case IXGBE_LINK_SPEED_10_FULL:
5086 bpsmsg = "10 Mbps";
5087 break;
5088 default:
5089 bpsmsg = "unknown speed";
5090 break;
5091 }
5092 device_printf(dev, "Link is up %s %s \n",
5093 bpsmsg, "Full Duplex");
5094 }
5095 adapter->link_active = LINK_STATE_UP;
5096 /* Update any Flow Control changes */
5097 ixgbe_fc_enable(&adapter->hw);
5098 /* Update DMA coalescing config */
5099 ixgbe_config_dmac(adapter);
5100 if_link_state_change(ifp, LINK_STATE_UP);
5101
5102 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5103 ixgbe_ping_all_vfs(adapter);
5104 }
5105 } else {
5106 /*
5107 * Do it when link active changes to DOWN. i.e.
5108 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
5109 * b) LINK_STATE_UP -> LINK_STATE_DOWN
5110 */
5111 if (adapter->link_active != LINK_STATE_DOWN) {
5112 if (bootverbose)
5113 device_printf(dev, "Link is Down\n");
5114 if_link_state_change(ifp, LINK_STATE_DOWN);
5115 adapter->link_active = LINK_STATE_DOWN;
5116 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5117 ixgbe_ping_all_vfs(adapter);
5118 ixgbe_drain_all(adapter);
5119 }
5120 }
5121 } /* ixgbe_update_link_status */
5122
5123 /************************************************************************
5124 * ixgbe_config_dmac - Configure DMA Coalescing
5125 ************************************************************************/
5126 static void
5127 ixgbe_config_dmac(struct adapter *adapter)
5128 {
5129 struct ixgbe_hw *hw = &adapter->hw;
5130 struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
5131
5132 if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
5133 return;
5134
5135 if (dcfg->watchdog_timer ^ adapter->dmac ||
5136 dcfg->link_speed ^ adapter->link_speed) {
5137 dcfg->watchdog_timer = adapter->dmac;
5138 dcfg->fcoe_en = false;
5139 dcfg->link_speed = adapter->link_speed;
5140 dcfg->num_tcs = 1;
5141
5142 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
5143 dcfg->watchdog_timer, dcfg->link_speed);
5144
5145 hw->mac.ops.dmac_config(hw);
5146 }
5147 } /* ixgbe_config_dmac */
5148
5149 /************************************************************************
5150 * ixgbe_enable_intr
5151 ************************************************************************/
5152 static void
5153 ixgbe_enable_intr(struct adapter *adapter)
5154 {
5155 struct ixgbe_hw *hw = &adapter->hw;
5156 struct ix_queue *que = adapter->queues;
5157 u32 mask, fwsm;
5158
5159 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
5160
5161 switch (adapter->hw.mac.type) {
5162 case ixgbe_mac_82599EB:
5163 mask |= IXGBE_EIMS_ECC;
5164 /* Temperature sensor on some adapters */
5165 mask |= IXGBE_EIMS_GPI_SDP0;
5166 /* SFP+ (RX_LOS_N & MOD_ABS_N) */
5167 mask |= IXGBE_EIMS_GPI_SDP1;
5168 mask |= IXGBE_EIMS_GPI_SDP2;
5169 break;
5170 case ixgbe_mac_X540:
5171 /* Detect if Thermal Sensor is enabled */
5172 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
5173 if (fwsm & IXGBE_FWSM_TS_ENABLED)
5174 mask |= IXGBE_EIMS_TS;
5175 mask |= IXGBE_EIMS_ECC;
5176 break;
5177 case ixgbe_mac_X550:
5178 /* MAC thermal sensor is automatically enabled */
5179 mask |= IXGBE_EIMS_TS;
5180 mask |= IXGBE_EIMS_ECC;
5181 break;
5182 case ixgbe_mac_X550EM_x:
5183 case ixgbe_mac_X550EM_a:
5184 /* Some devices use SDP0 for important information */
5185 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
5186 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
5187 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
5188 hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
5189 mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
5190 if (hw->phy.type == ixgbe_phy_x550em_ext_t)
5191 mask |= IXGBE_EICR_GPI_SDP0_X540;
5192 mask |= IXGBE_EIMS_ECC;
5193 break;
5194 default:
5195 break;
5196 }
5197
5198 /* Enable Fan Failure detection */
5199 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
5200 mask |= IXGBE_EIMS_GPI_SDP1;
5201 /* Enable SR-IOV */
5202 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5203 mask |= IXGBE_EIMS_MAILBOX;
5204 /* Enable Flow Director */
5205 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
5206 mask |= IXGBE_EIMS_FLOW_DIR;
5207
5208 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
5209
5210 /* With MSI-X we use auto clear */
5211 if ((adapter->feat_en & IXGBE_FEATURE_MSIX) != 0) {
5212 /*
5213 * We use auto clear for RTX_QUEUE only. Don't use other
5214 * interrupts (e.g. link interrupt). BTW, we don't use
5215 * TCP_TIMER interrupt itself.
5216 */
5217 IXGBE_WRITE_REG(hw, IXGBE_EIAC, IXGBE_EIMS_RTX_QUEUE);
5218 }
5219
5220 /*
5221 * Now enable all queues, this is done separately to
5222 * allow for handling the extended (beyond 32) MSI-X
5223 * vectors that can be used by 82599
5224 */
5225 for (int i = 0; i < adapter->num_queues; i++, que++)
5226 ixgbe_enable_queue(adapter, que->msix);
5227
5228 IXGBE_WRITE_FLUSH(hw);
5229
5230 } /* ixgbe_enable_intr */
5231
5232 /************************************************************************
5233 * ixgbe_disable_intr_internal
5234 ************************************************************************/
5235 static void
5236 ixgbe_disable_intr_internal(struct adapter *adapter, bool nestok)
5237 {
5238 struct ix_queue *que = adapter->queues;
5239
5240 /* disable interrupts other than queues */
5241 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~IXGBE_EIMC_RTX_QUEUE);
5242
5243 if ((adapter->feat_en & IXGBE_FEATURE_MSIX) != 0)
5244 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
5245
5246 for (int i = 0; i < adapter->num_queues; i++, que++)
5247 ixgbe_disable_queue_internal(adapter, que->msix, nestok);
5248
5249 IXGBE_WRITE_FLUSH(&adapter->hw);
5250
5251 } /* ixgbe_do_disable_intr_internal */
5252
5253 /************************************************************************
5254 * ixgbe_disable_intr
5255 ************************************************************************/
5256 static void
5257 ixgbe_disable_intr(struct adapter *adapter)
5258 {
5259
5260 ixgbe_disable_intr_internal(adapter, true);
5261 } /* ixgbe_disable_intr */
5262
5263 /************************************************************************
5264 * ixgbe_ensure_disabled_intr
5265 ************************************************************************/
5266 void
5267 ixgbe_ensure_disabled_intr(struct adapter *adapter)
5268 {
5269
5270 ixgbe_disable_intr_internal(adapter, false);
5271 } /* ixgbe_ensure_disabled_intr */
5272
5273 /************************************************************************
5274 * ixgbe_legacy_irq - Legacy Interrupt Service routine
5275 ************************************************************************/
5276 static int
5277 ixgbe_legacy_irq(void *arg)
5278 {
5279 struct ix_queue *que = arg;
5280 struct adapter *adapter = que->adapter;
5281 struct ixgbe_hw *hw = &adapter->hw;
5282 struct ifnet *ifp = adapter->ifp;
5283 struct tx_ring *txr = adapter->tx_rings;
5284 u32 eicr;
5285 u32 eims_orig;
5286 u32 eims_enable = 0;
5287 u32 eims_disable = 0;
5288
5289 eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
5290 /*
5291 * Silicon errata #26 on 82598. Disable all interrupts before reading
5292 * EICR.
5293 */
5294 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
5295
5296 /* Read and clear EICR */
5297 eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
5298
5299 if (eicr == 0) {
5300 IXGBE_EVC_ADD(&adapter->stats.pf.intzero, 1);
5301 IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig);
5302 return 0;
5303 }
5304 IXGBE_EVC_ADD(&adapter->stats.pf.legint, 1);
5305
5306 /* Queue (0) intr */
5307 if (((ifp->if_flags & IFF_RUNNING) != 0) &&
5308 (eicr & IXGBE_EIMC_RTX_QUEUE) != 0) {
5309 IXGBE_EVC_ADD(&que->irqs, 1);
5310
5311 /*
5312 * The same as ixgbe_msix_que() about
5313 * "que->txrx_use_workqueue".
5314 */
5315 que->txrx_use_workqueue = adapter->txrx_use_workqueue;
5316
5317 IXGBE_TX_LOCK(txr);
5318 ixgbe_txeof(txr);
5319 #ifdef notyet
5320 if (!ixgbe_ring_empty(ifp, txr->br))
5321 ixgbe_start_locked(ifp, txr);
5322 #endif
5323 IXGBE_TX_UNLOCK(txr);
5324
5325 IXGBE_EVC_ADD(&que->req, 1);
5326 ixgbe_sched_handle_que(adapter, que);
5327 /* Disable queue 0 interrupt */
5328 eims_disable |= 1UL << 0;
5329 } else
5330 eims_enable |= eims_orig & IXGBE_EIMC_RTX_QUEUE;
5331
5332 ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
5333
5334 /* Re-enable some interrupts */
5335 IXGBE_WRITE_REG(hw, IXGBE_EIMS,
5336 (eims_orig & ~eims_disable) | eims_enable);
5337
5338 return 1;
5339 } /* ixgbe_legacy_irq */
5340
5341 /************************************************************************
5342 * ixgbe_free_pciintr_resources
5343 ************************************************************************/
5344 static void
5345 ixgbe_free_pciintr_resources(struct adapter *adapter)
5346 {
5347 struct ix_queue *que = adapter->queues;
5348 int rid;
5349
5350 /*
5351 * Release all msix queue resources:
5352 */
5353 for (int i = 0; i < adapter->num_queues; i++, que++) {
5354 if (que->res != NULL) {
5355 pci_intr_disestablish(adapter->osdep.pc,
5356 adapter->osdep.ihs[i]);
5357 adapter->osdep.ihs[i] = NULL;
5358 }
5359 }
5360
5361 /* Clean the Legacy or Link interrupt last */
5362 if (adapter->vector) /* we are doing MSIX */
5363 rid = adapter->vector;
5364 else
5365 rid = 0;
5366
5367 if (adapter->osdep.ihs[rid] != NULL) {
5368 pci_intr_disestablish(adapter->osdep.pc,
5369 adapter->osdep.ihs[rid]);
5370 adapter->osdep.ihs[rid] = NULL;
5371 }
5372
5373 if (adapter->osdep.intrs != NULL) {
5374 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
5375 adapter->osdep.nintrs);
5376 adapter->osdep.intrs = NULL;
5377 }
5378 } /* ixgbe_free_pciintr_resources */
5379
5380 /************************************************************************
5381 * ixgbe_free_pci_resources
5382 ************************************************************************/
5383 static void
5384 ixgbe_free_pci_resources(struct adapter *adapter)
5385 {
5386
5387 ixgbe_free_pciintr_resources(adapter);
5388
5389 if (adapter->osdep.mem_size != 0) {
5390 bus_space_unmap(adapter->osdep.mem_bus_space_tag,
5391 adapter->osdep.mem_bus_space_handle,
5392 adapter->osdep.mem_size);
5393 }
5394 } /* ixgbe_free_pci_resources */
5395
5396 /************************************************************************
5397 * ixgbe_sysctl_flowcntl
5398 *
5399 * SYSCTL wrapper around setting Flow Control
5400 ************************************************************************/
5401 static int
5402 ixgbe_sysctl_flowcntl(SYSCTLFN_ARGS)
5403 {
5404 struct sysctlnode node = *rnode;
5405 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5406 int error, fc;
5407
5408 if (ixgbe_fw_recovery_mode_swflag(adapter))
5409 return (EPERM);
5410
5411 fc = adapter->hw.fc.current_mode;
5412 node.sysctl_data = &fc;
5413 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5414 if (error != 0 || newp == NULL)
5415 return error;
5416
5417 /* Don't bother if it's not changed */
5418 if (fc == adapter->hw.fc.current_mode)
5419 return (0);
5420
5421 return ixgbe_set_flowcntl(adapter, fc);
5422 } /* ixgbe_sysctl_flowcntl */
5423
5424 /************************************************************************
5425 * ixgbe_set_flowcntl - Set flow control
5426 *
5427 * Flow control values:
5428 * 0 - off
5429 * 1 - rx pause
5430 * 2 - tx pause
5431 * 3 - full
5432 ************************************************************************/
5433 static int
5434 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
5435 {
5436 switch (fc) {
5437 case ixgbe_fc_rx_pause:
5438 case ixgbe_fc_tx_pause:
5439 case ixgbe_fc_full:
5440 adapter->hw.fc.requested_mode = fc;
5441 if (adapter->num_queues > 1)
5442 ixgbe_disable_rx_drop(adapter);
5443 break;
5444 case ixgbe_fc_none:
5445 adapter->hw.fc.requested_mode = ixgbe_fc_none;
5446 if (adapter->num_queues > 1)
5447 ixgbe_enable_rx_drop(adapter);
5448 break;
5449 default:
5450 return (EINVAL);
5451 }
5452
5453 #if 0 /* XXX NetBSD */
5454 /* Don't autoneg if forcing a value */
5455 adapter->hw.fc.disable_fc_autoneg = TRUE;
5456 #endif
5457 ixgbe_fc_enable(&adapter->hw);
5458
5459 return (0);
5460 } /* ixgbe_set_flowcntl */
5461
5462 /************************************************************************
5463 * ixgbe_enable_rx_drop
5464 *
5465 * Enable the hardware to drop packets when the buffer is
5466 * full. This is useful with multiqueue, so that no single
5467 * queue being full stalls the entire RX engine. We only
5468 * enable this when Multiqueue is enabled AND Flow Control
5469 * is disabled.
5470 ************************************************************************/
5471 static void
5472 ixgbe_enable_rx_drop(struct adapter *adapter)
5473 {
5474 struct ixgbe_hw *hw = &adapter->hw;
5475 struct rx_ring *rxr;
5476 u32 srrctl;
5477
5478 for (int i = 0; i < adapter->num_queues; i++) {
5479 rxr = &adapter->rx_rings[i];
5480 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5481 srrctl |= IXGBE_SRRCTL_DROP_EN;
5482 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5483 }
5484
5485 /* enable drop for each vf */
5486 for (int i = 0; i < adapter->num_vfs; i++) {
5487 IXGBE_WRITE_REG(hw, IXGBE_QDE,
5488 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
5489 IXGBE_QDE_ENABLE));
5490 }
5491 } /* ixgbe_enable_rx_drop */
5492
5493 /************************************************************************
5494 * ixgbe_disable_rx_drop
5495 ************************************************************************/
5496 static void
5497 ixgbe_disable_rx_drop(struct adapter *adapter)
5498 {
5499 struct ixgbe_hw *hw = &adapter->hw;
5500 struct rx_ring *rxr;
5501 u32 srrctl;
5502
5503 for (int i = 0; i < adapter->num_queues; i++) {
5504 rxr = &adapter->rx_rings[i];
5505 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5506 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
5507 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5508 }
5509
5510 /* disable drop for each vf */
5511 for (int i = 0; i < adapter->num_vfs; i++) {
5512 IXGBE_WRITE_REG(hw, IXGBE_QDE,
5513 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
5514 }
5515 } /* ixgbe_disable_rx_drop */
5516
5517 /************************************************************************
5518 * ixgbe_sysctl_advertise
5519 *
5520 * SYSCTL wrapper around setting advertised speed
5521 ************************************************************************/
5522 static int
5523 ixgbe_sysctl_advertise(SYSCTLFN_ARGS)
5524 {
5525 struct sysctlnode node = *rnode;
5526 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5527 int error = 0, advertise;
5528
5529 if (ixgbe_fw_recovery_mode_swflag(adapter))
5530 return (EPERM);
5531
5532 advertise = adapter->advertise;
5533 node.sysctl_data = &advertise;
5534 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5535 if (error != 0 || newp == NULL)
5536 return error;
5537
5538 return ixgbe_set_advertise(adapter, advertise);
5539 } /* ixgbe_sysctl_advertise */
5540
5541 /************************************************************************
5542 * ixgbe_set_advertise - Control advertised link speed
5543 *
5544 * Flags:
5545 * 0x00 - Default (all capable link speed)
5546 * 0x1 - advertise 100 Mb
5547 * 0x2 - advertise 1G
5548 * 0x4 - advertise 10G
5549 * 0x8 - advertise 10 Mb (yes, Mb)
5550 * 0x10 - advertise 2.5G
5551 * 0x20 - advertise 5G
5552 ************************************************************************/
5553 static int
5554 ixgbe_set_advertise(struct adapter *adapter, int advertise)
5555 {
5556 device_t dev;
5557 struct ixgbe_hw *hw;
5558 ixgbe_link_speed speed = 0;
5559 ixgbe_link_speed link_caps = 0;
5560 s32 err = IXGBE_NOT_IMPLEMENTED;
5561 bool negotiate = FALSE;
5562
5563 /* Checks to validate new value */
5564 if (adapter->advertise == advertise) /* no change */
5565 return (0);
5566
5567 dev = adapter->dev;
5568 hw = &adapter->hw;
5569
5570 /* No speed changes for backplane media */
5571 if (hw->phy.media_type == ixgbe_media_type_backplane)
5572 return (ENODEV);
5573
5574 if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
5575 (hw->phy.multispeed_fiber))) {
5576 device_printf(dev,
5577 "Advertised speed can only be set on copper or "
5578 "multispeed fiber media types.\n");
5579 return (EINVAL);
5580 }
5581
5582 if (advertise < 0x0 || advertise > 0x3f) {
5583 device_printf(dev, "Invalid advertised speed; "
5584 "valid modes are 0x0 through 0x3f\n");
5585 return (EINVAL);
5586 }
5587
5588 if (hw->mac.ops.get_link_capabilities) {
5589 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
5590 &negotiate);
5591 if (err != IXGBE_SUCCESS) {
5592 device_printf(dev, "Unable to determine supported "
5593 "advertise speeds\n");
5594 return (ENODEV);
5595 }
5596 }
5597
5598 /* Set new value and report new advertised mode */
5599 if (advertise & 0x1) {
5600 if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
5601 device_printf(dev, "Interface does not support 100Mb "
5602 "advertised speed\n");
5603 return (EINVAL);
5604 }
5605 speed |= IXGBE_LINK_SPEED_100_FULL;
5606 }
5607 if (advertise & 0x2) {
5608 if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
5609 device_printf(dev, "Interface does not support 1Gb "
5610 "advertised speed\n");
5611 return (EINVAL);
5612 }
5613 speed |= IXGBE_LINK_SPEED_1GB_FULL;
5614 }
5615 if (advertise & 0x4) {
5616 if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
5617 device_printf(dev, "Interface does not support 10Gb "
5618 "advertised speed\n");
5619 return (EINVAL);
5620 }
5621 speed |= IXGBE_LINK_SPEED_10GB_FULL;
5622 }
5623 if (advertise & 0x8) {
5624 if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
5625 device_printf(dev, "Interface does not support 10Mb "
5626 "advertised speed\n");
5627 return (EINVAL);
5628 }
5629 speed |= IXGBE_LINK_SPEED_10_FULL;
5630 }
5631 if (advertise & 0x10) {
5632 if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
5633 device_printf(dev, "Interface does not support 2.5Gb "
5634 "advertised speed\n");
5635 return (EINVAL);
5636 }
5637 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
5638 }
5639 if (advertise & 0x20) {
5640 if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
5641 device_printf(dev, "Interface does not support 5Gb "
5642 "advertised speed\n");
5643 return (EINVAL);
5644 }
5645 speed |= IXGBE_LINK_SPEED_5GB_FULL;
5646 }
5647 if (advertise == 0)
5648 speed = link_caps; /* All capable link speed */
5649
5650 hw->mac.autotry_restart = TRUE;
5651 hw->mac.ops.setup_link(hw, speed, TRUE);
5652 adapter->advertise = advertise;
5653
5654 return (0);
5655 } /* ixgbe_set_advertise */
5656
5657 /************************************************************************
5658 * ixgbe_get_default_advertise - Get default advertised speed settings
5659 *
5660 * Formatted for sysctl usage.
5661 * Flags:
5662 * 0x1 - advertise 100 Mb
5663 * 0x2 - advertise 1G
5664 * 0x4 - advertise 10G
5665 * 0x8 - advertise 10 Mb (yes, Mb)
5666 * 0x10 - advertise 2.5G
5667 * 0x20 - advertise 5G
5668 ************************************************************************/
5669 static int
5670 ixgbe_get_default_advertise(struct adapter *adapter)
5671 {
5672 struct ixgbe_hw *hw = &adapter->hw;
5673 int speed;
5674 ixgbe_link_speed link_caps = 0;
5675 s32 err;
5676 bool negotiate = FALSE;
5677
5678 /*
5679 * Advertised speed means nothing unless it's copper or
5680 * multi-speed fiber
5681 */
5682 if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
5683 !(hw->phy.multispeed_fiber))
5684 return (0);
5685
5686 err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
5687 if (err != IXGBE_SUCCESS)
5688 return (0);
5689
5690 speed =
5691 ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 0x4 : 0) |
5692 ((link_caps & IXGBE_LINK_SPEED_5GB_FULL) ? 0x20 : 0) |
5693 ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
5694 ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 0x2 : 0) |
5695 ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 0x1 : 0) |
5696 ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 0x8 : 0);
5697
5698 return speed;
5699 } /* ixgbe_get_default_advertise */
5700
5701 /************************************************************************
5702 * ixgbe_sysctl_dmac - Manage DMA Coalescing
5703 *
5704 * Control values:
5705 * 0/1 - off / on (use default value of 1000)
5706 *
5707 * Legal timer values are:
5708 * 50,100,250,500,1000,2000,5000,10000
5709 *
5710 * Turning off interrupt moderation will also turn this off.
5711 ************************************************************************/
5712 static int
5713 ixgbe_sysctl_dmac(SYSCTLFN_ARGS)
5714 {
5715 struct sysctlnode node = *rnode;
5716 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5717 struct ifnet *ifp = adapter->ifp;
5718 int error;
5719 int newval;
5720
5721 if (ixgbe_fw_recovery_mode_swflag(adapter))
5722 return (EPERM);
5723
5724 newval = adapter->dmac;
5725 node.sysctl_data = &newval;
5726 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5727 if ((error) || (newp == NULL))
5728 return (error);
5729
5730 switch (newval) {
5731 case 0:
5732 /* Disabled */
5733 adapter->dmac = 0;
5734 break;
5735 case 1:
5736 /* Enable and use default */
5737 adapter->dmac = 1000;
5738 break;
5739 case 50:
5740 case 100:
5741 case 250:
5742 case 500:
5743 case 1000:
5744 case 2000:
5745 case 5000:
5746 case 10000:
5747 /* Legal values - allow */
5748 adapter->dmac = newval;
5749 break;
5750 default:
5751 /* Do nothing, illegal value */
5752 return (EINVAL);
5753 }
5754
5755 /* Re-initialize hardware if it's already running */
5756 if (ifp->if_flags & IFF_RUNNING)
5757 if_init(ifp);
5758
5759 return (0);
5760 }
5761
5762 #ifdef IXGBE_DEBUG
5763 /************************************************************************
5764 * ixgbe_sysctl_power_state
5765 *
5766 * Sysctl to test power states
5767 * Values:
5768 * 0 - set device to D0
5769 * 3 - set device to D3
5770 * (none) - get current device power state
5771 ************************************************************************/
5772 static int
5773 ixgbe_sysctl_power_state(SYSCTLFN_ARGS)
5774 {
5775 #ifdef notyet
5776 struct sysctlnode node = *rnode;
5777 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5778 device_t dev = adapter->dev;
5779 int curr_ps, new_ps, error = 0;
5780
5781 if (ixgbe_fw_recovery_mode_swflag(adapter))
5782 return (EPERM);
5783
5784 curr_ps = new_ps = pci_get_powerstate(dev);
5785
5786 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5787 if ((error) || (req->newp == NULL))
5788 return (error);
5789
5790 if (new_ps == curr_ps)
5791 return (0);
5792
5793 if (new_ps == 3 && curr_ps == 0)
5794 error = DEVICE_SUSPEND(dev);
5795 else if (new_ps == 0 && curr_ps == 3)
5796 error = DEVICE_RESUME(dev);
5797 else
5798 return (EINVAL);
5799
5800 device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
5801
5802 return (error);
5803 #else
5804 return 0;
5805 #endif
5806 } /* ixgbe_sysctl_power_state */
5807 #endif
5808
5809 /************************************************************************
5810 * ixgbe_sysctl_wol_enable
5811 *
5812 * Sysctl to enable/disable the WoL capability,
5813 * if supported by the adapter.
5814 *
5815 * Values:
5816 * 0 - disabled
5817 * 1 - enabled
5818 ************************************************************************/
5819 static int
5820 ixgbe_sysctl_wol_enable(SYSCTLFN_ARGS)
5821 {
5822 struct sysctlnode node = *rnode;
5823 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5824 struct ixgbe_hw *hw = &adapter->hw;
5825 bool new_wol_enabled;
5826 int error = 0;
5827
5828 /*
5829 * It's not required to check recovery mode because this function never
5830 * touches hardware.
5831 */
5832 new_wol_enabled = hw->wol_enabled;
5833 node.sysctl_data = &new_wol_enabled;
5834 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5835 if ((error) || (newp == NULL))
5836 return (error);
5837 if (new_wol_enabled == hw->wol_enabled)
5838 return (0);
5839
5840 if (new_wol_enabled && !adapter->wol_support)
5841 return (ENODEV);
5842 else
5843 hw->wol_enabled = new_wol_enabled;
5844
5845 return (0);
5846 } /* ixgbe_sysctl_wol_enable */
5847
5848 /************************************************************************
5849 * ixgbe_sysctl_wufc - Wake Up Filter Control
5850 *
5851 * Sysctl to enable/disable the types of packets that the
5852 * adapter will wake up on upon receipt.
5853 * Flags:
5854 * 0x1 - Link Status Change
5855 * 0x2 - Magic Packet
5856 * 0x4 - Direct Exact
5857 * 0x8 - Directed Multicast
5858 * 0x10 - Broadcast
5859 * 0x20 - ARP/IPv4 Request Packet
5860 * 0x40 - Direct IPv4 Packet
5861 * 0x80 - Direct IPv6 Packet
5862 *
5863 * Settings not listed above will cause the sysctl to return an error.
5864 ************************************************************************/
5865 static int
5866 ixgbe_sysctl_wufc(SYSCTLFN_ARGS)
5867 {
5868 struct sysctlnode node = *rnode;
5869 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5870 int error = 0;
5871 u32 new_wufc;
5872
5873 /*
5874 * It's not required to check recovery mode because this function never
5875 * touches hardware.
5876 */
5877 new_wufc = adapter->wufc;
5878 node.sysctl_data = &new_wufc;
5879 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5880 if ((error) || (newp == NULL))
5881 return (error);
5882 if (new_wufc == adapter->wufc)
5883 return (0);
5884
5885 if (new_wufc & 0xffffff00)
5886 return (EINVAL);
5887
5888 new_wufc &= 0xff;
5889 new_wufc |= (0xffffff & adapter->wufc);
5890 adapter->wufc = new_wufc;
5891
5892 return (0);
5893 } /* ixgbe_sysctl_wufc */
5894
5895 #ifdef IXGBE_DEBUG
5896 /************************************************************************
5897 * ixgbe_sysctl_print_rss_config
5898 ************************************************************************/
5899 static int
5900 ixgbe_sysctl_print_rss_config(SYSCTLFN_ARGS)
5901 {
5902 #ifdef notyet
5903 struct sysctlnode node = *rnode;
5904 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5905 struct ixgbe_hw *hw = &adapter->hw;
5906 device_t dev = adapter->dev;
5907 struct sbuf *buf;
5908 int error = 0, reta_size;
5909 u32 reg;
5910
5911 if (ixgbe_fw_recovery_mode_swflag(adapter))
5912 return (EPERM);
5913
5914 buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5915 if (!buf) {
5916 device_printf(dev, "Could not allocate sbuf for output.\n");
5917 return (ENOMEM);
5918 }
5919
5920 // TODO: use sbufs to make a string to print out
5921 /* Set multiplier for RETA setup and table size based on MAC */
5922 switch (adapter->hw.mac.type) {
5923 case ixgbe_mac_X550:
5924 case ixgbe_mac_X550EM_x:
5925 case ixgbe_mac_X550EM_a:
5926 reta_size = 128;
5927 break;
5928 default:
5929 reta_size = 32;
5930 break;
5931 }
5932
5933 /* Print out the redirection table */
5934 sbuf_cat(buf, "\n");
5935 for (int i = 0; i < reta_size; i++) {
5936 if (i < 32) {
5937 reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
5938 sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
5939 } else {
5940 reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
5941 sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
5942 }
5943 }
5944
5945 // TODO: print more config
5946
5947 error = sbuf_finish(buf);
5948 if (error)
5949 device_printf(dev, "Error finishing sbuf: %d\n", error);
5950
5951 sbuf_delete(buf);
5952 #endif
5953 return (0);
5954 } /* ixgbe_sysctl_print_rss_config */
5955 #endif /* IXGBE_DEBUG */
5956
5957 /************************************************************************
5958 * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
5959 *
5960 * For X552/X557-AT devices using an external PHY
5961 ************************************************************************/
5962 static int
5963 ixgbe_sysctl_phy_temp(SYSCTLFN_ARGS)
5964 {
5965 struct sysctlnode node = *rnode;
5966 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5967 struct ixgbe_hw *hw = &adapter->hw;
5968 int val;
5969 u16 reg;
5970 int error;
5971
5972 if (ixgbe_fw_recovery_mode_swflag(adapter))
5973 return (EPERM);
5974
5975 if ((hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) &&
5976 (hw->device_id != IXGBE_DEV_ID_X550EM_A_10G_T)) {
5977 device_printf(adapter->dev,
5978 "Device has no supported external thermal sensor.\n");
5979 return (ENODEV);
5980 }
5981
5982 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
5983 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
5984 device_printf(adapter->dev,
5985 "Error reading from PHY's current temperature register\n");
5986 return (EAGAIN);
5987 }
5988
5989 node.sysctl_data = &val;
5990
5991 /* Shift temp for output */
5992 val = reg >> 8;
5993
5994 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5995 if ((error) || (newp == NULL))
5996 return (error);
5997
5998 return (0);
5999 } /* ixgbe_sysctl_phy_temp */
6000
6001 /************************************************************************
6002 * ixgbe_sysctl_phy_overtemp_occurred
6003 *
6004 * Reports (directly from the PHY) whether the current PHY
6005 * temperature is over the overtemp threshold.
6006 ************************************************************************/
6007 static int
6008 ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_ARGS)
6009 {
6010 struct sysctlnode node = *rnode;
6011 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6012 struct ixgbe_hw *hw = &adapter->hw;
6013 int val, error;
6014 u16 reg;
6015
6016 if (ixgbe_fw_recovery_mode_swflag(adapter))
6017 return (EPERM);
6018
6019 if ((hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) &&
6020 (hw->device_id != IXGBE_DEV_ID_X550EM_A_10G_T)){
6021 device_printf(adapter->dev,
6022 "Device has no supported external thermal sensor.\n");
6023 return (ENODEV);
6024 }
6025
6026 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
6027 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
6028 device_printf(adapter->dev,
6029 "Error reading from PHY's temperature status register\n");
6030 return (EAGAIN);
6031 }
6032
6033 node.sysctl_data = &val;
6034
6035 /* Get occurrence bit */
6036 val = !!(reg & 0x4000);
6037
6038 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6039 if ((error) || (newp == NULL))
6040 return (error);
6041
6042 return (0);
6043 } /* ixgbe_sysctl_phy_overtemp_occurred */
6044
6045 /************************************************************************
6046 * ixgbe_sysctl_eee_state
6047 *
6048 * Sysctl to set EEE power saving feature
6049 * Values:
6050 * 0 - disable EEE
6051 * 1 - enable EEE
6052 * (none) - get current device EEE state
6053 ************************************************************************/
6054 static int
6055 ixgbe_sysctl_eee_state(SYSCTLFN_ARGS)
6056 {
6057 struct sysctlnode node = *rnode;
6058 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6059 struct ifnet *ifp = adapter->ifp;
6060 device_t dev = adapter->dev;
6061 int curr_eee, new_eee, error = 0;
6062 s32 retval;
6063
6064 if (ixgbe_fw_recovery_mode_swflag(adapter))
6065 return (EPERM);
6066
6067 curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
6068 node.sysctl_data = &new_eee;
6069 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6070 if ((error) || (newp == NULL))
6071 return (error);
6072
6073 /* Nothing to do */
6074 if (new_eee == curr_eee)
6075 return (0);
6076
6077 /* Not supported */
6078 if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
6079 return (EINVAL);
6080
6081 /* Bounds checking */
6082 if ((new_eee < 0) || (new_eee > 1))
6083 return (EINVAL);
6084
6085 retval = ixgbe_setup_eee(&adapter->hw, new_eee);
6086 if (retval) {
6087 device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
6088 return (EINVAL);
6089 }
6090
6091 /* Restart auto-neg */
6092 if_init(ifp);
6093
6094 device_printf(dev, "New EEE state: %d\n", new_eee);
6095
6096 /* Cache new value */
6097 if (new_eee)
6098 adapter->feat_en |= IXGBE_FEATURE_EEE;
6099 else
6100 adapter->feat_en &= ~IXGBE_FEATURE_EEE;
6101
6102 return (error);
6103 } /* ixgbe_sysctl_eee_state */
6104
6105 #define PRINTQS(adapter, regname) \
6106 do { \
6107 struct ixgbe_hw *_hw = &(adapter)->hw; \
6108 int _i; \
6109 \
6110 printf("%s: %s", device_xname((adapter)->dev), #regname); \
6111 for (_i = 0; _i < (adapter)->num_queues; _i++) { \
6112 printf((_i == 0) ? "\t" : " "); \
6113 printf("%08x", IXGBE_READ_REG(_hw, \
6114 IXGBE_##regname(_i))); \
6115 } \
6116 printf("\n"); \
6117 } while (0)
6118
6119 /************************************************************************
6120 * ixgbe_print_debug_info
6121 *
6122 * Called only when em_display_debug_stats is enabled.
6123 * Provides a way to take a look at important statistics
6124 * maintained by the driver and hardware.
6125 ************************************************************************/
6126 static void
6127 ixgbe_print_debug_info(struct adapter *adapter)
6128 {
6129 device_t dev = adapter->dev;
6130 struct ixgbe_hw *hw = &adapter->hw;
6131 int table_size;
6132 int i;
6133
6134 switch (adapter->hw.mac.type) {
6135 case ixgbe_mac_X550:
6136 case ixgbe_mac_X550EM_x:
6137 case ixgbe_mac_X550EM_a:
6138 table_size = 128;
6139 break;
6140 default:
6141 table_size = 32;
6142 break;
6143 }
6144
6145 device_printf(dev, "[E]RETA:\n");
6146 for (i = 0; i < table_size; i++) {
6147 if (i < 32)
6148 printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
6149 IXGBE_RETA(i)));
6150 else
6151 printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
6152 IXGBE_ERETA(i - 32)));
6153 }
6154
6155 device_printf(dev, "queue:");
6156 for (i = 0; i < adapter->num_queues; i++) {
6157 printf((i == 0) ? "\t" : " ");
6158 printf("%8d", i);
6159 }
6160 printf("\n");
6161 PRINTQS(adapter, RDBAL);
6162 PRINTQS(adapter, RDBAH);
6163 PRINTQS(adapter, RDLEN);
6164 PRINTQS(adapter, SRRCTL);
6165 PRINTQS(adapter, RDH);
6166 PRINTQS(adapter, RDT);
6167 PRINTQS(adapter, RXDCTL);
6168
6169 device_printf(dev, "RQSMR:");
6170 for (i = 0; i < adapter->num_queues / 4; i++) {
6171 printf((i == 0) ? "\t" : " ");
6172 printf("%08x", IXGBE_READ_REG(hw, IXGBE_RQSMR(i)));
6173 }
6174 printf("\n");
6175
6176 device_printf(dev, "disabled_count:");
6177 for (i = 0; i < adapter->num_queues; i++) {
6178 printf((i == 0) ? "\t" : " ");
6179 printf("%8d", adapter->queues[i].disabled_count);
6180 }
6181 printf("\n");
6182
6183 device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
6184 if (hw->mac.type != ixgbe_mac_82598EB) {
6185 device_printf(dev, "EIMS_EX(0):\t%08x\n",
6186 IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0)));
6187 device_printf(dev, "EIMS_EX(1):\t%08x\n",
6188 IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1)));
6189 }
6190 device_printf(dev, "EIAM:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIAM));
6191 device_printf(dev, "EIAC:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIAC));
6192 } /* ixgbe_print_debug_info */
6193
6194 /************************************************************************
6195 * ixgbe_sysctl_debug
6196 ************************************************************************/
6197 static int
6198 ixgbe_sysctl_debug(SYSCTLFN_ARGS)
6199 {
6200 struct sysctlnode node = *rnode;
6201 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6202 int error, result = 0;
6203
6204 if (ixgbe_fw_recovery_mode_swflag(adapter))
6205 return (EPERM);
6206
6207 node.sysctl_data = &result;
6208 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6209
6210 if (error || newp == NULL)
6211 return error;
6212
6213 if (result == 1)
6214 ixgbe_print_debug_info(adapter);
6215
6216 return 0;
6217 } /* ixgbe_sysctl_debug */
6218
6219 /************************************************************************
6220 * ixgbe_sysctl_rx_copy_len
6221 ************************************************************************/
6222 static int
6223 ixgbe_sysctl_rx_copy_len(SYSCTLFN_ARGS)
6224 {
6225 struct sysctlnode node = *rnode;
6226 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6227 int error;
6228 int result = adapter->rx_copy_len;
6229
6230 node.sysctl_data = &result;
6231 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6232
6233 if (error || newp == NULL)
6234 return error;
6235
6236 if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
6237 return EINVAL;
6238
6239 adapter->rx_copy_len = result;
6240
6241 return 0;
6242 } /* ixgbe_sysctl_rx_copy_len */
6243
6244 /************************************************************************
6245 * ixgbe_sysctl_tx_process_limit
6246 ************************************************************************/
6247 static int
6248 ixgbe_sysctl_tx_process_limit(SYSCTLFN_ARGS)
6249 {
6250 struct sysctlnode node = *rnode;
6251 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6252 int error;
6253 int result = adapter->tx_process_limit;
6254
6255 node.sysctl_data = &result;
6256 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6257
6258 if (error || newp == NULL)
6259 return error;
6260
6261 if ((result <= 0) || (result > adapter->num_tx_desc))
6262 return EINVAL;
6263
6264 adapter->tx_process_limit = result;
6265
6266 return 0;
6267 } /* ixgbe_sysctl_tx_process_limit */
6268
6269 /************************************************************************
6270 * ixgbe_sysctl_rx_process_limit
6271 ************************************************************************/
6272 static int
6273 ixgbe_sysctl_rx_process_limit(SYSCTLFN_ARGS)
6274 {
6275 struct sysctlnode node = *rnode;
6276 struct adapter *adapter = (struct adapter *)node.sysctl_data;
6277 int error;
6278 int result = adapter->rx_process_limit;
6279
6280 node.sysctl_data = &result;
6281 error = sysctl_lookup(SYSCTLFN_CALL(&node));
6282
6283 if (error || newp == NULL)
6284 return error;
6285
6286 if ((result <= 0) || (result > adapter->num_rx_desc))
6287 return EINVAL;
6288
6289 adapter->rx_process_limit = result;
6290
6291 return 0;
6292 } /* ixgbe_sysctl_rx_process_limit */
6293
6294 /************************************************************************
6295 * ixgbe_init_device_features
6296 ************************************************************************/
6297 static void
6298 ixgbe_init_device_features(struct adapter *adapter)
6299 {
6300 adapter->feat_cap = IXGBE_FEATURE_NETMAP
6301 | IXGBE_FEATURE_RSS
6302 | IXGBE_FEATURE_MSI
6303 | IXGBE_FEATURE_MSIX
6304 | IXGBE_FEATURE_LEGACY_IRQ
6305 | IXGBE_FEATURE_LEGACY_TX;
6306
6307 /* Set capabilities first... */
6308 switch (adapter->hw.mac.type) {
6309 case ixgbe_mac_82598EB:
6310 if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
6311 adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
6312 break;
6313 case ixgbe_mac_X540:
6314 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6315 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6316 if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
6317 (adapter->hw.bus.func == 0))
6318 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6319 break;
6320 case ixgbe_mac_X550:
6321 /*
6322 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6323 * NVM Image version.
6324 */
6325 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6326 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6327 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6328 break;
6329 case ixgbe_mac_X550EM_x:
6330 /*
6331 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6332 * NVM Image version.
6333 */
6334 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6335 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6336 break;
6337 case ixgbe_mac_X550EM_a:
6338 /*
6339 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6340 * NVM Image version.
6341 */
6342 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6343 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6344 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6345 if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
6346 (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
6347 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6348 adapter->feat_cap |= IXGBE_FEATURE_EEE;
6349 }
6350 break;
6351 case ixgbe_mac_82599EB:
6352 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6353 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6354 if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
6355 (adapter->hw.bus.func == 0))
6356 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6357 if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
6358 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6359 break;
6360 default:
6361 break;
6362 }
6363
6364 /* Enabled by default... */
6365 /* Fan failure detection */
6366 if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
6367 adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
6368 /* Netmap */
6369 if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
6370 adapter->feat_en |= IXGBE_FEATURE_NETMAP;
6371 /* EEE */
6372 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
6373 adapter->feat_en |= IXGBE_FEATURE_EEE;
6374 /* Thermal Sensor */
6375 if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
6376 adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
6377 /*
6378 * Recovery mode:
6379 * NetBSD: IXGBE_FEATURE_RECOVERY_MODE will be controlled after reading
6380 * NVM Image version.
6381 */
6382
6383 /* Enabled via global sysctl... */
6384 /* Flow Director */
6385 if (ixgbe_enable_fdir) {
6386 if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
6387 adapter->feat_en |= IXGBE_FEATURE_FDIR;
6388 else
6389 device_printf(adapter->dev, "Device does not support "
6390 "Flow Director. Leaving disabled.");
6391 }
6392 /* Legacy (single queue) transmit */
6393 if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
6394 ixgbe_enable_legacy_tx)
6395 adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
6396 /*
6397 * Message Signal Interrupts - Extended (MSI-X)
6398 * Normal MSI is only enabled if MSI-X calls fail.
6399 */
6400 if (!ixgbe_enable_msix)
6401 adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
6402 /* Receive-Side Scaling (RSS) */
6403 if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
6404 adapter->feat_en |= IXGBE_FEATURE_RSS;
6405
6406 /* Disable features with unmet dependencies... */
6407 /* No MSI-X */
6408 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
6409 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
6410 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
6411 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
6412 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
6413 }
6414 } /* ixgbe_init_device_features */
6415
6416 /************************************************************************
6417 * ixgbe_probe - Device identification routine
6418 *
6419 * Determines if the driver should be loaded on
6420 * adapter based on its PCI vendor/device ID.
6421 *
6422 * return BUS_PROBE_DEFAULT on success, positive on failure
6423 ************************************************************************/
6424 static int
6425 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
6426 {
6427 const struct pci_attach_args *pa = aux;
6428
6429 return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
6430 }
6431
6432 static const ixgbe_vendor_info_t *
6433 ixgbe_lookup(const struct pci_attach_args *pa)
6434 {
6435 const ixgbe_vendor_info_t *ent;
6436 pcireg_t subid;
6437
6438 INIT_DEBUGOUT("ixgbe_lookup: begin");
6439
6440 if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
6441 return NULL;
6442
6443 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
6444
6445 for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
6446 if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
6447 (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
6448 ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
6449 (ent->subvendor_id == 0)) &&
6450 ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
6451 (ent->subdevice_id == 0))) {
6452 return ent;
6453 }
6454 }
6455 return NULL;
6456 }
6457
6458 static int
6459 ixgbe_ifflags_cb(struct ethercom *ec)
6460 {
6461 struct ifnet *ifp = &ec->ec_if;
6462 struct adapter *adapter = ifp->if_softc;
6463 u_short change;
6464 int rv = 0;
6465
6466 IXGBE_CORE_LOCK(adapter);
6467
6468 change = ifp->if_flags ^ adapter->if_flags;
6469 if (change != 0)
6470 adapter->if_flags = ifp->if_flags;
6471
6472 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
6473 rv = ENETRESET;
6474 goto out;
6475 } else if ((change & IFF_PROMISC) != 0)
6476 ixgbe_set_rxfilter(adapter);
6477
6478 /* Check for ec_capenable. */
6479 change = ec->ec_capenable ^ adapter->ec_capenable;
6480 adapter->ec_capenable = ec->ec_capenable;
6481 if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
6482 | ETHERCAP_VLAN_HWFILTER)) != 0) {
6483 rv = ENETRESET;
6484 goto out;
6485 }
6486
6487 /*
6488 * Special handling is not required for ETHERCAP_VLAN_MTU.
6489 * MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
6490 */
6491
6492 /* Set up VLAN support and filter */
6493 if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
6494 ixgbe_setup_vlan_hw_support(adapter);
6495
6496 out:
6497 IXGBE_CORE_UNLOCK(adapter);
6498
6499 return rv;
6500 }
6501
6502 /************************************************************************
6503 * ixgbe_ioctl - Ioctl entry point
6504 *
6505 * Called when the user wants to configure the interface.
6506 *
6507 * return 0 on success, positive on failure
6508 ************************************************************************/
6509 static int
6510 ixgbe_ioctl(struct ifnet *ifp, u_long command, void *data)
6511 {
6512 struct adapter *adapter = ifp->if_softc;
6513 struct ixgbe_hw *hw = &adapter->hw;
6514 struct ifcapreq *ifcr = data;
6515 struct ifreq *ifr = data;
6516 int error = 0;
6517 int l4csum_en;
6518 const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
6519 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
6520
6521 if (ixgbe_fw_recovery_mode_swflag(adapter))
6522 return (EPERM);
6523
6524 switch (command) {
6525 case SIOCSIFFLAGS:
6526 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
6527 break;
6528 case SIOCADDMULTI:
6529 case SIOCDELMULTI:
6530 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
6531 break;
6532 case SIOCSIFMEDIA:
6533 case SIOCGIFMEDIA:
6534 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
6535 break;
6536 case SIOCSIFCAP:
6537 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
6538 break;
6539 case SIOCSIFMTU:
6540 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
6541 break;
6542 #ifdef __NetBSD__
6543 case SIOCINITIFADDR:
6544 IOCTL_DEBUGOUT("ioctl: SIOCINITIFADDR");
6545 break;
6546 case SIOCGIFFLAGS:
6547 IOCTL_DEBUGOUT("ioctl: SIOCGIFFLAGS");
6548 break;
6549 case SIOCGIFAFLAG_IN:
6550 IOCTL_DEBUGOUT("ioctl: SIOCGIFAFLAG_IN");
6551 break;
6552 case SIOCGIFADDR:
6553 IOCTL_DEBUGOUT("ioctl: SIOCGIFADDR");
6554 break;
6555 case SIOCGIFMTU:
6556 IOCTL_DEBUGOUT("ioctl: SIOCGIFMTU (Get Interface MTU)");
6557 break;
6558 case SIOCGIFCAP:
6559 IOCTL_DEBUGOUT("ioctl: SIOCGIFCAP (Get IF cap)");
6560 break;
6561 case SIOCGETHERCAP:
6562 IOCTL_DEBUGOUT("ioctl: SIOCGETHERCAP (Get ethercap)");
6563 break;
6564 case SIOCGLIFADDR:
6565 IOCTL_DEBUGOUT("ioctl: SIOCGLIFADDR (Get Interface addr)");
6566 break;
6567 case SIOCZIFDATA:
6568 IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
6569 hw->mac.ops.clear_hw_cntrs(hw);
6570 ixgbe_clear_evcnt(adapter);
6571 break;
6572 case SIOCAIFADDR:
6573 IOCTL_DEBUGOUT("ioctl: SIOCAIFADDR (add/chg IF alias)");
6574 break;
6575 #endif
6576 default:
6577 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
6578 break;
6579 }
6580
6581 switch (command) {
6582 case SIOCGI2C:
6583 {
6584 struct ixgbe_i2c_req i2c;
6585
6586 IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
6587 error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
6588 if (error != 0)
6589 break;
6590 if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
6591 error = EINVAL;
6592 break;
6593 }
6594 if (i2c.len > sizeof(i2c.data)) {
6595 error = EINVAL;
6596 break;
6597 }
6598
6599 hw->phy.ops.read_i2c_byte(hw, i2c.offset,
6600 i2c.dev_addr, i2c.data);
6601 error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
6602 break;
6603 }
6604 case SIOCSIFCAP:
6605 /* Layer-4 Rx checksum offload has to be turned on and
6606 * off as a unit.
6607 */
6608 l4csum_en = ifcr->ifcr_capenable & l4csum;
6609 if (l4csum_en != l4csum && l4csum_en != 0)
6610 return EINVAL;
6611 /*FALLTHROUGH*/
6612 case SIOCADDMULTI:
6613 case SIOCDELMULTI:
6614 case SIOCSIFFLAGS:
6615 case SIOCSIFMTU:
6616 default:
6617 if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
6618 return error;
6619 if ((ifp->if_flags & IFF_RUNNING) == 0)
6620 ;
6621 else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
6622 IXGBE_CORE_LOCK(adapter);
6623 if ((ifp->if_flags & IFF_RUNNING) != 0)
6624 ixgbe_init_locked(adapter);
6625 ixgbe_recalculate_max_frame(adapter);
6626 IXGBE_CORE_UNLOCK(adapter);
6627 } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
6628 /*
6629 * Multicast list has changed; set the hardware filter
6630 * accordingly.
6631 */
6632 IXGBE_CORE_LOCK(adapter);
6633 ixgbe_disable_intr(adapter);
6634 ixgbe_set_rxfilter(adapter);
6635 ixgbe_enable_intr(adapter);
6636 IXGBE_CORE_UNLOCK(adapter);
6637 }
6638 return 0;
6639 }
6640
6641 return error;
6642 } /* ixgbe_ioctl */
6643
6644 /************************************************************************
6645 * ixgbe_check_fan_failure
6646 ************************************************************************/
6647 static int
6648 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
6649 {
6650 u32 mask;
6651
6652 mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
6653 IXGBE_ESDP_SDP1;
6654
6655 if ((reg & mask) == 0)
6656 return IXGBE_SUCCESS;
6657
6658 /*
6659 * Use ratecheck() just in case interrupt occur frequently.
6660 * When EXPX9501AT's fan stopped, interrupt occurred only once,
6661 * an red LED on the board turned on and link never up until
6662 * power off.
6663 */
6664 if (ratecheck(&adapter->lasterr_time, &ixgbe_errlog_intrvl))
6665 device_printf(adapter->dev,
6666 "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
6667
6668 return IXGBE_ERR_FAN_FAILURE;
6669 } /* ixgbe_check_fan_failure */
6670
6671 /************************************************************************
6672 * ixgbe_handle_que
6673 ************************************************************************/
6674 static void
6675 ixgbe_handle_que(void *context)
6676 {
6677 struct ix_queue *que = context;
6678 struct adapter *adapter = que->adapter;
6679 struct tx_ring *txr = que->txr;
6680 struct ifnet *ifp = adapter->ifp;
6681 bool more = false;
6682
6683 IXGBE_EVC_ADD(&que->handleq, 1);
6684
6685 if (ifp->if_flags & IFF_RUNNING) {
6686 IXGBE_TX_LOCK(txr);
6687 more = ixgbe_txeof(txr);
6688 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
6689 if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
6690 ixgbe_mq_start_locked(ifp, txr);
6691 /* Only for queue 0 */
6692 /* NetBSD still needs this for CBQ */
6693 if ((&adapter->queues[0] == que)
6694 && (!ixgbe_legacy_ring_empty(ifp, NULL)))
6695 ixgbe_legacy_start_locked(ifp, txr);
6696 IXGBE_TX_UNLOCK(txr);
6697 more |= ixgbe_rxeof(que);
6698 }
6699
6700 if (more) {
6701 IXGBE_EVC_ADD(&que->req, 1);
6702 ixgbe_sched_handle_que(adapter, que);
6703 } else if (que->res != NULL) {
6704 /* MSIX: Re-enable this interrupt */
6705 ixgbe_enable_queue(adapter, que->msix);
6706 } else {
6707 /* INTx or MSI */
6708 ixgbe_enable_queue(adapter, 0);
6709 }
6710
6711 return;
6712 } /* ixgbe_handle_que */
6713
6714 /************************************************************************
6715 * ixgbe_handle_que_work
6716 ************************************************************************/
6717 static void
6718 ixgbe_handle_que_work(struct work *wk, void *context)
6719 {
6720 struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
6721
6722 /*
6723 * "enqueued flag" is not required here.
6724 * See ixgbe_msix_que().
6725 */
6726 ixgbe_handle_que(que);
6727 }
6728
6729 /************************************************************************
6730 * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
6731 ************************************************************************/
6732 static int
6733 ixgbe_allocate_legacy(struct adapter *adapter,
6734 const struct pci_attach_args *pa)
6735 {
6736 device_t dev = adapter->dev;
6737 struct ix_queue *que = adapter->queues;
6738 struct tx_ring *txr = adapter->tx_rings;
6739 int counts[PCI_INTR_TYPE_SIZE];
6740 pci_intr_type_t intr_type, max_type;
6741 char intrbuf[PCI_INTRSTR_LEN];
6742 char wqname[MAXCOMLEN];
6743 const char *intrstr = NULL;
6744 int defertx_error = 0, error;
6745
6746 /* We allocate a single interrupt resource */
6747 max_type = PCI_INTR_TYPE_MSI;
6748 counts[PCI_INTR_TYPE_MSIX] = 0;
6749 counts[PCI_INTR_TYPE_MSI] =
6750 (adapter->feat_en & IXGBE_FEATURE_MSI) ? 1 : 0;
6751 /* Check not feat_en but feat_cap to fallback to INTx */
6752 counts[PCI_INTR_TYPE_INTX] =
6753 (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) ? 1 : 0;
6754
6755 alloc_retry:
6756 if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
6757 aprint_error_dev(dev, "couldn't alloc interrupt\n");
6758 return ENXIO;
6759 }
6760 adapter->osdep.nintrs = 1;
6761 intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
6762 intrbuf, sizeof(intrbuf));
6763 adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
6764 adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
6765 device_xname(dev));
6766 intr_type = pci_intr_type(adapter->osdep.pc, adapter->osdep.intrs[0]);
6767 if (adapter->osdep.ihs[0] == NULL) {
6768 aprint_error_dev(dev,"unable to establish %s\n",
6769 (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
6770 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6771 adapter->osdep.intrs = NULL;
6772 switch (intr_type) {
6773 case PCI_INTR_TYPE_MSI:
6774 /* The next try is for INTx: Disable MSI */
6775 max_type = PCI_INTR_TYPE_INTX;
6776 counts[PCI_INTR_TYPE_INTX] = 1;
6777 adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6778 if (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) {
6779 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6780 goto alloc_retry;
6781 } else
6782 break;
6783 case PCI_INTR_TYPE_INTX:
6784 default:
6785 /* See below */
6786 break;
6787 }
6788 }
6789 if (intr_type == PCI_INTR_TYPE_INTX) {
6790 adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6791 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6792 }
6793 if (adapter->osdep.ihs[0] == NULL) {
6794 aprint_error_dev(dev,
6795 "couldn't establish interrupt%s%s\n",
6796 intrstr ? " at " : "", intrstr ? intrstr : "");
6797 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6798 adapter->osdep.intrs = NULL;
6799 return ENXIO;
6800 }
6801 aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
6802 /*
6803 * Try allocating a fast interrupt and the associated deferred
6804 * processing contexts.
6805 */
6806 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
6807 txr->txr_si =
6808 softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6809 ixgbe_deferred_mq_start, txr);
6810
6811 snprintf(wqname, sizeof(wqname), "%sdeferTx",
6812 device_xname(dev));
6813 defertx_error = workqueue_create(&adapter->txr_wq, wqname,
6814 ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI,
6815 IPL_NET, IXGBE_WORKQUEUE_FLAGS);
6816 adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
6817 }
6818 que->que_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6819 ixgbe_handle_que, que);
6820 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
6821 error = workqueue_create(&adapter->que_wq, wqname,
6822 ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6823 IXGBE_WORKQUEUE_FLAGS);
6824
6825 if ((!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)
6826 && ((txr->txr_si == NULL) || defertx_error != 0))
6827 || (que->que_si == NULL) || error != 0) {
6828 aprint_error_dev(dev,
6829 "could not establish software interrupts\n");
6830
6831 return ENXIO;
6832 }
6833 /* For simplicity in the handlers */
6834 adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
6835
6836 return (0);
6837 } /* ixgbe_allocate_legacy */
6838
6839 /************************************************************************
6840 * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
6841 ************************************************************************/
6842 static int
6843 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
6844 {
6845 device_t dev = adapter->dev;
6846 struct ix_queue *que = adapter->queues;
6847 struct tx_ring *txr = adapter->tx_rings;
6848 pci_chipset_tag_t pc;
6849 char intrbuf[PCI_INTRSTR_LEN];
6850 char intr_xname[32];
6851 char wqname[MAXCOMLEN];
6852 const char *intrstr = NULL;
6853 int error, vector = 0;
6854 int cpu_id = 0;
6855 kcpuset_t *affinity;
6856 #ifdef RSS
6857 unsigned int rss_buckets = 0;
6858 kcpuset_t cpu_mask;
6859 #endif
6860
6861 pc = adapter->osdep.pc;
6862 #ifdef RSS
6863 /*
6864 * If we're doing RSS, the number of queues needs to
6865 * match the number of RSS buckets that are configured.
6866 *
6867 * + If there's more queues than RSS buckets, we'll end
6868 * up with queues that get no traffic.
6869 *
6870 * + If there's more RSS buckets than queues, we'll end
6871 * up having multiple RSS buckets map to the same queue,
6872 * so there'll be some contention.
6873 */
6874 rss_buckets = rss_getnumbuckets();
6875 if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
6876 (adapter->num_queues != rss_buckets)) {
6877 device_printf(dev,
6878 "%s: number of queues (%d) != number of RSS buckets (%d)"
6879 "; performance will be impacted.\n",
6880 __func__, adapter->num_queues, rss_buckets);
6881 }
6882 #endif
6883
6884 adapter->osdep.nintrs = adapter->num_queues + 1;
6885 if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
6886 adapter->osdep.nintrs) != 0) {
6887 aprint_error_dev(dev,
6888 "failed to allocate MSI-X interrupt\n");
6889 adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
6890 return (ENXIO);
6891 }
6892
6893 kcpuset_create(&affinity, false);
6894 for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
6895 snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
6896 device_xname(dev), i);
6897 intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
6898 sizeof(intrbuf));
6899 #ifdef IXGBE_MPSAFE
6900 pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
6901 true);
6902 #endif
6903 /* Set the handler function */
6904 que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
6905 adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
6906 intr_xname);
6907 if (que->res == NULL) {
6908 aprint_error_dev(dev,
6909 "Failed to register QUE handler\n");
6910 error = ENXIO;
6911 goto err_out;
6912 }
6913 que->msix = vector;
6914 adapter->active_queues |= 1ULL << que->msix;
6915
6916 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
6917 #ifdef RSS
6918 /*
6919 * The queue ID is used as the RSS layer bucket ID.
6920 * We look up the queue ID -> RSS CPU ID and select
6921 * that.
6922 */
6923 cpu_id = rss_getcpu(i % rss_getnumbuckets());
6924 CPU_SETOF(cpu_id, &cpu_mask);
6925 #endif
6926 } else {
6927 /*
6928 * Bind the MSI-X vector, and thus the
6929 * rings to the corresponding CPU.
6930 *
6931 * This just happens to match the default RSS
6932 * round-robin bucket -> queue -> CPU allocation.
6933 */
6934 if (adapter->num_queues > 1)
6935 cpu_id = i;
6936 }
6937 /* Round-robin affinity */
6938 kcpuset_zero(affinity);
6939 kcpuset_set(affinity, cpu_id % ncpu);
6940 error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
6941 NULL);
6942 aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
6943 intrstr);
6944 if (error == 0) {
6945 #if 1 /* def IXGBE_DEBUG */
6946 #ifdef RSS
6947 aprint_normal(", bound RSS bucket %d to CPU %d", i,
6948 cpu_id % ncpu);
6949 #else
6950 aprint_normal(", bound queue %d to cpu %d", i,
6951 cpu_id % ncpu);
6952 #endif
6953 #endif /* IXGBE_DEBUG */
6954 }
6955 aprint_normal("\n");
6956
6957 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
6958 txr->txr_si = softint_establish(
6959 SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6960 ixgbe_deferred_mq_start, txr);
6961 if (txr->txr_si == NULL) {
6962 aprint_error_dev(dev,
6963 "couldn't establish software interrupt\n");
6964 error = ENXIO;
6965 goto err_out;
6966 }
6967 }
6968 que->que_si
6969 = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6970 ixgbe_handle_que, que);
6971 if (que->que_si == NULL) {
6972 aprint_error_dev(dev,
6973 "couldn't establish software interrupt\n");
6974 error = ENXIO;
6975 goto err_out;
6976 }
6977 }
6978 snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
6979 error = workqueue_create(&adapter->txr_wq, wqname,
6980 ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6981 IXGBE_WORKQUEUE_FLAGS);
6982 if (error) {
6983 aprint_error_dev(dev,
6984 "couldn't create workqueue for deferred Tx\n");
6985 goto err_out;
6986 }
6987 adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
6988
6989 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
6990 error = workqueue_create(&adapter->que_wq, wqname,
6991 ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6992 IXGBE_WORKQUEUE_FLAGS);
6993 if (error) {
6994 aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
6995 goto err_out;
6996 }
6997
6998 /* and Link */
6999 cpu_id++;
7000 snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
7001 adapter->vector = vector;
7002 intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
7003 sizeof(intrbuf));
7004 #ifdef IXGBE_MPSAFE
7005 pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
7006 true);
7007 #endif
7008 /* Set the link handler function */
7009 adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
7010 adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_admin, adapter,
7011 intr_xname);
7012 if (adapter->osdep.ihs[vector] == NULL) {
7013 aprint_error_dev(dev, "Failed to register LINK handler\n");
7014 error = ENXIO;
7015 goto err_out;
7016 }
7017 /* Round-robin affinity */
7018 kcpuset_zero(affinity);
7019 kcpuset_set(affinity, cpu_id % ncpu);
7020 error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
7021 NULL);
7022
7023 aprint_normal_dev(dev,
7024 "for link, interrupting at %s", intrstr);
7025 if (error == 0)
7026 aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
7027 else
7028 aprint_normal("\n");
7029
7030 kcpuset_destroy(affinity);
7031 aprint_normal_dev(dev,
7032 "Using MSI-X interrupts with %d vectors\n", vector + 1);
7033
7034 return (0);
7035
7036 err_out:
7037 kcpuset_destroy(affinity);
7038 ixgbe_free_deferred_handlers(adapter);
7039 ixgbe_free_pciintr_resources(adapter);
7040 return (error);
7041 } /* ixgbe_allocate_msix */
7042
7043 /************************************************************************
7044 * ixgbe_configure_interrupts
7045 *
7046 * Setup MSI-X, MSI, or legacy interrupts (in that order).
7047 * This will also depend on user settings.
7048 ************************************************************************/
7049 static int
7050 ixgbe_configure_interrupts(struct adapter *adapter)
7051 {
7052 device_t dev = adapter->dev;
7053 struct ixgbe_mac_info *mac = &adapter->hw.mac;
7054 int want, queues, msgs;
7055
7056 /* Default to 1 queue if MSI-X setup fails */
7057 adapter->num_queues = 1;
7058
7059 /* Override by tuneable */
7060 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX))
7061 goto msi;
7062
7063 /*
7064 * NetBSD only: Use single vector MSI when number of CPU is 1 to save
7065 * interrupt slot.
7066 */
7067 if (ncpu == 1)
7068 goto msi;
7069
7070 /* First try MSI-X */
7071 msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
7072 msgs = MIN(msgs, IXG_MAX_NINTR);
7073 if (msgs < 2)
7074 goto msi;
7075
7076 adapter->feat_en |= IXGBE_FEATURE_MSIX;
7077
7078 /* Figure out a reasonable auto config value */
7079 queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
7080
7081 #ifdef RSS
7082 /* If we're doing RSS, clamp at the number of RSS buckets */
7083 if (adapter->feat_en & IXGBE_FEATURE_RSS)
7084 queues = uimin(queues, rss_getnumbuckets());
7085 #endif
7086 if (ixgbe_num_queues > queues) {
7087 aprint_error_dev(adapter->dev,
7088 "ixgbe_num_queues (%d) is too large, "
7089 "using reduced amount (%d).\n", ixgbe_num_queues, queues);
7090 ixgbe_num_queues = queues;
7091 }
7092
7093 if (ixgbe_num_queues != 0)
7094 queues = ixgbe_num_queues;
7095 else
7096 queues = uimin(queues,
7097 uimin(mac->max_tx_queues, mac->max_rx_queues));
7098
7099 /* reflect correct sysctl value */
7100 ixgbe_num_queues = queues;
7101
7102 /*
7103 * Want one vector (RX/TX pair) per queue
7104 * plus an additional for Link.
7105 */
7106 want = queues + 1;
7107 if (msgs >= want)
7108 msgs = want;
7109 else {
7110 aprint_error_dev(dev, "MSI-X Configuration Problem, "
7111 "%d vectors but %d queues wanted!\n", msgs, want);
7112 goto msi;
7113 }
7114 adapter->num_queues = queues;
7115 adapter->feat_en |= IXGBE_FEATURE_MSIX;
7116 return (0);
7117
7118 /*
7119 * MSI-X allocation failed or provided us with
7120 * less vectors than needed. Free MSI-X resources
7121 * and we'll try enabling MSI.
7122 */
7123 msi:
7124 /* Without MSI-X, some features are no longer supported */
7125 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
7126 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
7127 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
7128 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
7129
7130 msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
7131 adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
7132 if (msgs > 1)
7133 msgs = 1;
7134 if (msgs != 0) {
7135 msgs = 1;
7136 adapter->feat_en |= IXGBE_FEATURE_MSI;
7137 return (0);
7138 }
7139
7140 if (!(adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ)) {
7141 aprint_error_dev(dev,
7142 "Device does not support legacy interrupts.\n");
7143 return 1;
7144 }
7145
7146 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
7147
7148 return (0);
7149 } /* ixgbe_configure_interrupts */
7150
7151
7152 /************************************************************************
7153 * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
7154 *
7155 * Done outside of interrupt context since the driver might sleep
7156 ************************************************************************/
7157 static void
7158 ixgbe_handle_link(void *context)
7159 {
7160 struct adapter *adapter = context;
7161 struct ixgbe_hw *hw = &adapter->hw;
7162
7163 KASSERT(mutex_owned(&adapter->core_mtx));
7164
7165 IXGBE_EVC_ADD(&adapter->link_workev, 1);
7166 ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
7167 ixgbe_update_link_status(adapter);
7168
7169 /* Re-enable link interrupts */
7170 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
7171 } /* ixgbe_handle_link */
7172
7173 #if 0
7174 /************************************************************************
7175 * ixgbe_rearm_queues
7176 ************************************************************************/
7177 static __inline void
7178 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
7179 {
7180 u32 mask;
7181
7182 switch (adapter->hw.mac.type) {
7183 case ixgbe_mac_82598EB:
7184 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
7185 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
7186 break;
7187 case ixgbe_mac_82599EB:
7188 case ixgbe_mac_X540:
7189 case ixgbe_mac_X550:
7190 case ixgbe_mac_X550EM_x:
7191 case ixgbe_mac_X550EM_a:
7192 mask = (queues & 0xFFFFFFFF);
7193 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
7194 mask = (queues >> 32);
7195 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
7196 break;
7197 default:
7198 break;
7199 }
7200 } /* ixgbe_rearm_queues */
7201 #endif
7202