MW handling of NFCEE STATUS NTF with unrecoverable error
diff --git a/src/hal/include/nci_defs.h b/src/hal/include/nci_defs.h
index 757d52f..1b7e99e 100644
--- a/src/hal/include/nci_defs.h
+++ b/src/hal/include/nci_defs.h
@@ -361,6 +361,12 @@
 #define NCI_RF_PARAM_ID_B_DATA_EX_PARAM \
   0x03 /* B Data Exchange config param  \
           */
+/****************************************************
+ * NCI NFCEE status
+ ****************************************************/
+#define NCI_NFCEE_STS_UNRECOVERABLE_ERROR 0x00
+#define NCI_NFCEE_STS_INIT_STARTED        0x01
+#define NCI_NFCEE_STS_INIT_COMPLETED      0x02
 
 #define NCI_NFCEE_INTERFACE_APDU 0x00
 #define NCI_NFCEE_INTERFACE_HCI_ACCESS 0x01
diff --git a/src/nfa/dm/nfa_dm_act.c b/src/nfa/dm/nfa_dm_act.c
index 2abecb1..f49cd30 100644
--- a/src/nfa/dm/nfa_dm_act.c
+++ b/src/nfa/dm/nfa_dm_act.c
@@ -427,6 +427,7 @@
         }
     case NFC_NFCEE_MODE_SET_INFO:
 #endif
+    case NFC_NFCEE_STATUS_REVT:
     case NFC_SET_ROUTING_REVT: /* Configure Routing response */
       nfa_ee_proc_evt(event, p_data);
       break;
@@ -2071,6 +2072,9 @@
     case NFC_NFCC_POWER_OFF_REVT:
       return "NFC_NFCC_POWER_OFF_REVT";
 
+    case NFC_NFCEE_STATUS_REVT:
+        return "NFC_NFCEE_STATUS_REVT";
+
 #if (NXP_EXTNS == TRUE)
     case NFC_NFCEE_PWR_LNK_CTRL_REVT:
         if(nfcFL.eseFL._WIRED_MODE_STANDBY) {
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.c
index 13e8931..8d53960 100644
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.c
@@ -1936,6 +1936,8 @@
                        evt_data.ee_discover.ee_info);
       nfa_ee_report_event(NULL, NFA_EE_DISCOVER_EVT, &evt_data);
     }
+    if (nfa_ee_cb.p_enable_cback)
+                (*nfa_ee_cb.p_enable_cback) (NFA_EE_MODE_SET_COMPLETE);
 #endif
   }
 }
@@ -2267,6 +2269,30 @@
 
 /*******************************************************************************
 **
+** Function         nfa_ee_nci_nfcee_status_ntf
+**
+** Description      Process the callback for NFCEE status notification
+**
+** Returns          void
+**
+*******************************************************************************/
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data) {
+  tNFC_NFCEE_STATUS_REVT* p_ee = p_data->nfcee_status_ntf.p_data;
+  NFA_TRACE_DEBUG3(
+      "nfa_ee_nci_nfcee_status_ntf() em_state:%d, nfcee_id:%d nfcee_status:%d",
+      nfa_ee_cb.em_state, p_ee->nfcee_id, p_ee->status);
+  tNFA_EE_ECB* p_cb = nfa_ee_find_ecb(p_ee->nfcee_id);
+  if(p_ee->status == NFC_NFCEE_STS_UNRECOVERABLE_ERROR) {
+    if(p_cb != NULL) {
+        if (nfa_ee_cb.p_enable_cback)
+                    (*nfa_ee_cb.p_enable_cback) (NFA_EE_RECOVERY);
+        NFC_NfceeDiscover(true);
+    }
+  }
+}
+
+/*******************************************************************************
+**
 ** Function         nfa_ee_check_restore_complete
 **
 ** Description      Check if restore the NFA-EE related configuration to the
diff --git a/src/nfa/ee/nfa_ee_main.c b/src/nfa/ee/nfa_ee_main.c
index 5d92829..958a816 100644
--- a/src/nfa/ee/nfa_ee_main.c
+++ b/src/nfa/ee/nfa_ee_main.c
@@ -101,7 +101,8 @@
     nfa_ee_discv_timeout,    /* NFA_EE_DISCV_TIMEOUT_EVT     */
     nfa_ee_lmrt_to_nfcc,      /* NFA_EE_CFG_TO_NFCC_EVT       */
     nfa_ee_api_add_apdu,       /* NFA_EE_API_ADD_AID_EVT       */
