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