diff options
Diffstat (limited to 'drivers/net/ethernet/intel')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.c | 33 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_hwmon.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ptp.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 24 | 
5 files changed, 43 insertions, 22 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index b64542acfa3..12b1d848080 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c @@ -1818,27 +1818,32 @@ out:   **/  void igb_vmdq_set_anti_spoofing_pf(struct e1000_hw *hw, bool enable, int pf)  { -	u32 dtxswc; +	u32 reg_val, reg_offset;  	switch (hw->mac.type) {  	case e1000_82576: +		reg_offset = E1000_DTXSWC; +		break;  	case e1000_i350: -		dtxswc = rd32(E1000_DTXSWC); -		if (enable) { -			dtxswc |= (E1000_DTXSWC_MAC_SPOOF_MASK | -				   E1000_DTXSWC_VLAN_SPOOF_MASK); -			/* The PF can spoof - it has to in order to -			 * support emulation mode NICs */ -			dtxswc ^= (1 << pf | 1 << (pf + MAX_NUM_VFS)); -		} else { -			dtxswc &= ~(E1000_DTXSWC_MAC_SPOOF_MASK | -				    E1000_DTXSWC_VLAN_SPOOF_MASK); -		} -		wr32(E1000_DTXSWC, dtxswc); +		reg_offset = E1000_TXSWC;  		break;  	default: -		break; +		return; +	} + +	reg_val = rd32(reg_offset); +	if (enable) { +		reg_val |= (E1000_DTXSWC_MAC_SPOOF_MASK | +			     E1000_DTXSWC_VLAN_SPOOF_MASK); +		/* The PF can spoof - it has to in order to +		 * support emulation mode NICs +		 */ +		reg_val ^= (1 << pf | 1 << (pf + MAX_NUM_VFS)); +	} else { +		reg_val &= ~(E1000_DTXSWC_MAC_SPOOF_MASK | +			     E1000_DTXSWC_VLAN_SPOOF_MASK);  	} +	wr32(reg_offset, reg_val);  }  /** diff --git a/drivers/net/ethernet/intel/igb/igb_hwmon.c b/drivers/net/ethernet/intel/igb/igb_hwmon.c index 4623502054d..0478a1abe54 100644 --- a/drivers/net/ethernet/intel/igb/igb_hwmon.c +++ b/drivers/net/ethernet/intel/igb/igb_hwmon.c @@ -39,7 +39,7 @@  #include <linux/pci.h>  #ifdef CONFIG_IGB_HWMON -struct i2c_board_info i350_sensor_info = { +static struct i2c_board_info i350_sensor_info = {  	I2C_BOARD_INFO("i350bb", (0Xf8 >> 1)),  }; diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 4dbd62968c7..8496adfc6a6 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -2542,8 +2542,8 @@ static void igb_probe_vfs(struct igb_adapter *adapter)  	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))  		return; -	igb_enable_sriov(pdev, max_vfs);  	pci_sriov_set_totalvfs(pdev, 7); +	igb_enable_sriov(pdev, max_vfs);  #endif /* CONFIG_PCI_IOV */  } @@ -2652,7 +2652,7 @@ static int igb_sw_init(struct igb_adapter *adapter)  		if (max_vfs > 7) {  			dev_warn(&pdev->dev,  				 "Maximum of 7 VFs per PF, using max\n"); -			adapter->vfs_allocated_count = 7; +			max_vfs = adapter->vfs_allocated_count = 7;  		} else  			adapter->vfs_allocated_count = max_vfs;  		if (adapter->vfs_allocated_count) diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c index 0987822359f..0a237507ee8 100644 --- a/drivers/net/ethernet/intel/igb/igb_ptp.c +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c @@ -740,7 +740,7 @@ void igb_ptp_init(struct igb_adapter *adapter)  	case e1000_82576:  		snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);  		adapter->ptp_caps.owner = THIS_MODULE; -		adapter->ptp_caps.max_adj = 1000000000; +		adapter->ptp_caps.max_adj = 999999881;  		adapter->ptp_caps.n_ext_ts = 0;  		adapter->ptp_caps.pps = 0;  		adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82576; diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index ac0c315659d..5563250883a 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -950,9 +950,17 @@ free_queue_irqs:  		free_irq(adapter->msix_entries[vector].vector,  			 adapter->q_vector[vector]);  	} -	pci_disable_msix(adapter->pdev); -	kfree(adapter->msix_entries); -	adapter->msix_entries = NULL; +	/* This failure is non-recoverable - it indicates the system is +	 * out of MSIX vector resources and the VF driver cannot run +	 * without them.  Set the number of msix vectors to zero +	 * indicating that not enough can be allocated.  The error +	 * will be returned to the user indicating device open failed. +	 * Any further attempts to force the driver to open will also +	 * fail.  The only way to recover is to unload the driver and +	 * reload it again.  If the system has recovered some MSIX +	 * vectors then it may succeed. +	 */ +	adapter->num_msix_vectors = 0;  	return err;  } @@ -2575,6 +2583,15 @@ static int ixgbevf_open(struct net_device *netdev)  	struct ixgbe_hw *hw = &adapter->hw;  	int err; +	/* A previous failure to open the device because of a lack of +	 * available MSIX vector resources may have reset the number +	 * of msix vectors variable to zero.  The only way to recover +	 * is to unload/reload the driver and hope that the system has +	 * been able to recover some MSIX vector resources. +	 */ +	if (!adapter->num_msix_vectors) +		return -ENOMEM; +  	/* disallow open during test */  	if (test_bit(__IXGBEVF_TESTING, &adapter->state))  		return -EBUSY; @@ -2631,7 +2648,6 @@ static int ixgbevf_open(struct net_device *netdev)  err_req_irq:  	ixgbevf_down(adapter); -	ixgbevf_free_irq(adapter);  err_setup_rx:  	ixgbevf_free_all_rx_resources(adapter);  err_setup_tx:  |