ixgbe.c revision 1.42 1 /******************************************************************************
2
3 Copyright (c) 2001-2013, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32 ******************************************************************************/
33 /*
34 * Copyright (c) 2011 The NetBSD Foundation, Inc.
35 * All rights reserved.
36 *
37 * This code is derived from software contributed to The NetBSD Foundation
38 * by Coyote Point Systems, Inc.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 * notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 * notice, this list of conditions and the following disclaimer in the
47 * documentation and/or other materials provided with the distribution.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
50 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
51 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
52 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
53 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
54 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
55 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
56 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
57 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
58 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59 * POSSIBILITY OF SUCH DAMAGE.
60 */
61 /*$FreeBSD: head/sys/dev/ixgbe/ixgbe.c 279805 2015-03-09 10:29:15Z araujo $*/
62 /*$NetBSD: ixgbe.c,v 1.42 2016/11/28 02:23:33 msaitoh Exp $*/
63
64 #include "opt_inet.h"
65 #include "opt_inet6.h"
66
67 #include "ixgbe.h"
68 #include "vlan.h"
69
70 #include <sys/cprng.h>
71
72 /*********************************************************************
73 * Set this to one to display debug statistics
74 *********************************************************************/
75 int ixgbe_display_debug_stats = 0;
76
77 /*********************************************************************
78 * Driver version
79 *********************************************************************/
80 char ixgbe_driver_version[] = "2.5.15";
81
82 /*********************************************************************
83 * PCI Device ID Table
84 *
85 * Used by probe to select devices to load on
86 * Last field stores an index into ixgbe_strings
87 * Last entry must be all 0s
88 *
89 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
90 *********************************************************************/
91
92 static ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
93 {
94 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
95 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
96 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
97 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
98 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
99 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
100 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
101 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
102 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
103 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
104 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
105 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
106 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
107 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
108 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
109 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
110 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
111 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
112 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
113 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0},
114 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
115 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0},
116 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF_QP, 0, 0, 0},
117 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0},
118 /* required last entry */
119 {0, 0, 0, 0, 0}
120 };
121
122 /*********************************************************************
123 * Table of branding strings
124 *********************************************************************/
125
126 static const char *ixgbe_strings[] = {
127 "Intel(R) PRO/10GbE PCI-Express Network Driver"
128 };
129
130 /*********************************************************************
131 * Function prototypes
132 *********************************************************************/
133 static int ixgbe_probe(device_t, cfdata_t, void *);
134 static void ixgbe_attach(device_t, device_t, void *);
135 static int ixgbe_detach(device_t, int);
136 #if 0
137 static int ixgbe_shutdown(device_t);
138 #endif
139 static int ixgbe_ioctl(struct ifnet *, u_long, void *);
140 static void ixgbe_ifstop(struct ifnet *, int);
141 static int ixgbe_init(struct ifnet *);
142 static void ixgbe_init_locked(struct adapter *);
143 static void ixgbe_stop(void *);
144 static void ixgbe_media_status(struct ifnet *, struct ifmediareq *);
145 static int ixgbe_media_change(struct ifnet *);
146 static void ixgbe_identify_hardware(struct adapter *);
147 static int ixgbe_allocate_pci_resources(struct adapter *,
148 const struct pci_attach_args *);
149 static void ixgbe_get_slot_info(struct ixgbe_hw *);
150 static int ixgbe_allocate_msix(struct adapter *,
151 const struct pci_attach_args *);
152 static int ixgbe_allocate_legacy(struct adapter *,
153 const struct pci_attach_args *);
154 static int ixgbe_setup_msix(struct adapter *);
155 static void ixgbe_free_pci_resources(struct adapter *);
156 static void ixgbe_local_timer(void *);
157 static int ixgbe_setup_interface(device_t, struct adapter *);
158 static void ixgbe_config_link(struct adapter *);
159
160 static void ixgbe_initialize_transmit_units(struct adapter *);
161
162
163 static void ixgbe_initialize_receive_units(struct adapter *);
164
165 static void ixgbe_enable_intr(struct adapter *);
166 static void ixgbe_disable_intr(struct adapter *);
167 static void ixgbe_update_stats_counters(struct adapter *);
168 static void ixgbe_set_promisc(struct adapter *);
169 static void ixgbe_set_multi(struct adapter *);
170 static void ixgbe_update_link_status(struct adapter *);
171 static int ixgbe_set_flowcntl(SYSCTLFN_PROTO);
172 static int ixgbe_set_advertise(SYSCTLFN_PROTO);
173 static int ixgbe_set_thermal_test(SYSCTLFN_PROTO);
174 static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
175 static void ixgbe_configure_ivars(struct adapter *);
176 static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
177
178 static void ixgbe_setup_vlan_hw_support(struct adapter *);
179 #if 0
180 static void ixgbe_register_vlan(void *, struct ifnet *, u16);
181 static void ixgbe_unregister_vlan(void *, struct ifnet *, u16);
182 #endif
183
184 static void ixgbe_add_hw_stats(struct adapter *adapter);
185
186 static void ixgbe_enable_rx_drop(struct adapter *);
187 static void ixgbe_disable_rx_drop(struct adapter *);
188
189 /* Support for pluggable optic modules */
190 static bool ixgbe_sfp_probe(struct adapter *);
191 static void ixgbe_setup_optics(struct adapter *);
192
193 /* Legacy (single vector interrupt handler */
194 static int ixgbe_legacy_irq(void *);
195
196 /* The MSI/X Interrupt handlers */
197 static int ixgbe_msix_que(void *);
198 static int ixgbe_msix_link(void *);
199
200 /* Software interrupts for deferred work */
201 static void ixgbe_handle_que(void *);
202 static void ixgbe_handle_link(void *);
203 static void ixgbe_handle_msf(void *);
204 static void ixgbe_handle_mod(void *);
205
206 const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *);
207 static ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
208
209 #ifdef IXGBE_FDIR
210 static void ixgbe_reinit_fdir(void *, int);
211 #endif
212
213 /* Missing shared code prototype */
214 extern void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw);
215
216 /*********************************************************************
217 * FreeBSD Device Interface Entry Points
218 *********************************************************************/
219
220 CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
221 ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
222 DVF_DETACH_SHUTDOWN);
223
224 #if 0
225 devclass_t ixgbe_devclass;
226 DRIVER_MODULE(ixgbe, pci, ixgbe_driver, ixgbe_devclass, 0, 0);
227
228 MODULE_DEPEND(ixgbe, pci, 1, 1, 1);
229 MODULE_DEPEND(ixgbe, ether, 1, 1, 1);
230 #endif
231
232 /*
233 ** TUNEABLE PARAMETERS:
234 */
235
236 /*
237 ** AIM: Adaptive Interrupt Moderation
238 ** which means that the interrupt rate
239 ** is varied over time based on the
240 ** traffic for that interrupt vector
241 */
242 static int ixgbe_enable_aim = TRUE;
243 #define SYSCTL_INT(__x, __y)
244 SYSCTL_INT("hw.ixgbe.enable_aim", &ixgbe_enable_aim);
245
246 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
247 SYSCTL_INT("hw.ixgbe.max_interrupt_rate", &ixgbe_max_interrupt_rate);
248
249 /* How many packets rxeof tries to clean at a time */
250 static int ixgbe_rx_process_limit = 256;
251 SYSCTL_INT("hw.ixgbe.rx_process_limit", &ixgbe_rx_process_limit);
252
253 /* How many packets txeof tries to clean at a time */
254 static int ixgbe_tx_process_limit = 256;
255 SYSCTL_INT("hw.ixgbe.tx_process_limit", &ixgbe_tx_process_limit);
256
257 /*
258 ** Smart speed setting, default to on
259 ** this only works as a compile option
260 ** right now as its during attach, set
261 ** this to 'ixgbe_smart_speed_off' to
262 ** disable.
263 */
264 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
265
266 /*
267 * MSIX should be the default for best performance,
268 * but this allows it to be forced off for testing.
269 */
270 static int ixgbe_enable_msix = 1;
271 SYSCTL_INT("hw.ixgbe.enable_msix", &ixgbe_enable_msix);
272
273 /*
274 * Number of Queues, can be set to 0,
275 * it then autoconfigures based on the
276 * number of cpus with a max of 8. This
277 * can be overriden manually here.
278 */
279 static int ixgbe_num_queues = 1;
280 SYSCTL_INT("hw.ixgbe.num_queues", &ixgbe_num_queues);
281
282 /*
283 ** Number of TX descriptors per ring,
284 ** setting higher than RX as this seems
285 ** the better performing choice.
286 */
287 static int ixgbe_txd = PERFORM_TXD;
288 SYSCTL_INT("hw.ixgbe.txd", &ixgbe_txd);
289
290 /* Number of RX descriptors per ring */
291 static int ixgbe_rxd = PERFORM_RXD;
292 SYSCTL_INT("hw.ixgbe.rxd", &ixgbe_rxd);
293
294 /*
295 ** Defining this on will allow the use
296 ** of unsupported SFP+ modules, note that
297 ** doing so you are on your own :)
298 */
299 static int allow_unsupported_sfp = false;
300 SYSCTL_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
301
302 /* Keep running tab on them for sanity check */
303 static int ixgbe_total_ports;
304
305 #ifdef IXGBE_FDIR
306 /*
307 ** For Flow Director: this is the
308 ** number of TX packets we sample
309 ** for the filter pool, this means
310 ** every 20th packet will be probed.
311 **
312 ** This feature can be disabled by
313 ** setting this to 0.
314 */
315 static int atr_sample_rate = 20;
316 /*
317 ** Flow Director actually 'steals'
318 ** part of the packet buffer as its
319 ** filter pool, this variable controls
320 ** how much it uses:
321 ** 0 = 64K, 1 = 128K, 2 = 256K
322 */
323 static int fdir_pballoc = 1;
324 #endif
325
326 #ifdef DEV_NETMAP
327 /*
328 * The #ifdef DEV_NETMAP / #endif blocks in this file are meant to
329 * be a reference on how to implement netmap support in a driver.
330 * Additional comments are in ixgbe_netmap.h .
331 *
332 * <dev/netmap/ixgbe_netmap.h> contains functions for netmap support
333 * that extend the standard driver.
334 */
335 #include <dev/netmap/ixgbe_netmap.h>
336 #endif /* DEV_NETMAP */
337
338 /*********************************************************************
339 * Device identification routine
340 *
341 * ixgbe_probe determines if the driver should be loaded on
342 * adapter based on PCI vendor/device id of the adapter.
343 *
344 * return 1 on success, 0 on failure
345 *********************************************************************/
346
347 static int
348 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
349 {
350 const struct pci_attach_args *pa = aux;
351
352 return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
353 }
354
355 static ixgbe_vendor_info_t *
356 ixgbe_lookup(const struct pci_attach_args *pa)
357 {
358 pcireg_t subid;
359 ixgbe_vendor_info_t *ent;
360
361 INIT_DEBUGOUT("ixgbe_probe: begin");
362
363 if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
364 return NULL;
365
366 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
367
368 for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
369 if (PCI_VENDOR(pa->pa_id) == ent->vendor_id &&
370 PCI_PRODUCT(pa->pa_id) == ent->device_id &&
371
372 (PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id ||
373 ent->subvendor_id == 0) &&
374
375 (PCI_SUBSYS_ID(subid) == ent->subdevice_id ||
376 ent->subdevice_id == 0)) {
377 ++ixgbe_total_ports;
378 return ent;
379 }
380 }
381 return NULL;
382 }
383
384
385 static void
386 ixgbe_sysctl_attach(struct adapter *adapter)
387 {
388 struct sysctllog **log;
389 const struct sysctlnode *rnode, *cnode;
390 device_t dev;
391
392 dev = adapter->dev;
393 log = &adapter->sysctllog;
394
395 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
396 aprint_error_dev(dev, "could not create sysctl root\n");
397 return;
398 }
399
400 if (sysctl_createv(log, 0, &rnode, &cnode,
401 CTLFLAG_READONLY, CTLTYPE_INT,
402 "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
403 NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
404 aprint_error_dev(dev, "could not create sysctl\n");
405
406 if (sysctl_createv(log, 0, &rnode, &cnode,
407 CTLFLAG_READONLY, CTLTYPE_INT,
408 "num_queues", SYSCTL_DESCR("Number of queues"),
409 NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
410 aprint_error_dev(dev, "could not create sysctl\n");
411
412 if (sysctl_createv(log, 0, &rnode, &cnode,
413 CTLFLAG_READWRITE, CTLTYPE_INT,
414 "fc", SYSCTL_DESCR("Flow Control"),
415 ixgbe_set_flowcntl, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
416 aprint_error_dev(dev, "could not create sysctl\n");
417
418 /* XXX This is an *instance* sysctl controlling a *global* variable.
419 * XXX It's that way in the FreeBSD driver that this derives from.
420 */
421 if (sysctl_createv(log, 0, &rnode, &cnode,
422 CTLFLAG_READWRITE, CTLTYPE_INT,
423 "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
424 NULL, 0, &ixgbe_enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
425 aprint_error_dev(dev, "could not create sysctl\n");
426
427 if (sysctl_createv(log, 0, &rnode, &cnode,
428 CTLFLAG_READWRITE, CTLTYPE_INT,
429 "advertise_speed", SYSCTL_DESCR("Link Speed"),
430 ixgbe_set_advertise, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
431 aprint_error_dev(dev, "could not create sysctl\n");
432
433 if (sysctl_createv(log, 0, &rnode, &cnode,
434 CTLFLAG_READWRITE, CTLTYPE_INT,
435 "ts", SYSCTL_DESCR("Thermal Test"),
436 ixgbe_set_thermal_test, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
437 aprint_error_dev(dev, "could not create sysctl\n");
438 }
439
440 /*********************************************************************
441 * Device initialization routine
442 *
443 * The attach entry point is called when the driver is being loaded.
444 * This routine identifies the type of hardware, allocates all resources
445 * and initializes the hardware.
446 *
447 * return 0 on success, positive on failure
448 *********************************************************************/
449
450 static void
451 ixgbe_attach(device_t parent, device_t dev, void *aux)
452 {
453 struct adapter *adapter;
454 struct ixgbe_hw *hw;
455 int error = -1;
456 u16 csum;
457 u32 ctrl_ext;
458 ixgbe_vendor_info_t *ent;
459 struct pci_attach_args *pa = aux;
460
461 INIT_DEBUGOUT("ixgbe_attach: begin");
462
463 /* Allocate, clear, and link in our adapter structure */
464 adapter = device_private(dev);
465 adapter->dev = adapter->osdep.dev = dev;
466 hw = &adapter->hw;
467 adapter->osdep.pc = pa->pa_pc;
468 adapter->osdep.tag = pa->pa_tag;
469 adapter->osdep.dmat = pa->pa_dmat;
470 adapter->osdep.attached = false;
471
472 ent = ixgbe_lookup(pa);
473
474 KASSERT(ent != NULL);
475
476 aprint_normal(": %s, Version - %s\n",
477 ixgbe_strings[ent->index], ixgbe_driver_version);
478
479 /* Core Lock Init*/
480 IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
481
482 /* SYSCTL APIs */
483
484 ixgbe_sysctl_attach(adapter);
485
486 /* Set up the timer callout */
487 callout_init(&adapter->timer, 0);
488
489 /* Determine hardware revision */
490 ixgbe_identify_hardware(adapter);
491
492 /* Do base PCI setup - map BAR0 */
493 if (ixgbe_allocate_pci_resources(adapter, pa)) {
494 aprint_error_dev(dev, "Allocation of PCI resources failed\n");
495 error = ENXIO;
496 goto err_out;
497 }
498
499 /* Do descriptor calc and sanity checks */
500 if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
501 ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
502 aprint_error_dev(dev, "TXD config issue, using default!\n");
503 adapter->num_tx_desc = DEFAULT_TXD;
504 } else
505 adapter->num_tx_desc = ixgbe_txd;
506
507 /*
508 ** With many RX rings it is easy to exceed the
509 ** system mbuf allocation. Tuning nmbclusters
510 ** can alleviate this.
511 */
512 if (nmbclusters > 0 ) {
513 int s;
514 s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
515 if (s > nmbclusters) {
516 aprint_error_dev(dev, "RX Descriptors exceed "
517 "system mbuf max, using default instead!\n");
518 ixgbe_rxd = DEFAULT_RXD;
519 }
520 }
521
522 if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
523 ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
524 aprint_error_dev(dev, "RXD config issue, using default!\n");
525 adapter->num_rx_desc = DEFAULT_RXD;
526 } else
527 adapter->num_rx_desc = ixgbe_rxd;
528
529 /* Allocate our TX/RX Queues */
530 if (ixgbe_allocate_queues(adapter)) {
531 error = ENOMEM;
532 goto err_out;
533 }
534
535 /* Allocate multicast array memory. */
536 adapter->mta = malloc(sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
537 MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
538 if (adapter->mta == NULL) {
539 aprint_error_dev(dev, "Cannot allocate multicast setup array\n");
540 error = ENOMEM;
541 goto err_late;
542 }
543
544 /* Initialize the shared code */
545 hw->allow_unsupported_sfp = allow_unsupported_sfp;
546 error = ixgbe_init_shared_code(hw);
547 if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
548 /*
549 ** No optics in this port, set up
550 ** so the timer routine will probe
551 ** for later insertion.
552 */
553 adapter->sfp_probe = TRUE;
554 error = 0;
555 } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
556 aprint_error_dev(dev,"Unsupported SFP+ module detected!\n");
557 error = EIO;
558 goto err_late;
559 } else if (error) {
560 aprint_error_dev(dev,"Unable to initialize the shared code\n");
561 error = EIO;
562 goto err_late;
563 }
564
565 /* Make sure we have a good EEPROM before we read from it */
566 if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) {
567 aprint_error_dev(dev,"The EEPROM Checksum Is Not Valid\n");
568 error = EIO;
569 goto err_late;
570 }
571
572 error = ixgbe_init_hw(hw);
573 switch (error) {
574 case IXGBE_ERR_EEPROM_VERSION:
575 aprint_error_dev(dev, "This device is a pre-production adapter/"
576 "LOM. Please be aware there may be issues associated "
577 "with your hardware.\n If you are experiencing problems "
578 "please contact your Intel or hardware representative "
579 "who provided you with this hardware.\n");
580 break;
581 case IXGBE_ERR_SFP_NOT_SUPPORTED:
582 aprint_error_dev(dev,"Unsupported SFP+ Module\n");
583 error = EIO;
584 aprint_error_dev(dev,"Hardware Initialization Failure\n");
585 goto err_late;
586 case IXGBE_ERR_SFP_NOT_PRESENT:
587 device_printf(dev,"No SFP+ Module found\n");
588 /* falls thru */
589 default:
590 break;
591 }
592
593 /* Detect and set physical type */
594 ixgbe_setup_optics(adapter);
595
596 error = -1;
597 if ((adapter->msix > 1) && (ixgbe_enable_msix))
598 error = ixgbe_allocate_msix(adapter, pa);
599 if (error != 0)
600 error = ixgbe_allocate_legacy(adapter, pa);
601 if (error)
602 goto err_late;
603
604 /* Setup OS specific network interface */
605 if (ixgbe_setup_interface(dev, adapter) != 0)
606 goto err_late;
607
608 /* Initialize statistics */
609 ixgbe_update_stats_counters(adapter);
610
611 /*
612 ** Check PCIE slot type/speed/width
613 */
614 ixgbe_get_slot_info(hw);
615
616 /* Set an initial default flow control value */
617 adapter->fc = ixgbe_fc_full;
618
619 /* let hardware know driver is loaded */
620 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
621 ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
622 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
623
624 ixgbe_add_hw_stats(adapter);
625
626 #ifdef DEV_NETMAP
627 ixgbe_netmap_attach(adapter);
628 #endif /* DEV_NETMAP */
629 INIT_DEBUGOUT("ixgbe_attach: end");
630 adapter->osdep.attached = true;
631 return;
632 err_late:
633 ixgbe_free_transmit_structures(adapter);
634 ixgbe_free_receive_structures(adapter);
635 err_out:
636 if (adapter->ifp != NULL)
637 if_free(adapter->ifp);
638 ixgbe_free_pci_resources(adapter);
639 if (adapter->mta != NULL)
640 free(adapter->mta, M_DEVBUF);
641 return;
642
643 }
644
645 /*********************************************************************
646 * Device removal routine
647 *
648 * The detach entry point is called when the driver is being removed.
649 * This routine stops the adapter and deallocates all the resources
650 * that were allocated for driver operation.
651 *
652 * return 0 on success, positive on failure
653 *********************************************************************/
654
655 static int
656 ixgbe_detach(device_t dev, int flags)
657 {
658 struct adapter *adapter = device_private(dev);
659 struct rx_ring *rxr = adapter->rx_rings;
660 struct ixgbe_hw_stats *stats = &adapter->stats;
661 struct ix_queue *que = adapter->queues;
662 struct tx_ring *txr = adapter->tx_rings;
663 u32 ctrl_ext;
664
665 INIT_DEBUGOUT("ixgbe_detach: begin");
666 if (adapter->osdep.attached == false)
667 return 0;
668
669 #if NVLAN > 0
670 /* Make sure VLANs are not using driver */
671 if (!VLAN_ATTACHED(&adapter->osdep.ec))
672 ; /* nothing to do: no VLANs */
673 else if ((flags & (DETACH_SHUTDOWN|DETACH_FORCE)) != 0)
674 vlan_ifdetach(adapter->ifp);
675 else {
676 aprint_error_dev(dev, "VLANs in use\n");
677 return EBUSY;
678 }
679 #endif
680
681 IXGBE_CORE_LOCK(adapter);
682 ixgbe_stop(adapter);
683 IXGBE_CORE_UNLOCK(adapter);
684
685 for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
686 #ifndef IXGBE_LEGACY_TX
687 softint_disestablish(txr->txq_si);
688 #endif
689 softint_disestablish(que->que_si);
690 }
691
692 /* Drain the Link queue */
693 softint_disestablish(adapter->link_si);
694 softint_disestablish(adapter->mod_si);
695 softint_disestablish(adapter->msf_si);
696 #ifdef IXGBE_FDIR
697 softint_disestablish(adapter->fdir_si);
698 #endif
699
700 /* let hardware know driver is unloading */
701 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
702 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
703 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
704
705 ether_ifdetach(adapter->ifp);
706 callout_halt(&adapter->timer, NULL);
707 #ifdef DEV_NETMAP
708 netmap_detach(adapter->ifp);
709 #endif /* DEV_NETMAP */
710 ixgbe_free_pci_resources(adapter);
711 #if 0 /* XXX the NetBSD port is probably missing something here */
712 bus_generic_detach(dev);
713 #endif
714 if_detach(adapter->ifp);
715
716 sysctl_teardown(&adapter->sysctllog);
717 evcnt_detach(&adapter->handleq);
718 evcnt_detach(&adapter->req);
719 evcnt_detach(&adapter->morerx);
720 evcnt_detach(&adapter->moretx);
721 evcnt_detach(&adapter->txloops);
722 evcnt_detach(&adapter->efbig_tx_dma_setup);
723 evcnt_detach(&adapter->m_defrag_failed);
724 evcnt_detach(&adapter->efbig2_tx_dma_setup);
725 evcnt_detach(&adapter->einval_tx_dma_setup);
726 evcnt_detach(&adapter->other_tx_dma_setup);
727 evcnt_detach(&adapter->eagain_tx_dma_setup);
728 evcnt_detach(&adapter->enomem_tx_dma_setup);
729 evcnt_detach(&adapter->watchdog_events);
730 evcnt_detach(&adapter->tso_err);
731 evcnt_detach(&adapter->link_irq);
732
733 txr = adapter->tx_rings;
734 for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
735 evcnt_detach(&txr->no_desc_avail);
736 evcnt_detach(&txr->total_packets);
737 evcnt_detach(&txr->tso_tx);
738
739 if (i < __arraycount(adapter->stats.mpc)) {
740 evcnt_detach(&adapter->stats.mpc[i]);
741 }
742 if (i < __arraycount(adapter->stats.pxontxc)) {
743 evcnt_detach(&adapter->stats.pxontxc[i]);
744 evcnt_detach(&adapter->stats.pxonrxc[i]);
745 evcnt_detach(&adapter->stats.pxofftxc[i]);
746 evcnt_detach(&adapter->stats.pxoffrxc[i]);
747 evcnt_detach(&adapter->stats.pxon2offc[i]);
748 }
749 if (i < __arraycount(adapter->stats.qprc)) {
750 evcnt_detach(&adapter->stats.qprc[i]);
751 evcnt_detach(&adapter->stats.qptc[i]);
752 evcnt_detach(&adapter->stats.qbrc[i]);
753 evcnt_detach(&adapter->stats.qbtc[i]);
754 evcnt_detach(&adapter->stats.qprdc[i]);
755 }
756
757 evcnt_detach(&rxr->rx_packets);
758 evcnt_detach(&rxr->rx_bytes);
759 evcnt_detach(&rxr->rx_copies);
760 evcnt_detach(&rxr->no_jmbuf);
761 evcnt_detach(&rxr->rx_discarded);
762 evcnt_detach(&rxr->rx_irq);
763 }
764 evcnt_detach(&stats->ipcs);
765 evcnt_detach(&stats->l4cs);
766 evcnt_detach(&stats->ipcs_bad);
767 evcnt_detach(&stats->l4cs_bad);
768 evcnt_detach(&stats->intzero);
769 evcnt_detach(&stats->legint);
770 evcnt_detach(&stats->crcerrs);
771 evcnt_detach(&stats->illerrc);
772 evcnt_detach(&stats->errbc);
773 evcnt_detach(&stats->mspdc);
774 evcnt_detach(&stats->mlfc);
775 evcnt_detach(&stats->mrfc);
776 evcnt_detach(&stats->rlec);
777 evcnt_detach(&stats->lxontxc);
778 evcnt_detach(&stats->lxonrxc);
779 evcnt_detach(&stats->lxofftxc);
780 evcnt_detach(&stats->lxoffrxc);
781
782 /* Packet Reception Stats */
783 evcnt_detach(&stats->tor);
784 evcnt_detach(&stats->gorc);
785 evcnt_detach(&stats->tpr);
786 evcnt_detach(&stats->gprc);
787 evcnt_detach(&stats->mprc);
788 evcnt_detach(&stats->bprc);
789 evcnt_detach(&stats->prc64);
790 evcnt_detach(&stats->prc127);
791 evcnt_detach(&stats->prc255);
792 evcnt_detach(&stats->prc511);
793 evcnt_detach(&stats->prc1023);
794 evcnt_detach(&stats->prc1522);
795 evcnt_detach(&stats->ruc);
796 evcnt_detach(&stats->rfc);
797 evcnt_detach(&stats->roc);
798 evcnt_detach(&stats->rjc);
799 evcnt_detach(&stats->mngprc);
800 evcnt_detach(&stats->xec);
801
802 /* Packet Transmission Stats */
803 evcnt_detach(&stats->gotc);
804 evcnt_detach(&stats->tpt);
805 evcnt_detach(&stats->gptc);
806 evcnt_detach(&stats->bptc);
807 evcnt_detach(&stats->mptc);
808 evcnt_detach(&stats->mngptc);
809 evcnt_detach(&stats->ptc64);
810 evcnt_detach(&stats->ptc127);
811 evcnt_detach(&stats->ptc255);
812 evcnt_detach(&stats->ptc511);
813 evcnt_detach(&stats->ptc1023);
814 evcnt_detach(&stats->ptc1522);
815
816 ixgbe_free_transmit_structures(adapter);
817 ixgbe_free_receive_structures(adapter);
818 free(adapter->mta, M_DEVBUF);
819
820 IXGBE_CORE_LOCK_DESTROY(adapter);
821 return (0);
822 }
823
824 /*********************************************************************
825 *
826 * Shutdown entry point
827 *
828 **********************************************************************/
829
830 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
831 static int
832 ixgbe_shutdown(device_t dev)
833 {
834 struct adapter *adapter = device_private(dev);
835 IXGBE_CORE_LOCK(adapter);
836 ixgbe_stop(adapter);
837 IXGBE_CORE_UNLOCK(adapter);
838 return (0);
839 }
840 #endif
841
842
843 static int
844 ixgbe_ifflags_cb(struct ethercom *ec)
845 {
846 struct ifnet *ifp = &ec->ec_if;
847 struct adapter *adapter = ifp->if_softc;
848 int change = ifp->if_flags ^ adapter->if_flags, rc = 0;
849
850 IXGBE_CORE_LOCK(adapter);
851
852 if (change != 0)
853 adapter->if_flags = ifp->if_flags;
854
855 if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
856 rc = ENETRESET;
857 else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
858 ixgbe_set_promisc(adapter);
859
860 /* Set up VLAN support and filter */
861 ixgbe_setup_vlan_hw_support(adapter);
862
863 IXGBE_CORE_UNLOCK(adapter);
864
865 return rc;
866 }
867
868 /*********************************************************************
869 * Ioctl entry point
870 *
871 * ixgbe_ioctl is called when the user wants to configure the
872 * interface.
873 *
874 * return 0 on success, positive on failure
875 **********************************************************************/
876
877 static int
878 ixgbe_ioctl(struct ifnet * ifp, u_long command, void *data)
879 {
880 struct adapter *adapter = ifp->if_softc;
881 struct ixgbe_hw *hw = &adapter->hw;
882 struct ifcapreq *ifcr = data;
883 struct ifreq *ifr = data;
884 int error = 0;
885 int l4csum_en;
886 const int l4csum = IFCAP_CSUM_TCPv4_Rx|IFCAP_CSUM_UDPv4_Rx|
887 IFCAP_CSUM_TCPv6_Rx|IFCAP_CSUM_UDPv6_Rx;
888
889 switch (command) {
890 case SIOCSIFFLAGS:
891 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
892 break;
893 case SIOCADDMULTI:
894 case SIOCDELMULTI:
895 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
896 break;
897 case SIOCSIFMEDIA:
898 case SIOCGIFMEDIA:
899 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
900 break;
901 case SIOCSIFCAP:
902 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
903 break;
904 case SIOCSIFMTU:
905 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
906 break;
907 default:
908 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
909 break;
910 }
911
912 switch (command) {
913 case SIOCSIFMEDIA:
914 case SIOCGIFMEDIA:
915 return ifmedia_ioctl(ifp, ifr, &adapter->media, command);
916 case SIOCGI2C:
917 {
918 struct ixgbe_i2c_req i2c;
919 IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
920 error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
921 if (error != 0)
922 break;
923 if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
924 error = EINVAL;
925 break;
926 }
927 if (i2c.len > sizeof(i2c.data)) {
928 error = EINVAL;
929 break;
930 }
931
932 hw->phy.ops.read_i2c_byte(hw, i2c.offset,
933 i2c.dev_addr, i2c.data);
934 error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
935 break;
936 }
937 case SIOCSIFCAP:
938 /* Layer-4 Rx checksum offload has to be turned on and
939 * off as a unit.
940 */
941 l4csum_en = ifcr->ifcr_capenable & l4csum;
942 if (l4csum_en != l4csum && l4csum_en != 0)
943 return EINVAL;
944 /*FALLTHROUGH*/
945 case SIOCADDMULTI:
946 case SIOCDELMULTI:
947 case SIOCSIFFLAGS:
948 case SIOCSIFMTU:
949 default:
950 if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
951 return error;
952 if ((ifp->if_flags & IFF_RUNNING) == 0)
953 ;
954 else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
955 IXGBE_CORE_LOCK(adapter);
956 ixgbe_init_locked(adapter);
957 IXGBE_CORE_UNLOCK(adapter);
958 } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
959 /*
960 * Multicast list has changed; set the hardware filter
961 * accordingly.
962 */
963 IXGBE_CORE_LOCK(adapter);
964 ixgbe_disable_intr(adapter);
965 ixgbe_set_multi(adapter);
966 ixgbe_enable_intr(adapter);
967 IXGBE_CORE_UNLOCK(adapter);
968 }
969 return 0;
970 }
971
972 return error;
973 }
974
975 /*********************************************************************
976 * Init entry point
977 *
978 * This routine is used in two ways. It is used by the stack as
979 * init entry point in network interface structure. It is also used
980 * by the driver as a hw/sw initialization routine to get to a
981 * consistent state.
982 *
983 * return 0 on success, positive on failure
984 **********************************************************************/
985 #define IXGBE_MHADD_MFS_SHIFT 16
986
987 static void
988 ixgbe_init_locked(struct adapter *adapter)
989 {
990 struct ifnet *ifp = adapter->ifp;
991 device_t dev = adapter->dev;
992 struct ixgbe_hw *hw = &adapter->hw;
993 u32 k, txdctl, mhadd, gpie;
994 u32 rxdctl, rxctrl;
995
996 /* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
997
998 KASSERT(mutex_owned(&adapter->core_mtx));
999 INIT_DEBUGOUT("ixgbe_init_locked: begin");
1000 hw->adapter_stopped = FALSE;
1001 ixgbe_stop_adapter(hw);
1002 callout_stop(&adapter->timer);
1003
1004 /* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
1005 adapter->max_frame_size =
1006 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1007
1008 /* reprogram the RAR[0] in case user changed it. */
1009 ixgbe_set_rar(hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
1010
1011 /* Get the latest mac address, User can use a LAA */
1012 memcpy(hw->mac.addr, CLLADDR(adapter->ifp->if_sadl),
1013 IXGBE_ETH_LENGTH_OF_ADDRESS);
1014 ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1);
1015 hw->addr_ctrl.rar_used_count = 1;
1016
1017 /* Prepare transmit descriptors and buffers */
1018 if (ixgbe_setup_transmit_structures(adapter)) {
1019 device_printf(dev,"Could not setup transmit structures\n");
1020 ixgbe_stop(adapter);
1021 return;
1022 }
1023
1024 ixgbe_init_hw(hw);
1025 ixgbe_initialize_transmit_units(adapter);
1026
1027 /* Setup Multicast table */
1028 ixgbe_set_multi(adapter);
1029
1030 /*
1031 ** Determine the correct mbuf pool
1032 ** for doing jumbo frames
1033 */
1034 if (adapter->max_frame_size <= 2048)
1035 adapter->rx_mbuf_sz = MCLBYTES;
1036 else if (adapter->max_frame_size <= 4096)
1037 adapter->rx_mbuf_sz = MJUMPAGESIZE;
1038 else if (adapter->max_frame_size <= 9216)
1039 adapter->rx_mbuf_sz = MJUM9BYTES;
1040 else
1041 adapter->rx_mbuf_sz = MJUM16BYTES;
1042
1043 /* Prepare receive descriptors and buffers */
1044 if (ixgbe_setup_receive_structures(adapter)) {
1045 device_printf(dev,"Could not setup receive structures\n");
1046 ixgbe_stop(adapter);
1047 return;
1048 }
1049
1050 /* Configure RX settings */
1051 ixgbe_initialize_receive_units(adapter);
1052
1053 gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE);
1054
1055 /* Enable Fan Failure Interrupt */
1056 gpie |= IXGBE_SDP1_GPIEN;
1057
1058 /* Add for Module detection */
1059 if (hw->mac.type == ixgbe_mac_82599EB)
1060 gpie |= IXGBE_SDP2_GPIEN;
1061
1062 /* Thermal Failure Detection */
1063 if (hw->mac.type == ixgbe_mac_X540)
1064 gpie |= IXGBE_SDP0_GPIEN;
1065
1066 if (adapter->msix > 1) {
1067 /* Enable Enhanced MSIX mode */
1068 gpie |= IXGBE_GPIE_MSIX_MODE;
1069 gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT |
1070 IXGBE_GPIE_OCD;
1071 }
1072 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
1073
1074 /* Set MTU size */
1075 if (ifp->if_mtu > ETHERMTU) {
1076 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
1077 mhadd &= ~IXGBE_MHADD_MFS_MASK;
1078 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
1079 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
1080 }
1081
1082 /* Now enable all the queues */
1083
1084 for (int i = 0; i < adapter->num_queues; i++) {
1085 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
1086 txdctl |= IXGBE_TXDCTL_ENABLE;
1087 /* Set WTHRESH to 8, burst writeback */
1088 txdctl |= (8 << 16);
1089 /*
1090 * When the internal queue falls below PTHRESH (32),
1091 * start prefetching as long as there are at least
1092 * HTHRESH (1) buffers ready. The values are taken
1093 * from the Intel linux driver 3.8.21.
1094 * Prefetching enables tx line rate even with 1 queue.
1095 */
1096 txdctl |= (32 << 0) | (1 << 8);
1097 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), txdctl);
1098 }
1099
1100 for (int i = 0; i < adapter->num_queues; i++) {
1101 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
1102 if (hw->mac.type == ixgbe_mac_82598EB) {
1103 /*
1104 ** PTHRESH = 21
1105 ** HTHRESH = 4
1106 ** WTHRESH = 8
1107 */
1108 rxdctl &= ~0x3FFFFF;
1109 rxdctl |= 0x080420;
1110 }
1111 rxdctl |= IXGBE_RXDCTL_ENABLE;
1112 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), rxdctl);
1113 /* XXX I don't trust this loop, and I don't trust the
1114 * XXX memory barrier. What is this meant to do? --dyoung
1115 */
1116 for (k = 0; k < 10; k++) {
1117 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)) &
1118 IXGBE_RXDCTL_ENABLE)
1119 break;
1120 else
1121 msec_delay(1);
1122 }
1123 wmb();
1124 #ifdef DEV_NETMAP
1125 /*
1126 * In netmap mode, we must preserve the buffers made
1127 * available to userspace before the if_init()
1128 * (this is true by default on the TX side, because
1129 * init makes all buffers available to userspace).
1130 *
1131 * netmap_reset() and the device specific routines
1132 * (e.g. ixgbe_setup_receive_rings()) map these
1133 * buffers at the end of the NIC ring, so here we
1134 * must set the RDT (tail) register to make sure
1135 * they are not overwritten.
1136 *
1137 * In this driver the NIC ring starts at RDH = 0,
1138 * RDT points to the last slot available for reception (?),
1139 * so RDT = num_rx_desc - 1 means the whole ring is available.
1140 */
1141 if (ifp->if_capenable & IFCAP_NETMAP) {
1142 struct netmap_adapter *na = NA(adapter->ifp);
1143 struct netmap_kring *kring = &na->rx_rings[i];
1144 int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1145
1146 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), t);
1147 } else
1148 #endif /* DEV_NETMAP */
1149 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), adapter->num_rx_desc - 1);
1150 }
1151
1152 /* Enable Receive engine */
1153 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
1154 if (hw->mac.type == ixgbe_mac_82598EB)
1155 rxctrl |= IXGBE_RXCTRL_DMBYPS;
1156 rxctrl |= IXGBE_RXCTRL_RXEN;
1157 ixgbe_enable_rx_dma(hw, rxctrl);
1158
1159 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
1160
1161 /* Set up MSI/X routing */
1162 if (ixgbe_enable_msix) {
1163 ixgbe_configure_ivars(adapter);
1164 /* Set up auto-mask */
1165 if (hw->mac.type == ixgbe_mac_82598EB)
1166 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1167 else {
1168 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
1169 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
1170 }
1171 } else { /* Simple settings for Legacy/MSI */
1172 ixgbe_set_ivar(adapter, 0, 0, 0);
1173 ixgbe_set_ivar(adapter, 0, 0, 1);
1174 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1175 }
1176
1177 #ifdef IXGBE_FDIR
1178 /* Init Flow director */
1179 if (hw->mac.type != ixgbe_mac_82598EB) {
1180 u32 hdrm = 32 << fdir_pballoc;
1181
1182 hw->mac.ops.setup_rxpba(hw, 0, hdrm, PBA_STRATEGY_EQUAL);
1183 ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc);
1184 }
1185 #endif
1186
1187 /*
1188 ** Check on any SFP devices that
1189 ** need to be kick-started
1190 */
1191 if (hw->phy.type == ixgbe_phy_none) {
1192 int err = hw->phy.ops.identify(hw);
1193 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
1194 device_printf(dev,
1195 "Unsupported SFP+ module type was detected.\n");
1196 return;
1197 }
1198 }
1199
1200 /* Set moderation on the Link interrupt */
1201 IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->linkvec), IXGBE_LINK_ITR);
1202
1203 /* Config/Enable Link */
1204 ixgbe_config_link(adapter);
1205
1206 /* Hardware Packet Buffer & Flow Control setup */
1207 {
1208 u32 rxpb, frame, size, tmp;
1209
1210 frame = adapter->max_frame_size;
1211
1212 /* Calculate High Water */
1213 if (hw->mac.type == ixgbe_mac_X540)
1214 tmp = IXGBE_DV_X540(frame, frame);
1215 else
1216 tmp = IXGBE_DV(frame, frame);
1217 size = IXGBE_BT2KB(tmp);
1218 rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
1219 hw->fc.high_water[0] = rxpb - size;
1220
1221 /* Now calculate Low Water */
1222 if (hw->mac.type == ixgbe_mac_X540)
1223 tmp = IXGBE_LOW_DV_X540(frame);
1224 else
1225 tmp = IXGBE_LOW_DV(frame);
1226 hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
1227
1228 hw->fc.requested_mode = adapter->fc;
1229 hw->fc.pause_time = IXGBE_FC_PAUSE;
1230 hw->fc.send_xon = TRUE;
1231 }
1232 /* Initialize the FC settings */
1233 ixgbe_start_hw(hw);
1234
1235 /* Set up VLAN support and filter */
1236 ixgbe_setup_vlan_hw_support(adapter);
1237
1238 /* And now turn on interrupts */
1239 ixgbe_enable_intr(adapter);
1240
1241 /* Now inform the stack we're ready */
1242 ifp->if_flags |= IFF_RUNNING;
1243
1244 return;
1245 }
1246
1247 static int
1248 ixgbe_init(struct ifnet *ifp)
1249 {
1250 struct adapter *adapter = ifp->if_softc;
1251
1252 IXGBE_CORE_LOCK(adapter);
1253 ixgbe_init_locked(adapter);
1254 IXGBE_CORE_UNLOCK(adapter);
1255 return 0; /* XXX ixgbe_init_locked cannot fail? really? */
1256 }
1257
1258
1259 /*
1260 **
1261 ** MSIX Interrupt Handlers and Tasklets
1262 **
1263 */
1264
1265 static inline void
1266 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
1267 {
1268 struct ixgbe_hw *hw = &adapter->hw;
1269 u64 queue = (u64)(1ULL << vector);
1270 u32 mask;
1271
1272 if (hw->mac.type == ixgbe_mac_82598EB) {
1273 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1274 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
1275 } else {
1276 mask = (queue & 0xFFFFFFFF);
1277 if (mask)
1278 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
1279 mask = (queue >> 32);
1280 if (mask)
1281 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
1282 }
1283 }
1284
1285 __unused static inline void
1286 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
1287 {
1288 struct ixgbe_hw *hw = &adapter->hw;
1289 u64 queue = (u64)(1ULL << vector);
1290 u32 mask;
1291
1292 if (hw->mac.type == ixgbe_mac_82598EB) {
1293 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1294 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
1295 } else {
1296 mask = (queue & 0xFFFFFFFF);
1297 if (mask)
1298 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
1299 mask = (queue >> 32);
1300 if (mask)
1301 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
1302 }
1303 }
1304
1305 static void
1306 ixgbe_handle_que(void *context)
1307 {
1308 struct ix_queue *que = context;
1309 struct adapter *adapter = que->adapter;
1310 struct tx_ring *txr = que->txr;
1311 struct ifnet *ifp = adapter->ifp;
1312
1313 adapter->handleq.ev_count++;
1314
1315 if (ifp->if_flags & IFF_RUNNING) {
1316 ixgbe_rxeof(que);
1317 IXGBE_TX_LOCK(txr);
1318 ixgbe_txeof(txr);
1319 #ifndef IXGBE_LEGACY_TX
1320 if (!drbr_empty(ifp, txr->br))
1321 ixgbe_mq_start_locked(ifp, txr);
1322 #else
1323 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1324 ixgbe_start_locked(txr, ifp);
1325 #endif
1326 IXGBE_TX_UNLOCK(txr);
1327 }
1328
1329 /* Reenable this interrupt */
1330 if (que->res != NULL)
1331 ixgbe_enable_queue(adapter, que->msix);
1332 else
1333 ixgbe_enable_intr(adapter);
1334 return;
1335 }
1336
1337
1338 /*********************************************************************
1339 *
1340 * Legacy Interrupt Service routine
1341 *
1342 **********************************************************************/
1343
1344 static int
1345 ixgbe_legacy_irq(void *arg)
1346 {
1347 struct ix_queue *que = arg;
1348 struct adapter *adapter = que->adapter;
1349 struct ixgbe_hw *hw = &adapter->hw;
1350 struct ifnet *ifp = adapter->ifp;
1351 struct tx_ring *txr = adapter->tx_rings;
1352 bool more = false;
1353 u32 reg_eicr;
1354
1355
1356 reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
1357
1358 adapter->stats.legint.ev_count++;
1359 ++que->irqs;
1360 if (reg_eicr == 0) {
1361 adapter->stats.intzero.ev_count++;
1362 if ((ifp->if_flags & IFF_UP) != 0)
1363 ixgbe_enable_intr(adapter);
1364 return 0;
1365 }
1366
1367 if ((ifp->if_flags & IFF_RUNNING) != 0) {
1368 #ifdef __NetBSD__
1369 /* Don't run ixgbe_rxeof in interrupt context */
1370 more = true;
1371 #else
1372 more = ixgbe_rxeof(que);
1373 #endif
1374
1375 IXGBE_TX_LOCK(txr);
1376 ixgbe_txeof(txr);
1377 #ifdef IXGBE_LEGACY_TX
1378 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1379 ixgbe_start_locked(txr, ifp);
1380 #else
1381 if (!drbr_empty(ifp, txr->br))
1382 ixgbe_mq_start_locked(ifp, txr);
1383 #endif
1384 IXGBE_TX_UNLOCK(txr);
1385 }
1386
1387 /* Check for fan failure */
1388 if ((hw->phy.media_type == ixgbe_media_type_copper) &&
1389 (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1390 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1391 "REPLACE IMMEDIATELY!!\n");
1392 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1);
1393 }
1394
1395 /* Link status change */
1396 if (reg_eicr & IXGBE_EICR_LSC)
1397 softint_schedule(adapter->link_si);
1398
1399 if (more)
1400 #ifndef IXGBE_LEGACY_TX
1401 softint_schedule(txr->txq_si);
1402 #else
1403 softint_schedule(que->que_si);
1404 #endif
1405 else
1406 ixgbe_enable_intr(adapter);
1407 return 1;
1408 }
1409
1410
1411 /*********************************************************************
1412 *
1413 * MSIX Queue Interrupt Service routine
1414 *
1415 **********************************************************************/
1416 static int
1417 ixgbe_msix_que(void *arg)
1418 {
1419 struct ix_queue *que = arg;
1420 struct adapter *adapter = que->adapter;
1421 struct ifnet *ifp = adapter->ifp;
1422 struct tx_ring *txr = que->txr;
1423 struct rx_ring *rxr = que->rxr;
1424 bool more;
1425 u32 newitr = 0;
1426
1427 /* Protect against spurious interrupts */
1428 if ((ifp->if_flags & IFF_RUNNING) == 0)
1429 return 0;
1430
1431 ixgbe_disable_queue(adapter, que->msix);
1432 ++que->irqs;
1433
1434 #ifdef __NetBSD__
1435 /* Don't run ixgbe_rxeof in interrupt context */
1436 more = true;
1437 #else
1438 more = ixgbe_rxeof(que);
1439 #endif
1440
1441 IXGBE_TX_LOCK(txr);
1442 ixgbe_txeof(txr);
1443 #ifdef IXGBE_LEGACY_TX
1444 if (!IFQ_IS_EMPTY(&adapter->ifp->if_snd))
1445 ixgbe_start_locked(txr, ifp);
1446 #else
1447 if (!drbr_empty(ifp, txr->br))
1448 ixgbe_mq_start_locked(ifp, txr);
1449 #endif
1450 IXGBE_TX_UNLOCK(txr);
1451
1452 /* Do AIM now? */
1453
1454 if (ixgbe_enable_aim == FALSE)
1455 goto no_calc;
1456 /*
1457 ** Do Adaptive Interrupt Moderation:
1458 ** - Write out last calculated setting
1459 ** - Calculate based on average size over
1460 ** the last interval.
1461 */
1462 if (que->eitr_setting)
1463 IXGBE_WRITE_REG(&adapter->hw,
1464 IXGBE_EITR(que->msix), que->eitr_setting);
1465
1466 que->eitr_setting = 0;
1467
1468 /* Idle, do nothing */
1469 if ((txr->bytes == 0) && (rxr->bytes == 0))
1470 goto no_calc;
1471
1472 if ((txr->bytes) && (txr->packets))
1473 newitr = txr->bytes/txr->packets;
1474 if ((rxr->bytes) && (rxr->packets))
1475 newitr = max(newitr,
1476 (rxr->bytes / rxr->packets));
1477 newitr += 24; /* account for hardware frame, crc */
1478
1479 /* set an upper boundary */
1480 newitr = min(newitr, 3000);
1481
1482 /* Be nice to the mid range */
1483 if ((newitr > 300) && (newitr < 1200))
1484 newitr = (newitr / 3);
1485 else
1486 newitr = (newitr / 2);
1487
1488 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
1489 newitr |= newitr << 16;
1490 else
1491 newitr |= IXGBE_EITR_CNT_WDIS;
1492
1493 /* save for next interrupt */
1494 que->eitr_setting = newitr;
1495
1496 /* Reset state */
1497 txr->bytes = 0;
1498 txr->packets = 0;
1499 rxr->bytes = 0;
1500 rxr->packets = 0;
1501
1502 no_calc:
1503 if (more)
1504 softint_schedule(que->que_si);
1505 else
1506 ixgbe_enable_queue(adapter, que->msix);
1507 return 1;
1508 }
1509
1510
1511 static int
1512 ixgbe_msix_link(void *arg)
1513 {
1514 struct adapter *adapter = arg;
1515 struct ixgbe_hw *hw = &adapter->hw;
1516 u32 reg_eicr;
1517
1518 ++adapter->link_irq.ev_count;
1519
1520 /* First get the cause */
1521 reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
1522 /* Be sure the queue bits are not cleared */
1523 reg_eicr &= ~IXGBE_EICR_RTX_QUEUE;
1524 /* Clear interrupt with write */
1525 IXGBE_WRITE_REG(hw, IXGBE_EICR, reg_eicr);
1526
1527 /* Link status change */
1528 if (reg_eicr & IXGBE_EICR_LSC)
1529 softint_schedule(adapter->link_si);
1530
1531 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
1532 #ifdef IXGBE_FDIR
1533 if (reg_eicr & IXGBE_EICR_FLOW_DIR) {
1534 /* This is probably overkill :) */
1535 if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
1536 return 1;
1537 /* Disable the interrupt */
1538 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
1539 softint_schedule(adapter->fdir_si);
1540 } else
1541 #endif
1542 if (reg_eicr & IXGBE_EICR_ECC) {
1543 device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
1544 "Please Reboot!!\n");
1545 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
1546 } else
1547
1548 if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
1549 /* Clear the interrupt */
1550 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
1551 softint_schedule(adapter->msf_si);
1552 } else if (reg_eicr & IXGBE_EICR_GPI_SDP2) {
1553 /* Clear the interrupt */
1554 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2);
1555 softint_schedule(adapter->mod_si);
1556 }
1557 }
1558
1559 /* Check for fan failure */
1560 if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
1561 (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1562 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1563 "REPLACE IMMEDIATELY!!\n");
1564 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
1565 }
1566
1567 /* Check for over temp condition */
1568 if ((hw->mac.type == ixgbe_mac_X540) &&
1569 (reg_eicr & IXGBE_EICR_TS)) {
1570 device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
1571 "PHY IS SHUT DOWN!!\n");
1572 device_printf(adapter->dev, "System shutdown required\n");
1573 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
1574 }
1575
1576 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
1577 return 1;
1578 }
1579
1580 /*********************************************************************
1581 *
1582 * Media Ioctl callback
1583 *
1584 * This routine is called whenever the user queries the status of
1585 * the interface using ifconfig.
1586 *
1587 **********************************************************************/
1588 static void
1589 ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
1590 {
1591 struct adapter *adapter = ifp->if_softc;
1592 struct ixgbe_hw *hw = &adapter->hw;
1593
1594 INIT_DEBUGOUT("ixgbe_media_status: begin");
1595 IXGBE_CORE_LOCK(adapter);
1596 ixgbe_update_link_status(adapter);
1597
1598 ifmr->ifm_status = IFM_AVALID;
1599 ifmr->ifm_active = IFM_ETHER;
1600
1601 if (!adapter->link_active) {
1602 IXGBE_CORE_UNLOCK(adapter);
1603 return;
1604 }
1605
1606 ifmr->ifm_status |= IFM_ACTIVE;
1607
1608 /*
1609 * Not all NIC are 1000baseSX as an example X540T.
1610 * We must set properly the media based on NIC model.
1611 */
1612 switch (hw->device_id) {
1613 case IXGBE_DEV_ID_X540T:
1614 if (adapter->link_speed == IXGBE_LINK_SPEED_100_FULL)
1615 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
1616 else if (adapter->link_speed == IXGBE_LINK_SPEED_1GB_FULL)
1617 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1618 else if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)
1619 ifmr->ifm_active |= adapter->optics | IFM_FDX;
1620 break;
1621 default:
1622 if (adapter->link_speed == IXGBE_LINK_SPEED_100_FULL)
1623 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
1624 else if (adapter->link_speed == IXGBE_LINK_SPEED_1GB_FULL)
1625 ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
1626 else if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)
1627 ifmr->ifm_active |= adapter->optics | IFM_FDX;
1628 break;
1629 }
1630
1631 IXGBE_CORE_UNLOCK(adapter);
1632
1633 return;
1634 }
1635
1636 /*********************************************************************
1637 *
1638 * Media Ioctl callback
1639 *
1640 * This routine is called when the user changes speed/duplex using
1641 * media/mediopt option with ifconfig.
1642 *
1643 **********************************************************************/
1644 static int
1645 ixgbe_media_change(struct ifnet * ifp)
1646 {
1647 struct adapter *adapter = ifp->if_softc;
1648 struct ifmedia *ifm = &adapter->media;
1649
1650 INIT_DEBUGOUT("ixgbe_media_change: begin");
1651
1652 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1653 return (EINVAL);
1654
1655 switch (IFM_SUBTYPE(ifm->ifm_media)) {
1656 case IFM_10G_T:
1657 case IFM_AUTO:
1658 adapter->hw.phy.autoneg_advertised =
1659 IXGBE_LINK_SPEED_100_FULL |
1660 IXGBE_LINK_SPEED_1GB_FULL |
1661 IXGBE_LINK_SPEED_10GB_FULL;
1662 break;
1663 default:
1664 device_printf(adapter->dev, "Only auto media type\n");
1665 return (EINVAL);
1666 }
1667
1668 return (0);
1669 }
1670
1671 static void
1672 ixgbe_set_promisc(struct adapter *adapter)
1673 {
1674 struct ether_multi *enm;
1675 struct ether_multistep step;
1676 u_int32_t reg_rctl;
1677 struct ethercom *ec = &adapter->osdep.ec;
1678 struct ifnet *ifp = adapter->ifp;
1679 int mcnt = 0;
1680
1681 reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1682 reg_rctl &= (~IXGBE_FCTRL_UPE);
1683 if (ifp->if_flags & IFF_ALLMULTI)
1684 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
1685 else {
1686 ETHER_FIRST_MULTI(step, ec, enm);
1687 while (enm != NULL) {
1688 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1689 break;
1690 mcnt++;
1691 ETHER_NEXT_MULTI(step, enm);
1692 }
1693 }
1694 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
1695 reg_rctl &= (~IXGBE_FCTRL_MPE);
1696 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1697
1698 if (ifp->if_flags & IFF_PROMISC) {
1699 reg_rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1700 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1701 } else if (ifp->if_flags & IFF_ALLMULTI) {
1702 reg_rctl |= IXGBE_FCTRL_MPE;
1703 reg_rctl &= ~IXGBE_FCTRL_UPE;
1704 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1705 }
1706 return;
1707 }
1708
1709
1710 /*********************************************************************
1711 * Multicast Update
1712 *
1713 * This routine is called whenever multicast address list is updated.
1714 *
1715 **********************************************************************/
1716 #define IXGBE_RAR_ENTRIES 16
1717
1718 static void
1719 ixgbe_set_multi(struct adapter *adapter)
1720 {
1721 struct ether_multi *enm;
1722 struct ether_multistep step;
1723 u32 fctrl;
1724 u8 *mta;
1725 u8 *update_ptr;
1726 int mcnt = 0;
1727 struct ethercom *ec = &adapter->osdep.ec;
1728 struct ifnet *ifp = adapter->ifp;
1729
1730 IOCTL_DEBUGOUT("ixgbe_set_multi: begin");
1731
1732 mta = adapter->mta;
1733 bzero(mta, sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
1734 MAX_NUM_MULTICAST_ADDRESSES);
1735
1736 ifp->if_flags &= ~IFF_ALLMULTI;
1737 ETHER_FIRST_MULTI(step, ec, enm);
1738 while (enm != NULL) {
1739 if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
1740 (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1741 ETHER_ADDR_LEN) != 0)) {
1742 ifp->if_flags |= IFF_ALLMULTI;
1743 break;
1744 }
1745 bcopy(enm->enm_addrlo,
1746 &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
1747 IXGBE_ETH_LENGTH_OF_ADDRESS);
1748 mcnt++;
1749 ETHER_NEXT_MULTI(step, enm);
1750 }
1751
1752 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1753 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1754 if (ifp->if_flags & IFF_PROMISC)
1755 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1756 else if (ifp->if_flags & IFF_ALLMULTI) {
1757 fctrl |= IXGBE_FCTRL_MPE;
1758 }
1759
1760 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
1761
1762 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
1763 update_ptr = mta;
1764 ixgbe_update_mc_addr_list(&adapter->hw,
1765 update_ptr, mcnt, ixgbe_mc_array_itr, TRUE);
1766 }
1767
1768 return;
1769 }
1770
1771 /*
1772 * This is an iterator function now needed by the multicast
1773 * shared code. It simply feeds the shared code routine the
1774 * addresses in the array of ixgbe_set_multi() one by one.
1775 */
1776 static u8 *
1777 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1778 {
1779 u8 *addr = *update_ptr;
1780 u8 *newptr;
1781 *vmdq = 0;
1782
1783 newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
1784 *update_ptr = newptr;
1785 return addr;
1786 }
1787
1788
1789 /*********************************************************************
1790 * Timer routine
1791 *
1792 * This routine checks for link status,updates statistics,
1793 * and runs the watchdog check.
1794 *
1795 **********************************************************************/
1796
1797 static void
1798 ixgbe_local_timer1(void *arg)
1799 {
1800 struct adapter *adapter = arg;
1801 device_t dev = adapter->dev;
1802 struct ix_queue *que = adapter->queues;
1803 struct tx_ring *txr = adapter->tx_rings;
1804 int hung = 0, paused = 0;
1805
1806 KASSERT(mutex_owned(&adapter->core_mtx));
1807
1808 /* Check for pluggable optics */
1809 if (adapter->sfp_probe)
1810 if (!ixgbe_sfp_probe(adapter))
1811 goto out; /* Nothing to do */
1812
1813 ixgbe_update_link_status(adapter);
1814 ixgbe_update_stats_counters(adapter);
1815
1816 /*
1817 * If the interface has been paused
1818 * then don't do the watchdog check
1819 */
1820 if (IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)
1821 paused = 1;
1822
1823 /*
1824 ** Check the TX queues status
1825 ** - watchdog only if all queues show hung
1826 */
1827 for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
1828 if ((txr->queue_status == IXGBE_QUEUE_HUNG) &&
1829 (paused == 0))
1830 ++hung;
1831 else if (txr->queue_status == IXGBE_QUEUE_WORKING)
1832 #ifndef IXGBE_LEGACY_TX
1833 softint_schedule(txr->txq_si);
1834 #else
1835 softint_schedule(que->que_si);
1836 #endif
1837 }
1838 /* Only truely watchdog if all queues show hung */
1839 if (hung == adapter->num_queues)
1840 goto watchdog;
1841
1842 out:
1843 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
1844 return;
1845
1846 watchdog:
1847 device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
1848 device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me,
1849 IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me)),
1850 IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me)));
1851 device_printf(dev,"TX(%d) desc avail = %d,"
1852 "Next TX to Clean = %d\n",
1853 txr->me, txr->tx_avail, txr->next_to_clean);
1854 adapter->ifp->if_flags &= ~IFF_RUNNING;
1855 adapter->watchdog_events.ev_count++;
1856 ixgbe_init_locked(adapter);
1857 }
1858
1859 static void
1860 ixgbe_local_timer(void *arg)
1861 {
1862 struct adapter *adapter = arg;
1863
1864 IXGBE_CORE_LOCK(adapter);
1865 ixgbe_local_timer1(adapter);
1866 IXGBE_CORE_UNLOCK(adapter);
1867 }
1868
1869 /*
1870 ** Note: this routine updates the OS on the link state
1871 ** the real check of the hardware only happens with
1872 ** a link interrupt.
1873 */
1874 static void
1875 ixgbe_update_link_status(struct adapter *adapter)
1876 {
1877 struct ifnet *ifp = adapter->ifp;
1878 device_t dev = adapter->dev;
1879
1880
1881 if (adapter->link_up){
1882 if (adapter->link_active == FALSE) {
1883 if (bootverbose)
1884 device_printf(dev,"Link is up %d Gbps %s \n",
1885 ((adapter->link_speed == 128)? 10:1),
1886 "Full Duplex");
1887 adapter->link_active = TRUE;
1888 /* Update any Flow Control changes */
1889 ixgbe_fc_enable(&adapter->hw);
1890 if_link_state_change(ifp, LINK_STATE_UP);
1891 }
1892 } else { /* Link down */
1893 if (adapter->link_active == TRUE) {
1894 if (bootverbose)
1895 device_printf(dev,"Link is Down\n");
1896 if_link_state_change(ifp, LINK_STATE_DOWN);
1897 adapter->link_active = FALSE;
1898 }
1899 }
1900
1901 return;
1902 }
1903
1904
1905 static void
1906 ixgbe_ifstop(struct ifnet *ifp, int disable)
1907 {
1908 struct adapter *adapter = ifp->if_softc;
1909
1910 IXGBE_CORE_LOCK(adapter);
1911 ixgbe_stop(adapter);
1912 IXGBE_CORE_UNLOCK(adapter);
1913 }
1914
1915 /*********************************************************************
1916 *
1917 * This routine disables all traffic on the adapter by issuing a
1918 * global reset on the MAC and deallocates TX/RX buffers.
1919 *
1920 **********************************************************************/
1921
1922 static void
1923 ixgbe_stop(void *arg)
1924 {
1925 struct ifnet *ifp;
1926 struct adapter *adapter = arg;
1927 struct ixgbe_hw *hw = &adapter->hw;
1928 ifp = adapter->ifp;
1929
1930 KASSERT(mutex_owned(&adapter->core_mtx));
1931
1932 INIT_DEBUGOUT("ixgbe_stop: begin\n");
1933 ixgbe_disable_intr(adapter);
1934 callout_stop(&adapter->timer);
1935
1936 /* Let the stack know...*/
1937 ifp->if_flags &= ~IFF_RUNNING;
1938
1939 ixgbe_reset_hw(hw);
1940 hw->adapter_stopped = FALSE;
1941 ixgbe_stop_adapter(hw);
1942 if (hw->mac.type == ixgbe_mac_82599EB)
1943 ixgbe_stop_mac_link_on_d3_82599(hw);
1944 /* Turn off the laser - noop with no optics */
1945 ixgbe_disable_tx_laser(hw);
1946
1947 /* Update the stack */
1948 adapter->link_up = FALSE;
1949 ixgbe_update_link_status(adapter);
1950
1951 /* reprogram the RAR[0] in case user changed it. */
1952 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
1953
1954 return;
1955 }
1956
1957
1958 /*********************************************************************
1959 *
1960 * Determine hardware revision.
1961 *
1962 **********************************************************************/
1963 static void
1964 ixgbe_identify_hardware(struct adapter *adapter)
1965 {
1966 pcitag_t tag;
1967 pci_chipset_tag_t pc;
1968 pcireg_t subid, id;
1969 struct ixgbe_hw *hw = &adapter->hw;
1970
1971 pc = adapter->osdep.pc;
1972 tag = adapter->osdep.tag;
1973
1974 id = pci_conf_read(pc, tag, PCI_ID_REG);
1975 subid = pci_conf_read(pc, tag, PCI_SUBSYS_ID_REG);
1976
1977 /* Save off the information about this board */
1978 hw->vendor_id = PCI_VENDOR(id);
1979 hw->device_id = PCI_PRODUCT(id);
1980 hw->revision_id =
1981 PCI_REVISION(pci_conf_read(pc, tag, PCI_CLASS_REG));
1982 hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
1983 hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
1984
1985 /* We need this here to set the num_segs below */
1986 ixgbe_set_mac_type(hw);
1987
1988 /* Pick up the 82599 and VF settings */
1989 if (hw->mac.type != ixgbe_mac_82598EB) {
1990 hw->phy.smart_speed = ixgbe_smart_speed;
1991 adapter->num_segs = IXGBE_82599_SCATTER;
1992 } else
1993 adapter->num_segs = IXGBE_82598_SCATTER;
1994
1995 return;
1996 }
1997
1998 /*********************************************************************
1999 *
2000 * Determine optic type
2001 *
2002 **********************************************************************/
2003 static void
2004 ixgbe_setup_optics(struct adapter *adapter)
2005 {
2006 struct ixgbe_hw *hw = &adapter->hw;
2007 int layer;
2008
2009 layer = ixgbe_get_supported_physical_layer(hw);
2010
2011 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T) {
2012 adapter->optics = IFM_10G_T;
2013 return;
2014 }
2015
2016 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T) {
2017 adapter->optics = IFM_1000_T;
2018 return;
2019 }
2020
2021 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX) {
2022 adapter->optics = IFM_1000_SX;
2023 return;
2024 }
2025
2026 if (layer & (IXGBE_PHYSICAL_LAYER_10GBASE_LR |
2027 IXGBE_PHYSICAL_LAYER_10GBASE_LRM)) {
2028 adapter->optics = IFM_10G_LR;
2029 return;
2030 }
2031
2032 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
2033 adapter->optics = IFM_10G_SR;
2034 return;
2035 }
2036
2037 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU) {
2038 adapter->optics = IFM_10G_TWINAX;
2039 return;
2040 }
2041
2042 if (layer & (IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
2043 IXGBE_PHYSICAL_LAYER_10GBASE_CX4)) {
2044 adapter->optics = IFM_10G_CX4;
2045 return;
2046 }
2047
2048 /* If we get here just set the default */
2049 adapter->optics = IFM_ETHER | IFM_AUTO;
2050 return;
2051 }
2052
2053 /*********************************************************************
2054 *
2055 * Setup the Legacy or MSI Interrupt handler
2056 *
2057 **********************************************************************/
2058 static int
2059 ixgbe_allocate_legacy(struct adapter *adapter,
2060 const struct pci_attach_args *pa)
2061 {
2062 device_t dev = adapter->dev;
2063 struct ix_queue *que = adapter->queues;
2064 #ifndef IXGBE_LEGACY_TX
2065 struct tx_ring *txr = adapter->tx_rings;
2066 #endif
2067 int counts[PCI_INTR_TYPE_SIZE];
2068 pci_intr_type_t intr_type, max_type;
2069 char intrbuf[PCI_INTRSTR_LEN];
2070 const char *intrstr = NULL;
2071
2072 /* Allocation settings */
2073 max_type = PCI_INTR_TYPE_MSI;
2074 counts[PCI_INTR_TYPE_MSIX] = 0;
2075 counts[PCI_INTR_TYPE_MSI] = 1;
2076 counts[PCI_INTR_TYPE_INTX] = 1;
2077
2078 alloc_retry:
2079 if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
2080 aprint_error_dev(dev, "couldn't alloc interrupt\n");
2081 return ENXIO;
2082 }
2083 adapter->osdep.nintrs = 1;
2084 intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
2085 intrbuf, sizeof(intrbuf));
2086 adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
2087 adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
2088 device_xname(dev));
2089 if (adapter->osdep.ihs[0] == NULL) {
2090 intr_type = pci_intr_type(adapter->osdep.pc,
2091 adapter->osdep.intrs[0]);
2092 aprint_error_dev(dev,"unable to establish %s\n",
2093 (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
2094 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
2095 switch (intr_type) {
2096 case PCI_INTR_TYPE_MSI:
2097 /* The next try is for INTx: Disable MSI */
2098 max_type = PCI_INTR_TYPE_INTX;
2099 counts[PCI_INTR_TYPE_INTX] = 1;
2100 goto alloc_retry;
2101 case PCI_INTR_TYPE_INTX:
2102 default:
2103 /* See below */
2104 break;
2105 }
2106 }
2107 if (adapter->osdep.ihs[0] == NULL) {
2108 aprint_error_dev(dev,
2109 "couldn't establish interrupt%s%s\n",
2110 intrstr ? " at " : "", intrstr ? intrstr : "");
2111 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
2112 return ENXIO;
2113 }
2114 aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
2115 /*
2116 * Try allocating a fast interrupt and the associated deferred
2117 * processing contexts.
2118 */
2119 #ifndef IXGBE_LEGACY_TX
2120 txr->txq_si = softint_establish(SOFTINT_NET, ixgbe_deferred_mq_start,
2121 txr);
2122 #endif
2123 que->que_si = softint_establish(SOFTINT_NET, ixgbe_handle_que, que);
2124
2125 /* Tasklets for Link, SFP and Multispeed Fiber */
2126 adapter->link_si =
2127 softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter);
2128 adapter->mod_si =
2129 softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter);
2130 adapter->msf_si =
2131 softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter);
2132
2133 #ifdef IXGBE_FDIR
2134 adapter->fdir_si =
2135 softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter);
2136 #endif
2137 if (que->que_si == NULL ||
2138 adapter->link_si == NULL ||
2139 adapter->mod_si == NULL ||
2140 #ifdef IXGBE_FDIR
2141 adapter->fdir_si == NULL ||
2142 #endif
2143 adapter->msf_si == NULL) {
2144 aprint_error_dev(dev,
2145 "could not establish software interrupts\n");
2146 return ENXIO;
2147 }
2148
2149 /* For simplicity in the handlers */
2150 adapter->que_mask = IXGBE_EIMS_ENABLE_MASK;
2151
2152 return (0);
2153 }
2154
2155
2156 /*********************************************************************
2157 *
2158 * Setup MSIX Interrupt resources and handlers
2159 *
2160 **********************************************************************/
2161 static int
2162 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
2163 {
2164 device_t dev = adapter->dev;
2165 struct ix_queue *que = adapter->queues;
2166 struct tx_ring *txr = adapter->tx_rings;
2167 pci_chipset_tag_t pc;
2168 char intrbuf[PCI_INTRSTR_LEN];
2169 char intr_xname[32];
2170 const char *intrstr = NULL;
2171 int error, vector = 0;
2172 int cpu_id = 0;
2173 kcpuset_t *affinity;
2174
2175 pc = adapter->osdep.pc;
2176 #ifdef RSS
2177 cpuset_t cpu_mask;
2178 /*
2179 * If we're doing RSS, the number of queues needs to
2180 * match the number of RSS buckets that are configured.
2181 *
2182 * + If there's more queues than RSS buckets, we'll end
2183 * up with queues that get no traffic.
2184 *
2185 * + If there's more RSS buckets than queues, we'll end
2186 * up having multiple RSS buckets map to the same queue,
2187 * so there'll be some contention.
2188 */
2189 if (adapter->num_queues != rss_getnumbuckets()) {
2190 device_printf(dev,
2191 "%s: number of queues (%d) != number of RSS buckets (%d)"
2192 "; performance will be impacted.\n",
2193 __func__,
2194 adapter->num_queues,
2195 rss_getnumbuckets());
2196 }
2197 #endif
2198
2199 adapter->osdep.nintrs = adapter->num_queues + 1;
2200 if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
2201 adapter->osdep.nintrs) != 0) {
2202 aprint_error_dev(dev,
2203 "failed to allocate MSI-X interrupt\n");
2204 return (ENXIO);
2205 }
2206
2207 kcpuset_create(&affinity, false);
2208 for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
2209 snprintf(intr_xname, sizeof(intr_xname), "%s TX/RX",
2210 device_xname(dev));
2211 intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
2212 sizeof(intrbuf));
2213 #ifdef IXG_MPSAFE
2214 pci_intr_setattr(pc, adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
2215 true);
2216 #endif
2217 /* Set the handler function */
2218 que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
2219 adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
2220 intr_xname);
2221 if (que->res == NULL) {
2222 pci_intr_release(pc, adapter->osdep.intrs,
2223 adapter->osdep.nintrs);
2224 aprint_error_dev(dev,
2225 "Failed to register QUE handler\n");
2226 kcpuset_destroy(affinity);
2227 return ENXIO;
2228 }
2229 que->msix = vector;
2230 adapter->que_mask |= (u64)(1 << que->msix);
2231 #ifdef RSS
2232 /*
2233 * The queue ID is used as the RSS layer bucket ID.
2234 * We look up the queue ID -> RSS CPU ID and select
2235 * that.
2236 */
2237 cpu_id = rss_getcpu(i % rss_getnumbuckets());
2238 #else
2239 /*
2240 * Bind the msix vector, and thus the
2241 * rings to the corresponding cpu.
2242 *
2243 * This just happens to match the default RSS round-robin
2244 * bucket -> queue -> CPU allocation.
2245 */
2246 if (adapter->num_queues > 1)
2247 cpu_id = i;
2248 #endif
2249 /* Round-robin affinity */
2250 kcpuset_zero(affinity);
2251 kcpuset_set(affinity, cpu_id % ncpu);
2252 error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
2253 NULL);
2254 aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
2255 intrstr);
2256 if (error == 0) {
2257 #ifdef RSS
2258 aprintf_normal(", bound RSS bucket %d to CPU %d\n",
2259 i, cpu_id);
2260 #else
2261 aprint_normal(", bound queue %d to cpu %d\n",
2262 i, cpu_id);
2263 #endif
2264 } else
2265 aprint_normal("\n");
2266
2267 #ifndef IXGBE_LEGACY_TX
2268 txr->txq_si = softint_establish(SOFTINT_NET,
2269 ixgbe_deferred_mq_start, txr);
2270 #endif
2271 que->que_si = softint_establish(SOFTINT_NET, ixgbe_handle_que,
2272 que);
2273 if (que->que_si == NULL) {
2274 aprint_error_dev(dev,
2275 "could not establish software interrupt\n");
2276 }
2277 }
2278
2279 /* and Link */
2280 cpu_id++;
2281 snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
2282 intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
2283 sizeof(intrbuf));
2284 #ifdef IXG_MPSAFE
2285 pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
2286 true);
2287 #endif
2288 /* Set the link handler function */
2289 adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
2290 adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_link, adapter,
2291 intr_xname);
2292 if (adapter->osdep.ihs[vector] == NULL) {
2293 adapter->res = NULL;
2294 aprint_error_dev(dev, "Failed to register LINK handler\n");
2295 kcpuset_destroy(affinity);
2296 return (ENXIO);
2297 }
2298 /* Round-robin affinity */
2299 kcpuset_zero(affinity);
2300 kcpuset_set(affinity, cpu_id % ncpu);
2301 error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,NULL);
2302
2303 aprint_normal_dev(dev,
2304 "for link, interrupting at %s", intrstr);
2305 if (error == 0)
2306 aprint_normal(", affinity to cpu %d\n", cpu_id);
2307 else
2308 aprint_normal("\n");
2309
2310 adapter->linkvec = vector;
2311 /* Tasklets for Link, SFP and Multispeed Fiber */
2312 adapter->link_si =
2313 softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter);
2314 adapter->mod_si =
2315 softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter);
2316 adapter->msf_si =
2317 softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter);
2318 #ifdef IXGBE_FDIR
2319 adapter->fdir_si =
2320 softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter);
2321 #endif
2322
2323 kcpuset_destroy(affinity);
2324 return (0);
2325 }
2326
2327 /*
2328 * Setup Either MSI/X or MSI
2329 */
2330 static int
2331 ixgbe_setup_msix(struct adapter *adapter)
2332 {
2333 device_t dev = adapter->dev;
2334 int want, queues, msgs;
2335
2336 /* Override by tuneable */
2337 if (ixgbe_enable_msix == 0)
2338 goto msi;
2339
2340 /* First try MSI/X */
2341 msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
2342 if (msgs < IXG_MSIX_NINTR)
2343 goto msi;
2344
2345 adapter->msix_mem = (void *)1; /* XXX */
2346
2347 /* Figure out a reasonable auto config value */
2348 queues = (ncpu > (msgs-1)) ? (msgs-1) : ncpu;
2349
2350 /* Override based on tuneable */
2351 if (ixgbe_num_queues != 0)
2352 queues = ixgbe_num_queues;
2353
2354 #ifdef RSS
2355 /* If we're doing RSS, clamp at the number of RSS buckets */
2356 if (queues > rss_getnumbuckets())
2357 queues = rss_getnumbuckets();
2358 #endif
2359
2360 /* reflect correct sysctl value */
2361 ixgbe_num_queues = queues;
2362
2363 /*
2364 ** Want one vector (RX/TX pair) per queue
2365 ** plus an additional for Link.
2366 */
2367 want = queues + 1;
2368 if (msgs >= want)
2369 msgs = want;
2370 else {
2371 aprint_error_dev(dev,
2372 "MSIX Configuration Problem, "
2373 "%d vectors but %d queues wanted!\n",
2374 msgs, want);
2375 goto msi;
2376 }
2377 device_printf(dev,
2378 "Using MSIX interrupts with %d vectors\n", msgs);
2379 adapter->num_queues = queues;
2380 return (msgs);
2381
2382 /*
2383 ** If MSIX alloc failed or provided us with
2384 ** less than needed, free and fall through to MSI
2385 */
2386 msi:
2387 msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
2388 adapter->msix_mem = NULL; /* XXX */
2389 msgs = 1;
2390 aprint_normal_dev(dev,"Using an MSI interrupt\n");
2391 return (msgs);
2392 }
2393
2394
2395 static int
2396 ixgbe_allocate_pci_resources(struct adapter *adapter,
2397 const struct pci_attach_args *pa)
2398 {
2399 pcireg_t memtype;
2400 device_t dev = adapter->dev;
2401 bus_addr_t addr;
2402 int flags;
2403
2404 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
2405 switch (memtype) {
2406 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
2407 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
2408 adapter->osdep.mem_bus_space_tag = pa->pa_memt;
2409 if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
2410 memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
2411 goto map_err;
2412 if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
2413 aprint_normal_dev(dev, "clearing prefetchable bit\n");
2414 flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
2415 }
2416 if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
2417 adapter->osdep.mem_size, flags,
2418 &adapter->osdep.mem_bus_space_handle) != 0) {
2419 map_err:
2420 adapter->osdep.mem_size = 0;
2421 aprint_error_dev(dev, "unable to map BAR0\n");
2422 return ENXIO;
2423 }
2424 break;
2425 default:
2426 aprint_error_dev(dev, "unexpected type on BAR0\n");
2427 return ENXIO;
2428 }
2429
2430 /* Legacy defaults */
2431 adapter->num_queues = 1;
2432 adapter->hw.back = &adapter->osdep;
2433
2434 /*
2435 ** Now setup MSI or MSI/X, should
2436 ** return us the number of supported
2437 ** vectors. (Will be 1 for MSI)
2438 */
2439 adapter->msix = ixgbe_setup_msix(adapter);
2440 return (0);
2441 }
2442
2443 static void
2444 ixgbe_free_pci_resources(struct adapter * adapter)
2445 {
2446 struct ix_queue *que = adapter->queues;
2447 int rid;
2448
2449 /*
2450 ** Release all msix queue resources:
2451 */
2452 for (int i = 0; i < adapter->num_queues; i++, que++) {
2453 if (que->res != NULL)
2454 pci_intr_disestablish(adapter->osdep.pc,
2455 adapter->osdep.ihs[i]);
2456 }
2457
2458 /* Clean the Legacy or Link interrupt last */
2459 if (adapter->linkvec) /* we are doing MSIX */
2460 rid = adapter->linkvec;
2461 else
2462 rid = 0;
2463
2464 if (adapter->osdep.ihs[rid] != NULL) {
2465 pci_intr_disestablish(adapter->osdep.pc,
2466 adapter->osdep.ihs[rid]);
2467 adapter->osdep.ihs[rid] = NULL;
2468 }
2469
2470 pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
2471 adapter->osdep.nintrs);
2472
2473 if (adapter->osdep.mem_size != 0) {
2474 bus_space_unmap(adapter->osdep.mem_bus_space_tag,
2475 adapter->osdep.mem_bus_space_handle,
2476 adapter->osdep.mem_size);
2477 }
2478
2479 return;
2480 }
2481
2482 /*********************************************************************
2483 *
2484 * Setup networking device structure and register an interface.
2485 *
2486 **********************************************************************/
2487 static int
2488 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
2489 {
2490 struct ethercom *ec = &adapter->osdep.ec;
2491 struct ixgbe_hw *hw = &adapter->hw;
2492 struct ifnet *ifp;
2493
2494 INIT_DEBUGOUT("ixgbe_setup_interface: begin");
2495
2496 ifp = adapter->ifp = &ec->ec_if;
2497 strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
2498 ifp->if_baudrate = IF_Gbps(10);
2499 ifp->if_init = ixgbe_init;
2500 ifp->if_stop = ixgbe_ifstop;
2501 ifp->if_softc = adapter;
2502 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2503 ifp->if_ioctl = ixgbe_ioctl;
2504 #ifndef IXGBE_LEGACY_TX
2505 ifp->if_transmit = ixgbe_mq_start;
2506 ifp->if_qflush = ixgbe_qflush;
2507 #else
2508 ifp->if_start = ixgbe_start;
2509 IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
2510 #if 0
2511 ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 2;
2512 #endif
2513 IFQ_SET_READY(&ifp->if_snd);
2514 #endif
2515
2516 if_initialize(ifp);
2517 ether_ifattach(ifp, adapter->hw.mac.addr);
2518 if_register(ifp);
2519 ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
2520
2521 adapter->max_frame_size =
2522 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
2523
2524 /*
2525 * Tell the upper layer(s) we support long frames.
2526 */
2527 ifp->if_hdrlen = sizeof(struct ether_vlan_header);
2528
2529 ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSOv4 | IFCAP_TSOv6;
2530 ifp->if_capenable = 0;
2531
2532 ec->ec_capabilities |= ETHERCAP_VLAN_HWCSUM;
2533 ec->ec_capabilities |= ETHERCAP_JUMBO_MTU;
2534 ifp->if_capabilities |= IFCAP_LRO;
2535 ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
2536 | ETHERCAP_VLAN_MTU;
2537 ec->ec_capenable = ec->ec_capabilities;
2538
2539 /*
2540 ** Don't turn this on by default, if vlans are
2541 ** created on another pseudo device (eg. lagg)
2542 ** then vlan events are not passed thru, breaking
2543 ** operation, but with HW FILTER off it works. If
2544 ** using vlans directly on the ixgbe driver you can
2545 ** enable this and get full hardware tag filtering.
2546 */
2547 ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
2548
2549 /*
2550 * Specify the media types supported by this adapter and register
2551 * callbacks to update media and link information
2552 */
2553 ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
2554 ixgbe_media_status);
2555 ifmedia_add(&adapter->media, IFM_ETHER | adapter->optics, 0, NULL);
2556 ifmedia_set(&adapter->media, IFM_ETHER | adapter->optics);
2557 if (hw->device_id == IXGBE_DEV_ID_82598AT) {
2558 ifmedia_add(&adapter->media,
2559 IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
2560 ifmedia_add(&adapter->media,
2561 IFM_ETHER | IFM_1000_T, 0, NULL);
2562 }
2563 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2564 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2565
2566 return (0);
2567 }
2568
2569 static void
2570 ixgbe_config_link(struct adapter *adapter)
2571 {
2572 struct ixgbe_hw *hw = &adapter->hw;
2573 u32 autoneg, err = 0;
2574 bool sfp, negotiate;
2575
2576 sfp = ixgbe_is_sfp(hw);
2577
2578 if (sfp) {
2579 void *ip;
2580
2581 if (hw->phy.multispeed_fiber) {
2582 hw->mac.ops.setup_sfp(hw);
2583 ixgbe_enable_tx_laser(hw);
2584 ip = adapter->msf_si;
2585 } else {
2586 ip = adapter->mod_si;
2587 }
2588
2589 kpreempt_disable();
2590 softint_schedule(ip);
2591 kpreempt_enable();
2592 } else {
2593 if (hw->mac.ops.check_link)
2594 err = ixgbe_check_link(hw, &adapter->link_speed,
2595 &adapter->link_up, FALSE);
2596 if (err)
2597 goto out;
2598 autoneg = hw->phy.autoneg_advertised;
2599 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
2600 err = hw->mac.ops.get_link_capabilities(hw,
2601 &autoneg, &negotiate);
2602 else
2603 negotiate = 0;
2604 if (err)
2605 goto out;
2606 if (hw->mac.ops.setup_link)
2607 err = hw->mac.ops.setup_link(hw,
2608 autoneg, adapter->link_up);
2609 }
2610 out:
2611 return;
2612 }
2613
2614 /*********************************************************************
2615 *
2616 * Enable transmit unit.
2617 *
2618 **********************************************************************/
2619 static void
2620 ixgbe_initialize_transmit_units(struct adapter *adapter)
2621 {
2622 struct tx_ring *txr = adapter->tx_rings;
2623 struct ixgbe_hw *hw = &adapter->hw;
2624
2625 /* Setup the Base and Length of the Tx Descriptor Ring */
2626
2627 for (int i = 0; i < adapter->num_queues; i++, txr++) {
2628 u64 tdba = txr->txdma.dma_paddr;
2629 u32 txctrl;
2630
2631 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(i),
2632 (tdba & 0x00000000ffffffffULL));
2633 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(i), (tdba >> 32));
2634 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(i),
2635 adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
2636
2637 /* Setup the HW Tx Head and Tail descriptor pointers */
2638 IXGBE_WRITE_REG(hw, IXGBE_TDH(i), 0);
2639 IXGBE_WRITE_REG(hw, IXGBE_TDT(i), 0);
2640
2641 /* Setup Transmit Descriptor Cmd Settings */
2642 txr->txd_cmd = IXGBE_TXD_CMD_IFCS;
2643 txr->queue_status = IXGBE_QUEUE_IDLE;
2644
2645 /* Set the processing limit */
2646 txr->process_limit = ixgbe_tx_process_limit;
2647
2648 /* Disable Head Writeback */
2649 switch (hw->mac.type) {
2650 case ixgbe_mac_82598EB:
2651 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
2652 break;
2653 case ixgbe_mac_82599EB:
2654 case ixgbe_mac_X540:
2655 default:
2656 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i));
2657 break;
2658 }
2659 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
2660 switch (hw->mac.type) {
2661 case ixgbe_mac_82598EB:
2662 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), txctrl);
2663 break;
2664 case ixgbe_mac_82599EB:
2665 case ixgbe_mac_X540:
2666 default:
2667 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), txctrl);
2668 break;
2669 }
2670
2671 }
2672
2673 if (hw->mac.type != ixgbe_mac_82598EB) {
2674 u32 dmatxctl, rttdcs;
2675 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2676 dmatxctl |= IXGBE_DMATXCTL_TE;
2677 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
2678 /* Disable arbiter to set MTQC */
2679 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2680 rttdcs |= IXGBE_RTTDCS_ARBDIS;
2681 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
2682 IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
2683 rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
2684 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
2685 }
2686
2687 return;
2688 }
2689
2690 static void
2691 ixgbe_initialise_rss_mapping(struct adapter *adapter)
2692 {
2693 struct ixgbe_hw *hw = &adapter->hw;
2694 uint32_t reta;
2695 int i, j, queue_id;
2696 uint32_t rss_key[10];
2697 uint32_t mrqc;
2698 #ifdef RSS
2699 uint32_t rss_hash_config;
2700 #endif
2701
2702 /* Setup RSS */
2703 reta = 0;
2704
2705 #ifdef RSS
2706 /* Fetch the configured RSS key */
2707 rss_getkey((uint8_t *) &rss_key);
2708 #else
2709 /* set up random bits */
2710 cprng_fast(&rss_key, sizeof(rss_key));
2711 #endif
2712
2713 /* Set up the redirection table */
2714 for (i = 0, j = 0; i < 128; i++, j++) {
2715 if (j == adapter->num_queues) j = 0;
2716 #ifdef RSS
2717 /*
2718 * Fetch the RSS bucket id for the given indirection entry.
2719 * Cap it at the number of configured buckets (which is
2720 * num_queues.)
2721 */
2722 queue_id = rss_get_indirection_to_bucket(i);
2723 queue_id = queue_id % adapter->num_queues;
2724 #else
2725 queue_id = (j * 0x11);
2726 #endif
2727 /*
2728 * The low 8 bits are for hash value (n+0);
2729 * The next 8 bits are for hash value (n+1), etc.
2730 */
2731 reta = reta >> 8;
2732 reta = reta | ( ((uint32_t) queue_id) << 24);
2733 if ((i & 3) == 3) {
2734 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
2735 reta = 0;
2736 }
2737 }
2738
2739 /* Now fill our hash function seeds */
2740 for (i = 0; i < 10; i++)
2741 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
2742
2743 /* Perform hash on these packet types */
2744 #ifdef RSS
2745 mrqc = IXGBE_MRQC_RSSEN;
2746 rss_hash_config = rss_gethashconfig();
2747 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
2748 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
2749 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
2750 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
2751 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
2752 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
2753 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
2754 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
2755 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
2756 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
2757 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
2758 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
2759 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
2760 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
2761 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4_EX)
2762 device_printf(adapter->dev,
2763 "%s: RSS_HASHTYPE_RSS_UDP_IPV4_EX defined, "
2764 "but not supported\n", __func__);
2765 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
2766 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
2767 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
2768 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2769 #else
2770 /*
2771 * Disable UDP - IP fragments aren't currently being handled
2772 * and so we end up with a mix of 2-tuple and 4-tuple
2773 * traffic.
2774 */
2775 mrqc = IXGBE_MRQC_RSSEN
2776 | IXGBE_MRQC_RSS_FIELD_IPV4
2777 | IXGBE_MRQC_RSS_FIELD_IPV4_TCP
2778 #if 0
2779 | IXGBE_MRQC_RSS_FIELD_IPV4_UDP
2780 #endif
2781 | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP
2782 | IXGBE_MRQC_RSS_FIELD_IPV6_EX
2783 | IXGBE_MRQC_RSS_FIELD_IPV6
2784 | IXGBE_MRQC_RSS_FIELD_IPV6_TCP
2785 #if 0
2786 | IXGBE_MRQC_RSS_FIELD_IPV6_UDP
2787 | IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP
2788 #endif
2789 ;
2790 #endif /* RSS */
2791 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2792 }
2793
2794
2795 /*********************************************************************
2796 *
2797 * Setup receive registers and features.
2798 *
2799 **********************************************************************/
2800 #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
2801
2802 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
2803
2804 static void
2805 ixgbe_initialize_receive_units(struct adapter *adapter)
2806 {
2807 int i;
2808 struct rx_ring *rxr = adapter->rx_rings;
2809 struct ixgbe_hw *hw = &adapter->hw;
2810 struct ifnet *ifp = adapter->ifp;
2811 u32 bufsz, rxctrl, fctrl, srrctl, rxcsum;
2812 u32 hlreg;
2813
2814
2815 /*
2816 * Make sure receives are disabled while
2817 * setting up the descriptor ring
2818 */
2819 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
2820 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL,
2821 rxctrl & ~IXGBE_RXCTRL_RXEN);
2822
2823 /* Enable broadcasts */
2824 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
2825 fctrl |= IXGBE_FCTRL_BAM;
2826 fctrl |= IXGBE_FCTRL_DPF;
2827 fctrl |= IXGBE_FCTRL_PMCF;
2828 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
2829
2830 /* Set for Jumbo Frames? */
2831 hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2832 if (ifp->if_mtu > ETHERMTU)
2833 hlreg |= IXGBE_HLREG0_JUMBOEN;
2834 else
2835 hlreg &= ~IXGBE_HLREG0_JUMBOEN;
2836 #ifdef DEV_NETMAP
2837 /* crcstrip is conditional in netmap (in RDRXCTL too ?) */
2838 if (ifp->if_capenable & IFCAP_NETMAP && !ix_crcstrip)
2839 hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
2840 else
2841 hlreg |= IXGBE_HLREG0_RXCRCSTRP;
2842 #endif /* DEV_NETMAP */
2843 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
2844
2845 bufsz = (adapter->rx_mbuf_sz +
2846 BSIZEPKT_ROUNDUP) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
2847
2848 for (i = 0; i < adapter->num_queues; i++, rxr++) {
2849 u64 rdba = rxr->rxdma.dma_paddr;
2850
2851 /* Setup the Base and Length of the Rx Descriptor Ring */
2852 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(i),
2853 (rdba & 0x00000000ffffffffULL));
2854 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(i), (rdba >> 32));
2855 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(i),
2856 adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
2857
2858 /* Set up the SRRCTL register */
2859 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i));
2860 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
2861 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
2862 srrctl |= bufsz;
2863 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
2864
2865 /*
2866 * Set DROP_EN iff we have no flow control and >1 queue.
2867 * Note that srrctl was cleared shortly before during reset,
2868 * so we do not need to clear the bit, but do it just in case
2869 * this code is moved elsewhere.
2870 */
2871 if (adapter->num_queues > 1 &&
2872 adapter->fc == ixgbe_fc_none) {
2873 srrctl |= IXGBE_SRRCTL_DROP_EN;
2874 } else {
2875 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
2876 }
2877
2878 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
2879
2880 /* Setup the HW Rx Head and Tail Descriptor Pointers */
2881 IXGBE_WRITE_REG(hw, IXGBE_RDH(i), 0);
2882 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), 0);
2883
2884 /* Set the processing limit */
2885 rxr->process_limit = ixgbe_rx_process_limit;
2886 }
2887
2888 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
2889 u32 psrtype = IXGBE_PSRTYPE_TCPHDR |
2890 IXGBE_PSRTYPE_UDPHDR |
2891 IXGBE_PSRTYPE_IPV4HDR |
2892 IXGBE_PSRTYPE_IPV6HDR;
2893 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
2894 }
2895
2896 rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
2897
2898 ixgbe_initialise_rss_mapping(adapter);
2899
2900 if (adapter->num_queues > 1) {
2901 /* RSS and RX IPP Checksum are mutually exclusive */
2902 rxcsum |= IXGBE_RXCSUM_PCSD;
2903 }
2904
2905 if (ifp->if_capenable & IFCAP_RXCSUM)
2906 rxcsum |= IXGBE_RXCSUM_PCSD;
2907
2908 if (!(rxcsum & IXGBE_RXCSUM_PCSD))
2909 rxcsum |= IXGBE_RXCSUM_IPPCSE;
2910
2911 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
2912
2913 return;
2914 }
2915
2916 #if 0 /* XXX Badly need to overhaul vlan(4) on NetBSD. */
2917 /*
2918 ** This routine is run via an vlan config EVENT,
2919 ** it enables us to use the HW Filter table since
2920 ** we can get the vlan id. This just creates the
2921 ** entry in the soft version of the VFTA, init will
2922 ** repopulate the real table.
2923 */
2924 static void
2925 ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
2926 {
2927 struct adapter *adapter = ifp->if_softc;
2928 u16 index, bit;
2929
2930 if (ifp->if_softc != arg) /* Not our event */
2931 return;
2932
2933 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2934 return;
2935
2936 IXGBE_CORE_LOCK(adapter);
2937 index = (vtag >> 5) & 0x7F;
2938 bit = vtag & 0x1F;
2939 adapter->shadow_vfta[index] |= (1 << bit);
2940 ixgbe_setup_vlan_hw_support(adapter);
2941 IXGBE_CORE_UNLOCK(adapter);
2942 }
2943
2944 /*
2945 ** This routine is run via an vlan
2946 ** unconfig EVENT, remove our entry
2947 ** in the soft vfta.
2948 */
2949 static void
2950 ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
2951 {
2952 struct adapter *adapter = ifp->if_softc;
2953 u16 index, bit;
2954
2955 if (ifp->if_softc != arg)
2956 return;
2957
2958 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2959 return;
2960
2961 IXGBE_CORE_LOCK(adapter);
2962 index = (vtag >> 5) & 0x7F;
2963 bit = vtag & 0x1F;
2964 adapter->shadow_vfta[index] &= ~(1 << bit);
2965 /* Re-init to load the changes */
2966 ixgbe_setup_vlan_hw_support(adapter);
2967 IXGBE_CORE_UNLOCK(adapter);
2968 }
2969 #endif
2970
2971 static void
2972 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
2973 {
2974 struct ethercom *ec = &adapter->osdep.ec;
2975 struct ixgbe_hw *hw = &adapter->hw;
2976 struct rx_ring *rxr;
2977 u32 ctrl;
2978
2979
2980 /*
2981 ** We get here thru init_locked, meaning
2982 ** a soft reset, this has already cleared
2983 ** the VFTA and other state, so if there
2984 ** have been no vlan's registered do nothing.
2985 */
2986 if (!VLAN_ATTACHED(&adapter->osdep.ec)) {
2987 return;
2988 }
2989
2990 /* Setup the queues for vlans */
2991 for (int i = 0; i < adapter->num_queues; i++) {
2992 rxr = &adapter->rx_rings[i];
2993 /* On 82599 the VLAN enable is per/queue in RXDCTL */
2994 if (hw->mac.type != ixgbe_mac_82598EB) {
2995 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
2996 ctrl |= IXGBE_RXDCTL_VME;
2997 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), ctrl);
2998 }
2999 rxr->vtag_strip = TRUE;
3000 }
3001
3002 if ((ec->ec_capenable & ETHERCAP_VLAN_HWFILTER) == 0)
3003 return;
3004 /*
3005 ** A soft reset zero's out the VFTA, so
3006 ** we need to repopulate it now.
3007 */
3008 for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
3009 if (adapter->shadow_vfta[i] != 0)
3010 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
3011 adapter->shadow_vfta[i]);
3012
3013 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
3014 /* Enable the Filter Table if enabled */
3015 if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER) {
3016 ctrl &= ~IXGBE_VLNCTRL_CFIEN;
3017 ctrl |= IXGBE_VLNCTRL_VFE;
3018 }
3019 if (hw->mac.type == ixgbe_mac_82598EB)
3020 ctrl |= IXGBE_VLNCTRL_VME;
3021 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
3022 }
3023
3024 static void
3025 ixgbe_enable_intr(struct adapter *adapter)
3026 {
3027 struct ixgbe_hw *hw = &adapter->hw;
3028 struct ix_queue *que = adapter->queues;
3029 u32 mask, fwsm;
3030
3031 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3032 /* Enable Fan Failure detection */
3033 if (hw->device_id == IXGBE_DEV_ID_82598AT)
3034 mask |= IXGBE_EIMS_GPI_SDP1;
3035
3036 switch (adapter->hw.mac.type) {
3037 case ixgbe_mac_82599EB:
3038 mask |= IXGBE_EIMS_ECC;
3039 mask |= IXGBE_EIMS_GPI_SDP0;
3040 mask |= IXGBE_EIMS_GPI_SDP1;
3041 mask |= IXGBE_EIMS_GPI_SDP2;
3042 #ifdef IXGBE_FDIR
3043 mask |= IXGBE_EIMS_FLOW_DIR;
3044 #endif
3045 break;
3046 case ixgbe_mac_X540:
3047 mask |= IXGBE_EIMS_ECC;
3048 /* Detect if Thermal Sensor is enabled */
3049 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
3050 if (fwsm & IXGBE_FWSM_TS_ENABLED)
3051 mask |= IXGBE_EIMS_TS;
3052 #ifdef IXGBE_FDIR
3053 mask |= IXGBE_EIMS_FLOW_DIR;
3054 #endif
3055 /* falls through */
3056 default:
3057 break;
3058 }
3059
3060 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3061
3062 /* With RSS we use auto clear */
3063 if (adapter->msix_mem) {
3064 mask = IXGBE_EIMS_ENABLE_MASK;
3065 /* Don't autoclear Link */
3066 mask &= ~IXGBE_EIMS_OTHER;
3067 mask &= ~IXGBE_EIMS_LSC;
3068 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
3069 }
3070
3071 /*
3072 ** Now enable all queues, this is done separately to
3073 ** allow for handling the extended (beyond 32) MSIX
3074 ** vectors that can be used by 82599
3075 */
3076 for (int i = 0; i < adapter->num_queues; i++, que++)
3077 ixgbe_enable_queue(adapter, que->msix);
3078
3079 IXGBE_WRITE_FLUSH(hw);
3080
3081 return;
3082 }
3083
3084 static void
3085 ixgbe_disable_intr(struct adapter *adapter)
3086 {
3087 if (adapter->msix_mem)
3088 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
3089 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
3090 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
3091 } else {
3092 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
3093 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
3094 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
3095 }
3096 IXGBE_WRITE_FLUSH(&adapter->hw);
3097 return;
3098 }
3099
3100 u16
3101 ixgbe_read_pci_cfg(struct ixgbe_hw *hw, u32 reg)
3102 {
3103 switch (reg % 4) {
3104 case 0:
3105 return pci_conf_read(hw->back->pc, hw->back->tag, reg) &
3106 __BITS(15, 0);
3107 case 2:
3108 return __SHIFTOUT(pci_conf_read(hw->back->pc, hw->back->tag,
3109 reg - 2), __BITS(31, 16));
3110 default:
3111 panic("%s: invalid register (%" PRIx32, __func__, reg);
3112 break;
3113 }
3114 }
3115
3116 void
3117 ixgbe_write_pci_cfg(struct ixgbe_hw *hw, u32 reg, u16 value)
3118 {
3119 pcireg_t old;
3120
3121 switch (reg % 4) {
3122 case 0:
3123 old = pci_conf_read(hw->back->pc, hw->back->tag, reg) &
3124 __BITS(31, 16);
3125 pci_conf_write(hw->back->pc, hw->back->tag, reg, value | old);
3126 break;
3127 case 2:
3128 old = pci_conf_read(hw->back->pc, hw->back->tag, reg - 2) &
3129 __BITS(15, 0);
3130 pci_conf_write(hw->back->pc, hw->back->tag, reg - 2,
3131 __SHIFTIN(value, __BITS(31, 16)) | old);
3132 break;
3133 default:
3134 panic("%s: invalid register (%" PRIx32, __func__, reg);
3135 break;
3136 }
3137
3138 return;
3139 }
3140
3141 /*
3142 ** Get the width and transaction speed of
3143 ** the slot this adapter is plugged into.
3144 */
3145 static void
3146 ixgbe_get_slot_info(struct ixgbe_hw *hw)
3147 {
3148 device_t dev = ((struct ixgbe_osdep *)hw->back)->dev;
3149 struct ixgbe_mac_info *mac = &hw->mac;
3150 u16 link;
3151
3152 /* For most devices simply call the shared code routine */
3153 if (hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) {
3154 ixgbe_get_bus_info(hw);
3155 goto display;
3156 }
3157
3158 /*
3159 ** For the Quad port adapter we need to parse back
3160 ** up the PCI tree to find the speed of the expansion
3161 ** slot into which this adapter is plugged. A bit more work.
3162 */
3163 dev = device_parent(device_parent(dev));
3164 #ifdef IXGBE_DEBUG
3165 device_printf(dev, "parent pcib = %x,%x,%x\n",
3166 pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
3167 #endif
3168 dev = device_parent(device_parent(dev));
3169 #ifdef IXGBE_DEBUG
3170 device_printf(dev, "slot pcib = %x,%x,%x\n",
3171 pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
3172 #endif
3173 /* Now get the PCI Express Capabilities offset */
3174 /* ...and read the Link Status Register */
3175 link = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_LINK_STATUS);
3176 switch (link & IXGBE_PCI_LINK_WIDTH) {
3177 case IXGBE_PCI_LINK_WIDTH_1:
3178 hw->bus.width = ixgbe_bus_width_pcie_x1;
3179 break;
3180 case IXGBE_PCI_LINK_WIDTH_2:
3181 hw->bus.width = ixgbe_bus_width_pcie_x2;
3182 break;
3183 case IXGBE_PCI_LINK_WIDTH_4:
3184 hw->bus.width = ixgbe_bus_width_pcie_x4;
3185 break;
3186 case IXGBE_PCI_LINK_WIDTH_8:
3187 hw->bus.width = ixgbe_bus_width_pcie_x8;
3188 break;
3189 default:
3190 hw->bus.width = ixgbe_bus_width_unknown;
3191 break;
3192 }
3193
3194 switch (link & IXGBE_PCI_LINK_SPEED) {
3195 case IXGBE_PCI_LINK_SPEED_2500:
3196 hw->bus.speed = ixgbe_bus_speed_2500;
3197 break;
3198 case IXGBE_PCI_LINK_SPEED_5000:
3199 hw->bus.speed = ixgbe_bus_speed_5000;
3200 break;
3201 case IXGBE_PCI_LINK_SPEED_8000:
3202 hw->bus.speed = ixgbe_bus_speed_8000;
3203 break;
3204 default:
3205 hw->bus.speed = ixgbe_bus_speed_unknown;
3206 break;
3207 }
3208
3209 mac->ops.set_lan_id(hw);
3210
3211 display:
3212 device_printf(dev,"PCI Express Bus: Speed %s %s\n",
3213 ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s":
3214 (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s":
3215 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s":"Unknown"),
3216 (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
3217 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
3218 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
3219 ("Unknown"));
3220
3221 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
3222 ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
3223 (hw->bus.speed == ixgbe_bus_speed_2500))) {
3224 device_printf(dev, "PCI-Express bandwidth available"
3225 " for this card\n is not sufficient for"
3226 " optimal performance.\n");
3227 device_printf(dev, "For optimal performance a x8 "
3228 "PCIE, or x4 PCIE Gen2 slot is required.\n");
3229 }
3230 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
3231 ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
3232 (hw->bus.speed < ixgbe_bus_speed_8000))) {
3233 device_printf(dev, "PCI-Express bandwidth available"
3234 " for this card\n is not sufficient for"
3235 " optimal performance.\n");
3236 device_printf(dev, "For optimal performance a x8 "
3237 "PCIE Gen3 slot is required.\n");
3238 }
3239
3240 return;
3241 }
3242
3243
3244 /*
3245 ** Setup the correct IVAR register for a particular MSIX interrupt
3246 ** (yes this is all very magic and confusing :)
3247 ** - entry is the register array entry
3248 ** - vector is the MSIX vector for this queue
3249 ** - type is RX/TX/MISC
3250 */
3251 static void
3252 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
3253 {
3254 struct ixgbe_hw *hw = &adapter->hw;
3255 u32 ivar, index;
3256
3257 vector |= IXGBE_IVAR_ALLOC_VAL;
3258
3259 switch (hw->mac.type) {
3260
3261 case ixgbe_mac_82598EB:
3262 if (type == -1)
3263 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
3264 else
3265 entry += (type * 64);
3266 index = (entry >> 2) & 0x1F;
3267 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
3268 ivar &= ~(0xFF << (8 * (entry & 0x3)));
3269 ivar |= (vector << (8 * (entry & 0x3)));
3270 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
3271 break;
3272
3273 case ixgbe_mac_82599EB:
3274 case ixgbe_mac_X540:
3275 if (type == -1) { /* MISC IVAR */
3276 index = (entry & 1) * 8;
3277 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
3278 ivar &= ~(0xFF << index);
3279 ivar |= (vector << index);
3280 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
3281 } else { /* RX/TX IVARS */
3282 index = (16 * (entry & 1)) + (8 * type);
3283 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
3284 ivar &= ~(0xFF << index);
3285 ivar |= (vector << index);
3286 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
3287 }
3288
3289 default:
3290 break;
3291 }
3292 }
3293
3294 static void
3295 ixgbe_configure_ivars(struct adapter *adapter)
3296 {
3297 struct ix_queue *que = adapter->queues;
3298 u32 newitr;
3299
3300 if (ixgbe_max_interrupt_rate > 0)
3301 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
3302 else
3303 newitr = 0;
3304
3305 for (int i = 0; i < adapter->num_queues; i++, que++) {
3306 /* First the RX queue entry */
3307 ixgbe_set_ivar(adapter, i, que->msix, 0);
3308 /* ... and the TX */
3309 ixgbe_set_ivar(adapter, i, que->msix, 1);
3310 /* Set an Initial EITR value */
3311 IXGBE_WRITE_REG(&adapter->hw,
3312 IXGBE_EITR(que->msix), newitr);
3313 }
3314
3315 /* For the Link interrupt */
3316 ixgbe_set_ivar(adapter, 1, adapter->linkvec, -1);
3317 }
3318
3319 /*
3320 ** ixgbe_sfp_probe - called in the local timer to
3321 ** determine if a port had optics inserted.
3322 */
3323 static bool ixgbe_sfp_probe(struct adapter *adapter)
3324 {
3325 struct ixgbe_hw *hw = &adapter->hw;
3326 device_t dev = adapter->dev;
3327 bool result = FALSE;
3328
3329 if ((hw->phy.type == ixgbe_phy_nl) &&
3330 (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
3331 s32 ret = hw->phy.ops.identify_sfp(hw);
3332 if (ret)
3333 goto out;
3334 ret = hw->phy.ops.reset(hw);
3335 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3336 device_printf(dev,"Unsupported SFP+ module detected!");
3337 device_printf(dev, "Reload driver with supported module.\n");
3338 adapter->sfp_probe = FALSE;
3339 goto out;
3340 } else
3341 device_printf(dev,"SFP+ module detected!\n");
3342 /* We now have supported optics */
3343 adapter->sfp_probe = FALSE;
3344 /* Set the optics type so system reports correctly */
3345 ixgbe_setup_optics(adapter);
3346 result = TRUE;
3347 }
3348 out:
3349 return (result);
3350 }
3351
3352 /*
3353 ** Tasklet handler for MSIX Link interrupts
3354 ** - do outside interrupt since it might sleep
3355 */
3356 static void
3357 ixgbe_handle_link(void *context)
3358 {
3359 struct adapter *adapter = context;
3360
3361 if (ixgbe_check_link(&adapter->hw,
3362 &adapter->link_speed, &adapter->link_up, 0) == 0)
3363 ixgbe_update_link_status(adapter);
3364 }
3365
3366 /*
3367 ** Tasklet for handling SFP module interrupts
3368 */
3369 static void
3370 ixgbe_handle_mod(void *context)
3371 {
3372 struct adapter *adapter = context;
3373 struct ixgbe_hw *hw = &adapter->hw;
3374 device_t dev = adapter->dev;
3375 u32 err;
3376
3377 err = hw->phy.ops.identify_sfp(hw);
3378 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3379 device_printf(dev,
3380 "Unsupported SFP+ module type was detected.\n");
3381 return;
3382 }
3383 err = hw->mac.ops.setup_sfp(hw);
3384 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3385 device_printf(dev,
3386 "Setup failure - unsupported SFP+ module type.\n");
3387 return;
3388 }
3389 softint_schedule(adapter->msf_si);
3390 return;
3391 }
3392
3393
3394 /*
3395 ** Tasklet for handling MSF (multispeed fiber) interrupts
3396 */
3397 static void
3398 ixgbe_handle_msf(void *context)
3399 {
3400 struct adapter *adapter = context;
3401 struct ixgbe_hw *hw = &adapter->hw;
3402 u32 autoneg;
3403 bool negotiate;
3404
3405 autoneg = hw->phy.autoneg_advertised;
3406 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
3407 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
3408 else
3409 negotiate = 0;
3410 if (hw->mac.ops.setup_link)
3411 hw->mac.ops.setup_link(hw, autoneg, TRUE);
3412 return;
3413 }
3414
3415 #ifdef IXGBE_FDIR
3416 /*
3417 ** Tasklet for reinitializing the Flow Director filter table
3418 */
3419 static void
3420 ixgbe_reinit_fdir(void *context)
3421 {
3422 struct adapter *adapter = context;
3423 struct ifnet *ifp = adapter->ifp;
3424
3425 if (adapter->fdir_reinit != 1) /* Shouldn't happen */
3426 return;
3427 ixgbe_reinit_fdir_tables_82599(&adapter->hw);
3428 adapter->fdir_reinit = 0;
3429 /* re-enable flow director interrupts */
3430 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_FLOW_DIR);
3431 /* Restart the interface */
3432 ifp->if_flags |= IFF_RUNNING;
3433 return;
3434 }
3435 #endif
3436
3437 /**********************************************************************
3438 *
3439 * Update the board statistics counters.
3440 *
3441 **********************************************************************/
3442 static void
3443 ixgbe_update_stats_counters(struct adapter *adapter)
3444 {
3445 struct ifnet *ifp = adapter->ifp;
3446 struct ixgbe_hw *hw = &adapter->hw;
3447 u32 missed_rx = 0, bprc, lxon, lxoff, total;
3448 u64 total_missed_rx = 0;
3449 uint64_t crcerrs, rlec;
3450
3451 crcerrs = IXGBE_READ_REG(hw, IXGBE_CRCERRS);
3452 adapter->stats.crcerrs.ev_count += crcerrs;
3453 adapter->stats.illerrc.ev_count += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
3454 adapter->stats.errbc.ev_count += IXGBE_READ_REG(hw, IXGBE_ERRBC);
3455 adapter->stats.mspdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MSPDC);
3456
3457 /*
3458 ** Note: these are for the 8 possible traffic classes,
3459 ** which in current implementation is unused,
3460 ** therefore only 0 should read real data.
3461 */
3462 for (int i = 0; i < __arraycount(adapter->stats.mpc); i++) {
3463 int j = i % adapter->num_queues;
3464 u32 mp;
3465 mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
3466 /* missed_rx tallies misses for the gprc workaround */
3467 missed_rx += mp;
3468 /* global total per queue */
3469 adapter->stats.mpc[j].ev_count += mp;
3470 /* Running comprehensive total for stats display */
3471 total_missed_rx += mp;
3472 if (hw->mac.type == ixgbe_mac_82598EB) {
3473 adapter->stats.rnbc[j] +=
3474 IXGBE_READ_REG(hw, IXGBE_RNBC(i));
3475 adapter->stats.qbtc[j].ev_count +=
3476 IXGBE_READ_REG(hw, IXGBE_QBTC(i));
3477 adapter->stats.qbrc[j].ev_count +=
3478 IXGBE_READ_REG(hw, IXGBE_QBRC(i));
3479 adapter->stats.pxonrxc[j].ev_count +=
3480 IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
3481 } else {
3482 adapter->stats.pxonrxc[j].ev_count +=
3483 IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
3484 }
3485 adapter->stats.pxontxc[j].ev_count +=
3486 IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
3487 adapter->stats.pxofftxc[j].ev_count +=
3488 IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
3489 adapter->stats.pxoffrxc[j].ev_count +=
3490 IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
3491 adapter->stats.pxon2offc[j].ev_count +=
3492 IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
3493 }
3494 for (int i = 0; i < __arraycount(adapter->stats.qprc); i++) {
3495 int j = i % adapter->num_queues;
3496 adapter->stats.qprc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
3497 adapter->stats.qptc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
3498 adapter->stats.qprdc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
3499 }
3500 adapter->stats.mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC);
3501 adapter->stats.mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC);
3502 rlec = IXGBE_READ_REG(hw, IXGBE_RLEC);
3503 adapter->stats.rlec.ev_count += rlec;
3504
3505 /* Hardware workaround, gprc counts missed packets */
3506 adapter->stats.gprc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx;
3507
3508 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
3509 adapter->stats.lxontxc.ev_count += lxon;
3510 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
3511 adapter->stats.lxofftxc.ev_count += lxoff;
3512 total = lxon + lxoff;
3513
3514 if (hw->mac.type != ixgbe_mac_82598EB) {
3515 adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) +
3516 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
3517 adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
3518 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32) - total * ETHER_MIN_LEN;
3519 adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) +
3520 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
3521 adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
3522 adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
3523 } else {
3524 adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
3525 adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
3526 /* 82598 only has a counter in the high register */
3527 adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH);
3528 adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH) - total * ETHER_MIN_LEN;
3529 adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH);
3530 }
3531
3532 /*
3533 * Workaround: mprc hardware is incorrectly counting
3534 * broadcasts, so for now we subtract those.
3535 */
3536 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
3537 adapter->stats.bprc.ev_count += bprc;
3538 adapter->stats.mprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPRC) - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0);
3539
3540 adapter->stats.prc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC64);
3541 adapter->stats.prc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC127);
3542 adapter->stats.prc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC255);
3543 adapter->stats.prc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC511);
3544 adapter->stats.prc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1023);
3545 adapter->stats.prc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1522);
3546
3547 adapter->stats.gptc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPTC) - total;
3548 adapter->stats.mptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPTC) - total;
3549 adapter->stats.ptc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC64) - total;
3550
3551 adapter->stats.ruc.ev_count += IXGBE_READ_REG(hw, IXGBE_RUC);
3552 adapter->stats.rfc.ev_count += IXGBE_READ_REG(hw, IXGBE_RFC);
3553 adapter->stats.roc.ev_count += IXGBE_READ_REG(hw, IXGBE_ROC);
3554 adapter->stats.rjc.ev_count += IXGBE_READ_REG(hw, IXGBE_RJC);
3555 adapter->stats.mngprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
3556 adapter->stats.mngpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
3557 adapter->stats.mngptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
3558 adapter->stats.tpr.ev_count += IXGBE_READ_REG(hw, IXGBE_TPR);
3559 adapter->stats.tpt.ev_count += IXGBE_READ_REG(hw, IXGBE_TPT);
3560 adapter->stats.ptc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC127);
3561 adapter->stats.ptc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC255);
3562 adapter->stats.ptc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC511);
3563 adapter->stats.ptc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1023);
3564 adapter->stats.ptc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1522);
3565 adapter->stats.bptc.ev_count += IXGBE_READ_REG(hw, IXGBE_BPTC);
3566 adapter->stats.xec.ev_count += IXGBE_READ_REG(hw, IXGBE_XEC);
3567 adapter->stats.fccrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCCRC);
3568 adapter->stats.fclast.ev_count += IXGBE_READ_REG(hw, IXGBE_FCLAST);
3569
3570 /* Only read FCOE on 82599 */
3571 if (hw->mac.type != ixgbe_mac_82598EB) {
3572 adapter->stats.fcoerpdc.ev_count +=
3573 IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
3574 adapter->stats.fcoeprc.ev_count +=
3575 IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
3576 adapter->stats.fcoeptc.ev_count +=
3577 IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
3578 adapter->stats.fcoedwrc.ev_count +=
3579 IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
3580 adapter->stats.fcoedwtc.ev_count +=
3581 IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
3582 }
3583
3584 /* Fill out the OS statistics structure */
3585 /*
3586 * NetBSD: Don't override if_{i|o}{packets|bytes|mcasts} with
3587 * adapter->stats counters. It's required to make ifconfig -z
3588 * (SOICZIFDATA) work.
3589 */
3590 ifp->if_collisions = 0;
3591
3592 /* Rx Errors */
3593 ifp->if_iqdrops += total_missed_rx;
3594 ifp->if_ierrors += crcerrs + rlec;
3595 }
3596
3597 /** ixgbe_sysctl_tdh_handler - Handler function
3598 * Retrieves the TDH value from the hardware
3599 */
3600 static int
3601 ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
3602 {
3603 struct sysctlnode node;
3604 uint32_t val;
3605 struct tx_ring *txr;
3606
3607 node = *rnode;
3608 txr = (struct tx_ring *)node.sysctl_data;
3609 if (txr == NULL)
3610 return 0;
3611 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
3612 node.sysctl_data = &val;
3613 return sysctl_lookup(SYSCTLFN_CALL(&node));
3614 }
3615
3616 /** ixgbe_sysctl_tdt_handler - Handler function
3617 * Retrieves the TDT value from the hardware
3618 */
3619 static int
3620 ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
3621 {
3622 struct sysctlnode node;
3623 uint32_t val;
3624 struct tx_ring *txr;
3625
3626 node = *rnode;
3627 txr = (struct tx_ring *)node.sysctl_data;
3628 if (txr == NULL)
3629 return 0;
3630 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
3631 node.sysctl_data = &val;
3632 return sysctl_lookup(SYSCTLFN_CALL(&node));
3633 }
3634
3635 /** ixgbe_sysctl_rdh_handler - Handler function
3636 * Retrieves the RDH value from the hardware
3637 */
3638 static int
3639 ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
3640 {
3641 struct sysctlnode node;
3642 uint32_t val;
3643 struct rx_ring *rxr;
3644
3645 node = *rnode;
3646 rxr = (struct rx_ring *)node.sysctl_data;
3647 if (rxr == NULL)
3648 return 0;
3649 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
3650 node.sysctl_data = &val;
3651 return sysctl_lookup(SYSCTLFN_CALL(&node));
3652 }
3653
3654 /** ixgbe_sysctl_rdt_handler - Handler function
3655 * Retrieves the RDT value from the hardware
3656 */
3657 static int
3658 ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
3659 {
3660 struct sysctlnode node;
3661 uint32_t val;
3662 struct rx_ring *rxr;
3663
3664 node = *rnode;
3665 rxr = (struct rx_ring *)node.sysctl_data;
3666 if (rxr == NULL)
3667 return 0;
3668 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
3669 node.sysctl_data = &val;
3670 return sysctl_lookup(SYSCTLFN_CALL(&node));
3671 }
3672
3673 static int
3674 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
3675 {
3676 int error;
3677 struct sysctlnode node;
3678 struct ix_queue *que;
3679 uint32_t reg, usec, rate;
3680
3681 node = *rnode;
3682 que = (struct ix_queue *)node.sysctl_data;
3683 if (que == NULL)
3684 return 0;
3685 reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
3686 usec = ((reg & 0x0FF8) >> 3);
3687 if (usec > 0)
3688 rate = 500000 / usec;
3689 else
3690 rate = 0;
3691 node.sysctl_data = &rate;
3692 error = sysctl_lookup(SYSCTLFN_CALL(&node));
3693 if (error)
3694 return error;
3695 reg &= ~0xfff; /* default, no limitation */
3696 ixgbe_max_interrupt_rate = 0;
3697 if (rate > 0 && rate < 500000) {
3698 if (rate < 1000)
3699 rate = 1000;
3700 ixgbe_max_interrupt_rate = rate;
3701 reg |= ((4000000/rate) & 0xff8 );
3702 }
3703 IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
3704 return 0;
3705 }
3706
3707 const struct sysctlnode *
3708 ixgbe_sysctl_instance(struct adapter *adapter)
3709 {
3710 const char *dvname;
3711 struct sysctllog **log;
3712 int rc;
3713 const struct sysctlnode *rnode;
3714
3715 log = &adapter->sysctllog;
3716 dvname = device_xname(adapter->dev);
3717
3718 if ((rc = sysctl_createv(log, 0, NULL, &rnode,
3719 0, CTLTYPE_NODE, dvname,
3720 SYSCTL_DESCR("ixgbe information and settings"),
3721 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
3722 goto err;
3723
3724 return rnode;
3725 err:
3726 printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
3727 return NULL;
3728 }
3729
3730 /*
3731 * Add sysctl variables, one per statistic, to the system.
3732 */
3733 static void
3734 ixgbe_add_hw_stats(struct adapter *adapter)
3735 {
3736 device_t dev = adapter->dev;
3737 const struct sysctlnode *rnode, *cnode;
3738 struct sysctllog **log = &adapter->sysctllog;
3739 struct tx_ring *txr = adapter->tx_rings;
3740 struct rx_ring *rxr = adapter->rx_rings;
3741 struct ixgbe_hw_stats *stats = &adapter->stats;
3742
3743 /* Driver Statistics */
3744 #if 0
3745 /* These counters are not updated by the software */
3746 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
3747 CTLFLAG_RD, &adapter->dropped_pkts,
3748 "Driver dropped packets");
3749 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_header_failed",
3750 CTLFLAG_RD, &adapter->mbuf_header_failed,
3751 "???");
3752 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_packet_failed",
3753 CTLFLAG_RD, &adapter->mbuf_packet_failed,
3754 "???");
3755 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "no_tx_map_avail",
3756 CTLFLAG_RD, &adapter->no_tx_map_avail,
3757 "???");
3758 #endif
3759 evcnt_attach_dynamic(&adapter->handleq, EVCNT_TYPE_MISC,
3760 NULL, device_xname(dev), "Handled queue in softint");
3761 evcnt_attach_dynamic(&adapter->req, EVCNT_TYPE_MISC,
3762 NULL, device_xname(dev), "Requeued in softint");
3763 evcnt_attach_dynamic(&adapter->morerx, EVCNT_TYPE_MISC,
3764 NULL, device_xname(dev), "Interrupt handler more rx");
3765 evcnt_attach_dynamic(&adapter->moretx, EVCNT_TYPE_MISC,
3766 NULL, device_xname(dev), "Interrupt handler more tx");
3767 evcnt_attach_dynamic(&adapter->txloops, EVCNT_TYPE_MISC,
3768 NULL, device_xname(dev), "Interrupt handler tx loops");
3769 evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
3770 NULL, device_xname(dev), "Driver tx dma soft fail EFBIG");
3771 evcnt_attach_dynamic(&adapter->m_defrag_failed, EVCNT_TYPE_MISC,
3772 NULL, device_xname(dev), "m_defrag() failed");
3773 evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
3774 NULL, device_xname(dev), "Driver tx dma hard fail EFBIG");
3775 evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
3776 NULL, device_xname(dev), "Driver tx dma hard fail EINVAL");
3777 evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
3778 NULL, device_xname(dev), "Driver tx dma hard fail other");
3779 evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
3780 NULL, device_xname(dev), "Driver tx dma soft fail EAGAIN");
3781 evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
3782 NULL, device_xname(dev), "Driver tx dma soft fail ENOMEM");
3783 evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
3784 NULL, device_xname(dev), "Watchdog timeouts");
3785 evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
3786 NULL, device_xname(dev), "TSO errors");
3787 evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_MISC,
3788 NULL, device_xname(dev), "Link MSIX IRQ Handled");
3789
3790 for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
3791 snprintf(adapter->queues[i].evnamebuf,
3792 sizeof(adapter->queues[i].evnamebuf), "%s queue%d",
3793 device_xname(dev), i);
3794 snprintf(adapter->queues[i].namebuf,
3795 sizeof(adapter->queues[i].namebuf), "queue%d", i);
3796
3797 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
3798 aprint_error_dev(dev, "could not create sysctl root\n");
3799 break;
3800 }
3801
3802 if (sysctl_createv(log, 0, &rnode, &rnode,
3803 0, CTLTYPE_NODE,
3804 adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
3805 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
3806 break;
3807
3808 if (sysctl_createv(log, 0, &rnode, &cnode,
3809 CTLFLAG_READWRITE, CTLTYPE_INT,
3810 "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
3811 ixgbe_sysctl_interrupt_rate_handler, 0,
3812 (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
3813 break;
3814
3815 if (sysctl_createv(log, 0, &rnode, &cnode,
3816 CTLFLAG_READONLY, CTLTYPE_QUAD,
3817 "irqs", SYSCTL_DESCR("irqs on this queue"),
3818 NULL, 0, &(adapter->queues[i].irqs),
3819 0, CTL_CREATE, CTL_EOL) != 0)
3820 break;
3821
3822 if (sysctl_createv(log, 0, &rnode, &cnode,
3823 CTLFLAG_READONLY, CTLTYPE_INT,
3824 "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
3825 ixgbe_sysctl_tdh_handler, 0, (void *)txr,
3826 0, CTL_CREATE, CTL_EOL) != 0)
3827 break;
3828
3829 if (sysctl_createv(log, 0, &rnode, &cnode,
3830 CTLFLAG_READONLY, CTLTYPE_INT,
3831 "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
3832 ixgbe_sysctl_tdt_handler, 0, (void *)txr,
3833 0, CTL_CREATE, CTL_EOL) != 0)
3834 break;
3835
3836 evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
3837 NULL, device_xname(dev), "TSO");
3838 evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
3839 NULL, adapter->queues[i].evnamebuf,
3840 "Queue No Descriptor Available");
3841 evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
3842 NULL, adapter->queues[i].evnamebuf,
3843 "Queue Packets Transmitted");
3844
3845 #ifdef LRO
3846 struct lro_ctrl *lro = &rxr->lro;
3847 #endif /* LRO */
3848
3849 if (sysctl_createv(log, 0, &rnode, &cnode,
3850 CTLFLAG_READONLY,
3851 CTLTYPE_INT,
3852 "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
3853 ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
3854 CTL_CREATE, CTL_EOL) != 0)
3855 break;
3856
3857 if (sysctl_createv(log, 0, &rnode, &cnode,
3858 CTLFLAG_READONLY,
3859 CTLTYPE_INT,
3860 "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
3861 ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
3862 CTL_CREATE, CTL_EOL) != 0)
3863 break;
3864
3865 if (i < __arraycount(adapter->stats.mpc)) {
3866 evcnt_attach_dynamic(&adapter->stats.mpc[i],
3867 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3868 "Missed Packet Count");
3869 }
3870 if (i < __arraycount(adapter->stats.pxontxc)) {
3871 evcnt_attach_dynamic(&adapter->stats.pxontxc[i],
3872 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3873 "pxontxc");
3874 evcnt_attach_dynamic(&adapter->stats.pxonrxc[i],
3875 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3876 "pxonrxc");
3877 evcnt_attach_dynamic(&adapter->stats.pxofftxc[i],
3878 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3879 "pxofftxc");
3880 evcnt_attach_dynamic(&adapter->stats.pxoffrxc[i],
3881 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3882 "pxoffrxc");
3883 evcnt_attach_dynamic(&adapter->stats.pxon2offc[i],
3884 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3885 "pxon2offc");
3886 }
3887 if (i < __arraycount(adapter->stats.qprc)) {
3888 evcnt_attach_dynamic(&adapter->stats.qprc[i],
3889 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3890 "qprc");
3891 evcnt_attach_dynamic(&adapter->stats.qptc[i],
3892 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3893 "qptc");
3894 evcnt_attach_dynamic(&adapter->stats.qbrc[i],
3895 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3896 "qbrc");
3897 evcnt_attach_dynamic(&adapter->stats.qbtc[i],
3898 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3899 "qbtc");
3900 evcnt_attach_dynamic(&adapter->stats.qprdc[i],
3901 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
3902 "qprdc");
3903 }
3904
3905 evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
3906 NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
3907 evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
3908 NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
3909 evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
3910 NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
3911 evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
3912 NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
3913 evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
3914 NULL, adapter->queues[i].evnamebuf, "Rx discarded");
3915 evcnt_attach_dynamic(&rxr->rx_irq, EVCNT_TYPE_MISC,
3916 NULL, adapter->queues[i].evnamebuf, "Rx interrupts");
3917 #ifdef LRO
3918 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
3919 CTLFLAG_RD, &lro->lro_queued, 0,
3920 "LRO Queued");
3921 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
3922 CTLFLAG_RD, &lro->lro_flushed, 0,
3923 "LRO Flushed");
3924 #endif /* LRO */
3925 }
3926
3927 /* MAC stats get the own sub node */
3928
3929
3930 snprintf(stats->namebuf,
3931 sizeof(stats->namebuf), "%s MAC Statistics", device_xname(dev));
3932
3933 evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
3934 stats->namebuf, "rx csum offload - IP");
3935 evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
3936 stats->namebuf, "rx csum offload - L4");
3937 evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
3938 stats->namebuf, "rx csum offload - IP bad");
3939 evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
3940 stats->namebuf, "rx csum offload - L4 bad");
3941 evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
3942 stats->namebuf, "Interrupt conditions zero");
3943 evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
3944 stats->namebuf, "Legacy interrupts");
3945 evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
3946 stats->namebuf, "CRC Errors");
3947 evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
3948 stats->namebuf, "Illegal Byte Errors");
3949 evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
3950 stats->namebuf, "Byte Errors");
3951 evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
3952 stats->namebuf, "MAC Short Packets Discarded");
3953 evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
3954 stats->namebuf, "MAC Local Faults");
3955 evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
3956 stats->namebuf, "MAC Remote Faults");
3957 evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
3958 stats->namebuf, "Receive Length Errors");
3959 evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
3960 stats->namebuf, "Link XON Transmitted");
3961 evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
3962 stats->namebuf, "Link XON Received");
3963 evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
3964 stats->namebuf, "Link XOFF Transmitted");
3965 evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
3966 stats->namebuf, "Link XOFF Received");
3967
3968 /* Packet Reception Stats */
3969 evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
3970 stats->namebuf, "Total Octets Received");
3971 evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
3972 stats->namebuf, "Good Octets Received");
3973 evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
3974 stats->namebuf, "Total Packets Received");
3975 evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
3976 stats->namebuf, "Good Packets Received");
3977 evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
3978 stats->namebuf, "Multicast Packets Received");
3979 evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
3980 stats->namebuf, "Broadcast Packets Received");
3981 evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
3982 stats->namebuf, "64 byte frames received ");
3983 evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
3984 stats->namebuf, "65-127 byte frames received");
3985 evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
3986 stats->namebuf, "128-255 byte frames received");
3987 evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
3988 stats->namebuf, "256-511 byte frames received");
3989 evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
3990 stats->namebuf, "512-1023 byte frames received");
3991 evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
3992 stats->namebuf, "1023-1522 byte frames received");
3993 evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
3994 stats->namebuf, "Receive Undersized");
3995 evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
3996 stats->namebuf, "Fragmented Packets Received ");
3997 evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
3998 stats->namebuf, "Oversized Packets Received");
3999 evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
4000 stats->namebuf, "Received Jabber");
4001 evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
4002 stats->namebuf, "Management Packets Received");
4003 evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
4004 stats->namebuf, "Checksum Errors");
4005
4006 /* Packet Transmission Stats */
4007 evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
4008 stats->namebuf, "Good Octets Transmitted");
4009 evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
4010 stats->namebuf, "Total Packets Transmitted");
4011 evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
4012 stats->namebuf, "Good Packets Transmitted");
4013 evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
4014 stats->namebuf, "Broadcast Packets Transmitted");
4015 evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
4016 stats->namebuf, "Multicast Packets Transmitted");
4017 evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
4018 stats->namebuf, "Management Packets Transmitted");
4019 evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
4020 stats->namebuf, "64 byte frames transmitted ");
4021 evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
4022 stats->namebuf, "65-127 byte frames transmitted");
4023 evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
4024 stats->namebuf, "128-255 byte frames transmitted");
4025 evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
4026 stats->namebuf, "256-511 byte frames transmitted");
4027 evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
4028 stats->namebuf, "512-1023 byte frames transmitted");
4029 evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
4030 stats->namebuf, "1024-1522 byte frames transmitted");
4031 }
4032
4033 /*
4034 ** Set flow control using sysctl:
4035 ** Flow control values:
4036 ** 0 - off
4037 ** 1 - rx pause
4038 ** 2 - tx pause
4039 ** 3 - full
4040 */
4041 static int
4042 ixgbe_set_flowcntl(SYSCTLFN_ARGS)
4043 {
4044 struct sysctlnode node;
4045 int error, last;
4046 struct adapter *adapter;
4047
4048 node = *rnode;
4049 adapter = (struct adapter *)node.sysctl_data;
4050 node.sysctl_data = &adapter->fc;
4051 last = adapter->fc;
4052 error = sysctl_lookup(SYSCTLFN_CALL(&node));
4053 if (error != 0 || newp == NULL)
4054 return error;
4055
4056 /* Don't bother if it's not changed */
4057 if (adapter->fc == last)
4058 return (0);
4059
4060 switch (adapter->fc) {
4061 case ixgbe_fc_rx_pause:
4062 case ixgbe_fc_tx_pause:
4063 case ixgbe_fc_full:
4064 adapter->hw.fc.requested_mode = adapter->fc;
4065 if (adapter->num_queues > 1)
4066 ixgbe_disable_rx_drop(adapter);
4067 break;
4068 case ixgbe_fc_none:
4069 adapter->hw.fc.requested_mode = ixgbe_fc_none;
4070 if (adapter->num_queues > 1)
4071 ixgbe_enable_rx_drop(adapter);
4072 break;
4073 default:
4074 adapter->fc = last;
4075 return (EINVAL);
4076 }
4077 /* Don't autoneg if forcing a value */
4078 adapter->hw.fc.disable_fc_autoneg = TRUE;
4079 ixgbe_fc_enable(&adapter->hw);
4080 return 0;
4081 }
4082
4083
4084 /*
4085 ** Control link advertise speed:
4086 ** 1 - advertise only 1G
4087 ** 2 - advertise 100Mb
4088 ** 3 - advertise normal
4089 */
4090 static int
4091 ixgbe_set_advertise(SYSCTLFN_ARGS)
4092 {
4093 struct sysctlnode node;
4094 int t, error = 0;
4095 struct adapter *adapter;
4096 device_t dev;
4097 struct ixgbe_hw *hw;
4098 ixgbe_link_speed speed, last;
4099
4100 node = *rnode;
4101 adapter = (struct adapter *)node.sysctl_data;
4102 dev = adapter->dev;
4103 hw = &adapter->hw;
4104 last = adapter->advertise;
4105 t = adapter->advertise;
4106 node.sysctl_data = &t;
4107 error = sysctl_lookup(SYSCTLFN_CALL(&node));
4108 if (error != 0 || newp == NULL)
4109 return error;
4110
4111 if (adapter->advertise == last) /* no change */
4112 return (0);
4113
4114 if (t == -1)
4115 return 0;
4116
4117 adapter->advertise = t;
4118
4119 if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
4120 (hw->phy.multispeed_fiber)))
4121 return (EINVAL);
4122
4123 if ((adapter->advertise == 2) && (hw->mac.type != ixgbe_mac_X540)) {
4124 device_printf(dev, "Set Advertise: 100Mb on X540 only\n");
4125 return (EINVAL);
4126 }
4127
4128 if (adapter->advertise == 1)
4129 speed = IXGBE_LINK_SPEED_1GB_FULL;
4130 else if (adapter->advertise == 2)
4131 speed = IXGBE_LINK_SPEED_100_FULL;
4132 else if (adapter->advertise == 3)
4133 speed = IXGBE_LINK_SPEED_1GB_FULL |
4134 IXGBE_LINK_SPEED_10GB_FULL;
4135 else { /* bogus value */
4136 adapter->advertise = last;
4137 return (EINVAL);
4138 }
4139
4140 hw->mac.autotry_restart = TRUE;
4141 hw->mac.ops.setup_link(hw, speed, TRUE);
4142
4143 return 0;
4144 }
4145
4146 /*
4147 ** Thermal Shutdown Trigger
4148 ** - cause a Thermal Overtemp IRQ
4149 ** - this now requires firmware enabling
4150 */
4151 static int
4152 ixgbe_set_thermal_test(SYSCTLFN_ARGS)
4153 {
4154 struct sysctlnode node;
4155 int error, fire = 0;
4156 struct adapter *adapter;
4157 struct ixgbe_hw *hw;
4158
4159 node = *rnode;
4160 adapter = (struct adapter *)node.sysctl_data;
4161 hw = &adapter->hw;
4162
4163 if (hw->mac.type != ixgbe_mac_X540)
4164 return (0);
4165
4166 node.sysctl_data = &fire;
4167 error = sysctl_lookup(SYSCTLFN_CALL(&node));
4168 if ((error) || (newp == NULL))
4169 return (error);
4170
4171 if (fire) {
4172 u32 reg = IXGBE_READ_REG(hw, IXGBE_EICS);
4173 reg |= IXGBE_EICR_TS;
4174 IXGBE_WRITE_REG(hw, IXGBE_EICS, reg);
4175 }
4176
4177 return (0);
4178 }
4179
4180 /*
4181 ** Enable the hardware to drop packets when the buffer is
4182 ** full. This is useful when multiqueue,so that no single
4183 ** queue being full stalls the entire RX engine. We only
4184 ** enable this when Multiqueue AND when Flow Control is
4185 ** disabled.
4186 */
4187 static void
4188 ixgbe_enable_rx_drop(struct adapter *adapter)
4189 {
4190 struct ixgbe_hw *hw = &adapter->hw;
4191
4192 for (int i = 0; i < adapter->num_queues; i++) {
4193 u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i));
4194 srrctl |= IXGBE_SRRCTL_DROP_EN;
4195 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
4196 }
4197 }
4198
4199 static void
4200 ixgbe_disable_rx_drop(struct adapter *adapter)
4201 {
4202 struct ixgbe_hw *hw = &adapter->hw;
4203
4204 for (int i = 0; i < adapter->num_queues; i++) {
4205 u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i));
4206 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
4207 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
4208 }
4209 }
4210