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