diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 17 | 
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 189f231075c2..736fa51878f8 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -5309,8 +5309,13 @@ static void e1000_watchdog_task(struct work_struct *work)  			/* 8000ES2LAN requires a Rx packet buffer work-around  			 * on link down event; reset the controller to flush  			 * the Rx packet buffer. +			 * +			 * If the link is lost the controller stops DMA, but +			 * if there is queued Tx work it cannot be done.  So +			 * reset the controller to flush the Tx packet buffers.  			 */ -			if (adapter->flags & FLAG_RX_NEEDS_RESTART) +			if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || +			    e1000_desc_unused(tx_ring) + 1 < tx_ring->count)  				adapter->flags |= FLAG_RESTART_NOW;  			else  				pm_schedule_suspend(netdev->dev.parent, @@ -5333,14 +5338,6 @@ link_up:  	adapter->gotc_old = adapter->stats.gotc;  	spin_unlock(&adapter->stats64_lock); -	/* If the link is lost the controller stops DMA, but -	 * if there is queued Tx work it cannot be done.  So -	 * reset the controller to flush the Tx packet buffers. -	 */ -	if (!netif_carrier_ok(netdev) && -	    (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) -		adapter->flags |= FLAG_RESTART_NOW; -  	/* If reset is necessary, do it outside of interrupt context. */  	if (adapter->flags & FLAG_RESTART_NOW) {  		schedule_work(&adapter->reset_task); @@ -7351,6 +7348,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	e1000_print_device_info(adapter); +	dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP); +  	if (pci_dev_run_wake(pdev))  		pm_runtime_put_noidle(&pdev->dev);  |