xref: /openbmc/linux/drivers/net/ethernet/sfc/sriov.c (revision 79aab093)
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