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