diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index d8b836a85cc3..f8e32833226c 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1211,8 +1211,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  		return -ENOMEM;  	/* initialize NAPI */ -	netif_napi_add(adapter->netdev, &q_vector->napi, -		       igb_poll, 64); +	netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll);  	/* tie q_vector and adapter together */  	adapter->q_vector[v_idx] = q_vector; @@ -3138,7 +3137,7 @@ static s32 igb_init_i2c(struct igb_adapter *adapter)  	adapter->i2c_algo.data = adapter;  	adapter->i2c_adap.algo_data = &adapter->i2c_algo;  	adapter->i2c_adap.dev.parent = &adapter->pdev->dev; -	strlcpy(adapter->i2c_adap.name, "igb BB", +	strscpy(adapter->i2c_adap.name, "igb BB",  		sizeof(adapter->i2c_adap.name));  	status = i2c_bit_add_bus(&adapter->i2c_adap);  	return status; @@ -3637,6 +3636,7 @@ static int igb_disable_sriov(struct pci_dev *pdev)  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct igb_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; +	unsigned long flags;  	/* reclaim resources allocated to VFs */  	if (adapter->vf_data) { @@ -3649,12 +3649,13 @@ static int igb_disable_sriov(struct pci_dev *pdev)  			pci_disable_sriov(pdev);  			msleep(500);  		} - +		spin_lock_irqsave(&adapter->vfs_lock, flags);  		kfree(adapter->vf_mac_list);  		adapter->vf_mac_list = NULL;  		kfree(adapter->vf_data);  		adapter->vf_data = NULL;  		adapter->vfs_allocated_count = 0; +		spin_unlock_irqrestore(&adapter->vfs_lock, flags);  		wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ);  		wrfl();  		msleep(100); @@ -3814,7 +3815,9 @@ static void igb_remove(struct pci_dev *pdev)  	igb_release_hw_control(adapter);  #ifdef CONFIG_PCI_IOV +	rtnl_lock();  	igb_disable_sriov(pdev); +	rtnl_unlock();  #endif  	unregister_netdev(netdev); @@ -3974,6 +3977,9 @@ static int igb_sw_init(struct igb_adapter *adapter)  	spin_lock_init(&adapter->nfc_lock);  	spin_lock_init(&adapter->stats64_lock); + +	/* init spinlock to avoid concurrency of VF resources */ +	spin_lock_init(&adapter->vfs_lock);  #ifdef CONFIG_PCI_IOV  	switch (hw->mac.type) {  	case e1000_82576: @@ -7958,8 +7964,10 @@ unlock:  static void igb_msg_task(struct igb_adapter *adapter)  {  	struct e1000_hw *hw = &adapter->hw; +	unsigned long flags;  	u32 vf; +	spin_lock_irqsave(&adapter->vfs_lock, flags);  	for (vf = 0; vf < adapter->vfs_allocated_count; vf++) {  		/* process any reset requests */  		if (!igb_check_for_rst(hw, vf)) @@ -7973,6 +7981,7 @@ static void igb_msg_task(struct igb_adapter *adapter)  		if (!igb_check_for_ack(hw, vf))  			igb_rcv_ack_from_vf(adapter, vf);  	} +	spin_unlock_irqrestore(&adapter->vfs_lock, flags);  }  /**  |