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 { 102a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* NFCEE Discovery is in progress */ 103a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfa_hci_cb.ee_disc_cmplt = TRUE; 104a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfa_hci_cb.num_ee_dis_req_ntf = 0; 105a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfa_hci_cb.num_hot_plug_evts = 0; 106a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfa_hci_cb.conn_id = 0; 107a24be4f06674b2707b57904deaa0dff5a95823bdEvan 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