1 /******************************************************************************
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 /******************************************************************************
20 *
21 * This is the main implementation file for the NFA EE.
22 *
23 ******************************************************************************/
24 #include <string>
25
26 #include <android-base/stringprintf.h>
27 #include <base/logging.h>
28
29 #include "nfa_dm_int.h"
30 #include "nfa_ee_int.h"
31 #include "nfc_config.h"
32
33 using android::base::StringPrintf;
34
35 extern bool nfc_debug_enabled;
36
37 /*****************************************************************************
38 ** Global Variables
39 *****************************************************************************/
40
41 /* system manager control block definition */
42 tNFA_EE_CB nfa_ee_cb;
43
44 /*****************************************************************************
45 ** Constants
46 *****************************************************************************/
47 static const tNFA_SYS_REG nfa_ee_sys_reg = {nfa_ee_sys_enable, nfa_ee_evt_hdlr,
48 nfa_ee_sys_disable,
49 nfa_ee_proc_nfcc_power_mode};
50
51 #define NFA_EE_NUM_ACTIONS (NFA_EE_MAX_EVT & 0x00ff)
52
53 const tNFA_EE_SM_ACT nfa_ee_actions[] = {
54 /* NFA-EE action function/ internal events */
55 nfa_ee_api_discover, /* NFA_EE_API_DISCOVER_EVT */
56 nfa_ee_api_register, /* NFA_EE_API_REGISTER_EVT */
57 nfa_ee_api_deregister, /* NFA_EE_API_DEREGISTER_EVT */
58 nfa_ee_api_mode_set, /* NFA_EE_API_MODE_SET_EVT */
59 nfa_ee_api_set_tech_cfg, /* NFA_EE_API_SET_TECH_CFG_EVT */
60 nfa_ee_api_set_proto_cfg, /* NFA_EE_API_SET_PROTO_CFG_EVT */
61 nfa_ee_api_add_aid, /* NFA_EE_API_ADD_AID_EVT */
62 nfa_ee_api_remove_aid, /* NFA_EE_API_REMOVE_AID_EVT */
63 nfa_ee_api_add_sys_code, /* NFA_EE_API_ADD_SYSCODE_EVT */
64 nfa_ee_api_remove_sys_code, /* NFA_EE_API_REMOVE_SYSCODE_EVT*/
65 nfa_ee_api_lmrt_size, /* NFA_EE_API_LMRT_SIZE_EVT */
66 nfa_ee_api_update_now, /* NFA_EE_API_UPDATE_NOW_EVT */
67 nfa_ee_api_connect, /* NFA_EE_API_CONNECT_EVT */
68 nfa_ee_api_send_data, /* NFA_EE_API_SEND_DATA_EVT */
69 nfa_ee_api_disconnect, /* NFA_EE_API_DISCONNECT_EVT */
70 nfa_ee_nci_disc_rsp, /* NFA_EE_NCI_DISC_RSP_EVT */
71 nfa_ee_nci_disc_ntf, /* NFA_EE_NCI_DISC_NTF_EVT */
72 nfa_ee_nci_mode_set_rsp, /* NFA_EE_NCI_MODE_SET_RSP_EVT */
73 nfa_ee_nci_conn, /* NFA_EE_NCI_CONN_EVT */
74 nfa_ee_nci_conn, /* NFA_EE_NCI_DATA_EVT */
75 nfa_ee_nci_action_ntf, /* NFA_EE_NCI_ACTION_NTF_EVT */
76 nfa_ee_nci_disc_req_ntf, /* NFA_EE_NCI_DISC_REQ_NTF_EVT */
77 nfa_ee_nci_wait_rsp, /* NFA_EE_NCI_WAIT_RSP_EVT */
78 nfa_ee_rout_timeout, /* NFA_EE_ROUT_TIMEOUT_EVT */
79 nfa_ee_discv_timeout, /* NFA_EE_DISCV_TIMEOUT_EVT */
80 nfa_ee_lmrt_to_nfcc, /* NFA_EE_CFG_TO_NFCC_EVT */
81 nfa_ee_nci_nfcee_status_ntf /*NFA_EE_NCI_NFCEE_STATUS_NTF_EVT*/
82 };
83
84 /*******************************************************************************
85 **
86 ** Function nfa_ee_init
87 **
88 ** Description Initialize NFA EE control block
89 ** register to NFA SYS
90 **
91 ** Returns None
92 **
93 *******************************************************************************/
nfa_ee_init(void)94 void nfa_ee_init(void) {
95 int xx;
96
97 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
98
99 /* initialize control block */
100 memset(&nfa_ee_cb, 0, sizeof(tNFA_EE_CB));
101 for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++) {
102 nfa_ee_cb.ecb[xx].nfcee_id = NFA_EE_INVALID;
103 nfa_ee_cb.ecb[xx].ee_status = NFC_NFCEE_STATUS_INACTIVE;
104 }
105
106 nfa_ee_cb.ecb[NFA_EE_CB_4_DH].ee_status = NFC_NFCEE_STATUS_ACTIVE;
107 nfa_ee_cb.ecb[NFA_EE_CB_4_DH].nfcee_id = NFC_DH_ID;
108
109 /* register message handler on NFA SYS */
110 nfa_sys_register(NFA_ID_EE, &nfa_ee_sys_reg);
111 }
112
113 /*******************************************************************************
114 **
115 ** Function nfa_ee_sys_enable
116 **
117 ** Description Enable NFA EE
118 **
119 ** Returns None
120 **
121 *******************************************************************************/
nfa_ee_sys_enable(void)122 void nfa_ee_sys_enable(void) {
123 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", __func__);
124
125 nfa_ee_cb.route_block_control = 0x00;
126
127 if (NfcConfig::hasKey(NAME_NFA_AID_BLOCK_ROUTE)) {
128 unsigned retlen = NfcConfig::getUnsigned(NAME_NFA_AID_BLOCK_ROUTE);
129 if ((retlen == 0x01) && (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
130 nfa_ee_cb.route_block_control = NCI_ROUTE_QUAL_BLOCK_ROUTE;
131 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
132 "nfa_ee_cb.route_block_control=0x%x", nfa_ee_cb.route_block_control);
133 }
134 }
135
136 if (nfa_ee_max_ee_cfg) {
137 /* collect NFCEE information */
138 NFC_NfceeDiscover(true);
139 nfa_sys_start_timer(&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT,
140 NFA_EE_DISCV_TIMEOUT_VAL);
141 } else {
142 nfa_ee_cb.em_state = NFA_EE_EM_STATE_INIT_DONE;
143 nfa_sys_cback_notify_enable_complete(NFA_ID_EE);
144 }
145 }
146
147 /*******************************************************************************
148 **
149 ** Function nfa_ee_restore_one_ecb
150 **
151 ** Description activate the NFCEE and restore the routing when
152 ** changing power state from low power mode to full power mode
153 **
154 ** Returns None
155 **
156 *******************************************************************************/
nfa_ee_restore_one_ecb(tNFA_EE_ECB * p_cb)157 void nfa_ee_restore_one_ecb(tNFA_EE_ECB* p_cb) {
158 uint8_t mask;
159 tNFC_NFCEE_MODE_SET_REVT rsp;
160 tNFA_EE_NCI_MODE_SET ee_msg;
161
162 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
163 "nfcee_id:0x%x, ecb_flags:0x%x ee_status:0x%x "
164 "ee_old_status: 0x%x",
165 p_cb->nfcee_id, p_cb->ecb_flags, p_cb->ee_status, p_cb->ee_old_status);
166 if ((p_cb->nfcee_id != NFA_EE_INVALID) &&
167 (p_cb->ee_status & NFA_EE_STATUS_RESTORING) == 0 &&
168 (p_cb->ee_old_status & NFA_EE_STATUS_RESTORING) != 0) {
169 p_cb->ee_old_status &= ~NFA_EE_STATUS_RESTORING;
170 mask = nfa_ee_ecb_to_mask(p_cb);
171 if (p_cb->ee_status != p_cb->ee_old_status) {
172 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
173 if (p_cb->ee_old_status == NFC_NFCEE_STATUS_ACTIVE) {
174 NFC_NfceeModeSet(p_cb->nfcee_id, NFC_MODE_ACTIVATE);
175
176 if (nfa_ee_cb.ee_cfged & mask) {
177 /* if any routing is configured on this NFCEE. need to mark this NFCEE
178 * as changed
179 * to cause the configuration to be sent to NFCC again */
180 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
181 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
182 }
183 } else {
184 NFC_NfceeModeSet(p_cb->nfcee_id, NFC_MODE_DEACTIVATE);
185 }
186 } else if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE) {
187 /* the initial NFCEE status after start up is the same as the current
188 * status and it's active:
189 * process the same as the host gets activate rsp */
190 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
191 if (nfa_ee_cb.ee_cfged & mask) {
192 /* if any routing is configured on this NFCEE. need to mark this NFCEE
193 * as changed
194 * to cause the configuration to be sent to NFCC again */
195 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
196 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
197 }
198 rsp.mode = NFA_EE_MD_ACTIVATE;
199 rsp.nfcee_id = p_cb->nfcee_id;
200 rsp.status = NFA_STATUS_OK;
201 ee_msg.p_data = &rsp;
202 tNFA_EE_MSG nfa_ee_msg;
203 nfa_ee_msg.mode_set_rsp = ee_msg;
204 nfa_ee_nci_mode_set_rsp(&nfa_ee_msg);
205 }
206 }
207 }
208
209 /*******************************************************************************
210 **
211 ** Function nfa_ee_proc_nfcc_power_mode
212 **
213 ** Description Restore NFA EE sub-module
214 **
215 ** Returns None
216 **
217 *******************************************************************************/
nfa_ee_proc_nfcc_power_mode(uint8_t nfcc_power_mode)218 void nfa_ee_proc_nfcc_power_mode(uint8_t nfcc_power_mode) {
219 uint32_t xx;
220 tNFA_EE_ECB* p_cb;
221 bool proc_complete = true;
222
223 DLOG_IF(INFO, nfc_debug_enabled)
224 << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
225 /* if NFCC power state is change to full power */
226 if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
227 if (nfa_ee_max_ee_cfg) {
228 p_cb = nfa_ee_cb.ecb;
229 for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
230 p_cb->ee_old_status = 0;
231 if (xx >= nfa_ee_cb.cur_ee) p_cb->nfcee_id = NFA_EE_INVALID;
232
233 if ((p_cb->nfcee_id != NFA_EE_INVALID) &&
234 (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS) &&
235 (p_cb->ee_status != NFA_EE_STATUS_REMOVED)) {
236 proc_complete = false;
237 /* NFA_EE_STATUS_RESTORING bit makes sure the ee_status restore to
238 * ee_old_status
239 * NFA_EE_STATUS_RESTORING bit is cleared in ee_status at
240 * NFCEE_DISCOVER NTF.
241 * NFA_EE_STATUS_RESTORING bit is cleared in ee_old_status at
242 * restoring the activate/inactive status after NFCEE_DISCOVER NTF */
243 p_cb->ee_status |= NFA_EE_STATUS_RESTORING;
244 p_cb->ee_old_status = p_cb->ee_status;
245 /* NFA_EE_FLAGS_RESTORE bit makes sure the routing/nci logical
246 * connection is restore to prior to entering low power mode */
247 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
248 }
249 }
250 nfa_ee_cb.em_state = NFA_EE_EM_STATE_RESTORING;
251 nfa_ee_cb.num_ee_expecting = 0;
252 if (nfa_sys_is_register(NFA_ID_HCI)) {
253 nfa_ee_cb.ee_flags |= NFA_EE_FLAG_WAIT_HCI;
254 nfa_ee_cb.ee_flags |= NFA_EE_FLAG_NOTIFY_HCI;
255 }
256 NFC_NfceeDiscover(true);
257 nfa_sys_start_timer(&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT,
258 NFA_EE_DISCV_TIMEOUT_VAL);
259 }
260 } else {
261 nfa_sys_stop_timer(&nfa_ee_cb.timer);
262 nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
263 nfa_ee_cb.num_ee_expecting = 0;
264 }
265
266 if (proc_complete)
267 nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_EE);
268 }
269
270 /*******************************************************************************
271 **
272 ** Function nfa_ee_proc_hci_info_cback
273 **
274 ** Description HCI initialization complete from power off sleep mode
275 **
276 ** Returns None
277 **
278 *******************************************************************************/
nfa_ee_proc_hci_info_cback(void)279 void nfa_ee_proc_hci_info_cback(void) {
280 uint32_t xx;
281 tNFA_EE_ECB* p_cb;
282 tNFA_EE_MSG data;
283
284 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
285 /* if NFCC power state is change to full power */
286 nfa_ee_cb.ee_flags &= ~NFA_EE_FLAG_WAIT_HCI;
287
288 p_cb = nfa_ee_cb.ecb;
289 for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
290 /* NCI spec says: An NFCEE_DISCOVER_NTF that contains a Protocol type of
291 * "HCI Access"
292 * SHALL NOT contain any other additional Protocol
293 * i.e. check only first supported NFCEE interface is HCI access */
294 /* NFA_HCI module handles restoring configurations for HCI access */
295 if (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS) {
296 nfa_ee_restore_one_ecb(p_cb);
297 }
298 }
299
300 if (nfa_ee_restore_ntf_done()) {
301 nfa_ee_check_restore_complete();
302 if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT_DONE) {
303 if (nfa_ee_cb.discv_timer.in_use) {
304 nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
305 data.hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
306 nfa_ee_evt_hdlr(&data.hdr);
307 }
308 }
309 }
310 }
311
312 /*******************************************************************************
313 **
314 ** Function nfa_ee_proc_evt
315 **
316 ** Description Process NFCEE related events from NFC stack
317 **
318 **
319 ** Returns None
320 **
321 *******************************************************************************/
nfa_ee_proc_evt(tNFC_RESPONSE_EVT event,void * p_data)322 void nfa_ee_proc_evt(tNFC_RESPONSE_EVT event, void* p_data) {
323 tNFA_EE_INT_EVT int_event = 0;
324 tNFA_EE_NCI_WAIT_RSP cbk;
325
326 switch (event) {
327 case NFC_NFCEE_DISCOVER_REVT: /* 4 NFCEE Discover response */
328 int_event = NFA_EE_NCI_DISC_RSP_EVT;
329 break;
330
331 case NFC_NFCEE_INFO_REVT: /* 5 NFCEE Discover Notification */
332 int_event = NFA_EE_NCI_DISC_NTF_EVT;
333 break;
334
335 case NFC_NFCEE_MODE_SET_REVT: /* 6 NFCEE Mode Set response */
336 int_event = NFA_EE_NCI_MODE_SET_RSP_EVT;
337 break;
338
339 case NFC_EE_ACTION_REVT:
340 int_event = NFA_EE_NCI_ACTION_NTF_EVT;
341 break;
342
343 case NFC_EE_DISCOVER_REQ_REVT: /* 10 EE Discover Req notification */
344 int_event = NFA_EE_NCI_DISC_REQ_NTF_EVT;
345 break;
346
347 case NFC_SET_ROUTING_REVT:
348 int_event = NFA_EE_NCI_WAIT_RSP_EVT;
349 cbk.opcode = NCI_MSG_RF_SET_ROUTING;
350 break;
351
352 case NFC_NFCEE_STATUS_REVT:
353 int_event = NFA_EE_NCI_NFCEE_STATUS_NTF_EVT;
354 break;
355 }
356
357 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
358 "nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event, int_event);
359 if (int_event) {
360 cbk.hdr.event = int_event;
361 cbk.p_data = p_data;
362 tNFA_EE_MSG nfa_ee_msg;
363 nfa_ee_msg.wait_rsp = cbk;
364
365 nfa_ee_evt_hdlr(&nfa_ee_msg.hdr);
366 }
367 }
368
369 /*******************************************************************************
370 **
371 ** Function nfa_ee_ecb_to_mask
372 **
373 ** Description Given a ecb, return the bit mask to be used in
374 ** nfa_ee_cb.ee_cfged
375 **
376 ** Returns the bitmask for the given ecb.
377 **
378 *******************************************************************************/
nfa_ee_ecb_to_mask(tNFA_EE_ECB * p_cb)379 uint8_t nfa_ee_ecb_to_mask(tNFA_EE_ECB* p_cb) {
380 uint8_t mask;
381 uint8_t index;
382
383 index = (uint8_t)(p_cb - nfa_ee_cb.ecb);
384 mask = 1 << index;
385
386 return mask;
387 }
388
389 /*******************************************************************************
390 **
391 ** Function nfa_ee_find_ecb
392 **
393 ** Description Return the ecb associated with the given nfcee_id
394 **
395 ** Returns tNFA_EE_ECB
396 **
397 *******************************************************************************/
nfa_ee_find_ecb(uint8_t nfcee_id)398 tNFA_EE_ECB* nfa_ee_find_ecb(uint8_t nfcee_id) {
399 uint32_t xx;
400 tNFA_EE_ECB *p_ret = NULL, *p_cb;
401 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
402
403 if (nfcee_id == NFC_DH_ID) {
404 p_ret = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
405 } else {
406 p_cb = nfa_ee_cb.ecb;
407 for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
408 if (nfcee_id == p_cb->nfcee_id) {
409 p_ret = p_cb;
410 break;
411 }
412 }
413 }
414
415 return p_ret;
416 }
417
418 /*******************************************************************************
419 **
420 ** Function nfa_ee_find_ecb_by_conn_id
421 **
422 ** Description Return the ecb associated with the given connection id
423 **
424 ** Returns tNFA_EE_ECB
425 **
426 *******************************************************************************/
nfa_ee_find_ecb_by_conn_id(uint8_t conn_id)427 tNFA_EE_ECB* nfa_ee_find_ecb_by_conn_id(uint8_t conn_id) {
428 uint32_t xx;
429 tNFA_EE_ECB *p_ret = NULL, *p_cb;
430 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
431
432 p_cb = nfa_ee_cb.ecb;
433 for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
434 if (conn_id == p_cb->conn_id) {
435 p_ret = p_cb;
436 break;
437 }
438 }
439
440 return p_ret;
441 }
442
443 /*******************************************************************************
444 **
445 ** Function nfa_ee_sys_disable
446 **
447 ** Description Deregister NFA EE from NFA SYS/DM
448 **
449 **
450 ** Returns None
451 **
452 *******************************************************************************/
nfa_ee_sys_disable(void)453 void nfa_ee_sys_disable(void) {
454 uint32_t xx;
455 tNFA_EE_ECB* p_cb;
456 tNFA_EE_MSG msg;
457
458 DLOG_IF(INFO, nfc_debug_enabled) << __func__;
459
460 nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
461 /* report NFA_EE_DEREGISTER_EVT to all registered to EE */
462 for (xx = 0; xx < NFA_EE_MAX_CBACKS; xx++) {
463 if (nfa_ee_cb.p_ee_cback[xx]) {
464 msg.deregister.index = xx;
465 nfa_ee_api_deregister(&msg);
466 }
467 }
468
469 nfa_ee_cb.num_ee_expecting = 0;
470 p_cb = nfa_ee_cb.ecb;
471 for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
472 if (p_cb->conn_st == NFA_EE_CONN_ST_CONN) {
473 if (nfa_sys_is_graceful_disable()) {
474 /* Disconnect NCI connection on graceful shutdown */
475 msg.disconnect.p_cb = p_cb;
476 nfa_ee_api_disconnect(&msg);
477 nfa_ee_cb.num_ee_expecting++;
478 } else {
479 /* fake NFA_EE_DISCONNECT_EVT on ungraceful shutdown */
480 msg.conn.conn_id = p_cb->conn_id;
481 msg.conn.event = NFC_CONN_CLOSE_CEVT;
482 nfa_ee_nci_conn(&msg);
483 }
484 }
485 }
486
487 if (nfa_ee_cb.num_ee_expecting) {
488 nfa_ee_cb.ee_flags |= NFA_EE_FLAG_WAIT_DISCONN;
489 nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLING;
490 }
491
492 nfa_sys_stop_timer(&nfa_ee_cb.timer);
493 nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
494
495 /* If Application initiated NFCEE discovery, fake/report the event */
496 nfa_ee_report_disc_done(false);
497
498 /* deregister message handler on NFA SYS */
499 if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_DISABLED)
500 nfa_sys_deregister(NFA_ID_EE);
501 }
502
503 /*******************************************************************************
504 **
505 ** Function nfa_ee_check_disable
506 **
507 ** Description Check if it is safe to move to disabled state
508 **
509 ** Returns None
510 **
511 *******************************************************************************/
nfa_ee_check_disable(void)512 void nfa_ee_check_disable(void) {
513 if (!(nfa_ee_cb.ee_flags & NFA_EE_FLAG_WAIT_DISCONN)) {
514 nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
515 nfa_sys_deregister(NFA_ID_EE);
516 }
517 }
518 /*******************************************************************************
519 **
520 ** Function nfa_ee_reg_cback_enable_done
521 **
522 ** Description Allow a module to register to EE to be notified when NFA-EE
523 ** finishes enable process
524 **
525 ** Returns None
526 **
527 *******************************************************************************/
nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK * p_cback)528 void nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK* p_cback) {
529 nfa_ee_cb.p_enable_cback = p_cback;
530 }
531
532 /*******************************************************************************
533 **
534 ** Function nfa_ee_sm_st_2_str
535 **
536 ** Description convert nfa-ee state to string
537 **
538 *******************************************************************************/
nfa_ee_sm_st_2_str(uint8_t state)539 static std::string nfa_ee_sm_st_2_str(uint8_t state) {
540 switch (state) {
541 case NFA_EE_EM_STATE_INIT:
542 return "INIT";
543 case NFA_EE_EM_STATE_INIT_DONE:
544 return "INIT_DONE";
545 case NFA_EE_EM_STATE_RESTORING:
546 return "RESTORING";
547 case NFA_EE_EM_STATE_DISABLING:
548 return "DISABLING";
549 case NFA_EE_EM_STATE_DISABLED:
550 return "DISABLED";
551 default:
552 return "Unknown";
553 }
554 }
555
556 /*******************************************************************************
557 **
558 ** Function nfa_ee_sm_evt_2_str
559 **
560 ** Description convert nfa-ee evt to string
561 **
562 *******************************************************************************/
nfa_ee_sm_evt_2_str(uint16_t event)563 static std::string nfa_ee_sm_evt_2_str(uint16_t event) {
564 switch (event) {
565 case NFA_EE_API_DISCOVER_EVT:
566 return "API_DISCOVER";
567 case NFA_EE_API_REGISTER_EVT:
568 return "API_REGISTER";
569 case NFA_EE_API_DEREGISTER_EVT:
570 return "API_DEREGISTER";
571 case NFA_EE_API_MODE_SET_EVT:
572 return "API_MODE_SET";
573 case NFA_EE_API_SET_TECH_CFG_EVT:
574 return "API_SET_TECH_CFG";
575 case NFA_EE_API_SET_PROTO_CFG_EVT:
576 return "API_SET_PROTO_CFG";
577 case NFA_EE_API_ADD_AID_EVT:
578 return "API_ADD_AID";
579 case NFA_EE_API_REMOVE_AID_EVT:
580 return "API_REMOVE_AID";
581 case NFA_EE_API_ADD_SYSCODE_EVT:
582 return "NFA_EE_API_ADD_SYSCODE_EVT";
583 case NFA_EE_API_REMOVE_SYSCODE_EVT:
584 return "NFA_EE_API_REMOVE_SYSCODE_EVT";
585 case NFA_EE_API_LMRT_SIZE_EVT:
586 return "API_LMRT_SIZE";
587 case NFA_EE_API_UPDATE_NOW_EVT:
588 return "API_UPDATE_NOW";
589 case NFA_EE_API_CONNECT_EVT:
590 return "API_CONNECT";
591 case NFA_EE_API_SEND_DATA_EVT:
592 return "API_SEND_DATA";
593 case NFA_EE_API_DISCONNECT_EVT:
594 return "API_DISCONNECT";
595 case NFA_EE_NCI_DISC_RSP_EVT:
596 return "NCI_DISC_RSP";
597 case NFA_EE_NCI_DISC_NTF_EVT:
598 return "NCI_DISC_NTF";
599 case NFA_EE_NCI_MODE_SET_RSP_EVT:
600 return "NCI_MODE_SET";
601 case NFA_EE_NCI_CONN_EVT:
602 return "NCI_CONN";
603 case NFA_EE_NCI_DATA_EVT:
604 return "NCI_DATA";
605 case NFA_EE_NCI_ACTION_NTF_EVT:
606 return "NCI_ACTION";
607 case NFA_EE_NCI_DISC_REQ_NTF_EVT:
608 return "NCI_DISC_REQ";
609 case NFA_EE_NCI_WAIT_RSP_EVT:
610 return "NCI_WAIT_RSP";
611 case NFA_EE_ROUT_TIMEOUT_EVT:
612 return "ROUT_TIMEOUT";
613 case NFA_EE_DISCV_TIMEOUT_EVT:
614 return "NFA_EE_DISCV_TIMEOUT_EVT";
615 case NFA_EE_CFG_TO_NFCC_EVT:
616 return "CFG_TO_NFCC";
617 default:
618 return "Unknown";
619 }
620 }
621
622 /*******************************************************************************
623 **
624 ** Function nfa_ee_evt_hdlr
625 **
626 ** Description Processing event for NFA EE
627 **
628 **
629 ** Returns TRUE if p_msg needs to be deallocated
630 **
631 *******************************************************************************/
nfa_ee_evt_hdlr(NFC_HDR * p_msg)632 bool nfa_ee_evt_hdlr(NFC_HDR* p_msg) {
633 bool act = false;
634
635 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
636 "Event %s(0x%02x), State: %s(%d)",
637 nfa_ee_sm_evt_2_str(p_msg->event).c_str(), p_msg->event,
638 nfa_ee_sm_st_2_str(nfa_ee_cb.em_state).c_str(), nfa_ee_cb.em_state);
639
640 switch (nfa_ee_cb.em_state) {
641 case NFA_EE_EM_STATE_INIT_DONE:
642 case NFA_EE_EM_STATE_RESTORING:
643 act = true;
644 break;
645 case NFA_EE_EM_STATE_INIT:
646 if ((p_msg->event == NFA_EE_NCI_DISC_NTF_EVT) ||
647 (p_msg->event == NFA_EE_NCI_DISC_RSP_EVT))
648 act = true;
649 break;
650 case NFA_EE_EM_STATE_DISABLING:
651 if (p_msg->event == NFA_EE_NCI_CONN_EVT) act = true;
652 break;
653 }
654
655 tNFA_EE_MSG* p_evt_data = (tNFA_EE_MSG*)p_msg;
656 if (act) {
657 uint16_t event = p_msg->event & 0x00ff;
658 if (event < NFA_EE_NUM_ACTIONS) {
659 (*nfa_ee_actions[event])(p_evt_data);
660 }
661 } else {
662 /* If the event is not handled, free the data packet. */
663 /* FIXME: Is it really always tNFA_EE_NCI_CONN? */
664 if (p_msg->event == NFA_EE_NCI_DATA_EVT)
665 GKI_freebuf(p_evt_data->conn.p_data);
666 }
667
668 return true;
669 }
670