ixgbe.c revision 1.88.2.30 1 /* $NetBSD: ixgbe.c,v 1.88.2.30 2019/07/22 17:53:35 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 &= ~(0x000000ff << (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 &= ~(0x000000ff << (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(AIFM_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 device_printf(dev, "Media supported: 1000baseBX\n");
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 switch (hw->mac.ops.get_media_type(hw)) {
1500 case ixgbe_media_type_fiber:
1501 case ixgbe_media_type_fiber_qsfp:
1502 return (TRUE);
1503 default:
1504 return (FALSE);
1505 }
1506 case ixgbe_mac_X550EM_x:
1507 case ixgbe_mac_X550EM_a:
1508 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
1509 return (TRUE);
1510 return (FALSE);
1511 default:
1512 return (FALSE);
1513 }
1514 } /* ixgbe_is_sfp */
1515
1516 /************************************************************************
1517 * ixgbe_config_link
1518 ************************************************************************/
1519 static void
1520 ixgbe_config_link(struct adapter *adapter)
1521 {
1522 struct ixgbe_hw *hw = &adapter->hw;
1523 u32 autoneg, err = 0;
1524 bool sfp, negotiate = false;
1525
1526 sfp = ixgbe_is_sfp(hw);
1527
1528 if (sfp) {
1529 if (hw->phy.multispeed_fiber) {
1530 ixgbe_enable_tx_laser(hw);
1531 kpreempt_disable();
1532 softint_schedule(adapter->msf_si);
1533 kpreempt_enable();
1534 }
1535 kpreempt_disable();
1536 softint_schedule(adapter->mod_si);
1537 kpreempt_enable();
1538 } else {
1539 struct ifmedia *ifm = &adapter->media;
1540
1541 if (hw->mac.ops.check_link)
1542 err = ixgbe_check_link(hw, &adapter->link_speed,
1543 &adapter->link_up, FALSE);
1544 if (err)
1545 return;
1546
1547 /*
1548 * Check if it's the first call. If it's the first call,
1549 * get value for auto negotiation.
1550 */
1551 autoneg = hw->phy.autoneg_advertised;
1552 if ((IFM_SUBTYPE(ifm->ifm_cur->ifm_media) != IFM_NONE)
1553 && ((!autoneg) && (hw->mac.ops.get_link_capabilities)))
1554 err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
1555 &negotiate);
1556 if (err)
1557 return;
1558 if (hw->mac.ops.setup_link)
1559 err = hw->mac.ops.setup_link(hw, autoneg,
1560 adapter->link_up);
1561 }
1562
1563 } /* ixgbe_config_link */
1564
1565 /************************************************************************
1566 * ixgbe_update_stats_counters - Update board statistics counters.
1567 ************************************************************************/
1568 static void
1569 ixgbe_update_stats_counters(struct adapter *adapter)
1570 {
1571 struct ifnet *ifp = adapter->ifp;
1572 struct ixgbe_hw *hw = &adapter->hw;
1573 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1574 u32 missed_rx = 0, bprc, lxon, lxoff, total;
1575 u64 total_missed_rx = 0;
1576 uint64_t crcerrs, rlec;
1577 unsigned int queue_counters;
1578 int i;
1579
1580 crcerrs = IXGBE_READ_REG(hw, IXGBE_CRCERRS);
1581 stats->crcerrs.ev_count += crcerrs;
1582 stats->illerrc.ev_count += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
1583 stats->errbc.ev_count += IXGBE_READ_REG(hw, IXGBE_ERRBC);
1584 stats->mspdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MSPDC);
1585 if (hw->mac.type == ixgbe_mac_X550)
1586 stats->mbsdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MBSDC);
1587
1588 /* 16 registers exist */
1589 queue_counters = min(__arraycount(stats->qprc), adapter->num_queues);
1590 for (i = 0; i < queue_counters; i++) {
1591 stats->qprc[i].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
1592 stats->qptc[i].ev_count += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
1593 if (hw->mac.type >= ixgbe_mac_82599EB) {
1594 stats->qprdc[i].ev_count
1595 += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
1596 }
1597 }
1598
1599 /* 8 registers exist */
1600 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1601 uint32_t mp;
1602
1603 /* MPC */
1604 mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
1605 /* global total per queue */
1606 stats->mpc[i].ev_count += mp;
1607 /* running comprehensive total for stats display */
1608 total_missed_rx += mp;
1609
1610 if (hw->mac.type == ixgbe_mac_82598EB)
1611 stats->rnbc[i].ev_count
1612 += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
1613
1614 stats->pxontxc[i].ev_count
1615 += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
1616 stats->pxofftxc[i].ev_count
1617 += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
1618 if (hw->mac.type >= ixgbe_mac_82599EB) {
1619 stats->pxonrxc[i].ev_count
1620 += IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
1621 stats->pxoffrxc[i].ev_count
1622 += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
1623 stats->pxon2offc[i].ev_count
1624 += IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
1625 } else {
1626 stats->pxonrxc[i].ev_count
1627 += IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
1628 stats->pxoffrxc[i].ev_count
1629 += IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
1630 }
1631 }
1632 stats->mpctotal.ev_count += total_missed_rx;
1633
1634 /* Document says M[LR]FC are valid when link is up and 10Gbps */
1635 if ((adapter->link_active == LINK_STATE_UP)
1636 && (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)) {
1637 stats->mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC);
1638 stats->mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC);
1639 }
1640 rlec = IXGBE_READ_REG(hw, IXGBE_RLEC);
1641 stats->rlec.ev_count += rlec;
1642
1643 /* Hardware workaround, gprc counts missed packets */
1644 stats->gprc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx;
1645
1646 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
1647 stats->lxontxc.ev_count += lxon;
1648 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
1649 stats->lxofftxc.ev_count += lxoff;
1650 total = lxon + lxoff;
1651
1652 if (hw->mac.type != ixgbe_mac_82598EB) {
1653 stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) +
1654 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
1655 stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
1656 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32) - total * ETHER_MIN_LEN;
1657 stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) +
1658 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
1659 stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
1660 stats->lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
1661 } else {
1662 stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
1663 stats->lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
1664 /* 82598 only has a counter in the high register */
1665 stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH);
1666 stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH) - total * ETHER_MIN_LEN;
1667 stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH);
1668 }
1669
1670 /*
1671 * Workaround: mprc hardware is incorrectly counting
1672 * broadcasts, so for now we subtract those.
1673 */
1674 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
1675 stats->bprc.ev_count += bprc;
1676 stats->mprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPRC)
1677 - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0);
1678
1679 stats->prc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC64);
1680 stats->prc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC127);
1681 stats->prc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC255);
1682 stats->prc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC511);
1683 stats->prc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1023);
1684 stats->prc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1522);
1685
1686 stats->gptc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPTC) - total;
1687 stats->mptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPTC) - total;
1688 stats->ptc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC64) - total;
1689
1690 stats->ruc.ev_count += IXGBE_READ_REG(hw, IXGBE_RUC);
1691 stats->rfc.ev_count += IXGBE_READ_REG(hw, IXGBE_RFC);
1692 stats->roc.ev_count += IXGBE_READ_REG(hw, IXGBE_ROC);
1693 stats->rjc.ev_count += IXGBE_READ_REG(hw, IXGBE_RJC);
1694 stats->mngprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
1695 stats->mngpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
1696 stats->mngptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
1697 stats->tpr.ev_count += IXGBE_READ_REG(hw, IXGBE_TPR);
1698 stats->tpt.ev_count += IXGBE_READ_REG(hw, IXGBE_TPT);
1699 stats->ptc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC127);
1700 stats->ptc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC255);
1701 stats->ptc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC511);
1702 stats->ptc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1023);
1703 stats->ptc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1522);
1704 stats->bptc.ev_count += IXGBE_READ_REG(hw, IXGBE_BPTC);
1705 stats->xec.ev_count += IXGBE_READ_REG(hw, IXGBE_XEC);
1706 stats->fccrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCCRC);
1707 stats->fclast.ev_count += IXGBE_READ_REG(hw, IXGBE_FCLAST);
1708 /* Only read FCOE on 82599 */
1709 if (hw->mac.type != ixgbe_mac_82598EB) {
1710 stats->fcoerpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
1711 stats->fcoeprc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
1712 stats->fcoeptc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
1713 stats->fcoedwrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
1714 stats->fcoedwtc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
1715 }
1716
1717 /* Fill out the OS statistics structure */
1718 /*
1719 * NetBSD: Don't override if_{i|o}{packets|bytes|mcasts} with
1720 * adapter->stats counters. It's required to make ifconfig -z
1721 * (SOICZIFDATA) work.
1722 */
1723 ifp->if_collisions = 0;
1724
1725 /* Rx Errors */
1726 ifp->if_iqdrops += total_missed_rx;
1727 ifp->if_ierrors += crcerrs + rlec;
1728 } /* ixgbe_update_stats_counters */
1729
1730 /************************************************************************
1731 * ixgbe_add_hw_stats
1732 *
1733 * Add sysctl variables, one per statistic, to the system.
1734 ************************************************************************/
1735 static void
1736 ixgbe_add_hw_stats(struct adapter *adapter)
1737 {
1738 device_t dev = adapter->dev;
1739 const struct sysctlnode *rnode, *cnode;
1740 struct sysctllog **log = &adapter->sysctllog;
1741 struct tx_ring *txr = adapter->tx_rings;
1742 struct rx_ring *rxr = adapter->rx_rings;
1743 struct ixgbe_hw *hw = &adapter->hw;
1744 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1745 const char *xname = device_xname(dev);
1746 int i;
1747
1748 /* Driver Statistics */
1749 evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
1750 NULL, xname, "Driver tx dma soft fail EFBIG");
1751 evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
1752 NULL, xname, "m_defrag() failed");
1753 evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
1754 NULL, xname, "Driver tx dma hard fail EFBIG");
1755 evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
1756 NULL, xname, "Driver tx dma hard fail EINVAL");
1757 evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
1758 NULL, xname, "Driver tx dma hard fail other");
1759 evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
1760 NULL, xname, "Driver tx dma soft fail EAGAIN");
1761 evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
1762 NULL, xname, "Driver tx dma soft fail ENOMEM");
1763 evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
1764 NULL, xname, "Watchdog timeouts");
1765 evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
1766 NULL, xname, "TSO errors");
1767 evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_INTR,
1768 NULL, xname, "Link MSI-X IRQ Handled");
1769 evcnt_attach_dynamic(&adapter->link_sicount, EVCNT_TYPE_INTR,
1770 NULL, xname, "Link softint");
1771 evcnt_attach_dynamic(&adapter->mod_sicount, EVCNT_TYPE_INTR,
1772 NULL, xname, "module softint");
1773 evcnt_attach_dynamic(&adapter->msf_sicount, EVCNT_TYPE_INTR,
1774 NULL, xname, "multimode softint");
1775 evcnt_attach_dynamic(&adapter->phy_sicount, EVCNT_TYPE_INTR,
1776 NULL, xname, "external PHY softint");
1777
1778 /* Max number of traffic class is 8 */
1779 KASSERT(IXGBE_DCB_MAX_TRAFFIC_CLASS == 8);
1780 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1781 snprintf(adapter->tcs[i].evnamebuf,
1782 sizeof(adapter->tcs[i].evnamebuf), "%s tc%d",
1783 xname, i);
1784 if (i < __arraycount(stats->mpc)) {
1785 evcnt_attach_dynamic(&stats->mpc[i],
1786 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1787 "RX Missed Packet Count");
1788 if (hw->mac.type == ixgbe_mac_82598EB)
1789 evcnt_attach_dynamic(&stats->rnbc[i],
1790 EVCNT_TYPE_MISC, NULL,
1791 adapter->tcs[i].evnamebuf,
1792 "Receive No Buffers");
1793 }
1794 if (i < __arraycount(stats->pxontxc)) {
1795 evcnt_attach_dynamic(&stats->pxontxc[i],
1796 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1797 "pxontxc");
1798 evcnt_attach_dynamic(&stats->pxonrxc[i],
1799 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1800 "pxonrxc");
1801 evcnt_attach_dynamic(&stats->pxofftxc[i],
1802 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1803 "pxofftxc");
1804 evcnt_attach_dynamic(&stats->pxoffrxc[i],
1805 EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1806 "pxoffrxc");
1807 if (hw->mac.type >= ixgbe_mac_82599EB)
1808 evcnt_attach_dynamic(&stats->pxon2offc[i],
1809 EVCNT_TYPE_MISC, NULL,
1810 adapter->tcs[i].evnamebuf,
1811 "pxon2offc");
1812 }
1813 }
1814
1815 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
1816 #ifdef LRO
1817 struct lro_ctrl *lro = &rxr->lro;
1818 #endif /* LRO */
1819
1820 snprintf(adapter->queues[i].evnamebuf,
1821 sizeof(adapter->queues[i].evnamebuf), "%s q%d",
1822 xname, i);
1823 snprintf(adapter->queues[i].namebuf,
1824 sizeof(adapter->queues[i].namebuf), "q%d", i);
1825
1826 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
1827 aprint_error_dev(dev, "could not create sysctl root\n");
1828 break;
1829 }
1830
1831 if (sysctl_createv(log, 0, &rnode, &rnode,
1832 0, CTLTYPE_NODE,
1833 adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
1834 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
1835 break;
1836
1837 if (sysctl_createv(log, 0, &rnode, &cnode,
1838 CTLFLAG_READWRITE, CTLTYPE_INT,
1839 "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
1840 ixgbe_sysctl_interrupt_rate_handler, 0,
1841 (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
1842 break;
1843
1844 if (sysctl_createv(log, 0, &rnode, &cnode,
1845 CTLFLAG_READONLY, CTLTYPE_INT,
1846 "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
1847 ixgbe_sysctl_tdh_handler, 0, (void *)txr,
1848 0, CTL_CREATE, CTL_EOL) != 0)
1849 break;
1850
1851 if (sysctl_createv(log, 0, &rnode, &cnode,
1852 CTLFLAG_READONLY, CTLTYPE_INT,
1853 "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
1854 ixgbe_sysctl_tdt_handler, 0, (void *)txr,
1855 0, CTL_CREATE, CTL_EOL) != 0)
1856 break;
1857
1858 evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
1859 NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
1860 evcnt_attach_dynamic(&adapter->queues[i].handleq,
1861 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1862 "Handled queue in softint");
1863 evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
1864 NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
1865 evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
1866 NULL, adapter->queues[i].evnamebuf, "TSO");
1867 evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
1868 NULL, adapter->queues[i].evnamebuf,
1869 "Queue No Descriptor Available");
1870 evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
1871 NULL, adapter->queues[i].evnamebuf,
1872 "Queue Packets Transmitted");
1873 #ifndef IXGBE_LEGACY_TX
1874 evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
1875 NULL, adapter->queues[i].evnamebuf,
1876 "Packets dropped in pcq");
1877 #endif
1878
1879 if (sysctl_createv(log, 0, &rnode, &cnode,
1880 CTLFLAG_READONLY,
1881 CTLTYPE_INT,
1882 "rxd_nxck", SYSCTL_DESCR("Receive Descriptor next to check"),
1883 ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
1884 CTL_CREATE, CTL_EOL) != 0)
1885 break;
1886
1887 if (sysctl_createv(log, 0, &rnode, &cnode,
1888 CTLFLAG_READONLY,
1889 CTLTYPE_INT,
1890 "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
1891 ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
1892 CTL_CREATE, CTL_EOL) != 0)
1893 break;
1894
1895 if (sysctl_createv(log, 0, &rnode, &cnode,
1896 CTLFLAG_READONLY,
1897 CTLTYPE_INT,
1898 "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
1899 ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
1900 CTL_CREATE, CTL_EOL) != 0)
1901 break;
1902
1903 if (i < __arraycount(stats->qprc)) {
1904 evcnt_attach_dynamic(&stats->qprc[i],
1905 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1906 "qprc");
1907 evcnt_attach_dynamic(&stats->qptc[i],
1908 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1909 "qptc");
1910 evcnt_attach_dynamic(&stats->qbrc[i],
1911 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1912 "qbrc");
1913 evcnt_attach_dynamic(&stats->qbtc[i],
1914 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1915 "qbtc");
1916 if (hw->mac.type >= ixgbe_mac_82599EB)
1917 evcnt_attach_dynamic(&stats->qprdc[i],
1918 EVCNT_TYPE_MISC, NULL,
1919 adapter->queues[i].evnamebuf, "qprdc");
1920 }
1921
1922 evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
1923 NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
1924 evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
1925 NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
1926 evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
1927 NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
1928 evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
1929 NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
1930 evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
1931 NULL, adapter->queues[i].evnamebuf, "Rx discarded");
1932 #ifdef LRO
1933 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
1934 CTLFLAG_RD, &lro->lro_queued, 0,
1935 "LRO Queued");
1936 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
1937 CTLFLAG_RD, &lro->lro_flushed, 0,
1938 "LRO Flushed");
1939 #endif /* LRO */
1940 }
1941
1942 /* MAC stats get their own sub node */
1943
1944 snprintf(stats->namebuf,
1945 sizeof(stats->namebuf), "%s MAC Statistics", xname);
1946
1947 evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
1948 stats->namebuf, "rx csum offload - IP");
1949 evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
1950 stats->namebuf, "rx csum offload - L4");
1951 evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
1952 stats->namebuf, "rx csum offload - IP bad");
1953 evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
1954 stats->namebuf, "rx csum offload - L4 bad");
1955 evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
1956 stats->namebuf, "Interrupt conditions zero");
1957 evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
1958 stats->namebuf, "Legacy interrupts");
1959
1960 evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
1961 stats->namebuf, "CRC Errors");
1962 evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
1963 stats->namebuf, "Illegal Byte Errors");
1964 evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
1965 stats->namebuf, "Byte Errors");
1966 evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
1967 stats->namebuf, "MAC Short Packets Discarded");
1968 if (hw->mac.type >= ixgbe_mac_X550)
1969 evcnt_attach_dynamic(&stats->mbsdc, EVCNT_TYPE_MISC, NULL,
1970 stats->namebuf, "Bad SFD");
1971 evcnt_attach_dynamic(&stats->mpctotal, EVCNT_TYPE_MISC, NULL,
1972 stats->namebuf, "Total Packets Missed");
1973 evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
1974 stats->namebuf, "MAC Local Faults");
1975 evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
1976 stats->namebuf, "MAC Remote Faults");
1977 evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
1978 stats->namebuf, "Receive Length Errors");
1979 evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
1980 stats->namebuf, "Link XON Transmitted");
1981 evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
1982 stats->namebuf, "Link XON Received");
1983 evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
1984 stats->namebuf, "Link XOFF Transmitted");
1985 evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
1986 stats->namebuf, "Link XOFF Received");
1987
1988 /* Packet Reception Stats */
1989 evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
1990 stats->namebuf, "Total Octets Received");
1991 evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
1992 stats->namebuf, "Good Octets Received");
1993 evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
1994 stats->namebuf, "Total Packets Received");
1995 evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
1996 stats->namebuf, "Good Packets Received");
1997 evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
1998 stats->namebuf, "Multicast Packets Received");
1999 evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
2000 stats->namebuf, "Broadcast Packets Received");
2001 evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
2002 stats->namebuf, "64 byte frames received ");
2003 evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
2004 stats->namebuf, "65-127 byte frames received");
2005 evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
2006 stats->namebuf, "128-255 byte frames received");
2007 evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
2008 stats->namebuf, "256-511 byte frames received");
2009 evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
2010 stats->namebuf, "512-1023 byte frames received");
2011 evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
2012 stats->namebuf, "1023-1522 byte frames received");
2013 evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
2014 stats->namebuf, "Receive Undersized");
2015 evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
2016 stats->namebuf, "Fragmented Packets Received ");
2017 evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
2018 stats->namebuf, "Oversized Packets Received");
2019 evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
2020 stats->namebuf, "Received Jabber");
2021 evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
2022 stats->namebuf, "Management Packets Received");
2023 evcnt_attach_dynamic(&stats->mngpdc, EVCNT_TYPE_MISC, NULL,
2024 stats->namebuf, "Management Packets Dropped");
2025 evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
2026 stats->namebuf, "Checksum Errors");
2027
2028 /* Packet Transmission Stats */
2029 evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
2030 stats->namebuf, "Good Octets Transmitted");
2031 evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
2032 stats->namebuf, "Total Packets Transmitted");
2033 evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
2034 stats->namebuf, "Good Packets Transmitted");
2035 evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
2036 stats->namebuf, "Broadcast Packets Transmitted");
2037 evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
2038 stats->namebuf, "Multicast Packets Transmitted");
2039 evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
2040 stats->namebuf, "Management Packets Transmitted");
2041 evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
2042 stats->namebuf, "64 byte frames transmitted ");
2043 evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
2044 stats->namebuf, "65-127 byte frames transmitted");
2045 evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
2046 stats->namebuf, "128-255 byte frames transmitted");
2047 evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
2048 stats->namebuf, "256-511 byte frames transmitted");
2049 evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
2050 stats->namebuf, "512-1023 byte frames transmitted");
2051 evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
2052 stats->namebuf, "1024-1522 byte frames transmitted");
2053 } /* ixgbe_add_hw_stats */
2054
2055 static void
2056 ixgbe_clear_evcnt(struct adapter *adapter)
2057 {
2058 struct tx_ring *txr = adapter->tx_rings;
2059 struct rx_ring *rxr = adapter->rx_rings;
2060 struct ixgbe_hw *hw = &adapter->hw;
2061 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
2062 int i;
2063
2064 adapter->efbig_tx_dma_setup.ev_count = 0;
2065 adapter->mbuf_defrag_failed.ev_count = 0;
2066 adapter->efbig2_tx_dma_setup.ev_count = 0;
2067 adapter->einval_tx_dma_setup.ev_count = 0;
2068 adapter->other_tx_dma_setup.ev_count = 0;
2069 adapter->eagain_tx_dma_setup.ev_count = 0;
2070 adapter->enomem_tx_dma_setup.ev_count = 0;
2071 adapter->tso_err.ev_count = 0;
2072 adapter->watchdog_events.ev_count = 0;
2073 adapter->link_irq.ev_count = 0;
2074 adapter->link_sicount.ev_count = 0;
2075 adapter->mod_sicount.ev_count = 0;
2076 adapter->msf_sicount.ev_count = 0;
2077 adapter->phy_sicount.ev_count = 0;
2078
2079 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
2080 if (i < __arraycount(stats->mpc)) {
2081 stats->mpc[i].ev_count = 0;
2082 if (hw->mac.type == ixgbe_mac_82598EB)
2083 stats->rnbc[i].ev_count = 0;
2084 }
2085 if (i < __arraycount(stats->pxontxc)) {
2086 stats->pxontxc[i].ev_count = 0;
2087 stats->pxonrxc[i].ev_count = 0;
2088 stats->pxofftxc[i].ev_count = 0;
2089 stats->pxoffrxc[i].ev_count = 0;
2090 if (hw->mac.type >= ixgbe_mac_82599EB)
2091 stats->pxon2offc[i].ev_count = 0;
2092 }
2093 }
2094
2095 txr = adapter->tx_rings;
2096 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
2097 adapter->queues[i].irqs.ev_count = 0;
2098 adapter->queues[i].handleq.ev_count = 0;
2099 adapter->queues[i].req.ev_count = 0;
2100 txr->no_desc_avail.ev_count = 0;
2101 txr->total_packets.ev_count = 0;
2102 txr->tso_tx.ev_count = 0;
2103 #ifndef IXGBE_LEGACY_TX
2104 txr->pcq_drops.ev_count = 0;
2105 #endif
2106 txr->q_efbig_tx_dma_setup = 0;
2107 txr->q_mbuf_defrag_failed = 0;
2108 txr->q_efbig2_tx_dma_setup = 0;
2109 txr->q_einval_tx_dma_setup = 0;
2110 txr->q_other_tx_dma_setup = 0;
2111 txr->q_eagain_tx_dma_setup = 0;
2112 txr->q_enomem_tx_dma_setup = 0;
2113 txr->q_tso_err = 0;
2114
2115 if (i < __arraycount(stats->qprc)) {
2116 stats->qprc[i].ev_count = 0;
2117 stats->qptc[i].ev_count = 0;
2118 stats->qbrc[i].ev_count = 0;
2119 stats->qbtc[i].ev_count = 0;
2120 if (hw->mac.type >= ixgbe_mac_82599EB)
2121 stats->qprdc[i].ev_count = 0;
2122 }
2123
2124 rxr->rx_packets.ev_count = 0;
2125 rxr->rx_bytes.ev_count = 0;
2126 rxr->rx_copies.ev_count = 0;
2127 rxr->no_jmbuf.ev_count = 0;
2128 rxr->rx_discarded.ev_count = 0;
2129 }
2130 stats->ipcs.ev_count = 0;
2131 stats->l4cs.ev_count = 0;
2132 stats->ipcs_bad.ev_count = 0;
2133 stats->l4cs_bad.ev_count = 0;
2134 stats->intzero.ev_count = 0;
2135 stats->legint.ev_count = 0;
2136 stats->crcerrs.ev_count = 0;
2137 stats->illerrc.ev_count = 0;
2138 stats->errbc.ev_count = 0;
2139 stats->mspdc.ev_count = 0;
2140 stats->mbsdc.ev_count = 0;
2141 stats->mpctotal.ev_count = 0;
2142 stats->mlfc.ev_count = 0;
2143 stats->mrfc.ev_count = 0;
2144 stats->rlec.ev_count = 0;
2145 stats->lxontxc.ev_count = 0;
2146 stats->lxonrxc.ev_count = 0;
2147 stats->lxofftxc.ev_count = 0;
2148 stats->lxoffrxc.ev_count = 0;
2149
2150 /* Packet Reception Stats */
2151 stats->tor.ev_count = 0;
2152 stats->gorc.ev_count = 0;
2153 stats->tpr.ev_count = 0;
2154 stats->gprc.ev_count = 0;
2155 stats->mprc.ev_count = 0;
2156 stats->bprc.ev_count = 0;
2157 stats->prc64.ev_count = 0;
2158 stats->prc127.ev_count = 0;
2159 stats->prc255.ev_count = 0;
2160 stats->prc511.ev_count = 0;
2161 stats->prc1023.ev_count = 0;
2162 stats->prc1522.ev_count = 0;
2163 stats->ruc.ev_count = 0;
2164 stats->rfc.ev_count = 0;
2165 stats->roc.ev_count = 0;
2166 stats->rjc.ev_count = 0;
2167 stats->mngprc.ev_count = 0;
2168 stats->mngpdc.ev_count = 0;
2169 stats->xec.ev_count = 0;
2170
2171 /* Packet Transmission Stats */
2172 stats->gotc.ev_count = 0;
2173 stats->tpt.ev_count = 0;
2174 stats->gptc.ev_count = 0;
2175 stats->bptc.ev_count = 0;
2176 stats->mptc.ev_count = 0;
2177 stats->mngptc.ev_count = 0;
2178 stats->ptc64.ev_count = 0;
2179 stats->ptc127.ev_count = 0;
2180 stats->ptc255.ev_count = 0;
2181 stats->ptc511.ev_count = 0;
2182 stats->ptc1023.ev_count = 0;
2183 stats->ptc1522.ev_count = 0;
2184 }
2185
2186 /************************************************************************
2187 * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
2188 *
2189 * Retrieves the TDH value from the hardware
2190 ************************************************************************/
2191 static int
2192 ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
2193 {
2194 struct sysctlnode node = *rnode;
2195 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2196 struct adapter *adapter;
2197 uint32_t val;
2198
2199 if (!txr)
2200 return (0);
2201
2202 adapter = txr->adapter;
2203 if (ixgbe_fw_recovery_mode_swflag(adapter))
2204 return (EPERM);
2205
2206 val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me));
2207 node.sysctl_data = &val;
2208 return sysctl_lookup(SYSCTLFN_CALL(&node));
2209 } /* ixgbe_sysctl_tdh_handler */
2210
2211 /************************************************************************
2212 * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
2213 *
2214 * Retrieves the TDT value from the hardware
2215 ************************************************************************/
2216 static int
2217 ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
2218 {
2219 struct sysctlnode node = *rnode;
2220 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2221 struct adapter *adapter;
2222 uint32_t val;
2223
2224 if (!txr)
2225 return (0);
2226
2227 adapter = txr->adapter;
2228 if (ixgbe_fw_recovery_mode_swflag(adapter))
2229 return (EPERM);
2230
2231 val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me));
2232 node.sysctl_data = &val;
2233 return sysctl_lookup(SYSCTLFN_CALL(&node));
2234 } /* ixgbe_sysctl_tdt_handler */
2235
2236 /************************************************************************
2237 * ixgbe_sysctl_next_to_check_handler - Receive Descriptor next to check
2238 * handler function
2239 *
2240 * Retrieves the next_to_check value
2241 ************************************************************************/
2242 static int
2243 ixgbe_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
2244 {
2245 struct sysctlnode node = *rnode;
2246 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2247 struct adapter *adapter;
2248 uint32_t val;
2249
2250 if (!rxr)
2251 return (0);
2252
2253 adapter = rxr->adapter;
2254 if (ixgbe_fw_recovery_mode_swflag(adapter))
2255 return (EPERM);
2256
2257 val = rxr->next_to_check;
2258 node.sysctl_data = &val;
2259 return sysctl_lookup(SYSCTLFN_CALL(&node));
2260 } /* ixgbe_sysctl_next_to_check_handler */
2261
2262 /************************************************************************
2263 * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
2264 *
2265 * Retrieves the RDH value from the hardware
2266 ************************************************************************/
2267 static int
2268 ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
2269 {
2270 struct sysctlnode node = *rnode;
2271 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2272 struct adapter *adapter;
2273 uint32_t val;
2274
2275 if (!rxr)
2276 return (0);
2277
2278 adapter = rxr->adapter;
2279 if (ixgbe_fw_recovery_mode_swflag(adapter))
2280 return (EPERM);
2281
2282 val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDH(rxr->me));
2283 node.sysctl_data = &val;
2284 return sysctl_lookup(SYSCTLFN_CALL(&node));
2285 } /* ixgbe_sysctl_rdh_handler */
2286
2287 /************************************************************************
2288 * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
2289 *
2290 * Retrieves the RDT value from the hardware
2291 ************************************************************************/
2292 static int
2293 ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
2294 {
2295 struct sysctlnode node = *rnode;
2296 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2297 struct adapter *adapter;
2298 uint32_t val;
2299
2300 if (!rxr)
2301 return (0);
2302
2303 adapter = rxr->adapter;
2304 if (ixgbe_fw_recovery_mode_swflag(adapter))
2305 return (EPERM);
2306
2307 val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDT(rxr->me));
2308 node.sysctl_data = &val;
2309 return sysctl_lookup(SYSCTLFN_CALL(&node));
2310 } /* ixgbe_sysctl_rdt_handler */
2311
2312 #if 0 /* XXX Badly need to overhaul vlan(4) on NetBSD. */
2313 /************************************************************************
2314 * ixgbe_register_vlan
2315 *
2316 * Run via vlan config EVENT, it enables us to use the
2317 * HW Filter table since we can get the vlan id. This
2318 * just creates the entry in the soft version of the
2319 * VFTA, init will repopulate the real table.
2320 ************************************************************************/
2321 static void
2322 ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
2323 {
2324 struct adapter *adapter = ifp->if_softc;
2325 u16 index, bit;
2326
2327 if (ifp->if_softc != arg) /* Not our event */
2328 return;
2329
2330 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2331 return;
2332
2333 IXGBE_CORE_LOCK(adapter);
2334 index = (vtag >> 5) & 0x7F;
2335 bit = vtag & 0x1F;
2336 adapter->shadow_vfta[index] |= (1 << bit);
2337 ixgbe_setup_vlan_hw_support(adapter);
2338 IXGBE_CORE_UNLOCK(adapter);
2339 } /* ixgbe_register_vlan */
2340
2341 /************************************************************************
2342 * ixgbe_unregister_vlan
2343 *
2344 * Run via vlan unconfig EVENT, remove our entry in the soft vfta.
2345 ************************************************************************/
2346 static void
2347 ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
2348 {
2349 struct adapter *adapter = ifp->if_softc;
2350 u16 index, bit;
2351
2352 if (ifp->if_softc != arg)
2353 return;
2354
2355 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2356 return;
2357
2358 IXGBE_CORE_LOCK(adapter);
2359 index = (vtag >> 5) & 0x7F;
2360 bit = vtag & 0x1F;
2361 adapter->shadow_vfta[index] &= ~(1 << bit);
2362 /* Re-init to load the changes */
2363 ixgbe_setup_vlan_hw_support(adapter);
2364 IXGBE_CORE_UNLOCK(adapter);
2365 } /* ixgbe_unregister_vlan */
2366 #endif
2367
2368 static void
2369 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
2370 {
2371 struct ethercom *ec = &adapter->osdep.ec;
2372 struct ixgbe_hw *hw = &adapter->hw;
2373 struct rx_ring *rxr;
2374 int i;
2375 u32 ctrl;
2376 bool hwtagging;
2377
2378 /*
2379 * This function is called from both if_init and ifflags_cb()
2380 * on NetBSD.
2381 */
2382
2383 /* Enable HW tagging only if any vlan is attached */
2384 hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
2385 && VLAN_ATTACHED(ec);
2386
2387 /* Setup the queues for vlans */
2388 for (i = 0; i < adapter->num_queues; i++) {
2389 rxr = &adapter->rx_rings[i];
2390 /*
2391 * On 82599 and later, the VLAN enable is per/queue in RXDCTL.
2392 */
2393 if (hw->mac.type != ixgbe_mac_82598EB) {
2394 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
2395 if (hwtagging)
2396 ctrl |= IXGBE_RXDCTL_VME;
2397 else
2398 ctrl &= ~IXGBE_RXDCTL_VME;
2399 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
2400 }
2401 rxr->vtag_strip = hwtagging ? TRUE : FALSE;
2402 }
2403
2404 /*
2405 * A soft reset zero's out the VFTA, so
2406 * we need to repopulate it now.
2407 */
2408 for (i = 0; i < IXGBE_VFTA_SIZE; i++)
2409 if (adapter->shadow_vfta[i] != 0)
2410 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
2411 adapter->shadow_vfta[i]);
2412
2413 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2414 /* Enable the Filter Table if enabled */
2415 if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER)
2416 ctrl |= IXGBE_VLNCTRL_VFE;
2417 else
2418 ctrl &= ~IXGBE_VLNCTRL_VFE;
2419 /* VLAN hw tagging for 82598 */
2420 if (hw->mac.type == ixgbe_mac_82598EB) {
2421 if (hwtagging)
2422 ctrl |= IXGBE_VLNCTRL_VME;
2423 else
2424 ctrl &= ~IXGBE_VLNCTRL_VME;
2425 }
2426 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
2427 } /* ixgbe_setup_vlan_hw_support */
2428
2429 /************************************************************************
2430 * ixgbe_get_slot_info
2431 *
2432 * Get the width and transaction speed of
2433 * the slot this adapter is plugged into.
2434 ************************************************************************/
2435 static void
2436 ixgbe_get_slot_info(struct adapter *adapter)
2437 {
2438 device_t dev = adapter->dev;
2439 struct ixgbe_hw *hw = &adapter->hw;
2440 u32 offset;
2441 u16 link;
2442 int bus_info_valid = TRUE;
2443
2444 /* Some devices are behind an internal bridge */
2445 switch (hw->device_id) {
2446 case IXGBE_DEV_ID_82599_SFP_SF_QP:
2447 case IXGBE_DEV_ID_82599_QSFP_SF_QP:
2448 goto get_parent_info;
2449 default:
2450 break;
2451 }
2452
2453 ixgbe_get_bus_info(hw);
2454
2455 /*
2456 * Some devices don't use PCI-E, but there is no need
2457 * to display "Unknown" for bus speed and width.
2458 */
2459 switch (hw->mac.type) {
2460 case ixgbe_mac_X550EM_x:
2461 case ixgbe_mac_X550EM_a:
2462 return;
2463 default:
2464 goto display;
2465 }
2466
2467 get_parent_info:
2468 /*
2469 * For the Quad port adapter we need to parse back
2470 * up the PCI tree to find the speed of the expansion
2471 * slot into which this adapter is plugged. A bit more work.
2472 */
2473 dev = device_parent(device_parent(dev));
2474 #if 0
2475 #ifdef IXGBE_DEBUG
2476 device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
2477 pci_get_slot(dev), pci_get_function(dev));
2478 #endif
2479 dev = device_parent(device_parent(dev));
2480 #ifdef IXGBE_DEBUG
2481 device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
2482 pci_get_slot(dev), pci_get_function(dev));
2483 #endif
2484 #endif
2485 /* Now get the PCI Express Capabilities offset */
2486 if (pci_get_capability(adapter->osdep.pc, adapter->osdep.tag,
2487 PCI_CAP_PCIEXPRESS, &offset, NULL)) {
2488 /*
2489 * Hmm...can't get PCI-Express capabilities.
2490 * Falling back to default method.
2491 */
2492 bus_info_valid = FALSE;
2493 ixgbe_get_bus_info(hw);
2494 goto display;
2495 }
2496 /* ...and read the Link Status Register */
2497 link = pci_conf_read(adapter->osdep.pc, adapter->osdep.tag,
2498 offset + PCIE_LCSR) >> 16;
2499 ixgbe_set_pci_config_data_generic(hw, link);
2500
2501 display:
2502 device_printf(dev, "PCI Express Bus: Speed %s Width %s\n",
2503 ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s" :
2504 (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s" :
2505 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s" :
2506 "Unknown"),
2507 ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "x8" :
2508 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "x4" :
2509 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "x1" :
2510 "Unknown"));
2511
2512 if (bus_info_valid) {
2513 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2514 ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
2515 (hw->bus.speed == ixgbe_bus_speed_2500))) {
2516 device_printf(dev, "PCI-Express bandwidth available"
2517 " for this card\n is not sufficient for"
2518 " optimal performance.\n");
2519 device_printf(dev, "For optimal performance a x8 "
2520 "PCIE, or x4 PCIE Gen2 slot is required.\n");
2521 }
2522 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2523 ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
2524 (hw->bus.speed < ixgbe_bus_speed_8000))) {
2525 device_printf(dev, "PCI-Express bandwidth available"
2526 " for this card\n is not sufficient for"
2527 " optimal performance.\n");
2528 device_printf(dev, "For optimal performance a x8 "
2529 "PCIE Gen3 slot is required.\n");
2530 }
2531 } else
2532 device_printf(dev, "Unable to determine slot speed/width. The speed/width reported are that of the internal switch.\n");
2533
2534 return;
2535 } /* ixgbe_get_slot_info */
2536
2537 /************************************************************************
2538 * ixgbe_enable_queue - MSI-X Interrupt Handlers and Tasklets
2539 ************************************************************************/
2540 static inline void
2541 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
2542 {
2543 struct ixgbe_hw *hw = &adapter->hw;
2544 struct ix_queue *que = &adapter->queues[vector];
2545 u64 queue = (u64)(1ULL << vector);
2546 u32 mask;
2547
2548 mutex_enter(&que->dc_mtx);
2549 if (que->disabled_count > 0 && --que->disabled_count > 0)
2550 goto out;
2551
2552 if (hw->mac.type == ixgbe_mac_82598EB) {
2553 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2554 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
2555 } else {
2556 mask = (queue & 0xFFFFFFFF);
2557 if (mask)
2558 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
2559 mask = (queue >> 32);
2560 if (mask)
2561 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
2562 }
2563 out:
2564 mutex_exit(&que->dc_mtx);
2565 } /* ixgbe_enable_queue */
2566
2567 /************************************************************************
2568 * ixgbe_disable_queue_internal
2569 ************************************************************************/
2570 static inline void
2571 ixgbe_disable_queue_internal(struct adapter *adapter, u32 vector, bool nestok)
2572 {
2573 struct ixgbe_hw *hw = &adapter->hw;
2574 struct ix_queue *que = &adapter->queues[vector];
2575 u64 queue = (u64)(1ULL << vector);
2576 u32 mask;
2577
2578 mutex_enter(&que->dc_mtx);
2579
2580 if (que->disabled_count > 0) {
2581 if (nestok)
2582 que->disabled_count++;
2583 goto out;
2584 }
2585 que->disabled_count++;
2586
2587 if (hw->mac.type == ixgbe_mac_82598EB) {
2588 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2589 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
2590 } else {
2591 mask = (queue & 0xFFFFFFFF);
2592 if (mask)
2593 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
2594 mask = (queue >> 32);
2595 if (mask)
2596 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
2597 }
2598 out:
2599 mutex_exit(&que->dc_mtx);
2600 } /* ixgbe_disable_queue_internal */
2601
2602 /************************************************************************
2603 * ixgbe_disable_queue
2604 ************************************************************************/
2605 static inline void
2606 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
2607 {
2608
2609 ixgbe_disable_queue_internal(adapter, vector, true);
2610 } /* ixgbe_disable_queue */
2611
2612 /************************************************************************
2613 * ixgbe_sched_handle_que - schedule deferred packet processing
2614 ************************************************************************/
2615 static inline void
2616 ixgbe_sched_handle_que(struct adapter *adapter, struct ix_queue *que)
2617 {
2618
2619 if (que->txrx_use_workqueue) {
2620 /*
2621 * adapter->que_wq is bound to each CPU instead of
2622 * each NIC queue to reduce workqueue kthread. As we
2623 * should consider about interrupt affinity in this
2624 * function, the workqueue kthread must be WQ_PERCPU.
2625 * If create WQ_PERCPU workqueue kthread for each NIC
2626 * queue, that number of created workqueue kthread is
2627 * (number of used NIC queue) * (number of CPUs) =
2628 * (number of CPUs) ^ 2 most often.
2629 *
2630 * The same NIC queue's interrupts are avoided by
2631 * masking the queue's interrupt. And different
2632 * NIC queue's interrupts use different struct work
2633 * (que->wq_cookie). So, "enqueued flag" to avoid
2634 * twice workqueue_enqueue() is not required .
2635 */
2636 workqueue_enqueue(adapter->que_wq, &que->wq_cookie, curcpu());
2637 } else {
2638 softint_schedule(que->que_si);
2639 }
2640 }
2641
2642 /************************************************************************
2643 * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2644 ************************************************************************/
2645 static int
2646 ixgbe_msix_que(void *arg)
2647 {
2648 struct ix_queue *que = arg;
2649 struct adapter *adapter = que->adapter;
2650 struct ifnet *ifp = adapter->ifp;
2651 struct tx_ring *txr = que->txr;
2652 struct rx_ring *rxr = que->rxr;
2653 bool more;
2654 u32 newitr = 0;
2655
2656 /* Protect against spurious interrupts */
2657 if ((ifp->if_flags & IFF_RUNNING) == 0)
2658 return 0;
2659
2660 ixgbe_disable_queue(adapter, que->msix);
2661 ++que->irqs.ev_count;
2662
2663 /*
2664 * Don't change "que->txrx_use_workqueue" from this point to avoid
2665 * flip-flopping softint/workqueue mode in one deferred processing.
2666 */
2667 que->txrx_use_workqueue = adapter->txrx_use_workqueue;
2668
2669 #ifdef __NetBSD__
2670 /* Don't run ixgbe_rxeof in interrupt context */
2671 more = true;
2672 #else
2673 more = ixgbe_rxeof(que);
2674 #endif
2675
2676 IXGBE_TX_LOCK(txr);
2677 ixgbe_txeof(txr);
2678 IXGBE_TX_UNLOCK(txr);
2679
2680 /* Do AIM now? */
2681
2682 if (adapter->enable_aim == false)
2683 goto no_calc;
2684 /*
2685 * Do Adaptive Interrupt Moderation:
2686 * - Write out last calculated setting
2687 * - Calculate based on average size over
2688 * the last interval.
2689 */
2690 if (que->eitr_setting)
2691 ixgbe_eitr_write(adapter, que->msix, que->eitr_setting);
2692
2693 que->eitr_setting = 0;
2694
2695 /* Idle, do nothing */
2696 if ((txr->bytes == 0) && (rxr->bytes == 0))
2697 goto no_calc;
2698
2699 if ((txr->bytes) && (txr->packets))
2700 newitr = txr->bytes/txr->packets;
2701 if ((rxr->bytes) && (rxr->packets))
2702 newitr = max(newitr, (rxr->bytes / rxr->packets));
2703 newitr += 24; /* account for hardware frame, crc */
2704
2705 /* set an upper boundary */
2706 newitr = min(newitr, 3000);
2707
2708 /* Be nice to the mid range */
2709 if ((newitr > 300) && (newitr < 1200))
2710 newitr = (newitr / 3);
2711 else
2712 newitr = (newitr / 2);
2713
2714 /*
2715 * When RSC is used, ITR interval must be larger than RSC_DELAY.
2716 * Currently, we use 2us for RSC_DELAY. The minimum value is always
2717 * greater than 2us on 100M (and 10M?(not documented)), but it's not
2718 * on 1G and higher.
2719 */
2720 if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
2721 && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
2722 if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
2723 newitr = IXGBE_MIN_RSC_EITR_10G1G;
2724 }
2725
2726 /* save for next interrupt */
2727 que->eitr_setting = newitr;
2728
2729 /* Reset state */
2730 txr->bytes = 0;
2731 txr->packets = 0;
2732 rxr->bytes = 0;
2733 rxr->packets = 0;
2734
2735 no_calc:
2736 if (more)
2737 ixgbe_sched_handle_que(adapter, que);
2738 else
2739 ixgbe_enable_queue(adapter, que->msix);
2740
2741 return 1;
2742 } /* ixgbe_msix_que */
2743
2744 /************************************************************************
2745 * ixgbe_media_status - Media Ioctl callback
2746 *
2747 * Called whenever the user queries the status of
2748 * the interface using ifconfig.
2749 ************************************************************************/
2750 static void
2751 ixgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2752 {
2753 struct adapter *adapter = ifp->if_softc;
2754 struct ixgbe_hw *hw = &adapter->hw;
2755 int layer;
2756
2757 INIT_DEBUGOUT("ixgbe_media_status: begin");
2758 IXGBE_CORE_LOCK(adapter);
2759 ixgbe_update_link_status(adapter);
2760
2761 ifmr->ifm_status = IFM_AVALID;
2762 ifmr->ifm_active = IFM_ETHER;
2763
2764 if (adapter->link_active != LINK_STATE_UP) {
2765 ifmr->ifm_active |= IFM_NONE;
2766 IXGBE_CORE_UNLOCK(adapter);
2767 return;
2768 }
2769
2770 ifmr->ifm_status |= IFM_ACTIVE;
2771 layer = adapter->phy_layer;
2772
2773 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2774 layer & IXGBE_PHYSICAL_LAYER_5GBASE_T ||
2775 layer & IXGBE_PHYSICAL_LAYER_2500BASE_T ||
2776 layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2777 layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2778 layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2779 switch (adapter->link_speed) {
2780 case IXGBE_LINK_SPEED_10GB_FULL:
2781 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2782 break;
2783 case IXGBE_LINK_SPEED_5GB_FULL:
2784 ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
2785 break;
2786 case IXGBE_LINK_SPEED_2_5GB_FULL:
2787 ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
2788 break;
2789 case IXGBE_LINK_SPEED_1GB_FULL:
2790 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2791 break;
2792 case IXGBE_LINK_SPEED_100_FULL:
2793 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2794 break;
2795 case IXGBE_LINK_SPEED_10_FULL:
2796 ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2797 break;
2798 }
2799 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2800 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2801 switch (adapter->link_speed) {
2802 case IXGBE_LINK_SPEED_10GB_FULL:
2803 ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2804 break;
2805 }
2806 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2807 switch (adapter->link_speed) {
2808 case IXGBE_LINK_SPEED_10GB_FULL:
2809 ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2810 break;
2811 case IXGBE_LINK_SPEED_1GB_FULL:
2812 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2813 break;
2814 }
2815 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2816 switch (adapter->link_speed) {
2817 case IXGBE_LINK_SPEED_10GB_FULL:
2818 ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2819 break;
2820 case IXGBE_LINK_SPEED_1GB_FULL:
2821 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2822 break;
2823 }
2824 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2825 layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2826 switch (adapter->link_speed) {
2827 case IXGBE_LINK_SPEED_10GB_FULL:
2828 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2829 break;
2830 case IXGBE_LINK_SPEED_1GB_FULL:
2831 ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2832 break;
2833 }
2834 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2835 switch (adapter->link_speed) {
2836 case IXGBE_LINK_SPEED_10GB_FULL:
2837 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2838 break;
2839 }
2840 /*
2841 * XXX: These need to use the proper media types once
2842 * they're added.
2843 */
2844 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2845 switch (adapter->link_speed) {
2846 case IXGBE_LINK_SPEED_10GB_FULL:
2847 #ifndef IFM_ETH_XTYPE
2848 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2849 #else
2850 ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2851 #endif
2852 break;
2853 case IXGBE_LINK_SPEED_2_5GB_FULL:
2854 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2855 break;
2856 case IXGBE_LINK_SPEED_1GB_FULL:
2857 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2858 break;
2859 }
2860 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2861 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2862 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2863 switch (adapter->link_speed) {
2864 case IXGBE_LINK_SPEED_10GB_FULL:
2865 #ifndef IFM_ETH_XTYPE
2866 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2867 #else
2868 ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
2869 #endif
2870 break;
2871 case IXGBE_LINK_SPEED_2_5GB_FULL:
2872 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2873 break;
2874 case IXGBE_LINK_SPEED_1GB_FULL:
2875 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2876 break;
2877 }
2878
2879 /* If nothing is recognized... */
2880 #if 0
2881 if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
2882 ifmr->ifm_active |= IFM_UNKNOWN;
2883 #endif
2884
2885 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
2886
2887 /* Display current flow control setting used on link */
2888 if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
2889 hw->fc.current_mode == ixgbe_fc_full)
2890 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
2891 if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
2892 hw->fc.current_mode == ixgbe_fc_full)
2893 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
2894
2895 IXGBE_CORE_UNLOCK(adapter);
2896
2897 return;
2898 } /* ixgbe_media_status */
2899
2900 /************************************************************************
2901 * ixgbe_media_change - Media Ioctl callback
2902 *
2903 * Called when the user changes speed/duplex using
2904 * media/mediopt option with ifconfig.
2905 ************************************************************************/
2906 static int
2907 ixgbe_media_change(struct ifnet *ifp)
2908 {
2909 struct adapter *adapter = ifp->if_softc;
2910 struct ifmedia *ifm = &adapter->media;
2911 struct ixgbe_hw *hw = &adapter->hw;
2912 ixgbe_link_speed speed = 0;
2913 ixgbe_link_speed link_caps = 0;
2914 bool negotiate = false;
2915 s32 err = IXGBE_NOT_IMPLEMENTED;
2916
2917 INIT_DEBUGOUT("ixgbe_media_change: begin");
2918
2919 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
2920 return (EINVAL);
2921
2922 if (hw->phy.media_type == ixgbe_media_type_backplane)
2923 return (EPERM);
2924
2925 IXGBE_CORE_LOCK(adapter);
2926 /*
2927 * We don't actually need to check against the supported
2928 * media types of the adapter; ifmedia will take care of
2929 * that for us.
2930 */
2931 switch (IFM_SUBTYPE(ifm->ifm_media)) {
2932 case IFM_AUTO:
2933 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
2934 &negotiate);
2935 if (err != IXGBE_SUCCESS) {
2936 device_printf(adapter->dev, "Unable to determine "
2937 "supported advertise speeds\n");
2938 IXGBE_CORE_UNLOCK(adapter);
2939 return (ENODEV);
2940 }
2941 speed |= link_caps;
2942 break;
2943 case IFM_10G_T:
2944 case IFM_10G_LRM:
2945 case IFM_10G_LR:
2946 case IFM_10G_TWINAX:
2947 case IFM_10G_SR:
2948 case IFM_10G_CX4:
2949 #ifdef IFM_ETH_XTYPE
2950 case IFM_10G_KR:
2951 case IFM_10G_KX4:
2952 #endif
2953 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2954 break;
2955 case IFM_5000_T:
2956 speed |= IXGBE_LINK_SPEED_5GB_FULL;
2957 break;
2958 case IFM_2500_T:
2959 case IFM_2500_KX:
2960 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
2961 break;
2962 case IFM_1000_T:
2963 case IFM_1000_LX:
2964 case IFM_1000_SX:
2965 case IFM_1000_KX:
2966 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2967 break;
2968 case IFM_100_TX:
2969 speed |= IXGBE_LINK_SPEED_100_FULL;
2970 break;
2971 case IFM_10_T:
2972 speed |= IXGBE_LINK_SPEED_10_FULL;
2973 break;
2974 case IFM_NONE:
2975 break;
2976 default:
2977 goto invalid;
2978 }
2979
2980 hw->mac.autotry_restart = TRUE;
2981 hw->mac.ops.setup_link(hw, speed, TRUE);
2982 adapter->advertise = 0;
2983 if (IFM_SUBTYPE(ifm->ifm_media) != IFM_AUTO) {
2984 if ((speed & IXGBE_LINK_SPEED_10GB_FULL) != 0)
2985 adapter->advertise |= 1 << 2;
2986 if ((speed & IXGBE_LINK_SPEED_1GB_FULL) != 0)
2987 adapter->advertise |= 1 << 1;
2988 if ((speed & IXGBE_LINK_SPEED_100_FULL) != 0)
2989 adapter->advertise |= 1 << 0;
2990 if ((speed & IXGBE_LINK_SPEED_10_FULL) != 0)
2991 adapter->advertise |= 1 << 3;
2992 if ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) != 0)
2993 adapter->advertise |= 1 << 4;
2994 if ((speed & IXGBE_LINK_SPEED_5GB_FULL) != 0)
2995 adapter->advertise |= 1 << 5;
2996 }
2997
2998 IXGBE_CORE_UNLOCK(adapter);
2999 return (0);
3000
3001 invalid:
3002 device_printf(adapter->dev, "Invalid media type!\n");
3003 IXGBE_CORE_UNLOCK(adapter);
3004
3005 return (EINVAL);
3006 } /* ixgbe_media_change */
3007
3008 /************************************************************************
3009 * ixgbe_set_promisc
3010 ************************************************************************/
3011 static void
3012 ixgbe_set_promisc(struct adapter *adapter)
3013 {
3014 struct ifnet *ifp = adapter->ifp;
3015 int mcnt = 0;
3016 u32 rctl;
3017 struct ether_multi *enm;
3018 struct ether_multistep step;
3019 struct ethercom *ec = &adapter->osdep.ec;
3020
3021 KASSERT(mutex_owned(&adapter->core_mtx));
3022 rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
3023 rctl &= (~IXGBE_FCTRL_UPE);
3024 if (ifp->if_flags & IFF_ALLMULTI)
3025 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
3026 else {
3027 ETHER_LOCK(ec);
3028 ETHER_FIRST_MULTI(step, ec, enm);
3029 while (enm != NULL) {
3030 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
3031 break;
3032 mcnt++;
3033 ETHER_NEXT_MULTI(step, enm);
3034 }
3035 ETHER_UNLOCK(ec);
3036 }
3037 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
3038 rctl &= (~IXGBE_FCTRL_MPE);
3039 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
3040
3041 if (ifp->if_flags & IFF_PROMISC) {
3042 rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3043 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
3044 } else if (ifp->if_flags & IFF_ALLMULTI) {
3045 rctl |= IXGBE_FCTRL_MPE;
3046 rctl &= ~IXGBE_FCTRL_UPE;
3047 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
3048 }
3049 } /* ixgbe_set_promisc */
3050
3051 /************************************************************************
3052 * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
3053 ************************************************************************/
3054 static int
3055 ixgbe_msix_link(void *arg)
3056 {
3057 struct adapter *adapter = arg;
3058 struct ixgbe_hw *hw = &adapter->hw;
3059 u32 eicr, eicr_mask;
3060 s32 retval;
3061
3062 ++adapter->link_irq.ev_count;
3063
3064 /* Pause other interrupts */
3065 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
3066
3067 /* First get the cause */
3068 /*
3069 * The specifications of 82598, 82599, X540 and X550 say EICS register
3070 * is write only. However, Linux says it is a workaround for silicon
3071 * errata to read EICS instead of EICR to get interrupt cause. It seems
3072 * there is a problem about read clear mechanism for EICR register.
3073 */
3074 eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
3075 /* Be sure the queue bits are not cleared */
3076 eicr &= ~IXGBE_EICR_RTX_QUEUE;
3077 /* Clear interrupt with write */
3078 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
3079
3080 /* Link status change */
3081 if (eicr & IXGBE_EICR_LSC) {
3082 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
3083 softint_schedule(adapter->link_si);
3084 }
3085
3086 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
3087 if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
3088 (eicr & IXGBE_EICR_FLOW_DIR)) {
3089 /* This is probably overkill :) */
3090 if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1))
3091 return 1;
3092 /* Disable the interrupt */
3093 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR);
3094 softint_schedule(adapter->fdir_si);
3095 }
3096
3097 if (eicr & IXGBE_EICR_ECC) {
3098 device_printf(adapter->dev,
3099 "CRITICAL: ECC ERROR!! Please Reboot!!\n");
3100 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
3101 }
3102
3103 /* Check for over temp condition */
3104 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
3105 switch (adapter->hw.mac.type) {
3106 case ixgbe_mac_X550EM_a:
3107 if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
3108 break;
3109 IXGBE_WRITE_REG(hw, IXGBE_EIMC,
3110 IXGBE_EICR_GPI_SDP0_X550EM_a);
3111 IXGBE_WRITE_REG(hw, IXGBE_EICR,
3112 IXGBE_EICR_GPI_SDP0_X550EM_a);
3113 retval = hw->phy.ops.check_overtemp(hw);
3114 if (retval != IXGBE_ERR_OVERTEMP)
3115 break;
3116 device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
3117 device_printf(adapter->dev, "System shutdown required!\n");
3118 break;
3119 default:
3120 if (!(eicr & IXGBE_EICR_TS))
3121 break;
3122 retval = hw->phy.ops.check_overtemp(hw);
3123 if (retval != IXGBE_ERR_OVERTEMP)
3124 break;
3125 device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
3126 device_printf(adapter->dev, "System shutdown required!\n");
3127 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
3128 break;
3129 }
3130 }
3131
3132 /* Check for VF message */
3133 if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
3134 (eicr & IXGBE_EICR_MAILBOX))
3135 softint_schedule(adapter->mbx_si);
3136 }
3137
3138 if (ixgbe_is_sfp(hw)) {
3139 /* Pluggable optics-related interrupt */
3140 if (hw->mac.type >= ixgbe_mac_X540)
3141 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3142 else
3143 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3144
3145 if (eicr & eicr_mask) {
3146 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
3147 softint_schedule(adapter->mod_si);
3148 }
3149
3150 if ((hw->mac.type == ixgbe_mac_82599EB) &&
3151 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3152 IXGBE_WRITE_REG(hw, IXGBE_EICR,
3153 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3154 softint_schedule(adapter->msf_si);
3155 }
3156 }
3157
3158 /* Check for fan failure */
3159 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
3160 ixgbe_check_fan_failure(adapter, eicr, TRUE);
3161 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3162 }
3163
3164 /* External PHY interrupt */
3165 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3166 (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
3167 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
3168 softint_schedule(adapter->phy_si);
3169 }
3170
3171 /* Re-enable other interrupts */
3172 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
3173 return 1;
3174 } /* ixgbe_msix_link */
3175
3176 static void
3177 ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
3178 {
3179
3180 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
3181 itr |= itr << 16;
3182 else
3183 itr |= IXGBE_EITR_CNT_WDIS;
3184
3185 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(index), itr);
3186 }
3187
3188
3189 /************************************************************************
3190 * ixgbe_sysctl_interrupt_rate_handler
3191 ************************************************************************/
3192 static int
3193 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
3194 {
3195 struct sysctlnode node = *rnode;
3196 struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
3197 struct adapter *adapter;
3198 uint32_t reg, usec, rate;
3199 int error;
3200
3201 if (que == NULL)
3202 return 0;
3203
3204 adapter = que->adapter;
3205 if (ixgbe_fw_recovery_mode_swflag(adapter))
3206 return (EPERM);
3207
3208 reg = IXGBE_READ_REG(&adapter->hw, IXGBE_EITR(que->msix));
3209 usec = ((reg & 0x0FF8) >> 3);
3210 if (usec > 0)
3211 rate = 500000 / usec;
3212 else
3213 rate = 0;
3214 node.sysctl_data = &rate;
3215 error = sysctl_lookup(SYSCTLFN_CALL(&node));
3216 if (error || newp == NULL)
3217 return error;
3218 reg &= ~0xfff; /* default, no limitation */
3219 if (rate > 0 && rate < 500000) {
3220 if (rate < 1000)
3221 rate = 1000;
3222 reg |= ((4000000/rate) & 0xff8);
3223 /*
3224 * When RSC is used, ITR interval must be larger than
3225 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
3226 * The minimum value is always greater than 2us on 100M
3227 * (and 10M?(not documented)), but it's not on 1G and higher.
3228 */
3229 if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
3230 && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
3231 if ((adapter->num_queues > 1)
3232 && (reg < IXGBE_MIN_RSC_EITR_10G1G))
3233 return EINVAL;
3234 }
3235 ixgbe_max_interrupt_rate = rate;
3236 } else
3237 ixgbe_max_interrupt_rate = 0;
3238 ixgbe_eitr_write(adapter, que->msix, reg);
3239
3240 return (0);
3241 } /* ixgbe_sysctl_interrupt_rate_handler */
3242
3243 const struct sysctlnode *
3244 ixgbe_sysctl_instance(struct adapter *adapter)
3245 {
3246 const char *dvname;
3247 struct sysctllog **log;
3248 int rc;
3249 const struct sysctlnode *rnode;
3250
3251 if (adapter->sysctltop != NULL)
3252 return adapter->sysctltop;
3253
3254 log = &adapter->sysctllog;
3255 dvname = device_xname(adapter->dev);
3256
3257 if ((rc = sysctl_createv(log, 0, NULL, &rnode,
3258 0, CTLTYPE_NODE, dvname,
3259 SYSCTL_DESCR("ixgbe information and settings"),
3260 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
3261 goto err;
3262
3263 return rnode;
3264 err:
3265 printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
3266 return NULL;
3267 }
3268
3269 /************************************************************************
3270 * ixgbe_add_device_sysctls
3271 ************************************************************************/
3272 static void
3273 ixgbe_add_device_sysctls(struct adapter *adapter)
3274 {
3275 device_t dev = adapter->dev;
3276 struct ixgbe_hw *hw = &adapter->hw;
3277 struct sysctllog **log;
3278 const struct sysctlnode *rnode, *cnode;
3279
3280 log = &adapter->sysctllog;
3281
3282 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
3283 aprint_error_dev(dev, "could not create sysctl root\n");
3284 return;
3285 }
3286
3287 if (sysctl_createv(log, 0, &rnode, &cnode,
3288 CTLFLAG_READWRITE, CTLTYPE_INT,
3289 "debug", SYSCTL_DESCR("Debug Info"),
3290 ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
3291 aprint_error_dev(dev, "could not create sysctl\n");
3292
3293 if (sysctl_createv(log, 0, &rnode, &cnode,
3294 CTLFLAG_READONLY, CTLTYPE_INT,
3295 "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
3296 NULL, 0, &adapter->num_rx_desc, 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_queues", SYSCTL_DESCR("Number of queues"),
3302 NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
3303 aprint_error_dev(dev, "could not create sysctl\n");
3304
3305 /* Sysctls for all devices */
3306 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3307 CTLTYPE_INT, "fc", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_SET_FC),
3308 ixgbe_sysctl_flowcntl, 0, (void *)adapter, 0, CTL_CREATE,
3309 CTL_EOL) != 0)
3310 aprint_error_dev(dev, "could not create sysctl\n");
3311
3312 adapter->enable_aim = ixgbe_enable_aim;
3313 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3314 CTLTYPE_BOOL, "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
3315 NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
3316 aprint_error_dev(dev, "could not create sysctl\n");
3317
3318 if (sysctl_createv(log, 0, &rnode, &cnode,
3319 CTLFLAG_READWRITE, CTLTYPE_INT,
3320 "advertise_speed", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_ADV_SPEED),
3321 ixgbe_sysctl_advertise, 0, (void *)adapter, 0, CTL_CREATE,
3322 CTL_EOL) != 0)
3323 aprint_error_dev(dev, "could not create sysctl\n");
3324
3325 /*
3326 * If each "que->txrx_use_workqueue" is changed in sysctl handler,
3327 * it causesflip-flopping softint/workqueue mode in one deferred
3328 * processing. Therefore, preempt_disable()/preempt_enable() are
3329 * required in ixgbe_sched_handle_que() to avoid
3330 * KASSERT(ixgbe_sched_handle_que()) in softint_schedule().
3331 * I think changing "que->txrx_use_workqueue" in interrupt handler
3332 * is lighter than doing preempt_disable()/preempt_enable() in every
3333 * ixgbe_sched_handle_que().
3334 */
3335 adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
3336 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3337 CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
3338 NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL) != 0)
3339 aprint_error_dev(dev, "could not create sysctl\n");
3340
3341 #ifdef IXGBE_DEBUG
3342 /* testing sysctls (for all devices) */
3343 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3344 CTLTYPE_INT, "power_state", SYSCTL_DESCR("PCI Power State"),
3345 ixgbe_sysctl_power_state, 0, (void *)adapter, 0, CTL_CREATE,
3346 CTL_EOL) != 0)
3347 aprint_error_dev(dev, "could not create sysctl\n");
3348
3349 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READONLY,
3350 CTLTYPE_STRING, "print_rss_config",
3351 SYSCTL_DESCR("Prints RSS Configuration"),
3352 ixgbe_sysctl_print_rss_config, 0, (void *)adapter, 0, CTL_CREATE,
3353 CTL_EOL) != 0)
3354 aprint_error_dev(dev, "could not create sysctl\n");
3355 #endif
3356 /* for X550 series devices */
3357 if (hw->mac.type >= ixgbe_mac_X550)
3358 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3359 CTLTYPE_INT, "dmac", SYSCTL_DESCR("DMA Coalesce"),
3360 ixgbe_sysctl_dmac, 0, (void *)adapter, 0, CTL_CREATE,
3361 CTL_EOL) != 0)
3362 aprint_error_dev(dev, "could not create sysctl\n");
3363
3364 /* for WoL-capable devices */
3365 if (adapter->wol_support) {
3366 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3367 CTLTYPE_BOOL, "wol_enable",
3368 SYSCTL_DESCR("Enable/Disable Wake on LAN"),
3369 ixgbe_sysctl_wol_enable, 0, (void *)adapter, 0, CTL_CREATE,
3370 CTL_EOL) != 0)
3371 aprint_error_dev(dev, "could not create sysctl\n");
3372
3373 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3374 CTLTYPE_INT, "wufc",
3375 SYSCTL_DESCR("Enable/Disable Wake Up Filters"),
3376 ixgbe_sysctl_wufc, 0, (void *)adapter, 0, CTL_CREATE,
3377 CTL_EOL) != 0)
3378 aprint_error_dev(dev, "could not create sysctl\n");
3379 }
3380
3381 /* for X552/X557-AT devices */
3382 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
3383 const struct sysctlnode *phy_node;
3384
3385 if (sysctl_createv(log, 0, &rnode, &phy_node, 0, CTLTYPE_NODE,
3386 "phy", SYSCTL_DESCR("External PHY sysctls"),
3387 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) {
3388 aprint_error_dev(dev, "could not create sysctl\n");
3389 return;
3390 }
3391
3392 if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3393 CTLTYPE_INT, "temp",
3394 SYSCTL_DESCR("Current External PHY Temperature (Celsius)"),
3395 ixgbe_sysctl_phy_temp, 0, (void *)adapter, 0, CTL_CREATE,
3396 CTL_EOL) != 0)
3397 aprint_error_dev(dev, "could not create sysctl\n");
3398
3399 if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3400 CTLTYPE_INT, "overtemp_occurred",
3401 SYSCTL_DESCR("External PHY High Temperature Event Occurred"),
3402 ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
3403 CTL_CREATE, CTL_EOL) != 0)
3404 aprint_error_dev(dev, "could not create sysctl\n");
3405 }
3406
3407 if ((hw->mac.type == ixgbe_mac_X550EM_a)
3408 && (hw->phy.type == ixgbe_phy_fw))
3409 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3410 CTLTYPE_BOOL, "force_10_100_autonego",
3411 SYSCTL_DESCR("Force autonego on 10M and 100M"),
3412 NULL, 0, &hw->phy.force_10_100_autonego, 0,
3413 CTL_CREATE, CTL_EOL) != 0)
3414 aprint_error_dev(dev, "could not create sysctl\n");
3415
3416 if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
3417 if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3418 CTLTYPE_INT, "eee_state",
3419 SYSCTL_DESCR("EEE Power Save State"),
3420 ixgbe_sysctl_eee_state, 0, (void *)adapter, 0, CTL_CREATE,
3421 CTL_EOL) != 0)
3422 aprint_error_dev(dev, "could not create sysctl\n");
3423 }
3424 } /* ixgbe_add_device_sysctls */
3425
3426 /************************************************************************
3427 * ixgbe_allocate_pci_resources
3428 ************************************************************************/
3429 static int
3430 ixgbe_allocate_pci_resources(struct adapter *adapter,
3431 const struct pci_attach_args *pa)
3432 {
3433 pcireg_t memtype, csr;
3434 device_t dev = adapter->dev;
3435 bus_addr_t addr;
3436 int flags;
3437
3438 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
3439 switch (memtype) {
3440 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
3441 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
3442 adapter->osdep.mem_bus_space_tag = pa->pa_memt;
3443 if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
3444 memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
3445 goto map_err;
3446 if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
3447 aprint_normal_dev(dev, "clearing prefetchable bit\n");
3448 flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
3449 }
3450 if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
3451 adapter->osdep.mem_size, flags,
3452 &adapter->osdep.mem_bus_space_handle) != 0) {
3453 map_err:
3454 adapter->osdep.mem_size = 0;
3455 aprint_error_dev(dev, "unable to map BAR0\n");
3456 return ENXIO;
3457 }
3458 /*
3459 * Enable address decoding for memory range in case BIOS or
3460 * UEFI don't set it.
3461 */
3462 csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
3463 PCI_COMMAND_STATUS_REG);
3464 csr |= PCI_COMMAND_MEM_ENABLE;
3465 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
3466 csr);
3467 break;
3468 default:
3469 aprint_error_dev(dev, "unexpected type on BAR0\n");
3470 return ENXIO;
3471 }
3472
3473 return (0);
3474 } /* ixgbe_allocate_pci_resources */
3475
3476 static void
3477 ixgbe_free_softint(struct adapter *adapter)
3478 {
3479 struct ix_queue *que = adapter->queues;
3480 struct tx_ring *txr = adapter->tx_rings;
3481 int i;
3482
3483 for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
3484 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
3485 if (txr->txr_si != NULL)
3486 softint_disestablish(txr->txr_si);
3487 }
3488 if (que->que_si != NULL)
3489 softint_disestablish(que->que_si);
3490 }
3491 if (adapter->txr_wq != NULL)
3492 workqueue_destroy(adapter->txr_wq);
3493 if (adapter->txr_wq_enqueued != NULL)
3494 percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
3495 if (adapter->que_wq != NULL)
3496 workqueue_destroy(adapter->que_wq);
3497
3498 /* Drain the Link queue */
3499 if (adapter->link_si != NULL) {
3500 softint_disestablish(adapter->link_si);
3501 adapter->link_si = NULL;
3502 }
3503 if (adapter->mod_si != NULL) {
3504 softint_disestablish(adapter->mod_si);
3505 adapter->mod_si = NULL;
3506 }
3507 if (adapter->msf_si != NULL) {
3508 softint_disestablish(adapter->msf_si);
3509 adapter->msf_si = NULL;
3510 }
3511 if (adapter->phy_si != NULL) {
3512 softint_disestablish(adapter->phy_si);
3513 adapter->phy_si = NULL;
3514 }
3515 if (adapter->feat_en & IXGBE_FEATURE_FDIR) {
3516 if (adapter->fdir_si != NULL) {
3517 softint_disestablish(adapter->fdir_si);
3518 adapter->fdir_si = NULL;
3519 }
3520 }
3521 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
3522 if (adapter->mbx_si != NULL) {
3523 softint_disestablish(adapter->mbx_si);
3524 adapter->mbx_si = NULL;
3525 }
3526 }
3527 } /* ixgbe_free_softint */
3528
3529 /************************************************************************
3530 * ixgbe_detach - Device removal routine
3531 *
3532 * Called when the driver is being removed.
3533 * Stops the adapter and deallocates all the resources
3534 * that were allocated for driver operation.
3535 *
3536 * return 0 on success, positive on failure
3537 ************************************************************************/
3538 static int
3539 ixgbe_detach(device_t dev, int flags)
3540 {
3541 struct adapter *adapter = device_private(dev);
3542 struct rx_ring *rxr = adapter->rx_rings;
3543 struct tx_ring *txr = adapter->tx_rings;
3544 struct ixgbe_hw *hw = &adapter->hw;
3545 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
3546 u32 ctrl_ext;
3547 int i;
3548
3549 INIT_DEBUGOUT("ixgbe_detach: begin");
3550 if (adapter->osdep.attached == false)
3551 return 0;
3552
3553 if (ixgbe_pci_iov_detach(dev) != 0) {
3554 device_printf(dev, "SR-IOV in use; detach first.\n");
3555 return (EBUSY);
3556 }
3557
3558 /* Stop the interface. Callouts are stopped in it. */
3559 ixgbe_ifstop(adapter->ifp, 1);
3560 #if NVLAN > 0
3561 /* Make sure VLANs are not using driver */
3562 if (!VLAN_ATTACHED(&adapter->osdep.ec))
3563 ; /* nothing to do: no VLANs */
3564 else if ((flags & (DETACH_SHUTDOWN | DETACH_FORCE)) != 0)
3565 vlan_ifdetach(adapter->ifp);
3566 else {
3567 aprint_error_dev(dev, "VLANs in use, detach first\n");
3568 return (EBUSY);
3569 }
3570 #endif
3571
3572 pmf_device_deregister(dev);
3573
3574 ether_ifdetach(adapter->ifp);
3575 /* Stop the adapter */
3576 IXGBE_CORE_LOCK(adapter);
3577 ixgbe_setup_low_power_mode(adapter);
3578 IXGBE_CORE_UNLOCK(adapter);
3579
3580 ixgbe_free_softint(adapter);
3581
3582 /* let hardware know driver is unloading */
3583 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
3584 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
3585 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
3586
3587 callout_halt(&adapter->timer, NULL);
3588 if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
3589 callout_halt(&adapter->recovery_mode_timer, NULL);
3590
3591 if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
3592 netmap_detach(adapter->ifp);
3593
3594 ixgbe_free_pci_resources(adapter);
3595 #if 0 /* XXX the NetBSD port is probably missing something here */
3596 bus_generic_detach(dev);
3597 #endif
3598 if_detach(adapter->ifp);
3599 if_percpuq_destroy(adapter->ipq);
3600
3601 sysctl_teardown(&adapter->sysctllog);
3602 evcnt_detach(&adapter->efbig_tx_dma_setup);
3603 evcnt_detach(&adapter->mbuf_defrag_failed);
3604 evcnt_detach(&adapter->efbig2_tx_dma_setup);
3605 evcnt_detach(&adapter->einval_tx_dma_setup);
3606 evcnt_detach(&adapter->other_tx_dma_setup);
3607 evcnt_detach(&adapter->eagain_tx_dma_setup);
3608 evcnt_detach(&adapter->enomem_tx_dma_setup);
3609 evcnt_detach(&adapter->watchdog_events);
3610 evcnt_detach(&adapter->tso_err);
3611 evcnt_detach(&adapter->link_irq);
3612 evcnt_detach(&adapter->link_sicount);
3613 evcnt_detach(&adapter->mod_sicount);
3614 evcnt_detach(&adapter->msf_sicount);
3615 evcnt_detach(&adapter->phy_sicount);
3616
3617 for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
3618 if (i < __arraycount(stats->mpc)) {
3619 evcnt_detach(&stats->mpc[i]);
3620 if (hw->mac.type == ixgbe_mac_82598EB)
3621 evcnt_detach(&stats->rnbc[i]);
3622 }
3623 if (i < __arraycount(stats->pxontxc)) {
3624 evcnt_detach(&stats->pxontxc[i]);
3625 evcnt_detach(&stats->pxonrxc[i]);
3626 evcnt_detach(&stats->pxofftxc[i]);
3627 evcnt_detach(&stats->pxoffrxc[i]);
3628 if (hw->mac.type >= ixgbe_mac_82599EB)
3629 evcnt_detach(&stats->pxon2offc[i]);
3630 }
3631 }
3632
3633 txr = adapter->tx_rings;
3634 for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
3635 evcnt_detach(&adapter->queues[i].irqs);
3636 evcnt_detach(&adapter->queues[i].handleq);
3637 evcnt_detach(&adapter->queues[i].req);
3638 evcnt_detach(&txr->no_desc_avail);
3639 evcnt_detach(&txr->total_packets);
3640 evcnt_detach(&txr->tso_tx);
3641 #ifndef IXGBE_LEGACY_TX
3642 evcnt_detach(&txr->pcq_drops);
3643 #endif
3644
3645 if (i < __arraycount(stats->qprc)) {
3646 evcnt_detach(&stats->qprc[i]);
3647 evcnt_detach(&stats->qptc[i]);
3648 evcnt_detach(&stats->qbrc[i]);
3649 evcnt_detach(&stats->qbtc[i]);
3650 if (hw->mac.type >= ixgbe_mac_82599EB)
3651 evcnt_detach(&stats->qprdc[i]);
3652 }
3653
3654 evcnt_detach(&rxr->rx_packets);
3655 evcnt_detach(&rxr->rx_bytes);
3656 evcnt_detach(&rxr->rx_copies);
3657 evcnt_detach(&rxr->no_jmbuf);
3658 evcnt_detach(&rxr->rx_discarded);
3659 }
3660 evcnt_detach(&stats->ipcs);
3661 evcnt_detach(&stats->l4cs);
3662 evcnt_detach(&stats->ipcs_bad);
3663 evcnt_detach(&stats->l4cs_bad);
3664 evcnt_detach(&stats->intzero);
3665 evcnt_detach(&stats->legint);
3666 evcnt_detach(&stats->crcerrs);
3667 evcnt_detach(&stats->illerrc);
3668 evcnt_detach(&stats->errbc);
3669 evcnt_detach(&stats->mspdc);
3670 if (hw->mac.type >= ixgbe_mac_X550)
3671 evcnt_detach(&stats->mbsdc);
3672 evcnt_detach(&stats->mpctotal);
3673 evcnt_detach(&stats->mlfc);
3674 evcnt_detach(&stats->mrfc);
3675 evcnt_detach(&stats->rlec);
3676 evcnt_detach(&stats->lxontxc);
3677 evcnt_detach(&stats->lxonrxc);
3678 evcnt_detach(&stats->lxofftxc);
3679 evcnt_detach(&stats->lxoffrxc);
3680
3681 /* Packet Reception Stats */
3682 evcnt_detach(&stats->tor);
3683 evcnt_detach(&stats->gorc);
3684 evcnt_detach(&stats->tpr);
3685 evcnt_detach(&stats->gprc);
3686 evcnt_detach(&stats->mprc);
3687 evcnt_detach(&stats->bprc);
3688 evcnt_detach(&stats->prc64);
3689 evcnt_detach(&stats->prc127);
3690 evcnt_detach(&stats->prc255);
3691 evcnt_detach(&stats->prc511);
3692 evcnt_detach(&stats->prc1023);
3693 evcnt_detach(&stats->prc1522);
3694 evcnt_detach(&stats->ruc);
3695 evcnt_detach(&stats->rfc);
3696 evcnt_detach(&stats->roc);
3697 evcnt_detach(&stats->rjc);
3698 evcnt_detach(&stats->mngprc);
3699 evcnt_detach(&stats->mngpdc);
3700 evcnt_detach(&stats->xec);
3701
3702 /* Packet Transmission Stats */
3703 evcnt_detach(&stats->gotc);
3704 evcnt_detach(&stats->tpt);
3705 evcnt_detach(&stats->gptc);
3706 evcnt_detach(&stats->bptc);
3707 evcnt_detach(&stats->mptc);
3708 evcnt_detach(&stats->mngptc);
3709 evcnt_detach(&stats->ptc64);
3710 evcnt_detach(&stats->ptc127);
3711 evcnt_detach(&stats->ptc255);
3712 evcnt_detach(&stats->ptc511);
3713 evcnt_detach(&stats->ptc1023);
3714 evcnt_detach(&stats->ptc1522);
3715
3716 ixgbe_free_transmit_structures(adapter);
3717 ixgbe_free_receive_structures(adapter);
3718 for (i = 0; i < adapter->num_queues; i++) {
3719 struct ix_queue * que = &adapter->queues[i];
3720 mutex_destroy(&que->dc_mtx);
3721 }
3722 free(adapter->queues, M_DEVBUF);
3723 free(adapter->mta, M_DEVBUF);
3724
3725 IXGBE_CORE_LOCK_DESTROY(adapter);
3726
3727 return (0);
3728 } /* ixgbe_detach */
3729
3730 /************************************************************************
3731 * ixgbe_setup_low_power_mode - LPLU/WoL preparation
3732 *
3733 * Prepare the adapter/port for LPLU and/or WoL
3734 ************************************************************************/
3735 static int
3736 ixgbe_setup_low_power_mode(struct adapter *adapter)
3737 {
3738 struct ixgbe_hw *hw = &adapter->hw;
3739 device_t dev = adapter->dev;
3740 s32 error = 0;
3741
3742 KASSERT(mutex_owned(&adapter->core_mtx));
3743
3744 /* Limit power management flow to X550EM baseT */
3745 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
3746 hw->phy.ops.enter_lplu) {
3747 /* X550EM baseT adapters need a special LPLU flow */
3748 hw->phy.reset_disable = true;
3749 ixgbe_stop(adapter);
3750 error = hw->phy.ops.enter_lplu(hw);
3751 if (error)
3752 device_printf(dev,
3753 "Error entering LPLU: %d\n", error);
3754 hw->phy.reset_disable = false;
3755 } else {
3756 /* Just stop for other adapters */
3757 ixgbe_stop(adapter);
3758 }
3759
3760 if (!hw->wol_enabled) {
3761 ixgbe_set_phy_power(hw, FALSE);
3762 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3763 IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
3764 } else {
3765 /* Turn off support for APM wakeup. (Using ACPI instead) */
3766 IXGBE_WRITE_REG(hw, IXGBE_GRC_BY_MAC(hw),
3767 IXGBE_READ_REG(hw, IXGBE_GRC_BY_MAC(hw)) & ~(u32)2);
3768
3769 /*
3770 * Clear Wake Up Status register to prevent any previous wakeup
3771 * events from waking us up immediately after we suspend.
3772 */
3773 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3774
3775 /*
3776 * Program the Wakeup Filter Control register with user filter
3777 * settings
3778 */
3779 IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
3780
3781 /* Enable wakeups and power management in Wakeup Control */
3782 IXGBE_WRITE_REG(hw, IXGBE_WUC,
3783 IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
3784
3785 }
3786
3787 return error;
3788 } /* ixgbe_setup_low_power_mode */
3789
3790 /************************************************************************
3791 * ixgbe_shutdown - Shutdown entry point
3792 ************************************************************************/
3793 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
3794 static int
3795 ixgbe_shutdown(device_t dev)
3796 {
3797 struct adapter *adapter = device_private(dev);
3798 int error = 0;
3799
3800 INIT_DEBUGOUT("ixgbe_shutdown: begin");
3801
3802 IXGBE_CORE_LOCK(adapter);
3803 error = ixgbe_setup_low_power_mode(adapter);
3804 IXGBE_CORE_UNLOCK(adapter);
3805
3806 return (error);
3807 } /* ixgbe_shutdown */
3808 #endif
3809
3810 /************************************************************************
3811 * ixgbe_suspend
3812 *
3813 * From D0 to D3
3814 ************************************************************************/
3815 static bool
3816 ixgbe_suspend(device_t dev, const pmf_qual_t *qual)
3817 {
3818 struct adapter *adapter = device_private(dev);
3819 int error = 0;
3820
3821 INIT_DEBUGOUT("ixgbe_suspend: begin");
3822
3823 IXGBE_CORE_LOCK(adapter);
3824
3825 error = ixgbe_setup_low_power_mode(adapter);
3826
3827 IXGBE_CORE_UNLOCK(adapter);
3828
3829 return (error);
3830 } /* ixgbe_suspend */
3831
3832 /************************************************************************
3833 * ixgbe_resume
3834 *
3835 * From D3 to D0
3836 ************************************************************************/
3837 static bool
3838 ixgbe_resume(device_t dev, const pmf_qual_t *qual)
3839 {
3840 struct adapter *adapter = device_private(dev);
3841 struct ifnet *ifp = adapter->ifp;
3842 struct ixgbe_hw *hw = &adapter->hw;
3843 u32 wus;
3844
3845 INIT_DEBUGOUT("ixgbe_resume: begin");
3846
3847 IXGBE_CORE_LOCK(adapter);
3848
3849 /* Read & clear WUS register */
3850 wus = IXGBE_READ_REG(hw, IXGBE_WUS);
3851 if (wus)
3852 device_printf(dev, "Woken up by (WUS): %#010x\n",
3853 IXGBE_READ_REG(hw, IXGBE_WUS));
3854 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3855 /* And clear WUFC until next low-power transition */
3856 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3857
3858 /*
3859 * Required after D3->D0 transition;
3860 * will re-advertise all previous advertised speeds
3861 */
3862 if (ifp->if_flags & IFF_UP)
3863 ixgbe_init_locked(adapter);
3864
3865 IXGBE_CORE_UNLOCK(adapter);
3866
3867 return true;
3868 } /* ixgbe_resume */
3869
3870 /*
3871 * Set the various hardware offload abilities.
3872 *
3873 * This takes the ifnet's if_capenable flags (e.g. set by the user using
3874 * ifconfig) and indicates to the OS via the ifnet's if_hwassist field what
3875 * mbuf offload flags the driver will understand.
3876 */
3877 static void
3878 ixgbe_set_if_hwassist(struct adapter *adapter)
3879 {
3880 /* XXX */
3881 }
3882
3883 /************************************************************************
3884 * ixgbe_init_locked - Init entry point
3885 *
3886 * Used in two ways: It is used by the stack as an init
3887 * entry point in network interface structure. It is also
3888 * used by the driver as a hw/sw initialization routine to
3889 * get to a consistent state.
3890 *
3891 * return 0 on success, positive on failure
3892 ************************************************************************/
3893 static void
3894 ixgbe_init_locked(struct adapter *adapter)
3895 {
3896 struct ifnet *ifp = adapter->ifp;
3897 device_t dev = adapter->dev;
3898 struct ixgbe_hw *hw = &adapter->hw;
3899 struct ix_queue *que;
3900 struct tx_ring *txr;
3901 struct rx_ring *rxr;
3902 u32 txdctl, mhadd;
3903 u32 rxdctl, rxctrl;
3904 u32 ctrl_ext;
3905 int i, j, err;
3906
3907 /* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
3908
3909 KASSERT(mutex_owned(&adapter->core_mtx));
3910 INIT_DEBUGOUT("ixgbe_init_locked: begin");
3911
3912 hw->adapter_stopped = FALSE;
3913 ixgbe_stop_adapter(hw);
3914 callout_stop(&adapter->timer);
3915 for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
3916 que->disabled_count = 0;
3917
3918 /* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
3919 adapter->max_frame_size =
3920 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
3921
3922 /* Queue indices may change with IOV mode */
3923 ixgbe_align_all_queue_indices(adapter);
3924
3925 /* reprogram the RAR[0] in case user changed it. */
3926 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
3927
3928 /* Get the latest mac address, User can use a LAA */
3929 memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
3930 IXGBE_ETH_LENGTH_OF_ADDRESS);
3931 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
3932 hw->addr_ctrl.rar_used_count = 1;
3933
3934 /* Set hardware offload abilities from ifnet flags */
3935 ixgbe_set_if_hwassist(adapter);
3936
3937 /* Prepare transmit descriptors and buffers */
3938 if (ixgbe_setup_transmit_structures(adapter)) {
3939 device_printf(dev, "Could not setup transmit structures\n");
3940 ixgbe_stop(adapter);
3941 return;
3942 }
3943
3944 ixgbe_init_hw(hw);
3945
3946 ixgbe_initialize_iov(adapter);
3947
3948 ixgbe_initialize_transmit_units(adapter);
3949
3950 /* Setup Multicast table */
3951 ixgbe_set_multi(adapter);
3952
3953 /* Determine the correct mbuf pool, based on frame size */
3954 if (adapter->max_frame_size <= MCLBYTES)
3955 adapter->rx_mbuf_sz = MCLBYTES;
3956 else
3957 adapter->rx_mbuf_sz = MJUMPAGESIZE;
3958
3959 /* Prepare receive descriptors and buffers */
3960 if (ixgbe_setup_receive_structures(adapter)) {
3961 device_printf(dev, "Could not setup receive structures\n");
3962 ixgbe_stop(adapter);
3963 return;
3964 }
3965
3966 /* Configure RX settings */
3967 ixgbe_initialize_receive_units(adapter);
3968
3969 /* Enable SDP & MSI-X interrupts based on adapter */
3970 ixgbe_config_gpie(adapter);
3971
3972 /* Set MTU size */
3973 if (ifp->if_mtu > ETHERMTU) {
3974 /* aka IXGBE_MAXFRS on 82599 and newer */
3975 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
3976 mhadd &= ~IXGBE_MHADD_MFS_MASK;
3977 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
3978 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
3979 }
3980
3981 /* Now enable all the queues */
3982 for (i = 0; i < adapter->num_queues; i++) {
3983 txr = &adapter->tx_rings[i];
3984 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
3985 txdctl |= IXGBE_TXDCTL_ENABLE;
3986 /* Set WTHRESH to 8, burst writeback */
3987 txdctl |= (8 << 16);
3988 /*
3989 * When the internal queue falls below PTHRESH (32),
3990 * start prefetching as long as there are at least
3991 * HTHRESH (1) buffers ready. The values are taken
3992 * from the Intel linux driver 3.8.21.
3993 * Prefetching enables tx line rate even with 1 queue.
3994 */
3995 txdctl |= (32 << 0) | (1 << 8);
3996 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
3997 }
3998
3999 for (i = 0; i < adapter->num_queues; i++) {
4000 rxr = &adapter->rx_rings[i];
4001 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
4002 if (hw->mac.type == ixgbe_mac_82598EB) {
4003 /*
4004 * PTHRESH = 21
4005 * HTHRESH = 4
4006 * WTHRESH = 8
4007 */
4008 rxdctl &= ~0x3FFFFF;
4009 rxdctl |= 0x080420;
4010 }
4011 rxdctl |= IXGBE_RXDCTL_ENABLE;
4012 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
4013 for (j = 0; j < 10; j++) {
4014 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
4015 IXGBE_RXDCTL_ENABLE)
4016 break;
4017 else
4018 msec_delay(1);
4019 }
4020 wmb();
4021
4022 /*
4023 * In netmap mode, we must preserve the buffers made
4024 * available to userspace before the if_init()
4025 * (this is true by default on the TX side, because
4026 * init makes all buffers available to userspace).
4027 *
4028 * netmap_reset() and the device specific routines
4029 * (e.g. ixgbe_setup_receive_rings()) map these
4030 * buffers at the end of the NIC ring, so here we
4031 * must set the RDT (tail) register to make sure
4032 * they are not overwritten.
4033 *
4034 * In this driver the NIC ring starts at RDH = 0,
4035 * RDT points to the last slot available for reception (?),
4036 * so RDT = num_rx_desc - 1 means the whole ring is available.
4037 */
4038 #ifdef DEV_NETMAP
4039 if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
4040 (ifp->if_capenable & IFCAP_NETMAP)) {
4041 struct netmap_adapter *na = NA(adapter->ifp);
4042 struct netmap_kring *kring = na->rx_rings[i];
4043 int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
4044
4045 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
4046 } else
4047 #endif /* DEV_NETMAP */
4048 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me),
4049 adapter->num_rx_desc - 1);
4050 }
4051
4052 /* Enable Receive engine */
4053 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
4054 if (hw->mac.type == ixgbe_mac_82598EB)
4055 rxctrl |= IXGBE_RXCTRL_DMBYPS;
4056 rxctrl |= IXGBE_RXCTRL_RXEN;
4057 ixgbe_enable_rx_dma(hw, rxctrl);
4058
4059 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4060
4061 /* Set up MSI/MSI-X routing */
4062 if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4063 ixgbe_configure_ivars(adapter);
4064 /* Set up auto-mask */
4065 if (hw->mac.type == ixgbe_mac_82598EB)
4066 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4067 else {
4068 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
4069 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
4070 }
4071 } else { /* Simple settings for Legacy/MSI */
4072 ixgbe_set_ivar(adapter, 0, 0, 0);
4073 ixgbe_set_ivar(adapter, 0, 0, 1);
4074 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4075 }
4076
4077 ixgbe_init_fdir(adapter);
4078
4079 /*
4080 * Check on any SFP devices that
4081 * need to be kick-started
4082 */
4083 if (hw->phy.type == ixgbe_phy_none) {
4084 err = hw->phy.ops.identify(hw);
4085 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4086 device_printf(dev,
4087 "Unsupported SFP+ module type was detected.\n");
4088 return;
4089 }
4090 }
4091
4092 /* Set moderation on the Link interrupt */
4093 ixgbe_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
4094
4095 /* Enable EEE power saving */
4096 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
4097 hw->mac.ops.setup_eee(hw,
4098 adapter->feat_en & IXGBE_FEATURE_EEE);
4099
4100 /* Enable power to the phy. */
4101 ixgbe_set_phy_power(hw, TRUE);
4102
4103 /* Config/Enable Link */
4104 ixgbe_config_link(adapter);
4105
4106 /* Hardware Packet Buffer & Flow Control setup */
4107 ixgbe_config_delay_values(adapter);
4108
4109 /* Initialize the FC settings */
4110 ixgbe_start_hw(hw);
4111
4112 /* Set up VLAN support and filter */
4113 ixgbe_setup_vlan_hw_support(adapter);
4114
4115 /* Setup DMA Coalescing */
4116 ixgbe_config_dmac(adapter);
4117
4118 /* And now turn on interrupts */
4119 ixgbe_enable_intr(adapter);
4120
4121 /* Enable the use of the MBX by the VF's */
4122 if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
4123 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
4124 ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
4125 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
4126 }
4127
4128 /* Update saved flags. See ixgbe_ifflags_cb() */
4129 adapter->if_flags = ifp->if_flags;
4130
4131 /* Now inform the stack we're ready */
4132 ifp->if_flags |= IFF_RUNNING;
4133
4134 return;
4135 } /* ixgbe_init_locked */
4136
4137 /************************************************************************
4138 * ixgbe_init
4139 ************************************************************************/
4140 static int
4141 ixgbe_init(struct ifnet *ifp)
4142 {
4143 struct adapter *adapter = ifp->if_softc;
4144
4145 IXGBE_CORE_LOCK(adapter);
4146 ixgbe_init_locked(adapter);
4147 IXGBE_CORE_UNLOCK(adapter);
4148
4149 return 0; /* XXX ixgbe_init_locked cannot fail? really? */
4150 } /* ixgbe_init */
4151
4152 /************************************************************************
4153 * ixgbe_set_ivar
4154 *
4155 * Setup the correct IVAR register for a particular MSI-X interrupt
4156 * (yes this is all very magic and confusing :)
4157 * - entry is the register array entry
4158 * - vector is the MSI-X vector for this queue
4159 * - type is RX/TX/MISC
4160 ************************************************************************/
4161 static void
4162 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
4163 {
4164 struct ixgbe_hw *hw = &adapter->hw;
4165 u32 ivar, index;
4166
4167 vector |= IXGBE_IVAR_ALLOC_VAL;
4168
4169 switch (hw->mac.type) {
4170 case ixgbe_mac_82598EB:
4171 if (type == -1)
4172 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
4173 else
4174 entry += (type * 64);
4175 index = (entry >> 2) & 0x1F;
4176 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4177 ivar &= ~(0xFF << (8 * (entry & 0x3)));
4178 ivar |= (vector << (8 * (entry & 0x3)));
4179 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
4180 break;
4181 case ixgbe_mac_82599EB:
4182 case ixgbe_mac_X540:
4183 case ixgbe_mac_X550:
4184 case ixgbe_mac_X550EM_x:
4185 case ixgbe_mac_X550EM_a:
4186 if (type == -1) { /* MISC IVAR */
4187 index = (entry & 1) * 8;
4188 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4189 ivar &= ~(0xFF << index);
4190 ivar |= (vector << index);
4191 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4192 } else { /* RX/TX IVARS */
4193 index = (16 * (entry & 1)) + (8 * type);
4194 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
4195 ivar &= ~(0xFF << index);
4196 ivar |= (vector << index);
4197 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
4198 }
4199 break;
4200 default:
4201 break;
4202 }
4203 } /* ixgbe_set_ivar */
4204
4205 /************************************************************************
4206 * ixgbe_configure_ivars
4207 ************************************************************************/
4208 static void
4209 ixgbe_configure_ivars(struct adapter *adapter)
4210 {
4211 struct ix_queue *que = adapter->queues;
4212 u32 newitr;
4213
4214 if (ixgbe_max_interrupt_rate > 0)
4215 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
4216 else {
4217 /*
4218 * Disable DMA coalescing if interrupt moderation is
4219 * disabled.
4220 */
4221 adapter->dmac = 0;
4222 newitr = 0;
4223 }
4224
4225 for (int i = 0; i < adapter->num_queues; i++, que++) {
4226 struct rx_ring *rxr = &adapter->rx_rings[i];
4227 struct tx_ring *txr = &adapter->tx_rings[i];
4228 /* First the RX queue entry */
4229 ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
4230 /* ... and the TX */
4231 ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
4232 /* Set an Initial EITR value */
4233 ixgbe_eitr_write(adapter, que->msix, newitr);
4234 /*
4235 * To eliminate influence of the previous state.
4236 * At this point, Tx/Rx interrupt handler
4237 * (ixgbe_msix_que()) cannot be called, so both
4238 * IXGBE_TX_LOCK and IXGBE_RX_LOCK are not required.
4239 */
4240 que->eitr_setting = 0;
4241 }
4242
4243 /* For the Link interrupt */
4244 ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
4245 } /* ixgbe_configure_ivars */
4246
4247 /************************************************************************
4248 * ixgbe_config_gpie
4249 ************************************************************************/
4250 static void
4251 ixgbe_config_gpie(struct adapter *adapter)
4252 {
4253 struct ixgbe_hw *hw = &adapter->hw;
4254 u32 gpie;
4255
4256 gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
4257
4258 if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4259 /* Enable Enhanced MSI-X mode */
4260 gpie |= IXGBE_GPIE_MSIX_MODE
4261 | IXGBE_GPIE_EIAME
4262 | IXGBE_GPIE_PBA_SUPPORT
4263 | IXGBE_GPIE_OCD;
4264 }
4265
4266 /* Fan Failure Interrupt */
4267 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
4268 gpie |= IXGBE_SDP1_GPIEN;
4269
4270 /* Thermal Sensor Interrupt */
4271 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
4272 gpie |= IXGBE_SDP0_GPIEN_X540;
4273
4274 /* Link detection */
4275 switch (hw->mac.type) {
4276 case ixgbe_mac_82599EB:
4277 gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
4278 break;
4279 case ixgbe_mac_X550EM_x:
4280 case ixgbe_mac_X550EM_a:
4281 gpie |= IXGBE_SDP0_GPIEN_X540;
4282 break;
4283 default:
4284 break;
4285 }
4286
4287 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
4288
4289 } /* ixgbe_config_gpie */
4290
4291 /************************************************************************
4292 * ixgbe_config_delay_values
4293 *
4294 * Requires adapter->max_frame_size to be set.
4295 ************************************************************************/
4296 static void
4297 ixgbe_config_delay_values(struct adapter *adapter)
4298 {
4299 struct ixgbe_hw *hw = &adapter->hw;
4300 u32 rxpb, frame, size, tmp;
4301
4302 frame = adapter->max_frame_size;
4303
4304 /* Calculate High Water */
4305 switch (hw->mac.type) {
4306 case ixgbe_mac_X540:
4307 case ixgbe_mac_X550:
4308 case ixgbe_mac_X550EM_x:
4309 case ixgbe_mac_X550EM_a:
4310 tmp = IXGBE_DV_X540(frame, frame);
4311 break;
4312 default:
4313 tmp = IXGBE_DV(frame, frame);
4314 break;
4315 }
4316 size = IXGBE_BT2KB(tmp);
4317 rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
4318 hw->fc.high_water[0] = rxpb - size;
4319
4320 /* Now calculate Low Water */
4321 switch (hw->mac.type) {
4322 case ixgbe_mac_X540:
4323 case ixgbe_mac_X550:
4324 case ixgbe_mac_X550EM_x:
4325 case ixgbe_mac_X550EM_a:
4326 tmp = IXGBE_LOW_DV_X540(frame);
4327 break;
4328 default:
4329 tmp = IXGBE_LOW_DV(frame);
4330 break;
4331 }
4332 hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
4333
4334 hw->fc.pause_time = IXGBE_FC_PAUSE;
4335 hw->fc.send_xon = TRUE;
4336 } /* ixgbe_config_delay_values */
4337
4338 /************************************************************************
4339 * ixgbe_set_multi - Multicast Update
4340 *
4341 * Called whenever multicast address list is updated.
4342 ************************************************************************/
4343 static void
4344 ixgbe_set_multi(struct adapter *adapter)
4345 {
4346 struct ixgbe_mc_addr *mta;
4347 struct ifnet *ifp = adapter->ifp;
4348 u8 *update_ptr;
4349 int mcnt = 0;
4350 u32 fctrl;
4351 struct ethercom *ec = &adapter->osdep.ec;
4352 struct ether_multi *enm;
4353 struct ether_multistep step;
4354
4355 KASSERT(mutex_owned(&adapter->core_mtx));
4356 IOCTL_DEBUGOUT("ixgbe_set_multi: begin");
4357
4358 mta = adapter->mta;
4359 bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
4360
4361 ifp->if_flags &= ~IFF_ALLMULTI;
4362 ETHER_LOCK(ec);
4363 ETHER_FIRST_MULTI(step, ec, enm);
4364 while (enm != NULL) {
4365 if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
4366 (memcmp(enm->enm_addrlo, enm->enm_addrhi,
4367 ETHER_ADDR_LEN) != 0)) {
4368 ifp->if_flags |= IFF_ALLMULTI;
4369 break;
4370 }
4371 bcopy(enm->enm_addrlo,
4372 mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
4373 mta[mcnt].vmdq = adapter->pool;
4374 mcnt++;
4375 ETHER_NEXT_MULTI(step, enm);
4376 }
4377 ETHER_UNLOCK(ec);
4378
4379 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
4380 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4381 if (ifp->if_flags & IFF_PROMISC)
4382 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4383 else if (ifp->if_flags & IFF_ALLMULTI) {
4384 fctrl |= IXGBE_FCTRL_MPE;
4385 }
4386
4387 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
4388
4389 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
4390 update_ptr = (u8 *)mta;
4391 ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
4392 ixgbe_mc_array_itr, TRUE);
4393 }
4394
4395 } /* ixgbe_set_multi */
4396
4397 /************************************************************************
4398 * ixgbe_mc_array_itr
4399 *
4400 * An iterator function needed by the multicast shared code.
4401 * It feeds the shared code routine the addresses in the
4402 * array of ixgbe_set_multi() one by one.
4403 ************************************************************************/
4404 static u8 *
4405 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
4406 {
4407 struct ixgbe_mc_addr *mta;
4408
4409 mta = (struct ixgbe_mc_addr *)*update_ptr;
4410 *vmdq = mta->vmdq;
4411
4412 *update_ptr = (u8*)(mta + 1);
4413
4414 return (mta->addr);
4415 } /* ixgbe_mc_array_itr */
4416
4417 /************************************************************************
4418 * ixgbe_local_timer - Timer routine
4419 *
4420 * Checks for link status, updates statistics,
4421 * and runs the watchdog check.
4422 ************************************************************************/
4423 static void
4424 ixgbe_local_timer(void *arg)
4425 {
4426 struct adapter *adapter = arg;
4427
4428 IXGBE_CORE_LOCK(adapter);
4429 ixgbe_local_timer1(adapter);
4430 IXGBE_CORE_UNLOCK(adapter);
4431 }
4432
4433 static void
4434 ixgbe_local_timer1(void *arg)
4435 {
4436 struct adapter *adapter = arg;
4437 device_t dev = adapter->dev;
4438 struct ix_queue *que = adapter->queues;
4439 u64 queues = 0;
4440 u64 v0, v1, v2, v3, v4, v5, v6, v7;
4441 int hung = 0;
4442 int i;
4443
4444 KASSERT(mutex_owned(&adapter->core_mtx));
4445
4446 /* Check for pluggable optics */
4447 if (adapter->sfp_probe)
4448 if (!ixgbe_sfp_probe(adapter))
4449 goto out; /* Nothing to do */
4450
4451 ixgbe_update_link_status(adapter);
4452 ixgbe_update_stats_counters(adapter);
4453
4454 /* Update some event counters */
4455 v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
4456 que = adapter->queues;
4457 for (i = 0; i < adapter->num_queues; i++, que++) {
4458 struct tx_ring *txr = que->txr;
4459
4460 v0 += txr->q_efbig_tx_dma_setup;
4461 v1 += txr->q_mbuf_defrag_failed;
4462 v2 += txr->q_efbig2_tx_dma_setup;
4463 v3 += txr->q_einval_tx_dma_setup;
4464 v4 += txr->q_other_tx_dma_setup;
4465 v5 += txr->q_eagain_tx_dma_setup;
4466 v6 += txr->q_enomem_tx_dma_setup;
4467 v7 += txr->q_tso_err;
4468 }
4469 adapter->efbig_tx_dma_setup.ev_count = v0;
4470 adapter->mbuf_defrag_failed.ev_count = v1;
4471 adapter->efbig2_tx_dma_setup.ev_count = v2;
4472 adapter->einval_tx_dma_setup.ev_count = v3;
4473 adapter->other_tx_dma_setup.ev_count = v4;
4474 adapter->eagain_tx_dma_setup.ev_count = v5;
4475 adapter->enomem_tx_dma_setup.ev_count = v6;
4476 adapter->tso_err.ev_count = v7;
4477
4478 /*
4479 * Check the TX queues status
4480 * - mark hung queues so we don't schedule on them
4481 * - watchdog only if all queues show hung
4482 */
4483 que = adapter->queues;
4484 for (i = 0; i < adapter->num_queues; i++, que++) {
4485 /* Keep track of queues with work for soft irq */
4486 if (que->txr->busy)
4487 queues |= 1ULL << que->me;
4488 /*
4489 * Each time txeof runs without cleaning, but there
4490 * are uncleaned descriptors it increments busy. If
4491 * we get to the MAX we declare it hung.
4492 */
4493 if (que->busy == IXGBE_QUEUE_HUNG) {
4494 ++hung;
4495 /* Mark the queue as inactive */
4496 adapter->active_queues &= ~(1ULL << que->me);
4497 continue;
4498 } else {
4499 /* Check if we've come back from hung */
4500 if ((adapter->active_queues & (1ULL << que->me)) == 0)
4501 adapter->active_queues |= 1ULL << que->me;
4502 }
4503 if (que->busy >= IXGBE_MAX_TX_BUSY) {
4504 device_printf(dev,
4505 "Warning queue %d appears to be hung!\n", i);
4506 que->txr->busy = IXGBE_QUEUE_HUNG;
4507 ++hung;
4508 }
4509 }
4510
4511 /* Only truely watchdog if all queues show hung */
4512 if (hung == adapter->num_queues)
4513 goto watchdog;
4514 #if 0 /* XXX Avoid unexpectedly disabling interrupt forever (PR#53294) */
4515 else if (queues != 0) { /* Force an IRQ on queues with work */
4516 que = adapter->queues;
4517 for (i = 0; i < adapter->num_queues; i++, que++) {
4518 mutex_enter(&que->dc_mtx);
4519 if (que->disabled_count == 0)
4520 ixgbe_rearm_queues(adapter,
4521 queues & ((u64)1 << i));
4522 mutex_exit(&que->dc_mtx);
4523 }
4524 }
4525 #endif
4526
4527 out:
4528 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4529 return;
4530
4531 watchdog:
4532 device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
4533 adapter->ifp->if_flags &= ~IFF_RUNNING;
4534 adapter->watchdog_events.ev_count++;
4535 ixgbe_init_locked(adapter);
4536 } /* ixgbe_local_timer */
4537
4538 /************************************************************************
4539 * ixgbe_recovery_mode_timer - Recovery mode timer routine
4540 ************************************************************************/
4541 static void
4542 ixgbe_recovery_mode_timer(void *arg)
4543 {
4544 struct adapter *adapter = arg;
4545 struct ixgbe_hw *hw = &adapter->hw;
4546
4547 IXGBE_CORE_LOCK(adapter);
4548 if (ixgbe_fw_recovery_mode(hw)) {
4549 if (atomic_cas_uint(&adapter->recovery_mode, 0, 1)) {
4550 /* Firmware error detected, entering recovery mode */
4551 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");
4552
4553 if (hw->adapter_stopped == FALSE)
4554 ixgbe_stop(adapter);
4555 }
4556 } else
4557 atomic_cas_uint(&adapter->recovery_mode, 1, 0);
4558
4559 callout_reset(&adapter->recovery_mode_timer, hz,
4560 ixgbe_recovery_mode_timer, adapter);
4561 IXGBE_CORE_UNLOCK(adapter);
4562 } /* ixgbe_recovery_mode_timer */
4563
4564 /************************************************************************
4565 * ixgbe_sfp_probe
4566 *
4567 * Determine if a port had optics inserted.
4568 ************************************************************************/
4569 static bool
4570 ixgbe_sfp_probe(struct adapter *adapter)
4571 {
4572 struct ixgbe_hw *hw = &adapter->hw;
4573 device_t dev = adapter->dev;
4574 bool result = FALSE;
4575
4576 if ((hw->phy.type == ixgbe_phy_nl) &&
4577 (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
4578 s32 ret = hw->phy.ops.identify_sfp(hw);
4579 if (ret)
4580 goto out;
4581 ret = hw->phy.ops.reset(hw);
4582 adapter->sfp_probe = FALSE;
4583 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4584 device_printf(dev,"Unsupported SFP+ module detected!");
4585 device_printf(dev,
4586 "Reload driver with supported module.\n");
4587 goto out;
4588 } else
4589 device_printf(dev, "SFP+ module detected!\n");
4590 /* We now have supported optics */
4591 result = TRUE;
4592 }
4593 out:
4594
4595 return (result);
4596 } /* ixgbe_sfp_probe */
4597
4598 /************************************************************************
4599 * ixgbe_handle_mod - Tasklet for SFP module interrupts
4600 ************************************************************************/
4601 static void
4602 ixgbe_handle_mod(void *context)
4603 {
4604 struct adapter *adapter = context;
4605 struct ixgbe_hw *hw = &adapter->hw;
4606 device_t dev = adapter->dev;
4607 u32 err, cage_full = 0;
4608
4609 ++adapter->mod_sicount.ev_count;
4610 if (adapter->hw.need_crosstalk_fix) {
4611 switch (hw->mac.type) {
4612 case ixgbe_mac_82599EB:
4613 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
4614 IXGBE_ESDP_SDP2;
4615 break;
4616 case ixgbe_mac_X550EM_x:
4617 case ixgbe_mac_X550EM_a:
4618 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
4619 IXGBE_ESDP_SDP0;
4620 break;
4621 default:
4622 break;
4623 }
4624
4625 if (!cage_full)
4626 return;
4627 }
4628
4629 err = hw->phy.ops.identify_sfp(hw);
4630 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4631 device_printf(dev,
4632 "Unsupported SFP+ module type was detected.\n");
4633 return;
4634 }
4635
4636 if (hw->mac.type == ixgbe_mac_82598EB)
4637 err = hw->phy.ops.reset(hw);
4638 else
4639 err = hw->mac.ops.setup_sfp(hw);
4640
4641 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4642 device_printf(dev,
4643 "Setup failure - unsupported SFP+ module type.\n");
4644 return;
4645 }
4646 softint_schedule(adapter->msf_si);
4647 } /* ixgbe_handle_mod */
4648
4649
4650 /************************************************************************
4651 * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
4652 ************************************************************************/
4653 static void
4654 ixgbe_handle_msf(void *context)
4655 {
4656 struct adapter *adapter = context;
4657 struct ixgbe_hw *hw = &adapter->hw;
4658 u32 autoneg;
4659 bool negotiate;
4660
4661 IXGBE_CORE_LOCK(adapter);
4662 ++adapter->msf_sicount.ev_count;
4663 /* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
4664 adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
4665
4666 autoneg = hw->phy.autoneg_advertised;
4667 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
4668 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
4669 else
4670 negotiate = 0;
4671 if (hw->mac.ops.setup_link)
4672 hw->mac.ops.setup_link(hw, autoneg, TRUE);
4673
4674 /* Adjust media types shown in ifconfig */
4675 ifmedia_removeall(&adapter->media);
4676 ixgbe_add_media_types(adapter);
4677 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
4678 IXGBE_CORE_UNLOCK(adapter);
4679 } /* ixgbe_handle_msf */
4680
4681 /************************************************************************
4682 * ixgbe_handle_phy - Tasklet for external PHY interrupts
4683 ************************************************************************/
4684 static void
4685 ixgbe_handle_phy(void *context)
4686 {
4687 struct adapter *adapter = context;
4688 struct ixgbe_hw *hw = &adapter->hw;
4689 int error;
4690
4691 ++adapter->phy_sicount.ev_count;
4692 error = hw->phy.ops.handle_lasi(hw);
4693 if (error == IXGBE_ERR_OVERTEMP)
4694 device_printf(adapter->dev,
4695 "CRITICAL: EXTERNAL PHY OVER TEMP!! "
4696 " PHY will downshift to lower power state!\n");
4697 else if (error)
4698 device_printf(adapter->dev,
4699 "Error handling LASI interrupt: %d\n", error);
4700 } /* ixgbe_handle_phy */
4701
4702 static void
4703 ixgbe_ifstop(struct ifnet *ifp, int disable)
4704 {
4705 struct adapter *adapter = ifp->if_softc;
4706
4707 IXGBE_CORE_LOCK(adapter);
4708 ixgbe_stop(adapter);
4709 IXGBE_CORE_UNLOCK(adapter);
4710 }
4711
4712 /************************************************************************
4713 * ixgbe_stop - Stop the hardware
4714 *
4715 * Disables all traffic on the adapter by issuing a
4716 * global reset on the MAC and deallocates TX/RX buffers.
4717 ************************************************************************/
4718 static void
4719 ixgbe_stop(void *arg)
4720 {
4721 struct ifnet *ifp;
4722 struct adapter *adapter = arg;
4723 struct ixgbe_hw *hw = &adapter->hw;
4724
4725 ifp = adapter->ifp;
4726
4727 KASSERT(mutex_owned(&adapter->core_mtx));
4728
4729 INIT_DEBUGOUT("ixgbe_stop: begin\n");
4730 ixgbe_disable_intr(adapter);
4731 callout_stop(&adapter->timer);
4732
4733 /* Let the stack know...*/
4734 ifp->if_flags &= ~IFF_RUNNING;
4735
4736 ixgbe_reset_hw(hw);
4737 hw->adapter_stopped = FALSE;
4738 ixgbe_stop_adapter(hw);
4739 if (hw->mac.type == ixgbe_mac_82599EB)
4740 ixgbe_stop_mac_link_on_d3_82599(hw);
4741 /* Turn off the laser - noop with no optics */
4742 ixgbe_disable_tx_laser(hw);
4743
4744 /* Update the stack */
4745 adapter->link_up = FALSE;
4746 ixgbe_update_link_status(adapter);
4747
4748 /* reprogram the RAR[0] in case user changed it. */
4749 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
4750
4751 return;
4752 } /* ixgbe_stop */
4753
4754 /************************************************************************
4755 * ixgbe_update_link_status - Update OS on link state
4756 *
4757 * Note: Only updates the OS on the cached link state.
4758 * The real check of the hardware only happens with
4759 * a link interrupt.
4760 ************************************************************************/
4761 static void
4762 ixgbe_update_link_status(struct adapter *adapter)
4763 {
4764 struct ifnet *ifp = adapter->ifp;
4765 device_t dev = adapter->dev;
4766 struct ixgbe_hw *hw = &adapter->hw;
4767
4768 KASSERT(mutex_owned(&adapter->core_mtx));
4769
4770 if (adapter->link_up) {
4771 if (adapter->link_active != LINK_STATE_UP) {
4772 /*
4773 * To eliminate influence of the previous state
4774 * in the same way as ixgbe_init_locked().
4775 */
4776 struct ix_queue *que = adapter->queues;
4777 for (int i = 0; i < adapter->num_queues; i++, que++)
4778 que->eitr_setting = 0;
4779
4780 if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL){
4781 /*
4782 * Discard count for both MAC Local Fault and
4783 * Remote Fault because those registers are
4784 * valid only when the link speed is up and
4785 * 10Gbps.
4786 */
4787 IXGBE_READ_REG(hw, IXGBE_MLFC);
4788 IXGBE_READ_REG(hw, IXGBE_MRFC);
4789 }
4790
4791 if (bootverbose) {
4792 const char *bpsmsg;
4793
4794 switch (adapter->link_speed) {
4795 case IXGBE_LINK_SPEED_10GB_FULL:
4796 bpsmsg = "10 Gbps";
4797 break;
4798 case IXGBE_LINK_SPEED_5GB_FULL:
4799 bpsmsg = "5 Gbps";
4800 break;
4801 case IXGBE_LINK_SPEED_2_5GB_FULL:
4802 bpsmsg = "2.5 Gbps";
4803 break;
4804 case IXGBE_LINK_SPEED_1GB_FULL:
4805 bpsmsg = "1 Gbps";
4806 break;
4807 case IXGBE_LINK_SPEED_100_FULL:
4808 bpsmsg = "100 Mbps";
4809 break;
4810 case IXGBE_LINK_SPEED_10_FULL:
4811 bpsmsg = "10 Mbps";
4812 break;
4813 default:
4814 bpsmsg = "unknown speed";
4815 break;
4816 }
4817 device_printf(dev, "Link is up %s %s \n",
4818 bpsmsg, "Full Duplex");
4819 }
4820 adapter->link_active = LINK_STATE_UP;
4821 /* Update any Flow Control changes */
4822 ixgbe_fc_enable(&adapter->hw);
4823 /* Update DMA coalescing config */
4824 ixgbe_config_dmac(adapter);
4825 if_link_state_change(ifp, LINK_STATE_UP);
4826
4827 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
4828 ixgbe_ping_all_vfs(adapter);
4829 }
4830 } else {
4831 /*
4832 * Do it when link active changes to DOWN. i.e.
4833 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
4834 * b) LINK_STATE_UP -> LINK_STATE_DOWN
4835 */
4836 if (adapter->link_active != LINK_STATE_DOWN) {
4837 if (bootverbose)
4838 device_printf(dev, "Link is Down\n");
4839 if_link_state_change(ifp, LINK_STATE_DOWN);
4840 adapter->link_active = LINK_STATE_DOWN;
4841 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
4842 ixgbe_ping_all_vfs(adapter);
4843 ixgbe_drain_all(adapter);
4844 }
4845 }
4846 } /* ixgbe_update_link_status */
4847
4848 /************************************************************************
4849 * ixgbe_config_dmac - Configure DMA Coalescing
4850 ************************************************************************/
4851 static void
4852 ixgbe_config_dmac(struct adapter *adapter)
4853 {
4854 struct ixgbe_hw *hw = &adapter->hw;
4855 struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
4856
4857 if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
4858 return;
4859
4860 if (dcfg->watchdog_timer ^ adapter->dmac ||
4861 dcfg->link_speed ^ adapter->link_speed) {
4862 dcfg->watchdog_timer = adapter->dmac;
4863 dcfg->fcoe_en = false;
4864 dcfg->link_speed = adapter->link_speed;
4865 dcfg->num_tcs = 1;
4866
4867 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
4868 dcfg->watchdog_timer, dcfg->link_speed);
4869
4870 hw->mac.ops.dmac_config(hw);
4871 }
4872 } /* ixgbe_config_dmac */
4873
4874 /************************************************************************
4875 * ixgbe_enable_intr
4876 ************************************************************************/
4877 static void
4878 ixgbe_enable_intr(struct adapter *adapter)
4879 {
4880 struct ixgbe_hw *hw = &adapter->hw;
4881 struct ix_queue *que = adapter->queues;
4882 u32 mask, fwsm;
4883
4884 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
4885
4886 switch (adapter->hw.mac.type) {
4887 case ixgbe_mac_82599EB:
4888 mask |= IXGBE_EIMS_ECC;
4889 /* Temperature sensor on some adapters */
4890 mask |= IXGBE_EIMS_GPI_SDP0;
4891 /* SFP+ (RX_LOS_N & MOD_ABS_N) */
4892 mask |= IXGBE_EIMS_GPI_SDP1;
4893 mask |= IXGBE_EIMS_GPI_SDP2;
4894 break;
4895 case ixgbe_mac_X540:
4896 /* Detect if Thermal Sensor is enabled */
4897 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
4898 if (fwsm & IXGBE_FWSM_TS_ENABLED)
4899 mask |= IXGBE_EIMS_TS;
4900 mask |= IXGBE_EIMS_ECC;
4901 break;
4902 case ixgbe_mac_X550:
4903 /* MAC thermal sensor is automatically enabled */
4904 mask |= IXGBE_EIMS_TS;
4905 mask |= IXGBE_EIMS_ECC;
4906 break;
4907 case ixgbe_mac_X550EM_x:
4908 case ixgbe_mac_X550EM_a:
4909 /* Some devices use SDP0 for important information */
4910 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
4911 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
4912 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
4913 hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
4914 mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
4915 if (hw->phy.type == ixgbe_phy_x550em_ext_t)
4916 mask |= IXGBE_EICR_GPI_SDP0_X540;
4917 mask |= IXGBE_EIMS_ECC;
4918 break;
4919 default:
4920 break;
4921 }
4922
4923 /* Enable Fan Failure detection */
4924 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
4925 mask |= IXGBE_EIMS_GPI_SDP1;
4926 /* Enable SR-IOV */
4927 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
4928 mask |= IXGBE_EIMS_MAILBOX;
4929 /* Enable Flow Director */
4930 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
4931 mask |= IXGBE_EIMS_FLOW_DIR;
4932
4933 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
4934
4935 /* With MSI-X we use auto clear */
4936 if (adapter->msix_mem) {
4937 mask = IXGBE_EIMS_ENABLE_MASK;
4938 /* Don't autoclear Link */
4939 mask &= ~IXGBE_EIMS_OTHER;
4940 mask &= ~IXGBE_EIMS_LSC;
4941 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
4942 mask &= ~IXGBE_EIMS_MAILBOX;
4943 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
4944 }
4945
4946 /*
4947 * Now enable all queues, this is done separately to
4948 * allow for handling the extended (beyond 32) MSI-X
4949 * vectors that can be used by 82599
4950 */
4951 for (int i = 0; i < adapter->num_queues; i++, que++)
4952 ixgbe_enable_queue(adapter, que->msix);
4953
4954 IXGBE_WRITE_FLUSH(hw);
4955
4956 } /* ixgbe_enable_intr */
4957
4958 /************************************************************************
4959 * ixgbe_disable_intr_internal
4960 ************************************************************************/
4961 static void
4962 ixgbe_disable_intr_internal(struct adapter *adapter, bool nestok)
4963 {
4964 struct ix_queue *que = adapter->queues;
4965
4966 /* disable interrupts other than queues */
4967 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~IXGBE_EIMC_RTX_QUEUE);
4968
4969 if (adapter->msix_mem)
4970 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
4971
4972 for (int i = 0; i < adapter->num_queues; i++, que++)
4973 ixgbe_disable_queue_internal(adapter, que->msix, nestok);
4974
4975 IXGBE_WRITE_FLUSH(&adapter->hw);
4976
4977 } /* ixgbe_do_disable_intr_internal */
4978
4979 /************************************************************************
4980 * ixgbe_disable_intr
4981 ************************************************************************/
4982 static void
4983 ixgbe_disable_intr(struct adapter *adapter)
4984 {
4985
4986 ixgbe_disable_intr_internal(adapter, true);
4987 } /* ixgbe_disable_intr */
4988
4989 /************************************************************************
4990 * ixgbe_ensure_disabled_intr
4991 ************************************************************************/
4992 void
4993 ixgbe_ensure_disabled_intr(struct adapter *adapter)
4994 {
4995
4996 ixgbe_disable_intr_internal(adapter, false);
4997 } /* ixgbe_ensure_disabled_intr */
4998
4999 /************************************************************************
5000 * ixgbe_legacy_irq - Legacy Interrupt Service routine
5001 ************************************************************************/
5002 static int
5003 ixgbe_legacy_irq(void *arg)
5004 {
5005 struct ix_queue *que = arg;
5006 struct adapter *adapter = que->adapter;
5007 struct ixgbe_hw *hw = &adapter->hw;
5008 struct ifnet *ifp = adapter->ifp;
5009 struct tx_ring *txr = adapter->tx_rings;
5010 bool more = false;
5011 u32 eicr, eicr_mask;
5012
5013 /* Silicon errata #26 on 82598 */
5014 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
5015
5016 eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
5017
5018 adapter->stats.pf.legint.ev_count++;
5019 ++que->irqs.ev_count;
5020 if (eicr == 0) {
5021 adapter->stats.pf.intzero.ev_count++;
5022 if ((ifp->if_flags & IFF_UP) != 0)
5023 ixgbe_enable_intr(adapter);
5024 return 0;
5025 }
5026
5027 if ((ifp->if_flags & IFF_RUNNING) != 0) {
5028 /*
5029 * The same as ixgbe_msix_que() about "que->txrx_use_workqueue".
5030 */
5031 que->txrx_use_workqueue = adapter->txrx_use_workqueue;
5032
5033 #ifdef __NetBSD__
5034 /* Don't run ixgbe_rxeof in interrupt context */
5035 more = true;
5036 #else
5037 more = ixgbe_rxeof(que);
5038 #endif
5039
5040 IXGBE_TX_LOCK(txr);
5041 ixgbe_txeof(txr);
5042 #ifdef notyet
5043 if (!ixgbe_ring_empty(ifp, txr->br))
5044 ixgbe_start_locked(ifp, txr);
5045 #endif
5046 IXGBE_TX_UNLOCK(txr);
5047 }
5048
5049 /* Check for fan failure */
5050 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
5051 ixgbe_check_fan_failure(adapter, eicr, true);
5052 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
5053 }
5054
5055 /* Link status change */
5056 if (eicr & IXGBE_EICR_LSC)
5057 softint_schedule(adapter->link_si);
5058
5059 if (ixgbe_is_sfp(hw)) {
5060 /* Pluggable optics-related interrupt */
5061 if (hw->mac.type >= ixgbe_mac_X540)
5062 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
5063 else
5064 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
5065
5066 if (eicr & eicr_mask) {
5067 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
5068 softint_schedule(adapter->mod_si);
5069 }
5070
5071 if ((hw->mac.type == ixgbe_mac_82599EB) &&
5072 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
5073 IXGBE_WRITE_REG(hw, IXGBE_EICR,
5074 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
5075 softint_schedule(adapter->msf_si);
5076 }
5077 }
5078
5079 /* External PHY interrupt */
5080 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
5081 (eicr & IXGBE_EICR_GPI_SDP0_X540))
5082 softint_schedule(adapter->phy_si);
5083
5084 if (more) {
5085 que->req.ev_count++;
5086 ixgbe_sched_handle_que(adapter, que);
5087 } else
5088 ixgbe_enable_intr(adapter);
5089
5090 return 1;
5091 } /* ixgbe_legacy_irq */
5092
5093 /************************************************************************
5094 * ixgbe_free_pciintr_resources
5095 ************************************************************************/
5096 static void
5097 ixgbe_free_pciintr_resources(struct adapter *adapter)
5098 {
5099 struct ix_queue *que = adapter->queues;
5100 int rid;
5101
5102 /*
5103 * Release all msix queue resources:
5104 */
5105 for (int i = 0; i < adapter->num_queues; i++, que++) {
5106 if (que->res != NULL) {
5107 pci_intr_disestablish(adapter->osdep.pc,
5108 adapter->osdep.ihs[i]);
5109 adapter->osdep.ihs[i] = NULL;
5110 }
5111 }
5112
5113 /* Clean the Legacy or Link interrupt last */
5114 if (adapter->vector) /* we are doing MSIX */
5115 rid = adapter->vector;
5116 else
5117 rid = 0;
5118
5119 if (adapter->osdep.ihs[rid] != NULL) {
5120 pci_intr_disestablish(adapter->osdep.pc,
5121 adapter->osdep.ihs[rid]);
5122 adapter->osdep.ihs[rid] = NULL;
5123 }
5124
5125 if (adapter->osdep.intrs != NULL) {
5126 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
5127 adapter->osdep.nintrs);
5128 adapter->osdep.intrs = NULL;
5129 }
5130 } /* ixgbe_free_pciintr_resources */
5131
5132 /************************************************************************
5133 * ixgbe_free_pci_resources
5134 ************************************************************************/
5135 static void
5136 ixgbe_free_pci_resources(struct adapter *adapter)
5137 {
5138
5139 ixgbe_free_pciintr_resources(adapter);
5140
5141 if (adapter->osdep.mem_size != 0) {
5142 bus_space_unmap(adapter->osdep.mem_bus_space_tag,
5143 adapter->osdep.mem_bus_space_handle,
5144 adapter->osdep.mem_size);
5145 }
5146
5147 } /* ixgbe_free_pci_resources */
5148
5149 /************************************************************************
5150 * ixgbe_set_sysctl_value
5151 ************************************************************************/
5152 static void
5153 ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
5154 const char *description, int *limit, int value)
5155 {
5156 device_t dev = adapter->dev;
5157 struct sysctllog **log;
5158 const struct sysctlnode *rnode, *cnode;
5159
5160 /*
5161 * It's not required to check recovery mode because this function never
5162 * touches hardware.
5163 */
5164
5165 log = &adapter->sysctllog;
5166 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
5167 aprint_error_dev(dev, "could not create sysctl root\n");
5168 return;
5169 }
5170 if (sysctl_createv(log, 0, &rnode, &cnode,
5171 CTLFLAG_READWRITE, CTLTYPE_INT,
5172 name, SYSCTL_DESCR(description),
5173 NULL, 0, limit, 0, CTL_CREATE, CTL_EOL) != 0)
5174 aprint_error_dev(dev, "could not create sysctl\n");
5175 *limit = value;
5176 } /* ixgbe_set_sysctl_value */
5177
5178 /************************************************************************
5179 * ixgbe_sysctl_flowcntl
5180 *
5181 * SYSCTL wrapper around setting Flow Control
5182 ************************************************************************/
5183 static int
5184 ixgbe_sysctl_flowcntl(SYSCTLFN_ARGS)
5185 {
5186 struct sysctlnode node = *rnode;
5187 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5188 int error, fc;
5189
5190 if (ixgbe_fw_recovery_mode_swflag(adapter))
5191 return (EPERM);
5192
5193 fc = adapter->hw.fc.current_mode;
5194 node.sysctl_data = &fc;
5195 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5196 if (error != 0 || newp == NULL)
5197 return error;
5198
5199 /* Don't bother if it's not changed */
5200 if (fc == adapter->hw.fc.current_mode)
5201 return (0);
5202
5203 return ixgbe_set_flowcntl(adapter, fc);
5204 } /* ixgbe_sysctl_flowcntl */
5205
5206 /************************************************************************
5207 * ixgbe_set_flowcntl - Set flow control
5208 *
5209 * Flow control values:
5210 * 0 - off
5211 * 1 - rx pause
5212 * 2 - tx pause
5213 * 3 - full
5214 ************************************************************************/
5215 static int
5216 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
5217 {
5218 switch (fc) {
5219 case ixgbe_fc_rx_pause:
5220 case ixgbe_fc_tx_pause:
5221 case ixgbe_fc_full:
5222 adapter->hw.fc.requested_mode = fc;
5223 if (adapter->num_queues > 1)
5224 ixgbe_disable_rx_drop(adapter);
5225 break;
5226 case ixgbe_fc_none:
5227 adapter->hw.fc.requested_mode = ixgbe_fc_none;
5228 if (adapter->num_queues > 1)
5229 ixgbe_enable_rx_drop(adapter);
5230 break;
5231 default:
5232 return (EINVAL);
5233 }
5234
5235 #if 0 /* XXX NetBSD */
5236 /* Don't autoneg if forcing a value */
5237 adapter->hw.fc.disable_fc_autoneg = TRUE;
5238 #endif
5239 ixgbe_fc_enable(&adapter->hw);
5240
5241 return (0);
5242 } /* ixgbe_set_flowcntl */
5243
5244 /************************************************************************
5245 * ixgbe_enable_rx_drop
5246 *
5247 * Enable the hardware to drop packets when the buffer is
5248 * full. This is useful with multiqueue, so that no single
5249 * queue being full stalls the entire RX engine. We only
5250 * enable this when Multiqueue is enabled AND Flow Control
5251 * is disabled.
5252 ************************************************************************/
5253 static void
5254 ixgbe_enable_rx_drop(struct adapter *adapter)
5255 {
5256 struct ixgbe_hw *hw = &adapter->hw;
5257 struct rx_ring *rxr;
5258 u32 srrctl;
5259
5260 for (int i = 0; i < adapter->num_queues; i++) {
5261 rxr = &adapter->rx_rings[i];
5262 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5263 srrctl |= IXGBE_SRRCTL_DROP_EN;
5264 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5265 }
5266
5267 /* enable drop for each vf */
5268 for (int i = 0; i < adapter->num_vfs; i++) {
5269 IXGBE_WRITE_REG(hw, IXGBE_QDE,
5270 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
5271 IXGBE_QDE_ENABLE));
5272 }
5273 } /* ixgbe_enable_rx_drop */
5274
5275 /************************************************************************
5276 * ixgbe_disable_rx_drop
5277 ************************************************************************/
5278 static void
5279 ixgbe_disable_rx_drop(struct adapter *adapter)
5280 {
5281 struct ixgbe_hw *hw = &adapter->hw;
5282 struct rx_ring *rxr;
5283 u32 srrctl;
5284
5285 for (int i = 0; i < adapter->num_queues; i++) {
5286 rxr = &adapter->rx_rings[i];
5287 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5288 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
5289 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5290 }
5291
5292 /* disable drop for each vf */
5293 for (int i = 0; i < adapter->num_vfs; i++) {
5294 IXGBE_WRITE_REG(hw, IXGBE_QDE,
5295 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
5296 }
5297 } /* ixgbe_disable_rx_drop */
5298
5299 /************************************************************************
5300 * ixgbe_sysctl_advertise
5301 *
5302 * SYSCTL wrapper around setting advertised speed
5303 ************************************************************************/
5304 static int
5305 ixgbe_sysctl_advertise(SYSCTLFN_ARGS)
5306 {
5307 struct sysctlnode node = *rnode;
5308 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5309 int error = 0, advertise;
5310
5311 if (ixgbe_fw_recovery_mode_swflag(adapter))
5312 return (EPERM);
5313
5314 advertise = adapter->advertise;
5315 node.sysctl_data = &advertise;
5316 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5317 if (error != 0 || newp == NULL)
5318 return error;
5319
5320 return ixgbe_set_advertise(adapter, advertise);
5321 } /* ixgbe_sysctl_advertise */
5322
5323 /************************************************************************
5324 * ixgbe_set_advertise - Control advertised link speed
5325 *
5326 * Flags:
5327 * 0x00 - Default (all capable link speed)
5328 * 0x01 - advertise 100 Mb
5329 * 0x02 - advertise 1G
5330 * 0x04 - advertise 10G
5331 * 0x08 - advertise 10 Mb
5332 * 0x10 - advertise 2.5G
5333 * 0x20 - advertise 5G
5334 ************************************************************************/
5335 static int
5336 ixgbe_set_advertise(struct adapter *adapter, int advertise)
5337 {
5338 device_t dev;
5339 struct ixgbe_hw *hw;
5340 ixgbe_link_speed speed = 0;
5341 ixgbe_link_speed link_caps = 0;
5342 s32 err = IXGBE_NOT_IMPLEMENTED;
5343 bool negotiate = FALSE;
5344
5345 /* Checks to validate new value */
5346 if (adapter->advertise == advertise) /* no change */
5347 return (0);
5348
5349 dev = adapter->dev;
5350 hw = &adapter->hw;
5351
5352 /* No speed changes for backplane media */
5353 if (hw->phy.media_type == ixgbe_media_type_backplane)
5354 return (ENODEV);
5355
5356 if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
5357 (hw->phy.multispeed_fiber))) {
5358 device_printf(dev,
5359 "Advertised speed can only be set on copper or "
5360 "multispeed fiber media types.\n");
5361 return (EINVAL);
5362 }
5363
5364 if (advertise < 0x0 || advertise > 0x2f) {
5365 device_printf(dev,
5366 "Invalid advertised speed; valid modes are 0x0 through 0x7\n");
5367 return (EINVAL);
5368 }
5369
5370 if (hw->mac.ops.get_link_capabilities) {
5371 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
5372 &negotiate);
5373 if (err != IXGBE_SUCCESS) {
5374 device_printf(dev, "Unable to determine supported advertise speeds\n");
5375 return (ENODEV);
5376 }
5377 }
5378
5379 /* Set new value and report new advertised mode */
5380 if (advertise & 0x1) {
5381 if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
5382 device_printf(dev, "Interface does not support 100Mb advertised speed\n");
5383 return (EINVAL);
5384 }
5385 speed |= IXGBE_LINK_SPEED_100_FULL;
5386 }
5387 if (advertise & 0x2) {
5388 if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
5389 device_printf(dev, "Interface does not support 1Gb advertised speed\n");
5390 return (EINVAL);
5391 }
5392 speed |= IXGBE_LINK_SPEED_1GB_FULL;
5393 }
5394 if (advertise & 0x4) {
5395 if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
5396 device_printf(dev, "Interface does not support 10Gb advertised speed\n");
5397 return (EINVAL);
5398 }
5399 speed |= IXGBE_LINK_SPEED_10GB_FULL;
5400 }
5401 if (advertise & 0x8) {
5402 if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
5403 device_printf(dev, "Interface does not support 10Mb advertised speed\n");
5404 return (EINVAL);
5405 }
5406 speed |= IXGBE_LINK_SPEED_10_FULL;
5407 }
5408 if (advertise & 0x10) {
5409 if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
5410 device_printf(dev, "Interface does not support 2.5Gb advertised speed\n");
5411 return (EINVAL);
5412 }
5413 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
5414 }
5415 if (advertise & 0x20) {
5416 if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
5417 device_printf(dev, "Interface does not support 5Gb advertised speed\n");
5418 return (EINVAL);
5419 }
5420 speed |= IXGBE_LINK_SPEED_5GB_FULL;
5421 }
5422 if (advertise == 0)
5423 speed = link_caps; /* All capable link speed */
5424
5425 hw->mac.autotry_restart = TRUE;
5426 hw->mac.ops.setup_link(hw, speed, TRUE);
5427 adapter->advertise = advertise;
5428
5429 return (0);
5430 } /* ixgbe_set_advertise */
5431
5432 /************************************************************************
5433 * ixgbe_get_advertise - Get current advertised speed settings
5434 *
5435 * Formatted for sysctl usage.
5436 * Flags:
5437 * 0x01 - advertise 100 Mb
5438 * 0x02 - advertise 1G
5439 * 0x04 - advertise 10G
5440 * 0x08 - advertise 10 Mb (yes, Mb)
5441 * 0x10 - advertise 2.5G
5442 * 0x20 - advertise 5G
5443 ************************************************************************/
5444 static int
5445 ixgbe_get_advertise(struct adapter *adapter)
5446 {
5447 struct ixgbe_hw *hw = &adapter->hw;
5448 int speed;
5449 ixgbe_link_speed link_caps = 0;
5450 s32 err;
5451 bool negotiate = FALSE;
5452
5453 /*
5454 * Advertised speed means nothing unless it's copper or
5455 * multi-speed fiber
5456 */
5457 if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
5458 !(hw->phy.multispeed_fiber))
5459 return (0);
5460
5461 err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
5462 if (err != IXGBE_SUCCESS)
5463 return (0);
5464
5465 speed =
5466 ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 0x04 : 0) |
5467 ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 0x02 : 0) |
5468 ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 0x01 : 0) |
5469 ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 0x08 : 0) |
5470 ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
5471 ((link_caps & IXGBE_LINK_SPEED_5GB_FULL) ? 0x20 : 0);
5472
5473 return speed;
5474 } /* ixgbe_get_advertise */
5475
5476 /************************************************************************
5477 * ixgbe_sysctl_dmac - Manage DMA Coalescing
5478 *
5479 * Control values:
5480 * 0/1 - off / on (use default value of 1000)
5481 *
5482 * Legal timer values are:
5483 * 50,100,250,500,1000,2000,5000,10000
5484 *
5485 * Turning off interrupt moderation will also turn this off.
5486 ************************************************************************/
5487 static int
5488 ixgbe_sysctl_dmac(SYSCTLFN_ARGS)
5489 {
5490 struct sysctlnode node = *rnode;
5491 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5492 struct ifnet *ifp = adapter->ifp;
5493 int error;
5494 int newval;
5495
5496 if (ixgbe_fw_recovery_mode_swflag(adapter))
5497 return (EPERM);
5498
5499 newval = adapter->dmac;
5500 node.sysctl_data = &newval;
5501 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5502 if ((error) || (newp == NULL))
5503 return (error);
5504
5505 switch (newval) {
5506 case 0:
5507 /* Disabled */
5508 adapter->dmac = 0;
5509 break;
5510 case 1:
5511 /* Enable and use default */
5512 adapter->dmac = 1000;
5513 break;
5514 case 50:
5515 case 100:
5516 case 250:
5517 case 500:
5518 case 1000:
5519 case 2000:
5520 case 5000:
5521 case 10000:
5522 /* Legal values - allow */
5523 adapter->dmac = newval;
5524 break;
5525 default:
5526 /* Do nothing, illegal value */
5527 return (EINVAL);
5528 }
5529
5530 /* Re-initialize hardware if it's already running */
5531 if (ifp->if_flags & IFF_RUNNING)
5532 ifp->if_init(ifp);
5533
5534 return (0);
5535 }
5536
5537 #ifdef IXGBE_DEBUG
5538 /************************************************************************
5539 * ixgbe_sysctl_power_state
5540 *
5541 * Sysctl to test power states
5542 * Values:
5543 * 0 - set device to D0
5544 * 3 - set device to D3
5545 * (none) - get current device power state
5546 ************************************************************************/
5547 static int
5548 ixgbe_sysctl_power_state(SYSCTLFN_ARGS)
5549 {
5550 #ifdef notyet
5551 struct sysctlnode node = *rnode;
5552 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5553 device_t dev = adapter->dev;
5554 int curr_ps, new_ps, error = 0;
5555
5556 if (ixgbe_fw_recovery_mode_swflag(adapter))
5557 return (EPERM);
5558
5559 curr_ps = new_ps = pci_get_powerstate(dev);
5560
5561 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5562 if ((error) || (req->newp == NULL))
5563 return (error);
5564
5565 if (new_ps == curr_ps)
5566 return (0);
5567
5568 if (new_ps == 3 && curr_ps == 0)
5569 error = DEVICE_SUSPEND(dev);
5570 else if (new_ps == 0 && curr_ps == 3)
5571 error = DEVICE_RESUME(dev);
5572 else
5573 return (EINVAL);
5574
5575 device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
5576
5577 return (error);
5578 #else
5579 return 0;
5580 #endif
5581 } /* ixgbe_sysctl_power_state */
5582 #endif
5583
5584 /************************************************************************
5585 * ixgbe_sysctl_wol_enable
5586 *
5587 * Sysctl to enable/disable the WoL capability,
5588 * if supported by the adapter.
5589 *
5590 * Values:
5591 * 0 - disabled
5592 * 1 - enabled
5593 ************************************************************************/
5594 static int
5595 ixgbe_sysctl_wol_enable(SYSCTLFN_ARGS)
5596 {
5597 struct sysctlnode node = *rnode;
5598 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5599 struct ixgbe_hw *hw = &adapter->hw;
5600 bool new_wol_enabled;
5601 int error = 0;
5602
5603 /*
5604 * It's not required to check recovery mode because this function never
5605 * touches hardware.
5606 */
5607 new_wol_enabled = hw->wol_enabled;
5608 node.sysctl_data = &new_wol_enabled;
5609 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5610 if ((error) || (newp == NULL))
5611 return (error);
5612 if (new_wol_enabled == hw->wol_enabled)
5613 return (0);
5614
5615 if (new_wol_enabled && !adapter->wol_support)
5616 return (ENODEV);
5617 else
5618 hw->wol_enabled = new_wol_enabled;
5619
5620 return (0);
5621 } /* ixgbe_sysctl_wol_enable */
5622
5623 /************************************************************************
5624 * ixgbe_sysctl_wufc - Wake Up Filter Control
5625 *
5626 * Sysctl to enable/disable the types of packets that the
5627 * adapter will wake up on upon receipt.
5628 * Flags:
5629 * 0x1 - Link Status Change
5630 * 0x2 - Magic Packet
5631 * 0x4 - Direct Exact
5632 * 0x8 - Directed Multicast
5633 * 0x10 - Broadcast
5634 * 0x20 - ARP/IPv4 Request Packet
5635 * 0x40 - Direct IPv4 Packet
5636 * 0x80 - Direct IPv6 Packet
5637 *
5638 * Settings not listed above will cause the sysctl to return an error.
5639 ************************************************************************/
5640 static int
5641 ixgbe_sysctl_wufc(SYSCTLFN_ARGS)
5642 {
5643 struct sysctlnode node = *rnode;
5644 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5645 int error = 0;
5646 u32 new_wufc;
5647
5648 /*
5649 * It's not required to check recovery mode because this function never
5650 * touches hardware.
5651 */
5652 new_wufc = adapter->wufc;
5653 node.sysctl_data = &new_wufc;
5654 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5655 if ((error) || (newp == NULL))
5656 return (error);
5657 if (new_wufc == adapter->wufc)
5658 return (0);
5659
5660 if (new_wufc & 0xffffff00)
5661 return (EINVAL);
5662
5663 new_wufc &= 0xff;
5664 new_wufc |= (0xffffff & adapter->wufc);
5665 adapter->wufc = new_wufc;
5666
5667 return (0);
5668 } /* ixgbe_sysctl_wufc */
5669
5670 #ifdef IXGBE_DEBUG
5671 /************************************************************************
5672 * ixgbe_sysctl_print_rss_config
5673 ************************************************************************/
5674 static int
5675 ixgbe_sysctl_print_rss_config(SYSCTLFN_ARGS)
5676 {
5677 #ifdef notyet
5678 struct sysctlnode node = *rnode;
5679 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5680 struct ixgbe_hw *hw = &adapter->hw;
5681 device_t dev = adapter->dev;
5682 struct sbuf *buf;
5683 int error = 0, reta_size;
5684 u32 reg;
5685
5686 if (ixgbe_fw_recovery_mode_swflag(adapter))
5687 return (EPERM);
5688
5689 buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5690 if (!buf) {
5691 device_printf(dev, "Could not allocate sbuf for output.\n");
5692 return (ENOMEM);
5693 }
5694
5695 // TODO: use sbufs to make a string to print out
5696 /* Set multiplier for RETA setup and table size based on MAC */
5697 switch (adapter->hw.mac.type) {
5698 case ixgbe_mac_X550:
5699 case ixgbe_mac_X550EM_x:
5700 case ixgbe_mac_X550EM_a:
5701 reta_size = 128;
5702 break;
5703 default:
5704 reta_size = 32;
5705 break;
5706 }
5707
5708 /* Print out the redirection table */
5709 sbuf_cat(buf, "\n");
5710 for (int i = 0; i < reta_size; i++) {
5711 if (i < 32) {
5712 reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
5713 sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
5714 } else {
5715 reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
5716 sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
5717 }
5718 }
5719
5720 // TODO: print more config
5721
5722 error = sbuf_finish(buf);
5723 if (error)
5724 device_printf(dev, "Error finishing sbuf: %d\n", error);
5725
5726 sbuf_delete(buf);
5727 #endif
5728 return (0);
5729 } /* ixgbe_sysctl_print_rss_config */
5730 #endif /* IXGBE_DEBUG */
5731
5732 /************************************************************************
5733 * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
5734 *
5735 * For X552/X557-AT devices using an external PHY
5736 ************************************************************************/
5737 static int
5738 ixgbe_sysctl_phy_temp(SYSCTLFN_ARGS)
5739 {
5740 struct sysctlnode node = *rnode;
5741 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5742 struct ixgbe_hw *hw = &adapter->hw;
5743 int val;
5744 u16 reg;
5745 int error;
5746
5747 if (ixgbe_fw_recovery_mode_swflag(adapter))
5748 return (EPERM);
5749
5750 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
5751 device_printf(adapter->dev,
5752 "Device has no supported external thermal sensor.\n");
5753 return (ENODEV);
5754 }
5755
5756 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
5757 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
5758 device_printf(adapter->dev,
5759 "Error reading from PHY's current temperature register\n");
5760 return (EAGAIN);
5761 }
5762
5763 node.sysctl_data = &val;
5764
5765 /* Shift temp for output */
5766 val = reg >> 8;
5767
5768 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5769 if ((error) || (newp == NULL))
5770 return (error);
5771
5772 return (0);
5773 } /* ixgbe_sysctl_phy_temp */
5774
5775 /************************************************************************
5776 * ixgbe_sysctl_phy_overtemp_occurred
5777 *
5778 * Reports (directly from the PHY) whether the current PHY
5779 * temperature is over the overtemp threshold.
5780 ************************************************************************/
5781 static int
5782 ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_ARGS)
5783 {
5784 struct sysctlnode node = *rnode;
5785 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5786 struct ixgbe_hw *hw = &adapter->hw;
5787 int val, error;
5788 u16 reg;
5789
5790 if (ixgbe_fw_recovery_mode_swflag(adapter))
5791 return (EPERM);
5792
5793 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
5794 device_printf(adapter->dev,
5795 "Device has no supported external thermal sensor.\n");
5796 return (ENODEV);
5797 }
5798
5799 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
5800 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
5801 device_printf(adapter->dev,
5802 "Error reading from PHY's temperature status register\n");
5803 return (EAGAIN);
5804 }
5805
5806 node.sysctl_data = &val;
5807
5808 /* Get occurrence bit */
5809 val = !!(reg & 0x4000);
5810
5811 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5812 if ((error) || (newp == NULL))
5813 return (error);
5814
5815 return (0);
5816 } /* ixgbe_sysctl_phy_overtemp_occurred */
5817
5818 /************************************************************************
5819 * ixgbe_sysctl_eee_state
5820 *
5821 * Sysctl to set EEE power saving feature
5822 * Values:
5823 * 0 - disable EEE
5824 * 1 - enable EEE
5825 * (none) - get current device EEE state
5826 ************************************************************************/
5827 static int
5828 ixgbe_sysctl_eee_state(SYSCTLFN_ARGS)
5829 {
5830 struct sysctlnode node = *rnode;
5831 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5832 struct ifnet *ifp = adapter->ifp;
5833 device_t dev = adapter->dev;
5834 int curr_eee, new_eee, error = 0;
5835 s32 retval;
5836
5837 if (ixgbe_fw_recovery_mode_swflag(adapter))
5838 return (EPERM);
5839
5840 curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
5841 node.sysctl_data = &new_eee;
5842 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5843 if ((error) || (newp == NULL))
5844 return (error);
5845
5846 /* Nothing to do */
5847 if (new_eee == curr_eee)
5848 return (0);
5849
5850 /* Not supported */
5851 if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
5852 return (EINVAL);
5853
5854 /* Bounds checking */
5855 if ((new_eee < 0) || (new_eee > 1))
5856 return (EINVAL);
5857
5858 retval = adapter->hw.mac.ops.setup_eee(&adapter->hw, new_eee);
5859 if (retval) {
5860 device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
5861 return (EINVAL);
5862 }
5863
5864 /* Restart auto-neg */
5865 ifp->if_init(ifp);
5866
5867 device_printf(dev, "New EEE state: %d\n", new_eee);
5868
5869 /* Cache new value */
5870 if (new_eee)
5871 adapter->feat_en |= IXGBE_FEATURE_EEE;
5872 else
5873 adapter->feat_en &= ~IXGBE_FEATURE_EEE;
5874
5875 return (error);
5876 } /* ixgbe_sysctl_eee_state */
5877
5878 #define PRINTQS(adapter, regname) \
5879 do { \
5880 struct ixgbe_hw *_hw = &(adapter)->hw; \
5881 int _i; \
5882 \
5883 printf("%s: %s", device_xname((adapter)->dev), #regname); \
5884 for (_i = 0; _i < (adapter)->num_queues; _i++) { \
5885 printf((_i == 0) ? "\t" : " "); \
5886 printf("%08x", IXGBE_READ_REG(_hw, \
5887 IXGBE_##regname(_i))); \
5888 } \
5889 printf("\n"); \
5890 } while (0)
5891
5892 /************************************************************************
5893 * ixgbe_print_debug_info
5894 *
5895 * Called only when em_display_debug_stats is enabled.
5896 * Provides a way to take a look at important statistics
5897 * maintained by the driver and hardware.
5898 ************************************************************************/
5899 static void
5900 ixgbe_print_debug_info(struct adapter *adapter)
5901 {
5902 device_t dev = adapter->dev;
5903 struct ixgbe_hw *hw = &adapter->hw;
5904 int table_size;
5905 int i;
5906
5907 switch (adapter->hw.mac.type) {
5908 case ixgbe_mac_X550:
5909 case ixgbe_mac_X550EM_x:
5910 case ixgbe_mac_X550EM_a:
5911 table_size = 128;
5912 break;
5913 default:
5914 table_size = 32;
5915 break;
5916 }
5917
5918 device_printf(dev, "[E]RETA:\n");
5919 for (i = 0; i < table_size; i++) {
5920 if (i < 32)
5921 printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
5922 IXGBE_RETA(i)));
5923 else
5924 printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
5925 IXGBE_ERETA(i - 32)));
5926 }
5927
5928 device_printf(dev, "queue:");
5929 for (i = 0; i < adapter->num_queues; i++) {
5930 printf((i == 0) ? "\t" : " ");
5931 printf("%8d", i);
5932 }
5933 printf("\n");
5934 PRINTQS(adapter, RDBAL);
5935 PRINTQS(adapter, RDBAH);
5936 PRINTQS(adapter, RDLEN);
5937 PRINTQS(adapter, SRRCTL);
5938 PRINTQS(adapter, RDH);
5939 PRINTQS(adapter, RDT);
5940 PRINTQS(adapter, RXDCTL);
5941
5942 device_printf(dev, "RQSMR:");
5943 for (i = 0; i < adapter->num_queues / 4; i++) {
5944 printf((i == 0) ? "\t" : " ");
5945 printf("%08x", IXGBE_READ_REG(hw, IXGBE_RQSMR(i)));
5946 }
5947 printf("\n");
5948
5949 device_printf(dev, "disabled_count:");
5950 for (i = 0; i < adapter->num_queues; i++) {
5951 printf((i == 0) ? "\t" : " ");
5952 printf("%8d", adapter->queues[i].disabled_count);
5953 }
5954 printf("\n");
5955
5956 device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
5957 if (hw->mac.type != ixgbe_mac_82598EB) {
5958 device_printf(dev, "EIMS_EX(0):\t%08x\n",
5959 IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0)));
5960 device_printf(dev, "EIMS_EX(1):\t%08x\n",
5961 IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1)));
5962 }
5963 } /* ixgbe_print_debug_info */
5964
5965 /************************************************************************
5966 * ixgbe_sysctl_debug
5967 ************************************************************************/
5968 static int
5969 ixgbe_sysctl_debug(SYSCTLFN_ARGS)
5970 {
5971 struct sysctlnode node = *rnode;
5972 struct adapter *adapter = (struct adapter *)node.sysctl_data;
5973 int error, result = 0;
5974
5975 if (ixgbe_fw_recovery_mode_swflag(adapter))
5976 return (EPERM);
5977
5978 node.sysctl_data = &result;
5979 error = sysctl_lookup(SYSCTLFN_CALL(&node));
5980
5981 if (error || newp == NULL)
5982 return error;
5983
5984 if (result == 1)
5985 ixgbe_print_debug_info(adapter);
5986
5987 return 0;
5988 } /* ixgbe_sysctl_debug */
5989
5990 /************************************************************************
5991 * ixgbe_init_device_features
5992 ************************************************************************/
5993 static void
5994 ixgbe_init_device_features(struct adapter *adapter)
5995 {
5996 adapter->feat_cap = IXGBE_FEATURE_NETMAP
5997 | IXGBE_FEATURE_RSS
5998 | IXGBE_FEATURE_MSI
5999 | IXGBE_FEATURE_MSIX
6000 | IXGBE_FEATURE_LEGACY_IRQ
6001 | IXGBE_FEATURE_LEGACY_TX;
6002
6003 /* Set capabilities first... */
6004 switch (adapter->hw.mac.type) {
6005 case ixgbe_mac_82598EB:
6006 if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
6007 adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
6008 break;
6009 case ixgbe_mac_X540:
6010 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6011 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6012 if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
6013 (adapter->hw.bus.func == 0))
6014 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6015 break;
6016 case ixgbe_mac_X550:
6017 /*
6018 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6019 * NVM Image version.
6020 */
6021 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6022 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6023 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6024 break;
6025 case ixgbe_mac_X550EM_x:
6026 /*
6027 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6028 * NVM Image version.
6029 */
6030 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6031 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6032 if (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_X_KR)
6033 adapter->feat_cap |= IXGBE_FEATURE_EEE;
6034 break;
6035 case ixgbe_mac_X550EM_a:
6036 /*
6037 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6038 * NVM Image version.
6039 */
6040 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6041 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6042 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6043 if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
6044 (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
6045 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6046 adapter->feat_cap |= IXGBE_FEATURE_EEE;
6047 }
6048 break;
6049 case ixgbe_mac_82599EB:
6050 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6051 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6052 if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
6053 (adapter->hw.bus.func == 0))
6054 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6055 if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
6056 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6057 break;
6058 default:
6059 break;
6060 }
6061
6062 /* Enabled by default... */
6063 /* Fan failure detection */
6064 if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
6065 adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
6066 /* Netmap */
6067 if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
6068 adapter->feat_en |= IXGBE_FEATURE_NETMAP;
6069 /* EEE */
6070 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
6071 adapter->feat_en |= IXGBE_FEATURE_EEE;
6072 /* Thermal Sensor */
6073 if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
6074 adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
6075 /*
6076 * Recovery mode:
6077 * NetBSD: IXGBE_FEATURE_RECOVERY_MODE will be controlled after reading
6078 * NVM Image version.
6079 */
6080
6081 /* Enabled via global sysctl... */
6082 /* Flow Director */
6083 if (ixgbe_enable_fdir) {
6084 if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
6085 adapter->feat_en |= IXGBE_FEATURE_FDIR;
6086 else
6087 device_printf(adapter->dev, "Device does not support Flow Director. Leaving disabled.");
6088 }
6089 /* Legacy (single queue) transmit */
6090 if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
6091 ixgbe_enable_legacy_tx)
6092 adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
6093 /*
6094 * Message Signal Interrupts - Extended (MSI-X)
6095 * Normal MSI is only enabled if MSI-X calls fail.
6096 */
6097 if (!ixgbe_enable_msix)
6098 adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
6099 /* Receive-Side Scaling (RSS) */
6100 if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
6101 adapter->feat_en |= IXGBE_FEATURE_RSS;
6102
6103 /* Disable features with unmet dependencies... */
6104 /* No MSI-X */
6105 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
6106 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
6107 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
6108 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
6109 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
6110 }
6111 } /* ixgbe_init_device_features */
6112
6113 /************************************************************************
6114 * ixgbe_probe - Device identification routine
6115 *
6116 * Determines if the driver should be loaded on
6117 * adapter based on its PCI vendor/device ID.
6118 *
6119 * return BUS_PROBE_DEFAULT on success, positive on failure
6120 ************************************************************************/
6121 static int
6122 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
6123 {
6124 const struct pci_attach_args *pa = aux;
6125
6126 return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
6127 }
6128
6129 static const ixgbe_vendor_info_t *
6130 ixgbe_lookup(const struct pci_attach_args *pa)
6131 {
6132 const ixgbe_vendor_info_t *ent;
6133 pcireg_t subid;
6134
6135 INIT_DEBUGOUT("ixgbe_lookup: begin");
6136
6137 if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
6138 return NULL;
6139
6140 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
6141
6142 for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
6143 if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
6144 (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
6145 ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
6146 (ent->subvendor_id == 0)) &&
6147 ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
6148 (ent->subdevice_id == 0))) {
6149 return ent;
6150 }
6151 }
6152 return NULL;
6153 }
6154
6155 static int
6156 ixgbe_ifflags_cb(struct ethercom *ec)
6157 {
6158 struct ifnet *ifp = &ec->ec_if;
6159 struct adapter *adapter = ifp->if_softc;
6160 int change, rv = 0;
6161
6162 IXGBE_CORE_LOCK(adapter);
6163
6164 change = ifp->if_flags ^ adapter->if_flags;
6165 if (change != 0)
6166 adapter->if_flags = ifp->if_flags;
6167
6168 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
6169 rv = ENETRESET;
6170 goto out;
6171 } else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
6172 ixgbe_set_promisc(adapter);
6173
6174 /* Set up VLAN support and filter */
6175 ixgbe_setup_vlan_hw_support(adapter);
6176
6177 out:
6178 IXGBE_CORE_UNLOCK(adapter);
6179
6180 return rv;
6181 }
6182
6183 /************************************************************************
6184 * ixgbe_ioctl - Ioctl entry point
6185 *
6186 * Called when the user wants to configure the interface.
6187 *
6188 * return 0 on success, positive on failure
6189 ************************************************************************/
6190 static int
6191 ixgbe_ioctl(struct ifnet * ifp, u_long command, void *data)
6192 {
6193 struct adapter *adapter = ifp->if_softc;
6194 struct ixgbe_hw *hw = &adapter->hw;
6195 struct ifcapreq *ifcr = data;
6196 struct ifreq *ifr = data;
6197 int error = 0;
6198 int l4csum_en;
6199 const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
6200 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
6201
6202 if (ixgbe_fw_recovery_mode_swflag(adapter))
6203 return (EPERM);
6204
6205 switch (command) {
6206 case SIOCSIFFLAGS:
6207 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
6208 break;
6209 case SIOCADDMULTI:
6210 case SIOCDELMULTI:
6211 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
6212 break;
6213 case SIOCSIFMEDIA:
6214 case SIOCGIFMEDIA:
6215 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
6216 break;
6217 case SIOCSIFCAP:
6218 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
6219 break;
6220 case SIOCSIFMTU:
6221 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
6222 break;
6223 #ifdef __NetBSD__
6224 case SIOCINITIFADDR:
6225 IOCTL_DEBUGOUT("ioctl: SIOCINITIFADDR");
6226 break;
6227 case SIOCGIFFLAGS:
6228 IOCTL_DEBUGOUT("ioctl: SIOCGIFFLAGS");
6229 break;
6230 case SIOCGIFAFLAG_IN:
6231 IOCTL_DEBUGOUT("ioctl: SIOCGIFAFLAG_IN");
6232 break;
6233 case SIOCGIFADDR:
6234 IOCTL_DEBUGOUT("ioctl: SIOCGIFADDR");
6235 break;
6236 case SIOCGIFMTU:
6237 IOCTL_DEBUGOUT("ioctl: SIOCGIFMTU (Get Interface MTU)");
6238 break;
6239 case SIOCGIFCAP:
6240 IOCTL_DEBUGOUT("ioctl: SIOCGIFCAP (Get IF cap)");
6241 break;
6242 case SIOCGETHERCAP:
6243 IOCTL_DEBUGOUT("ioctl: SIOCGETHERCAP (Get ethercap)");
6244 break;
6245 case SIOCGLIFADDR:
6246 IOCTL_DEBUGOUT("ioctl: SIOCGLIFADDR (Get Interface addr)");
6247 break;
6248 case SIOCZIFDATA:
6249 IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
6250 hw->mac.ops.clear_hw_cntrs(hw);
6251 ixgbe_clear_evcnt(adapter);
6252 break;
6253 case SIOCAIFADDR:
6254 IOCTL_DEBUGOUT("ioctl: SIOCAIFADDR (add/chg IF alias)");
6255 break;
6256 #endif
6257 default:
6258 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
6259 break;
6260 }
6261
6262 switch (command) {
6263 case SIOCSIFMEDIA:
6264 case SIOCGIFMEDIA:
6265 return ifmedia_ioctl(ifp, ifr, &adapter->media, command);
6266 case SIOCGI2C:
6267 {
6268 struct ixgbe_i2c_req i2c;
6269
6270 IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
6271 error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
6272 if (error != 0)
6273 break;
6274 if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
6275 error = EINVAL;
6276 break;
6277 }
6278 if (i2c.len > sizeof(i2c.data)) {
6279 error = EINVAL;
6280 break;
6281 }
6282
6283 hw->phy.ops.read_i2c_byte(hw, i2c.offset,
6284 i2c.dev_addr, i2c.data);
6285 error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
6286 break;
6287 }
6288 case SIOCSIFCAP:
6289 /* Layer-4 Rx checksum offload has to be turned on and
6290 * off as a unit.
6291 */
6292 l4csum_en = ifcr->ifcr_capenable & l4csum;
6293 if (l4csum_en != l4csum && l4csum_en != 0)
6294 return EINVAL;
6295 /*FALLTHROUGH*/
6296 case SIOCADDMULTI:
6297 case SIOCDELMULTI:
6298 case SIOCSIFFLAGS:
6299 case SIOCSIFMTU:
6300 default:
6301 if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
6302 return error;
6303 if ((ifp->if_flags & IFF_RUNNING) == 0)
6304 ;
6305 else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
6306 IXGBE_CORE_LOCK(adapter);
6307 if ((ifp->if_flags & IFF_RUNNING) != 0)
6308 ixgbe_init_locked(adapter);
6309 ixgbe_recalculate_max_frame(adapter);
6310 IXGBE_CORE_UNLOCK(adapter);
6311 } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
6312 /*
6313 * Multicast list has changed; set the hardware filter
6314 * accordingly.
6315 */
6316 IXGBE_CORE_LOCK(adapter);
6317 ixgbe_disable_intr(adapter);
6318 ixgbe_set_multi(adapter);
6319 ixgbe_enable_intr(adapter);
6320 IXGBE_CORE_UNLOCK(adapter);
6321 }
6322 return 0;
6323 }
6324
6325 return error;
6326 } /* ixgbe_ioctl */
6327
6328 /************************************************************************
6329 * ixgbe_check_fan_failure
6330 ************************************************************************/
6331 static void
6332 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
6333 {
6334 u32 mask;
6335
6336 mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
6337 IXGBE_ESDP_SDP1;
6338
6339 if (reg & mask)
6340 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
6341 } /* ixgbe_check_fan_failure */
6342
6343 /************************************************************************
6344 * ixgbe_handle_que
6345 ************************************************************************/
6346 static void
6347 ixgbe_handle_que(void *context)
6348 {
6349 struct ix_queue *que = context;
6350 struct adapter *adapter = que->adapter;
6351 struct tx_ring *txr = que->txr;
6352 struct ifnet *ifp = adapter->ifp;
6353 bool more = false;
6354
6355 que->handleq.ev_count++;
6356
6357 if (ifp->if_flags & IFF_RUNNING) {
6358 more = ixgbe_rxeof(que);
6359 IXGBE_TX_LOCK(txr);
6360 more |= ixgbe_txeof(txr);
6361 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
6362 if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
6363 ixgbe_mq_start_locked(ifp, txr);
6364 /* Only for queue 0 */
6365 /* NetBSD still needs this for CBQ */
6366 if ((&adapter->queues[0] == que)
6367 && (!ixgbe_legacy_ring_empty(ifp, NULL)))
6368 ixgbe_legacy_start_locked(ifp, txr);
6369 IXGBE_TX_UNLOCK(txr);
6370 }
6371
6372 if (more) {
6373 que->req.ev_count++;
6374 ixgbe_sched_handle_que(adapter, que);
6375 } else if (que->res != NULL) {
6376 /* Re-enable this interrupt */
6377 ixgbe_enable_queue(adapter, que->msix);
6378 } else
6379 ixgbe_enable_intr(adapter);
6380
6381 return;
6382 } /* ixgbe_handle_que */
6383
6384 /************************************************************************
6385 * ixgbe_handle_que_work
6386 ************************************************************************/
6387 static void
6388 ixgbe_handle_que_work(struct work *wk, void *context)
6389 {
6390 struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
6391
6392 /*
6393 * "enqueued flag" is not required here.
6394 * See ixgbe_msix_que().
6395 */
6396 ixgbe_handle_que(que);
6397 }
6398
6399 /************************************************************************
6400 * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
6401 ************************************************************************/
6402 static int
6403 ixgbe_allocate_legacy(struct adapter *adapter,
6404 const struct pci_attach_args *pa)
6405 {
6406 device_t dev = adapter->dev;
6407 struct ix_queue *que = adapter->queues;
6408 struct tx_ring *txr = adapter->tx_rings;
6409 int counts[PCI_INTR_TYPE_SIZE];
6410 pci_intr_type_t intr_type, max_type;
6411 char intrbuf[PCI_INTRSTR_LEN];
6412 const char *intrstr = NULL;
6413
6414 /* We allocate a single interrupt resource */
6415 max_type = PCI_INTR_TYPE_MSI;
6416 counts[PCI_INTR_TYPE_MSIX] = 0;
6417 counts[PCI_INTR_TYPE_MSI] =
6418 (adapter->feat_en & IXGBE_FEATURE_MSI) ? 1 : 0;
6419 /* Check not feat_en but feat_cap to fallback to INTx */
6420 counts[PCI_INTR_TYPE_INTX] =
6421 (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) ? 1 : 0;
6422
6423 alloc_retry:
6424 if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
6425 aprint_error_dev(dev, "couldn't alloc interrupt\n");
6426 return ENXIO;
6427 }
6428 adapter->osdep.nintrs = 1;
6429 intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
6430 intrbuf, sizeof(intrbuf));
6431 adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
6432 adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
6433 device_xname(dev));
6434 intr_type = pci_intr_type(adapter->osdep.pc, adapter->osdep.intrs[0]);
6435 if (adapter->osdep.ihs[0] == NULL) {
6436 aprint_error_dev(dev,"unable to establish %s\n",
6437 (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
6438 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6439 adapter->osdep.intrs = NULL;
6440 switch (intr_type) {
6441 case PCI_INTR_TYPE_MSI:
6442 /* The next try is for INTx: Disable MSI */
6443 max_type = PCI_INTR_TYPE_INTX;
6444 counts[PCI_INTR_TYPE_INTX] = 1;
6445 adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6446 if (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) {
6447 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6448 goto alloc_retry;
6449 } else
6450 break;
6451 case PCI_INTR_TYPE_INTX:
6452 default:
6453 /* See below */
6454 break;
6455 }
6456 }
6457 if (intr_type == PCI_INTR_TYPE_INTX) {
6458 adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6459 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6460 }
6461 if (adapter->osdep.ihs[0] == NULL) {
6462 aprint_error_dev(dev,
6463 "couldn't establish interrupt%s%s\n",
6464 intrstr ? " at " : "", intrstr ? intrstr : "");
6465 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6466 adapter->osdep.intrs = NULL;
6467 return ENXIO;
6468 }
6469 aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
6470 /*
6471 * Try allocating a fast interrupt and the associated deferred
6472 * processing contexts.
6473 */
6474 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
6475 txr->txr_si =
6476 softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
6477 ixgbe_deferred_mq_start, txr);
6478 que->que_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
6479 ixgbe_handle_que, que);
6480
6481 if ((!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)
6482 & (txr->txr_si == NULL)) || (que->que_si == NULL)) {
6483 aprint_error_dev(dev,
6484 "could not establish software interrupts\n");
6485
6486 return ENXIO;
6487 }
6488 /* For simplicity in the handlers */
6489 adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
6490
6491 return (0);
6492 } /* ixgbe_allocate_legacy */
6493
6494 /************************************************************************
6495 * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
6496 ************************************************************************/
6497 static int
6498 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
6499 {
6500 device_t dev = adapter->dev;
6501 struct ix_queue *que = adapter->queues;
6502 struct tx_ring *txr = adapter->tx_rings;
6503 pci_chipset_tag_t pc;
6504 char intrbuf[PCI_INTRSTR_LEN];
6505 char intr_xname[32];
6506 char wqname[MAXCOMLEN];
6507 const char *intrstr = NULL;
6508 int error, vector = 0;
6509 int cpu_id = 0;
6510 kcpuset_t *affinity;
6511 #ifdef RSS
6512 unsigned int rss_buckets = 0;
6513 kcpuset_t cpu_mask;
6514 #endif
6515
6516 pc = adapter->osdep.pc;
6517 #ifdef RSS
6518 /*
6519 * If we're doing RSS, the number of queues needs to
6520 * match the number of RSS buckets that are configured.
6521 *
6522 * + If there's more queues than RSS buckets, we'll end
6523 * up with queues that get no traffic.
6524 *
6525 * + If there's more RSS buckets than queues, we'll end
6526 * up having multiple RSS buckets map to the same queue,
6527 * so there'll be some contention.
6528 */
6529 rss_buckets = rss_getnumbuckets();
6530 if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
6531 (adapter->num_queues != rss_buckets)) {
6532 device_printf(dev,
6533 "%s: number of queues (%d) != number of RSS buckets (%d)"
6534 "; performance will be impacted.\n",
6535 __func__, adapter->num_queues, rss_buckets);
6536 }
6537 #endif
6538
6539 adapter->osdep.nintrs = adapter->num_queues + 1;
6540 if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
6541 adapter->osdep.nintrs) != 0) {
6542 aprint_error_dev(dev,
6543 "failed to allocate MSI-X interrupt\n");
6544 return (ENXIO);
6545 }
6546
6547 kcpuset_create(&affinity, false);
6548 for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
6549 snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
6550 device_xname(dev), i);
6551 intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
6552 sizeof(intrbuf));
6553 #ifdef IXGBE_MPSAFE
6554 pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
6555 true);
6556 #endif
6557 /* Set the handler function */
6558 que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
6559 adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
6560 intr_xname);
6561 if (que->res == NULL) {
6562 aprint_error_dev(dev,
6563 "Failed to register QUE handler\n");
6564 error = ENXIO;
6565 goto err_out;
6566 }
6567 que->msix = vector;
6568 adapter->active_queues |= 1ULL << que->msix;
6569
6570 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
6571 #ifdef RSS
6572 /*
6573 * The queue ID is used as the RSS layer bucket ID.
6574 * We look up the queue ID -> RSS CPU ID and select
6575 * that.
6576 */
6577 cpu_id = rss_getcpu(i % rss_getnumbuckets());
6578 CPU_SETOF(cpu_id, &cpu_mask);
6579 #endif
6580 } else {
6581 /*
6582 * Bind the MSI-X vector, and thus the
6583 * rings to the corresponding CPU.
6584 *
6585 * This just happens to match the default RSS
6586 * round-robin bucket -> queue -> CPU allocation.
6587 */
6588 if (adapter->num_queues > 1)
6589 cpu_id = i;
6590 }
6591 /* Round-robin affinity */
6592 kcpuset_zero(affinity);
6593 kcpuset_set(affinity, cpu_id % ncpu);
6594 error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
6595 NULL);
6596 aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
6597 intrstr);
6598 if (error == 0) {
6599 #if 1 /* def IXGBE_DEBUG */
6600 #ifdef RSS
6601 aprintf_normal(", bound RSS bucket %d to CPU %d", i,
6602 cpu_id % ncpu);
6603 #else
6604 aprint_normal(", bound queue %d to cpu %d", i,
6605 cpu_id % ncpu);
6606 #endif
6607 #endif /* IXGBE_DEBUG */
6608 }
6609 aprint_normal("\n");
6610
6611 if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
6612 txr->txr_si = softint_establish(
6613 SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
6614 ixgbe_deferred_mq_start, txr);
6615 if (txr->txr_si == NULL) {
6616 aprint_error_dev(dev,
6617 "couldn't establish software interrupt\n");
6618 error = ENXIO;
6619 goto err_out;
6620 }
6621 }
6622 que->que_si
6623 = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
6624 ixgbe_handle_que, que);
6625 if (que->que_si == NULL) {
6626 aprint_error_dev(dev,
6627 "couldn't establish software interrupt\n");
6628 error = ENXIO;
6629 goto err_out;
6630 }
6631 }
6632 snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
6633 error = workqueue_create(&adapter->txr_wq, wqname,
6634 ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6635 IXGBE_WORKQUEUE_FLAGS);
6636 if (error) {
6637 aprint_error_dev(dev, "couldn't create workqueue for deferred Tx\n");
6638 goto err_out;
6639 }
6640 adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
6641
6642 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
6643 error = workqueue_create(&adapter->que_wq, wqname,
6644 ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6645 IXGBE_WORKQUEUE_FLAGS);
6646 if (error) {
6647 aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
6648 goto err_out;
6649 }
6650
6651 /* and Link */
6652 cpu_id++;
6653 snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
6654 adapter->vector = vector;
6655 intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
6656 sizeof(intrbuf));
6657 #ifdef IXGBE_MPSAFE
6658 pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
6659 true);
6660 #endif
6661 /* Set the link handler function */
6662 adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
6663 adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_link, adapter,
6664 intr_xname);
6665 if (adapter->osdep.ihs[vector] == NULL) {
6666 aprint_error_dev(dev, "Failed to register LINK handler\n");
6667 error = ENXIO;
6668 goto err_out;
6669 }
6670 /* Round-robin affinity */
6671 kcpuset_zero(affinity);
6672 kcpuset_set(affinity, cpu_id % ncpu);
6673 error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
6674 NULL);
6675
6676 aprint_normal_dev(dev,
6677 "for link, interrupting at %s", intrstr);
6678 if (error == 0)
6679 aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
6680 else
6681 aprint_normal("\n");
6682
6683 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
6684 adapter->mbx_si =
6685 softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
6686 ixgbe_handle_mbx, adapter);
6687 if (adapter->mbx_si == NULL) {
6688 aprint_error_dev(dev,
6689 "could not establish software interrupts\n");
6690
6691 error = ENXIO;
6692 goto err_out;
6693 }
6694 }
6695
6696 kcpuset_destroy(affinity);
6697 aprint_normal_dev(dev,
6698 "Using MSI-X interrupts with %d vectors\n", vector + 1);
6699
6700 return (0);
6701
6702 err_out:
6703 kcpuset_destroy(affinity);
6704 ixgbe_free_softint(adapter);
6705 ixgbe_free_pciintr_resources(adapter);
6706 return (error);
6707 } /* ixgbe_allocate_msix */
6708
6709 /************************************************************************
6710 * ixgbe_configure_interrupts
6711 *
6712 * Setup MSI-X, MSI, or legacy interrupts (in that order).
6713 * This will also depend on user settings.
6714 ************************************************************************/
6715 static int
6716 ixgbe_configure_interrupts(struct adapter *adapter)
6717 {
6718 device_t dev = adapter->dev;
6719 struct ixgbe_mac_info *mac = &adapter->hw.mac;
6720 int want, queues, msgs;
6721
6722 /* Default to 1 queue if MSI-X setup fails */
6723 adapter->num_queues = 1;
6724
6725 /* Override by tuneable */
6726 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX))
6727 goto msi;
6728
6729 /*
6730 * NetBSD only: Use single vector MSI when number of CPU is 1 to save
6731 * interrupt slot.
6732 */
6733 if (ncpu == 1)
6734 goto msi;
6735
6736 /* First try MSI-X */
6737 msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
6738 msgs = MIN(msgs, IXG_MAX_NINTR);
6739 if (msgs < 2)
6740 goto msi;
6741
6742 adapter->msix_mem = (void *)1; /* XXX */
6743
6744 /* Figure out a reasonable auto config value */
6745 queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
6746
6747 #ifdef RSS
6748 /* If we're doing RSS, clamp at the number of RSS buckets */
6749 if (adapter->feat_en & IXGBE_FEATURE_RSS)
6750 queues = min(queues, rss_getnumbuckets());
6751 #endif
6752 if (ixgbe_num_queues > queues) {
6753 aprint_error_dev(adapter->dev, "ixgbe_num_queues (%d) is too large, using reduced amount (%d).\n", ixgbe_num_queues, queues);
6754 ixgbe_num_queues = queues;
6755 }
6756
6757 if (ixgbe_num_queues != 0)
6758 queues = ixgbe_num_queues;
6759 else
6760 queues = min(queues,
6761 min(mac->max_tx_queues, mac->max_rx_queues));
6762
6763 /* reflect correct sysctl value */
6764 ixgbe_num_queues = queues;
6765
6766 /*
6767 * Want one vector (RX/TX pair) per queue
6768 * plus an additional for Link.
6769 */
6770 want = queues + 1;
6771 if (msgs >= want)
6772 msgs = want;
6773 else {
6774 aprint_error_dev(dev, "MSI-X Configuration Problem, "
6775 "%d vectors but %d queues wanted!\n",
6776 msgs, want);
6777 goto msi;
6778 }
6779 adapter->num_queues = queues;
6780 adapter->feat_en |= IXGBE_FEATURE_MSIX;
6781 return (0);
6782
6783 /*
6784 * MSI-X allocation failed or provided us with
6785 * less vectors than needed. Free MSI-X resources
6786 * and we'll try enabling MSI.
6787 */
6788 msi:
6789 /* Without MSI-X, some features are no longer supported */
6790 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
6791 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
6792 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
6793 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
6794
6795 msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
6796 adapter->msix_mem = NULL; /* XXX */
6797 if (msgs > 1)
6798 msgs = 1;
6799 if (msgs != 0) {
6800 msgs = 1;
6801 adapter->feat_en |= IXGBE_FEATURE_MSI;
6802 return (0);
6803 }
6804
6805 if (!(adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ)) {
6806 aprint_error_dev(dev,
6807 "Device does not support legacy interrupts.\n");
6808 return 1;
6809 }
6810
6811 adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6812
6813 return (0);
6814 } /* ixgbe_configure_interrupts */
6815
6816
6817 /************************************************************************
6818 * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
6819 *
6820 * Done outside of interrupt context since the driver might sleep
6821 ************************************************************************/
6822 static void
6823 ixgbe_handle_link(void *context)
6824 {
6825 struct adapter *adapter = context;
6826 struct ixgbe_hw *hw = &adapter->hw;
6827
6828 IXGBE_CORE_LOCK(adapter);
6829 ++adapter->link_sicount.ev_count;
6830 ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
6831 ixgbe_update_link_status(adapter);
6832
6833 /* Re-enable link interrupts */
6834 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
6835
6836 IXGBE_CORE_UNLOCK(adapter);
6837 } /* ixgbe_handle_link */
6838
6839 /************************************************************************
6840 * ixgbe_rearm_queues
6841 ************************************************************************/
6842 static __inline void
6843 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
6844 {
6845 u32 mask;
6846
6847 switch (adapter->hw.mac.type) {
6848 case ixgbe_mac_82598EB:
6849 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
6850 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
6851 break;
6852 case ixgbe_mac_82599EB:
6853 case ixgbe_mac_X540:
6854 case ixgbe_mac_X550:
6855 case ixgbe_mac_X550EM_x:
6856 case ixgbe_mac_X550EM_a:
6857 mask = (queues & 0xFFFFFFFF);
6858 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
6859 mask = (queues >> 32);
6860 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
6861 break;
6862 default:
6863 break;
6864 }
6865 } /* ixgbe_rearm_queues */
6866