diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index e9b82c209c2d..88e9035b75cf 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -25,6 +25,7 @@  #include <linux/pm_runtime.h>  #include <linux/aer.h>  #include <linux/prefetch.h> +#include <linux/suspend.h>  #include "e1000.h" @@ -5974,19 +5975,23 @@ static void e1000_reset_task(struct work_struct *work)  	struct e1000_adapter *adapter;  	adapter = container_of(work, struct e1000_adapter, reset_task); +	rtnl_lock();  	/* don't run the task if already down */ -	if (test_bit(__E1000_DOWN, &adapter->state)) +	if (test_bit(__E1000_DOWN, &adapter->state)) { +		rtnl_unlock();  		return; +	}  	if (!(adapter->flags & FLAG_RESTART_NOW)) {  		e1000e_dump(adapter);  		e_err("Reset adapter unexpectedly\n");  	}  	e1000e_reinit_locked(adapter); +	rtnl_unlock();  }  /** - * e1000_get_stats64 - Get System Network Statistics + * e1000e_get_stats64 - Get System Network Statistics   * @netdev: network interface device structure   * @stats: rtnl_link_stats64 pointer   * @@ -6159,7 +6164,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,  }  /** - * e1000e_hwtstamp_ioctl - control hardware time stamping + * e1000e_hwtstamp_set - control hardware time stamping   * @netdev: network interface device structure   * @ifr: interface request   * @@ -6817,7 +6822,7 @@ static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)  }  /** - * e1000e_disable_aspm_locked   Disable ASPM states. + * e1000e_disable_aspm_locked - Disable ASPM states.   * @pdev: pointer to PCI device struct   * @state: bit-mask of ASPM states to disable   * @@ -6918,6 +6923,12 @@ static int __e1000_resume(struct pci_dev *pdev)  	return 0;  } +static __maybe_unused int e1000e_pm_prepare(struct device *dev) +{ +	return pm_runtime_suspended(dev) && +		pm_suspend_via_firmware(); +} +  static __maybe_unused int e1000e_pm_suspend(struct device *dev)  {  	struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); @@ -7626,9 +7637,9 @@ 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_NO_DIRECT_COMPLETE); +	dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_SMART_PREPARE); -	if (pci_dev_run_wake(pdev) && hw->mac.type < e1000_pch_cnp) +	if (pci_dev_run_wake(pdev) && hw->mac.type != e1000_pch_cnp)  		pm_runtime_put_noidle(&pdev->dev);  	return 0; @@ -7851,6 +7862,7 @@ MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);  static const struct dev_pm_ops e1000_pm_ops = {  #ifdef CONFIG_PM_SLEEP +	.prepare	= e1000e_pm_prepare,  	.suspend	= e1000e_pm_suspend,  	.resume		= e1000e_pm_resume,  	.freeze		= e1000e_pm_freeze, | 
