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