nfa_hci_main.c revision 5c65c3a0f42e174e47fecd4e569606003217ff4e
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/******************************************************************************
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  Copyright (C) 2010-2013 Broadcom Corporation
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  Licensed under the Apache License, Version 2.0 (the "License");
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  you may not use this file except in compliance with the License.
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  You may obtain a copy of the License at:
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  http://www.apache.org/licenses/LICENSE-2.0
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  Unless required by applicable law or agreed to in writing, software
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  distributed under the License is distributed on an "AS IS" BASIS,
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  See the License for the specific language governing permissions and
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  limitations under the License.
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ******************************************************************************/
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/******************************************************************************
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  This is the main implementation file for the NFA HCI.
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ******************************************************************************/
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string.h>
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfc_api.h"
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_sys.h"
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_sys_int.h"
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_dm_int.h"
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_hci_api.h"
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_hci_int.h"
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_ee_api.h"
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_ee_int.h"
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_nv_co.h"
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_mem_co.h"
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "nfa_hci_defs.h"
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "trace_api.h"
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*****************************************************************************
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**  Global Variables
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*****************************************************************************/
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskitNFA_HCI_CB nfa_hci_cb;
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef NFA_HCI_NV_READ_TIMEOUT_VAL
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define NFA_HCI_NV_READ_TIMEOUT_VAL    1000
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef NFA_HCI_CON_CREATE_TIMEOUT_VAL
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define NFA_HCI_CON_CREATE_TIMEOUT_VAL 1000
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*****************************************************************************
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**  Static Functions
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*****************************************************************************/
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* event handler function type */
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg);
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_sys_enable (void);
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_sys_disable (void);
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data);
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_set_receive_buf (UINT8 pipe);
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len);
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status);
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*****************************************************************************
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**  Constants
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*****************************************************************************/
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const tNFA_SYS_REG nfa_hci_sys_reg =
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_sys_enable,
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_evt_hdlr,
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_sys_disable,
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_proc_nfcc_power_mode
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_ee_info_cback
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Callback function
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_ee_info_cback (tNFA_EE_DISC_STS status)
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8           num_nfcee = 3;
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_EE_INFO    ee_info[3];
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_DEBUG1 ("nfa_hci_ee_info_cback (): %d", status);
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    switch (status)
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_EE_DISC_STS_ON:
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* NFCEE Discovery is in progress */
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.ee_disc_cmplt      = TRUE;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.ee_disable_disc    = FALSE;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.num_ee_dis_req_ntf = 0;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.num_hot_plug_evts  = 0;
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.conn_id            = 0;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_startup ();
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_EE_DISC_STS_OFF:
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.ee_disable_disc  = TRUE;
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Discovery operation is complete, retrieve discovery result */
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        NFA_EeGetInfo (&num_nfcee, ee_info);
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.num_nfcee        = num_nfcee;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (  (nfa_hci_cb.num_nfcee <= 1)
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.num_hot_plug_evts  == (nfa_hci_cb.num_nfcee - 1))  )
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                /* No UICC Host is detected or
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                 * HOT_PLUG_EVT(s) and or EE DISC REQ Ntf(s) are already received
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                 * Get Host list and notify SYS on Initialization complete */
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                nfa_sys_stop_timer (&nfa_hci_cb.timer);
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (  (nfa_hci_cb.num_nfcee > 1)
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    &&(nfa_hci_cb.num_ee_dis_req_ntf != (nfa_hci_cb.num_nfcee - 1))  )
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    /* Received HOT PLUG EVT, we will also wait for EE DISC REQ Ntf(s) */
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                else
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else if (nfa_hci_cb.num_nfcee <= 1)
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* No UICC Host is detected, HCI NETWORK is enabled */
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.w4_hci_netwk_init = FALSE;
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_EE_DISC_STS_REQ:
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.num_ee_dis_req_ntf++;
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.ee_disable_disc)
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Already received Discovery Ntf */
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                /* Received DISC REQ Ntf while waiting for other Host in the network to bootup after DH host bootup is complete */
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    /* Received expected number of EE DISC REQ Ntf(s) */
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_sys_stop_timer (&nfa_hci_cb.timer);
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            else if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)  )
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                /* Received DISC REQ Ntf during DH host bootup */
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    /* Received expected number of EE DISC REQ Ntf(s) */
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_init
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Initialize NFA HCI
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_init (void)
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_DEBUG0 ("nfa_hci_init ()");
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* initialize control block */
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memset (&nfa_hci_cb, 0, sizeof (tNFA_HCI_CB));
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* register message handler on NFA SYS */
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_sys_register (NFA_ID_HCI, &nfa_hci_sys_reg);
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_is_valid_cfg
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Validate hci control block config parameters
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiBOOLEAN nfa_hci_is_valid_cfg (void)
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8       xx,yy,zz;
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_HANDLE reg_app[NFA_HCI_MAX_APP_CB];
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8       valid_gate[NFA_HCI_MAX_GATE_CB];
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8       app_count       = 0;
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8       gate_count      = 0;
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT32      pipe_inx_mask   = 0;
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* First, see if valid values are stored in app names, send connectivity events flag */
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++)
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Check if app name is valid with null terminated string */
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (strlen (&nfa_hci_cb.cfg.reg_app_names[xx][0]) > NFA_MAX_HCI_APP_NAME_LEN)
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return FALSE;
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Send Connectivity event flag can be either TRUE or FALSE */
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (  (nfa_hci_cb.cfg.b_send_conn_evts[xx] != TRUE)
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            &&(nfa_hci_cb.cfg.b_send_conn_evts[xx] != FALSE))
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return FALSE;
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0)
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the app name is present more than one time in the control block */
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (yy = xx + 1; yy < NFA_HCI_MAX_APP_CB; yy++)
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (  (nfa_hci_cb.cfg.reg_app_names[yy][0] != 0)
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    &&(!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]))) )
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    /* Two app cannot have the same name , NVRAM is corrupted */
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFA_TRACE_EVENT2 ("nfa_hci_is_valid_cfg (%s)  Reusing: %u", &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return FALSE;
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Collect list of hci handle */
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            reg_app[app_count++] = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI);
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* Validate Gate Control block */
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++)
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != 0)
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (  (  (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_LOOP_BACK_GATE)
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.cfg.dyn_gates[xx].gate_id > NFA_HCI_LAST_PROP_GATE))
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the same gate id is present more than once in the control block */
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (yy = xx + 1; yy < NFA_HCI_MAX_GATE_CB; yy++)
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (  (nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0)
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id == nfa_hci_cb.cfg.dyn_gates[yy].gate_id) )
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return FALSE;
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >= NFA_HCI_MAX_APP_CB)
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE)
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                /* The gate owner should be one of the registered application */
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                for (zz = 0; zz < app_count; zz++)
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz])
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        break;
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (zz == app_count)
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return FALSE;
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Collect list of allocated gates */
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            valid_gate[gate_count++] = nfa_hci_cb.cfg.dyn_gates[xx].gate_id;
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* No two gates can own a same pipe */
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if ((pipe_inx_mask & nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask) != 0)
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Collect the list of pipes on this gate */
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pipe_inx_mask |= nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask;
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Every bit set in pipe increment mask indicates a valid pipe */
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pipe_inx_mask & 1)
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the pipe is valid one */
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (xx == NFA_HCI_MAX_PIPE_CB)
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return FALSE;
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* Validate Gate Control block */
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++)
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id != 0)
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if pipe id is valid */
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if pipe state is valid */
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (  (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_OPENED)
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_CLOSED))
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if local gate on which the pipe is created is valid */
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            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))
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.cfg.dyn_pipes[xx].local_gate > NFA_HCI_LAST_PROP_GATE))
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the peer gate on which the pipe is created is valid */
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            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))
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ||(nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate > NFA_HCI_LAST_PROP_GATE))
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the same pipe is present more than once in the control block */
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (yy = xx + 1; yy < NFA_HCI_MAX_PIPE_CB; yy++)
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (  (nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0)
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id == nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id) )
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return FALSE;
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* The local gate should be one of the element in gate control block */
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (zz = 0; zz < gate_count; zz++)
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz])
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    break;
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (zz == gate_count)
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate: %u", nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* Check if admin pipe state is valid */
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (  (nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_OPENED)
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        &&(nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_CLOSED))
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return FALSE;
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* Check if link management pipe state is valid */
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (  (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED)
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        &&(nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_CLOSED))
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return FALSE;
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    pipe_inx_mask = nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask;
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Every bit set in pipe increment mask indicates a valid pipe */
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pipe_inx_mask & 1)
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the pipe is valid one */
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Check if the pipe is connected to Identity management gate */
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return FALSE;
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (xx == NFA_HCI_MAX_PIPE_CB)
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return FALSE;
387a5018c900f126ee8424c82497f32983873db741bAdam Lesinski
38894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    return TRUE;
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_cfg_default
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Configure default values for hci control block
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_restore_default_config (UINT8 *p_session_id)
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memset (&nfa_hci_cb.cfg, 0, sizeof (nfa_hci_cb.cfg));
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memcpy (nfa_hci_cb.cfg.admin_gate.session_id, p_session_id, NFA_HCI_SESSION_ID_LEN);
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_cb.nv_write_needed = TRUE;
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_proc_nfcc_power_mode
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Restore NFA HCI sub-module
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
41694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinskivoid nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_DEBUG1 ("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d", nfcc_power_mode);
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* if NFCC power mode is change to full power */
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.b_low_power_mode = FALSE;
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE)
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.hci_state          = NFA_HCI_STATE_RESTORE;
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.ee_disc_cmplt      = FALSE;
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.ee_disable_disc    = TRUE;
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.num_nfcee > 1)
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                nfa_hci_cb.w4_hci_netwk_init  = TRUE;
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            else
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                nfa_hci_cb.w4_hci_netwk_init  = FALSE;
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.conn_id            = 0;
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.num_ee_dis_req_ntf = 0;
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.num_hot_plug_evts  = 0;
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            NFA_TRACE_ERROR0 ("nfa_hci_proc_nfcc_power_mode (): Cannot restore now");
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state     = NFA_HCI_STATE_IDLE;
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.w4_rsp_evt    = FALSE;
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.conn_id       = 0;
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_sys_stop_timer (&nfa_hci_cb.timer);
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.b_low_power_mode = TRUE;
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_dh_startup_complete
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Initialization of terminal host in HCI Network is completed
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**                  Wait for other host in the network to initialize
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_dh_startup_complete (void)
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hci_cb.w4_hci_netwk_init)
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
46994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        {
47094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
47194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */
47294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
47394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        }
47494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
47594fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        {
47694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            nfa_hci_cb.hci_state = NFA_HCI_STATE_RESTORE_NETWK_ENABLE;
47794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */
47894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
47994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        }
48094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    }
48194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    else if (  (nfa_hci_cb.num_nfcee > 1)
48294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski             &&(nfa_hci_cb.num_ee_dis_req_ntf != (nfa_hci_cb.num_nfcee - 1))  )
48394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    {
48494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        /* Received HOT PLUG EVT, we will also wait for EE DISC REQ Ntf(s) */
48594fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
48694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    }
48794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    else
48894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    {
48994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        /* Received EE DISC REQ Ntf(s) */
49094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
49194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    }
49294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski}
49394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski
49494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski/*******************************************************************************
49594fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
49694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Function         nfa_hci_startup_complete
49794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
49894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Description      HCI network initialization is completed
49994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
50094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Returns          None
50194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
50294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski*******************************************************************************/
50394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinskivoid nfa_hci_startup_complete (tNFA_STATUS status)
50494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski{
50594fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    tNFA_HCI_EVT_DATA   evt_data;
50694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski
50794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    NFA_TRACE_EVENT1 ("nfa_hci_startup_complete (): Status: %u", status);
50894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski
50994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    nfa_sys_stop_timer (&nfa_hci_cb.timer);
51094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski
51194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
51294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
51394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    {
51494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_ee_proc_hci_info_cback ();
51594fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
51694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    }
51794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    else
51894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    {
51994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        evt_data.hci_init.status = status;
52094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski
52194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data);
52294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        nfa_sys_cback_notify_enable_complete (NFA_ID_HCI);
52394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski    }
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (status == NFA_STATUS_OK)
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_startup
535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Perform HCI startup
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_startup (void)
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_STATUS     status = NFA_STATUS_FAILED;
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_EE_INFO    ee_info[2];
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8           num_nfcee = 2;
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8           target_handle;
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8           count = 0;
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    BOOLEAN         found = FALSE;
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (HCI_LOOPBACK_DEBUG)
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* First step in initialization is to open the admin pipe */
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return;
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* We can only start up if NV Ram is read and EE discovery is complete */
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt && (nfa_hci_cb.conn_id == 0))
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        NFA_EeGetInfo (&num_nfcee, ee_info);
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        while ((count < num_nfcee) && (!found))
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            target_handle = (UINT8) ee_info[count].ee_handle;
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if(ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS)
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                found = TRUE;
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE)
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFC_NfceeModeSet (target_handle, NFC_MODE_ACTIVATE);
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if ((status = NFC_ConnCreate (NCI_DEST_TYPE_NFCEE, target_handle, NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback)) == NFA_STATUS_OK)
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CON_CREATE_TIMEOUT_VAL);
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                else
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    NFA_TRACE_ERROR0 ("nfa_hci_startup - Failed to Create Logical connection. HCI Initialization/Restore failed");
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_startup_complete (NFA_STATUS_FAILED);
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count++;
584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!found)
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            NFA_TRACE_ERROR0 ("nfa_hci_startup - HCI ACCESS Interface not discovered. HCI Initialization/Restore failed");
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_startup_complete (NFA_STATUS_FAILED);
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_sys_enable
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Enable NFA HCI
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_sys_enable (void)
603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_DEBUG0 ("nfa_hci_sys_enable ()");
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_ee_reg_cback_enable_done (&nfa_hci_ee_info_cback);
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_nv_co_read ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NV_READ_TIMEOUT_VAL);
609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_sys_disable
614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Disable NFA HCI
616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_sys_disable (void)
621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_HCI_EVT_DATA   evt_data;
623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_sys_stop_timer (&nfa_hci_cb.timer);
625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hci_cb.conn_id)
627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_sys_is_graceful_disable ())
629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Tell all applications stack is down */
631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_to_all_apps (NFA_HCI_EXIT_EVT, &evt_data);
632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            NFC_ConnClose (nfa_hci_cb.conn_id);
633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return;
634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.conn_id = 0;
636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* deregister message handler on NFA SYS */
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_sys_deregister (NFA_ID_HCI);
641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_conn_cback
646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      This function Process event from NCI
648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8   *p;
655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    BT_HDR  *p_pkt = (BT_HDR *) p_data->data.p_data;
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8   chaining_bit;
657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8   pipe;
658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT16  pkt_len;
659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (event == NFC_CONN_CREATE_CEVT)
661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.conn_id   = conn_id;
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.buff_size = p_data->conn_create.buff_size;
664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.w4_hci_netwk_init = TRUE;
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_alloc_gate (NFA_HCI_CONNECTIVITY_GATE,0);
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_CLOSED)
672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* First step in initialization/restore is to open the admin pipe */
674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Read session id, to know DH session id is correct */
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX);
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else if (event == NFC_CONN_CLOSE_CEVT)
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.conn_id   = 0;
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* deregister message handler on NFA SYS */
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_sys_deregister (NFA_ID_HCI);
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((event != NFC_DATA_CEVT) || (p_pkt == NULL))
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return;
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Received HCP Packet before timeout, Other Host initialization is not complete */
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_sys_stop_timer (&nfa_hci_cb.timer);
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.w4_hci_netwk_init)
699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    p       = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    pkt_len = p_pkt->len;
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if (BT_TRACE_PROTOCOL == TRUE)
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DispHcp (p, pkt_len, TRUE, (BOOLEAN) !nfa_hci_cb.assembling);
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    chaining_bit = ((*p) >> 0x07) & 0x01;
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    pipe = (*p++) & 0x7F;
711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (pkt_len != 0)
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        pkt_len--;
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hci_cb.assembling == FALSE)
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* First Segment of a packet */
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.type            = ((*p) >> 0x06) & 0x03;
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.inst            = (*p++ & 0x3F);
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pkt_len != 0)
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pkt_len--;
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.assembly_failed = FALSE;
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.msg_len         = 0;
723ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (chaining_bit == NFA_HCI_MESSAGE_FRAGMENTATION)
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.assembling = TRUE;
727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_set_receive_buf (pipe);
728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_assemble_msg (p, pkt_len);
729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if ((pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE))
733a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            {
734a5018c900f126ee8424c82497f32983873db741bAdam Lesinski                nfa_hci_set_receive_buf (pipe);
735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                nfa_hci_assemble_msg (p, pkt_len);
736a5018c900f126ee8424c82497f32983873db741bAdam Lesinski                p = nfa_hci_cb.p_msg_data;
737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
73894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        }
739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else
741a5018c900f126ee8424c82497f32983873db741bAdam Lesinski    {
742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.assembly_failed)
743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
744a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            /* If Reassembly failed because of insufficient buffer, just drop the new segmented packets */
745a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            NFA_TRACE_ERROR1 ("nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", pkt_len);
74694fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        }
74794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        else
74894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        {
74994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            /* Reassemble the packet */
750a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            nfa_hci_assemble_msg (p, pkt_len);
751a5018c900f126ee8424c82497f32983873db741bAdam Lesinski        }
752a5018c900f126ee8424c82497f32983873db741bAdam Lesinski
753a5018c900f126ee8424c82497f32983873db741bAdam Lesinski        if (chaining_bit == NFA_HCI_NO_MESSAGE_FRAGMENTATION)
754a5018c900f126ee8424c82497f32983873db741bAdam Lesinski        {
755a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            /* Just added the last segment in the chain. Reset pointers */
756a5018c900f126ee8424c82497f32983873db741bAdam Lesinski            nfa_hci_cb.assembling = FALSE;
75794fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            p                     = nfa_hci_cb.p_msg_data;
758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pkt_len               = nfa_hci_cb.msg_len;
759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if (BT_TRACE_VERBOSE == TRUE)
763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_EVENT5 ("nfa_hci_conn_cback Recvd data pipe:%d  %s  chain:%d  assmbl:%d  len:%d",
764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      (UINT8)pipe, nfa_hciu_get_type_inst_names (pipe, nfa_hci_cb.type, nfa_hci_cb.inst),
765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      (UINT8)chaining_bit, (UINT8)nfa_hci_cb.assembling, p_pkt->len);
766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#else
767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_EVENT6 ("nfa_hci_conn_cback Recvd data pipe:%d  Type: %u  Inst: %u  chain:%d reassm:%d len:%d",
768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit, nfa_hci_cb.assembling, p_pkt->len);
769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* If still reassembling fragments, just return */
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hci_cb.assembling)
774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* if not last packet, release GKI buffer */
776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        GKI_freebuf (p_pkt);
777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return;
778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* If we got a response, cancel the response timer. Also, if waiting for */
781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* a single response, we can go back to idle state                       */
782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_RSP)
783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        &&((nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) || (nfa_hci_cb.w4_rsp_evt && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)))  )
784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_sys_stop_timer (&nfa_hci_cb.timer);
786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state  = NFA_HCI_STATE_IDLE;
787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    switch (pipe)
790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_ADMIN_PIPE:
792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Check if data packet is a command, response or event */
793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_admin_gate_cmd (p);
796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE)
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_admin_gate_rsp (p, (UINT8) pkt_len);
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)
802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_admin_gate_evt (p);
804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_LINK_MANAGEMENT_PIPE:
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* We don't send Link Management commands, we only get them */
809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_link_mgm_gate_cmd (p);
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    default:
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_dyn_pipe_pkt (pipe, p, pkt_len);
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) || (nfa_hci_cb.w4_rsp_evt && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)))
820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.w4_rsp_evt = FALSE;
822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* Send a message to ouselves to check for anything to do */
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    p_pkt->event = NFA_HCI_CHECK_QUEUE_EVT;
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    p_pkt->len   = 0;
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_sys_sendmsg (p_pkt);
828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_handle_nv_read
833ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright**
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      handler function for nv read complete event
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
838ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright*******************************************************************************/
839ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wrightvoid nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status)
840ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright{
841ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    UINT8   session_id[NFA_HCI_SESSION_ID_LEN];
842ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    UINT8   default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
843ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    UINT8   reset_session[NFA_HCI_SESSION_ID_LEN]   = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
844ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    UINT32  os_tick;
845ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright
846ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    if (block == DH_NV_BLOCK)
847ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    {
848ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright        /* Stop timer as NVDATA Read Completed */
849ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright        nfa_sys_stop_timer (&nfa_hci_cb.timer);
850ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright        nfa_hci_cb.nv_read_cmplt = TRUE;
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (  (status != NFA_STATUS_OK)
852ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright            ||(!nfa_hci_is_valid_cfg ())
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN)))
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN)))  )
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.b_hci_netwk_reset = TRUE;
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* Set a new session id so that we clear all pipes later after seeing a difference with the HC Session ID */
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            memcpy (&session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2));
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            os_tick = GKI_get_os_tick_count ();
860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2));
861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_restore_default_config (session_id);
862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_startup ();
864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
86894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
86994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Function         nfa_hci_rsp_timeout
87094fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
87194fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Description      action function to process timeout
87294fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
87394fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski** Returns          None
87494fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski**
875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data)
877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_HCI_EVT        evt = 0;
879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_HCI_EVT_DATA   evt_data;
880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UINT8               delete_pipe;
881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_EVENT2 ("nfa_hci_rsp_timeout () State: %u  Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    evt_data.status      = NFA_STATUS_FAILED;
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    switch (nfa_hci_cb.hci_state)
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
888a5018c900f126ee8424c82497f32983873db741bAdam Lesinski    case NFA_HCI_STATE_STARTUP:
889a5018c900f126ee8424c82497f32983873db741bAdam Lesinski    case NFA_HCI_STATE_RESTORE:
890a5018c900f126ee8424c82497f32983873db741bAdam Lesinski        NFA_TRACE_ERROR0 ("nfa_hci_rsp_timeout - Initialization failed!");
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_startup_complete (NFA_STATUS_TIMEOUT);
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
894a5018c900f126ee8424c82497f32983873db741bAdam Lesinski    case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
895a5018c900f126ee8424c82497f32983873db741bAdam Lesinski    case NFA_HCI_STATE_RESTORE_NETWK_ENABLE:
896a5018c900f126ee8424c82497f32983873db741bAdam Lesinski
897a5018c900f126ee8424c82497f32983873db741bAdam Lesinski        if (nfa_hci_cb.w4_hci_netwk_init)
89894fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski        {
89994fc9124f51f0a101cc11e4563f9c647980fe2aaAdam Lesinski            /* HCI Network is enabled */
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.w4_hci_netwk_init = FALSE;
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_startup_complete (NFA_STATUS_FAILED);
906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_STATE_REMOVE_GATE:
910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Something wrong, NVRAM data could be corrupt */
911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_clear_all_pipe_cmd ();
914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_remove_all_pipes_from_host (0);
918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_api_dealloc_gate (NULL);
919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_STATE_APP_DEREGISTER:
923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Something wrong, NVRAM data could be corrupt */
924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_clear_all_pipe_cmd ();
927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else
929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_remove_all_pipes_from_host (0);
931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_api_deregister (NULL);
932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_STATE_WAIT_RSP:
936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (nfa_hci_cb.w4_rsp_evt)
939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.w4_rsp_evt       = FALSE;
941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                         = NFA_HCI_EVENT_RCVD_EVT;
942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.rcvd_evt.pipe      = nfa_hci_cb.pipe_in_use;
943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.rcvd_evt.evt_code  = 0;
944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.rcvd_evt.evt_len   = 0;
945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.rcvd_evt.p_evt_buf = NULL;
946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.rsp_buf_size     = 0;
947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.p_rsp_buf        = NULL;
948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        delete_pipe          = 0;
953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        switch (nfa_hci_cb.cmd_sent)
954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ANY_SET_PARAMETER:
956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already and release the pipe. But still send delete pipe command to be safe.
959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete_pipe                = nfa_hci_cb.pipe_in_use;
961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.data_len = 0;
963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.index    = nfa_hci_cb.param_in_use;
964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                        = NFA_HCI_SET_REG_RSP_EVT;
965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ANY_GET_PARAMETER:
968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already and release the pipe. But still send delete pipe command to be safe.
971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete_pipe                = nfa_hci_cb.pipe_in_use;
973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.data_len = 0;
975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.registry.index    = nfa_hci_cb.param_in_use;
976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                        = NFA_HCI_GET_REG_RSP_EVT;
977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ANY_OPEN_PIPE:
980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already and release the pipe. But still send delete pipe command to be safe.
983282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete_pipe          = nfa_hci_cb.pipe_in_use;
985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.opened.pipe = nfa_hci_cb.pipe_in_use;
986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                  = NFA_HCI_OPEN_PIPE_EVT;
987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ANY_CLOSE_PIPE:
990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
992282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already and release the pipe. But still send delete pipe command to be safe.
993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete_pipe          = nfa_hci_cb.pipe_in_use;
995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.closed.pipe = nfa_hci_cb.pipe_in_use;
996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                  = NFA_HCI_CLOSE_PIPE_EVT;
997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ADM_CREATE_PIPE:
1000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.created.pipe        = nfa_hci_cb.pipe_in_use;
1001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.created.source_gate = nfa_hci_cb.local_gate_in_use;
1002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.created.dest_host   = nfa_hci_cb.remote_host_in_use;
1003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.created.dest_gate   = nfa_hci_cb.remote_gate_in_use;
1004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                          = NFA_HCI_CREATE_PIPE_EVT;
1005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_ADM_DELETE_PIPE:
1008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
1009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
1010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already. Just release the pipe.
1011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
1012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (nfa_hci_cb.pipe_in_use <= NFA_HCI_LAST_DYNAMIC_PIPE)
1013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use);
1014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use;
1015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            evt                   = NFA_HCI_DELETE_PIPE_EVT;
1016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        default:
1019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /*
1020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * As no response to the command sent on this pipe, we may assume the pipe is
1021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             * deleted already and release the pipe. But still send delete pipe command to be safe.
1022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             */
1023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete_pipe                = nfa_hci_cb.pipe_in_use;
1024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (delete_pipe && (delete_pipe <= NFA_HCI_LAST_DYNAMIC_PIPE))
1027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
1028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_send_delete_pipe_cmd (delete_pipe);
1029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hciu_release_pipe (delete_pipe);
1030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
1032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case NFA_HCI_STATE_DISABLED:
1033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    default:
1034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        NFA_TRACE_DEBUG0 ("nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state");
1035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        break;
1036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (evt != 0)
1038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hciu_send_to_app (evt, &evt_data, nfa_hci_cb.app_in_use);
1039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
1042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_set_receive_buf
1044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Set reassembly buffer for incoming message
1046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          status
1048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
1050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_set_receive_buf (UINT8 pipe)
1051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (  (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
1053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        &&(nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)  )
1054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (  (nfa_hci_cb.rsp_buf_size)
1056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            &&(nfa_hci_cb.p_rsp_buf != NULL)  )
1057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
1058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.p_msg_data  = nfa_hci_cb.p_rsp_buf;
1059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_cb.max_msg_len = nfa_hci_cb.rsp_buf_size;
1060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return;
1061ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright        }
1062ec4fdec76f2916b91a69d979f400cd69a3812631Michael Wright    }
1063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_cb.p_msg_data  = nfa_hci_cb.msg_data;
1064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_cb.max_msg_len = NFA_MAX_HCI_EVENT_LEN;
1065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
1068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_assemble_msg
1070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Reassemble the incoming message
1072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          None
1074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
1076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len)
1077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((nfa_hci_cb.msg_len + data_len) > nfa_hci_cb.max_msg_len)
1079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Fill the buffer as much it can hold */
1081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        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));
1082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.msg_len         = nfa_hci_cb.max_msg_len;
1083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* Set Reassembly failed */
1084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.assembly_failed = TRUE;
1085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        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));
1086282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1087282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else
1088282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1089282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, data_len);
1090282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.msg_len += data_len;
1091282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*******************************************************************************
1095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Function         nfa_hci_evt_hdlr
1097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Description      Processing all event for NFA HCI
1099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski** Returns          TRUE if p_msg needs to be deallocated
1101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski**
1102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski*******************************************************************************/
1103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg)
1104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    tNFA_HCI_EVENT_DATA *p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg;
1106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if (BT_TRACE_VERBOSE == TRUE)
1108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_EVENT4 ("nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)",
1109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      nfa_hciu_get_state_name (nfa_hci_cb.hci_state), nfa_hci_cb.hci_state,
1110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      nfa_hciu_get_event_name (p_evt_data->hdr.event), p_evt_data->hdr.event);
1111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#else
1112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NFA_TRACE_EVENT2 ("nfa_hci_evt_hdlr state: %d event: 0x%04x", nfa_hci_cb.hci_state, p_evt_data->hdr.event);
1113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
1114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* If this is an API request, queue it up */
1116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) && (p_msg->event <= NFA_HCI_LAST_API_EVENT))
1117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        GKI_enqueue (&nfa_hci_cb.hci_api_q, p_msg);
1119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    else
1121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        switch (p_msg->event)
1123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {
1124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_RSP_NV_READ_EVT:
1125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status);
1126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_RSP_NV_WRITE_EVT:
1129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* NV Ram write completed - nothing to do... */
1130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_RSP_TIMEOUT_EVT:
1133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            nfa_hci_rsp_timeout ((tNFA_HCI_EVENT_DATA *)p_msg);
1134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case NFA_HCI_CHECK_QUEUE_EVT:
1137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (HCI_LOOPBACK_DEBUG)
1138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {
1139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (p_msg->len != 0)
1140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                {
1141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    tNFC_DATA_CEVT   xx;
1142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    xx.p_data = p_msg;
1143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    nfa_hci_conn_cback (0, NFC_DATA_CEVT, (tNFC_CONN *)&xx);
1144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return FALSE;
1145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
1146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
1148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((p_msg->event > NFA_HCI_LAST_API_EVENT))
1152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        GKI_freebuf (p_msg);
1153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    nfa_hci_check_api_requests ();
1155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (nfa_hciu_is_no_host_resetting ())
1157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_check_pending_api_requests ();
1158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) && (nfa_hci_cb.nv_write_needed))
1160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_hci_cb.nv_write_needed = FALSE;
1162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
1163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return FALSE;
1166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski