diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 60 | 
1 files changed, 51 insertions, 9 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index e118cf9265c7..61afc220fc6c 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -99,6 +99,24 @@ MODULE_LICENSE("GPL v2");  static struct workqueue_struct *i40e_wq; +static void netdev_hw_addr_refcnt(struct i40e_mac_filter *f, +				  struct net_device *netdev, int delta) +{ +	struct netdev_hw_addr *ha; + +	if (!f || !netdev) +		return; + +	netdev_for_each_mc_addr(ha, netdev) { +		if (ether_addr_equal(ha->addr, f->macaddr)) { +			ha->refcount += delta; +			if (ha->refcount <= 0) +				ha->refcount = 1; +			break; +		} +	} +} +  /**   * i40e_allocate_dma_mem_d - OS specific memory alloc for shared code   * @hw:   pointer to the HW structure @@ -2036,6 +2054,7 @@ static void i40e_undo_add_filter_entries(struct i40e_vsi *vsi,  	hlist_for_each_entry_safe(new, h, from, hlist) {  		/* We can simply free the wrapper structure */  		hlist_del(&new->hlist); +		netdev_hw_addr_refcnt(new->f, vsi->netdev, -1);  		kfree(new);  	}  } @@ -2383,6 +2402,10 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)  						       &tmp_add_list,  						       &tmp_del_list,  						       vlan_filters); + +		hlist_for_each_entry(new, &tmp_add_list, hlist) +			netdev_hw_addr_refcnt(new->f, vsi->netdev, 1); +  		if (retval)  			goto err_no_memory_locked; @@ -2515,6 +2538,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)  			if (new->f->state == I40E_FILTER_NEW)  				new->f->state = new->state;  			hlist_del(&new->hlist); +			netdev_hw_addr_refcnt(new->f, vsi->netdev, -1);  			kfree(new);  		}  		spin_unlock_bh(&vsi->mac_filter_hash_lock); @@ -8717,6 +8741,27 @@ int i40e_open(struct net_device *netdev)  }  /** + * i40e_netif_set_realnum_tx_rx_queues - Update number of tx/rx queues + * @vsi: vsi structure + * + * This updates netdev's number of tx/rx queues + * + * Returns status of setting tx/rx queues + **/ +static int i40e_netif_set_realnum_tx_rx_queues(struct i40e_vsi *vsi) +{ +	int ret; + +	ret = netif_set_real_num_rx_queues(vsi->netdev, +					   vsi->num_queue_pairs); +	if (ret) +		return ret; + +	return netif_set_real_num_tx_queues(vsi->netdev, +					    vsi->num_queue_pairs); +} + +/**   * i40e_vsi_open -   * @vsi: the VSI to open   * @@ -8752,13 +8797,7 @@ int i40e_vsi_open(struct i40e_vsi *vsi)  			goto err_setup_rx;  		/* Notify the stack of the actual queue counts. */ -		err = netif_set_real_num_tx_queues(vsi->netdev, -						   vsi->num_queue_pairs); -		if (err) -			goto err_set_queues; - -		err = netif_set_real_num_rx_queues(vsi->netdev, -						   vsi->num_queue_pairs); +		err = i40e_netif_set_realnum_tx_rx_queues(vsi);  		if (err)  			goto err_set_queues; @@ -14151,6 +14190,9 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,  		ret = i40e_config_netdev(vsi);  		if (ret)  			goto err_netdev; +		ret = i40e_netif_set_realnum_tx_rx_queues(vsi); +		if (ret) +			goto err_netdev;  		ret = register_netdev(vsi->netdev);  		if (ret)  			goto err_netdev; @@ -15451,8 +15493,8 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&  	    hw->aq.api_min_ver > I40E_FW_MINOR_VERSION(hw)) -		dev_info(&pdev->dev, -			 "The driver for the device detected a newer version of the NVM image v%u.%u than expected v%u.%u. Please install the most recent version of the network driver.\n", +		dev_dbg(&pdev->dev, +			"The driver for the device detected a newer version of the NVM image v%u.%u than v%u.%u.\n",  			 hw->aq.api_maj_ver,  			 hw->aq.api_min_ver,  			 I40E_FW_API_VERSION_MAJOR,  |