Lines Matching +full:num +full:- +full:rx +full:- +full:queues
3 Copyright (c) 2013-2018, Intel Corporation
91 device_t dev = pf->dev; in ixl_initialize_sriov()
92 struct i40e_hw *hw = &pf->hw; in ixl_initialize_sriov()
98 pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL); in ixl_initialize_sriov()
99 pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof", in ixl_initialize_sriov()
101 pci_iov_schema_add_bool(vf_schema, "allow-set-mac", in ixl_initialize_sriov()
103 pci_iov_schema_add_bool(vf_schema, "allow-promisc", in ixl_initialize_sriov()
105 pci_iov_schema_add_uint16(vf_schema, "num-queues", in ixl_initialize_sriov()
107 max(1, min(hw->func_caps.num_msix_vectors_vf - 1, IAVF_MAX_QUEUES))); in ixl_initialize_sriov()
112 "Failed to initialize SR-IOV (error=%d)\n", in ixl_initialize_sriov()
115 device_printf(dev, "SR-IOV ready\n"); in ixl_initialize_sriov()
117 pf->vc_debug_lvl = 1; in ixl_initialize_sriov()
132 hw = &pf->hw; in ixl_vf_alloc_vsi()
133 dev = pf->dev; in ixl_vf_alloc_vsi()
135 vsi_ctx.pf_num = hw->pf_id; in ixl_vf_alloc_vsi()
136 vsi_ctx.uplink_seid = pf->veb_seid; in ixl_vf_alloc_vsi()
138 vsi_ctx.vf_num = hw->func_caps.vf_base_id + vf->vf_num; in ixl_vf_alloc_vsi()
144 if (pf->enable_vf_loopback) in ixl_vf_alloc_vsi()
150 if (vf->vf_flags & VF_FLAG_MAC_ANTI_SPOOF) in ixl_vf_alloc_vsi()
162 for (i = 0; i < vf->qtag.num_active; i++) in ixl_vf_alloc_vsi()
163 vsi_ctx.info.queue_mapping[i] = vf->qtag.qidx[i]; in ixl_vf_alloc_vsi()
169 ((fls(vf->qtag.num_allocated) - 1) << I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT)); in ixl_vf_alloc_vsi()
173 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status)); in ixl_vf_alloc_vsi()
174 vf->vsi.seid = vsi_ctx.seid; in ixl_vf_alloc_vsi()
175 vf->vsi.vsi_num = vsi_ctx.vsi_number; in ixl_vf_alloc_vsi()
176 vf->vsi.num_rx_queues = vf->qtag.num_active; in ixl_vf_alloc_vsi()
177 vf->vsi.num_tx_queues = vf->qtag.num_active; in ixl_vf_alloc_vsi()
181 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status)); in ixl_vf_alloc_vsi()
183 code = i40e_aq_config_vsi_bw_limit(hw, vf->vsi.seid, 0, 0, NULL); in ixl_vf_alloc_vsi()
186 ixl_adminq_err_to_errno(hw->aq.asq_last_status)); in ixl_vf_alloc_vsi()
187 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status)); in ixl_vf_alloc_vsi()
190 memcpy(&vf->vsi.info, &vsi_ctx.info, sizeof(vf->vsi.info)); in ixl_vf_alloc_vsi()
200 hw = &pf->hw; in ixl_vf_setup_vsi()
201 vf->vsi.flags |= IXL_FLAGS_IS_VF; in ixl_vf_setup_vsi()
207 vf->vsi.dev = pf->dev; in ixl_vf_setup_vsi()
209 ixl_init_filters(&vf->vsi); in ixl_vf_setup_vsi()
211 error = i40e_aq_set_vsi_broadcast(hw, vf->vsi.seid, TRUE, NULL); in ixl_vf_setup_vsi()
213 device_printf(pf->dev, "Error configuring VF VSI for broadcast promiscuous\n"); in ixl_vf_setup_vsi()
214 /* Re-add VF's MAC/VLAN filters to its VSI */ in ixl_vf_setup_vsi()
215 ixl_reconfigure_filters(&vf->vsi); in ixl_vf_setup_vsi()
228 * Two queues are mapped in a single register, so we have to do some in ixl_vf_map_vsi_queue()
235 qtable = i40e_read_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num)); in ixl_vf_map_vsi_queue()
238 i40e_write_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num), qtable); in ixl_vf_map_vsi_queue()
248 hw = &pf->hw; in ixl_vf_map_queues()
252 * so we have to use non-contiguous mappings. in ixl_vf_map_queues()
254 i40e_write_rx_ctl(hw, I40E_VSILAN_QBASE(vf->vsi.vsi_num), in ixl_vf_map_queues()
258 wr32(hw, I40E_VPLAN_MAPENA(vf->vf_num), in ixl_vf_map_queues()
263 for (i = 0; i < vf->vsi.num_tx_queues; i++) { in ixl_vf_map_queues()
264 qtable = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, i) << in ixl_vf_map_queues()
267 wr32(hw, I40E_VPLAN_QTABLE(i, vf->vf_num), qtable); in ixl_vf_map_queues()
270 wr32(hw, I40E_VPLAN_QTABLE(i, vf->vf_num), in ixl_vf_map_queues()
273 /* Map queues allocated to VF to its VSI; in ixl_vf_map_queues()
274 * This mapping matches the VF-wide mapping since the VF in ixl_vf_map_queues()
276 for (i = 0; i < vf->vsi.num_tx_queues; i++) in ixl_vf_map_queues()
278 ixl_pf_qidx_from_vsi_qidx(&vf->qtag, i)); in ixl_vf_map_queues()
280 /* Set rest of VSI queues as unused. */ in ixl_vf_map_queues()
293 hw = &pf->hw; in ixl_vf_vsi_release()
295 if (vsi->seid == 0) in ixl_vf_vsi_release()
298 i40e_aq_delete_element(hw, vsi->seid, NULL); in ixl_vf_vsi_release()
325 hw = &pf->hw; in ixl_vf_release_resources()
327 ixl_vf_vsi_release(pf, &vf->vsi); in ixl_vf_release_resources()
330 ixl_vf_disable_queue_intr(hw, I40E_VFINT_DYN_CTL0(vf->vf_num)); in ixl_vf_release_resources()
332 for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) { in ixl_vf_release_resources()
333 vfint_reg = IXL_VFINT_DYN_CTLN_REG(hw, i , vf->vf_num); in ixl_vf_release_resources()
338 ixl_vf_unregister_intr(hw, I40E_VPINT_LNKLST0(vf->vf_num)); in ixl_vf_release_resources()
340 for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) { in ixl_vf_release_resources()
341 vpint_reg = IXL_VPINT_LNKLSTN_REG(hw, i, vf->vf_num); in ixl_vf_release_resources()
345 vf->vsi.num_tx_queues = 0; in ixl_vf_release_resources()
346 vf->vsi.num_rx_queues = 0; in ixl_vf_release_resources()
357 hw = &pf->hw; in ixl_flush_pcie()
358 global_vf_num = hw->func_caps.vf_base_id + vf->vf_num; in ixl_flush_pcie()
378 hw = &pf->hw; in ixl_reset_vf()
380 ixl_dbg_iov(pf, "Resetting VF-%d\n", vf->vf_num); in ixl_reset_vf()
382 vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num)); in ixl_reset_vf()
384 wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig); in ixl_reset_vf()
389 ixl_dbg_iov(pf, "Resetting VF-%d done.\n", vf->vf_num); in ixl_reset_vf()
399 hw = &pf->hw; in ixl_reinit_vf()
403 device_printf(pf->dev, in ixl_reinit_vf()
404 "Timed out waiting for PCIe activity to stop on VF-%d\n", in ixl_reinit_vf()
405 vf->vf_num); in ixl_reinit_vf()
410 vfrstat = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_num)); in ixl_reinit_vf()
416 device_printf(pf->dev, "VF %d failed to reset\n", vf->vf_num); in ixl_reinit_vf()
418 wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), VIRTCHNL_VFR_COMPLETED); in ixl_reinit_vf()
420 vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num)); in ixl_reinit_vf()
422 wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig); in ixl_reinit_vf()
424 if (vf->vsi.seid != 0) in ixl_reinit_vf()
425 ixl_disable_rings(pf, &vf->vsi, &vf->qtag); in ixl_reinit_vf()
426 ixl_pf_qmgr_clear_queue_flags(&vf->qtag); in ixl_reinit_vf()
432 wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), VIRTCHNL_VFR_VFACTIVE); in ixl_reinit_vf()
454 hw = &pf->hw; in ixl_send_vf_msg()
455 global_vf_id = hw->func_caps.vf_base_id + vf->vf_num; in ixl_send_vf_msg()
458 "Sending msg (op=%s[%d], status=%d) to VF-%d\n", in ixl_send_vf_msg()
459 ixl_vc_opcode_str(op), op, status, vf->vf_num); in ixl_send_vf_msg()
477 "Sending NACK (op=%s[%d], err=%s[%d]) to VF-%d from %s:%d\n", in ixl_send_vf_nack_msg()
478 ixl_vc_opcode_str(op), op, i40e_stat_str(&pf->hw, status), in ixl_send_vf_nack_msg()
479 status, vf->vf_num, file, line); in ixl_send_vf_nack_msg()
488 device_t dev = pf->dev; in ixl_vf_version_msg()
494 vf->version.major = 1; in ixl_vf_version_msg()
495 vf->version.minor = VIRTCHNL_VERSION_MINOR_NO_VF_CAPS; in ixl_vf_version_msg()
497 vf->version.major = VIRTCHNL_VERSION_MAJOR; in ixl_vf_version_msg()
498 vf->version.minor = VIRTCHNL_VERSION_MINOR; in ixl_vf_version_msg()
500 if ((recv_vf_version->major != VIRTCHNL_VERSION_MAJOR) || in ixl_vf_version_msg()
501 (recv_vf_version->minor != VIRTCHNL_VERSION_MINOR)) in ixl_vf_version_msg()
503 "%s: VF-%d requested version (%d.%d) differs from PF version (%d.%d)\n", in ixl_vf_version_msg()
504 __func__, vf->vf_num, in ixl_vf_version_msg()
505 recv_vf_version->major, recv_vf_version->minor, in ixl_vf_version_msg()
510 &vf->version, sizeof(vf->version)); in ixl_vf_version_msg()
530 if (vf->version.minor == VIRTCHNL_VERSION_MINOR_NO_VF_CAPS) in ixl_vf_get_resources_msg()
542 reply.num_queue_pairs = vf->vsi.num_tx_queues; in ixl_vf_get_resources_msg()
543 reply.max_vectors = pf->hw.func_caps.num_msix_vectors_vf; in ixl_vf_get_resources_msg()
546 reply.vsi_res[0].vsi_id = vf->vsi.vsi_num; in ixl_vf_get_resources_msg()
548 reply.vsi_res[0].num_queue_pairs = vf->vsi.num_tx_queues; in ixl_vf_get_resources_msg()
549 memcpy(reply.vsi_res[0].default_mac_addr, vf->mac, ETHER_ADDR_LEN); in ixl_vf_get_resources_msg()
565 hw = &pf->hw; in ixl_vf_config_tx_queue()
566 global_queue_num = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, info->queue_id); in ixl_vf_config_tx_queue()
567 global_vf_num = hw->func_caps.vf_base_id + vf->vf_num; in ixl_vf_config_tx_queue()
570 DDPRINTF(pf->dev, "VF %d: PF TX queue %d / VF TX queue %d (Global VF %d)\n", in ixl_vf_config_tx_queue()
571 vf->vf_num, global_queue_num, info->queue_id, global_vf_num); in ixl_vf_config_tx_queue()
577 txq.base = info->dma_ring_addr / IXL_TX_CTX_BASE_UNITS; in ixl_vf_config_tx_queue()
579 txq.head_wb_ena = info->headwb_enabled; in ixl_vf_config_tx_queue()
580 txq.head_wb_addr = info->dma_headwb_addr; in ixl_vf_config_tx_queue()
581 txq.qlen = info->ring_len; in ixl_vf_config_tx_queue()
582 txq.rdylist = le16_to_cpu(vf->vsi.info.qs_handle[0]); in ixl_vf_config_tx_queue()
590 (hw->pf_id << I40E_QTX_CTL_PF_INDX_SHIFT) | in ixl_vf_config_tx_queue()
595 ixl_pf_qmgr_mark_queue_configured(&vf->qtag, info->queue_id, true); in ixl_vf_config_tx_queue()
609 hw = &pf->hw; in ixl_vf_config_rx_queue()
610 global_queue_num = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, info->queue_id); in ixl_vf_config_rx_queue()
613 DDPRINTF(pf->dev, "VF %d: PF RX queue %d / VF RX queue %d\n", in ixl_vf_config_rx_queue()
614 vf->vf_num, global_queue_num, info->queue_id); in ixl_vf_config_rx_queue()
616 if (info->databuffer_size > IXL_VF_MAX_BUFFER) in ixl_vf_config_rx_queue()
619 if (info->max_pkt_size > IXL_VF_MAX_FRAME || in ixl_vf_config_rx_queue()
620 info->max_pkt_size < ETHER_MIN_LEN) in ixl_vf_config_rx_queue()
623 if (info->splithdr_enabled) { in ixl_vf_config_rx_queue()
624 if (info->hdr_size > IXL_VF_MAX_HDR_BUFFER) in ixl_vf_config_rx_queue()
627 rxq.hsplit_0 = info->rx_split_pos & in ixl_vf_config_rx_queue()
632 rxq.hbuff = info->hdr_size >> I40E_RXQ_CTX_HBUFF_SHIFT; in ixl_vf_config_rx_queue()
641 rxq.base = info->dma_ring_addr / IXL_RX_CTX_BASE_UNITS; in ixl_vf_config_rx_queue()
642 rxq.qlen = info->ring_len; in ixl_vf_config_rx_queue()
644 rxq.dbuff = info->databuffer_size >> I40E_RXQ_CTX_DBUFF_SHIFT; in ixl_vf_config_rx_queue()
650 rxq.rxmax = info->max_pkt_size; in ixl_vf_config_rx_queue()
662 ixl_pf_qmgr_mark_queue_configured(&vf->qtag, info->queue_id, false); in ixl_vf_config_rx_queue()
676 if (info->num_queue_pairs == 0 || info->num_queue_pairs > vf->vsi.num_tx_queues) { in ixl_vf_config_vsi_msg()
677 device_printf(pf->dev, "VF %d: invalid # of qpairs (msg has %d, VSI has %d)\n", in ixl_vf_config_vsi_msg()
678 vf->vf_num, info->num_queue_pairs, vf->vsi.num_tx_queues); in ixl_vf_config_vsi_msg()
684 if (info->vsi_id != vf->vsi.vsi_num) { in ixl_vf_config_vsi_msg()
685 device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n", in ixl_vf_config_vsi_msg()
686 vf->vf_num, info->vsi_id, vf->vsi.vsi_num); in ixl_vf_config_vsi_msg()
692 for (i = 0; i < info->num_queue_pairs; i++) { in ixl_vf_config_vsi_msg()
693 pair = &info->qpair[i]; in ixl_vf_config_vsi_msg()
695 if (pair->txq.vsi_id != vf->vsi.vsi_num || in ixl_vf_config_vsi_msg()
696 pair->rxq.vsi_id != vf->vsi.vsi_num || in ixl_vf_config_vsi_msg()
697 pair->txq.queue_id != pair->rxq.queue_id || in ixl_vf_config_vsi_msg()
698 pair->txq.queue_id >= vf->vsi.num_tx_queues) { in ixl_vf_config_vsi_msg()
705 if (ixl_vf_config_tx_queue(pf, vf, &pair->txq) != 0) { in ixl_vf_config_vsi_msg()
711 if (ixl_vf_config_rx_queue(pf, vf, &pair->rxq) != 0) { in ixl_vf_config_vsi_msg()
732 itr_indx = vector->rxitr_idx; in ixl_vf_set_qctl()
735 itr_indx = vector->txitr_idx; in ixl_vf_set_qctl()
738 qctl = htole32((vector->vector_id << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) | in ixl_vf_set_qctl()
744 wr32(&pf->hw, offset, qctl); in ixl_vf_set_qctl()
760 hw = &pf->hw; in ixl_vf_config_vector()
762 rxq_map = vector->rxq_map; in ixl_vf_config_vector()
763 txq_map = vector->txq_map; in ixl_vf_config_vector()
769 * The datasheet says to optimize performance, RX queues and TX queues in ixl_vf_config_vector()
775 qindex = ffs(txq_map) - 1; in ixl_vf_config_vector()
777 cur_queue = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, qindex); in ixl_vf_config_vector()
784 qindex = ffs(rxq_map) - 1; in ixl_vf_config_vector()
786 cur_queue = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, qindex); in ixl_vf_config_vector()
793 if (vector->vector_id == 0) in ixl_vf_config_vector()
794 lnklst_reg = I40E_VPINT_LNKLST0(vf->vf_num); in ixl_vf_config_vector()
796 lnklst_reg = IXL_VPINT_LNKLSTN_REG(hw, vector->vector_id, in ixl_vf_config_vector()
797 vf->vf_num); in ixl_vf_config_vector()
814 hw = &pf->hw; in ixl_vf_config_irq_msg()
817 for (i = 0; i < map->num_vectors; i++) { in ixl_vf_config_irq_msg()
818 vector = &map->vecmap[i]; in ixl_vf_config_irq_msg()
820 if ((vector->vector_id >= hw->func_caps.num_msix_vectors_vf) || in ixl_vf_config_irq_msg()
821 vector->vsi_id != vf->vsi.vsi_num) { in ixl_vf_config_irq_msg()
827 if (vector->rxq_map != 0) { in ixl_vf_config_irq_msg()
828 largest_rxq = fls(vector->rxq_map) - 1; in ixl_vf_config_irq_msg()
829 if (largest_rxq >= vf->vsi.num_rx_queues) { in ixl_vf_config_irq_msg()
837 if (vector->txq_map != 0) { in ixl_vf_config_irq_msg()
838 largest_txq = fls(vector->txq_map) - 1; in ixl_vf_config_irq_msg()
839 if (largest_txq >= vf->vsi.num_tx_queues) { in ixl_vf_config_irq_msg()
847 if (vector->rxitr_idx > IXL_MAX_ITR_IDX || in ixl_vf_config_irq_msg()
848 vector->txitr_idx > IXL_MAX_ITR_IDX) { in ixl_vf_config_irq_msg()
870 if (select->vsi_id != vf->vsi.vsi_num || in ixl_vf_enable_queues_msg()
871 select->rx_queues == 0 || select->tx_queues == 0) { in ixl_vf_enable_queues_msg()
879 if ((1 << i) & select->tx_queues) { in ixl_vf_enable_queues_msg()
881 if (i >= vf->vsi.num_tx_queues) { in ixl_vf_enable_queues_msg()
882 device_printf(pf->dev, "VF %d: TX ring %d is outside of VF VSI allocation!\n", in ixl_vf_enable_queues_msg()
883 vf->vf_num, i); in ixl_vf_enable_queues_msg()
887 if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, true)) in ixl_vf_enable_queues_msg()
890 if (ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, true)) in ixl_vf_enable_queues_msg()
892 vf->vf_num, i); in ixl_vf_enable_queues_msg()
894 error = ixl_enable_tx_ring(pf, &vf->qtag, i); in ixl_vf_enable_queues_msg()
898 ixl_pf_qmgr_mark_queue_enabled(&vf->qtag, i, true); in ixl_vf_enable_queues_msg()
902 /* Enable RX rings selected by the VF */ in ixl_vf_enable_queues_msg()
904 if ((1 << i) & select->rx_queues) { in ixl_vf_enable_queues_msg()
906 if (i >= vf->vsi.num_rx_queues) { in ixl_vf_enable_queues_msg()
907 device_printf(pf->dev, "VF %d: RX ring %d is outside of VF VSI allocation!\n", in ixl_vf_enable_queues_msg()
908 vf->vf_num, i); in ixl_vf_enable_queues_msg()
912 if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, false)) in ixl_vf_enable_queues_msg()
915 if (ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, false)) in ixl_vf_enable_queues_msg()
916 ixl_dbg_iov(pf, "VF %d: RX ring %d is already enabled!\n", in ixl_vf_enable_queues_msg()
917 vf->vf_num, i); in ixl_vf_enable_queues_msg()
918 error = ixl_enable_rx_ring(pf, &vf->qtag, i); in ixl_vf_enable_queues_msg()
922 ixl_pf_qmgr_mark_queue_enabled(&vf->qtag, i, false); in ixl_vf_enable_queues_msg()
944 if (select->vsi_id != vf->vsi.vsi_num || in ixl_vf_disable_queues_msg()
945 select->rx_queues == 0 || select->tx_queues == 0) { in ixl_vf_disable_queues_msg()
953 if ((1 << i) & select->tx_queues) { in ixl_vf_disable_queues_msg()
955 if (i >= vf->vsi.num_tx_queues) { in ixl_vf_disable_queues_msg()
956 device_printf(pf->dev, "VF %d: TX ring %d is outside of VF VSI allocation!\n", in ixl_vf_disable_queues_msg()
957 vf->vf_num, i); in ixl_vf_disable_queues_msg()
961 if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, true)) in ixl_vf_disable_queues_msg()
964 if (!ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, true)) { in ixl_vf_disable_queues_msg()
966 vf->vf_num, i); in ixl_vf_disable_queues_msg()
969 error = ixl_disable_tx_ring(pf, &vf->qtag, i); in ixl_vf_disable_queues_msg()
973 ixl_pf_qmgr_mark_queue_disabled(&vf->qtag, i, true); in ixl_vf_disable_queues_msg()
977 /* Enable RX rings selected by the VF */ in ixl_vf_disable_queues_msg()
979 if ((1 << i) & select->rx_queues) { in ixl_vf_disable_queues_msg()
981 if (i >= vf->vsi.num_rx_queues) { in ixl_vf_disable_queues_msg()
982 device_printf(pf->dev, "VF %d: RX ring %d is outside of VF VSI allocation!\n", in ixl_vf_disable_queues_msg()
983 vf->vf_num, i); in ixl_vf_disable_queues_msg()
987 if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, false)) in ixl_vf_disable_queues_msg()
990 if (!ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, false)) { in ixl_vf_disable_queues_msg()
991 ixl_dbg_iov(pf, "VF %d: RX ring %d is already disabled!\n", in ixl_vf_disable_queues_msg()
992 vf->vf_num, i); in ixl_vf_disable_queues_msg()
995 error = ixl_disable_rx_ring(pf, &vf->qtag, i); in ixl_vf_disable_queues_msg()
999 ixl_pf_qmgr_mark_queue_disabled(&vf->qtag, i, false); in ixl_vf_disable_queues_msg()
1024 if (!(vf->vf_flags & VF_FLAG_SET_MAC_CAP) && in ixl_vf_mac_valid()
1025 !(ETHER_IS_MULTICAST(addr) || !ixl_ether_is_equal(addr, vf->mac))) in ixl_vf_mac_valid()
1040 vsi = &vf->vsi; in ixl_vf_add_mac_msg()
1043 if (addr_list->vsi_id != vsi->vsi_num) { in ixl_vf_add_mac_msg()
1049 for (i = 0; i < addr_list->num_elements; i++) { in ixl_vf_add_mac_msg()
1050 if (ixl_vf_mac_valid(vf, addr_list->list[i].addr) != 0) { in ixl_vf_add_mac_msg()
1057 for (i = 0; i < addr_list->num_elements; i++) { in ixl_vf_add_mac_msg()
1058 addr = &addr_list->list[i]; in ixl_vf_add_mac_msg()
1059 ixl_add_filter(vsi, addr->addr, IXL_VLAN_ANY); in ixl_vf_add_mac_msg()
1074 vsi = &vf->vsi; in ixl_vf_del_mac_msg()
1077 if (addr_list->vsi_id != vsi->vsi_num) { in ixl_vf_del_mac_msg()
1083 for (i = 0; i < addr_list->num_elements; i++) { in ixl_vf_del_mac_msg()
1084 addr = &addr_list->list[i]; in ixl_vf_del_mac_msg()
1085 if (ETHER_IS_ZERO(addr->addr) || ETHER_IS_BROADCAST(addr->addr)) { in ixl_vf_del_mac_msg()
1092 for (i = 0; i < addr_list->num_elements; i++) { in ixl_vf_del_mac_msg()
1093 addr = &addr_list->list[i]; in ixl_vf_del_mac_msg()
1094 ixl_del_filter(&vf->vsi, addr->addr, IXL_VLAN_ANY); in ixl_vf_del_mac_msg()
1105 vsi_ctx.seid = vf->vsi.seid; in ixl_vf_enable_vlan_strip()
1111 return (i40e_aq_update_vsi_params(&pf->hw, &vsi_ctx, NULL)); in ixl_vf_enable_vlan_strip()
1124 if (filter_list->vsi_id != vf->vsi.vsi_num) { in ixl_vf_add_vlan_msg()
1130 if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) { in ixl_vf_add_vlan_msg()
1136 for (i = 0; i < filter_list->num_elements; i++) { in ixl_vf_add_vlan_msg()
1137 if (filter_list->vlan_id[i] > EVL_VLID_MASK) { in ixl_vf_add_vlan_msg()
1150 for (i = 0; i < filter_list->num_elements; i++) in ixl_vf_add_vlan_msg()
1151 ixl_add_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]); in ixl_vf_add_vlan_msg()
1165 if (filter_list->vsi_id != vf->vsi.vsi_num) { in ixl_vf_del_vlan_msg()
1171 for (i = 0; i < filter_list->num_elements; i++) { in ixl_vf_del_vlan_msg()
1172 if (filter_list->vlan_id[i] > EVL_VLID_MASK) { in ixl_vf_del_vlan_msg()
1179 if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) { in ixl_vf_del_vlan_msg()
1185 for (i = 0; i < filter_list->num_elements; i++) in ixl_vf_del_vlan_msg()
1186 ixl_del_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]); in ixl_vf_del_vlan_msg()
1196 struct i40e_hw *hw = &pf->hw; in ixl_vf_config_promisc_msg()
1199 if (!(vf->vf_flags & VF_FLAG_PROMISC_CAP)) { in ixl_vf_config_promisc_msg()
1201 * Do the same thing as the Linux PF driver -- lie to the VF in ixl_vf_config_promisc_msg()
1209 if (info->vsi_id != vf->vsi.vsi_num) { in ixl_vf_config_promisc_msg()
1215 code = i40e_aq_set_vsi_unicast_promiscuous(hw, vf->vsi.seid, in ixl_vf_config_promisc_msg()
1216 info->flags & FLAG_VF_UNICAST_PROMISC, NULL, TRUE); in ixl_vf_config_promisc_msg()
1218 device_printf(pf->dev, "i40e_aq_set_vsi_unicast_promiscuous (seid %d) failed: status %s," in ixl_vf_config_promisc_msg()
1219 " error %s\n", vf->vsi.seid, i40e_stat_str(hw, code), in ixl_vf_config_promisc_msg()
1220 i40e_aq_str(hw, hw->aq.asq_last_status)); in ixl_vf_config_promisc_msg()
1226 code = i40e_aq_set_vsi_multicast_promiscuous(hw, vf->vsi.seid, in ixl_vf_config_promisc_msg()
1227 info->flags & FLAG_VF_MULTICAST_PROMISC, NULL); in ixl_vf_config_promisc_msg()
1229 device_printf(pf->dev, "i40e_aq_set_vsi_multicast_promiscuous (seid %d) failed: status %s," in ixl_vf_config_promisc_msg()
1230 " error %s\n", vf->vsi.seid, i40e_stat_str(hw, code), in ixl_vf_config_promisc_msg()
1231 i40e_aq_str(hw, hw->aq.asq_last_status)); in ixl_vf_config_promisc_msg()
1247 if (queue->vsi_id != vf->vsi.vsi_num) { in ixl_vf_get_stats_msg()
1253 ixl_update_eth_stats(&vf->vsi); in ixl_vf_get_stats_msg()
1256 I40E_SUCCESS, &vf->vsi.eth_stats, sizeof(vf->vsi.eth_stats)); in ixl_vf_get_stats_msg()
1268 hw = &pf->hw; in ixl_vf_config_rss_key_msg()
1272 if (key->key_len > 52) { in ixl_vf_config_rss_key_msg()
1273 device_printf(pf->dev, "VF %d: Key size in msg (%d) is greater than max key size (%d)\n", in ixl_vf_config_rss_key_msg()
1274 vf->vf_num, key->key_len, 52); in ixl_vf_config_rss_key_msg()
1280 if (key->vsi_id != vf->vsi.vsi_num) { in ixl_vf_config_rss_key_msg()
1281 device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n", in ixl_vf_config_rss_key_msg()
1282 vf->vf_num, key->vsi_id, vf->vsi.vsi_num); in ixl_vf_config_rss_key_msg()
1288 /* Fill out hash using MAC-dependent method */ in ixl_vf_config_rss_key_msg()
1289 if (hw->mac.type == I40E_MAC_X722) { in ixl_vf_config_rss_key_msg()
1291 if (key->key_len <= 40) in ixl_vf_config_rss_key_msg()
1292 bcopy(key->key, key_data.standard_rss_key, key->key_len); in ixl_vf_config_rss_key_msg()
1294 bcopy(key->key, key_data.standard_rss_key, 40); in ixl_vf_config_rss_key_msg()
1295 bcopy(&key->key[40], key_data.extended_hash_key, key->key_len - 40); in ixl_vf_config_rss_key_msg()
1297 status = i40e_aq_set_rss_key(hw, vf->vsi.vsi_num, &key_data); in ixl_vf_config_rss_key_msg()
1299 device_printf(pf->dev, "i40e_aq_set_rss_key status %s, error %s\n", in ixl_vf_config_rss_key_msg()
1300 i40e_stat_str(hw, status), i40e_aq_str(hw, hw->aq.asq_last_status)); in ixl_vf_config_rss_key_msg()
1306 for (int i = 0; i < (key->key_len / 4); i++) in ixl_vf_config_rss_key_msg()
1307 i40e_write_rx_ctl(hw, I40E_VFQF_HKEY1(i, vf->vf_num), ((u32 *)key->key)[i]); in ixl_vf_config_rss_key_msg()
1310 DDPRINTF(pf->dev, "VF %d: Programmed key starting with 0x%x ok!", in ixl_vf_config_rss_key_msg()
1311 vf->vf_num, key->key[0]); in ixl_vf_config_rss_key_msg()
1324 hw = &pf->hw; in ixl_vf_config_rss_lut_msg()
1328 if (lut->lut_entries > 64) { in ixl_vf_config_rss_lut_msg()
1329 device_printf(pf->dev, "VF %d: # of LUT entries in msg (%d) is greater than max (%d)\n", in ixl_vf_config_rss_lut_msg()
1330 vf->vf_num, lut->lut_entries, 64); in ixl_vf_config_rss_lut_msg()
1336 if (lut->vsi_id != vf->vsi.vsi_num) { in ixl_vf_config_rss_lut_msg()
1337 device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n", in ixl_vf_config_rss_lut_msg()
1338 vf->vf_num, lut->vsi_id, vf->vsi.vsi_num); in ixl_vf_config_rss_lut_msg()
1344 /* Fill out LUT using MAC-dependent method */ in ixl_vf_config_rss_lut_msg()
1345 if (hw->mac.type == I40E_MAC_X722) { in ixl_vf_config_rss_lut_msg()
1346 status = i40e_aq_set_rss_lut(hw, vf->vsi.vsi_num, false, lut->lut, lut->lut_entries); in ixl_vf_config_rss_lut_msg()
1348 device_printf(pf->dev, "i40e_aq_set_rss_lut status %s, error %s\n", in ixl_vf_config_rss_lut_msg()
1349 i40e_stat_str(hw, status), i40e_aq_str(hw, hw->aq.asq_last_status)); in ixl_vf_config_rss_lut_msg()
1355 for (int i = 0; i < (lut->lut_entries / 4); i++) in ixl_vf_config_rss_lut_msg()
1356 i40e_write_rx_ctl(hw, I40E_VFQF_HLUT1(i, vf->vf_num), ((u32 *)lut->lut)[i]); in ixl_vf_config_rss_lut_msg()
1359 DDPRINTF(pf->dev, "VF %d: Programmed LUT starting with 0x%x and length %d ok!", in ixl_vf_config_rss_lut_msg()
1360 vf->vf_num, lut->lut[0], lut->lut_entries); in ixl_vf_config_rss_lut_msg()
1372 hw = &pf->hw; in ixl_vf_set_rss_hena_msg()
1376 i40e_write_rx_ctl(hw, I40E_VFQF_HENA1(0, vf->vf_num), (u32)hena->hena); in ixl_vf_set_rss_hena_msg()
1377 i40e_write_rx_ctl(hw, I40E_VFQF_HENA1(1, vf->vf_num), (u32)(hena->hena >> 32)); in ixl_vf_set_rss_hena_msg()
1379 DDPRINTF(pf->dev, "VF %d: Programmed HENA with 0x%016lx", in ixl_vf_set_rss_hena_msg()
1380 vf->vf_num, hena->hena); in ixl_vf_set_rss_hena_msg()
1391 hw = &pf->hw; in ixl_notify_vf_link_state()
1394 event.event_data.link_event.link_status = pf->vsi.link_active; in ixl_notify_vf_link_state()
1396 i40e_virtchnl_link_speed(hw->phy.link_info.link_speed); in ixl_notify_vf_link_state()
1407 for (i = 0; i < pf->num_vfs; i++) in ixl_broadcast_link_state()
1408 ixl_notify_vf_link_state(pf, &pf->vfs[i]); in ixl_broadcast_link_state()
1414 device_t dev = pf->dev; in ixl_handle_vf_msg()
1421 vf_num = le16toh(event->desc.retval) - pf->hw.func_caps.vf_base_id; in ixl_handle_vf_msg()
1422 opcode = le32toh(event->desc.cookie_high); in ixl_handle_vf_msg()
1424 if (vf_num >= pf->num_vfs) { in ixl_handle_vf_msg()
1425 device_printf(pf->dev, "Got msg from illegal VF: %d\n", vf_num); in ixl_handle_vf_msg()
1429 vf = &pf->vfs[vf_num]; in ixl_handle_vf_msg()
1430 msg = event->msg_buf; in ixl_handle_vf_msg()
1431 msg_size = event->msg_len; in ixl_handle_vf_msg()
1434 "Got msg %s(%d) from%sVF-%d of size %d\n", in ixl_handle_vf_msg()
1436 (vf->vf_flags & VF_FLAG_ENABLED) ? " " : " disabled ", in ixl_handle_vf_msg()
1440 err = virtchnl_vc_validate_vf_msg(&vf->version, opcode, msg, msg_size); in ixl_handle_vf_msg()
1442 device_printf(dev, "%s: Received invalid msg from VF-%d: opcode %d, len %d, error %d\n", in ixl_handle_vf_msg()
1443 __func__, vf->vf_num, opcode, msg_size, err); in ixl_handle_vf_msg()
1449 if (!(vf->vf_flags & VF_FLAG_ENABLED)) in ixl_handle_vf_msg()
1461 /* Notify VF of link state after it obtains queues, as this is in ixl_handle_vf_msg()
1474 /* Notify VF of link state after it obtains queues, as this is in ixl_handle_vf_msg()
1529 hw = &pf->hw; in ixl_handle_vflr()
1533 /* Re-enable VFLR interrupt cause so driver doesn't miss a in ixl_handle_vflr()
1540 for (i = 0; i < pf->num_vfs; i++) { in ixl_handle_vflr()
1541 global_vf_num = hw->func_caps.vf_base_id + i; in ixl_handle_vflr()
1543 vf = &pf->vfs[i]; in ixl_handle_vflr()
1544 if (!(vf->vf_flags & VF_FLAG_ENABLED)) in ixl_handle_vflr()
1554 ixl_dbg_iov(pf, "Reinitializing VF-%d\n", i); in ixl_handle_vflr()
1556 ixl_dbg_iov(pf, "Reinitializing VF-%d done\n", i); in ixl_handle_vflr()
1619 struct i40e_hw *hw = &pf->hw; in ixl_config_pf_vsi_loopback()
1620 device_t dev = pf->dev; in ixl_config_pf_vsi_loopback()
1621 struct ixl_vsi *vsi = &pf->vsi; in ixl_config_pf_vsi_loopback()
1627 ctxt.seid = vsi->seid; in ixl_config_pf_vsi_loopback()
1628 if (pf->veb_seid != 0) in ixl_config_pf_vsi_loopback()
1629 ctxt.uplink_seid = pf->veb_seid; in ixl_config_pf_vsi_loopback()
1630 ctxt.pf_num = hw->pf_id; in ixl_config_pf_vsi_loopback()
1641 " aq_error %d\n", error, hw->aq.asq_last_status); in ixl_config_pf_vsi_loopback()
1657 hw = &pf->hw; in ixl_if_iov_init()
1658 pf_vsi = &pf->vsi; in ixl_if_iov_init()
1660 pf->vfs = malloc(sizeof(struct ixl_vf) * num_vfs, M_IXL, M_NOWAIT | in ixl_if_iov_init()
1662 if (pf->vfs == NULL) { in ixl_if_iov_init()
1669 * - do nothing: VEPA mode in ixl_if_iov_init()
1670 * - enable loopback mode on connected VSIs: VEB mode in ixl_if_iov_init()
1672 ret = i40e_aq_add_veb(hw, pf_vsi->uplink_seid, pf_vsi->seid, in ixl_if_iov_init()
1673 1, FALSE, &pf->veb_seid, FALSE, NULL); in ixl_if_iov_init()
1675 error = hw->aq.asq_last_status; in ixl_if_iov_init()
1680 if (pf->enable_vf_loopback) in ixl_if_iov_init()
1690 pf->num_vfs = num_vfs; in ixl_if_iov_init()
1694 free(pf->vfs, M_IXL); in ixl_if_iov_init()
1695 pf->vfs = NULL; in ixl_if_iov_init()
1707 hw = &pf->hw; in ixl_if_iov_uninit()
1709 for (i = 0; i < pf->num_vfs; i++) { in ixl_if_iov_uninit()
1710 if (pf->vfs[i].vsi.seid != 0) in ixl_if_iov_uninit()
1711 i40e_aq_delete_element(hw, pf->vfs[i].vsi.seid, NULL); in ixl_if_iov_uninit()
1712 ixl_pf_qmgr_release(&pf->qmgr, &pf->vfs[i].qtag); in ixl_if_iov_uninit()
1713 ixl_free_filters(&pf->vfs[i].vsi.ftl); in ixl_if_iov_uninit()
1715 i, pf->vfs[i].qtag.num_allocated); in ixl_if_iov_uninit()
1716 ixl_dbg_iov(pf, "Unallocated total: %d\n", ixl_pf_qmgr_get_num_free(&pf->qmgr)); in ixl_if_iov_uninit()
1719 if (pf->veb_seid != 0) { in ixl_if_iov_uninit()
1720 i40e_aq_delete_element(hw, pf->veb_seid, NULL); in ixl_if_iov_uninit()
1721 pf->veb_seid = 0; in ixl_if_iov_uninit()
1724 if (pf->enable_vf_loopback) in ixl_if_iov_uninit()
1727 vfs = pf->vfs; in ixl_if_iov_uninit()
1728 num_vfs = pf->num_vfs; in ixl_if_iov_uninit()
1730 pf->vfs = NULL; in ixl_if_iov_uninit()
1731 pf->num_vfs = 0; in ixl_if_iov_uninit()
1742 device_t dev = pf->dev; in ixl_vf_reserve_queues()
1747 device_printf(dev, "Invalid num-queues (%d) for VF %d\n", in ixl_vf_reserve_queues()
1748 num_queues, vf->vf_num); in ixl_vf_reserve_queues()
1750 device_printf(dev, "Setting VF %d num-queues to 1\n", vf->vf_num); in ixl_vf_reserve_queues()
1753 device_printf(dev, "Setting VF %d num-queues to %d\n", vf->vf_num, IAVF_MAX_QUEUES); in ixl_vf_reserve_queues()
1756 error = ixl_pf_qmgr_alloc_scattered(&pf->qmgr, num_queues, &vf->qtag); in ixl_vf_reserve_queues()
1758 device_printf(dev, "Error allocating %d queues for VF %d's VSI\n", in ixl_vf_reserve_queues()
1759 num_queues, vf->vf_num); in ixl_vf_reserve_queues()
1764 vf->vf_num, vf->qtag.num_allocated, vf->qtag.num_active); in ixl_vf_reserve_queues()
1765 ixl_dbg_iov(pf, "Unallocated total: %d\n", ixl_pf_qmgr_get_num_free(&pf->qmgr)); in ixl_vf_reserve_queues()
1781 vf = &pf->vfs[vfnum]; in ixl_if_iov_vf_add()
1782 vf->vf_num = vfnum; in ixl_if_iov_vf_add()
1783 vf->vsi.back = pf; in ixl_if_iov_vf_add()
1784 vf->vf_flags = VF_FLAG_ENABLED; in ixl_if_iov_vf_add()
1787 vf_num_queues = nvlist_get_number(params, "num-queues"); in ixl_if_iov_vf_add()
1796 if (nvlist_exists_binary(params, "mac-addr")) { in ixl_if_iov_vf_add()
1797 mac = nvlist_get_binary(params, "mac-addr", &size); in ixl_if_iov_vf_add()
1798 bcopy(mac, vf->mac, ETHER_ADDR_LEN); in ixl_if_iov_vf_add()
1800 if (nvlist_get_bool(params, "allow-set-mac")) in ixl_if_iov_vf_add()
1801 vf->vf_flags |= VF_FLAG_SET_MAC_CAP; in ixl_if_iov_vf_add()
1807 vf->vf_flags |= VF_FLAG_SET_MAC_CAP; in ixl_if_iov_vf_add()
1809 if (nvlist_get_bool(params, "mac-anti-spoof")) in ixl_if_iov_vf_add()
1810 vf->vf_flags |= VF_FLAG_MAC_ANTI_SPOOF; in ixl_if_iov_vf_add()
1812 if (nvlist_get_bool(params, "allow-promisc")) in ixl_if_iov_vf_add()
1813 vf->vf_flags |= VF_FLAG_PROMISC_CAP; in ixl_if_iov_vf_add()
1815 vf->vf_flags |= VF_FLAG_VLAN_CAP; in ixl_if_iov_vf_add()
1822 ixl_vsi_add_sysctls(&vf->vsi, sysctl_name, false); in ixl_if_iov_vf_add()