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