nfa_hci_main.c revision e9629bad30a9f478b336ab46b8e6e02f7f87af46
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This is the main implementation file for the NFA HCI.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_int.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_dm_int.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_api.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_api.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_nv_co.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_defs.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Global Variables
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_HCI_CB nfa_hci_cb;
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFA_HCI_NV_READ_TIMEOUT_VAL
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFA_HCI_NV_READ_TIMEOUT_VAL    1000
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFA_HCI_CON_CREATE_TIMEOUT_VAL
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFA_HCI_CON_CREATE_TIMEOUT_VAL 1000
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Static Functions
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* event handler function type */
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg);
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_enable (void);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_disable (void);
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data);
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_set_receive_buf (UINT8 pipe);
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len);
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status);
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  Constants
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic const tNFA_SYS_REG nfa_hci_sys_reg =
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_sys_enable,
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_evt_hdlr,
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_sys_disable,
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_proc_nfcc_power_mode
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_ee_info_cback
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Callback function
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfa_hci_ee_info_cback (tNFA_EE_DISC_STS status)
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8           num_nfcee = 3;
925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFA_EE_INFO    ee_info[3];
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_TRACE_DEBUG1 ("nfa_hci_ee_info_cback (): %d", status);
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    switch (status)
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_EE_DISC_STS_ON:
99d05817f02d578becbf79b46f2599126404c7b413Evan Chu        if (  (!nfa_hci_cb.ee_disc_cmplt)
100d05817f02d578becbf79b46f2599126404c7b413Evan Chu            &&((nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) || (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE))  )
101d05817f02d578becbf79b46f2599126404c7b413Evan Chu        {
102d05817f02d578becbf79b46f2599126404c7b413Evan Chu            /* NFCEE Discovery is in progress */
103d05817f02d578becbf79b46f2599126404c7b413Evan Chu            nfa_hci_cb.ee_disc_cmplt      = TRUE;
104d05817f02d578becbf79b46f2599126404c7b413Evan Chu            nfa_hci_cb.num_ee_dis_req_ntf = 0;
105d05817f02d578becbf79b46f2599126404c7b413Evan Chu            nfa_hci_cb.num_hot_plug_evts  = 0;
106d05817f02d578becbf79b46f2599126404c7b413Evan Chu            nfa_hci_cb.conn_id            = 0;
107d05817f02d578becbf79b46f2599126404c7b413Evan Chu            nfa_hci_startup ();
108d05817f02d578becbf79b46f2599126404c7b413Evan Chu        }
1095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
1105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_EE_DISC_STS_OFF:
11245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        if (nfa_hci_cb.ee_disable_disc)
11345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            break;
1145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_hci_cb.ee_disable_disc  = TRUE;
1155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Discovery operation is complete, retrieve discovery result */
1165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NFA_EeGetInfo (&num_nfcee, ee_info);
1175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_hci_cb.num_nfcee        = num_nfcee;
1185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
1205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (  (nfa_hci_cb.num_nfcee <= 1)
1235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                ||(nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
1245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                ||(nfa_hci_cb.num_hot_plug_evts  == (nfa_hci_cb.num_nfcee - 1))  )
1255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
1265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* No UICC Host is detected or
1275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * HOT_PLUG_EVT(s) and or EE DISC REQ Ntf(s) are already received
1285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * Get Host list and notify SYS on Initialization complete */
1295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_sys_stop_timer (&nfa_hci_cb.timer);
1305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (  (nfa_hci_cb.num_nfcee > 1)
1315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    &&(nfa_hci_cb.num_ee_dis_req_ntf != (nfa_hci_cb.num_nfcee - 1))  )
1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
1335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* Received HOT PLUG EVT, we will also wait for EE DISC REQ Ntf(s) */
1345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
1355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
1365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                else
1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
1385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
1395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
1405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
1415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if (nfa_hci_cb.num_nfcee <= 1)
1445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
1455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* No UICC Host is detected, HCI NETWORK is enabled */
1465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.w4_hci_netwk_init = FALSE;
1475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
1495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_EE_DISC_STS_REQ:
1515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_hci_cb.num_ee_dis_req_ntf++;
1525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_hci_cb.ee_disable_disc)
1545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
1555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Already received Discovery Ntf */
1565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
1575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
1585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Received DISC REQ Ntf while waiting for other Host in the network to bootup after DH host bootup is complete */
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* Received expected number of EE DISC REQ Ntf(s) */
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_sys_stop_timer (&nfa_hci_cb.timer);
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                     ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)  )
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Received DISC REQ Ntf during DH host bootup */
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1))
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* Received expected number of EE DISC REQ Ntf(s) */
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_hci_cb.w4_hci_netwk_init = FALSE;
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_init
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialize NFA HCI
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_init (void)
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_hci_init ()");
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* initialize control block */
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&nfa_hci_cb, 0, sizeof (tNFA_HCI_CB));
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* register message handler on NFA SYS */
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_register (NFA_ID_HCI, &nfa_hci_sys_reg);
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_is_valid_cfg
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Validate hci control block config parameters
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_hci_is_valid_cfg (void)
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx,yy,zz;
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HANDLE reg_app[NFA_HCI_MAX_APP_CB];
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       valid_gate[NFA_HCI_MAX_GATE_CB];
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       app_count       = 0;
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       gate_count      = 0;
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32      pipe_inx_mask   = 0;
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* First, see if valid values are stored in app names, send connectivity events flag */
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++)
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if app name is valid with null terminated string */
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (strlen (&nfa_hci_cb.cfg.reg_app_names[xx][0]) > NFA_MAX_HCI_APP_NAME_LEN)
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Send Connectivity event flag can be either TRUE or FALSE */
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (nfa_hci_cb.cfg.b_send_conn_evts[xx] != TRUE)
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(nfa_hci_cb.cfg.b_send_conn_evts[xx] != FALSE))
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0)
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the app name is present more than one time in the control block */
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_APP_CB; yy++)
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.reg_app_names[yy][0] != 0)
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(!strncmp (&nfa_hci_cb.cfg.reg_app_names[xx][0], &nfa_hci_cb.cfg.reg_app_names[yy][0], strlen (nfa_hci_cb.cfg.reg_app_names[xx]))) )
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Two app cannot have the same name , NVRAM is corrupted */
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT2 ("nfa_hci_is_valid_cfg (%s)  Reusing: %u", &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect list of hci handle */
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            reg_app[app_count++] = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI);
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Validate Gate Control block */
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++)
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != 0)
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (  (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_LOOP_BACK_GATE)
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_gates[xx].gate_id > NFA_HCI_LAST_PROP_GATE))
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the same gate id is present more than once in the control block */
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_GATE_CB; yy++)
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0)
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id == nfa_hci_cb.cfg.dyn_gates[yy].gate_id) )
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >= NFA_HCI_MAX_APP_CB)
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE)
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* The gate owner should be one of the registered application */
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                for (zz = 0; zz < app_count; zz++)
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz])
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        break;
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (zz == app_count)
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect list of allocated gates */
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            valid_gate[gate_count++] = nfa_hci_cb.cfg.dyn_gates[xx].gate_id;
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* No two gates can own a same pipe */
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((pipe_inx_mask & nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask) != 0)
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Collect the list of pipes on this gate */
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pipe_inx_mask |= nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask;
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Every bit set in pipe increment mask indicates a valid pipe */
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe_inx_mask & 1)
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is valid one */
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx == NFA_HCI_MAX_PIPE_CB)
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Validate Gate Control block */
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++)
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id != 0)
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if pipe id is valid */
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if pipe state is valid */
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_OPENED)
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_CLOSED))
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if local gate on which the pipe is created is valid */
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (((nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_LOOP_BACK_GATE) && (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) && (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_pipes[xx].local_gate > NFA_HCI_LAST_PROP_GATE))
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the peer gate on which the pipe is created is valid */
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (((nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate != NFA_HCI_LOOP_BACK_GATE) && (nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) && (nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE))
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate > NFA_HCI_LAST_PROP_GATE))
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the same pipe is present more than once in the control block */
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (yy = xx + 1; yy < NFA_HCI_MAX_PIPE_CB; yy++)
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0)
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id == nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id) )
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Reusing: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* The local gate should be one of the element in gate control block */
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            for (zz = 0; zz < gate_count; zz++)
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz])
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (zz == gate_count)
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg  Invalid Gate: %u", nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if admin pipe state is valid */
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_OPENED)
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_CLOSED))
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if link management pipe state is valid */
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED)
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_CLOSED))
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pipe_inx_mask = nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask;
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1)
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Every bit set in pipe increment mask indicates a valid pipe */
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe_inx_mask & 1)
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is valid one */
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE)
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Check if the pipe is connected to Identity management gate */
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return FALSE;
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx == NFA_HCI_MAX_PIPE_CB)
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_cfg_default
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Configure default values for hci control block
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_restore_default_config (UINT8 *p_session_id)
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&nfa_hci_cb.cfg, 0, sizeof (nfa_hci_cb.cfg));
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (nfa_hci_cb.cfg.admin_gate.session_id, p_session_id, NFA_HCI_SESSION_ID_LEN);
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.nv_write_needed = TRUE;
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_proc_nfcc_power_mode
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Restore NFA HCI sub-module
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d", nfcc_power_mode);
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if NFCC power mode is change to full power */
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.b_low_power_mode = FALSE;
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE)
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
4315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.hci_state          = NFA_HCI_STATE_RESTORE;
4325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.ee_disc_cmplt      = FALSE;
4335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.ee_disable_disc    = TRUE;
4345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (nfa_hci_cb.num_nfcee > 1)
4355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_hci_cb.w4_hci_netwk_init  = TRUE;
4365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else
4375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_hci_cb.w4_hci_netwk_init  = FALSE;
4385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.conn_id            = 0;
4395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.num_ee_dis_req_ntf = 0;
4405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.num_hot_plug_evts  = 0;
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR0 ("nfa_hci_proc_nfcc_power_mode (): Cannot restore now");
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state     = NFA_HCI_STATE_IDLE;
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.w4_rsp_evt    = FALSE;
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id       = 0;
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.b_low_power_mode = TRUE;
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_dh_startup_complete
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialization of terminal host in HCI Network is completed
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Wait for other host in the network to initialize
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_dh_startup_complete (void)
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.w4_hci_netwk_init)
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
4735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
4745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
4755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
476df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            /* Wait for EE Discovery to complete */
477df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_EE_DISCV_TIMEOUT_VAL);
4785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
4795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
4805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
4815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.hci_state = NFA_HCI_STATE_RESTORE_NETWK_ENABLE;
4825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */
4835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
4845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
4855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
4865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else if (  (nfa_hci_cb.num_nfcee > 1)
4875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen             &&(nfa_hci_cb.num_ee_dis_req_ntf != (nfa_hci_cb.num_nfcee - 1))  )
4885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
48945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
49045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            nfa_hci_cb.ee_disable_disc  = TRUE;
4915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Received HOT PLUG EVT, we will also wait for EE DISC REQ Ntf(s) */
4925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
4955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
4965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Received EE DISC REQ Ntf(s) */
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
4985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_startup_complete
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      HCI network initialization is completed
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_startup_complete (tNFA_STATUS status)
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT1 ("nfa_hci_startup_complete (): Status: %u", status);
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_stop_timer (&nfa_hci_cb.timer);
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
5195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_ee_proc_hci_info_cback ();
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI);
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.hci_init.status = status;
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data);
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_cback_notify_enable_complete (NFA_ID_HCI);
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NFA_STATUS_OK)
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_startup
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Perform HCI startup
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_startup (void)
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_STATUS     status = NFA_STATUS_FAILED;
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_EE_INFO    ee_info[2];
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           num_nfcee = 2;
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           target_handle;
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           count = 0;
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN         found = FALSE;
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (HCI_LOOPBACK_DEBUG)
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* First step in initialization is to open the admin pipe */
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* We can only start up if NV Ram is read and EE discovery is complete */
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt && (nfa_hci_cb.conn_id == 0))
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_EeGetInfo (&num_nfcee, ee_info);
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while ((count < num_nfcee) && (!found))
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            target_handle = (UINT8) ee_info[count].ee_handle;
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if(ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS)
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                found = TRUE;
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE)
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFC_NfceeModeSet (target_handle, NFC_MODE_ACTIVATE);
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = NFC_ConnCreate (NCI_DEST_TYPE_NFCEE, target_handle, NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback)) == NFA_STATUS_OK)
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CON_CREATE_TIMEOUT_VAL);
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFA_TRACE_ERROR0 ("nfa_hci_startup - Failed to Create Logical connection. HCI Initialization/Restore failed");
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_startup_complete (NFA_STATUS_FAILED);
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            count++;
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!found)
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR0 ("nfa_hci_startup - HCI ACCESS Interface not discovered. HCI Initialization/Restore failed");
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_startup_complete (NFA_STATUS_FAILED);
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_sys_enable
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Enable NFA HCI
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_enable (void)
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_hci_sys_enable ()");
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_ee_reg_cback_enable_done (&nfa_hci_ee_info_cback);
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_nv_co_read ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NV_READ_TIMEOUT_VAL);
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_sys_disable
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disable NFA HCI
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_sys_disable (void)
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_stop_timer (&nfa_hci_cb.timer);
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.conn_id)
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_sys_is_graceful_disable ())
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Tell all applications stack is down */
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_to_all_apps (NFA_HCI_EXIT_EVT, &evt_data);
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_ConnClose (nfa_hci_cb.conn_id);
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id = 0;
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* deregister message handler on NFA SYS */
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_deregister (NFA_ID_HCI);
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_conn_cback
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function Process event from NCI
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p;
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR  *p_pkt = (BT_HDR *) p_data->data.p_data;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   chaining_bit;
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   pipe;
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16  pkt_len;
666df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu#if (BT_TRACE_VERBOSE == TRUE)
667df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    char    buff[100];
668df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu#endif
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_CONN_CREATE_CEVT)
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id   = conn_id;
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.buff_size = p_data->conn_create.buff_size;
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP)
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.w4_hci_netwk_init = TRUE;
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_alloc_gate (NFA_HCI_CONNECTIVITY_GATE,0);
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_CLOSED)
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* First step in initialization/restore is to open the admin pipe */
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE);
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Read session id, to know DH session id is correct */
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX);
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (event == NFC_CONN_CLOSE_CEVT)
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.conn_id   = 0;
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* deregister message handler on NFA SYS */
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_deregister (NFA_ID_HCI);
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((event != NFC_DATA_CEVT) || (p_pkt == NULL))
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)
7045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)  )
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Received HCP Packet before timeout, Other Host initialization is not complete */
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
7085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_hci_cb.w4_hci_netwk_init)
7095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p       = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pkt_len = p_pkt->len;
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispHcp (p, pkt_len, TRUE, (BOOLEAN) !nfa_hci_cb.assembling);
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    chaining_bit = ((*p) >> 0x07) & 0x01;
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pipe = (*p++) & 0x7F;
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (pkt_len != 0)
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pkt_len--;
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.assembling == FALSE)
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* First Segment of a packet */
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.type            = ((*p) >> 0x06) & 0x03;
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.inst            = (*p++ & 0x3F);
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pkt_len != 0)
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pkt_len--;
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.assembly_failed = FALSE;
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len         = 0;
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (chaining_bit == NFA_HCI_MESSAGE_FRAGMENTATION)
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.assembling = TRUE;
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_set_receive_buf (pipe);
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_assemble_msg (p, pkt_len);
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE))
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hci_set_receive_buf (pipe);
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hci_assemble_msg (p, pkt_len);
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p = nfa_hci_cb.p_msg_data;
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.assembly_failed)
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If Reassembly failed because of insufficient buffer, just drop the new segmented packets */
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR1 ("nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", pkt_len);
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Reassemble the packet */
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_assemble_msg (p, pkt_len);
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (chaining_bit == NFA_HCI_NO_MESSAGE_FRAGMENTATION)
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Just added the last segment in the chain. Reset pointers */
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.assembling = FALSE;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p                     = nfa_hci_cb.p_msg_data;
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pkt_len               = nfa_hci_cb.msg_len;
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT5 ("nfa_hci_conn_cback Recvd data pipe:%d  %s  chain:%d  assmbl:%d  len:%d",
774df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu                      (UINT8)pipe, nfa_hciu_get_type_inst_names (pipe, nfa_hci_cb.type, nfa_hci_cb.inst, buff),
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      (UINT8)chaining_bit, (UINT8)nfa_hci_cb.assembling, p_pkt->len);
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT6 ("nfa_hci_conn_cback Recvd data pipe:%d  Type: %u  Inst: %u  chain:%d reassm:%d len:%d",
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit, nfa_hci_cb.assembling, p_pkt->len);
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If still reassembling fragments, just return */
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hci_cb.assembling)
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if not last packet, release GKI buffer */
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_pkt);
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If we got a response, cancel the response timer. Also, if waiting for */
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* a single response, we can go back to idle state                       */
7925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_RSP)
7935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        &&((nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) || (nfa_hci_cb.w4_rsp_evt && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)))  )
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state  = NFA_HCI_STATE_IDLE;
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (pipe)
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADMIN_PIPE:
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if data packet is a command, response or event */
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_cmd (p);
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE)
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_rsp (p, (UINT8) pkt_len);
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_admin_gate_evt (p);
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_LINK_MANAGEMENT_PIPE:
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* We don't send Link Management commands, we only get them */
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_link_mgm_gate_cmd (p);
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_dyn_pipe_pkt (pipe, p, pkt_len);
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ((nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) || (nfa_hci_cb.w4_rsp_evt && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)))
8305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
8315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_hci_cb.w4_rsp_evt = FALSE;
8325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
8335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Send a message to ouselves to check for anything to do */
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_pkt->event = NFA_HCI_CHECK_QUEUE_EVT;
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_pkt->len   = 0;
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_sys_sendmsg (p_pkt);
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_handle_nv_read
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      handler function for nv read complete event
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status)
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   session_id[NFA_HCI_SESSION_ID_LEN];
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   reset_session[NFA_HCI_SESSION_ID_LEN]   = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32  os_tick;
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (block == DH_NV_BLOCK)
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Stop timer as NVDATA Read Completed */
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_sys_stop_timer (&nfa_hci_cb.timer);
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.nv_read_cmplt = TRUE;
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (status != NFA_STATUS_OK)
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!nfa_hci_is_valid_cfg ())
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN)))
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN)))  )
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
8665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.b_hci_netwk_reset = TRUE;
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Set a new session id so that we clear all pipes later after seeing a difference with the HC Session ID */
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (&session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2));
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            os_tick = GKI_get_os_tick_count ();
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2));
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_restore_default_config (session_id);
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_startup ();
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_rsp_timeout
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      action function to process timeout
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data)
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT        evt = 0;
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVT_DATA   evt_data;
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               delete_pipe;
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT2 ("nfa_hci_rsp_timeout () State: %u  Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    evt_data.status      = NFA_STATUS_FAILED;
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (nfa_hci_cb.hci_state)
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_STARTUP:
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_RESTORE:
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_hci_rsp_timeout - Initialization failed!");
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_startup_complete (NFA_STATUS_TIMEOUT);
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
9055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_HCI_STATE_RESTORE_NETWK_ENABLE:
9065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
9075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_hci_cb.w4_hci_netwk_init)
9085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* HCI Network is enabled */
9105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_cb.w4_hci_netwk_init = FALSE;
9115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
9125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
9135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
9145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_hci_startup_complete (NFA_STATUS_FAILED);
9165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_REMOVE_GATE:
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Something wrong, NVRAM data could be corrupt */
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_clear_all_pipe_cmd ();
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_remove_all_pipes_from_host (0);
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_api_dealloc_gate (NULL);
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_APP_DEREGISTER:
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Something wrong, NVRAM data could be corrupt */
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE)
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_clear_all_pipe_cmd ();
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_remove_all_pipes_from_host (0);
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_api_deregister (NULL);
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_WAIT_RSP:
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_hci_cb.w4_rsp_evt)
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.w4_rsp_evt       = FALSE;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                         = NFA_HCI_EVENT_RCVD_EVT;
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.pipe      = nfa_hci_cb.pipe_in_use;
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.evt_code  = 0;
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.evt_len   = 0;
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.rcvd_evt.p_evt_buf = NULL;
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.rsp_buf_size     = 0;
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.p_rsp_buf        = NULL;
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delete_pipe          = 0;
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (nfa_hci_cb.cmd_sent)
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_SET_PARAMETER:
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.data_len = 0;
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.index    = nfa_hci_cb.param_in_use;
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                        = NFA_HCI_SET_REG_RSP_EVT;
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_GET_PARAMETER:
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.pipe     = nfa_hci_cb.pipe_in_use;
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.data_len = 0;
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.registry.index    = nfa_hci_cb.param_in_use;
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                        = NFA_HCI_GET_REG_RSP_EVT;
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_OPEN_PIPE:
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe          = nfa_hci_cb.pipe_in_use;
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.opened.pipe = nfa_hci_cb.pipe_in_use;
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                  = NFA_HCI_OPEN_PIPE_EVT;
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ANY_CLOSE_PIPE:
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe          = nfa_hci_cb.pipe_in_use;
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.closed.pipe = nfa_hci_cb.pipe_in_use;
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                  = NFA_HCI_CLOSE_PIPE_EVT;
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ADM_CREATE_PIPE:
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.pipe        = nfa_hci_cb.pipe_in_use;
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.source_gate = nfa_hci_cb.local_gate_in_use;
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.dest_host   = nfa_hci_cb.remote_host_in_use;
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.created.dest_gate   = nfa_hci_cb.remote_gate_in_use;
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                          = NFA_HCI_CREATE_PIPE_EVT;
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_ADM_DELETE_PIPE:
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already. Just release the pipe.
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_hci_cb.pipe_in_use <= NFA_HCI_LAST_DYNAMIC_PIPE)
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use);
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use;
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt                   = NFA_HCI_DELETE_PIPE_EVT;
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        default:
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /*
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * As no response to the command sent on this pipe, we may assume the pipe is
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deleted already and release the pipe. But still send delete pipe command to be safe.
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             */
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            delete_pipe                = nfa_hci_cb.pipe_in_use;
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (delete_pipe && (delete_pipe <= NFA_HCI_LAST_DYNAMIC_PIPE))
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_send_delete_pipe_cmd (delete_pipe);
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hciu_release_pipe (delete_pipe);
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_STATE_DISABLED:
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_DEBUG0 ("nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state");
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (evt != 0)
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hciu_send_to_app (evt, &evt_data, nfa_hci_cb.app_in_use);
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_set_receive_buf
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set reassembly buffer for incoming message
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_set_receive_buf (UINT8 pipe)
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE)
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)  )
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (nfa_hci_cb.rsp_buf_size)
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(nfa_hci_cb.p_rsp_buf != NULL)  )
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.p_msg_data  = nfa_hci_cb.p_rsp_buf;
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_cb.max_msg_len = nfa_hci_cb.rsp_buf_size;
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.p_msg_data  = nfa_hci_cb.msg_data;
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_cb.max_msg_len = NFA_MAX_HCI_EVENT_LEN;
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_assemble_msg
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reassemble the incoming message
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len)
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((nfa_hci_cb.msg_len + data_len) > nfa_hci_cb.max_msg_len)
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Fill the buffer as much it can hold */
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, (nfa_hci_cb.max_msg_len - nfa_hci_cb.msg_len));
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len         = nfa_hci_cb.max_msg_len;
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Set Reassembly failed */
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.assembly_failed = TRUE;
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR1 ("nfa_hci_assemble_msg (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", ((nfa_hci_cb.msg_len + data_len) - nfa_hci_cb.max_msg_len));
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, data_len);
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.msg_len += data_len;
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hci_evt_hdlr
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing all event for NFA HCI
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if p_msg needs to be deallocated
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg)
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HCI_EVENT_DATA *p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg;
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT4 ("nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)",
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      nfa_hciu_get_state_name (nfa_hci_cb.hci_state), nfa_hci_cb.hci_state,
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      nfa_hciu_get_event_name (p_evt_data->hdr.event), p_evt_data->hdr.event);
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_EVENT2 ("nfa_hci_evt_hdlr state: %d event: 0x%04x", nfa_hci_cb.hci_state, p_evt_data->hdr.event);
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If this is an API request, queue it up */
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) && (p_msg->event <= NFA_HCI_LAST_API_EVENT))
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_enqueue (&nfa_hci_cb.hci_api_q, p_msg);
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_msg->event)
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_NV_READ_EVT:
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status);
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_NV_WRITE_EVT:
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* NV Ram write completed - nothing to do... */
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_RSP_TIMEOUT_EVT:
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_hci_rsp_timeout ((tNFA_HCI_EVENT_DATA *)p_msg);
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFA_HCI_CHECK_QUEUE_EVT:
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (HCI_LOOPBACK_DEBUG)
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_msg->len != 0)
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tNFC_DATA_CEVT   xx;
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    xx.p_data = p_msg;
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_hci_conn_cback (0, NFC_DATA_CEVT, (tNFC_CONN *)&xx);
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return FALSE;
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg->event > NFA_HCI_LAST_API_EVENT))
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_hci_check_api_requests ();
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_hciu_is_no_host_resetting ())
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_check_pending_api_requests ();
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) && (nfa_hci_cb.nv_write_needed))
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_hci_cb.nv_write_needed = FALSE;
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK);
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1178