u16 cp_cmd;
u16 event_slow;
+ bool runtime_suspended;
struct mdio_ops {
void (*write)(void __iomem *, int, int);
rtl_unlock_work(tp);
tp->saved_wolopts = 0;
+ tp->runtime_suspended = false;
pm_runtime_put_noidle(&pdev->dev);
rtl8169_check_link_status(dev, tp, ioaddr);
rtl_lock_work(tp);
tp->saved_wolopts = __rtl8169_get_wol(tp);
__rtl8169_set_wol(tp, WAKE_ANY);
+ tp->runtime_suspended = true;
rtl_unlock_work(tp);
rtl8169_net_suspend(dev);
rtl_lock_work(tp);
__rtl8169_set_wol(tp, tp->saved_wolopts);
tp->saved_wolopts = 0;
+ tp->runtime_suspended = false;
rtl_unlock_work(tp);
rtl8169_init_phy(dev, tp);
pm_runtime_get_sync(d);
+ /* Get the device back to D0 state if it was runtime suspended. */
+ if (tp->runtime_suspended)
+ pci_set_power_state(pdev, PCI_D0);
+
rtl8169_net_suspend(dev);
/* Restore original MAC address */
rtl8169_hw_reset(tp);
+ /* Restore WOL flags if they were messed around with. */
+ if (tp->saved_wolopts)
+ __rtl8169_set_wol(tp, tp->saved_wolopts);
+
if (system_state == SYSTEM_POWER_OFF) {
if (__rtl8169_get_wol(tp) & WAKE_ANY) {
rtl_wol_suspend_quirk(tp);