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 system manager.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_api.h"
266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_dm_int.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_int.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_ptim.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* protocol timer update period, in milliseconds */
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFA_SYS_TIMER_PERIOD
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFA_SYS_TIMER_PERIOD 10
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* system manager control block definition */
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_SYS_CB nfa_sys_cb = {
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0,
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi}; /* nfa_sys control block. statically initialize 'flags' field to 0 */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_init
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      NFA initialization; called from task initialization.
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_init(void) {
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(&nfa_sys_cb, 0, sizeof(tNFA_SYS_CB));
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.flags |= NFA_SYS_FL_INITIALIZED;
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_ptim_init(&nfa_sys_cb.ptim_cb, NFA_SYS_TIMER_PERIOD,
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    p_nfa_sys_cfg->timer);
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.trace_level = p_nfa_sys_cfg->trace_level;
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_event
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      BTA event handler; called from task event handler.
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_event(NFC_HDR* p_msg) {
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t id;
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool freebuf = true;
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_EVENT1("NFA got event 0x%04X", p_msg->event);
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* get subsystem id from event */
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  id = (uint8_t)(p_msg->event >> 8);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* verify id and call subsystem event handler */
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((id < NFA_ID_MAX) && (nfa_sys_cb.is_reg[id])) {
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    freebuf = (*nfa_sys_cb.reg[id]->evt_hdlr)(p_msg);
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_WARNING1("NFA got unregistered event id %d", id);
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (freebuf) {
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_msg);
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_timer_update
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Update the BTA timer list and handle expired timers.
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_timer_update(void) {
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!nfa_sys_cb.timers_disabled) {
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_ptim_timer_update(&nfa_sys_cb.ptim_cb);
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_register
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called by other BTA subsystems to register their event
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  handler.
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_register(uint8_t id, const tNFA_SYS_REG* p_reg) {
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.reg[id] = (tNFA_SYS_REG*)p_reg;
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.is_reg[id] = true;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((id != NFA_ID_DM) && (id != NFA_ID_SYS))
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_cb.enable_cplt_mask |= (0x0001 << id);
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (id != NFA_ID_SYS) {
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_reg->proc_nfcc_pwr_mode)
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_sys_cb.proc_nfcc_pwr_mode_cplt_mask |= (0x0001 << id);
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG2("nfa_sys_register () id=%i, enable_cplt_mask=0x%x", id,
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   nfa_sys_cb.enable_cplt_mask);
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi}
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_check_disabled
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      If all subsystems above DM have been disabled, then
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  disable DM. Called during NFA shutdown
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_check_disabled(void) {
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t id;
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t done = true;
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if all subsystems above DM have been disabled. */
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (id = (NFA_ID_DM + 1); id < NFA_ID_MAX; id++) {
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_sys_cb.is_reg[id]) {
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* as long as one subsystem is not done */
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      done = false;
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* All subsystems disabled. disable DM */
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((done) && (nfa_sys_cb.is_reg[NFA_ID_DM])) {
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*nfa_sys_cb.reg[NFA_ID_DM]->disable)();
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_deregister
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called by other BTA subsystems to de-register
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  handler.
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_deregister(uint8_t id) {
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_sys: deregistering subsystem %i", id);
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.is_reg[id] = false;
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If not deregistering DM, then check if any other subsystems above DM are
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * still  */
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* registered. */
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (id != NFA_ID_DM) {
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If all subsystems above NFA_DM have been disabled, then okay to disable
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * DM */
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_check_disabled();
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* DM (the final sub-system) is deregistering. Clear pending timer events in
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * nfa_sys. */
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_ptim_init(&nfa_sys_cb.ptim_cb, NFA_SYS_TIMER_PERIOD,
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_nfa_sys_cfg->timer);
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_is_register
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called by other BTA subsystems to get registeration
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  status.
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_sys_is_register(uint8_t id) { return nfa_sys_cb.is_reg[id]; }
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_is_graceful_disable
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called by other BTA subsystems to get disable
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  parameter.
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_sys_is_graceful_disable(void) { return nfa_sys_cb.graceful_disable; }
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_enable_subsystems
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Call on NFA Start up
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_enable_subsystems(void) {
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t id;
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_sys: enabling subsystems");
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Enable all subsystems except SYS */
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) {
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_sys_cb.is_reg[id]) {
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_sys_cb.reg[id]->enable != NULL) {
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Subsytem has a Disable funciton. Call it now */
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*nfa_sys_cb.reg[id]->enable)();
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Subsytem does not have a Enable function. Report Enable on behalf of
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * subsystem */
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_sys_cback_notify_enable_complete(id);
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_disable_subsystems
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Call on NFA shutdown. Disable all subsystems above NFA_DM
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_disable_subsystems(bool graceful) {
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t id;
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool done = true;
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_sys: disabling subsystems:%d", graceful);
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_cb.graceful_disable = graceful;
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Disable all subsystems above NFA_DM. (NFA_DM and NFA_SYS will be disabled
2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * last) */
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (id = (NFA_ID_DM + 1); id < NFA_ID_MAX; id++) {
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_sys_cb.is_reg[id]) {
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      done = false;
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_sys_cb.reg[id]->disable != NULL) {
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Subsytem has a Disable funciton. Call it now */
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*nfa_sys_cb.reg[id]->disable)();
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Subsytem does not have a Disable function. Deregister on behalf of
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * subsystem */
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_sys_deregister(id);
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If All subsystems disabled. disable DM */
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((done) && (nfa_sys_cb.is_reg[NFA_ID_DM])) {
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*nfa_sys_cb.reg[NFA_ID_DM]->disable)();
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_notify_nfcc_power_mode
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Call to notify NFCC power mode to NFA sub-modules
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_notify_nfcc_power_mode(uint8_t nfcc_power_mode) {
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t id;
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_sys: notify NFCC power mode(%d) to subsystems",
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   nfcc_power_mode);
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify NFCC power state to all subsystems except NFA_SYS */
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) {
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((nfa_sys_cb.is_reg[id]) && (nfa_sys_cb.reg[id]->proc_nfcc_pwr_mode)) {
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Subsytem has a funciton for processing NFCC power mode. Call it now */
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*nfa_sys_cb.reg[id]->proc_nfcc_pwr_mode)(nfcc_power_mode);
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_sendmsg
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send a GKI message to BTA.  This function is designed to
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  optimize sending of messages to BTA.  It is called by BTA
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  API functions and call-in functions.
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_sendmsg(void* p_msg) {
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_send_msg(NFC_TASK, p_nfa_sys_cfg->mbox, p_msg);
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_start_timer
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start a protocol timer for the specified amount
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  of time in milliseconds.
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_start_timer(TIMER_LIST_ENT* p_tle, uint16_t type,
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                         int32_t timeout) {
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_ptim_start_timer(&nfa_sys_cb.ptim_cb, p_tle, type, timeout);
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_stop_timer
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Stop a BTA timer.
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_stop_timer(TIMER_LIST_ENT* p_tle) {
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_ptim_stop_timer(&nfa_sys_cb.ptim_cb, p_tle);
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_disable_timers
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disable sys timer event handling
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_disable_timers(void) { nfa_sys_cb.timers_disabled = true; }
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_sys_set_trace_level
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set trace level for BTA
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_sys_set_trace_level(uint8_t level) { nfa_sys_cb.trace_level = level; }
374