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;