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