1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Copyright (C) 2010-2012 Broadcom Corporation 4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Licensed under the Apache License, Version 2.0 (the "License"); 6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * you may not use this file except in compliance with the License. 7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * You may obtain a copy of the License at: 8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * http://www.apache.org/licenses/LICENSE-2.0 10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Unless required by applicable law or agreed to in writing, software 12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * distributed under the License is distributed on an "AS IS" BASIS, 13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * See the License for the specific language governing permissions and 15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * limitations under the License. 16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 18b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu 19b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 20b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 21b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * This is the main implementation file for the NFA system manager. 22b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 23b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h> 2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_api.h" 2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys.h" 2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys_int.h" 2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys_ptim.h" 2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_dm_int.h" 3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* protocol timer update period, in milliseconds */ 3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifndef NFA_SYS_TIMER_PERIOD 3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFA_SYS_TIMER_PERIOD 10 3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* system manager control block definition */ 3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if NFA_DYNAMIC_MEMORY == FALSE 3845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_SYS_CB nfa_sys_cb = {0}; /* nfa_sys control block. statically initialize 'flags' field to 0 */ 3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_init 4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description NFA initialization; called from task initialization. 46e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_init (void) 5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&nfa_sys_cb, 0, sizeof (tNFA_SYS_CB)); 5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.flags |= NFA_SYS_FL_INITIALIZED; 5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_ptim_init (&nfa_sys_cb.ptim_cb, NFA_SYS_TIMER_PERIOD, p_nfa_sys_cfg->timer); 5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.trace_level = p_nfa_sys_cfg->trace_level; 5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_event 6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description BTA event handler; called from task event handler. 67e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_event (BT_HDR *p_msg) 7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 id; 7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BOOLEAN freebuf = TRUE; 7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("NFA got event 0x%04X", p_msg->event); 7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* get subsystem id from event */ 8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu id = (UINT8) (p_msg->event >> 8); 8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* verify id and call subsystem event handler */ 8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((id < NFA_ID_MAX) && (nfa_sys_cb.is_reg[id])) 8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu freebuf = (*nfa_sys_cb.reg[id]->evt_hdlr) (p_msg); 8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("NFA got unregistered event id %d", id); 9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (freebuf) 9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_msg); 9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_timer_update 10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Update the BTA timer list and handle expired timers. 10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_timer_update (void) 10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (!nfa_sys_cb.timers_disabled) 11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_ptim_timer_update (&nfa_sys_cb.ptim_cb); 11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_register 11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Called by other BTA subsystems to register their event 12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** handler. 121e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_register (UINT8 id, const tNFA_SYS_REG *p_reg) 12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.reg[id] = (tNFA_SYS_REG *) p_reg; 12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.is_reg[id] = TRUE; 13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((id != NFA_ID_DM) && (id != NFA_ID_SYS)) 13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.enable_cplt_mask |= (0x0001 << id); 13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (id != NFA_ID_SYS) 13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_reg->proc_nfcc_pwr_mode) 13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.proc_nfcc_pwr_mode_cplt_mask |= (0x0001 << id); 13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG2 ("nfa_sys_register () id=%i, enable_cplt_mask=0x%x", 14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu id, nfa_sys_cb.enable_cplt_mask); 14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_check_disabled 14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description If all subsystems above DM have been disabled, then 15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** disable DM. Called during NFA shutdown 15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_check_disabled (void) 15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 id; 15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 done = TRUE; 15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if all subsystems above DM have been disabled. */ 16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (id = (NFA_ID_DM+1); id < NFA_ID_MAX; id++) 16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_cb.is_reg[id]) 16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* as long as one subsystem is not done */ 16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu done = FALSE; 16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* All subsystems disabled. disable DM */ 17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((done) && (nfa_sys_cb.is_reg[NFA_ID_DM])) 17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfa_sys_cb.reg[NFA_ID_DM]->disable) (); 17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_deregister 18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Called by other BTA subsystems to de-register 18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** handler. 185e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_deregister (UINT8 id) 19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_sys: deregistering subsystem %i", id); 19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.is_reg[id] = FALSE; 19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If not deregistering DM, then check if any other subsystems above DM are still */ 19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* registered. */ 19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (id != NFA_ID_DM) 19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If all subsystems above NFA_DM have been disabled, then okay to disable DM */ 20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_check_disabled (); 20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* DM (the final sub-system) is deregistering. Clear pending timer events in nfa_sys. */ 20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_ptim_init (&nfa_sys_cb.ptim_cb, NFA_SYS_TIMER_PERIOD, p_nfa_sys_cfg->timer); 20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_is_register 21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Called by other BTA subsystems to get registeration 21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** status. 216e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 22145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfa_sys_is_register (UINT8 id) 22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return nfa_sys_cb.is_reg[id]; 22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_is_graceful_disable 22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Called by other BTA subsystems to get disable 23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** parameter. 232e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 23745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfa_sys_is_graceful_disable (void) 23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return nfa_sys_cb.graceful_disable; 24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_enable_subsystems 24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Call on NFA Start up 24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_enable_subsystems (void) 25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 id; 25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG0 ("nfa_sys: enabling subsystems"); 25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 257eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Enable all subsystems except SYS */ 258eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) 25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_cb.is_reg[id]) 26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_cb.reg[id]->enable != NULL) 26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Subsytem has a Disable funciton. Call it now */ 26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfa_sys_cb.reg[id]->enable) (); 26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Subsytem does not have a Enable function. Report Enable on behalf of subsystem */ 27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cback_notify_enable_complete (id); 27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_disable_subsystems 27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Call on NFA shutdown. Disable all subsystems above NFA_DM 28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_disable_subsystems (BOOLEAN graceful) 28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 id; 28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BOOLEAN done = TRUE; 28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_sys: disabling subsystems:%d", graceful); 29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.graceful_disable = graceful; 29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Disable all subsystems above NFA_DM. (NFA_DM and NFA_SYS will be disabled last) */ 29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (id = (NFA_ID_DM+1); id < NFA_ID_MAX; id++) 29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_cb.is_reg[id]) 29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu done = FALSE; 29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_cb.reg[id]->disable != NULL) 30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Subsytem has a Disable funciton. Call it now */ 30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfa_sys_cb.reg[id]->disable) (); 30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Subsytem does not have a Disable function. Deregister on behalf of subsystem */ 30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_deregister (id); 30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If All subsystems disabled. disable DM */ 31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((done) && (nfa_sys_cb.is_reg[NFA_ID_DM])) 31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfa_sys_cb.reg[NFA_ID_DM]->disable) (); 31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_notify_nfcc_power_mode 32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Call to notify NFCC power mode to NFA sub-modules 32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_notify_nfcc_power_mode (UINT8 nfcc_power_mode) 32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 id; 33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_sys: notify NFCC power mode(%d) to subsystems", nfcc_power_mode); 33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Notify NFCC power state to all subsystems except NFA_SYS */ 335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) 33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((nfa_sys_cb.is_reg[id]) && (nfa_sys_cb.reg[id]->proc_nfcc_pwr_mode)) 33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Subsytem has a funciton for processing NFCC power mode. Call it now */ 34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfa_sys_cb.reg[id]->proc_nfcc_pwr_mode) (nfcc_power_mode); 34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_sendmsg 34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Send a GKI message to BTA. This function is designed to 35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** optimize sending of messages to BTA. It is called by BTA 35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** API functions and call-in functions. 352e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_sendmsg (void *p_msg) 35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_send_msg (NFC_TASK, p_nfa_sys_cfg->mbox, p_msg); 36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_start_timer 36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Start a protocol timer for the specified amount 36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** of time in milliseconds. 36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_start_timer (TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout) 37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_ptim_start_timer (&nfa_sys_cb.ptim_cb, p_tle, type, timeout); 37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_stop_timer 38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Stop a BTA timer. 38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_stop_timer (TIMER_LIST_ENT *p_tle) 38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_ptim_stop_timer (&nfa_sys_cb.ptim_cb, p_tle); 38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_disable_timers 39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Disable sys timer event handling 39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 39845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_disable_timers (void) 40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.timers_disabled = TRUE; 40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_sys_set_trace_level 40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Set trace level for BTA 41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_sys_set_trace_level (UINT8 level) 41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cb.trace_level = level; 41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 419