diff options
Diffstat (limited to 'drivers/net/ethernet/intel/iavf/iavf_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_main.c | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index f39440ad5c50..10aa99dfdcdb 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -2877,6 +2877,11 @@ static void iavf_reset_task(struct work_struct *work)  	int i = 0, err;  	bool running; +	/* Detach interface to avoid subsequent NDO callbacks */ +	rtnl_lock(); +	netif_device_detach(netdev); +	rtnl_unlock(); +  	/* When device is being removed it doesn't make sense to run the reset  	 * task, just return in such a case.  	 */ @@ -2884,7 +2889,7 @@ static void iavf_reset_task(struct work_struct *work)  		if (adapter->state != __IAVF_REMOVE)  			queue_work(iavf_wq, &adapter->reset_task); -		return; +		goto reset_finish;  	}  	while (!mutex_trylock(&adapter->client_lock)) @@ -2954,7 +2959,6 @@ continue_reset:  	if (running) {  		netif_carrier_off(netdev); -		netif_tx_stop_all_queues(netdev);  		adapter->link_up = false;  		iavf_napi_disable_all(adapter);  	} @@ -3084,7 +3088,7 @@ continue_reset:  	mutex_unlock(&adapter->client_lock);  	mutex_unlock(&adapter->crit_lock); -	return; +	goto reset_finish;  reset_err:  	if (running) {  		set_bit(__IAVF_VSI_DOWN, adapter->vsi.state); @@ -3095,6 +3099,10 @@ reset_err:  	mutex_unlock(&adapter->client_lock);  	mutex_unlock(&adapter->crit_lock);  	dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n"); +reset_finish: +	rtnl_lock(); +	netif_device_attach(netdev); +	rtnl_unlock();  }  /** | 
