Lines Matching +full:rx +full:- +full:ctrl
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved.
248 dev = softc->dev; in enic_allocate_msix()
249 ctx = softc->ctx; in enic_allocate_msix()
250 scctx = softc->scctx; in enic_allocate_msix()
260 queues = imin(queues, scctx->isc_nrxqsets); in enic_allocate_msix()
261 queues = imin(queues, scctx->isc_ntxqsets); in enic_allocate_msix()
262 requested = queues * 2 + sctx->isc_admin_intrcnt; in enic_allocate_msix()
263 scctx->isc_nrxqsets = queues; in enic_allocate_msix()
264 scctx->isc_ntxqsets = queues; in enic_allocate_msix()
269 "failed to allocate %d MSI-X vectors, err: %d\n", requested, in enic_allocate_msix()
276 "Unable to allocate sufficient MSI-X vectors " in enic_allocate_msix()
284 device_printf(dev, "Using MSI-X interrupts with %d vectors\n", in enic_allocate_msix()
287 scctx->isc_intr = IFLIB_INTR_MSIX; in enic_allocate_msix()
288 scctx->isc_vectors = vectors; in enic_allocate_msix()
296 {0, 0}, /* 0 - 4 Gbps */
297 {0, 3}, /* 4 - 10 Gbps */
298 {3, 6}, /* 10 - 40 Gbps */
304 int index = -1; in enic_set_rx_coal_setting()
305 struct enic_rx_coal *rx_coal = &enic->rx_coalesce_setting; in enic_set_rx_coal_setting()
309 * 3. Update it in enic->rx_coalesce_setting in enic_set_rx_coal_setting()
311 speed = vnic_dev_port_speed(enic->vdev); in enic_set_rx_coal_setting()
319 rx_coal->small_pkt_range_start = mod_range[index].small_pkt_range_start; in enic_set_rx_coal_setting()
320 rx_coal->large_pkt_range_start = mod_range[index].large_pkt_range_start; in enic_set_rx_coal_setting()
321 rx_coal->range_end = ENIC_RX_COALESCE_RANGE_END; in enic_set_rx_coal_setting()
324 for (index = 0; index < enic->rq_count; index++) in enic_set_rx_coal_setting()
325 enic->cq[index].cur_rx_coal_timeval = in enic_set_rx_coal_setting()
326 enic->config.intr_timer_usec; in enic_set_rx_coal_setting()
328 rx_coal->use_adaptive_rx_coalesce = 1; in enic_set_rx_coal_setting()
340 int err = -1; in enic_attach_pre()
350 softc->dev = dev; in enic_attach_pre()
351 softc->ctx = ctx; in enic_attach_pre()
352 softc->sctx = iflib_get_sctx(ctx); in enic_attach_pre()
353 softc->scctx = iflib_get_softc_ctx(ctx); in enic_attach_pre()
354 softc->ifp = iflib_get_ifp(ctx); in enic_attach_pre()
355 softc->media = iflib_get_media(ctx); in enic_attach_pre()
356 softc->mta = malloc(sizeof(u8) * ETHER_ADDR_LEN * in enic_attach_pre()
359 if (softc->mta == NULL) in enic_attach_pre()
361 scctx = softc->scctx; in enic_attach_pre()
363 mtx_init(&softc->enic_lock, "ENIC Lock", NULL, MTX_DEF); in enic_attach_pre()
365 pci_enable_busmaster(softc->dev); in enic_attach_pre()
369 enic = &softc->enic; in enic_attach_pre()
370 enic->softc = softc; in enic_attach_pre()
371 vdev = &softc->vdev; in enic_attach_pre()
372 vdev->softc = softc; in enic_attach_pre()
373 enic->vdev = vdev; in enic_attach_pre()
374 vdev->priv = enic; in enic_attach_pre()
377 vnic_dev_register(vdev, &softc->mem, 1); in enic_attach_pre()
378 enic->vdev = vdev; in enic_attach_pre()
379 vnic_dev_cmd_init(enic->vdev); in enic_attach_pre()
381 vdev->devcmd = vnic_dev_get_res(vdev, RES_TYPE_DEVCMD, 0); in enic_attach_pre()
386 bcopy((u_int8_t *) & a0, softc->mac_addr, ETHER_ADDR_LEN); in enic_attach_pre()
387 iflib_set_mac(ctx, softc->mac_addr); in enic_attach_pre()
389 vnic_register_cbacks(enic->vdev, enic_alloc_consistent, in enic_attach_pre()
397 err = vnic_dev_alloc_stats_mem(enic->vdev); in enic_attach_pre()
403 vnic_dev_stats_clear(enic->vdev); in enic_attach_pre()
404 ret = vnic_dev_stats_dump(enic->vdev, &stats); in enic_attach_pre()
409 err = vnic_dev_alloc_counter_mem(enic->vdev); in enic_attach_pre()
423 enic->ig_vlan_rewrite_mode = IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN; in enic_attach_pre()
424 enic->ig_vlan_rewrite_mode = IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN; in enic_attach_pre()
425 err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev, in enic_attach_pre()
426 enic->ig_vlan_rewrite_mode); in enic_attach_pre()
434 * Issue device init to initialize the vnic-to-switch link. We'll in enic_attach_pre()
437 * vnic-to-switch link initialization to complete; link UP in enic_attach_pre()
441 err = vnic_dev_init(enic->vdev, 0); in enic_attach_pre()
454 enic->port_mtu = vnic_dev_mtu(enic->vdev); in enic_attach_pre()
456 softc->scctx = iflib_get_softc_ctx(ctx); in enic_attach_pre()
457 scctx = softc->scctx; in enic_attach_pre()
458 scctx->isc_txrx = &enic_txrx; in enic_attach_pre()
459 scctx->isc_capabilities = scctx->isc_capenable = \ in enic_attach_pre()
461 scctx->isc_tx_csum_flags = 0; in enic_attach_pre()
462 if_setmtu(softc->ifp, enic->config.mtu); in enic_attach_pre()
463 scctx->isc_max_frame_size = enic->config.mtu + ETHER_HDR_LEN + \ in enic_attach_pre()
465 scctx->isc_nrxqsets_max = enic->conf_rq_count; in enic_attach_pre()
466 scctx->isc_ntxqsets_max = enic->conf_wq_count; in enic_attach_pre()
467 scctx->isc_nrxqsets = enic->conf_rq_count; in enic_attach_pre()
468 scctx->isc_ntxqsets = enic->conf_wq_count; in enic_attach_pre()
469 for (i = 0; i < enic->conf_wq_count; i++) { in enic_attach_pre()
470 scctx->isc_ntxd[i] = enic->config.wq_desc_count; in enic_attach_pre()
471 scctx->isc_txqsizes[i] = sizeof(struct cq_enet_wq_desc) in enic_attach_pre()
472 * scctx->isc_ntxd[i]; in enic_attach_pre()
473 scctx->isc_ntxd[i + enic->conf_wq_count] = in enic_attach_pre()
474 enic->config.wq_desc_count; in enic_attach_pre()
475 scctx->isc_txqsizes[i + enic->conf_wq_count] = in enic_attach_pre()
476 sizeof(struct cq_desc) * scctx->isc_ntxd[i + in enic_attach_pre()
477 enic->conf_wq_count]; in enic_attach_pre()
479 for (i = 0; i < enic->conf_rq_count; i++) { in enic_attach_pre()
480 scctx->isc_nrxd[i] = enic->config.rq_desc_count; in enic_attach_pre()
481 scctx->isc_rxqsizes[i] = sizeof(struct cq_enet_rq_desc) * in enic_attach_pre()
482 scctx->isc_nrxd[i]; in enic_attach_pre()
483 scctx->isc_nrxd[i + enic->conf_rq_count] = in enic_attach_pre()
484 enic->config.rq_desc_count; in enic_attach_pre()
485 scctx->isc_rxqsizes[i + enic->conf_rq_count] = sizeof(struct in enic_attach_pre()
486 cq_desc) * scctx->isc_nrxd[i + enic->conf_rq_count]; in enic_attach_pre()
488 scctx->isc_tx_nsegments = 31; in enic_attach_pre()
490 scctx->isc_msix_bar = -1; in enic_attach_pre()
492 ifmedia_add(softc->media, IFM_ETHER | IFM_AUTO, 0, NULL); in enic_attach_pre()
493 ifmedia_add(softc->media, IFM_ETHER | IFM_40G_SR4, 0, NULL); in enic_attach_pre()
494 ifmedia_add(softc->media, IFM_ETHER | IFM_10_FL, 0, NULL); in enic_attach_pre()
497 * Allocate the CQ here since TX is called first before RX. in enic_attach_pre()
499 if (softc->enic.cq == NULL) in enic_attach_pre()
500 softc->enic.cq = malloc(sizeof(struct vnic_cq) * in enic_attach_pre()
501 softc->enic.wq_count + softc->enic.rq_count, M_DEVBUF, in enic_attach_pre()
503 if (softc->enic.cq == NULL) in enic_attach_pre()
510 err = vnic_dev_alloc_stats_mem(enic->vdev); in enic_attach_pre()
525 vnic_dev_close(enic->vdev); in enic_attach_pre()
526 vnic_dev_deinit_devcmd2(enic->vdev); in enic_attach_pre()
528 free(softc->vdev.devcmd, M_DEVBUF); in enic_attach_pre()
529 free(softc->enic.intr_queues, M_DEVBUF); in enic_attach_pre()
530 free(softc->enic.cq, M_DEVBUF); in enic_attach_pre()
531 free(softc->mta, M_DEVBUF); in enic_attach_pre()
532 rc = -1; in enic_attach_pre()
533 pci_disable_busmaster(softc->dev); in enic_attach_pre()
535 mtx_destroy(&softc->enic_lock); in enic_attach_pre()
551 enic = &softc->enic; in enic_msix_intr_assign()
552 scctx = softc->scctx; in enic_msix_intr_assign()
555 vnic_dev_set_intr_mode(enic->vdev, VNIC_DEV_INTR_MODE_MSIX); in enic_msix_intr_assign()
558 enic->intr_queues = malloc(sizeof(*enic->intr_queues) * in enic_msix_intr_assign()
559 enic->conf_intr_count, M_DEVBUF, M_NOWAIT | M_ZERO); in enic_msix_intr_assign()
560 enic->intr = malloc(sizeof(*enic->intr) * msix, M_DEVBUF, M_NOWAIT in enic_msix_intr_assign()
562 for (i = 0; i < scctx->isc_nrxqsets; i++) { in enic_msix_intr_assign()
564 device_get_unit(softc->dev)); in enic_msix_intr_assign()
567 &enic->intr_queues[i].intr_irq, i + 1, IFLIB_INTR_RX, in enic_msix_intr_assign()
568 enic_rxq_intr, &enic->rq[i], i, irq_name); in enic_msix_intr_assign()
574 enic->intr[i].index = i; in enic_msix_intr_assign()
575 enic->intr[i].vdev = enic->vdev; in enic_msix_intr_assign()
577 enic->intr[i].ctrl = vnic_dev_get_res(enic->vdev, in enic_msix_intr_assign()
579 vnic_intr_mask(&enic->intr[i]); in enic_msix_intr_assign()
583 for (i = scctx->isc_nrxqsets; i < scctx->isc_nrxqsets + scctx->isc_ntxqsets; i++) { in enic_msix_intr_assign()
584 snprintf(irq_name, sizeof(irq_name), "etxq%d:%d", i - in enic_msix_intr_assign()
585 scctx->isc_nrxqsets, device_get_unit(softc->dev)); in enic_msix_intr_assign()
588 &enic->intr_queues[i].intr_irq, IFLIB_INTR_TX, in enic_msix_intr_assign()
589 &enic->wq[i - scctx->isc_nrxqsets], i - scctx->isc_nrxqsets, in enic_msix_intr_assign()
592 enic->intr[i].index = i; in enic_msix_intr_assign()
593 enic->intr[i].vdev = enic->vdev; in enic_msix_intr_assign()
595 enic->intr[i].ctrl = vnic_dev_get_res(enic->vdev, in enic_msix_intr_assign()
597 vnic_intr_mask(&enic->intr[i]); in enic_msix_intr_assign()
601 i = scctx->isc_nrxqsets + scctx->isc_ntxqsets; in enic_msix_intr_assign()
602 error = iflib_irq_alloc_generic(ctx, &softc->enic_event_intr_irq, in enic_msix_intr_assign()
610 enic->intr[i].index = i; in enic_msix_intr_assign()
611 enic->intr[i].vdev = enic->vdev; in enic_msix_intr_assign()
613 enic->intr[i].ctrl = vnic_dev_get_res(enic->vdev, RES_TYPE_INTR_CTRL, in enic_msix_intr_assign()
615 vnic_intr_mask(&enic->intr[i]); in enic_msix_intr_assign()
619 error = iflib_irq_alloc_generic(ctx, &softc->enic_err_intr_irq, in enic_msix_intr_assign()
626 enic->intr[i].index = i; in enic_msix_intr_assign()
627 enic->intr[i].vdev = enic->vdev; in enic_msix_intr_assign()
629 enic->intr[i].ctrl = vnic_dev_get_res(enic->vdev, RES_TYPE_INTR_CTRL, in enic_msix_intr_assign()
631 vnic_intr_mask(&enic->intr[i]); in enic_msix_intr_assign()
634 enic->intr_count = msix; in enic_msix_intr_assign()
647 scctx = softc->scctx; in enic_free_irqs()
648 enic = &softc->enic; in enic_free_irqs()
650 for (i = 0; i < scctx->isc_nrxqsets + scctx->isc_ntxqsets; i++) { in enic_free_irqs()
651 iflib_irq_free(softc->ctx, &enic->intr_queues[i].intr_irq); in enic_free_irqs()
654 iflib_irq_free(softc->ctx, &softc->enic_event_intr_irq); in enic_free_irqs()
655 iflib_irq_free(softc->ctx, &softc->enic_err_intr_irq); in enic_free_irqs()
656 free(enic->intr_queues, M_DEVBUF); in enic_free_irqs()
657 free(enic->intr, M_DEVBUF); in enic_free_irqs()
668 enic = &softc->enic; in enic_attach_post()
676 ifmedia_add(softc->media, IFM_ETHER | IFM_AUTO, 0, NULL); in enic_attach_post()
677 ifmedia_set(softc->media, IFM_ETHER | IFM_AUTO); in enic_attach_post()
689 enic = &softc->enic; in enic_detach()
691 vnic_dev_notify_unset(enic->vdev); in enic_detach()
696 vnic_dev_deinit(enic->vdev); in enic_detach()
697 vnic_dev_close(enic->vdev); in enic_detach()
698 vnic_dev_deinit_devcmd2(enic->vdev); in enic_detach()
699 free(softc->vdev.devcmd, M_DEVBUF); in enic_detach()
700 pci_disable_busmaster(softc->dev); in enic_detach()
716 softc->enic.wq = malloc(sizeof(struct vnic_wq) * in enic_tx_queues_alloc()
718 if (softc->enic.wq == NULL) in enic_tx_queues_alloc()
737 wq = &softc->enic.wq[q]; in enic_tx_queues_alloc()
738 cq_wq = enic_cq_wq(&softc->enic, q); in enic_tx_queues_alloc()
739 cq = &softc->enic.cq[cq_wq]; in enic_tx_queues_alloc()
742 wq->vdev = softc->enic.vdev; in enic_tx_queues_alloc()
743 wq->index = q; in enic_tx_queues_alloc()
744 wq->ctrl = vnic_dev_get_res(softc->enic.vdev, RES_TYPE_WQ, in enic_tx_queues_alloc()
745 wq->index); in enic_tx_queues_alloc()
748 wq->ring.desc_size = sizeof(struct wq_enet_desc); in enic_tx_queues_alloc()
749 wq->ring.desc_count = softc->scctx->isc_ntxd[q]; in enic_tx_queues_alloc()
750 wq->ring.desc_avail = wq->ring.desc_count - 1; in enic_tx_queues_alloc()
751 wq->ring.last_count = wq->ring.desc_count; in enic_tx_queues_alloc()
752 wq->head_idx = 0; in enic_tx_queues_alloc()
753 wq->tail_idx = 0; in enic_tx_queues_alloc()
755 wq->ring.descs = vaddrs[q * ntxqs + 0]; in enic_tx_queues_alloc()
756 wq->ring.base_addr = paddrs[q * ntxqs + 0]; in enic_tx_queues_alloc()
759 cq->vdev = softc->enic.vdev; in enic_tx_queues_alloc()
760 cq->index = cq_wq; in enic_tx_queues_alloc()
761 cq->ctrl = vnic_dev_get_res(softc->enic.vdev, in enic_tx_queues_alloc()
762 RES_TYPE_CQ, cq->index); in enic_tx_queues_alloc()
763 cq->ring.desc_size = sizeof(struct cq_enet_wq_desc); in enic_tx_queues_alloc()
764 cq->ring.desc_count = softc->scctx->isc_ntxd[q]; in enic_tx_queues_alloc()
765 cq->ring.desc_avail = cq->ring.desc_count - 1; in enic_tx_queues_alloc()
767 cq->ring.descs = vaddrs[q * ntxqs + 1]; in enic_tx_queues_alloc()
768 cq->ring.base_addr = paddrs[q * ntxqs + 1]; in enic_tx_queues_alloc()
788 softc->enic.rq = malloc(sizeof(struct vnic_rq) * nrxqsets, M_DEVBUF, in enic_rx_queues_alloc()
790 if (softc->enic.rq == NULL) in enic_rx_queues_alloc()
809 rq = &softc->enic.rq[q]; in enic_rx_queues_alloc()
810 cq_rq = enic_cq_rq(&softc->enic, q); in enic_rx_queues_alloc()
811 cq = &softc->enic.cq[cq_rq]; in enic_rx_queues_alloc()
814 cq->vdev = softc->enic.vdev; in enic_rx_queues_alloc()
815 cq->index = cq_rq; in enic_rx_queues_alloc()
816 cq->ctrl = vnic_dev_get_res(softc->enic.vdev, RES_TYPE_CQ, in enic_rx_queues_alloc()
817 cq->index); in enic_rx_queues_alloc()
818 cq->ring.desc_size = sizeof(struct cq_enet_wq_desc); in enic_rx_queues_alloc()
819 cq->ring.desc_count = softc->scctx->isc_nrxd[1]; in enic_rx_queues_alloc()
820 cq->ring.desc_avail = cq->ring.desc_count - 1; in enic_rx_queues_alloc()
822 cq->ring.descs = vaddrs[q * nrxqs + 0]; in enic_rx_queues_alloc()
823 cq->ring.base_addr = paddrs[q * nrxqs + 0]; in enic_rx_queues_alloc()
826 rq->vdev = softc->enic.vdev; in enic_rx_queues_alloc()
828 rq->index = q; in enic_rx_queues_alloc()
829 rq->ctrl = vnic_dev_get_res(softc->enic.vdev, in enic_rx_queues_alloc()
830 RES_TYPE_RQ, rq->index); in enic_rx_queues_alloc()
833 rq->ring.desc_size = sizeof(struct rq_enet_desc); in enic_rx_queues_alloc()
834 rq->ring.desc_count = softc->scctx->isc_nrxd[0]; in enic_rx_queues_alloc()
835 rq->ring.desc_avail = rq->ring.desc_count - 1; in enic_rx_queues_alloc()
837 rq->ring.descs = vaddrs[q * nrxqs + 1]; in enic_rx_queues_alloc()
838 rq->ring.base_addr = paddrs[q * nrxqs + 1]; in enic_rx_queues_alloc()
839 rq->need_initial_post = true; in enic_rx_queues_alloc()
853 free(softc->enic.rq, M_DEVBUF); in enic_queues_free()
854 free(softc->enic.wq, M_DEVBUF); in enic_queues_free()
855 free(softc->enic.cq, M_DEVBUF); in enic_queues_free()
865 ifp = iflib_get_ifp(rq->vdev->softc->ctx); in enic_rxq_intr()
880 enic = &softc->enic; in enic_event_intr()
882 mtu = vnic_dev_mtu(enic->vdev); in enic_event_intr()
883 if (mtu && mtu != enic->port_mtu) { in enic_event_intr()
884 enic->port_mtu = mtu; in enic_event_intr()
899 enic_stop(softc->ctx); in enic_err_intr()
900 enic_init(softc->ctx); in enic_err_intr()
919 scctx = softc->scctx; in enic_stop()
920 enic = &softc->enic; in enic_stop()
922 if (softc->stopped) in enic_stop()
924 softc->link_active = 0; in enic_stop()
925 softc->stopped = 1; in enic_stop()
929 for (index = 0; index < scctx->isc_ntxqsets; index++) { in enic_stop()
931 vnic_wq_clean(&enic->wq[index]); in enic_stop()
932 vnic_cq_clean(&enic->cq[enic_cq_rq(enic, index)]); in enic_stop()
934 wq = &softc->enic.wq[index]; in enic_stop()
935 wq->ring.desc_avail = wq->ring.desc_count - 1; in enic_stop()
936 wq->ring.last_count = wq->ring.desc_count; in enic_stop()
937 wq->head_idx = 0; in enic_stop()
938 wq->tail_idx = 0; in enic_stop()
940 cq_wq = enic_cq_wq(&softc->enic, index); in enic_stop()
941 cq = &softc->enic.cq[cq_wq]; in enic_stop()
942 cq->ring.desc_avail = cq->ring.desc_count - 1; in enic_stop()
945 for (index = 0; index < scctx->isc_nrxqsets; index++) { in enic_stop()
947 vnic_rq_clean(&enic->rq[index]); in enic_stop()
948 vnic_cq_clean(&enic->cq[enic_cq_wq(enic, index)]); in enic_stop()
950 rq = &softc->enic.rq[index]; in enic_stop()
951 cq_rq = enic_cq_rq(&softc->enic, index); in enic_stop()
952 cq = &softc->enic.cq[cq_rq]; in enic_stop()
954 cq->ring.desc_avail = cq->ring.desc_count - 1; in enic_stop()
955 rq->ring.desc_avail = rq->ring.desc_count - 1; in enic_stop()
956 rq->need_initial_post = true; in enic_stop()
959 for (index = 0; index < scctx->isc_vectors; index++) { in enic_stop()
960 vnic_intr_clean(&enic->intr[index]); in enic_stop()
973 scctx = softc->scctx; in enic_init()
974 enic = &softc->enic; in enic_init()
979 for (index = 0; index < scctx->isc_ntxqsets; index++) in enic_init()
980 enic_prep_wq_for_simple_tx(&softc->enic, index); in enic_init()
982 for (index = 0; index < scctx->isc_ntxqsets; index++) in enic_init()
985 for (index = 0; index < scctx->isc_nrxqsets; index++) in enic_init()
989 bcopy(if_getlladdr(softc->ifp), softc->lladdr, ETHER_ADDR_LEN); in enic_init()
993 vnic_dev_enable_wait(enic->vdev); in enic_init()
996 softc->stopped = 0; in enic_init()
1006 enic = &softc->enic; in enic_del_mcast()
1007 for (i=0; i < softc->mc_count; i++) { in enic_del_mcast()
1008 vnic_dev_del_addr(enic->vdev, &softc->mta[i * ETHER_ADDR_LEN]); in enic_del_mcast()
1010 softc->multicast = 0; in enic_del_mcast()
1011 softc->mc_count = 0; in enic_del_mcast()
1019 enic = &softc->enic; in enic_add_mcast()
1020 for (i=0; i < softc->mc_count; i++) { in enic_add_mcast()
1021 vnic_dev_add_addr(enic->vdev, &softc->mta[i * ETHER_ADDR_LEN]); in enic_add_mcast()
1023 softc->multicast = 1; in enic_add_mcast()
1050 count = if_foreach_llmaddr(ifp, enic_copy_maddr, softc->mta); in enic_multi_set()
1051 softc->mc_count = count; in enic_multi_set()
1056 softc->promisc = 1; in enic_multi_set()
1058 softc->promisc = 0; in enic_multi_set()
1061 softc->allmulti = 1; in enic_multi_set()
1063 softc->allmulti = 0; in enic_multi_set()
1065 enic_update_packet_filter(&softc->enic); in enic_multi_set()
1076 enic = &softc->enic; in enic_mtu_set()
1078 enic_stop(softc->ctx); in enic_mtu_set()
1079 if (mtu > enic->port_mtu){ in enic_mtu_set()
1083 enic->config.mtu = mtu; in enic_mtu_set()
1084 scctx->isc_max_frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; in enic_mtu_set()
1085 enic_init(softc->ctx); in enic_mtu_set()
1100 ifmr->ifm_status = IFM_AVALID; in enic_media_status()
1101 ifmr->ifm_active = IFM_ETHER; in enic_media_status()
1105 speed = vnic_dev_port_speed(&softc->vdev); in enic_media_status()
1108 LIST_FOREACH(next, &(iflib_get_media(ctx)->ifm_list), ifm_list) { in enic_media_status()
1109 if (ifmedia_baudrate(next->ifm_media) == target_baudrate) { in enic_media_status()
1110 ifmr->ifm_active |= next->ifm_media; in enic_media_status()
1114 ifmr->ifm_status |= IFM_ACTIVE; in enic_media_status()
1115 ifmr->ifm_active |= IFM_AUTO; in enic_media_status()
1117 ifmr->ifm_active |= IFM_NONE; in enic_media_status()
1136 softc->promisc = 1; in enic_promisc_set()
1138 softc->promisc = 0; in enic_promisc_set()
1141 softc->allmulti = 1; in enic_promisc_set()
1143 softc->allmulti = 0; in enic_promisc_set()
1145 enic_update_packet_filter(&softc->enic); in enic_promisc_set()
1179 enic = &softc->enic; in enic_txq_timer()
1182 ret = vnic_dev_stats_dump(enic->vdev, &stats); in enic_txq_timer()
1192 return (vnic_dev_link_status(&softc->vdev) == 1); in enic_link_is_up()
1202 ctx = softc->ctx; in enic_link_status()
1207 speed = vnic_dev_port_speed(&softc->vdev); in enic_link_status()
1210 if (link != 0 && softc->link_active == 0) { in enic_link_status()
1211 softc->link_active = 1; in enic_link_status()
1213 } else if (link == 0 && softc->link_active != 0) { in enic_link_status()
1214 softc->link_active = 0; in enic_link_status()
1223 enic = &softc->enic; in enic_set_lladdr()
1226 vnic_dev_add_addr(enic->vdev, softc->lladdr); in enic_set_lladdr()
1239 stats = wq[i].vdev->stats; in enic_setup_txq_sysctl()
1246 &stats->tx.tx_frames_ok, "TX Frames OK"); in enic_setup_txq_sysctl()
1248 &stats->tx.tx_unicast_frames_ok, "TX unicast frames OK"); in enic_setup_txq_sysctl()
1250 &stats->tx.tx_multicast_frames_ok, "TX multicast framse OK"); in enic_setup_txq_sysctl()
1252 &stats->tx.tx_broadcast_frames_ok, "TX Broadcast frames OK"); in enic_setup_txq_sysctl()
1254 &stats->tx.tx_bytes_ok, "TX bytes OK "); in enic_setup_txq_sysctl()
1256 &stats->tx.tx_unicast_bytes_ok, "TX unicast bytes OK"); in enic_setup_txq_sysctl()
1258 &stats->tx.tx_multicast_bytes_ok, "TX multicast bytes OK"); in enic_setup_txq_sysctl()
1260 &stats->tx.tx_broadcast_bytes_ok, "TX broadcast bytes OK"); in enic_setup_txq_sysctl()
1262 &stats->tx.tx_drops, "TX drops"); in enic_setup_txq_sysctl()
1264 &stats->tx.tx_errors, "TX errors"); in enic_setup_txq_sysctl()
1266 &stats->tx.tx_tso, "TX TSO"); in enic_setup_txq_sysctl()
1277 stats = rq[i].vdev->stats; in enic_setup_rxq_sysctl()
1284 &stats->rx.rx_frames_ok, "RX Frames OK"); in enic_setup_rxq_sysctl()
1286 &stats->rx.rx_frames_total, "RX frames total"); in enic_setup_rxq_sysctl()
1288 &stats->rx.rx_unicast_frames_ok, "RX unicast frames ok"); in enic_setup_rxq_sysctl()
1290 &stats->rx.rx_multicast_frames_ok, "RX multicast Frames ok"); in enic_setup_rxq_sysctl()
1292 &stats->rx.rx_broadcast_frames_ok, "RX broadcast frames ok"); in enic_setup_rxq_sysctl()
1294 &stats->rx.rx_bytes_ok, "RX bytes ok"); in enic_setup_rxq_sysctl()
1296 &stats->rx.rx_unicast_bytes_ok, "RX unicast bytes ok"); in enic_setup_rxq_sysctl()
1298 &stats->rx.rx_multicast_bytes_ok, "RX multicast bytes ok"); in enic_setup_rxq_sysctl()
1300 &stats->rx.rx_broadcast_bytes_ok, "RX broadcast bytes ok"); in enic_setup_rxq_sysctl()
1302 &stats->rx.rx_drop, "RX drop"); in enic_setup_rxq_sysctl()
1304 &stats->rx.rx_errors, "RX errors"); in enic_setup_rxq_sysctl()
1306 &stats->rx.rx_rss, "RX rss"); in enic_setup_rxq_sysctl()
1308 &stats->rx.rx_crc_errors, "RX crc errors"); in enic_setup_rxq_sysctl()
1310 &stats->rx.rx_frames_64, "RX frames 64"); in enic_setup_rxq_sysctl()
1312 &stats->rx.rx_frames_127, "RX frames 127"); in enic_setup_rxq_sysctl()
1314 &stats->rx.rx_frames_255, "RX frames 255"); in enic_setup_rxq_sysctl()
1316 &stats->rx.rx_frames_511, "RX frames 511"); in enic_setup_rxq_sysctl()
1318 &stats->rx.rx_frames_1023, "RX frames 1023"); in enic_setup_rxq_sysctl()
1320 &stats->rx.rx_frames_1518, "RX frames 1518"); in enic_setup_rxq_sysctl()
1322 &stats->rx.rx_frames_to_max, "RX frames to max"); in enic_setup_rxq_sysctl()
1329 enic_setup_txq_sysctl(softc->enic.wq, 0, ctx, child); in enic_setup_queue_sysctl()
1330 enic_setup_rxq_sysctl(softc->enic.rq, 0, ctx, child); in enic_setup_queue_sysctl()
1341 dev = softc->dev; in enic_setup_sysctl()
1352 struct enic *enic = &softc->enic; in enic_enable_intr()
1354 vnic_intr_unmask(&enic->intr[irq]); in enic_enable_intr()
1355 vnic_intr_return_all_credits(&enic->intr[irq]); in enic_enable_intr()
1361 struct enic *enic = &softc->enic; in enic_disable_intr()
1363 vnic_intr_mask(&enic->intr[irq]); in enic_disable_intr()
1364 vnic_intr_masked(&enic->intr[irq]); /* flush write */ in enic_disable_intr()
1374 scctx = softc->scctx; in enic_tx_queue_intr_enable()
1376 enic_enable_intr(softc, qid + scctx->isc_nrxqsets); in enic_tx_queue_intr_enable()
1400 scctx = softc->scctx; in enic_intr_enable_all()
1402 for (i = 0; i < scctx->isc_vectors; i++) { in enic_intr_enable_all()
1415 scctx = softc->scctx; in enic_intr_disable_all()
1422 for (i = 0; i < scctx->isc_vectors; i++) { in enic_intr_disable_all()
1433 err = enic_dev_wait(enic->vdev, vnic_dev_open, in enic_dev_open()
1447 vnic_dev_intr_coal_timer_info_default(enic->vdev); in enic_dev_init()
1462 enic->intr_queues = malloc(sizeof(*enic->intr_queues) * in enic_dev_init()
1463 enic->conf_intr_count, M_DEVBUF, M_NOWAIT | M_ZERO); in enic_dev_init()
1465 vnic_dev_set_reset_flag(enic->vdev, 0); in enic_dev_init()
1466 enic->max_flow_counter = -1; in enic_dev_init()
1469 vnic_dev_notify_set(enic->vdev, -1); /* No Intr for notify */ in enic_dev_init()
1471 enic->overlay_offload = false; in enic_dev_init()
1472 if (enic->disable_overlay && enic->vxlan) { in enic_dev_init()
1477 if (vnic_dev_overlay_offload_ctrl(enic->vdev, in enic_dev_init()
1484 if (!enic->disable_overlay && enic->vxlan && in enic_dev_init()
1486 vnic_dev_overlay_offload_ctrl(enic->vdev, in enic_dev_init()
1488 enic->overlay_offload = true; in enic_dev_init()
1489 enic->vxlan_port = ENIC_DEFAULT_VXLAN_PORT; in enic_dev_init()
1495 if (vnic_dev_overlay_offload_cfg(enic->vdev, in enic_dev_init()
1513 rz = iflib_dma_alloc(enic->softc->ctx, size, res, BUS_DMA_NOWAIT); in enic_alloc_consistent()
1520 vaddr = res->idi_vaddr; in enic_alloc_consistent()
1521 *dma_handle = res->idi_paddr; in enic_alloc_consistent()
1538 rc = enic_map_bar(softc, &softc->mem, 0, true); in enic_pci_mapping()
1542 rc = enic_map_bar(softc, &softc->io, 2, false); in enic_pci_mapping()
1550 if (softc->mem.res != NULL) in enic_pci_mapping_free()
1551 bus_release_resource(softc->dev, SYS_RES_MEMORY, in enic_pci_mapping_free()
1552 softc->mem.rid, softc->mem.res); in enic_pci_mapping_free()
1553 softc->mem.res = NULL; in enic_pci_mapping_free()
1555 if (softc->io.res != NULL) in enic_pci_mapping_free()
1556 bus_release_resource(softc->dev, SYS_RES_MEMORY, in enic_pci_mapping_free()
1557 softc->io.rid, softc->io.res); in enic_pci_mapping_free()
1558 softc->io.res = NULL; in enic_pci_mapping_free()
1591 if (bar->res != NULL) { in enic_map_bar()
1592 device_printf(softc->dev, "Bar %d already mapped\n", bar_num); in enic_map_bar()
1596 bar->rid = PCIR_BAR(bar_num); in enic_map_bar()
1601 if ((bar->res = bus_alloc_resource_any(softc->dev, in enic_map_bar()
1602 SYS_RES_MEMORY, &bar->rid, flag)) == NULL) { in enic_map_bar()
1603 device_printf(softc->dev, in enic_map_bar()
1607 bar->tag = rman_get_bustag(bar->res); in enic_map_bar()
1608 bar->handle = rman_get_bushandle(bar->res); in enic_map_bar()
1609 bar->size = rman_get_size(bar->res); in enic_map_bar()
1627 scctx = enic->softc->scctx; in enic_init_vnic_resources()
1633 txq_interrupt_offset = scctx->isc_nrxqsets; in enic_init_vnic_resources()
1635 for (index = 0; index < enic->intr_count; index++) { in enic_init_vnic_resources()
1636 vnic_intr_alloc(enic->vdev, &enic->intr[index], index); in enic_init_vnic_resources()
1639 for (index = 0; index < scctx->isc_nrxqsets; index++) { in enic_init_vnic_resources()
1642 vnic_rq_clean(&enic->rq[index]); in enic_init_vnic_resources()
1643 vnic_rq_init(&enic->rq[index], cq_idx, error_interrupt_enable, in enic_init_vnic_resources()
1646 vnic_cq_clean(&enic->cq[cq_idx]); in enic_init_vnic_resources()
1647 vnic_cq_init(&enic->cq[cq_idx], in enic_init_vnic_resources()
1662 for (index = 0; index < scctx->isc_ntxqsets; index++) { in enic_init_vnic_resources()
1664 vnic_wq_clean(&enic->wq[index]); in enic_init_vnic_resources()
1665 vnic_wq_init(&enic->wq[index], cq_idx, error_interrupt_enable, in enic_init_vnic_resources()
1668 enic->wq[index].tx_offload_notsup_mask = 0; in enic_init_vnic_resources()
1670 vnic_cq_clean(&enic->cq[cq_idx]); in enic_init_vnic_resources()
1671 vnic_cq_init(&enic->cq[cq_idx], in enic_init_vnic_resources()
1681 0 /* (u64)enic->wq[index].cqmsg_rz->iova */ ); in enic_init_vnic_resources()
1685 for (index = 0; index < enic->intr_count; index++) { in enic_init_vnic_resources()
1686 vnic_intr_init(&enic->intr[index], 125, in enic_init_vnic_resources()
1687 enic->config.intr_timer_type, /* mask_on_assertion */ 1); in enic_init_vnic_resources()
1694 struct enic_softc *softc = enic->softc; in enic_update_packet_filter()
1697 vnic_dev_packet_filter(enic->vdev, in enic_update_packet_filter()
1698 softc->directed, in enic_update_packet_filter()
1699 softc->multicast, in enic_update_packet_filter()
1700 softc->broadcast, in enic_update_packet_filter()
1701 softc->promisc, in enic_update_packet_filter()
1702 softc->allmulti); in enic_update_packet_filter()
1719 struct enic_softc *softc = enic->softc; in enic_setup_finish()
1722 softc->directed = 1; in enic_setup_finish()
1723 softc->multicast = 0; in enic_setup_finish()
1724 softc->broadcast = 1; in enic_setup_finish()
1725 softc->promisc = 0; in enic_setup_finish()
1726 softc->allmulti = 1; in enic_setup_finish()