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