linux/drivers/net/ethernet/sfc/sriov.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/****************************************************************************
   3 * Driver for Solarflare network controllers and boards
   4 * Copyright 2014-2015 Solarflare Communications Inc.
   5 */
   6#include <linux/module.h>
   7#include "net_driver.h"
   8#include "nic.h"
   9#include "sriov.h"
  10
  11int efx_sriov_set_vf_mac(struct net_device *net_dev, int vf_i, u8 *mac)
  12{
  13        struct efx_nic *efx = netdev_priv(net_dev);
  14
  15        if (efx->type->sriov_set_vf_mac)
  16                return efx->type->sriov_set_vf_mac(efx, vf_i, mac);
  17        else
  18                return -EOPNOTSUPP;
  19}
  20
  21int efx_sriov_set_vf_vlan(struct net_device *net_dev, int vf_i, u16 vlan,
  22                          u8 qos, __be16 vlan_proto)
  23{
  24        struct efx_nic *efx = netdev_priv(net_dev);
  25
  26        if (efx->type->sriov_set_vf_vlan) {
  27                if ((vlan & ~VLAN_VID_MASK) ||
  28                    (qos & ~(VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT)))
  29                        return -EINVAL;
  30
  31                if (vlan_proto != htons(ETH_P_8021Q))
  32                        return -EPROTONOSUPPORT;
  33
  34                return efx->type->sriov_set_vf_vlan(efx, vf_i, vlan, qos);
  35        } else {
  36                return -EOPNOTSUPP;
  37        }
  38}
  39
  40int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf_i,
  41                              bool spoofchk)
  42{
  43        struct efx_nic *efx = netdev_priv(net_dev);
  44
  45        if (efx->type->sriov_set_vf_spoofchk)
  46                return efx->type->sriov_set_vf_spoofchk(efx, vf_i, spoofchk);
  47        else
  48                return -EOPNOTSUPP;
  49}
  50
  51int efx_sriov_get_vf_config(struct net_device *net_dev, int vf_i,
  52                            struct ifla_vf_info *ivi)
  53{
  54        struct efx_nic *efx = netdev_priv(net_dev);
  55
  56        if (efx->type->sriov_get_vf_config)
  57                return efx->type->sriov_get_vf_config(efx, vf_i, ivi);
  58        else
  59                return -EOPNOTSUPP;
  60}
  61
  62int efx_sriov_set_vf_link_state(struct net_device *net_dev, int vf_i,
  63                                int link_state)
  64{
  65        struct efx_nic *efx = netdev_priv(net_dev);
  66
  67        if (efx->type->sriov_set_vf_link_state)
  68                return efx->type->sriov_set_vf_link_state(efx, vf_i,
  69                                                          link_state);
  70        else
  71                return -EOPNOTSUPP;
  72}
  73