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