}
        }
        if (link) {
+               /* Cancel scheduled suspend requests. */
+               pm_runtime_resume(netdev->dev.parent);
+
                if (!netif_carrier_ok(netdev)) {
                        u32 ctrl;
 
                                        return;
                                }
                        }
+                       pm_schedule_suspend(netdev->dev.parent,
+                                           MSEC_PER_SEC * 5);
 
                /* also check for alternate media here */
                } else if (!netif_carrier_ok(netdev) &&
 static int __igc_open(struct net_device *netdev, bool resuming)
 {
        struct igc_adapter *adapter = netdev_priv(netdev);
+       struct pci_dev *pdev = adapter->pdev;
        struct igc_hw *hw = &adapter->hw;
        int err = 0;
        int i = 0;
                return -EBUSY;
        }
 
+       if (!resuming)
+               pm_runtime_get_sync(&pdev->dev);
+
        netif_carrier_off(netdev);
 
        /* allocate transmit descriptors */
        rd32(IGC_ICR);
        igc_irq_enable(adapter);
 
+       if (!resuming)
+               pm_runtime_put(&pdev->dev);
+
        netif_tx_start_all_queues(netdev);
 
        /* start the watchdog. */
        igc_free_all_tx_resources(adapter);
 err_setup_tx:
        igc_reset(adapter);
+       if (!resuming)
+               pm_runtime_put(&pdev->dev);
 
        return err;
 }
 static int __igc_close(struct net_device *netdev, bool suspending)
 {
        struct igc_adapter *adapter = netdev_priv(netdev);
+       struct pci_dev *pdev = adapter->pdev;
 
        WARN_ON(test_bit(__IGC_RESETTING, &adapter->state));
 
+       if (!suspending)
+               pm_runtime_get_sync(&pdev->dev);
+
        igc_down(adapter);
 
        igc_release_hw_control(adapter);
        igc_free_all_tx_resources(adapter);
        igc_free_all_rx_resources(adapter);
 
+       if (!suspending)
+               pm_runtime_put_sync(&pdev->dev);
+
        return 0;
 }
 
        pcie_print_link_status(pdev);
        netdev_info(netdev, "MAC: %pM\n", netdev->dev_addr);
 
+       dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP);
+
+       pm_runtime_put_noidle(&pdev->dev);
+
        return 0;
 
 err_register:
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct igc_adapter *adapter = netdev_priv(netdev);
 
+       pm_runtime_get_noresume(&pdev->dev);
+
        igc_ptp_stop(adapter);
 
        set_bit(__IGC_DOWN, &adapter->state);