Snap for 4706961 from 641314c190b224db4de3557a9e86c840b3e16bb4 to pi-release
Change-Id: I6cb35c925b24bc678586c17eb228ba6b39d4ac91
diff --git a/src/nfa/ce/nfa_ce_act.cc b/src/nfa/ce/nfa_ce_act.cc
index d737a07..ad39aed 100644
--- a/src/nfa/ce/nfa_ce_act.cc
+++ b/src/nfa/ce/nfa_ce_act.cc
@@ -58,7 +58,17 @@
DLOG_IF(INFO, nfc_debug_enabled)
<< StringPrintf("nfa_ce_handle_t3t_evt: event 0x%x", event);
-
+ /* For the felica on host for nfcFcallback */
+ for (uint8_t idx = 0; idx < NFA_CE_LISTEN_INFO_IDX_INVALID; idx++) {
+ if ((p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
+ (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_FELICA) &&
+ (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+ p_cb->idx_cur_active = idx;
+ p_cb->p_active_conn_cback =
+ p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
+ break;
+ }
+ }
switch (event) {
case CE_T3T_NDEF_UPDATE_START_EVT:
/* Notify app using callback associated with the active ndef */
@@ -94,6 +104,21 @@
conn_evt.data.len = p_ce_data->raw_frame.p_data->len;
(*p_cb->p_active_conn_cback)(NFA_DATA_EVT, &conn_evt);
} else {
+ /* If we have not notified the app of activation, do so now */
+ if (p_cb->listen_info[p_cb->idx_cur_active].flags &
+ NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND) {
+ p_cb->listen_info[p_cb->idx_cur_active].flags &=
+ ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+
+ conn_evt.ce_activated.handle =
+ NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
+ memcpy(&(conn_evt.ce_activated.activate_ntf),
+ &p_cb->activation_params, sizeof(tNFC_ACTIVATE_DEVT));
+ conn_evt.ce_activated.status = NFA_STATUS_OK;
+
+ (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
+ }
+ /* Notify app of t3t raw data */
conn_evt.ce_data.status = p_ce_data->raw_frame.status;
conn_evt.ce_data.handle =
(NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active));
@@ -785,6 +810,11 @@
uint8_t i;
bool t4t_activate_pending = false;
+ bool t3t_activate_pending = false;
+ bool t3t_offhost_entry_found = false;
+ uint8_t t3t_activate_idx = 0;
+ uint8_t t3t_offhost_idx = 0;
+
DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
"protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol);
@@ -816,8 +846,10 @@
p_cb->activation_params.rf_tech_param.param.lf.nfcid2,
NCI_RF_F_UID_LEN) == 0)
/* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) {
- /* Found listen_info corresponding to this activation */
- break;
+ p_cb->listen_info[listen_info_idx].flags |=
+ NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+ t3t_activate_pending = true;
+ t3t_activate_idx = listen_info_idx;
}
}
@@ -826,12 +858,24 @@
NFA_CE_LISTEN_INFO_UICC) &&
(p_cb->listen_info[listen_info_idx].tech_mask &
NFA_TECHNOLOGY_MASK_F)) {
- break;
+ t3t_offhost_entry_found = true;
+ t3t_offhost_idx = listen_info_idx;
}
}
}
p_ce_cback = nfa_ce_handle_t3t_evt;
+ /* If listening for PROTO_T3T on DH and eSE/UICC, then notify CE module
+ * now and wait for reader/writer to SELECT a target */
+ if (t3t_activate_pending && t3t_offhost_entry_found) {
+ CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code,
+ p_ce_cback);
+ return true;
+ } else if (t3t_activate_pending) {
+ listen_info_idx = t3t_activate_idx;
+ } else if (t3t_offhost_entry_found) {
+ listen_info_idx = t3t_offhost_idx;
+ }
} else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) {
p_ce_cback = nfa_ce_handle_t4t_evt;
@@ -904,6 +948,8 @@
p_cb->listen_info[listen_info_idx].flags &=
~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
+ p_cb->listen_info[listen_info_idx].flags &=
+ ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
/* Get CONN_CBACK for this activation */
p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback;
@@ -1013,14 +1059,18 @@
}
} else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) &&
(p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) {
- if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
- conn_evt.deactivated.type = deact_type;
- (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
- } else {
- conn_evt.ce_deactivated.handle =
- NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
- conn_evt.ce_deactivated.type = deact_type;
- (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+ /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */
+ if (!(p_cb->listen_info[i].flags &
+ NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+ if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
+ conn_evt.deactivated.type = deact_type;
+ (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
+ } else {
+ conn_evt.ce_deactivated.handle =
+ NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
+ conn_evt.ce_deactivated.type = deact_type;
+ (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+ }
}
}
}
diff --git a/src/nfa/include/nfa_ce_int.h b/src/nfa/include/nfa_ce_int.h
index 24025ad..d113cd3 100644
--- a/src/nfa/include/nfa_ce_int.h
+++ b/src/nfa/include/nfa_ce_int.h
@@ -128,6 +128,8 @@
#define NFA_CE_LISTEN_INFO_FELICA 0x00000200
/* This is a listen_info for UICC */
#define NFA_CE_LISTEN_INFO_UICC 0x00000400
+/* App has not been notified of ACTIVATE_EVT yet for this HCEF NFCID2 */
+#define NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND 0x00010000
/* Structure for listen look up table */
typedef struct {