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 HCI.
22b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
23b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h>
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_api.h"
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys.h"
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys_int.h"
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_dm_int.h"
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_api.h"
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_int.h"
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_ee_api.h"
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_ee_int.h"
3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h"
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h"
3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_defs.h"
3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "trace_api.h"
3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Global Variables
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_CB nfa_hci_cb;
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifndef NFA_HCI_NV_READ_TIMEOUT_VAL
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFA_HCI_NV_READ_TIMEOUT_VAL    1000
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifndef NFA_HCI_CON_CREATE_TIMEOUT_VAL
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFA_HCI_CON_CREATE_TIMEOUT_VAL 1000
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Static Functions
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* event handler function type */
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg);
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_enable (void);
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_disable (void);
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data);
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
6463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_set_receive_buf (UINT8 pipe);
6563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len);
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status);
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Constants
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
71e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chustatic const tNFA_SYS_REG nfa_hci_sys_reg =
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_sys_enable,
74e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    nfa_hci_evt_hdlr,
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_sys_disable,
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_proc_nfcc_power_mode
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu};
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_ee_info_cback
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Callback function
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_ee_info_cback (BOOLEAN disable_discover)
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
90ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    NFA_TRACE_DEBUG1 ("nfa_hci_ee_info_cback (): %d", disable_discover);
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Notify EE Discovery is complete */
93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (disable_discover)
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfa_hci_cb.w4_hci_netwk_init = FALSE;
97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfa_sys_stop_timer (&nfa_hci_cb.timer);
100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfa_hci_cb.ee_disc_cmplt = TRUE;
106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfa_hci_startup ();
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_init
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Initialize NFA HCI
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_init (void)
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_DEBUG0 ("nfa_hci_init ()");
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* initialize control block */
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    memset (&nfa_hci_cb, 0, sizeof (tNFA_HCI_CB));
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* register message handler on NFA SYS */
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_register (NFA_ID_HCI, &nfa_hci_sys_reg);
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_is_valid_cfg
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Validate hci control block config parameters
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfa_hci_is_valid_cfg (void)
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       xx,yy,zz;
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_HANDLE reg_app[NFA_HCI_MAX_APP_CB];
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       valid_gate[NFA_HCI_MAX_GATE_CB];
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       app_count       = 0;
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       gate_count      = 0;
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT32      pipe_inx_mask   = 0;
14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* First, see if valid values are stored in app names, send connectivity events flag */
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++)
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Check if app name is valid with null terminated string */
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (strlen (&nfa_hci_cb.cfg.reg_app_names[xx][0]) > NFA_MAX_HCI_APP_NAME_LEN)
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return FALSE;
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Send Connectivity event flag can be either TRUE or FALSE */
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (nfa_hci_cb.cfg.b_send_conn_evts[xx] != TRUE)
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&(nfa_hci_cb.cfg.b_send_conn_evts[xx] != FALSE))
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return FALSE;
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0)
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the app name is present more than one time in the control block */
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            for (yy = xx + 1; yy < NFA_HCI_MAX_APP_CB; yy++)
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (  (nfa_hci_cb.cfg.reg_app_names[yy][0] != 0)
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    &&(!strncmp (&nfa_hci_cb.cfg.reg_app_names[xx][0], &nfa_hci_cb.cfg.reg_app_names[yy][0], strlen (nfa_hci_cb.cfg.reg_app_names[xx]))) )
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    /* Two app cannot have the same name , NVRAM is corrupted */
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFA_TRACE_EVENT2 ("nfa_hci_is_valid_cfg (%s)  Reusing: %u", &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    return FALSE;
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Collect list of hci handle */
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            reg_app[app_count++] = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI);
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Validate Gate Control block */
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++)
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != 0)
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (  (  (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_LOOP_BACK_GATE)
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
187eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
188eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                ||(nfa_hci_cb.cfg.dyn_gates[xx].gate_id > NFA_HCI_LAST_PROP_GATE))
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the same gate id is present more than once in the control block */
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            for (yy = xx + 1; yy < NFA_HCI_MAX_GATE_CB; yy++)
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (  (nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0)
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id == nfa_hci_cb.cfg.dyn_gates[yy].gate_id) )
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    return FALSE;
19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >= NFA_HCI_MAX_APP_CB)
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE)
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                /* The gate owner should be one of the registered application */
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                for (zz = 0; zz < app_count; zz++)
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz])
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                        break;
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (zz == app_count)
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    return FALSE;
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Collect list of allocated gates */
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            valid_gate[gate_count++] = nfa_hci_cb.cfg.dyn_gates[xx].gate_id;
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* No two gates can own a same pipe */
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if ((pipe_inx_mask & nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask) != 0)
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Collect the list of pipes on this gate */
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            pipe_inx_mask |= nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask;
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Every bit set in pipe increment mask indicates a valid pipe */
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (pipe_inx_mask & 1)
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the pipe is valid one */
237e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (xx == NFA_HCI_MAX_PIPE_CB)
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return FALSE;
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Validate Gate Control block */
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++)
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id != 0)
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if pipe id is valid */
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if pipe state is valid */
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (  (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_OPENED)
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_CLOSED))
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if local gate on which the pipe is created is valid */
260eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (  (((nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_LOOP_BACK_GATE) && (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) && (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
261eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                ||(nfa_hci_cb.cfg.dyn_pipes[xx].local_gate > NFA_HCI_LAST_PROP_GATE))
26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the peer gate on which the pipe is created is valid */
265eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (  (((nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate != NFA_HCI_LOOP_BACK_GATE) && (nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) && (nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                ||(nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate > NFA_HCI_LAST_PROP_GATE))
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the same pipe is present more than once in the control block */
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            for (yy = xx + 1; yy < NFA_HCI_MAX_PIPE_CB; yy++)
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (  (nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0)
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id == nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id) )
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    return FALSE;
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* The local gate should be one of the element in gate control block */
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            for (zz = 0; zz < gate_count; zz++)
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz])
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    break;
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (zz == gate_count)
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate: %u", nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Check if admin pipe state is valid */
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_OPENED)
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_CLOSED))
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return FALSE;
29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Check if link management pipe state is valid */
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED)
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_CLOSED))
30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return FALSE;
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pipe_inx_mask = nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask;
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Every bit set in pipe increment mask indicates a valid pipe */
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (pipe_inx_mask & 1)
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the pipe is valid one */
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Check if the pipe is connected to Identity management gate */
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return FALSE;
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (xx == NFA_HCI_MAX_PIPE_CB)
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return FALSE;
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return TRUE;
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_cfg_default
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Configure default values for hci control block
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
332eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfa_hci_restore_default_config (UINT8 *p_session_id)
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    memset (&nfa_hci_cb.cfg, 0, sizeof (nfa_hci_cb.cfg));
335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    memcpy (nfa_hci_cb.cfg.admin_gate.session_id, p_session_id, NFA_HCI_SESSION_ID_LEN);
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_cb.nv_write_needed = TRUE;
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_proc_nfcc_power_mode
34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Restore NFA HCI sub-module
344e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_DEBUG1 ("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d", nfcc_power_mode);
35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* if NFCC power mode is change to full power */
35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.b_low_power_mode = FALSE;
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE)
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_cb.hci_state     = NFA_HCI_STATE_RESTORE;
35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_cb.ee_disc_cmplt = FALSE;
360ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu            nfa_hci_cb.conn_id       = 0;
36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            NFA_TRACE_ERROR0 ("nfa_hci_proc_nfcc_power_mode (): Cannot restore now");
36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
370ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu        nfa_hci_cb.hci_state     = NFA_HCI_STATE_IDLE;
371ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu        nfa_hci_cb.w4_rsp_evt    = FALSE;
372ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu        nfa_hci_cb.conn_id       = 0;
37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_stop_timer (&nfa_hci_cb.timer);
37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.b_low_power_mode = TRUE;
37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_dh_startup_complete
38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Initialization of terminal host in HCI Network is completed
38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Wait for other host in the network to initialize
385e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_dh_startup_complete (void)
39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.w4_hci_netwk_init)
39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */
39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT);
39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
398eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_startup_complete
40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      HCI network initialization is completed
406e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_startup_complete (tNFA_STATUS status)
41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
412e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    tNFA_HCI_EVT_DATA   evt_data;
41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT1 ("nfa_hci_startup_complete (): Status: %u", status);
41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_stop_timer (&nfa_hci_cb.timer);
41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_ee_proc_hci_info_cback ();
42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        evt_data.hci_init.status = status;
42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data);
42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_cback_notify_enable_complete (NFA_ID_HCI);
42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
431e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (status == NFA_STATUS_OK)
43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_startup
44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Perform HCI startup
44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_startup (void)
44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_STATUS     status = NFA_STATUS_FAILED;
45045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_EE_INFO    ee_info[2];
45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8           num_nfcee = 2;
45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8           target_handle;
45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8           count = 0;
45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BOOLEAN         found = FALSE;
45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (HCI_LOOPBACK_DEBUG)
45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* First step in initialization is to open the admin pipe */
45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* We can only start up if NV Ram is read and EE discovery is complete */
464ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt && (nfa_hci_cb.conn_id == 0))
46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        NFA_EeGetInfo (&num_nfcee, ee_info);
46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.num_nfcee = num_nfcee;
46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        while ((count < num_nfcee) && (!found))
47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            target_handle = (UINT8) ee_info[count].ee_handle;
47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if(ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS)
47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                found = TRUE;
47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE)
47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFC_NfceeModeSet (target_handle, NFC_MODE_ACTIVATE);
48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if ((status = NFC_ConnCreate (NCI_DEST_TYPE_NFCEE, target_handle, NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback)) == NFA_STATUS_OK)
48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CON_CREATE_TIMEOUT_VAL);
48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                else
48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    NFA_TRACE_ERROR0 ("nfa_hci_startup - Failed to Create Logical connection. HCI Initialization/Restore failed");
48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    nfa_hci_startup_complete (NFA_STATUS_FAILED);
48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            count++;
49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (!found)
49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            NFA_TRACE_ERROR0 ("nfa_hci_startup - HCI ACCESS Interface not discovered. HCI Initialization/Restore failed");
49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_startup_complete (NFA_STATUS_FAILED);
49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_sys_enable
50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Enable NFA HCI
50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_enable (void)
51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_DEBUG0 ("nfa_hci_sys_enable ()");
51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_ee_reg_cback_enable_done (&nfa_hci_ee_info_cback);
51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_nv_co_read ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NV_READ_TIMEOUT_VAL);
51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_sys_disable
52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Disable NFA HCI
52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_disable (void)
52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_HCI_EVT_DATA   evt_data;
53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_stop_timer (&nfa_hci_cb.timer);
53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.conn_id)
53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_sys_is_graceful_disable ())
53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Tell all applications stack is down */
53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_send_to_all_apps (NFA_HCI_EXIT_EVT, &evt_data);
53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            NFC_ConnClose (nfa_hci_cb.conn_id);
54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return;
54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.conn_id = 0;
54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* deregister message handler on NFA SYS */
54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_deregister (NFA_ID_HCI);
54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_conn_cback
55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function Process event from NCI
555e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8   *p;
56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BT_HDR  *p_pkt = (BT_HDR *) p_data->data.p_data;
56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8   chaining_bit;
56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8   pipe;
56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT16  pkt_len;
56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (event == NFC_CONN_CREATE_CEVT)
56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.conn_id   = conn_id;
57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.buff_size = p_data->conn_create.buff_size;
57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_cb.w4_hci_netwk_init = TRUE;
57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_alloc_gate (NFA_HCI_CONNECTIVITY_GATE,0);
57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_CLOSED)
57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* First step in initialization/restore is to open the admin pipe */
58145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
58545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Read session id, to know DH session id is correct */
58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX);
58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else if (event == NFC_CONN_CLOSE_CEVT)
59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.conn_id   = 0;
59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* deregister message handler on NFA SYS */
59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_deregister (NFA_ID_HCI);
59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((event != NFC_DATA_CEVT) || (p_pkt == NULL))
59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return;
59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Received HCP Packet before timeout, Other Host initialization is not complete */
60345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_stop_timer (&nfa_hci_cb.timer);
60445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT);
60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p       = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pkt_len = p_pkt->len;
60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_PROTOCOL == TRUE)
61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    DispHcp (p, pkt_len, TRUE, (BOOLEAN) !nfa_hci_cb.assembling);
61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    chaining_bit = ((*p) >> 0x07) & 0x01;
61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pipe = (*p++) & 0x7F;
61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pkt_len != 0)
61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        pkt_len--;
61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.assembling == FALSE)
62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
62163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        /* First Segment of a packet */
62263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.type            = ((*p) >> 0x06) & 0x03;
62363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.inst            = (*p++ & 0x3F);
62463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (pkt_len != 0)
62563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            pkt_len--;
62663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.assembly_failed = FALSE;
62763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.msg_len         = 0;
62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (chaining_bit == NFA_HCI_MESSAGE_FRAGMENTATION)
63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_cb.assembling = TRUE;
63263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_set_receive_buf (pipe);
63363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_assemble_msg (p, pkt_len);
63463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
63563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        else
63663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
63763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            if ((pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE))
63863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            {
63963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen                nfa_hci_set_receive_buf (pipe);
64063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen                nfa_hci_assemble_msg (p, pkt_len);
64163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen                p = nfa_hci_cb.p_msg_data;
64263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            }
64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
64645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
64763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (nfa_hci_cb.assembly_failed)
64863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
64963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            /* If Reassembly failed because of insufficient buffer, just drop the new segmented packets */
65063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            NFA_TRACE_ERROR1 ("nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", pkt_len);
65163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
65263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        else
65363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
65463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            /* Reassemble the packet */
65563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_assemble_msg (p, pkt_len);
65663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (chaining_bit == NFA_HCI_NO_MESSAGE_FRAGMENTATION)
65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Just added the last segment in the chain. Reset pointers */
66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_cb.assembling = FALSE;
66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p                     = nfa_hci_cb.p_msg_data;
66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            pkt_len               = nfa_hci_cb.msg_len;
66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
66645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
66745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
66845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT5 ("nfa_hci_conn_cback Recvd data pipe:%d  %s  chain:%d  assmbl:%d  len:%d",
66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                      (UINT8)pipe, nfa_hciu_get_type_inst_names (pipe, nfa_hci_cb.type, nfa_hci_cb.inst),
67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                      (UINT8)chaining_bit, (UINT8)nfa_hci_cb.assembling, p_pkt->len);
67145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT6 ("nfa_hci_conn_cback Recvd data pipe:%d  Type: %u  Inst: %u  chain:%d reassm:%d len:%d",
67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                      pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit, nfa_hci_cb.assembling, p_pkt->len);
67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If still reassembling fragments, just return */
67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (nfa_hci_cb.assembling)
67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
68063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        /* if not last packet, release GKI buffer */
68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_freebuf (p_pkt);
68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If we got a response, cancel the response timer. Also, if waiting for */
68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* a single response, we can go back to idle state                       */
68763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_RSP)
68845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
68945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_stop_timer (&nfa_hci_cb.timer);
69063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.hci_state  = NFA_HCI_STATE_IDLE;
69163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.w4_rsp_evt = FALSE;
69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    switch (pipe)
69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_ADMIN_PIPE:
69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Check if data packet is a command, response or event */
69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
70063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_handle_admin_gate_cmd (p);
70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE)
70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_handle_admin_gate_rsp (p, (UINT8) pkt_len);
70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)
70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
70863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_handle_admin_gate_evt (p);
70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_LINK_MANAGEMENT_PIPE:
71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* We don't send Link Management commands, we only get them */
71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
71563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_handle_link_mgm_gate_cmd (p);
71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    default:
71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
72063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_handle_dyn_pipe_pkt (pipe, p, pkt_len);
72145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Send a message to ouselves to check for anything to do */
72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_pkt->event = NFA_HCI_CHECK_QUEUE_EVT;
72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_pkt->len   = 0;
72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_sys_sendmsg (p_pkt);
72845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
72945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
73045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
73145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
73245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_handle_nv_read
73345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
73445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      handler function for nv read complete event
735e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
73645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
73745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
73845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
73945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status)
74045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
741eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   session_id[NFA_HCI_SESSION_ID_LEN];
742eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
743eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   reset_session[NFA_HCI_SESSION_ID_LEN]   = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
744eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT32  os_tick;
74545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
74645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (block == DH_NV_BLOCK)
74745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
74845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Stop timer as NVDATA Read Completed */
74945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_sys_stop_timer (&nfa_hci_cb.timer);
75045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.nv_read_cmplt = TRUE;
75145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (status != NFA_STATUS_OK)
75245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ||(!nfa_hci_is_valid_cfg ())
753eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN)))
754eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN)))  )
75545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
75645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Set a new session id so that we clear all pipes later after seeing a difference with the HC Session ID */
757eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            memcpy (&session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2));
758eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            os_tick = GKI_get_os_tick_count ();
759eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2));
76045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_restore_default_config (session_id);
76145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
76245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_startup ();
76345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
76445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
76645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_rsp_timeout
76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      action function to process timeout
771e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
77245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          None
77345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data)
77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_HCI_EVT        evt = 0;
77845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_HCI_EVT_DATA   evt_data;
77934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu    UINT8               delete_pipe;
78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT2 ("nfa_hci_rsp_timeout () State: %u  Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.status      = NFA_STATUS_FAILED;
78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    switch (nfa_hci_cb.hci_state)
78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_STARTUP:
78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_RESTORE:
78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        NFA_TRACE_ERROR0 ("nfa_hci_rsp_timeout - Initialization failed!");
79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_startup_complete (NFA_STATUS_TIMEOUT);
79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* HCI Network is enabled */
79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.w4_hci_netwk_init = FALSE;
796eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_REMOVE_GATE:
80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Something wrong, NVRAM data could be corrupt */
80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_send_clear_all_pipe_cmd ();
80445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_remove_all_pipes_from_host (0);
80845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_api_dealloc_gate (NULL);
80945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
81045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_APP_DEREGISTER:
81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Something wrong, NVRAM data could be corrupt */
81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_send_clear_all_pipe_cmd ();
81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
81945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
82045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hciu_remove_all_pipes_from_host (0);
82145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_api_deregister (NULL);
82245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
82345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
824e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_WAIT_RSP:
82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
82863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (nfa_hci_cb.w4_rsp_evt)
82963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
83063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_cb.w4_rsp_evt       = FALSE;
83163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            evt                         = NFA_HCI_EVENT_RCVD_EVT;
83263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            evt_data.rcvd_evt.pipe      = nfa_hci_cb.pipe_in_use;
83363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            evt_data.rcvd_evt.evt_code  = 0;
83463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            evt_data.rcvd_evt.evt_len   = 0;
83563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            evt_data.rcvd_evt.p_evt_buf = NULL;
83663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_cb.rsp_buf_size     = 0;
83763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_cb.p_rsp_buf        = NULL;
83863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
83963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            break;
84063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
841e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
84234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu        delete_pipe          = 0;
84345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        switch (nfa_hci_cb.cmd_sent)
84445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ANY_SET_PARAMETER:
846e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
847e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already and release the pipe. But still send delete pipe command to be safe.
84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
85034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            delete_pipe                = nfa_hci_cb.pipe_in_use;
85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.data_len = 0;
85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.index    = nfa_hci_cb.param_in_use;
85434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            evt                        = NFA_HCI_SET_REG_RSP_EVT;
85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ANY_GET_PARAMETER:
858e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
859e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already and release the pipe. But still send delete pipe command to be safe.
86145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
86234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            delete_pipe                = nfa_hci_cb.pipe_in_use;
86345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
86445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.data_len = 0;
86545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.registry.index    = nfa_hci_cb.param_in_use;
86634785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            evt                        = NFA_HCI_GET_REG_RSP_EVT;
86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
86945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ANY_OPEN_PIPE:
870e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
871e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
87245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already and release the pipe. But still send delete pipe command to be safe.
87345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
87434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            delete_pipe          = nfa_hci_cb.pipe_in_use;
87545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.opened.pipe = nfa_hci_cb.pipe_in_use;
87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt                  = NFA_HCI_OPEN_PIPE_EVT;
87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ANY_CLOSE_PIPE:
880e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
881e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already and release the pipe. But still send delete pipe command to be safe.
88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
88434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            delete_pipe          = nfa_hci_cb.pipe_in_use;
88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.closed.pipe = nfa_hci_cb.pipe_in_use;
88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt                  = NFA_HCI_CLOSE_PIPE_EVT;
88745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
88845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
88945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ADM_CREATE_PIPE:
89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.created.pipe        = nfa_hci_cb.pipe_in_use;
89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.created.source_gate = nfa_hci_cb.local_gate_in_use;
89245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.created.dest_host   = nfa_hci_cb.remote_host_in_use;
89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.created.dest_gate   = nfa_hci_cb.remote_gate_in_use;
89445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt                          = NFA_HCI_CREATE_PIPE_EVT;
89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_ADM_DELETE_PIPE:
898e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
899e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already. Just release the pipe.
90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
90234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            if (nfa_hci_cb.pipe_in_use <= NFA_HCI_LAST_DYNAMIC_PIPE)
90334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu                nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use);
90434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use;
90534785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            evt                   = NFA_HCI_DELETE_PIPE_EVT;
90645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
90745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
90845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        default:
909e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            /*
910e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu             * As no response to the command sent on this pipe, we may assume the pipe is
91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             * deleted already and release the pipe. But still send delete pipe command to be safe.
91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu             */
91334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            delete_pipe                = nfa_hci_cb.pipe_in_use;
91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
91634785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu        if (delete_pipe && (delete_pipe <= NFA_HCI_LAST_DYNAMIC_PIPE))
91734785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu        {
91834785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            nfa_hciu_send_delete_pipe_cmd (delete_pipe);
91934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu            nfa_hciu_release_pipe (delete_pipe);
92034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu        }
92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFA_HCI_STATE_DISABLED:
92345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    default:
92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        NFA_TRACE_DEBUG0 ("nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state");
92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (evt != 0)
92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hciu_send_to_app (evt, &evt_data, nfa_hci_cb.app_in_use);
92945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
93045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
93145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
93245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
93363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function         nfa_hci_set_receive_buf
93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Set reassembly buffer for incoming message
93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          status
93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
94063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_set_receive_buf (UINT8 pipe)
94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)  )
94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
94563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (  (nfa_hci_cb.rsp_buf_size)
94663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            &&(nfa_hci_cb.p_rsp_buf != NULL)  )
94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
94863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_cb.p_msg_data  = nfa_hci_cb.p_rsp_buf;
94963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            nfa_hci_cb.max_msg_len = nfa_hci_cb.rsp_buf_size;
95063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            return;
95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_cb.p_msg_data  = nfa_hci_cb.msg_data;
95445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_cb.max_msg_len = NFA_MAX_HCI_EVENT_LEN;
95545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
95745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
95845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_assemble_msg
96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Reassemble the incoming message
96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
96363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns          None
96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
96663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len)
96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
96863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if ((nfa_hci_cb.msg_len + data_len) > nfa_hci_cb.max_msg_len)
96963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
97063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        /* Fill the buffer as much it can hold */
97163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, (nfa_hci_cb.max_msg_len - nfa_hci_cb.msg_len));
97263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.msg_len         = nfa_hci_cb.max_msg_len;
97363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        /* Set Reassembly failed */
97463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.assembly_failed = TRUE;
97563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        NFA_TRACE_ERROR1 ("nfa_hci_assemble_msg (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", ((nfa_hci_cb.msg_len + data_len) - nfa_hci_cb.max_msg_len));
97663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
97763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    else
97863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
97963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, data_len);
98063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        nfa_hci_cb.msg_len += data_len;
98163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
98245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
98345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
98445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
98545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
98645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_hci_evt_hdlr
98745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
98845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Processing all event for NFA HCI
98945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
99045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          TRUE if p_msg needs to be deallocated
99145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
99245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
99345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg)
99445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
99545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFA_HCI_EVENT_DATA *p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg;
99645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
99745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
99845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT4 ("nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)",
999e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu                      nfa_hciu_get_state_name (nfa_hci_cb.hci_state), nfa_hci_cb.hci_state,
100045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                      nfa_hciu_get_event_name (p_evt_data->hdr.event), p_evt_data->hdr.event);
100145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
100245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFA_TRACE_EVENT2 ("nfa_hci_evt_hdlr state: %d event: 0x%04x", nfa_hci_cb.hci_state, p_evt_data->hdr.event);
100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If this is an API request, queue it up */
100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) && (p_msg->event <= NFA_HCI_LAST_API_EVENT))
100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
100845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_enqueue (&nfa_hci_cb.hci_api_q, p_msg);
100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        switch (p_msg->event)
101345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_RSP_NV_READ_EVT:
101545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status);
101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_RSP_NV_WRITE_EVT:
101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* NV Ram write completed - nothing to do... */
102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_RSP_TIMEOUT_EVT:
102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_hci_rsp_timeout ((tNFA_HCI_EVENT_DATA *)p_msg);
102445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NFA_HCI_CHECK_QUEUE_EVT:
102745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (HCI_LOOPBACK_DEBUG)
102845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
102945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (p_msg->len != 0)
103045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
103145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    tNFC_DATA_CEVT   xx;
103245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    xx.p_data = p_msg;
103345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    nfa_hci_conn_cback (0, NFC_DATA_CEVT, (tNFC_CONN *)&xx);
103445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    return FALSE;
103545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
103645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
103745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
1038e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        }
103945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
104045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
104145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((p_msg->event > NFA_HCI_LAST_API_EVENT))
104245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_freebuf (p_msg);
104345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
104445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfa_hci_check_api_requests ();
104545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
104630423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu    if (nfa_hciu_is_no_host_resetting ())
10475bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu        nfa_hci_check_pending_api_requests ();
10485bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu
104945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) && (nfa_hci_cb.nv_write_needed))
105045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
105145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_hci_cb.nv_write_needed = FALSE;
105245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
105345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
105445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
105545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return FALSE;
105645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
105745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
1058