| // SPDX-License-Identifier: GPL-2.0-only | |
| /**************************************************************************** | |
| * Driver for Solarflare network controllers and boards | |
| * Copyright 2014-2015 Solarflare Communications Inc. | |
| */ | |
| #include <linux/module.h> | |
| #include "net_driver.h" | |
| #include "nic.h" | |
| #include "sriov.h" | |
| int efx_sriov_set_vf_mac(struct net_device *net_dev, int vf_i, u8 *mac) | |
| { | |
| struct efx_nic *efx = efx_netdev_priv(net_dev); | |
| if (efx->type->sriov_set_vf_mac) | |
| return efx->type->sriov_set_vf_mac(efx, vf_i, mac); | |
| else | |
| return -EOPNOTSUPP; | |
| } | |
| int efx_sriov_set_vf_vlan(struct net_device *net_dev, int vf_i, u16 vlan, | |
| u8 qos, __be16 vlan_proto) | |
| { | |
| struct efx_nic *efx = efx_netdev_priv(net_dev); | |
| if (efx->type->sriov_set_vf_vlan) { | |
| if ((vlan & ~VLAN_VID_MASK) || | |
| (qos & ~(VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT))) | |
| return -EINVAL; | |
| if (vlan_proto != htons(ETH_P_8021Q)) | |
| return -EPROTONOSUPPORT; | |
| return efx->type->sriov_set_vf_vlan(efx, vf_i, vlan, qos); | |
| } else { | |
| return -EOPNOTSUPP; | |
| } | |
| } | |
| int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf_i, | |
| bool spoofchk) | |
| { | |
| struct efx_nic *efx = efx_netdev_priv(net_dev); | |
| if (efx->type->sriov_set_vf_spoofchk) | |
| return efx->type->sriov_set_vf_spoofchk(efx, vf_i, spoofchk); | |
| else | |
| return -EOPNOTSUPP; | |
| } | |
| int efx_sriov_get_vf_config(struct net_device *net_dev, int vf_i, | |
| struct ifla_vf_info *ivi) | |
| { | |
| struct efx_nic *efx = efx_netdev_priv(net_dev); | |
| if (efx->type->sriov_get_vf_config) | |
| return efx->type->sriov_get_vf_config(efx, vf_i, ivi); | |
| else | |
| return -EOPNOTSUPP; | |
| } | |
| int efx_sriov_set_vf_link_state(struct net_device *net_dev, int vf_i, | |
| int link_state) | |
| { | |
| struct efx_nic *efx = efx_netdev_priv(net_dev); | |
| if (efx->type->sriov_set_vf_link_state) | |
| return efx->type->sriov_set_vf_link_state(efx, vf_i, | |
| link_state); | |
| else | |
| return -EOPNOTSUPP; | |
| } |