struct e1000_mac_info *mac = &adapter->hw.mac;
        struct e1000_phy_info *phy = &adapter->hw.phy;
        struct e1000_ring *tx_ring = adapter->tx_ring;
+       u32 dmoff_exit_timeout = 100, tries = 0;
        struct e1000_hw *hw = &adapter->hw;
-       u32 link, tctl;
+       u32 link, tctl, pcim_state;
 
        if (test_bit(__E1000_DOWN, &adapter->state))
                return;
                        /* Cancel scheduled suspend requests. */
                        pm_runtime_resume(netdev->dev.parent);
 
+                       /* Checking if MAC is in DMoff state*/
+                       pcim_state = er32(STATUS);
+                       while (pcim_state & E1000_STATUS_PCIM_STATE) {
+                               if (tries++ == dmoff_exit_timeout) {
+                                       e_dbg("Error in exiting dmoff\n");
+                                       break;
+                               }
+                               usleep_range(10000, 20000);
+                               pcim_state = er32(STATUS);
+
+                               /* Checking if MAC exited DMoff state */
+                               if (!(pcim_state & E1000_STATUS_PCIM_STATE))
+                                       e1000_phy_hw_reset(&adapter->hw);
+                       }
+
                        /* update snapshot of PHY registers on LSC */
                        e1000_phy_read_status(adapter);
                        mac->ops.get_link_up_info(&adapter->hw,