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 file contains the action functions for the NFA HCI. 22b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 23b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h> 2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "trace_api.h" 2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_api.h" 2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys.h" 2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_sys_int.h" 2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_api.h" 3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_int.h" 3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h" 3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h" 3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_hci_defs.h" 3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* Static local functions */ 3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_register (tNFA_HCI_EVENT_DATA *p_evt_data); 3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_get_gate_pipe_list (tNFA_HCI_EVENT_DATA *p_evt_data); 3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_alloc_gate (tNFA_HCI_EVENT_DATA *p_evt_data); 4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_get_host_list (tNFA_HCI_EVENT_DATA *p_evt_data); 415bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_get_reg_value (tNFA_HCI_EVENT_DATA *p_evt_data); 425bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_set_reg_value (tNFA_HCI_EVENT_DATA *p_evt_data); 435bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_create_pipe (tNFA_HCI_EVENT_DATA *p_evt_data); 4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_open_pipe (tNFA_HCI_EVENT_DATA *p_evt_data); 4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_close_pipe (tNFA_HCI_EVENT_DATA *p_evt_data); 4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_delete_pipe (tNFA_HCI_EVENT_DATA *p_evt_data); 475bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_send_event (tNFA_HCI_EVENT_DATA *p_evt_data); 485bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_send_cmd (tNFA_HCI_EVENT_DATA *p_evt_data); 4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_send_rsp (tNFA_HCI_EVENT_DATA *p_evt_data); 50eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic void nfa_hci_api_add_static_pipe (tNFA_HCI_EVENT_DATA *p_evt_data); 5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_handle_identity_mgmt_gate_pkt (UINT8 *p_data, tNFA_HCI_DYN_PIPE *p_pipe); 5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_loopback_gate_pkt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_PIPE *p_pipe); 5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_connectivity_gate_pkt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_PIPE *p_pipe); 5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_cmd (UINT8 *p_data, UINT8 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe); 5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_rsp (UINT8 *p_data, UINT8 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe); 5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_evt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe); 5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 625bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Function nfa_hci_check_pending_api_requests 635bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 645bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Description This function handles pending API requests 655bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 665bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns none 675bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 685bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu*******************************************************************************/ 695bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chuvoid nfa_hci_check_pending_api_requests (void) 705bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu{ 715bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu BT_HDR *p_msg; 725bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu tNFA_HCI_EVENT_DATA *p_evt_data; 735bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu BOOLEAN b_free; 745bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu UINT8 b_cmd_flag = 0; 755bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7630423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu /* If busy, or API queue is empty, then exit */ 7730423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu if ( (nfa_hci_cb.hci_state != NFA_HCI_STATE_IDLE) 7830423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu ||((p_msg = (BT_HDR *) GKI_dequeue (&nfa_hci_cb.hci_host_reset_api_q)) == NULL) ) 795bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return; 805bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 815bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu /* Process API request */ 825bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg; 835bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 845bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu /* Save the application handle */ 855bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_cb.app_in_use = p_evt_data->comm.hci_handle; 865bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 875bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = TRUE; 885bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu switch (p_msg->event) 895bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 905bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu case NFA_HCI_API_CREATE_PIPE_EVT: 915bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_create_pipe (p_evt_data) == FALSE) 925bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = FALSE; 935bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu break; 945bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 955bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu case NFA_HCI_API_GET_REGISTRY_EVT: 965bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_get_reg_value (p_evt_data) == FALSE) 975bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = FALSE; 985bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu break; 995bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 1005bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu case NFA_HCI_API_SET_REGISTRY_EVT: 1015bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_set_reg_value (p_evt_data) == FALSE) 1025bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = FALSE; 1035bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu break; 1045bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 1055bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu case NFA_HCI_API_SEND_CMD_EVT: 1065bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_send_cmd (p_evt_data) == FALSE) 1075bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = FALSE; 1085bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu break; 1095bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu case NFA_HCI_API_SEND_EVENT_EVT: 1105bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_send_event (p_evt_data) == FALSE) 1115bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu b_free = FALSE; 1125bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu break; 1135bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 1145bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 1155bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (b_free) 1165bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_freebuf (p_msg); 1175bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu} 1185bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 1195bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu/******************************************************************************* 1205bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_check_api_requests 12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles API requests 12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_check_api_requests (void) 12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BT_HDR *p_msg; 13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVENT_DATA *p_evt_data; 13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; ; ) 13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If busy, or API queue is empty, then exit */ 13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.hci_state != NFA_HCI_STATE_IDLE) 1375bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu ||((p_msg = (BT_HDR *) GKI_dequeue (&nfa_hci_cb.hci_api_q)) == NULL) ) 13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Process API request */ 14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt_data = (tNFA_HCI_EVENT_DATA *)p_msg; 14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Save the application handle */ 14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = p_evt_data->comm.hci_handle; 14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (p_msg->event) 14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_REGISTER_APP_EVT: 14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_register (p_evt_data); 15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DEREGISTER_APP_EVT: 15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (p_evt_data); 15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_APP_GATE_PIPE_EVT: 15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_get_gate_pipe_list (p_evt_data); 15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_ALLOC_GATE_EVT: 16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_alloc_gate (p_evt_data); 16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DEALLOC_GATE_EVT: 16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (p_evt_data); 16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_HOST_LIST_EVT: 16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_get_host_list (p_evt_data); 17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_REGISTRY_EVT: 1735bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_get_reg_value (p_evt_data) == FALSE) 1745bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu continue; 17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SET_REGISTRY_EVT: 1785bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_set_reg_value (p_evt_data) == FALSE) 1795bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu continue; 18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_CREATE_PIPE_EVT: 1835bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_create_pipe (p_evt_data) == FALSE) 1845bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu continue; 18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_OPEN_PIPE_EVT: 18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_open_pipe (p_evt_data); 18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_CLOSE_PIPE_EVT: 19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_close_pipe (p_evt_data); 19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DELETE_PIPE_EVT: 19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_delete_pipe (p_evt_data); 19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_CMD_EVT: 2005bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_send_cmd (p_evt_data) == FALSE) 2015bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu continue; 20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_RSP_EVT: 20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_send_rsp (p_evt_data); 20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_EVENT_EVT: 2095bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_api_send_event (p_evt_data) == FALSE) 2105bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu continue; 21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 213eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NFA_HCI_API_ADD_STATIC_PIPE_EVT: 214eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_api_add_static_pipe (p_evt_data); 215eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 216eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR1 ("nfa_hci_check_api_requests () Unknown event: 0x%04x", p_msg->event); 21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_msg); 22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_register 22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to register the events for the given AID 231e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_register (tNFA_HCI_EVENT_DATA *p_evt_data) 23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu char *p_app_name = p_evt_data->app_info.app_name; 23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_CBACK *p_cback = p_evt_data->app_info.p_cback; 24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx,yy; 24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 num_gates = 0,num_pipes = 0; 24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg = nfa_hci_cb.cfg.dyn_gates; 24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First, see if the application was already registered */ 24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) 24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) 24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu && !strncmp (p_app_name, &nfa_hci_cb.cfg.reg_app_names[xx][0], strlen (p_app_name)) ) 24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_api_register (%s) Reusing: %u", p_app_name, xx); 25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx != NFA_HCI_MAX_APP_CB) 25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI); 25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* The app was registered, find the number of gates and pipes associated to the app */ 25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( yy = 0; yy < NFA_HCI_MAX_GATE_CB; yy++, pg++) 26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_owner == nfa_hci_cb.app_in_use) 26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu num_gates++; 26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu num_pipes += nfa_hciu_count_pipes_on_gate (pg); 26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Not registered, look for a free entry */ 27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) 27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.reg_app_names[xx][0] == 0) 27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&nfa_hci_cb.cfg.reg_app_names[xx][0], 0, sizeof (nfa_hci_cb.cfg.reg_app_names[xx])); 27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BCM_STRNCPY_S (&nfa_hci_cb.cfg.reg_app_names[xx][0], sizeof (nfa_hci_cb.cfg.reg_app_names[xx]), p_app_name, NFA_MAX_HCI_APP_NAME_LEN); 27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_api_register (%s) Allocated: %u", p_app_name, xx); 28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx == NFA_HCI_MAX_APP_CB) 28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR1 ("nfa_hci_api_register (%s) NO ENTRIES", p_app_name); 28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_register.status = NFA_STATUS_FAILED; 28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt_data->app_info.p_cback (NFA_HCI_REGISTER_EVT, &evt_data); 29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.hci_register.num_pipes = num_pipes; 29563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.hci_register.num_gates = num_gates; 29663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[xx] = p_cback; 29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.b_send_conn_evts[xx] = p_evt_data->app_info.b_send_conn_evts; 29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_register.hci_handle = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI); 30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_register.status = NFA_STATUS_OK; 30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_REGISTER_EVT to the application */ 30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt_data->app_info.p_cback (NFA_HCI_REGISTER_EVT, &evt_data); 30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_deregister 31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to deregister the given application 313e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_api_deregister (tNFA_HCI_EVENT_DATA *p_evt_data) 31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_CBACK *p_cback = NULL; 32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If needed, find the application registration handle */ 32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_evt_data != NULL) 32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) 32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) 33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu && !strncmp (p_evt_data->app_info.app_name, &nfa_hci_cb.cfg.reg_app_names[xx][0], strlen (p_evt_data->app_info.app_name)) ) 33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT2 ("nfa_hci_api_deregister (%s) inx: %u", p_evt_data->app_info.app_name, xx); 33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx == NFA_HCI_MAX_APP_CB) 33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_deregister () Unknown app: %s", p_evt_data->app_info.app_name); 34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = (tNFA_HANDLE) (xx | NFA_HANDLE_GROUP_HCI); 34463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_cback = nfa_hci_cb.p_app_cback[xx]; 34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 348e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* We are recursing through deleting all the app's pipes and gates */ 35063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_cback = nfa_hci_cb.p_app_cback[nfa_hci_cb.app_in_use & NFA_HANDLE_MASK]; 35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* See if any pipe is owned by this app */ 35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_by_owner (nfa_hci_cb.app_in_use)) == NULL) 35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* No pipes, release all gates owned by this app */ 35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ((p_gate = nfa_hciu_find_gate_by_owner (nfa_hci_cb.app_in_use)) != NULL) 35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_gate (p_gate->gate_id); 35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&nfa_hci_cb.cfg.reg_app_names[nfa_hci_cb.app_in_use & NFA_HANDLE_MASK][0], 0, NFA_MAX_HCI_APP_NAME_LEN + 1); 36163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[nfa_hci_cb.app_in_use & NFA_HANDLE_MASK] = NULL; 36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_deregister.status = NFC_STATUS_OK; 36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_DEREGISTER_EVT to the application */ 37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cback (NFA_HCI_DEREGISTER_EVT, &evt_data); 37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if ((p_pipe = nfa_hciu_find_active_pipe_by_owner (nfa_hci_cb.app_in_use)) == NULL) 37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* No pipes, release all gates owned by this app */ 37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ((p_gate = nfa_hciu_find_gate_with_nopipes_by_owner (nfa_hci_cb.app_in_use)) != NULL) 37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_gate (p_gate->gate_id); 37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[nfa_hci_cb.app_in_use & NFA_HANDLE_MASK] = NULL; 38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hci_deregister.status = NFC_STATUS_FAILED; 38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_DEREGISTER_EVT to the application */ 39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cback (NFA_HCI_DEREGISTER_EVT, &evt_data); 39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Delete all active pipes created for the application before de registering 39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu **/ 39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_APP_DEREGISTER; 39845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_delete_pipe_cmd (p_pipe->pipe_id); 40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_get_gate_pipe_list 40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to get application allocated gates and 40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** application created pipes 409e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_get_gate_pipe_list (tNFA_HCI_EVENT_DATA *p_evt_data) 41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx,yy; 41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg = nfa_hci_cb.cfg.dyn_gates; 41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp = nfa_hci_cb.cfg.dyn_pipes; 41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.gates_pipes.num_gates = 0; 42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.gates_pipes.num_pipes = 0; 42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_owner == p_evt_data->get_gate_pipe_list.hci_handle) 42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.gates_pipes.gate[evt_data.gates_pipes.num_gates++] = pg->gate_id; 42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pp = nfa_hci_cb.cfg.dyn_pipes; 43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through looking for a match */ 43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( yy = 0; yy < NFA_HCI_MAX_PIPE_CB; yy++, pp++) 43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pp->local_gate == pg->gate_id) 43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.gates_pipes.pipe[evt_data.gates_pipes.num_pipes++] = *(tNFA_HCI_PIPE_INFO*)pp; 43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.gates_pipes.status = NFA_STATUS_OK; 44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_GET_GATE_PIPE_LIST_EVT to the application */ 44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_GET_GATE_PIPE_LIST_EVT, &evt_data, p_evt_data->get_gate_pipe_list.hci_handle); 44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_alloc_gate 44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to allocate a generic gate 450e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_alloc_gate (tNFA_HCI_EVENT_DATA *p_evt_data) 45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle = p_evt_data->comm.hci_handle; 45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_alloc_gate (0, app_handle); 46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.allocated.gate = p_gate ? p_gate->gate_id : 0; 46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.allocated.status = p_gate ? NFA_STATUS_OK : NFA_STATUS_FAILED; 46445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_ALLOCATE_GATE_EVT to the application */ 46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_ALLOCATE_GATE_EVT, &evt_data, app_handle); 46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_dealloc_gate 47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to deallocate the given generic gate 47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_api_dealloc_gate (tNFA_HCI_EVENT_DATA *p_evt_data) 47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 gate_id; 48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle; 48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* p_evt_data may be NULL if we are recursively deleting pipes */ 48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_evt_data) 48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_id = p_evt_data->gate_dealloc.gate; 49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu app_handle = p_evt_data->gate_dealloc.hci_handle; 49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 495e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_sys_stop_timer (&nfa_hci_cb.timer); 49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_id = nfa_hci_cb.local_gate_in_use; 49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu app_handle = nfa_hci_cb.app_in_use; 49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deallocated.gate = gate_id;; 50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (gate_id); 50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_gate == NULL) 50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deallocated.status = NFA_STATUS_UNKNOWN_GID; 50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (p_gate->gate_owner != app_handle) 50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deallocated.status = NFA_STATUS_FAILED; 51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* See if any pipe is owned by this app */ 51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_on_gate (p_gate->gate_id)) == NULL) 51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_gate (p_gate->gate_id); 51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 519e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deallocated.status = NFA_STATUS_OK; 52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if ((p_pipe = nfa_hciu_find_active_pipe_on_gate (p_gate->gate_id)) == NULL) 52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* UICC is not active at the moment and cannot delete the pipe */ 528e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deallocated.status = NFA_STATUS_FAILED; 53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE; 53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Delete pipes on the gate */ 53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.local_gate_in_use = gate_id; 53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = app_handle; 53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_REMOVE_GATE; 54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_delete_pipe_cmd (p_pipe->pipe_id); 54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_DEALLOCATE_GATE_EVT, &evt_data, app_handle); 54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_get_host_list 55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to get the host list from HCI network 554e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 55545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_get_host_list (tNFA_HCI_EVENT_DATA *p_evt_data) 55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_inx = p_evt_data->get_host_list.hci_handle & NFA_HANDLE_MASK; 56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = p_evt_data->get_host_list.hci_handle; 56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First, check if the application handle is valid */ 56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((nfa_hci_cb.app_in_use & NFA_HANDLE_GROUP_MASK) != NFA_HANDLE_GROUP_HCI) 566e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu ||(app_inx >= NFA_HCI_MAX_APP_CB) 56763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(nfa_hci_cb.p_app_cback[app_inx] == NULL) ) 56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX); 57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_create_pipe 57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to create a pipe 58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 5815bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the command is processed 5825bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if command is queued for processing later 58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 5855bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_create_pipe (tNFA_HCI_EVENT_DATA *p_evt_data) 58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate = nfa_hciu_find_gate_by_gid (p_evt_data->create_pipe.source_gate); 58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Verify that the app owns the gate that the pipe is being created on */ 59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate == NULL) || (p_gate->gate_owner != p_evt_data->create_pipe.hci_handle)) 59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.source_gate = p_evt_data->create_pipe.source_gate; 59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.status = NFA_STATUS_FAILED; 59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR2 ("nfa_hci_api_create_pipe Cannot create pipe! APP: 0x%02x does not own the gate:0x%x", p_evt_data->create_pipe.hci_handle, p_evt_data->create_pipe.source_gate); 59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CREATE_PIPE_EVT, &evt_data, p_evt_data->open_pipe.hci_handle); 59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 6015bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hciu_is_host_reseting (p_evt_data->create_pipe.dest_gate)) 6025bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 6035bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_enqueue (&nfa_hci_cb.hci_host_reset_api_q, (BT_HDR *) p_evt_data); 6045bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 6055bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 6065bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.local_gate_in_use = p_evt_data->create_pipe.source_gate; 60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.remote_gate_in_use = p_evt_data->create_pipe.dest_gate; 60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.remote_host_in_use = p_evt_data->create_pipe.dest_host; 61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = p_evt_data->create_pipe.hci_handle; 61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_create_pipe_cmd (p_evt_data->create_pipe.source_gate, p_evt_data->create_pipe.dest_host, p_evt_data->create_pipe.dest_gate); 61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 6145bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_open_pipe 62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 62145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to open a pipe 622e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 62345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 62445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 62545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 62645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_open_pipe (tNFA_HCI_EVENT_DATA *p_evt_data) 62745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->open_pipe.pipe); 63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate = NULL; 63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 63245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe != NULL) 63345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 63445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 63545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (p_pipe != NULL) 63645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(p_gate != NULL) 63745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hciu_is_active_host (p_pipe->dest_host)) 63845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(p_gate->gate_owner == p_evt_data->open_pipe.hci_handle)) 63945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 64045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_CLOSED) 64145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 64245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (p_evt_data->open_pipe.pipe); 64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 64645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = p_evt_data->open_pipe.pipe; 64745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = NFA_STATUS_OK; 64845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 64945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_OPEN_PIPE_EVT, &evt_data, p_evt_data->open_pipe.hci_handle); 65045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 65345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 65445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = p_evt_data->open_pipe.pipe; 65545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = NFA_STATUS_FAILED; 65645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_OPEN_PIPE_EVT, &evt_data, p_evt_data->open_pipe.hci_handle); 65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_get_reg_value 66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to get the reg value of the specified index 666e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 6675bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the command is processed 6685bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if command is queued for processing later 66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 6715bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_get_reg_value (tNFA_HCI_EVENT_DATA *p_evt_data) 67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->get_registry.pipe); 67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe != NULL) 67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate != NULL) && (nfa_hciu_is_active_host (p_pipe->dest_host)) && (p_gate->gate_owner == p_evt_data->get_registry.hci_handle)) 68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = p_evt_data->get_registry.hci_handle; 68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6865bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hciu_is_host_reseting (p_pipe->dest_host)) 6875bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 6885bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_enqueue (&nfa_hci_cb.hci_host_reset_api_q, (BT_HDR *) p_evt_data); 6895bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 6905bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 6915bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_CLOSED) 69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_get_reg_value pipe:%d not open", p_evt_data->get_registry.pipe); 69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_get_param_cmd (p_evt_data->get_registry.pipe, p_evt_data->get_registry.reg_inx)) == NFA_STATUS_OK) 6995bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 70045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_sent.status = status; 70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send NFA_HCI_CMD_SENT_EVT to notify failure */ 70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CMD_SENT_EVT, &evt_data, p_evt_data->get_registry.hci_handle); 7085bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_set_reg_value 71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 71545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to set the reg value at specified index 716e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 7175bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the command is processed 7185bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if command is queued for processing later 71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 72045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 7215bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_set_reg_value (tNFA_HCI_EVENT_DATA *p_evt_data) 72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->set_registry.pipe); 72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 72845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe != NULL) 72945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 73045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 73145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 73245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate != NULL) && (nfa_hciu_is_active_host (p_pipe->dest_host)) && (p_gate->gate_owner == p_evt_data->set_registry.hci_handle)) 73345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 73445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = p_evt_data->set_registry.hci_handle; 73545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7365bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hciu_is_host_reseting (p_pipe->dest_host)) 7375bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 7385bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_enqueue (&nfa_hci_cb.hci_host_reset_api_q, (BT_HDR *) p_evt_data); 7395bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 7405bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 7415bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 74245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_CLOSED) 74345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 74445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_set_reg_value pipe:%d not open", p_evt_data->set_registry.pipe); 74545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 74645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 74745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 74845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_set_param_cmd (p_evt_data->set_registry.pipe, p_evt_data->set_registry.reg_inx, p_evt_data->set_registry.size, p_evt_data->set_registry.data)) == NFA_STATUS_OK) 7495bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 75045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 75145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 75245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 75345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_sent.status = status; 75445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 75545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send NFA_HCI_CMD_SENT_EVT to notify failure */ 75645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CMD_SENT_EVT, &evt_data, p_evt_data->set_registry.hci_handle); 7575bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 75845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 75945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 76045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 76145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 76245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_close_pipe 76445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to close a pipe 766e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_close_pipe (tNFA_HCI_EVENT_DATA *p_evt_data) 77145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 77245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 77345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->close_pipe.pipe); 77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate = NULL; 77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe != NULL) 77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 77845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 77945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (p_pipe != NULL) 78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(p_gate != NULL) 78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hciu_is_active_host (p_pipe->dest_host)) 78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(p_gate->gate_owner == p_evt_data->close_pipe.hci_handle) ) 78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_OPENED) 78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_close_pipe_cmd (p_evt_data->close_pipe.pipe); 78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.status = NFA_STATUS_OK; 79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.pipe = p_evt_data->close_pipe.pipe; 79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CLOSE_PIPE_EVT, &evt_data, p_evt_data->close_pipe.hci_handle); 79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.status = NFA_STATUS_FAILED; 79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.pipe = 0x00; 80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CLOSE_PIPE_EVT, &evt_data, p_evt_data->close_pipe.hci_handle); 80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 80445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_delete_pipe 80845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to delete a pipe 810e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_delete_pipe (tNFA_HCI_EVENT_DATA *p_evt_data) 81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->delete_pipe.pipe); 81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate = NULL; 81945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 82045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe != NULL) 82145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 82345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (p_gate != NULL) 824e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu &&(p_gate->gate_owner == p_evt_data->delete_pipe.hci_handle) 82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hciu_is_active_host (p_pipe->dest_host)) ) 82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_delete_pipe_cmd (p_evt_data->delete_pipe.pipe); 82845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 82945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 83045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 83145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 83245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.status = NFA_STATUS_FAILED; 83345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.pipe = 0x00; 83445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_DELETE_PIPE_EVT, &evt_data, p_evt_data->close_pipe.hci_handle); 83545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 83645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 83745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 83845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 83945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_send_cmd 84045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 84145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to send command on the given pipe 84245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8435bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the command is processed 8445bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if command is queued for processing later 84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 84645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 8475bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_send_cmd (tNFA_HCI_EVENT_DATA *p_evt_data) 84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 85045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle; 85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 85445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->send_cmd.pipe)) != NULL) 85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu app_handle = nfa_hciu_get_pipe_owner (p_evt_data->send_cmd.pipe); 85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 85845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hciu_is_active_host (p_pipe->dest_host)) 85945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(app_handle == p_evt_data->send_cmd.hci_handle) ) 86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 8615bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hciu_is_host_reseting (p_pipe->dest_host)) 8625bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 8635bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_enqueue (&nfa_hci_cb.hci_host_reset_api_q, (BT_HDR *) p_evt_data); 8645bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 8655bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 8665bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_OPENED) 86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 869e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_cb.pipe_in_use = p_evt_data->send_cmd.pipe; 87045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_COMMAND_TYPE, p_evt_data->send_cmd.cmd_code, 87145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt_data->send_cmd.cmd_len, p_evt_data->send_cmd.data)) == NFA_STATUS_OK) 8725bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 87345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 87445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 87545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_cmd pipe:%d not open", p_pipe->pipe_id); 87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 88045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 88145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_cmd pipe:%d Owned by different application or Destination host is not active", 88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id); 88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 88745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_cmd pipe:%d not found", p_evt_data->send_cmd.pipe); 88845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_sent.status = status; 89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 89245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send NFA_HCI_CMD_SENT_EVT to notify failure */ 89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CMD_SENT_EVT, &evt_data, p_evt_data->send_cmd.hci_handle); 8945bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 89845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_send_rsp 90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to send response on the given pipe 90245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 90345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 90445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 90545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 90645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_api_send_rsp (tNFA_HCI_EVENT_DATA *p_evt_data) 90745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 90845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 90945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 91045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle; 91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 91345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->send_rsp.pipe)) != NULL) 91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu app_handle = nfa_hciu_get_pipe_owner (p_evt_data->send_rsp.pipe); 91645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 91745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hciu_is_active_host (p_pipe->dest_host)) 91845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(app_handle == p_evt_data->send_rsp.hci_handle) ) 91945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 92045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_OPENED) 92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, p_evt_data->send_rsp.response, 92345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt_data->send_rsp.size, p_evt_data->send_rsp.data)) == NFA_STATUS_OK) 92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_rsp pipe:%d not open", p_pipe->pipe_id); 92945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 93045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 93145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 93245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 93345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_rsp pipe:%d Owned by different application or Destination host is not active", 93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id); 93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_rsp pipe:%d not found", p_evt_data->send_rsp.pipe); 94045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rsp_sent.status = status; 94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send NFA_HCI_RSP_SENT_EVT to notify failure */ 94545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_RSP_SENT_EVT, &evt_data, p_evt_data->send_rsp.hci_handle); 94645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 94945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_api_send_event 95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description action function to send an event to the given pipe 95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9545bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the event is processed 9555bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if event is queued for processing later 95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 9585bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chustatic BOOLEAN nfa_hci_api_send_event (tNFA_HCI_EVENT_DATA *p_evt_data) 95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_FAILED; 96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 96345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle; 96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_by_pid (p_evt_data->send_evt.pipe)) != NULL) 96645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu app_handle = nfa_hciu_get_pipe_owner (p_evt_data->send_evt.pipe); 96845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hciu_is_active_host (p_pipe->dest_host)) 97045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(app_handle == p_evt_data->send_evt.hci_handle) ) 97145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 9725bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hciu_is_host_reseting (p_pipe->dest_host)) 9735bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 9745bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu GKI_enqueue (&nfa_hci_cb.hci_host_reset_api_q, (BT_HDR *) p_evt_data); 9755bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 9765bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 9775bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 97845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_OPENED) 97945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 98045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_EVENT_TYPE, p_evt_data->send_evt.evt_code, 98163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_evt_data->send_evt.evt_len, p_evt_data->send_evt.p_evt_buf); 98263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 98363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (status == NFA_STATUS_OK) 98463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 98563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_evt_data->send_evt.rsp_len) 98663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 987e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_cb.pipe_in_use = p_evt_data->send_evt.pipe; 98863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.rsp_buf_size = p_evt_data->send_evt.rsp_len; 98963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_rsp_buf = p_evt_data->send_evt.p_rsp_buf; 990ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu if (p_evt_data->send_evt.rsp_timeout) 991ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu { 992ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu nfa_hci_cb.w4_rsp_evt = TRUE; 993ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_RSP; 994ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_evt_data->send_evt.rsp_timeout); 995ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu } 99663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 99763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 99863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 99963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.rsp_buf_size = 0; 100063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_rsp_buf = NULL; 100163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 100263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_event pipe:%d not open", p_pipe->pipe_id); 100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_event pipe:%d Owned by different application or Destination host is not active", 101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id); 101345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 101545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hci_api_send_event pipe:%d not found", p_evt_data->send_evt.pipe); 101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.evt_sent.status = status; 102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send NFC_HCI_EVENT_SENT_EVT to notify failure */ 102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_EVENT_SENT_EVT, &evt_data, p_evt_data->send_evt.hci_handle); 10245bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 1027eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 1028eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1029eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfa_hci_api_add_static_pipe 1030eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1031eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description action function to add static pipe 1032eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1033eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns None 1034eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1035eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 1036eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic void nfa_hci_api_add_static_pipe (tNFA_HCI_EVENT_DATA *p_evt_data) 1037eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 1038eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu tNFA_HCI_DYN_GATE *pg; 1039eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu tNFA_HCI_DYN_PIPE *pp; 1040eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu tNFA_HCI_EVT_DATA evt_data; 1041eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1042eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Allocate a proprietary gate */ 104330423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu if ((pg = nfa_hciu_alloc_gate (p_evt_data->add_static_pipe.gate, p_evt_data->add_static_pipe.hci_handle)) != NULL) 1044eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1045eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Assign new owner to the gate */ 1046eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu pg->gate_owner = p_evt_data->add_static_pipe.hci_handle; 1047eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1048eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Add the dynamic pipe to the proprietary gate */ 104930423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu if (nfa_hciu_add_pipe_to_gate (p_evt_data->add_static_pipe.pipe,pg->gate_id, p_evt_data->add_static_pipe.host, p_evt_data->add_static_pipe.gate) != NFA_HCI_ANY_OK) 1050eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1051eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Unable to add the dynamic pipe, so release the gate */ 1052eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_release_gate (pg->gate_id); 1053eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu evt_data.pipe_added.status = NFA_STATUS_FAILED; 1054eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_to_app (NFA_HCI_ADD_STATIC_PIPE_EVT, &evt_data, p_evt_data->add_static_pipe.hci_handle); 1055eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 1056eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1057eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ((pp = nfa_hciu_find_pipe_by_pid (p_evt_data->add_static_pipe.pipe)) != NULL) 1058eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1059eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* This pipe is always opened */ 1060eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu pp->pipe_state = NFA_HCI_PIPE_OPENED; 1061eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu evt_data.pipe_added.status = NFA_STATUS_OK; 1062eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_to_app (NFA_HCI_ADD_STATIC_PIPE_EVT, &evt_data, p_evt_data->add_static_pipe.hci_handle); 1063eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 1064eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1065eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1066eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Unable to add static pipe */ 1067eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu evt_data.pipe_added.status = NFA_STATUS_FAILED; 1068eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_to_app (NFA_HCI_ADD_STATIC_PIPE_EVT, &evt_data, p_evt_data->add_static_pipe.hci_handle); 1069eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1070eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 107145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 107245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 107345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 107445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_link_mgm_gate_cmd 107545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1076e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function handles incoming link management gate hci 107745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** commands 107845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 107945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 108045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 108145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 108263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfa_hci_handle_link_mgm_gate_cmd (UINT8 *p_data) 108345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 108445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 index; 108545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[2]; 108645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 rsp_len = 0; 108745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 response = NFA_HCI_ANY_OK; 108845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 108945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state != NFA_HCI_PIPE_OPENED) 109063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen &&(nfa_hci_cb.inst != NFA_HCI_ANY_OPEN_PIPE) ) 109145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 109245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (NFA_HCI_LINK_MANAGEMENT_PIPE, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_PIPE_NOT_OPENED, 0, NULL); 109345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 109445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 109545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 109663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.inst) 109745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 109845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 109945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (index, p_data); 110045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 110145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (index == 1) 110245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 110345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT16 (nfa_hci_cb.cfg.link_mgmt_gate.rec_errors, p_data); 110445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 110545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 110645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_REG_PAR_UNKNOWN; 110745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 110845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 110945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 111045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (index, p_data); 111145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (index == 1) 111245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 111345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = (UINT8) ((nfa_hci_cb.cfg.link_mgmt_gate.rec_errors >> 8) & 0x00FF); 111445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[1] = (UINT8) (nfa_hci_cb.cfg.link_mgmt_gate.rec_errors & 0x000F); 111545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 2; 111645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 111745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 111845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_REG_PAR_UNKNOWN; 111945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 112045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 112145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 112245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = 0; 112345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 1124e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_OPENED; 112545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 112645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 112745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 112845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_CLOSED; 112945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 113045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 113145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 113245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_CMD_NOT_SUPPORTED; 113345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 113445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 113545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 113645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (NFA_HCI_LINK_MANAGEMENT_PIPE, NFA_HCI_RESPONSE_TYPE, response, rsp_len, data); 113745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 113845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 113945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 114045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 114145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 114245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 114345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_pipe_open_close_cmd 114445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1145e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function handles all generic gates (excluding 114645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** connectivity gate) commands 114745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 114845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 114945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 115045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 115163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfa_hci_handle_pipe_open_close_cmd (tNFA_HCI_DYN_PIPE *p_pipe) 115245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 115345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[1]; 115445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 rsp_len = 0; 115545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_RESPONSE response = NFA_HCI_ANY_OK; 115645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 115745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 115863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst == NFA_HCI_ANY_OPEN_PIPE) 115945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 116045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate = nfa_hciu_find_gate_by_gid(p_pipe->local_gate)) != NULL) 116145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = nfa_hciu_count_open_pipes_on_gate (p_gate); 116245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 116345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = 0; 116445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 116545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_OPENED; 116645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 116745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 116863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.inst == NFA_HCI_ANY_CLOSE_PIPE) 116945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 117045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 117145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 117245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 117345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, response, rsp_len, data); 117445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 117545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 117645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 117745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 117845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_admin_gate_cmd 117945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 118045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles incoming commands on ADMIN gate 118145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 118245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 118345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 118445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 118563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfa_hci_handle_admin_gate_cmd (UINT8 *p_data) 118645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 118745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 source_host, source_gate, dest_host, dest_gate, pipe; 118845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data = 0; 118945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 rsp_len = 0; 119045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_RESPONSE response = NFA_HCI_ANY_OK; 119145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pgate; 119245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 119345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 119463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.inst) 119545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 119645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 119745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_OPENED; 119845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data = 0; 119945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 120045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 120145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 120245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 120345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_CLOSED; 120445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Reopen the pipe immediately */ 120545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (NFA_HCI_ADMIN_PIPE, NFA_HCI_RESPONSE_TYPE, response, rsp_len, &data); 120645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = NFA_HANDLE_INVALID; 120745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 120845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 120945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 121045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 121145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_PIPE_CREATED: 121245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (source_host, p_data); 121345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (source_gate, p_data); 121445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (dest_host, p_data); 121545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (dest_gate, p_data); 121645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (pipe, p_data); 121745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 121845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (dest_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) 121945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ||(dest_gate == NFA_HCI_LOOP_BACK_GATE) ) 122045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 122145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = nfa_hciu_add_pipe_to_static_gate (dest_gate, pipe, source_host, source_gate); 122245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 122345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 122445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 122545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pgate = nfa_hciu_find_gate_by_gid (dest_gate)) != NULL) 122645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 122745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If the gate is valid, add the pipe to it */ 122845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((response = nfa_hciu_add_pipe_to_gate (pipe, dest_gate, source_host, source_gate)) == NFA_HCI_ANY_OK) 122945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 123045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell the application a pipe was created with its gate */ 1231e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu 123245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.status = NFA_STATUS_OK; 123345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.pipe = pipe; 123445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.source_gate = dest_gate; 123545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_host = source_host; 123645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_gate = source_gate; 123745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 123845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CREATE_PIPE_EVT, &evt_data, pgate->gate_owner); 123945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 124045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 124145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 124245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_NOK; 124345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 124445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 124545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 124645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_PIPE_DELETED: 124745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (pipe, p_data); 124845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = nfa_hciu_release_pipe (pipe); 124945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 125045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 125145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED: 125245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (source_host, p_data); 125345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 125445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_remove_all_pipes_from_host (source_host); 125545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 125645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (source_host == NFA_HCI_HOST_CONTROLLER) 125745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 125845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_CLOSED; 125945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_CLOSED; 126045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 126145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Reopen the admin pipe immediately */ 126245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.app_in_use = NFA_HANDLE_INVALID; 126345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 126445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 126545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 12665bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu else 12675bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 12685bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if ( (source_host >= NFA_HCI_HOST_ID_UICC0) 12695bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu &&(source_host < (NFA_HCI_HOST_ID_UICC0 + NFA_HCI_MAX_HOST_IN_NETWORK)) ) 12705bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 12715bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_cb.reset_host[source_host - NFA_HCI_HOST_ID_UICC0] = source_host; 12725bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 12735bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 127445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 127545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 127645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 127745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_CMD_NOT_SUPPORTED; 127845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 127945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 128045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 128145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (NFA_HCI_ADMIN_PIPE, NFA_HCI_RESPONSE_TYPE, response, rsp_len, &data); 128245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 128345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 128445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 128545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 128645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_admin_gate_rsp 128745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 128845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles response received on admin gate 128945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 129045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 129145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 129245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 129345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hci_handle_admin_gate_rsp (UINT8 *p_data, UINT8 data_len) 129445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 1295eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 hosts[2] = {NFA_HCI_HOST_ID_UICC0, (NFA_HCI_HOST_ID_UICC0 + 1)}; 129645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 source_host; 129745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 source_gate = nfa_hci_cb.local_gate_in_use; 129845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 dest_host = nfa_hci_cb.remote_host_in_use; 129945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 dest_gate = nfa_hci_cb.remote_gate_in_use; 130045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pipe = 0; 130145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 130245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 1303eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 default_session[NFA_HCI_SESSION_ID_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 1304eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 host_count = 0; 1305eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 host_id = 0; 1306eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 os_tick; 130745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 130845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 130945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG4 ("nfa_hci_handle_admin_gate_rsp - LastCmdSent: %s App: 0x%04x Gate: 0x%02x Pipe: 0x%02x", 131045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_instr_2_str(nfa_hci_cb.cmd_sent), nfa_hci_cb.app_in_use, nfa_hci_cb.local_gate_in_use, nfa_hci_cb.pipe_in_use); 131145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else 131245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG4 ("nfa_hci_handle_admin_gate_rsp LastCmdSent: %u App: 0x%04x Gate: 0x%02x Pipe: 0x%02x", 131345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cmd_sent, nfa_hci_cb.app_in_use, nfa_hci_cb.local_gate_in_use, nfa_hci_cb.pipe_in_use); 131445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 131545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 131663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst == NFA_HCI_ANY_E_PIPE_NOT_OPENED) 131745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 131845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 131945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 132045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 132145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 132245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If starting up, handle events here */ 132345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) 1324eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE) 1325eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ) 132645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 132763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst != NFA_HCI_ANY_OK) 132845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 132945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_handle_admin_gate_rsp - Initialization failed"); 133045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup_complete (NFA_STATUS_FAILED); 133145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 133245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 133345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 133445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (nfa_hci_cb.cmd_sent) 133545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 133645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 133745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.param_in_use == NFA_HCI_SESSION_IDENTITY_INDEX) 133845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 133945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Set WHITELIST */ 134045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_set_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_WHITELIST_INDEX, 0x02, hosts); 134145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 134245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.param_in_use == NFA_HCI_WHITELIST_INDEX) 134345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 134445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) 134545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_dh_startup_complete (); 134645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 134745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE) 134845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_startup_complete (NFA_STATUS_OK); 134945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 135045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 135145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 135245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 1353eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfa_hci_cb.param_in_use == NFA_HCI_HOST_LIST_INDEX) 135445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 1355eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count = 0; 1356eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu while (host_count < NFA_HCI_MAX_HOST_IN_NETWORK) 1357eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1358eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.inactive_host[host_count] = NFA_HCI_HOST_ID_UICC0 + host_count; 1359eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count++; 1360eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1361eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1362eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count = 0; 1363eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Collect active host in the Host Network */ 1364eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu while (host_count < data_len) 1365eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1366eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_id = (UINT8) *p_data++; 1367eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1368eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ( (host_id >= NFA_HCI_HOST_ID_UICC0) 1369eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(host_id < NFA_HCI_HOST_ID_UICC0 + NFA_HCI_MAX_HOST_IN_NETWORK) ) 13705bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 1371eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.inactive_host[host_id - NFA_HCI_HOST_ID_UICC0] = 0x00; 13725bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_cb.reset_host[host_id - NFA_HCI_HOST_ID_UICC0] = 0x00; 13735bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 1374eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1375eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count++; 1376eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1377eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_startup_complete (NFA_STATUS_OK); 137845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 1379eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfa_hci_cb.param_in_use == NFA_HCI_SESSION_IDENTITY_INDEX) 138045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 1381eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* The only parameter we get when initializing is the session ID. Check for match. */ 1382eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!memcmp ((UINT8 *) nfa_hci_cb.cfg.admin_gate.session_id, p_data, NFA_HCI_SESSION_ID_LEN) ) 1383eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1384eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Session has not changed. Set the WHITELIST */ 1385eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_set_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_WHITELIST_INDEX, 0x01, hosts); 1386eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1387eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 1388eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1389eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Something wrong, NVRAM data could be corrupt or first start with default session id */ 1390eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_clear_all_pipe_cmd (); 1391eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.b_hci_netwk_reset = TRUE; 1392eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 139345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 139445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 139545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 139645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 139745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_OPENED; 139845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 139945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.b_hci_netwk_reset) 140045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 140145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.b_hci_netwk_reset = FALSE; 140245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Session ID is reset, Set New session id */ 1403eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (&nfa_hci_cb.cfg.admin_gate.session_id[NFA_HCI_SESSION_ID_LEN / 2], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2)); 1404eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu os_tick = GKI_get_os_tick_count (); 1405eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (nfa_hci_cb.cfg.admin_gate.session_id, (UINT8 *)&os_tick, (NFA_HCI_SESSION_ID_LEN / 2)); 1406eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_set_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX, NFA_HCI_SESSION_ID_LEN, (UINT8 *) nfa_hci_cb.cfg.admin_gate.session_id); 140745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 140845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 140945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 141045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First thing is to get the session ID */ 141145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX); 141245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 141345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 141445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 141545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CLEAR_ALL_PIPE: 141645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_remove_all_pipes_from_host (0); 141745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_CLOSED; 141845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_CLOSED; 141945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 142045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 142145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Open admin */ 142245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 142345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 142445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 142545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 142645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 142745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 142863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen status = (nfa_hci_cb.inst == NFA_HCI_ANY_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED; 142945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 143045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (nfa_hci_cb.cmd_sent) 143145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 143245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 143345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 143445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (NULL); 143545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 143645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (NULL); 143745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 143845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 143945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 144045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.param_in_use == NFA_HCI_SESSION_IDENTITY_INDEX) 144145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 1442eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!memcmp ((UINT8 *) default_session, p_data , NFA_HCI_SESSION_ID_LEN)) 144345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 1444eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (&nfa_hci_cb.cfg.admin_gate.session_id[(NFA_HCI_SESSION_ID_LEN / 2)], nfa_hci_cb.cfg.admin_gate.session_id, (NFA_HCI_SESSION_ID_LEN / 2)); 1445eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu os_tick = GKI_get_os_tick_count (); 1446eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (nfa_hci_cb.cfg.admin_gate.session_id, (UINT8 *) &os_tick, (NFA_HCI_SESSION_ID_LEN / 2)); 1447eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 1448eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hciu_send_set_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX, NFA_HCI_SESSION_ID_LEN, (UINT8 *) nfa_hci_cb.cfg.admin_gate.session_id); 144945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 145045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 145145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 145245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 145345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (NULL); 145445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 145545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (NULL); 145645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 145745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 145845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.param_in_use == NFA_HCI_HOST_LIST_INDEX) 145945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 146045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hosts.status = status; 146145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.hosts.num_hosts = data_len; 146245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (evt_data.hosts.host, p_data, data_len); 146345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 1464eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count = 0; 1465eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu while (host_count < NFA_HCI_MAX_HOST_IN_NETWORK) 1466eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1467eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.inactive_host[host_count] = NFA_HCI_HOST_ID_UICC0 + host_count; 1468eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count++; 1469eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1470eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1471eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count = 0; 1472eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Collect active host in the Host Network */ 1473eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu while (host_count < data_len) 1474eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1475eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_id = (UINT8) *p_data++; 1476eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1477eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ( (host_id >= NFA_HCI_HOST_ID_UICC0) 1478eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(host_id < NFA_HCI_HOST_ID_UICC0 + NFA_HCI_MAX_HOST_IN_NETWORK) ) 14795bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 1480eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfa_hci_cb.inactive_host[host_id - NFA_HCI_HOST_ID_UICC0] = 0x00; 14815bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_cb.reset_host[host_id - NFA_HCI_HOST_ID_UICC0] = 0x00; 14825bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 1483eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu host_count++; 1484eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 148530423b8fe42b7efeaf0e0eae2c0f4f758e98c0abEvan Chu if (nfa_hciu_is_no_host_resetting ()) 14865bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hci_check_pending_api_requests (); 148745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_HOST_LIST_EVT, &evt_data, nfa_hci_cb.app_in_use); 148845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 148945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 149045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 149145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CREATE_PIPE: 149245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NFA_STATUS_OK) 149345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 149445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (source_host, p_data); 149545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (source_gate, p_data); 149645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (dest_host, p_data); 149745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (dest_gate, p_data); 149845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8 (pipe, p_data); 149945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 150045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Sanity check */ 150145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (source_gate != nfa_hci_cb.local_gate_in_use) 150245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 150345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING2 ("nfa_hci_handle_admin_gate_rsp sent create pipe with gate: %u got back: %u", 150445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.local_gate_in_use, source_gate); 150545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 150645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 150745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 150845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_add_pipe_to_gate (pipe, source_gate, dest_host, dest_gate); 150945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 151045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 151145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 151245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell the application his pipe was created or not */ 151345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.status = status; 151445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.pipe = pipe; 151545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.source_gate = source_gate; 151645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_host = dest_host; 151745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.created.dest_gate = dest_gate; 151845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 151945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CREATE_PIPE_EVT, &evt_data, nfa_hci_cb.app_in_use); 152045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 152145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 152245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_DELETE_PIPE: 152345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NFA_STATUS_OK) 152445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 152545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use); 152645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 152745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If only deleting one pipe, tell the app we are done */ 152845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) 152945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 153045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.status = status; 153145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use; 153245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 153345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_DELETE_PIPE_EVT, &evt_data, nfa_hci_cb.app_in_use); 153445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 153545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 153645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (NULL); 153745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 153845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (NULL); 153945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 154045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 154145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 154245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If only deleting one pipe, tell the app we are done */ 154345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) 154445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 154545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.status = status; 154645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.pipe = nfa_hci_cb.pipe_in_use; 154745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 154845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_DELETE_PIPE_EVT, &evt_data, nfa_hci_cb.app_in_use); 154945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 155045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_APP_DEREGISTER) 155145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 155245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use); 155345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_deregister (NULL); 155445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 155545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_REMOVE_GATE) 155645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 155745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_pipe (nfa_hci_cb.pipe_in_use); 155845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_api_dealloc_gate (NULL); 155945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 156045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 156145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 156245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 156345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 156445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = status ? NFA_HCI_PIPE_CLOSED:NFA_HCI_PIPE_OPENED; 156545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 156645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cfg.admin_gate.pipe01_state == NFA_HCI_PIPE_OPENED) 156745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 156845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First thing is to get the session ID */ 156945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_SESSION_IDENTITY_INDEX); 157045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 157145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 157245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 157345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CLEAR_ALL_PIPE: 157445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_remove_all_pipes_from_host (0); 157545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_CLOSED; 157645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_CLOSED; 157745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 157845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Open admin */ 157945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_open_pipe_cmd (NFA_HCI_ADMIN_PIPE); 158045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 158145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 158245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 158345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 158445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 158545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 158645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 158745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 158845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_admin_gate_evt 158945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 159045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles events received on admin gate 159145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 159245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 159345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 159445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 159563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfa_hci_handle_admin_gate_evt (UINT8 *p_data) 159645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 159745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 159845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 159963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst != NFA_HCI_EVT_HOT_PLUG) 160045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 160145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hci_handle_admin_gate_evt - Unknown event on ADMIN Pipe"); 160245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 160345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 160445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 160563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_code = nfa_hci_cb.inst; 16065bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 16075bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu nfa_hciu_send_get_param_cmd (NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX); 160845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_all_apps (NFA_HCI_EVENT_RCVD_EVT, &evt_data); 160945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 161045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 161145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 161245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 161345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_dyn_pipe_pkt 161445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 161545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles data received via dynamic pipe 1616e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** 161745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 161845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 161945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 162063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfa_hci_handle_dyn_pipe_pkt (UINT8 pipe_id, UINT8 *p_data, UINT16 data_len) 162145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 162245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe = nfa_hciu_find_pipe_by_pid (pipe_id); 162345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 162445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 162545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe == NULL) 162645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 162745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Invalid pipe ID */ 162845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR1 ("nfa_hci_handle_dyn_pipe_pkt - Unknown pipe %d",pipe_id); 162963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 163045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (pipe_id, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_NOK, 0, NULL); 163145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 163245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 163345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 163445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) 163545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 163663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_identity_mgmt_gate_pkt (p_data, p_pipe); 163745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 163845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (p_pipe->local_gate == NFA_HCI_LOOP_BACK_GATE) 163945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 164045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_loopback_gate_pkt (p_data, data_len, p_pipe); 164145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 164245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (p_pipe->local_gate == NFA_HCI_CONNECTIVITY_GATE) 164345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 164445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_connectivity_gate_pkt (p_data, data_len, p_pipe); 164545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 164645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 164745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 164845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate); 164945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_gate == NULL) 165045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 165145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR1 ("nfa_hci_handle_dyn_pipe_pkt - Pipe's gate %d is corrupt",p_pipe->local_gate); 165263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 165345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (pipe_id, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_NOK, 0, NULL); 165445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 165545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 165645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 165745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if data packet is a command, response or event */ 165863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.type) 165945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 166045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_COMMAND_TYPE: 166145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_generic_gate_cmd (p_data, (UINT8) data_len, p_gate, p_pipe); 166245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 166345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 166445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RESPONSE_TYPE: 166545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_generic_gate_rsp (p_data, (UINT8) data_len, p_gate, p_pipe); 166645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 166745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 166845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVENT_TYPE: 166945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_handle_generic_gate_evt (p_data, data_len, p_gate, p_pipe); 167045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 167145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 167245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 167345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 167445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 167545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 167645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 167745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_identity_mgmt_gate_pkt 167845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1679e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function handles incoming Identity Management gate hci 168045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** commands 168145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 168245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 168345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 168445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 168563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenstatic void nfa_hci_handle_identity_mgmt_gate_pkt (UINT8 *p_data, tNFA_HCI_DYN_PIPE *p_pipe) 168645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 168745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[20]; 168863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 index; 168945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 gate_rsp[3 + NFA_HCI_MAX_GATE_CB], num_gates; 169045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT16 rsp_len = 0; 169145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p_rsp = data; 169245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_RESPONSE response = NFA_HCI_ANY_OK; 169345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 169445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* We never send commands on a pipe where the local gate is the identity management 1695e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu * gate, so only commands should be processed. 169645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 169763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.type != NFA_HCI_COMMAND_TYPE) 169845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 169945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 170063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.inst) 170145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 170245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 170345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu index = *(p_data++); 170445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->pipe_state == NFA_HCI_PIPE_OPENED) 170545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 170645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (index) 170745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 170845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_VERSION_SW_INDEX: 170945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = (UINT8) ((NFA_HCI_VERSION_SW >> 16 ) & 0xFF); 171045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[1] = (UINT8) ((NFA_HCI_VERSION_SW >> 8 ) & 0xFF); 171145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[2] = (UINT8) ((NFA_HCI_VERSION_SW ) & 0xFF); 171245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 3; 171345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 171445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 171545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_HCI_VERSION_INDEX: 171645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = NFA_HCI_VERSION; 171745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 171845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 171945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 172045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_VERSION_HW_INDEX: 172145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = (UINT8) ((NFA_HCI_VERSION_HW >> 16 ) & 0xFF); 172245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[1] = (UINT8) ((NFA_HCI_VERSION_HW >> 8 ) & 0xFF); 172345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[2] = (UINT8) ((NFA_HCI_VERSION_HW ) & 0xFF); 172445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 3; 172545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 172645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 172745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_VENDOR_NAME_INDEX: 172845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (data,NFA_HCI_VENDOR_NAME,strlen (NFA_HCI_VENDOR_NAME)); 172945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = (UINT8) strlen (NFA_HCI_VENDOR_NAME); 173045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 173145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 173245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_MODEL_ID_INDEX: 173345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = NFA_HCI_MODEL_ID; 173445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 173545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 173645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 173745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_GATES_LIST_INDEX: 173845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_rsp[0] = NFA_HCI_LOOP_BACK_GATE; 173945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_rsp[1] = NFA_HCI_IDENTITY_MANAGEMENT_GATE; 174045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_rsp[2] = NFA_HCI_CONNECTIVITY_GATE; 174145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu num_gates = nfa_hciu_get_allocated_gate_list (&gate_rsp[3]); 174245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = num_gates + 3; 174345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_rsp = gate_rsp; 174445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 174545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 174645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 174745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_NOK; 174845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 174945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 175045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 175145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 175245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 175345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_PIPE_NOT_OPENED; 175445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 175545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 175645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 175745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 175845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = 0; 175945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 176045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_OPENED; 176145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 176245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 176345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 176445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 176545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 176645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 176745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 176845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_CMD_NOT_SUPPORTED; 176945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 177045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 177145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 177245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, response, rsp_len, p_rsp); 177345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 177445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 177545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 177645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 177745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_generic_gate_cmd 177845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1779e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function handles all generic gates (excluding 178045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** connectivity gate) commands 178145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 178245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 178345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 178445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 178545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_cmd (UINT8 *p_data, UINT8 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe) 178645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 178745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 178845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HANDLE app_handle = nfa_hciu_get_pipe_owner (p_pipe->pipe_id); 178945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 179063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.inst) 179145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 179245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 179345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = p_pipe->pipe_id; 179445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.index = *p_data++; 179545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len > 0) 179645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len--; 179745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.data_len = data_len; 179845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 179945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len <= NFA_MAX_HCI_DATA_LEN) 180045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (evt_data.registry.reg_data, p_data, data_len); 180145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 180245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_SET_REG_CMD_EVT, &evt_data, app_handle); 180345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 180445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 180545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 180645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = p_pipe->pipe_id; 180745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.index = *p_data; 180845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.data_len = 0; 180945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 181045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_GET_REG_CMD_EVT, &evt_data, app_handle); 181145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 181245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 181345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 181463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_pipe_open_close_cmd (p_pipe); 181545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 181645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = p_pipe->pipe_id; 181745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = NFA_STATUS_OK; 181845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 181945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_OPEN_PIPE_EVT, &evt_data, app_handle); 182045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 182145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 182245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 182363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_pipe_open_close_cmd (p_pipe); 182445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 182545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.closed.pipe = p_pipe->pipe_id; 182645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = NFA_STATUS_OK; 182745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 182845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CLOSE_PIPE_EVT, &evt_data, app_handle); 182945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 183045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 183145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 183245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Could be application specific command, pass it on */ 183345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_rcvd.status = NFA_STATUS_OK; 183445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_rcvd.pipe = p_pipe->pipe_id;; 183563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.cmd_rcvd.cmd_code = nfa_hci_cb.inst; 183645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.cmd_rcvd.cmd_len = data_len; 183745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 183845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len <= NFA_MAX_HCI_CMD_LEN) 183945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (evt_data.cmd_rcvd.cmd_data, p_data, data_len); 184045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 184145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CMD_RCVD_EVT, &evt_data, app_handle); 184245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 184345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 184445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 184545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 184645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 184745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 184845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_generic_gate_rsp 184945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1850e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function handles all generic gates (excluding 185145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** connectivity) response 185245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 185345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 185445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 185545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 185645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_rsp (UINT8 *p_data, UINT8 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe) 185745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 185845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 185945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_OK; 186045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 186163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst != NFA_HCI_ANY_OK) 186245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = NFA_STATUS_FAILED; 186345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 186445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.cmd_sent == NFA_HCI_ANY_OPEN_PIPE) 186545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 186645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NFA_STATUS_OK) 186745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_OPENED; 186845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 186945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 187045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell application */ 187145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = status; 187245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = p_pipe->pipe_id; 187345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 187445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_OPEN_PIPE_EVT, &evt_data, nfa_hci_cb.app_in_use); 187545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 187645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.cmd_sent == NFA_HCI_ANY_CLOSE_PIPE) 187745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 187845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 187945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 188045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 188145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell application */ 188245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.status = status;; 188345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.opened.pipe = p_pipe->pipe_id; 188445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 188545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_CLOSE_PIPE_EVT, &evt_data, nfa_hci_cb.app_in_use); 188645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 188745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.cmd_sent == NFA_HCI_ANY_GET_PARAMETER) 188845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 188945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell application */ 189045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.status = status; 189145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = p_pipe->pipe_id; 189245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.data_len = data_len; 189345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.index = nfa_hci_cb.param_in_use; 189445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 189545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (evt_data.registry.reg_data, p_data, data_len); 189645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 189745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_GET_REG_RSP_EVT, &evt_data, nfa_hci_cb.app_in_use); 189845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 189945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.cmd_sent == NFA_HCI_ANY_SET_PARAMETER) 190045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 190145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Tell application */ 190245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.status = status;; 190345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.registry.pipe = p_pipe->pipe_id; 190445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 190545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_SET_REG_RSP_EVT, &evt_data, nfa_hci_cb.app_in_use); 190645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 190745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 190845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 190945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Could be a response to application specific command sent, pass it on */ 191045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rsp_rcvd.status = NFA_STATUS_OK; 191145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rsp_rcvd.pipe = p_pipe->pipe_id;; 191263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rsp_rcvd.rsp_code = nfa_hci_cb.inst; 191345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rsp_rcvd.rsp_len = data_len; 191445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 191545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len <= NFA_MAX_HCI_RSP_LEN) 191645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (evt_data.rsp_rcvd.rsp_data, p_data, data_len); 191745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 191845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_RSP_RCVD_EVT, &evt_data, nfa_hci_cb.app_in_use); 191945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 192045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 192145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 192245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 192345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 192445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 192545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_connectivity_gate_pkt 192645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 192745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles incoming connectivity gate packets 192845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 192945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 193045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 193145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 193245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_connectivity_gate_pkt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_PIPE *p_pipe) 193345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 193445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 193545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 193663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 193745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 193863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (nfa_hci_cb.inst) 193945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 194045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 194145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 194263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_handle_pipe_open_close_cmd (p_pipe); 194345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 194445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 194545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_CON_PRO_HOST_REQUEST: 194645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* A request to the DH to activate another host. This is not supported for */ 194745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* now, we will implement it when the spec is clearer and UICCs need it. */ 194845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_CMD_NOT_SUPPORTED, 0, NULL); 194945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 195045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 195145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 195245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_CMD_NOT_SUPPORTED, 0, NULL); 195345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 195445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 195545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 195663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) 195745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 195863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((nfa_hci_cb.cmd_sent == NFA_HCI_ANY_OPEN_PIPE) && (nfa_hci_cb.inst == NFA_HCI_ANY_OK)) 195945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_OPENED; 196045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (nfa_hci_cb.cmd_sent == NFA_HCI_ANY_CLOSE_PIPE) 196145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 196245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 196363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE) 196445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 196545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rcvd_evt.pipe = p_pipe->pipe_id; 196663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_code = nfa_hci_cb.inst; 196745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rcvd_evt.evt_len = data_len; 196845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rcvd_evt.p_evt_buf = p_data; 196945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 197045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_EVENT_RCVD_EVT to the application */ 197145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_apps_handling_connectivity_evts (NFA_HCI_EVENT_RCVD_EVT, &evt_data); 197245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 197345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 197445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 197545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 197645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 197745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_loopback_gate_pkt 197845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 197945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles incoming loopback gate hci events 198045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 198145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 198245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 198345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 198445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_loopback_gate_pkt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_PIPE *p_pipe) 198545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 198645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[1]; 198745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 rsp_len = 0; 198845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_RESPONSE response = NFA_HCI_ANY_OK; 198945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 199045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 199145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if data packet is a command, response or event */ 199263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE) 199345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 199463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst == NFA_HCI_ANY_OPEN_PIPE) 199545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 199645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = 0; 199745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rsp_len = 1; 199845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_OPENED; 199945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 200063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.inst == NFA_HCI_ANY_CLOSE_PIPE) 200145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 200245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 200345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 200445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 200545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu response = NFA_HCI_ANY_E_PIPE_NOT_OPENED; 200645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 200745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_RESPONSE_TYPE, response, rsp_len, data); 200845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 200963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) 201045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 201145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Since we never send any commands on our local loopback gate, 201245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * there should not be any response. 201345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 201445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 201563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE) 201645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 201763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.inst == NFA_HCI_EVT_POST_DATA) 201845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 201945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Send back the same data we got */ 202045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_msg (p_pipe->pipe_id, NFA_HCI_EVENT_TYPE, NFA_HCI_EVT_POST_DATA, data_len, p_data); 202145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 202245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 202345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 202445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 202545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 202645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 202745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hci_handle_generic_gate_evt 202845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 202945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function handles incoming Generic gate hci events 203045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 203145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 203245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 203345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 203445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void nfa_hci_handle_generic_gate_evt (UINT8 *p_data, UINT16 data_len, tNFA_HCI_DYN_GATE *p_gate, tNFA_HCI_DYN_PIPE *p_pipe) 203545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 203645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 203745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 203845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rcvd_evt.pipe = p_pipe->pipe_id; 203963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_code = nfa_hci_cb.inst; 204063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.evt_len = data_len; 204163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 204263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.assembly_failed) 204363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.status = NFA_STATUS_BUFFER_FULL; 204463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 204563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.rcvd_evt.status = NFA_STATUS_OK; 204663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 204745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rcvd_evt.p_evt_buf = p_data; 204863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.rsp_buf_size = 0; 204963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_rsp_buf = NULL; 205045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 205145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* notify NFA_HCI_EVENT_RCVD_EVT to the application */ 205245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_EVENT_RCVD_EVT, &evt_data, p_gate->gate_owner); 205345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 205445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 2055