**/
 static bool i40e_check_recovery_mode(struct i40e_pf *pf)
 {
-       u32 val = rd32(&pf->hw, I40E_GL_FWSTS) & I40E_GL_FWSTS_FWS1B_MASK;
-       bool is_recovery_mode = false;
-
-       if (pf->hw.mac.type == I40E_MAC_XL710)
-               is_recovery_mode =
-               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK ||
-               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK ||
-               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_TRANSITION_MASK ||
-               val == I40E_XL710_GL_FWSTS_FWS1B_REC_MOD_NVM_MASK;
-       if (pf->hw.mac.type == I40E_MAC_X722)
-               is_recovery_mode =
-               val == I40E_X722_GL_FWSTS_FWS1B_REC_MOD_CORER_MASK ||
-               val == I40E_X722_GL_FWSTS_FWS1B_REC_MOD_GLOBR_MASK;
-       if (is_recovery_mode) {
-               dev_notice(&pf->pdev->dev, "Firmware recovery mode detected. Limiting functionality.\n");
-               dev_notice(&pf->pdev->dev, "Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
+       u32 val = rd32(&pf->hw, I40E_GL_FWSTS);
+
+       if (val & I40E_GL_FWSTS_FWS1B_MASK) {
+               dev_crit(&pf->pdev->dev, "Firmware recovery mode detected. Limiting functionality.\n");
+               dev_crit(&pf->pdev->dev, "Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
                set_bit(__I40E_RECOVERY_MODE, pf->state);
 
                return true;
        }
-       if (test_and_clear_bit(__I40E_RECOVERY_MODE, pf->state))
-               dev_info(&pf->pdev->dev, "Reinitializing in normal mode with full functionality.\n");
+       if (test_bit(__I40E_RECOVERY_MODE, pf->state))
+               dev_info(&pf->pdev->dev, "Please do Power-On Reset to initialize adapter in normal mode with full functionality.\n");
 
        return false;
 }
        return ret;
 }
 
+/**
+ * i40e_check_fw_empr - check if FW issued unexpected EMP Reset
+ * @pf: board private structure
+ *
+ * Check FW registers to determine if FW issued unexpected EMP Reset.
+ * Every time when unexpected EMP Reset occurs the FW increments
+ * a counter of unexpected EMP Resets. When the counter reaches 10
+ * the FW should enter the Recovery mode
+ *
+ * Returns true if FW issued unexpected EMP Reset
+ **/
+static bool i40e_check_fw_empr(struct i40e_pf *pf)
+{
+       const u32 fw_sts = rd32(&pf->hw, I40E_GL_FWSTS) &
+                          I40E_GL_FWSTS_FWS1B_MASK;
+       return (fw_sts > I40E_GL_FWSTS_FWS1B_EMPR_0) &&
+              (fw_sts <= I40E_GL_FWSTS_FWS1B_EMPR_10);
+}
+
+/**
+ * i40e_handle_resets - handle EMP resets and PF resets
+ * @pf: board private structure
+ *
+ * Handle both EMP resets and PF resets and conclude whether there are
+ * any issues regarding these resets. If there are any issues then
+ * generate log entry.
+ *
+ * Return 0 if NIC is healthy or negative value when there are issues
+ * with resets
+ **/
+static i40e_status i40e_handle_resets(struct i40e_pf *pf)
+{
+       const i40e_status pfr = i40e_pf_loop_reset(pf);
+       const bool is_empr = i40e_check_fw_empr(pf);
+
+       if (is_empr || pfr != I40E_SUCCESS)
+               dev_crit(&pf->pdev->dev, "Entering recovery mode due to repeated FW resets. This may take several minutes. Refer to the Intel(R) Ethernet Adapters and Devices User Guide.\n");
+
+       return is_empr ? I40E_ERR_RESET_FAILED : pfr;
+}
+
 /**
  * i40e_init_recovery_mode - initialize subsystems needed in recovery mode
  * @pf: board private structure
                goto err_pf_reset;
        }
 
-       err = i40e_pf_loop_reset(pf);
-       if (err) {
-               dev_info(&pdev->dev, "Initial pf_reset failed: %d\n", err);
+       err = i40e_handle_resets(pf);
+       if (err)
                goto err_pf_reset;
-       }
 
        i40e_check_recovery_mode(pf);