-    nfa_ee_api_remove_apdu    /* NFA_EE_API_REMOVE_AID_EVT    */
+    nfa_ee_api_remove_apdu,    /* NFA_EE_API_REMOVE_AID_EVT    */
+    nfa_ee_nci_nfcee_status_ntf        /*NFA_EE_NCI_NFCEE_STATUS_NTF_EVT*/
 };
 
 /*******************************************************************************
@@ -386,6 +387,10 @@
         }
       break;
 #endif
+
+    case NFC_NFCEE_STATUS_REVT:
+      int_event = NFA_EE_NCI_NFCEE_STATUS_NTF_EVT;
+      break;
   }
 
   NFA_TRACE_DEBUG2("nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event,
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.c
index dd5ae8b..dddd1a1 100644
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.c
@@ -250,7 +250,9 @@
         /*received mode set Ntf */
         NFA_TRACE_DEBUG1("nfa_hci_ee_info_cback (): %d  nfa_hci_cb.hci_state", nfa_hci_cb.hci_state);
         if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
-            (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
+            (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)||
+            (nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY)
+            ) {
             /* Discovery operation is complete, retrieve discovery result */
           NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
           nfa_hci_enable_one_nfcee();
@@ -260,6 +262,12 @@
             nfa_hci_api_config_nfcee(nfa_hci_cb.current_nfcee);
         }
       break;
+    case NFA_EE_RECOVERY:
+        /*NFCEE recovery in progress*/
+        nfa_hci_cb.nfcee_cfg.discovery_stopped =
+            nfa_dm_act_stop_rf_discovery(NULL);
+        nfa_hci_cb.hci_state = NFA_HCI_STATE_EE_RECOVERY;
+        break;
   }
 }
 
@@ -753,12 +761,20 @@
     }
   }
 
-  if(xx == nfa_hci_cb.num_nfcee)
-  {
-    nfa_hci_cb.w4_nfcee_enable = false;
-    nfa_hciu_send_get_param_cmd(NFA_HCI_ADMIN_PIPE,NFA_HCI_HOST_LIST_INDEX);
+  if(xx == nfa_hci_cb.num_nfcee) {
+    if((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
+                  (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
+      nfa_hci_cb.w4_nfcee_enable = false;
+      nfa_hciu_send_get_param_cmd(NFA_HCI_ADMIN_PIPE,NFA_HCI_HOST_LIST_INDEX);
+    } else if(nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) {
+        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
+        if (true == nfa_hci_cb.nfcee_cfg.discovery_stopped) {
+          nfa_hci_cb.nfcee_cfg.discovery_stopped = false;
+          nfa_dm_act_start_rf_discovery(NULL);
+        }
+    }
   }
- }
+}
 
 /*******************************************************************************
 **
diff --git a/src/nfa/int/nfa_ee_int.h b/src/nfa/int/nfa_ee_int.h
index adf43f6..aeaaf97 100644
--- a/src/nfa/int/nfa_ee_int.h
+++ b/src/nfa/int/nfa_ee_int.h
@@ -98,6 +98,7 @@
   NFA_EE_CFG_TO_NFCC_EVT,
   NFA_EE_API_ADD_APDU_EVT,
   NFA_EE_API_REMOVE_APDU_EVT,
+  NFA_EE_NCI_NFCEE_STATUS_NTF_EVT,
   NFA_EE_MAX_EVT
 };
 
@@ -212,6 +213,7 @@
 /* part of tNFA_EE_STATUS; for internal use only  */
 /* waiting for restore to full power mode to complete */
 #define NFA_EE_STATUS_RESTORING 0x20
+
 /* this bit is in ee_status for internal use only */
 #define NFA_EE_STATUS_INT_MASK 0x20
 
@@ -480,6 +482,7 @@
   NFC_HDR hdr;
   tNFC_NFCEE_MODE_SET_INFO* p_data;
 } tNFA_EE_NCI_SET_MODE_INFO;
+
 /* data type for NFA_EE_NCI_MODE_SET_RSP_EVT */
 typedef struct {
   NFC_HDR hdr;
@@ -514,6 +517,12 @@
   tNFC_EE_DISCOVER_REQ_REVT* p_data;
 } tNFA_EE_NCI_DISC_REQ;
 
+/* data type for NFA_EE_NCI_NFCEE_STATUS_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  tNFC_NFCEE_STATUS_REVT* p_data;
+} tNFA_EE_NCI_NFCEE_STATUS_NTF;
+
 /* union of all event data types */
 typedef union {
   NFC_HDR hdr;
@@ -543,6 +552,7 @@
   tNFA_EE_NCI_CONN conn;
   tNFA_EE_NCI_ACTION act;
   tNFA_EE_NCI_DISC_REQ disc_req;
+  tNFA_EE_NCI_NFCEE_STATUS_NTF nfcee_status_ntf;
 } tNFA_EE_MSG;
 
 /* type for State Machine (SM) action functions */
