|  | // 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; | 
|  | } |