NOSP-NGEN-artf231785-Recovery-support-added-if-nfaSt
diff --git a/src/nfa/hci/nfa_hci_act.c b/src/nfa/hci/nfa_hci_act.c
index 60db1b3..67a7e39 100755
--- a/src/nfa/hci/nfa_hci_act.c
+++ b/src/nfa/hci/nfa_hci_act.c
@@ -3202,6 +3202,7 @@
             }
             if((p_pipe-> dest_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE )&&(p_pipe-> local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE))
             {
+                p_pipe->pipe_state = NFA_HCI_PIPE_OPENED;
                 nfa_hciu_send_get_param_cmd (pipeId, NFA_HCI_GATES_LIST_INDEX);
             }
             break;
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.c
index a8751e0..9d0af37 100755
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.c
@@ -56,7 +56,8 @@
 
 #if (NXP_EXTNS == TRUE)
 #ifndef __CONFIG_H
-#include<config.h>
+#include <config.h>
+#include <stdlib.h>
 #endif
 #endif
 /*****************************************************************************
@@ -88,6 +89,8 @@
 void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data);
 static void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len, UINT8 pipe);
 static UINT8 nfa_ee_ce_p61_completed = 0x00;
+static void nfa_hci_reset_session_rsp_cb(UINT8 event, UINT16 param_len, UINT8 *p_param);
+BOOLEAN nfa_hci_is_valid_ese_cfg(void);
 static void read_config_timeout_param_values();
 #else
 static void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len);
@@ -1335,7 +1338,24 @@
             memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2));
             nfa_hci_restore_default_config (session_id);
         }
-        nfa_hci_startup ();
+#if (NXP_EXTNS == TRUE)
+        else
+        {
+            if(!nfa_hci_is_valid_ese_cfg() && (nfa_hci_cb.cfg.retry_cnt < NFA_HCI_INIT_MAX_RETRY))
+            {
+                nfa_hci_cb.cfg.retry_cnt++;
+                NFA_TRACE_DEBUG0 (" nfa_hci_handle_nv_read; reset ese session");
+                nfa_hciu_reset_session_id(nfa_hci_reset_session_rsp_cb);
+            }
+            else
+            {
+                NXP_NFC_RESET_MSB(nfa_hci_cb.cfg.retry_cnt);
+#endif
+                nfa_hci_startup ();
+#if (NXP_EXTNS == TRUE)
+            }
+        }
+#endif
     }
 }
 
@@ -1857,4 +1877,86 @@
         nfa_hci_rsp_timeout(NULL);
     }
 }
+
+/*******************************************************************************
+**
+** Function         nfa_hci_is_valid_ese_cfg
+**
+** Description      Validate ESE control block config parameters
+**
++** Returns          TRUE/FALSE
+**
+*******************************************************************************/
+BOOLEAN nfa_hci_is_valid_ese_cfg(void)
+{
+    /* Validate Gate Control block */
+    BOOLEAN isFoundidGate = TRUE;
+    BOOLEAN isFoundEtsi12 = TRUE;
+    UINT8 xx;
+    for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++)
+    {
+        if(((nfa_hci_cb.cfg.dyn_pipes[xx].dest_host)== 0xC0) && ((nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate)== NFA_HCI_IDENTITY_MANAGEMENT_GATE)
+                                         &&((nfa_hci_cb.cfg.dyn_pipes[xx].local_gate)== NFA_HCI_IDENTITY_MANAGEMENT_GATE))
+        {
+            NFA_TRACE_DEBUG0 ("nfa_hci_is_valid_ese_cfg()  Validate ID Management Gate Pipe Data");
+            NFA_TRACE_DEBUG1 ("nfa_hci_is_valid_ese_cfg()  Pipe id: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
+            NFA_TRACE_DEBUG1 ("nfa_hci_is_valid_ese_cfg()  Pipe state: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state);
+            if((nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id)!= 0x00)
+            {
+                NFA_TRACE_DEBUG0 ("nfa_hci_is_valid_ese_cfg()  Validate ID Management Gate Pipe State");
+                if((nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state) != NFA_HCI_PIPE_OPENED)
+                {
+                    isFoundidGate = FALSE;
+                }
+            }
+        }
+        if(((nfa_hci_cb.cfg.dyn_pipes[xx].dest_host)== 0xC0) && ((nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate)== NFA_HCI_ETSI12_APDU_GATE)
+                                         &&((nfa_hci_cb.cfg.dyn_pipes[xx].local_gate)== NFA_HCI_ETSI12_APDU_GATE))
+        {
+            NFA_TRACE_DEBUG0 ("nfa_hci_is_valid_ese_cfg()  Validate APDU Gate Pipe Data");
+            NFA_TRACE_DEBUG1 ("nfa_hci_is_valid_ese_cfg()  Pipe id: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
+            NFA_TRACE_DEBUG1 ("nfa_hci_is_valid_ese_cfg()  Pipe state: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state);
+            if((nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id)!= 0x00)
+            {
+                NFA_TRACE_DEBUG0 ("nfa_hci_is_valid_ese_cfg()  Validate APDU Gate Pipe State");
+                if((nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state) != NFA_HCI_PIPE_OPENED)
+                {
+                    isFoundEtsi12 = FALSE;
+                }
+            }
+        }
+    }
+
+    if(!(isFoundidGate && isFoundEtsi12))
+    {
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/*******************************************************************************
+**
+** Function         nfa_hci_reset_session_rsp_cb
+**
+** Description      Callback function for ESE session ID reset
+**
+** Returns          None
+**
+*******************************************************************************/
+static void nfa_hci_reset_session_rsp_cb(UINT8 event, UINT16 param_len, UINT8 *p_param)
+{
+    (void)event;
+    NFA_TRACE_DEBUG2("nfa_hci_reset_session_rsp_cb: Received length data = 0x%x status = 0x%x", param_len, p_param[3]);
+
+    if(p_param[3] == NFA_STATUS_OK)
+    {
+        NXP_NFC_SET_MSB(nfa_hci_cb.cfg.retry_cnt);
+        nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
+        exit(0);
+    }
+    else
+    {
+        nfa_hci_startup ();
+    }
+}
 #endif
diff --git a/src/nfa/hci/nfa_hci_utils.c b/src/nfa/hci/nfa_hci_utils.c
index fba5a10..b7fd5b6 100755
--- a/src/nfa/hci/nfa_hci_utils.c
+++ b/src/nfa/hci/nfa_hci_utils.c
@@ -1372,6 +1372,50 @@
     }
     return status;
 }
+
+/*******************************************************************************
+**
+** Function         nfa_hciu_reset_session_id
+**
++** Description      reset ESE session ID to FF
+**
+** Returns          tNFA_STATUS
+**
+*******************************************************************************/
+tNFA_STATUS nfa_hciu_reset_session_id(tNFA_VSC_CBACK *p_cback)
+{
+    tNFA_STATUS status = NFA_STATUS_FAILED;
+    UINT8 *pp, *p_start;
+    UINT8 cmd_len = 0;
+    tNFA_DM_API_SEND_VSC  *p_data;
+    BT_HDR  *p_cmd;
+    UINT8 id_buf[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+    NFA_TRACE_DEBUG1("%s: enter", __FUNCTION__);
+
+    p_data = (tNFA_DM_API_SEND_VSC *) GKI_getbuf (sizeof(tNFA_DM_API_SEND_VSC)+ NXP_NFC_PROP_MAX_CMD_BUF_SIZE);
+    if(p_data != NULL)
+    {
+        p_cmd = (BT_HDR *)p_data;
+        p_cmd->offset   = sizeof (tNFA_DM_API_SEND_VSC) - BT_HDR_SIZE;
+        pp = (UINT8 *)(p_cmd + 1) + p_cmd->offset;
+        NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
+        NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_SET_CONFIG);
+        p_start = pp;
+        pp++;
+        UINT8_TO_STREAM (pp, 0x01);
+        UINT8_TO_STREAM (pp, NXP_NFC_SET_CONFIG_PARAM_EXT);
+        UINT8_TO_STREAM (pp, NXP_NFC_PARAM_SWP_SESSIONID_INT2);
+        UINT8_TO_STREAM (pp, NXP_NFC_PARAM_SWP_SESSION_ID_LEN);
+        memcpy(pp, id_buf, NXP_NFC_PARAM_SWP_SESSION_ID_LEN);
+        pp = pp + NXP_NFC_PARAM_SWP_SESSION_ID_LEN;
+        cmd_len = (pp - p_start)-1; /*skip len byte filed*/
+        pp = p_start;
+        UINT8_TO_STREAM (pp, cmd_len);
+        p_cmd->len      = cmd_len + NCI_DATA_HDR_SIZE;
+        status = NFC_SendNxpNciCommand (p_cmd, p_cback);
+    }
+    return status;
+}
 #endif
 #if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
diff --git a/src/nfa/int/nfa_hci_int.h b/src/nfa/int/nfa_hci_int.h
index c5f2ee4..6a76e13 100755
--- a/src/nfa/int/nfa_hci_int.h
+++ b/src/nfa/int/nfa_hci_int.h
@@ -446,6 +446,7 @@
 #define NFA_HCI_CONN_ESE_PIPE       0x16
 #define NFA_HCI_APDU_PIPE           0x19
 #define NFA_HCI_CONN_UICC2_PIPE     0x23                /*Connectivity pipe no of UICC2*/
+#define NFA_HCI_INIT_MAX_RETRY      20
 #endif
 /* NFA HCI control block */
 typedef struct
@@ -535,6 +536,9 @@
         tNFA_ADMIN_GATE_INFO        admin_gate;
         tNFA_LINK_MGMT_GATE_INFO    link_mgmt_gate;
         tNFA_ID_MGMT_GATE_INFO      id_mgmt_gate;
+#if (NXP_EXTNS == TRUE)
+        UINT8                       retry_cnt;
+#endif
     } cfg;
 
 } tNFA_HCI_CB;
@@ -568,6 +572,7 @@
 #if (NXP_EXTNS == TRUE)
 extern void nfa_hci_release_transcieve();
 extern void nfa_hci_network_enable();
+extern tNFA_STATUS nfa_hciu_reset_session_id(tNFA_VSC_CBACK *p_cback);
 extern tNFA_STATUS nfa_hciu_send_raw_cmd(UINT8 param_len, UINT8* p_data, tNFA_VSC_CBACK   *p_cback);
 extern BOOLEAN nfa_hciu_check_nfcee_poll_done(UINT8 host_id);
 extern BOOLEAN nfa_hciu_check_nfcee_config_done(UINT8 host_id);
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index cf18895..bb7f4f4 100755
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -128,6 +128,11 @@
 #define ESE_HOST                        ((unsigned char)0xC0)
 #define NXP_FEATURE_ENABLED             ((unsigned char)0x01)    /* flag to indicate NXP feature is enabled*/
 #define NXP_FEATURE_DISABLED            ((unsigned char)0x00)    /* flag to indicate NXP feature is enabled*/
+#define NXP_NFC_PARAM_SWP_SESSIONID_INT2 ((unsigned char)0xEB)
+#define NXP_NFC_PARAM_SWP_SESSION_ID_LEN 8
+#define NXP_NFC_PROP_MAX_CMD_BUF_SIZE   ((unsigned char)0x40)
+#define NXP_NFC_SET_MSB(x)              (x |= 0x80)
+#define NXP_NFC_RESET_MSB(x)            (x &= 0x7F)
  /**********************************************
   * NFC Config Parameter IDs defined by NXP NFC
   **********************************************/