#include <linux/pm_runtime.h>
 #include <linux/aer.h>
 #include <linux/prefetch.h>
+#include <linux/suspend.h>
 
 #include "e1000.h"
 
        return 0;
 }
 
+static 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));
 
        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)
                pm_runtime_put_noidle(&pdev->dev);
 
 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,