diff options
Diffstat (limited to 'drivers/net/ethernet/intel/iavf/iavf_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_main.c | 62 | 
1 files changed, 58 insertions, 4 deletions
| diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index dc5b3c06d1e0..e612c24fa384 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -959,8 +959,10 @@ void iavf_down(struct iavf_adapter *adapter)  {  	struct net_device *netdev = adapter->netdev;  	struct iavf_vlan_filter *vlf; -	struct iavf_mac_filter *f;  	struct iavf_cloud_filter *cf; +	struct iavf_fdir_fltr *fdir; +	struct iavf_mac_filter *f; +	struct iavf_adv_rss *rss;  	if (adapter->state <= __IAVF_DOWN_PENDING)  		return; @@ -996,6 +998,19 @@ void iavf_down(struct iavf_adapter *adapter)  	}  	spin_unlock_bh(&adapter->cloud_filter_list_lock); +	/* remove all Flow Director filters */ +	spin_lock_bh(&adapter->fdir_fltr_lock); +	list_for_each_entry(fdir, &adapter->fdir_list_head, list) { +		fdir->state = IAVF_FDIR_FLTR_DEL_REQUEST; +	} +	spin_unlock_bh(&adapter->fdir_fltr_lock); + +	/* remove all advance RSS configuration */ +	spin_lock_bh(&adapter->adv_rss_lock); +	list_for_each_entry(rss, &adapter->adv_rss_list_head, list) +		rss->state = IAVF_ADV_RSS_DEL_REQUEST; +	spin_unlock_bh(&adapter->adv_rss_lock); +  	if (!(adapter->flags & IAVF_FLAG_PF_COMMS_FAILED) &&  	    adapter->state != __IAVF_RESETTING) {  		/* cancel any current operation */ @@ -1007,6 +1022,8 @@ void iavf_down(struct iavf_adapter *adapter)  		adapter->aq_required = IAVF_FLAG_AQ_DEL_MAC_FILTER;  		adapter->aq_required |= IAVF_FLAG_AQ_DEL_VLAN_FILTER;  		adapter->aq_required |= IAVF_FLAG_AQ_DEL_CLOUD_FILTER; +		adapter->aq_required |= IAVF_FLAG_AQ_DEL_FDIR_FILTER; +		adapter->aq_required |= IAVF_FLAG_AQ_DEL_ADV_RSS_CFG;  		adapter->aq_required |= IAVF_FLAG_AQ_DISABLE_QUEUES;  	} @@ -1629,6 +1646,22 @@ static int iavf_process_aq_command(struct iavf_adapter *adapter)  		iavf_add_cloud_filter(adapter);  		return 0;  	} +	if (adapter->aq_required & IAVF_FLAG_AQ_ADD_FDIR_FILTER) { +		iavf_add_fdir_filter(adapter); +		return IAVF_SUCCESS; +	} +	if (adapter->aq_required & IAVF_FLAG_AQ_DEL_FDIR_FILTER) { +		iavf_del_fdir_filter(adapter); +		return IAVF_SUCCESS; +	} +	if (adapter->aq_required & IAVF_FLAG_AQ_ADD_ADV_RSS_CFG) { +		iavf_add_adv_rss_cfg(adapter); +		return 0; +	} +	if (adapter->aq_required & IAVF_FLAG_AQ_DEL_ADV_RSS_CFG) { +		iavf_del_adv_rss_cfg(adapter); +		return 0; +	}  	return -EAGAIN;  } @@ -2529,7 +2562,7 @@ validate_bw:  }  /** - * iavf_validate_channel_config - validate queue mapping info + * iavf_validate_ch_config - validate queue mapping info   * @adapter: board private structure   * @mqprio_qopt: queue parameters   * @@ -3525,6 +3558,8 @@ int iavf_process_config(struct iavf_adapter *adapter)  	/* Enable cloud filter if ADQ is supported */  	if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ)  		hw_features |= NETIF_F_HW_TC; +	if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_USO) +		hw_features |= NETIF_F_GSO_UDP_L4;  	netdev->hw_features |= hw_features; @@ -3738,10 +3773,14 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	spin_lock_init(&adapter->mac_vlan_list_lock);  	spin_lock_init(&adapter->cloud_filter_list_lock); +	spin_lock_init(&adapter->fdir_fltr_lock); +	spin_lock_init(&adapter->adv_rss_lock);  	INIT_LIST_HEAD(&adapter->mac_filter_list);  	INIT_LIST_HEAD(&adapter->vlan_filter_list);  	INIT_LIST_HEAD(&adapter->cloud_filter_list); +	INIT_LIST_HEAD(&adapter->fdir_list_head); +	INIT_LIST_HEAD(&adapter->adv_rss_list_head);  	INIT_WORK(&adapter->reset_task, iavf_reset_task);  	INIT_WORK(&adapter->adminq_task, iavf_adminq_task); @@ -3845,7 +3884,9 @@ static void iavf_remove(struct pci_dev *pdev)  {  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct iavf_adapter *adapter = netdev_priv(netdev); +	struct iavf_fdir_fltr *fdir, *fdirtmp;  	struct iavf_vlan_filter *vlf, *vlftmp; +	struct iavf_adv_rss *rss, *rsstmp;  	struct iavf_mac_filter *f, *ftmp;  	struct iavf_cloud_filter *cf, *cftmp;  	struct iavf_hw *hw = &adapter->hw; @@ -3899,8 +3940,6 @@ static void iavf_remove(struct pci_dev *pdev)  	iounmap(hw->hw_addr);  	pci_release_regions(pdev); -	iavf_free_all_tx_resources(adapter); -	iavf_free_all_rx_resources(adapter);  	iavf_free_queues(adapter);  	kfree(adapter->vf_res);  	spin_lock_bh(&adapter->mac_vlan_list_lock); @@ -3926,6 +3965,21 @@ static void iavf_remove(struct pci_dev *pdev)  	}  	spin_unlock_bh(&adapter->cloud_filter_list_lock); +	spin_lock_bh(&adapter->fdir_fltr_lock); +	list_for_each_entry_safe(fdir, fdirtmp, &adapter->fdir_list_head, list) { +		list_del(&fdir->list); +		kfree(fdir); +	} +	spin_unlock_bh(&adapter->fdir_fltr_lock); + +	spin_lock_bh(&adapter->adv_rss_lock); +	list_for_each_entry_safe(rss, rsstmp, &adapter->adv_rss_list_head, +				 list) { +		list_del(&rss->list); +		kfree(rss); +	} +	spin_unlock_bh(&adapter->adv_rss_lock); +  	free_netdev(netdev);  	pci_disable_pcie_error_reporting(pdev); | 
