-int
-rte_pmd_i40e_set_vf_unicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
- struct i40e_hw *hw;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid argument.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- hw = I40E_VSI_TO_HW(vsi);
-
- ret = i40e_aq_set_vsi_unicast_promiscuous(hw, vsi->seid,
- on, NULL, true);
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to set unicast promiscuous mode");
- }
-
- return ret;
-}
-
-int
-rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port, uint16_t vf_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
- struct i40e_hw *hw;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid argument.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- hw = I40E_VSI_TO_HW(vsi);
-
- ret = i40e_aq_set_vsi_multicast_promiscuous(hw, vsi->seid,
- on, NULL);
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to set multicast promiscuous mode");
- }
-
- return ret;
-}
-
-int
-rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
- struct ether_addr *mac_addr)
-{
- struct i40e_mac_filter *f;
- struct rte_eth_dev *dev;
- struct i40e_pf_vf *vf;
- struct i40e_vsi *vsi;
- struct i40e_pf *pf;
- void *temp;
-
- if (i40e_validate_mac_addr((u8 *)mac_addr) != I40E_SUCCESS)
- return -EINVAL;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs)
- return -EINVAL;
-
- vf = &pf->vfs[vf_id];
- vsi = vf->vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- ether_addr_copy(mac_addr, &vf->mac_addr);
-
- /* Remove all existing mac */
- TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp)
- i40e_vsi_delete_mac(vsi, &f->mac_info.mac_addr);
-
- return 0;
-}
-
-/* Set vlan strip on/off for specific VF from host */
-int
-rte_pmd_i40e_set_vf_vlan_stripq(uint8_t port, uint16_t vf_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid argument.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
-
- if (!vsi)
- return -EINVAL;
-
- ret = i40e_vsi_config_vlan_stripping(vsi, !!on);
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to set VLAN stripping!");
- }
-
- return ret;
-}
-
-int rte_pmd_i40e_set_vf_vlan_insert(uint8_t port, uint16_t vf_id,
- uint16_t vlan_id)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_hw *hw;
- struct i40e_vsi *vsi;
- struct i40e_vsi_context ctxt;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- if (vlan_id > ETHER_MAX_VLAN_ID) {
- PMD_DRV_LOG(ERR, "Invalid VLAN ID.");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
- hw = I40E_PF_TO_HW(pf);
-
- /**
- * return -ENODEV if SRIOV not enabled, VF number not configured
- * or no queue assigned.
- */
- if (!hw->func_caps.sr_iov_1_1 || pf->vf_num == 0 ||
- pf->vf_nb_qps == 0)
- return -ENODEV;
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid VF ID.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID);
- vsi->info.pvid = vlan_id;
- if (vlan_id > 0)
- vsi->info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_INSERT_PVID;
- else
- vsi->info.port_vlan_flags &= ~I40E_AQ_VSI_PVLAN_INSERT_PVID;
-
- memset(&ctxt, 0, sizeof(ctxt));
- (void)rte_memcpy(&ctxt.info, &vsi->info, sizeof(vsi->info));
- ctxt.seid = vsi->seid;
-
- hw = I40E_VSI_TO_HW(vsi);
- ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to update VSI params");
- }
-
- return ret;
-}
-
-int rte_pmd_i40e_set_vf_broadcast(uint8_t port, uint16_t vf_id,
- uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
- struct i40e_hw *hw;
- struct i40e_mac_filter_info filter;
- struct ether_addr broadcast = {
- .addr_bytes = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} };
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- if (on > 1) {
- PMD_DRV_LOG(ERR, "on should be 0 or 1.");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
- hw = I40E_PF_TO_HW(pf);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid VF ID.");
- return -EINVAL;
- }
-
- /**
- * return -ENODEV if SRIOV not enabled, VF number not configured
- * or no queue assigned.
- */
- if (!hw->func_caps.sr_iov_1_1 || pf->vf_num == 0 ||
- pf->vf_nb_qps == 0) {
- PMD_DRV_LOG(ERR, "SRIOV is not enabled or no queue.");
- return -ENODEV;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- if (on) {
- (void)rte_memcpy(&filter.mac_addr, &broadcast, ETHER_ADDR_LEN);
- filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
- ret = i40e_vsi_add_mac(vsi, &filter);
- } else {
- ret = i40e_vsi_delete_mac(vsi, &broadcast);
- }
-
- if (ret != I40E_SUCCESS && ret != I40E_ERR_PARAM) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to set VSI broadcast");
- } else {
- ret = 0;
- }
-
- return ret;
-}
-
-int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_hw *hw;
- struct i40e_vsi *vsi;
- struct i40e_vsi_context ctxt;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- if (on > 1) {
- PMD_DRV_LOG(ERR, "on should be 0 or 1.");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
- hw = I40E_PF_TO_HW(pf);
-
- /**
- * return -ENODEV if SRIOV not enabled, VF number not configured
- * or no queue assigned.
- */
- if (!hw->func_caps.sr_iov_1_1 || pf->vf_num == 0 ||
- pf->vf_nb_qps == 0) {
- PMD_DRV_LOG(ERR, "SRIOV is not enabled or no queue.");
- return -ENODEV;
- }
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid VF ID.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID);
- if (on) {
- vsi->info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_MODE_TAGGED;
- vsi->info.port_vlan_flags &= ~I40E_AQ_VSI_PVLAN_MODE_UNTAGGED;
- } else {
- vsi->info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_MODE_UNTAGGED;
- vsi->info.port_vlan_flags &= ~I40E_AQ_VSI_PVLAN_MODE_TAGGED;
- }
-
- memset(&ctxt, 0, sizeof(ctxt));
- (void)rte_memcpy(&ctxt.info, &vsi->info, sizeof(vsi->info));
- ctxt.seid = vsi->seid;
-
- hw = I40E_VSI_TO_HW(vsi);
- ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to update VSI params");
- }
-
- return ret;
-}
-
-int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
- uint64_t vf_mask, uint8_t on)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_hw *hw;
- uint16_t vf_idx;
- int ret = I40E_SUCCESS;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- if (vlan_id > ETHER_MAX_VLAN_ID) {
- PMD_DRV_LOG(ERR, "Invalid VLAN ID.");
- return -EINVAL;
- }
-
- if (vf_mask == 0) {
- PMD_DRV_LOG(ERR, "No VF.");
- return -EINVAL;
- }
-
- if (on > 1) {
- PMD_DRV_LOG(ERR, "on is should be 0 or 1.");
- return -EINVAL;
- }
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
- hw = I40E_PF_TO_HW(pf);
-
- /**
- * return -ENODEV if SRIOV not enabled, VF number not configured
- * or no queue assigned.
- */
- if (!hw->func_caps.sr_iov_1_1 || pf->vf_num == 0 ||
- pf->vf_nb_qps == 0) {
- PMD_DRV_LOG(ERR, "SRIOV is not enabled or no queue.");
- return -ENODEV;
- }
-
- for (vf_idx = 0; vf_idx < 64 && ret == I40E_SUCCESS; vf_idx++) {
- if (vf_mask & ((uint64_t)(1ULL << vf_idx))) {
- if (on)
- ret = i40e_vsi_add_vlan(pf->vfs[vf_idx].vsi,
- vlan_id);
- else
- ret = i40e_vsi_delete_vlan(pf->vfs[vf_idx].vsi,
- vlan_id);
- }
- }
-
- if (ret != I40E_SUCCESS) {
- ret = -ENOTSUP;
- PMD_DRV_LOG(ERR, "Failed to set VF VLAN filter, on = %d", on);
- }
-
- return ret;
-}
-
-int
-rte_pmd_i40e_get_vf_stats(uint8_t port,
- uint16_t vf_id,
- struct rte_eth_stats *stats)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid VF ID.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- i40e_update_vsi_stats(vsi);
-
- stats->ipackets = vsi->eth_stats.rx_unicast +
- vsi->eth_stats.rx_multicast +
- vsi->eth_stats.rx_broadcast;
- stats->opackets = vsi->eth_stats.tx_unicast +
- vsi->eth_stats.tx_multicast +
- vsi->eth_stats.tx_broadcast;
- stats->ibytes = vsi->eth_stats.rx_bytes;
- stats->obytes = vsi->eth_stats.tx_bytes;
- stats->ierrors = vsi->eth_stats.rx_discards;
- stats->oerrors = vsi->eth_stats.tx_errors + vsi->eth_stats.tx_discards;
-
- return 0;
-}
-
-int
-rte_pmd_i40e_reset_vf_stats(uint8_t port,
- uint16_t vf_id)
-{
- struct rte_eth_dev *dev;
- struct i40e_pf *pf;
- struct i40e_vsi *vsi;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
- dev = &rte_eth_devices[port];
-
- if (!is_device_supported(dev, &rte_i40e_pmd))
- return -ENOTSUP;
-
- pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-
- if (vf_id >= pf->vf_num || !pf->vfs) {
- PMD_DRV_LOG(ERR, "Invalid VF ID.");
- return -EINVAL;
- }
-
- vsi = pf->vfs[vf_id].vsi;
- if (!vsi) {
- PMD_DRV_LOG(ERR, "Invalid VSI.");
- return -EINVAL;
- }
-
- vsi->offset_loaded = false;
- i40e_update_vsi_stats(vsi);
-
- return 0;