@@ -598,7 +608,9 @@
 #if (NXP_EXTNS == TRUE)
 /* received NFCEE_MODE_SET NTF  */
 #define NFA_EE_MODE_SET_NTF 0x04
+#define NFA_EE_RECOVERY 0x05
 #endif
+
 typedef uint8_t tNFA_EE_DISC_STS;
 
 typedef void(tNFA_EE_ENABLE_DONE_CBACK)(tNFA_EE_DISC_STS status);
@@ -704,6 +716,7 @@
 void nfa_ee_nci_set_mode_info(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_pwr_link_ctrl_rsp(tNFA_EE_MSG* p_data);
 #endif
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_wait_rsp(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_conn(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_action_ntf(tNFA_EE_MSG* p_data);
diff --git a/src/nfa/int/nfa_hci_int.h b/src/nfa/int/nfa_hci_int.h
index 6d4c8cf..d5113f1 100644
--- a/src/nfa/int/nfa_hci_int.h
+++ b/src/nfa/int/nfa_hci_int.h
@@ -124,6 +124,7 @@
 #if (NXP_EXTNS == TRUE)
 /* HCI is waiting for NFCEE initialization */
 #define NFA_HCI_STATE_NFCEE_ENABLE 0x09
+#define NFA_HCI_STATE_EE_RECOVERY 0x0A
 #endif
 
 #if (NXP_EXTNS == TRUE)
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 6039db3..1fde84b 100644
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -448,6 +448,10 @@
   uint8_t info[NFC_MAX_EE_INFO];
 } tNFC_NFCEE_TLV;
 
+#define NFC_NFCEE_STS_UNRECOVERABLE_ERROR   NCI_NFCEE_STS_UNRECOVERABLE_ERROR
+#define NFC_NFCEE_STS_INIT_STARTED          NCI_NFCEE_STS_INIT_STARTED
+#define NFC_NFCEE_STS_INIT_COMPLETED        NCI_NFCEE_STS_INIT_COMPLETED
+
 /* NFCEE connected and inactive */
 #define NFC_NFCEE_STATUS_INACTIVE NCI_NFCEE_STS_CONN_INACTIVE
 /* NFCEE connected and active   */
@@ -459,6 +463,7 @@
 #define NFC_NFCEE_STS_TRANSMISSION_ERROR     NCI_NFCEE_STS_TRANSMISSION_ERROR
 #define NFC_NFCEE_STS_PROTOCOL_ERROR         NCI_NFCEE_STS_PROTOCOL_ERROR
 #define NFC_NFCEE_STS_TIMEOUT_ERROR          NCI_NFCEE_STS_TIMEOUT_ERROR
+
 typedef struct {
   tNFC_STATUS status;    /* The event status - place holder  */
   uint8_t nfcee_id;      /* NFCEE ID                         */
diff --git a/src/nfc/nfc/nfc_ee.c b/src/nfc/nfc/nfc_ee.c
old mode 100755
new mode 100644
index f398d5f..e26ac8c
--- a/src/nfc/nfc/nfc_ee.c
+++ b/src/nfc/nfc/nfc_ee.c
@@ -47,6 +47,10 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_NfceeDiscover(bool discover) {
+  if(nfc_cb.flags & NFC_FL_WAIT_MODE_SET_NTF) {
+    NFC_TRACE_ERROR1("mode set ntf pending ,not allowing nfcee_discover %d", discover);
+    return NFC_STATUS_FAILED;
+  }
   return nci_snd_nfcee_discover((uint8_t)(
       discover ? NCI_DISCOVER_ACTION_ENABLE : NCI_DISCOVER_ACTION_DISABLE));
 }
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 3b24912..6d2cdca 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -2806,7 +2806,7 @@
   tNFC_NFCEE_MODE_SET_REVT    mode_set_info;
   tNFC_RESPONSE_CBACK  *p_cback = nfc_cb.p_resp_cback;
   tNFC_NFCEE_INFO_REVT nfcee_info;
-
+  nfc_cb.flags  &= ~NFC_FL_WAIT_MODE_SET_NTF;
   tNFC_RESPONSE_EVT event    = NFC_NFCEE_MODE_SET_REVT;
   mode_set_info.status        = NCI_STATUS_FAILED;