blob: d13cb320b3d9764d67ab236449d9ce8c689368b6 [file] [log] [blame]
nxpandroidc7611652015-09-23 16:42:05 +05301/******************************************************************************
2 *
nxpandroidc7611652015-09-23 16:42:05 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 ******************************************************************************/
17/******************************************************************************
18 *
nxf24591c1cbeab2018-02-21 17:32:26 +053019 * The original Work has been changed by NXP.
nxpandroidc7611652015-09-23 16:42:05 +053020 *
21 * Licensed under the Apache License, Version 2.0 (the "License");
22 * you may not use this file except in compliance with the License.
23 * You may obtain a copy of the License at
24 *
25 * http://www.apache.org/licenses/LICENSE-2.0
26 *
27 * Unless required by applicable law or agreed to in writing, software
28 * distributed under the License is distributed on an "AS IS" BASIS,
29 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30 * See the License for the specific language governing permissions and
31 * limitations under the License.
32 *
nxf24591c1cbeab2018-02-21 17:32:26 +053033 * Copyright 2018 NXP
34 *
nxpandroidc7611652015-09-23 16:42:05 +053035 ******************************************************************************/
36/******************************************************************************
37 *
38 * This file contains the action functions for device manager discovery
39 * function.
40 *
41 ******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +053042#include <string>
43
44#include <android-base/stringprintf.h>
45#include <base/logging.h>
46
47#include "nci_hmsgs.h"
nxpandroidc7611652015-09-23 16:42:05 +053048#include "nfa_api.h"
49#include "nfa_dm_int.h"
50#include "nfa_p2p_int.h"
nxf24591c1cbeab2018-02-21 17:32:26 +053051
52#if (NFC_NFCEE_INCLUDED == TRUE)
nxpandroidc7611652015-09-23 16:42:05 +053053#include "nfa_ee_api.h"
54#include "nfa_ee_int.h"
55#endif
56#include "nfa_rw_int.h"
57
nxpandroidc7611652015-09-23 16:42:05 +053058#include "nfc_int.h"
nxpandroid8f6d0532017-07-12 18:25:30 +053059#if (NXP_EXTNS == TRUE)
60#include <config.h>
nxf24591c1cbeab2018-02-21 17:32:26 +053061#include "nfc_config.h"
nxpandroidc7611652015-09-23 16:42:05 +053062#endif
nxf24591c1cbeab2018-02-21 17:32:26 +053063using android::base::StringPrintf;
64
65extern bool nfc_debug_enabled;
nxf2459148793b62018-06-06 14:40:49 +053066#if (NXP_EXTNS == TRUE)
67static bool is_emvco_active;
Ayushdf7ad672018-07-30 12:02:58 +053068#define KEEP_CURRENT_TECH_CONFIG 0xFF /* Keep the current technology configuration */
nxf2459148793b62018-06-06 14:40:49 +053069#endif
nxpandroidc7611652015-09-23 16:42:05 +053070/*
71** static functions
72*/
nxpandroid8f6d0532017-07-12 18:25:30 +053073static uint8_t nfa_dm_get_rf_discover_config(
74 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
75 tNFC_DISCOVER_PARAMS disc_params[], uint8_t max_params);
76static tNFA_STATUS nfa_dm_set_rf_listen_mode_config(
77 tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask);
78static void nfa_dm_set_rf_listen_mode_raw_config(
79 tNFA_DM_DISC_TECH_PROTO_MASK* p_disc_mask);
80static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask(
81 tNFC_RF_TECH_N_MODE tech_n_mode, tNFC_PROTOCOL protocol);
82static void nfa_dm_notify_discovery(tNFA_DM_RF_DISC_DATA* p_data);
83static tNFA_STATUS nfa_dm_disc_notify_activation(tNFC_DISCOVER* p_data);
84static void nfa_dm_disc_notify_deactivation(tNFA_DM_RF_DISC_SM_EVENT sm_event,
85 tNFC_DISCOVER* p_data);
86static void nfa_dm_disc_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
87 tNFC_CONN* p_data);
88static void nfa_dm_disc_kovio_timeout_cback(TIMER_LIST_ENT* p_tle);
89static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status);
nxpandroidc7611652015-09-23 16:42:05 +053090
nxf24591c1cbeab2018-02-21 17:32:26 +053091static std::string nfa_dm_disc_state_2_str(uint8_t state);
92static std::string nfa_dm_disc_event_2_str(uint8_t event);
nxpandroidc7611652015-09-23 16:42:05 +053093
nxpandroid8f6d0532017-07-12 18:25:30 +053094typedef struct nfa_dm_p2p_prio_logic {
95 bool isodep_detected; /* flag to check if ISO-DEP is detected */
96 bool timer_expired; /* flag to check whether timer is expired */
97 TIMER_LIST_ENT timer_list; /*timer structure pointer */
98 uint8_t first_tech_mode;
99} nfa_dm_p2p_prio_logic_t;
nxpandroidc7611652015-09-23 16:42:05 +0530100
101static nfa_dm_p2p_prio_logic_t p2p_prio_logic_data;
102
nxpandroid8f6d0532017-07-12 18:25:30 +0530103static void nfa_dm_send_tag_deselect_cmd(tNFA_NFC_PROTOCOL protocol);
nxpandroid8f6d0532017-07-12 18:25:30 +0530104
nxpandroidc7611652015-09-23 16:42:05 +0530105/*******************************************************************************
106**
107** Function nfa_dm_get_rf_discover_config
108**
nxpandroid8f6d0532017-07-12 18:25:30 +0530109** Description Build RF discovery configurations from
110** tNFA_DM_DISC_TECH_PROTO_MASK
nxpandroidc7611652015-09-23 16:42:05 +0530111**
112** Returns number of RF discovery configurations
113**
114*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530115static uint8_t nfa_dm_get_rf_discover_config(
116 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
117 tNFC_DISCOVER_PARAMS disc_params[], uint8_t max_params) {
118 uint8_t num_params = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530119
nxpandroid8f6d0532017-07-12 18:25:30 +0530120 if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530121 DLOG_IF(INFO, nfc_debug_enabled)
122 << StringPrintf("listen disabled, rm listen from 0x%x", dm_disc_mask);
nxpandroid8f6d0532017-07-12 18:25:30 +0530123 dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
124 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530125 if (nfa_dm_is_p2p_paused()) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530126 dm_disc_mask &= ~NFA_DM_DISC_MASK_NFC_DEP;
127 }
Ayushdf7ad672018-07-30 12:02:58 +0530128#if (NXP_EXTNS == TRUE)
129 if (nfa_dm_cb.flags & NFA_DM_FLAGS_DISCOVERY_TECH_CHANGED)
130 {
131 DLOG_IF(INFO, nfc_debug_enabled)
132 << StringPrintf ("nfa_dm_get_rf_discover_config () poll & listen tech will be changed from 0x%x", dm_disc_mask);
nxf24591c1cbeab2018-02-21 17:32:26 +0530133
Ayushdf7ad672018-07-30 12:02:58 +0530134 if(nfa_dm_cb.listenTech != KEEP_CURRENT_TECH_CONFIG) {
135 dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
136 if((nfa_dm_cb.listenTech & 0x01) == 0x01) {
137 dm_disc_mask |= ( NFA_DM_DISC_MASK_LA_T1T
138 |NFA_DM_DISC_MASK_LA_T2T
139 |NFA_DM_DISC_MASK_LA_ISO_DEP
140 |NFA_DM_DISC_MASK_LA_NFC_DEP);
141 }
142 if((nfa_dm_cb.listenTech & 0x02) == 0x02) {
143 dm_disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
144 }
145 if((nfa_dm_cb.listenTech & 0x04) == 0x04) {
146 dm_disc_mask |= (NFA_DM_DISC_MASK_LF_T3T|NFA_DM_DISC_MASK_LF_NFC_DEP);
147 }
148 if((nfa_dm_cb.listenTech & 0x40) == 0x40) {
149 dm_disc_mask |= NFA_DM_DISC_MASK_LAA_NFC_DEP;
150 }
151 if((nfa_dm_cb.listenTech & 0x80) == 0x80) {
152 dm_disc_mask |= NFA_DM_DISC_MASK_LFA_NFC_DEP;
153 }
154 }
155
156 if(nfa_dm_cb.pollTech != KEEP_CURRENT_TECH_CONFIG){
157 dm_disc_mask &= NFA_DM_DISC_MASK_LISTEN;
158 if((nfa_dm_cb.pollTech & 0x01) == 0x01) {
159 dm_disc_mask |= (NFA_DM_DISC_MASK_PA_T1T
160 |NFA_DM_DISC_MASK_PA_T2T
161 |NFA_DM_DISC_MASK_PA_ISO_DEP
162 |NFA_DM_DISC_MASK_PA_NFC_DEP
163 |NFA_DM_DISC_MASK_P_LEGACY);
164 }
165 if((nfa_dm_cb.pollTech & 0x02) == 0x02) {
166 dm_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
167 }
168 if((nfa_dm_cb.pollTech & 0x04) == 0x04) {
169 dm_disc_mask |= (NFA_DM_DISC_MASK_PF_T3T | NFA_DM_DISC_MASK_PF_NFC_DEP);
170 }
171 if((nfa_dm_cb.pollTech & 0x08) == 0x08) {
172 dm_disc_mask |= NFA_DM_DISC_MASK_P_T5T;
173 }
174 if((nfa_dm_cb.pollTech & 0x10) == 0x10) {
175 dm_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
176 }
177 if((nfa_dm_cb.pollTech & 0x20) == 0x020) {
178 dm_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
179 }
180 if((nfa_dm_cb.pollTech & 0x40) == 0x040) {
181 dm_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
182 }
183 }
184 }
185#endif
nxpandroid8f6d0532017-07-12 18:25:30 +0530186 /* Check polling A */
187 if (dm_disc_mask &
188 (NFA_DM_DISC_MASK_PA_T1T | NFA_DM_DISC_MASK_PA_T2T |
189 NFA_DM_DISC_MASK_PA_ISO_DEP | NFA_DM_DISC_MASK_PA_NFC_DEP |
190 NFA_DM_DISC_MASK_P_LEGACY)) {
191 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A;
192 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa;
193 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530194
nxpandroid8f6d0532017-07-12 18:25:30 +0530195 if (num_params >= max_params) return num_params;
196 }
nxpandroidc7611652015-09-23 16:42:05 +0530197
nxpandroid8f6d0532017-07-12 18:25:30 +0530198 /* Check polling B */
nxf24591c1cbeab2018-02-21 17:32:26 +0530199 if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530200 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B;
201 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb;
202 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530203
nxpandroid8f6d0532017-07-12 18:25:30 +0530204 if (num_params >= max_params) return num_params;
205 }
nxpandroidc7611652015-09-23 16:42:05 +0530206
nxpandroid8f6d0532017-07-12 18:25:30 +0530207 /* Check polling F */
208 if (dm_disc_mask & (NFA_DM_DISC_MASK_PF_T3T | NFA_DM_DISC_MASK_PF_NFC_DEP)) {
209 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F;
210 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf;
211 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530212
nxpandroid8f6d0532017-07-12 18:25:30 +0530213 if (num_params >= max_params) return num_params;
214 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530215 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
216 /* Check polling Active mode */
217 if (dm_disc_mask & NFA_DM_DISC_MASK_PACM_NFC_DEP) {
218 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_ACTIVE;
219 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pacm;
220 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530221
nxf24591c1cbeab2018-02-21 17:32:26 +0530222 if (num_params >= max_params) return num_params;
223 }
224 } else {
225 /* Check polling A Active mode */
226 if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP) {
227 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE;
228 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa;
229 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530230
nxf24591c1cbeab2018-02-21 17:32:26 +0530231 if (num_params >= max_params) return num_params;
232 }
233
234 /* Check polling F Active mode */
235 if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP) {
236 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE;
237 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa;
238 num_params++;
239
240 if (num_params >= max_params) return num_params;
241 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530242 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530243 /* Check listening A */
244 if (dm_disc_mask &
245 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
246 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP)) {
247 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A;
248 disc_params[num_params].frequency = 1;
249 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530250
nxpandroid8f6d0532017-07-12 18:25:30 +0530251 if (num_params >= max_params) return num_params;
252 }
nxpandroidc7611652015-09-23 16:42:05 +0530253
nxpandroid8f6d0532017-07-12 18:25:30 +0530254 /* Check listening B */
255 if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
256 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B;
257 disc_params[num_params].frequency = 1;
258 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530259
nxpandroid8f6d0532017-07-12 18:25:30 +0530260 if (num_params >= max_params) return num_params;
261 }
nxpandroidc7611652015-09-23 16:42:05 +0530262
nxpandroid8f6d0532017-07-12 18:25:30 +0530263 /* Check listening F */
264 if (dm_disc_mask & (NFA_DM_DISC_MASK_LF_T3T | NFA_DM_DISC_MASK_LF_NFC_DEP)) {
265 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F;
266 disc_params[num_params].frequency = 1;
267 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530268
nxpandroid8f6d0532017-07-12 18:25:30 +0530269 if (num_params >= max_params) return num_params;
270 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530271 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
272 /* Check polling Active mode */
273 if (dm_disc_mask & NFA_DM_DISC_MASK_LACM_NFC_DEP) {
274 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ACTIVE;
275 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pacm;
276 num_params++;
277 if (num_params >= max_params) return num_params;
278 }
279 } else {
280 /* Check listening A Active mode */
281 if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP) {
282 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE;
283 disc_params[num_params].frequency = 1;
284 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530285
nxf24591c1cbeab2018-02-21 17:32:26 +0530286 if (num_params >= max_params) return num_params;
287 }
nxpandroidc7611652015-09-23 16:42:05 +0530288
nxf24591c1cbeab2018-02-21 17:32:26 +0530289 /* Check listening F Active mode */
290 if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP) {
291 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE;
292 disc_params[num_params].frequency = 1;
293 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530294
nxf24591c1cbeab2018-02-21 17:32:26 +0530295 if (num_params >= max_params) return num_params;
296 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530297 }
nxpandroidc7611652015-09-23 16:42:05 +0530298
nxpandroid8f6d0532017-07-12 18:25:30 +0530299 /* Check polling ISO 15693 */
nxf24591c1cbeab2018-02-21 17:32:26 +0530300 if (dm_disc_mask & NFA_DM_DISC_MASK_P_T5T) {
301 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_V;
nxpandroid8f6d0532017-07-12 18:25:30 +0530302 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93;
303 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530304
nxpandroid8f6d0532017-07-12 18:25:30 +0530305 if (num_params >= max_params) return num_params;
306 }
nxpandroidc7611652015-09-23 16:42:05 +0530307
nxpandroid8f6d0532017-07-12 18:25:30 +0530308 /* Check polling B' */
309 if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME) {
310 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B_PRIME;
311 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp;
312 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530313
nxpandroid8f6d0532017-07-12 18:25:30 +0530314 if (num_params >= max_params) return num_params;
315 }
nxpandroidc7611652015-09-23 16:42:05 +0530316
nxpandroid8f6d0532017-07-12 18:25:30 +0530317 /* Check polling KOVIO */
318 if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO) {
319 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_KOVIO;
320 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk;
321 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530322
nxpandroid8f6d0532017-07-12 18:25:30 +0530323 if (num_params >= max_params) return num_params;
324 }
nxpandroidc7611652015-09-23 16:42:05 +0530325
nxpandroid8f6d0532017-07-12 18:25:30 +0530326 /* Check listening ISO 15693 */
327 if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693) {
328 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ISO15693;
329 disc_params[num_params].frequency = 1;
330 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530331
nxpandroid8f6d0532017-07-12 18:25:30 +0530332 if (num_params >= max_params) return num_params;
333 }
nxpandroidc7611652015-09-23 16:42:05 +0530334
nxpandroid8f6d0532017-07-12 18:25:30 +0530335 /* Check listening B' */
336 if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME) {
337 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME;
338 disc_params[num_params].frequency = 1;
339 num_params++;
nxpandroidc7611652015-09-23 16:42:05 +0530340
nxpandroid8f6d0532017-07-12 18:25:30 +0530341 if (num_params >= max_params) return num_params;
342 }
nxpandroidc7611652015-09-23 16:42:05 +0530343
nxpandroid8f6d0532017-07-12 18:25:30 +0530344 return num_params;
nxpandroidc7611652015-09-23 16:42:05 +0530345}
346
nxpandroidc7611652015-09-23 16:42:05 +0530347/*******************************************************************************
348**
349** Function nfa_dm_set_rf_listen_mode_config
350**
351** Description Update listening protocol to NFCC
352**
353** Returns NFA_STATUS_OK if success
354**
355*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530356static tNFA_STATUS nfa_dm_set_rf_listen_mode_config(
357 tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask) {
358 uint8_t params[40], *p;
359 uint8_t platform = 0;
360 uint8_t sens_info = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530361
nxf24591c1cbeab2018-02-21 17:32:26 +0530362 DLOG_IF(INFO, nfc_debug_enabled)
363 << StringPrintf("tech_proto_mask = 0x%08X", tech_proto_mask);
nxpandroidc7611652015-09-23 16:42:05 +0530364
nxpandroid8f6d0532017-07-12 18:25:30 +0530365 /*
366 ** T1T listen LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C
367 ** T2T listen LA_PROT 0x00
368 ** T3T listen No bit for T3T in LF_PROT (CE T3T set listen parameters,
369 ** system code, NFCID2, etc.)
370 ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01
371 ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02
372 */
nxf24591c1cbeab2018-02-21 17:32:26 +0530373
nxpandroid8f6d0532017-07-12 18:25:30 +0530374 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T) {
375 platform = NCI_PARAM_PLATFORM_T1T;
376 } else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T) {
377 /* platform = 0 and sens_info = 0 */
378 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +0530379 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) {
380 sens_info |= NCI_PARAM_SEL_INFO_ISODEP;
nxpandroidc7611652015-09-23 16:42:05 +0530381 }
nxpandroidc7611652015-09-23 16:42:05 +0530382
nxpandroid8f6d0532017-07-12 18:25:30 +0530383 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP) {
384 sens_info |= NCI_PARAM_SEL_INFO_NFCDEP;
385 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530386 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530387
388 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530389
nxpandroid8f6d0532017-07-12 18:25:30 +0530390 /*
391 ** for Listen A
392 **
393 ** Set ATQA 0x0C00 for T1T listen
394 ** If the ATQA values are 0x0000, then the FW will use 0x0400
395 ** which works for ISODEP, T2T and NFCDEP.
396 */
397 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] ==
398 NFA_DM_DISC_HOST_ID_DH) {
399 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
400 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
401 UINT8_TO_STREAM(p, 0x04);
402 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
403 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
404 UINT8_TO_STREAM(p, platform);
nxpandroid8f6d0532017-07-12 18:25:30 +0530405 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
406 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_SEL_INFO);
407 UINT8_TO_STREAM(p, sens_info);
nxpandroid8f6d0532017-07-12 18:25:30 +0530408 } else /* Let NFCC use UICC configuration by configuring with length = 0 */
409 {
410 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
411 UINT8_TO_STREAM(p, 0);
412 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
413 UINT8_TO_STREAM(p, 0);
nxpandroid8f6d0532017-07-12 18:25:30 +0530414 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
415 UINT8_TO_STREAM(p, 0);
nxpandroid8f6d0532017-07-12 18:25:30 +0530416 UINT8_TO_STREAM(p, NFC_PMID_LA_NFCID1);
417 UINT8_TO_STREAM(p, 0);
418 UINT8_TO_STREAM(p, NFC_PMID_LA_HIST_BY);
419 UINT8_TO_STREAM(p, 0);
420 }
nxpandroidc7611652015-09-23 16:42:05 +0530421
nxpandroid8f6d0532017-07-12 18:25:30 +0530422 /* for Listen B */
423 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] ==
424 NFA_DM_DISC_HOST_ID_DH) {
425 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
426 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_SENSB_INFO);
427 if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
428 UINT8_TO_STREAM(p, NCI_LISTEN_PROTOCOL_ISO_DEP);
429 } else {
430 UINT8_TO_STREAM(p, 0x00);
nxpandroidc7611652015-09-23 16:42:05 +0530431 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530432 } else /* Let NFCC use UICC configuration by configuring with length = 0 */
433 {
434 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
435 UINT8_TO_STREAM(p, 0);
436 UINT8_TO_STREAM(p, NFC_PMID_LB_NFCID0);
437 UINT8_TO_STREAM(p, 0);
438 UINT8_TO_STREAM(p, NFC_PMID_LB_APPDATA);
439 UINT8_TO_STREAM(p, 0);
440 UINT8_TO_STREAM(p, NFC_PMID_LB_ADC_FO);
441 UINT8_TO_STREAM(p, 0);
442 UINT8_TO_STREAM(p, NFC_PMID_LB_H_INFO);
443 UINT8_TO_STREAM(p, 0);
444 }
nxpandroidc7611652015-09-23 16:42:05 +0530445
nxf24591c1cbeab2018-02-21 17:32:26 +0530446 /* for Listen F */
447 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing
448 * regardless of NFC-F tech routing */
nxpandroid8f6d0532017-07-12 18:25:30 +0530449 UINT8_TO_STREAM(p, NFC_PMID_LF_PROTOCOL);
450 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_PROTOCOL);
nxf24591c1cbeab2018-02-21 17:32:26 +0530451 if ((tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP) &&
452 !nfa_dm_is_p2p_paused()) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530453 UINT8_TO_STREAM(p, NCI_LISTEN_PROTOCOL_NFC_DEP);
454 } else {
455 UINT8_TO_STREAM(p, 0x00);
456 }
nxpandroidc7611652015-09-23 16:42:05 +0530457
nxpandroid8f6d0532017-07-12 18:25:30 +0530458 if (p > params) {
459 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
460 }
nxpandroidc7611652015-09-23 16:42:05 +0530461
nxpandroid8f6d0532017-07-12 18:25:30 +0530462 return NFA_STATUS_OK;
nxpandroidc7611652015-09-23 16:42:05 +0530463}
464
465/*******************************************************************************
466**
467** Function nfa_dm_set_total_duration
468**
469** Description Update total duration to NFCC
470**
471** Returns void
472**
473*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530474static void nfa_dm_set_total_duration(void) {
475 uint8_t params[10], *p;
nxpandroidc7611652015-09-23 16:42:05 +0530476
nxf24591c1cbeab2018-02-21 17:32:26 +0530477 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530478
nxpandroid8f6d0532017-07-12 18:25:30 +0530479 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530480
nxpandroid8f6d0532017-07-12 18:25:30 +0530481 /* for total duration */
482 UINT8_TO_STREAM(p, NFC_PMID_TOTAL_DURATION);
483 UINT8_TO_STREAM(p, NCI_PARAM_LEN_TOTAL_DURATION);
484 UINT16_TO_STREAM(p, nfa_dm_cb.disc_cb.disc_duration);
nxpandroidc7611652015-09-23 16:42:05 +0530485
nxpandroid8f6d0532017-07-12 18:25:30 +0530486 if (p > params) {
487 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
488 }
nxpandroidc7611652015-09-23 16:42:05 +0530489}
490
491/*******************************************************************************
492**
493** Function nfa_dm_set_rf_listen_mode_raw_config
494**
495** Description Set raw listen parameters
496**
497** Returns void
498**
499*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530500static void nfa_dm_set_rf_listen_mode_raw_config(
501 tNFA_DM_DISC_TECH_PROTO_MASK* p_disc_mask) {
502 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0;
503 tNFA_LISTEN_CFG* p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config;
504 uint8_t params[250], *p, xx;
nxpandroidc7611652015-09-23 16:42:05 +0530505
nxf24591c1cbeab2018-02-21 17:32:26 +0530506 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530507
nxpandroid8f6d0532017-07-12 18:25:30 +0530508 /*
509 ** Discovery Configuration Parameters for Listen A
510 */
511 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] ==
512 NFA_DM_DISC_HOST_ID_DH) &&
513 (p_cfg->la_enable)) {
514 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530515
nxpandroid8f6d0532017-07-12 18:25:30 +0530516 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
517 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
518 UINT8_TO_STREAM(p, p_cfg->la_bit_frame_sdd);
nxpandroidc7611652015-09-23 16:42:05 +0530519
nxpandroid8f6d0532017-07-12 18:25:30 +0530520 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
521 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
522 UINT8_TO_STREAM(p, p_cfg->la_platform_config);
nxpandroidc7611652015-09-23 16:42:05 +0530523
nxpandroid8f6d0532017-07-12 18:25:30 +0530524 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
525 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_SEL_INFO);
526 UINT8_TO_STREAM(p, p_cfg->la_sel_info);
nxpandroidc7611652015-09-23 16:42:05 +0530527
nxpandroid8f6d0532017-07-12 18:25:30 +0530528 if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T) {
529 disc_mask |= NFA_DM_DISC_MASK_LA_T1T;
530 } else {
531 /* If T4T or NFCDEP */
532 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP) {
533 disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP;
534 }
nxpandroidc7611652015-09-23 16:42:05 +0530535
nxpandroid8f6d0532017-07-12 18:25:30 +0530536 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP) {
537 disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
538 }
nxpandroidc7611652015-09-23 16:42:05 +0530539
nxpandroid8f6d0532017-07-12 18:25:30 +0530540 /* If neither, T4T nor NFCDEP, then its T2T */
541 if (disc_mask == 0) {
542 disc_mask |= NFA_DM_DISC_MASK_LA_T2T;
543 }
nxpandroidc7611652015-09-23 16:42:05 +0530544 }
545
nxpandroid8f6d0532017-07-12 18:25:30 +0530546 UINT8_TO_STREAM(p, NFC_PMID_LA_NFCID1);
547 UINT8_TO_STREAM(p, p_cfg->la_nfcid1_len);
548 ARRAY_TO_STREAM(p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len);
nxpandroidc7611652015-09-23 16:42:05 +0530549
nxpandroid8f6d0532017-07-12 18:25:30 +0530550 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
551 }
nxpandroidc7611652015-09-23 16:42:05 +0530552
nxpandroid8f6d0532017-07-12 18:25:30 +0530553 /*
554 ** Discovery Configuration Parameters for Listen B
555 */
556 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] ==
557 NFA_DM_DISC_HOST_ID_DH) &&
558 (p_cfg->lb_enable)) {
559 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530560
nxpandroid8f6d0532017-07-12 18:25:30 +0530561 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
562 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_SENSB_INFO);
563 UINT8_TO_STREAM(p, p_cfg->lb_sensb_info);
nxpandroidc7611652015-09-23 16:42:05 +0530564
nxpandroid8f6d0532017-07-12 18:25:30 +0530565 UINT8_TO_STREAM(p, NFC_PMID_LB_NFCID0);
566 UINT8_TO_STREAM(p, p_cfg->lb_nfcid0_len);
567 ARRAY_TO_STREAM(p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len);
nxpandroidc7611652015-09-23 16:42:05 +0530568
nxpandroid8f6d0532017-07-12 18:25:30 +0530569 UINT8_TO_STREAM(p, NFC_PMID_LB_APPDATA);
570 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_APPDATA);
571 ARRAY_TO_STREAM(p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA);
nxpandroidc7611652015-09-23 16:42:05 +0530572
nxpandroid8f6d0532017-07-12 18:25:30 +0530573 UINT8_TO_STREAM(p, NFC_PMID_LB_SFGI);
574 UINT8_TO_STREAM(p, 1);
575 UINT8_TO_STREAM(p, p_cfg->lb_adc_fo);
nxpandroidc7611652015-09-23 16:42:05 +0530576
nxpandroid8f6d0532017-07-12 18:25:30 +0530577 UINT8_TO_STREAM(p, NFC_PMID_LB_ADC_FO);
578 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_ADC_FO);
579 UINT8_TO_STREAM(p, p_cfg->lb_adc_fo);
580
581 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
582
583 if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP) {
584 disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530585 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530586 }
nxpandroidc7611652015-09-23 16:42:05 +0530587
nxpandroid8f6d0532017-07-12 18:25:30 +0530588 /*
589 ** Discovery Configuration Parameters for Listen F
590 */
591 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] ==
592 NFA_DM_DISC_HOST_ID_DH) &&
593 (p_cfg->lf_enable)) {
594 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530595
nxpandroid8f6d0532017-07-12 18:25:30 +0530596 UINT8_TO_STREAM(p, NFC_PMID_LF_CON_BITR_F);
597 UINT8_TO_STREAM(p, 1);
598 UINT8_TO_STREAM(p, p_cfg->lf_con_bitr_f);
nxpandroidc7611652015-09-23 16:42:05 +0530599
nxpandroid8f6d0532017-07-12 18:25:30 +0530600 UINT8_TO_STREAM(p, NFC_PMID_LF_PROTOCOL);
601 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_PROTOCOL);
602 UINT8_TO_STREAM(p, p_cfg->lf_protocol_type);
nxpandroidc7611652015-09-23 16:42:05 +0530603
nxpandroid8f6d0532017-07-12 18:25:30 +0530604 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_FLAGS2);
605 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_T3T_FLAGS2);
606 UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags);
nxpandroidc7611652015-09-23 16:42:05 +0530607
nxpandroid8f6d0532017-07-12 18:25:30 +0530608 /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be
609 * ignored */
610 for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++) {
611 if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000) {
612 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_ID1 + xx);
613 UINT8_TO_STREAM(p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
614 ARRAY_TO_STREAM(p, p_cfg->lf_t3t_identifier[xx],
615 NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
616 }
617 }
nxpandroidc7611652015-09-23 16:42:05 +0530618
nxpandroid8f6d0532017-07-12 18:25:30 +0530619 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_PMM);
620 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_T3T_PMM);
621 ARRAY_TO_STREAM(p, p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM);
nxpandroidc7611652015-09-23 16:42:05 +0530622
nxpandroid8f6d0532017-07-12 18:25:30 +0530623 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
nxpandroidc7611652015-09-23 16:42:05 +0530624
nxpandroid8f6d0532017-07-12 18:25:30 +0530625 if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED) {
626 disc_mask |= NFA_DM_DISC_MASK_LF_T3T;
627 }
628 if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP) {
629 disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
630 }
631 }
632
633 /*
634 ** Discovery Configuration Parameters for Listen ISO-DEP
635 */
636 if ((disc_mask &
637 (NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LB_ISO_DEP)) &&
638 (p_cfg->li_enable)) {
639 p = params;
640
641 UINT8_TO_STREAM(p, NFC_PMID_FWI);
642 UINT8_TO_STREAM(p, NCI_PARAM_LEN_FWI);
643 UINT8_TO_STREAM(p, p_cfg->li_fwi);
644
645 if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) {
646 UINT8_TO_STREAM(p, NFC_PMID_LA_HIST_BY);
647 UINT8_TO_STREAM(p, p_cfg->la_hist_bytes_len);
648 ARRAY_TO_STREAM(p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len);
nxpandroidc7611652015-09-23 16:42:05 +0530649 }
650
nxpandroid8f6d0532017-07-12 18:25:30 +0530651 if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
652 UINT8_TO_STREAM(p, NFC_PMID_LB_H_INFO);
653 UINT8_TO_STREAM(p, p_cfg->lb_h_info_resp_len);
654 ARRAY_TO_STREAM(p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len);
nxpandroidc7611652015-09-23 16:42:05 +0530655 }
656
nxpandroid8f6d0532017-07-12 18:25:30 +0530657 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
658 }
nxpandroidc7611652015-09-23 16:42:05 +0530659
nxpandroid8f6d0532017-07-12 18:25:30 +0530660 /*
661 ** Discovery Configuration Parameters for Listen NFC-DEP
662 */
663 if ((disc_mask &
664 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LF_NFC_DEP)) &&
665 (p_cfg->ln_enable)) {
666 p = params;
nxpandroidc7611652015-09-23 16:42:05 +0530667
nxpandroid8f6d0532017-07-12 18:25:30 +0530668 UINT8_TO_STREAM(p, NFC_PMID_WT);
669 UINT8_TO_STREAM(p, NCI_PARAM_LEN_WT);
670 UINT8_TO_STREAM(p, p_cfg->ln_wt);
nxpandroidc7611652015-09-23 16:42:05 +0530671
nxpandroid8f6d0532017-07-12 18:25:30 +0530672 UINT8_TO_STREAM(p, NFC_PMID_ATR_RES_GEN_BYTES);
673 UINT8_TO_STREAM(p, p_cfg->ln_atr_res_gen_bytes_len);
674 ARRAY_TO_STREAM(p, p_cfg->ln_atr_res_gen_bytes,
675 p_cfg->ln_atr_res_gen_bytes_len);
nxpandroidc7611652015-09-23 16:42:05 +0530676
nxpandroid8f6d0532017-07-12 18:25:30 +0530677 UINT8_TO_STREAM(p, NFC_PMID_ATR_RSP_CONFIG);
678 UINT8_TO_STREAM(p, 1);
679 UINT8_TO_STREAM(p, p_cfg->ln_atr_res_config);
nxpandroidc7611652015-09-23 16:42:05 +0530680
nxpandroid8f6d0532017-07-12 18:25:30 +0530681 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
682 }
nxpandroidc7611652015-09-23 16:42:05 +0530683
nxpandroid8f6d0532017-07-12 18:25:30 +0530684 *p_disc_mask = disc_mask;
685
nxf24591c1cbeab2018-02-21 17:32:26 +0530686 DLOG_IF(INFO, nfc_debug_enabled)
687 << StringPrintf("disc_mask = 0x%x", disc_mask);
nxpandroidc7611652015-09-23 16:42:05 +0530688}
689
690/*******************************************************************************
691**
692** Function nfa_dm_disc_get_disc_mask
693**
694** Description Convert RF technology, mode and protocol to bit mask
695**
696** Returns tNFA_DM_DISC_TECH_PROTO_MASK
697**
698*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530699static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask(
700 tNFC_RF_TECH_N_MODE tech_n_mode, tNFC_PROTOCOL protocol) {
701 /* Set initial disc_mask to legacy poll or listen */
702 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask =
703 ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY
704 : NFA_DM_DISC_MASK_P_LEGACY);
nxpandroidc7611652015-09-23 16:42:05 +0530705
nxpandroid8f6d0532017-07-12 18:25:30 +0530706 if (NFC_DISCOVERY_TYPE_POLL_A == tech_n_mode) {
707 switch (protocol) {
708 case NFC_PROTOCOL_T1T:
709 disc_mask = NFA_DM_DISC_MASK_PA_T1T;
710 break;
711 case NFC_PROTOCOL_T2T:
712 disc_mask = NFA_DM_DISC_MASK_PA_T2T;
713 break;
714 case NFC_PROTOCOL_ISO_DEP:
715 disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP;
716 break;
717 case NFC_PROTOCOL_NFC_DEP:
718 disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP;
719 break;
nxpandroidcdd30442016-05-27 17:26:18 +0530720 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530721 } else if (NFC_DISCOVERY_TYPE_POLL_B == tech_n_mode) {
722 if (protocol == NFC_PROTOCOL_ISO_DEP)
723 disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP;
nxpandroid8f6d0532017-07-12 18:25:30 +0530724 } else if (NFC_DISCOVERY_TYPE_POLL_F == tech_n_mode) {
725 if (protocol == NFC_PROTOCOL_T3T)
726 disc_mask = NFA_DM_DISC_MASK_PF_T3T;
727 else if (protocol == NFC_PROTOCOL_NFC_DEP)
728 disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP;
nxf24591c1cbeab2018-02-21 17:32:26 +0530729 } else if (NFC_DISCOVERY_TYPE_POLL_V == tech_n_mode) {
730 disc_mask = NFA_DM_DISC_MASK_P_T5T;
nxpandroid8f6d0532017-07-12 18:25:30 +0530731 } else if (NFC_DISCOVERY_TYPE_POLL_B_PRIME == tech_n_mode) {
732 disc_mask = NFA_DM_DISC_MASK_P_B_PRIME;
733 } else if (NFC_DISCOVERY_TYPE_POLL_KOVIO == tech_n_mode) {
734 disc_mask = NFA_DM_DISC_MASK_P_KOVIO;
nxpandroid8f6d0532017-07-12 18:25:30 +0530735 } else if (NFC_DISCOVERY_TYPE_LISTEN_A == tech_n_mode) {
736 switch (protocol) {
737 case NFC_PROTOCOL_T1T:
738 disc_mask = NFA_DM_DISC_MASK_LA_T1T;
739 break;
740 case NFC_PROTOCOL_T2T:
741 disc_mask = NFA_DM_DISC_MASK_LA_T2T;
742 break;
743 case NFC_PROTOCOL_ISO_DEP:
744 disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP;
745 break;
746 case NFC_PROTOCOL_NFC_DEP:
747 disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP;
748 break;
nxpandroidcdd30442016-05-27 17:26:18 +0530749 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530750 } else if (NFC_DISCOVERY_TYPE_LISTEN_B == tech_n_mode) {
751 if (protocol == NFC_PROTOCOL_ISO_DEP)
752 disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP;
753 } else if (NFC_DISCOVERY_TYPE_LISTEN_F == tech_n_mode) {
754 if (protocol == NFC_PROTOCOL_T3T)
755 disc_mask = NFA_DM_DISC_MASK_LF_T3T;
756 else if (protocol == NFC_PROTOCOL_NFC_DEP)
757 disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP;
758 } else if (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == tech_n_mode) {
759 disc_mask = NFA_DM_DISC_MASK_L_ISO15693;
760 } else if (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == tech_n_mode) {
761 disc_mask = NFA_DM_DISC_MASK_L_B_PRIME;
nxf24591c1cbeab2018-02-21 17:32:26 +0530762 }
763 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
764 if (NFC_DISCOVERY_TYPE_POLL_ACTIVE == tech_n_mode) {
765 disc_mask = NFA_DM_DISC_MASK_PACM_NFC_DEP;
766 } else if (NFC_DISCOVERY_TYPE_LISTEN_ACTIVE == tech_n_mode) {
767 disc_mask = NFA_DM_DISC_MASK_LACM_NFC_DEP;
768 }
769 } else {
770 if (NFC_DISCOVERY_TYPE_POLL_A_ACTIVE == tech_n_mode) {
771 disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP;
772 } else if (NFC_DISCOVERY_TYPE_POLL_F_ACTIVE == tech_n_mode) {
773 disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP;
774 } else if (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == tech_n_mode) {
775 disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP;
776 } else if (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == tech_n_mode) {
777 disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP;
778 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530779 }
nxpandroidc7611652015-09-23 16:42:05 +0530780
nxf24591c1cbeab2018-02-21 17:32:26 +0530781 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
782 "tech_n_mode:0x%X, protocol:0x%X, "
nxpandroid8f6d0532017-07-12 18:25:30 +0530783 "disc_mask:0x%X",
784 tech_n_mode, protocol, disc_mask);
785 return (disc_mask);
nxpandroidc7611652015-09-23 16:42:05 +0530786}
787
788/*******************************************************************************
789**
790** Function nfa_dm_disc_discovery_cback
791**
792** Description Discovery callback event from NFC
793**
794** Returns void
795**
796*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530797static void nfa_dm_disc_discovery_cback(tNFC_DISCOVER_EVT event,
798 tNFC_DISCOVER* p_data) {
799 tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT;
nxpandroidc7611652015-09-23 16:42:05 +0530800
nxf24591c1cbeab2018-02-21 17:32:26 +0530801 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event);
nxpandroidc7611652015-09-23 16:42:05 +0530802
nxpandroid8f6d0532017-07-12 18:25:30 +0530803 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +0530804 case NFC_START_DEVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530805 dm_disc_event = NFA_DM_RF_DISCOVER_RSP;
806 break;
nxpandroidc7611652015-09-23 16:42:05 +0530807 case NFC_RESULT_DEVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530808 dm_disc_event = NFA_DM_RF_DISCOVER_NTF;
809 break;
nxpandroidc7611652015-09-23 16:42:05 +0530810 case NFC_SELECT_DEVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530811 dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP;
812 break;
nxpandroidc7611652015-09-23 16:42:05 +0530813 case NFC_ACTIVATE_DEVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530814 dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF;
815 break;
nxpandroidc7611652015-09-23 16:42:05 +0530816 case NFC_DEACTIVATE_DEVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530817 if (p_data->deactivate.is_ntf) {
818 dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF;
819 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) ||
820 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) {
821 NFC_SetReassemblyFlag(true);
822 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_RAW_FRAME;
nxpandroidc7611652015-09-23 16:42:05 +0530823 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530824 } else
825 dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP;
826 break;
nxpandroidc7611652015-09-23 16:42:05 +0530827 default:
nxf24591c1cbeab2018-02-21 17:32:26 +0530828 LOG(ERROR) << StringPrintf("Unexpected event");
nxpandroid8f6d0532017-07-12 18:25:30 +0530829 return;
830 }
nxpandroidc7611652015-09-23 16:42:05 +0530831
nxf24591c1cbeab2018-02-21 17:32:26 +0530832 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
833 nfa_dm_rf_disc_data.nfc_discover = *p_data;
834 nfa_dm_disc_sm_execute(dm_disc_event, &nfa_dm_rf_disc_data);
nxpandroidc7611652015-09-23 16:42:05 +0530835}
836
837/*******************************************************************************
838**
839** Function nfa_dm_disc_notify_started
840**
841** Description Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or
842** NFA_RF_DISCOVERY_STARTED_EVT, if needed
843**
844** Returns void
845**
846*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530847static void nfa_dm_disc_notify_started(tNFA_STATUS status) {
848 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530849
nxpandroid8f6d0532017-07-12 18:25:30 +0530850 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) {
851 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
nxpandroidc7611652015-09-23 16:42:05 +0530852
nxpandroid8f6d0532017-07-12 18:25:30 +0530853 evt_data.status = status;
nxpandroidc7611652015-09-23 16:42:05 +0530854
nxpandroid8f6d0532017-07-12 18:25:30 +0530855 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
856 nfa_dm_conn_cback_event_notify(NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT,
857 &evt_data);
858 else
859 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
860 }
nxpandroidc7611652015-09-23 16:42:05 +0530861}
862
863/*******************************************************************************
864**
865** Function nfa_dm_disc_conn_event_notify
866**
867** Description Notify application of CONN_CBACK event, using appropriate
868** callback
869**
870** Returns nothing
871**
872*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530873void nfa_dm_disc_conn_event_notify(uint8_t event, tNFA_STATUS status) {
874 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +0530875
nxpandroid8f6d0532017-07-12 18:25:30 +0530876 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) {
877 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
878 evt_data.status = status;
nxpandroidc7611652015-09-23 16:42:05 +0530879
nxpandroid8f6d0532017-07-12 18:25:30 +0530880 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) {
881 /* Use exclusive RF mode callback */
882 if (nfa_dm_cb.p_excl_conn_cback)
883 (*nfa_dm_cb.p_excl_conn_cback)(event, &evt_data);
884 } else {
885 (*nfa_dm_cb.p_conn_cback)(event, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +0530886 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530887 }
nxpandroidc7611652015-09-23 16:42:05 +0530888}
889
890/*******************************************************************************
891**
892** Function nfa_dm_disc_force_to_idle
893**
894** Description Force NFCC to idle state while waiting for deactivation NTF
895**
896** Returns tNFC_STATUS
897**
898*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530899static tNFC_STATUS nfa_dm_disc_force_to_idle(void) {
900 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
nxpandroidc7611652015-09-23 16:42:05 +0530901
nxf24591c1cbeab2018-02-21 17:32:26 +0530902 DLOG_IF(INFO, nfc_debug_enabled)
903 << StringPrintf("disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags);
nxpandroidc7611652015-09-23 16:42:05 +0530904
nxpandroid8f6d0532017-07-12 18:25:30 +0530905 /* do not execute more than one */
906 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) {
907 nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF);
908 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP);
909 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
910 status = NFC_Deactivate(NFC_DEACTIVATE_TYPE_IDLE);
911 }
nxpandroidc7611652015-09-23 16:42:05 +0530912
nxpandroid8f6d0532017-07-12 18:25:30 +0530913 return (status);
nxpandroidc7611652015-09-23 16:42:05 +0530914}
915
916/*******************************************************************************
917**
918** Function nfa_dm_disc_deact_ntf_timeout_cback
919**
920** Description Timeout while waiting for deactivation NTF
921**
922** Returns void
923**
924*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530925static void nfa_dm_disc_deact_ntf_timeout_cback(__attribute__((unused))
926 TIMER_LIST_ENT* p_tle) {
927 LOG(ERROR) << __func__;
nxpandroidcdd30442016-05-27 17:26:18 +0530928
nxf24591c1cbeab2018-02-21 17:32:26 +0530929 nfa_dm_disc_force_to_idle();
nxpandroidc7611652015-09-23 16:42:05 +0530930}
931
932/*******************************************************************************
933**
934** Function nfa_dm_send_deactivate_cmd
935**
936** Description Send deactivate command to NFCC, if needed.
937**
938** Returns NFC_STATUS_OK - deactivate cmd is sent
939** NCI_STATUS_FAILED - no buffers
940** NFC_STATUS_SEMANTIC_ERROR - this function does not attempt
941** to send deactivate cmd
942**
943*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530944static tNFC_STATUS nfa_dm_send_deactivate_cmd(tNFC_DEACT_TYPE deactivate_type) {
945 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
946 tNFA_DM_DISC_FLAGS w4_flags =
947 nfa_dm_cb.disc_cb.disc_flags &
948 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
hariprasad nalacheruvu09c1c6f2018-05-16 20:54:57 +0530949#if (NXP_EXTNS == TRUE)
950 unsigned long num = 0;
951#endif
nxpandroidc7611652015-09-23 16:42:05 +0530952
nxpandroid8f6d0532017-07-12 18:25:30 +0530953 if (!w4_flags) {
954 /* if deactivate CMD was not sent to NFCC */
955 nfa_dm_cb.disc_cb.disc_flags |=
956 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
nxpandroidc7611652015-09-23 16:42:05 +0530957
nxpandroid8f6d0532017-07-12 18:25:30 +0530958 status = NFC_Deactivate(deactivate_type);
nxpandroidc7611652015-09-23 16:42:05 +0530959
nxpandroid8f6d0532017-07-12 18:25:30 +0530960 if (!nfa_dm_cb.disc_cb.tle.in_use) {
961 nfa_dm_cb.disc_cb.tle.p_cback =
962 (TIMER_CBACK*)nfa_dm_disc_deact_ntf_timeout_cback;
hariprasad nalacheruvu09c1c6f2018-05-16 20:54:57 +0530963#if (NXP_EXTNS == TRUE)
964 num = NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF;
965 DLOG_IF(INFO, nfc_debug_enabled)
966 << StringPrintf("num_disc_maps=%d", nfc_cb.num_disc_maps);
967 if (nfc_cb.num_disc_maps == 1) {
968 DLOG_IF(INFO, nfc_debug_enabled)
969 << StringPrintf(
970 "Reading NAME_NFA_DM_DISC_NTF_TIMEOUT val "
971 "nfc_cb.num_disc_maps = %d",
972 nfc_cb.num_disc_maps);
973 if (NfcConfig::hasKey(NAME_NFA_DM_DISC_NTF_TIMEOUT)) {
974 num = NfcConfig::getUnsigned(NAME_NFA_DM_DISC_NTF_TIMEOUT);
975 num *= 1000;
976 } else {
977 num = NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF;
978 DLOG_IF(INFO, nfc_debug_enabled)
979 << StringPrintf("Overriding NFA_DM_DISC_NTF_TIMEOUT to use %lu", num);
980 }
981 }
982 DLOG_IF(INFO, nfc_debug_enabled)
983 << StringPrintf("Starting timer value %lu", num);
984 /*wait infinite time for deactivate NTF, if the timeout is configured to
985 * 0*/
986 if (num != 0) nfa_sys_start_timer(&nfa_dm_cb.disc_cb.tle, 0, num);
987#else
nxpandroid8f6d0532017-07-12 18:25:30 +0530988 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.tle, 0,
989 NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF);
hariprasad nalacheruvu09c1c6f2018-05-16 20:54:57 +0530990#endif
nxpandroidc7611652015-09-23 16:42:05 +0530991 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530992 } else {
993 if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP) {
994 status = NFC_STATUS_SEMANTIC_ERROR;
995 } else if (nfa_dm_cb.disc_cb.tle.in_use) {
996 status = NFC_STATUS_OK;
997 } else {
998 status = nfa_dm_disc_force_to_idle();
nxpandroidc7611652015-09-23 16:42:05 +0530999 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301000 }
nxpandroidc7611652015-09-23 16:42:05 +05301001
nxpandroid8f6d0532017-07-12 18:25:30 +05301002 return status;
nxpandroidc7611652015-09-23 16:42:05 +05301003}
1004
1005/*******************************************************************************
1006**
1007** Function nfa_dm_start_rf_discover
1008**
1009** Description Start RF discovery
1010**
1011** Returns void
1012**
1013*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301014void nfa_dm_start_rf_discover(void) {
1015 tNFC_DISCOVER_PARAMS disc_params[NFA_DM_MAX_DISC_PARAMS];
nxf24591c1cbeab2018-02-21 17:32:26 +05301016 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask;
nxpandroid8f6d0532017-07-12 18:25:30 +05301017 uint8_t config_params[10], *p;
1018 uint8_t num_params, xx;
nxpandroidc7611652015-09-23 16:42:05 +05301019
nxf24591c1cbeab2018-02-21 17:32:26 +05301020 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroid8f6d0532017-07-12 18:25:30 +05301021 /* Make sure that RF discovery was enabled, or some app has exclusive control
1022 */
1023 if ((!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)) &&
1024 (nfa_dm_cb.disc_cb.excl_disc_entry.in_use == false)) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301025 return;
1026 }
nxpandroidc7611652015-09-23 16:42:05 +05301027
nxpandroid8f6d0532017-07-12 18:25:30 +05301028 /* get listen mode routing table for technology */
1029 nfa_ee_get_tech_route(NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT);
nxpandroidc7611652015-09-23 16:42:05 +05301030
nxpandroid8f6d0532017-07-12 18:25:30 +05301031 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1032 nfa_dm_set_rf_listen_mode_raw_config(&dm_disc_mask);
1033 dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask &
1034 NFA_DM_DISC_MASK_POLL);
1035 nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask;
1036 } else {
1037 /* Collect RF discovery request from sub-modules */
1038 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1039 if (nfa_dm_cb.disc_cb.entry[xx].in_use) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301040 poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1041 NFA_DM_DISC_MASK_POLL);
nxpandroidcdd30442016-05-27 17:26:18 +05301042
nxf24591c1cbeab2018-02-21 17:32:26 +05301043 /* clear poll mode technolgies and protocols which are already used by
nxpandroid8f6d0532017-07-12 18:25:30 +05301044 * others */
1045 poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL);
nxf24591c1cbeab2018-02-21 17:32:26 +05301046
nxpandroid8f6d0532017-07-12 18:25:30 +05301047 listen_mask = 0;
nxf24591c1cbeab2018-02-21 17:32:26 +05301048
nxpandroidc7611652015-09-23 16:42:05 +05301049 /*
nxf24591c1cbeab2018-02-21 17:32:26 +05301050 ** add listen mode technolgies and protocols if host ID is
1051 ** matched to listen mode routing table
1052 */
1053
nxpandroid8f6d0532017-07-12 18:25:30 +05301054 /* NFC-A */
1055 if (nfa_dm_cb.disc_cb.entry[xx].host_id ==
1056 nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]) {
1057 listen_mask |=
1058 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1059 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
nxf24591c1cbeab2018-02-21 17:32:26 +05301060 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
1061 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
1062 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1063 NFA_DM_DISC_MASK_LACM_NFC_DEP;
1064 } else {
1065 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1066 NFA_DM_DISC_MASK_LAA_NFC_DEP;
1067 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301068 } else {
1069 /* host can listen ISO-DEP based on AID routing */
1070 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1071 NFA_DM_DISC_MASK_LA_ISO_DEP);
nxf24591c1cbeab2018-02-21 17:32:26 +05301072 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
1073 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1074 NFA_DM_DISC_MASK_LACM_NFC_DEP);
1075 } else {
1076 /* host can listen NFC-DEP based on protocol routing */
1077 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1078 NFA_DM_DISC_MASK_LA_NFC_DEP);
1079 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1080 NFA_DM_DISC_MASK_LAA_NFC_DEP);
1081 }
nxpandroidc7611652015-09-23 16:42:05 +05301082 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301083
1084 /* NFC-B */
1085 /* multiple hosts can listen ISO-DEP based on AID routing */
1086 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1087 NFA_DM_DISC_MASK_LB_ISO_DEP;
nxpandroid8f6d0532017-07-12 18:25:30 +05301088
1089 /* NFC-F */
nxf24591c1cbeab2018-02-21 17:32:26 +05301090 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing
1091 * regardless of NFC-F tech routing */
nxpandroid8f6d0532017-07-12 18:25:30 +05301092 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
nxf24591c1cbeab2018-02-21 17:32:26 +05301093 (NFA_DM_DISC_MASK_LF_T3T | NFA_DM_DISC_MASK_LF_NFC_DEP);
1094 if (NFC_GetNCIVersion() != NCI_VERSION_2_0) {
1095 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1096 NFA_DM_DISC_MASK_LFA_NFC_DEP;
1097 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301098 /* NFC-B Prime */
1099 if (nfa_dm_cb.disc_cb.entry[xx].host_id ==
1100 nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]) {
1101 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
1102 NFA_DM_DISC_MASK_L_B_PRIME;
1103 }
nxf24591c1cbeab2018-02-21 17:32:26 +05301104
nxpandroid8f6d0532017-07-12 18:25:30 +05301105 /*
1106 ** clear listen mode technolgies and protocols which are already
1107 ** used by others
1108 */
1109
1110 /* Check if other modules are listening T1T or T2T */
nxpandroid8f6d0532017-07-12 18:25:30 +05301111 if (dm_disc_mask &
1112 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T)) {
1113 listen_mask &=
1114 ~(NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
1115 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
1116 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301117
1118 /* T1T/T2T has priority on NFC-A */
1119 if ((dm_disc_mask &
1120 (NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP)) &&
1121 (listen_mask &
1122 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T))) {
1123 dm_disc_mask &=
1124 ~(NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
1125 }
1126
1127 /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based
1128 * on AID routing */
1129
1130 /* Check if other modules are listening NFC-DEP */
nxf24591c1cbeab2018-02-21 17:32:26 +05301131 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
1132 if (dm_disc_mask &
1133 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LACM_NFC_DEP)) {
1134 listen_mask &=
1135 ~(NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LACM_NFC_DEP);
1136 }
1137 } else {
1138 if (dm_disc_mask &
1139 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP)) {
1140 listen_mask &=
1141 ~(NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP);
1142 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301143 }
1144
nxpandroid8f6d0532017-07-12 18:25:30 +05301145 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask =
1146 poll_mask | listen_mask;
1147
nxf24591c1cbeab2018-02-21 17:32:26 +05301148 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05301149 "nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x", xx,
1150 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask);
1151
1152 dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask;
nxpandroid8f6d0532017-07-12 18:25:30 +05301153 }
1154 }
nxpandroidc7611652015-09-23 16:42:05 +05301155
nxpandroid8f6d0532017-07-12 18:25:30 +05301156 /* Let P2P set GEN bytes for LLCP to NFCC */
1157 if (dm_disc_mask & NFA_DM_DISC_MASK_NFC_DEP) {
1158 nfa_p2p_set_config(dm_disc_mask);
nxpandroidc7611652015-09-23 16:42:05 +05301159 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301160 if (dm_disc_mask &
1161 (NFA_DM_DISC_MASK_PF_NFC_DEP | NFA_DM_DISC_MASK_PF_T3T)) {
1162 /* According to the NFC Forum Activity spec, controllers must:
1163 * 1) Poll with RC=0 and SC=FFFF to find NFC-DEP targets
1164 * 2) Poll with RC=1 and SC=FFFF to find T3T targets
1165 * Many controllers don't do this yet, and seem to be activating
1166 * NFC-DEP by default.
1167 *
1168 * We can at least fix the scenario where we're not interested
1169 * in NFC-DEP, by setting RC=1 in that case. Otherwise, keep
1170 * the default of RC=0. */
1171 p = config_params;
1172 UINT8_TO_STREAM(p, NFC_PMID_PF_RC);
1173 UINT8_TO_STREAM(p, NCI_PARAM_LEN_PF_RC);
1174 if ((dm_disc_mask & NFA_DM_DISC_MASK_PF_NFC_DEP) &&
1175 !nfa_dm_is_p2p_paused()) {
1176 UINT8_TO_STREAM(p, 0x00); // RC=0
1177 } else {
1178 UINT8_TO_STREAM(p, 0x01); // RC=1
1179 }
1180 nfa_dm_check_set_config(p - config_params, config_params, false);
nxpandroidc7611652015-09-23 16:42:05 +05301181 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301182 }
nxf24591c1cbeab2018-02-21 17:32:26 +05301183
1184 DLOG_IF(INFO, nfc_debug_enabled)
1185 << StringPrintf("dm_disc_mask = 0x%x", dm_disc_mask);
nxpandroid8f6d0532017-07-12 18:25:30 +05301186
1187 /* Get Discovery Technology parameters */
1188 num_params = nfa_dm_get_rf_discover_config(dm_disc_mask, disc_params,
1189 NFA_DM_MAX_DISC_PARAMS);
1190
1191 if (num_params) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301192 /*
1193 ** NFCC will abort programming personality slots if not available.
1194 ** NFCC programs the personality slots in the following order of RF
1195 ** technologies: NFC-A, NFC-B, NFC-BP, NFC-I93
1196 */
1197
nxpandroid8f6d0532017-07-12 18:25:30 +05301198 /* if this is not for exclusive control */
1199 if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1200 /* update listening protocols in each NFC technology */
1201 nfa_dm_set_rf_listen_mode_config(dm_disc_mask);
1202 }
nxf24591c1cbeab2018-02-21 17:32:26 +05301203
nxpandroid8f6d0532017-07-12 18:25:30 +05301204 /* Set polling duty cycle */
1205 nfa_dm_set_total_duration();
1206 nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask;
1207
1208 NFC_DiscoveryStart(num_params, disc_params, nfa_dm_disc_discovery_cback);
1209 /* set flag about waiting for response in IDLE state */
1210 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1211
1212 /* register callback to get interface error NTF */
1213 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
1214 } else {
1215 /* RF discovery is started but there is no valid technology or protocol to
1216 * discover */
1217 nfa_dm_disc_notify_started(NFA_STATUS_OK);
1218 }
1219
1220 /* if Kovio presence check timer is running, timeout callback will reset the
1221 * activation information */
1222 if ((nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO) ||
1223 (!nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1224 /* reset protocol and hanlde of activated sub-module */
1225 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1226 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1227 }
nxpandroidc7611652015-09-23 16:42:05 +05301228}
1229
1230/*******************************************************************************
1231**
1232** Function nfa_dm_notify_discovery
1233**
1234** Description Send RF discovery notification to upper layer
1235**
1236** Returns void
1237**
1238*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301239static void nfa_dm_notify_discovery(tNFA_DM_RF_DISC_DATA* p_data) {
1240 tNFA_CONN_EVT_DATA conn_evt;
nxpandroidc7611652015-09-23 16:42:05 +05301241
nxpandroid8f6d0532017-07-12 18:25:30 +05301242 /* let application select a device */
1243 conn_evt.disc_result.status = NFA_STATUS_OK;
1244 memcpy(&(conn_evt.disc_result.discovery_ntf), &(p_data->nfc_discover.result),
1245 sizeof(tNFC_RESULT_DEVT));
nxpandroidc7611652015-09-23 16:42:05 +05301246
nxpandroid8f6d0532017-07-12 18:25:30 +05301247 nfa_dm_conn_cback_event_notify(NFA_DISC_RESULT_EVT, &conn_evt);
nxpandroidc7611652015-09-23 16:42:05 +05301248}
1249
nxpandroidc7611652015-09-23 16:42:05 +05301250/*******************************************************************************
1251**
1252** Function nfa_dm_disc_handle_kovio_activation
1253**
nxpandroid8f6d0532017-07-12 18:25:30 +05301254** Description Handle Kovio activation; whether it's new or repeated
1255** activation
nxpandroidc7611652015-09-23 16:42:05 +05301256**
nxf24591c1cbeab2018-02-21 17:32:26 +05301257** Returns TRUE if repeated activation. No need to notify activated
nxpandroid8f6d0532017-07-12 18:25:30 +05301258** event to upper layer
nxpandroidc7611652015-09-23 16:42:05 +05301259**
1260*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301261bool nfa_dm_disc_handle_kovio_activation(tNFC_DISCOVER* p_data,
1262 tNFA_DISCOVER_CBACK* p_disc_cback) {
1263 tNFC_DISCOVER disc_data;
nxpandroidc7611652015-09-23 16:42:05 +05301264
nxpandroid8f6d0532017-07-12 18:25:30 +05301265 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
1266 /* if this is new Kovio bar code tag */
1267 if ((nfa_dm_cb.activated_nfcid_len !=
1268 p_data->activate.rf_tech_param.param.pk.uid_len) ||
1269 (memcmp(p_data->activate.rf_tech_param.param.pk.uid,
1270 nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len))) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301271 DLOG_IF(INFO, nfc_debug_enabled)
1272 << StringPrintf("new Kovio tag is detected");
nxpandroidc7611652015-09-23 16:42:05 +05301273
nxpandroid8f6d0532017-07-12 18:25:30 +05301274 /* notify presence check failure for previous tag, if presence check is
1275 * pending */
1276 nfa_dm_disc_report_kovio_presence_check(NFA_STATUS_FAILED);
nxpandroidc7611652015-09-23 16:42:05 +05301277
nxpandroid8f6d0532017-07-12 18:25:30 +05301278 /* notify deactivation of previous activation before notifying new
1279 * activation */
1280 if (p_disc_cback) {
1281 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1282 (*(p_disc_cback))(NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1283 }
nxpandroidc7611652015-09-23 16:42:05 +05301284
nxpandroid8f6d0532017-07-12 18:25:30 +05301285 /* restart timer */
1286 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1287 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1288 } else {
1289 /* notify presence check ok, if presence check is pending */
1290 nfa_dm_disc_report_kovio_presence_check(NFC_STATUS_OK);
nxpandroidc7611652015-09-23 16:42:05 +05301291
nxpandroid8f6d0532017-07-12 18:25:30 +05301292 /* restart timer and do not notify upper layer */
1293 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1294 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
nxf24591c1cbeab2018-02-21 17:32:26 +05301295 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301296 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301297 } else {
1298 /* this is the first activation, so start timer and notify upper layer */
1299 nfa_dm_cb.disc_cb.kovio_tle.p_cback =
1300 (TIMER_CBACK*)nfa_dm_disc_kovio_timeout_cback;
1301 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1302 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1303 }
nxpandroidc7611652015-09-23 16:42:05 +05301304
nxf24591c1cbeab2018-02-21 17:32:26 +05301305 return false;
nxpandroidc7611652015-09-23 16:42:05 +05301306}
1307
1308/*******************************************************************************
1309**
1310** Function nfa_dm_disc_notify_activation
1311**
1312** Description Send RF activation notification to sub-module
1313**
1314** Returns NFA_STATUS_OK if success
1315**
1316*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301317static tNFA_STATUS nfa_dm_disc_notify_activation(tNFC_DISCOVER* p_data) {
1318 uint8_t xx, host_id_in_LRT;
1319 uint8_t iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES;
nxpandroidc7611652015-09-23 16:42:05 +05301320
nxpandroid8f6d0532017-07-12 18:25:30 +05301321 tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode;
1322 tNFC_PROTOCOL protocol = p_data->activate.protocol;
nxpandroidc7611652015-09-23 16:42:05 +05301323
nxpandroid8f6d0532017-07-12 18:25:30 +05301324 tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask;
nxpandroidc7611652015-09-23 16:42:05 +05301325
nxf24591c1cbeab2018-02-21 17:32:26 +05301326 DLOG_IF(INFO, nfc_debug_enabled)
1327 << StringPrintf("tech_n_mode:0x%X, proto:0x%X", tech_n_mode, protocol);
nxpandroidc7611652015-09-23 16:42:05 +05301328
nxpandroid8f6d0532017-07-12 18:25:30 +05301329 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1330 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode;
1331 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1332 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1333 nfa_dm_cb.disc_cb.activated_protocol = protocol;
1334 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
nxpandroidc7611652015-09-23 16:42:05 +05301335
nxpandroid8f6d0532017-07-12 18:25:30 +05301336 if (protocol == NFC_PROTOCOL_KOVIO) {
1337 /* check whether it's new or repeated activation */
1338 if (nfa_dm_disc_handle_kovio_activation(
1339 p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) {
1340 /* do not notify activation of Kovio to upper layer */
nxpandroidc7611652015-09-23 16:42:05 +05301341 return (NFA_STATUS_OK);
nxpandroid8f6d0532017-07-12 18:25:30 +05301342 }
nxpandroidc7611652015-09-23 16:42:05 +05301343 }
1344
nxpandroid8f6d0532017-07-12 18:25:30 +05301345 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1346 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1347 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
nxpandroidc7611652015-09-23 16:42:05 +05301348
nxpandroid8f6d0532017-07-12 18:25:30 +05301349 return (NFA_STATUS_OK);
1350 }
nxpandroidc7611652015-09-23 16:42:05 +05301351
nxpandroid8f6d0532017-07-12 18:25:30 +05301352 /* if this is NFCEE direct RF interface, notify activation to whoever
1353 * listening UICC */
1354 if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) {
1355 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1356 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1357 (nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH)) {
1358 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1359 nfa_dm_cb.disc_cb.activated_rf_interface =
1360 p_data->activate.intf_param.type;
1361 nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_UNKNOWN;
1362 nfa_dm_cb.disc_cb.activated_handle = xx;
nxpandroidc7611652015-09-23 16:42:05 +05301363
nxf24591c1cbeab2018-02-21 17:32:26 +05301364 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1365 "activated_rf_interface:0x%x, activated_handle: 0x%x",
nxpandroid8f6d0532017-07-12 18:25:30 +05301366 nfa_dm_cb.disc_cb.activated_rf_interface,
1367 nfa_dm_cb.disc_cb.activated_handle);
1368
1369 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1370 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1371 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1372
1373 return (NFA_STATUS_OK);
1374 }
nxpandroidc7611652015-09-23 16:42:05 +05301375 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301376 return (NFA_STATUS_FAILED);
1377 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301378
nxf2459148793b62018-06-06 14:40:49 +05301379#if (NXP_EXTNS == TRUE)
1380 /*
1381 * if this is Proprietary RF interface, notify activation as START_READER_EVT.
1382 *
1383 * Code to handle the Reader over SWP.
1384 * 1. Pass this info to JNI as START_READER_EVT.
1385 * return (NFA_STATUS_OK)
1386 */
1387 if (p_data->activate.intf_param.type == nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT ||
1388 p_data->activate.intf_param.type == nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT) {
1389 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1390 if ((nfa_dm_cb.disc_cb.entry[xx].in_use)) {
1391 nfa_dm_cb.disc_cb.activated_rf_interface =
1392 p_data->activate.intf_param.type;
1393 nfa_dm_cb.disc_cb.activated_handle = xx;
1394
1395 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1396 "activated_rf_uicc-ese_interface:0x%x, activated_handle: 0x%x",
1397 nfa_dm_cb.disc_cb.activated_rf_interface,
1398 nfa_dm_cb.disc_cb.activated_handle);
1399
1400 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1401 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1402 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1403
1404 return (NFA_STATUS_OK);
1405 }
1406 }
1407 return (NFA_STATUS_FAILED);
1408 }
1409#endif
1410
nxpandroid8f6d0532017-07-12 18:25:30 +05301411 /* get bit mask of technolgies/mode and protocol */
1412 activated_disc_mask = nfa_dm_disc_get_disc_mask(tech_n_mode, protocol);
1413
1414 /* get host ID of technology from listen mode routing table */
1415 if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) {
1416 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A];
1417 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) {
1418 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B];
1419 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) {
1420 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F];
1421 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) {
1422 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP];
1423 } else /* DH only */
1424 {
1425 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1426 }
1427
1428 if (protocol == NFC_PROTOCOL_NFC_DEP) {
1429 /* Force NFC-DEP to the host */
1430 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1431 }
1432
1433 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1434 /* if any matching NFC technology and protocol */
1435 if (nfa_dm_cb.disc_cb.entry[xx].in_use) {
1436 if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT) {
1437 if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
nxf24591c1cbeab2018-02-21 17:32:26 +05301438 activated_disc_mask)
nxpandroid8f6d0532017-07-12 18:25:30 +05301439 break;
nxpandroid8f6d0532017-07-12 18:25:30 +05301440 } else {
1441 /* check ISO-DEP listening even if host in LRT is not matched */
1442 if (protocol == NFC_PROTOCOL_ISO_DEP) {
1443 if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) &&
1444 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1445 NFA_DM_DISC_MASK_LA_ISO_DEP)) {
1446 iso_dep_t3t__listen = xx;
1447 } else if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) &&
1448 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1449 NFA_DM_DISC_MASK_LB_ISO_DEP)) {
1450 iso_dep_t3t__listen = xx;
1451 }
1452 }
1453 /* check T3T listening even if host in LRT is not matched */
1454 else if (protocol == NFC_PROTOCOL_T3T) {
1455 if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) &&
1456 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1457 NFA_DM_DISC_MASK_LF_T3T)) {
1458 iso_dep_t3t__listen = xx;
1459 }
1460 }
1461 }
1462 }
1463 }
1464
1465 if (xx >= NFA_DM_DISC_NUM_ENTRIES) {
1466 /* if any ISO-DEP or T3T listening even if host in LRT is not matched */
1467 xx = iso_dep_t3t__listen;
1468 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301469 if (protocol == NFC_PROTOCOL_NFC_DEP &&
1470 (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE ||
1471 tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE ||
1472 tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301473 if (appl_dta_mode_flag == 1 && tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) {
1474 DLOG_IF(INFO, nfc_debug_enabled)
1475 << StringPrintf("DTA Mode Enabled : NFC-A Passive Listen Mode");
nxpandroid8f6d0532017-07-12 18:25:30 +05301476 }
1477 }
1478
nxpandroid8f6d0532017-07-12 18:25:30 +05301479 if (xx < NFA_DM_DISC_NUM_ENTRIES) {
1480 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode;
1481 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1482 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1483 nfa_dm_cb.disc_cb.activated_protocol = protocol;
1484 nfa_dm_cb.disc_cb.activated_handle = xx;
1485
nxf24591c1cbeab2018-02-21 17:32:26 +05301486 DLOG_IF(INFO, nfc_debug_enabled)
1487 << StringPrintf("activated_protocol:0x%x, activated_handle: 0x%x",
1488 nfa_dm_cb.disc_cb.activated_protocol,
1489 nfa_dm_cb.disc_cb.activated_handle);
nxpandroid8f6d0532017-07-12 18:25:30 +05301490
1491 if (protocol == NFC_PROTOCOL_KOVIO) {
1492 /* check whether it's new or repeated activation */
1493 if (nfa_dm_disc_handle_kovio_activation(
1494 p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) {
1495 /* do not notify activation of Kovio to upper layer */
1496 return (NFA_STATUS_OK);
1497 }
1498 }
1499
1500 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1501 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1502 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1503
1504 return (NFA_STATUS_OK);
1505 } else {
1506 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1507 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1508 return (NFA_STATUS_FAILED);
1509 }
nxpandroidc7611652015-09-23 16:42:05 +05301510}
1511
1512/*******************************************************************************
1513**
1514** Function nfa_dm_disc_notify_deactivation
1515**
1516** Description Send deactivation notification to sub-module
1517**
1518** Returns None
1519**
1520*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301521static void nfa_dm_disc_notify_deactivation(tNFA_DM_RF_DISC_SM_EVENT sm_event,
1522 tNFC_DISCOVER* p_data) {
1523 tNFA_HANDLE xx;
1524 tNFA_CONN_EVT_DATA evt_data;
1525 tNFC_DISCOVER disc_data;
nxpandroidc7611652015-09-23 16:42:05 +05301526
nxf24591c1cbeab2018-02-21 17:32:26 +05301527 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1528 "activated_handle=%d", nfa_dm_cb.disc_cb.activated_handle);
nxpandroidc7611652015-09-23 16:42:05 +05301529
nxpandroid8f6d0532017-07-12 18:25:30 +05301530 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301531 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("for sleep wakeup");
nxpandroid8f6d0532017-07-12 18:25:30 +05301532 return;
1533 }
1534
1535 if (sm_event == NFA_DM_RF_DEACTIVATE_RSP) {
1536 /*
1537 ** Activation has been aborted by upper layer in
1538 ** NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT
1539 ** Deactivation by upper layer or RF link loss in
1540 ** NFA_DM_RFST_LISTEN_SLEEP
1541 ** No sub-module is activated at this state.
1542 */
1543
1544 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP) {
1545 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1546 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1547 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1548 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1549 NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1550 }
1551 } else {
1552 /* let each sub-module handle deactivation */
1553 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1554 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1555 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1556 NFA_DM_DISC_MASK_LISTEN)) {
1557 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1558 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1559 NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1560 }
1561 }
1562 }
1563 } else if ((!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)) ||
1564 (nfa_dm_cb.disc_cb.deact_notify_pending)) {
1565 xx = nfa_dm_cb.disc_cb.activated_handle;
1566
1567 /* notify event to activated module if failed while reactivation */
1568 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1569 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1570 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1571 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1572 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1573 }
1574 } else if ((xx < NFA_DM_DISC_NUM_ENTRIES) &&
1575 (nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1576 (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) {
1577 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1578 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1579 } else {
1580 /* notify deactivation to application if there is no activated module */
1581 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1582 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
1583 }
1584 }
1585 } else {
1586 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) {
1587 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
1588 /* restart timer and do not notify upper layer */
1589 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1590 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
nxpandroidc7611652015-09-23 16:42:05 +05301591 return;
nxpandroid8f6d0532017-07-12 18:25:30 +05301592 }
1593 /* Otherwise, upper layer initiated deactivation. */
nxpandroidc7611652015-09-23 16:42:05 +05301594 }
1595
nxpandroid8f6d0532017-07-12 18:25:30 +05301596 /* notify event to activated module */
1597 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1598 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1599 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1600 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1601 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1602 }
1603 } else {
1604 xx = nfa_dm_cb.disc_cb.activated_handle;
nxpandroidc7611652015-09-23 16:42:05 +05301605
nxpandroid8f6d0532017-07-12 18:25:30 +05301606 if ((xx < NFA_DM_DISC_NUM_ENTRIES) &&
1607 (nfa_dm_cb.disc_cb.entry[xx].in_use)) {
1608 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1609 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1610 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1611 }
nxpandroidc7611652015-09-23 16:42:05 +05301612 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301613 }
nxpandroidc7611652015-09-23 16:42:05 +05301614
nxpandroid8f6d0532017-07-12 18:25:30 +05301615 /* clear activated information */
1616 nfa_dm_cb.disc_cb.activated_tech_mode = 0;
1617 nfa_dm_cb.disc_cb.activated_rf_disc_id = 0;
1618 nfa_dm_cb.disc_cb.activated_rf_interface = 0;
1619 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1620 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1621 nfa_dm_cb.disc_cb.deact_notify_pending = false;
nxpandroidc7611652015-09-23 16:42:05 +05301622}
1623
1624/*******************************************************************************
1625**
1626** Function nfa_dm_disc_sleep_wakeup
1627**
1628** Description Put tag to sleep, then wake it up. Can be used Perform
1629** legacy presence check or to wake up tag that went to HALT
1630** state
1631**
nxf24591c1cbeab2018-02-21 17:32:26 +05301632** Returns TRUE if operation started
nxpandroidc7611652015-09-23 16:42:05 +05301633**
1634*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301635tNFC_STATUS nfa_dm_disc_sleep_wakeup(void) {
1636 tNFC_STATUS status = NFC_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +05301637
nxpandroid8f6d0532017-07-12 18:25:30 +05301638 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1639 /* Deactivate to sleep mode */
1640 status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP);
1641 if (status == NFC_STATUS_OK) {
1642 /* deactivate to sleep is sent on behalf of sleep wakeup.
1643 * set the sleep wakeup information in control block */
1644 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1645 nfa_dm_cb.disc_cb.deact_pending = false;
nxpandroidc7611652015-09-23 16:42:05 +05301646 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301647 }
nxpandroidc7611652015-09-23 16:42:05 +05301648
nxpandroid8f6d0532017-07-12 18:25:30 +05301649 return (status);
nxpandroidc7611652015-09-23 16:42:05 +05301650}
1651
1652/*******************************************************************************
1653**
1654** Function nfa_dm_is_raw_frame_session
1655**
1656** Description If NFA_SendRawFrame is called since RF activation,
nxf24591c1cbeab2018-02-21 17:32:26 +05301657** this function returns TRUE.
nxpandroidc7611652015-09-23 16:42:05 +05301658**
nxf24591c1cbeab2018-02-21 17:32:26 +05301659** Returns TRUE if NFA_SendRawFrame is called
nxpandroidc7611652015-09-23 16:42:05 +05301660**
1661*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301662bool nfa_dm_is_raw_frame_session(void) {
1663 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_RAW_FRAME) ? true : false);
nxpandroidc7611652015-09-23 16:42:05 +05301664}
1665
1666/*******************************************************************************
1667**
1668** Function nfa_dm_is_p2p_paused
1669**
1670** Description If NFA_PauseP2p is called sand still effective,
nxf24591c1cbeab2018-02-21 17:32:26 +05301671** this function returns TRUE.
nxpandroidc7611652015-09-23 16:42:05 +05301672**
nxf24591c1cbeab2018-02-21 17:32:26 +05301673** Returns TRUE if NFA_SendRawFrame is called
nxpandroidc7611652015-09-23 16:42:05 +05301674**
1675*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301676bool nfa_dm_is_p2p_paused(void) {
1677 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? true : false);
nxpandroidc7611652015-09-23 16:42:05 +05301678}
1679
1680/*******************************************************************************
1681**
1682** Function nfa_dm_disc_end_sleep_wakeup
1683**
1684** Description Sleep Wakeup is complete
1685**
1686** Returns None
1687**
1688*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301689static void nfa_dm_disc_end_sleep_wakeup(tNFC_STATUS status) {
1690 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) &&
1691 (nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1692 /* ignore it while doing Kovio presence check */
1693 return;
1694 }
1695
1696 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
1697 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
1698
1699 /* notify RW module that sleep wakeup is finished */
1700 nfa_rw_handle_sleep_wakeup_rsp(status);
1701
1702 if (nfa_dm_cb.disc_cb.deact_pending) {
1703 nfa_dm_cb.disc_cb.deact_pending = false;
1704 /* Perform pending deactivate command and on response notfiy deactivation
1705 */
1706 nfa_dm_cb.disc_cb.deact_notify_pending = true;
nxf24591c1cbeab2018-02-21 17:32:26 +05301707 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
1708 nfa_dm_rf_disc_data.deactivate_type =
1709 nfa_dm_cb.disc_cb.pending_deact_type;
1710 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
nxpandroidc7611652015-09-23 16:42:05 +05301711 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301712 }
nxpandroidc7611652015-09-23 16:42:05 +05301713}
1714
1715/*******************************************************************************
1716**
1717** Function nfa_dm_disc_kovio_timeout_cback
1718**
1719** Description Timeout for Kovio bar code tag presence check
1720**
1721** Returns void
1722**
1723*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301724static void nfa_dm_disc_kovio_timeout_cback(__attribute__((unused))
1725 TIMER_LIST_ENT* p_tle) {
1726 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301727
nxpandroid8f6d0532017-07-12 18:25:30 +05301728 /* notify presence check failure, if presence check is pending */
1729 nfa_dm_disc_report_kovio_presence_check(NFC_STATUS_FAILED);
nxpandroidc7611652015-09-23 16:42:05 +05301730
nxpandroid8f6d0532017-07-12 18:25:30 +05301731 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1732 /* restart timer in case that upper layer's presence check interval is too
1733 * long */
1734 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1735 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1736 } else {
1737 /* notify upper layer deactivated event */
nxf24591c1cbeab2018-02-21 17:32:26 +05301738 tNFC_DEACTIVATE_DEVT deact;
nxpandroid8f6d0532017-07-12 18:25:30 +05301739 deact.status = NFC_STATUS_OK;
1740 deact.type = NFC_DEACTIVATE_TYPE_DISCOVERY;
1741 deact.is_ntf = true;
nxf24591c1cbeab2018-02-21 17:32:26 +05301742 tNFC_DISCOVER nfc_discover;
1743 nfc_discover.deactivate = deact;
1744 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF, &nfc_discover);
nxpandroid8f6d0532017-07-12 18:25:30 +05301745 }
nxpandroidc7611652015-09-23 16:42:05 +05301746}
1747
1748/*******************************************************************************
1749**
1750** Function nfa_dm_disc_start_kovio_presence_check
1751**
1752** Description Deactivate to discovery mode and wait for activation
1753**
nxf24591c1cbeab2018-02-21 17:32:26 +05301754** Returns TRUE if operation started
nxpandroidc7611652015-09-23 16:42:05 +05301755**
1756*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301757tNFC_STATUS nfa_dm_disc_start_kovio_presence_check(void) {
1758 tNFC_STATUS status = NFC_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +05301759
nxf24591c1cbeab2018-02-21 17:32:26 +05301760 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301761
nxpandroid8f6d0532017-07-12 18:25:30 +05301762 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) &&
1763 (nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1764 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1765 /* restart timer */
1766 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1767 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
nxpandroidc7611652015-09-23 16:42:05 +05301768
nxpandroid8f6d0532017-07-12 18:25:30 +05301769 /* Deactivate to discovery mode */
1770 status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_DISCOVERY);
nxpandroidc7611652015-09-23 16:42:05 +05301771
nxpandroid8f6d0532017-07-12 18:25:30 +05301772 if (status == NFC_STATUS_OK) {
1773 /* deactivate to sleep is sent on behalf of sleep wakeup.
1774 * set the sleep wakeup information in control block */
1775 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1776 nfa_dm_cb.disc_cb.deact_pending = false;
1777 }
1778 } else {
1779 /* wait for next activation */
1780 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1781 nfa_dm_cb.disc_cb.deact_pending = false;
1782 status = NFC_STATUS_OK;
nxpandroidc7611652015-09-23 16:42:05 +05301783 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301784 }
nxpandroidc7611652015-09-23 16:42:05 +05301785
nxpandroid8f6d0532017-07-12 18:25:30 +05301786 return (status);
nxpandroidc7611652015-09-23 16:42:05 +05301787}
1788
1789/*******************************************************************************
1790**
1791** Function nfa_dm_disc_report_kovio_presence_check
1792**
1793** Description Report Kovio presence check status
1794**
1795** Returns None
1796**
1797*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301798static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301799 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301800
nxpandroid8f6d0532017-07-12 18:25:30 +05301801 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
1802 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
nxpandroidc7611652015-09-23 16:42:05 +05301803
nxpandroid8f6d0532017-07-12 18:25:30 +05301804 /* notify RW module that sleep wakeup is finished */
1805 nfa_rw_handle_presence_check_rsp(status);
nxpandroidc7611652015-09-23 16:42:05 +05301806
nxpandroid8f6d0532017-07-12 18:25:30 +05301807 if (nfa_dm_cb.disc_cb.deact_pending) {
1808 nfa_dm_cb.disc_cb.deact_pending = false;
nxf24591c1cbeab2018-02-21 17:32:26 +05301809 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
1810 nfa_dm_rf_disc_data.deactivate_type =
1811 nfa_dm_cb.disc_cb.pending_deact_type;
1812 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
nxpandroidc7611652015-09-23 16:42:05 +05301813 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301814 }
nxpandroidc7611652015-09-23 16:42:05 +05301815}
1816
1817/*******************************************************************************
1818**
1819** Function nfa_dm_disc_data_cback
1820**
1821** Description Monitoring interface error through data callback
1822**
1823** Returns void
1824**
1825*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301826static void nfa_dm_disc_data_cback(__attribute__((unused)) uint8_t conn_id,
1827 tNFC_CONN_EVT event, tNFC_CONN* p_data) {
1828 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301829
nxpandroid8f6d0532017-07-12 18:25:30 +05301830 /* if selection failed */
1831 if (event == NFC_ERROR_CEVT) {
1832 nfa_dm_disc_sm_execute(NFA_DM_CORE_INTF_ERROR_NTF, NULL);
1833 } else if (event == NFC_DATA_CEVT) {
1834 GKI_freebuf(p_data->data.p_data);
1835 }
nxpandroidc7611652015-09-23 16:42:05 +05301836}
1837
1838/*******************************************************************************
1839**
1840** Function nfa_dm_disc_new_state
1841**
1842** Description Processing discovery events in NFA_DM_RFST_IDLE state
1843**
1844** Returns void
1845**
1846*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301847void nfa_dm_disc_new_state(tNFA_DM_RF_DISC_STATE new_state) {
1848 tNFA_CONN_EVT_DATA evt_data;
1849 tNFA_DM_RF_DISC_STATE old_state = nfa_dm_cb.disc_cb.disc_state;
nxpandroidc7611652015-09-23 16:42:05 +05301850
nxf24591c1cbeab2018-02-21 17:32:26 +05301851 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1852 "old_state: %s (%d), new_state: %s (%d) "
nxpandroid8f6d0532017-07-12 18:25:30 +05301853 "disc_flags: 0x%x",
nxf24591c1cbeab2018-02-21 17:32:26 +05301854 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
1855 nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_state_2_str(new_state).c_str(),
nxpandroid8f6d0532017-07-12 18:25:30 +05301856 new_state, nfa_dm_cb.disc_cb.disc_flags);
nxpandroidc7611652015-09-23 16:42:05 +05301857
nxpandroid8f6d0532017-07-12 18:25:30 +05301858 nfa_dm_cb.disc_cb.disc_state = new_state;
nxpandroidc7611652015-09-23 16:42:05 +05301859
nxpandroid8f6d0532017-07-12 18:25:30 +05301860 /* not error recovering */
1861 if ((new_state == NFA_DM_RFST_IDLE) &&
1862 (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))) {
1863 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
1864 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING;
nxpandroidc7611652015-09-23 16:42:05 +05301865
nxpandroid8f6d0532017-07-12 18:25:30 +05301866 /* if exclusive RF control is stopping */
1867 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) {
1868 if (old_state > NFA_DM_RFST_DISCOVERY) {
1869 /* notify deactivation to application */
1870 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1871 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301872 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301873
1874 nfa_dm_rel_excl_rf_control_and_notify();
1875 } else {
1876 evt_data.status = NFA_STATUS_OK;
1877 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
1878 }
nxpandroidc7611652015-09-23 16:42:05 +05301879 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301880 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING) {
1881 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
1882 nfa_sys_check_disabled();
1883 }
1884 }
nxpandroidc7611652015-09-23 16:42:05 +05301885}
1886
1887/*******************************************************************************
1888**
1889** Function nfa_dm_disc_sm_idle
1890**
1891** Description Processing discovery events in NFA_DM_RFST_IDLE state
1892**
1893** Returns void
1894**
1895*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301896static void nfa_dm_disc_sm_idle(tNFA_DM_RF_DISC_SM_EVENT event,
1897 tNFA_DM_RF_DISC_DATA* p_data) {
1898 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +05301899
nxpandroid8f6d0532017-07-12 18:25:30 +05301900 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05301901 case NFA_DM_RF_DISCOVER_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05301902 nfa_dm_start_rf_discover();
1903 break;
nxpandroidc7611652015-09-23 16:42:05 +05301904
1905 case NFA_DM_RF_DISCOVER_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05301906 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
nxpandroidc7611652015-09-23 16:42:05 +05301907
nxpandroid8f6d0532017-07-12 18:25:30 +05301908 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
1909 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
nxpandroidc7611652015-09-23 16:42:05 +05301910
nxpandroid8f6d0532017-07-12 18:25:30 +05301911 /* if RF discovery was stopped while waiting for response */
1912 if (nfa_dm_cb.disc_cb.disc_flags &
1913 (NFA_DM_DISC_FLAGS_STOPPING | NFA_DM_DISC_FLAGS_DISABLING)) {
1914 /* stop discovery */
1915 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1916 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1917 break;
nxpandroidc7611652015-09-23 16:42:05 +05301918 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301919
1920 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1921 if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &
1922 NFA_DM_DISC_FLAGS_NOTIFY) {
1923 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &=
1924 ~NFA_DM_DISC_FLAGS_NOTIFY;
1925
1926 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1927 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
nxf24591c1cbeab2018-02-21 17:32:26 +05301928 NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
nxpandroid8f6d0532017-07-12 18:25:30 +05301929 }
1930 } else {
1931 /* notify event to each module which is waiting for start */
1932 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1933 /* if registered module is waiting for starting discovery */
1934 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1935 (nfa_dm_cb.disc_cb.dm_disc_mask &
1936 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask) &&
1937 (nfa_dm_cb.disc_cb.entry[xx].disc_flags &
1938 NFA_DM_DISC_FLAGS_NOTIFY)) {
1939 nfa_dm_cb.disc_cb.entry[xx].disc_flags &=
1940 ~NFA_DM_DISC_FLAGS_NOTIFY;
1941
1942 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1943 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
nxf24591c1cbeab2018-02-21 17:32:26 +05301944 NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
nxpandroid8f6d0532017-07-12 18:25:30 +05301945 }
1946 }
nxpandroidc7611652015-09-23 16:42:05 +05301947 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301948 nfa_dm_disc_notify_started(p_data->nfc_discover.status);
1949 } else {
1950 /* in rare case that the discovery states of NFCC and DH mismatch and
1951 * NFCC rejects Discover Cmd
1952 * deactivate idle and then start disvocery when got deactivate rsp */
1953 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1954 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1955 }
1956 break;
nxpandroidc7611652015-09-23 16:42:05 +05301957
1958 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05301959 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
nxpandroidc7611652015-09-23 16:42:05 +05301960
nxpandroid8f6d0532017-07-12 18:25:30 +05301961 /* if NFCC goes to idle successfully */
1962 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
1963 /* if DH forced to go idle while waiting for deactivation NTF */
1964 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
1965 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
1966 &(p_data->nfc_discover));
nxpandroidc7611652015-09-23 16:42:05 +05301967
nxpandroid8f6d0532017-07-12 18:25:30 +05301968 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or
1969 * NFA_DM_DISC_FLAGS_DISABLING */
1970 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1971 /* check if need to restart discovery after resync discovery state
1972 * with NFCC */
1973 nfa_dm_start_rf_discover();
nxpandroidc7611652015-09-23 16:42:05 +05301974 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301975 /* Otherwise, deactivating when getting unexpected activation */
1976 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301977 /* Otherwise, wait for deactivation NTF */
1978 break;
nxpandroidc7611652015-09-23 16:42:05 +05301979
1980 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05301981 /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while
1982 * deactivating */
1983 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
1984 if (p_data->nfc_discover.deactivate.type ==
1985 NFC_DEACTIVATE_TYPE_DISCOVERY) {
1986 /* stop discovery */
1987 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1988 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1989 } else {
1990 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
1991 &(p_data->nfc_discover));
1992 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or
1993 * NFA_DM_DISC_FLAGS_DISABLING */
1994 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1995 /* check if need to restart discovery after resync discovery state
1996 * with NFCC */
1997 nfa_dm_start_rf_discover();
nxpandroidc7611652015-09-23 16:42:05 +05301998 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301999 }
2000 /* Otherwise, deactivated when received unexpected activation in idle
2001 * state */
2002 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2003 break;
nxpandroidc7611652015-09-23 16:42:05 +05302004
2005 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302006 /* unexpected activation, deactivate to idle */
2007 nfa_dm_cb.disc_cb.disc_flags |=
2008 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
2009 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2010 break;
nxpandroidc7611652015-09-23 16:42:05 +05302011
2012 case NFA_DM_LP_LISTEN_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302013 nfa_dm_disc_new_state(NFA_DM_RFST_LP_LISTEN);
2014 break;
nxpandroidc7611652015-09-23 16:42:05 +05302015
2016 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302017 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302018 break;
2019 }
nxpandroidc7611652015-09-23 16:42:05 +05302020}
2021
2022/*******************************************************************************
2023**
2024** Function nfa_dm_disc_sm_discovery
2025**
2026** Description Processing discovery events in NFA_DM_RFST_DISCOVERY state
2027**
2028** Returns void
2029**
2030*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302031static void nfa_dm_disc_sm_discovery(tNFA_DM_RF_DISC_SM_EVENT event,
2032 tNFA_DM_RF_DISC_DATA* p_data) {
2033 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302034 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302035 /* if deactivate CMD was not sent to NFCC */
2036 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2037 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2038 NFC_Deactivate(p_data->deactivate_type);
2039 }
2040 break;
nxpandroidc7611652015-09-23 16:42:05 +05302041 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302042 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
nxpandroidc7611652015-09-23 16:42:05 +05302043
nxpandroid8f6d0532017-07-12 18:25:30 +05302044 /* if it's not race condition between deactivate CMD and activate NTF */
2045 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2046 /* do not notify deactivated to idle in RF discovery state
2047 ** because it is internal or stopping RF discovery
2048 */
nxpandroidc7611652015-09-23 16:42:05 +05302049
nxpandroid8f6d0532017-07-12 18:25:30 +05302050 /* there was no activation while waiting for deactivation RSP */
2051 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2052 nfa_dm_start_rf_discover();
2053 }
2054 break;
nxpandroidc7611652015-09-23 16:42:05 +05302055 case NFA_DM_RF_DISCOVER_NTF:
nxf24591c1cbeab2018-02-21 17:32:26 +05302056 nfa_dm_disc_new_state(NFA_DM_RFST_W4_ALL_DISCOVERIES);
nxpandroid8f6d0532017-07-12 18:25:30 +05302057 nfa_dm_notify_discovery(p_data);
2058 break;
nxpandroidc7611652015-09-23 16:42:05 +05302059 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302060 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302061 DLOG_IF(INFO, nfc_debug_enabled)
2062 << StringPrintf("RF Activated while waiting for deactivation RSP");
nxpandroid8f6d0532017-07-12 18:25:30 +05302063 /* it's race condition. DH has to wait for deactivation NTF */
2064 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF;
2065 } else {
2066 if (p_data->nfc_discover.activate.intf_param.type ==
2067 NFC_INTERFACE_EE_DIRECT_RF) {
2068 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
nxf2459148793b62018-06-06 14:40:49 +05302069 }
2070#if (NXP_EXTNS == TRUE)
2071 /*
2072 * Handle the Reader over SWP.
2073 * Add condition UICC_DIRECT_INTF/ESE_DIRECT_INTF
2074 * set new state NFA_DM_RFST_POLL_ACTIVE
2075 * */
2076 else if (p_data->nfc_discover.activate.intf_param.type ==
2077 nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT ||
2078 p_data->nfc_discover.activate.intf_param.type ==
2079 nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT) {
2080 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
2081 }
2082#endif
2083 else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80) {
nxpandroid8f6d0532017-07-12 18:25:30 +05302084 /* Listen mode */
2085 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
2086 } else {
2087 /* Poll mode */
2088 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
nxpandroidc7611652015-09-23 16:42:05 +05302089 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302090
2091 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2092 NFA_STATUS_FAILED) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302093 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2094 "Not matched, restart discovery after receiving "
2095 "deactivate ntf");
nxpandroid8f6d0532017-07-12 18:25:30 +05302096
2097 /* after receiving deactivate event, restart discovery */
2098 nfa_dm_cb.disc_cb.disc_flags |=
2099 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
2100 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2101 }
2102 }
2103 break;
nxpandroidc7611652015-09-23 16:42:05 +05302104
2105 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302106 /* if there was race condition between deactivate CMD and activate NTF */
2107 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) {
2108 /* race condition is resolved */
2109 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
nxpandroidc7611652015-09-23 16:42:05 +05302110
nxpandroid8f6d0532017-07-12 18:25:30 +05302111 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2112 /* do not notify deactivated to idle in RF discovery state
2113 ** because it is internal or stopping RF discovery
2114 */
nxpandroidc7611652015-09-23 16:42:05 +05302115
nxpandroid8f6d0532017-07-12 18:25:30 +05302116 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2117 nfa_dm_start_rf_discover();
nxpandroidc7611652015-09-23 16:42:05 +05302118 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302119 }
2120 break;
nxpandroidc7611652015-09-23 16:42:05 +05302121 case NFA_DM_LP_LISTEN_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302122 break;
nxpandroidc7611652015-09-23 16:42:05 +05302123 case NFA_DM_CORE_INTF_ERROR_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302124 break;
nxpandroidc7611652015-09-23 16:42:05 +05302125 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302126 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302127 break;
2128 }
nxpandroidc7611652015-09-23 16:42:05 +05302129}
2130
2131/*******************************************************************************
2132**
2133** Function nfa_dm_disc_sm_w4_all_discoveries
2134**
nxpandroid8f6d0532017-07-12 18:25:30 +05302135** Description Processing discovery events in
2136** NFA_DM_RFST_W4_ALL_DISCOVERIES state
nxpandroidc7611652015-09-23 16:42:05 +05302137**
2138** Returns void
2139**
2140*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302141static void nfa_dm_disc_sm_w4_all_discoveries(tNFA_DM_RF_DISC_SM_EVENT event,
2142 tNFA_DM_RF_DISC_DATA* p_data) {
2143 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302144 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302145 /* if deactivate CMD was not sent to NFCC */
2146 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2147 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2148 /* only IDLE mode is allowed */
2149 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2150 }
2151 break;
nxpandroidc7611652015-09-23 16:42:05 +05302152 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302153 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2154 /* notify exiting from w4 all discoverie state */
2155 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2156 &(p_data->nfc_discover));
nxpandroidc7611652015-09-23 16:42:05 +05302157
nxpandroid8f6d0532017-07-12 18:25:30 +05302158 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2159 nfa_dm_start_rf_discover();
2160 break;
nxpandroidc7611652015-09-23 16:42:05 +05302161 case NFA_DM_RF_DISCOVER_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302162 /* if deactivate CMD is already sent then ignore discover NTF */
2163 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2164 /* Notification Type = NCI_DISCOVER_NTF_LAST or
2165 * NCI_DISCOVER_NTF_LAST_ABORT */
2166 if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE) {
2167 nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
nxpandroidc7611652015-09-23 16:42:05 +05302168 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302169 nfa_dm_notify_discovery(p_data);
2170 }
2171 break;
nxpandroidc7611652015-09-23 16:42:05 +05302172 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302173 /*
2174 ** This is only for ISO15693.
2175 ** FW sends activation NTF when all responses are received from tags
2176 ** without host selecting.
2177 */
2178 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
nxpandroidc7611652015-09-23 16:42:05 +05302179
nxpandroid8f6d0532017-07-12 18:25:30 +05302180 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2181 NFA_STATUS_FAILED) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302182 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05302183 "Not matched, restart discovery after receiving deactivate ntf");
nxpandroidc7611652015-09-23 16:42:05 +05302184
nxpandroid8f6d0532017-07-12 18:25:30 +05302185 /* after receiving deactivate event, restart discovery */
2186 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2187 }
2188 break;
nxpandroidc7611652015-09-23 16:42:05 +05302189 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302190 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302191 break;
2192 }
nxpandroidc7611652015-09-23 16:42:05 +05302193}
2194
2195/*******************************************************************************
2196**
2197** Function nfa_dm_disc_sm_w4_host_select
2198**
nxpandroid8f6d0532017-07-12 18:25:30 +05302199** Description Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT
2200** state
nxpandroidc7611652015-09-23 16:42:05 +05302201**
2202** Returns void
2203**
2204*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302205static void nfa_dm_disc_sm_w4_host_select(tNFA_DM_RF_DISC_SM_EVENT event,
2206 tNFA_DM_RF_DISC_DATA* p_data) {
2207 tNFA_CONN_EVT_DATA conn_evt;
2208 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag =
2209 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2210 bool sleep_wakeup_event = false;
2211 bool sleep_wakeup_event_processed = false;
2212 tNFA_STATUS status;
nxpandroidc7611652015-09-23 16:42:05 +05302213
nxpandroid8f6d0532017-07-12 18:25:30 +05302214 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302215 case NFA_DM_RF_DISCOVER_SELECT_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302216 /* if not waiting to deactivate */
2217 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2218 NFC_DiscoverySelect(p_data->select.rf_disc_id, p_data->select.protocol,
2219 p_data->select.rf_interface);
2220 } else {
2221 nfa_dm_disc_conn_event_notify(NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED);
2222 }
2223 break;
nxpandroidc7611652015-09-23 16:42:05 +05302224
2225 case NFA_DM_RF_DISCOVER_SELECT_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302226 sleep_wakeup_event = true;
2227 /* notify application status of selection */
2228 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
2229 sleep_wakeup_event_processed = true;
2230 conn_evt.status = NFA_STATUS_OK;
2231 /* register callback to get interface error NTF */
2232 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
2233 } else
2234 conn_evt.status = NFA_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +05302235
nxpandroid8f6d0532017-07-12 18:25:30 +05302236 if (!old_sleep_wakeup_flag) {
2237 nfa_dm_disc_conn_event_notify(NFA_SELECT_RESULT_EVT,
2238 p_data->nfc_discover.status);
2239 }
2240 break;
nxpandroidc7611652015-09-23 16:42:05 +05302241 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302242 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
nxpandroid8f6d0532017-07-12 18:25:30 +05302243 /* always call nfa_dm_disc_notify_activation to update protocol/interface
2244 * information in NFA control blocks */
2245 status = nfa_dm_disc_notify_activation(&(p_data->nfc_discover));
nxpandroid8f6d0532017-07-12 18:25:30 +05302246 if (old_sleep_wakeup_flag) {
2247 /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag;
2248 * if deactivation is pending then deactivate */
2249 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
nxpandroid8f6d0532017-07-12 18:25:30 +05302250 } else if (status == NFA_STATUS_FAILED) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302251 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05302252 "Not matched, restart discovery after receiving deactivate ntf");
nxpandroidc7611652015-09-23 16:42:05 +05302253
nxpandroid8f6d0532017-07-12 18:25:30 +05302254 /* after receiving deactivate event, restart discovery */
2255 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2256 }
2257 break;
nxpandroidc7611652015-09-23 16:42:05 +05302258 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302259 if (old_sleep_wakeup_flag) {
2260 nfa_dm_cb.disc_cb.deact_pending = true;
2261 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2262 }
2263 /* if deactivate CMD was not sent to NFCC */
2264 else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2265 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2266 /* only IDLE mode is allowed */
2267 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2268 }
2269 break;
nxpandroidc7611652015-09-23 16:42:05 +05302270 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302271 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2272 /* notify exiting from host select state */
2273 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2274 &(p_data->nfc_discover));
nxpandroidc7611652015-09-23 16:42:05 +05302275
nxpandroid8f6d0532017-07-12 18:25:30 +05302276 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2277 nfa_dm_start_rf_discover();
2278 break;
nxpandroidc7611652015-09-23 16:42:05 +05302279
2280 case NFA_DM_CORE_INTF_ERROR_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302281 sleep_wakeup_event = true;
2282 if (!old_sleep_wakeup_flag) {
2283 /* target activation failed, upper layer may deactivate or select again
2284 */
2285 conn_evt.status = NFA_STATUS_FAILED;
2286 nfa_dm_conn_cback_event_notify(NFA_SELECT_RESULT_EVT, &conn_evt);
2287 }
2288 break;
nxpandroidc7611652015-09-23 16:42:05 +05302289 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302290 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302291 break;
2292 }
nxpandroidc7611652015-09-23 16:42:05 +05302293
nxpandroid8f6d0532017-07-12 18:25:30 +05302294 if (old_sleep_wakeup_flag && sleep_wakeup_event &&
2295 !sleep_wakeup_event_processed) {
2296 /* performing sleep wakeup and exception conditions happened
2297 * clear sleep wakeup information and report failure */
2298 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_FAILED);
2299 }
nxpandroidc7611652015-09-23 16:42:05 +05302300}
2301
2302/*******************************************************************************
2303**
2304** Function nfa_dm_disc_sm_poll_active
2305**
2306** Description Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state
2307**
2308** Returns void
2309**
2310*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302311static void nfa_dm_disc_sm_poll_active(tNFA_DM_RF_DISC_SM_EVENT event,
2312 tNFA_DM_RF_DISC_DATA* p_data) {
2313 tNFC_STATUS status;
2314 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag =
2315 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2316 bool sleep_wakeup_event = false;
2317 bool sleep_wakeup_event_processed = false;
nxpandroidc7611652015-09-23 16:42:05 +05302318
nxpandroid8f6d0532017-07-12 18:25:30 +05302319 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302320 case NFA_DM_RF_DEACTIVATE_CMD:
nxf24591c1cbeab2018-02-21 17:32:26 +05302321 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
2322 if ((nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_FRAME) &&
2323 (p_data->deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP)) {
2324 /* NCI 2.0- DH is responsible for sending deactivation commands before
2325 * RF_DEACTIVATE_CMD */
2326 nfa_dm_send_tag_deselect_cmd(nfa_dm_cb.disc_cb.activated_protocol);
2327 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302328 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302329
nxpandroid8f6d0532017-07-12 18:25:30 +05302330 if (nfa_dm_cb.disc_cb.activated_protocol == NCI_PROTOCOL_MIFARE) {
2331 nfa_dm_cb.disc_cb.deact_pending = true;
2332 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2333 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
nxpandroidc7611652015-09-23 16:42:05 +05302334 break;
nxpandroid8f6d0532017-07-12 18:25:30 +05302335 }
2336
2337 if (old_sleep_wakeup_flag) {
2338 /* sleep wakeup is already enabled when deactivate cmd is requested,
2339 * keep the information in control block to issue it later */
2340 nfa_dm_cb.disc_cb.deact_pending = true;
2341 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2342 } else {
2343 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2344 }
2345
2346 break;
nxpandroidc7611652015-09-23 16:42:05 +05302347 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302348 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2349 /* register callback to get interface error NTF */
2350 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
nxpandroidc7611652015-09-23 16:42:05 +05302351
nxpandroid8f6d0532017-07-12 18:25:30 +05302352 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2353 /* it's race condition. received deactivate NTF before receiving RSP */
nxpandroidc7611652015-09-23 16:42:05 +05302354
nxf24591c1cbeab2018-02-21 17:32:26 +05302355 tNFC_DEACTIVATE_DEVT deact;
nxpandroid8f6d0532017-07-12 18:25:30 +05302356 deact.status = NFC_STATUS_OK;
2357 deact.type = NFC_DEACTIVATE_TYPE_IDLE;
2358 deact.is_ntf = true;
nxf24591c1cbeab2018-02-21 17:32:26 +05302359 tNFC_DISCOVER nfc_discover;
2360 nfc_discover.deactivate = deact;
nxpandroid8f6d0532017-07-12 18:25:30 +05302361 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
nxf24591c1cbeab2018-02-21 17:32:26 +05302362 &nfc_discover);
nxpandroidc7611652015-09-23 16:42:05 +05302363
nxpandroid8f6d0532017-07-12 18:25:30 +05302364 /* NFCC is in IDLE state */
2365 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2366 nfa_dm_start_rf_discover();
2367 }
2368 break;
nxpandroidc7611652015-09-23 16:42:05 +05302369 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302370 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
nxpandroidc7611652015-09-23 16:42:05 +05302371
nxpandroid8f6d0532017-07-12 18:25:30 +05302372 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
nxpandroidc7611652015-09-23 16:42:05 +05302373
nxpandroid8f6d0532017-07-12 18:25:30 +05302374 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
2375 /* it's race condition. received deactivate NTF before receiving RSP */
2376 /* notify deactivation after receiving deactivate RSP */
nxf24591c1cbeab2018-02-21 17:32:26 +05302377 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2378 "Rx deactivate NTF while waiting for deactivate RSP");
nxpandroidc7611652015-09-23 16:42:05 +05302379 break;
nxpandroid8f6d0532017-07-12 18:25:30 +05302380 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302381 if (p_data->nfc_discover.deactivate.reason !=
2382 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2383 sleep_wakeup_event = true;
2384 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2385 &(p_data->nfc_discover));
2386 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302387 if ((p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
2388 (p_data->nfc_discover.deactivate.type ==
2389 NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302390 if (p_data->nfc_discover.deactivate.reason !=
2391 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2392 /* count for number of times deactivate cmd sent */
2393 nfa_dm_cb.deactivate_cmd_retry_count = 0;
2394 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302395 nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
2396 if (old_sleep_wakeup_flag) {
2397 sleep_wakeup_event_processed = true;
2398 /* process pending deactivate request */
2399 if (nfa_dm_cb.disc_cb.deact_pending) {
2400 /* notify RW module that sleep wakeup is finished */
2401 /* if deactivation is pending then deactivate */
2402 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
2403
2404 /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will
2405 * not call this function */
2406 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true);
2407 } else {
2408 /* Successfully went to sleep mode for sleep wakeup */
2409 /* Now wake up the tag to complete the operation */
2410 NFC_DiscoverySelect(nfa_dm_cb.disc_cb.activated_rf_disc_id,
2411 nfa_dm_cb.disc_cb.activated_protocol,
2412 nfa_dm_cb.disc_cb.activated_rf_interface);
2413 }
2414 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302415 if (p_data->nfc_discover.deactivate.reason ==
2416 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2417 /* in case deactivation is not sucessfull, NFCC shall send
2418 RF_DEACTIVATE_NTF with DH Req failed due to error.
2419 MW shall send deactivation cmd again for 3 three times. if
2420 deactivation is not successfull 3 times also,
2421 then MW shall send deacivate cmd with deactivate type is
2422 discovery */
2423 if (nfa_dm_cb.deactivate_cmd_retry_count == 3) {
2424 if ((!old_sleep_wakeup_flag) ||
2425 (!nfa_dm_cb.disc_cb.deact_pending)) {
2426 nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
2427 }
2428 nfa_dm_cb.deactivate_cmd_retry_count = 0;
2429 } else {
2430 nfa_dm_cb.deactivate_cmd_retry_count++;
2431 nfa_dm_send_deactivate_cmd(p_data->nfc_discover.deactivate.type);
2432 }
2433 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302434 } else if (p_data->nfc_discover.deactivate.type ==
2435 NFC_DEACTIVATE_TYPE_IDLE) {
2436 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2437 nfa_dm_start_rf_discover();
2438 } else if (p_data->nfc_discover.deactivate.type ==
2439 NFC_DEACTIVATE_TYPE_DISCOVERY) {
2440 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2441 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
2442 /* stop discovery */
2443 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2444 }
2445 }
2446 break;
nxpandroidc7611652015-09-23 16:42:05 +05302447
2448 case NFA_DM_CORE_INTF_ERROR_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302449 sleep_wakeup_event = true;
2450 if ((!old_sleep_wakeup_flag) || (!nfa_dm_cb.disc_cb.deact_pending)) {
2451 nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
2452 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302453 break;
nxpandroidc7611652015-09-23 16:42:05 +05302454
2455 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302456 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302457 break;
2458 }
nxpandroidc7611652015-09-23 16:42:05 +05302459
nxpandroid8f6d0532017-07-12 18:25:30 +05302460 if (old_sleep_wakeup_flag && sleep_wakeup_event &&
2461 !sleep_wakeup_event_processed) {
2462 /* performing sleep wakeup and exception conditions happened
2463 * clear sleep wakeup information and report failure */
2464 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_FAILED);
2465 }
nxpandroidc7611652015-09-23 16:42:05 +05302466}
2467
2468/*******************************************************************************
2469**
2470** Function nfa_dm_disc_sm_listen_active
2471**
nxpandroid8f6d0532017-07-12 18:25:30 +05302472** Description Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE
2473** state
nxpandroidc7611652015-09-23 16:42:05 +05302474**
2475** Returns void
2476**
2477*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302478static void nfa_dm_disc_sm_listen_active(tNFA_DM_RF_DISC_SM_EVENT event,
2479 tNFA_DM_RF_DISC_DATA* p_data) {
2480 tNFC_DEACTIVATE_DEVT deact;
nxpandroidc7611652015-09-23 16:42:05 +05302481
nxpandroid8f6d0532017-07-12 18:25:30 +05302482 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302483 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302484 nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2485 break;
nxpandroidc7611652015-09-23 16:42:05 +05302486 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302487 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2488 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2489 /* it's race condition. received deactivate NTF before receiving RSP */
nxpandroidc7611652015-09-23 16:42:05 +05302490
nxpandroid8f6d0532017-07-12 18:25:30 +05302491 deact.status = NFC_STATUS_OK;
2492 deact.type = NFC_DEACTIVATE_TYPE_IDLE;
2493 deact.is_ntf = true;
nxf24591c1cbeab2018-02-21 17:32:26 +05302494 tNFC_DISCOVER nfc_discover;
2495 nfc_discover.deactivate = deact;
nxpandroid8f6d0532017-07-12 18:25:30 +05302496 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
nxf24591c1cbeab2018-02-21 17:32:26 +05302497 &nfc_discover);
nxpandroidc7611652015-09-23 16:42:05 +05302498
nxpandroid8f6d0532017-07-12 18:25:30 +05302499 /* NFCC is in IDLE state */
2500 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2501 nfa_dm_start_rf_discover();
2502 }
2503 break;
nxpandroidc7611652015-09-23 16:42:05 +05302504 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302505 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
nxpandroidc7611652015-09-23 16:42:05 +05302506
nxpandroid8f6d0532017-07-12 18:25:30 +05302507 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
nxpandroidc7611652015-09-23 16:42:05 +05302508
nxpandroid8f6d0532017-07-12 18:25:30 +05302509 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
2510 /* it's race condition. received deactivate NTF before receiving RSP */
2511 /* notify deactivation after receiving deactivate RSP */
nxf24591c1cbeab2018-02-21 17:32:26 +05302512 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2513 "Rx deactivate NTF while waiting for deactivate RSP");
nxpandroid8f6d0532017-07-12 18:25:30 +05302514 } else {
2515 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2516 &(p_data->nfc_discover));
2517
2518 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) {
2519 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2520 nfa_dm_start_rf_discover();
2521 } else if ((p_data->nfc_discover.deactivate.type ==
2522 NFC_DEACTIVATE_TYPE_SLEEP) ||
2523 (p_data->nfc_discover.deactivate.type ==
2524 NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
2525 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_SLEEP);
2526 } else if (p_data->nfc_discover.deactivate.type ==
2527 NFC_DEACTIVATE_TYPE_DISCOVERY) {
2528 /* Discovery */
nxf245911fec7142018-06-06 14:29:48 +05302529#if (NXP_EXTNS == TRUE)
2530 if(nfa_dm_cb.nfa_pending_power_state != SCREEN_STATE_INVALID) {
2531 NFC_SetPowerSubState(nfa_dm_cb.nfa_pending_power_state);
2532 nfa_dm_cb.nfa_pending_power_state = SCREEN_STATE_INVALID;
2533 }
2534#endif
nxpandroid8f6d0532017-07-12 18:25:30 +05302535 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2536 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
2537 /* stop discovery */
2538 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2539 }
nxpandroidc7611652015-09-23 16:42:05 +05302540 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302541 }
2542 break;
nxpandroidc7611652015-09-23 16:42:05 +05302543
2544 case NFA_DM_CORE_INTF_ERROR_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302545 break;
nxpandroidc7611652015-09-23 16:42:05 +05302546 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302547 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302548 break;
2549 }
nxpandroidc7611652015-09-23 16:42:05 +05302550}
2551
2552/*******************************************************************************
2553**
2554** Function nfa_dm_disc_sm_listen_sleep
2555**
nxpandroid8f6d0532017-07-12 18:25:30 +05302556** Description Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP
2557** state
nxpandroidc7611652015-09-23 16:42:05 +05302558**
2559** Returns void
2560**
2561*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302562static void nfa_dm_disc_sm_listen_sleep(tNFA_DM_RF_DISC_SM_EVENT event,
2563 tNFA_DM_RF_DISC_DATA* p_data) {
2564 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302565 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05302566 nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
nxpandroidc7611652015-09-23 16:42:05 +05302567
nxpandroid8f6d0532017-07-12 18:25:30 +05302568 /* if deactivate type is not discovery then NFCC will not sent
2569 * deactivation NTF */
2570 if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY) {
2571 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2572 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
2573 }
2574 break;
nxpandroidc7611652015-09-23 16:42:05 +05302575 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302576 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2577 /* if deactivate type in CMD was IDLE */
2578 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2579 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2580 &(p_data->nfc_discover));
nxpandroidc7611652015-09-23 16:42:05 +05302581
nxpandroid8f6d0532017-07-12 18:25:30 +05302582 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2583 nfa_dm_start_rf_discover();
2584 }
2585 break;
nxpandroidc7611652015-09-23 16:42:05 +05302586 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302587 /* clear both W4_RSP and W4_NTF because of race condition between
2588 * deactivat CMD and link loss */
2589 nfa_dm_cb.disc_cb.disc_flags &=
2590 ~(NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
2591 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
nxpandroidc7611652015-09-23 16:42:05 +05302592
nxpandroid8f6d0532017-07-12 18:25:30 +05302593 /* there is no active protocol in this state, so broadcast to all by using
2594 * NFA_DM_RF_DEACTIVATE_RSP */
2595 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2596 &(p_data->nfc_discover));
nxpandroidc7611652015-09-23 16:42:05 +05302597
nxpandroid8f6d0532017-07-12 18:25:30 +05302598 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) {
2599 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2600 nfa_dm_start_rf_discover();
2601 } else if (p_data->nfc_discover.deactivate.type ==
2602 NFA_DEACTIVATE_TYPE_DISCOVERY) {
2603 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2604 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05302605 LOG(ERROR) << StringPrintf("Unexpected deactivation type");
nxpandroid8f6d0532017-07-12 18:25:30 +05302606 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2607 nfa_dm_start_rf_discover();
2608 }
2609 break;
nxpandroidc7611652015-09-23 16:42:05 +05302610 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302611 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
2612 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2613 NFA_STATUS_FAILED) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302614 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05302615 "Not matched, restart discovery after receiving deactivate ntf");
nxpandroidc7611652015-09-23 16:42:05 +05302616
nxpandroid8f6d0532017-07-12 18:25:30 +05302617 /* after receiving deactivate event, restart discovery */
2618 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2619 }
2620 break;
nxpandroidc7611652015-09-23 16:42:05 +05302621 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302622 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302623 break;
2624 }
nxpandroidc7611652015-09-23 16:42:05 +05302625}
2626
2627/*******************************************************************************
2628**
2629** Function nfa_dm_disc_sm_lp_listen
2630**
2631** Description Processing discovery events in NFA_DM_RFST_LP_LISTEN state
2632**
2633** Returns void
2634**
2635*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302636static void nfa_dm_disc_sm_lp_listen(tNFA_DM_RF_DISC_SM_EVENT event,
2637 tNFA_DM_RF_DISC_DATA* p_data) {
2638 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302639 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302640 nfa_dm_disc_new_state(NFA_DM_RFST_LP_ACTIVE);
nxf24591c1cbeab2018-02-21 17:32:26 +05302641 nfa_dm_disc_notify_activation(&(p_data->nfc_discover));
nxpandroid8f6d0532017-07-12 18:25:30 +05302642 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2643 NFA_STATUS_FAILED) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302644 DLOG_IF(INFO, nfc_debug_enabled)
2645 << StringPrintf("Not matched, unexpected activation");
nxpandroid8f6d0532017-07-12 18:25:30 +05302646 }
2647 break;
nxpandroidc7611652015-09-23 16:42:05 +05302648
2649 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302650 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302651 break;
2652 }
nxpandroidc7611652015-09-23 16:42:05 +05302653}
2654
2655/*******************************************************************************
2656**
2657** Function nfa_dm_disc_sm_lp_active
2658**
2659** Description Processing discovery events in NFA_DM_RFST_LP_ACTIVE state
2660**
2661** Returns void
2662**
2663*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302664static void nfa_dm_disc_sm_lp_active(tNFA_DM_RF_DISC_SM_EVENT event,
2665 tNFA_DM_RF_DISC_DATA* p_data) {
2666 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05302667 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05302668 nfa_dm_disc_new_state(NFA_DM_RFST_LP_LISTEN);
2669 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2670 &(p_data->nfc_discover));
2671 break;
nxpandroidc7611652015-09-23 16:42:05 +05302672 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05302673 LOG(ERROR) << StringPrintf("Unexpected discovery event");
nxpandroid8f6d0532017-07-12 18:25:30 +05302674 break;
2675 }
nxpandroidc7611652015-09-23 16:42:05 +05302676}
2677
2678/*******************************************************************************
2679**
2680** Function nfa_dm_disc_sm_execute
2681**
2682** Description Processing discovery related events
2683**
2684** Returns void
2685**
2686*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302687void nfa_dm_disc_sm_execute(tNFA_DM_RF_DISC_SM_EVENT event,
2688 tNFA_DM_RF_DISC_DATA* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302689 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2690 "state: %s (%d), event: %s(%d) disc_flags: "
nxpandroid8f6d0532017-07-12 18:25:30 +05302691 "0x%x",
nxf24591c1cbeab2018-02-21 17:32:26 +05302692 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
2693 nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_event_2_str(event).c_str(),
2694 event, nfa_dm_cb.disc_cb.disc_flags);
nxpandroidc7611652015-09-23 16:42:05 +05302695
nxpandroid8f6d0532017-07-12 18:25:30 +05302696 switch (nfa_dm_cb.disc_cb.disc_state) {
nxpandroidc7611652015-09-23 16:42:05 +05302697 /* RF Discovery State - Idle */
2698 case NFA_DM_RFST_IDLE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302699 nfa_dm_disc_sm_idle(event, p_data);
2700 break;
nxpandroidc7611652015-09-23 16:42:05 +05302701
2702 /* RF Discovery State - Discovery */
2703 case NFA_DM_RFST_DISCOVERY:
nxpandroid8f6d0532017-07-12 18:25:30 +05302704 nfa_dm_disc_sm_discovery(event, p_data);
2705 break;
nxpandroidc7611652015-09-23 16:42:05 +05302706
2707 /*RF Discovery State - Wait for all discoveries */
2708 case NFA_DM_RFST_W4_ALL_DISCOVERIES:
nxpandroid8f6d0532017-07-12 18:25:30 +05302709 nfa_dm_disc_sm_w4_all_discoveries(event, p_data);
2710 break;
nxpandroidc7611652015-09-23 16:42:05 +05302711
2712 /* RF Discovery State - Wait for host selection */
2713 case NFA_DM_RFST_W4_HOST_SELECT:
nxpandroid8f6d0532017-07-12 18:25:30 +05302714 nfa_dm_disc_sm_w4_host_select(event, p_data);
2715 break;
nxpandroidc7611652015-09-23 16:42:05 +05302716
2717 /* RF Discovery State - Poll mode activated */
2718 case NFA_DM_RFST_POLL_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302719 nfa_dm_disc_sm_poll_active(event, p_data);
2720 break;
nxpandroidc7611652015-09-23 16:42:05 +05302721
2722 /* RF Discovery State - listen mode activated */
2723 case NFA_DM_RFST_LISTEN_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302724 nfa_dm_disc_sm_listen_active(event, p_data);
2725 break;
nxpandroidc7611652015-09-23 16:42:05 +05302726
2727 /* RF Discovery State - listen mode sleep */
2728 case NFA_DM_RFST_LISTEN_SLEEP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302729 nfa_dm_disc_sm_listen_sleep(event, p_data);
2730 break;
nxpandroidc7611652015-09-23 16:42:05 +05302731
2732 /* Listening in Low Power mode */
2733 case NFA_DM_RFST_LP_LISTEN:
nxpandroid8f6d0532017-07-12 18:25:30 +05302734 nfa_dm_disc_sm_lp_listen(event, p_data);
2735 break;
nxpandroidc7611652015-09-23 16:42:05 +05302736
2737 /* Activated in Low Power mode */
2738 case NFA_DM_RFST_LP_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302739 nfa_dm_disc_sm_lp_active(event, p_data);
2740 break;
2741 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302742 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2743 "new state: %s (%d), disc_flags: 0x%x",
2744 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
nxpandroid8f6d0532017-07-12 18:25:30 +05302745 nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
nxpandroidc7611652015-09-23 16:42:05 +05302746}
2747
2748/*******************************************************************************
2749**
2750** Function nfa_dm_add_rf_discover
2751**
2752** Description Add discovery configuration and callback function
2753**
2754** Returns valid handle if success
2755**
2756*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302757tNFA_HANDLE nfa_dm_add_rf_discover(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask,
2758 tNFA_DM_DISC_HOST_ID host_id,
2759 tNFA_DISCOVER_CBACK* p_disc_cback) {
2760 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +05302761
nxf24591c1cbeab2018-02-21 17:32:26 +05302762 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("disc_mask=0x%x", disc_mask);
nxpandroidc7611652015-09-23 16:42:05 +05302763
nxpandroid8f6d0532017-07-12 18:25:30 +05302764 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
2765 if (!nfa_dm_cb.disc_cb.entry[xx].in_use) {
nxpandroid8f6d0532017-07-12 18:25:30 +05302766 nfa_dm_cb.disc_cb.entry[xx].in_use = true;
2767 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask;
2768 nfa_dm_cb.disc_cb.entry[xx].host_id = host_id;
2769 nfa_dm_cb.disc_cb.entry[xx].p_disc_cback = p_disc_cback;
2770 nfa_dm_cb.disc_cb.entry[xx].disc_flags = NFA_DM_DISC_FLAGS_NOTIFY;
2771 return xx;
nxpandroidc7611652015-09-23 16:42:05 +05302772 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302773 }
nxpandroidc7611652015-09-23 16:42:05 +05302774
nxpandroid8f6d0532017-07-12 18:25:30 +05302775 return NFA_HANDLE_INVALID;
nxpandroidc7611652015-09-23 16:42:05 +05302776}
2777
2778/*******************************************************************************
2779**
2780** Function nfa_dm_start_excl_discovery
2781**
2782** Description Start exclusive RF discovery
2783**
2784** Returns void
2785**
2786*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302787void nfa_dm_start_excl_discovery(tNFA_TECHNOLOGY_MASK poll_tech_mask,
2788 tNFA_LISTEN_CFG* p_listen_cfg,
2789 tNFA_DISCOVER_CBACK* p_disc_cback) {
2790 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
nxpandroidc7611652015-09-23 16:42:05 +05302791
nxf24591c1cbeab2018-02-21 17:32:26 +05302792 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05302793
nxpandroid8f6d0532017-07-12 18:25:30 +05302794 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) {
2795 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
2796 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
2797 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
2798 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
2799 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
2800 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302801 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
2802 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE) {
2803 poll_disc_mask |= NFA_DM_DISC_MASK_PACM_NFC_DEP;
2804 }
2805 } else {
2806 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) {
2807 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
2808 }
2809 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) {
2810 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
2811 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302812 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302813
nxpandroid8f6d0532017-07-12 18:25:30 +05302814 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) {
2815 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
2816 }
2817 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) {
2818 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
2819 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
2820 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302821 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_V) {
2822 poll_disc_mask |= NFA_DM_DISC_MASK_P_T5T;
nxpandroid8f6d0532017-07-12 18:25:30 +05302823 }
2824 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) {
2825 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
2826 }
2827 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) {
2828 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
2829 }
nxpandroidc7611652015-09-23 16:42:05 +05302830
nxpandroid8f6d0532017-07-12 18:25:30 +05302831 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = true;
2832 nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask;
2833 nfa_dm_cb.disc_cb.excl_disc_entry.host_id = NFA_DM_DISC_HOST_ID_DH;
2834 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = p_disc_cback;
2835 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags = NFA_DM_DISC_FLAGS_NOTIFY;
nxpandroidc7611652015-09-23 16:42:05 +05302836
nxpandroid8f6d0532017-07-12 18:25:30 +05302837 memcpy(&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg,
2838 sizeof(tNFA_LISTEN_CFG));
nxpandroidc7611652015-09-23 16:42:05 +05302839
nxpandroid8f6d0532017-07-12 18:25:30 +05302840 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_CMD, NULL);
nxpandroidc7611652015-09-23 16:42:05 +05302841}
2842
2843/*******************************************************************************
2844**
2845** Function nfa_dm_stop_excl_discovery
2846**
2847** Description Stop exclusive RF discovery
2848**
2849** Returns void
2850**
2851*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302852void nfa_dm_stop_excl_discovery(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302853 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05302854
nxpandroid8f6d0532017-07-12 18:25:30 +05302855 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = false;
2856 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL;
nxpandroidc7611652015-09-23 16:42:05 +05302857}
2858
2859/*******************************************************************************
2860**
2861** Function nfa_dm_delete_rf_discover
2862**
2863** Description Remove discovery configuration and callback function
2864**
2865** Returns void
2866**
2867*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302868void nfa_dm_delete_rf_discover(tNFA_HANDLE handle) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302869 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle=0x%x", handle);
nxpandroidc7611652015-09-23 16:42:05 +05302870
nxpandroid8f6d0532017-07-12 18:25:30 +05302871 if (handle < NFA_DM_DISC_NUM_ENTRIES) {
2872 nfa_dm_cb.disc_cb.entry[handle].in_use = false;
2873 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05302874 LOG(ERROR) << StringPrintf("Invalid discovery handle");
nxpandroid8f6d0532017-07-12 18:25:30 +05302875 }
nxpandroidc7611652015-09-23 16:42:05 +05302876}
2877
2878/*******************************************************************************
2879**
2880** Function nfa_dm_rf_discover_select
2881**
2882** Description Select target, protocol and RF interface
2883**
2884** Returns void
2885**
2886*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302887void nfa_dm_rf_discover_select(uint8_t rf_disc_id, tNFA_NFC_PROTOCOL protocol,
2888 tNFA_INTF_TYPE rf_interface) {
2889 tNFA_DM_DISC_SELECT_PARAMS select_params;
2890 tNFA_CONN_EVT_DATA conn_evt;
nxpandroidc7611652015-09-23 16:42:05 +05302891
nxf24591c1cbeab2018-02-21 17:32:26 +05302892 DLOG_IF(INFO, nfc_debug_enabled)
2893 << StringPrintf("rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
2894 rf_disc_id, protocol, rf_interface);
nxpandroidc7611652015-09-23 16:42:05 +05302895
nxpandroid8f6d0532017-07-12 18:25:30 +05302896 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) {
2897 /* state is OK: notify the status when the response is received from NFCC */
2898 select_params.rf_disc_id = rf_disc_id;
2899 select_params.protocol = protocol;
2900 select_params.rf_interface = rf_interface;
nxpandroidc7611652015-09-23 16:42:05 +05302901
nxpandroid8f6d0532017-07-12 18:25:30 +05302902 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY;
nxf24591c1cbeab2018-02-21 17:32:26 +05302903 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2904 nfa_dm_rf_disc_data.select = select_params;
2905 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_SELECT_CMD, &nfa_dm_rf_disc_data);
nxpandroid8f6d0532017-07-12 18:25:30 +05302906 } else {
2907 /* Wrong state: notify failed status right away */
2908 conn_evt.status = NFA_STATUS_FAILED;
2909 nfa_dm_conn_cback_event_notify(NFA_SELECT_RESULT_EVT, &conn_evt);
2910 }
nxpandroidc7611652015-09-23 16:42:05 +05302911}
2912
2913/*******************************************************************************
2914**
2915** Function nfa_dm_rf_deactivate
2916**
2917** Description Deactivate NFC link
2918**
2919** Returns NFA_STATUS_OK if success
2920**
2921*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05302922tNFA_STATUS nfa_dm_rf_deactivate(tNFA_DEACTIVATE_TYPE deactivate_type) {
nxf24591c1cbeab2018-02-21 17:32:26 +05302923 DLOG_IF(INFO, nfc_debug_enabled)
2924 << StringPrintf("deactivate_type:0x%X", deactivate_type);
nxpandroidc7611652015-09-23 16:42:05 +05302925
nxpandroid8f6d0532017-07-12 18:25:30 +05302926 if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP) {
2927 if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
2928 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF;
nxpandroidc7611652015-09-23 16:42:05 +05302929 else
nxpandroid8f6d0532017-07-12 18:25:30 +05302930 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP;
2931 }
2932
2933 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) {
2934 return NFA_STATUS_FAILED;
2935 } else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) {
2936 if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY) {
2937 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
2938 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
2939 nfa_dm_disc_kovio_timeout_cback(&nfa_dm_cb.disc_cb.kovio_tle);
nxpandroidc7611652015-09-23 16:42:05 +05302940 return NFA_STATUS_OK;
nxpandroid8f6d0532017-07-12 18:25:30 +05302941 } else {
2942 /* it could be race condition. */
nxf24591c1cbeab2018-02-21 17:32:26 +05302943 DLOG_IF(INFO, nfc_debug_enabled)
2944 << StringPrintf("already in discovery state");
nxpandroid8f6d0532017-07-12 18:25:30 +05302945 return NFA_STATUS_FAILED;
2946 }
2947 } else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE) {
2948 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
2949 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
2950 nfa_dm_disc_kovio_timeout_cback(&nfa_dm_cb.disc_cb.kovio_tle);
2951 }
nxf24591c1cbeab2018-02-21 17:32:26 +05302952 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2953 nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
2954 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
nxpandroid8f6d0532017-07-12 18:25:30 +05302955 return NFA_STATUS_OK;
2956 } else {
2957 return NFA_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +05302958 }
nxpandroid8f6d0532017-07-12 18:25:30 +05302959 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05302960 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2961 nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
2962 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
nxpandroid8f6d0532017-07-12 18:25:30 +05302963 return NFA_STATUS_OK;
2964 }
nxpandroidc7611652015-09-23 16:42:05 +05302965}
2966
nxpandroidc7611652015-09-23 16:42:05 +05302967/*******************************************************************************
2968**
2969** Function nfa_dm_disc_state_2_str
2970**
2971** Description convert nfc discovery state to string
2972**
2973*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05302974static std::string nfa_dm_disc_state_2_str(uint8_t state) {
nxpandroid8f6d0532017-07-12 18:25:30 +05302975 switch (state) {
nxpandroidc7611652015-09-23 16:42:05 +05302976 case NFA_DM_RFST_IDLE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302977 return "IDLE";
nxpandroidc7611652015-09-23 16:42:05 +05302978
2979 case NFA_DM_RFST_DISCOVERY:
nxpandroid8f6d0532017-07-12 18:25:30 +05302980 return "DISCOVERY";
nxpandroidc7611652015-09-23 16:42:05 +05302981
2982 case NFA_DM_RFST_W4_ALL_DISCOVERIES:
nxpandroid8f6d0532017-07-12 18:25:30 +05302983 return "W4_ALL_DISCOVERIES";
nxpandroidc7611652015-09-23 16:42:05 +05302984
2985 case NFA_DM_RFST_W4_HOST_SELECT:
nxpandroid8f6d0532017-07-12 18:25:30 +05302986 return "W4_HOST_SELECT";
nxpandroidc7611652015-09-23 16:42:05 +05302987
2988 case NFA_DM_RFST_POLL_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302989 return "POLL_ACTIVE";
nxpandroidc7611652015-09-23 16:42:05 +05302990
2991 case NFA_DM_RFST_LISTEN_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05302992 return "LISTEN_ACTIVE";
nxpandroidc7611652015-09-23 16:42:05 +05302993
2994 case NFA_DM_RFST_LISTEN_SLEEP:
nxpandroid8f6d0532017-07-12 18:25:30 +05302995 return "LISTEN_SLEEP";
nxpandroidc7611652015-09-23 16:42:05 +05302996
2997 case NFA_DM_RFST_LP_LISTEN:
nxpandroid8f6d0532017-07-12 18:25:30 +05302998 return "LP_LISTEN";
nxpandroidc7611652015-09-23 16:42:05 +05302999
3000 case NFA_DM_RFST_LP_ACTIVE:
nxpandroid8f6d0532017-07-12 18:25:30 +05303001 return "LP_ACTIVE";
3002 }
3003 return "Unknown";
nxpandroidc7611652015-09-23 16:42:05 +05303004}
3005
3006/*******************************************************************************
3007**
3008** Function nfa_dm_disc_event_2_str
3009**
3010** Description convert nfc discovery RSP/NTF to string
3011**
3012*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05303013static std::string nfa_dm_disc_event_2_str(uint8_t event) {
nxpandroid8f6d0532017-07-12 18:25:30 +05303014 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05303015 case NFA_DM_RF_DISCOVER_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05303016 return "DISCOVER_CMD";
nxpandroidc7611652015-09-23 16:42:05 +05303017 case NFA_DM_RF_DISCOVER_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05303018 return "DISCOVER_RSP";
nxpandroidc7611652015-09-23 16:42:05 +05303019 case NFA_DM_RF_DISCOVER_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05303020 return "DISCOVER_NTF";
nxpandroidc7611652015-09-23 16:42:05 +05303021 case NFA_DM_RF_DISCOVER_SELECT_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05303022 return "SELECT_CMD";
nxpandroidc7611652015-09-23 16:42:05 +05303023 case NFA_DM_RF_DISCOVER_SELECT_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05303024 return "SELECT_RSP";
nxpandroidc7611652015-09-23 16:42:05 +05303025 case NFA_DM_RF_INTF_ACTIVATED_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05303026 return "ACTIVATED_NTF";
nxpandroidc7611652015-09-23 16:42:05 +05303027 case NFA_DM_RF_DEACTIVATE_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05303028 return "DEACTIVATE_CMD";
nxpandroidc7611652015-09-23 16:42:05 +05303029 case NFA_DM_RF_DEACTIVATE_RSP:
nxpandroid8f6d0532017-07-12 18:25:30 +05303030 return "DEACTIVATE_RSP";
nxpandroidc7611652015-09-23 16:42:05 +05303031 case NFA_DM_RF_DEACTIVATE_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05303032 return "DEACTIVATE_NTF";
nxpandroidc7611652015-09-23 16:42:05 +05303033 case NFA_DM_LP_LISTEN_CMD:
nxpandroid8f6d0532017-07-12 18:25:30 +05303034 return "NFA_DM_LP_LISTEN_CMD";
nxpandroidc7611652015-09-23 16:42:05 +05303035 case NFA_DM_CORE_INTF_ERROR_NTF:
nxpandroid8f6d0532017-07-12 18:25:30 +05303036 return "INTF_ERROR_NTF";
nxf24591c1cbeab2018-02-21 17:32:26 +05303037 default:
3038 return "Unknown";
nxpandroid8f6d0532017-07-12 18:25:30 +05303039 }
nxpandroidc7611652015-09-23 16:42:05 +05303040}
nxpandroidc7611652015-09-23 16:42:05 +05303041
nxpandroidc7611652015-09-23 16:42:05 +05303042/*******************************************************************************
3043**
3044** Function P2P_Prio_Logic
3045**
3046** Description Implements algorithm for NFC-DEP protocol priority over
3047** ISO-DEP protocol.
3048**
3049** Returns True if success
3050**
3051*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05303052bool nfa_dm_p2p_prio_logic(uint8_t event, uint8_t* p, uint8_t event_type) {
3053 if (!nfa_poll_bail_out_mode) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303054 DLOG_IF(INFO, nfc_debug_enabled)
3055 << StringPrintf("p2p priority is running under bail out mode ONLY.");
nxpandroid8f6d0532017-07-12 18:25:30 +05303056 return true;
3057 }
nxpandroidc7611652015-09-23 16:42:05 +05303058
nxpandroid8f6d0532017-07-12 18:25:30 +05303059 if ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) &&
3060 (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED)) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303061 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303062 "returning from nfa_dm_p2p_prio_logic Disable p2p_prio_logic");
3063 return true;
3064 }
nxf2459148793b62018-06-06 14:40:49 +05303065#if (NXP_EXTNS == TRUE)
3066 if (true == is_emvco_active) {
3067 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
3068 "returning from nfa_dm_p2p_prio_logic reconnect_in_progress");
3069 return true;
3070 }
3071#endif
nxf24591c1cbeab2018-02-21 17:32:26 +05303072 if (appl_dta_mode_flag == 0x01) {
nxpandroid8f6d0532017-07-12 18:25:30 +05303073 /*Disable the P2P Prio Logic when DTA is running*/
nxf24591c1cbeab2018-02-21 17:32:26 +05303074 return TRUE;
nxpandroid8f6d0532017-07-12 18:25:30 +05303075 }
nxpandroid8f6d0532017-07-12 18:25:30 +05303076 if (event == NCI_MSG_RF_DISCOVER &&
3077 p2p_prio_logic_data.timer_expired == true &&
3078 event_type == NFA_DM_P2P_PRIO_RSP) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303079 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303080 "nfa_dm_p2p_prio_logic starting a timer for next rf intf activated "
3081 "ntf");
3082 nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
3083 NFC_TTYPE_P2P_PRIO_LOGIC_CLEANUP,
3084 ((uint32_t)nfa_dm_act_get_rf_disc_duration() *
3085 QUICK_TIMER_TICKS_PER_SEC) /
3086 1000);
3087 return true;
3088 }
3089
3090 if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3091 p2p_prio_logic_data.timer_expired == true) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303092 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303093 "nfa_dm_p2p_prio_logic stopping a timer for next rf intf activated "
3094 "ntf");
3095 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
3096 }
3097
3098 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) {
3099 uint8_t rf_disc_id = 0xFF;
3100 uint8_t type = 0xFF;
3101 uint8_t protocol = 0xFF;
3102 uint8_t tech_mode = 0xFF;
3103
nxf24591c1cbeab2018-02-21 17:32:26 +05303104 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Prio_Logic");
nxpandroid8f6d0532017-07-12 18:25:30 +05303105
3106 if (event == NCI_MSG_RF_INTF_ACTIVATED) {
3107 rf_disc_id = *p++;
3108 type = *p++;
3109 protocol = *p++;
3110 tech_mode = *p++;
nxpandroidc7611652015-09-23 16:42:05 +05303111 }
nxf24591c1cbeab2018-02-21 17:32:26 +05303112 DLOG_IF(INFO, nfc_debug_enabled)
3113 << StringPrintf("nfa_dm_p2p_prio_logic event_type = 0x%x", event_type);
nxpandroid8f6d0532017-07-12 18:25:30 +05303114
nxf2459148793b62018-06-06 14:40:49 +05303115#if (NXP_EXTNS == TRUE)
3116 if (type == nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT || type == nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT) {
3117 DLOG_IF(INFO, nfc_debug_enabled)
3118 << StringPrintf("Disable the p2p prio logic RDR_SWP");
3119 return true;
3120 }
3121#endif
nxpandroid8f6d0532017-07-12 18:25:30 +05303122 if (event == NCI_MSG_RF_INTF_ACTIVATED && tech_mode >= 0x80) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303123 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303124 "nfa_dm_p2p_prio_logic listen mode activated reset all the "
3125 "nfa_dm_p2p_prio_logic variables ");
3126 nfa_dm_p2p_prio_logic_cleanup();
nxpandroidc7611652015-09-23 16:42:05 +05303127 }
nxpandroidcdd30442016-05-27 17:26:18 +05303128
nxpandroid8f6d0532017-07-12 18:25:30 +05303129 if ((tech_mode < 0x80) && event == NCI_MSG_RF_INTF_ACTIVATED &&
3130 protocol == NCI_PROTOCOL_ISO_DEP &&
3131 p2p_prio_logic_data.isodep_detected == false) {
3132 nfa_dm_p2p_prio_logic_cleanup();
3133 p2p_prio_logic_data.isodep_detected = true;
3134 p2p_prio_logic_data.first_tech_mode = tech_mode;
nxf24591c1cbeab2018-02-21 17:32:26 +05303135 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
3136 "ISO-DEP Detected First Time Resume the Polling Loop");
nxpandroid8f6d0532017-07-12 18:25:30 +05303137 nci_snd_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
nxpandroid8f6d0532017-07-12 18:25:30 +05303138 return false;
nxpandroidc7611652015-09-23 16:42:05 +05303139 }
3140
nxpandroid8f6d0532017-07-12 18:25:30 +05303141 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3142 protocol == NCI_PROTOCOL_ISO_DEP &&
3143 p2p_prio_logic_data.isodep_detected == true &&
3144 p2p_prio_logic_data.first_tech_mode != tech_mode) {
3145 p2p_prio_logic_data.isodep_detected = true;
3146 p2p_prio_logic_data.timer_expired = false;
nxf24591c1cbeab2018-02-21 17:32:26 +05303147 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303148 "ISO-DEP Detected Second Time Other Techmode Resume the Polling "
3149 "Loop");
3150 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
3151 nci_snd_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
nxpandroid8f6d0532017-07-12 18:25:30 +05303152 return false;
nxpandroidc7611652015-09-23 16:42:05 +05303153 }
3154
nxpandroid8f6d0532017-07-12 18:25:30 +05303155 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3156 protocol == NCI_PROTOCOL_ISO_DEP &&
3157 p2p_prio_logic_data.isodep_detected == true &&
3158 p2p_prio_logic_data.timer_expired == true) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303159 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303160 "ISO-DEP Detected TimerExpired, Final Notifying the Event");
3161 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
3162 nfa_dm_p2p_prio_logic_cleanup();
3163 }
3164
3165 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3166 protocol == NCI_PROTOCOL_ISO_DEP &&
3167 p2p_prio_logic_data.isodep_detected == true &&
3168 p2p_prio_logic_data.first_tech_mode == tech_mode) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303169 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303170 "ISO-DEP Detected Same Techmode, Final Notifying the Event");
3171 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
nxf24591c1cbeab2018-02-21 17:32:26 +05303172 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
nxpandroid8f6d0532017-07-12 18:25:30 +05303173 nfa_dm_p2p_prio_logic_cleanup();
3174 }
3175
3176 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3177 protocol != NCI_PROTOCOL_ISO_DEP &&
3178 p2p_prio_logic_data.isodep_detected == true) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303179 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
nxpandroid8f6d0532017-07-12 18:25:30 +05303180 "ISO-DEP Not Detected Giving Priority for other Technology");
3181 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
nxf24591c1cbeab2018-02-21 17:32:26 +05303182 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
nxpandroid8f6d0532017-07-12 18:25:30 +05303183 nfa_dm_p2p_prio_logic_cleanup();
3184 }
3185
3186 else if (event == NCI_MSG_RF_DEACTIVATE &&
3187 p2p_prio_logic_data.isodep_detected == true &&
3188 p2p_prio_logic_data.timer_expired == false &&
3189 event_type == NFA_DM_P2P_PRIO_RSP) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303190 DLOG_IF(INFO, nfc_debug_enabled)
3191 << StringPrintf("NFA_DM_RF_DEACTIVATE_RSP");
nxpandroid8f6d0532017-07-12 18:25:30 +05303192 return false;
3193 }
3194
3195 else if (event == NCI_MSG_RF_DEACTIVATE &&
3196 p2p_prio_logic_data.isodep_detected == true &&
3197 p2p_prio_logic_data.timer_expired == false &&
3198 event_type == NFA_DM_P2P_PRIO_NTF) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303199 DLOG_IF(INFO, nfc_debug_enabled)
3200 << StringPrintf("NFA_DM_RF_DEACTIVATE_NTF");
3201
nxpandroid8f6d0532017-07-12 18:25:30 +05303202 nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
3203 NFC_TTYPE_P2P_PRIO_RESPONSE,
3204 ((uint32_t)160 * QUICK_TIMER_TICKS_PER_SEC) / 1000);
3205
nxf24591c1cbeab2018-02-21 17:32:26 +05303206 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Start_Timer");
nxpandroid8f6d0532017-07-12 18:25:30 +05303207
3208 return false;
3209 }
3210 }
3211
nxf24591c1cbeab2018-02-21 17:32:26 +05303212 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("returning TRUE");
nxpandroid8f6d0532017-07-12 18:25:30 +05303213 return true;
nxpandroidc7611652015-09-23 16:42:05 +05303214}
nxf2459148793b62018-06-06 14:40:49 +05303215#if (NXP_EXTNS == TRUE)
3216void NFA_SetEmvCoState(bool flag) {
3217 is_emvco_active = flag;
3218 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("NFA_SetEmvCoState = 0x%x", is_emvco_active);
3219}
3220#endif
nxpandroidc7611652015-09-23 16:42:05 +05303221/*******************************************************************************
3222**
3223** Function p2p_prio_logic_timeout
3224**
3225** Description Callback function for p2p timer
3226**
3227** Returns void
3228**
3229*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05303230void nfa_dm_p2p_timer_event() {
nxf24591c1cbeab2018-02-21 17:32:26 +05303231 DLOG_IF(INFO, nfc_debug_enabled)
3232 << StringPrintf("P2P_Timer_timeout NFC-DEP Not Discovered!!");
nxpandroidc7611652015-09-23 16:42:05 +05303233
nxf24591c1cbeab2018-02-21 17:32:26 +05303234 p2p_prio_logic_data.timer_expired = true;
nxpandroidc7611652015-09-23 16:42:05 +05303235
nxf24591c1cbeab2018-02-21 17:32:26 +05303236 if (p2p_prio_logic_data.isodep_detected == true) {
3237 DLOG_IF(INFO, nfc_debug_enabled)
3238 << StringPrintf("Deactivate and Restart RF discovery");
nxpandroid8f6d0532017-07-12 18:25:30 +05303239 nci_snd_deactivate_cmd(NFC_DEACTIVATE_TYPE_IDLE);
3240 }
nxpandroidc7611652015-09-23 16:42:05 +05303241}
3242
3243/*******************************************************************************
3244**
3245** Function nfa_dm_p2p_prio_logic_cleanup
3246**
3247** Description Callback function for p2p prio logic cleanup timer
3248**
3249** Returns void
3250**
3251*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05303252void nfa_dm_p2p_prio_logic_cleanup() {
nxpandroid8f6d0532017-07-12 18:25:30 +05303253 memset(&p2p_prio_logic_data, 0x00, sizeof(nfa_dm_p2p_prio_logic_t));
nxpandroidc7611652015-09-23 16:42:05 +05303254}
nxpandroid6154b732016-01-14 20:39:23 +05303255
nxpandroid8f6d0532017-07-12 18:25:30 +05303256/*******************************************************************************
3257**
3258** Function nfa_dm_send_tag_deselect_cmd
3259**
3260** Description Send command to send tag in sleep state
3261**
3262** Returns void
3263**
nxf24591c1cbeab2018-02-21 17:32:26 +05303264*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05303265static void nfa_dm_send_tag_deselect_cmd(tNFA_NFC_PROTOCOL protocol) {
3266 NFC_HDR* p_msg;
3267 uint8_t* p;
3268
nxf24591c1cbeab2018-02-21 17:32:26 +05303269 DLOG_IF(INFO, nfc_debug_enabled)
3270 << StringPrintf("nfa_dm_send_tag_deselect_cmd");
nxpandroid8f6d0532017-07-12 18:25:30 +05303271 p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3272
3273 if (p_msg) {
nxf24591c1cbeab2018-02-21 17:32:26 +05303274 if (protocol == NFC_PROTOCOL_ISO_DEP) {
nxpandroid8f6d0532017-07-12 18:25:30 +05303275 /* send one byte of 0xc2 as as deselect command to Tag */
3276 p_msg->len = 1;
3277 p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3278 p = (uint8_t*)(p_msg + 1) + p_msg->offset;
nxf24591c1cbeab2018-02-21 17:32:26 +05303279 *p = NFA_RW_TAG_DESELECT_CMD;
3280 } else if (protocol == NFC_PROTOCOL_T2T) {
3281 p_msg->len = NFA_RW_TAG_SLP_REQ_LEN;
nxpandroid8f6d0532017-07-12 18:25:30 +05303282 p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3283 p = (uint8_t*)(p_msg + 1) + p_msg->offset;
nxf24591c1cbeab2018-02-21 17:32:26 +05303284 memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, NFA_RW_TAG_SLP_REQ,
3285 p_msg->len);
3286 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +05303287 GKI_freebuf(p_msg);
3288 return;
3289 }
nxpandroid8f6d0532017-07-12 18:25:30 +05303290 NFC_SendData(NFC_RF_CONN_ID, p_msg);
3291 }
nxpandroid6154b732016-01-14 20:39:23 +05303292}