diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 36 | 
1 files changed, 30 insertions, 6 deletions
| diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index b88fae785369..c1c0bc30a16d 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Intel(R) Gigabit Ethernet Linux driver   * Copyright(c) 2007-2014 Intel Corporation.   * @@ -190,6 +191,8 @@ static int igb_ndo_set_vf_vlan(struct net_device *netdev,  static int igb_ndo_set_vf_bw(struct net_device *, int, int, int);  static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf,  				   bool setting); +static int igb_ndo_set_vf_trust(struct net_device *netdev, int vf, +				bool setting);  static int igb_ndo_get_vf_config(struct net_device *netdev, int vf,  				 struct ifla_vf_info *ivi);  static void igb_check_vf_rate_limit(struct igb_adapter *); @@ -774,8 +777,7 @@ u32 igb_rd32(struct e1000_hw *hw, u32 reg)  	if (!(~value) && (!reg || !(~readl(hw_addr)))) {  		struct net_device *netdev = igb->netdev;  		hw->hw_addr = NULL; -		netif_device_detach(netdev); -		netdev_err(netdev, "PCIe link lost, device now detached\n"); +		netdev_err(netdev, "PCIe link lost\n");  	}  	return value; @@ -2527,6 +2529,7 @@ static const struct net_device_ops igb_netdev_ops = {  	.ndo_set_vf_vlan	= igb_ndo_set_vf_vlan,  	.ndo_set_vf_rate	= igb_ndo_set_vf_bw,  	.ndo_set_vf_spoofchk	= igb_ndo_set_vf_spoofchk, +	.ndo_set_vf_trust	= igb_ndo_set_vf_trust,  	.ndo_get_vf_config	= igb_ndo_get_vf_config,  #ifdef CONFIG_NET_POLL_CONTROLLER  	.ndo_poll_controller	= igb_netpoll, @@ -5747,7 +5750,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,  	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {  		struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); -		if (adapter->tstamp_config.tx_type & HWTSTAMP_TX_ON && +		if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&  		    !test_and_set_bit_lock(__IGB_PTP_TX_IN_PROGRESS,  					   &adapter->state)) {  			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; @@ -6383,6 +6386,9 @@ static int igb_vf_configure(struct igb_adapter *adapter, int vf)  	/* By default spoof check is enabled for all VFs */  	adapter->vf_data[vf].spoofchk_enabled = true; +	/* By default VFs are not trusted */ +	adapter->vf_data[vf].trusted = false; +  	return 0;  } @@ -6940,13 +6946,13 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,  		}  		break;  	case E1000_VF_MAC_FILTER_ADD: -		if (vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) { +		if ((vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) && +		    !vf_data->trusted) {  			dev_warn(&pdev->dev,  				 "VF %d requested MAC filter but is administratively denied\n",  				 vf);  			return -EINVAL;  		} -  		if (!is_valid_ether_addr(addr)) {  			dev_warn(&pdev->dev,  				 "VF %d attempted to set invalid MAC filter\n", @@ -6998,7 +7004,8 @@ static int igb_set_vf_mac_addr(struct igb_adapter *adapter, u32 *msg, int vf)  	int ret = 0;  	if (!info) { -		if (vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) { +		if ((vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) && +		    !vf_data->trusted) {  			dev_warn(&pdev->dev,  				 "VF %d attempted to override administratively set MAC address\nReload the VF driver to resume operations\n",  				 vf); @@ -8934,6 +8941,22 @@ static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf,  	return 0;  } +static int igb_ndo_set_vf_trust(struct net_device *netdev, int vf, bool setting) +{ +	struct igb_adapter *adapter = netdev_priv(netdev); + +	if (vf >= adapter->vfs_allocated_count) +		return -EINVAL; +	if (adapter->vf_data[vf].trusted == setting) +		return 0; + +	adapter->vf_data[vf].trusted = setting; + +	dev_info(&adapter->pdev->dev, "VF %u is %strusted\n", +		 vf, setting ? "" : "not "); +	return 0; +} +  static int igb_ndo_get_vf_config(struct net_device *netdev,  				 int vf, struct ifla_vf_info *ivi)  { @@ -8947,6 +8970,7 @@ static int igb_ndo_get_vf_config(struct net_device *netdev,  	ivi->vlan = adapter->vf_data[vf].pf_vlan;  	ivi->qos = adapter->vf_data[vf].pf_qos;  	ivi->spoofchk = adapter->vf_data[vf].spoofchk_enabled; +	ivi->trusted = adapter->vf_data[vf].trusted;  	return 0;  } |