blob: 62332cb538b9fe36130328b368ef91f50cd0024f [file] [log] [blame]
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001/******************************************************************************
2 *
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003 *
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/******************************************************************************
19 *
20 * This file contains the action functions for device manager discovery
21 * function.
22 *
23 ******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -070024#include <string>
Andre Eisenbach8a4edf62017-11-20 14:51:11 -080025
26#include <android-base/stringprintf.h>
27#include <base/logging.h>
28
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080029#include "nci_hmsgs.h"
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080030#include "nfa_api.h"
31#include "nfa_dm_int.h"
32#include "nfa_p2p_int.h"
Ruchi Kandoi9343bf42017-10-13 12:56:30 -070033
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080034#if (NFC_NFCEE_INCLUDED == TRUE)
35#include "nfa_ee_api.h"
36#include "nfa_ee_int.h"
37#endif
38#include "nfa_rw_int.h"
39
Jizhou Liao2ef08962015-06-08 16:11:04 -070040#include "nfc_int.h"
Andre Eisenbach8a4edf62017-11-20 14:51:11 -080041
42using android::base::StringPrintf;
43
44extern bool nfc_debug_enabled;
45
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080046/*
47** static functions
48*/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080049static uint8_t nfa_dm_get_rf_discover_config(
50 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
51 tNFC_DISCOVER_PARAMS disc_params[], uint8_t max_params);
52static tNFA_STATUS nfa_dm_set_rf_listen_mode_config(
53 tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask);
54static void nfa_dm_set_rf_listen_mode_raw_config(
55 tNFA_DM_DISC_TECH_PROTO_MASK* p_disc_mask);
56static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask(
57 tNFC_RF_TECH_N_MODE tech_n_mode, tNFC_PROTOCOL protocol);
58static void nfa_dm_notify_discovery(tNFA_DM_RF_DISC_DATA* p_data);
59static tNFA_STATUS nfa_dm_disc_notify_activation(tNFC_DISCOVER* p_data);
60static void nfa_dm_disc_notify_deactivation(tNFA_DM_RF_DISC_SM_EVENT sm_event,
61 tNFC_DISCOVER* p_data);
62static void nfa_dm_disc_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
63 tNFC_CONN* p_data);
64static void nfa_dm_disc_kovio_timeout_cback(TIMER_LIST_ENT* p_tle);
65static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080066
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -070067static std::string nfa_dm_disc_state_2_str(uint8_t state);
68static std::string nfa_dm_disc_event_2_str(uint8_t event);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080069
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080070typedef struct nfa_dm_p2p_prio_logic {
71 bool isodep_detected; /* flag to check if ISO-DEP is detected */
72 bool timer_expired; /* flag to check whether timer is expired */
73 TIMER_LIST_ENT timer_list; /*timer structure pointer */
74 uint8_t first_tech_mode;
75} nfa_dm_p2p_prio_logic_t;
Jizhou Liao2ef08962015-06-08 16:11:04 -070076
77static nfa_dm_p2p_prio_logic_t p2p_prio_logic_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080078
Love Khannacdb435d2017-04-04 18:02:51 +053079static void nfa_dm_send_tag_deselect_cmd(tNFA_NFC_PROTOCOL protocol);
80
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080081/*******************************************************************************
82**
83** Function nfa_dm_get_rf_discover_config
84**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -080085** Description Build RF discovery configurations from
86** tNFA_DM_DISC_TECH_PROTO_MASK
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080087**
88** Returns number of RF discovery configurations
89**
90*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080091static uint8_t nfa_dm_get_rf_discover_config(
92 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
93 tNFC_DISCOVER_PARAMS disc_params[], uint8_t max_params) {
94 uint8_t num_params = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080095
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080096 if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -070097 DLOG_IF(INFO, nfc_debug_enabled)
98 << StringPrintf("listen disabled, rm listen from 0x%x", dm_disc_mask);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080099 dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
100 }
101 if (nfa_dm_is_p2p_paused()) {
102 dm_disc_mask &= ~NFA_DM_DISC_MASK_NFC_DEP;
103 }
Evan Chu67aef6c2013-08-29 13:02:54 -0700104
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800105 /* Check polling A */
106 if (dm_disc_mask &
107 (NFA_DM_DISC_MASK_PA_T1T | NFA_DM_DISC_MASK_PA_T2T |
108 NFA_DM_DISC_MASK_PA_ISO_DEP | NFA_DM_DISC_MASK_PA_NFC_DEP |
109 NFA_DM_DISC_MASK_P_LEGACY)) {
110 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A;
111 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa;
112 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800113
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800114 if (num_params >= max_params) return num_params;
115 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800116
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800117 /* Check polling B */
118 if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP) {
119 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B;
120 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb;
121 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800122
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800123 if (num_params >= max_params) return num_params;
124 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800125
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800126 /* Check polling F */
127 if (dm_disc_mask & (NFA_DM_DISC_MASK_PF_T3T | NFA_DM_DISC_MASK_PF_NFC_DEP)) {
128 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F;
129 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf;
130 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800131
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800132 if (num_params >= max_params) return num_params;
133 }
Love Khanna78eae6d2017-04-04 16:23:47 +0530134 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
135 /* Check polling Active mode */
136 if (dm_disc_mask & NFA_DM_DISC_MASK_PACM_NFC_DEP) {
137 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_ACTIVE;
138 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pacm;
139 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800140
Love Khanna78eae6d2017-04-04 16:23:47 +0530141 if (num_params >= max_params) return num_params;
142 }
143 } else {
144 /* Check polling A Active mode */
145 if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP) {
146 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE;
147 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa;
148 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800149
Love Khanna78eae6d2017-04-04 16:23:47 +0530150 if (num_params >= max_params) return num_params;
151 }
152
153 /* Check polling F Active mode */
154 if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP) {
155 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE;
156 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa;
157 num_params++;
158
159 if (num_params >= max_params) return num_params;
160 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800161 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800162 /* Check listening A */
163 if (dm_disc_mask &
164 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
165 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP)) {
166 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A;
167 disc_params[num_params].frequency = 1;
168 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800169
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800170 if (num_params >= max_params) return num_params;
171 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800172
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800173 /* Check listening B */
174 if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
175 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B;
176 disc_params[num_params].frequency = 1;
177 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800178
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800179 if (num_params >= max_params) return num_params;
180 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800181
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800182 /* Check listening F */
183 if (dm_disc_mask & (NFA_DM_DISC_MASK_LF_T3T | NFA_DM_DISC_MASK_LF_NFC_DEP)) {
184 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F;
185 disc_params[num_params].frequency = 1;
186 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800187
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800188 if (num_params >= max_params) return num_params;
189 }
Love Khanna78eae6d2017-04-04 16:23:47 +0530190 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
191 /* Check polling Active mode */
192 if (dm_disc_mask & NFA_DM_DISC_MASK_LACM_NFC_DEP) {
193 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ACTIVE;
194 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pacm;
195 num_params++;
196 if (num_params >= max_params) return num_params;
197 }
198 } else {
199 /* Check listening A Active mode */
200 if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP) {
201 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE;
202 disc_params[num_params].frequency = 1;
203 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800204
Love Khanna78eae6d2017-04-04 16:23:47 +0530205 if (num_params >= max_params) return num_params;
206 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800207
Love Khanna78eae6d2017-04-04 16:23:47 +0530208 /* Check listening F Active mode */
209 if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP) {
210 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE;
211 disc_params[num_params].frequency = 1;
212 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800213
Love Khanna78eae6d2017-04-04 16:23:47 +0530214 if (num_params >= max_params) return num_params;
215 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800216 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800217
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800218 /* Check polling ISO 15693 */
Love Khanna57a3dfa2017-03-28 20:03:38 +0530219 if (dm_disc_mask & NFA_DM_DISC_MASK_P_T5T) {
220 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_V;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800221 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93;
222 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800223
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800224 if (num_params >= max_params) return num_params;
225 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800226
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800227 /* Check polling B' */
228 if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME) {
229 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B_PRIME;
230 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp;
231 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800232
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800233 if (num_params >= max_params) return num_params;
234 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800235
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800236 /* Check polling KOVIO */
237 if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO) {
238 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_KOVIO;
239 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk;
240 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800241
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800242 if (num_params >= max_params) return num_params;
243 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800244
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800245 /* Check listening ISO 15693 */
246 if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693) {
247 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ISO15693;
248 disc_params[num_params].frequency = 1;
249 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800250
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800251 if (num_params >= max_params) return num_params;
252 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800253
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800254 /* Check listening B' */
255 if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME) {
256 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME;
257 disc_params[num_params].frequency = 1;
258 num_params++;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800259
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800260 if (num_params >= max_params) return num_params;
261 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800262
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800263 return num_params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800264}
265
266/*******************************************************************************
267**
268** Function nfa_dm_set_rf_listen_mode_config
269**
270** Description Update listening protocol to NFCC
271**
272** Returns NFA_STATUS_OK if success
273**
274*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800275static tNFA_STATUS nfa_dm_set_rf_listen_mode_config(
276 tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask) {
277 uint8_t params[40], *p;
278 uint8_t platform = 0;
279 uint8_t sens_info = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800280
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700281 DLOG_IF(INFO, nfc_debug_enabled)
282 << StringPrintf("tech_proto_mask = 0x%08X", tech_proto_mask);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800283
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800284 /*
285 ** T1T listen LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C
286 ** T2T listen LA_PROT 0x00
287 ** T3T listen No bit for T3T in LF_PROT (CE T3T set listen parameters,
288 ** system code, NFCID2, etc.)
289 ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01
290 ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02
291 */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800292
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800293 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T) {
294 platform = NCI_PARAM_PLATFORM_T1T;
295 } else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T) {
296 /* platform = 0 and sens_info = 0 */
297 } else {
298 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) {
299 sens_info |= NCI_PARAM_SEL_INFO_ISODEP;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800300 }
301
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800302 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP) {
303 sens_info |= NCI_PARAM_SEL_INFO_NFCDEP;
304 }
305 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800306
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800307 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800308
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800309 /*
310 ** for Listen A
311 **
312 ** Set ATQA 0x0C00 for T1T listen
313 ** If the ATQA values are 0x0000, then the FW will use 0x0400
314 ** which works for ISODEP, T2T and NFCDEP.
315 */
316 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] ==
317 NFA_DM_DISC_HOST_ID_DH) {
318 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
319 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
320 UINT8_TO_STREAM(p, 0x04);
321 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
322 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
323 UINT8_TO_STREAM(p, platform);
324 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
325 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_SEL_INFO);
326 UINT8_TO_STREAM(p, sens_info);
327 } else /* Let NFCC use UICC configuration by configuring with length = 0 */
328 {
329 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
330 UINT8_TO_STREAM(p, 0);
331 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
332 UINT8_TO_STREAM(p, 0);
333 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
334 UINT8_TO_STREAM(p, 0);
335 UINT8_TO_STREAM(p, NFC_PMID_LA_NFCID1);
336 UINT8_TO_STREAM(p, 0);
337 UINT8_TO_STREAM(p, NFC_PMID_LA_HIST_BY);
338 UINT8_TO_STREAM(p, 0);
339 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800340
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800341 /* for Listen B */
342 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] ==
343 NFA_DM_DISC_HOST_ID_DH) {
344 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
345 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_SENSB_INFO);
346 if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
347 UINT8_TO_STREAM(p, NCI_LISTEN_PROTOCOL_ISO_DEP);
348 } else {
349 UINT8_TO_STREAM(p, 0x00);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800350 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800351 } else /* Let NFCC use UICC configuration by configuring with length = 0 */
352 {
353 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
354 UINT8_TO_STREAM(p, 0);
355 UINT8_TO_STREAM(p, NFC_PMID_LB_NFCID0);
356 UINT8_TO_STREAM(p, 0);
357 UINT8_TO_STREAM(p, NFC_PMID_LB_APPDATA);
358 UINT8_TO_STREAM(p, 0);
359 UINT8_TO_STREAM(p, NFC_PMID_LB_ADC_FO);
360 UINT8_TO_STREAM(p, 0);
361 UINT8_TO_STREAM(p, NFC_PMID_LB_H_INFO);
362 UINT8_TO_STREAM(p, 0);
363 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800364
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800365 /* for Listen F */
366 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing
367 * regardless of NFC-F tech routing */
368 UINT8_TO_STREAM(p, NFC_PMID_LF_PROTOCOL);
369 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_PROTOCOL);
370 if ((tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP) &&
371 !nfa_dm_is_p2p_paused()) {
372 UINT8_TO_STREAM(p, NCI_LISTEN_PROTOCOL_NFC_DEP);
373 } else {
374 UINT8_TO_STREAM(p, 0x00);
375 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800376
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800377 if (p > params) {
378 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
379 }
380
381 return NFA_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800382}
383
384/*******************************************************************************
385**
386** Function nfa_dm_set_total_duration
387**
388** Description Update total duration to NFCC
389**
390** Returns void
391**
392*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800393static void nfa_dm_set_total_duration(void) {
394 uint8_t params[10], *p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800395
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700396 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800397
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800398 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800399
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800400 /* for total duration */
401 UINT8_TO_STREAM(p, NFC_PMID_TOTAL_DURATION);
402 UINT8_TO_STREAM(p, NCI_PARAM_LEN_TOTAL_DURATION);
403 UINT16_TO_STREAM(p, nfa_dm_cb.disc_cb.disc_duration);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800404
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800405 if (p > params) {
406 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
407 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800408}
409
410/*******************************************************************************
411**
412** Function nfa_dm_set_rf_listen_mode_raw_config
413**
414** Description Set raw listen parameters
415**
416** Returns void
417**
418*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800419static void nfa_dm_set_rf_listen_mode_raw_config(
420 tNFA_DM_DISC_TECH_PROTO_MASK* p_disc_mask) {
421 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0;
422 tNFA_LISTEN_CFG* p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config;
423 uint8_t params[250], *p, xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800424
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700425 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800426
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800427 /*
428 ** Discovery Configuration Parameters for Listen A
429 */
430 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] ==
431 NFA_DM_DISC_HOST_ID_DH) &&
432 (p_cfg->la_enable)) {
433 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800434
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800435 UINT8_TO_STREAM(p, NFC_PMID_LA_BIT_FRAME_SDD);
436 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
437 UINT8_TO_STREAM(p, p_cfg->la_bit_frame_sdd);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800438
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800439 UINT8_TO_STREAM(p, NFC_PMID_LA_PLATFORM_CONFIG);
440 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
441 UINT8_TO_STREAM(p, p_cfg->la_platform_config);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800442
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800443 UINT8_TO_STREAM(p, NFC_PMID_LA_SEL_INFO);
444 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LA_SEL_INFO);
445 UINT8_TO_STREAM(p, p_cfg->la_sel_info);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800446
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800447 if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T) {
448 disc_mask |= NFA_DM_DISC_MASK_LA_T1T;
449 } else {
450 /* If T4T or NFCDEP */
451 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP) {
452 disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP;
453 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800454
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800455 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP) {
456 disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
457 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800458
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800459 /* If neither, T4T nor NFCDEP, then its T2T */
460 if (disc_mask == 0) {
461 disc_mask |= NFA_DM_DISC_MASK_LA_T2T;
462 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800463 }
464
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800465 UINT8_TO_STREAM(p, NFC_PMID_LA_NFCID1);
466 UINT8_TO_STREAM(p, p_cfg->la_nfcid1_len);
467 ARRAY_TO_STREAM(p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800468
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800469 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
470 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800471
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800472 /*
473 ** Discovery Configuration Parameters for Listen B
474 */
475 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] ==
476 NFA_DM_DISC_HOST_ID_DH) &&
477 (p_cfg->lb_enable)) {
478 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800479
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800480 UINT8_TO_STREAM(p, NFC_PMID_LB_SENSB_INFO);
481 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_SENSB_INFO);
482 UINT8_TO_STREAM(p, p_cfg->lb_sensb_info);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800483
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800484 UINT8_TO_STREAM(p, NFC_PMID_LB_NFCID0);
485 UINT8_TO_STREAM(p, p_cfg->lb_nfcid0_len);
486 ARRAY_TO_STREAM(p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800487
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800488 UINT8_TO_STREAM(p, NFC_PMID_LB_APPDATA);
489 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_APPDATA);
490 ARRAY_TO_STREAM(p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800491
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800492 UINT8_TO_STREAM(p, NFC_PMID_LB_SFGI);
493 UINT8_TO_STREAM(p, 1);
494 UINT8_TO_STREAM(p, p_cfg->lb_adc_fo);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800495
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800496 UINT8_TO_STREAM(p, NFC_PMID_LB_ADC_FO);
497 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LB_ADC_FO);
498 UINT8_TO_STREAM(p, p_cfg->lb_adc_fo);
499
500 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
501
502 if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP) {
503 disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
504 }
505 }
506
507 /*
508 ** Discovery Configuration Parameters for Listen F
509 */
510 if ((nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] ==
511 NFA_DM_DISC_HOST_ID_DH) &&
512 (p_cfg->lf_enable)) {
513 p = params;
514
515 UINT8_TO_STREAM(p, NFC_PMID_LF_CON_BITR_F);
516 UINT8_TO_STREAM(p, 1);
517 UINT8_TO_STREAM(p, p_cfg->lf_con_bitr_f);
518
519 UINT8_TO_STREAM(p, NFC_PMID_LF_PROTOCOL);
520 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_PROTOCOL);
521 UINT8_TO_STREAM(p, p_cfg->lf_protocol_type);
522
523 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_FLAGS2);
524 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_T3T_FLAGS2);
525 UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags);
526
527 /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be
528 * ignored */
529 for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++) {
530 if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000) {
531 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_ID1 + xx);
532 UINT8_TO_STREAM(p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
533 ARRAY_TO_STREAM(p, p_cfg->lf_t3t_identifier[xx],
534 NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
535 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800536 }
537
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800538 UINT8_TO_STREAM(p, NFC_PMID_LF_T3T_PMM);
539 UINT8_TO_STREAM(p, NCI_PARAM_LEN_LF_T3T_PMM);
540 ARRAY_TO_STREAM(p, p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800541
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800542 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800543
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800544 if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED) {
545 disc_mask |= NFA_DM_DISC_MASK_LF_T3T;
546 }
547 if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP) {
548 disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
549 }
550 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800551
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800552 /*
553 ** Discovery Configuration Parameters for Listen ISO-DEP
554 */
555 if ((disc_mask &
556 (NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LB_ISO_DEP)) &&
557 (p_cfg->li_enable)) {
558 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800559
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800560 UINT8_TO_STREAM(p, NFC_PMID_FWI);
561 UINT8_TO_STREAM(p, NCI_PARAM_LEN_FWI);
562 UINT8_TO_STREAM(p, p_cfg->li_fwi);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800563
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800564 if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) {
565 UINT8_TO_STREAM(p, NFC_PMID_LA_HIST_BY);
566 UINT8_TO_STREAM(p, p_cfg->la_hist_bytes_len);
567 ARRAY_TO_STREAM(p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800568 }
569
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800570 if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) {
571 UINT8_TO_STREAM(p, NFC_PMID_LB_H_INFO);
572 UINT8_TO_STREAM(p, p_cfg->lb_h_info_resp_len);
573 ARRAY_TO_STREAM(p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800574 }
575
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800576 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
577 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800578
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800579 /*
580 ** Discovery Configuration Parameters for Listen NFC-DEP
581 */
582 if ((disc_mask &
583 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LF_NFC_DEP)) &&
584 (p_cfg->ln_enable)) {
585 p = params;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800586
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800587 UINT8_TO_STREAM(p, NFC_PMID_WT);
588 UINT8_TO_STREAM(p, NCI_PARAM_LEN_WT);
589 UINT8_TO_STREAM(p, p_cfg->ln_wt);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800590
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800591 UINT8_TO_STREAM(p, NFC_PMID_ATR_RES_GEN_BYTES);
592 UINT8_TO_STREAM(p, p_cfg->ln_atr_res_gen_bytes_len);
593 ARRAY_TO_STREAM(p, p_cfg->ln_atr_res_gen_bytes,
594 p_cfg->ln_atr_res_gen_bytes_len);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800595
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800596 UINT8_TO_STREAM(p, NFC_PMID_ATR_RSP_CONFIG);
597 UINT8_TO_STREAM(p, 1);
598 UINT8_TO_STREAM(p, p_cfg->ln_atr_res_config);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800599
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800600 nfa_dm_check_set_config((uint8_t)(p - params), params, false);
601 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800602
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800603 *p_disc_mask = disc_mask;
604
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700605 DLOG_IF(INFO, nfc_debug_enabled)
606 << StringPrintf("disc_mask = 0x%x", disc_mask);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800607}
608
609/*******************************************************************************
610**
611** Function nfa_dm_disc_get_disc_mask
612**
613** Description Convert RF technology, mode and protocol to bit mask
614**
615** Returns tNFA_DM_DISC_TECH_PROTO_MASK
616**
617*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800618static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask(
619 tNFC_RF_TECH_N_MODE tech_n_mode, tNFC_PROTOCOL protocol) {
620 /* Set initial disc_mask to legacy poll or listen */
621 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask =
622 ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY
623 : NFA_DM_DISC_MASK_P_LEGACY);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800624
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800625 if (NFC_DISCOVERY_TYPE_POLL_A == tech_n_mode) {
626 switch (protocol) {
627 case NFC_PROTOCOL_T1T:
628 disc_mask = NFA_DM_DISC_MASK_PA_T1T;
629 break;
630 case NFC_PROTOCOL_T2T:
631 disc_mask = NFA_DM_DISC_MASK_PA_T2T;
632 break;
633 case NFC_PROTOCOL_ISO_DEP:
634 disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP;
635 break;
636 case NFC_PROTOCOL_NFC_DEP:
637 disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP;
638 break;
Jizhou Liaoacf1ec02015-06-30 10:25:41 -0700639 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800640 } else if (NFC_DISCOVERY_TYPE_POLL_B == tech_n_mode) {
641 if (protocol == NFC_PROTOCOL_ISO_DEP)
642 disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP;
643 } else if (NFC_DISCOVERY_TYPE_POLL_F == tech_n_mode) {
644 if (protocol == NFC_PROTOCOL_T3T)
645 disc_mask = NFA_DM_DISC_MASK_PF_T3T;
646 else if (protocol == NFC_PROTOCOL_NFC_DEP)
647 disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP;
Love Khanna57a3dfa2017-03-28 20:03:38 +0530648 } else if (NFC_DISCOVERY_TYPE_POLL_V == tech_n_mode) {
649 disc_mask = NFA_DM_DISC_MASK_P_T5T;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800650 } else if (NFC_DISCOVERY_TYPE_POLL_B_PRIME == tech_n_mode) {
651 disc_mask = NFA_DM_DISC_MASK_P_B_PRIME;
652 } else if (NFC_DISCOVERY_TYPE_POLL_KOVIO == tech_n_mode) {
653 disc_mask = NFA_DM_DISC_MASK_P_KOVIO;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800654 } else if (NFC_DISCOVERY_TYPE_LISTEN_A == tech_n_mode) {
655 switch (protocol) {
656 case NFC_PROTOCOL_T1T:
657 disc_mask = NFA_DM_DISC_MASK_LA_T1T;
658 break;
659 case NFC_PROTOCOL_T2T:
660 disc_mask = NFA_DM_DISC_MASK_LA_T2T;
661 break;
662 case NFC_PROTOCOL_ISO_DEP:
663 disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP;
664 break;
665 case NFC_PROTOCOL_NFC_DEP:
666 disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP;
667 break;
Jizhou Liaoacf1ec02015-06-30 10:25:41 -0700668 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800669 } else if (NFC_DISCOVERY_TYPE_LISTEN_B == tech_n_mode) {
670 if (protocol == NFC_PROTOCOL_ISO_DEP)
671 disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP;
672 } else if (NFC_DISCOVERY_TYPE_LISTEN_F == tech_n_mode) {
673 if (protocol == NFC_PROTOCOL_T3T)
674 disc_mask = NFA_DM_DISC_MASK_LF_T3T;
675 else if (protocol == NFC_PROTOCOL_NFC_DEP)
676 disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP;
677 } else if (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == tech_n_mode) {
678 disc_mask = NFA_DM_DISC_MASK_L_ISO15693;
679 } else if (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == tech_n_mode) {
680 disc_mask = NFA_DM_DISC_MASK_L_B_PRIME;
Love Khanna78eae6d2017-04-04 16:23:47 +0530681 }
682 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
683 if (NFC_DISCOVERY_TYPE_POLL_ACTIVE == tech_n_mode) {
684 disc_mask = NFA_DM_DISC_MASK_PACM_NFC_DEP;
685 } else if (NFC_DISCOVERY_TYPE_LISTEN_ACTIVE == tech_n_mode) {
686 disc_mask = NFA_DM_DISC_MASK_LACM_NFC_DEP;
687 }
688 } else {
689 if (NFC_DISCOVERY_TYPE_POLL_A_ACTIVE == tech_n_mode) {
690 disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP;
691 } else if (NFC_DISCOVERY_TYPE_POLL_F_ACTIVE == tech_n_mode) {
692 disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP;
693 } else if (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == tech_n_mode) {
694 disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP;
695 } else if (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == tech_n_mode) {
696 disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP;
697 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800698 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800699
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700700 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
701 "tech_n_mode:0x%X, protocol:0x%X, "
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800702 "disc_mask:0x%X",
703 tech_n_mode, protocol, disc_mask);
704 return (disc_mask);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800705}
706
707/*******************************************************************************
708**
709** Function nfa_dm_disc_discovery_cback
710**
711** Description Discovery callback event from NFC
712**
713** Returns void
714**
715*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800716static void nfa_dm_disc_discovery_cback(tNFC_DISCOVER_EVT event,
717 tNFC_DISCOVER* p_data) {
718 tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800719
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700720 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800721
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800722 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800723 case NFC_START_DEVT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800724 dm_disc_event = NFA_DM_RF_DISCOVER_RSP;
725 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800726 case NFC_RESULT_DEVT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800727 dm_disc_event = NFA_DM_RF_DISCOVER_NTF;
728 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800729 case NFC_SELECT_DEVT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800730 dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP;
731 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800732 case NFC_ACTIVATE_DEVT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800733 dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF;
734 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800735 case NFC_DEACTIVATE_DEVT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800736 if (p_data->deactivate.is_ntf) {
737 dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF;
738 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) ||
739 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) {
740 NFC_SetReassemblyFlag(true);
741 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_RAW_FRAME;
Evan Chua24be4f2013-11-13 15:30:16 -0500742 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800743 } else
744 dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP;
745 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800746 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700747 LOG(ERROR) << StringPrintf("Unexpected event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800748 return;
749 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800750
Myles Watson1361d522017-09-26 13:39:54 -0700751 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
752 nfa_dm_rf_disc_data.nfc_discover = *p_data;
753 nfa_dm_disc_sm_execute(dm_disc_event, &nfa_dm_rf_disc_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800754}
755
756/*******************************************************************************
757**
758** Function nfa_dm_disc_notify_started
759**
760** Description Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or
761** NFA_RF_DISCOVERY_STARTED_EVT, if needed
762**
763** Returns void
764**
765*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800766static void nfa_dm_disc_notify_started(tNFA_STATUS status) {
767 tNFA_CONN_EVT_DATA evt_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800768
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800769 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) {
770 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800771
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800772 evt_data.status = status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800773
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800774 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
775 nfa_dm_conn_cback_event_notify(NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT,
776 &evt_data);
777 else
778 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
779 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800780}
781
782/*******************************************************************************
783**
784** Function nfa_dm_disc_conn_event_notify
785**
786** Description Notify application of CONN_CBACK event, using appropriate
787** callback
788**
789** Returns nothing
790**
791*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800792void nfa_dm_disc_conn_event_notify(uint8_t event, tNFA_STATUS status) {
793 tNFA_CONN_EVT_DATA evt_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800794
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800795 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) {
796 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
797 evt_data.status = status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800798
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800799 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) {
800 /* Use exclusive RF mode callback */
801 if (nfa_dm_cb.p_excl_conn_cback)
802 (*nfa_dm_cb.p_excl_conn_cback)(event, &evt_data);
803 } else {
804 (*nfa_dm_cb.p_conn_cback)(event, &evt_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800805 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800806 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800807}
808
809/*******************************************************************************
810**
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700811** Function nfa_dm_disc_force_to_idle
812**
813** Description Force NFCC to idle state while waiting for deactivation NTF
814**
815** Returns tNFC_STATUS
816**
817*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800818static tNFC_STATUS nfa_dm_disc_force_to_idle(void) {
819 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700820
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700821 DLOG_IF(INFO, nfc_debug_enabled)
822 << StringPrintf("disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700823
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800824 /* do not execute more than one */
825 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) {
826 nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF);
827 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP);
828 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
829 status = NFC_Deactivate(NFC_DEACTIVATE_TYPE_IDLE);
830 }
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700831
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800832 return (status);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700833}
834
835/*******************************************************************************
836**
837** Function nfa_dm_disc_deact_ntf_timeout_cback
838**
839** Description Timeout while waiting for deactivation NTF
840**
841** Returns void
842**
843*******************************************************************************/
Ruchi Kandoi9ba6d242017-10-13 16:07:01 -0700844static void nfa_dm_disc_deact_ntf_timeout_cback(__attribute__((unused))
845 TIMER_LIST_ENT* p_tle) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700846 LOG(ERROR) << __func__;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700847
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800848 nfa_dm_disc_force_to_idle();
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700849}
850
851/*******************************************************************************
852**
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800853** Function nfa_dm_send_deactivate_cmd
854**
855** Description Send deactivate command to NFCC, if needed.
856**
857** Returns NFC_STATUS_OK - deactivate cmd is sent
858** NCI_STATUS_FAILED - no buffers
859** NFC_STATUS_SEMANTIC_ERROR - this function does not attempt
860** to send deactivate cmd
861**
862*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800863static tNFC_STATUS nfa_dm_send_deactivate_cmd(tNFC_DEACT_TYPE deactivate_type) {
864 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
865 tNFA_DM_DISC_FLAGS w4_flags =
866 nfa_dm_cb.disc_cb.disc_flags &
867 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800868
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800869 if (!w4_flags) {
870 /* if deactivate CMD was not sent to NFCC */
871 nfa_dm_cb.disc_cb.disc_flags |=
872 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800873
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800874 status = NFC_Deactivate(deactivate_type);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700875
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800876 if (!nfa_dm_cb.disc_cb.tle.in_use) {
877 nfa_dm_cb.disc_cb.tle.p_cback =
878 (TIMER_CBACK*)nfa_dm_disc_deact_ntf_timeout_cback;
879 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.tle, 0,
880 NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800881 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800882 } else {
883 if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP) {
884 status = NFC_STATUS_SEMANTIC_ERROR;
885 } else if (nfa_dm_cb.disc_cb.tle.in_use) {
886 status = NFC_STATUS_OK;
887 } else {
888 status = nfa_dm_disc_force_to_idle();
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800889 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800890 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800891
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800892 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800893}
894
895/*******************************************************************************
896**
897** Function nfa_dm_start_rf_discover
898**
899** Description Start RF discovery
900**
901** Returns void
902**
903*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800904void nfa_dm_start_rf_discover(void) {
905 tNFC_DISCOVER_PARAMS disc_params[NFA_DM_MAX_DISC_PARAMS];
906 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask;
907 uint8_t config_params[10], *p;
908 uint8_t num_params, xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800909
Ruchi Kandoi6767aec2017-09-26 09:46:26 -0700910 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800911 /* Make sure that RF discovery was enabled, or some app has exclusive control
912 */
913 if ((!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)) &&
914 (nfa_dm_cb.disc_cb.excl_disc_entry.in_use == false)) {
915 return;
916 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800917
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800918 /* get listen mode routing table for technology */
919 nfa_ee_get_tech_route(NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800920
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800921 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
922 nfa_dm_set_rf_listen_mode_raw_config(&dm_disc_mask);
923 dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask &
924 NFA_DM_DISC_MASK_POLL);
925 nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask;
926 } else {
927 /* Collect RF discovery request from sub-modules */
928 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
929 if (nfa_dm_cb.disc_cb.entry[xx].in_use) {
930 poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
931 NFA_DM_DISC_MASK_POLL);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800932
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800933 /* clear poll mode technolgies and protocols which are already used by
934 * others */
935 poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800936
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800937 listen_mask = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800938
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800939 /*
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800940 ** add listen mode technolgies and protocols if host ID is
941 ** matched to listen mode routing table
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800942 */
943
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800944 /* NFC-A */
945 if (nfa_dm_cb.disc_cb.entry[xx].host_id ==
946 nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]) {
947 listen_mask |=
948 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
949 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
Love Khanna78eae6d2017-04-04 16:23:47 +0530950 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
951 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
952 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
953 NFA_DM_DISC_MASK_LACM_NFC_DEP;
954 } else {
955 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
956 NFA_DM_DISC_MASK_LAA_NFC_DEP;
957 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800958 } else {
959 /* host can listen ISO-DEP based on AID routing */
960 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
961 NFA_DM_DISC_MASK_LA_ISO_DEP);
Love Khanna78eae6d2017-04-04 16:23:47 +0530962 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
963 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
964 NFA_DM_DISC_MASK_LACM_NFC_DEP);
965 } else {
966 /* host can listen NFC-DEP based on protocol routing */
967 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
968 NFA_DM_DISC_MASK_LA_NFC_DEP);
969 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
970 NFA_DM_DISC_MASK_LAA_NFC_DEP);
971 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800972 }
973
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800974 /* NFC-B */
975 /* multiple hosts can listen ISO-DEP based on AID routing */
976 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
977 NFA_DM_DISC_MASK_LB_ISO_DEP;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800978
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800979 /* NFC-F */
980 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing
981 * regardless of NFC-F tech routing */
982 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
Love Khanna78eae6d2017-04-04 16:23:47 +0530983 (NFA_DM_DISC_MASK_LF_T3T | NFA_DM_DISC_MASK_LF_NFC_DEP);
984 if (NFC_GetNCIVersion() != NCI_VERSION_2_0) {
985 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
986 NFA_DM_DISC_MASK_LFA_NFC_DEP;
987 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800988 /* NFC-B Prime */
989 if (nfa_dm_cb.disc_cb.entry[xx].host_id ==
990 nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]) {
991 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask &
992 NFA_DM_DISC_MASK_L_B_PRIME;
993 }
994
995 /*
996 ** clear listen mode technolgies and protocols which are already
997 ** used by others
998 */
999
1000 /* Check if other modules are listening T1T or T2T */
1001 if (dm_disc_mask &
1002 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T)) {
1003 listen_mask &=
1004 ~(NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T |
1005 NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
1006 }
1007
1008 /* T1T/T2T has priority on NFC-A */
1009 if ((dm_disc_mask &
1010 (NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP)) &&
1011 (listen_mask &
1012 (NFA_DM_DISC_MASK_LA_T1T | NFA_DM_DISC_MASK_LA_T2T))) {
1013 dm_disc_mask &=
1014 ~(NFA_DM_DISC_MASK_LA_ISO_DEP | NFA_DM_DISC_MASK_LA_NFC_DEP);
1015 }
1016
1017 /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based
1018 * on AID routing */
1019
1020 /* Check if other modules are listening NFC-DEP */
Love Khanna78eae6d2017-04-04 16:23:47 +05301021 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
1022 if (dm_disc_mask &
1023 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LACM_NFC_DEP)) {
1024 listen_mask &=
1025 ~(NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LACM_NFC_DEP);
1026 }
1027 } else {
1028 if (dm_disc_mask &
1029 (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP)) {
1030 listen_mask &=
1031 ~(NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP);
1032 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001033 }
1034
1035 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask =
1036 poll_mask | listen_mask;
1037
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001038 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001039 "nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x", xx,
1040 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask);
1041
1042 dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask;
1043 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001044 }
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001045
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001046 /* Let P2P set GEN bytes for LLCP to NFCC */
1047 if (dm_disc_mask & NFA_DM_DISC_MASK_NFC_DEP) {
1048 nfa_p2p_set_config(dm_disc_mask);
Evan Chu7c69b272013-05-14 12:48:36 -04001049 }
Hiroki Yamamoto972df272018-05-11 15:40:33 +09001050 if (NFC_GetNCIVersion() == NCI_VERSION_1_0) {
1051 if (dm_disc_mask &
1052 (NFA_DM_DISC_MASK_PF_NFC_DEP | NFA_DM_DISC_MASK_PF_T3T)) {
1053 /* According to the NFC Forum Activity spec, controllers must:
1054 * 1) Poll with RC=0 and SC=FFFF to find NFC-DEP targets
1055 * 2) Poll with RC=1 and SC=FFFF to find T3T targets
1056 * Many controllers don't do this yet, and seem to be activating
1057 * NFC-DEP by default.
1058 *
1059 * We can at least fix the scenario where we're not interested
1060 * in NFC-DEP, by setting RC=1 in that case. Otherwise, keep
1061 * the default of RC=0. */
1062 p = config_params;
1063 UINT8_TO_STREAM(p, NFC_PMID_PF_RC);
1064 UINT8_TO_STREAM(p, NCI_PARAM_LEN_PF_RC);
1065 if ((dm_disc_mask & NFA_DM_DISC_MASK_PF_NFC_DEP) &&
1066 !nfa_dm_is_p2p_paused()) {
1067 UINT8_TO_STREAM(p, 0x00); // RC=0
1068 } else {
1069 UINT8_TO_STREAM(p, 0x01); // RC=1
1070 }
1071 nfa_dm_check_set_config(p - config_params, config_params, false);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001072 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001073 }
1074 }
1075
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001076 DLOG_IF(INFO, nfc_debug_enabled)
1077 << StringPrintf("dm_disc_mask = 0x%x", dm_disc_mask);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001078
1079 /* Get Discovery Technology parameters */
1080 num_params = nfa_dm_get_rf_discover_config(dm_disc_mask, disc_params,
1081 NFA_DM_MAX_DISC_PARAMS);
1082
1083 if (num_params) {
1084 /*
1085 ** NFCC will abort programming personality slots if not available.
1086 ** NFCC programs the personality slots in the following order of RF
1087 ** technologies: NFC-A, NFC-B, NFC-BP, NFC-I93
1088 */
1089
1090 /* if this is not for exclusive control */
1091 if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1092 /* update listening protocols in each NFC technology */
1093 nfa_dm_set_rf_listen_mode_config(dm_disc_mask);
1094 }
1095
1096 /* Set polling duty cycle */
1097 nfa_dm_set_total_duration();
1098 nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask;
1099
1100 NFC_DiscoveryStart(num_params, disc_params, nfa_dm_disc_discovery_cback);
1101 /* set flag about waiting for response in IDLE state */
1102 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1103
1104 /* register callback to get interface error NTF */
1105 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
1106 } else {
1107 /* RF discovery is started but there is no valid technology or protocol to
1108 * discover */
1109 nfa_dm_disc_notify_started(NFA_STATUS_OK);
1110 }
1111
1112 /* if Kovio presence check timer is running, timeout callback will reset the
1113 * activation information */
1114 if ((nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO) ||
1115 (!nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1116 /* reset protocol and hanlde of activated sub-module */
1117 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1118 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1119 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001120}
1121
1122/*******************************************************************************
1123**
1124** Function nfa_dm_notify_discovery
1125**
1126** Description Send RF discovery notification to upper layer
1127**
1128** Returns void
1129**
1130*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001131static void nfa_dm_notify_discovery(tNFA_DM_RF_DISC_DATA* p_data) {
1132 tNFA_CONN_EVT_DATA conn_evt;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001133
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001134 /* let application select a device */
1135 conn_evt.disc_result.status = NFA_STATUS_OK;
1136 memcpy(&(conn_evt.disc_result.discovery_ntf), &(p_data->nfc_discover.result),
1137 sizeof(tNFC_RESULT_DEVT));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001138
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001139 nfa_dm_conn_cback_event_notify(NFA_DISC_RESULT_EVT, &conn_evt);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001140}
1141
Evan Chu7c69b272013-05-14 12:48:36 -04001142/*******************************************************************************
1143**
1144** Function nfa_dm_disc_handle_kovio_activation
1145**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001146** Description Handle Kovio activation; whether it's new or repeated
1147** activation
Evan Chu7c69b272013-05-14 12:48:36 -04001148**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001149** Returns TRUE if repeated activation. No need to notify activated
1150** event to upper layer
Evan Chu7c69b272013-05-14 12:48:36 -04001151**
1152*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001153bool nfa_dm_disc_handle_kovio_activation(tNFC_DISCOVER* p_data,
1154 tNFA_DISCOVER_CBACK* p_disc_cback) {
1155 tNFC_DISCOVER disc_data;
Evan Chu7c69b272013-05-14 12:48:36 -04001156
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001157 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
1158 /* if this is new Kovio bar code tag */
1159 if ((nfa_dm_cb.activated_nfcid_len !=
1160 p_data->activate.rf_tech_param.param.pk.uid_len) ||
1161 (memcmp(p_data->activate.rf_tech_param.param.pk.uid,
1162 nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len))) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001163 DLOG_IF(INFO, nfc_debug_enabled)
1164 << StringPrintf("new Kovio tag is detected");
Evan Chu7c69b272013-05-14 12:48:36 -04001165
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001166 /* notify presence check failure for previous tag, if presence check is
1167 * pending */
1168 nfa_dm_disc_report_kovio_presence_check(NFA_STATUS_FAILED);
Evan Chu7c69b272013-05-14 12:48:36 -04001169
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001170 /* notify deactivation of previous activation before notifying new
1171 * activation */
1172 if (p_disc_cback) {
1173 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1174 (*(p_disc_cback))(NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1175 }
Evan Chu7c69b272013-05-14 12:48:36 -04001176
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001177 /* restart timer */
1178 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1179 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1180 } else {
1181 /* notify presence check ok, if presence check is pending */
1182 nfa_dm_disc_report_kovio_presence_check(NFC_STATUS_OK);
Evan Chu7c69b272013-05-14 12:48:36 -04001183
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001184 /* restart timer and do not notify upper layer */
1185 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1186 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1187 return true;
Evan Chu7c69b272013-05-14 12:48:36 -04001188 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001189 } else {
1190 /* this is the first activation, so start timer and notify upper layer */
1191 nfa_dm_cb.disc_cb.kovio_tle.p_cback =
1192 (TIMER_CBACK*)nfa_dm_disc_kovio_timeout_cback;
1193 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1194 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1195 }
Evan Chu7c69b272013-05-14 12:48:36 -04001196
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001197 return false;
Evan Chu7c69b272013-05-14 12:48:36 -04001198}
1199
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001200/*******************************************************************************
1201**
1202** Function nfa_dm_disc_notify_activation
1203**
1204** Description Send RF activation notification to sub-module
1205**
1206** Returns NFA_STATUS_OK if success
1207**
1208*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001209static tNFA_STATUS nfa_dm_disc_notify_activation(tNFC_DISCOVER* p_data) {
1210 uint8_t xx, host_id_in_LRT;
1211 uint8_t iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001212
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001213 tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode;
1214 tNFC_PROTOCOL protocol = p_data->activate.protocol;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001215
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001216 tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001217
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001218 DLOG_IF(INFO, nfc_debug_enabled)
1219 << StringPrintf("tech_n_mode:0x%X, proto:0x%X", tech_n_mode, protocol);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001220
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001221 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1222 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode;
1223 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1224 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1225 nfa_dm_cb.disc_cb.activated_protocol = protocol;
1226 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001227
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001228 if (protocol == NFC_PROTOCOL_KOVIO) {
1229 /* check whether it's new or repeated activation */
1230 if (nfa_dm_disc_handle_kovio_activation(
1231 p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) {
1232 /* do not notify activation of Kovio to upper layer */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001233 return (NFA_STATUS_OK);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001234 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001235 }
1236
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001237 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1238 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1239 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001240
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001241 return (NFA_STATUS_OK);
1242 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001243
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001244 /* if this is NFCEE direct RF interface, notify activation to whoever
1245 * listening UICC */
1246 if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) {
1247 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1248 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1249 (nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH)) {
1250 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1251 nfa_dm_cb.disc_cb.activated_rf_interface =
1252 p_data->activate.intf_param.type;
1253 nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_UNKNOWN;
1254 nfa_dm_cb.disc_cb.activated_handle = xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001255
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001256 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1257 "activated_rf_interface:0x%x, activated_handle: 0x%x",
1258 nfa_dm_cb.disc_cb.activated_rf_interface,
1259 nfa_dm_cb.disc_cb.activated_handle);
Evan Chu7c69b272013-05-14 12:48:36 -04001260
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001261 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001262 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1263 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001264
1265 return (NFA_STATUS_OK);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001266 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001267 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001268 return (NFA_STATUS_FAILED);
1269 }
1270
1271 /* get bit mask of technolgies/mode and protocol */
1272 activated_disc_mask = nfa_dm_disc_get_disc_mask(tech_n_mode, protocol);
1273
1274 /* get host ID of technology from listen mode routing table */
1275 if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) {
1276 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A];
1277 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) {
1278 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B];
1279 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) {
1280 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F];
1281 } else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) {
1282 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP];
1283 } else /* DH only */
1284 {
1285 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1286 }
1287
1288 if (protocol == NFC_PROTOCOL_NFC_DEP) {
1289 /* Force NFC-DEP to the host */
1290 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1291 }
1292
1293 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1294 /* if any matching NFC technology and protocol */
1295 if (nfa_dm_cb.disc_cb.entry[xx].in_use) {
1296 if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT) {
1297 if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1298 activated_disc_mask)
1299 break;
1300 } else {
1301 /* check ISO-DEP listening even if host in LRT is not matched */
1302 if (protocol == NFC_PROTOCOL_ISO_DEP) {
1303 if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) &&
1304 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1305 NFA_DM_DISC_MASK_LA_ISO_DEP)) {
1306 iso_dep_t3t__listen = xx;
1307 } else if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) &&
1308 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1309 NFA_DM_DISC_MASK_LB_ISO_DEP)) {
1310 iso_dep_t3t__listen = xx;
1311 }
1312 }
1313 /* check T3T listening even if host in LRT is not matched */
1314 else if (protocol == NFC_PROTOCOL_T3T) {
1315 if ((tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) &&
1316 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1317 NFA_DM_DISC_MASK_LF_T3T)) {
1318 iso_dep_t3t__listen = xx;
1319 }
1320 }
1321 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001322 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001323 }
1324
1325 if (xx >= NFA_DM_DISC_NUM_ENTRIES) {
1326 /* if any ISO-DEP or T3T listening even if host in LRT is not matched */
1327 xx = iso_dep_t3t__listen;
1328 }
Love Khannad7852c92017-06-02 19:55:05 +05301329 if (protocol == NFC_PROTOCOL_NFC_DEP &&
1330 (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE ||
1331 tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE ||
1332 tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)) {
1333 if (appl_dta_mode_flag == 1 && tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001334 DLOG_IF(INFO, nfc_debug_enabled)
1335 << StringPrintf("DTA Mode Enabled : NFC-A Passive Listen Mode");
Love Khannad7852c92017-06-02 19:55:05 +05301336 }
1337 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001338
1339 if (xx < NFA_DM_DISC_NUM_ENTRIES) {
1340 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode;
1341 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id;
1342 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1343 nfa_dm_cb.disc_cb.activated_protocol = protocol;
1344 nfa_dm_cb.disc_cb.activated_handle = xx;
1345
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001346 DLOG_IF(INFO, nfc_debug_enabled)
1347 << StringPrintf("activated_protocol:0x%x, activated_handle: 0x%x",
1348 nfa_dm_cb.disc_cb.activated_protocol,
1349 nfa_dm_cb.disc_cb.activated_handle);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001350
1351 if (protocol == NFC_PROTOCOL_KOVIO) {
1352 /* check whether it's new or repeated activation */
1353 if (nfa_dm_disc_handle_kovio_activation(
1354 p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) {
1355 /* do not notify activation of Kovio to upper layer */
1356 return (NFA_STATUS_OK);
1357 }
1358 }
1359
1360 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1361 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1362 NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1363
1364 return (NFA_STATUS_OK);
1365 } else {
1366 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1367 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1368 return (NFA_STATUS_FAILED);
1369 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001370}
1371
1372/*******************************************************************************
1373**
1374** Function nfa_dm_disc_notify_deactivation
1375**
1376** Description Send deactivation notification to sub-module
1377**
1378** Returns None
1379**
1380*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001381static void nfa_dm_disc_notify_deactivation(tNFA_DM_RF_DISC_SM_EVENT sm_event,
1382 tNFC_DISCOVER* p_data) {
1383 tNFA_HANDLE xx;
1384 tNFA_CONN_EVT_DATA evt_data;
1385 tNFC_DISCOVER disc_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001386
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001387 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1388 "activated_handle=%d", nfa_dm_cb.disc_cb.activated_handle);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001389
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001390 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001391 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("for sleep wakeup");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001392 return;
1393 }
1394
1395 if (sm_event == NFA_DM_RF_DEACTIVATE_RSP) {
1396 /*
1397 ** Activation has been aborted by upper layer in
1398 ** NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT
1399 ** Deactivation by upper layer or RF link loss in
1400 ** NFA_DM_RFST_LISTEN_SLEEP
1401 ** No sub-module is activated at this state.
1402 */
1403
1404 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP) {
1405 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1406 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1407 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1408 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1409 NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1410 }
1411 } else {
1412 /* let each sub-module handle deactivation */
1413 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1414 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1415 (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask &
1416 NFA_DM_DISC_MASK_LISTEN)) {
1417 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1418 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1419 NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1420 }
1421 }
1422 }
1423 } else if ((!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)) ||
1424 (nfa_dm_cb.disc_cb.deact_notify_pending)) {
1425 xx = nfa_dm_cb.disc_cb.activated_handle;
1426
1427 /* notify event to activated module if failed while reactivation */
1428 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1429 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1430 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1431 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1432 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1433 }
1434 } else if ((xx < NFA_DM_DISC_NUM_ENTRIES) &&
1435 (nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1436 (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) {
1437 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1438 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1439 } else {
1440 /* notify deactivation to application if there is no activated module */
1441 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1442 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
1443 }
1444 }
1445 } else {
1446 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) {
1447 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
1448 /* restart timer and do not notify upper layer */
1449 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1450 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001451 return;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001452 }
1453 /* Otherwise, upper layer initiated deactivation. */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001454 }
1455
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001456 /* notify event to activated module */
1457 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1458 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) {
1459 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1460 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
1461 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1462 }
1463 } else {
1464 xx = nfa_dm_cb.disc_cb.activated_handle;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001465
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001466 if ((xx < NFA_DM_DISC_NUM_ENTRIES) &&
1467 (nfa_dm_cb.disc_cb.entry[xx].in_use)) {
1468 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1469 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
1470 NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1471 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001472 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001473 }
Evan Chu7c69b272013-05-14 12:48:36 -04001474
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001475 /* clear activated information */
1476 nfa_dm_cb.disc_cb.activated_tech_mode = 0;
1477 nfa_dm_cb.disc_cb.activated_rf_disc_id = 0;
1478 nfa_dm_cb.disc_cb.activated_rf_interface = 0;
1479 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1480 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID;
1481 nfa_dm_cb.disc_cb.deact_notify_pending = false;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001482}
1483
1484/*******************************************************************************
1485**
Evan Chuc95c79c2013-04-12 17:38:09 -04001486** Function nfa_dm_disc_sleep_wakeup
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001487**
Evan Chuc95c79c2013-04-12 17:38:09 -04001488** Description Put tag to sleep, then wake it up. Can be used Perform
1489** legacy presence check or to wake up tag that went to HALT
1490** state
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001491**
1492** Returns TRUE if operation started
1493**
1494*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001495tNFC_STATUS nfa_dm_disc_sleep_wakeup(void) {
1496 tNFC_STATUS status = NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001497
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001498 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1499 /* Deactivate to sleep mode */
1500 status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP);
1501 if (status == NFC_STATUS_OK) {
1502 /* deactivate to sleep is sent on behalf of sleep wakeup.
1503 * set the sleep wakeup information in control block */
1504 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1505 nfa_dm_cb.disc_cb.deact_pending = false;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001506 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001507 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001508
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001509 return (status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001510}
1511
1512/*******************************************************************************
1513**
Evan Chua24be4f2013-11-13 15:30:16 -05001514** Function nfa_dm_is_raw_frame_session
1515**
1516** Description If NFA_SendRawFrame is called since RF activation,
1517** this function returns TRUE.
1518**
1519** Returns TRUE if NFA_SendRawFrame is called
1520**
1521*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001522bool nfa_dm_is_raw_frame_session(void) {
1523 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_RAW_FRAME) ? true : false);
Evan Chua24be4f2013-11-13 15:30:16 -05001524}
1525
1526/*******************************************************************************
1527**
Evan Chu67aef6c2013-08-29 13:02:54 -07001528** Function nfa_dm_is_p2p_paused
1529**
1530** Description If NFA_PauseP2p is called sand still effective,
1531** this function returns TRUE.
1532**
1533** Returns TRUE if NFA_SendRawFrame is called
1534**
1535*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001536bool nfa_dm_is_p2p_paused(void) {
1537 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? true : false);
Evan Chu67aef6c2013-08-29 13:02:54 -07001538}
1539
1540/*******************************************************************************
1541**
Evan Chuc95c79c2013-04-12 17:38:09 -04001542** Function nfa_dm_disc_end_sleep_wakeup
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001543**
Evan Chuc95c79c2013-04-12 17:38:09 -04001544** Description Sleep Wakeup is complete
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001545**
Evan Chuc95c79c2013-04-12 17:38:09 -04001546** Returns None
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001547**
1548*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001549static void nfa_dm_disc_end_sleep_wakeup(tNFC_STATUS status) {
1550 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) &&
1551 (nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1552 /* ignore it while doing Kovio presence check */
1553 return;
1554 }
1555
1556 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
1557 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
1558
1559 /* notify RW module that sleep wakeup is finished */
1560 nfa_rw_handle_sleep_wakeup_rsp(status);
1561
1562 if (nfa_dm_cb.disc_cb.deact_pending) {
1563 nfa_dm_cb.disc_cb.deact_pending = false;
1564 /* Perform pending deactivate command and on response notfiy deactivation
1565 */
1566 nfa_dm_cb.disc_cb.deact_notify_pending = true;
Myles Watson1361d522017-09-26 13:39:54 -07001567 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
1568 nfa_dm_rf_disc_data.deactivate_type =
1569 nfa_dm_cb.disc_cb.pending_deact_type;
1570 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
Evan Chu7c69b272013-05-14 12:48:36 -04001571 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001572 }
Evan Chu7c69b272013-05-14 12:48:36 -04001573}
1574
1575/*******************************************************************************
1576**
1577** Function nfa_dm_disc_kovio_timeout_cback
1578**
1579** Description Timeout for Kovio bar code tag presence check
1580**
1581** Returns void
1582**
1583*******************************************************************************/
Ruchi Kandoi9ba6d242017-10-13 16:07:01 -07001584static void nfa_dm_disc_kovio_timeout_cback(__attribute__((unused))
1585 TIMER_LIST_ENT* p_tle) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001586 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
Evan Chu7c69b272013-05-14 12:48:36 -04001587
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001588 /* notify presence check failure, if presence check is pending */
1589 nfa_dm_disc_report_kovio_presence_check(NFC_STATUS_FAILED);
Evan Chu7c69b272013-05-14 12:48:36 -04001590
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001591 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1592 /* restart timer in case that upper layer's presence check interval is too
1593 * long */
1594 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1595 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1596 } else {
1597 /* notify upper layer deactivated event */
Myles Watson1361d522017-09-26 13:39:54 -07001598 tNFC_DEACTIVATE_DEVT deact;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001599 deact.status = NFC_STATUS_OK;
1600 deact.type = NFC_DEACTIVATE_TYPE_DISCOVERY;
1601 deact.is_ntf = true;
Myles Watson1361d522017-09-26 13:39:54 -07001602 tNFC_DISCOVER nfc_discover;
1603 nfc_discover.deactivate = deact;
1604 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF, &nfc_discover);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001605 }
Evan Chu7c69b272013-05-14 12:48:36 -04001606}
1607
1608/*******************************************************************************
1609**
1610** Function nfa_dm_disc_start_kovio_presence_check
1611**
1612** Description Deactivate to discovery mode and wait for activation
1613**
1614** Returns TRUE if operation started
1615**
1616*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001617tNFC_STATUS nfa_dm_disc_start_kovio_presence_check(void) {
1618 tNFC_STATUS status = NFC_STATUS_FAILED;
Evan Chu7c69b272013-05-14 12:48:36 -04001619
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001620 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
Evan Chu7c69b272013-05-14 12:48:36 -04001621
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001622 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) &&
1623 (nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
1624 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1625 /* restart timer */
1626 nfa_sys_start_timer(&nfa_dm_cb.disc_cb.kovio_tle, 0,
1627 NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
Evan Chu7c69b272013-05-14 12:48:36 -04001628
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001629 /* Deactivate to discovery mode */
1630 status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_DISCOVERY);
Evan Chu7c69b272013-05-14 12:48:36 -04001631
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001632 if (status == NFC_STATUS_OK) {
1633 /* deactivate to sleep is sent on behalf of sleep wakeup.
1634 * set the sleep wakeup information in control block */
1635 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1636 nfa_dm_cb.disc_cb.deact_pending = false;
1637 }
1638 } else {
1639 /* wait for next activation */
1640 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING;
1641 nfa_dm_cb.disc_cb.deact_pending = false;
1642 status = NFC_STATUS_OK;
Evan Chu7c69b272013-05-14 12:48:36 -04001643 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001644 }
Evan Chu7c69b272013-05-14 12:48:36 -04001645
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001646 return (status);
Evan Chu7c69b272013-05-14 12:48:36 -04001647}
1648
1649/*******************************************************************************
1650**
1651** Function nfa_dm_disc_report_kovio_presence_check
1652**
1653** Description Report Kovio presence check status
1654**
1655** Returns None
1656**
1657*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001658static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001659 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
Evan Chu7c69b272013-05-14 12:48:36 -04001660
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001661 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
1662 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
Evan Chu7c69b272013-05-14 12:48:36 -04001663
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001664 /* notify RW module that sleep wakeup is finished */
1665 nfa_rw_handle_presence_check_rsp(status);
Evan Chu7c69b272013-05-14 12:48:36 -04001666
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001667 if (nfa_dm_cb.disc_cb.deact_pending) {
1668 nfa_dm_cb.disc_cb.deact_pending = false;
Myles Watson1361d522017-09-26 13:39:54 -07001669 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
1670 nfa_dm_rf_disc_data.deactivate_type =
1671 nfa_dm_cb.disc_cb.pending_deact_type;
1672 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001673 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001674 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001675}
1676
1677/*******************************************************************************
1678**
1679** Function nfa_dm_disc_data_cback
1680**
1681** Description Monitoring interface error through data callback
1682**
1683** Returns void
1684**
1685*******************************************************************************/
Ruchi Kandoi9ba6d242017-10-13 16:07:01 -07001686static void nfa_dm_disc_data_cback(__attribute__((unused)) uint8_t conn_id,
1687 tNFC_CONN_EVT event, tNFC_CONN* p_data) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001688 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001689
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001690 /* if selection failed */
1691 if (event == NFC_ERROR_CEVT) {
1692 nfa_dm_disc_sm_execute(NFA_DM_CORE_INTF_ERROR_NTF, NULL);
1693 } else if (event == NFC_DATA_CEVT) {
1694 GKI_freebuf(p_data->data.p_data);
1695 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001696}
1697
1698/*******************************************************************************
1699**
1700** Function nfa_dm_disc_new_state
1701**
1702** Description Processing discovery events in NFA_DM_RFST_IDLE state
1703**
1704** Returns void
1705**
1706*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001707void nfa_dm_disc_new_state(tNFA_DM_RF_DISC_STATE new_state) {
1708 tNFA_CONN_EVT_DATA evt_data;
1709 tNFA_DM_RF_DISC_STATE old_state = nfa_dm_cb.disc_cb.disc_state;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001710
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001711 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1712 "old_state: %s (%d), new_state: %s (%d) "
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001713 "disc_flags: 0x%x",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07001714 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
1715 nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_state_2_str(new_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001716 new_state, nfa_dm_cb.disc_cb.disc_flags);
Evan Chu7c69b272013-05-14 12:48:36 -04001717
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001718 nfa_dm_cb.disc_cb.disc_state = new_state;
Evan Chu7c69b272013-05-14 12:48:36 -04001719
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001720 /* not error recovering */
1721 if ((new_state == NFA_DM_RFST_IDLE) &&
1722 (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))) {
1723 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
1724 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001725
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001726 /* if exclusive RF control is stopping */
1727 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) {
1728 if (old_state > NFA_DM_RFST_DISCOVERY) {
1729 /* notify deactivation to application */
1730 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1731 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001732 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001733
1734 nfa_dm_rel_excl_rf_control_and_notify();
1735 } else {
1736 evt_data.status = NFA_STATUS_OK;
1737 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
1738 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001739 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001740 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING) {
1741 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
1742 nfa_sys_check_disabled();
1743 }
1744 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001745}
1746
1747/*******************************************************************************
1748**
1749** Function nfa_dm_disc_sm_idle
1750**
1751** Description Processing discovery events in NFA_DM_RFST_IDLE state
1752**
1753** Returns void
1754**
1755*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001756static void nfa_dm_disc_sm_idle(tNFA_DM_RF_DISC_SM_EVENT event,
1757 tNFA_DM_RF_DISC_DATA* p_data) {
1758 uint8_t xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001759
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001760 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001761 case NFA_DM_RF_DISCOVER_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001762 nfa_dm_start_rf_discover();
1763 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001764
1765 case NFA_DM_RF_DISCOVER_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001766 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001767
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001768 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
1769 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001770
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001771 /* if RF discovery was stopped while waiting for response */
1772 if (nfa_dm_cb.disc_cb.disc_flags &
1773 (NFA_DM_DISC_FLAGS_STOPPING | NFA_DM_DISC_FLAGS_DISABLING)) {
1774 /* stop discovery */
1775 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1776 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1777 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001778 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001779
1780 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
1781 if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &
1782 NFA_DM_DISC_FLAGS_NOTIFY) {
1783 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &=
1784 ~NFA_DM_DISC_FLAGS_NOTIFY;
1785
1786 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1787 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
Myles Watson1361d522017-09-26 13:39:54 -07001788 NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001789 }
1790 } else {
1791 /* notify event to each module which is waiting for start */
1792 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
1793 /* if registered module is waiting for starting discovery */
1794 if ((nfa_dm_cb.disc_cb.entry[xx].in_use) &&
1795 (nfa_dm_cb.disc_cb.dm_disc_mask &
1796 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask) &&
1797 (nfa_dm_cb.disc_cb.entry[xx].disc_flags &
1798 NFA_DM_DISC_FLAGS_NOTIFY)) {
1799 nfa_dm_cb.disc_cb.entry[xx].disc_flags &=
1800 ~NFA_DM_DISC_FLAGS_NOTIFY;
1801
1802 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1803 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
Myles Watson1361d522017-09-26 13:39:54 -07001804 NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001805 }
1806 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001807 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001808 nfa_dm_disc_notify_started(p_data->nfc_discover.status);
1809 } else {
1810 /* in rare case that the discovery states of NFCC and DH mismatch and
1811 * NFCC rejects Discover Cmd
1812 * deactivate idle and then start disvocery when got deactivate rsp */
1813 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1814 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1815 }
1816 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001817
1818 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001819 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001820
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001821 /* if NFCC goes to idle successfully */
1822 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
1823 /* if DH forced to go idle while waiting for deactivation NTF */
1824 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
1825 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
1826 &(p_data->nfc_discover));
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001827
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001828 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or
1829 * NFA_DM_DISC_FLAGS_DISABLING */
1830 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1831 /* check if need to restart discovery after resync discovery state
1832 * with NFCC */
1833 nfa_dm_start_rf_discover();
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001834 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001835 /* Otherwise, deactivating when getting unexpected activation */
1836 }
1837 /* Otherwise, wait for deactivation NTF */
1838 break;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001839
1840 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001841 /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while
1842 * deactivating */
1843 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
1844 if (p_data->nfc_discover.deactivate.type ==
1845 NFC_DEACTIVATE_TYPE_DISCOVERY) {
1846 /* stop discovery */
1847 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1848 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1849 } else {
1850 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
1851 &(p_data->nfc_discover));
1852 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or
1853 * NFA_DM_DISC_FLAGS_DISABLING */
1854 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1855 /* check if need to restart discovery after resync discovery state
1856 * with NFCC */
1857 nfa_dm_start_rf_discover();
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001858 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001859 }
1860 /* Otherwise, deactivated when received unexpected activation in idle
1861 * state */
1862 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
1863 break;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001864
1865 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001866 /* unexpected activation, deactivate to idle */
1867 nfa_dm_cb.disc_cb.disc_flags |=
1868 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
1869 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1870 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001871
1872 case NFA_DM_LP_LISTEN_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001873 nfa_dm_disc_new_state(NFA_DM_RFST_LP_LISTEN);
1874 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001875
1876 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001877 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001878 break;
1879 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001880}
1881
1882/*******************************************************************************
1883**
1884** Function nfa_dm_disc_sm_discovery
1885**
1886** Description Processing discovery events in NFA_DM_RFST_DISCOVERY state
1887**
1888** Returns void
1889**
1890*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001891static void nfa_dm_disc_sm_discovery(tNFA_DM_RF_DISC_SM_EVENT event,
1892 tNFA_DM_RF_DISC_DATA* p_data) {
1893 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001894 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001895 /* if deactivate CMD was not sent to NFCC */
1896 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
1897 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1898 NFC_Deactivate(p_data->deactivate_type);
1899 }
1900 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001901 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001902 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001903
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001904 /* if it's not race condition between deactivate CMD and activate NTF */
1905 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
1906 /* do not notify deactivated to idle in RF discovery state
1907 ** because it is internal or stopping RF discovery
1908 */
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001909
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001910 /* there was no activation while waiting for deactivation RSP */
1911 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1912 nfa_dm_start_rf_discover();
1913 }
1914 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001915 case NFA_DM_RF_DISCOVER_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001916 nfa_dm_disc_new_state(NFA_DM_RFST_W4_ALL_DISCOVERIES);
1917 nfa_dm_notify_discovery(p_data);
1918 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001919 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001920 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001921 DLOG_IF(INFO, nfc_debug_enabled)
1922 << StringPrintf("RF Activated while waiting for deactivation RSP");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001923 /* it's race condition. DH has to wait for deactivation NTF */
1924 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF;
1925 } else {
1926 if (p_data->nfc_discover.activate.intf_param.type ==
1927 NFC_INTERFACE_EE_DIRECT_RF) {
1928 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
1929 } else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80) {
1930 /* Listen mode */
1931 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
1932 } else {
1933 /* Poll mode */
1934 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001935 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001936
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001937 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
1938 NFA_STATUS_FAILED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001939 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1940 "Not matched, restart discovery after receiving "
1941 "deactivate ntf");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001942
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001943 /* after receiving deactivate event, restart discovery */
1944 nfa_dm_cb.disc_cb.disc_flags |=
1945 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
1946 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001947 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001948 }
1949 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001950
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001951 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001952 /* if there was race condition between deactivate CMD and activate NTF */
1953 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) {
1954 /* race condition is resolved */
1955 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001956
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001957 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
1958 /* do not notify deactivated to idle in RF discovery state
1959 ** because it is internal or stopping RF discovery
1960 */
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001961
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001962 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
1963 nfa_dm_start_rf_discover();
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07001964 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001965 }
1966 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001967 case NFA_DM_LP_LISTEN_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001968 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001969 case NFA_DM_CORE_INTF_ERROR_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001970 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001971 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07001972 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001973 break;
1974 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001975}
1976
1977/*******************************************************************************
1978**
1979** Function nfa_dm_disc_sm_w4_all_discoveries
1980**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001981** Description Processing discovery events in
1982** NFA_DM_RFST_W4_ALL_DISCOVERIES state
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001983**
1984** Returns void
1985**
1986*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001987static void nfa_dm_disc_sm_w4_all_discoveries(tNFA_DM_RF_DISC_SM_EVENT event,
1988 tNFA_DM_RF_DISC_DATA* p_data) {
1989 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001990 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001991 /* if deactivate CMD was not sent to NFCC */
1992 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
1993 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1994 /* only IDLE mode is allowed */
1995 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1996 }
1997 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001998 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001999 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2000 /* notify exiting from w4 all discoverie state */
2001 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2002 &(p_data->nfc_discover));
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002003
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002004 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2005 nfa_dm_start_rf_discover();
2006 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002007 case NFA_DM_RF_DISCOVER_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002008 /* if deactivate CMD is already sent then ignore discover NTF */
2009 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2010 /* Notification Type = NCI_DISCOVER_NTF_LAST or
2011 * NCI_DISCOVER_NTF_LAST_ABORT */
2012 if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE) {
2013 nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002014 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002015 nfa_dm_notify_discovery(p_data);
2016 }
2017 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002018 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002019 /*
2020 ** This is only for ISO15693.
2021 ** FW sends activation NTF when all responses are received from tags
2022 ** without host selecting.
2023 */
2024 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002025
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002026 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2027 NFA_STATUS_FAILED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002028 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002029 "Not matched, restart discovery after receiving deactivate ntf");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002030
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002031 /* after receiving deactivate event, restart discovery */
2032 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2033 }
2034 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002035 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002036 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002037 break;
2038 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002039}
2040
2041/*******************************************************************************
2042**
2043** Function nfa_dm_disc_sm_w4_host_select
2044**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08002045** Description Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT
2046** state
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002047**
2048** Returns void
2049**
2050*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002051static void nfa_dm_disc_sm_w4_host_select(tNFA_DM_RF_DISC_SM_EVENT event,
2052 tNFA_DM_RF_DISC_DATA* p_data) {
2053 tNFA_CONN_EVT_DATA conn_evt;
2054 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag =
2055 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2056 bool sleep_wakeup_event = false;
2057 bool sleep_wakeup_event_processed = false;
2058 tNFA_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002059
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002060 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002061 case NFA_DM_RF_DISCOVER_SELECT_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002062 /* if not waiting to deactivate */
2063 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2064 NFC_DiscoverySelect(p_data->select.rf_disc_id, p_data->select.protocol,
2065 p_data->select.rf_interface);
2066 } else {
2067 nfa_dm_disc_conn_event_notify(NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED);
2068 }
2069 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002070
2071 case NFA_DM_RF_DISCOVER_SELECT_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002072 sleep_wakeup_event = true;
2073 /* notify application status of selection */
2074 if (p_data->nfc_discover.status == NFC_STATUS_OK) {
2075 sleep_wakeup_event_processed = true;
2076 conn_evt.status = NFA_STATUS_OK;
2077 /* register callback to get interface error NTF */
2078 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
2079 } else
2080 conn_evt.status = NFA_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002081
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002082 if (!old_sleep_wakeup_flag) {
2083 nfa_dm_disc_conn_event_notify(NFA_SELECT_RESULT_EVT,
2084 p_data->nfc_discover.status);
2085 }
2086 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002087 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002088 nfa_dm_disc_new_state(NFA_DM_RFST_POLL_ACTIVE);
2089 /* always call nfa_dm_disc_notify_activation to update protocol/interface
2090 * information in NFA control blocks */
2091 status = nfa_dm_disc_notify_activation(&(p_data->nfc_discover));
2092 if (old_sleep_wakeup_flag) {
2093 /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag;
2094 * if deactivation is pending then deactivate */
2095 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
2096 } else if (status == NFA_STATUS_FAILED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002097 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002098 "Not matched, restart discovery after receiving deactivate ntf");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002099
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002100 /* after receiving deactivate event, restart discovery */
2101 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2102 }
2103 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002104 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002105 if (old_sleep_wakeup_flag) {
2106 nfa_dm_cb.disc_cb.deact_pending = true;
2107 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2108 }
2109 /* if deactivate CMD was not sent to NFCC */
2110 else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) {
2111 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2112 /* only IDLE mode is allowed */
2113 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2114 }
2115 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002116 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002117 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2118 /* notify exiting from host select state */
2119 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2120 &(p_data->nfc_discover));
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002121
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002122 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2123 nfa_dm_start_rf_discover();
2124 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002125
2126 case NFA_DM_CORE_INTF_ERROR_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002127 sleep_wakeup_event = true;
2128 if (!old_sleep_wakeup_flag) {
2129 /* target activation failed, upper layer may deactivate or select again
2130 */
2131 conn_evt.status = NFA_STATUS_FAILED;
2132 nfa_dm_conn_cback_event_notify(NFA_SELECT_RESULT_EVT, &conn_evt);
2133 }
2134 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002135 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002136 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002137 break;
2138 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002139
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002140 if (old_sleep_wakeup_flag && sleep_wakeup_event &&
2141 !sleep_wakeup_event_processed) {
2142 /* performing sleep wakeup and exception conditions happened
2143 * clear sleep wakeup information and report failure */
2144 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_FAILED);
2145 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002146}
2147
2148/*******************************************************************************
2149**
2150** Function nfa_dm_disc_sm_poll_active
2151**
2152** Description Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state
2153**
2154** Returns void
2155**
2156*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002157static void nfa_dm_disc_sm_poll_active(tNFA_DM_RF_DISC_SM_EVENT event,
2158 tNFA_DM_RF_DISC_DATA* p_data) {
2159 tNFC_STATUS status;
2160 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag =
2161 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2162 bool sleep_wakeup_event = false;
2163 bool sleep_wakeup_event_processed = false;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002164
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002165 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002166 case NFA_DM_RF_DEACTIVATE_CMD:
Love Khannacdb435d2017-04-04 18:02:51 +05302167 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
2168 if ((nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_FRAME) &&
2169 (p_data->deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP)) {
2170 /* NCI 2.0- DH is responsible for sending deactivation commands before
2171 * RF_DEACTIVATE_CMD */
2172 nfa_dm_send_tag_deselect_cmd(nfa_dm_cb.disc_cb.activated_protocol);
2173 }
2174 }
2175
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002176 if (nfa_dm_cb.disc_cb.activated_protocol == NCI_PROTOCOL_MIFARE) {
2177 nfa_dm_cb.disc_cb.deact_pending = true;
2178 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2179 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002180 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002181 }
2182
2183 if (old_sleep_wakeup_flag) {
2184 /* sleep wakeup is already enabled when deactivate cmd is requested,
2185 * keep the information in control block to issue it later */
2186 nfa_dm_cb.disc_cb.deact_pending = true;
2187 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2188 } else {
2189 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2190 }
2191
2192 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002193 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002194 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2195 /* register callback to get interface error NTF */
2196 NFC_SetStaticRfCback(nfa_dm_disc_data_cback);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002197
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002198 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2199 /* it's race condition. received deactivate NTF before receiving RSP */
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002200
Myles Watson1361d522017-09-26 13:39:54 -07002201 tNFC_DEACTIVATE_DEVT deact;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002202 deact.status = NFC_STATUS_OK;
2203 deact.type = NFC_DEACTIVATE_TYPE_IDLE;
2204 deact.is_ntf = true;
Myles Watson1361d522017-09-26 13:39:54 -07002205 tNFC_DISCOVER nfc_discover;
2206 nfc_discover.deactivate = deact;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002207 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
Myles Watson1361d522017-09-26 13:39:54 -07002208 &nfc_discover);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002209
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002210 /* NFCC is in IDLE state */
2211 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2212 nfa_dm_start_rf_discover();
2213 }
2214 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002215 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002216 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002217
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002218 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002219
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002220 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
2221 /* it's race condition. received deactivate NTF before receiving RSP */
2222 /* notify deactivation after receiving deactivate RSP */
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002223 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2224 "Rx deactivate NTF while waiting for deactivate RSP");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002225 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002226 }
Love Khanna13c47602017-04-04 17:36:20 +05302227 if (p_data->nfc_discover.deactivate.reason !=
2228 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2229 sleep_wakeup_event = true;
2230 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2231 &(p_data->nfc_discover));
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002232 }
2233 if ((p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
2234 (p_data->nfc_discover.deactivate.type ==
2235 NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
2236 if (p_data->nfc_discover.deactivate.reason !=
2237 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2238 /* count for number of times deactivate cmd sent */
2239 nfa_dm_cb.deactivate_cmd_retry_count = 0;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002240 }
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002241 nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
2242 if (old_sleep_wakeup_flag) {
2243 sleep_wakeup_event_processed = true;
2244 /* process pending deactivate request */
2245 if (nfa_dm_cb.disc_cb.deact_pending) {
2246 /* notify RW module that sleep wakeup is finished */
2247 /* if deactivation is pending then deactivate */
2248 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
Love Khanna13c47602017-04-04 17:36:20 +05302249
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002250 /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will
2251 * not call this function */
2252 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true);
2253 } else {
2254 /* Successfully went to sleep mode for sleep wakeup */
2255 /* Now wake up the tag to complete the operation */
2256 NFC_DiscoverySelect(nfa_dm_cb.disc_cb.activated_rf_disc_id,
2257 nfa_dm_cb.disc_cb.activated_protocol,
2258 nfa_dm_cb.disc_cb.activated_rf_interface);
Love Khanna13c47602017-04-04 17:36:20 +05302259 }
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002260 }
2261 if (p_data->nfc_discover.deactivate.reason ==
2262 NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
2263 /* in case deactivation is not sucessfull, NFCC shall send
2264 RF_DEACTIVATE_NTF with DH Req failed due to error.
2265 MW shall send deactivation cmd again for 3 three times. if
2266 deactivation is not successfull 3 times also,
2267 then MW shall send deacivate cmd with deactivate type is
2268 discovery */
2269 if (nfa_dm_cb.deactivate_cmd_retry_count == 3) {
2270 if ((!old_sleep_wakeup_flag) ||
2271 (!nfa_dm_cb.disc_cb.deact_pending)) {
2272 nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
Love Khanna13c47602017-04-04 17:36:20 +05302273 }
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002274 nfa_dm_cb.deactivate_cmd_retry_count = 0;
2275 } else {
2276 nfa_dm_cb.deactivate_cmd_retry_count++;
2277 nfa_dm_send_deactivate_cmd(p_data->nfc_discover.deactivate.type);
Love Khanna13c47602017-04-04 17:36:20 +05302278 }
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002279 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002280 } else if (p_data->nfc_discover.deactivate.type ==
2281 NFC_DEACTIVATE_TYPE_IDLE) {
2282 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2283 nfa_dm_start_rf_discover();
2284 } else if (p_data->nfc_discover.deactivate.type ==
2285 NFC_DEACTIVATE_TYPE_DISCOVERY) {
2286 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2287 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
2288 /* stop discovery */
2289 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2290 }
2291 }
2292 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002293
2294 case NFA_DM_CORE_INTF_ERROR_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002295 sleep_wakeup_event = true;
2296 if ((!old_sleep_wakeup_flag) || (!nfa_dm_cb.disc_cb.deact_pending)) {
2297 nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
2298 }
2299 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002300
2301 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002302 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002303 break;
2304 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002305
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002306 if (old_sleep_wakeup_flag && sleep_wakeup_event &&
2307 !sleep_wakeup_event_processed) {
2308 /* performing sleep wakeup and exception conditions happened
2309 * clear sleep wakeup information and report failure */
2310 nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_FAILED);
2311 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002312}
2313
2314/*******************************************************************************
2315**
2316** Function nfa_dm_disc_sm_listen_active
2317**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08002318** Description Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE
2319** state
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002320**
2321** Returns void
2322**
2323*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002324static void nfa_dm_disc_sm_listen_active(tNFA_DM_RF_DISC_SM_EVENT event,
2325 tNFA_DM_RF_DISC_DATA* p_data) {
2326 tNFC_DEACTIVATE_DEVT deact;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002327
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002328 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002329 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002330 nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2331 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002332 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002333 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2334 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2335 /* it's race condition. received deactivate NTF before receiving RSP */
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002336
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002337 deact.status = NFC_STATUS_OK;
2338 deact.type = NFC_DEACTIVATE_TYPE_IDLE;
2339 deact.is_ntf = true;
Myles Watson1361d522017-09-26 13:39:54 -07002340 tNFC_DISCOVER nfc_discover;
2341 nfc_discover.deactivate = deact;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002342 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
Myles Watson1361d522017-09-26 13:39:54 -07002343 &nfc_discover);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002344
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002345 /* NFCC is in IDLE state */
2346 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2347 nfa_dm_start_rf_discover();
2348 }
2349 break;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002350 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002351 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002352
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002353 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002354
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002355 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
2356 /* it's race condition. received deactivate NTF before receiving RSP */
2357 /* notify deactivation after receiving deactivate RSP */
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002358 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2359 "Rx deactivate NTF while waiting for deactivate RSP");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002360 } else {
2361 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2362 &(p_data->nfc_discover));
2363
2364 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) {
2365 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2366 nfa_dm_start_rf_discover();
2367 } else if ((p_data->nfc_discover.deactivate.type ==
2368 NFC_DEACTIVATE_TYPE_SLEEP) ||
2369 (p_data->nfc_discover.deactivate.type ==
2370 NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
2371 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_SLEEP);
2372 } else if (p_data->nfc_discover.deactivate.type ==
2373 NFC_DEACTIVATE_TYPE_DISCOVERY) {
2374 /* Discovery */
2375 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2376 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) {
2377 /* stop discovery */
2378 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2379 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002380 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002381 }
2382 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002383
2384 case NFA_DM_CORE_INTF_ERROR_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002385 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002386 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002387 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002388 break;
2389 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002390}
2391
2392/*******************************************************************************
2393**
2394** Function nfa_dm_disc_sm_listen_sleep
2395**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08002396** Description Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP
2397** state
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002398**
2399** Returns void
2400**
2401*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002402static void nfa_dm_disc_sm_listen_sleep(tNFA_DM_RF_DISC_SM_EVENT event,
2403 tNFA_DM_RF_DISC_DATA* p_data) {
2404 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002405 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002406 nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002407
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002408 /* if deactivate type is not discovery then NFCC will not sent
2409 * deactivation NTF */
2410 if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY) {
2411 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2412 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
2413 }
2414 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002415 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002416 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2417 /* if deactivate type in CMD was IDLE */
2418 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
2419 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2420 &(p_data->nfc_discover));
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002421
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002422 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2423 nfa_dm_start_rf_discover();
2424 }
2425 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002426 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002427 /* clear both W4_RSP and W4_NTF because of race condition between
2428 * deactivat CMD and link loss */
2429 nfa_dm_cb.disc_cb.disc_flags &=
2430 ~(NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF);
2431 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.tle);
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002432
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002433 /* there is no active protocol in this state, so broadcast to all by using
2434 * NFA_DM_RF_DEACTIVATE_RSP */
2435 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_RSP,
2436 &(p_data->nfc_discover));
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002437
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002438 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) {
2439 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2440 nfa_dm_start_rf_discover();
2441 } else if (p_data->nfc_discover.deactivate.type ==
2442 NFA_DEACTIVATE_TYPE_DISCOVERY) {
2443 nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
2444 } else {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002445 LOG(ERROR) << StringPrintf("Unexpected deactivation type");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002446 nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
2447 nfa_dm_start_rf_discover();
2448 }
2449 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002450 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002451 nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
2452 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2453 NFA_STATUS_FAILED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002454 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002455 "Not matched, restart discovery after receiving deactivate ntf");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002456
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002457 /* after receiving deactivate event, restart discovery */
2458 NFC_Deactivate(NFA_DEACTIVATE_TYPE_IDLE);
2459 }
2460 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002461 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002462 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002463 break;
2464 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002465}
2466
2467/*******************************************************************************
2468**
2469** Function nfa_dm_disc_sm_lp_listen
2470**
2471** Description Processing discovery events in NFA_DM_RFST_LP_LISTEN state
2472**
2473** Returns void
2474**
2475*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002476static void nfa_dm_disc_sm_lp_listen(tNFA_DM_RF_DISC_SM_EVENT event,
2477 tNFA_DM_RF_DISC_DATA* p_data) {
2478 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002479 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002480 nfa_dm_disc_new_state(NFA_DM_RFST_LP_ACTIVE);
2481 nfa_dm_disc_notify_activation(&(p_data->nfc_discover));
2482 if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
2483 NFA_STATUS_FAILED) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002484 DLOG_IF(INFO, nfc_debug_enabled)
2485 << StringPrintf("Not matched, unexpected activation");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002486 }
2487 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002488
2489 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002490 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002491 break;
2492 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002493}
2494
2495/*******************************************************************************
2496**
2497** Function nfa_dm_disc_sm_lp_active
2498**
2499** Description Processing discovery events in NFA_DM_RFST_LP_ACTIVE state
2500**
2501** Returns void
2502**
2503*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002504static void nfa_dm_disc_sm_lp_active(tNFA_DM_RF_DISC_SM_EVENT event,
2505 tNFA_DM_RF_DISC_DATA* p_data) {
2506 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002507 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002508 nfa_dm_disc_new_state(NFA_DM_RFST_LP_LISTEN);
2509 nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
2510 &(p_data->nfc_discover));
2511 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002512 default:
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002513 LOG(ERROR) << StringPrintf("Unexpected discovery event");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002514 break;
2515 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002516}
2517
2518/*******************************************************************************
2519**
2520** Function nfa_dm_disc_sm_execute
2521**
2522** Description Processing discovery related events
2523**
2524** Returns void
2525**
2526*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002527void nfa_dm_disc_sm_execute(tNFA_DM_RF_DISC_SM_EVENT event,
2528 tNFA_DM_RF_DISC_DATA* p_data) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002529 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2530 "state: %s (%d), event: %s(%d) disc_flags: "
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002531 "0x%x",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002532 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
2533 nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_event_2_str(event).c_str(),
2534 event, nfa_dm_cb.disc_cb.disc_flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002535
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002536 switch (nfa_dm_cb.disc_cb.disc_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002537 /* RF Discovery State - Idle */
2538 case NFA_DM_RFST_IDLE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002539 nfa_dm_disc_sm_idle(event, p_data);
2540 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002541
2542 /* RF Discovery State - Discovery */
2543 case NFA_DM_RFST_DISCOVERY:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002544 nfa_dm_disc_sm_discovery(event, p_data);
2545 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002546
2547 /*RF Discovery State - Wait for all discoveries */
2548 case NFA_DM_RFST_W4_ALL_DISCOVERIES:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002549 nfa_dm_disc_sm_w4_all_discoveries(event, p_data);
2550 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002551
2552 /* RF Discovery State - Wait for host selection */
2553 case NFA_DM_RFST_W4_HOST_SELECT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002554 nfa_dm_disc_sm_w4_host_select(event, p_data);
2555 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002556
2557 /* RF Discovery State - Poll mode activated */
2558 case NFA_DM_RFST_POLL_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002559 nfa_dm_disc_sm_poll_active(event, p_data);
2560 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002561
2562 /* RF Discovery State - listen mode activated */
2563 case NFA_DM_RFST_LISTEN_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002564 nfa_dm_disc_sm_listen_active(event, p_data);
2565 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002566
2567 /* RF Discovery State - listen mode sleep */
2568 case NFA_DM_RFST_LISTEN_SLEEP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002569 nfa_dm_disc_sm_listen_sleep(event, p_data);
2570 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002571
2572 /* Listening in Low Power mode */
2573 case NFA_DM_RFST_LP_LISTEN:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002574 nfa_dm_disc_sm_lp_listen(event, p_data);
2575 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002576
2577 /* Activated in Low Power mode */
2578 case NFA_DM_RFST_LP_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002579 nfa_dm_disc_sm_lp_active(event, p_data);
2580 break;
2581 }
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002582 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2583 "new state: %s (%d), disc_flags: 0x%x",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002584 nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002585 nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002586}
2587
2588/*******************************************************************************
2589**
2590** Function nfa_dm_add_rf_discover
2591**
2592** Description Add discovery configuration and callback function
2593**
2594** Returns valid handle if success
2595**
2596*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002597tNFA_HANDLE nfa_dm_add_rf_discover(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask,
2598 tNFA_DM_DISC_HOST_ID host_id,
2599 tNFA_DISCOVER_CBACK* p_disc_cback) {
2600 uint8_t xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002601
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002602 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("disc_mask=0x%x", disc_mask);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002603
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002604 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
2605 if (!nfa_dm_cb.disc_cb.entry[xx].in_use) {
2606 nfa_dm_cb.disc_cb.entry[xx].in_use = true;
2607 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask;
2608 nfa_dm_cb.disc_cb.entry[xx].host_id = host_id;
2609 nfa_dm_cb.disc_cb.entry[xx].p_disc_cback = p_disc_cback;
2610 nfa_dm_cb.disc_cb.entry[xx].disc_flags = NFA_DM_DISC_FLAGS_NOTIFY;
2611 return xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002612 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002613 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002614
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002615 return NFA_HANDLE_INVALID;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002616}
2617
2618/*******************************************************************************
2619**
2620** Function nfa_dm_start_excl_discovery
2621**
2622** Description Start exclusive RF discovery
2623**
2624** Returns void
2625**
2626*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002627void nfa_dm_start_excl_discovery(tNFA_TECHNOLOGY_MASK poll_tech_mask,
2628 tNFA_LISTEN_CFG* p_listen_cfg,
2629 tNFA_DISCOVER_CBACK* p_disc_cback) {
2630 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002631
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002632 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002633
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002634 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) {
2635 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
2636 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
2637 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
2638 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
2639 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
2640 }
Love Khanna78eae6d2017-04-04 16:23:47 +05302641 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
2642 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE) {
2643 poll_disc_mask |= NFA_DM_DISC_MASK_PACM_NFC_DEP;
2644 }
2645 } else {
2646 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) {
2647 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
2648 }
2649 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) {
2650 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
2651 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002652 }
Love Khanna78eae6d2017-04-04 16:23:47 +05302653
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002654 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) {
2655 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
2656 }
2657 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) {
2658 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
2659 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
2660 }
Love Khanna57a3dfa2017-03-28 20:03:38 +05302661 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_V) {
2662 poll_disc_mask |= NFA_DM_DISC_MASK_P_T5T;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002663 }
2664 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) {
2665 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
2666 }
2667 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) {
2668 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
2669 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002670
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002671 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = true;
2672 nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask;
2673 nfa_dm_cb.disc_cb.excl_disc_entry.host_id = NFA_DM_DISC_HOST_ID_DH;
2674 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = p_disc_cback;
2675 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags = NFA_DM_DISC_FLAGS_NOTIFY;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002676
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002677 memcpy(&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg,
2678 sizeof(tNFA_LISTEN_CFG));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002679
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002680 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_CMD, NULL);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002681}
2682
2683/*******************************************************************************
2684**
2685** Function nfa_dm_stop_excl_discovery
2686**
2687** Description Stop exclusive RF discovery
2688**
2689** Returns void
2690**
2691*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002692void nfa_dm_stop_excl_discovery(void) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002693 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002694
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002695 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = false;
2696 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002697}
2698
2699/*******************************************************************************
2700**
2701** Function nfa_dm_delete_rf_discover
2702**
2703** Description Remove discovery configuration and callback function
2704**
2705** Returns void
2706**
2707*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002708void nfa_dm_delete_rf_discover(tNFA_HANDLE handle) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002709 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle=0x%x", handle);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002710
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002711 if (handle < NFA_DM_DISC_NUM_ENTRIES) {
2712 nfa_dm_cb.disc_cb.entry[handle].in_use = false;
2713 } else {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002714 LOG(ERROR) << StringPrintf("Invalid discovery handle");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002715 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002716}
2717
2718/*******************************************************************************
2719**
2720** Function nfa_dm_rf_discover_select
2721**
2722** Description Select target, protocol and RF interface
2723**
2724** Returns void
2725**
2726*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002727void nfa_dm_rf_discover_select(uint8_t rf_disc_id, tNFA_NFC_PROTOCOL protocol,
2728 tNFA_INTF_TYPE rf_interface) {
2729 tNFA_DM_DISC_SELECT_PARAMS select_params;
2730 tNFA_CONN_EVT_DATA conn_evt;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002731
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002732 DLOG_IF(INFO, nfc_debug_enabled)
2733 << StringPrintf("rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
2734 rf_disc_id, protocol, rf_interface);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002735
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002736 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) {
2737 /* state is OK: notify the status when the response is received from NFCC */
2738 select_params.rf_disc_id = rf_disc_id;
2739 select_params.protocol = protocol;
2740 select_params.rf_interface = rf_interface;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002741
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002742 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY;
Myles Watson1361d522017-09-26 13:39:54 -07002743 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2744 nfa_dm_rf_disc_data.select = select_params;
2745 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_SELECT_CMD, &nfa_dm_rf_disc_data);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002746 } else {
2747 /* Wrong state: notify failed status right away */
2748 conn_evt.status = NFA_STATUS_FAILED;
2749 nfa_dm_conn_cback_event_notify(NFA_SELECT_RESULT_EVT, &conn_evt);
2750 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002751}
2752
2753/*******************************************************************************
2754**
2755** Function nfa_dm_rf_deactivate
2756**
2757** Description Deactivate NFC link
2758**
2759** Returns NFA_STATUS_OK if success
2760**
2761*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002762tNFA_STATUS nfa_dm_rf_deactivate(tNFA_DEACTIVATE_TYPE deactivate_type) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002763 DLOG_IF(INFO, nfc_debug_enabled)
2764 << StringPrintf("deactivate_type:0x%X", deactivate_type);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002765
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002766 if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP) {
2767 if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
2768 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002769 else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002770 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP;
2771 }
2772
2773 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) {
2774 return NFA_STATUS_FAILED;
2775 } else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) {
2776 if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY) {
2777 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
2778 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
2779 nfa_dm_disc_kovio_timeout_cback(&nfa_dm_cb.disc_cb.kovio_tle);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002780 return NFA_STATUS_OK;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002781 } else {
2782 /* it could be race condition. */
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002783 DLOG_IF(INFO, nfc_debug_enabled)
2784 << StringPrintf("already in discovery state");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002785 return NFA_STATUS_FAILED;
2786 }
2787 } else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE) {
2788 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) {
2789 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
2790 nfa_dm_disc_kovio_timeout_cback(&nfa_dm_cb.disc_cb.kovio_tle);
2791 }
Myles Watson1361d522017-09-26 13:39:54 -07002792 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2793 nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
2794 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002795 return NFA_STATUS_OK;
2796 } else {
2797 return NFA_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002798 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002799 } else {
Myles Watson1361d522017-09-26 13:39:54 -07002800 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
2801 nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
2802 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002803 return NFA_STATUS_OK;
2804 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002805}
2806
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002807/*******************************************************************************
2808**
2809** Function nfa_dm_disc_state_2_str
2810**
2811** Description convert nfc discovery state to string
2812**
2813*******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002814static std::string nfa_dm_disc_state_2_str(uint8_t state) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002815 switch (state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002816 case NFA_DM_RFST_IDLE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002817 return "IDLE";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002818
2819 case NFA_DM_RFST_DISCOVERY:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002820 return "DISCOVERY";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002821
2822 case NFA_DM_RFST_W4_ALL_DISCOVERIES:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002823 return "W4_ALL_DISCOVERIES";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002824
2825 case NFA_DM_RFST_W4_HOST_SELECT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002826 return "W4_HOST_SELECT";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002827
2828 case NFA_DM_RFST_POLL_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002829 return "POLL_ACTIVE";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002830
2831 case NFA_DM_RFST_LISTEN_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002832 return "LISTEN_ACTIVE";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002833
2834 case NFA_DM_RFST_LISTEN_SLEEP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002835 return "LISTEN_SLEEP";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002836
2837 case NFA_DM_RFST_LP_LISTEN:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002838 return "LP_LISTEN";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002839
2840 case NFA_DM_RFST_LP_ACTIVE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002841 return "LP_ACTIVE";
2842 }
2843 return "Unknown";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002844}
2845
2846/*******************************************************************************
2847**
2848** Function nfa_dm_disc_event_2_str
2849**
2850** Description convert nfc discovery RSP/NTF to string
2851**
2852*******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002853static std::string nfa_dm_disc_event_2_str(uint8_t event) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002854 switch (event) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002855 case NFA_DM_RF_DISCOVER_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002856 return "DISCOVER_CMD";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002857 case NFA_DM_RF_DISCOVER_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002858 return "DISCOVER_RSP";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002859 case NFA_DM_RF_DISCOVER_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002860 return "DISCOVER_NTF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002861 case NFA_DM_RF_DISCOVER_SELECT_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002862 return "SELECT_CMD";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002863 case NFA_DM_RF_DISCOVER_SELECT_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002864 return "SELECT_RSP";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002865 case NFA_DM_RF_INTF_ACTIVATED_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002866 return "ACTIVATED_NTF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002867 case NFA_DM_RF_DEACTIVATE_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002868 return "DEACTIVATE_CMD";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002869 case NFA_DM_RF_DEACTIVATE_RSP:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002870 return "DEACTIVATE_RSP";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002871 case NFA_DM_RF_DEACTIVATE_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002872 return "DEACTIVATE_NTF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002873 case NFA_DM_LP_LISTEN_CMD:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002874 return "NFA_DM_LP_LISTEN_CMD";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002875 case NFA_DM_CORE_INTF_ERROR_NTF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002876 return "INTF_ERROR_NTF";
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002877 default:
2878 return "Unknown";
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002879 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002880}
Jizhou Liao2ef08962015-06-08 16:11:04 -07002881
2882/*******************************************************************************
2883**
2884** Function P2P_Prio_Logic
2885**
2886** Description Implements algorithm for NFC-DEP protocol priority over
2887** ISO-DEP protocol.
2888**
2889** Returns True if success
2890**
2891*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002892bool nfa_dm_p2p_prio_logic(uint8_t event, uint8_t* p, uint8_t event_type) {
2893 if (!nfa_poll_bail_out_mode) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002894 DLOG_IF(INFO, nfc_debug_enabled)
2895 << StringPrintf("p2p priority is running under bail out mode ONLY.");
Ruchi Kandoi4a179642017-01-04 10:04:48 -08002896 return true;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002897 }
2898
2899 if ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) &&
2900 (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED)) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002901 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002902 "returning from nfa_dm_p2p_prio_logic Disable p2p_prio_logic");
2903 return true;
2904 }
Love Khannad7852c92017-06-02 19:55:05 +05302905 if (appl_dta_mode_flag == 0x01) {
2906 /*Disable the P2P Prio Logic when DTA is running*/
2907 return TRUE;
2908 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002909 if (event == NCI_MSG_RF_DISCOVER &&
2910 p2p_prio_logic_data.timer_expired == true &&
2911 event_type == NFA_DM_P2P_PRIO_RSP) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002912 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002913 "nfa_dm_p2p_prio_logic starting a timer for next rf intf activated "
2914 "ntf");
2915 nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
2916 NFC_TTYPE_P2P_PRIO_LOGIC_CLEANUP,
2917 ((uint32_t)nfa_dm_act_get_rf_disc_duration() *
2918 QUICK_TIMER_TICKS_PER_SEC) /
2919 1000);
2920 return true;
2921 }
2922
2923 if (event == NCI_MSG_RF_INTF_ACTIVATED &&
2924 p2p_prio_logic_data.timer_expired == true) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002925 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002926 "nfa_dm_p2p_prio_logic stopping a timer for next rf intf activated "
2927 "ntf");
2928 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
2929 }
2930
2931 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) {
2932 uint8_t rf_disc_id = 0xFF;
2933 uint8_t type = 0xFF;
2934 uint8_t protocol = 0xFF;
2935 uint8_t tech_mode = 0xFF;
2936
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002937 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Prio_Logic");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002938
2939 if (event == NCI_MSG_RF_INTF_ACTIVATED) {
2940 rf_disc_id = *p++;
2941 type = *p++;
2942 protocol = *p++;
2943 tech_mode = *p++;
2944 }
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002945 DLOG_IF(INFO, nfc_debug_enabled)
2946 << StringPrintf("nfa_dm_p2p_prio_logic event_type = 0x%x", event_type);
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002947
2948 if (event == NCI_MSG_RF_INTF_ACTIVATED && tech_mode >= 0x80) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002949 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002950 "nfa_dm_p2p_prio_logic listen mode activated reset all the "
2951 "nfa_dm_p2p_prio_logic variables ");
2952 nfa_dm_p2p_prio_logic_cleanup();
2953 }
2954
2955 if ((tech_mode < 0x80) && event == NCI_MSG_RF_INTF_ACTIVATED &&
2956 protocol == NCI_PROTOCOL_ISO_DEP &&
2957 p2p_prio_logic_data.isodep_detected == false) {
2958 nfa_dm_p2p_prio_logic_cleanup();
2959 p2p_prio_logic_data.isodep_detected = true;
2960 p2p_prio_logic_data.first_tech_mode = tech_mode;
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002961 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2962 "ISO-DEP Detected First Time Resume the Polling Loop");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002963 nci_snd_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
2964 return false;
2965 }
2966
2967 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
2968 protocol == NCI_PROTOCOL_ISO_DEP &&
2969 p2p_prio_logic_data.isodep_detected == true &&
2970 p2p_prio_logic_data.first_tech_mode != tech_mode) {
2971 p2p_prio_logic_data.isodep_detected = true;
2972 p2p_prio_logic_data.timer_expired = false;
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002973 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002974 "ISO-DEP Detected Second Time Other Techmode Resume the Polling "
2975 "Loop");
2976 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
2977 nci_snd_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
2978 return false;
2979 }
2980
2981 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
2982 protocol == NCI_PROTOCOL_ISO_DEP &&
2983 p2p_prio_logic_data.isodep_detected == true &&
2984 p2p_prio_logic_data.timer_expired == true) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002985 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002986 "ISO-DEP Detected TimerExpired, Final Notifying the Event");
2987 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
2988 nfa_dm_p2p_prio_logic_cleanup();
2989 }
2990
2991 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
2992 protocol == NCI_PROTOCOL_ISO_DEP &&
2993 p2p_prio_logic_data.isodep_detected == true &&
2994 p2p_prio_logic_data.first_tech_mode == tech_mode) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002995 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002996 "ISO-DEP Detected Same Techmode, Final Notifying the Event");
2997 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07002998 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002999 nfa_dm_p2p_prio_logic_cleanup();
3000 }
3001
3002 else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
3003 protocol != NCI_PROTOCOL_ISO_DEP &&
3004 p2p_prio_logic_data.isodep_detected == true) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003005 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003006 "ISO-DEP Not Detected Giving Priority for other Technology");
3007 nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003008 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003009 nfa_dm_p2p_prio_logic_cleanup();
3010 }
3011
3012 else if (event == NCI_MSG_RF_DEACTIVATE &&
3013 p2p_prio_logic_data.isodep_detected == true &&
3014 p2p_prio_logic_data.timer_expired == false &&
3015 event_type == NFA_DM_P2P_PRIO_RSP) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003016 DLOG_IF(INFO, nfc_debug_enabled)
3017 << StringPrintf("NFA_DM_RF_DEACTIVATE_RSP");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003018 return false;
3019 }
3020
3021 else if (event == NCI_MSG_RF_DEACTIVATE &&
3022 p2p_prio_logic_data.isodep_detected == true &&
3023 p2p_prio_logic_data.timer_expired == false &&
3024 event_type == NFA_DM_P2P_PRIO_NTF) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003025 DLOG_IF(INFO, nfc_debug_enabled)
3026 << StringPrintf("NFA_DM_RF_DEACTIVATE_NTF");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003027
3028 nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
3029 NFC_TTYPE_P2P_PRIO_RESPONSE,
3030 ((uint32_t)160 * QUICK_TIMER_TICKS_PER_SEC) / 1000);
3031
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003032 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Start_Timer");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003033
3034 return false;
3035 }
3036 }
3037
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003038 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("returning TRUE");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003039 return true;
Jizhou Liao2ef08962015-06-08 16:11:04 -07003040}
3041
3042/*******************************************************************************
3043**
3044** Function p2p_prio_logic_timeout
3045**
3046** Description Callback function for p2p timer
3047**
3048** Returns void
3049**
3050*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003051void nfa_dm_p2p_timer_event() {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003052 DLOG_IF(INFO, nfc_debug_enabled)
3053 << StringPrintf("P2P_Timer_timeout NFC-DEP Not Discovered!!");
Jizhou Liao2ef08962015-06-08 16:11:04 -07003054
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003055 p2p_prio_logic_data.timer_expired = true;
Jizhou Liao2ef08962015-06-08 16:11:04 -07003056
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003057 if (p2p_prio_logic_data.isodep_detected == true) {
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003058 DLOG_IF(INFO, nfc_debug_enabled)
3059 << StringPrintf("Deactivate and Restart RF discovery");
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003060 nci_snd_deactivate_cmd(NFC_DEACTIVATE_TYPE_IDLE);
3061 }
Jizhou Liao2ef08962015-06-08 16:11:04 -07003062}
3063
3064/*******************************************************************************
3065**
3066** Function nfa_dm_p2p_prio_logic_cleanup
3067**
3068** Description Callback function for p2p prio logic cleanup timer
3069**
3070** Returns void
3071**
3072*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003073void nfa_dm_p2p_prio_logic_cleanup() {
3074 memset(&p2p_prio_logic_data, 0x00, sizeof(nfa_dm_p2p_prio_logic_t));
Jizhou Liao2ef08962015-06-08 16:11:04 -07003075}
Love Khannacdb435d2017-04-04 18:02:51 +05303076
3077/*******************************************************************************
3078**
3079** Function nfa_dm_send_tag_deselect_cmd
3080**
3081** Description Send command to send tag in sleep state
3082**
3083** Returns void
3084**
3085*******************************************************************************/
3086static void nfa_dm_send_tag_deselect_cmd(tNFA_NFC_PROTOCOL protocol) {
3087 NFC_HDR* p_msg;
3088 uint8_t* p;
3089
Ruchi Kandoi6767aec2017-09-26 09:46:26 -07003090 DLOG_IF(INFO, nfc_debug_enabled)
3091 << StringPrintf("nfa_dm_send_tag_deselect_cmd");
Love Khannacdb435d2017-04-04 18:02:51 +05303092 p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3093
3094 if (p_msg) {
3095 if (protocol == NFC_PROTOCOL_ISO_DEP) {
3096 /* send one byte of 0xc2 as as deselect command to Tag */
3097 p_msg->len = 1;
3098 p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3099 p = (uint8_t*)(p_msg + 1) + p_msg->offset;
3100 *p = NFA_RW_TAG_DESELECT_CMD;
3101 } else if (protocol == NFC_PROTOCOL_T2T) {
3102 p_msg->len = NFA_RW_TAG_SLP_REQ_LEN;
3103 p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3104 p = (uint8_t*)(p_msg + 1) + p_msg->offset;
3105 memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, NFA_RW_TAG_SLP_REQ,
3106 p_msg->len);
3107 } else {
3108 GKI_freebuf(p_msg);
3109 return;
3110 }
3111 NFC_SendData(NFC_RF_CONN_ID, p_msg);
3112 }
3113}