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