17fa8d547SShradha Shah /**************************************************************************** 27fa8d547SShradha Shah * Driver for Solarflare network controllers and boards 37fa8d547SShradha Shah * Copyright 2014-2015 Solarflare Communications Inc. 47fa8d547SShradha Shah * 57fa8d547SShradha Shah * This program is free software; you can redistribute it and/or modify it 67fa8d547SShradha Shah * under the terms of the GNU General Public License version 2 as published 77fa8d547SShradha Shah * by the Free Software Foundation, incorporated herein by reference. 87fa8d547SShradha Shah */ 97fa8d547SShradha Shah #include <linux/module.h> 107fa8d547SShradha Shah #include "net_driver.h" 117fa8d547SShradha Shah #include "nic.h" 127fa8d547SShradha Shah #include "sriov.h" 137fa8d547SShradha Shah 147fa8d547SShradha Shah int efx_sriov_set_vf_mac(struct net_device *net_dev, int vf_i, u8 *mac) 157fa8d547SShradha Shah { 167fa8d547SShradha Shah struct efx_nic *efx = netdev_priv(net_dev); 177fa8d547SShradha Shah 187fa8d547SShradha Shah if (efx->type->sriov_set_vf_mac) 197fa8d547SShradha Shah return efx->type->sriov_set_vf_mac(efx, vf_i, mac); 207fa8d547SShradha Shah else 217fa8d547SShradha Shah return -EOPNOTSUPP; 227fa8d547SShradha Shah } 237fa8d547SShradha Shah 247fa8d547SShradha Shah int efx_sriov_set_vf_vlan(struct net_device *net_dev, int vf_i, u16 vlan, 2579aab093SMoshe Shemesh u8 qos, __be16 vlan_proto) 267fa8d547SShradha Shah { 277fa8d547SShradha Shah struct efx_nic *efx = netdev_priv(net_dev); 287fa8d547SShradha Shah 297fa8d547SShradha Shah if (efx->type->sriov_set_vf_vlan) { 307fa8d547SShradha Shah if ((vlan & ~VLAN_VID_MASK) || 317fa8d547SShradha Shah (qos & ~(VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT))) 327fa8d547SShradha Shah return -EINVAL; 337fa8d547SShradha Shah 3479aab093SMoshe Shemesh if (vlan_proto != htons(ETH_P_8021Q)) 3579aab093SMoshe Shemesh return -EPROTONOSUPPORT; 3679aab093SMoshe Shemesh 377fa8d547SShradha Shah return efx->type->sriov_set_vf_vlan(efx, vf_i, vlan, qos); 387fa8d547SShradha Shah } else { 397fa8d547SShradha Shah return -EOPNOTSUPP; 407fa8d547SShradha Shah } 417fa8d547SShradha Shah } 427fa8d547SShradha Shah 437fa8d547SShradha Shah int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf_i, 447fa8d547SShradha Shah bool spoofchk) 457fa8d547SShradha Shah { 467fa8d547SShradha Shah struct efx_nic *efx = netdev_priv(net_dev); 477fa8d547SShradha Shah 487fa8d547SShradha Shah if (efx->type->sriov_set_vf_spoofchk) 497fa8d547SShradha Shah return efx->type->sriov_set_vf_spoofchk(efx, vf_i, spoofchk); 507fa8d547SShradha Shah else 517fa8d547SShradha Shah return -EOPNOTSUPP; 527fa8d547SShradha Shah } 537fa8d547SShradha Shah 547fa8d547SShradha Shah int efx_sriov_get_vf_config(struct net_device *net_dev, int vf_i, 557fa8d547SShradha Shah struct ifla_vf_info *ivi) 567fa8d547SShradha Shah { 577fa8d547SShradha Shah struct efx_nic *efx = netdev_priv(net_dev); 587fa8d547SShradha Shah 597fa8d547SShradha Shah if (efx->type->sriov_get_vf_config) 607fa8d547SShradha Shah return efx->type->sriov_get_vf_config(efx, vf_i, ivi); 617fa8d547SShradha Shah else 627fa8d547SShradha Shah return -EOPNOTSUPP; 637fa8d547SShradha Shah } 644392dc69SEdward Cree 654392dc69SEdward Cree int efx_sriov_set_vf_link_state(struct net_device *net_dev, int vf_i, 664392dc69SEdward Cree int link_state) 674392dc69SEdward Cree { 684392dc69SEdward Cree struct efx_nic *efx = netdev_priv(net_dev); 694392dc69SEdward Cree 704392dc69SEdward Cree if (efx->type->sriov_set_vf_link_state) 714392dc69SEdward Cree return efx->type->sriov_set_vf_link_state(efx, vf_i, 724392dc69SEdward Cree link_state); 734392dc69SEdward Cree else 744392dc69SEdward Cree return -EOPNOTSUPP; 754392dc69SEdward Cree } 761d051e00SShradha Shah 771d051e00SShradha Shah int efx_sriov_get_phys_port_id(struct net_device *net_dev, 781d051e00SShradha Shah struct netdev_phys_item_id *ppid) 791d051e00SShradha Shah { 801d051e00SShradha Shah struct efx_nic *efx = netdev_priv(net_dev); 811d051e00SShradha Shah 821d051e00SShradha Shah if (efx->type->sriov_get_phys_port_id) 831d051e00SShradha Shah return efx->type->sriov_get_phys_port_id(efx, ppid); 841d051e00SShradha Shah else 851d051e00SShradha Shah return -EOPNOTSUPP; 861d051e00SShradha Shah } 87