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