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