blob: b9842c27a6d914cfe50292e347dac93c39ecb7bf [file] [log] [blame]
nxpandroidc7611652015-09-23 16:42:05 +05301/******************************************************************************
2 *
3 * Copyright (C) 2010-2014 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18/******************************************************************************
19 *
nxf24591c1cbeab2018-02-21 17:32:26 +053020 * The original Work has been changed by NXP.
nxpandroidc7611652015-09-23 16:42:05 +053021 *
22 * Licensed under the Apache License, Version 2.0 (the "License");
23 * you may not use this file except in compliance with the License.
24 * You may obtain a copy of the License at
25 *
26 * http://www.apache.org/licenses/LICENSE-2.0
27 *
28 * Unless required by applicable law or agreed to in writing, software
29 * distributed under the License is distributed on an "AS IS" BASIS,
30 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31 * See the License for the specific language governing permissions and
32 * limitations under the License.
33 *
nxf24591c1cbeab2018-02-21 17:32:26 +053034 * Copyright 2018 NXP
35 *
nxpandroidc7611652015-09-23 16:42:05 +053036 ******************************************************************************/
37/******************************************************************************
38 *
39 * This file contains the action functions for device manager state
40 * machine.
41 *
42 ******************************************************************************/
43#include <string.h>
nxpandroidc7611652015-09-23 16:42:05 +053044
nxf24591c1cbeab2018-02-21 17:32:26 +053045#include <android-base/stringprintf.h>
46#include <base/logging.h>
47
48#include "nci_hmsgs.h"
49#include "nfa_api.h"
50#include "nfa_ce_int.h"
51#include "nfa_p2p_int.h"
52#include "nfa_rw_api.h"
53#include "nfa_rw_int.h"
54
55#if (NFC_NFCEE_INCLUDED == TRUE)
nxpandroidc7611652015-09-23 16:42:05 +053056#include "nfa_ee_int.h"
Ravishinde26233bb2018-08-06 22:16:08 +053057#include "nfc_int.h"
58#include "hal_nxpese.h"
nxpandroidc7611652015-09-23 16:42:05 +053059#endif
60
nxf24591c1cbeab2018-02-21 17:32:26 +053061#if (NFA_SNEP_INCLUDED == TRUE)
nxpandroidc7611652015-09-23 16:42:05 +053062#include "nfa_snep_int.h"
63#endif
64
nxf24591c1cbeab2018-02-21 17:32:26 +053065using android::base::StringPrintf;
66
67extern bool nfc_debug_enabled;
68
nxpandroid8f6d0532017-07-12 18:25:30 +053069/* This is the timeout value to guarantee disable is performed within reasonable
70 * amount of time */
nxpandroidc7611652015-09-23 16:42:05 +053071#ifndef NFA_DM_DISABLE_TIMEOUT_VAL
nxpandroid8f6d0532017-07-12 18:25:30 +053072#define NFA_DM_DISABLE_TIMEOUT_VAL 1000
nxpandroidc7611652015-09-23 16:42:05 +053073#endif
74
nxpandroid8f6d0532017-07-12 18:25:30 +053075static void nfa_dm_set_init_nci_params(void);
76static tNFA_STATUS nfa_dm_start_polling(void);
77static bool nfa_dm_deactivate_polling(void);
78static void nfa_dm_excl_disc_cback(tNFA_DM_RF_DISC_EVT event,
79 tNFC_DISCOVER* p_data);
80static void nfa_dm_poll_disc_cback(tNFA_DM_RF_DISC_EVT event,
81 tNFC_DISCOVER* p_data);
nxpandroidc7611652015-09-23 16:42:05 +053082
83/*******************************************************************************
84**
85** Function nfa_dm_module_init_cback
86**
87** Description Processing initialization complete event from sub-modules
88**
89** Returns None
90**
91*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053092static void nfa_dm_module_init_cback(void) {
93 tNFA_DM_CBACK_DATA dm_cback_data;
nxpandroidc7611652015-09-23 16:42:05 +053094
nxpandroid8f6d0532017-07-12 18:25:30 +053095 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_ENABLE_EVT_PEND;
nxpandroidc7611652015-09-23 16:42:05 +053096
nxpandroid8f6d0532017-07-12 18:25:30 +053097 /* All subsystem are initialized */
98 dm_cback_data.status = NFA_STATUS_OK;
99 (*nfa_dm_cb.p_dm_cback)(NFA_DM_ENABLE_EVT, &dm_cback_data);
nxpandroidc7611652015-09-23 16:42:05 +0530100}
101
102/*******************************************************************************
103**
104** Function nfa_dm_nfcc_power_mode_proc_complete_cback
105**
106** Description Processing complete of processing NFCC power state change
107** from all sub-modules
108**
109** Returns None
110**
111*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530112static void nfa_dm_nfcc_power_mode_proc_complete_cback(void) {
113 tNFA_DM_PWR_MODE_CHANGE power_mode_change;
nxpandroidc7611652015-09-23 16:42:05 +0530114
nxf24591c1cbeab2018-02-21 17:32:26 +0530115 DLOG_IF(INFO, nfc_debug_enabled)
116 << StringPrintf("nfcc_pwr_mode = 0x%x", nfa_dm_cb.nfcc_pwr_mode);
nxpandroidc7611652015-09-23 16:42:05 +0530117
nxpandroid8f6d0532017-07-12 18:25:30 +0530118 /* if NFCC power state is change to full power */
119 if (nfa_dm_cb.nfcc_pwr_mode != NFA_DM_PWR_MODE_OFF_SLEEP) {
120 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_NFCC_IS_RESTORING;
nxpandroidc7611652015-09-23 16:42:05 +0530121
nxpandroid8f6d0532017-07-12 18:25:30 +0530122 /* reconfigure BRCM NFCC */
123 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_CMD, NULL);
124 }
nxpandroidc7611652015-09-23 16:42:05 +0530125
nxpandroid8f6d0532017-07-12 18:25:30 +0530126 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SETTING_PWR_MODE;
nxpandroidc7611652015-09-23 16:42:05 +0530127
nxpandroid8f6d0532017-07-12 18:25:30 +0530128 power_mode_change.status = NFA_STATUS_OK;
129 power_mode_change.power_mode = nfa_dm_cb.nfcc_pwr_mode;
nxf24591c1cbeab2018-02-21 17:32:26 +0530130 tNFA_DM_CBACK_DATA nfa_dm_cback_data;
131 nfa_dm_cback_data.power_mode = power_mode_change;
132 (*nfa_dm_cb.p_dm_cback)(NFA_DM_PWR_MODE_CHANGE_EVT, &nfa_dm_cback_data);
nxpandroidc7611652015-09-23 16:42:05 +0530133}
134/*******************************************************************************
135**
136** Function nfa_dm_sys_enable
137**
138** Description This function on enable
139**
140** Returns void
141**
142*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530143void nfa_dm_sys_enable(void) { nfa_dm_set_init_nci_params(); }
nxpandroidc7611652015-09-23 16:42:05 +0530144
145/*******************************************************************************
146**
147** Function nfa_dm_set_init_nci_params
148**
149** Description Set initial NCI configuration parameters
150**
151** Returns void
152**
153*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530154static void nfa_dm_set_init_nci_params(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530155 uint8_t xx;
nxpandroidc7611652015-09-23 16:42:05 +0530156
nxpandroid8f6d0532017-07-12 18:25:30 +0530157 /* set NCI default value if other than zero */
nxpandroidc7611652015-09-23 16:42:05 +0530158
nxf24591c1cbeab2018-02-21 17:32:26 +0530159 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530160 /* Default Values: For each identifier
161 * Octet 0-1 = OxFF
162 * Octet 2 = Ox02
163 * Octet 3 = 0xFE
164 * Octet 4-9 = 0x00
165 * Octet 10-17 = 0xFF*/
nxf24591c1cbeab2018-02-21 17:32:26 +0530166 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) {
167 nfa_dm_cb.params.lf_t3t_id[xx][0] = 0xFF;
168 nfa_dm_cb.params.lf_t3t_id[xx][1] = 0xFF;
169 nfa_dm_cb.params.lf_t3t_id[xx][2] = 0x02;
170 nfa_dm_cb.params.lf_t3t_id[xx][3] = 0xFE;
nxpandroidc7611652015-09-23 16:42:05 +0530171 }
172
nxpandroid8f6d0532017-07-12 18:25:30 +0530173 /* LF_T3T_PMM value is added to LF_T3T_IDENTIFIERS_X in NCI2.0. */
nxf24591c1cbeab2018-02-21 17:32:26 +0530174 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) {
175 for (uint8_t yy = 10; yy < NCI_PARAM_LEN_LF_T3T_ID(NCI_VERSION_2_0); yy++)
176 nfa_dm_cb.params.lf_t3t_id[xx][yy] = 0xFF;
nxpandroid8f6d0532017-07-12 18:25:30 +0530177 }
178 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530179 /* LF_T3T_IDENTIFIERS_1/2/.../16 */
180 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) {
181 nfa_dm_cb.params.lf_t3t_id[xx][0] = 0xFF;
182 nfa_dm_cb.params.lf_t3t_id[xx][1] = 0xFF;
183 nfa_dm_cb.params.lf_t3t_id[xx][2] = 0x02;
184 nfa_dm_cb.params.lf_t3t_id[xx][3] = 0xFE;
185 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530186
nxf24591c1cbeab2018-02-21 17:32:26 +0530187 /* LF_T3T_PMM */
188 for (xx = 0; xx < NCI_PARAM_LEN_LF_T3T_PMM; xx++) {
189 nfa_dm_cb.params.lf_t3t_pmm[xx] = 0xFF;
190 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530191 }
nxpandroidc7611652015-09-23 16:42:05 +0530192
nxpandroid8f6d0532017-07-12 18:25:30 +0530193 /* LF_T3T_FLAGS:
194 ** DH needs to set this configuration, even if default value (not listening)
195 ** is used, to let NFCC know of intention (not listening) of DH.
196 */
nxpandroidc7611652015-09-23 16:42:05 +0530197
nxpandroid8f6d0532017-07-12 18:25:30 +0530198 /* FWI */
199 nfa_dm_cb.params.fwi[0] = 0x04;
nxpandroidc7611652015-09-23 16:42:05 +0530200
nxpandroid8f6d0532017-07-12 18:25:30 +0530201 /* WT */
202 nfa_dm_cb.params.wt[0] = 14;
nxpandroidc7611652015-09-23 16:42:05 +0530203
nxf24591c1cbeab2018-02-21 17:32:26 +0530204 /* Set CE default configuration */
nxpandroid8f6d0532017-07-12 18:25:30 +0530205 if (p_nfa_dm_ce_cfg[0]) {
206 nfa_dm_check_set_config(p_nfa_dm_ce_cfg[0], &p_nfa_dm_ce_cfg[1], false);
207 }
nxpandroidc7611652015-09-23 16:42:05 +0530208
nxpandroid8f6d0532017-07-12 18:25:30 +0530209 /* Set optional general default configuration */
210 if (p_nfa_dm_gen_cfg && p_nfa_dm_gen_cfg[0]) {
211 nfa_dm_check_set_config(p_nfa_dm_gen_cfg[0], &p_nfa_dm_gen_cfg[1], false);
212 }
nxpandroidc7611652015-09-23 16:42:05 +0530213
nxpandroid8f6d0532017-07-12 18:25:30 +0530214 if (p_nfa_dm_interface_mapping && nfa_dm_num_dm_interface_mapping) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530215 NFC_DiscoveryMap(nfa_dm_num_dm_interface_mapping,
216 p_nfa_dm_interface_mapping, NULL);
217 }
nxpandroidc7611652015-09-23 16:42:05 +0530218}
219
220/*******************************************************************************
221**
222** Function nfa_dm_proc_nfcc_power_mode
223**
224** Description Processing NFCC power mode changes
225**
226** Returns None
227**
228*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530229void nfa_dm_proc_nfcc_power_mode(uint8_t nfcc_power_mode) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530230 DLOG_IF(INFO, nfc_debug_enabled)
231 << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
nxpandroidc7611652015-09-23 16:42:05 +0530232
nxpandroid8f6d0532017-07-12 18:25:30 +0530233 /* if NFCC power mode is change to full power */
234 if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
235 memset(&nfa_dm_cb.params, 0x00, sizeof(tNFA_DM_PARAMS));
nxf24591c1cbeab2018-02-21 17:32:26 +0530236 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
237 "setcfg_pending_mask=0x%x, setcfg_pending_num=%d",
238 nfa_dm_cb.setcfg_pending_mask, nfa_dm_cb.setcfg_pending_num);
nxpandroid8f6d0532017-07-12 18:25:30 +0530239 nfa_dm_cb.setcfg_pending_mask = 0;
240 nfa_dm_cb.setcfg_pending_num = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530241
nxpandroid8f6d0532017-07-12 18:25:30 +0530242 nfa_dm_set_init_nci_params();
243 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POWER_OFF_SLEEP;
244 } else if (nfcc_power_mode == NFA_DM_PWR_MODE_OFF_SLEEP) {
245 nfa_dm_cb.flags |= NFA_DM_FLAGS_POWER_OFF_SLEEP;
246 }
nxpandroidc7611652015-09-23 16:42:05 +0530247
nxpandroid8f6d0532017-07-12 18:25:30 +0530248 nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_DM);
nxpandroidc7611652015-09-23 16:42:05 +0530249}
250
251/*******************************************************************************
252**
253** Function nfa_dm_disable_event
254**
255** Description report disable event
256**
257** Returns void
258**
259*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530260static void nfa_dm_disable_event(void) {
261 /* Deregister DM from sys */
262 nfa_sys_deregister(NFA_ID_DM);
nxpandroidc7611652015-09-23 16:42:05 +0530263
nxpandroid8f6d0532017-07-12 18:25:30 +0530264 /* Notify app */
265 nfa_dm_cb.flags &=
266 ~(NFA_DM_FLAGS_DM_IS_ACTIVE | NFA_DM_FLAGS_DM_DISABLING_NFC |
267 NFA_DM_FLAGS_ENABLE_EVT_PEND);
268 (*nfa_dm_cb.p_dm_cback)(NFA_DM_DISABLE_EVT, NULL);
nxpandroidc7611652015-09-23 16:42:05 +0530269}
270
271/*******************************************************************************
272**
273** Function nfa_dm_nfc_response_cback
274**
275** Description Call DM event hanlder with NFC response callback data
276**
277** Returns void
278**
279*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530280static void nfa_dm_nfc_response_cback(tNFC_RESPONSE_EVT event,
281 tNFC_RESPONSE* p_data) {
282 tNFA_DM_CBACK_DATA dm_cback_data;
nxpandroid8f6d0532017-07-12 18:25:30 +0530283 tNFA_CONN_EVT_DATA conn_evt;
284 uint8_t dm_cback_evt;
285 uint8_t max_ee = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530286
nxf24591c1cbeab2018-02-21 17:32:26 +0530287 DLOG_IF(INFO, nfc_debug_enabled)
288 << StringPrintf("%s(0x%x)", nfa_dm_nfc_revt_2_str(event).c_str(), event);
nxpandroidc7611652015-09-23 16:42:05 +0530289
nxpandroid8f6d0532017-07-12 18:25:30 +0530290 switch (event) {
291 case NFC_ENABLE_REVT: /* 0 Enable event */
nxf24591c1cbeab2018-02-21 17:32:26 +0530292
nxpandroid8f6d0532017-07-12 18:25:30 +0530293 /* NFC stack enabled. Enable nfa sub-systems */
294 if (p_data->enable.status == NFC_STATUS_OK) {
295 if (nfa_ee_max_ee_cfg != 0) {
296 if (nfa_dm_cb.get_max_ee) {
297 max_ee = nfa_dm_cb.get_max_ee();
298 if (max_ee) {
299 nfa_ee_max_ee_cfg = max_ee;
nxpandroidc7611652015-09-23 16:42:05 +0530300 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530301 }
nxpandroidc7611652015-09-23 16:42:05 +0530302 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530303 /* Initialize NFA subsystems */
304 nfa_sys_enable_subsystems();
305 } else if (nfa_dm_cb.flags & NFA_DM_FLAGS_ENABLE_EVT_PEND) {
306 /* Notify app */
307 nfa_dm_cb.flags &=
308 ~(NFA_DM_FLAGS_ENABLE_EVT_PEND | NFA_DM_FLAGS_DM_IS_ACTIVE);
309 dm_cback_data.status = p_data->enable.status;
310 (*nfa_dm_cb.p_dm_cback)(NFA_DM_ENABLE_EVT, &dm_cback_data);
311 }
312 break;
nxf24591c1cbeab2018-02-21 17:32:26 +0530313
nxpandroid8f6d0532017-07-12 18:25:30 +0530314 case NFC_DISABLE_REVT: /* 1 Disable event */
315 nfa_dm_disable_event();
316 break;
317
318 case NFC_SET_CONFIG_REVT: /* 2 Set Config Response */
319 /* If this setconfig was due to NFA_SetConfig, then notify the app */
320 /* lsb=whether last NCI_SET_CONFIG was due to NFA_SetConfig */
321 if (nfa_dm_cb.setcfg_pending_mask & 1) {
322 dm_cback_data.set_config.status = p_data->set_config.status;
323 dm_cback_data.set_config.num_param_id = p_data->set_config.num_param_id;
324 memcpy(dm_cback_data.set_config.param_ids, p_data->set_config.param_ids,
325 p_data->set_config.num_param_id);
326 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_CONFIG_EVT, &dm_cback_data);
327 }
328
329 /* Update the pending mask */
330 if (nfa_dm_cb.setcfg_pending_num > 0) {
331 nfa_dm_cb.setcfg_pending_mask >>= 1;
332 nfa_dm_cb.setcfg_pending_num--;
333 } else {
334 /* This should not occur (means we got a SET_CONFIG_NTF that's
335 * unaccounted for */
nxf24591c1cbeab2018-02-21 17:32:26 +0530336 LOG(ERROR) << StringPrintf(
337 "NFA received unexpected NFC_SET_CONFIG_REVT");
nxpandroid8f6d0532017-07-12 18:25:30 +0530338 }
339 break;
340
341 case NFC_GET_CONFIG_REVT: /* 3 Get Config Response */
342 if (p_data->get_config.status == NFC_STATUS_OK) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530343 tNFA_GET_CONFIG* p_nfa_get_confg = &dm_cback_data.get_config;
344 p_nfa_get_confg->status = NFA_STATUS_OK;
345 p_nfa_get_confg->tlv_size = p_data->get_config.tlv_size;
346 p_nfa_get_confg->param_tlvs = p_data->get_config.p_param_tlvs;
347 (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT, &dm_cback_data);
348 return;
nxpandroid8f6d0532017-07-12 18:25:30 +0530349 }
nxpandroidc7611652015-09-23 16:42:05 +0530350
nxpandroid8f6d0532017-07-12 18:25:30 +0530351 /* Return result of getconfig to the app */
352 dm_cback_data.get_config.status = NFA_STATUS_FAILED;
353 (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT, &dm_cback_data);
354 break;
nxpandroidc7611652015-09-23 16:42:05 +0530355
nxf24591c1cbeab2018-02-21 17:32:26 +0530356#if (NFC_NFCEE_INCLUDED == TRUE)
nxpandroid8f6d0532017-07-12 18:25:30 +0530357 case NFC_NFCEE_DISCOVER_REVT: /* NFCEE Discover response */
358 case NFC_NFCEE_INFO_REVT: /* NFCEE Discover Notification */
359 case NFC_EE_ACTION_REVT: /* EE Action notification */
360 case NFC_NFCEE_MODE_SET_REVT: /* NFCEE Mode Set response */
nxpandroid65a02602017-01-13 19:13:19 +0530361#if (NXP_EXTNS == TRUE)
nxf24591c1cbeab2018-02-21 17:32:26 +0530362 case NFC_NFCEE_PL_CONTROL_REVT:
nxf24591c84f9c02018-06-06 14:27:34 +0530363 case NFC_NFCEE_STATUS_REVT:
nxpandroid65a02602017-01-13 19:13:19 +0530364#endif
nxf24591c1cbeab2018-02-21 17:32:26 +0530365 case NFC_SET_ROUTING_REVT: /* Configure Routing response */
nxpandroid8f6d0532017-07-12 18:25:30 +0530366 nfa_ee_proc_evt(event, p_data);
367 break;
nxpandroidc7611652015-09-23 16:42:05 +0530368
nxpandroid8f6d0532017-07-12 18:25:30 +0530369 case NFC_EE_DISCOVER_REQ_REVT: /* EE Discover Req notification */
nxf2459148793b62018-06-06 14:40:49 +0530370#if(NXP_EXTNS != TRUE)
nxf24591c1cbeab2018-02-21 17:32:26 +0530371 if (nfa_dm_is_active() &&
372 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY)) {
373 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
374 }
nxf2459148793b62018-06-06 14:40:49 +0530375#endif
nxpandroid8f6d0532017-07-12 18:25:30 +0530376 nfa_ee_proc_evt(event, p_data);
377 break;
nxpandroidc7611652015-09-23 16:42:05 +0530378
nxf24591c1cbeab2018-02-21 17:32:26 +0530379 case NFC_GET_ROUTING_REVT: /* Retrieve Routing response */
380 break;
nxpandroidc7611652015-09-23 16:42:05 +0530381#endif
382
nxf24591c1cbeab2018-02-21 17:32:26 +0530383 case NFC_SET_POWER_SUB_STATE_REVT:
384 dm_cback_data.power_sub_state.status = p_data->status;
385 dm_cback_data.power_sub_state.power_state = nfa_dm_cb.power_state;
386 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_POWER_SUB_STATE_EVT, &dm_cback_data);
387 break;
388
nxpandroid8f6d0532017-07-12 18:25:30 +0530389 case NFC_RF_FIELD_REVT: /* RF Field information */
390 dm_cback_data.rf_field.status = NFA_STATUS_OK;
391 dm_cback_data.rf_field.rf_field_status = p_data->rf_field.rf_field;
392 (*nfa_dm_cb.p_dm_cback)(NFA_DM_RF_FIELD_EVT, &dm_cback_data);
nxpandroid8f6d0532017-07-12 18:25:30 +0530393 break;
nxpandroidc7611652015-09-23 16:42:05 +0530394
nxpandroid8f6d0532017-07-12 18:25:30 +0530395 case NFC_GEN_ERROR_REVT: /* generic error command or notification */
nxpandroid8f6d0532017-07-12 18:25:30 +0530396 break;
nxpandroidc7611652015-09-23 16:42:05 +0530397
nxpandroid8f6d0532017-07-12 18:25:30 +0530398 case NFC_NFCC_RESTART_REVT: /* NFCC has been re-initialized */
nxpandroidc7611652015-09-23 16:42:05 +0530399
nxpandroid8f6d0532017-07-12 18:25:30 +0530400 if (p_data->status == NFC_STATUS_OK) {
401 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_FULL;
402 nfa_dm_cb.flags |= NFA_DM_FLAGS_NFCC_IS_RESTORING;
nxpandroidc7611652015-09-23 16:42:05 +0530403
nxpandroid8f6d0532017-07-12 18:25:30 +0530404 /* NFCC will start from IDLE when turned on again */
405 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
406 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
407 nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
408 } else {
409 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP;
410 }
411 /* Notify NFA submodules change of NFCC power mode */
412 nfa_sys_cback_reg_nfcc_power_mode_proc_complete(
413 nfa_dm_nfcc_power_mode_proc_complete_cback);
414 nfa_sys_notify_nfcc_power_mode(nfa_dm_cb.nfcc_pwr_mode);
415 break;
nxpandroidc7611652015-09-23 16:42:05 +0530416
417 case NFC_NFCC_TIMEOUT_REVT:
nxpandroidc7611652015-09-23 16:42:05 +0530418 case NFC_NFCC_TRANSPORT_ERR_REVT:
nxf24591c1cbeab2018-02-21 17:32:26 +0530419 DLOG_IF(INFO, nfc_debug_enabled)
420 << StringPrintf("flags:0x%08x", nfa_dm_cb.flags);
nxpandroid8f6d0532017-07-12 18:25:30 +0530421 dm_cback_evt = (event == NFC_NFCC_TIMEOUT_REVT)
422 ? NFA_DM_NFCC_TIMEOUT_EVT
423 : NFA_DM_NFCC_TRANSPORT_ERR_EVT;
nxpandroid8f6d0532017-07-12 18:25:30 +0530424 (*nfa_dm_cb.p_dm_cback)(dm_cback_evt, NULL);
425 break;
nxpandroidc7611652015-09-23 16:42:05 +0530426
427 case NFC_NFCC_POWER_OFF_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530428 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP;
nxpandroidc7611652015-09-23 16:42:05 +0530429
nxpandroid8f6d0532017-07-12 18:25:30 +0530430 /* Notify NFA submodules change of NFCC power mode */
431 nfa_sys_cback_reg_nfcc_power_mode_proc_complete(
432 nfa_dm_nfcc_power_mode_proc_complete_cback);
433 nfa_sys_notify_nfcc_power_mode(NFA_DM_PWR_MODE_OFF_SLEEP);
434 break;
nxpandroidc7611652015-09-23 16:42:05 +0530435
436 case NFC_RF_COMM_PARAMS_UPDATE_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +0530437 conn_evt.status = p_data->status;
438 nfa_dm_conn_cback_event_notify(NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt);
439 break;
nxpandroidc7611652015-09-23 16:42:05 +0530440
441 default:
nxpandroid8f6d0532017-07-12 18:25:30 +0530442 break;
443 }
nxpandroidc7611652015-09-23 16:42:05 +0530444}
445
nxpandroidc7611652015-09-23 16:42:05 +0530446/*******************************************************************************
447**
448** Function nfa_dm_enable
449**
450** Description Initialises the NFC device manager
451**
nxf24591c1cbeab2018-02-21 17:32:26 +0530452** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530453**
454*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530455bool nfa_dm_enable(tNFA_DM_MSG* p_data) {
456 tNFA_DM_CBACK_DATA dm_cback_data;
nxf24591c1cbeab2018-02-21 17:32:26 +0530457 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530458
nxpandroid8f6d0532017-07-12 18:25:30 +0530459 /* Check if NFA is already enabled */
460 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_DM_IS_ACTIVE)) {
461 /* Initialize BRCM control block, it musb be called before setting any flags
462 */
463 nfa_dm_cb.flags |=
464 (NFA_DM_FLAGS_DM_IS_ACTIVE | NFA_DM_FLAGS_ENABLE_EVT_PEND);
465 nfa_sys_cback_reg_enable_complete(nfa_dm_module_init_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530466
nxpandroid8f6d0532017-07-12 18:25:30 +0530467 /* Store Enable parameters */
468 nfa_dm_cb.p_dm_cback = p_data->enable.p_dm_cback;
469 nfa_dm_cb.p_conn_cback = p_data->enable.p_conn_cback;
nxpandroidc7611652015-09-23 16:42:05 +0530470
nxpandroid8f6d0532017-07-12 18:25:30 +0530471 /* Enable NFC stack */
472 NFC_Enable(nfa_dm_nfc_response_cback);
473 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530474 LOG(ERROR) << StringPrintf("nfa_dm_enable: ERROR ALREADY ENABLED.");
nxpandroid8f6d0532017-07-12 18:25:30 +0530475 dm_cback_data.status = NFA_STATUS_ALREADY_STARTED;
476 (*(p_data->enable.p_dm_cback))(NFA_DM_ENABLE_EVT, &dm_cback_data);
477 }
nxpandroidc7611652015-09-23 16:42:05 +0530478
nxf24591c1cbeab2018-02-21 17:32:26 +0530479 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530480}
nxf24591c1cbeab2018-02-21 17:32:26 +0530481
nxpandroidc7611652015-09-23 16:42:05 +0530482/*******************************************************************************
483**
484** Function nfa_dm_disable
485**
486** Description Disables the NFC device manager
487**
nxf24591c1cbeab2018-02-21 17:32:26 +0530488** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530489**
490*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530491bool nfa_dm_disable(tNFA_DM_MSG* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530492 DLOG_IF(INFO, nfc_debug_enabled)
493 << StringPrintf("graceful:%d", p_data->disable.graceful);
nxpandroidc7611652015-09-23 16:42:05 +0530494
nxpandroid8f6d0532017-07-12 18:25:30 +0530495 if (p_data->disable.graceful) {
496 /* if RF discovery is enabled */
497 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) {
498 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;
nxpandroidc7611652015-09-23 16:42:05 +0530499
nxpandroid8f6d0532017-07-12 18:25:30 +0530500 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) {
501 /* if waiting RSP in idle state */
502 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
503 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING;
nxpandroidc7611652015-09-23 16:42:05 +0530504 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530505 } else {
506 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING;
nxf24591c1cbeab2018-02-21 17:32:26 +0530507 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
508 nfa_dm_rf_disc_data.deactivate_type = NFA_DEACTIVATE_TYPE_IDLE;
509
510 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
nxpandroid8f6d0532017-07-12 18:25:30 +0530511 if ((nfa_dm_cb.disc_cb.disc_flags &
512 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF)) == 0) {
513 /* not waiting to deactivate, clear the flag now */
514 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
515 }
516 }
nxpandroidc7611652015-09-23 16:42:05 +0530517 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530518 /* Start timeout for graceful shutdown. If timer expires, then force an
519 * ungraceful shutdown */
520 nfa_sys_start_timer(&nfa_dm_cb.tle, NFA_DM_TIMEOUT_DISABLE_EVT,
521 NFA_DM_DISABLE_TIMEOUT_VAL);
522 }
nxpandroidc7611652015-09-23 16:42:05 +0530523
nxpandroid8f6d0532017-07-12 18:25:30 +0530524 /* Disable all subsystems other than DM (DM will be disabled after all */
525 /* the other subsystem have been disabled) */
526 nfa_sys_disable_subsystems(p_data->disable.graceful);
nxf24591c1cbeab2018-02-21 17:32:26 +0530527 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530528}
529
nxpandroidc7611652015-09-23 16:42:05 +0530530/*******************************************************************************
531**
532** Function nfa_dm_disable_complete
533**
534** Description Called when all NFA subsytems are disabled.
535**
536** NFC core stack can now be disabled.
537**
538** Returns void
539**
540*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530541void nfa_dm_disable_complete(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530542 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530543
nxpandroid8f6d0532017-07-12 18:25:30 +0530544 if ((nfa_dm_cb.flags & NFA_DM_FLAGS_DM_DISABLING_NFC) == 0) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530545 DLOG_IF(INFO, nfc_debug_enabled)
546 << StringPrintf("proceeding with nfc core shutdown.");
nxpandroidc7611652015-09-23 16:42:05 +0530547
nxpandroid8f6d0532017-07-12 18:25:30 +0530548 nfa_dm_cb.flags |= NFA_DM_FLAGS_DM_DISABLING_NFC;
nxpandroidc7611652015-09-23 16:42:05 +0530549
nxpandroid8f6d0532017-07-12 18:25:30 +0530550 nfa_sys_stop_timer(&nfa_dm_cb.tle);
nxpandroidc7611652015-09-23 16:42:05 +0530551
nxpandroid8f6d0532017-07-12 18:25:30 +0530552 /* Free all buffers for NDEF handlers */
553 nfa_dm_ndef_dereg_all();
nxpandroidc7611652015-09-23 16:42:05 +0530554
nxpandroid8f6d0532017-07-12 18:25:30 +0530555 /* Disable nfc core stack */
556 NFC_Disable();
557 }
nxpandroidc7611652015-09-23 16:42:05 +0530558}
559
560/*******************************************************************************
561**
562** Function nfa_dm_set_config
563**
564** Description Process set config command
565**
nxf24591c1cbeab2018-02-21 17:32:26 +0530566** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530567**
568*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530569bool nfa_dm_set_config(tNFA_DM_MSG* p_data) {
570 tNFC_STATUS status;
571 uint8_t buff[255];
572 uint8_t* p = buff;
nxpandroidc7611652015-09-23 16:42:05 +0530573
nxpandroid8f6d0532017-07-12 18:25:30 +0530574 tNFA_DM_CBACK_DATA dm_cback_data;
nxpandroidc7611652015-09-23 16:42:05 +0530575
nxpandroid8f6d0532017-07-12 18:25:30 +0530576 if (p_data->setconfig.length + 2 > 255) {
577 /* Total length of TLV must be less than 256 (1 byte) */
578 status = NFC_STATUS_FAILED;
579 } else {
580 UINT8_TO_STREAM(p, p_data->setconfig.param_id);
581 UINT8_TO_STREAM(p, p_data->setconfig.length);
582 ARRAY_TO_STREAM(p, p_data->setconfig.p_data, p_data->setconfig.length)
583 status = nfa_dm_check_set_config((uint8_t)(p_data->setconfig.length + 2),
584 buff, true);
585 }
nxpandroidc7611652015-09-23 16:42:05 +0530586
nxpandroid8f6d0532017-07-12 18:25:30 +0530587 if (status != NFC_STATUS_OK) {
588 dm_cback_data.set_config.status = NFA_STATUS_INVALID_PARAM;
589 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_CONFIG_EVT, &dm_cback_data);
590 }
nxpandroidc7611652015-09-23 16:42:05 +0530591
nxf24591c1cbeab2018-02-21 17:32:26 +0530592 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530593}
594
595/*******************************************************************************
596**
597** Function nfa_dm_get_config
598**
599** Description Process get config command
600**
nxf24591c1cbeab2018-02-21 17:32:26 +0530601** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530602**
603*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530604bool nfa_dm_get_config(tNFA_DM_MSG* p_data) {
605 NFC_GetConfig(p_data->getconfig.num_ids, p_data->getconfig.p_pmids);
nxpandroidc7611652015-09-23 16:42:05 +0530606
nxf24591c1cbeab2018-02-21 17:32:26 +0530607 return true;
608}
609/*******************************************************************************
610**
611** Function nfa_dm_set_power_sub_state
612**
613** Description Process the power sub state command
614**
615** Returns TRUE (message buffer to be freed by caller)
616**
617*******************************************************************************/
618bool nfa_dm_set_power_sub_state(tNFA_DM_MSG* p_data) {
619 tNFC_STATUS status;
620 tNFA_DM_CBACK_DATA dm_cback_data;
621
622 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
623
624 nfa_dm_cb.power_state = p_data->set_power_state.screen_state;
625 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) {
626 DLOG_IF(INFO, nfc_debug_enabled)
627 << StringPrintf("NFA_DM_RFST_LISTEN_ACTIVE");
628 /* NFCC will give semantic error for power sub state command in Rf listen
629 * active state */
nxf245911fec7142018-06-06 14:29:48 +0530630#if (NXP_EXTNS == TRUE)
631 nfa_dm_cb.nfa_pending_power_state = nfa_dm_cb.power_state;
632#endif
nxf24591c1cbeab2018-02-21 17:32:26 +0530633 status = NFC_STATUS_SEMANTIC_ERROR;
634 } else {
635 status = NFC_SetPowerSubState(p_data->set_power_state.screen_state);
636 }
637
638 if (status != NFC_STATUS_OK) {
639 dm_cback_data.power_sub_state.status = NFC_STATUS_FAILED;
640 dm_cback_data.power_sub_state.power_state = nfa_dm_cb.power_state;
641 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_POWER_SUB_STATE_EVT, &dm_cback_data);
642 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530643 return (true);
nxpandroidc7611652015-09-23 16:42:05 +0530644}
nxpandroidc7611652015-09-23 16:42:05 +0530645/*******************************************************************************
646**
647** Function nfa_dm_conn_cback_event_notify
648**
649** Description Notify application of CONN_CBACK event, using appropriate
650** callback
651**
652** Returns nothing
653**
654*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530655void nfa_dm_conn_cback_event_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data) {
656 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) {
657 /* Use exclusive RF mode callback */
658 if (nfa_dm_cb.p_excl_conn_cback)
659 (*nfa_dm_cb.p_excl_conn_cback)(event, p_data);
660 } else {
661 (*nfa_dm_cb.p_conn_cback)(event, p_data);
662 }
nxpandroidc7611652015-09-23 16:42:05 +0530663}
664
665/*******************************************************************************
666**
667** Function nfa_dm_rel_excl_rf_control_and_notify
668**
669** Description Stop exclusive RF control and notify app of
670** NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT
671**
672** Returns void
673**
674*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530675void nfa_dm_rel_excl_rf_control_and_notify(void) {
676 tNFA_CONN_EVT_DATA conn_evt;
nxpandroidc7611652015-09-23 16:42:05 +0530677
nxf24591c1cbeab2018-02-21 17:32:26 +0530678 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530679
nxpandroid8f6d0532017-07-12 18:25:30 +0530680 /* Exclusive RF control stopped. Notify app */
681 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_EXCL_RF_ACTIVE;
nxpandroidc7611652015-09-23 16:42:05 +0530682
nxpandroid8f6d0532017-07-12 18:25:30 +0530683 /* Stop exclusive RF discovery for exclusive RF mode */
684 nfa_dm_stop_excl_discovery();
nxpandroidc7611652015-09-23 16:42:05 +0530685
nxpandroid8f6d0532017-07-12 18:25:30 +0530686 /* Notify app that exclusive RF control has stopped */
687 conn_evt.status = NFA_STATUS_OK;
688 (*nfa_dm_cb.p_excl_conn_cback)(NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT,
689 &conn_evt);
690 nfa_dm_cb.p_excl_conn_cback = NULL;
691 nfa_dm_cb.p_excl_ndef_cback = NULL;
nxpandroidc7611652015-09-23 16:42:05 +0530692}
693
694/*******************************************************************************
695**
696** Function nfa_dm_act_request_excl_rf_ctrl
697**
698** Description Request exclusive RF control
699**
nxf24591c1cbeab2018-02-21 17:32:26 +0530700** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530701**
702*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530703bool nfa_dm_act_request_excl_rf_ctrl(tNFA_DM_MSG* p_data) {
704 tNFA_CONN_EVT_DATA conn_evt;
nxpandroidc7611652015-09-23 16:42:05 +0530705
nxf24591c1cbeab2018-02-21 17:32:26 +0530706 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530707
nxpandroid8f6d0532017-07-12 18:25:30 +0530708 if (!nfa_dm_cb.p_excl_conn_cback) {
709 if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE) {
710 conn_evt.status = NFA_STATUS_FAILED;
711 (*p_data->req_excl_rf_ctrl.p_conn_cback)(
712 NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt);
713 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530714 }
715
nxpandroid8f6d0532017-07-12 18:25:30 +0530716 /* Store callbacks */
717 nfa_dm_cb.p_excl_conn_cback = p_data->req_excl_rf_ctrl.p_conn_cback;
718 nfa_dm_cb.p_excl_ndef_cback = p_data->req_excl_rf_ctrl.p_ndef_cback;
719
720 nfa_dm_cb.flags |= NFA_DM_FLAGS_EXCL_RF_ACTIVE;
721
722 /* start exclusive RF discovery */
723 nfa_dm_start_excl_discovery(p_data->req_excl_rf_ctrl.poll_mask,
724 &p_data->req_excl_rf_ctrl.listen_cfg,
725 nfa_dm_excl_disc_cback);
726 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +0530727 LOG(ERROR) << StringPrintf("Exclusive rf control already requested");
nxpandroid8f6d0532017-07-12 18:25:30 +0530728
729 conn_evt.status = NFA_STATUS_FAILED;
730 (*p_data->req_excl_rf_ctrl.p_conn_cback)(
731 NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt);
732 }
733
734 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530735}
736
nxpandroidc7611652015-09-23 16:42:05 +0530737/*******************************************************************************
738**
739** Function nfa_dm_act_release_excl_rf_ctrl
740**
741** Description Release exclusive RF control
742**
nxf24591c1cbeab2018-02-21 17:32:26 +0530743** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530744**
745*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530746bool nfa_dm_act_release_excl_rf_ctrl(__attribute__((unused))
747 tNFA_DM_MSG* p_data) {
748 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530749
nxpandroid8f6d0532017-07-12 18:25:30 +0530750 /* nfa_dm_rel_excl_rf_control_and_notify() is called when discovery state goes
751 * IDLE */
752 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;
nxpandroidc7611652015-09-23 16:42:05 +0530753
nxpandroid8f6d0532017-07-12 18:25:30 +0530754 /* if discover command has been sent in IDLE state and waiting for response
755 ** then just wait for responose. Otherwise initiate deactivating.
756 */
757 if (!((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) &&
758 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))) {
759 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
760 }
nxpandroidc7611652015-09-23 16:42:05 +0530761
nxpandroid8f6d0532017-07-12 18:25:30 +0530762 if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
763 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
nxpandroidc7611652015-09-23 16:42:05 +0530764
nxpandroid8f6d0532017-07-12 18:25:30 +0530765 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530766}
767
768/*******************************************************************************
769**
770** Function nfa_dm_act_deactivate
771**
772** Description Process deactivate command
773**
nxf24591c1cbeab2018-02-21 17:32:26 +0530774** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530775**
776*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530777bool nfa_dm_act_deactivate(tNFA_DM_MSG* p_data) {
778 tNFA_CONN_EVT_DATA conn_evt;
779 tNFA_DEACTIVATE_TYPE deact_type;
nxpandroidc7611652015-09-23 16:42:05 +0530780
nxf24591c1cbeab2018-02-21 17:32:26 +0530781 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530782
nxpandroid8f6d0532017-07-12 18:25:30 +0530783 /* Always allow deactivate to IDLE */
784 /* Do not allow deactivate to SLEEP for T1T,NFCDEP, ISO15693 */
nxf24591c1cbeab2018-02-21 17:32:26 +0530785 if (p_data->deactivate.sleep_mode == false ||
786 (nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_T1T &&
787 (nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_NFC_DEP ||
788 appl_dta_mode_flag) &&
789 nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_T5T &&
790 nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO)) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530791 deact_type = NFA_DEACTIVATE_TYPE_DISCOVERY;
792 if (p_data->deactivate.sleep_mode) {
793 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) {
794 /* Deactivate to sleep mode not allowed in this state. */
795 deact_type = NFA_DEACTIVATE_TYPE_IDLE;
nxf24591c1cbeab2018-02-21 17:32:26 +0530796 } else if (appl_dta_mode_flag == true &&
797 (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_LISTEN_SLEEP ||
798 nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530799 deact_type = NFA_DEACTIVATE_TYPE_SLEEP;
nxf24591c1cbeab2018-02-21 17:32:26 +0530800 } else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_LISTEN_SLEEP) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530801 deact_type = NFA_DEACTIVATE_TYPE_SLEEP;
802 }
803 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530804 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530805 /* Only deactivate to IDLE is allowed in this state. */
806 deact_type = NFA_DEACTIVATE_TYPE_IDLE;
nxpandroidc7611652015-09-23 16:42:05 +0530807 }
808
nxpandroid8f6d0532017-07-12 18:25:30 +0530809 if ((nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP) &&
nxf24591c1cbeab2018-02-21 17:32:26 +0530810 ((nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) == 0x00) &&
811 appl_dta_mode_flag != true) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530812 /* Exclusive RF control doesn't use NFA P2P */
813 /* NFA P2P will deactivate NFC link after deactivating LLCP link */
814 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED)) {
815 nfa_p2p_deactivate_llcp();
816 } else {
817 nfa_dm_rf_deactivate(deact_type);
818 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530819 return true;
nxpandroid8f6d0532017-07-12 18:25:30 +0530820 } else {
821 if (nfa_dm_rf_deactivate(deact_type) == NFA_STATUS_OK) {
822 if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
823 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
824 nfa_rw_stop_presence_check_timer();
nxf24591c1cbeab2018-02-21 17:32:26 +0530825 return true;
nxpandroid8f6d0532017-07-12 18:25:30 +0530826 }
827 }
828 }
nxpandroidc7611652015-09-23 16:42:05 +0530829
nxf24591c1cbeab2018-02-21 17:32:26 +0530830 LOG(ERROR) << StringPrintf("invalid protocol, mode or state");
nxpandroidc7611652015-09-23 16:42:05 +0530831
nxpandroid8f6d0532017-07-12 18:25:30 +0530832 /* Notify error to application */
833 conn_evt.status = NFA_STATUS_FAILED;
834 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATE_FAIL_EVT, &conn_evt);
835
nxf24591c1cbeab2018-02-21 17:32:26 +0530836 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530837}
838
839/*******************************************************************************
840**
841** Function nfa_dm_act_power_off_sleep
842**
843** Description Process power off sleep mode request
844**
nxf24591c1cbeab2018-02-21 17:32:26 +0530845** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530846**
847*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530848bool nfa_dm_act_power_off_sleep(tNFA_DM_MSG* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530849 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530850
nxpandroid8f6d0532017-07-12 18:25:30 +0530851 NFC_SetPowerOffSleep((bool)(p_data->hdr.layer_specific));
nxpandroidc7611652015-09-23 16:42:05 +0530852
nxf24591c1cbeab2018-02-21 17:32:26 +0530853 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530854}
855
856/*******************************************************************************
857**
858** Function nfa_dm_act_reg_vsc
859**
860** Description Process registers VSC callback
861**
nxf24591c1cbeab2018-02-21 17:32:26 +0530862** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530863**
864*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530865bool nfa_dm_act_reg_vsc(tNFA_DM_MSG* p_data) {
866 if (NFC_RegVSCback(p_data->reg_vsc.is_register, p_data->reg_vsc.p_cback) !=
867 NFC_STATUS_OK) {
nxf24591c1cbeab2018-02-21 17:32:26 +0530868 LOG(ERROR) << StringPrintf("NFC_RegVSCback failed");
nxpandroid8f6d0532017-07-12 18:25:30 +0530869 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530870 return true;
nxpandroidc7611652015-09-23 16:42:05 +0530871}
872
873/*******************************************************************************
874**
875** Function nfa_dm_act_send_vsc
876**
nxpandroid8f6d0532017-07-12 18:25:30 +0530877** Description Send the NCI Vendor Specific command to the NCI command
878** queue
nxpandroidc7611652015-09-23 16:42:05 +0530879**
nxf24591c1cbeab2018-02-21 17:32:26 +0530880** Returns FALSE (message buffer is NOT freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530881**
882*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530883bool nfa_dm_act_send_vsc(tNFA_DM_MSG* p_data) {
884 NFC_HDR* p_cmd = (NFC_HDR*)p_data;
nxpandroidc7611652015-09-23 16:42:05 +0530885
nxpandroid8f6d0532017-07-12 18:25:30 +0530886 p_cmd->offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
887 p_cmd->len = p_data->send_vsc.cmd_params_len;
888 NFC_SendVsCommand(p_data->send_vsc.oid, p_cmd, p_data->send_vsc.p_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530889
nxf24591c1cbeab2018-02-21 17:32:26 +0530890 /* Most dm action functions return TRUE, so nfa-sys frees the GKI buffer
891 * carrying the message, This action function re-use the GKI buffer to
892 * send the VSC, so the GKI buffer can not be freed by nfa-sys */
893
894 return false;
nxpandroidc7611652015-09-23 16:42:05 +0530895}
896
nxpandroidc7611652015-09-23 16:42:05 +0530897/*******************************************************************************
898**
nxf24591c1cbeab2018-02-21 17:32:26 +0530899** Function nfa_dm_act_send_raw_vs
nxpandroidc7611652015-09-23 16:42:05 +0530900**
nxf24591c1cbeab2018-02-21 17:32:26 +0530901** Description Send the raw vs command to the NCI command queue
nxpandroidc7611652015-09-23 16:42:05 +0530902**
nxf24591c1cbeab2018-02-21 17:32:26 +0530903** Returns FALSE (message buffer is NOT freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530904**
905*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +0530906bool nfa_dm_act_send_raw_vs(tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +0530907 NFC_HDR* p_cmd = (NFC_HDR*)p_data;
nxpandroidc7611652015-09-23 16:42:05 +0530908
nxpandroid8f6d0532017-07-12 18:25:30 +0530909 p_cmd->offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
910 p_cmd->len = p_data->send_vsc.cmd_params_len;
nxf24591c1cbeab2018-02-21 17:32:26 +0530911 NFC_SendRawVsCommand(p_cmd, p_data->send_vsc.p_cback);
nxpandroidc7611652015-09-23 16:42:05 +0530912
nxf24591c1cbeab2018-02-21 17:32:26 +0530913 /* Most dm action functions return TRUE, so nfa-sys frees the GKI buffer
nxpandroid8f6d0532017-07-12 18:25:30 +0530914 * carrying the message,
915 * This action function re-use the GKI buffer to send the VSC, so the GKI
916 * buffer can not be freed by nfa-sys */
nxf24591c1cbeab2018-02-21 17:32:26 +0530917 return false;
nxpandroidc7611652015-09-23 16:42:05 +0530918}
nxf24591c1cbeab2018-02-21 17:32:26 +0530919
nxpandroidc7611652015-09-23 16:42:05 +0530920/*******************************************************************************
921**
922** Function nfa_dm_start_polling
923**
924** Description Start polling
925**
926** Returns tNFA_STATUS
927**
928*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530929tNFA_STATUS nfa_dm_start_polling(void) {
930 tNFA_STATUS status;
931 tNFA_TECHNOLOGY_MASK poll_tech_mask;
932 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
nxpandroidc7611652015-09-23 16:42:05 +0530933
nxf24591c1cbeab2018-02-21 17:32:26 +0530934 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +0530935
nxpandroid8f6d0532017-07-12 18:25:30 +0530936 poll_tech_mask = nfa_dm_cb.poll_mask;
nxpandroidc7611652015-09-23 16:42:05 +0530937
nxpandroid8f6d0532017-07-12 18:25:30 +0530938 /* start RF discovery with discovery callback */
939 if (nfa_dm_cb.poll_disc_handle == NFA_HANDLE_INVALID) {
940 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) {
941 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
942 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
943 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
944 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
945 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
946 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530947 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
948 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE) {
949 poll_disc_mask |= NFA_DM_DISC_MASK_PACM_NFC_DEP;
950 }
951 } else {
952 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) {
953 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
954 }
955 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) {
956 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
957 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530958 }
959 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) {
960 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
nxpandroidc7611652015-09-23 16:42:05 +0530961 }
nxpandroid8f6d0532017-07-12 18:25:30 +0530962 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) {
963 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
964 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
965 }
nxf24591c1cbeab2018-02-21 17:32:26 +0530966 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_V) {
967 poll_disc_mask |= NFA_DM_DISC_MASK_P_T5T;
nxpandroid8f6d0532017-07-12 18:25:30 +0530968 }
969 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) {
970 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
971 }
972 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) {
973 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
974 }
975
976 nfa_dm_cb.poll_disc_handle = nfa_dm_add_rf_discover(
977 poll_disc_mask, NFA_DM_DISC_HOST_ID_DH, nfa_dm_poll_disc_cback);
978
979 if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID)
980 status = NFA_STATUS_OK;
nxpandroidc7611652015-09-23 16:42:05 +0530981 else
nxpandroid8f6d0532017-07-12 18:25:30 +0530982 status = NFA_STATUS_FAILED;
983 } else {
984 status = NFA_STATUS_OK;
985 }
nxpandroidc7611652015-09-23 16:42:05 +0530986
nxpandroid8f6d0532017-07-12 18:25:30 +0530987 return (status);
nxpandroidc7611652015-09-23 16:42:05 +0530988}
989
990/*******************************************************************************
991**
992** Function nfa_dm_act_enable_polling
993**
994** Description Process enable polling command
995**
nxf24591c1cbeab2018-02-21 17:32:26 +0530996** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +0530997**
998*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +0530999bool nfa_dm_act_enable_polling(tNFA_DM_MSG* p_data) {
1000 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301001
nxf24591c1cbeab2018-02-21 17:32:26 +05301002 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301003
nxpandroid8f6d0532017-07-12 18:25:30 +05301004 if ((!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED)) &&
1005 (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE))) {
1006 nfa_dm_cb.poll_mask = p_data->enable_poll.poll_mask;
nxpandroidc7611652015-09-23 16:42:05 +05301007
nxpandroid8f6d0532017-07-12 18:25:30 +05301008 if (nfa_dm_start_polling() == NFA_STATUS_OK) {
1009 nfa_dm_cb.flags |= NFA_DM_FLAGS_POLLING_ENABLED;
nxpandroidc7611652015-09-23 16:42:05 +05301010
nxpandroid8f6d0532017-07-12 18:25:30 +05301011 evt_data.status = NFA_STATUS_OK;
1012 nfa_dm_conn_cback_event_notify(NFA_POLL_ENABLED_EVT, &evt_data);
nxf24591c1cbeab2018-02-21 17:32:26 +05301013 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301014 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301015 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05301016 LOG(ERROR) << StringPrintf("already started");
nxpandroid8f6d0532017-07-12 18:25:30 +05301017 }
nxpandroidc7611652015-09-23 16:42:05 +05301018
nxpandroid8f6d0532017-07-12 18:25:30 +05301019 /* send NFA_POLL_ENABLED_EVT with NFA_STATUS_FAILED */
1020 evt_data.status = NFA_STATUS_FAILED;
1021 nfa_dm_conn_cback_event_notify(NFA_POLL_ENABLED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301022
nxf24591c1cbeab2018-02-21 17:32:26 +05301023 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301024}
1025
1026/*******************************************************************************
1027**
1028** Function nfa_dm_deactivate_polling
1029**
1030** Description Deactivate any polling state
1031**
nxf24591c1cbeab2018-02-21 17:32:26 +05301032** Returns TRUE if need to wait for deactivation
nxpandroidc7611652015-09-23 16:42:05 +05301033**
1034*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301035static bool nfa_dm_deactivate_polling(void) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301036 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301037
nxpandroid8f6d0532017-07-12 18:25:30 +05301038 if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES) ||
1039 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)) {
1040 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
1041 return false;
1042 } else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) {
1043 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) {
1044 /* NFA P2P will deactivate NFC link after deactivating LLCP link */
1045 nfa_p2p_deactivate_llcp();
1046 } else {
1047 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
nxpandroidc7611652015-09-23 16:42:05 +05301048 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301049 return true;
1050 } else {
1051 return false;
1052 }
nxpandroidc7611652015-09-23 16:42:05 +05301053}
1054
1055/*******************************************************************************
1056**
1057** Function nfa_dm_act_disable_polling
1058**
1059** Description Process disable polling command
1060**
nxf24591c1cbeab2018-02-21 17:32:26 +05301061** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301062**
1063*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301064bool nfa_dm_act_disable_polling(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301065 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301066
nxf24591c1cbeab2018-02-21 17:32:26 +05301067 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301068
nxpandroid8f6d0532017-07-12 18:25:30 +05301069 if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID) {
1070 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POLLING_ENABLED;
nxpandroidc7611652015-09-23 16:42:05 +05301071
nxpandroid8f6d0532017-07-12 18:25:30 +05301072 if (nfa_dm_deactivate_polling() == false) {
1073 nfa_dm_delete_rf_discover(nfa_dm_cb.poll_disc_handle);
1074 nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;
nxpandroidc7611652015-09-23 16:42:05 +05301075
nxpandroid8f6d0532017-07-12 18:25:30 +05301076 evt_data.status = NFA_STATUS_OK;
1077 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data);
1078 } else {
1079 nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_POLL_STOP_EVT;
nxpandroidc7611652015-09-23 16:42:05 +05301080 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301081 } else {
1082 evt_data.status = NFA_STATUS_FAILED;
1083 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data);
1084 }
nxpandroidc7611652015-09-23 16:42:05 +05301085
nxf24591c1cbeab2018-02-21 17:32:26 +05301086 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301087}
1088
1089/*******************************************************************************
1090**
1091** Function nfa_dm_act_enable_listening
1092**
1093** Description Process enable listening command
1094**
nxf24591c1cbeab2018-02-21 17:32:26 +05301095** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301096**
1097*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301098bool nfa_dm_act_enable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301099 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301100
nxf24591c1cbeab2018-02-21 17:32:26 +05301101 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301102
nxpandroid5e589782017-08-14 11:54:50 +05301103 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_LISTEN_DISABLED;
nxpandroid8f6d0532017-07-12 18:25:30 +05301104 evt_data.status = NFA_STATUS_OK;
1105 nfa_dm_conn_cback_event_notify(NFA_LISTEN_ENABLED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301106
nxf24591c1cbeab2018-02-21 17:32:26 +05301107 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301108}
1109
1110/*******************************************************************************
1111**
1112** Function nfa_dm_act_disable_listening
1113**
1114** Description Process disable listening command
1115**
nxf24591c1cbeab2018-02-21 17:32:26 +05301116** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301117**
1118*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301119bool nfa_dm_act_disable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301120 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301121
nxf24591c1cbeab2018-02-21 17:32:26 +05301122 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301123
nxpandroid8f6d0532017-07-12 18:25:30 +05301124 nfa_dm_cb.flags |= NFA_DM_FLAGS_LISTEN_DISABLED;
1125 evt_data.status = NFA_STATUS_OK;
1126 nfa_dm_conn_cback_event_notify(NFA_LISTEN_DISABLED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301127
nxf24591c1cbeab2018-02-21 17:32:26 +05301128 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301129}
Ayushdf7ad672018-07-30 12:02:58 +05301130#if (NXP_EXTNS == TRUE)
1131/*******************************************************************************
1132**
1133** Function nfa_dm_act_change_discovery_tech
1134**
1135** Description Process change listening command
1136**
1137** Returns true (message buffer to be freed by caller)
1138**
1139*******************************************************************************/
1140bool nfa_dm_act_change_discovery_tech (tNFA_DM_MSG *p_data)
1141{
1142 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301143
Ayushdf7ad672018-07-30 12:02:58 +05301144 DLOG_IF(INFO, nfc_debug_enabled)
1145 << StringPrintf ("nfa_dm_act_change_discovery_tech ()");
1146
1147 if(p_data->change_discovery_tech.listenTech == 0xFF && p_data->change_discovery_tech.pollTech == 0xFF)
1148 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_DISCOVERY_TECH_CHANGED;
1149 else
1150 nfa_dm_cb.flags |= NFA_DM_FLAGS_DISCOVERY_TECH_CHANGED;
1151
1152 nfa_dm_cb.pollTech = p_data->change_discovery_tech.pollTech;
1153 nfa_dm_cb.listenTech = p_data->change_discovery_tech.listenTech;
1154 evt_data.status = NFA_STATUS_OK;
1155 nfa_dm_conn_cback_event_notify (NFA_LISTEN_ENABLED_EVT, &evt_data);
1156
1157 return (true);
1158}
Ravishinde26233bb2018-08-06 22:16:08 +05301159
1160/*******************************************************************************
1161**
1162** Function nfa_dm_set_transit_config
1163**
1164** Description Sends transit configuration NFC Hal
1165**
1166** Returns true (message buffer to be freed by caller)
1167**
1168*******************************************************************************/
1169bool nfa_dm_set_transit_config(tNFA_DM_MSG* p_data) {
1170 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", __func__);
1171 nfc_nci_IoctlInOutData_t inpOutData;
1172 tNFA_DM_CBACK_DATA dm_cback_data;
1173 dm_cback_data.set_transit_config.status = NFA_STATUS_OK;
1174
1175 inpOutData.inp.data.transitConfig.val =
1176 p_data->transit_config.transitConfig;
1177 inpOutData.inp.data.transitConfig.len =
1178 strlen(p_data->transit_config.transitConfig);
1179 nfc_cb.p_hal->ioctl(HAL_NFC_IOCTL_SET_TRANSIT_CONFIG, (void*)&inpOutData);
1180 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_TRANSIT_CONFIG_EVT, &dm_cback_data);
1181
1182 return true;
1183}
Ayushdf7ad672018-07-30 12:02:58 +05301184#endif
nxpandroid3e4012e2016-08-01 19:09:55 +05301185/*******************************************************************************
1186**
nxpandroidc7611652015-09-23 16:42:05 +05301187** Function nfa_dm_act_pause_p2p
1188**
1189** Description Process Pause P2P command
1190**
nxf24591c1cbeab2018-02-21 17:32:26 +05301191** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301192**
1193*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301194bool nfa_dm_act_pause_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301195 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301196
nxf24591c1cbeab2018-02-21 17:32:26 +05301197 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301198
nxpandroid8f6d0532017-07-12 18:25:30 +05301199 nfa_dm_cb.flags |= NFA_DM_FLAGS_P2P_PAUSED;
1200 evt_data.status = NFA_STATUS_OK;
1201 nfa_dm_conn_cback_event_notify(NFA_P2P_PAUSED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301202
nxf24591c1cbeab2018-02-21 17:32:26 +05301203 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301204}
1205
1206/*******************************************************************************
1207**
1208** Function nfa_dm_act_resume_p2p
1209**
1210** Description Process resume P2P command
1211**
nxf24591c1cbeab2018-02-21 17:32:26 +05301212** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301213**
1214*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301215bool nfa_dm_act_resume_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301216 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301217
nxf24591c1cbeab2018-02-21 17:32:26 +05301218 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301219
nxpandroid8f6d0532017-07-12 18:25:30 +05301220 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_P2P_PAUSED;
1221 evt_data.status = NFA_STATUS_OK;
1222 nfa_dm_conn_cback_event_notify(NFA_P2P_RESUMED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301223
nxf24591c1cbeab2018-02-21 17:32:26 +05301224 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301225}
1226
1227/*******************************************************************************
1228**
1229** Function nfa_dm_act_send_raw_frame
1230**
1231** Description Send an raw frame on RF link
1232**
nxf24591c1cbeab2018-02-21 17:32:26 +05301233** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301234**
1235*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301236bool nfa_dm_act_send_raw_frame(tNFA_DM_MSG* p_data) {
1237 tNFC_STATUS status = NFC_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +05301238
nxf24591c1cbeab2018-02-21 17:32:26 +05301239 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301240
nxpandroid8f6d0532017-07-12 18:25:30 +05301241 /* If NFC link is activated */
1242 if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) ||
1243 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE)) {
1244 nfa_dm_cb.flags |= NFA_DM_FLAGS_RAW_FRAME;
1245 NFC_SetReassemblyFlag(false);
1246 /* If not in exclusive mode, and not activated for LISTEN, then forward raw
1247 * data to NFA_RW to send */
1248 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) &&
1249 !(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) &&
1250 ((nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T1T) ||
1251 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T2T) ||
1252 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T3T) ||
1253 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_ISO_DEP) ||
nxf24591c1cbeab2018-02-21 17:32:26 +05301254 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T))) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301255 /* if RW is checking presence then it will put into pending queue */
1256 status = nfa_rw_send_raw_frame((NFC_HDR*)p_data);
1257 } else {
1258 status = NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)p_data);
1259 if (status != NFC_STATUS_OK) {
1260 NFC_SetReassemblyFlag(true);
1261 }
1262 /* Already freed or NCI layer will free buffer */
1263 return false;
nxpandroidc7611652015-09-23 16:42:05 +05301264 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301265 }
nxpandroidc7611652015-09-23 16:42:05 +05301266
nxpandroid8f6d0532017-07-12 18:25:30 +05301267 if (status == NFC_STATUS_FAILED) {
1268 NFC_SetReassemblyFlag(true);
1269 /* free the buffer */
1270 return true;
1271 } else {
1272 /* NCI layer will free buffer */
1273 return false;
1274 }
nxpandroidc7611652015-09-23 16:42:05 +05301275}
1276
1277/*******************************************************************************
1278**
1279** Function nfa_dm_set_p2p_listen_tech
1280**
1281** Description Notify change of P2P listen technologies to NFA P2P
1282**
nxf24591c1cbeab2018-02-21 17:32:26 +05301283** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301284**
1285*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301286bool nfa_dm_set_p2p_listen_tech(tNFA_DM_MSG* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301287 DLOG_IF(INFO, nfc_debug_enabled)
1288 << StringPrintf("tech_mask = %d", p_data->set_p2p_listen_tech.tech_mask);
nxpandroidc7611652015-09-23 16:42:05 +05301289
nxpandroid8f6d0532017-07-12 18:25:30 +05301290 nfa_p2p_update_listen_tech(p_data->set_p2p_listen_tech.tech_mask);
1291 nfa_dm_conn_cback_event_notify(NFA_SET_P2P_LISTEN_TECH_EVT, NULL);
nxpandroidc7611652015-09-23 16:42:05 +05301292
nxf24591c1cbeab2018-02-21 17:32:26 +05301293 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301294}
1295
1296/*******************************************************************************
1297**
1298** Function nfa_dm_act_start_rf_discovery
1299**
1300** Description Process start RF discovery command
1301**
nxf24591c1cbeab2018-02-21 17:32:26 +05301302** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301303**
1304*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301305bool nfa_dm_act_start_rf_discovery(__attribute__((unused))
1306 tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301307 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301308
nxf24591c1cbeab2018-02-21 17:32:26 +05301309 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301310
nxpandroid8f6d0532017-07-12 18:25:30 +05301311 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) {
1312 evt_data.status = NFA_STATUS_OK;
1313 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
1314 } else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE) {
1315 evt_data.status = NFA_STATUS_SEMANTIC_ERROR;
1316 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
1317 } else {
1318 nfa_dm_cb.disc_cb.disc_flags |=
1319 (NFA_DM_DISC_FLAGS_ENABLED | NFA_DM_DISC_FLAGS_NOTIFY);
1320 nfa_dm_start_rf_discover();
1321 }
nxpandroidc7611652015-09-23 16:42:05 +05301322
nxf24591c1cbeab2018-02-21 17:32:26 +05301323 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301324}
1325
1326/*******************************************************************************
1327**
1328** Function nfa_dm_act_stop_rf_discovery
1329**
1330** Description Process stop RF discovery command
1331**
nxf24591c1cbeab2018-02-21 17:32:26 +05301332** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301333**
1334*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301335bool nfa_dm_act_stop_rf_discovery(__attribute__((unused)) tNFA_DM_MSG* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301336 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301337
nxf24591c1cbeab2018-02-21 17:32:26 +05301338 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301339
nxpandroid8f6d0532017-07-12 18:25:30 +05301340 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) ||
1341 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)) {
1342 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;
nxpandroidc7611652015-09-23 16:42:05 +05301343
nxpandroid8f6d0532017-07-12 18:25:30 +05301344 /* if discover command has been sent in IDLE state and waiting for response
1345 */
1346 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
1347 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;
1348 } else {
1349 evt_data.status = NFA_STATUS_OK;
1350 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301351 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301352 } else {
1353 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;
1354 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;
nxpandroidc7611652015-09-23 16:42:05 +05301355
nxpandroid8f6d0532017-07-12 18:25:30 +05301356 if (nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE) == NFA_STATUS_OK) {
1357 if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
1358 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
1359 nfa_rw_stop_presence_check_timer();
nxpandroidc7611652015-09-23 16:42:05 +05301360 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301361 }
nxf24591c1cbeab2018-02-21 17:32:26 +05301362 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301363}
1364
1365/*******************************************************************************
1366**
1367** Function nfa_dm_act_set_rf_disc_duration
1368**
1369** Description Set duration for RF discovery
1370**
nxf24591c1cbeab2018-02-21 17:32:26 +05301371** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301372**
1373*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301374bool nfa_dm_act_set_rf_disc_duration(tNFA_DM_MSG* p_data) {
1375 nfa_dm_cb.disc_cb.disc_duration = p_data->disc_duration.rf_disc_dur_ms;
nxf24591c1cbeab2018-02-21 17:32:26 +05301376 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301377}
nxpandroidcdd30442016-05-27 17:26:18 +05301378
nxpandroidc7611652015-09-23 16:42:05 +05301379/*******************************************************************************
1380**
1381** Function nfa_dm_act_get_rf_disc_duration
1382**
1383** Description Get duration for RF discovery
1384**
nxpandroid8f6d0532017-07-12 18:25:30 +05301385** Returns uint16_t
nxpandroidc7611652015-09-23 16:42:05 +05301386**
1387*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301388uint16_t nfa_dm_act_get_rf_disc_duration() {
1389 return (nfa_dm_cb.disc_cb.disc_duration);
nxpandroidc7611652015-09-23 16:42:05 +05301390}
nxpandroidc7611652015-09-23 16:42:05 +05301391/*******************************************************************************
1392**
1393** Function nfa_dm_act_select
1394**
1395** Description Process RF select command
1396**
nxf24591c1cbeab2018-02-21 17:32:26 +05301397** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301398**
1399*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301400bool nfa_dm_act_select(tNFA_DM_MSG* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301401 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301402
nxpandroid8f6d0532017-07-12 18:25:30 +05301403 nfa_dm_rf_discover_select(p_data->select.rf_disc_id, p_data->select.protocol,
1404 p_data->select.rf_interface);
nxf24591c1cbeab2018-02-21 17:32:26 +05301405 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301406}
1407
1408/*******************************************************************************
1409**
1410** Function nfa_dm_act_update_rf_params
1411**
1412** Description Process update RF communication parameters command
1413**
nxf24591c1cbeab2018-02-21 17:32:26 +05301414** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301415**
1416*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301417bool nfa_dm_act_update_rf_params(tNFA_DM_MSG* p_data) {
1418 tNFA_CONN_EVT_DATA conn_evt;
nxpandroidc7611652015-09-23 16:42:05 +05301419
nxf24591c1cbeab2018-02-21 17:32:26 +05301420 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
nxpandroidc7611652015-09-23 16:42:05 +05301421
nxpandroid8f6d0532017-07-12 18:25:30 +05301422 if (NFC_UpdateRFCommParams(&p_data->update_rf_params.params) !=
1423 NFC_STATUS_OK) {
1424 conn_evt.status = NFA_STATUS_FAILED;
1425 nfa_dm_conn_cback_event_notify(NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt);
1426 }
nxpandroidc7611652015-09-23 16:42:05 +05301427
nxf24591c1cbeab2018-02-21 17:32:26 +05301428 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301429}
1430
1431/*******************************************************************************
1432**
1433** Function nfa_dm_act_disable_timeout
1434**
1435** Description timeout on disable process. Shutdown immediately
1436**
nxf24591c1cbeab2018-02-21 17:32:26 +05301437** Returns TRUE (message buffer to be freed by caller)
nxpandroidc7611652015-09-23 16:42:05 +05301438**
1439*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301440bool nfa_dm_act_disable_timeout(__attribute__((unused)) tNFA_DM_MSG* p_data) {
1441 tNFA_DM_MSG nfa_dm_msg;
1442 nfa_dm_msg.disable.graceful = false;
1443 nfa_dm_disable(&nfa_dm_msg);
1444 return true;
nxpandroidc7611652015-09-23 16:42:05 +05301445}
1446
1447/*******************************************************************************
1448**
1449** Function nfa_dm_act_conn_cback_notify
1450**
1451** Description Notify app of reader/writer/ndef events
1452**
1453** Returns nothing
1454**
1455*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301456void nfa_dm_act_conn_cback_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data) {
nxf24591c1cbeab2018-02-21 17:32:26 +05301457 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event);
nxpandroidc7611652015-09-23 16:42:05 +05301458
nxpandroid8f6d0532017-07-12 18:25:30 +05301459 /* Notify event using appropriate CONN_CBACK */
1460 nfa_dm_conn_cback_event_notify(event, p_data);
nxpandroidc7611652015-09-23 16:42:05 +05301461
nxpandroid8f6d0532017-07-12 18:25:30 +05301462 /* If not in exclusive RF mode, then read NDEF message from tag (if automatic
1463 * reading is enabled) */
1464 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)) {
1465 if ((event == NFA_NDEF_DETECT_EVT) &&
1466 (nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF)) {
1467 /* read NDEF message from tag */
1468 if (p_data->ndef_detect.status == NFA_STATUS_OK) {
1469 NFA_RwReadNDef();
1470 } else if (p_data->ndef_detect.status == NFA_STATUS_FAILED) {
1471 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF;
1472 }
1473 /* ignore NFA_STATUS_BUSY */
1474 } else if ((event == NFA_READ_CPLT_EVT) &&
1475 (nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF)) {
1476 /* reading NDEF message is done */
1477 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF;
nxpandroidc7611652015-09-23 16:42:05 +05301478 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301479 }
nxpandroidc7611652015-09-23 16:42:05 +05301480}
1481
1482/*******************************************************************************
1483**
1484** Function nfa_dm_act_data_cback
1485**
1486** Description Processing data from RF link
1487**
1488** Returns None
1489**
1490*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301491static void nfa_dm_act_data_cback(__attribute__((unused)) uint8_t conn_id,
1492 tNFC_CONN_EVT event, tNFC_CONN* p_data) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301493 NFC_HDR* p_msg;
1494 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301495
nxf24591c1cbeab2018-02-21 17:32:26 +05301496 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
nxpandroidc7611652015-09-23 16:42:05 +05301497
nxpandroid8f6d0532017-07-12 18:25:30 +05301498 if (event == NFC_DATA_CEVT) {
1499 p_msg = (NFC_HDR*)p_data->data.p_data;
nxpandroidc7611652015-09-23 16:42:05 +05301500
nxpandroid8f6d0532017-07-12 18:25:30 +05301501 if (p_msg) {
1502 evt_data.data.status = p_data->data.status;
1503 evt_data.data.p_data = (uint8_t*)(p_msg + 1) + p_msg->offset;
1504 evt_data.data.len = p_msg->len;
nxpandroidc7611652015-09-23 16:42:05 +05301505
nxpandroid8f6d0532017-07-12 18:25:30 +05301506 nfa_dm_conn_cback_event_notify(NFA_DATA_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301507
nxpandroid8f6d0532017-07-12 18:25:30 +05301508 GKI_freebuf(p_msg);
1509 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05301510 LOG(ERROR) << StringPrintf(
1511 "received NFC_DATA_CEVT with NULL data "
nxpandroid8f6d0532017-07-12 18:25:30 +05301512 "pointer");
nxpandroidc7611652015-09-23 16:42:05 +05301513 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301514 } else if (event == NFC_DEACTIVATE_CEVT) {
1515 NFC_SetStaticRfCback(NULL);
1516 }
nxpandroidc7611652015-09-23 16:42:05 +05301517}
1518
1519/*******************************************************************************
1520**
1521** Function nfa_dm_excl_disc_cback
1522**
1523** Description Processing event from discovery callback
1524**
1525** Returns None
1526**
1527*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301528static void nfa_dm_excl_disc_cback(tNFA_DM_RF_DISC_EVT event,
1529 tNFC_DISCOVER* p_data) {
1530 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301531
nxf24591c1cbeab2018-02-21 17:32:26 +05301532 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
nxpandroidc7611652015-09-23 16:42:05 +05301533
nxpandroid8f6d0532017-07-12 18:25:30 +05301534 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05301535 case NFA_DM_RF_DISC_START_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301536 evt_data.status = NFA_STATUS_OK;
1537 nfa_dm_conn_cback_event_notify(NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT,
1538 &evt_data);
1539 break;
nxpandroidc7611652015-09-23 16:42:05 +05301540
1541 case NFA_DM_RF_DISC_ACTIVATED_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301542 if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A) {
1543 /* store SEL_RES response */
1544 nfa_dm_cb.disc_cb.activated_sel_res =
1545 p_data->activate.rf_tech_param.param.pa.sel_rsp;
1546 }
nxpandroidc7611652015-09-23 16:42:05 +05301547
nxpandroid8f6d0532017-07-12 18:25:30 +05301548 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) {
1549 /* Set data callback to receive raw frame */
1550 NFC_SetStaticRfCback(nfa_dm_act_data_cback);
1551
1552 memset(&(evt_data.activated.params), 0x00, sizeof(tNFA_TAG_PARAMS));
1553 memcpy(&(evt_data.activated.activate_ntf), &(p_data->activate),
1554 sizeof(tNFC_ACTIVATE_DEVT));
1555
1556 nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, &evt_data);
1557 } else {
1558 /* holding activation notification until sub-module is ready */
1559 nfa_dm_cb.p_activate_ntf =
1560 (uint8_t*)GKI_getbuf(sizeof(tNFC_ACTIVATE_DEVT));
1561
1562 if (nfa_dm_cb.p_activate_ntf) {
1563 memcpy(nfa_dm_cb.p_activate_ntf, &(p_data->activate),
1564 sizeof(tNFC_ACTIVATE_DEVT));
1565
1566 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) ||
1567 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) ||
1568 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) ||
1569 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP) ||
nxf24591c1cbeab2018-02-21 17:32:26 +05301570 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T) ||
nxpandroid8f6d0532017-07-12 18:25:30 +05301571 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)) {
1572 /* Notify NFA tag sub-system */
1573 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, false);
1574 } else /* if NFC-DEP, ISO-DEP with frame interface or others */
1575 {
nxpandroidc7611652015-09-23 16:42:05 +05301576 /* Set data callback to receive raw frame */
nxpandroid8f6d0532017-07-12 18:25:30 +05301577 NFC_SetStaticRfCback(nfa_dm_act_data_cback);
1578 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
1579 }
1580 } else {
1581 /* deactivate and restart RF discovery */
1582 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
nxpandroidc7611652015-09-23 16:42:05 +05301583 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301584 }
1585 break;
nxpandroidc7611652015-09-23 16:42:05 +05301586
1587 case NFA_DM_RF_DISC_DEACTIVATED_EVT:
1588
nxpandroid8f6d0532017-07-12 18:25:30 +05301589 /* if deactivated to idle or discovery */
1590 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) ||
1591 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) {
1592 /* clear stored NFCID/UID/KOVIO bar code */
1593 nfa_dm_cb.activated_nfcid_len = 0;
1594 }
nxpandroidc7611652015-09-23 16:42:05 +05301595
nxpandroid8f6d0532017-07-12 18:25:30 +05301596 if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP) {
1597 /* Notify NFA RW sub-systems */
1598 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, false);
1599 }
nxpandroidc7611652015-09-23 16:42:05 +05301600
nxpandroid8f6d0532017-07-12 18:25:30 +05301601 /* if deactivated as sleep mode */
1602 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
1603 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
1604 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
1605 } else {
1606 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1607 }
nxpandroidc7611652015-09-23 16:42:05 +05301608
nxpandroid8f6d0532017-07-12 18:25:30 +05301609 /* notify deactivation to upper layer */
1610 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301611
nxpandroid8f6d0532017-07-12 18:25:30 +05301612 /* clean up SEL_RES response */
1613 nfa_dm_cb.disc_cb.activated_sel_res = 0;
1614 break;
nxpandroidc7611652015-09-23 16:42:05 +05301615
1616 default:
nxf24591c1cbeab2018-02-21 17:32:26 +05301617 LOG(ERROR) << StringPrintf("Unexpected event");
nxpandroid8f6d0532017-07-12 18:25:30 +05301618 break;
1619 }
nxpandroidc7611652015-09-23 16:42:05 +05301620}
1621
1622/*******************************************************************************
1623**
1624** Function nfa_dm_poll_disc_cback
1625**
1626** Description Processing event from discovery callback
1627**
1628** Returns None
1629**
1630*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301631static void nfa_dm_poll_disc_cback(tNFA_DM_RF_DISC_EVT event,
1632 tNFC_DISCOVER* p_data) {
1633 tNFA_CONN_EVT_DATA evt_data;
nxpandroidc7611652015-09-23 16:42:05 +05301634
nxf24591c1cbeab2018-02-21 17:32:26 +05301635 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
nxpandroidc7611652015-09-23 16:42:05 +05301636
nxpandroid8f6d0532017-07-12 18:25:30 +05301637 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05301638 case NFA_DM_RF_DISC_START_EVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301639 break;
nxpandroidc7611652015-09-23 16:42:05 +05301640
1641 case NFA_DM_RF_DISC_ACTIVATED_EVT:
1642
nxpandroid8f6d0532017-07-12 18:25:30 +05301643 if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A) {
1644 /* store SEL_RES response */
1645 nfa_dm_cb.disc_cb.activated_sel_res =
1646 p_data->activate.rf_tech_param.param.pa.sel_rsp;
1647 }
nxpandroidc7611652015-09-23 16:42:05 +05301648
nxpandroid8f6d0532017-07-12 18:25:30 +05301649 /* holding activation notification until sub-module is ready */
1650 nfa_dm_cb.p_activate_ntf =
1651 (uint8_t*)GKI_getbuf(sizeof(tNFC_ACTIVATE_DEVT));
nxpandroidc7611652015-09-23 16:42:05 +05301652
nxpandroid8f6d0532017-07-12 18:25:30 +05301653 if (nfa_dm_cb.p_activate_ntf) {
1654 memcpy(nfa_dm_cb.p_activate_ntf, &(p_data->activate),
1655 sizeof(tNFC_ACTIVATE_DEVT));
nxpandroid8f6d0532017-07-12 18:25:30 +05301656 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) &&
nxf24591c1cbeab2018-02-21 17:32:26 +05301657 (nfa_dm_cb.disc_cb.activated_rf_interface ==
1658 NFC_INTERFACE_NFC_DEP)) {
1659 /* For P2P mode(Default DTA mode) open Raw channel to bypass LLCP
1660 * layer. For LLCP DTA mode activate LLCP */
nxpandroid8f6d0532017-07-12 18:25:30 +05301661 if ((appl_dta_mode_flag == 1) &&
1662 ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) {
1663 /* Open raw channel in case of p2p for DTA testing */
1664 NFC_SetStaticRfCback(nfa_dm_act_data_cback);
1665 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
nxpandroid8f6d0532017-07-12 18:25:30 +05301666 } else {
nxpandroid8f6d0532017-07-12 18:25:30 +05301667 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED)) {
1668 /* activate LLCP */
1669 nfa_p2p_activate_llcp(p_data);
1670 if (nfa_dm_cb.p_activate_ntf) {
1671 GKI_freebuf(nfa_dm_cb.p_activate_ntf);
1672 nfa_dm_cb.p_activate_ntf = NULL;
1673 }
1674 } else {
nxf24591c1cbeab2018-02-21 17:32:26 +05301675 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P is paused");
nxpandroid8f6d0532017-07-12 18:25:30 +05301676 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
1677 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301678 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301679 } else if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) ||
1680 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) ||
1681 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) ||
1682 (nfa_dm_cb.disc_cb.activated_protocol ==
1683 NFC_PROTOCOL_ISO_DEP) ||
nxf24591c1cbeab2018-02-21 17:32:26 +05301684 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T5T) ||
nxpandroid8f6d0532017-07-12 18:25:30 +05301685 (nfa_dm_cb.disc_cb.activated_protocol ==
1686 NFC_PROTOCOL_KOVIO) ||
nxf24591c1cbeab2018-02-21 17:32:26 +05301687 (nfa_dm_cb.disc_cb.activated_protocol ==
1688 NFC_PROTOCOL_MIFARE)) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301689 /* Notify NFA tag sub-system */
1690 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, true);
1691 } else /* if NFC-DEP/ISO-DEP with frame interface */
nxpandroidc7611652015-09-23 16:42:05 +05301692 {
nxpandroid8f6d0532017-07-12 18:25:30 +05301693 /* Set data callback to receive raw frame */
1694 NFC_SetStaticRfCback(nfa_dm_act_data_cback);
1695 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
nxpandroidc7611652015-09-23 16:42:05 +05301696 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301697 } else {
1698 /* deactivate and restart RF discovery */
1699 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
1700 }
1701 break;
nxpandroidc7611652015-09-23 16:42:05 +05301702
1703 case NFA_DM_RF_DISC_DEACTIVATED_EVT:
1704
nxpandroid8f6d0532017-07-12 18:25:30 +05301705 /* if deactivated to idle or discovery */
1706 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) ||
1707 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) {
1708 /* clear stored NFCID/UID/KOVIO bar code */
1709 nfa_dm_cb.activated_nfcid_len = 0;
1710 }
1711
1712 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) &&
nxf24591c1cbeab2018-02-21 17:32:26 +05301713 (nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_NFC_DEP)) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301714 /*
1715 ** If LLCP link is not deactivated yet,
1716 ** LLCP will receive deactivation ntf through data callback.
1717 ** NFA P2P will receive callback event from LLCP.
1718 */
1719 } else {
1720 /* Notify NFA RW sub-systems */
1721 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true);
1722 }
1723
1724 /* if NFA sent NFA_ACTIVATED_EVT earlier */
1725 if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_DEACTIVATED_EVT) {
1726 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_DEACTIVATED_EVT;
1727
1728 /* if deactivated as sleep mode */
1729 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
1730 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
1731 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
1732 } else {
1733 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
nxpandroidc7611652015-09-23 16:42:05 +05301734 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301735 /* notify deactivation to application */
1736 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data);
1737 }
nxpandroidc7611652015-09-23 16:42:05 +05301738
nxpandroid8f6d0532017-07-12 18:25:30 +05301739 /* clean up SEL_RES response */
1740 nfa_dm_cb.disc_cb.activated_sel_res = 0;
1741
1742 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED)) {
1743 /* deregister discovery callback from NFA DM Discovery */
1744 nfa_dm_delete_rf_discover(nfa_dm_cb.poll_disc_handle);
1745 nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;
1746
1747 /* this is for disable polling */
1748 if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_POLL_STOP_EVT) {
1749 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_POLL_STOP_EVT;
1750
1751 evt_data.status = NFA_STATUS_OK;
1752 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data);
nxpandroidc7611652015-09-23 16:42:05 +05301753 }
nxpandroid8f6d0532017-07-12 18:25:30 +05301754 }
1755 break;
1756 }
nxpandroidc7611652015-09-23 16:42:05 +05301757}
1758
1759/*******************************************************************************
1760** Function nfa_dm_poll_disc_cback_dta_wrapper
1761**
1762** Description Accessing the nfa_dm_poll_disc_cback for DTA wrapper
1763**
1764** Returns None
1765**
1766*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301767void nfa_dm_poll_disc_cback_dta_wrapper(tNFA_DM_RF_DISC_EVT event,
1768 tNFC_DISCOVER* p_data) {
1769 nfa_dm_poll_disc_cback(event, p_data);
nxpandroidc7611652015-09-23 16:42:05 +05301770}
nxpandroidc7611652015-09-23 16:42:05 +05301771
1772/*******************************************************************************
1773**
1774** Function nfa_dm_notify_activation_status
1775**
1776** Description Processing activation status from sub-modules
1777**
1778** Returns None
1779**
1780*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +05301781void nfa_dm_notify_activation_status(tNFA_STATUS status,
1782 tNFA_TAG_PARAMS* p_params) {
1783 tNFA_CONN_EVT_DATA evt_data;
1784 tNFC_RF_TECH_PARAMS* p_tech_params;
nxf24591c1cbeab2018-02-21 17:32:26 +05301785 uint8_t *p_nfcid = NULL, nfcid_len;
nxpandroidc7611652015-09-23 16:42:05 +05301786
nxf24591c1cbeab2018-02-21 17:32:26 +05301787 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("status:0x%X", status);
nxpandroidc7611652015-09-23 16:42:05 +05301788
nxpandroid8f6d0532017-07-12 18:25:30 +05301789 if (!nfa_dm_cb.p_activate_ntf) {
1790 /* this is for NFA P2P listen */
1791 return;
1792 }
1793
nxf24591c1cbeab2018-02-21 17:32:26 +05301794 if (status == NFA_STATUS_OK) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301795 /* notify NFC link activation */
1796 memcpy(&(evt_data.activated.activate_ntf), nfa_dm_cb.p_activate_ntf,
1797 sizeof(tNFC_ACTIVATE_DEVT));
1798
1799 p_tech_params = &evt_data.activated.activate_ntf.rf_tech_param;
1800
1801 memset(&(evt_data.activated.params), 0x00, sizeof(tNFA_TAG_PARAMS));
1802 if (p_params) {
1803 memcpy(&(evt_data.activated.params), p_params, sizeof(tNFA_TAG_PARAMS));
nxpandroidc7611652015-09-23 16:42:05 +05301804 }
1805
nxpandroid8f6d0532017-07-12 18:25:30 +05301806 /* get length of NFCID and location */
1807 if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_A) {
1808 if ((p_tech_params->param.pa.nfcid1_len == 0) && (p_params != NULL)) {
1809 nfcid_len = sizeof(p_params->t1t.uid);
1810 p_nfcid = p_params->t1t.uid;
1811 evt_data.activated.activate_ntf.rf_tech_param.param.pa.nfcid1_len =
1812 nfcid_len;
nxf24591c1cbeab2018-02-21 17:32:26 +05301813 memcpy(evt_data.activated.activate_ntf.rf_tech_param.param.pa.nfcid1,
1814 p_nfcid, nfcid_len);
nxpandroid8f6d0532017-07-12 18:25:30 +05301815 } else {
1816 nfcid_len = p_tech_params->param.pa.nfcid1_len;
1817 p_nfcid = p_tech_params->param.pa.nfcid1;
1818 }
1819 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_B) {
1820 nfcid_len = NFC_NFCID0_MAX_LEN;
1821 p_nfcid = p_tech_params->param.pb.nfcid0;
nxpandroid8f6d0532017-07-12 18:25:30 +05301822 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_F) {
1823 nfcid_len = NFC_NFCID2_LEN;
1824 p_nfcid = p_tech_params->param.pf.nfcid2;
nxf24591c1cbeab2018-02-21 17:32:26 +05301825 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_V) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301826 nfcid_len = NFC_ISO15693_UID_LEN;
1827 p_nfcid = p_tech_params->param.pi93.uid;
1828 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_KOVIO) {
1829 nfcid_len = p_tech_params->param.pk.uid_len;
1830 p_nfcid = p_tech_params->param.pk.uid;
1831 } else {
1832 nfcid_len = 0;
nxpandroidc7611652015-09-23 16:42:05 +05301833 }
1834
nxpandroid8f6d0532017-07-12 18:25:30 +05301835 /*
1836 ** If not in exlusive RF mode, and
1837 ** P2P activation, then push default NDEF message through SNEP
1838 ** TAG activation, then read NDEF message
1839 */
1840 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) {
1841 /*
1842 ** Default NDEF message will be put to NFC Forum defualt SNEP server
1843 ** after receiving NFA_LLCP_ACTIVATED_EVT.
1844 */
1845 } else if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)) {
1846 /*
1847 ** if the same tag is activated then do not perform auto NDEF
1848 ** detection. Application may put a tag into sleep mode and
1849 ** reactivate the same tag.
1850 */
1851
1852 if ((p_tech_params->mode != nfa_dm_cb.activated_tech_mode) ||
1853 (nfcid_len != nfa_dm_cb.activated_nfcid_len) ||
1854 (memcmp(p_nfcid, nfa_dm_cb.activated_nfcid, nfcid_len))) {
1855 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) ||
1856 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) ||
1857 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) ||
1858 ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP) &&
1859 (nfa_dm_cb.disc_cb.activated_rf_interface ==
1860 NFC_INTERFACE_ISO_DEP)) ||
nxf24591c1cbeab2018-02-21 17:32:26 +05301861 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T)) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301862 if (p_nfa_dm_cfg->auto_detect_ndef) {
1863 if (p_nfa_dm_cfg->auto_read_ndef) {
1864 nfa_dm_cb.flags |= NFA_DM_FLAGS_AUTO_READING_NDEF;
1865 }
1866 NFA_RwDetectNDef();
1867 } else if (p_nfa_dm_cfg->auto_read_ndef) {
1868 NFA_RwReadNDef();
1869 }
1870 }
1871 }
1872 }
1873
1874 /* store activated tag information */
1875 nfa_dm_cb.activated_tech_mode = p_tech_params->mode;
1876 nfa_dm_cb.activated_nfcid_len = nfcid_len;
1877 if (nfcid_len) memcpy(nfa_dm_cb.activated_nfcid, p_nfcid, nfcid_len);
1878
1879 nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_DEACTIVATED_EVT;
1880 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING))
1881 nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, &evt_data);
1882 } else {
1883 /* if NFC_DEP, NFA P2P will deactivate */
1884 if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP) {
1885 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
1886 }
1887 }
1888
1889 GKI_freebuf(nfa_dm_cb.p_activate_ntf);
1890 nfa_dm_cb.p_activate_ntf = NULL;
nxpandroidc7611652015-09-23 16:42:05 +05301891}
1892
nxpandroidc7611652015-09-23 16:42:05 +05301893/*******************************************************************************
1894**
1895** Function nfa_dm_nfc_revt_2_str
1896**
1897** Description convert nfc revt to string
1898**
1899*******************************************************************************/
nxf24591c1cbeab2018-02-21 17:32:26 +05301900std::string nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event) {
nxpandroid8f6d0532017-07-12 18:25:30 +05301901 switch (event) {
nxpandroidc7611652015-09-23 16:42:05 +05301902 case NFC_ENABLE_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301903 return "NFC_ENABLE_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301904 case NFC_DISABLE_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301905 return "NFC_DISABLE_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301906 case NFC_SET_CONFIG_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301907 return "NFC_SET_CONFIG_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301908 case NFC_GET_CONFIG_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301909 return "NFC_GET_CONFIG_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301910 case NFC_NFCEE_DISCOVER_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301911 return "NFC_NFCEE_DISCOVER_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301912 case NFC_NFCEE_INFO_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301913 return "NFC_NFCEE_INFO_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301914 case NFC_NFCEE_MODE_SET_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301915 return "NFC_NFCEE_MODE_SET_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301916 case NFC_RF_FIELD_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301917 return "NFC_RF_FIELD_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301918 case NFC_EE_ACTION_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301919 return "NFC_EE_ACTION_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301920 case NFC_EE_DISCOVER_REQ_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301921 return "NFC_EE_DISCOVER_REQ_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301922 case NFC_SET_ROUTING_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301923 return "NFC_SET_ROUTING_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301924 case NFC_GET_ROUTING_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301925 return "NFC_GET_ROUTING_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301926 case NFC_GEN_ERROR_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301927 return "NFC_GEN_ERROR_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301928 case NFC_NFCC_RESTART_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301929 return "NFC_NFCC_RESTART_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301930 case NFC_NFCC_TIMEOUT_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301931 return "NFC_NFCC_TIMEOUT_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301932 case NFC_NFCC_TRANSPORT_ERR_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301933 return "NFC_NFCC_TRANSPORT_ERR_REVT";
nxpandroidc7611652015-09-23 16:42:05 +05301934 case NFC_NFCC_POWER_OFF_REVT:
nxpandroid8f6d0532017-07-12 18:25:30 +05301935 return "NFC_NFCC_POWER_OFF_REVT";
nxpandroid5e589782017-08-14 11:54:50 +05301936#if (NXP_EXTNS == TRUE)
nxf24591c1cbeab2018-02-21 17:32:26 +05301937 case NFC_NFCEE_PL_CONTROL_REVT:
1938 return "NFA_EE_PWR_LINK_CTRL_EVT";
nxpandroid3e4012e2016-08-01 19:09:55 +05301939#endif
nxpandroidc7611652015-09-23 16:42:05 +05301940 default:
nxpandroid8f6d0532017-07-12 18:25:30 +05301941 return "unknown revt";
nxpandroid8f6d0532017-07-12 18:25:30 +05301942 }
nxpandroidc7611652015-09-23 16:42:05 +05301943}
nxf24591c1cbeab2018-02-21 17:32:26 +05301944#if (NXP_EXTNS == TRUE)
1945/*******************************************************************************
1946**
1947** Function nfa_dm_is_hci_supported
1948**
1949** Description This function returns TRUE, if NFA-EE is enabled and
1950** HCI network is supported
1951**
1952** Returns TRUE, if HCI network is supported
1953** FALSE, otherwise
1954**
1955*******************************************************************************/
1956bool nfa_dm_is_hci_supported (void)
1957{
1958 bool hci_is_supported = FALSE;
1959
1960#if (NFC_NFCEE_INCLUDED == TRUE)
1961 if (nfa_ee_max_ee_cfg && (NFC_GetNCIVersion() == NCI_VERSION_2_0))
1962 hci_is_supported = TRUE;
1963#endif
1964 return hci_is_supported;
1965}
1966#endif