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