1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Copyright (C) 2010-2012 Broadcom Corporation 4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Licensed under the Apache License, Version 2.0 (the "License"); 6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * you may not use this file except in compliance with the License. 7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * You may obtain a copy of the License at: 8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * http://www.apache.org/licenses/LICENSE-2.0 10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Unless required by applicable law or agreed to in writing, software 12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * distributed under the License is distributed on an "AS IS" BASIS, 13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * See the License for the specific language governing permissions and 15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * limitations under the License. 16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 18b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu 19b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 20b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 21b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * This is the main implementation file for the NFA HCI. 22b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 23b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h> 2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_api.h" 2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys.h" 2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys_int.h" 2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_dm_int.h" 2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_api.h" 3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_int.h" 3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_ee_api.h" 3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_ee_int.h" 3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h" 3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h" 3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_defs.h" 3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "trace_api.h" 3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/***************************************************************************** 4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Global Variables 4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/ 4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_CB nfa_hci_cb; 4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifndef NFA_HCI_NV_READ_TIMEOUT_VAL 4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFA_HCI_NV_READ_TIMEOUT_VAL 1000 4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifndef NFA_HCI_CON_CREATE_TIMEOUT_VAL 5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFA_HCI_CON_CREATE_TIMEOUT_VAL 1000 5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/***************************************************************************** 5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Static Functions 5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/ 5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* event handler function type */ 5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg); 5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_enable (void); 6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_disable (void); 6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data); 6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data); 6463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_set_receive_buf (UINT8 pipe); 6563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len); 6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status); 6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/***************************************************************************** 6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Constants 7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/ 71e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chustatic const tNFA_SYS_REG nfa_hci_sys_reg = 7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_sys_enable, 74e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_evt_hdlr, 7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_sys_disable, 7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_proc_nfcc_power_mode 7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}; 7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_ee_info_cback 8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Callback function 8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_ee_info_cback (BOOLEAN disable_discover) 8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 90ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu NFA_TRACE_DEBUG1 ("nfa_hci_ee_info_cback (): %d", disable_discover); 9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Notify EE Discovery is complete */ 93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (disable_discover) 9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.w4_hci_netwk_init = FALSE; 97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) 98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX); 101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.ee_disc_cmplt = TRUE; 106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_startup (); 10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_init 11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Initialize NFA HCI 11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_init (void) 12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG0 ("nfa_hci_init ()"); 12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* initialize control block */ 12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&nfa_hci_cb, 0, sizeof (tNFA_HCI_CB)); 12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP; 12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* register message handler on NFA SYS */ 12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_register (NFA_ID_HCI, &nfa_hci_sys_reg); 13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_is_valid_cfg 13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Validate hci control block config parameters 13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 14145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfa_hci_is_valid_cfg (void) 14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 xx,yy,zz; 14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE reg_app[NFA_HCI_MAX_APP_CB]; 14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 valid_gate[NFA_HCI_MAX_GATE_CB]; 14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_count = 0; 14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 gate_count = 0; 14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT32 pipe_inx_mask = 0; 14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First, see if valid values are stored in app names, send connectivity events flag */ 15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) 15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if app name is valid with null terminated string */ 15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (strlen (&nfa_hci_cb.cfg.reg_app_names[xx][0]) > NFA_MAX_HCI_APP_NAME_LEN) 15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send Connectivity event flag can be either TRUE or FALSE */ 15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.b_send_conn_evts[xx] != TRUE) 15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.b_send_conn_evts[xx] != FALSE)) 16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) 16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the app name is present more than one time in the control block */ 16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (yy = xx + 1; yy < NFA_HCI_MAX_APP_CB; yy++) 16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.reg_app_names[yy][0] != 0) 16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(!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]))) ) 16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Two app cannot have the same name , NVRAM is corrupted */ 17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_is_valid_cfg (%s) Reusing: %u", &nfa_hci_cb.cfg.reg_app_names[xx][0], xx); 17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Collect list of hci handle */ 17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu reg_app[app_count++] = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI); 17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Validate Gate Control block */ 18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++) 18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != 0) 18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ( (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_LOOP_BACK_GATE) 18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_IDENTITY_MANAGEMENT_GATE) 187eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE)) 188eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfa_hci_cb.cfg.dyn_gates[xx].gate_id > NFA_HCI_LAST_PROP_GATE)) 18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the same gate id is present more than once in the control block */ 19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (yy = xx + 1; yy < NFA_HCI_MAX_GATE_CB; yy++) 19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0) 19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.dyn_gates[xx].gate_id == nfa_hci_cb.cfg.dyn_gates[yy].gate_id) ) 19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg Reusing: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_id); 19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >= NFA_HCI_MAX_APP_CB) 20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner); 20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE) 20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* The gate owner should be one of the registered application */ 20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (zz = 0; zz < app_count; zz++) 21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz]) 21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (zz == app_count) 21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg Invalid Gate owner: %u", nfa_hci_cb.cfg.dyn_gates[xx].gate_owner); 21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Collect list of allocated gates */ 22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu valid_gate[gate_count++] = nfa_hci_cb.cfg.dyn_gates[xx].gate_id; 22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* No two gates can own a same pipe */ 22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pipe_inx_mask & nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask) != 0) 22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Collect the list of pipes on this gate */ 22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_inx_mask |= nfa_hci_cb.cfg.dyn_gates[xx].pipe_inx_mask; 22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1) 23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Every bit set in pipe increment mask indicates a valid pipe */ 23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pipe_inx_mask & 1) 23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the pipe is valid one */ 237e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE) 23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx == NFA_HCI_MAX_PIPE_CB) 24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Validate Gate Control block */ 24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++) 24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id != 0) 24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if pipe id is valid */ 25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE) 25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if pipe state is valid */ 25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_OPENED) 25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_state != NFA_HCI_PIPE_CLOSED)) 25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if local gate on which the pipe is created is valid */ 260eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 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)) 261eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfa_hci_cb.cfg.dyn_pipes[xx].local_gate > NFA_HCI_LAST_PROP_GATE)) 26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the peer gate on which the pipe is created is valid */ 265eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 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)) 266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfa_hci_cb.cfg.dyn_pipes[xx].dest_gate > NFA_HCI_LAST_PROP_GATE)) 26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the same pipe is present more than once in the control block */ 27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (yy = xx + 1; yy < NFA_HCI_MAX_PIPE_CB; yy++) 27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0) 27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id == nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id) ) 27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg Reusing: %u", nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id); 27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* The local gate should be one of the element in gate control block */ 28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (zz = 0; zz < gate_count; zz++) 28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz]) 28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (zz == gate_count) 28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_is_valid_cfg Invalid Gate: %u", nfa_hci_cb.cfg.dyn_pipes[xx].local_gate); 28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if admin pipe state is valid */ 29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_OPENED) 29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.admin_gate.pipe01_state != NFA_HCI_PIPE_CLOSED)) 29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if link management pipe state is valid */ 29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED) 30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_CLOSED)) 30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_inx_mask = nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask; 30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; (pipe_inx_mask && (xx < NFA_HCI_MAX_PIPE_CB)); xx++,pipe_inx_mask >>= 1) 30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Every bit set in pipe increment mask indicates a valid pipe */ 30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pipe_inx_mask & 1) 30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the pipe is valid one */ 31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id < NFA_HCI_FIRST_DYNAMIC_PIPE) 31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the pipe is connected to Identity management gate */ 31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE) 31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx == NFA_HCI_MAX_PIPE_CB) 31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return TRUE; 32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_cfg_default 32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Configure default values for hci control block 32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 332eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfa_hci_restore_default_config (UINT8 *p_session_id) 33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&nfa_hci_cb.cfg, 0, sizeof (nfa_hci_cb.cfg)); 335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (nfa_hci_cb.cfg.admin_gate.session_id, p_session_id, NFA_HCI_SESSION_ID_LEN); 33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_proc_nfcc_power_mode 34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Restore NFA HCI sub-module 344e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode) 34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d", nfcc_power_mode); 35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* if NFCC power mode is change to full power */ 35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) 35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.b_low_power_mode = FALSE; 35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) 35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_RESTORE; 35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.ee_disc_cmplt = FALSE; 360ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu nfa_hci_cb.conn_id = 0; 36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_proc_nfcc_power_mode (): Cannot restore now"); 36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI); 36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 370ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 371ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu nfa_hci_cb.w4_rsp_evt = FALSE; 372ee00835dfad4b11b2df72ae7caeea1c6ceba2e6cEvan Chu nfa_hci_cb.conn_id = 0; 37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.b_low_power_mode = TRUE; 37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI); 37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_dh_startup_complete 38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Initialization of terminal host in HCI Network is completed 38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Wait for other host in the network to initialize 385e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_dh_startup_complete (void) 39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.w4_hci_netwk_init) 39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE; 39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* No HCP packet to DH for a specified period of time indicates all host in the network is initialized */ 39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT); 39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 398eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX); 39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_startup_complete 40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description HCI network initialization is completed 406e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_startup_complete (tNFA_STATUS status) 41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 412e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu tNFA_HCI_EVT_DATA evt_data; 41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hci_startup_complete (): Status: %u", status); 41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE) 41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_ee_proc_hci_info_cback (); 42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_HCI); 42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_init.status = status; 42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data); 42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_cback_notify_enable_complete (NFA_ID_HCI); 42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 431e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu if (status == NFA_STATUS_OK) 43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED; 43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_startup 44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Perform HCI startup 44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_startup (void) 44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 45045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_EE_INFO ee_info[2]; 45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 num_nfcee = 2; 45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 target_handle; 45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 count = 0; 45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BOOLEAN found = FALSE; 45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (HCI_LOOPBACK_DEBUG) 45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First step in initialization is to open the admin pipe */ 45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* We can only start up if NV Ram is read and EE discovery is complete */ 464ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt && (nfa_hci_cb.conn_id == 0)) 46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_EeGetInfo (&num_nfcee, ee_info); 46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.num_nfcee = num_nfcee; 46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ((count < num_nfcee) && (!found)) 47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu target_handle = (UINT8) ee_info[count].ee_handle; 47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if(ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS) 47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu found = TRUE; 47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE) 47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_NfceeModeSet (target_handle, NFC_MODE_ACTIVATE); 48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = NFC_ConnCreate (NCI_DEST_TYPE_NFCEE, target_handle, NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback)) == NFA_STATUS_OK) 48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CON_CREATE_TIMEOUT_VAL); 48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED; 48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_startup - Failed to Create Logical connection. HCI Initialization/Restore failed"); 48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup_complete (NFA_STATUS_FAILED); 48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu count++; 49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (!found) 49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_startup - HCI ACCESS Interface not discovered. HCI Initialization/Restore failed"); 49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup_complete (NFA_STATUS_FAILED); 49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_sys_enable 50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Enable NFA HCI 50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_enable (void) 51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG0 ("nfa_hci_sys_enable ()"); 51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_ee_reg_cback_enable_done (&nfa_hci_ee_info_cback); 51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_nv_co_read ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK); 51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NV_READ_TIMEOUT_VAL); 51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_sys_disable 52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Disable NFA HCI 52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_sys_disable (void) 52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.conn_id) 53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_sys_is_graceful_disable ()) 53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell all applications stack is down */ 53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_all_apps (NFA_HCI_EXIT_EVT, &evt_data); 53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_ConnClose (nfa_hci_cb.conn_id); 54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.conn_id = 0; 54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED; 54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* deregister message handler on NFA SYS */ 54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_deregister (NFA_ID_HCI); 54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_conn_cback 55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function Process event from NCI 555e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p; 56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BT_HDR *p_pkt = (BT_HDR *) p_data->data.p_data; 56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 chaining_bit; 56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pipe; 56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT16 pkt_len; 56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (event == NFC_CONN_CREATE_CEVT) 56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.conn_id = conn_id; 57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.buff_size = p_data->conn_create.buff_size; 57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) 57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.w4_hci_netwk_init = TRUE; 57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_alloc_gate (NFA_HCI_CONNECTIVITY_GATE,0); 57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_CLOSED) 57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First step in initialization/restore is to open the admin pipe */ 58145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 58545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Read session id, to know DH session id is correct */ 58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX); 58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (event == NFC_CONN_CLOSE_CEVT) 59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.conn_id = 0; 59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED; 59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* deregister message handler on NFA SYS */ 59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_deregister (NFA_ID_HCI); 59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((event != NFC_DATA_CEVT) || (p_pkt == NULL)) 59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) 60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Received HCP Packet before timeout, Other Host initialization is not complete */ 60345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 60445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_NETWK_INIT_TIMEOUT); 60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p = (UINT8 *) (p_pkt + 1) + p_pkt->offset; 60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pkt_len = p_pkt->len; 60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_PROTOCOL == TRUE) 61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu DispHcp (p, pkt_len, TRUE, (BOOLEAN) !nfa_hci_cb.assembling); 61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu chaining_bit = ((*p) >> 0x07) & 0x01; 61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe = (*p++) & 0x7F; 61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pkt_len != 0) 61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pkt_len--; 61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.assembling == FALSE) 62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 62163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* First Segment of a packet */ 62263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.type = ((*p) >> 0x06) & 0x03; 62363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.inst = (*p++ & 0x3F); 62463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (pkt_len != 0) 62563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pkt_len--; 62663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.assembly_failed = FALSE; 62763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.msg_len = 0; 62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (chaining_bit == NFA_HCI_MESSAGE_FRAGMENTATION) 63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.assembling = TRUE; 63263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_set_receive_buf (pipe); 63363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_assemble_msg (p, pkt_len); 63463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 63563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 63663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 63763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) && (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE)) 63863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 63963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_set_receive_buf (pipe); 64063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_assemble_msg (p, pkt_len); 64163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p = nfa_hci_cb.p_msg_data; 64263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 64645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 64763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.assembly_failed) 64863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 64963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* If Reassembly failed because of insufficient buffer, just drop the new segmented packets */ 65063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFA_TRACE_ERROR1 ("nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP packet! Dropping :%u bytes", pkt_len); 65163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 65263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 65363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 65463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* Reassemble the packet */ 65563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_assemble_msg (p, pkt_len); 65663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (chaining_bit == NFA_HCI_NO_MESSAGE_FRAGMENTATION) 65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Just added the last segment in the chain. Reset pointers */ 66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.assembling = FALSE; 66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p = nfa_hci_cb.p_msg_data; 66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pkt_len = nfa_hci_cb.msg_len; 66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 66645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 66745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 66845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT5 ("nfa_hci_conn_cback Recvd data pipe:%d %s chain:%d assmbl:%d len:%d", 66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (UINT8)pipe, nfa_hciu_get_type_inst_names (pipe, nfa_hci_cb.type, nfa_hci_cb.inst), 67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (UINT8)chaining_bit, (UINT8)nfa_hci_cb.assembling, p_pkt->len); 67145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else 67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT6 ("nfa_hci_conn_cback Recvd data pipe:%d Type: %u Inst: %u chain:%d reassm:%d len:%d", 67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit, nfa_hci_cb.assembling, p_pkt->len); 67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If still reassembling fragments, just return */ 67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.assembling) 67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* if not last packet, release GKI buffer */ 68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_pkt); 68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If we got a response, cancel the response timer. Also, if waiting for */ 68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* a single response, we can go back to idle state */ 68763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_RSP) 68845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 69063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 69163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.w4_rsp_evt = FALSE; 69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (pipe) 69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADMIN_PIPE: 69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if data packet is a command, response or event */ 69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 70063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_admin_gate_cmd (p); 70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) 70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_admin_gate_rsp (p, (UINT8) pkt_len); 70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE) 70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 70863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_admin_gate_evt (p); 70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_LINK_MANAGEMENT_PIPE: 71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* We don't send Link Management commands, we only get them */ 71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 71563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_link_mgm_gate_cmd (p); 71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) 72063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_dyn_pipe_pkt (pipe, p, pkt_len); 72145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send a message to ouselves to check for anything to do */ 72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pkt->event = NFA_HCI_CHECK_QUEUE_EVT; 72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pkt->len = 0; 72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_sendmsg (p_pkt); 72845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 72945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 73045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 73145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 73245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_nv_read 73345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 73445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description handler function for nv read complete event 735e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 73645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 73745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 73845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 73945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_handle_nv_read (UINT8 block, tNFA_STATUS status) 74045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 741eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 session_id[NFA_HCI_SESSION_ID_LEN]; 742eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 743eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 reset_session[NFA_HCI_SESSION_ID_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 744eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 os_tick; 74545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 74645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (block == DH_NV_BLOCK) 74745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 74845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Stop timer as NVDATA Read Completed */ 74945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 75045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_read_cmplt = TRUE; 75145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (status != NFA_STATUS_OK) 75245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ||(!nfa_hci_is_valid_cfg ()) 753eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN))) 754eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(!(memcmp (nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN))) ) 75545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 75645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Set a new session id so that we clear all pipes later after seeing a difference with the HC Session ID */ 757eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (&session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2)); 758eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu os_tick = GKI_get_os_tick_count (); 759eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2)); 76045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_restore_default_config (session_id); 76145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 76245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup (); 76345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 76445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 76645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_rsp_timeout 76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to process timeout 771e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 77245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 77345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_rsp_timeout (tNFA_HCI_EVENT_DATA *p_evt_data) 77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT evt = 0; 77845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 77934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu UINT8 delete_pipe; 78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_rsp_timeout () State: %u Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent); 78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = NFA_STATUS_FAILED; 78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (nfa_hci_cb.hci_state) 78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_STARTUP: 78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_RESTORE: 78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_rsp_timeout - Initialization failed!"); 79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup_complete (NFA_STATUS_TIMEOUT); 79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_WAIT_NETWK_ENABLE: 79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* HCI Network is enabled */ 79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.w4_hci_netwk_init = FALSE; 796eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX); 79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_REMOVE_GATE: 80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Something wrong, NVRAM data could be corrupt */ 80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE) 80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_clear_all_pipe_cmd (); 80445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_remove_all_pipes_from_host (0); 80845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (NULL); 80945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 81045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_APP_DEREGISTER: 81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Something wrong, NVRAM data could be corrupt */ 81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cmd_sent == NFA_HCI_ADM_DELETE_PIPE) 81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_clear_all_pipe_cmd (); 81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 81945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_remove_all_pipes_from_host (0); 82145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (NULL); 82245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 82345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 824e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu 82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_WAIT_RSP: 82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 82863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.w4_rsp_evt) 82963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 83063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.w4_rsp_evt = FALSE; 83163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt = NFA_HCI_EVENT_RCVD_EVT; 83263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.pipe = nfa_hci_cb.pipe_in_use; 83363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_code = 0; 83463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_len = 0; 83563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.p_evt_buf = NULL; 83663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.rsp_buf_size = 0; 83763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_rsp_buf = NULL; 83863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 83963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen break; 84063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 841e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu 84234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = 0; 84345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (nfa_hci_cb.cmd_sent) 84445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 846e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 847e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already and release the pipe. But still send delete pipe command to be safe. 84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 85034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = nfa_hci_cb.pipe_in_use; 85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = nfa_hci_cb.pipe_in_use; 85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.data_len = 0; 85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.index = nfa_hci_cb.param_in_use; 85434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu evt = NFA_HCI_SET_REG_RSP_EVT; 85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 858e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 859e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already and release the pipe. But still send delete pipe command to be safe. 86145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 86234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = nfa_hci_cb.pipe_in_use; 86345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = nfa_hci_cb.pipe_in_use; 86445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.data_len = 0; 86545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.index = nfa_hci_cb.param_in_use; 86634785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu evt = NFA_HCI_GET_REG_RSP_EVT; 86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 86945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 870e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 871e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 87245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already and release the pipe. But still send delete pipe command to be safe. 87345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 87434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = nfa_hci_cb.pipe_in_use; 87545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = nfa_hci_cb.pipe_in_use; 87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt = NFA_HCI_OPEN_PIPE_EVT; 87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 880e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 881e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already and release the pipe. But still send delete pipe command to be safe. 88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 88434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = nfa_hci_cb.pipe_in_use; 88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.pipe = nfa_hci_cb.pipe_in_use; 88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt = NFA_HCI_CLOSE_PIPE_EVT; 88745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 88845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 88945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CREATE_PIPE: 89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.pipe = nfa_hci_cb.pipe_in_use; 89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.source_gate = nfa_hci_cb.local_gate_in_use; 89245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_host = nfa_hci_cb.remote_host_in_use; 89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_gate = nfa_hci_cb.remote_gate_in_use; 89445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt = NFA_HCI_CREATE_PIPE_EVT; 89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_DELETE_PIPE: 898e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 899e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already. Just release the pipe. 90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 90234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu if (nfa_hci_cb.pipe_in_use <= NFA_HCI_LAST_DYNAMIC_PIPE) 90334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use); 90434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use; 90534785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu evt = NFA_HCI_DELETE_PIPE_EVT; 90645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 90745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 90845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 909e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* 910e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * As no response to the command sent on this pipe, we may assume the pipe is 91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * deleted already and release the pipe. But still send delete pipe command to be safe. 91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 91334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu delete_pipe = nfa_hci_cb.pipe_in_use; 91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 91634785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu if (delete_pipe && (delete_pipe <= NFA_HCI_LAST_DYNAMIC_PIPE)) 91734785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu { 91834785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu nfa_hciu_send_delete_pipe_cmd (delete_pipe); 91934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu nfa_hciu_release_pipe (delete_pipe); 92034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu } 92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_DISABLED: 92345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG0 ("nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state"); 92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (evt != 0) 92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (evt, &evt_data, nfa_hci_cb.app_in_use); 92945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 93045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 93145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 93245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function nfa_hci_set_receive_buf 93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Set reassembly buffer for incoming message 93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns status 93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 94063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_set_receive_buf (UINT8 pipe) 94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (pipe >= NFA_HCI_FIRST_DYNAMIC_PIPE) 94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.type == NFA_HCI_EVENT_TYPE) ) 94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 94563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ( (nfa_hci_cb.rsp_buf_size) 94663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen &&(nfa_hci_cb.p_rsp_buf != NULL) ) 94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 94863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_msg_data = nfa_hci_cb.p_rsp_buf; 94963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.max_msg_len = nfa_hci_cb.rsp_buf_size; 95063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen return; 95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.p_msg_data = nfa_hci_cb.msg_data; 95445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.max_msg_len = NFA_MAX_HCI_EVENT_LEN; 95545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 95745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 95845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_assemble_msg 96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Reassemble the incoming message 96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns None 96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 96663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_assemble_msg (UINT8 *p_data, UINT16 data_len) 96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 96863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((nfa_hci_cb.msg_len + data_len) > nfa_hci_cb.max_msg_len) 96963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 97063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* Fill the buffer as much it can hold */ 97163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 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)); 97263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.msg_len = nfa_hci_cb.max_msg_len; 97363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* Set Reassembly failed */ 97463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.assembly_failed = TRUE; 97563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 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)); 97663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 97763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 97863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 97963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy (&nfa_hci_cb.p_msg_data[nfa_hci_cb.msg_len], p_data, data_len); 98063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.msg_len += data_len; 98163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 98245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 98345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 98545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 98645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_evt_hdlr 98745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 98845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Processing all event for NFA HCI 98945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 99045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns TRUE if p_msg needs to be deallocated 99145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 99245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 99345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic BOOLEAN nfa_hci_evt_hdlr (BT_HDR *p_msg) 99445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 99545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVENT_DATA *p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg; 99645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 99745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 99845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT4 ("nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)", 999e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hciu_get_state_name (nfa_hci_cb.hci_state), nfa_hci_cb.hci_state, 100045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_get_event_name (p_evt_data->hdr.event), p_evt_data->hdr.event); 100145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else 100245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_evt_hdlr state: %d event: 0x%04x", nfa_hci_cb.hci_state, p_evt_data->hdr.event); 100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If this is an API request, queue it up */ 100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) && (p_msg->event <= NFA_HCI_LAST_API_EVENT)) 100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 100845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_enqueue (&nfa_hci_cb.hci_api_q, p_msg); 100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (p_msg->event) 101345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_NV_READ_EVT: 101545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status); 101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_NV_WRITE_EVT: 101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* NV Ram write completed - nothing to do... */ 102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_TIMEOUT_EVT: 102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_rsp_timeout ((tNFA_HCI_EVENT_DATA *)p_msg); 102445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_CHECK_QUEUE_EVT: 102745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (HCI_LOOPBACK_DEBUG) 102845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 102945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_msg->len != 0) 103045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 103145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DATA_CEVT xx; 103245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu xx.p_data = p_msg; 103345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_conn_cback (0, NFC_DATA_CEVT, (tNFC_CONN *)&xx); 103445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 103545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 103645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 103745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 1038e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu } 103945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 104045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_msg->event > NFA_HCI_LAST_API_EVENT)) 104245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_msg); 104345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_check_api_requests (); 104545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104630423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu if (nfa_hciu_is_no_host_resetting ()) 10475bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_check_pending_api_requests (); 10485bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 104945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) && (nfa_hci_cb.nv_write_needed)) 105045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 105145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = FALSE; 105245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_nv_co_write ((UINT8 *)&nfa_hci_cb.cfg, sizeof (nfa_hci_cb.cfg),DH_NV_BLOCK); 105345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 105445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 105545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 105645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 105745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 1058