1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright (c) 2021, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the Intel Corporation nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31 /*$FreeBSD$*/
32
33 /**
34 * @file if_iavf_iflib.c
35 * @brief iflib driver implementation
36 *
37 * Contains the main entry point for the iflib driver implementation. It
38 * implements the various ifdi driver methods, and sets up the module and
39 * driver values to load an iflib driver.
40 */
41
42 #include "iavf_iflib.h"
43 #include "iavf_vc_common.h"
44
45 #include "iavf_drv_info.h"
46 #include "iavf_sysctls_iflib.h"
47
48 /*********************************************************************
49 * Function prototypes
50 *********************************************************************/
51 static void *iavf_register(device_t dev);
52 static int iavf_if_attach_pre(if_ctx_t ctx);
53 static int iavf_if_attach_post(if_ctx_t ctx);
54 static int iavf_if_detach(if_ctx_t ctx);
55 static int iavf_if_shutdown(if_ctx_t ctx);
56 static int iavf_if_suspend(if_ctx_t ctx);
57 static int iavf_if_resume(if_ctx_t ctx);
58 static int iavf_if_msix_intr_assign(if_ctx_t ctx, int msix);
59 static void iavf_if_enable_intr(if_ctx_t ctx);
60 static void iavf_if_disable_intr(if_ctx_t ctx);
61 static int iavf_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid);
62 static int iavf_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid);
63 static int iavf_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets);
64 static int iavf_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nqs, int nqsets);
65 static void iavf_if_queues_free(if_ctx_t ctx);
66 static void iavf_if_update_admin_status(if_ctx_t ctx);
67 static void iavf_if_multi_set(if_ctx_t ctx);
68 static int iavf_if_mtu_set(if_ctx_t ctx, uint32_t mtu);
69 static void iavf_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr);
70 static int iavf_if_media_change(if_ctx_t ctx);
71 static int iavf_if_promisc_set(if_ctx_t ctx, int flags);
72 static void iavf_if_timer(if_ctx_t ctx, uint16_t qid);
73 static void iavf_if_vlan_register(if_ctx_t ctx, u16 vtag);
74 static void iavf_if_vlan_unregister(if_ctx_t ctx, u16 vtag);
75 static uint64_t iavf_if_get_counter(if_ctx_t ctx, ift_counter cnt);
76 static void iavf_if_init(if_ctx_t ctx);
77 static void iavf_if_stop(if_ctx_t ctx);
78
79 static int iavf_allocate_pci_resources(struct iavf_sc *);
80 static void iavf_free_pci_resources(struct iavf_sc *);
81 static void iavf_setup_interface(struct iavf_sc *);
82 static void iavf_add_device_sysctls(struct iavf_sc *);
83 static void iavf_enable_queue_irq(struct iavf_hw *, int);
84 static void iavf_disable_queue_irq(struct iavf_hw *, int);
85 static void iavf_stop(struct iavf_sc *);
86
87 static int iavf_del_mac_filter(struct iavf_sc *sc, u8 *macaddr);
88 static int iavf_msix_que(void *);
89 static int iavf_msix_adminq(void *);
90 static void iavf_configure_itr(struct iavf_sc *sc);
91
92 static int iavf_sysctl_queue_interrupt_table(SYSCTL_HANDLER_ARGS);
93 #ifdef IAVF_DEBUG
94 static int iavf_sysctl_vf_reset(SYSCTL_HANDLER_ARGS);
95 static int iavf_sysctl_vflr_reset(SYSCTL_HANDLER_ARGS);
96 #endif
97
98 static enum iavf_status iavf_process_adminq(struct iavf_sc *, u16 *);
99 static void iavf_vc_task(void *arg, int pending __unused);
100 static int iavf_setup_vc_tq(struct iavf_sc *sc);
101 static int iavf_vc_sleep_wait(struct iavf_sc *sc, u32 op);
102
103 /*********************************************************************
104 * FreeBSD Device Interface Entry Points
105 *********************************************************************/
106
107 /**
108 * @var iavf_methods
109 * @brief device methods for the iavf driver
110 *
111 * Device method callbacks used to interact with the driver. For iflib this
112 * primarily resolves to the default iflib implementations.
113 */
114 static device_method_t iavf_methods[] = {
115 /* Device interface */
116 DEVMETHOD(device_register, iavf_register),
117 DEVMETHOD(device_probe, iflib_device_probe),
118 DEVMETHOD(device_attach, iflib_device_attach),
119 DEVMETHOD(device_detach, iflib_device_detach),
120 DEVMETHOD(device_shutdown, iflib_device_shutdown),
121 DEVMETHOD_END
122 };
123
124 static driver_t iavf_driver = {
125 "iavf", iavf_methods, sizeof(struct iavf_sc),
126 };
127
128 DRIVER_MODULE(iavf, pci, iavf_driver, 0, 0);
129 MODULE_VERSION(iavf, 1);
130
131 MODULE_DEPEND(iavf, pci, 1, 1, 1);
132 MODULE_DEPEND(iavf, ether, 1, 1, 1);
133 MODULE_DEPEND(iavf, iflib, 1, 1, 1);
134
135 IFLIB_PNP_INFO(pci, iavf, iavf_vendor_info_array);
136
137 /**
138 * @var M_IAVF
139 * @brief main iavf driver allocation type
140 *
141 * malloc(9) allocation type used by the majority of memory allocations in the
142 * iavf iflib driver.
143 */
144 MALLOC_DEFINE(M_IAVF, "iavf", "iavf driver allocations");
145
146 static device_method_t iavf_if_methods[] = {
147 DEVMETHOD(ifdi_attach_pre, iavf_if_attach_pre),
148 DEVMETHOD(ifdi_attach_post, iavf_if_attach_post),
149 DEVMETHOD(ifdi_detach, iavf_if_detach),
150 DEVMETHOD(ifdi_shutdown, iavf_if_shutdown),
151 DEVMETHOD(ifdi_suspend, iavf_if_suspend),
152 DEVMETHOD(ifdi_resume, iavf_if_resume),
153 DEVMETHOD(ifdi_init, iavf_if_init),
154 DEVMETHOD(ifdi_stop, iavf_if_stop),
155 DEVMETHOD(ifdi_msix_intr_assign, iavf_if_msix_intr_assign),
156 DEVMETHOD(ifdi_intr_enable, iavf_if_enable_intr),
157 DEVMETHOD(ifdi_intr_disable, iavf_if_disable_intr),
158 DEVMETHOD(ifdi_rx_queue_intr_enable, iavf_if_rx_queue_intr_enable),
159 DEVMETHOD(ifdi_tx_queue_intr_enable, iavf_if_tx_queue_intr_enable),
160 DEVMETHOD(ifdi_tx_queues_alloc, iavf_if_tx_queues_alloc),
161 DEVMETHOD(ifdi_rx_queues_alloc, iavf_if_rx_queues_alloc),
162 DEVMETHOD(ifdi_queues_free, iavf_if_queues_free),
163 DEVMETHOD(ifdi_update_admin_status, iavf_if_update_admin_status),
164 DEVMETHOD(ifdi_multi_set, iavf_if_multi_set),
165 DEVMETHOD(ifdi_mtu_set, iavf_if_mtu_set),
166 DEVMETHOD(ifdi_media_status, iavf_if_media_status),
167 DEVMETHOD(ifdi_media_change, iavf_if_media_change),
168 DEVMETHOD(ifdi_promisc_set, iavf_if_promisc_set),
169 DEVMETHOD(ifdi_timer, iavf_if_timer),
170 DEVMETHOD(ifdi_vlan_register, iavf_if_vlan_register),
171 DEVMETHOD(ifdi_vlan_unregister, iavf_if_vlan_unregister),
172 DEVMETHOD(ifdi_get_counter, iavf_if_get_counter),
173 DEVMETHOD_END
174 };
175
176 static driver_t iavf_if_driver = {
177 "iavf_if", iavf_if_methods, sizeof(struct iavf_sc)
178 };
179
180 extern struct if_txrx iavf_txrx_hwb;
181 extern struct if_txrx iavf_txrx_dwb;
182
183 static struct if_shared_ctx iavf_sctx = {
184 .isc_magic = IFLIB_MAGIC,
185 .isc_q_align = PAGE_SIZE,
186 .isc_tx_maxsize = IAVF_MAX_FRAME,
187 .isc_tx_maxsegsize = IAVF_MAX_FRAME,
188 .isc_tso_maxsize = IAVF_TSO_SIZE + sizeof(struct ether_vlan_header),
189 .isc_tso_maxsegsize = IAVF_MAX_DMA_SEG_SIZE,
190 .isc_rx_maxsize = IAVF_MAX_FRAME,
191 .isc_rx_nsegments = IAVF_MAX_RX_SEGS,
192 .isc_rx_maxsegsize = IAVF_MAX_FRAME,
193 .isc_nfl = 1,
194 .isc_ntxqs = 1,
195 .isc_nrxqs = 1,
196
197 .isc_admin_intrcnt = 1,
198 .isc_vendor_info = iavf_vendor_info_array,
199 .isc_driver_version = __DECONST(char *, iavf_driver_version),
200 .isc_driver = &iavf_if_driver,
201 .isc_flags = IFLIB_NEED_SCRATCH | IFLIB_NEED_ZERO_CSUM | IFLIB_TSO_INIT_IP | IFLIB_IS_VF,
202
203 .isc_nrxd_min = {IAVF_MIN_RING},
204 .isc_ntxd_min = {IAVF_MIN_RING},
205 .isc_nrxd_max = {IAVF_MAX_RING},
206 .isc_ntxd_max = {IAVF_MAX_RING},
207 .isc_nrxd_default = {IAVF_DEFAULT_RING},
208 .isc_ntxd_default = {IAVF_DEFAULT_RING},
209 };
210
211 /*** Functions ***/
212
213 /**
214 * iavf_register - iflib callback to obtain the shared context pointer
215 * @dev: the device being registered
216 *
217 * Called when the driver is first being attached to the driver. This function
218 * is used by iflib to obtain a pointer to the shared context structure which
219 * describes the device features.
220 *
221 * @returns a pointer to the iavf shared context structure.
222 */
223 static void *
224 iavf_register(device_t dev __unused)
225 {
226 return (&iavf_sctx);
227 }
228
229 /**
230 * iavf_allocate_pci_resources - Allocate PCI resources
231 * @sc: the device private softc
232 *
233 * Allocate PCI resources used by the iflib driver.
234 *
235 * @returns zero or a non-zero error code on failure
236 */
237 static int
238 iavf_allocate_pci_resources(struct iavf_sc *sc)
239 {
240 return iavf_allocate_pci_resources_common(sc);
241 }
242
243 /**
244 * iavf_if_attach_pre - Begin attaching the device to the driver
245 * @ctx: the iflib context pointer
246 *
247 * Called by iflib to begin the attach process. Allocates resources and
248 * initializes the hardware for operation.
249 *
250 * @returns zero or a non-zero error code on failure.
251 */
252 static int
253 iavf_if_attach_pre(if_ctx_t ctx)
254 {
255 device_t dev;
256 struct iavf_sc *sc;
257 struct iavf_hw *hw;
258 struct iavf_vsi *vsi;
259 if_softc_ctx_t scctx;
260 int error = 0;
261
262 /* Setup pointers */
263 dev = iflib_get_dev(ctx);
264 sc = iavf_sc_from_ctx(ctx);
265
266 vsi = &sc->vsi;
267 vsi->back = sc;
268 sc->dev = sc->osdep.dev = dev;
269 hw = &sc->hw;
270
271 vsi->dev = dev;
272 vsi->hw = &sc->hw;
273 vsi->num_vlans = 0;
274 vsi->ctx = ctx;
275 sc->media = iflib_get_media(ctx);
276 vsi->ifp = iflib_get_ifp(ctx);
277 vsi->shared = scctx = iflib_get_softc_ctx(ctx);
278
279 iavf_save_tunables(sc);
280
281 /* Setup VC mutex */
282 snprintf(sc->vc_mtx_name, sizeof(sc->vc_mtx_name),
283 "%s:vc", device_get_nameunit(dev));
284 mtx_init(&sc->vc_mtx, sc->vc_mtx_name, NULL, MTX_DEF);
285
286 /* Do PCI setup - map BAR0, etc */
287 error = iavf_allocate_pci_resources(sc);
288 if (error) {
289 device_printf(dev, "%s: Allocation of PCI resources failed\n",
290 __func__);
291 goto err_early;
292 }
293
294 iavf_dbg_init(sc, "Allocated PCI resources and MSI-X vectors\n");
295
296 error = iavf_set_mac_type(hw);
297 if (error) {
298 device_printf(dev, "%s: set_mac_type failed: %d\n",
299 __func__, error);
300 goto err_pci_res;
301 }
302
303 error = iavf_reset_complete(hw);
304 if (error) {
305 device_printf(dev, "%s: Device is still being reset\n",
306 __func__);
307 goto err_pci_res;
308 }
309
310 iavf_dbg_init(sc, "VF Device is ready for configuration\n");
311
312 /* Sets up Admin Queue */
313 error = iavf_setup_vc(sc);
314 if (error) {
315 device_printf(dev, "%s: Error setting up PF comms, %d\n",
316 __func__, error);
317 goto err_pci_res;
318 }
319
320 iavf_dbg_init(sc, "PF API version verified\n");
321
322 /* Need API version before sending reset message */
323 error = iavf_reset(sc);
324 if (error) {
325 device_printf(dev, "VF reset failed; reload the driver\n");
326 goto err_aq;
327 }
328
329 iavf_dbg_init(sc, "VF reset complete\n");
330
331 /* Ask for VF config from PF */
332 error = iavf_vf_config(sc);
333 if (error) {
334 device_printf(dev, "Error getting configuration from PF: %d\n",
335 error);
336 goto err_aq;
337 }
338
339 iavf_print_device_info(sc);
340
341 error = iavf_get_vsi_res_from_vf_res(sc);
342 if (error)
343 goto err_res_buf;
344
345 iavf_dbg_init(sc, "Resource Acquisition complete\n");
346
347 /* Setup taskqueue to service VC messages */
348 error = iavf_setup_vc_tq(sc);
349 if (error)
350 goto err_vc_tq;
351
352 iavf_set_mac_addresses(sc);
353 iflib_set_mac(ctx, hw->mac.addr);
354
355 /* Allocate filter lists */
356 iavf_init_filters(sc);
357
358 /* Fill out more iflib parameters */
359 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max =
360 sc->vsi_res->num_queue_pairs;
361 if (vsi->enable_head_writeback) {
362 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0]
363 * sizeof(struct iavf_tx_desc) + sizeof(u32), DBA_ALIGN);
364 scctx->isc_txrx = &iavf_txrx_hwb;
365 } else {
366 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0]
367 * sizeof(struct iavf_tx_desc), DBA_ALIGN);
368 scctx->isc_txrx = &iavf_txrx_dwb;
369 }
370 scctx->isc_rxqsizes[0] = roundup2(scctx->isc_nrxd[0]
371 * sizeof(union iavf_32byte_rx_desc), DBA_ALIGN);
372 scctx->isc_msix_bar = PCIR_BAR(IAVF_MSIX_BAR);
373 scctx->isc_tx_nsegments = IAVF_MAX_TX_SEGS;
374 scctx->isc_tx_tso_segments_max = IAVF_MAX_TSO_SEGS;
375 scctx->isc_tx_tso_size_max = IAVF_TSO_SIZE;
376 scctx->isc_tx_tso_segsize_max = IAVF_MAX_DMA_SEG_SIZE;
377 scctx->isc_rss_table_size = IAVF_RSS_VSI_LUT_SIZE;
378 scctx->isc_capabilities = scctx->isc_capenable = IAVF_CAPS;
379 scctx->isc_tx_csum_flags = CSUM_OFFLOAD;
380
381 /* Update OS cache of MSIX control register values */
382 iavf_update_msix_devinfo(dev);
383
384 return (0);
385
386 err_vc_tq:
387 taskqueue_free(sc->vc_tq);
388 err_res_buf:
389 free(sc->vf_res, M_IAVF);
390 err_aq:
391 iavf_shutdown_adminq(hw);
392 err_pci_res:
393 iavf_free_pci_resources(sc);
394 err_early:
395 IAVF_VC_LOCK_DESTROY(sc);
396 return (error);
397 }
398
399 /**
400 * iavf_vc_task - task used to process VC messages
401 * @arg: device softc
402 * @pending: unused
403 *
404 * Processes the admin queue, in order to process the virtual
405 * channel messages received from the PF.
406 */
407 static void
408 iavf_vc_task(void *arg, int pending __unused)
409 {
410 struct iavf_sc *sc = (struct iavf_sc *)arg;
411 u16 var;
412
413 iavf_process_adminq(sc, &var);
414 }
415
416 /**
417 * iavf_setup_vc_tq - Setup task queues
418 * @sc: device softc
419 *
420 * Create taskqueue and tasklet for processing virtual channel messages. This
421 * is done in a separate non-iflib taskqueue so that the iflib context lock
422 * does not need to be held for VC messages to be processed.
423 *
424 * @returns zero on success, or an error code on failure.
425 */
426 static int
427 iavf_setup_vc_tq(struct iavf_sc *sc)
428 {
429 device_t dev = sc->dev;
430 int error = 0;
431
432 TASK_INIT(&sc->vc_task, 0, iavf_vc_task, sc);
433
434 sc->vc_tq = taskqueue_create_fast("iavf_vc", M_NOWAIT,
435 taskqueue_thread_enqueue, &sc->vc_tq);
436 if (!sc->vc_tq) {
437 device_printf(dev, "taskqueue_create_fast (for VC task) returned NULL!\n");
438 return (ENOMEM);
439 }
440 error = taskqueue_start_threads(&sc->vc_tq, 1, PI_NET, "%s vc",
441 device_get_nameunit(dev));
442 if (error) {
443 device_printf(dev, "taskqueue_start_threads (for VC task) error: %d\n",
444 error);
445 taskqueue_free(sc->vc_tq);
446 return (error);
447 }
448
449 return (error);
450 }
451
452 /**
453 * iavf_if_attach_post - Finish attaching the device to the driver
454 * @ctx: the iflib context pointer
455 *
456 * Called by iflib after it has setup queues and interrupts. Used to finish up
457 * the attach process for a device. Attach logic which must occur after Tx and
458 * Rx queues are setup belongs here.
459 *
460 * @returns zero or a non-zero error code on failure
461 */
462 static int
463 iavf_if_attach_post(if_ctx_t ctx)
464 {
465 #ifdef IXL_DEBUG
466 device_t dev = iflib_get_dev(ctx);
467 #endif
468 struct iavf_sc *sc;
469 struct iavf_hw *hw;
470 struct iavf_vsi *vsi;
471 int error = 0;
472
473 INIT_DBG_DEV(dev, "begin");
474
475 sc = iavf_sc_from_ctx(ctx);
476 vsi = &sc->vsi;
477 hw = &sc->hw;
478
479 /* Save off determined number of queues for interface */
480 vsi->num_rx_queues = vsi->shared->isc_nrxqsets;
481 vsi->num_tx_queues = vsi->shared->isc_ntxqsets;
482
483 /* Setup the stack interface */
484 iavf_setup_interface(sc);
485
486 iavf_dbg_init(sc, "Interface setup complete\n");
487
488 /* Initialize statistics & add sysctls */
489 bzero(&sc->vsi.eth_stats, sizeof(struct iavf_eth_stats));
490 iavf_add_device_sysctls(sc);
491
492 atomic_store_rel_32(&sc->queues_enabled, 0);
493 iavf_set_state(&sc->state, IAVF_STATE_INITIALIZED);
494
495 /* We want AQ enabled early for init */
496 iavf_enable_adminq_irq(hw);
497
498 INIT_DBG_DEV(dev, "end");
499
500 return (error);
501 }
502
503 /**
504 * iavf_if_detach - Detach a device from the driver
505 * @ctx: the iflib context of the device to detach
506 *
507 * Called by iflib to detach a given device from the driver. Clean up any
508 * resources associated with the driver and shut the device down.
509 *
510 * @remark iflib always ignores the return value of IFDI_DETACH, so this
511 * function is effectively not allowed to fail. Instead, it should clean up
512 * and release as much as possible even if something goes wrong.
513 *
514 * @returns zero
515 */
516 static int
517 iavf_if_detach(if_ctx_t ctx)
518 {
519 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
520 struct iavf_hw *hw = &sc->hw;
521 device_t dev = sc->dev;
522 enum iavf_status status;
523
524 INIT_DBG_DEV(dev, "begin");
525
526 iavf_clear_state(&sc->state, IAVF_STATE_INITIALIZED);
527
528 /* Drain admin queue taskqueue */
529 taskqueue_free(sc->vc_tq);
530 IAVF_VC_LOCK_DESTROY(sc);
531
532 /* Remove all the media and link information */
533 ifmedia_removeall(sc->media);
534
535 iavf_disable_adminq_irq(hw);
536 status = iavf_shutdown_adminq(&sc->hw);
537 if (status != IAVF_SUCCESS) {
538 device_printf(dev,
539 "iavf_shutdown_adminq() failed with status %s\n",
540 iavf_stat_str(hw, status));
541 }
542
543 free(sc->vf_res, M_IAVF);
544 sc->vf_res = NULL;
545 iavf_free_pci_resources(sc);
546 iavf_free_filters(sc);
547
548 INIT_DBG_DEV(dev, "end");
549 return (0);
550 }
551
552 /**
553 * iavf_if_shutdown - called by iflib to handle shutdown
554 * @ctx: the iflib context pointer
555 *
556 * Callback for the IFDI_SHUTDOWN iflib function.
557 *
558 * @returns zero or an error code on failure
559 */
560 static int
561 iavf_if_shutdown(if_ctx_t ctx __unused)
562 {
563 return (0);
564 }
565
566 /**
567 * iavf_if_suspend - called by iflib to handle suspend
568 * @ctx: the iflib context pointer
569 *
570 * Callback for the IFDI_SUSPEND iflib function.
571 *
572 * @returns zero or an error code on failure
573 */
574 static int
575 iavf_if_suspend(if_ctx_t ctx __unused)
576 {
577 return (0);
578 }
579
580 /**
581 * iavf_if_resume - called by iflib to handle resume
582 * @ctx: the iflib context pointer
583 *
584 * Callback for the IFDI_RESUME iflib function.
585 *
586 * @returns zero or an error code on failure
587 */
588 static int
589 iavf_if_resume(if_ctx_t ctx __unused)
590 {
591 return (0);
592 }
593
594 /**
595 * iavf_vc_sleep_wait - Sleep for a response from a VC message
596 * @sc: device softc
597 * @op: the op code to sleep on
598 *
599 * Sleep until a response from the PF for the VC message sent by the
600 * given op.
601 *
602 * @returns zero on success, or EWOULDBLOCK if the sleep times out.
603 */
604 static int
605 iavf_vc_sleep_wait(struct iavf_sc *sc, u32 op)
606 {
607 int error = 0;
608
609 IAVF_VC_LOCK_ASSERT(sc);
610
611 iavf_dbg_vc(sc, "Sleeping for op %b\n", op, IAVF_FLAGS);
612
613 error = mtx_sleep(iavf_vc_get_op_chan(sc, op),
614 &sc->vc_mtx, PRI_MAX, "iavf_vc", IAVF_AQ_TIMEOUT);
615
616 return (error);
617 }
618
619 /**
620 * iavf_send_vc_msg_sleep - Send a virtchnl message and wait for a response
621 * @sc: device softc
622 * @op: the op code to send
623 *
624 * Send a virtchnl message to the PF, and sleep or busy wait for a response
625 * from the PF, depending on iflib context lock type.
626 *
627 * @remark this function does not wait if the device is detaching, on kernels
628 * that support indicating to the driver that the device is detaching
629 *
630 * @returns zero or an error code on failure.
631 */
632 int
633 iavf_send_vc_msg_sleep(struct iavf_sc *sc, u32 op)
634 {
635 if_ctx_t ctx = sc->vsi.ctx;
636 int error = 0;
637
638 IAVF_VC_LOCK(sc);
639 error = iavf_vc_send_cmd(sc, op);
640 if (error != 0) {
641 iavf_dbg_vc(sc, "Error sending %b: %d\n", op, IAVF_FLAGS, error);
642 goto release_lock;
643 }
644
645 /* Don't wait for a response if the device is being detached. */
646 if (!iflib_in_detach(ctx)) {
647 error = iavf_vc_sleep_wait(sc, op);
648 IAVF_VC_LOCK_ASSERT(sc);
649
650 if (error == EWOULDBLOCK)
651 device_printf(sc->dev, "%b timed out\n", op, IAVF_FLAGS);
652 }
653 release_lock:
654 IAVF_VC_UNLOCK(sc);
655 return (error);
656 }
657
658 /**
659 * iavf_send_vc_msg - Send a virtchnl message to the PF
660 * @sc: device softc
661 * @op: the op code to send
662 *
663 * Send a virtchnl message to the PF and do not wait for a response.
664 *
665 * @returns zero on success, or an error code on failure.
666 */
667 int
668 iavf_send_vc_msg(struct iavf_sc *sc, u32 op)
669 {
670 int error = 0;
671
672 error = iavf_vc_send_cmd(sc, op);
673 if (error != 0)
674 iavf_dbg_vc(sc, "Error sending %b: %d\n", op, IAVF_FLAGS, error);
675
676 return (error);
677 }
678
679 /**
680 * iavf_init_queues - initialize Tx and Rx queues
681 * @vsi: the VSI to initialize
682 *
683 * Refresh the Tx and Rx ring contents and update the tail pointers for each
684 * queue.
685 */
686 static void
687 iavf_init_queues(struct iavf_vsi *vsi)
688 {
689 struct iavf_tx_queue *tx_que = vsi->tx_queues;
690 struct iavf_rx_queue *rx_que = vsi->rx_queues;
691 struct rx_ring *rxr;
692 uint32_t mbuf_sz;
693
694 mbuf_sz = iflib_get_rx_mbuf_sz(vsi->ctx);
695 MPASS(mbuf_sz <= UINT16_MAX);
696
697 for (int i = 0; i < vsi->num_tx_queues; i++, tx_que++)
698 iavf_init_tx_ring(vsi, tx_que);
699
700 for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++) {
701 rxr = &rx_que->rxr;
702
703 rxr->mbuf_sz = mbuf_sz;
704 wr32(vsi->hw, rxr->tail, 0);
705 }
706 }
707
708 /**
709 * iavf_if_init - Initialize device for operation
710 * @ctx: the iflib context pointer
711 *
712 * Initializes a device for operation. Called by iflib in response to an
713 * interface up event from the stack.
714 *
715 * @remark this function does not return a value and thus cannot indicate
716 * failure to initialize.
717 */
718 static void
719 iavf_if_init(if_ctx_t ctx)
720 {
721 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
722 struct iavf_vsi *vsi = &sc->vsi;
723 struct iavf_hw *hw = &sc->hw;
724 if_t ifp = iflib_get_ifp(ctx);
725 u8 tmpaddr[ETHER_ADDR_LEN];
726 enum iavf_status status;
727 device_t dev = sc->dev;
728 int error = 0;
729
730 INIT_DBG_IF(ifp, "begin");
731
732 IFLIB_CTX_ASSERT(ctx);
733
734 error = iavf_reset_complete(hw);
735 if (error) {
736 device_printf(sc->dev, "%s: VF reset failed\n",
737 __func__);
738 }
739
740 if (!iavf_check_asq_alive(hw)) {
741 iavf_dbg_info(sc, "ASQ is not alive, re-initializing AQ\n");
742 pci_enable_busmaster(dev);
743
744 status = iavf_shutdown_adminq(hw);
745 if (status != IAVF_SUCCESS) {
746 device_printf(dev,
747 "%s: iavf_shutdown_adminq failed: %s\n",
748 __func__, iavf_stat_str(hw, status));
749 return;
750 }
751
752 status = iavf_init_adminq(hw);
753 if (status != IAVF_SUCCESS) {
754 device_printf(dev,
755 "%s: iavf_init_adminq failed: %s\n",
756 __func__, iavf_stat_str(hw, status));
757 return;
758 }
759 }
760
761 /* Make sure queues are disabled */
762 iavf_disable_queues_with_retries(sc);
763
764 bcopy(if_getlladdr(ifp), tmpaddr, ETHER_ADDR_LEN);
765 if (!cmp_etheraddr(hw->mac.addr, tmpaddr) &&
766 (iavf_validate_mac_addr(tmpaddr) == IAVF_SUCCESS)) {
767 error = iavf_del_mac_filter(sc, hw->mac.addr);
768 if (error == 0)
769 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_DEL_MAC_FILTER);
770
771 bcopy(tmpaddr, hw->mac.addr, ETH_ALEN);
772 }
773
774 error = iavf_add_mac_filter(sc, hw->mac.addr, 0);
775 if (!error || error == EEXIST)
776 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_MAC_FILTER);
777 iflib_set_mac(ctx, hw->mac.addr);
778
779 /* Prepare the queues for operation */
780 iavf_init_queues(vsi);
781
782 /* Set initial ITR values */
783 iavf_configure_itr(sc);
784
785 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_CONFIGURE_QUEUES);
786
787 /* Set up RSS */
788 iavf_config_rss(sc);
789
790 /* Map vectors */
791 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_MAP_VECTORS);
792
793 /* Init SW TX ring indices */
794 if (vsi->enable_head_writeback)
795 iavf_init_tx_cidx(vsi);
796 else
797 iavf_init_tx_rsqs(vsi);
798
799 /* Configure promiscuous mode */
800 iavf_config_promisc(sc, if_getflags(ifp));
801
802 /* Enable queues */
803 iavf_send_vc_msg_sleep(sc, IAVF_FLAG_AQ_ENABLE_QUEUES);
804
805 iavf_set_state(&sc->state, IAVF_STATE_RUNNING);
806 }
807
808 /**
809 * iavf_if_msix_intr_assign - Assign MSI-X interrupts
810 * @ctx: the iflib context pointer
811 * @msix: the number of MSI-X vectors available
812 *
813 * Called by iflib to assign MSI-X interrupt vectors to queues. Assigns and
814 * sets up vectors for each Tx and Rx queue, as well as the administrative
815 * control interrupt.
816 *
817 * @returns zero or an error code on failure
818 */
819 static int
820 iavf_if_msix_intr_assign(if_ctx_t ctx, int msix __unused)
821 {
822 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
823 struct iavf_vsi *vsi = &sc->vsi;
824 struct iavf_rx_queue *rx_que = vsi->rx_queues;
825 struct iavf_tx_queue *tx_que = vsi->tx_queues;
826 int err, i, rid, vector = 0;
827 char buf[16];
828
829 MPASS(vsi->shared->isc_nrxqsets > 0);
830 MPASS(vsi->shared->isc_ntxqsets > 0);
831
832 /* Admin Que is vector 0*/
833 rid = vector + 1;
834 err = iflib_irq_alloc_generic(ctx, &vsi->irq, rid, IFLIB_INTR_ADMIN,
835 iavf_msix_adminq, sc, 0, "aq");
836 if (err) {
837 iflib_irq_free(ctx, &vsi->irq);
838 device_printf(iflib_get_dev(ctx),
839 "Failed to register Admin Que handler");
840 return (err);
841 }
842
843 /* Now set up the stations */
844 for (i = 0, vector = 1; i < vsi->shared->isc_nrxqsets; i++, vector++, rx_que++) {
845 rid = vector + 1;
846
847 snprintf(buf, sizeof(buf), "rxq%d", i);
848 err = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
849 IFLIB_INTR_RXTX, iavf_msix_que, rx_que, rx_que->rxr.me, buf);
850 if (err) {
851 device_printf(iflib_get_dev(ctx),
852 "Failed to allocate queue RX int vector %d, err: %d\n", i, err);
853 vsi->num_rx_queues = i + 1;
854 goto fail;
855 }
856 rx_que->msix = vector;
857 }
858
859 bzero(buf, sizeof(buf));
860
861 for (i = 0; i < vsi->shared->isc_ntxqsets; i++, tx_que++) {
862 snprintf(buf, sizeof(buf), "txq%d", i);
863 iflib_softirq_alloc_generic(ctx,
864 &vsi->rx_queues[i % vsi->shared->isc_nrxqsets].que_irq,
865 IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
866
867 tx_que->msix = (i % vsi->shared->isc_nrxqsets) + 1;
868 }
869
870 return (0);
871 fail:
872 iflib_irq_free(ctx, &vsi->irq);
873 rx_que = vsi->rx_queues;
874 for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++)
875 iflib_irq_free(ctx, &rx_que->que_irq);
876 return (err);
877 }
878
879 /**
880 * iavf_if_enable_intr - Enable all interrupts for a device
881 * @ctx: the iflib context pointer
882 *
883 * Called by iflib to request enabling all interrupts.
884 */
885 static void
886 iavf_if_enable_intr(if_ctx_t ctx)
887 {
888 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
889 struct iavf_vsi *vsi = &sc->vsi;
890
891 iavf_enable_intr(vsi);
892 }
893
894 /**
895 * iavf_if_disable_intr - Disable all interrupts for a device
896 * @ctx: the iflib context pointer
897 *
898 * Called by iflib to request disabling all interrupts.
899 */
900 static void
901 iavf_if_disable_intr(if_ctx_t ctx)
902 {
903 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
904 struct iavf_vsi *vsi = &sc->vsi;
905
906 iavf_disable_intr(vsi);
907 }
908
909 /**
910 * iavf_if_rx_queue_intr_enable - Enable one Rx queue interrupt
911 * @ctx: the iflib context pointer
912 * @rxqid: Rx queue index
913 *
914 * Enables the interrupt associated with a specified Rx queue.
915 *
916 * @returns zero
917 */
918 static int
919 iavf_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
920 {
921 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
922 struct iavf_vsi *vsi = &sc->vsi;
923 struct iavf_hw *hw = vsi->hw;
924 struct iavf_rx_queue *rx_que = &vsi->rx_queues[rxqid];
925
926 iavf_enable_queue_irq(hw, rx_que->msix - 1);
927 return (0);
928 }
929
930 /**
931 * iavf_if_tx_queue_intr_enable - Enable one Tx queue interrupt
932 * @ctx: the iflib context pointer
933 * @txqid: Tx queue index
934 *
935 * Enables the interrupt associated with a specified Tx queue.
936 *
937 * @returns zero
938 */
939 static int
940 iavf_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid)
941 {
942 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
943 struct iavf_vsi *vsi = &sc->vsi;
944 struct iavf_hw *hw = vsi->hw;
945 struct iavf_tx_queue *tx_que = &vsi->tx_queues[txqid];
946
947 iavf_enable_queue_irq(hw, tx_que->msix - 1);
948 return (0);
949 }
950
951 /**
952 * iavf_if_tx_queues_alloc - Allocate Tx queue memory
953 * @ctx: the iflib context pointer
954 * @vaddrs: Array of virtual addresses
955 * @paddrs: Array of physical addresses
956 * @ntxqs: the number of Tx queues per group (should always be 1)
957 * @ntxqsets: the number of Tx queues
958 *
959 * Allocates memory for the specified number of Tx queues. This includes
960 * memory for the queue structures and the report status array for the queues.
961 * The virtual and physical addresses are saved for later use during
962 * initialization.
963 *
964 * @returns zero or a non-zero error code on failure
965 */
966 static int
967 iavf_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets)
968 {
969 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
970 struct iavf_vsi *vsi = &sc->vsi;
971 if_softc_ctx_t scctx = vsi->shared;
972 struct iavf_tx_queue *que;
973 int i, j, error = 0;
974
975 MPASS(scctx->isc_ntxqsets > 0);
976 MPASS(ntxqs == 1);
977 MPASS(scctx->isc_ntxqsets == ntxqsets);
978
979 /* Allocate queue structure memory */
980 if (!(vsi->tx_queues =
981 (struct iavf_tx_queue *)malloc(sizeof(struct iavf_tx_queue) *ntxqsets, M_IAVF, M_NOWAIT | M_ZERO))) {
982 device_printf(iflib_get_dev(ctx), "Unable to allocate TX ring memory\n");
983 return (ENOMEM);
984 }
985
986 for (i = 0, que = vsi->tx_queues; i < ntxqsets; i++, que++) {
987 struct tx_ring *txr = &que->txr;
988
989 txr->me = i;
990 que->vsi = vsi;
991
992 if (!vsi->enable_head_writeback) {
993 /* Allocate report status array */
994 if (!(txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_IAVF, M_NOWAIT))) {
995 device_printf(iflib_get_dev(ctx), "failed to allocate tx_rsq memory\n");
996 error = ENOMEM;
997 goto fail;
998 }
999 /* Init report status array */
1000 for (j = 0; j < scctx->isc_ntxd[0]; j++)
1001 txr->tx_rsq[j] = QIDX_INVALID;
1002 }
1003 /* get the virtual and physical address of the hardware queues */
1004 txr->tail = IAVF_QTX_TAIL1(txr->me);
1005 txr->tx_base = (struct iavf_tx_desc *)vaddrs[i * ntxqs];
1006 txr->tx_paddr = paddrs[i * ntxqs];
1007 txr->que = que;
1008 }
1009
1010 return (0);
1011 fail:
1012 iavf_if_queues_free(ctx);
1013 return (error);
1014 }
1015
1016 /**
1017 * iavf_if_rx_queues_alloc - Allocate Rx queue memory
1018 * @ctx: the iflib context pointer
1019 * @vaddrs: Array of virtual addresses
1020 * @paddrs: Array of physical addresses
1021 * @nrxqs: number of Rx queues per group (should always be 1)
1022 * @nrxqsets: the number of Rx queues to allocate
1023 *
1024 * Called by iflib to allocate driver memory for a number of Rx queues.
1025 * Allocates memory for the drivers private Rx queue data structure, and saves
1026 * the physical and virtual addresses for later use.
1027 *
1028 * @returns zero or a non-zero error code on failure
1029 */
1030 static int
1031 iavf_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nrxqs, int nrxqsets)
1032 {
1033 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1034 struct iavf_vsi *vsi = &sc->vsi;
1035 struct iavf_rx_queue *que;
1036 int i, error = 0;
1037
1038 #ifdef INVARIANTS
1039 if_softc_ctx_t scctx = vsi->shared;
1040 MPASS(scctx->isc_nrxqsets > 0);
1041 MPASS(nrxqs == 1);
1042 MPASS(scctx->isc_nrxqsets == nrxqsets);
1043 #endif
1044
1045 /* Allocate queue structure memory */
1046 if (!(vsi->rx_queues =
1047 (struct iavf_rx_queue *) malloc(sizeof(struct iavf_rx_queue) *
1048 nrxqsets, M_IAVF, M_NOWAIT | M_ZERO))) {
1049 device_printf(iflib_get_dev(ctx), "Unable to allocate RX ring memory\n");
1050 error = ENOMEM;
1051 goto fail;
1052 }
1053
1054 for (i = 0, que = vsi->rx_queues; i < nrxqsets; i++, que++) {
1055 struct rx_ring *rxr = &que->rxr;
1056
1057 rxr->me = i;
1058 que->vsi = vsi;
1059
1060 /* get the virtual and physical address of the hardware queues */
1061 rxr->tail = IAVF_QRX_TAIL1(rxr->me);
1062 rxr->rx_base = (union iavf_rx_desc *)vaddrs[i * nrxqs];
1063 rxr->rx_paddr = paddrs[i * nrxqs];
1064 rxr->que = que;
1065 }
1066
1067 return (0);
1068 fail:
1069 iavf_if_queues_free(ctx);
1070 return (error);
1071 }
1072
1073 /**
1074 * iavf_if_queues_free - Free driver queue memory
1075 * @ctx: the iflib context pointer
1076 *
1077 * Called by iflib to release memory allocated by the driver when setting up
1078 * Tx and Rx queues.
1079 *
1080 * @remark The ordering of this function and iavf_if_detach is not guaranteed.
1081 * It is possible for this function to be called either before or after the
1082 * iavf_if_detach. Thus, care must be taken to ensure that either ordering of
1083 * iavf_if_detach and iavf_if_queues_free is safe.
1084 */
1085 static void
1086 iavf_if_queues_free(if_ctx_t ctx)
1087 {
1088 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1089 struct iavf_vsi *vsi = &sc->vsi;
1090
1091 if (!vsi->enable_head_writeback) {
1092 struct iavf_tx_queue *que;
1093 int i = 0;
1094
1095 for (i = 0, que = vsi->tx_queues; i < vsi->shared->isc_ntxqsets; i++, que++) {
1096 struct tx_ring *txr = &que->txr;
1097 if (txr->tx_rsq != NULL) {
1098 free(txr->tx_rsq, M_IAVF);
1099 txr->tx_rsq = NULL;
1100 }
1101 }
1102 }
1103
1104 if (vsi->tx_queues != NULL) {
1105 free(vsi->tx_queues, M_IAVF);
1106 vsi->tx_queues = NULL;
1107 }
1108 if (vsi->rx_queues != NULL) {
1109 free(vsi->rx_queues, M_IAVF);
1110 vsi->rx_queues = NULL;
1111 }
1112 }
1113
1114 /**
1115 * iavf_check_aq_errors - Check for AdminQ errors
1116 * @sc: device softc
1117 *
1118 * Check the AdminQ registers for errors, and determine whether or not a reset
1119 * may be required to resolve them.
1120 *
1121 * @post if there are errors, the VF device will be stopped and a reset will
1122 * be requested.
1123 *
1124 * @returns zero if there are no issues, EBUSY if the device is resetting,
1125 * or EIO if there are any AQ errors.
1126 */
1127 static int
1128 iavf_check_aq_errors(struct iavf_sc *sc)
1129 {
1130 struct iavf_hw *hw = &sc->hw;
1131 device_t dev = sc->dev;
1132 u32 reg, oldreg;
1133 u8 aq_error = false;
1134
1135 oldreg = reg = rd32(hw, hw->aq.arq.len);
1136
1137 /* Check if device is in reset */
1138 if (reg == 0xdeadbeef || reg == 0xffffffff) {
1139 device_printf(dev, "VF in reset\n");
1140 return (EBUSY);
1141 }
1142
1143 /* Check for Admin queue errors */
1144 if (reg & IAVF_VF_ARQLEN1_ARQVFE_MASK) {
1145 device_printf(dev, "ARQ VF Error detected\n");
1146 reg &= ~IAVF_VF_ARQLEN1_ARQVFE_MASK;
1147 aq_error = true;
1148 }
1149 if (reg & IAVF_VF_ARQLEN1_ARQOVFL_MASK) {
1150 device_printf(dev, "ARQ Overflow Error detected\n");
1151 reg &= ~IAVF_VF_ARQLEN1_ARQOVFL_MASK;
1152 aq_error = true;
1153 }
1154 if (reg & IAVF_VF_ARQLEN1_ARQCRIT_MASK) {
1155 device_printf(dev, "ARQ Critical Error detected\n");
1156 reg &= ~IAVF_VF_ARQLEN1_ARQCRIT_MASK;
1157 aq_error = true;
1158 }
1159 if (oldreg != reg)
1160 wr32(hw, hw->aq.arq.len, reg);
1161
1162 oldreg = reg = rd32(hw, hw->aq.asq.len);
1163 if (reg & IAVF_VF_ATQLEN1_ATQVFE_MASK) {
1164 device_printf(dev, "ASQ VF Error detected\n");
1165 reg &= ~IAVF_VF_ATQLEN1_ATQVFE_MASK;
1166 aq_error = true;
1167 }
1168 if (reg & IAVF_VF_ATQLEN1_ATQOVFL_MASK) {
1169 device_printf(dev, "ASQ Overflow Error detected\n");
1170 reg &= ~IAVF_VF_ATQLEN1_ATQOVFL_MASK;
1171 aq_error = true;
1172 }
1173 if (reg & IAVF_VF_ATQLEN1_ATQCRIT_MASK) {
1174 device_printf(dev, "ASQ Critical Error detected\n");
1175 reg &= ~IAVF_VF_ATQLEN1_ATQCRIT_MASK;
1176 aq_error = true;
1177 }
1178 if (oldreg != reg)
1179 wr32(hw, hw->aq.asq.len, reg);
1180
1181 return (aq_error ? EIO : 0);
1182 }
1183
1184 /**
1185 * iavf_process_adminq - Process adminq responses from the PF
1186 * @sc: device softc
1187 * @pending: output parameter indicating how many messages remain
1188 *
1189 * Process the adminq to handle replies from the PF over the virtchnl
1190 * connection.
1191 *
1192 * @returns zero or an iavf_status code on failure
1193 */
1194 static enum iavf_status
1195 iavf_process_adminq(struct iavf_sc *sc, u16 *pending)
1196 {
1197 enum iavf_status status = IAVF_SUCCESS;
1198 struct iavf_arq_event_info event;
1199 struct iavf_hw *hw = &sc->hw;
1200 struct virtchnl_msg *v_msg;
1201 int error = 0, loop = 0;
1202 u32 reg;
1203
1204 if (iavf_test_state(&sc->state, IAVF_STATE_RESET_PENDING)) {
1205 status = IAVF_ERR_ADMIN_QUEUE_ERROR;
1206 goto reenable_interrupt;
1207 }
1208
1209 error = iavf_check_aq_errors(sc);
1210 if (error) {
1211 status = IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR;
1212 goto reenable_interrupt;
1213 }
1214
1215 event.buf_len = IAVF_AQ_BUF_SZ;
1216 event.msg_buf = sc->aq_buffer;
1217 bzero(event.msg_buf, IAVF_AQ_BUF_SZ);
1218 v_msg = (struct virtchnl_msg *)&event.desc;
1219
1220 IAVF_VC_LOCK(sc);
1221 /* clean and process any events */
1222 do {
1223 status = iavf_clean_arq_element(hw, &event, pending);
1224 /*
1225 * Also covers normal case when iavf_clean_arq_element()
1226 * returns "IAVF_ERR_ADMIN_QUEUE_NO_WORK"
1227 */
1228 if (status)
1229 break;
1230 iavf_vc_completion(sc, v_msg->v_opcode,
1231 v_msg->v_retval, event.msg_buf, event.msg_len);
1232 bzero(event.msg_buf, IAVF_AQ_BUF_SZ);
1233 } while (*pending && (loop++ < IAVF_ADM_LIMIT));
1234 IAVF_VC_UNLOCK(sc);
1235
1236 reenable_interrupt:
1237 /* Re-enable admin queue interrupt cause */
1238 reg = rd32(hw, IAVF_VFINT_ICR0_ENA1);
1239 reg |= IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK;
1240 wr32(hw, IAVF_VFINT_ICR0_ENA1, reg);
1241
1242 return (status);
1243 }
1244
1245 /**
1246 * iavf_if_update_admin_status - Administrative status task
1247 * @ctx: iflib context
1248 *
1249 * Called by iflib to handle administrative status events. The iavf driver
1250 * uses this to process the adminq virtchnl messages outside of interrupt
1251 * context.
1252 */
1253 static void
1254 iavf_if_update_admin_status(if_ctx_t ctx)
1255 {
1256 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1257 struct iavf_hw *hw = &sc->hw;
1258 u16 pending = 0;
1259
1260 iavf_process_adminq(sc, &pending);
1261 iavf_update_link_status(sc);
1262
1263 /*
1264 * If there are still messages to process, reschedule.
1265 * Otherwise, re-enable the Admin Queue interrupt.
1266 */
1267 if (pending > 0)
1268 iflib_admin_intr_deferred(ctx);
1269 else
1270 iavf_enable_adminq_irq(hw);
1271 }
1272
1273 /**
1274 * iavf_if_multi_set - Set multicast address filters
1275 * @ctx: iflib context
1276 *
1277 * Called by iflib to update the current list of multicast filters for the
1278 * device.
1279 */
1280 static void
1281 iavf_if_multi_set(if_ctx_t ctx)
1282 {
1283 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1284
1285 iavf_multi_set(sc);
1286 }
1287
1288 /**
1289 * iavf_if_mtu_set - Set the device MTU
1290 * @ctx: iflib context
1291 * @mtu: MTU value to set
1292 *
1293 * Called by iflib to set the device MTU.
1294 *
1295 * @returns zero on success, or EINVAL if the MTU is invalid.
1296 */
1297 static int
1298 iavf_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
1299 {
1300 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1301 struct iavf_vsi *vsi = &sc->vsi;
1302
1303 IOCTL_DEBUGOUT("ioctl: SiOCSIFMTU (Set Interface MTU)");
1304 if (mtu < IAVF_MIN_MTU || mtu > IAVF_MAX_MTU) {
1305 device_printf(sc->dev, "mtu %d is not in valid range [%d-%d]\n",
1306 mtu, IAVF_MIN_MTU, IAVF_MAX_MTU);
1307 return (EINVAL);
1308 }
1309
1310 vsi->shared->isc_max_frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN +
1311 ETHER_VLAN_ENCAP_LEN;
1312
1313 return (0);
1314 }
1315
1316 /**
1317 * iavf_if_media_status - Report current media status
1318 * @ctx: iflib context
1319 * @ifmr: ifmedia request structure
1320 *
1321 * Called by iflib to report the current media status in the ifmr.
1322 */
1323 static void
1324 iavf_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr)
1325 {
1326 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1327
1328 iavf_media_status_common(sc, ifmr);
1329 }
1330
1331 /**
1332 * iavf_if_media_change - Change the current media settings
1333 * @ctx: iflib context
1334 *
1335 * Called by iflib to change the current media settings.
1336 *
1337 * @returns zero on success, or an error code on failure.
1338 */
1339 static int
1340 iavf_if_media_change(if_ctx_t ctx)
1341 {
1342 return iavf_media_change_common(iflib_get_ifp(ctx));
1343 }
1344
1345 /**
1346 * iavf_if_promisc_set - Set device promiscuous mode
1347 * @ctx: iflib context
1348 * @flags: promiscuous configuration
1349 *
1350 * Called by iflib to request that the device enter promiscuous mode.
1351 *
1352 * @returns zero on success, or an error code on failure.
1353 */
1354 static int
1355 iavf_if_promisc_set(if_ctx_t ctx, int flags)
1356 {
1357 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1358
1359 return iavf_config_promisc(sc, flags);
1360 }
1361
1362 /**
1363 * iavf_if_timer - Periodic timer called by iflib
1364 * @ctx: iflib context
1365 * @qid: The queue being triggered
1366 *
1367 * Called by iflib periodically as a timer task, so that the driver can handle
1368 * periodic work.
1369 *
1370 * @remark this timer is only called while the interface is up, even if
1371 * IFLIB_ADMIN_ALWAYS_RUN is set.
1372 */
1373 static void
1374 iavf_if_timer(if_ctx_t ctx, uint16_t qid)
1375 {
1376 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1377 struct iavf_hw *hw = &sc->hw;
1378 u32 val;
1379
1380 if (qid != 0)
1381 return;
1382
1383 /* Check for when PF triggers a VF reset */
1384 val = rd32(hw, IAVF_VFGEN_RSTAT) &
1385 IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
1386 if (val != VIRTCHNL_VFR_VFACTIVE
1387 && val != VIRTCHNL_VFR_COMPLETED) {
1388 iavf_dbg_info(sc, "reset in progress! (%d)\n", val);
1389 return;
1390 }
1391
1392 /* Fire off the adminq task */
1393 iflib_admin_intr_deferred(ctx);
1394
1395 /* Update stats */
1396 iavf_request_stats(sc);
1397 }
1398
1399 /**
1400 * iavf_if_vlan_register - Register a VLAN
1401 * @ctx: iflib context
1402 * @vtag: the VLAN to register
1403 *
1404 * Register a VLAN filter for a given vtag.
1405 */
1406 static void
1407 iavf_if_vlan_register(if_ctx_t ctx, u16 vtag)
1408 {
1409 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1410 struct iavf_vsi *vsi = &sc->vsi;
1411
1412 if ((vtag == 0) || (vtag > 4095)) /* Invalid */
1413 return;
1414
1415 /* Add VLAN 0 to list, for untagged traffic */
1416 if (vsi->num_vlans == 0)
1417 iavf_add_vlan_filter(sc, 0);
1418
1419 iavf_add_vlan_filter(sc, vtag);
1420
1421 ++vsi->num_vlans;
1422
1423 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_VLAN_FILTER);
1424 }
1425
1426 /**
1427 * iavf_if_vlan_unregister - Unregister a VLAN
1428 * @ctx: iflib context
1429 * @vtag: the VLAN to remove
1430 *
1431 * Unregister (remove) a VLAN filter for the given vtag.
1432 */
1433 static void
1434 iavf_if_vlan_unregister(if_ctx_t ctx, u16 vtag)
1435 {
1436 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1437 struct iavf_vsi *vsi = &sc->vsi;
1438 int i = 0;
1439
1440 if ((vtag == 0) || (vtag > 4095) || (vsi->num_vlans == 0)) /* Invalid */
1441 return;
1442
1443 i = iavf_mark_del_vlan_filter(sc, vtag);
1444 vsi->num_vlans -= i;
1445
1446 /* Remove VLAN filter 0 if the last VLAN is being removed */
1447 if (vsi->num_vlans == 0)
1448 i += iavf_mark_del_vlan_filter(sc, 0);
1449
1450 if (i > 0)
1451 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_DEL_VLAN_FILTER);
1452 }
1453
1454 /**
1455 * iavf_if_get_counter - Get network statistic counters
1456 * @ctx: iflib context
1457 * @cnt: The counter to obtain
1458 *
1459 * Called by iflib to obtain the value of the specified counter.
1460 *
1461 * @returns the uint64_t counter value.
1462 */
1463 static uint64_t
1464 iavf_if_get_counter(if_ctx_t ctx, ift_counter cnt)
1465 {
1466 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1467 struct iavf_vsi *vsi = &sc->vsi;
1468 if_t ifp = iflib_get_ifp(ctx);
1469
1470 switch (cnt) {
1471 case IFCOUNTER_IPACKETS:
1472 return (vsi->ipackets);
1473 case IFCOUNTER_IERRORS:
1474 return (vsi->ierrors);
1475 case IFCOUNTER_OPACKETS:
1476 return (vsi->opackets);
1477 case IFCOUNTER_OERRORS:
1478 return (vsi->oerrors);
1479 case IFCOUNTER_COLLISIONS:
1480 /* Collisions are by standard impossible in 40G/10G Ethernet */
1481 return (0);
1482 case IFCOUNTER_IBYTES:
1483 return (vsi->ibytes);
1484 case IFCOUNTER_OBYTES:
1485 return (vsi->obytes);
1486 case IFCOUNTER_IMCASTS:
1487 return (vsi->imcasts);
1488 case IFCOUNTER_OMCASTS:
1489 return (vsi->omcasts);
1490 case IFCOUNTER_IQDROPS:
1491 return (vsi->iqdrops);
1492 case IFCOUNTER_OQDROPS:
1493 return (vsi->oqdrops);
1494 case IFCOUNTER_NOPROTO:
1495 return (vsi->noproto);
1496 default:
1497 return (if_get_counter_default(ifp, cnt));
1498 }
1499 }
1500
1501 /**
1502 * iavf_free_pci_resources - Free PCI resources
1503 * @sc: device softc
1504 *
1505 * Called to release the PCI resources allocated during attach. May be called
1506 * in the error flow of attach_pre, or during detach as part of cleanup.
1507 */
1508 static void
1509 iavf_free_pci_resources(struct iavf_sc *sc)
1510 {
1511 struct iavf_vsi *vsi = &sc->vsi;
1512 struct iavf_rx_queue *rx_que = vsi->rx_queues;
1513 device_t dev = sc->dev;
1514
1515 /* We may get here before stations are set up */
1516 if (rx_que == NULL)
1517 goto early;
1518
1519 /* Release all interrupts */
1520 iflib_irq_free(vsi->ctx, &vsi->irq);
1521
1522 for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++)
1523 iflib_irq_free(vsi->ctx, &rx_que->que_irq);
1524
1525 early:
1526 if (sc->pci_mem != NULL)
1527 bus_release_resource(dev, SYS_RES_MEMORY,
1528 rman_get_rid(sc->pci_mem), sc->pci_mem);
1529 }
1530
1531 /**
1532 * iavf_setup_interface - Setup the device interface
1533 * @sc: device softc
1534 *
1535 * Called to setup some device interface settings, such as the ifmedia
1536 * structure.
1537 */
1538 static void
1539 iavf_setup_interface(struct iavf_sc *sc)
1540 {
1541 struct iavf_vsi *vsi = &sc->vsi;
1542 if_ctx_t ctx = vsi->ctx;
1543 if_t ifp = iflib_get_ifp(ctx);
1544
1545 iavf_dbg_init(sc, "begin\n");
1546
1547 vsi->shared->isc_max_frame_size =
1548 if_getmtu(ifp) + ETHER_HDR_LEN + ETHER_CRC_LEN
1549 + ETHER_VLAN_ENCAP_LEN;
1550
1551 iavf_set_initial_baudrate(ifp);
1552
1553 ifmedia_add(sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1554 ifmedia_set(sc->media, IFM_ETHER | IFM_AUTO);
1555 }
1556
1557 /**
1558 * iavf_msix_adminq - Admin Queue interrupt handler
1559 * @arg: void pointer to the device softc
1560 *
1561 * Interrupt handler for the non-queue interrupt causes. Primarily this will
1562 * be the adminq interrupt, but also includes other miscellaneous causes.
1563 *
1564 * @returns FILTER_SCHEDULE_THREAD if the admin task needs to be run, otherwise
1565 * returns FITLER_HANDLED.
1566 */
1567 static int
1568 iavf_msix_adminq(void *arg)
1569 {
1570 struct iavf_sc *sc = (struct iavf_sc *)arg;
1571 struct iavf_hw *hw = &sc->hw;
1572 u32 reg, mask;
1573
1574 ++sc->admin_irq;
1575
1576 if (!iavf_test_state(&sc->state, IAVF_STATE_INITIALIZED))
1577 return (FILTER_HANDLED);
1578
1579 reg = rd32(hw, IAVF_VFINT_ICR01);
1580 /*
1581 * For masking off interrupt causes that need to be handled before
1582 * they can be re-enabled
1583 */
1584 mask = rd32(hw, IAVF_VFINT_ICR0_ENA1);
1585
1586 /* Check on the cause */
1587 if (reg & IAVF_VFINT_ICR01_ADMINQ_MASK) {
1588 mask &= ~IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK;
1589
1590 /* Process messages outside of the iflib context lock */
1591 taskqueue_enqueue(sc->vc_tq, &sc->vc_task);
1592 }
1593
1594 wr32(hw, IAVF_VFINT_ICR0_ENA1, mask);
1595 iavf_enable_adminq_irq(hw);
1596
1597 return (FILTER_HANDLED);
1598 }
1599
1600 /**
1601 * iavf_enable_intr - Enable device interrupts
1602 * @vsi: the main VSI
1603 *
1604 * Called to enable all queue interrupts.
1605 */
1606 void
1607 iavf_enable_intr(struct iavf_vsi *vsi)
1608 {
1609 struct iavf_hw *hw = vsi->hw;
1610 struct iavf_rx_queue *que = vsi->rx_queues;
1611
1612 iavf_enable_adminq_irq(hw);
1613 for (int i = 0; i < vsi->num_rx_queues; i++, que++)
1614 iavf_enable_queue_irq(hw, que->rxr.me);
1615 }
1616
1617 /**
1618 * iavf_disable_intr - Disable device interrupts
1619 * @vsi: the main VSI
1620 *
1621 * Called to disable all interrupts
1622 *
1623 * @remark we never disable the admin status interrupt.
1624 */
1625 void
1626 iavf_disable_intr(struct iavf_vsi *vsi)
1627 {
1628 struct iavf_hw *hw = vsi->hw;
1629 struct iavf_rx_queue *que = vsi->rx_queues;
1630
1631 for (int i = 0; i < vsi->num_rx_queues; i++, que++)
1632 iavf_disable_queue_irq(hw, que->rxr.me);
1633 }
1634
1635 /**
1636 * iavf_enable_queue_irq - Enable IRQ register for a queue interrupt
1637 * @hw: hardware structure
1638 * @id: IRQ vector to enable
1639 *
1640 * Writes the IAVF_VFINT_DYN_CTLN1 register to enable a given IRQ interrupt.
1641 */
1642 static void
1643 iavf_enable_queue_irq(struct iavf_hw *hw, int id)
1644 {
1645 u32 reg;
1646
1647 reg = IAVF_VFINT_DYN_CTLN1_INTENA_MASK |
1648 IAVF_VFINT_DYN_CTLN1_CLEARPBA_MASK |
1649 IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK;
1650 wr32(hw, IAVF_VFINT_DYN_CTLN1(id), reg);
1651 }
1652
1653 /**
1654 * iavf_disable_queue_irq - Disable IRQ register for a queue interrupt
1655 * @hw: hardware structure
1656 * @id: IRQ vector to disable
1657 *
1658 * Writes the IAVF_VFINT_DYN_CTLN1 register to disable a given IRQ interrupt.
1659 */
1660 static void
1661 iavf_disable_queue_irq(struct iavf_hw *hw, int id)
1662 {
1663 wr32(hw, IAVF_VFINT_DYN_CTLN1(id),
1664 IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK);
1665 rd32(hw, IAVF_VFGEN_RSTAT);
1666 }
1667
1668 /**
1669 * iavf_configure_itr - Get initial ITR values from tunable values.
1670 * @sc: device softc
1671 *
1672 * Load the initial tunable values for the ITR configuration.
1673 */
1674 static void
1675 iavf_configure_itr(struct iavf_sc *sc)
1676 {
1677 iavf_configure_tx_itr(sc);
1678 iavf_configure_rx_itr(sc);
1679 }
1680
1681 /**
1682 * iavf_set_queue_rx_itr - Update Rx ITR value
1683 * @que: Rx queue to update
1684 *
1685 * Provide a update to the queue RX interrupt moderation value.
1686 */
1687 static void
1688 iavf_set_queue_rx_itr(struct iavf_rx_queue *que)
1689 {
1690 struct iavf_vsi *vsi = que->vsi;
1691 struct iavf_hw *hw = vsi->hw;
1692 struct rx_ring *rxr = &que->rxr;
1693
1694 /* Idle, do nothing */
1695 if (rxr->bytes == 0)
1696 return;
1697
1698 /* Update the hardware if needed */
1699 if (rxr->itr != vsi->rx_itr_setting) {
1700 rxr->itr = vsi->rx_itr_setting;
1701 wr32(hw, IAVF_VFINT_ITRN1(IAVF_RX_ITR,
1702 que->rxr.me), rxr->itr);
1703 }
1704 }
1705
1706 /**
1707 * iavf_msix_que - Main Rx queue interrupt handler
1708 * @arg: void pointer to the Rx queue
1709 *
1710 * Main MSI-X interrupt handler for Rx queue interrupts
1711 *
1712 * @returns FILTER_SCHEDULE_THREAD if the main thread for Rx needs to run,
1713 * otherwise returns FILTER_HANDLED.
1714 */
1715 static int
1716 iavf_msix_que(void *arg)
1717 {
1718 struct iavf_rx_queue *rx_que = (struct iavf_rx_queue *)arg;
1719 struct iavf_sc *sc = rx_que->vsi->back;
1720
1721 ++rx_que->irqs;
1722
1723 if (!iavf_test_state(&sc->state, IAVF_STATE_RUNNING))
1724 return (FILTER_HANDLED);
1725
1726 iavf_set_queue_rx_itr(rx_que);
1727
1728 return (FILTER_SCHEDULE_THREAD);
1729 }
1730
1731 /**
1732 * iavf_update_link_status - Update iflib Link status
1733 * @sc: device softc
1734 *
1735 * Notify the iflib stack of changes in link status. Called after the device
1736 * receives a virtchnl message indicating a change in link status.
1737 */
1738 void
1739 iavf_update_link_status(struct iavf_sc *sc)
1740 {
1741 struct iavf_vsi *vsi = &sc->vsi;
1742 u64 baudrate;
1743
1744 if (sc->link_up){
1745 if (vsi->link_active == FALSE) {
1746 vsi->link_active = TRUE;
1747 baudrate = iavf_baudrate_from_link_speed(sc);
1748 iavf_dbg_info(sc, "baudrate: %llu\n", (unsigned long long)baudrate);
1749 iflib_link_state_change(vsi->ctx, LINK_STATE_UP, baudrate);
1750 }
1751 } else { /* Link down */
1752 if (vsi->link_active == TRUE) {
1753 vsi->link_active = FALSE;
1754 iflib_link_state_change(vsi->ctx, LINK_STATE_DOWN, 0);
1755 }
1756 }
1757 }
1758
1759 /**
1760 * iavf_stop - Stop the interface
1761 * @sc: device softc
1762 *
1763 * This routine disables all traffic on the adapter by disabling interrupts
1764 * and sending a message to the PF to tell it to stop the hardware
1765 * Tx/Rx LAN queues.
1766 */
1767 static void
1768 iavf_stop(struct iavf_sc *sc)
1769 {
1770 iavf_clear_state(&sc->state, IAVF_STATE_RUNNING);
1771
1772 iavf_disable_intr(&sc->vsi);
1773
1774 iavf_disable_queues_with_retries(sc);
1775 }
1776
1777 /**
1778 * iavf_if_stop - iflib stop handler
1779 * @ctx: iflib context
1780 *
1781 * Call iavf_stop to stop the interface.
1782 */
1783 static void
1784 iavf_if_stop(if_ctx_t ctx)
1785 {
1786 struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
1787
1788 iavf_stop(sc);
1789 }
1790
1791 /**
1792 * iavf_del_mac_filter - Delete a MAC filter
1793 * @sc: device softc
1794 * @macaddr: MAC address to remove
1795 *
1796 * Marks a MAC filter for deletion.
1797 *
1798 * @returns zero if the filter existed, or ENOENT if it did not.
1799 */
1800 static int
1801 iavf_del_mac_filter(struct iavf_sc *sc, u8 *macaddr)
1802 {
1803 struct iavf_mac_filter *f;
1804
1805 f = iavf_find_mac_filter(sc, macaddr);
1806 if (f == NULL)
1807 return (ENOENT);
1808
1809 f->flags |= IAVF_FILTER_DEL;
1810 return (0);
1811 }
1812
1813 /**
1814 * iavf_init_tx_rsqs - Initialize Report Status array
1815 * @vsi: the main VSI
1816 *
1817 * Set the Report Status queue fields to zero in order to initialize the
1818 * queues for transmit.
1819 */
1820 void
1821 iavf_init_tx_rsqs(struct iavf_vsi *vsi)
1822 {
1823 if_softc_ctx_t scctx = vsi->shared;
1824 struct iavf_tx_queue *tx_que;
1825 int i, j;
1826
1827 for (i = 0, tx_que = vsi->tx_queues; i < vsi->num_tx_queues; i++, tx_que++) {
1828 struct tx_ring *txr = &tx_que->txr;
1829
1830 txr->tx_rs_cidx = txr->tx_rs_pidx;
1831
1832 /* Initialize the last processed descriptor to be the end of
1833 * the ring, rather than the start, so that we avoid an
1834 * off-by-one error when calculating how many descriptors are
1835 * done in the credits_update function.
1836 */
1837 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1;
1838
1839 for (j = 0; j < scctx->isc_ntxd[0]; j++)
1840 txr->tx_rsq[j] = QIDX_INVALID;
1841 }
1842 }
1843
1844 /**
1845 * iavf_init_tx_cidx - Initialize Tx cidx values
1846 * @vsi: the main VSI
1847 *
1848 * Initialize the tx_cidx_processed values for Tx queues in order to
1849 * initialize the Tx queues for transmit.
1850 */
1851 void
1852 iavf_init_tx_cidx(struct iavf_vsi *vsi)
1853 {
1854 if_softc_ctx_t scctx = vsi->shared;
1855 struct iavf_tx_queue *tx_que;
1856 int i;
1857
1858 for (i = 0, tx_que = vsi->tx_queues; i < vsi->num_tx_queues; i++, tx_que++) {
1859 struct tx_ring *txr = &tx_que->txr;
1860
1861 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1;
1862 }
1863 }
1864
1865 /**
1866 * iavf_add_device_sysctls - Add device sysctls for configuration
1867 * @sc: device softc
1868 *
1869 * Add the main sysctl nodes and sysctls for device configuration.
1870 */
1871 static void
1872 iavf_add_device_sysctls(struct iavf_sc *sc)
1873 {
1874 struct iavf_vsi *vsi = &sc->vsi;
1875 device_t dev = sc->dev;
1876 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
1877 struct sysctl_oid_list *debug_list;
1878
1879 iavf_add_device_sysctls_common(sc);
1880
1881 debug_list = iavf_create_debug_sysctl_tree(sc);
1882
1883 iavf_add_debug_sysctls_common(sc, debug_list);
1884
1885 SYSCTL_ADD_PROC(ctx, debug_list,
1886 OID_AUTO, "queue_interrupt_table", CTLTYPE_STRING | CTLFLAG_RD,
1887 sc, 0, iavf_sysctl_queue_interrupt_table, "A", "View MSI-X indices for TX/RX queues");
1888
1889 #ifdef IAVF_DEBUG
1890 SYSCTL_ADD_PROC(ctx, debug_list,
1891 OID_AUTO, "do_vf_reset", CTLTYPE_INT | CTLFLAG_WR,
1892 sc, 0, iavf_sysctl_vf_reset, "A", "Request a VF reset from PF");
1893
1894 SYSCTL_ADD_PROC(ctx, debug_list,
1895 OID_AUTO, "do_vflr_reset", CTLTYPE_INT | CTLFLAG_WR,
1896 sc, 0, iavf_sysctl_vflr_reset, "A", "Request a VFLR reset from HW");
1897 #endif
1898
1899 /* Add stats sysctls */
1900 iavf_add_vsi_sysctls(dev, vsi, ctx, "vsi");
1901
1902 iavf_add_queues_sysctls(dev, vsi);
1903 }
1904
1905 /**
1906 * iavf_add_queues_sysctls - Add per-queue sysctls
1907 * @dev: device pointer
1908 * @vsi: the main VSI
1909 *
1910 * Add sysctls for each Tx and Rx queue.
1911 */
1912 void
1913 iavf_add_queues_sysctls(device_t dev, struct iavf_vsi *vsi)
1914 {
1915 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
1916 struct sysctl_oid_list *vsi_list, *queue_list;
1917 struct sysctl_oid *queue_node;
1918 char queue_namebuf[32];
1919
1920 struct iavf_rx_queue *rx_que;
1921 struct iavf_tx_queue *tx_que;
1922 struct tx_ring *txr;
1923 struct rx_ring *rxr;
1924
1925 vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
1926
1927 /* Queue statistics */
1928 for (int q = 0; q < vsi->num_rx_queues; q++) {
1929 bzero(queue_namebuf, sizeof(queue_namebuf));
1930 snprintf(queue_namebuf, IAVF_QUEUE_NAME_LEN, "rxq%02d", q);
1931 queue_node = SYSCTL_ADD_NODE(ctx, vsi_list,
1932 OID_AUTO, queue_namebuf, CTLFLAG_RD, NULL, "RX Queue #");
1933 queue_list = SYSCTL_CHILDREN(queue_node);
1934
1935 rx_que = &(vsi->rx_queues[q]);
1936 rxr = &(rx_que->rxr);
1937
1938 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
1939 CTLFLAG_RD, &(rx_que->irqs),
1940 "irqs on this queue (both Tx and Rx)");
1941
1942 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "packets",
1943 CTLFLAG_RD, &(rxr->rx_packets),
1944 "Queue Packets Received");
1945 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "bytes",
1946 CTLFLAG_RD, &(rxr->rx_bytes),
1947 "Queue Bytes Received");
1948 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "desc_err",
1949 CTLFLAG_RD, &(rxr->desc_errs),
1950 "Queue Rx Descriptor Errors");
1951 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "itr",
1952 CTLFLAG_RD, &(rxr->itr), 0,
1953 "Queue Rx ITR Interval");
1954 }
1955 for (int q = 0; q < vsi->num_tx_queues; q++) {
1956 bzero(queue_namebuf, sizeof(queue_namebuf));
1957 snprintf(queue_namebuf, IAVF_QUEUE_NAME_LEN, "txq%02d", q);
1958 queue_node = SYSCTL_ADD_NODE(ctx, vsi_list,
1959 OID_AUTO, queue_namebuf, CTLFLAG_RD, NULL, "TX Queue #");
1960 queue_list = SYSCTL_CHILDREN(queue_node);
1961
1962 tx_que = &(vsi->tx_queues[q]);
1963 txr = &(tx_que->txr);
1964
1965 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso",
1966 CTLFLAG_RD, &(tx_que->tso),
1967 "TSO");
1968 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "mss_too_small",
1969 CTLFLAG_RD, &(txr->mss_too_small),
1970 "TSO sends with an MSS less than 64");
1971 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "packets",
1972 CTLFLAG_RD, &(txr->tx_packets),
1973 "Queue Packets Transmitted");
1974 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "bytes",
1975 CTLFLAG_RD, &(txr->tx_bytes),
1976 "Queue Bytes Transmitted");
1977 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "itr",
1978 CTLFLAG_RD, &(txr->itr), 0,
1979 "Queue Tx ITR Interval");
1980 }
1981 }
1982
1983 /**
1984 * iavf_driver_is_detaching - Check if the driver is detaching/unloading
1985 * @sc: device private softc
1986 *
1987 * @returns true if the driver is detaching, false otherwise.
1988 *
1989 * @remark on newer kernels, take advantage of iflib_in_detach in order to
1990 * report detachment correctly as early as possible.
1991 *
1992 * @remark this function is used by various code paths that want to avoid
1993 * running if the driver is about to be removed. This includes sysctls and
1994 * other driver access points. Note that it does not fully resolve
1995 * detach-based race conditions as it is possible for a thread to race with
1996 * iflib_in_detach.
1997 */
1998 bool
1999 iavf_driver_is_detaching(struct iavf_sc *sc)
2000 {
2001 return (!iavf_test_state(&sc->state, IAVF_STATE_INITIALIZED) ||
2002 iflib_in_detach(sc->vsi.ctx));
2003 }
2004
2005 /**
2006 * iavf_sysctl_queue_interrupt_table - Sysctl for displaying Tx queue mapping
2007 * @oidp: sysctl oid structure
2008 * @arg1: void pointer to device softc
2009 * @arg2: unused
2010 * @req: sysctl request pointer
2011 *
2012 * Print out mapping of TX queue indexes and Rx queue indexes to MSI-X vectors.
2013 *
2014 * @returns zero on success, or an error code on failure.
2015 */
2016 static int
2017 iavf_sysctl_queue_interrupt_table(SYSCTL_HANDLER_ARGS)
2018 {
2019 struct iavf_sc *sc = (struct iavf_sc *)arg1;
2020 struct iavf_vsi *vsi = &sc->vsi;
2021 device_t dev = sc->dev;
2022 struct sbuf *buf;
2023 int error = 0;
2024
2025 struct iavf_rx_queue *rx_que;
2026 struct iavf_tx_queue *tx_que;
2027
2028 UNREFERENCED_2PARAMETER(arg2, oidp);
2029
2030 if (iavf_driver_is_detaching(sc))
2031 return (ESHUTDOWN);
2032
2033 buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2034 if (!buf) {
2035 device_printf(dev, "Could not allocate sbuf for output.\n");
2036 return (ENOMEM);
2037 }
2038
2039 sbuf_cat(buf, "\n");
2040 for (int i = 0; i < vsi->num_rx_queues; i++) {
2041 rx_que = &vsi->rx_queues[i];
2042 sbuf_printf(buf, "(rxq %3d): %d\n", i, rx_que->msix);
2043 }
2044 for (int i = 0; i < vsi->num_tx_queues; i++) {
2045 tx_que = &vsi->tx_queues[i];
2046 sbuf_printf(buf, "(txq %3d): %d\n", i, tx_que->msix);
2047 }
2048
2049 error = sbuf_finish(buf);
2050 if (error)
2051 device_printf(dev, "Error finishing sbuf: %d\n", error);
2052 sbuf_delete(buf);
2053
2054 return (error);
2055 }
2056
2057 #ifdef IAVF_DEBUG
2058 #define CTX_ACTIVE(ctx) ((if_getdrvflags(iflib_get_ifp(ctx)) & IFF_DRV_RUNNING))
2059
2060 /**
2061 * iavf_sysctl_vf_reset - Request a VF reset
2062 * @oidp: sysctl oid pointer
2063 * @arg1: void pointer to device softc
2064 * @arg2: unused
2065 * @req: sysctl request pointer
2066 *
2067 * Request a VF reset for the device.
2068 *
2069 * @returns zero on success, or an error code on failure.
2070 */
2071 static int
2072 iavf_sysctl_vf_reset(SYSCTL_HANDLER_ARGS)
2073 {
2074 struct iavf_sc *sc = (struct iavf_sc *)arg1;
2075 int do_reset = 0, error = 0;
2076
2077 UNREFERENCED_PARAMETER(arg2);
2078
2079 if (iavf_driver_is_detaching(sc))
2080 return (ESHUTDOWN);
2081
2082 error = sysctl_handle_int(oidp, &do_reset, 0, req);
2083 if ((error) || (req->newptr == NULL))
2084 return (error);
2085
2086 if (do_reset == 1) {
2087 iavf_reset(sc);
2088 if (CTX_ACTIVE(sc->vsi.ctx))
2089 iflib_request_reset(sc->vsi.ctx);
2090 }
2091
2092 return (error);
2093 }
2094
2095 /**
2096 * iavf_sysctl_vflr_reset - Trigger a PCIe FLR for the device
2097 * @oidp: sysctl oid pointer
2098 * @arg1: void pointer to device softc
2099 * @arg2: unused
2100 * @req: sysctl request pointer
2101 *
2102 * Sysctl callback to trigger a PCIe FLR.
2103 *
2104 * @returns zero on success, or an error code on failure.
2105 */
2106 static int
2107 iavf_sysctl_vflr_reset(SYSCTL_HANDLER_ARGS)
2108 {
2109 struct iavf_sc *sc = (struct iavf_sc *)arg1;
2110 device_t dev = sc->dev;
2111 int do_reset = 0, error = 0;
2112
2113 UNREFERENCED_PARAMETER(arg2);
2114
2115 if (iavf_driver_is_detaching(sc))
2116 return (ESHUTDOWN);
2117
2118 error = sysctl_handle_int(oidp, &do_reset, 0, req);
2119 if ((error) || (req->newptr == NULL))
2120 return (error);
2121
2122 if (do_reset == 1) {
2123 if (!pcie_flr(dev, max(pcie_get_max_completion_timeout(dev) / 1000, 10), true)) {
2124 device_printf(dev, "PCIE FLR failed\n");
2125 error = EIO;
2126 }
2127 else if (CTX_ACTIVE(sc->vsi.ctx))
2128 iflib_request_reset(sc->vsi.ctx);
2129 }
2130
2131 return (error);
2132 }
2133 #undef CTX_ACTIVE
2134 #endif
Cache object: 4b596aa4c80a08defadded9ba3561f2d
|