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