ixv.c revision 1.196 1 /* $NetBSD: ixv.c,v 1.196 2023/11/15 03:50:22 msaitoh Exp $ */
2
3 /******************************************************************************
4
5 Copyright (c) 2001-2017, Intel Corporation
6 All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13
14 2. Redistributions in binary form must reproduce the above copyright
15 notice, this list of conditions and the following disclaimer in the
16 documentation and/or other materials provided with the distribution.
17
18 3. Neither the name of the Intel Corporation nor the names of its
19 contributors may be used to endorse or promote products derived from
20 this software without specific prior written permission.
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 POSSIBILITY OF SUCH DAMAGE.
33
34 ******************************************************************************/
35 /*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 331224 2018-03-19 20:55:05Z erj $*/
36
37 #include <sys/cdefs.h>
38 __KERNEL_RCSID(0, "$NetBSD: ixv.c,v 1.196 2023/11/15 03:50:22 msaitoh Exp $");
39
40 #ifdef _KERNEL_OPT
41 #include "opt_inet.h"
42 #include "opt_inet6.h"
43 #include "opt_net_mpsafe.h"
44 #endif
45
46 #include "ixgbe.h"
47
48 /************************************************************************
49 * Driver version
50 ************************************************************************/
51 static const char ixv_driver_version[] = "2.0.1-k";
52 /* XXX NetBSD: + 1.5.17 */
53
54 /************************************************************************
55 * PCI Device ID Table
56 *
57 * Used by probe to select devices to load on
58 * Last field stores an index into ixv_strings
59 * Last entry must be all 0s
60 *
61 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
62 ************************************************************************/
63 static const ixgbe_vendor_info_t ixv_vendor_info_array[] =
64 {
65 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
66 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
67 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, 0, 0, 0},
68 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, 0, 0, 0},
69 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_VF, 0, 0, 0},
70 /* required last entry */
71 {0, 0, 0, 0, 0}
72 };
73
74 /************************************************************************
75 * Table of branding strings
76 ************************************************************************/
77 static const char *ixv_strings[] = {
78 "Intel(R) PRO/10GbE Virtual Function Network Driver"
79 };
80
81 /*********************************************************************
82 * Function prototypes
83 *********************************************************************/
84 static int ixv_probe(device_t, cfdata_t, void *);
85 static void ixv_attach(device_t, device_t, void *);
86 static int ixv_detach(device_t, int);
87 #if 0
88 static int ixv_shutdown(device_t);
89 #endif
90 static int ixv_ifflags_cb(struct ethercom *);
91 static int ixv_ioctl(struct ifnet *, u_long, void *);
92 static int ixv_init(struct ifnet *);
93 static void ixv_init_locked(struct ixgbe_softc *);
94 static void ixv_ifstop(struct ifnet *, int);
95 static void ixv_stop_locked(void *);
96 static void ixv_init_device_features(struct ixgbe_softc *);
97 static void ixv_media_status(struct ifnet *, struct ifmediareq *);
98 static int ixv_media_change(struct ifnet *);
99 static int ixv_allocate_pci_resources(struct ixgbe_softc *,
100 const struct pci_attach_args *);
101 static void ixv_free_deferred_handlers(struct ixgbe_softc *);
102 static int ixv_allocate_msix(struct ixgbe_softc *,
103 const struct pci_attach_args *);
104 static int ixv_configure_interrupts(struct ixgbe_softc *);
105 static void ixv_free_pci_resources(struct ixgbe_softc *);
106 static void ixv_local_timer(void *);
107 static void ixv_handle_timer(struct work *, void *);
108 static int ixv_setup_interface(device_t, struct ixgbe_softc *);
109 static void ixv_schedule_admin_tasklet(struct ixgbe_softc *);
110 static int ixv_negotiate_api(struct ixgbe_softc *);
111
112 static void ixv_initialize_transmit_units(struct ixgbe_softc *);
113 static void ixv_initialize_receive_units(struct ixgbe_softc *);
114 static void ixv_initialize_rss_mapping(struct ixgbe_softc *);
115 static s32 ixv_check_link(struct ixgbe_softc *);
116
117 static void ixv_enable_intr(struct ixgbe_softc *);
118 static void ixv_disable_intr(struct ixgbe_softc *);
119 static int ixv_set_rxfilter(struct ixgbe_softc *);
120 static void ixv_update_link_status(struct ixgbe_softc *);
121 static int ixv_sysctl_debug(SYSCTLFN_PROTO);
122 static void ixv_set_ivar(struct ixgbe_softc *, u8, u8, s8);
123 static void ixv_configure_ivars(struct ixgbe_softc *);
124 static u8 * ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
125 static void ixv_eitr_write(struct ixgbe_softc *, uint32_t, uint32_t);
126
127 static void ixv_setup_vlan_tagging(struct ixgbe_softc *);
128 static int ixv_setup_vlan_support(struct ixgbe_softc *);
129 static int ixv_vlan_cb(struct ethercom *, uint16_t, bool);
130 static int ixv_register_vlan(struct ixgbe_softc *, u16);
131 static int ixv_unregister_vlan(struct ixgbe_softc *, u16);
132
133 static void ixv_add_device_sysctls(struct ixgbe_softc *);
134 static void ixv_init_stats(struct ixgbe_softc *);
135 static void ixv_update_stats(struct ixgbe_softc *);
136 static void ixv_add_stats_sysctls(struct ixgbe_softc *);
137 static void ixv_clear_evcnt(struct ixgbe_softc *);
138
139 /* Sysctl handlers */
140 static int ixv_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
141 static int ixv_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
142 static int ixv_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
143 static int ixv_sysctl_rdh_handler(SYSCTLFN_PROTO);
144 static int ixv_sysctl_rdt_handler(SYSCTLFN_PROTO);
145 static int ixv_sysctl_tdt_handler(SYSCTLFN_PROTO);
146 static int ixv_sysctl_tdh_handler(SYSCTLFN_PROTO);
147 static int ixv_sysctl_tx_process_limit(SYSCTLFN_PROTO);
148 static int ixv_sysctl_rx_process_limit(SYSCTLFN_PROTO);
149 static int ixv_sysctl_rx_copy_len(SYSCTLFN_PROTO);
150
151 /* The MSI-X Interrupt handlers */
152 static int ixv_msix_que(void *);
153 static int ixv_msix_mbx(void *);
154
155 /* Event handlers running on workqueue */
156 static void ixv_handle_que(void *);
157
158 /* Deferred workqueue handlers */
159 static void ixv_handle_admin(struct work *, void *);
160 static void ixv_handle_que_work(struct work *, void *);
161
162 const struct sysctlnode *ixv_sysctl_instance(struct ixgbe_softc *);
163 static const ixgbe_vendor_info_t *ixv_lookup(const struct pci_attach_args *);
164
165 /************************************************************************
166 * NetBSD Device Interface Entry Points
167 ************************************************************************/
168 CFATTACH_DECL3_NEW(ixv, sizeof(struct ixgbe_softc),
169 ixv_probe, ixv_attach, ixv_detach, NULL, NULL, NULL,
170 DVF_DETACH_SHUTDOWN);
171
172 #if 0
173 static driver_t ixv_driver = {
174 "ixv", ixv_methods, sizeof(struct ixgbe_softc),
175 };
176
177 devclass_t ixv_devclass;
178 DRIVER_MODULE(ixv, pci, ixv_driver, ixv_devclass, 0, 0);
179 MODULE_DEPEND(ixv, pci, 1, 1, 1);
180 MODULE_DEPEND(ixv, ether, 1, 1, 1);
181 #endif
182
183 /*
184 * TUNEABLE PARAMETERS:
185 */
186
187 /* Number of Queues - do not exceed MSI-X vectors - 1 */
188 static int ixv_num_queues = 0;
189 #define TUNABLE_INT(__x, __y)
190 TUNABLE_INT("hw.ixv.num_queues", &ixv_num_queues);
191
192 /*
193 * AIM: Adaptive Interrupt Moderation
194 * which means that the interrupt rate
195 * is varied over time based on the
196 * traffic for that interrupt vector
197 */
198 static bool ixv_enable_aim = false;
199 TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
200
201 static int ixv_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
202 TUNABLE_INT("hw.ixv.max_interrupt_rate", &ixv_max_interrupt_rate);
203
204 /* How many packets rxeof tries to clean at a time */
205 static int ixv_rx_process_limit = 256;
206 TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
207
208 /* How many packets txeof tries to clean at a time */
209 static int ixv_tx_process_limit = 256;
210 TUNABLE_INT("hw.ixv.tx_process_limit", &ixv_tx_process_limit);
211
212 /* Which packet processing uses workqueue or softint */
213 static bool ixv_txrx_workqueue = false;
214
215 /*
216 * Number of TX descriptors per ring,
217 * setting higher than RX as this seems
218 * the better performing choice.
219 */
220 static int ixv_txd = DEFAULT_TXD;
221 TUNABLE_INT("hw.ixv.txd", &ixv_txd);
222
223 /* Number of RX descriptors per ring */
224 static int ixv_rxd = DEFAULT_RXD;
225 TUNABLE_INT("hw.ixv.rxd", &ixv_rxd);
226
227 /* Legacy Transmit (single queue) */
228 static int ixv_enable_legacy_tx = 0;
229 TUNABLE_INT("hw.ixv.enable_legacy_tx", &ixv_enable_legacy_tx);
230
231 #ifdef NET_MPSAFE
232 #define IXGBE_MPSAFE 1
233 #define IXGBE_CALLOUT_FLAGS CALLOUT_MPSAFE
234 #define IXGBE_SOFTINT_FLAGS SOFTINT_MPSAFE
235 #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU | WQ_MPSAFE
236 #define IXGBE_TASKLET_WQ_FLAGS WQ_MPSAFE
237 #else
238 #define IXGBE_CALLOUT_FLAGS 0
239 #define IXGBE_SOFTINT_FLAGS 0
240 #define IXGBE_WORKQUEUE_FLAGS WQ_PERCPU
241 #define IXGBE_TASKLET_WQ_FLAGS 0
242 #endif
243 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
244
245 #if 0
246 static int (*ixv_start_locked)(struct ifnet *, struct tx_ring *);
247 static int (*ixv_ring_empty)(struct ifnet *, struct buf_ring *);
248 #endif
249
250 /************************************************************************
251 * ixv_probe - Device identification routine
252 *
253 * Determines if the driver should be loaded on
254 * adapter based on its PCI vendor/device ID.
255 *
256 * return BUS_PROBE_DEFAULT on success, positive on failure
257 ************************************************************************/
258 static int
259 ixv_probe(device_t dev, cfdata_t cf, void *aux)
260 {
261 #ifdef __HAVE_PCI_MSI_MSIX
262 const struct pci_attach_args *pa = aux;
263
264 return (ixv_lookup(pa) != NULL) ? 1 : 0;
265 #else
266 return 0;
267 #endif
268 } /* ixv_probe */
269
270 static const ixgbe_vendor_info_t *
271 ixv_lookup(const struct pci_attach_args *pa)
272 {
273 const ixgbe_vendor_info_t *ent;
274 pcireg_t subid;
275
276 INIT_DEBUGOUT("ixv_lookup: begin");
277
278 if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
279 return NULL;
280
281 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
282
283 for (ent = ixv_vendor_info_array; ent->vendor_id != 0; ent++) {
284 if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
285 (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
286 ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
287 (ent->subvendor_id == 0)) &&
288 ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
289 (ent->subdevice_id == 0))) {
290 return ent;
291 }
292 }
293
294 return NULL;
295 }
296
297 /************************************************************************
298 * ixv_attach - Device initialization routine
299 *
300 * Called when the driver is being loaded.
301 * Identifies the type of hardware, allocates all resources
302 * and initializes the hardware.
303 *
304 * return 0 on success, positive on failure
305 ************************************************************************/
306 static void
307 ixv_attach(device_t parent, device_t dev, void *aux)
308 {
309 struct ixgbe_softc *sc;
310 struct ixgbe_hw *hw;
311 int error = 0;
312 pcireg_t id, subid;
313 const ixgbe_vendor_info_t *ent;
314 const struct pci_attach_args *pa = aux;
315 const char *apivstr;
316 const char *str;
317 char wqname[MAXCOMLEN];
318 char buf[256];
319
320 INIT_DEBUGOUT("ixv_attach: begin");
321
322 /*
323 * Make sure BUSMASTER is set, on a VM under
324 * KVM it may not be and will break things.
325 */
326 ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
327
328 /* Allocate, clear, and link in our adapter structure */
329 sc = device_private(dev);
330 sc->hw.back = sc;
331 sc->dev = dev;
332 hw = &sc->hw;
333
334 sc->init_locked = ixv_init_locked;
335 sc->stop_locked = ixv_stop_locked;
336
337 sc->osdep.pc = pa->pa_pc;
338 sc->osdep.tag = pa->pa_tag;
339 if (pci_dma64_available(pa))
340 sc->osdep.dmat = pa->pa_dmat64;
341 else
342 sc->osdep.dmat = pa->pa_dmat;
343 sc->osdep.attached = false;
344
345 ent = ixv_lookup(pa);
346
347 KASSERT(ent != NULL);
348
349 aprint_normal(": %s, Version - %s\n",
350 ixv_strings[ent->index], ixv_driver_version);
351
352 /* Core Lock Init */
353 IXGBE_CORE_LOCK_INIT(sc, device_xname(dev));
354
355 /* Do base PCI setup - map BAR0 */
356 if (ixv_allocate_pci_resources(sc, pa)) {
357 aprint_error_dev(dev, "ixv_allocate_pci_resources() failed!\n");
358 error = ENXIO;
359 goto err_out;
360 }
361
362 /* SYSCTL APIs */
363 ixv_add_device_sysctls(sc);
364
365 /* Set up the timer callout and workqueue */
366 callout_init(&sc->timer, IXGBE_CALLOUT_FLAGS);
367 snprintf(wqname, sizeof(wqname), "%s-timer", device_xname(dev));
368 error = workqueue_create(&sc->timer_wq, wqname,
369 ixv_handle_timer, sc, IXGBE_WORKQUEUE_PRI, IPL_NET,
370 IXGBE_TASKLET_WQ_FLAGS);
371 if (error) {
372 aprint_error_dev(dev,
373 "could not create timer workqueue (%d)\n", error);
374 goto err_out;
375 }
376
377 /* Save off the information about this board */
378 id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
379 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
380 hw->vendor_id = PCI_VENDOR(id);
381 hw->device_id = PCI_PRODUCT(id);
382 hw->revision_id =
383 PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
384 hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
385 hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
386
387 /* A subset of set_mac_type */
388 switch (hw->device_id) {
389 case IXGBE_DEV_ID_82599_VF:
390 hw->mac.type = ixgbe_mac_82599_vf;
391 str = "82599 VF";
392 break;
393 case IXGBE_DEV_ID_X540_VF:
394 hw->mac.type = ixgbe_mac_X540_vf;
395 str = "X540 VF";
396 break;
397 case IXGBE_DEV_ID_X550_VF:
398 hw->mac.type = ixgbe_mac_X550_vf;
399 str = "X550 VF";
400 break;
401 case IXGBE_DEV_ID_X550EM_X_VF:
402 hw->mac.type = ixgbe_mac_X550EM_x_vf;
403 str = "X550EM X VF";
404 break;
405 case IXGBE_DEV_ID_X550EM_A_VF:
406 hw->mac.type = ixgbe_mac_X550EM_a_vf;
407 str = "X550EM A VF";
408 break;
409 default:
410 /* Shouldn't get here since probe succeeded */
411 aprint_error_dev(dev, "Unknown device ID!\n");
412 error = ENXIO;
413 goto err_out;
414 break;
415 }
416 aprint_normal_dev(dev, "device %s\n", str);
417
418 ixv_init_device_features(sc);
419
420 /* Initialize the shared code */
421 error = ixgbe_init_ops_vf(hw);
422 if (error) {
423 aprint_error_dev(dev, "ixgbe_init_ops_vf() failed!\n");
424 error = EIO;
425 goto err_out;
426 }
427
428 /* Setup the mailbox */
429 ixgbe_init_mbx_params_vf(hw);
430
431 /* Set the right number of segments */
432 KASSERT(IXGBE_82599_SCATTER_MAX >= IXGBE_SCATTER_DEFAULT);
433 sc->num_segs = IXGBE_SCATTER_DEFAULT;
434
435 /* Reset mbox api to 1.0 */
436 error = hw->mac.ops.reset_hw(hw);
437 if (error == IXGBE_ERR_RESET_FAILED)
438 aprint_error_dev(dev, "...reset_hw() failure: Reset Failed!\n");
439 else if (error)
440 aprint_error_dev(dev, "...reset_hw() failed with error %d\n",
441 error);
442 if (error) {
443 error = EIO;
444 goto err_out;
445 }
446
447 error = hw->mac.ops.init_hw(hw);
448 if (error) {
449 aprint_error_dev(dev, "...init_hw() failed!\n");
450 error = EIO;
451 goto err_out;
452 }
453
454 /* Negotiate mailbox API version */
455 error = ixv_negotiate_api(sc);
456 if (error)
457 aprint_normal_dev(dev,
458 "MBX API negotiation failed during attach!\n");
459 switch (hw->api_version) {
460 case ixgbe_mbox_api_10:
461 apivstr = "1.0";
462 break;
463 case ixgbe_mbox_api_20:
464 apivstr = "2.0";
465 break;
466 case ixgbe_mbox_api_11:
467 apivstr = "1.1";
468 break;
469 case ixgbe_mbox_api_12:
470 apivstr = "1.2";
471 break;
472 case ixgbe_mbox_api_13:
473 apivstr = "1.3";
474 break;
475 case ixgbe_mbox_api_14:
476 apivstr = "1.4";
477 break;
478 case ixgbe_mbox_api_15:
479 apivstr = "1.5";
480 break;
481 default:
482 apivstr = "unknown";
483 break;
484 }
485 aprint_normal_dev(dev, "Mailbox API %s\n", apivstr);
486
487 /* If no mac address was assigned, make a random one */
488 if (!ixv_check_ether_addr(hw->mac.addr)) {
489 u8 addr[ETHER_ADDR_LEN];
490 uint64_t rndval = cprng_strong64();
491
492 memcpy(addr, &rndval, sizeof(addr));
493 addr[0] &= 0xFE;
494 addr[0] |= 0x02;
495 bcopy(addr, hw->mac.addr, sizeof(addr));
496 }
497
498 /* Register for VLAN events */
499 ether_set_vlan_cb(&sc->osdep.ec, ixv_vlan_cb);
500
501 /* Do descriptor calc and sanity checks */
502 if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
503 ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
504 aprint_error_dev(dev, "Invalid TX ring size (%d). "
505 "It must be between %d and %d, "
506 "inclusive, and must be a multiple of %zu. "
507 "Using default value of %d instead.\n",
508 ixv_txd, MIN_TXD, MAX_TXD,
509 DBA_ALIGN / sizeof(union ixgbe_adv_tx_desc),
510 DEFAULT_TXD);
511 sc->num_tx_desc = DEFAULT_TXD;
512 } else
513 sc->num_tx_desc = ixv_txd;
514
515 if (((ixv_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
516 ixv_rxd < MIN_RXD || ixv_rxd > MAX_RXD) {
517 aprint_error_dev(dev, "Invalid RX ring size (%d). "
518 "It must be between %d and %d, "
519 "inclusive, and must be a multiple of %zu. "
520 "Using default value of %d instead.\n",
521 ixv_rxd, MIN_RXD, MAX_RXD,
522 DBA_ALIGN / sizeof(union ixgbe_adv_rx_desc),
523 DEFAULT_RXD);
524 sc->num_rx_desc = DEFAULT_RXD;
525 } else
526 sc->num_rx_desc = ixv_rxd;
527
528 /* Sysctls for limiting the amount of work done in the taskqueues */
529 sc->rx_process_limit
530 = (ixv_rx_process_limit <= sc->num_rx_desc)
531 ? ixv_rx_process_limit : sc->num_rx_desc;
532 sc->tx_process_limit
533 = (ixv_tx_process_limit <= sc->num_tx_desc)
534 ? ixv_tx_process_limit : sc->num_tx_desc;
535
536 /* Set default high limit of copying mbuf in rxeof */
537 sc->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
538
539 /* Setup MSI-X */
540 error = ixv_configure_interrupts(sc);
541 if (error)
542 goto err_out;
543
544 /* Allocate our TX/RX Queues */
545 if (ixgbe_allocate_queues(sc)) {
546 aprint_error_dev(dev, "ixgbe_allocate_queues() failed!\n");
547 error = ENOMEM;
548 goto err_out;
549 }
550
551 /* hw.ix defaults init */
552 sc->enable_aim = ixv_enable_aim;
553 sc->max_interrupt_rate = ixv_max_interrupt_rate;
554
555 sc->txrx_use_workqueue = ixv_txrx_workqueue;
556
557 error = ixv_allocate_msix(sc, pa);
558 if (error) {
559 aprint_error_dev(dev, "ixv_allocate_msix() failed!\n");
560 goto err_late;
561 }
562
563 /* Setup OS specific network interface */
564 error = ixv_setup_interface(dev, sc);
565 if (error != 0) {
566 aprint_error_dev(dev, "ixv_setup_interface() failed!\n");
567 goto err_late;
568 }
569
570 /* Allocate multicast array memory */
571 sc->mta = malloc(sizeof(*sc->mta) *
572 IXGBE_MAX_VF_MC, M_DEVBUF, M_WAITOK);
573
574 /* Check if VF was disabled by PF */
575 error = hw->mac.ops.get_link_state(hw, &sc->link_enabled);
576 if (error) {
577 /* PF is not capable of controlling VF state. Enable the link. */
578 sc->link_enabled = TRUE;
579 }
580
581 /* Do the stats setup */
582 ixv_init_stats(sc);
583 ixv_add_stats_sysctls(sc);
584
585 if (sc->feat_en & IXGBE_FEATURE_NETMAP)
586 ixgbe_netmap_attach(sc);
587
588 snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, sc->feat_cap);
589 aprint_verbose_dev(dev, "feature cap %s\n", buf);
590 snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, sc->feat_en);
591 aprint_verbose_dev(dev, "feature ena %s\n", buf);
592
593 INIT_DEBUGOUT("ixv_attach: end");
594 sc->osdep.attached = true;
595
596 return;
597
598 err_late:
599 ixgbe_free_queues(sc);
600 err_out:
601 ixv_free_pci_resources(sc);
602 IXGBE_CORE_LOCK_DESTROY(sc);
603
604 return;
605 } /* ixv_attach */
606
607 /************************************************************************
608 * ixv_detach - Device removal routine
609 *
610 * Called when the driver is being removed.
611 * Stops the adapter and deallocates all the resources
612 * that were allocated for driver operation.
613 *
614 * return 0 on success, positive on failure
615 ************************************************************************/
616 static int
617 ixv_detach(device_t dev, int flags)
618 {
619 struct ixgbe_softc *sc = device_private(dev);
620 struct ixgbe_hw *hw = &sc->hw;
621 struct tx_ring *txr = sc->tx_rings;
622 struct rx_ring *rxr = sc->rx_rings;
623 struct ixgbevf_hw_stats *stats = &sc->stats.vf;
624
625 INIT_DEBUGOUT("ixv_detach: begin");
626 if (sc->osdep.attached == false)
627 return 0;
628
629 /* Stop the interface. Callouts are stopped in it. */
630 ixv_ifstop(sc->ifp, 1);
631
632 if (VLAN_ATTACHED(&sc->osdep.ec) &&
633 (flags & (DETACH_SHUTDOWN | DETACH_FORCE)) == 0) {
634 aprint_error_dev(dev, "VLANs in use, detach first\n");
635 return EBUSY;
636 }
637
638 ether_ifdetach(sc->ifp);
639 callout_halt(&sc->timer, NULL);
640 ixv_free_deferred_handlers(sc);
641
642 if (sc->feat_en & IXGBE_FEATURE_NETMAP)
643 netmap_detach(sc->ifp);
644
645 ixv_free_pci_resources(sc);
646 #if 0 /* XXX the NetBSD port is probably missing something here */
647 bus_generic_detach(dev);
648 #endif
649 if_detach(sc->ifp);
650 ifmedia_fini(&sc->media);
651 if_percpuq_destroy(sc->ipq);
652
653 sysctl_teardown(&sc->sysctllog);
654 evcnt_detach(&sc->efbig_tx_dma_setup);
655 evcnt_detach(&sc->mbuf_defrag_failed);
656 evcnt_detach(&sc->efbig2_tx_dma_setup);
657 evcnt_detach(&sc->einval_tx_dma_setup);
658 evcnt_detach(&sc->other_tx_dma_setup);
659 evcnt_detach(&sc->eagain_tx_dma_setup);
660 evcnt_detach(&sc->enomem_tx_dma_setup);
661 evcnt_detach(&sc->watchdog_events);
662 evcnt_detach(&sc->tso_err);
663 evcnt_detach(&sc->admin_irqev);
664 evcnt_detach(&sc->link_workev);
665
666 txr = sc->tx_rings;
667 for (int i = 0; i < sc->num_queues; i++, rxr++, txr++) {
668 evcnt_detach(&sc->queues[i].irqs);
669 evcnt_detach(&sc->queues[i].handleq);
670 evcnt_detach(&sc->queues[i].req);
671 evcnt_detach(&txr->total_packets);
672 #ifndef IXGBE_LEGACY_TX
673 evcnt_detach(&txr->pcq_drops);
674 #endif
675 evcnt_detach(&txr->no_desc_avail);
676 evcnt_detach(&txr->tso_tx);
677
678 evcnt_detach(&rxr->rx_packets);
679 evcnt_detach(&rxr->rx_bytes);
680 evcnt_detach(&rxr->rx_copies);
681 evcnt_detach(&rxr->no_mbuf);
682 evcnt_detach(&rxr->rx_discarded);
683 }
684 evcnt_detach(&stats->ipcs);
685 evcnt_detach(&stats->l4cs);
686 evcnt_detach(&stats->ipcs_bad);
687 evcnt_detach(&stats->l4cs_bad);
688
689 /* Packet Reception Stats */
690 evcnt_detach(&stats->vfgorc);
691 evcnt_detach(&stats->vfgprc);
692 evcnt_detach(&stats->vfmprc);
693
694 /* Packet Transmission Stats */
695 evcnt_detach(&stats->vfgotc);
696 evcnt_detach(&stats->vfgptc);
697
698 /* Mailbox Stats */
699 evcnt_detach(&hw->mbx.stats.msgs_tx);
700 evcnt_detach(&hw->mbx.stats.msgs_rx);
701 evcnt_detach(&hw->mbx.stats.acks);
702 evcnt_detach(&hw->mbx.stats.reqs);
703 evcnt_detach(&hw->mbx.stats.rsts);
704
705 ixgbe_free_queues(sc);
706
707 IXGBE_CORE_LOCK_DESTROY(sc);
708
709 return (0);
710 } /* ixv_detach */
711
712 /************************************************************************
713 * ixv_init_locked - Init entry point
714 *
715 * Used in two ways: It is used by the stack as an init entry
716 * point in network interface structure. It is also used
717 * by the driver as a hw/sw initialization routine to get
718 * to a consistent state.
719 *
720 * return 0 on success, positive on failure
721 ************************************************************************/
722 static void
723 ixv_init_locked(struct ixgbe_softc *sc)
724 {
725 struct ifnet *ifp = sc->ifp;
726 device_t dev = sc->dev;
727 struct ixgbe_hw *hw = &sc->hw;
728 struct ix_queue *que;
729 int error = 0;
730 uint32_t mask;
731 int i;
732
733 INIT_DEBUGOUT("ixv_init_locked: begin");
734 KASSERT(mutex_owned(&sc->core_mtx));
735 hw->adapter_stopped = FALSE;
736 hw->mac.ops.stop_adapter(hw);
737 callout_stop(&sc->timer);
738 for (i = 0, que = sc->queues; i < sc->num_queues; i++, que++)
739 que->disabled_count = 0;
740
741 sc->max_frame_size =
742 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
743
744 /* reprogram the RAR[0] in case user changed it. */
745 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
746
747 /* Get the latest mac address, User can use a LAA */
748 memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
749 IXGBE_ETH_LENGTH_OF_ADDRESS);
750 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1);
751
752 /* Prepare transmit descriptors and buffers */
753 if (ixgbe_setup_transmit_structures(sc)) {
754 aprint_error_dev(dev, "Could not setup transmit structures\n");
755 ixv_stop_locked(sc);
756 return;
757 }
758
759 /* Reset VF and renegotiate mailbox API version */
760 hw->mac.ops.reset_hw(hw);
761 hw->mac.ops.start_hw(hw);
762 error = ixv_negotiate_api(sc);
763 if (error)
764 device_printf(dev,
765 "Mailbox API negotiation failed in init_locked!\n");
766
767 ixv_initialize_transmit_units(sc);
768
769 /* Setup Multicast table */
770 ixv_set_rxfilter(sc);
771
772 /* Use fixed buffer size, even for jumbo frames */
773 sc->rx_mbuf_sz = MCLBYTES;
774
775 /* Prepare receive descriptors and buffers */
776 error = ixgbe_setup_receive_structures(sc);
777 if (error) {
778 device_printf(dev,
779 "Could not setup receive structures (err = %d)\n", error);
780 ixv_stop_locked(sc);
781 return;
782 }
783
784 /* Configure RX settings */
785 ixv_initialize_receive_units(sc);
786
787 /* Initialize variable holding task enqueue requests interrupts */
788 sc->task_requests = 0;
789
790 /* Set up VLAN offload and filter */
791 ixv_setup_vlan_support(sc);
792
793 /* Set up MSI-X routing */
794 ixv_configure_ivars(sc);
795
796 /* Set up auto-mask */
797 mask = (1 << sc->vector);
798 for (i = 0, que = sc->queues; i < sc->num_queues; i++, que++)
799 mask |= (1 << que->msix);
800 IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, mask);
801
802 /* Set moderation on the Link interrupt */
803 ixv_eitr_write(sc, sc->vector, IXGBE_LINK_ITR);
804
805 /* Stats init */
806 ixv_init_stats(sc);
807
808 /* Config/Enable Link */
809 error = hw->mac.ops.get_link_state(hw, &sc->link_enabled);
810 if (error) {
811 /* PF is not capable of controlling VF state. Enable the link. */
812 sc->link_enabled = TRUE;
813 } else if (sc->link_enabled == FALSE)
814 device_printf(dev, "VF is disabled by PF\n");
815
816 hw->mac.get_link_status = TRUE;
817 hw->mac.ops.check_link(hw, &sc->link_speed, &sc->link_up,
818 FALSE);
819
820 /* Start watchdog */
821 callout_reset(&sc->timer, hz, ixv_local_timer, sc);
822 atomic_store_relaxed(&sc->timer_pending, 0);
823
824 /* OK to schedule workqueues. */
825 sc->schedule_wqs_ok = true;
826
827 /* Update saved flags. See ixgbe_ifflags_cb() */
828 sc->if_flags = ifp->if_flags;
829 sc->ec_capenable = sc->osdep.ec.ec_capenable;
830
831 /* Inform the stack we're ready */
832 ifp->if_flags |= IFF_RUNNING;
833
834 /* And now turn on interrupts */
835 ixv_enable_intr(sc);
836
837 return;
838 } /* ixv_init_locked */
839
840 /************************************************************************
841 * ixv_enable_queue
842 ************************************************************************/
843 static inline void
844 ixv_enable_queue(struct ixgbe_softc *sc, u32 vector)
845 {
846 struct ixgbe_hw *hw = &sc->hw;
847 struct ix_queue *que = &sc->queues[vector];
848 u32 queue = 1UL << vector;
849 u32 mask;
850
851 mutex_enter(&que->dc_mtx);
852 if (que->disabled_count > 0 && --que->disabled_count > 0)
853 goto out;
854
855 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
856 IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
857 out:
858 mutex_exit(&que->dc_mtx);
859 } /* ixv_enable_queue */
860
861 /************************************************************************
862 * ixv_disable_queue
863 ************************************************************************/
864 static inline void
865 ixv_disable_queue(struct ixgbe_softc *sc, u32 vector)
866 {
867 struct ixgbe_hw *hw = &sc->hw;
868 struct ix_queue *que = &sc->queues[vector];
869 u32 queue = 1UL << vector;
870 u32 mask;
871
872 mutex_enter(&que->dc_mtx);
873 if (que->disabled_count++ > 0)
874 goto out;
875
876 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
877 IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
878 out:
879 mutex_exit(&que->dc_mtx);
880 } /* ixv_disable_queue */
881
882 #if 0
883 static inline void
884 ixv_rearm_queues(struct ixgbe_softc *sc, u64 queues)
885 {
886 u32 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
887 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEICS, mask);
888 } /* ixv_rearm_queues */
889 #endif
890
891
892 /************************************************************************
893 * ixv_msix_que - MSI-X Queue Interrupt Service routine
894 ************************************************************************/
895 static int
896 ixv_msix_que(void *arg)
897 {
898 struct ix_queue *que = arg;
899 struct ixgbe_softc *sc = que->sc;
900 struct tx_ring *txr = que->txr;
901 struct rx_ring *rxr = que->rxr;
902 bool more;
903 u32 newitr = 0;
904
905 ixv_disable_queue(sc, que->msix);
906 IXGBE_EVC_ADD(&que->irqs, 1);
907
908 #ifdef __NetBSD__
909 /* Don't run ixgbe_rxeof in interrupt context */
910 more = true;
911 #else
912 more = ixgbe_rxeof(que);
913 #endif
914
915 IXGBE_TX_LOCK(txr);
916 ixgbe_txeof(txr);
917 IXGBE_TX_UNLOCK(txr);
918
919 /* Do AIM now? */
920
921 if (sc->enable_aim == false)
922 goto no_calc;
923 /*
924 * Do Adaptive Interrupt Moderation:
925 * - Write out last calculated setting
926 * - Calculate based on average size over
927 * the last interval.
928 */
929 if (que->eitr_setting)
930 ixv_eitr_write(sc, que->msix, que->eitr_setting);
931
932 que->eitr_setting = 0;
933
934 /* Idle, do nothing */
935 if ((txr->bytes == 0) && (rxr->bytes == 0))
936 goto no_calc;
937
938 if ((txr->bytes) && (txr->packets))
939 newitr = txr->bytes/txr->packets;
940 if ((rxr->bytes) && (rxr->packets))
941 newitr = uimax(newitr, (rxr->bytes / rxr->packets));
942 newitr += 24; /* account for hardware frame, crc */
943
944 /* set an upper boundary */
945 newitr = uimin(newitr, 3000);
946
947 /* Be nice to the mid range */
948 if ((newitr > 300) && (newitr < 1200))
949 newitr = (newitr / 3);
950 else
951 newitr = (newitr / 2);
952
953 /*
954 * When RSC is used, ITR interval must be larger than RSC_DELAY.
955 * Currently, we use 2us for RSC_DELAY. The minimum value is always
956 * greater than 2us on 100M (and 10M?(not documented)), but it's not
957 * on 1G and higher.
958 */
959 if ((sc->link_speed != IXGBE_LINK_SPEED_100_FULL)
960 && (sc->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
961 if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
962 newitr = IXGBE_MIN_RSC_EITR_10G1G;
963 }
964
965 /* save for next interrupt */
966 que->eitr_setting = newitr;
967
968 /* Reset state */
969 txr->bytes = 0;
970 txr->packets = 0;
971 rxr->bytes = 0;
972 rxr->packets = 0;
973
974 no_calc:
975 if (more)
976 softint_schedule(que->que_si);
977 else /* Re-enable this interrupt */
978 ixv_enable_queue(sc, que->msix);
979
980 return 1;
981 } /* ixv_msix_que */
982
983 /************************************************************************
984 * ixv_msix_mbx
985 ************************************************************************/
986 static int
987 ixv_msix_mbx(void *arg)
988 {
989 struct ixgbe_softc *sc = arg;
990 struct ixgbe_hw *hw = &sc->hw;
991
992 IXGBE_EVC_ADD(&sc->admin_irqev, 1);
993 /* NetBSD: We use auto-clear, so it's not required to write VTEICR */
994
995 /* Link status change */
996 hw->mac.get_link_status = TRUE;
997 atomic_or_32(&sc->task_requests, IXGBE_REQUEST_TASK_MBX);
998 ixv_schedule_admin_tasklet(sc);
999
1000 return 1;
1001 } /* ixv_msix_mbx */
1002
1003 static void
1004 ixv_eitr_write(struct ixgbe_softc *sc, uint32_t index, uint32_t itr)
1005 {
1006
1007 /*
1008 * Newer devices than 82598 have VF function, so this function is
1009 * simple.
1010 */
1011 itr |= IXGBE_EITR_CNT_WDIS;
1012
1013 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEITR(index), itr);
1014 }
1015
1016
1017 /************************************************************************
1018 * ixv_media_status - Media Ioctl callback
1019 *
1020 * Called whenever the user queries the status of
1021 * the interface using ifconfig.
1022 ************************************************************************/
1023 static void
1024 ixv_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1025 {
1026 struct ixgbe_softc *sc = ifp->if_softc;
1027
1028 INIT_DEBUGOUT("ixv_media_status: begin");
1029 ixv_update_link_status(sc);
1030
1031 ifmr->ifm_status = IFM_AVALID;
1032 ifmr->ifm_active = IFM_ETHER;
1033
1034 if (sc->link_active != LINK_STATE_UP) {
1035 ifmr->ifm_active |= IFM_NONE;
1036 return;
1037 }
1038
1039 ifmr->ifm_status |= IFM_ACTIVE;
1040
1041 switch (sc->link_speed) {
1042 case IXGBE_LINK_SPEED_10GB_FULL:
1043 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
1044 break;
1045 case IXGBE_LINK_SPEED_5GB_FULL:
1046 ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
1047 break;
1048 case IXGBE_LINK_SPEED_2_5GB_FULL:
1049 ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
1050 break;
1051 case IXGBE_LINK_SPEED_1GB_FULL:
1052 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1053 break;
1054 case IXGBE_LINK_SPEED_100_FULL:
1055 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
1056 break;
1057 case IXGBE_LINK_SPEED_10_FULL:
1058 ifmr->ifm_active |= IFM_10_T | IFM_FDX;
1059 break;
1060 }
1061
1062 ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
1063 } /* ixv_media_status */
1064
1065 /************************************************************************
1066 * ixv_media_change - Media Ioctl callback
1067 *
1068 * Called when the user changes speed/duplex using
1069 * media/mediopt option with ifconfig.
1070 ************************************************************************/
1071 static int
1072 ixv_media_change(struct ifnet *ifp)
1073 {
1074 struct ixgbe_softc *sc = ifp->if_softc;
1075 struct ifmedia *ifm = &sc->media;
1076
1077 INIT_DEBUGOUT("ixv_media_change: begin");
1078
1079 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1080 return (EINVAL);
1081
1082 switch (IFM_SUBTYPE(ifm->ifm_media)) {
1083 case IFM_AUTO:
1084 break;
1085 default:
1086 device_printf(sc->dev, "Only auto media type\n");
1087 return (EINVAL);
1088 }
1089
1090 return (0);
1091 } /* ixv_media_change */
1092
1093 static void
1094 ixv_schedule_admin_tasklet(struct ixgbe_softc *sc)
1095 {
1096 if (sc->schedule_wqs_ok) {
1097 if (atomic_cas_uint(&sc->admin_pending, 0, 1) == 0)
1098 workqueue_enqueue(sc->admin_wq,
1099 &sc->admin_wc, NULL);
1100 }
1101 }
1102
1103 /************************************************************************
1104 * ixv_negotiate_api
1105 *
1106 * Negotiate the Mailbox API with the PF;
1107 * start with the most featured API first.
1108 ************************************************************************/
1109 static int
1110 ixv_negotiate_api(struct ixgbe_softc *sc)
1111 {
1112 struct ixgbe_hw *hw = &sc->hw;
1113 int mbx_api[] = { ixgbe_mbox_api_15,
1114 ixgbe_mbox_api_13,
1115 ixgbe_mbox_api_12,
1116 ixgbe_mbox_api_11,
1117 ixgbe_mbox_api_10,
1118 ixgbe_mbox_api_unknown };
1119 int i = 0;
1120
1121 while (mbx_api[i] != ixgbe_mbox_api_unknown) {
1122 if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0) {
1123 if (hw->api_version >= ixgbe_mbox_api_15)
1124 ixgbe_upgrade_mbx_params_vf(hw);
1125 return (0);
1126 }
1127 i++;
1128 }
1129
1130 return (EINVAL);
1131 } /* ixv_negotiate_api */
1132
1133
1134 /************************************************************************
1135 * ixv_set_rxfilter - Multicast Update
1136 *
1137 * Called whenever multicast address list is updated.
1138 ************************************************************************/
1139 static int
1140 ixv_set_rxfilter(struct ixgbe_softc *sc)
1141 {
1142 struct ixgbe_mc_addr *mta;
1143 struct ifnet *ifp = sc->ifp;
1144 struct ixgbe_hw *hw = &sc->hw;
1145 u8 *update_ptr;
1146 int mcnt = 0;
1147 struct ethercom *ec = &sc->osdep.ec;
1148 struct ether_multi *enm;
1149 struct ether_multistep step;
1150 bool overflow = false;
1151 int error, rc = 0;
1152
1153 KASSERT(mutex_owned(&sc->core_mtx));
1154 IOCTL_DEBUGOUT("ixv_set_rxfilter: begin");
1155
1156 mta = sc->mta;
1157 bzero(mta, sizeof(*mta) * IXGBE_MAX_VF_MC);
1158
1159 /* 1: For PROMISC */
1160 if (ifp->if_flags & IFF_PROMISC) {
1161 error = hw->mac.ops.update_xcast_mode(hw,
1162 IXGBEVF_XCAST_MODE_PROMISC);
1163 if (error == IXGBE_ERR_NOT_TRUSTED) {
1164 device_printf(sc->dev,
1165 "this interface is not trusted\n");
1166 error = EPERM;
1167 } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
1168 device_printf(sc->dev,
1169 "the PF doesn't support promisc mode\n");
1170 error = EOPNOTSUPP;
1171 } else if (error == IXGBE_ERR_NOT_IN_PROMISC) {
1172 device_printf(sc->dev,
1173 "the PF may not in promisc mode\n");
1174 error = EINVAL;
1175 } else if (error) {
1176 device_printf(sc->dev,
1177 "failed to set promisc mode. error = %d\n",
1178 error);
1179 error = EIO;
1180 } else
1181 return 0;
1182 rc = error;
1183 }
1184
1185 /* 2: For ALLMULTI or normal */
1186 ETHER_LOCK(ec);
1187 ETHER_FIRST_MULTI(step, ec, enm);
1188 while (enm != NULL) {
1189 if ((mcnt >= IXGBE_MAX_VF_MC) ||
1190 (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1191 ETHER_ADDR_LEN) != 0)) {
1192 overflow = true;
1193 break;
1194 }
1195 bcopy(enm->enm_addrlo,
1196 mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
1197 mcnt++;
1198 ETHER_NEXT_MULTI(step, enm);
1199 }
1200 ETHER_UNLOCK(ec);
1201
1202 /* 3: For ALLMULTI */
1203 if (overflow) {
1204 error = hw->mac.ops.update_xcast_mode(hw,
1205 IXGBEVF_XCAST_MODE_ALLMULTI);
1206 if (error == IXGBE_ERR_NOT_TRUSTED) {
1207 device_printf(sc->dev,
1208 "this interface is not trusted\n");
1209 error = EPERM;
1210 } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
1211 device_printf(sc->dev,
1212 "the PF doesn't support allmulti mode\n");
1213 error = EOPNOTSUPP;
1214 } else if (error) {
1215 device_printf(sc->dev,
1216 "number of Ethernet multicast addresses "
1217 "exceeds the limit (%d). error = %d\n",
1218 IXGBE_MAX_VF_MC, error);
1219 error = ENOSPC;
1220 } else {
1221 ETHER_LOCK(ec);
1222 ec->ec_flags |= ETHER_F_ALLMULTI;
1223 ETHER_UNLOCK(ec);
1224 return rc; /* Promisc might have failed */
1225 }
1226
1227 if (rc == 0)
1228 rc = error;
1229
1230 /* Continue to update the multicast table as many as we can */
1231 }
1232
1233 /* 4: For normal operation */
1234 error = hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
1235 if ((error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) || (error == 0)) {
1236 /* Normal operation */
1237 ETHER_LOCK(ec);
1238 ec->ec_flags &= ~ETHER_F_ALLMULTI;
1239 ETHER_UNLOCK(ec);
1240 error = 0;
1241 } else if (error) {
1242 device_printf(sc->dev,
1243 "failed to set Ethernet multicast address "
1244 "operation to normal. error = %d\n", error);
1245 }
1246
1247 update_ptr = (u8 *)mta;
1248 error = sc->hw.mac.ops.update_mc_addr_list(&sc->hw,
1249 update_ptr, mcnt, ixv_mc_array_itr, TRUE);
1250 if (rc == 0)
1251 rc = error;
1252
1253 return rc;
1254 } /* ixv_set_rxfilter */
1255
1256 /************************************************************************
1257 * ixv_mc_array_itr
1258 *
1259 * An iterator function needed by the multicast shared code.
1260 * It feeds the shared code routine the addresses in the
1261 * array of ixv_set_rxfilter() one by one.
1262 ************************************************************************/
1263 static u8 *
1264 ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1265 {
1266 struct ixgbe_mc_addr *mta;
1267
1268 mta = (struct ixgbe_mc_addr *)*update_ptr;
1269
1270 *vmdq = 0;
1271 *update_ptr = (u8*)(mta + 1);
1272
1273 return (mta->addr);
1274 } /* ixv_mc_array_itr */
1275
1276 /************************************************************************
1277 * ixv_local_timer - Timer routine
1278 *
1279 * Checks for link status, updates statistics,
1280 * and runs the watchdog check.
1281 ************************************************************************/
1282 static void
1283 ixv_local_timer(void *arg)
1284 {
1285 struct ixgbe_softc *sc = arg;
1286
1287 if (sc->schedule_wqs_ok) {
1288 if (atomic_cas_uint(&sc->timer_pending, 0, 1) == 0)
1289 workqueue_enqueue(sc->timer_wq,
1290 &sc->timer_wc, NULL);
1291 }
1292 }
1293
1294 static void
1295 ixv_handle_timer(struct work *wk, void *context)
1296 {
1297 struct ixgbe_softc *sc = context;
1298 device_t dev = sc->dev;
1299 struct ix_queue *que = sc->queues;
1300 u64 queues = 0;
1301 u64 v0, v1, v2, v3, v4, v5, v6, v7;
1302 int hung = 0;
1303 int i;
1304
1305 IXGBE_CORE_LOCK(sc);
1306
1307 if (ixv_check_link(sc)) {
1308 ixv_init_locked(sc);
1309 IXGBE_CORE_UNLOCK(sc);
1310 return;
1311 }
1312
1313 /* Stats Update */
1314 ixv_update_stats(sc);
1315
1316 /* Update some event counters */
1317 v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
1318 que = sc->queues;
1319 for (i = 0; i < sc->num_queues; i++, que++) {
1320 struct tx_ring *txr = que->txr;
1321
1322 v0 += txr->q_efbig_tx_dma_setup;
1323 v1 += txr->q_mbuf_defrag_failed;
1324 v2 += txr->q_efbig2_tx_dma_setup;
1325 v3 += txr->q_einval_tx_dma_setup;
1326 v4 += txr->q_other_tx_dma_setup;
1327 v5 += txr->q_eagain_tx_dma_setup;
1328 v6 += txr->q_enomem_tx_dma_setup;
1329 v7 += txr->q_tso_err;
1330 }
1331 IXGBE_EVC_STORE(&sc->efbig_tx_dma_setup, v0);
1332 IXGBE_EVC_STORE(&sc->mbuf_defrag_failed, v1);
1333 IXGBE_EVC_STORE(&sc->efbig2_tx_dma_setup, v2);
1334 IXGBE_EVC_STORE(&sc->einval_tx_dma_setup, v3);
1335 IXGBE_EVC_STORE(&sc->other_tx_dma_setup, v4);
1336 IXGBE_EVC_STORE(&sc->eagain_tx_dma_setup, v5);
1337 IXGBE_EVC_STORE(&sc->enomem_tx_dma_setup, v6);
1338 IXGBE_EVC_STORE(&sc->tso_err, v7);
1339
1340 /*
1341 * Check the TX queues status
1342 * - mark hung queues so we don't schedule on them
1343 * - watchdog only if all queues show hung
1344 */
1345 que = sc->queues;
1346 for (i = 0; i < sc->num_queues; i++, que++) {
1347 /* Keep track of queues with work for soft irq */
1348 if (que->txr->busy)
1349 queues |= ((u64)1 << que->me);
1350 /*
1351 * Each time txeof runs without cleaning, but there
1352 * are uncleaned descriptors it increments busy. If
1353 * we get to the MAX we declare it hung.
1354 */
1355 if (que->busy == IXGBE_QUEUE_HUNG) {
1356 ++hung;
1357 /* Mark the queue as inactive */
1358 sc->active_queues &= ~((u64)1 << que->me);
1359 continue;
1360 } else {
1361 /* Check if we've come back from hung */
1362 if ((sc->active_queues & ((u64)1 << que->me)) == 0)
1363 sc->active_queues |= ((u64)1 << que->me);
1364 }
1365 if (que->busy >= IXGBE_MAX_TX_BUSY) {
1366 device_printf(dev,
1367 "Warning queue %d appears to be hung!\n", i);
1368 que->txr->busy = IXGBE_QUEUE_HUNG;
1369 ++hung;
1370 }
1371 }
1372
1373 /* Only truly watchdog if all queues show hung */
1374 if (hung == sc->num_queues)
1375 goto watchdog;
1376 #if 0
1377 else if (queues != 0) { /* Force an IRQ on queues with work */
1378 ixv_rearm_queues(sc, queues);
1379 }
1380 #endif
1381
1382 atomic_store_relaxed(&sc->timer_pending, 0);
1383 IXGBE_CORE_UNLOCK(sc);
1384 callout_reset(&sc->timer, hz, ixv_local_timer, sc);
1385
1386 return;
1387
1388 watchdog:
1389 device_printf(sc->dev, "Watchdog timeout -- resetting\n");
1390 sc->ifp->if_flags &= ~IFF_RUNNING;
1391 IXGBE_EVC_ADD(&sc->watchdog_events, 1);
1392 ixv_init_locked(sc);
1393 IXGBE_CORE_UNLOCK(sc);
1394 } /* ixv_handle_timer */
1395
1396 /************************************************************************
1397 * ixv_update_link_status - Update OS on link state
1398 *
1399 * Note: Only updates the OS on the cached link state.
1400 * The real check of the hardware only happens with
1401 * a link interrupt.
1402 ************************************************************************/
1403 static void
1404 ixv_update_link_status(struct ixgbe_softc *sc)
1405 {
1406 struct ifnet *ifp = sc->ifp;
1407 device_t dev = sc->dev;
1408
1409 KASSERT(mutex_owned(&sc->core_mtx));
1410
1411 if (sc->link_up && sc->link_enabled) {
1412 if (sc->link_active != LINK_STATE_UP) {
1413 if (bootverbose) {
1414 const char *bpsmsg;
1415
1416 switch (sc->link_speed) {
1417 case IXGBE_LINK_SPEED_10GB_FULL:
1418 bpsmsg = "10 Gbps";
1419 break;
1420 case IXGBE_LINK_SPEED_5GB_FULL:
1421 bpsmsg = "5 Gbps";
1422 break;
1423 case IXGBE_LINK_SPEED_2_5GB_FULL:
1424 bpsmsg = "2.5 Gbps";
1425 break;
1426 case IXGBE_LINK_SPEED_1GB_FULL:
1427 bpsmsg = "1 Gbps";
1428 break;
1429 case IXGBE_LINK_SPEED_100_FULL:
1430 bpsmsg = "100 Mbps";
1431 break;
1432 case IXGBE_LINK_SPEED_10_FULL:
1433 bpsmsg = "10 Mbps";
1434 break;
1435 default:
1436 bpsmsg = "unknown speed";
1437 break;
1438 }
1439 device_printf(dev, "Link is up %s %s \n",
1440 bpsmsg, "Full Duplex");
1441 }
1442 sc->link_active = LINK_STATE_UP;
1443 if_link_state_change(ifp, LINK_STATE_UP);
1444 }
1445 } else {
1446 /*
1447 * Do it when link active changes to DOWN. i.e.
1448 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
1449 * b) LINK_STATE_UP -> LINK_STATE_DOWN
1450 */
1451 if (sc->link_active != LINK_STATE_DOWN) {
1452 if (bootverbose)
1453 device_printf(dev, "Link is Down\n");
1454 if_link_state_change(ifp, LINK_STATE_DOWN);
1455 sc->link_active = LINK_STATE_DOWN;
1456 }
1457 }
1458 } /* ixv_update_link_status */
1459
1460
1461 /************************************************************************
1462 * ixv_stop - Stop the hardware
1463 *
1464 * Disables all traffic on the adapter by issuing a
1465 * global reset on the MAC and deallocates TX/RX buffers.
1466 ************************************************************************/
1467 static void
1468 ixv_ifstop(struct ifnet *ifp, int disable)
1469 {
1470 struct ixgbe_softc *sc = ifp->if_softc;
1471
1472 IXGBE_CORE_LOCK(sc);
1473 ixv_stop_locked(sc);
1474 IXGBE_CORE_UNLOCK(sc);
1475
1476 workqueue_wait(sc->admin_wq, &sc->admin_wc);
1477 atomic_store_relaxed(&sc->admin_pending, 0);
1478 workqueue_wait(sc->timer_wq, &sc->timer_wc);
1479 atomic_store_relaxed(&sc->timer_pending, 0);
1480 }
1481
1482 static void
1483 ixv_stop_locked(void *arg)
1484 {
1485 struct ifnet *ifp;
1486 struct ixgbe_softc *sc = arg;
1487 struct ixgbe_hw *hw = &sc->hw;
1488
1489 ifp = sc->ifp;
1490
1491 KASSERT(mutex_owned(&sc->core_mtx));
1492
1493 INIT_DEBUGOUT("ixv_stop_locked: begin\n");
1494 ixv_disable_intr(sc);
1495
1496 /* Tell the stack that the interface is no longer active */
1497 ifp->if_flags &= ~IFF_RUNNING;
1498
1499 hw->mac.ops.reset_hw(hw);
1500 sc->hw.adapter_stopped = FALSE;
1501 hw->mac.ops.stop_adapter(hw);
1502 callout_stop(&sc->timer);
1503
1504 /* Don't schedule workqueues. */
1505 sc->schedule_wqs_ok = false;
1506
1507 /* reprogram the RAR[0] in case user changed it. */
1508 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
1509
1510 return;
1511 } /* ixv_stop_locked */
1512
1513
1514 /************************************************************************
1515 * ixv_allocate_pci_resources
1516 ************************************************************************/
1517 static int
1518 ixv_allocate_pci_resources(struct ixgbe_softc *sc,
1519 const struct pci_attach_args *pa)
1520 {
1521 pcireg_t memtype, csr;
1522 device_t dev = sc->dev;
1523 bus_addr_t addr;
1524 int flags;
1525
1526 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
1527 switch (memtype) {
1528 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1529 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1530 sc->osdep.mem_bus_space_tag = pa->pa_memt;
1531 if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
1532 memtype, &addr, &sc->osdep.mem_size, &flags) != 0)
1533 goto map_err;
1534 if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
1535 aprint_normal_dev(dev, "clearing prefetchable bit\n");
1536 flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
1537 }
1538 if (bus_space_map(sc->osdep.mem_bus_space_tag, addr,
1539 sc->osdep.mem_size, flags,
1540 &sc->osdep.mem_bus_space_handle) != 0) {
1541 map_err:
1542 sc->osdep.mem_size = 0;
1543 aprint_error_dev(dev, "unable to map BAR0\n");
1544 return ENXIO;
1545 }
1546 /*
1547 * Enable address decoding for memory range in case it's not
1548 * set.
1549 */
1550 csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
1551 PCI_COMMAND_STATUS_REG);
1552 csr |= PCI_COMMAND_MEM_ENABLE;
1553 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
1554 csr);
1555 break;
1556 default:
1557 aprint_error_dev(dev, "unexpected type on BAR0\n");
1558 return ENXIO;
1559 }
1560
1561 /* Pick up the tuneable queues */
1562 sc->num_queues = ixv_num_queues;
1563
1564 return (0);
1565 } /* ixv_allocate_pci_resources */
1566
1567 static void
1568 ixv_free_deferred_handlers(struct ixgbe_softc *sc)
1569 {
1570 struct ix_queue *que = sc->queues;
1571 struct tx_ring *txr = sc->tx_rings;
1572 int i;
1573
1574 for (i = 0; i < sc->num_queues; i++, que++, txr++) {
1575 if (!(sc->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
1576 if (txr->txr_si != NULL)
1577 softint_disestablish(txr->txr_si);
1578 }
1579 if (que->que_si != NULL)
1580 softint_disestablish(que->que_si);
1581 }
1582 if (sc->txr_wq != NULL)
1583 workqueue_destroy(sc->txr_wq);
1584 if (sc->txr_wq_enqueued != NULL)
1585 percpu_free(sc->txr_wq_enqueued, sizeof(u_int));
1586 if (sc->que_wq != NULL)
1587 workqueue_destroy(sc->que_wq);
1588
1589 /* Drain the Mailbox(link) queue */
1590 if (sc->admin_wq != NULL) {
1591 workqueue_destroy(sc->admin_wq);
1592 sc->admin_wq = NULL;
1593 }
1594 if (sc->timer_wq != NULL) {
1595 workqueue_destroy(sc->timer_wq);
1596 sc->timer_wq = NULL;
1597 }
1598 } /* ixv_free_deferred_handlers */
1599
1600 /************************************************************************
1601 * ixv_free_pci_resources
1602 ************************************************************************/
1603 static void
1604 ixv_free_pci_resources(struct ixgbe_softc *sc)
1605 {
1606 struct ix_queue *que = sc->queues;
1607 int rid;
1608
1609 /*
1610 * Release all msix queue resources:
1611 */
1612 for (int i = 0; i < sc->num_queues; i++, que++) {
1613 if (que->res != NULL)
1614 pci_intr_disestablish(sc->osdep.pc,
1615 sc->osdep.ihs[i]);
1616 }
1617
1618
1619 /* Clean the Mailbox interrupt last */
1620 rid = sc->vector;
1621
1622 if (sc->osdep.ihs[rid] != NULL) {
1623 pci_intr_disestablish(sc->osdep.pc,
1624 sc->osdep.ihs[rid]);
1625 sc->osdep.ihs[rid] = NULL;
1626 }
1627
1628 pci_intr_release(sc->osdep.pc, sc->osdep.intrs,
1629 sc->osdep.nintrs);
1630
1631 if (sc->osdep.mem_size != 0) {
1632 bus_space_unmap(sc->osdep.mem_bus_space_tag,
1633 sc->osdep.mem_bus_space_handle,
1634 sc->osdep.mem_size);
1635 }
1636
1637 return;
1638 } /* ixv_free_pci_resources */
1639
1640 /************************************************************************
1641 * ixv_setup_interface
1642 *
1643 * Setup networking device structure and register an interface.
1644 ************************************************************************/
1645 static int
1646 ixv_setup_interface(device_t dev, struct ixgbe_softc *sc)
1647 {
1648 struct ethercom *ec = &sc->osdep.ec;
1649 struct ifnet *ifp;
1650
1651 INIT_DEBUGOUT("ixv_setup_interface: begin");
1652
1653 ifp = sc->ifp = &ec->ec_if;
1654 strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
1655 ifp->if_baudrate = IF_Gbps(10);
1656 ifp->if_init = ixv_init;
1657 ifp->if_stop = ixv_ifstop;
1658 ifp->if_softc = sc;
1659 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1660 #ifdef IXGBE_MPSAFE
1661 ifp->if_extflags = IFEF_MPSAFE;
1662 #endif
1663 ifp->if_ioctl = ixv_ioctl;
1664 if (sc->feat_en & IXGBE_FEATURE_LEGACY_TX) {
1665 #if 0
1666 ixv_start_locked = ixgbe_legacy_start_locked;
1667 #endif
1668 } else {
1669 ifp->if_transmit = ixgbe_mq_start;
1670 #if 0
1671 ixv_start_locked = ixgbe_mq_start_locked;
1672 #endif
1673 }
1674 ifp->if_start = ixgbe_legacy_start;
1675 IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 2);
1676 IFQ_SET_READY(&ifp->if_snd);
1677
1678 if_initialize(ifp);
1679 sc->ipq = if_percpuq_create(&sc->osdep.ec.ec_if);
1680 /*
1681 * We use per TX queue softint, so if_deferred_start_init() isn't
1682 * used.
1683 */
1684
1685 sc->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
1686
1687 /*
1688 * Tell the upper layer(s) we support long frames.
1689 */
1690 ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1691
1692 /* Set capability flags */
1693 ifp->if_capabilities |= IFCAP_HWCSUM
1694 | IFCAP_TSOv4
1695 | IFCAP_TSOv6;
1696 ifp->if_capenable = 0;
1697
1698 ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER
1699 | ETHERCAP_VLAN_HWTAGGING
1700 | ETHERCAP_VLAN_HWCSUM
1701 | ETHERCAP_JUMBO_MTU
1702 | ETHERCAP_VLAN_MTU;
1703
1704 /* Enable the above capabilities by default */
1705 ec->ec_capenable = ec->ec_capabilities;
1706
1707 ether_ifattach(ifp, sc->hw.mac.addr);
1708 aprint_normal_dev(dev, "Ethernet address %s\n",
1709 ether_sprintf(sc->hw.mac.addr));
1710 ether_set_ifflags_cb(ec, ixv_ifflags_cb);
1711
1712 /* Don't enable LRO by default */
1713 #if 0
1714 /* NetBSD doesn't support LRO yet */
1715 ifp->if_capabilities |= IFCAP_LRO;
1716 #endif
1717
1718 /*
1719 * Specify the media types supported by this adapter and register
1720 * callbacks to update media and link information
1721 */
1722 ec->ec_ifmedia = &sc->media;
1723 ifmedia_init_with_lock(&sc->media, IFM_IMASK, ixv_media_change,
1724 ixv_media_status, &sc->core_mtx);
1725 ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1726 ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1727
1728 if_register(ifp);
1729
1730 return 0;
1731 } /* ixv_setup_interface */
1732
1733
1734 /************************************************************************
1735 * ixv_initialize_transmit_units - Enable transmit unit.
1736 ************************************************************************/
1737 static void
1738 ixv_initialize_transmit_units(struct ixgbe_softc *sc)
1739 {
1740 struct tx_ring *txr = sc->tx_rings;
1741 struct ixgbe_hw *hw = &sc->hw;
1742 int i;
1743
1744 for (i = 0; i < sc->num_queues; i++, txr++) {
1745 u64 tdba = txr->txdma.dma_paddr;
1746 u32 txctrl, txdctl;
1747 int j = txr->me;
1748
1749 /* Set WTHRESH to 8, burst writeback */
1750 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1751 txdctl &= ~IXGBE_TXDCTL_WTHRESH_MASK;
1752 txdctl |= IXGBE_TX_WTHRESH << IXGBE_TXDCTL_WTHRESH_SHIFT;
1753 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1754
1755 /* Set the HW Tx Head and Tail indices */
1756 IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTDH(j), 0);
1757 IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTDT(j), 0);
1758
1759 /* Set Tx Tail register */
1760 txr->tail = IXGBE_VFTDT(j);
1761
1762 txr->txr_no_space = false;
1763
1764 /* Set Ring parameters */
1765 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(j),
1766 (tdba & 0x00000000ffffffffULL));
1767 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(j), (tdba >> 32));
1768 IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(j),
1769 sc->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc));
1770 txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(j));
1771 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
1772 IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(j), txctrl);
1773
1774 /* Now enable */
1775 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1776 txdctl |= IXGBE_TXDCTL_ENABLE;
1777 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1778 }
1779
1780 return;
1781 } /* ixv_initialize_transmit_units */
1782
1783
1784 /************************************************************************
1785 * ixv_initialize_rss_mapping
1786 ************************************************************************/
1787 static void
1788 ixv_initialize_rss_mapping(struct ixgbe_softc *sc)
1789 {
1790 struct ixgbe_hw *hw = &sc->hw;
1791 u32 reta = 0, mrqc, rss_key[10];
1792 int queue_id;
1793 int i, j;
1794 u32 rss_hash_config;
1795
1796 /* force use default RSS key. */
1797 #ifdef __NetBSD__
1798 rss_getkey((uint8_t *) &rss_key);
1799 #else
1800 if (sc->feat_en & IXGBE_FEATURE_RSS) {
1801 /* Fetch the configured RSS key */
1802 rss_getkey((uint8_t *)&rss_key);
1803 } else {
1804 /* set up random bits */
1805 cprng_fast(&rss_key, sizeof(rss_key));
1806 }
1807 #endif
1808
1809 /* Now fill out hash function seeds */
1810 for (i = 0; i < 10; i++)
1811 IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]);
1812
1813 /* Set up the redirection table */
1814 for (i = 0, j = 0; i < 64; i++, j++) {
1815 if (j == sc->num_queues)
1816 j = 0;
1817
1818 if (sc->feat_en & IXGBE_FEATURE_RSS) {
1819 /*
1820 * Fetch the RSS bucket id for the given indirection
1821 * entry. Cap it at the number of configured buckets
1822 * (which is num_queues.)
1823 */
1824 queue_id = rss_get_indirection_to_bucket(i);
1825 queue_id = queue_id % sc->num_queues;
1826 } else
1827 queue_id = j;
1828
1829 /*
1830 * The low 8 bits are for hash value (n+0);
1831 * The next 8 bits are for hash value (n+1), etc.
1832 */
1833 reta >>= 8;
1834 reta |= ((uint32_t)queue_id) << 24;
1835 if ((i & 3) == 3) {
1836 IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), reta);
1837 reta = 0;
1838 }
1839 }
1840
1841 /* Perform hash on these packet types */
1842 if (sc->feat_en & IXGBE_FEATURE_RSS)
1843 rss_hash_config = rss_gethashconfig();
1844 else {
1845 /*
1846 * Disable UDP - IP fragments aren't currently being handled
1847 * and so we end up with a mix of 2-tuple and 4-tuple
1848 * traffic.
1849 */
1850 rss_hash_config = RSS_HASHTYPE_RSS_IPV4
1851 | RSS_HASHTYPE_RSS_TCP_IPV4
1852 | RSS_HASHTYPE_RSS_IPV6
1853 | RSS_HASHTYPE_RSS_TCP_IPV6;
1854 }
1855
1856 mrqc = IXGBE_MRQC_RSSEN;
1857 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
1858 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
1859 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
1860 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
1861 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
1862 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
1863 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
1864 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
1865 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
1866 device_printf(sc->dev, "%s: RSS_HASHTYPE_RSS_IPV6_EX "
1867 "defined, but not supported\n", __func__);
1868 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
1869 device_printf(sc->dev, "%s: RSS_HASHTYPE_RSS_TCP_IPV6_EX "
1870 "defined, but not supported\n", __func__);
1871 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
1872 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
1873 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
1874 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
1875 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
1876 device_printf(sc->dev, "%s: RSS_HASHTYPE_RSS_UDP_IPV6_EX "
1877 "defined, but not supported\n", __func__);
1878 IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, mrqc);
1879 } /* ixv_initialize_rss_mapping */
1880
1881
1882 /************************************************************************
1883 * ixv_initialize_receive_units - Setup receive registers and features.
1884 ************************************************************************/
1885 static void
1886 ixv_initialize_receive_units(struct ixgbe_softc *sc)
1887 {
1888 struct rx_ring *rxr = sc->rx_rings;
1889 struct ixgbe_hw *hw = &sc->hw;
1890 struct ifnet *ifp = sc->ifp;
1891 u32 bufsz, psrtype;
1892
1893 if (ifp->if_mtu > ETHERMTU)
1894 bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1895 else
1896 bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1897
1898 psrtype = IXGBE_PSRTYPE_TCPHDR
1899 | IXGBE_PSRTYPE_UDPHDR
1900 | IXGBE_PSRTYPE_IPV4HDR
1901 | IXGBE_PSRTYPE_IPV6HDR
1902 | IXGBE_PSRTYPE_L2HDR;
1903
1904 if (sc->num_queues > 1)
1905 psrtype |= 1 << 29;
1906
1907 IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
1908
1909 /* Tell PF our max_frame size */
1910 if (ixgbevf_rlpml_set_vf(hw, sc->max_frame_size) != 0) {
1911 device_printf(sc->dev, "There is a problem with the PF "
1912 "setup. It is likely the receive unit for this VF will "
1913 "not function correctly.\n");
1914 }
1915
1916 for (int i = 0; i < sc->num_queues; i++, rxr++) {
1917 u64 rdba = rxr->rxdma.dma_paddr;
1918 u32 reg, rxdctl;
1919 int j = rxr->me;
1920
1921 /* Disable the queue */
1922 rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
1923 rxdctl &= ~IXGBE_RXDCTL_ENABLE;
1924 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1925 for (int k = 0; k < 10; k++) {
1926 if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1927 IXGBE_RXDCTL_ENABLE)
1928 msec_delay(1);
1929 else
1930 break;
1931 }
1932 IXGBE_WRITE_BARRIER(hw);
1933 /* Setup the Base and Length of the Rx Descriptor Ring */
1934 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(j),
1935 (rdba & 0x00000000ffffffffULL));
1936 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(j), (rdba >> 32));
1937 IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(j),
1938 sc->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
1939
1940 /* Reset the ring indices */
1941 IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
1942 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0);
1943
1944 /* Set up the SRRCTL register */
1945 reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(j));
1946 reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
1947 reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
1948 reg |= bufsz;
1949 reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
1950 IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(j), reg);
1951
1952 /* Capture Rx Tail index */
1953 rxr->tail = IXGBE_VFRDT(rxr->me);
1954
1955 /* Do the queue enabling last */
1956 rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
1957 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1958 for (int k = 0; k < 10; k++) {
1959 if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1960 IXGBE_RXDCTL_ENABLE)
1961 break;
1962 msec_delay(1);
1963 }
1964 IXGBE_WRITE_BARRIER(hw);
1965
1966 /* Set the Tail Pointer */
1967 #ifdef DEV_NETMAP
1968 /*
1969 * In netmap mode, we must preserve the buffers made
1970 * available to userspace before the if_init()
1971 * (this is true by default on the TX side, because
1972 * init makes all buffers available to userspace).
1973 *
1974 * netmap_reset() and the device specific routines
1975 * (e.g. ixgbe_setup_receive_rings()) map these
1976 * buffers at the end of the NIC ring, so here we
1977 * must set the RDT (tail) register to make sure
1978 * they are not overwritten.
1979 *
1980 * In this driver the NIC ring starts at RDH = 0,
1981 * RDT points to the last slot available for reception (?),
1982 * so RDT = num_rx_desc - 1 means the whole ring is available.
1983 */
1984 if ((sc->feat_en & IXGBE_FEATURE_NETMAP) &&
1985 (ifp->if_capenable & IFCAP_NETMAP)) {
1986 struct netmap_adapter *na = NA(sc->ifp);
1987 struct netmap_kring *kring = na->rx_rings[i];
1988 int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1989
1990 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t);
1991 } else
1992 #endif /* DEV_NETMAP */
1993 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
1994 sc->num_rx_desc - 1);
1995 }
1996
1997 if (sc->hw.mac.type >= ixgbe_mac_X550_vf)
1998 ixv_initialize_rss_mapping(sc);
1999 } /* ixv_initialize_receive_units */
2000
2001 /************************************************************************
2002 * ixv_sysctl_tdh_handler - Transmit Descriptor Head handler function
2003 *
2004 * Retrieves the TDH value from the hardware
2005 ************************************************************************/
2006 static int
2007 ixv_sysctl_tdh_handler(SYSCTLFN_ARGS)
2008 {
2009 struct sysctlnode node = *rnode;
2010 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2011 uint32_t val;
2012
2013 if (!txr)
2014 return (0);
2015
2016 val = IXGBE_READ_REG(&txr->sc->hw, IXGBE_VFTDH(txr->me));
2017 node.sysctl_data = &val;
2018 return sysctl_lookup(SYSCTLFN_CALL(&node));
2019 } /* ixv_sysctl_tdh_handler */
2020
2021 /************************************************************************
2022 * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
2023 *
2024 * Retrieves the TDT value from the hardware
2025 ************************************************************************/
2026 static int
2027 ixv_sysctl_tdt_handler(SYSCTLFN_ARGS)
2028 {
2029 struct sysctlnode node = *rnode;
2030 struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2031 uint32_t val;
2032
2033 if (!txr)
2034 return (0);
2035
2036 val = IXGBE_READ_REG(&txr->sc->hw, IXGBE_VFTDT(txr->me));
2037 node.sysctl_data = &val;
2038 return sysctl_lookup(SYSCTLFN_CALL(&node));
2039 } /* ixv_sysctl_tdt_handler */
2040
2041 /************************************************************************
2042 * ixv_sysctl_next_to_check_handler - Receive Descriptor next to check
2043 * handler function
2044 *
2045 * Retrieves the next_to_check value
2046 ************************************************************************/
2047 static int
2048 ixv_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
2049 {
2050 struct sysctlnode node = *rnode;
2051 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2052 uint32_t val;
2053
2054 if (!rxr)
2055 return (0);
2056
2057 val = rxr->next_to_check;
2058 node.sysctl_data = &val;
2059 return sysctl_lookup(SYSCTLFN_CALL(&node));
2060 } /* ixv_sysctl_next_to_check_handler */
2061
2062 /************************************************************************
2063 * ixv_sysctl_next_to_refresh_handler - Receive Descriptor next to refresh
2064 * handler function
2065 *
2066 * Retrieves the next_to_refresh value
2067 ************************************************************************/
2068 static int
2069 ixv_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
2070 {
2071 struct sysctlnode node = *rnode;
2072 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2073 struct ixgbe_softc *sc;
2074 uint32_t val;
2075
2076 if (!rxr)
2077 return (0);
2078
2079 sc = rxr->sc;
2080 if (ixgbe_fw_recovery_mode_swflag(sc))
2081 return (EPERM);
2082
2083 val = rxr->next_to_refresh;
2084 node.sysctl_data = &val;
2085 return sysctl_lookup(SYSCTLFN_CALL(&node));
2086 } /* ixv_sysctl_next_to_refresh_handler */
2087
2088 /************************************************************************
2089 * ixv_sysctl_rdh_handler - Receive Descriptor Head handler function
2090 *
2091 * Retrieves the RDH value from the hardware
2092 ************************************************************************/
2093 static int
2094 ixv_sysctl_rdh_handler(SYSCTLFN_ARGS)
2095 {
2096 struct sysctlnode node = *rnode;
2097 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2098 uint32_t val;
2099
2100 if (!rxr)
2101 return (0);
2102
2103 val = IXGBE_READ_REG(&rxr->sc->hw, IXGBE_VFRDH(rxr->me));
2104 node.sysctl_data = &val;
2105 return sysctl_lookup(SYSCTLFN_CALL(&node));
2106 } /* ixv_sysctl_rdh_handler */
2107
2108 /************************************************************************
2109 * ixv_sysctl_rdt_handler - Receive Descriptor Tail handler function
2110 *
2111 * Retrieves the RDT value from the hardware
2112 ************************************************************************/
2113 static int
2114 ixv_sysctl_rdt_handler(SYSCTLFN_ARGS)
2115 {
2116 struct sysctlnode node = *rnode;
2117 struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2118 uint32_t val;
2119
2120 if (!rxr)
2121 return (0);
2122
2123 val = IXGBE_READ_REG(&rxr->sc->hw, IXGBE_VFRDT(rxr->me));
2124 node.sysctl_data = &val;
2125 return sysctl_lookup(SYSCTLFN_CALL(&node));
2126 } /* ixv_sysctl_rdt_handler */
2127
2128 static void
2129 ixv_setup_vlan_tagging(struct ixgbe_softc *sc)
2130 {
2131 struct ethercom *ec = &sc->osdep.ec;
2132 struct ixgbe_hw *hw = &sc->hw;
2133 struct rx_ring *rxr;
2134 u32 ctrl;
2135 int i;
2136 bool hwtagging;
2137
2138 /* Enable HW tagging only if any vlan is attached */
2139 hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
2140 && VLAN_ATTACHED(ec);
2141
2142 /* Enable the queues */
2143 for (i = 0; i < sc->num_queues; i++) {
2144 rxr = &sc->rx_rings[i];
2145 ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(rxr->me));
2146 if (hwtagging)
2147 ctrl |= IXGBE_RXDCTL_VME;
2148 else
2149 ctrl &= ~IXGBE_RXDCTL_VME;
2150 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(rxr->me), ctrl);
2151 /*
2152 * Let Rx path know that it needs to store VLAN tag
2153 * as part of extra mbuf info.
2154 */
2155 rxr->vtag_strip = hwtagging ? TRUE : FALSE;
2156 }
2157 } /* ixv_setup_vlan_tagging */
2158
2159 /************************************************************************
2160 * ixv_setup_vlan_support
2161 ************************************************************************/
2162 static int
2163 ixv_setup_vlan_support(struct ixgbe_softc *sc)
2164 {
2165 struct ethercom *ec = &sc->osdep.ec;
2166 struct ixgbe_hw *hw = &sc->hw;
2167 u32 vid, vfta, retry;
2168 struct vlanid_list *vlanidp;
2169 int rv, error = 0;
2170
2171 /*
2172 * This function is called from both if_init and ifflags_cb()
2173 * on NetBSD.
2174 */
2175
2176 /*
2177 * Part 1:
2178 * Setup VLAN HW tagging
2179 */
2180 ixv_setup_vlan_tagging(sc);
2181
2182 if (!VLAN_ATTACHED(ec))
2183 return 0;
2184
2185 /*
2186 * Part 2:
2187 * Setup VLAN HW filter
2188 */
2189 /* Cleanup shadow_vfta */
2190 for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
2191 sc->shadow_vfta[i] = 0;
2192 /* Generate shadow_vfta from ec_vids */
2193 ETHER_LOCK(ec);
2194 SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
2195 uint32_t idx;
2196
2197 idx = vlanidp->vid / 32;
2198 KASSERT(idx < IXGBE_VFTA_SIZE);
2199 sc->shadow_vfta[idx] |= (u32)1 << (vlanidp->vid % 32);
2200 }
2201 ETHER_UNLOCK(ec);
2202
2203 /*
2204 * A soft reset zero's out the VFTA, so
2205 * we need to repopulate it now.
2206 */
2207 for (int i = 0; i < IXGBE_VFTA_SIZE; i++) {
2208 if (sc->shadow_vfta[i] == 0)
2209 continue;
2210 vfta = sc->shadow_vfta[i];
2211 /*
2212 * Reconstruct the vlan id's
2213 * based on the bits set in each
2214 * of the array ints.
2215 */
2216 for (int j = 0; j < 32; j++) {
2217 retry = 0;
2218 if ((vfta & ((u32)1 << j)) == 0)
2219 continue;
2220 vid = (i * 32) + j;
2221
2222 /* Call the shared code mailbox routine */
2223 while ((rv = hw->mac.ops.set_vfta(hw, vid, 0, TRUE,
2224 FALSE)) != 0) {
2225 if (++retry > 5) {
2226 device_printf(sc->dev,
2227 "%s: max retry exceeded\n",
2228 __func__);
2229 break;
2230 }
2231 }
2232 if (rv != 0) {
2233 device_printf(sc->dev,
2234 "failed to set vlan %d\n", vid);
2235 error = EACCES;
2236 }
2237 }
2238 }
2239 return error;
2240 } /* ixv_setup_vlan_support */
2241
2242 static int
2243 ixv_vlan_cb(struct ethercom *ec, uint16_t vid, bool set)
2244 {
2245 struct ifnet *ifp = &ec->ec_if;
2246 struct ixgbe_softc *sc = ifp->if_softc;
2247 int rv;
2248
2249 if (set)
2250 rv = ixv_register_vlan(sc, vid);
2251 else
2252 rv = ixv_unregister_vlan(sc, vid);
2253
2254 if (rv != 0)
2255 return rv;
2256
2257 /*
2258 * Control VLAN HW tagging when ec_nvlan is changed from 1 to 0
2259 * or 0 to 1.
2260 */
2261 if ((set && (ec->ec_nvlans == 1)) || (!set && (ec->ec_nvlans == 0)))
2262 ixv_setup_vlan_tagging(sc);
2263
2264 return rv;
2265 }
2266
2267 /************************************************************************
2268 * ixv_register_vlan
2269 *
2270 * Run via a vlan config EVENT, it enables us to use the
2271 * HW Filter table since we can get the vlan id. This just
2272 * creates the entry in the soft version of the VFTA, init
2273 * will repopulate the real table.
2274 ************************************************************************/
2275 static int
2276 ixv_register_vlan(struct ixgbe_softc *sc, u16 vtag)
2277 {
2278 struct ixgbe_hw *hw = &sc->hw;
2279 u16 index, bit;
2280 int error;
2281
2282 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2283 return EINVAL;
2284 IXGBE_CORE_LOCK(sc);
2285 index = (vtag >> 5) & 0x7F;
2286 bit = vtag & 0x1F;
2287 sc->shadow_vfta[index] |= ((u32)1 << bit);
2288 error = hw->mac.ops.set_vfta(hw, vtag, 0, true, false);
2289 IXGBE_CORE_UNLOCK(sc);
2290
2291 if (error != 0) {
2292 device_printf(sc->dev, "failed to register vlan %hu\n", vtag);
2293 error = EACCES;
2294 }
2295 return error;
2296 } /* ixv_register_vlan */
2297
2298 /************************************************************************
2299 * ixv_unregister_vlan
2300 *
2301 * Run via a vlan unconfig EVENT, remove our entry
2302 * in the soft vfta.
2303 ************************************************************************/
2304 static int
2305 ixv_unregister_vlan(struct ixgbe_softc *sc, u16 vtag)
2306 {
2307 struct ixgbe_hw *hw = &sc->hw;
2308 u16 index, bit;
2309 int error;
2310
2311 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
2312 return EINVAL;
2313
2314 IXGBE_CORE_LOCK(sc);
2315 index = (vtag >> 5) & 0x7F;
2316 bit = vtag & 0x1F;
2317 sc->shadow_vfta[index] &= ~((u32)1 << bit);
2318 error = hw->mac.ops.set_vfta(hw, vtag, 0, false, false);
2319 IXGBE_CORE_UNLOCK(sc);
2320
2321 if (error != 0) {
2322 device_printf(sc->dev, "failed to unregister vlan %hu\n",
2323 vtag);
2324 error = EIO;
2325 }
2326 return error;
2327 } /* ixv_unregister_vlan */
2328
2329 /************************************************************************
2330 * ixv_enable_intr
2331 ************************************************************************/
2332 static void
2333 ixv_enable_intr(struct ixgbe_softc *sc)
2334 {
2335 struct ixgbe_hw *hw = &sc->hw;
2336 struct ix_queue *que = sc->queues;
2337 u32 mask;
2338 int i;
2339
2340 /* For VTEIAC */
2341 mask = (1 << sc->vector);
2342 for (i = 0; i < sc->num_queues; i++, que++)
2343 mask |= (1 << que->msix);
2344 IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
2345
2346 /* For VTEIMS */
2347 IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << sc->vector));
2348 que = sc->queues;
2349 for (i = 0; i < sc->num_queues; i++, que++)
2350 ixv_enable_queue(sc, que->msix);
2351
2352 IXGBE_WRITE_FLUSH(hw);
2353 } /* ixv_enable_intr */
2354
2355 /************************************************************************
2356 * ixv_disable_intr
2357 ************************************************************************/
2358 static void
2359 ixv_disable_intr(struct ixgbe_softc *sc)
2360 {
2361 struct ix_queue *que = sc->queues;
2362
2363 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIAC, 0);
2364
2365 /* disable interrupts other than queues */
2366 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIMC, sc->vector);
2367
2368 for (int i = 0; i < sc->num_queues; i++, que++)
2369 ixv_disable_queue(sc, que->msix);
2370
2371 IXGBE_WRITE_FLUSH(&sc->hw);
2372 } /* ixv_disable_intr */
2373
2374 /************************************************************************
2375 * ixv_set_ivar
2376 *
2377 * Setup the correct IVAR register for a particular MSI-X interrupt
2378 * - entry is the register array entry
2379 * - vector is the MSI-X vector for this queue
2380 * - type is RX/TX/MISC
2381 ************************************************************************/
2382 static void
2383 ixv_set_ivar(struct ixgbe_softc *sc, u8 entry, u8 vector, s8 type)
2384 {
2385 struct ixgbe_hw *hw = &sc->hw;
2386 u32 ivar, index;
2387
2388 vector |= IXGBE_IVAR_ALLOC_VAL;
2389
2390 if (type == -1) { /* MISC IVAR */
2391 ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
2392 ivar &= ~0xFF;
2393 ivar |= vector;
2394 IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
2395 } else { /* RX/TX IVARS */
2396 index = (16 * (entry & 1)) + (8 * type);
2397 ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
2398 ivar &= ~(0xffUL << index);
2399 ivar |= ((u32)vector << index);
2400 IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
2401 }
2402 } /* ixv_set_ivar */
2403
2404 /************************************************************************
2405 * ixv_configure_ivars
2406 ************************************************************************/
2407 static void
2408 ixv_configure_ivars(struct ixgbe_softc *sc)
2409 {
2410 struct ix_queue *que = sc->queues;
2411
2412 /* XXX We should sync EITR value calculation with ixgbe.c? */
2413
2414 for (int i = 0; i < sc->num_queues; i++, que++) {
2415 /* First the RX queue entry */
2416 ixv_set_ivar(sc, i, que->msix, 0);
2417 /* ... and the TX */
2418 ixv_set_ivar(sc, i, que->msix, 1);
2419 /* Set an initial value in EITR */
2420 ixv_eitr_write(sc, que->msix, IXGBE_EITR_DEFAULT);
2421 }
2422
2423 /* For the mailbox interrupt */
2424 ixv_set_ivar(sc, 1, sc->vector, -1);
2425 } /* ixv_configure_ivars */
2426
2427
2428 /************************************************************************
2429 * ixv_init_stats
2430 *
2431 * The VF stats registers never have a truly virgin
2432 * starting point, so this routine save initial vaules to
2433 * last_<REGNAME>.
2434 ************************************************************************/
2435 static void
2436 ixv_init_stats(struct ixgbe_softc *sc)
2437 {
2438 struct ixgbe_hw *hw = &sc->hw;
2439
2440 sc->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
2441 sc->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
2442 sc->stats.vf.last_vfgorc |=
2443 (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
2444
2445 sc->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
2446 sc->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
2447 sc->stats.vf.last_vfgotc |=
2448 (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
2449
2450 sc->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
2451 } /* ixv_init_stats */
2452
2453 #define UPDATE_STAT_32(reg, last, count) \
2454 { \
2455 u32 current = IXGBE_READ_REG(hw, (reg)); \
2456 IXGBE_EVC_ADD(&count, current - (last)); \
2457 (last) = current; \
2458 }
2459
2460 #define UPDATE_STAT_36(lsb, msb, last, count) \
2461 { \
2462 u64 cur_lsb = IXGBE_READ_REG(hw, (lsb)); \
2463 u64 cur_msb = IXGBE_READ_REG(hw, (msb)); \
2464 u64 current = ((cur_msb << 32) | cur_lsb); \
2465 if (current < (last)) \
2466 IXGBE_EVC_ADD(&count, current + __BIT(36) - (last)); \
2467 else \
2468 IXGBE_EVC_ADD(&count, current - (last)); \
2469 (last) = current; \
2470 }
2471
2472 /************************************************************************
2473 * ixv_update_stats - Update the board statistics counters.
2474 ************************************************************************/
2475 void
2476 ixv_update_stats(struct ixgbe_softc *sc)
2477 {
2478 struct ixgbe_hw *hw = &sc->hw;
2479 struct ixgbevf_hw_stats *stats = &sc->stats.vf;
2480
2481 UPDATE_STAT_32(IXGBE_VFGPRC, stats->last_vfgprc, stats->vfgprc);
2482 UPDATE_STAT_32(IXGBE_VFGPTC, stats->last_vfgptc, stats->vfgptc);
2483 UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB, stats->last_vfgorc,
2484 stats->vfgorc);
2485 UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB, stats->last_vfgotc,
2486 stats->vfgotc);
2487 UPDATE_STAT_32(IXGBE_VFMPRC, stats->last_vfmprc, stats->vfmprc);
2488
2489 /* VF doesn't count errors by hardware */
2490
2491 } /* ixv_update_stats */
2492
2493 /************************************************************************
2494 * ixv_sysctl_interrupt_rate_handler
2495 ************************************************************************/
2496 static int
2497 ixv_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
2498 {
2499 struct sysctlnode node = *rnode;
2500 struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
2501 struct ixgbe_softc *sc = que->sc;
2502 uint32_t reg, usec, rate;
2503 int error;
2504
2505 if (que == NULL)
2506 return 0;
2507 reg = IXGBE_READ_REG(&que->sc->hw, IXGBE_VTEITR(que->msix));
2508 usec = ((reg & 0x0FF8) >> 3);
2509 if (usec > 0)
2510 rate = 500000 / usec;
2511 else
2512 rate = 0;
2513 node.sysctl_data = &rate;
2514 error = sysctl_lookup(SYSCTLFN_CALL(&node));
2515 if (error || newp == NULL)
2516 return error;
2517 reg &= ~0xfff; /* default, no limitation */
2518 if (rate > 0 && rate < 500000) {
2519 if (rate < 1000)
2520 rate = 1000;
2521 reg |= ((4000000 / rate) & 0xff8);
2522 /*
2523 * When RSC is used, ITR interval must be larger than
2524 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
2525 * The minimum value is always greater than 2us on 100M
2526 * (and 10M?(not documented)), but it's not on 1G and higher.
2527 */
2528 if ((sc->link_speed != IXGBE_LINK_SPEED_100_FULL)
2529 && (sc->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
2530 if ((sc->num_queues > 1)
2531 && (reg < IXGBE_MIN_RSC_EITR_10G1G))
2532 return EINVAL;
2533 }
2534 sc->max_interrupt_rate = rate;
2535 } else
2536 sc->max_interrupt_rate = 0;
2537 ixv_eitr_write(sc, que->msix, reg);
2538
2539 return (0);
2540 } /* ixv_sysctl_interrupt_rate_handler */
2541
2542 const struct sysctlnode *
2543 ixv_sysctl_instance(struct ixgbe_softc *sc)
2544 {
2545 const char *dvname;
2546 struct sysctllog **log;
2547 int rc;
2548 const struct sysctlnode *rnode;
2549
2550 log = &sc->sysctllog;
2551 dvname = device_xname(sc->dev);
2552
2553 if ((rc = sysctl_createv(log, 0, NULL, &rnode,
2554 0, CTLTYPE_NODE, dvname,
2555 SYSCTL_DESCR("ixv information and settings"),
2556 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
2557 goto err;
2558
2559 return rnode;
2560 err:
2561 device_printf(sc->dev,
2562 "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
2563 return NULL;
2564 }
2565
2566 static void
2567 ixv_add_device_sysctls(struct ixgbe_softc *sc)
2568 {
2569 struct sysctllog **log;
2570 const struct sysctlnode *rnode, *cnode;
2571 device_t dev;
2572
2573 dev = sc->dev;
2574 log = &sc->sysctllog;
2575
2576 if ((rnode = ixv_sysctl_instance(sc)) == NULL) {
2577 aprint_error_dev(dev, "could not create sysctl root\n");
2578 return;
2579 }
2580
2581 if (sysctl_createv(log, 0, &rnode, &cnode,
2582 CTLFLAG_READWRITE, CTLTYPE_INT, "debug",
2583 SYSCTL_DESCR("Debug Info"),
2584 ixv_sysctl_debug, 0, (void *)sc, 0, CTL_CREATE, CTL_EOL) != 0)
2585 aprint_error_dev(dev, "could not create sysctl\n");
2586
2587 if (sysctl_createv(log, 0, &rnode, &cnode,
2588 CTLFLAG_READWRITE, CTLTYPE_INT,
2589 "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
2590 ixv_sysctl_rx_copy_len, 0,
2591 (void *)sc, 0, CTL_CREATE, CTL_EOL) != 0)
2592 aprint_error_dev(dev, "could not create sysctl\n");
2593
2594 if (sysctl_createv(log, 0, &rnode, &cnode,
2595 CTLFLAG_READONLY, CTLTYPE_INT,
2596 "num_tx_desc", SYSCTL_DESCR("Number of TX descriptors"),
2597 NULL, 0, &sc->num_tx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
2598 aprint_error_dev(dev, "could not create sysctl\n");
2599
2600 if (sysctl_createv(log, 0, &rnode, &cnode,
2601 CTLFLAG_READONLY, CTLTYPE_INT,
2602 "num_rx_desc", SYSCTL_DESCR("Number of RX descriptors"),
2603 NULL, 0, &sc->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
2604 aprint_error_dev(dev, "could not create sysctl\n");
2605
2606 if (sysctl_createv(log, 0, &rnode, &cnode,
2607 CTLFLAG_READWRITE, CTLTYPE_INT, "rx_process_limit",
2608 SYSCTL_DESCR("max number of RX packets to process"),
2609 ixv_sysctl_rx_process_limit, 0, (void *)sc, 0, CTL_CREATE,
2610 CTL_EOL) != 0)
2611 aprint_error_dev(dev, "could not create sysctl\n");
2612
2613 if (sysctl_createv(log, 0, &rnode, &cnode,
2614 CTLFLAG_READWRITE, CTLTYPE_INT, "tx_process_limit",
2615 SYSCTL_DESCR("max number of TX packets to process"),
2616 ixv_sysctl_tx_process_limit, 0, (void *)sc, 0, CTL_CREATE,
2617 CTL_EOL) != 0)
2618 aprint_error_dev(dev, "could not create sysctl\n");
2619
2620 if (sysctl_createv(log, 0, &rnode, &cnode,
2621 CTLFLAG_READWRITE, CTLTYPE_BOOL, "enable_aim",
2622 SYSCTL_DESCR("Interrupt Moderation"),
2623 NULL, 0, &sc->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
2624 aprint_error_dev(dev, "could not create sysctl\n");
2625
2626 if (sysctl_createv(log, 0, &rnode, &cnode,
2627 CTLFLAG_READWRITE, CTLTYPE_BOOL, "txrx_workqueue",
2628 SYSCTL_DESCR("Use workqueue for packet processing"),
2629 NULL, 0, &sc->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL)
2630 != 0)
2631 aprint_error_dev(dev, "could not create sysctl\n");
2632 }
2633
2634 /************************************************************************
2635 * ixv_add_stats_sysctls - Add statistic sysctls for the VF.
2636 ************************************************************************/
2637 static void
2638 ixv_add_stats_sysctls(struct ixgbe_softc *sc)
2639 {
2640 device_t dev = sc->dev;
2641 struct tx_ring *txr = sc->tx_rings;
2642 struct rx_ring *rxr = sc->rx_rings;
2643 struct ixgbevf_hw_stats *stats = &sc->stats.vf;
2644 struct ixgbe_hw *hw = &sc->hw;
2645 const struct sysctlnode *rnode, *cnode;
2646 struct sysctllog **log = &sc->sysctllog;
2647 const char *xname = device_xname(dev);
2648
2649 /* Driver Statistics */
2650 evcnt_attach_dynamic(&sc->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
2651 NULL, xname, "Driver tx dma soft fail EFBIG");
2652 evcnt_attach_dynamic(&sc->mbuf_defrag_failed, EVCNT_TYPE_MISC,
2653 NULL, xname, "m_defrag() failed");
2654 evcnt_attach_dynamic(&sc->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
2655 NULL, xname, "Driver tx dma hard fail EFBIG");
2656 evcnt_attach_dynamic(&sc->einval_tx_dma_setup, EVCNT_TYPE_MISC,
2657 NULL, xname, "Driver tx dma hard fail EINVAL");
2658 evcnt_attach_dynamic(&sc->other_tx_dma_setup, EVCNT_TYPE_MISC,
2659 NULL, xname, "Driver tx dma hard fail other");
2660 evcnt_attach_dynamic(&sc->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
2661 NULL, xname, "Driver tx dma soft fail EAGAIN");
2662 evcnt_attach_dynamic(&sc->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
2663 NULL, xname, "Driver tx dma soft fail ENOMEM");
2664 evcnt_attach_dynamic(&sc->watchdog_events, EVCNT_TYPE_MISC,
2665 NULL, xname, "Watchdog timeouts");
2666 evcnt_attach_dynamic(&sc->tso_err, EVCNT_TYPE_MISC,
2667 NULL, xname, "TSO errors");
2668 evcnt_attach_dynamic(&sc->admin_irqev, EVCNT_TYPE_INTR,
2669 NULL, xname, "Admin MSI-X IRQ Handled");
2670 evcnt_attach_dynamic(&sc->link_workev, EVCNT_TYPE_INTR,
2671 NULL, xname, "Admin event");
2672
2673 for (int i = 0; i < sc->num_queues; i++, rxr++, txr++) {
2674 #ifdef LRO
2675 struct lro_ctrl *lro = &rxr->lro;
2676 #endif
2677
2678 snprintf(sc->queues[i].evnamebuf,
2679 sizeof(sc->queues[i].evnamebuf), "%s q%d", xname, i);
2680 snprintf(sc->queues[i].namebuf,
2681 sizeof(sc->queues[i].namebuf), "q%d", i);
2682
2683 if ((rnode = ixv_sysctl_instance(sc)) == NULL) {
2684 aprint_error_dev(dev,
2685 "could not create sysctl root\n");
2686 break;
2687 }
2688
2689 if (sysctl_createv(log, 0, &rnode, &rnode,
2690 0, CTLTYPE_NODE,
2691 sc->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
2692 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
2693 break;
2694
2695 if (sysctl_createv(log, 0, &rnode, &cnode,
2696 CTLFLAG_READWRITE, CTLTYPE_INT,
2697 "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
2698 ixv_sysctl_interrupt_rate_handler, 0,
2699 (void *)&sc->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
2700 break;
2701
2702 if (sysctl_createv(log, 0, &rnode, &cnode,
2703 CTLFLAG_READONLY, CTLTYPE_INT,
2704 "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
2705 ixv_sysctl_tdh_handler, 0, (void *)txr,
2706 0, CTL_CREATE, CTL_EOL) != 0)
2707 break;
2708
2709 if (sysctl_createv(log, 0, &rnode, &cnode,
2710 CTLFLAG_READONLY, CTLTYPE_INT,
2711 "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
2712 ixv_sysctl_tdt_handler, 0, (void *)txr,
2713 0, CTL_CREATE, CTL_EOL) != 0)
2714 break;
2715
2716 if (sysctl_createv(log, 0, &rnode, &cnode,
2717 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
2718 SYSCTL_DESCR("Receive Descriptor next to check"),
2719 ixv_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
2720 CTL_CREATE, CTL_EOL) != 0)
2721 break;
2722
2723 if (sysctl_createv(log, 0, &rnode, &cnode,
2724 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
2725 SYSCTL_DESCR("Receive Descriptor next to refresh"),
2726 ixv_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
2727 CTL_CREATE, CTL_EOL) != 0)
2728 break;
2729
2730 if (sysctl_createv(log, 0, &rnode, &cnode,
2731 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
2732 SYSCTL_DESCR("Receive Descriptor Head"),
2733 ixv_sysctl_rdh_handler, 0, (void *)rxr, 0,
2734 CTL_CREATE, CTL_EOL) != 0)
2735 break;
2736
2737 if (sysctl_createv(log, 0, &rnode, &cnode,
2738 CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
2739 SYSCTL_DESCR("Receive Descriptor Tail"),
2740 ixv_sysctl_rdt_handler, 0, (void *)rxr, 0,
2741 CTL_CREATE, CTL_EOL) != 0)
2742 break;
2743
2744 evcnt_attach_dynamic(&sc->queues[i].irqs, EVCNT_TYPE_INTR,
2745 NULL, sc->queues[i].evnamebuf, "IRQs on queue");
2746 evcnt_attach_dynamic(&sc->queues[i].handleq,
2747 EVCNT_TYPE_MISC, NULL, sc->queues[i].evnamebuf,
2748 "Handled queue in softint");
2749 evcnt_attach_dynamic(&sc->queues[i].req, EVCNT_TYPE_MISC,
2750 NULL, sc->queues[i].evnamebuf, "Requeued in softint");
2751 evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
2752 NULL, sc->queues[i].evnamebuf,
2753 "Queue Packets Transmitted");
2754 #ifndef IXGBE_LEGACY_TX
2755 evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
2756 NULL, sc->queues[i].evnamebuf,
2757 "Packets dropped in pcq");
2758 #endif
2759 evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
2760 NULL, sc->queues[i].evnamebuf,
2761 "TX Queue No Descriptor Available");
2762 evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
2763 NULL, sc->queues[i].evnamebuf, "TSO");
2764
2765 evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
2766 NULL, sc->queues[i].evnamebuf,
2767 "Queue Bytes Received");
2768 evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
2769 NULL, sc->queues[i].evnamebuf,
2770 "Queue Packets Received");
2771 evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
2772 NULL, sc->queues[i].evnamebuf, "Rx no mbuf");
2773 evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
2774 NULL, sc->queues[i].evnamebuf, "Rx discarded");
2775 evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
2776 NULL, sc->queues[i].evnamebuf, "Copied RX Frames");
2777 #ifdef LRO
2778 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
2779 CTLFLAG_RD, &lro->lro_queued, 0,
2780 "LRO Queued");
2781 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
2782 CTLFLAG_RD, &lro->lro_flushed, 0,
2783 "LRO Flushed");
2784 #endif /* LRO */
2785 }
2786
2787 /* MAC stats get their own sub node */
2788
2789 snprintf(stats->namebuf,
2790 sizeof(stats->namebuf), "%s MAC Statistics", xname);
2791
2792 evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
2793 stats->namebuf, "rx csum offload - IP");
2794 evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
2795 stats->namebuf, "rx csum offload - L4");
2796 evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
2797 stats->namebuf, "rx csum offload - IP bad");
2798 evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
2799 stats->namebuf, "rx csum offload - L4 bad");
2800
2801 /* Packet Reception Stats */
2802 evcnt_attach_dynamic(&stats->vfgprc, EVCNT_TYPE_MISC, NULL,
2803 xname, "Good Packets Received");
2804 evcnt_attach_dynamic(&stats->vfgorc, EVCNT_TYPE_MISC, NULL,
2805 xname, "Good Octets Received");
2806 evcnt_attach_dynamic(&stats->vfmprc, EVCNT_TYPE_MISC, NULL,
2807 xname, "Multicast Packets Received");
2808 evcnt_attach_dynamic(&stats->vfgptc, EVCNT_TYPE_MISC, NULL,
2809 xname, "Good Packets Transmitted");
2810 evcnt_attach_dynamic(&stats->vfgotc, EVCNT_TYPE_MISC, NULL,
2811 xname, "Good Octets Transmitted");
2812
2813 /* Mailbox Stats */
2814 evcnt_attach_dynamic(&hw->mbx.stats.msgs_tx, EVCNT_TYPE_MISC, NULL,
2815 xname, "message TXs");
2816 evcnt_attach_dynamic(&hw->mbx.stats.msgs_rx, EVCNT_TYPE_MISC, NULL,
2817 xname, "message RXs");
2818 evcnt_attach_dynamic(&hw->mbx.stats.acks, EVCNT_TYPE_MISC, NULL,
2819 xname, "ACKs");
2820 evcnt_attach_dynamic(&hw->mbx.stats.reqs, EVCNT_TYPE_MISC, NULL,
2821 xname, "REQs");
2822 evcnt_attach_dynamic(&hw->mbx.stats.rsts, EVCNT_TYPE_MISC, NULL,
2823 xname, "RSTs");
2824
2825 } /* ixv_add_stats_sysctls */
2826
2827 static void
2828 ixv_clear_evcnt(struct ixgbe_softc *sc)
2829 {
2830 struct tx_ring *txr = sc->tx_rings;
2831 struct rx_ring *rxr = sc->rx_rings;
2832 struct ixgbevf_hw_stats *stats = &sc->stats.vf;
2833 struct ixgbe_hw *hw = &sc->hw;
2834 int i;
2835
2836 /* Driver Statistics */
2837 IXGBE_EVC_STORE(&sc->efbig_tx_dma_setup, 0);
2838 IXGBE_EVC_STORE(&sc->mbuf_defrag_failed, 0);
2839 IXGBE_EVC_STORE(&sc->efbig2_tx_dma_setup, 0);
2840 IXGBE_EVC_STORE(&sc->einval_tx_dma_setup, 0);
2841 IXGBE_EVC_STORE(&sc->other_tx_dma_setup, 0);
2842 IXGBE_EVC_STORE(&sc->eagain_tx_dma_setup, 0);
2843 IXGBE_EVC_STORE(&sc->enomem_tx_dma_setup, 0);
2844 IXGBE_EVC_STORE(&sc->watchdog_events, 0);
2845 IXGBE_EVC_STORE(&sc->tso_err, 0);
2846 IXGBE_EVC_STORE(&sc->admin_irqev, 0);
2847 IXGBE_EVC_STORE(&sc->link_workev, 0);
2848
2849 for (i = 0; i < sc->num_queues; i++, rxr++, txr++) {
2850 IXGBE_EVC_STORE(&sc->queues[i].irqs, 0);
2851 IXGBE_EVC_STORE(&sc->queues[i].handleq, 0);
2852 IXGBE_EVC_STORE(&sc->queues[i].req, 0);
2853 IXGBE_EVC_STORE(&txr->total_packets, 0);
2854 #ifndef IXGBE_LEGACY_TX
2855 IXGBE_EVC_STORE(&txr->pcq_drops, 0);
2856 #endif
2857 IXGBE_EVC_STORE(&txr->no_desc_avail, 0);
2858 IXGBE_EVC_STORE(&txr->tso_tx, 0);
2859 txr->q_efbig_tx_dma_setup = 0;
2860 txr->q_mbuf_defrag_failed = 0;
2861 txr->q_efbig2_tx_dma_setup = 0;
2862 txr->q_einval_tx_dma_setup = 0;
2863 txr->q_other_tx_dma_setup = 0;
2864 txr->q_eagain_tx_dma_setup = 0;
2865 txr->q_enomem_tx_dma_setup = 0;
2866 txr->q_tso_err = 0;
2867
2868 IXGBE_EVC_STORE(&rxr->rx_packets, 0);
2869 IXGBE_EVC_STORE(&rxr->rx_bytes, 0);
2870 IXGBE_EVC_STORE(&rxr->rx_copies, 0);
2871 IXGBE_EVC_STORE(&rxr->no_mbuf, 0);
2872 IXGBE_EVC_STORE(&rxr->rx_discarded, 0);
2873 }
2874
2875 /* MAC stats get their own sub node */
2876
2877 IXGBE_EVC_STORE(&stats->ipcs, 0);
2878 IXGBE_EVC_STORE(&stats->l4cs, 0);
2879 IXGBE_EVC_STORE(&stats->ipcs_bad, 0);
2880 IXGBE_EVC_STORE(&stats->l4cs_bad, 0);
2881
2882 /*
2883 * Packet Reception Stats.
2884 * Call ixv_init_stats() to save last VF counters' values.
2885 */
2886 ixv_init_stats(sc);
2887 IXGBE_EVC_STORE(&stats->vfgprc, 0);
2888 IXGBE_EVC_STORE(&stats->vfgorc, 0);
2889 IXGBE_EVC_STORE(&stats->vfmprc, 0);
2890 IXGBE_EVC_STORE(&stats->vfgptc, 0);
2891 IXGBE_EVC_STORE(&stats->vfgotc, 0);
2892
2893 /* Mailbox Stats */
2894 IXGBE_EVC_STORE(&hw->mbx.stats.msgs_tx, 0);
2895 IXGBE_EVC_STORE(&hw->mbx.stats.msgs_rx, 0);
2896 IXGBE_EVC_STORE(&hw->mbx.stats.acks, 0);
2897 IXGBE_EVC_STORE(&hw->mbx.stats.reqs, 0);
2898 IXGBE_EVC_STORE(&hw->mbx.stats.rsts, 0);
2899
2900 } /* ixv_clear_evcnt */
2901
2902 #define PRINTQS(sc, regname) \
2903 do { \
2904 struct ixgbe_hw *_hw = &(sc)->hw; \
2905 int _i; \
2906 \
2907 printf("%s: %s", device_xname((sc)->dev), #regname); \
2908 for (_i = 0; _i < (sc)->num_queues; _i++) { \
2909 printf((_i == 0) ? "\t" : " "); \
2910 printf("%08x", IXGBE_READ_REG(_hw, \
2911 IXGBE_##regname(_i))); \
2912 } \
2913 printf("\n"); \
2914 } while (0)
2915
2916 /************************************************************************
2917 * ixv_print_debug_info
2918 *
2919 * Provides a way to take a look at important statistics
2920 * maintained by the driver and hardware.
2921 ************************************************************************/
2922 static void
2923 ixv_print_debug_info(struct ixgbe_softc *sc)
2924 {
2925 device_t dev = sc->dev;
2926 struct ixgbe_hw *hw = &sc->hw;
2927 int i;
2928
2929 device_printf(dev, "queue:");
2930 for (i = 0; i < sc->num_queues; i++) {
2931 printf((i == 0) ? "\t" : " ");
2932 printf("%8d", i);
2933 }
2934 printf("\n");
2935 PRINTQS(sc, VFRDBAL);
2936 PRINTQS(sc, VFRDBAH);
2937 PRINTQS(sc, VFRDLEN);
2938 PRINTQS(sc, VFSRRCTL);
2939 PRINTQS(sc, VFRDH);
2940 PRINTQS(sc, VFRDT);
2941 PRINTQS(sc, VFRXDCTL);
2942
2943 device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIMS));
2944 device_printf(dev, "EIAM:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIAM));
2945 device_printf(dev, "EIAC:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_VTEIAC));
2946 } /* ixv_print_debug_info */
2947
2948 /************************************************************************
2949 * ixv_sysctl_debug
2950 ************************************************************************/
2951 static int
2952 ixv_sysctl_debug(SYSCTLFN_ARGS)
2953 {
2954 struct sysctlnode node = *rnode;
2955 struct ixgbe_softc *sc = (struct ixgbe_softc *)node.sysctl_data;
2956 int error, result = 0;
2957
2958 node.sysctl_data = &result;
2959 error = sysctl_lookup(SYSCTLFN_CALL(&node));
2960
2961 if (error || newp == NULL)
2962 return error;
2963
2964 if (result == 1)
2965 ixv_print_debug_info(sc);
2966
2967 return 0;
2968 } /* ixv_sysctl_debug */
2969
2970 /************************************************************************
2971 * ixv_sysctl_rx_copy_len
2972 ************************************************************************/
2973 static int
2974 ixv_sysctl_rx_copy_len(SYSCTLFN_ARGS)
2975 {
2976 struct sysctlnode node = *rnode;
2977 struct ixgbe_softc *sc = (struct ixgbe_softc *)node.sysctl_data;
2978 int error;
2979 int result = sc->rx_copy_len;
2980
2981 node.sysctl_data = &result;
2982 error = sysctl_lookup(SYSCTLFN_CALL(&node));
2983
2984 if (error || newp == NULL)
2985 return error;
2986
2987 if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
2988 return EINVAL;
2989
2990 sc->rx_copy_len = result;
2991
2992 return 0;
2993 } /* ixv_sysctl_rx_copy_len */
2994
2995 /************************************************************************
2996 * ixv_sysctl_tx_process_limit
2997 ************************************************************************/
2998 static int
2999 ixv_sysctl_tx_process_limit(SYSCTLFN_ARGS)
3000 {
3001 struct sysctlnode node = *rnode;
3002 struct ixgbe_softc *sc = (struct ixgbe_softc *)node.sysctl_data;
3003 int error;
3004 int result = sc->tx_process_limit;
3005
3006 node.sysctl_data = &result;
3007 error = sysctl_lookup(SYSCTLFN_CALL(&node));
3008
3009 if (error || newp == NULL)
3010 return error;
3011
3012 if ((result <= 0) || (result > sc->num_tx_desc))
3013 return EINVAL;
3014
3015 sc->tx_process_limit = result;
3016
3017 return 0;
3018 } /* ixv_sysctl_tx_process_limit */
3019
3020 /************************************************************************
3021 * ixv_sysctl_rx_process_limit
3022 ************************************************************************/
3023 static int
3024 ixv_sysctl_rx_process_limit(SYSCTLFN_ARGS)
3025 {
3026 struct sysctlnode node = *rnode;
3027 struct ixgbe_softc *sc = (struct ixgbe_softc *)node.sysctl_data;
3028 int error;
3029 int result = sc->rx_process_limit;
3030
3031 node.sysctl_data = &result;
3032 error = sysctl_lookup(SYSCTLFN_CALL(&node));
3033
3034 if (error || newp == NULL)
3035 return error;
3036
3037 if ((result <= 0) || (result > sc->num_rx_desc))
3038 return EINVAL;
3039
3040 sc->rx_process_limit = result;
3041
3042 return 0;
3043 } /* ixv_sysctl_rx_process_limit */
3044
3045 /************************************************************************
3046 * ixv_init_device_features
3047 ************************************************************************/
3048 static void
3049 ixv_init_device_features(struct ixgbe_softc *sc)
3050 {
3051 sc->feat_cap = IXGBE_FEATURE_NETMAP
3052 | IXGBE_FEATURE_VF
3053 | IXGBE_FEATURE_RSS
3054 | IXGBE_FEATURE_LEGACY_TX;
3055
3056 /* A tad short on feature flags for VFs, atm. */
3057 switch (sc->hw.mac.type) {
3058 case ixgbe_mac_82599_vf:
3059 break;
3060 case ixgbe_mac_X540_vf:
3061 break;
3062 case ixgbe_mac_X550_vf:
3063 case ixgbe_mac_X550EM_x_vf:
3064 case ixgbe_mac_X550EM_a_vf:
3065 sc->feat_cap |= IXGBE_FEATURE_NEEDS_CTXD;
3066 break;
3067 default:
3068 break;
3069 }
3070
3071 /* Enabled by default... */
3072 /* Is a virtual function (VF) */
3073 if (sc->feat_cap & IXGBE_FEATURE_VF)
3074 sc->feat_en |= IXGBE_FEATURE_VF;
3075 /* Netmap */
3076 if (sc->feat_cap & IXGBE_FEATURE_NETMAP)
3077 sc->feat_en |= IXGBE_FEATURE_NETMAP;
3078 /* Receive-Side Scaling (RSS) */
3079 if (sc->feat_cap & IXGBE_FEATURE_RSS)
3080 sc->feat_en |= IXGBE_FEATURE_RSS;
3081 /* Needs advanced context descriptor regardless of offloads req'd */
3082 if (sc->feat_cap & IXGBE_FEATURE_NEEDS_CTXD)
3083 sc->feat_en |= IXGBE_FEATURE_NEEDS_CTXD;
3084
3085 /* Enabled via sysctl... */
3086 /* Legacy (single queue) transmit */
3087 if ((sc->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
3088 ixv_enable_legacy_tx)
3089 sc->feat_en |= IXGBE_FEATURE_LEGACY_TX;
3090 } /* ixv_init_device_features */
3091
3092 /************************************************************************
3093 * ixv_shutdown - Shutdown entry point
3094 ************************************************************************/
3095 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
3096 static int
3097 ixv_shutdown(device_t dev)
3098 {
3099 struct ixgbe_softc *sc = device_private(dev);
3100 IXGBE_CORE_LOCK(sc);
3101 ixv_stop_locked(sc);
3102 IXGBE_CORE_UNLOCK(sc);
3103
3104 return (0);
3105 } /* ixv_shutdown */
3106 #endif
3107
3108 static int
3109 ixv_ifflags_cb(struct ethercom *ec)
3110 {
3111 struct ifnet *ifp = &ec->ec_if;
3112 struct ixgbe_softc *sc = ifp->if_softc;
3113 u_short saved_flags;
3114 u_short change;
3115 int rv = 0;
3116
3117 IXGBE_CORE_LOCK(sc);
3118
3119 saved_flags = sc->if_flags;
3120 change = ifp->if_flags ^ sc->if_flags;
3121 if (change != 0)
3122 sc->if_flags = ifp->if_flags;
3123
3124 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
3125 rv = ENETRESET;
3126 goto out;
3127 } else if ((change & IFF_PROMISC) != 0) {
3128 rv = ixv_set_rxfilter(sc);
3129 if (rv != 0) {
3130 /* Restore previous */
3131 sc->if_flags = saved_flags;
3132 goto out;
3133 }
3134 }
3135
3136 /* Check for ec_capenable. */
3137 change = ec->ec_capenable ^ sc->ec_capenable;
3138 sc->ec_capenable = ec->ec_capenable;
3139 if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
3140 | ETHERCAP_VLAN_HWFILTER)) != 0) {
3141 rv = ENETRESET;
3142 goto out;
3143 }
3144
3145 /*
3146 * Special handling is not required for ETHERCAP_VLAN_MTU.
3147 * PF's MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
3148 */
3149
3150 /* Set up VLAN support and filter */
3151 if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
3152 rv = ixv_setup_vlan_support(sc);
3153
3154 out:
3155 IXGBE_CORE_UNLOCK(sc);
3156
3157 return rv;
3158 }
3159
3160
3161 /************************************************************************
3162 * ixv_ioctl - Ioctl entry point
3163 *
3164 * Called when the user wants to configure the interface.
3165 *
3166 * return 0 on success, positive on failure
3167 ************************************************************************/
3168 static int
3169 ixv_ioctl(struct ifnet *ifp, u_long command, void *data)
3170 {
3171 struct ixgbe_softc *sc = ifp->if_softc;
3172 struct ixgbe_hw *hw = &sc->hw;
3173 struct ifcapreq *ifcr = data;
3174 int error;
3175 int l4csum_en;
3176 const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
3177 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
3178
3179 switch (command) {
3180 case SIOCSIFFLAGS:
3181 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
3182 break;
3183 case SIOCADDMULTI: {
3184 struct ether_multi *enm;
3185 struct ether_multistep step;
3186 struct ethercom *ec = &sc->osdep.ec;
3187 bool overflow = false;
3188 int mcnt = 0;
3189
3190 /*
3191 * Check the number of multicast address. If it exceeds,
3192 * return ENOSPC.
3193 * Update this code when we support API 1.3.
3194 */
3195 ETHER_LOCK(ec);
3196 ETHER_FIRST_MULTI(step, ec, enm);
3197 while (enm != NULL) {
3198 mcnt++;
3199
3200 /*
3201 * This code is before adding, so one room is required
3202 * at least.
3203 */
3204 if (mcnt > (IXGBE_MAX_VF_MC - 1)) {
3205 overflow = true;
3206 break;
3207 }
3208 ETHER_NEXT_MULTI(step, enm);
3209 }
3210 ETHER_UNLOCK(ec);
3211 error = 0;
3212 if (overflow && ((ec->ec_flags & ETHER_F_ALLMULTI) == 0)) {
3213 error = hw->mac.ops.update_xcast_mode(hw,
3214 IXGBEVF_XCAST_MODE_ALLMULTI);
3215 if (error == IXGBE_ERR_NOT_TRUSTED) {
3216 device_printf(sc->dev,
3217 "this interface is not trusted\n");
3218 error = EPERM;
3219 } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
3220 device_printf(sc->dev,
3221 "the PF doesn't support allmulti mode\n");
3222 error = EOPNOTSUPP;
3223 } else if (error) {
3224 device_printf(sc->dev,
3225 "number of Ethernet multicast addresses "
3226 "exceeds the limit (%d). error = %d\n",
3227 IXGBE_MAX_VF_MC, error);
3228 error = ENOSPC;
3229 } else
3230 ec->ec_flags |= ETHER_F_ALLMULTI;
3231 }
3232 if (error)
3233 return error;
3234 }
3235 /*FALLTHROUGH*/
3236 case SIOCDELMULTI:
3237 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
3238 break;
3239 case SIOCSIFMEDIA:
3240 case SIOCGIFMEDIA:
3241 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
3242 break;
3243 case SIOCSIFCAP:
3244 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
3245 break;
3246 case SIOCSIFMTU:
3247 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
3248 break;
3249 case SIOCZIFDATA:
3250 IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
3251 ixv_update_stats(sc);
3252 ixv_clear_evcnt(sc);
3253 break;
3254 default:
3255 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
3256 break;
3257 }
3258
3259 switch (command) {
3260 case SIOCSIFCAP:
3261 /* Layer-4 Rx checksum offload has to be turned on and
3262 * off as a unit.
3263 */
3264 l4csum_en = ifcr->ifcr_capenable & l4csum;
3265 if (l4csum_en != l4csum && l4csum_en != 0)
3266 return EINVAL;
3267 /*FALLTHROUGH*/
3268 case SIOCADDMULTI:
3269 case SIOCDELMULTI:
3270 case SIOCSIFFLAGS:
3271 case SIOCSIFMTU:
3272 default:
3273 if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
3274 return error;
3275 if ((ifp->if_flags & IFF_RUNNING) == 0)
3276 ;
3277 else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
3278 IXGBE_CORE_LOCK(sc);
3279 ixv_init_locked(sc);
3280 IXGBE_CORE_UNLOCK(sc);
3281 } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
3282 /*
3283 * Multicast list has changed; set the hardware filter
3284 * accordingly.
3285 */
3286 IXGBE_CORE_LOCK(sc);
3287 ixv_disable_intr(sc);
3288 ixv_set_rxfilter(sc);
3289 ixv_enable_intr(sc);
3290 IXGBE_CORE_UNLOCK(sc);
3291 }
3292 return 0;
3293 }
3294 } /* ixv_ioctl */
3295
3296 /************************************************************************
3297 * ixv_init
3298 ************************************************************************/
3299 static int
3300 ixv_init(struct ifnet *ifp)
3301 {
3302 struct ixgbe_softc *sc = ifp->if_softc;
3303
3304 IXGBE_CORE_LOCK(sc);
3305 ixv_init_locked(sc);
3306 IXGBE_CORE_UNLOCK(sc);
3307
3308 return 0;
3309 } /* ixv_init */
3310
3311 /************************************************************************
3312 * ixv_handle_que
3313 ************************************************************************/
3314 static void
3315 ixv_handle_que(void *context)
3316 {
3317 struct ix_queue *que = context;
3318 struct ixgbe_softc *sc = que->sc;
3319 struct tx_ring *txr = que->txr;
3320 struct ifnet *ifp = sc->ifp;
3321 bool more;
3322
3323 IXGBE_EVC_ADD(&que->handleq, 1);
3324
3325 if (ifp->if_flags & IFF_RUNNING) {
3326 IXGBE_TX_LOCK(txr);
3327 more = ixgbe_txeof(txr);
3328 if (!(sc->feat_en & IXGBE_FEATURE_LEGACY_TX))
3329 if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
3330 ixgbe_mq_start_locked(ifp, txr);
3331 /* Only for queue 0 */
3332 /* NetBSD still needs this for CBQ */
3333 if ((&sc->queues[0] == que)
3334 && (!ixgbe_legacy_ring_empty(ifp, NULL)))
3335 ixgbe_legacy_start_locked(ifp, txr);
3336 IXGBE_TX_UNLOCK(txr);
3337 more |= ixgbe_rxeof(que);
3338 if (more) {
3339 IXGBE_EVC_ADD(&que->req, 1);
3340 if (sc->txrx_use_workqueue) {
3341 /*
3342 * "enqueued flag" is not required here
3343 * the same as ixg(4). See ixgbe_msix_que().
3344 */
3345 workqueue_enqueue(sc->que_wq,
3346 &que->wq_cookie, curcpu());
3347 } else
3348 softint_schedule(que->que_si);
3349 return;
3350 }
3351 }
3352
3353 /* Re-enable this interrupt */
3354 ixv_enable_queue(sc, que->msix);
3355
3356 return;
3357 } /* ixv_handle_que */
3358
3359 /************************************************************************
3360 * ixv_handle_que_work
3361 ************************************************************************/
3362 static void
3363 ixv_handle_que_work(struct work *wk, void *context)
3364 {
3365 struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
3366
3367 /*
3368 * "enqueued flag" is not required here the same as ixg(4).
3369 * See ixgbe_msix_que().
3370 */
3371 ixv_handle_que(que);
3372 }
3373
3374 /************************************************************************
3375 * ixv_allocate_msix - Setup MSI-X Interrupt resources and handlers
3376 ************************************************************************/
3377 static int
3378 ixv_allocate_msix(struct ixgbe_softc *sc, const struct pci_attach_args *pa)
3379 {
3380 device_t dev = sc->dev;
3381 struct ix_queue *que = sc->queues;
3382 struct tx_ring *txr = sc->tx_rings;
3383 int error, msix_ctrl, rid, vector = 0;
3384 pci_chipset_tag_t pc;
3385 pcitag_t tag;
3386 char intrbuf[PCI_INTRSTR_LEN];
3387 char wqname[MAXCOMLEN];
3388 char intr_xname[32];
3389 const char *intrstr = NULL;
3390 kcpuset_t *affinity;
3391 int cpu_id = 0;
3392
3393 pc = sc->osdep.pc;
3394 tag = sc->osdep.tag;
3395
3396 sc->osdep.nintrs = sc->num_queues + 1;
3397 if (pci_msix_alloc_exact(pa, &sc->osdep.intrs,
3398 sc->osdep.nintrs) != 0) {
3399 aprint_error_dev(dev,
3400 "failed to allocate MSI-X interrupt\n");
3401 return (ENXIO);
3402 }
3403
3404 kcpuset_create(&affinity, false);
3405 for (int i = 0; i < sc->num_queues; i++, vector++, que++, txr++) {
3406 snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
3407 device_xname(dev), i);
3408 intrstr = pci_intr_string(pc, sc->osdep.intrs[i], intrbuf,
3409 sizeof(intrbuf));
3410 #ifdef IXGBE_MPSAFE
3411 pci_intr_setattr(pc, &sc->osdep.intrs[i], PCI_INTR_MPSAFE,
3412 true);
3413 #endif
3414 /* Set the handler function */
3415 que->res = sc->osdep.ihs[i] = pci_intr_establish_xname(pc,
3416 sc->osdep.intrs[i], IPL_NET, ixv_msix_que, que,
3417 intr_xname);
3418 if (que->res == NULL) {
3419 pci_intr_release(pc, sc->osdep.intrs,
3420 sc->osdep.nintrs);
3421 aprint_error_dev(dev,
3422 "Failed to register QUE handler\n");
3423 kcpuset_destroy(affinity);
3424 return (ENXIO);
3425 }
3426 que->msix = vector;
3427 sc->active_queues |= (u64)(1 << que->msix);
3428
3429 cpu_id = i;
3430 /* Round-robin affinity */
3431 kcpuset_zero(affinity);
3432 kcpuset_set(affinity, cpu_id % ncpu);
3433 error = interrupt_distribute(sc->osdep.ihs[i], affinity, NULL);
3434 aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
3435 intrstr);
3436 if (error == 0)
3437 aprint_normal(", bound queue %d to cpu %d\n",
3438 i, cpu_id % ncpu);
3439 else
3440 aprint_normal("\n");
3441
3442 #ifndef IXGBE_LEGACY_TX
3443 txr->txr_si
3444 = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
3445 ixgbe_deferred_mq_start, txr);
3446 #endif
3447 que->que_si
3448 = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
3449 ixv_handle_que, que);
3450 if (que->que_si == NULL) {
3451 aprint_error_dev(dev,
3452 "could not establish software interrupt\n");
3453 }
3454 }
3455 snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
3456 error = workqueue_create(&sc->txr_wq, wqname,
3457 ixgbe_deferred_mq_start_work, sc, IXGBE_WORKQUEUE_PRI, IPL_NET,
3458 IXGBE_WORKQUEUE_FLAGS);
3459 if (error) {
3460 aprint_error_dev(dev,
3461 "couldn't create workqueue for deferred Tx\n");
3462 }
3463 sc->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
3464
3465 snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
3466 error = workqueue_create(&sc->que_wq, wqname,
3467 ixv_handle_que_work, sc, IXGBE_WORKQUEUE_PRI, IPL_NET,
3468 IXGBE_WORKQUEUE_FLAGS);
3469 if (error) {
3470 aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
3471 }
3472
3473 /* and Mailbox */
3474 cpu_id++;
3475 snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
3476 sc->vector = vector;
3477 intrstr = pci_intr_string(pc, sc->osdep.intrs[vector], intrbuf,
3478 sizeof(intrbuf));
3479 #ifdef IXGBE_MPSAFE
3480 pci_intr_setattr(pc, &sc->osdep.intrs[vector], PCI_INTR_MPSAFE,
3481 true);
3482 #endif
3483 /* Set the mbx handler function */
3484 sc->osdep.ihs[vector] = pci_intr_establish_xname(pc,
3485 sc->osdep.intrs[vector], IPL_NET, ixv_msix_mbx, sc, intr_xname);
3486 if (sc->osdep.ihs[vector] == NULL) {
3487 aprint_error_dev(dev, "Failed to register LINK handler\n");
3488 kcpuset_destroy(affinity);
3489 return (ENXIO);
3490 }
3491 /* Round-robin affinity */
3492 kcpuset_zero(affinity);
3493 kcpuset_set(affinity, cpu_id % ncpu);
3494 error = interrupt_distribute(sc->osdep.ihs[vector], affinity,
3495 NULL);
3496
3497 aprint_normal_dev(dev,
3498 "for link, interrupting at %s", intrstr);
3499 if (error == 0)
3500 aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
3501 else
3502 aprint_normal("\n");
3503
3504 /* Tasklets for Mailbox */
3505 snprintf(wqname, sizeof(wqname), "%s-admin", device_xname(dev));
3506 error = workqueue_create(&sc->admin_wq, wqname,
3507 ixv_handle_admin, sc, IXGBE_WORKQUEUE_PRI, IPL_NET,
3508 IXGBE_TASKLET_WQ_FLAGS);
3509 if (error) {
3510 aprint_error_dev(dev,
3511 "could not create admin workqueue (%d)\n", error);
3512 goto err_out;
3513 }
3514
3515 /*
3516 * Due to a broken design QEMU will fail to properly
3517 * enable the guest for MSI-X unless the vectors in
3518 * the table are all set up, so we must rewrite the
3519 * ENABLE in the MSI-X control register again at this
3520 * point to cause it to successfully initialize us.
3521 */
3522 if (sc->hw.mac.type == ixgbe_mac_82599_vf) {
3523 pci_get_capability(pc, tag, PCI_CAP_MSIX, &rid, NULL);
3524 rid += PCI_MSIX_CTL;
3525 msix_ctrl = pci_conf_read(pc, tag, rid);
3526 msix_ctrl |= PCI_MSIX_CTL_ENABLE;
3527 pci_conf_write(pc, tag, rid, msix_ctrl);
3528 }
3529
3530 kcpuset_destroy(affinity);
3531 return (0);
3532 err_out:
3533 kcpuset_destroy(affinity);
3534 ixv_free_deferred_handlers(sc);
3535 ixv_free_pci_resources(sc);
3536 return (error);
3537 } /* ixv_allocate_msix */
3538
3539 /************************************************************************
3540 * ixv_configure_interrupts - Setup MSI-X resources
3541 *
3542 * Note: The VF device MUST use MSI-X, there is no fallback.
3543 ************************************************************************/
3544 static int
3545 ixv_configure_interrupts(struct ixgbe_softc *sc)
3546 {
3547 device_t dev = sc->dev;
3548 int want, queues, msgs;
3549
3550 /* Must have at least 2 MSI-X vectors */
3551 msgs = pci_msix_count(sc->osdep.pc, sc->osdep.tag);
3552 if (msgs < 2) {
3553 aprint_error_dev(dev, "MSIX config error\n");
3554 return (ENXIO);
3555 }
3556 msgs = MIN(msgs, IXG_MAX_NINTR);
3557
3558 /* Figure out a reasonable auto config value */
3559 queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
3560
3561 if (ixv_num_queues != 0)
3562 queues = ixv_num_queues;
3563 else if ((ixv_num_queues == 0) && (queues > IXGBE_VF_MAX_TX_QUEUES))
3564 queues = IXGBE_VF_MAX_TX_QUEUES;
3565
3566 /*
3567 * Want vectors for the queues,
3568 * plus an additional for mailbox.
3569 */
3570 want = queues + 1;
3571 if (msgs >= want)
3572 msgs = want;
3573 else {
3574 aprint_error_dev(dev,
3575 "MSI-X Configuration Problem, "
3576 "%d vectors but %d queues wanted!\n", msgs, want);
3577 return -1;
3578 }
3579
3580 aprint_normal_dev(dev,
3581 "Using MSI-X interrupts with %d vectors\n", msgs);
3582 sc->num_queues = queues;
3583
3584 return (0);
3585 } /* ixv_configure_interrupts */
3586
3587
3588 /************************************************************************
3589 * ixv_handle_admin - Tasklet handler for MSI-X MBX interrupts
3590 *
3591 * Done outside of interrupt context since the driver might sleep
3592 ************************************************************************/
3593 static void
3594 ixv_handle_admin(struct work *wk, void *context)
3595 {
3596 struct ixgbe_softc *sc = context;
3597 struct ixgbe_hw *hw = &sc->hw;
3598
3599 IXGBE_CORE_LOCK(sc);
3600
3601 IXGBE_EVC_ADD(&sc->link_workev, 1);
3602 sc->hw.mac.ops.check_link(&sc->hw, &sc->link_speed,
3603 &sc->link_up, FALSE);
3604 ixv_update_link_status(sc);
3605
3606 sc->task_requests = 0;
3607 atomic_store_relaxed(&sc->admin_pending, 0);
3608
3609 /* Re-enable interrupts */
3610 IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << sc->vector));
3611
3612 IXGBE_CORE_UNLOCK(sc);
3613 } /* ixv_handle_admin */
3614
3615 /************************************************************************
3616 * ixv_check_link - Used in the local timer to poll for link changes
3617 ************************************************************************/
3618 static s32
3619 ixv_check_link(struct ixgbe_softc *sc)
3620 {
3621 s32 error;
3622
3623 KASSERT(mutex_owned(&sc->core_mtx));
3624
3625 sc->hw.mac.get_link_status = TRUE;
3626
3627 error = sc->hw.mac.ops.check_link(&sc->hw,
3628 &sc->link_speed, &sc->link_up, FALSE);
3629 ixv_update_link_status(sc);
3630
3631 return error;
3632 } /* ixv_check_link */
3633