Lines Matching +full:qemu +full:- +full:1 +full:- +full:setup
3 Copyright (c) 2001-2017, Intel Corporation
9 1. Redistributions of source code must retain the above copyright notice,
48 static const char ixv_driver_version[] = "2.0.1-k";
133 /* The MSI-X Interrupt handlers */
156 MODULE_DEPEND(ixv, iflib, 1, 1, 1);
157 MODULE_DEPEND(ixv, pci, 1, 1, 1);
158 MODULE_DEPEND(ixv, ether, 1, 1, 1);
218 .isc_rx_nsegments = 1,
220 .isc_nfl = 1,
221 .isc_ntxqs = 1,
222 .isc_nrxqs = 1,
223 .isc_admin_intrcnt = 1,
251 if_softc_ctx_t scctx = sc->shared; in ixv_if_tx_queues_alloc()
255 MPASS(sc->num_tx_queues == ntxqsets); in ixv_if_tx_queues_alloc()
256 MPASS(ntxqs == 1); in ixv_if_tx_queues_alloc()
259 sc->tx_queues = in ixv_if_tx_queues_alloc()
262 if (!sc->tx_queues) { in ixv_if_tx_queues_alloc()
268 for (i = 0, que = sc->tx_queues; i < ntxqsets; i++, que++) { in ixv_if_tx_queues_alloc()
269 struct tx_ring *txr = &que->txr; in ixv_if_tx_queues_alloc()
271 txr->me = i; in ixv_if_tx_queues_alloc()
272 txr->sc = que->sc = sc; in ixv_if_tx_queues_alloc()
275 if (!(txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * in ixv_if_tx_queues_alloc()
276 scctx->isc_ntxd[0], M_DEVBUF, M_NOWAIT | M_ZERO))) { in ixv_if_tx_queues_alloc()
280 for (j = 0; j < scctx->isc_ntxd[0]; j++) in ixv_if_tx_queues_alloc()
281 txr->tx_rsq[j] = QIDX_INVALID; in ixv_if_tx_queues_alloc()
283 txr->tail = IXGBE_VFTDT(txr->me); in ixv_if_tx_queues_alloc()
284 txr->tx_base = (union ixgbe_adv_tx_desc *)vaddrs[i*ntxqs]; in ixv_if_tx_queues_alloc()
285 txr->tx_paddr = paddrs[i*ntxqs]; in ixv_if_tx_queues_alloc()
287 txr->bytes = 0; in ixv_if_tx_queues_alloc()
288 txr->total_packets = 0; in ixv_if_tx_queues_alloc()
293 sc->num_tx_queues); in ixv_if_tx_queues_alloc()
314 MPASS(sc->num_rx_queues == nrxqsets); in ixv_if_rx_queues_alloc()
315 MPASS(nrxqs == 1); in ixv_if_rx_queues_alloc()
318 sc->rx_queues = in ixv_if_rx_queues_alloc()
321 if (!sc->rx_queues) { in ixv_if_rx_queues_alloc()
328 for (i = 0, que = sc->rx_queues; i < nrxqsets; i++, que++) { in ixv_if_rx_queues_alloc()
329 struct rx_ring *rxr = &que->rxr; in ixv_if_rx_queues_alloc()
330 rxr->me = i; in ixv_if_rx_queues_alloc()
331 rxr->sc = que->sc = sc; in ixv_if_rx_queues_alloc()
335 rxr->tail = IXGBE_VFRDT(rxr->me); in ixv_if_rx_queues_alloc()
336 rxr->rx_base = (union ixgbe_adv_rx_desc *)vaddrs[i]; in ixv_if_rx_queues_alloc()
337 rxr->rx_paddr = paddrs[i*nrxqs]; in ixv_if_rx_queues_alloc()
338 rxr->bytes = 0; in ixv_if_rx_queues_alloc()
339 rxr->que = que; in ixv_if_rx_queues_alloc()
343 sc->num_rx_queues); in ixv_if_rx_queues_alloc()
360 struct ix_tx_queue *que = sc->tx_queues; in ixv_if_queues_free()
366 for (i = 0; i < sc->num_tx_queues; i++, que++) { in ixv_if_queues_free()
367 struct tx_ring *txr = &que->txr; in ixv_if_queues_free()
368 if (txr->tx_rsq == NULL) in ixv_if_queues_free()
371 free(txr->tx_rsq, M_DEVBUF); in ixv_if_queues_free()
372 txr->tx_rsq = NULL; in ixv_if_queues_free()
374 if (sc->tx_queues != NULL) in ixv_if_queues_free()
375 free(sc->tx_queues, M_DEVBUF); in ixv_if_queues_free()
377 if (sc->rx_queues != NULL) in ixv_if_queues_free()
378 free(sc->rx_queues, M_DEVBUF); in ixv_if_queues_free()
379 sc->tx_queues = NULL; in ixv_if_queues_free()
380 sc->rx_queues = NULL; in ixv_if_queues_free()
384 * ixv_if_attach_pre - Device initialization routine
406 sc->dev = dev; in ixv_if_attach_pre()
407 sc->ctx = ctx; in ixv_if_attach_pre()
408 sc->hw.back = sc; in ixv_if_attach_pre()
409 scctx = sc->shared = iflib_get_softc_ctx(ctx); in ixv_if_attach_pre()
410 sc->media = iflib_get_media(ctx); in ixv_if_attach_pre()
411 hw = &sc->hw; in ixv_if_attach_pre()
413 /* Do base PCI setup - map BAR0 */ in ixv_if_attach_pre()
438 /* Setup the mailbox */ in ixv_if_attach_pre()
441 error = hw->mac.ops.reset_hw(hw); in ixv_if_attach_pre()
452 error = hw->mac.ops.init_hw(hw); in ixv_if_attach_pre()
469 error = hw->mac.ops.get_link_state(hw, &sc->link_enabled); in ixv_if_attach_pre()
472 sc->link_enabled = true; in ixv_if_attach_pre()
476 if (!ixv_check_ether_addr(hw->mac.addr)) { in ixv_if_attach_pre()
478 (struct ether_addr *)hw->mac.addr); in ixv_if_attach_pre()
479 bcopy(hw->mac.addr, hw->mac.perm_addr, in ixv_if_attach_pre()
480 sizeof(hw->mac.perm_addr)); in ixv_if_attach_pre()
485 iflib_set_mac(ctx, hw->mac.addr); in ixv_if_attach_pre()
486 switch (sc->hw.mac.type) { in ixv_if_attach_pre()
490 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 2; in ixv_if_attach_pre()
493 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 1; in ixv_if_attach_pre()
495 scctx->isc_txqsizes[0] = in ixv_if_attach_pre()
496 roundup2(scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc) + in ixv_if_attach_pre()
498 scctx->isc_rxqsizes[0] = in ixv_if_attach_pre()
499 roundup2(scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc), in ixv_if_attach_pre()
502 scctx->isc_tx_csum_flags = CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_TSO | in ixv_if_attach_pre()
504 scctx->isc_tx_nsegments = IXGBE_82599_SCATTER; in ixv_if_attach_pre()
505 scctx->isc_msix_bar = pci_msix_table_bar(dev); in ixv_if_attach_pre()
506 scctx->isc_tx_tso_segments_max = scctx->isc_tx_nsegments; in ixv_if_attach_pre()
507 scctx->isc_tx_tso_size_max = IXGBE_TSO_SIZE; in ixv_if_attach_pre()
508 scctx->isc_tx_tso_segsize_max = PAGE_SIZE; in ixv_if_attach_pre()
510 scctx->isc_txrx = &ixgbe_txrx; in ixv_if_attach_pre()
515 * Wake-on-LAN in ixv_if_attach_pre()
517 scctx->isc_capabilities = IXGBE_CAPS; in ixv_if_attach_pre()
518 scctx->isc_capabilities ^= IFCAP_WOL; in ixv_if_attach_pre()
519 scctx->isc_capenable = scctx->isc_capabilities; in ixv_if_attach_pre()
538 /* Setup OS specific network interface */ in ixv_if_attach_post()
541 device_printf(dev, "Interface setup failed: %d\n", error); in ixv_if_attach_post()
545 /* Do the stats setup */ in ixv_if_attach_post()
555 * ixv_detach - Device removal routine
584 if (mtu > IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR) { in ixv_if_mtu_set()
588 sc->max_frame_size = if_getmtu(ifp) + IXGBE_MTU_HDR; in ixv_if_mtu_set()
595 * ixv_if_init - Init entry point
610 struct ixgbe_hw *hw = &sc->hw; in ixv_if_init()
614 hw->adapter_stopped = false; in ixv_if_init()
615 hw->mac.ops.stop_adapter(hw); in ixv_if_init()
618 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); in ixv_if_init()
621 bcopy(if_getlladdr(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS); in ixv_if_init()
622 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1); in ixv_if_init()
625 hw->mac.ops.reset_hw(hw); in ixv_if_init()
626 hw->mac.ops.start_hw(hw); in ixv_if_init()
636 /* Setup Multicast table */ in ixv_if_init()
639 sc->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx); in ixv_if_init()
647 /* Set up MSI-X routing */ in ixv_if_init()
650 /* Set up auto-mask */ in ixv_if_init()
654 IXGBE_WRITE_REG(hw, IXGBE_VTEITR(sc->vector), IXGBE_LINK_ITR); in ixv_if_init()
660 error = hw->mac.ops.get_link_state(hw, &sc->link_enabled); in ixv_if_init()
663 sc->link_enabled = true; in ixv_if_init()
664 } else if (sc->link_enabled == false) in ixv_if_init()
667 hw->mac.ops.check_link(hw, &sc->link_speed, &sc->link_up, in ixv_if_init()
682 struct ixgbe_hw *hw = &sc->hw; in ixv_enable_queue()
683 u32 queue = 1 << vector; in ixv_enable_queue()
696 struct ixgbe_hw *hw = &sc->hw; in ixv_disable_queue()
697 u64 queue = (u64)(1 << vector); in ixv_disable_queue()
706 * ixv_msix_que - MSI-X Queue Interrupt Service routine
712 struct ixgbe_softc *sc = que->sc; in ixv_msix_que()
714 ixv_disable_queue(sc, que->msix); in ixv_msix_que()
715 ++que->irqs; in ixv_msix_que()
727 struct ixgbe_hw *hw = &sc->hw; in ixv_msix_mbx()
730 ++sc->link_irq; in ixv_msix_mbx()
739 iflib_admin_intr_deferred(sc->ctx); in ixv_msix_mbx()
747 * ixv_media_status - Media Ioctl callback
761 ifmr->ifm_status = IFM_AVALID; in ixv_if_media_status()
762 ifmr->ifm_active = IFM_ETHER; in ixv_if_media_status()
764 if (!sc->link_active) in ixv_if_media_status()
767 ifmr->ifm_status |= IFM_ACTIVE; in ixv_if_media_status()
769 switch (sc->link_speed) { in ixv_if_media_status()
771 ifmr->ifm_active |= IFM_1000_T | IFM_FDX; in ixv_if_media_status()
774 ifmr->ifm_active |= IFM_10G_T | IFM_FDX; in ixv_if_media_status()
777 ifmr->ifm_active |= IFM_100_TX | IFM_FDX; in ixv_if_media_status()
780 ifmr->ifm_active |= IFM_10_T | IFM_FDX; in ixv_if_media_status()
786 * ixv_if_media_change - Media Ioctl callback
799 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) in ixv_if_media_change()
802 switch (IFM_SUBTYPE(ifm->ifm_media)) { in ixv_if_media_change()
806 device_printf(sc->dev, "Only auto media type\n"); in ixv_if_media_change()
823 struct ixgbe_hw *hw = &sc->hw; in ixv_negotiate_api()
853 * ixv_if_multi_set - Multicast Update
872 sc->hw.mac.ops.update_mc_addr_list(&sc->hw, update_ptr, mcnt, in ixv_if_multi_set()
898 * ixv_if_local_timer - Timer routine
914 * ixv_if_update_admin_status - Update OS on link state
927 sc->hw.mac.get_link_status = true; in ixv_if_update_admin_status()
929 status = ixgbe_check_link(&sc->hw, &sc->link_speed, in ixv_if_update_admin_status()
930 &sc->link_up, false); in ixv_if_update_admin_status()
932 if (status != IXGBE_SUCCESS && sc->hw.adapter_stopped == false) { in ixv_if_update_admin_status()
938 if (sc->link_up && sc->link_enabled) { in ixv_if_update_admin_status()
939 if (sc->link_active == false) { in ixv_if_update_admin_status()
942 ((sc->link_speed == 128) ? 10 : 1), in ixv_if_update_admin_status()
944 sc->link_active = true; in ixv_if_update_admin_status()
946 ixgbe_link_speed_to_baudrate(sc->link_speed)); in ixv_if_update_admin_status()
949 if (sc->link_active == true) { in ixv_if_update_admin_status()
953 sc->link_active = false; in ixv_if_update_admin_status()
963 * ixv_if_stop - Stop the hardware
972 struct ixgbe_hw *hw = &sc->hw; in ixv_if_stop()
978 hw->mac.ops.reset_hw(hw); in ixv_if_stop()
979 sc->hw.adapter_stopped = false; in ixv_if_stop()
980 hw->mac.ops.stop_adapter(hw); in ixv_if_stop()
983 sc->link_up = false; in ixv_if_stop()
987 hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); in ixv_if_stop()
992 * ixv_identify_hardware - Determine hardware revision.
999 struct ixgbe_hw *hw = &sc->hw; in ixv_identify_hardware()
1002 hw->vendor_id = pci_get_vendor(dev); in ixv_identify_hardware()
1003 hw->device_id = pci_get_device(dev); in ixv_identify_hardware()
1004 hw->revision_id = pci_get_revid(dev); in ixv_identify_hardware()
1005 hw->subsystem_vendor_id = pci_get_subvendor(dev); in ixv_identify_hardware()
1006 hw->subsystem_device_id = pci_get_subdevice(dev); in ixv_identify_hardware()
1009 switch (hw->device_id) { in ixv_identify_hardware()
1011 hw->mac.type = ixgbe_mac_82599_vf; in ixv_identify_hardware()
1014 hw->mac.type = ixgbe_mac_X540_vf; in ixv_identify_hardware()
1017 hw->mac.type = ixgbe_mac_X550_vf; in ixv_identify_hardware()
1020 hw->mac.type = ixgbe_mac_X550EM_x_vf; in ixv_identify_hardware()
1023 hw->mac.type = ixgbe_mac_X550EM_a_vf; in ixv_identify_hardware()
1026 hw->mac.type = ixgbe_mac_E610_vf; in ixv_identify_hardware()
1030 hw->mac.type = ixgbe_mac_unknown; in ixv_identify_hardware()
1036 * ixv_if_msix_intr_assign - Setup MSI-X Interrupt resources and handlers
1043 struct ix_rx_queue *rx_que = sc->rx_queues; in ixv_if_msix_intr_assign()
1048 for (int i = 0; i < sc->num_rx_queues; i++, vector++, rx_que++) { in ixv_if_msix_intr_assign()
1049 rid = vector + 1; in ixv_if_msix_intr_assign()
1052 error = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid, in ixv_if_msix_intr_assign()
1053 IFLIB_INTR_RXTX, ixv_msix_que, rx_que, rx_que->rxr.me, in ixv_if_msix_intr_assign()
1060 sc->num_rx_queues = i + 1; in ixv_if_msix_intr_assign()
1064 rx_que->msix = vector; in ixv_if_msix_intr_assign()
1067 for (int i = 0; i < sc->num_tx_queues; i++) { in ixv_if_msix_intr_assign()
1069 tx_que = &sc->tx_queues[i]; in ixv_if_msix_intr_assign()
1070 tx_que->msix = i % sc->num_rx_queues; in ixv_if_msix_intr_assign()
1072 &sc->rx_queues[tx_que->msix].que_irq, in ixv_if_msix_intr_assign()
1073 IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf); in ixv_if_msix_intr_assign()
1075 rid = vector + 1; in ixv_if_msix_intr_assign()
1076 error = iflib_irq_alloc_generic(ctx, &sc->irq, rid, in ixv_if_msix_intr_assign()
1084 sc->vector = vector; in ixv_if_msix_intr_assign()
1086 * Due to a broken design QEMU will fail to properly in ixv_if_msix_intr_assign()
1092 if (sc->hw.mac.type == ixgbe_mac_82599_vf) { in ixv_if_msix_intr_assign()
1108 iflib_irq_free(ctx, &sc->irq); in ixv_if_msix_intr_assign()
1109 rx_que = sc->rx_queues; in ixv_if_msix_intr_assign()
1110 for (int i = 0; i < sc->num_rx_queues; i++, rx_que++) in ixv_if_msix_intr_assign()
1111 iflib_irq_free(ctx, &rx_que->que_irq); in ixv_if_msix_intr_assign()
1127 sc->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in ixv_allocate_pci_resources()
1130 if (!(sc->pci_mem)) { in ixv_allocate_pci_resources()
1136 sc->osdep.mem_bus_space_tag = rman_get_bustag(sc->pci_mem); in ixv_allocate_pci_resources()
1137 sc->osdep.mem_bus_space_handle = rman_get_bushandle(sc->pci_mem); in ixv_allocate_pci_resources()
1138 sc->hw.hw_addr = (u8 *)&sc->osdep.mem_bus_space_handle; in ixv_allocate_pci_resources()
1150 struct ix_rx_queue *que = sc->rx_queues; in ixv_free_pci_resources()
1153 /* Release all MSI-X queue resources */ in ixv_free_pci_resources()
1154 if (sc->intr_type == IFLIB_INTR_MSIX) in ixv_free_pci_resources()
1155 iflib_irq_free(ctx, &sc->irq); in ixv_free_pci_resources()
1158 for (int i = 0; i < sc->num_rx_queues; i++, que++) { in ixv_free_pci_resources()
1159 iflib_irq_free(ctx, &que->que_irq); in ixv_free_pci_resources()
1163 if (sc->pci_mem != NULL) in ixv_free_pci_resources()
1165 rman_get_rid(sc->pci_mem), sc->pci_mem); in ixv_free_pci_resources()
1171 * Setup networking device structure and register an interface.
1177 if_softc_ctx_t scctx = sc->shared; in ixv_setup_interface()
1183 if_setsendqlen(ifp, scctx->isc_ntxd[0] - 2); in ixv_setup_interface()
1186 sc->max_frame_size = if_getmtu(ifp) + IXGBE_MTU_HDR; in ixv_setup_interface()
1187 ifmedia_add(sc->media, IFM_ETHER | IFM_AUTO, 0, NULL); in ixv_setup_interface()
1188 ifmedia_set(sc->media, IFM_ETHER | IFM_AUTO); in ixv_setup_interface()
1204 return (sc->ipackets); in ixv_if_get_counter()
1206 return (sc->opackets); in ixv_if_get_counter()
1208 return (sc->ibytes); in ixv_if_get_counter()
1210 return (sc->obytes); in ixv_if_get_counter()
1212 return (sc->imcasts); in ixv_if_get_counter()
1218 /* ixv_if_needs_restart - Tell iflib when the driver needs to be reinitialized
1238 * ixv_initialize_transmit_units - Enable transmit unit.
1244 struct ixgbe_hw *hw = &sc->hw; in ixv_initialize_transmit_units()
1245 if_softc_ctx_t scctx = sc->shared; in ixv_initialize_transmit_units()
1246 struct ix_tx_queue *que = sc->tx_queues; in ixv_initialize_transmit_units()
1249 for (i = 0; i < sc->num_tx_queues; i++, que++) { in ixv_initialize_transmit_units()
1250 struct tx_ring *txr = &que->txr; in ixv_initialize_transmit_units()
1251 u64 tdba = txr->tx_paddr; in ixv_initialize_transmit_units()
1253 int j = txr->me; in ixv_initialize_transmit_units()
1261 IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTDH(j), 0); in ixv_initialize_transmit_units()
1262 IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTDT(j), 0); in ixv_initialize_transmit_units()
1265 txr->tail = IXGBE_VFTDT(j); in ixv_initialize_transmit_units()
1267 txr->tx_rs_cidx = txr->tx_rs_pidx; in ixv_initialize_transmit_units()
1270 * off-by-one error when calculating how many descriptors are in ixv_initialize_transmit_units()
1273 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1; in ixv_initialize_transmit_units()
1274 for (int k = 0; k < scctx->isc_ntxd[0]; k++) in ixv_initialize_transmit_units()
1275 txr->tx_rsq[k] = QIDX_INVALID; in ixv_initialize_transmit_units()
1282 scctx->isc_ntxd[0] * sizeof(struct ixgbe_legacy_tx_desc)); in ixv_initialize_transmit_units()
1302 struct ixgbe_hw *hw = &sc->hw; in ixv_initialize_rss_mapping()
1308 if (sc->feat_en & IXGBE_FEATURE_RSS) { in ixv_initialize_rss_mapping()
1322 if (j == sc->num_rx_queues) in ixv_initialize_rss_mapping()
1325 if (sc->feat_en & IXGBE_FEATURE_RSS) { in ixv_initialize_rss_mapping()
1332 queue_id = queue_id % sc->num_rx_queues; in ixv_initialize_rss_mapping()
1338 * The next 8 bits are for hash value (n+1), etc. in ixv_initialize_rss_mapping()
1349 if (sc->feat_en & IXGBE_FEATURE_RSS) in ixv_initialize_rss_mapping()
1353 * Disable UDP - IP fragments aren't currently being handled in ixv_initialize_rss_mapping()
1354 * and so we end up with a mix of 2-tuple and 4-tuple in ixv_initialize_rss_mapping()
1373 device_printf(sc->dev, in ixv_initialize_rss_mapping()
1377 device_printf(sc->dev, in ixv_initialize_rss_mapping()
1385 device_printf(sc->dev, in ixv_initialize_rss_mapping()
1391 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
1393 * ixv_initialize_receive_units - Setup receive registers and features.
1400 struct ixgbe_hw *hw = &sc->hw; in ixv_initialize_receive_units()
1404 struct ix_rx_queue *que = sc->rx_queues; in ixv_initialize_receive_units()
1407 bufsz = (sc->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >> in ixv_initialize_receive_units()
1416 if (sc->num_rx_queues > 1) in ixv_initialize_receive_units()
1417 psrtype |= 1 << 29; in ixv_initialize_receive_units()
1422 if (ixgbevf_rlpml_set_vf(hw, sc->max_frame_size) != 0) { in ixv_initialize_receive_units()
1423 device_printf(sc->dev, in ixv_initialize_receive_units()
1424 "There is a problem with the PF setup. It is likely the" in ixv_initialize_receive_units()
1428 scctx = sc->shared; in ixv_initialize_receive_units()
1430 for (int i = 0; i < sc->num_rx_queues; i++, que++) { in ixv_initialize_receive_units()
1431 struct rx_ring *rxr = &que->rxr; in ixv_initialize_receive_units()
1432 u64 rdba = rxr->rx_paddr; in ixv_initialize_receive_units()
1434 int j = rxr->me; in ixv_initialize_receive_units()
1443 msec_delay(1); in ixv_initialize_receive_units()
1448 /* Setup the Base and Length of the Rx Descriptor Ring */ in ixv_initialize_receive_units()
1453 scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc)); in ixv_initialize_receive_units()
1456 IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0); in ixv_initialize_receive_units()
1457 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0); in ixv_initialize_receive_units()
1468 rxr->tail = IXGBE_VFRDT(rxr->me); in ixv_initialize_receive_units()
1477 msec_delay(1); in ixv_initialize_receive_units()
1497 * so RDT = num_rx_desc - 1 means the whole ring is available. in ixv_initialize_receive_units()
1501 struct netmap_kring *kring = na->rx_rings[j]; in ixv_initialize_receive_units()
1502 int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring); in ixv_initialize_receive_units()
1504 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t); in ixv_initialize_receive_units()
1507 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), in ixv_initialize_receive_units()
1508 scctx->isc_nrxd[0] - 1); in ixv_initialize_receive_units()
1515 if (sc->hw.mac.type >= ixgbe_mac_X550_vf) in ixv_initialize_receive_units()
1527 struct ixgbe_hw *hw = &sc->hw; in ixv_setup_vlan_support()
1536 if (sc->num_vlans == 0) in ixv_setup_vlan_support()
1541 for (int i = 0; i < sc->num_rx_queues; i++) { in ixv_setup_vlan_support()
1549 sc->rx_queues[i].rxr.vtag_strip = true; in ixv_setup_vlan_support()
1565 if (sc->shadow_vfta[i] == 0) in ixv_setup_vlan_support()
1567 vfta = sc->shadow_vfta[i]; in ixv_setup_vlan_support()
1575 if ((vfta & (1 << j)) == 0) in ixv_setup_vlan_support()
1579 while (hw->mac.ops.set_vfta(hw, vid, 0, true, false)) { in ixv_setup_vlan_support()
1603 sc->shadow_vfta[index] |= (1 << bit); in ixv_if_register_vlan()
1604 ++sc->num_vlans; in ixv_if_register_vlan()
1621 sc->shadow_vfta[index] &= ~(1 << bit); in ixv_if_unregister_vlan()
1622 --sc->num_vlans; in ixv_if_unregister_vlan()
1632 struct ixgbe_hw *hw = &sc->hw; in ixv_if_enable_intr()
1633 struct ix_rx_queue *que = sc->rx_queues; in ixv_if_enable_intr()
1642 for (int i = 0; i < sc->num_rx_queues; i++, que++) in ixv_if_enable_intr()
1643 ixv_enable_queue(sc, que->msix); in ixv_if_enable_intr()
1655 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIAC, 0); in ixv_if_disable_intr()
1656 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIMC, ~0); in ixv_if_disable_intr()
1657 IXGBE_WRITE_FLUSH(&sc->hw); in ixv_if_disable_intr()
1667 struct ix_rx_queue *que = &sc->rx_queues[rxqid]; in ixv_if_rx_queue_intr_enable()
1669 ixv_enable_queue(sc, que->rxr.me); in ixv_if_rx_queue_intr_enable()
1677 * Setup the correct IVAR register for a particular MSI-X interrupt
1678 * - entry is the register array entry
1679 * - vector is the MSI-X vector for this queue
1680 * - type is RX/TX/MISC
1685 struct ixgbe_hw *hw = &sc->hw; in ixv_set_ivar()
1690 if (type == -1) { /* MISC IVAR */ in ixv_set_ivar()
1696 index = (16 * (entry & 1)) + (8 * type); in ixv_set_ivar()
1697 ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1)); in ixv_set_ivar()
1700 IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar); in ixv_set_ivar()
1710 struct ix_rx_queue *que = sc->rx_queues; in ixv_configure_ivars()
1712 MPASS(sc->num_rx_queues == sc->num_tx_queues); in ixv_configure_ivars()
1714 for (int i = 0; i < sc->num_rx_queues; i++, que++) { in ixv_configure_ivars()
1716 ixv_set_ivar(sc, i, que->msix, 0); in ixv_configure_ivars()
1718 ixv_set_ivar(sc, i, que->msix, 1); in ixv_configure_ivars()
1720 IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEITR(que->msix), in ixv_configure_ivars()
1725 ixv_set_ivar(sc, 1, sc->vector, -1); in ixv_configure_ivars()
1739 if (sc->stats.vf.vfgprc || sc->stats.vf.vfgptc) { in ixv_save_stats()
1740 sc->stats.vf.saved_reset_vfgprc += in ixv_save_stats()
1741 sc->stats.vf.vfgprc - sc->stats.vf.base_vfgprc; in ixv_save_stats()
1742 sc->stats.vf.saved_reset_vfgptc += in ixv_save_stats()
1743 sc->stats.vf.vfgptc - sc->stats.vf.base_vfgptc; in ixv_save_stats()
1744 sc->stats.vf.saved_reset_vfgorc += in ixv_save_stats()
1745 sc->stats.vf.vfgorc - sc->stats.vf.base_vfgorc; in ixv_save_stats()
1746 sc->stats.vf.saved_reset_vfgotc += in ixv_save_stats()
1747 sc->stats.vf.vfgotc - sc->stats.vf.base_vfgotc; in ixv_save_stats()
1748 sc->stats.vf.saved_reset_vfmprc += in ixv_save_stats()
1749 sc->stats.vf.vfmprc - sc->stats.vf.base_vfmprc; in ixv_save_stats()
1759 struct ixgbe_hw *hw = &sc->hw; in ixv_init_stats()
1761 sc->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC); in ixv_init_stats()
1762 sc->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB); in ixv_init_stats()
1763 sc->stats.vf.last_vfgorc |= in ixv_init_stats()
1766 sc->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC); in ixv_init_stats()
1767 sc->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB); in ixv_init_stats()
1768 sc->stats.vf.last_vfgotc |= in ixv_init_stats()
1771 sc->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC); in ixv_init_stats()
1773 sc->stats.vf.base_vfgprc = sc->stats.vf.last_vfgprc; in ixv_init_stats()
1774 sc->stats.vf.base_vfgorc = sc->stats.vf.last_vfgorc; in ixv_init_stats()
1775 sc->stats.vf.base_vfgptc = sc->stats.vf.last_vfgptc; in ixv_init_stats()
1776 sc->stats.vf.base_vfgotc = sc->stats.vf.last_vfgotc; in ixv_init_stats()
1777 sc->stats.vf.base_vfmprc = sc->stats.vf.last_vfmprc; in ixv_init_stats()
1803 * ixv_update_stats - Update the board statistics counters.
1808 struct ixgbe_hw *hw = &sc->hw; in ixv_update_stats()
1809 struct ixgbevf_hw_stats *stats = &sc->stats.vf; in ixv_update_stats()
1811 UPDATE_STAT_32(IXGBE_VFGPRC, sc->stats.vf.last_vfgprc, in ixv_update_stats()
1812 sc->stats.vf.vfgprc); in ixv_update_stats()
1813 UPDATE_STAT_32(IXGBE_VFGPTC, sc->stats.vf.last_vfgptc, in ixv_update_stats()
1814 sc->stats.vf.vfgptc); in ixv_update_stats()
1816 sc->stats.vf.last_vfgorc, sc->stats.vf.vfgorc); in ixv_update_stats()
1818 sc->stats.vf.last_vfgotc, sc->stats.vf.vfgotc); in ixv_update_stats()
1819 UPDATE_STAT_32(IXGBE_VFMPRC, sc->stats.vf.last_vfmprc, in ixv_update_stats()
1820 sc->stats.vf.vfmprc); in ixv_update_stats()
1823 IXGBE_SET_IPACKETS(sc, stats->vfgprc); in ixv_update_stats()
1824 IXGBE_SET_OPACKETS(sc, stats->vfgptc); in ixv_update_stats()
1825 IXGBE_SET_IBYTES(sc, stats->vfgorc); in ixv_update_stats()
1826 IXGBE_SET_OBYTES(sc, stats->vfgotc); in ixv_update_stats()
1827 IXGBE_SET_IMCASTS(sc, stats->vfmprc); in ixv_update_stats()
1831 * ixv_add_stats_sysctls - Add statistic sysctls for the VF.
1836 device_t dev = sc->dev; in ixv_add_stats_sysctls()
1837 struct ix_tx_queue *tx_que = sc->tx_queues; in ixv_add_stats_sysctls()
1838 struct ix_rx_queue *rx_que = sc->rx_queues; in ixv_add_stats_sysctls()
1842 struct ixgbevf_hw_stats *stats = &sc->stats.vf; in ixv_add_stats_sysctls()
1851 CTLFLAG_RD, &sc->watchdog_events, "Watchdog timeouts"); in ixv_add_stats_sysctls()
1853 CTLFLAG_RD, &sc->link_irq, "Link MSI-X IRQ Handled"); in ixv_add_stats_sysctls()
1855 for (int i = 0; i < sc->num_tx_queues; i++, tx_que++) { in ixv_add_stats_sysctls()
1856 struct tx_ring *txr = &tx_que->txr; in ixv_add_stats_sysctls()
1863 CTLFLAG_RD, &(txr->tso_tx), "TSO Packets"); in ixv_add_stats_sysctls()
1865 CTLFLAG_RD, &(txr->total_packets), "TX Packets"); in ixv_add_stats_sysctls()
1868 for (int i = 0; i < sc->num_rx_queues; i++, rx_que++) { in ixv_add_stats_sysctls()
1869 struct rx_ring *rxr = &rx_que->rxr; in ixv_add_stats_sysctls()
1876 CTLFLAG_RD, &(rx_que->irqs), "IRQs on queue"); in ixv_add_stats_sysctls()
1878 CTLFLAG_RD, &(rxr->rx_packets), "RX packets"); in ixv_add_stats_sysctls()
1880 CTLFLAG_RD, &(rxr->rx_bytes), "RX bytes"); in ixv_add_stats_sysctls()
1882 CTLFLAG_RD, &(rxr->rx_discarded), "Discarded RX packets"); in ixv_add_stats_sysctls()
1891 CTLFLAG_RD, &stats->vfgprc, "Good Packets Received"); in ixv_add_stats_sysctls()
1893 CTLFLAG_RD, &stats->vfgorc, "Good Octets Received"); in ixv_add_stats_sysctls()
1895 CTLFLAG_RD, &stats->vfmprc, "Multicast Packets Received"); in ixv_add_stats_sysctls()
1897 CTLFLAG_RD, &stats->vfgptc, "Good Packets Transmitted"); in ixv_add_stats_sysctls()
1899 CTLFLAG_RD, &stats->vfgotc, "Good Octets Transmitted"); in ixv_add_stats_sysctls()
1912 device_t dev = sc->dev; in ixv_print_debug_info()
1913 struct ixgbe_hw *hw = &sc->hw; in ixv_print_debug_info()
1918 device_printf(dev, "MBX IRQ Handled: %lu\n", (long)sc->link_irq); in ixv_print_debug_info()
1930 result = -1; in ixv_sysctl_debug()
1933 if (error || !req->newptr) in ixv_sysctl_debug()
1936 if (result == 1) { in ixv_sysctl_debug()
1950 sc->feat_cap = IXGBE_FEATURE_NETMAP | in ixv_init_device_features()
1955 switch (sc->hw.mac.type) { in ixv_init_device_features()
1964 sc->feat_cap |= IXGBE_FEATURE_NEEDS_CTXD; in ixv_init_device_features()
1965 sc->feat_cap |= IXGBE_FEATURE_RSS; in ixv_init_device_features()
1973 if (sc->feat_cap & IXGBE_FEATURE_VF) in ixv_init_device_features()
1974 sc->feat_en |= IXGBE_FEATURE_VF; in ixv_init_device_features()
1976 if (sc->feat_cap & IXGBE_FEATURE_NETMAP) in ixv_init_device_features()
1977 sc->feat_en |= IXGBE_FEATURE_NETMAP; in ixv_init_device_features()
1978 /* Receive-Side Scaling (RSS) */ in ixv_init_device_features()
1979 if (sc->feat_cap & IXGBE_FEATURE_RSS) in ixv_init_device_features()
1980 sc->feat_en |= IXGBE_FEATURE_RSS; in ixv_init_device_features()
1982 if (sc->feat_cap & IXGBE_FEATURE_NEEDS_CTXD) in ixv_init_device_features()
1983 sc->feat_en |= IXGBE_FEATURE_NEEDS_CTXD; in ixv_init_device_features()