1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This is the main implementation file for the NFA EE.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
25c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna#include "config.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_dm_int.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h"
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys.h"
296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys_int.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_api.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern void nfa_ee_vs_cback(tNFC_VS_EVT event, NFC_HDR* p_data);
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Global Variables
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* system manager control block definition */
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_EE_CB nfa_ee_cb;
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Constants
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic const tNFA_SYS_REG nfa_ee_sys_reg = {nfa_ee_sys_enable, nfa_ee_evt_hdlr,
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                            nfa_ee_sys_disable,
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                            nfa_ee_proc_nfcc_power_mode};
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFA_EE_NUM_ACTIONS (NFA_EE_MAX_EVT & 0x00ff)
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tNFA_EE_SM_ACT nfa_ee_actions[] = {
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* NFA-EE action function/ internal events */
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_discover,      /* NFA_EE_API_DISCOVER_EVT      */
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_register,      /* NFA_EE_API_REGISTER_EVT      */
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_deregister,    /* NFA_EE_API_DEREGISTER_EVT    */
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_mode_set,      /* NFA_EE_API_MODE_SET_EVT      */
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_set_tech_cfg,  /* NFA_EE_API_SET_TECH_CFG_EVT  */
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_set_proto_cfg, /* NFA_EE_API_SET_PROTO_CFG_EVT */
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_add_aid,       /* NFA_EE_API_ADD_AID_EVT       */
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_remove_aid,    /* NFA_EE_API_REMOVE_AID_EVT    */
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_lmrt_size,     /* NFA_EE_API_LMRT_SIZE_EVT     */
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_update_now,    /* NFA_EE_API_UPDATE_NOW_EVT    */
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_connect,       /* NFA_EE_API_CONNECT_EVT       */
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_send_data,     /* NFA_EE_API_SEND_DATA_EVT     */
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_api_disconnect,    /* NFA_EE_API_DISCONNECT_EVT    */
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_disc_rsp,      /* NFA_EE_NCI_DISC_RSP_EVT      */
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_disc_ntf,      /* NFA_EE_NCI_DISC_NTF_EVT      */
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_mode_set_rsp,  /* NFA_EE_NCI_MODE_SET_RSP_EVT  */
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_conn,          /* NFA_EE_NCI_CONN_EVT          */
686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_conn,          /* NFA_EE_NCI_DATA_EVT          */
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_action_ntf,    /* NFA_EE_NCI_ACTION_NTF_EVT    */
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_disc_req_ntf,  /* NFA_EE_NCI_DISC_REQ_NTF_EVT  */
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_nci_wait_rsp,      /* NFA_EE_NCI_WAIT_RSP_EVT      */
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_rout_timeout,      /* NFA_EE_ROUT_TIMEOUT_EVT      */
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_discv_timeout,     /* NFA_EE_DISCV_TIMEOUT_EVT     */
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_lmrt_to_nfcc       /* NFA_EE_CFG_TO_NFCC_EVT       */
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_init
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialize NFA EE control block
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  register to NFA SYS
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_init(void) {
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_ee_init ()");
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* initialize control block */
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(&nfa_ee_cb, 0, sizeof(tNFA_EE_CB));
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++) {
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.ecb[xx].nfcee_id = NFA_EE_INVALID;
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.ecb[xx].ee_status = NFC_NFCEE_STATUS_INACTIVE;
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.ecb[NFA_EE_CB_4_DH].ee_status = NFC_NFCEE_STATUS_ACTIVE;
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.ecb[NFA_EE_CB_4_DH].nfcee_id = NFC_DH_ID;
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* register message handler on NFA SYS */
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_register(NFA_ID_EE, &nfa_ee_sys_reg);
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_sys_enable
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Enable NFA EE
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_sys_enable(void) {
116c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna  unsigned long retlen = 0;
117c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna
118c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna  NFA_TRACE_DEBUG1("%s", __func__);
119c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna
120c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna  nfa_ee_cb.route_block_control = 0x00;
121c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna
122c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna  if (GetNumValue(NAME_NFA_AID_BLOCK_ROUTE, (void*)&retlen, sizeof(retlen))) {
123c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna    if ((retlen == 0x01) && (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
124c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna      nfa_ee_cb.route_block_control = NCI_ROUTE_QUAL_BLOCK_ROUTE;
125c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna      NFA_TRACE_DEBUG1("nfa_ee_cb.route_block_control=0x%x",
126c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna                       nfa_ee_cb.route_block_control);
127c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna    }
128c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna  }
129c6bd78b8abf1ac3ba685648be47fbd7e80bf9cfdLove Khanna
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_ee_max_ee_cfg) {
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* collect NFCEE information */
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFC_NfceeDiscover(true);
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_start_timer(&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT,
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        NFA_EE_DISCV_TIMEOUT_VAL);
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.em_state = NFA_EE_EM_STATE_INIT_DONE;
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_cback_notify_enable_complete(NFA_ID_EE);
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_restore_one_ecb
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      activate the NFCEE and restore the routing when
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  changing power state from low power mode to full power mode
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_restore_one_ecb(tNFA_EE_ECB* p_cb) {
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t mask;
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_NFCEE_MODE_SET_REVT rsp;
1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_NCI_MODE_SET ee_msg;
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG4(
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_ee_restore_one_ecb () nfcee_id:0x%x, ecb_flags:0x%x ee_status:0x%x "
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "ee_old_status: 0x%x",
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->nfcee_id, p_cb->ecb_flags, p_cb->ee_status, p_cb->ee_old_status);
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_cb->nfcee_id != NFA_EE_INVALID) &&
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_cb->ee_status & NFA_EE_STATUS_RESTORING) == 0 &&
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_cb->ee_old_status & NFA_EE_STATUS_RESTORING) != 0) {
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->ee_old_status &= ~NFA_EE_STATUS_RESTORING;
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    mask = nfa_ee_ecb_to_mask(p_cb);
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->ee_status != p_cb->ee_old_status) {
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->ee_old_status == NFC_NFCEE_STATUS_ACTIVE) {
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_NfceeModeSet(p_cb->nfcee_id, NFC_MODE_ACTIVATE);
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (nfa_ee_cb.ee_cfged & mask) {
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if any routing is configured on this NFCEE. need to mark this NFCEE
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * as changed
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * to cause the configuration to be sent to NFCC again */
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_NfceeModeSet(p_cb->nfcee_id, NFC_MODE_DEACTIVATE);
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE) {
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* the initial NFCEE status after start up is the same as the current
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * status and it's active:
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * process the same as the host gets activate rsp */
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_ee_cb.ee_cfged & mask) {
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if any routing is configured on this NFCEE. need to mark this NFCEE
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * as changed
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * to cause the configuration to be sent to NFCC again */
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rsp.mode = NFA_EE_MD_ACTIVATE;
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rsp.nfcee_id = p_cb->nfcee_id;
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rsp.status = NFA_STATUS_OK;
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ee_msg.p_data = &rsp;
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ee_nci_mode_set_rsp((tNFA_EE_MSG*)&ee_msg);
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_proc_nfcc_power_mode
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Restore NFA EE sub-module
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_proc_nfcc_power_mode(uint8_t nfcc_power_mode) {
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t xx;
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_ECB* p_cb;
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool proc_complete = true;
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_ee_proc_nfcc_power_mode (): nfcc_power_mode=%d",
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   nfcc_power_mode);
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if NFCC power state is change to full power */
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ee_max_ee_cfg) {
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb = nfa_ee_cb.ecb;
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->ee_old_status = 0;
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (xx >= nfa_ee_cb.cur_ee) p_cb->nfcee_id = NFA_EE_INVALID;
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_cb->nfcee_id != NFA_EE_INVALID) &&
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS) &&
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cb->ee_status != NFA_EE_STATUS_REMOVED)) {
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          proc_complete = false;
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* NFA_EE_STATUS_RESTORING bit makes sure the ee_status restore to
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * ee_old_status
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * NFA_EE_STATUS_RESTORING bit is cleared in ee_status at
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * NFCEE_DISCOVER NTF.
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * NFA_EE_STATUS_RESTORING bit is cleared in ee_old_status at
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * restoring the activate/inactive status after NFCEE_DISCOVER NTF */
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->ee_status |= NFA_EE_STATUS_RESTORING;
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->ee_old_status = p_cb->ee_status;
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* NFA_EE_FLAGS_RESTORE bit makes sure the routing/nci logical
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * connection is restore to prior to entering low power mode */
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_RESTORE;
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ee_cb.em_state = NFA_EE_EM_STATE_RESTORING;
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ee_cb.num_ee_expecting = 0;
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_sys_is_register(NFA_ID_HCI)) {
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_cb.ee_flags |= NFA_EE_FLAG_WAIT_HCI;
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_cb.ee_flags |= NFA_EE_FLAG_NOTIFY_HCI;
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_NfceeDiscover(true);
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_sys_start_timer(&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT,
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          NFA_EE_DISCV_TIMEOUT_VAL);
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_stop_timer(&nfa_ee_cb.timer);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.num_ee_expecting = 0;
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (proc_complete)
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_EE);
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_proc_hci_info_cback
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      HCI initialization complete from power off sleep mode
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_proc_hci_info_cback(void) {
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t xx;
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_ECB* p_cb;
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_MSG data;
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_ee_proc_hci_info_cback ()");
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if NFCC power state is change to full power */
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.ee_flags &= ~NFA_EE_FLAG_WAIT_HCI;
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb = nfa_ee_cb.ecb;
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NCI spec says: An NFCEE_DISCOVER_NTF that contains a Protocol type of
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * "HCI Access"
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * SHALL NOT contain any other additional Protocol
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * i.e. check only first supported NFCEE interface is HCI access */
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NFA_HCI module handles restoring configurations for HCI access */
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS) {
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ee_restore_one_ecb(p_cb);
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_ee_restore_ntf_done()) {
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_check_restore_complete();
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT_DONE) {
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_ee_cb.discv_timer.in_use) {
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        data.hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_evt_hdlr((NFC_HDR*)&data);
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
30045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_proc_evt
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NFCEE related events from NFC stack
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_proc_evt(tNFC_RESPONSE_EVT event, void* p_data) {
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_INT_EVT int_event = 0;
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_NCI_WAIT_RSP cbk;
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_hdr;
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFC_NFCEE_DISCOVER_REVT: /* 4  NFCEE Discover response */
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_DISC_RSP_EVT;
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFC_NFCEE_INFO_REVT: /* 5  NFCEE Discover Notification */
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_DISC_NTF_EVT;
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFC_NFCEE_MODE_SET_REVT: /* 6  NFCEE Mode Set response */
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_MODE_SET_RSP_EVT;
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_EE_ACTION_REVT:
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_ACTION_NTF_EVT;
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFC_EE_DISCOVER_REQ_REVT: /* 10 EE Discover Req notification */
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_DISC_REQ_NTF_EVT;
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34040e67c9ec7191cbda00cde97e4f988d1d5737762Sherry Smith    case NFC_SET_ROUTING_REVT:
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      int_event = NFA_EE_NCI_WAIT_RSP_EVT;
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      cbk.opcode = NCI_MSG_RF_SET_ROUTING;
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG2("nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event,
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   int_event);
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (int_event) {
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_hdr = (NFC_HDR*)&cbk;
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    cbk.hdr.event = int_event;
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    cbk.p_data = p_data;
3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_evt_hdlr(p_hdr);
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_ecb_to_mask
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
361552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Given a ecb, return the bit mask to be used in
362552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  nfa_ee_cb.ee_cfged
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          the bitmask for the given ecb.
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t nfa_ee_ecb_to_mask(tNFA_EE_ECB* p_cb) {
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t mask;
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t index;
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  index = (uint8_t)(p_cb - nfa_ee_cb.ecb);
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  mask = 1 << index;
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return mask;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_find_ecb
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return the ecb associated with the given nfcee_id
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFA_EE_ECB
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_EE_ECB* nfa_ee_find_ecb(uint8_t nfcee_id) {
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t xx;
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_ECB *p_ret = NULL, *p_cb;
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_ee_find_ecb ()");
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfcee_id == NFC_DH_ID) {
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ret = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb = nfa_ee_cb.ecb;
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++) {
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfcee_id == p_cb->nfcee_id) {
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_ret = p_cb;
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_find_ecb_by_conn_id
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return the ecb associated with the given connection id
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFA_EE_ECB
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_EE_ECB* nfa_ee_find_ecb_by_conn_id(uint8_t conn_id) {
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t xx;
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_ECB *p_ret = NULL, *p_cb;
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_ee_find_ecb_by_conn_id ()");
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb = nfa_ee_cb.ecb;
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (conn_id == p_cb->conn_id) {
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ret = p_cb;
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_sys_disable
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister NFA EE from NFA SYS/DM
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_sys_disable(void) {
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t xx;
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_ECB* p_cb;
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_MSG msg;
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_ee_sys_disable ()");
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* report NFA_EE_DEREGISTER_EVT to all registered to EE */
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_EE_MAX_CBACKS; xx++) {
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ee_cb.p_ee_cback[xx]) {
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      msg.deregister.index = xx;
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ee_api_deregister(&msg);
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.num_ee_expecting = 0;
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb = nfa_ee_cb.ecb;
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->conn_st == NFA_EE_CONN_ST_CONN) {
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_sys_is_graceful_disable()) {
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Disconnect NCI connection on graceful shutdown */
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        msg.disconnect.p_cb = p_cb;
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_api_disconnect(&msg);
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_cb.num_ee_expecting++;
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* fake NFA_EE_DISCONNECT_EVT on ungraceful shutdown */
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        msg.conn.conn_id = p_cb->conn_id;
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        msg.conn.event = NFC_CONN_CLOSE_CEVT;
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ee_nci_conn(&msg);
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_ee_cb.num_ee_expecting) {
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.ee_flags |= NFA_EE_FLAG_WAIT_DISCONN;
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLING;
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_stop_timer(&nfa_ee_cb.timer);
4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If Application initiated NFCEE discovery, fake/report the event */
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_report_disc_done(false);
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* deregister message handler on NFA SYS */
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_DISABLED)
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_deregister(NFA_ID_EE);
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
4905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
4925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfa_ee_check_disable
4945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Check if it is safe to move to disabled state
4965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          None
4985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_check_disable(void) {
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!(nfa_ee_cb.ee_flags & NFA_EE_FLAG_WAIT_DISCONN)) {
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_deregister(NFA_ID_EE);
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_reg_cback_enable_done
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allow a module to register to EE to be notified when NFA-EE
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  finishes enable process
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK* p_cback) {
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ee_cb.p_enable_cback = p_cback;
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_sm_st_2_str
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      convert nfa-ee state to string
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* nfa_ee_sm_st_2_str(uint8_t state) {
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (state) {
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_INIT:
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "INIT";
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_INIT_DONE:
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "INIT_DONE";
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_RESTORING:
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "RESTORING";
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_DISABLING:
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "DISABLING";
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_DISABLED:
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "DISABLED";
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "Unknown";
5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_sm_evt_2_str
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      convert nfa-ee evt to string
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* nfa_ee_sm_evt_2_str(uint16_t event) {
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_DISCOVER_EVT:
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_DISCOVER";
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_REGISTER_EVT:
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_REGISTER";
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_DEREGISTER_EVT:
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_DEREGISTER";
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_MODE_SET_EVT:
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_MODE_SET";
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_SET_TECH_CFG_EVT:
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_SET_TECH_CFG";
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_SET_PROTO_CFG_EVT:
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_SET_PROTO_CFG";
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_ADD_AID_EVT:
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_ADD_AID";
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_REMOVE_AID_EVT:
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_REMOVE_AID";
575ca0bff46ca93ed18142e20f03db5174399e1de75Sherry Smith    case NFA_EE_API_LMRT_SIZE_EVT:
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_LMRT_SIZE";
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_UPDATE_NOW_EVT:
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_UPDATE_NOW";
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_CONNECT_EVT:
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_CONNECT";
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_SEND_DATA_EVT:
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_SEND_DATA";
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_API_DISCONNECT_EVT:
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "API_DISCONNECT";
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_DISC_RSP_EVT:
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_DISC_RSP";
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_DISC_NTF_EVT:
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_DISC_NTF";
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_MODE_SET_RSP_EVT:
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_MODE_SET";
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_CONN_EVT:
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_CONN";
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_DATA_EVT:
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_DATA";
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_ACTION_NTF_EVT:
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_ACTION";
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_NCI_DISC_REQ_NTF_EVT:
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_DISC_REQ";
59940e67c9ec7191cbda00cde97e4f988d1d5737762Sherry Smith    case NFA_EE_NCI_WAIT_RSP_EVT:
6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NCI_WAIT_RSP";
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_ROUT_TIMEOUT_EVT:
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "ROUT_TIMEOUT";
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_DISCV_TIMEOUT_EVT:
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "NFA_EE_DISCV_TIMEOUT_EVT";
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_CFG_TO_NFCC_EVT:
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "CFG_TO_NFCC";
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return "Unknown";
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* BT_TRACE_VERBOSE */
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ee_evt_hdlr
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing event for NFA EE
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if p_msg needs to be deallocated
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ee_evt_hdlr(NFC_HDR* p_msg) {
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_EE_MSG* p_evt_data = (tNFA_EE_MSG*)p_msg;
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t event = p_msg->event & 0x00ff;
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool act = false;
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG4("nfa_ee_evt_hdlr (): Event %s(0x%02x), State: %s(%d)",
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   nfa_ee_sm_evt_2_str(p_evt_data->hdr.event),
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_evt_data->hdr.event,
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   nfa_ee_sm_st_2_str(nfa_ee_cb.em_state), nfa_ee_cb.em_state);
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG2("nfa_ee_evt_hdlr (): Event 0x%02x, State: %d",
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_evt_data->hdr.event, nfa_ee_cb.em_state);
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (nfa_ee_cb.em_state) {
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_INIT_DONE:
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_RESTORING:
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      act = true;
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_INIT:
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_msg->event == NFA_EE_NCI_DISC_NTF_EVT) ||
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_msg->event == NFA_EE_NCI_DISC_RSP_EVT))
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        act = true;
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_EE_EM_STATE_DISABLING:
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_msg->event == NFA_EE_NCI_CONN_EVT) act = true;
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (act) {
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event < NFA_EE_NUM_ACTIONS) {
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*nfa_ee_actions[event])(p_evt_data);
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if the data event is not handled by action function, free the data packet
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_msg->event == NFA_EE_NCI_DATA_EVT)
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_evt_data->conn.p_data);
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
665