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