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