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