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
**********************************************/