diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/efx.c')
| -rw-r--r-- | drivers/net/ethernet/sfc/efx.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index bf57b3cb16a..0bc00991d31 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c @@ -779,6 +779,7 @@ efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries)  						tx_queue->txd.entries);  	} +	efx_device_detach_sync(efx);  	efx_stop_all(efx);  	efx_stop_interrupts(efx, true); @@ -832,6 +833,7 @@ out:  	efx_start_interrupts(efx, true);  	efx_start_all(efx); +	netif_device_attach(efx->net_dev);  	return rc;  rollback: @@ -1641,8 +1643,12 @@ static void efx_stop_all(struct efx_nic *efx)  	/* Flush efx_mac_work(), refill_workqueue, monitor_work */  	efx_flush_all(efx); -	/* Stop the kernel transmit interface late, so the watchdog -	 * timer isn't ticking over the flush */ +	/* Stop the kernel transmit interface.  This is only valid if +	 * the device is stopped or detached; otherwise the watchdog +	 * may fire immediately. +	 */ +	WARN_ON(netif_running(efx->net_dev) && +		netif_device_present(efx->net_dev));  	netif_tx_disable(efx->net_dev);  	efx_stop_datapath(efx); @@ -1963,16 +1969,18 @@ static int efx_change_mtu(struct net_device *net_dev, int new_mtu)  	if (new_mtu > EFX_MAX_MTU)  		return -EINVAL; -	efx_stop_all(efx); -  	netif_dbg(efx, drv, efx->net_dev, "changing MTU to %d\n", new_mtu); +	efx_device_detach_sync(efx); +	efx_stop_all(efx); +  	mutex_lock(&efx->mac_lock);  	net_dev->mtu = new_mtu;  	efx->type->reconfigure_mac(efx);  	mutex_unlock(&efx->mac_lock);  	efx_start_all(efx); +	netif_device_attach(efx->net_dev);  	return 0;  }  |