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