nfa_hci_main.c revision e9df6ba5a8fcccf306a80b1670b423be8fe7746
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 2010-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This is the main implementation file for the NFA HCI.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_int.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_dm_int.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_api.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_int.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_api.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_nv_co.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_defs.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Global Variables
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_HCI_CB nfa_hci_cb;
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFA_HCI_NV_READ_TIMEOUT_VAL
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFA_HCI_NV_READ_TIMEOUT_VAL    1000
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFA_HCI_CON_CREATE_TIMEOUT_VAL
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFA_HCI_CON_CREATE_TIMEOUT_VAL 1000
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Static Functions
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* event handler function type */
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg);
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_enable (void);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_disable (void);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data);
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_set_receive_buf (UINT8 pipe);
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len);
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status);
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Constants
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic const tNFA_SYS_REG nfa_hci_sys_reg =
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_sys_enable,
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_evt_hdlr,
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_sys_disable,
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_proc_nfcc_power_mode
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_ee_info_cback
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Callback function
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_ee_info_cback (BOOLEAN disable_discover)
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_hci_ee_info_cback (): %d", disable_discover);
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Notify EE Discovery is complete */
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (disable_discover)
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.w4_hci_netwk_init = FALSE;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_sys_stop_timer (&nfa_hci_cb.timer);
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.ee_disc_cmplt = TRUE;
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_startup ();
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_init
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialize NFA HCI
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_init (void)
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_hci_init ()");
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* initialize control block */
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&nfa_hci_cb, 0, sizeof (tNFA_HCI_CB));
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* register message handler on NFA SYS */
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_register (NFA_ID_HCI, &nfa_hci_sys_reg);
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_is_valid_cfg
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Validate hci control block config parameters
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_hci_is_valid_cfg (void)
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx,yy,zz;
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HANDLE reg_app[NFA_HCI_MAX_APP_CB];
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       valid_gate[NFA_HCI_MAX_GATE_CB];
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       app_count       = 0;
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       gate_count      = 0;
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32      pipe_inx_mask   = 0;
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* First, see if valid values are stored in app names, send connectivity events flag */
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++)
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if app name is valid with null terminated string */
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (strlen (&nfa_hci_cb.cfg.reg_app_names[xx][0]) > NFA_MAX_HCI_APP_NAME_LEN)
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Send Connectivity event flag can be either TRUE or FALSE */
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (nfa_hci_cb.cfg.b_send_conn_evts[xx] != TRUE)
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(nfa_hci_cb.cfg.b_send_conn_evts[xx] != FALSE))
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0)
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the app name is present more than one time in the control block */
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_APP_CB; yy++)
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.reg_app_names[yy][0] != 0)
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(!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]))) )
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Two app cannot have the same name , NVRAM is corrupted */
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT2 ("nfa_hci_is_valid_cfg (%s)  Reusing: %u", &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect list of hci handle */
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            reg_app[app_count++] = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI);
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Validate Gate Control block */
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++)
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != 0)
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (  (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_LOOP_BACK_GATE)
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_gates[xx].gate_id > NFA_HCI_LAST_PROP_GATE))
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the same gate id is present more than once in the control block */
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_GATE_CB; yy++)
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0)
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id == nfa_hci_cb.cfg.dyn_gates[yy].gate_id) )
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >= NFA_HCI_MAX_APP_CB)
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE)
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* The gate owner should be one of the registered application */
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                for (zz = 0; zz < app_count; zz++)
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz])
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        break;
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (zz == app_count)
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect list of allocated gates */
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            valid_gate[gate_count++] = nfa_hci_cb.cfg.dyn_gates[xx].gate_id;
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* No two gates can own a same pipe */
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((pipe_inx_mask & nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask) != 0)
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect the list of pipes on this gate */
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pipe_inx_mask |= nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask;
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Every bit set in pipe increment mask indicates a valid pipe */
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe_inx_mask & 1)
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is valid one */
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx == NFA_HCI_MAX_PIPE_CB)
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Validate Gate Control block */
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++)
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id != 0)
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if pipe id is valid */
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if pipe state is valid */
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_OPENED)
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_CLOSED))
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if local gate on which the pipe is created is valid */
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            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))
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_pipes[xx].local_gate > NFA_HCI_LAST_PROP_GATE))
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the peer gate on which the pipe is created is valid */
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            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))
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate > NFA_HCI_LAST_PROP_GATE))
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the same pipe is present more than once in the control block */
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_PIPE_CB; yy++)
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0)
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id == nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id) )
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* The local gate should be one of the element in gate control block */
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (zz = 0; zz < gate_count; zz++)
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz])
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (zz == gate_count)
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate: %u", nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if admin pipe state is valid */
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_OPENED)
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_CLOSED))
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if link management pipe state is valid */
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED)
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_CLOSED))
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pipe_inx_mask = nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Every bit set in pipe increment mask indicates a valid pipe */
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe_inx_mask & 1)
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is valid one */
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is connected to Identity management gate */
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx == NFA_HCI_MAX_PIPE_CB)
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_cfg_default
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Configure default values for hci control block
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_restore_default_config (UINT8 *p_session_id)
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&nfa_hci_cb.cfg, 0, sizeof (nfa_hci_cb.cfg));
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (nfa_hci_cb.cfg.admin_gate.session_id, p_session_id, NFA_HCI_SESSION_ID_LEN);
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.nv_write_needed = TRUE;
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_proc_nfcc_power_mode
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Restore NFA HCI sub-module
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d", nfcc_power_mode);
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if NFCC power mode is change to full power */
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.b_low_power_mode = FALSE;
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE)
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.hci_state     = NFA_HCI_STATE_RESTORE;
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.ee_disc_cmplt = FALSE;
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.conn_id       = 0;
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR0 ("nfa_hci_proc_nfcc_power_mode (): Cannot restore now");
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state     = NFA_HCI_STATE_IDLE;
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.w4_rsp_evt    = FALSE;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id       = 0;
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.b_low_power_mode = TRUE;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_dh_startup_complete
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialization of terminal host in HCI Network is completed
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Wait for other host in the network to initialize
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_dh_startup_complete (void)
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.w4_hci_netwk_init)
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT);
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_startup_complete
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      HCI network initialization is completed
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_startup_complete (tNFA_STATUS status)
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT1 ("nfa_hci_startup_complete (): Status: %u", status);
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_stop_timer (&nfa_hci_cb.timer);
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_ee_proc_hci_info_cback ();
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.hci_init.status = status;
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data);
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_enable_complete (NFA_ID_HCI);
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NFA_STATUS_OK)
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_startup
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Perform HCI startup
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_startup (void)
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_STATUS     status = NFA_STATUS_FAILED;
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_EE_INFO    ee_info[2];
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           num_nfcee = 2;
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           target_handle;
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           count = 0;
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN         found = FALSE;
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (HCI_LOOPBACK_DEBUG)
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* First step in initialization is to open the admin pipe */
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* We can only start up if NV Ram is read and EE discovery is complete */
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt && (nfa_hci_cb.conn_id == 0))
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_EeGetInfo (&num_nfcee, ee_info);
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.num_nfcee = num_nfcee;
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while ((count < num_nfcee) && (!found))
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            target_handle = (UINT8) ee_info[count].ee_handle;
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if(ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS)
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                found = TRUE;
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE)
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFC_NfceeModeSet (target_handle, NFC_MODE_ACTIVATE);
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = NFC_ConnCreate (NCI_DEST_TYPE_NFCEE, target_handle, NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback)) == NFA_STATUS_OK)
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CON_CREATE_TIMEOUT_VAL);
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_ERROR0 ("nfa_hci_startup - Failed to Create Logical connection. HCI Initialization/Restore failed");
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_startup_complete (NFA_STATUS_FAILED);
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            count++;
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!found)
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR0 ("nfa_hci_startup - HCI ACCESS Interface not discovered. HCI Initialization/Restore failed");
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_startup_complete (NFA_STATUS_FAILED);
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_sys_enable
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Enable NFA HCI
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_enable (void)
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_hci_sys_enable ()");
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_ee_reg_cback_enable_done (&nfa_hci_ee_info_cback);
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_nv_co_read ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NV_READ_TIMEOUT_VAL);
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_sys_disable
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disable NFA HCI
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_disable (void)
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_stop_timer (&nfa_hci_cb.timer);
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.conn_id)
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_sys_is_graceful_disable ())
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Tell all applications stack is down */
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_to_all_apps (NFA_HCI_EXIT_EVT, &evt_data);
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_ConnClose (nfa_hci_cb.conn_id);
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id = 0;
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* deregister message handler on NFA SYS */
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_deregister (NFA_ID_HCI);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_conn_cback
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function Process event from NCI
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p;
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR  *p_pkt = (BT_HDR *) p_data->data.p_data;
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   chaining_bit;
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   pipe;
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16  pkt_len;
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_CONN_CREATE_CEVT)
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id   = conn_id;
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.buff_size = p_data->conn_create.buff_size;
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.w4_hci_netwk_init = TRUE;
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_alloc_gate (NFA_HCI_CONNECTIVITY_GATE,0);
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_CLOSED)
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* First step in initialization/restore is to open the admin pipe */
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Read session id, to know DH session id is correct */
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX);
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (event == NFC_CONN_CLOSE_CEVT)
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id   = 0;
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* deregister message handler on NFA SYS */
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_deregister (NFA_ID_HCI);
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((event != NFC_DATA_CEVT) || (p_pkt == NULL))
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Received HCP Packet before timeout, Other Host initialization is not complete */
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT);
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p       = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pkt_len = p_pkt->len;
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispHcp (p, pkt_len, TRUE, (BOOLEAN) !nfa_hci_cb.assembling);
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    chaining_bit = ((*p) >> 0x07) & 0x01;
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pipe = (*p++) & 0x7F;
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (pkt_len != 0)
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pkt_len--;
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.assembling == FALSE)
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* First Segment of a packet */
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.type            = ((*p) >> 0x06) & 0x03;
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.inst            = (*p++ & 0x3F);
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pkt_len != 0)
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pkt_len--;
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.assembly_failed = FALSE;
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len         = 0;
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (chaining_bit == NFA_HCI_MESSAGE_FRAGMENTATION)
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.assembling = TRUE;
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_set_receive_buf (pipe);
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_assemble_msg (p, pkt_len);
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE))
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hci_set_receive_buf (pipe);
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hci_assemble_msg (p, pkt_len);
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p = nfa_hci_cb.p_msg_data;
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.assembly_failed)
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If Reassembly failed because of insufficient buffer, just drop the new segmented packets */
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR1 ("nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", pkt_len);
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Reassemble the packet */
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_assemble_msg (p, pkt_len);
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (chaining_bit == NFA_HCI_NO_MESSAGE_FRAGMENTATION)
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Just added the last segment in the chain. Reset pointers */
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.assembling = FALSE;
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p                     = nfa_hci_cb.p_msg_data;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pkt_len               = nfa_hci_cb.msg_len;
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT5 ("nfa_hci_conn_cback Recvd data pipe:%d  %s  chain:%d  assmbl:%d  len:%d",
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      (UINT8)pipe, nfa_hciu_get_type_inst_names (pipe, nfa_hci_cb.type, nfa_hci_cb.inst),
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      (UINT8)chaining_bit, (UINT8)nfa_hci_cb.assembling, p_pkt->len);
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT6 ("nfa_hci_conn_cback Recvd data pipe:%d  Type: %u  Inst: %u  chain:%d reassm:%d len:%d",
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit, nfa_hci_cb.assembling, p_pkt->len);
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If still reassembling fragments, just return */
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.assembling)
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if not last packet, release GKI buffer */
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_pkt);
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If we got a response, cancel the response timer. Also, if waiting for */
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* a single response, we can go back to idle state                       */
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_RSP)
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state  = NFA_HCI_STATE_IDLE;
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.w4_rsp_evt = FALSE;
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (pipe)
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADMIN_PIPE:
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if data packet is a command, response or event */
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_cmd (p);
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE)
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_rsp (p, (UINT8) pkt_len);
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_evt (p);
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_LINK_MANAGEMENT_PIPE:
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* We don't send Link Management commands, we only get them */
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_link_mgm_gate_cmd (p);
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_dyn_pipe_pkt (pipe, p, pkt_len);
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Send a message to ouselves to check for anything to do */
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_pkt->event = NFA_HCI_CHECK_QUEUE_EVT;
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_pkt->len   = 0;
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_sendmsg (p_pkt);
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_handle_nv_read
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      handler function for nv read complete event
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status)
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   session_id[NFA_HCI_SESSION_ID_LEN];
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   reset_session[NFA_HCI_SESSION_ID_LEN]   = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32  os_tick;
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (block == DH_NV_BLOCK)
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Stop timer as NVDATA Read Completed */
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.nv_read_cmplt = TRUE;
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (status != NFA_STATUS_OK)
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!nfa_hci_is_valid_cfg ())
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN)))
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN)))  )
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Set a new session id so that we clear all pipes later after seeing a difference with the HC Session ID */
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (&session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2));
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            os_tick = GKI_get_os_tick_count ();
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2));
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_restore_default_config (session_id);
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_startup ();
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_rsp_timeout
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      action function to process timeout
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data)
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT        evt = 0;
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               delete_pipe;
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT2 ("nfa_hci_rsp_timeout () State: %u  Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    evt_data.status      = NFA_STATUS_FAILED;
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (nfa_hci_cb.hci_state)
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_STARTUP:
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_RESTORE:
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_hci_rsp_timeout - Initialization failed!");
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_startup_complete (NFA_STATUS_TIMEOUT);
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* HCI Network is enabled */
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.w4_hci_netwk_init = FALSE;
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_REMOVE_GATE:
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Something wrong, NVRAM data could be corrupt */
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_clear_all_pipe_cmd ();
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_remove_all_pipes_from_host (0);
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_api_dealloc_gate (NULL);
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_APP_DEREGISTER:
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Something wrong, NVRAM data could be corrupt */
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_clear_all_pipe_cmd ();
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_remove_all_pipes_from_host (0);
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_api_deregister (NULL);
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_WAIT_RSP:
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.w4_rsp_evt)
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.w4_rsp_evt       = FALSE;
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                         = NFA_HCI_EVENT_RCVD_EVT;
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.pipe      = nfa_hci_cb.pipe_in_use;
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.evt_code  = 0;
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.evt_len   = 0;
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.p_evt_buf = NULL;
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.rsp_buf_size     = 0;
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.p_rsp_buf        = NULL;
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delete_pipe          = 0;
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (nfa_hci_cb.cmd_sent)
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_SET_PARAMETER:
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.data_len = 0;
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.index    = nfa_hci_cb.param_in_use;
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                        = NFA_HCI_SET_REG_RSP_EVT;
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_GET_PARAMETER:
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.data_len = 0;
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.index    = nfa_hci_cb.param_in_use;
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                        = NFA_HCI_GET_REG_RSP_EVT;
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_OPEN_PIPE:
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe          = nfa_hci_cb.pipe_in_use;
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.opened.pipe = nfa_hci_cb.pipe_in_use;
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                  = NFA_HCI_OPEN_PIPE_EVT;
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_CLOSE_PIPE:
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe          = nfa_hci_cb.pipe_in_use;
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.closed.pipe = nfa_hci_cb.pipe_in_use;
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                  = NFA_HCI_CLOSE_PIPE_EVT;
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ADM_CREATE_PIPE:
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.pipe        = nfa_hci_cb.pipe_in_use;
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.source_gate = nfa_hci_cb.local_gate_in_use;
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.dest_host   = nfa_hci_cb.remote_host_in_use;
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.dest_gate   = nfa_hci_cb.remote_gate_in_use;
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                          = NFA_HCI_CREATE_PIPE_EVT;
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ADM_DELETE_PIPE:
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already. Just release the pipe.
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.pipe_in_use <= NFA_HCI_LAST_DYNAMIC_PIPE)
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use);
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use;
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                   = NFA_HCI_DELETE_PIPE_EVT;
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        default:
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (delete_pipe && (delete_pipe <= NFA_HCI_LAST_DYNAMIC_PIPE))
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_delete_pipe_cmd (delete_pipe);
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_release_pipe (delete_pipe);
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_DISABLED:
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_DEBUG0 ("nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state");
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (evt != 0)
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_to_app (evt, &evt_data, nfa_hci_cb.app_in_use);
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_set_receive_buf
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set reassembly buffer for incoming message
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_set_receive_buf (UINT8 pipe)
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)  )
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (nfa_hci_cb.rsp_buf_size)
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(nfa_hci_cb.p_rsp_buf != NULL)  )
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.p_msg_data  = nfa_hci_cb.p_rsp_buf;
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.max_msg_len = nfa_hci_cb.rsp_buf_size;
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.p_msg_data  = nfa_hci_cb.msg_data;
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.max_msg_len = NFA_MAX_HCI_EVENT_LEN;
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_assemble_msg
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reassemble the incoming message
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len)
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((nfa_hci_cb.msg_len + data_len) > nfa_hci_cb.max_msg_len)
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Fill the buffer as much it can hold */
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        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));
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len         = nfa_hci_cb.max_msg_len;
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Set Reassembly failed */
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.assembly_failed = TRUE;
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        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));
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, data_len);
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len += data_len;
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_evt_hdlr
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing all event for NFA HCI
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if p_msg needs to be deallocated
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg)
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVENT_DATA *p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg;
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT4 ("nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)",
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      nfa_hciu_get_state_name (nfa_hci_cb.hci_state), nfa_hci_cb.hci_state,
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      nfa_hciu_get_event_name (p_evt_data->hdr.event), p_evt_data->hdr.event);
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT2 ("nfa_hci_evt_hdlr state: %d event: 0x%04x", nfa_hci_cb.hci_state, p_evt_data->hdr.event);
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If this is an API request, queue it up */
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) && (p_msg->event <= NFA_HCI_LAST_API_EVENT))
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_enqueue (&nfa_hci_cb.hci_api_q, p_msg);
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_msg->event)
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_NV_READ_EVT:
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status);
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_NV_WRITE_EVT:
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* NV Ram write completed - nothing to do... */
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_TIMEOUT_EVT:
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_rsp_timeout ((tNFA_HCI_EVENT_DATA *)p_msg);
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_CHECK_QUEUE_EVT:
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (HCI_LOOPBACK_DEBUG)
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_msg->len != 0)
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tNFC_DATA_CEVT   xx;
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    xx.p_data = p_msg;
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_conn_cback (0, NFC_DATA_CEVT, (tNFC_CONN *)&xx);
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg->event > NFA_HCI_LAST_API_EVENT))
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_check_api_requests ();
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hciu_is_no_host_resetting ())
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_check_pending_api_requests ();
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) && (nfa_hci_cb.nv_write_needed))
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.nv_write_needed = FALSE;
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1058