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 utility 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 Chustatic void handle_debug_loopback (BT_HDR *p_buf, UINT8 pipe, UINT8 type, UINT8 instruction); 3645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN HCI_LOOPBACK_DEBUG = FALSE; 3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_pipe_by_pid 4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description look for the pipe control block based on pipe id 4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the pipe control block, or NULL if not found 4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 4745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_find_pipe_by_pid (UINT8 pipe_id) 4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp = nfa_hci_cb.cfg.dyn_pipes; 5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through looking for a match */ 5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pp->pipe_id == pipe_id) 5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, not found */ 6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_gate_by_gid 6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the gate control block for the given gate id 6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the gate control block, or NULL if not found 7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 7245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_GATE *nfa_hciu_find_gate_by_gid (UINT8 gate_id) 7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg = nfa_hci_cb.cfg.dyn_gates; 7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_id == gate_id) 8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg); 8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_gate_by_owner 8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the the first gate control block for the given owner 9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the gate control block, or NULL if not found 9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 9545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_GATE *nfa_hciu_find_gate_by_owner (tNFA_HANDLE app_handle) 9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg = nfa_hci_cb.cfg.dyn_gates; 9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_owner == app_handle) 10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg); 10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_gate_with_nopipes_by_owner 11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 113e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description Find the the first gate control block with no pipes 11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** for the given owner 11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the gate control block, or NULL if not found 11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 11945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_GATE *nfa_hciu_find_gate_with_nopipes_by_owner (tNFA_HANDLE app_handle) 12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg = nfa_hci_cb.cfg.dyn_gates; 12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (pg->gate_owner == app_handle) 12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pg->pipe_inx_mask == 0) ) 12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg); 12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_count_pipes_on_gate 13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Count the number of pipes on the given gate 13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns the number of pipes on the gate 14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 14345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 nfa_hciu_count_pipes_on_gate (tNFA_HCI_DYN_GATE *p_gate) 14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT32 mask = 1; 14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 count = 0; 14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_PIPE_CB; xx++) 15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( p_gate->pipe_inx_mask & mask ) 15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu count++; 15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu mask = mask << 1; 15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (count); 15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_count_open_pipes_on_gate 16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Count the number of opened pipes on the given gate 16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns the number of pipes in OPENED state on the gate 16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 16945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 nfa_hciu_count_open_pipes_on_gate (tNFA_HCI_DYN_GATE *p_gate) 17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp = nfa_hci_cb.cfg.dyn_pipes; 17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx = 0; 17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT32 mask = 1; 17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 count = 0; 17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for ( ; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* For each pipe on this gate, check if it is open */ 17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate->pipe_inx_mask & mask) && (pp->pipe_state == NFA_HCI_PIPE_OPENED)) 18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu count++; 18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu mask = mask << 1; 18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (count); 18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_gate_owner 19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the application that owns a gate 19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns application handle 19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 19745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HANDLE nfa_hciu_get_gate_owner (UINT8 gate_id) 19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pg = nfa_hciu_find_gate_by_gid (gate_id)) == NULL) 20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HANDLE_INVALID); 20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg->gate_owner); 20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_pipe_owner 21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the application that owns a pipe 21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns application handle 21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 21645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HANDLE nfa_hciu_get_pipe_owner (UINT8 pipe_id) 21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pp = nfa_hciu_find_pipe_by_pid (pipe_id)) == NULL) 22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HANDLE_INVALID); 22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) == NULL) 22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HANDLE_INVALID); 22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg->gate_owner); 22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_alloc_gate 23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Allocate an gate control block 23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the allocated gate, or NULL if cannot allocate 23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 24045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_GATE *nfa_hciu_alloc_gate (UINT8 gate_id, tNFA_HANDLE app_handle) 24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_inx = app_handle & NFA_HANDLE_MASK; 24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First, check if the application handle is valid */ 24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((gate_id != NFA_HCI_CONNECTIVITY_GATE) 24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu && 25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ( ((app_handle & NFA_HANDLE_GROUP_MASK) != NFA_HANDLE_GROUP_HCI) 251e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu ||(app_inx >= NFA_HCI_MAX_APP_CB) 25263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(nfa_hci_cb.p_app_cback[app_inx] == NULL) )) 25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (gate_id != 0) 25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pg = nfa_hciu_find_gate_by_gid (gate_id)) != NULL) 26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg); 26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If gate_id is 0, we need to assign a free one */ 26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through all possible gate IDs checking if they are already used */ 266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu for (gate_id = NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE; gate_id < NFA_HCI_LAST_PROP_GATE; gate_id++) 26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Skip connectivity gate */ 26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (gate_id == NFA_HCI_CONNECTIVITY_GATE) gate_id++; 27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Check if the gate is already allocated */ 27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pg = nfa_hci_cb.cfg.dyn_gates; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_id == gate_id) 27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If the gate is not allocated, use the gate */ 27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (xx == NFA_HCI_MAX_GATE_CB) 27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 279eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (gate_id == NFA_HCI_LAST_PROP_GATE) 28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR2 ("nfa_hci_alloc_gate - no free Gate ID: %u App Handle: 0x%04x", gate_id, app_handle); 28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Now look for a free control block */ 28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pg = nfa_hci_cb.cfg.dyn_gates; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) 28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pg->gate_id == 0) 29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Found a free gate control block */ 29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pg->gate_id = gate_id; 29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pg->gate_owner = app_handle; 29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pg->pipe_inx_mask = 0; 29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG2 ("nfa_hciu_alloc_gate id:%d app_handle: 0x%04x", gate_id, app_handle); 29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pg); 30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, no free gate control block */ 30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR2 ("nfa_hci_alloc_gate - no CB Gate ID: %u App Handle: 0x%04x", gate_id, app_handle); 30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_msg 31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function will fragment the given packet, if necessary 31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** and send it on the given pipe. 31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns status 31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 31845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_msg (UINT8 pipe_id, UINT8 type, UINT8 instruction, UINT16 msg_len, UINT8 *p_msg) 31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BT_HDR *p_buf; 32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p_data; 32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BOOLEAN first_pkt = TRUE; 32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT16 data_len; 32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status = NFA_STATUS_OK; 32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT16 max_seg_hcp_pkt_size = nfa_hci_cb.buff_size - NCI_DATA_HDR_SIZE; 32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG3 ("nfa_hciu_send_msg pipe_id:%d %s len:%d", 32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_id, nfa_hciu_get_type_inst_names (pipe_id, type, instruction), msg_len); 33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else 33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG4 ("nfa_hciu_send_msg pipe_id:%d Type: %u Inst: %u len: %d", 33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_id, type, instruction, msg_len); 33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (instruction == NFA_HCI_ANY_GET_PARAMETER) 33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.param_in_use = *p_msg; 33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ((first_pkt == TRUE) || (msg_len != 0)) 33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) != NULL) 34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First packet has a 2-byte header, subsequent fragments have a 1-byte header */ 34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len = first_pkt ? (max_seg_hcp_pkt_size - 2) : (max_seg_hcp_pkt_size - 1); 34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_data = (UINT8 *) (p_buf + 1) + p_buf->offset; 34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Last or only segment has "no fragmentation" bit set */ 35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (msg_len > data_len) 35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu *p_data++ = (NFA_HCI_MESSAGE_FRAGMENTATION << 7) | (pipe_id & 0x7F); 35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len = msg_len; 35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu *p_data++ = (NFA_HCI_NO_MESSAGE_FRAGMENTATION << 7) | (pipe_id & 0x7F); 35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len = 1; 36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 362e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /* Message header only goes in the first segment */ 36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (first_pkt) 36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu first_pkt = FALSE; 36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu *p_data++ = (type << 6) | instruction; 36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len++; 36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len != 0) 37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (p_data, p_msg, data_len); 37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len += data_len; 37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu msg_len -= data_len; 37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (msg_len > 0) 37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_msg += data_len; 37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_PROTOCOL == TRUE) 38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu DispHcp (((UINT8 *) (p_buf + 1) + p_buf->offset), p_buf->len, FALSE, (BOOLEAN) ((p_buf->len - data_len) == 2)); 38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (HCI_LOOPBACK_DEBUG) 38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu handle_debug_loopback (p_buf, pipe_id, type, instruction); 38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = NFC_SendData (nfa_hci_cb.conn_id, p_buf); 38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_ERROR0 ("nfa_hciu_send_data_packet no buffers"); 39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = NFA_STATUS_NO_BUFFERS; 39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Start timer if response to wait for a particular time for the response */ 39845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (type == NFA_HCI_COMMAND_TYPE) 39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cmd_sent = instruction; 40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE) 40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_RSP; 40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 405ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, NFA_HCI_CMD_RSP_TIMEOUT); 40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_allocated_gate_list 41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description fills in a list of allocated gates 41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns the number of gates 41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 42045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 nfa_hciu_get_allocated_gate_list (UINT8 *p_gate_list) 42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_cb; 42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 count = 0; 42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, p_cb = nfa_hci_cb.cfg.dyn_gates; xx <= NFA_HCI_MAX_GATE_CB; xx++, p_cb++) 42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb->gate_id != 0) 42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu *p_gate_list++ = p_cb->gate_id; 43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu count++; 43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_get_allocated_gate_list () returns: %u", count); 43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (count); 43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_alloc_pipe 44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Allocate a pipe control block 44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 446e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Returns pointer to the pipe control block, or NULL if 44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** cannot allocate 44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 45045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_alloc_pipe (UINT8 pipe_id) 45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 xx; 45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If we already have a pipe of the same ID, release it first it */ 45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pp = nfa_hciu_find_pipe_by_pid (pipe_id)) != NULL) 45734785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu { 45834785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu if (pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE) 45934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu return pp; 46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_pipe (pipe_id); 46134785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu } 46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Look for a free pipe control block */ 46445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes ; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pp->pipe_id == 0) 46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG2 ("nfa_hciu_alloc_pipe:%d, index:%d", pipe_id, xx); 46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pp->pipe_id = pipe_id; 47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_alloc_pipe:%d, NO free entries !!", pipe_id); 47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_release_gate 48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Remove a generic gate from gate list 48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hciu_release_gate (UINT8 gate_id) 49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate = nfa_hciu_find_gate_by_gid (gate_id); 49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_gate != NULL) 49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG3 ("nfa_hciu_release_gate () ID: %d owner: 0x%04x pipe_inx_mask: 0x%04x", 49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu gate_id, p_gate->gate_owner, p_gate->pipe_inx_mask); 49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate->gate_id = 0; 49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate->gate_owner = 0; 50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate->pipe_inx_mask = 0; 50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING1 ("nfa_hciu_release_gate () ID: %d NOT FOUND", gate_id); 50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_add_pipe_to_gate 51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Add pipe to generic gate 51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns NFA_STATUS_OK, if successfully add the pipe on to the gate 51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** NFA_HCI_ADM_E_NO_PIPES_AVAILABLE, otherwise 51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 52045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_RESPONSE nfa_hciu_add_pipe_to_gate (UINT8 pipe_id, UINT8 local_gate, 52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 dest_host, UINT8 dest_gate) 52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pipe_index; 52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate = nfa_hciu_find_gate_by_gid (local_gate); 52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_gate != NULL) 53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Allocate a pipe control block */ 53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_alloc_pipe (pipe_id)) != NULL) 53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id = pipe_id; 53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->dest_host = dest_host; 53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->dest_gate = dest_gate; 53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->local_gate = local_gate; 53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Save the pipe in the gate that it belongs to */ 54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_index = (UINT8) (p_pipe - nfa_hci_cb.cfg.dyn_pipes); 54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate->pipe_inx_mask |= (UINT32) (1 << pipe_index); 54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG4 ("nfa_hciu_add_pipe_to_gate Gate ID: 0x%02x Pipe ID: 0x%02x pipe_index: %u App Handle: 0x%08x", 54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu local_gate, pipe_id, pipe_index, p_gate->gate_owner); 54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HCI_ANY_OK); 54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_add_pipe_to_gate: 0x%02x NOT FOUND", local_gate); 55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HCI_ADM_E_NO_PIPES_AVAILABLE); 55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_add_pipe_to_static_gate 55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Add pipe to identity management gate 56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns NFA_HCI_ANY_OK, if successfully add the pipe on to the gate 56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** NFA_HCI_ADM_E_NO_PIPES_AVAILABLE, otherwise 56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 56545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_RESPONSE nfa_hciu_add_pipe_to_static_gate (UINT8 local_gate, UINT8 pipe_id, UINT8 dest_host, UINT8 dest_gate) 56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pipe_index; 56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT4 ("nfa_hciu_add_pipe_to_static_gate (%u) Pipe: 0x%02x Dest Host: 0x%02x Dest Gate: 0x%02x)", 571e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu local_gate, pipe_id, dest_host, dest_gate); 57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Allocate a pipe control block */ 57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_alloc_pipe (pipe_id)) != NULL) 57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id = pipe_id; 57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED; 57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->dest_host = dest_host; 57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->dest_gate = dest_gate; 58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->local_gate = local_gate; 58145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If this is the ID gate, save the pipe index in the ID gate info */ 58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* block. Note that for loopback, it is enough to just create the pipe */ 58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) 58545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_index = (UINT8) (p_pipe - nfa_hci_cb.cfg.dyn_pipes); 58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask |= (UINT32) (1 << pipe_index); 58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return NFA_HCI_ANY_OK; 59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return NFA_HCI_ADM_E_NO_PIPES_AVAILABLE; 59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_active_pipe_by_owner 59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the first pipe associated with the given app 60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to pipe, or NULL if none found 60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 60345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 60445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_find_active_pipe_by_owner (tNFA_HANDLE app_handle) 60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_find_pipe_by_owner () app_handle:0x%x", app_handle); 61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through all pipes looking for the owner */ 61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (pp->pipe_id != 0) 61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pp->pipe_id >= NFA_HCI_FIRST_DYNAMIC_PIPE) 61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pp->pipe_id <= NFA_HCI_LAST_DYNAMIC_PIPE) 61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hciu_is_active_host (pp->dest_host)) ) 61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) != NULL) 62145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pg->gate_owner == app_handle) ) 62245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 62345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 62445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 62545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 62645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, not found */ 62745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 63245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_pipe_by_owner 63345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 63445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the first pipe associated with the given app 63545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 63645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to pipe, or NULL if none found 63745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 63845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 63945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_find_pipe_by_owner (tNFA_HANDLE app_handle) 64045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 64145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 64245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_find_pipe_by_owner () app_handle:0x%x", app_handle); 64645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 64745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through all pipes looking for the owner */ 64845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 64945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 65045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pp->pipe_id != 0) 65145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 65245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) != NULL) 65345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pg->gate_owner == app_handle) ) 65445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 65545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, not found */ 65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_pipe_on_gate 66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 66645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the first pipe associated with the given gate 66745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 66845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to pipe, or NULL if none found 66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 67145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_find_pipe_on_gate (UINT8 gate_id) 67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_find_pipe_on_gate () Gate:0x%x", gate_id); 67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through all pipes looking for the owner */ 68045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (pp->pipe_id != 0) 68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) != NULL) 68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pg->gate_id == gate_id) ) 68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 68745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 68845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 68945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 69045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, not found */ 69145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_is_active_host 69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Check if the host is currently active 69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 70045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns TRUE, if the host is active in the host network 70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** FALSE, if the host is not active in the host network 70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 70445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfa_hciu_is_active_host (UINT8 host_id) 70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 xx; 70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 70845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) 70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfa_hci_cb.inactive_host[xx] == host_id) 71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return FALSE; 71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return TRUE; 71545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 7195bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Function nfa_hciu_is_host_reseting 7205bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7215bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Description Check if the host is currently reseting 7225bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7235bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if the host is reseting 7245bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if the host is not reseting 7255bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7265bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu*******************************************************************************/ 7275bf83a74c2a6088dbf15980ad4fed2be4f254486Evan ChuBOOLEAN nfa_hciu_is_host_reseting (UINT8 host_id) 7285bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu{ 7295bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu UINT8 xx; 7305bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7315bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) 7325bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 7335bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_cb.reset_host[xx] == host_id) 7345bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 7355bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 7365bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7375bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 7385bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu} 7395bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7405bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu/******************************************************************************* 7415bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7425bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Function nfa_hciu_is_no_host_resetting 7435bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7445bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Description Check if no host is reseting 7455bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7465bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** Returns TRUE, if no host is resetting at this time 7475bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** FALSE, if one or more host is resetting 7485bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 7495bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu*******************************************************************************/ 7505bf83a74c2a6088dbf15980ad4fed2be4f254486Evan ChuBOOLEAN nfa_hciu_is_no_host_resetting (void) 7515bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu{ 7525bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu UINT8 xx; 7535bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7545bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) 7555bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu { 7565bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu if (nfa_hci_cb.reset_host[xx] != 0) 7575bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return FALSE; 7585bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu } 7595bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7605bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu return TRUE; 7615bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu} 7625bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu 7635bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu/******************************************************************************* 7645bf83a74c2a6088dbf15980ad4fed2be4f254486Evan Chu** 76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_find_active_pipe_on_gate 76645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Find the first active pipe associated with the given gate 76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to pipe, or NULL if none found 77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 77145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 77245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_DYN_PIPE *nfa_hciu_find_active_pipe_on_gate (UINT8 gate_id) 77345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 778e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_find_active_pipe_on_gate () Gate:0x%x", gate_id); 77945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Loop through all pipes looking for the owner */ 78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (pp->pipe_id != 0) 78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pp->pipe_id >= NFA_HCI_FIRST_DYNAMIC_PIPE) 78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pp->pipe_id <= NFA_HCI_LAST_DYNAMIC_PIPE) 78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hciu_is_active_host (pp->dest_host)) ) 78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) != NULL) 78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pg->gate_id == gate_id) ) 79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (pp); 79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* If here, not found */ 79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NULL); 79645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_release_pipe 80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description remove the specified pipe 80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns NFA_HCI_ANY_OK, if removed 80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** NFA_HCI_ANY_E_NOK, if otherwise 80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 80845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_HCI_RESPONSE nfa_hciu_release_pipe (UINT8 pipe_id) 80945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 81045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *p_gate; 81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pipe_index; 81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hciu_release_pipe: %u", pipe_id); 81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_pipe = nfa_hciu_find_pipe_by_pid (pipe_id)) == NULL) 81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HCI_ANY_E_NOK); 81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 81934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu if (pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE) 82034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu { 82134785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu NFA_TRACE_DEBUG1 ("ignore pipe: %d", pipe_id); 82234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu return (NFA_HCI_ANY_E_NOK); 82334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu } 82434785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu 82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pipe_index = (UINT8) (p_pipe - nfa_hci_cb.cfg.dyn_pipes); 82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) 82845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Remove pipe from ID management gate */ 83045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask &= ~ (UINT32) (1 << pipe_index); 83145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 83245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 83345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 83445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((p_gate = nfa_hciu_find_gate_by_gid (p_pipe->local_gate)) == NULL) 83545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 83645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Mark the pipe control block as free */ 83745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pipe->pipe_id = 0; 83845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NFA_HCI_ANY_E_NOK); 83945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 84045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 84145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Remove pipe from gate */ 84245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_gate->pipe_inx_mask &= ~ (UINT32) (1 << pipe_index); 84345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 84445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Reset pipe control block */ 84645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (p_pipe,0,sizeof (tNFA_HCI_DYN_PIPE)); 84745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.nv_write_needed = TRUE; 84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return NFA_HCI_ANY_OK; 84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 85045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_remove_all_pipes_from_host 85445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description remove all the pipes that are connected to a specific host 85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 85845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 85945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hciu_remove_all_pipes_from_host (UINT8 host) 86145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 86245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_GATE *pg; 86345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *pp; 86445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 86545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_EVT_DATA evt_data; 86645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_EVENT1 ("nfa_hciu_remove_all_pipes_from_host (0x%02x)", host); 86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 86945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Remove all pipes from the specified host connected to all generic gates */ 87045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) 87145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 872ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu if ( (pp->pipe_id == 0) 873ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu || 874ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu ( (host != 0) 875ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu &&((pp->dest_host != host) || (pp->pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE))) ) 87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu continue; 87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((pg = nfa_hciu_find_gate_by_gid (pp->local_gate)) != NULL) 87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 88045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.status = NFA_STATUS_OK; 88145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.deleted.pipe = pp->pipe_id; 88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_send_to_app (NFA_HCI_DELETE_PIPE_EVT, &evt_data, pg->gate_owner); 88445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hciu_release_pipe (pp->pipe_id); 88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 88845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 88945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_create_pipe_cmd 89245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Create dynamic pipe between the specified gates 89445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns status 89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 89845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_create_pipe_cmd (UINT8 source_gate, UINT8 dest_host, UINT8 dest_gate) 89945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[3]; 902e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu 90345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = source_gate; 90445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[1] = dest_host; 90545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[2] = dest_gate; 90645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 90745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG3 ("nfa_hciu_send_create_pipe_cmd source_gate:%d, dest_host:%d, dest_gate:%d", source_gate, dest_host, dest_gate); 90845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 90945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE, NFA_HCI_ADM_CREATE_PIPE, 3, data); 91045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 91345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 91645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_delete_pipe_cmd 91745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 91845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Delete the dynamic pipe 91945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 92045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 92345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_delete_pipe_cmd (UINT8 pipe) 92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG1 ("nfa_hciu_send_delete_pipe_cmd: %d", pipe); 92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 92934785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu if (pipe > NFA_HCI_LAST_DYNAMIC_PIPE) 93034785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu { 93134785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu NFA_TRACE_DEBUG1 ("ignore pipe: %d", pipe); 93234785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu return (NFA_HCI_ANY_E_NOK); 93334785a5d8cf38d96df9535f4673d03b31fc16d9eEvan Chu } 93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.pipe_in_use = pipe; 93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE, NFA_HCI_ADM_DELETE_PIPE, 1, &pipe); 93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 94045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_clear_all_pipe_cmd 94545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 94645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description delete all the dynamic pipe connected to device host, 94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** to close all static pipes connected to device host, 94845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** and to set registry values related to static pipes to 94945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** theri default values. 95045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 95445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_clear_all_pipe_cmd (void) 95545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 957e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu UINT16 id_ref_data = 0x0102; 95845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_DEBUG0 ("nfa_hciu_send_clear_all_pipe_cmd"); 96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE, NFA_HCI_ADM_CLEAR_ALL_PIPE, 2, (UINT8 *) &id_ref_data); 96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_open_pipe_cmd 96945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 97045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Open a closed pipe 97145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 97245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns status 97345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 97445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 97545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_open_pipe_cmd (UINT8 pipe) 97645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 97745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 97845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 97945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.pipe_in_use = pipe; 98045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_OPEN_PIPE, 0, NULL); 98245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 98445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 98545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 98745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 98845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_close_pipe_cmd 98945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 99045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Close an opened pipe 99145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 99245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns status 99345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 99445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 99545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_close_pipe_cmd (UINT8 pipe) 99645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 99745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 99845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 99945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.pipe_in_use = pipe; 100045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 100145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = nfa_hciu_send_msg (pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_CLOSE_PIPE, 0, NULL); 100245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 100845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_get_param_cmd 100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Read a parameter value from gate registry 101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 101345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 101545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_get_param_cmd (UINT8 pipe, UINT8 index) 101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_msg (pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_GET_PARAMETER, 1, &index)) == NFC_STATUS_OK) 102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.param_in_use = index; 102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 102445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 102745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_set_param_cmd 102845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 102945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Set a parameter value in a gate registry 103045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 103145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns None 103245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 103345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 103445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFA_STATUS nfa_hciu_send_set_param_cmd (UINT8 pipe, UINT8 index, UINT8 length, UINT8 *p_data) 103545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 103645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_STATUS status; 103745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data[255]; 103845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 103945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data[0] = index; 104045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy (&data[1], p_data, length); 104245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((status = nfa_hciu_send_msg (pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_SET_PARAMETER, (UINT16) (length + 1), data)) == NFC_STATUS_OK) 104445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_hci_cb.param_in_use = index; 104545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return status; 104745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 104845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 105045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 105145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 105245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_to_app 105345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 105445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Send an event back to an application 105545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 105645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 105745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 105845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 105945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hciu_send_to_app (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt, tNFA_HANDLE app_handle) 106045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 106145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_inx = app_handle & NFA_HANDLE_MASK; 106245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 106345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* First, check if the application handle is valid */ 106445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( ((app_handle & NFA_HANDLE_GROUP_MASK) == NFA_HANDLE_GROUP_HCI) 106545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(app_inx < NFA_HCI_MAX_APP_CB) ) 106645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 106763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.p_app_cback[app_inx] != NULL) 106845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 106963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[app_inx] (event, p_evt); 107045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 107145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 107245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 107345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 107445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (app_handle != NFA_HANDLE_INVALID) 107545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 107645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFA_TRACE_WARNING2 ("nfa_hciu_send_to_app no callback, event: 0x%04x app_handle: 0x%04x", 107745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu event, app_handle); 107845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 107945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 108045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 108145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 108245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 108345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_to_all_apps 108445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 108545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Send an event back to all applications 108645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 108745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 108845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 108945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 109045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hciu_send_to_all_apps (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt) 109145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 109245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_inx; 109345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 109445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (app_inx = 0; app_inx < NFA_HCI_MAX_APP_CB; app_inx++) 109545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 109663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfa_hci_cb.p_app_cback[app_inx] != NULL) 109763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[app_inx] (event, p_evt); 109845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 109945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 110045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 110145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 110245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 110345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 110445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_send_to_apps_handling_connectivity_evts 110545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 110645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Send a connectivity event to all the application interested 1107e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** in connectivity events 110845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 110945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns none 111045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 111145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 111245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfa_hciu_send_to_apps_handling_connectivity_evts (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt) 111345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 111445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 app_inx; 111545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 111645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (app_inx = 0; app_inx < NFA_HCI_MAX_APP_CB; app_inx++) 111745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 111863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ( (nfa_hci_cb.p_app_cback[app_inx] != NULL) 111945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(nfa_hci_cb.cfg.b_send_conn_evts[app_inx])) 112045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 112163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen nfa_hci_cb.p_app_cback[app_inx] (event, p_evt); 112245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 112345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 112445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 112545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 112645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 112745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 112845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 112945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_response_name 113045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 113145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the error code name. 113245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 113345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** NOTE conditionally compiled to save memory. 113445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 113545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 113645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 113745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 113845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_get_response_name (UINT8 rsp_code) 113945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 114045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[50]; 114145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 114245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (rsp_code) 114345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 114445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OK: 114545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_OK"); 114645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_NOT_CONNECTED: 114745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_NOT_CONNECTED"); 114845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_CMD_PAR_UNKNOWN: 114945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_CMD_PAR_UNKNOWN"); 115045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_NOK: 115145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_NOK"); 115245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_E_NO_PIPES_AVAILABLE: 115345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_E_NO_PIPES_AVAILABLE"); 115445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_REG_PAR_UNKNOWN: 115545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_REG_PAR_UNKNOWN"); 115645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_PIPE_NOT_OPENED: 115745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_PIPE_NOT_OPENED"); 115845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_CMD_NOT_SUPPORTED: 115945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_CMD_NOT_SUPPORTED"); 116045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_INHIBITED: 116145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_INHIBITED"); 116245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_TIMEOUT: 116345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_TIMEOUT"); 116445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_REG_ACCESS_DENIED: 116545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_REG_ACCESS_DENIED"); 116645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_E_PIPE_ACCESS_DENIED: 116745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_E_PIPE_ACCESS_DENIED"); 116845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 116945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", rsp_code); 117045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 117145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 117245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 117345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 117445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 117545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 117645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_type_2_str 117745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 117845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the type name. 117945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 118045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 118145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 118245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 118345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_type_2_str(UINT8 type) 118445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 118545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[40]; 118645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 118745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (type) 118845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 118945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_COMMAND_TYPE: 119045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("COMMAND"); 119145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVENT_TYPE: 119245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVENT"); 119345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RESPONSE_TYPE: 119445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("RESPONSE"); 119545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 119645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", type); 119745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 119845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 119945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 120045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 120145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 120245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 120345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_instr_2_str 120445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 120545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the instruction name. 120645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 120745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 120845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 120945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 121045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_instr_2_str (UINT8 instruction) 121145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 121245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[40]; 121345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 121445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (instruction) 121545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 121645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_SET_PARAMETER: 121745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_SET_PARAMETER"); 121845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 121945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_GET_PARAMETER"); 122045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_OPEN_PIPE: 122145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_OPEN_PIPE"); 122245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_CLOSE_PIPE: 122345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ANY_CLOSE_PIPE"); 122445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CREATE_PIPE: 122545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_CREATE_PIPE"); 122645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_DELETE_PIPE: 122745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_DELETE_PIPE"); 122845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_PIPE_CREATED: 122945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_NOTIFY_PIPE_CREATED"); 123045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_PIPE_DELETED: 123145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_NOTIFY_PIPE_DELETED"); 123245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CLEAR_ALL_PIPE: 123345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_CLEAR_ALL_PIPE"); 123445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED: 123545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("ADM_NOTIFY_ALL_PIPE_CLEARED"); 123645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 123745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", instruction); 123845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 123945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 124045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 124145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 124245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 124345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 124445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 124545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_event_name 124645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 124745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the event code name. 124845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 124945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 125045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 125145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 125245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_get_event_name (UINT16 event) 125345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 125445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[40]; 125545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 125645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (event) 125745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 125845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_REGISTER_APP_EVT: return ("API_REGISTER"); 125945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DEREGISTER_APP_EVT: return ("API_DEREGISTER"); 126045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_APP_GATE_PIPE_EVT: return ("API_GET_GATE_LIST"); 126145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_ALLOC_GATE_EVT: return ("API_ALLOC_GATE"); 126245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DEALLOC_GATE_EVT: return ("API_DEALLOC_GATE"); 126345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_HOST_LIST_EVT: return ("API_GET_HOST_LIST"); 126445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_GET_REGISTRY_EVT: return ("API_GET_REG_VALUE"); 126545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SET_REGISTRY_EVT: return ("API_SET_REG_VALUE"); 126645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_CREATE_PIPE_EVT: return ("API_CREATE_PIPE"); 126745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_OPEN_PIPE_EVT: return ("API_OPEN_PIPE"); 126845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_CLOSE_PIPE_EVT: return ("API_CLOSE_PIPE"); 126945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_DELETE_PIPE_EVT: return ("API_DELETE_PIPE"); 127045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_CMD_EVT: return ("API_SEND_COMMAND_EVT"); 127145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_RSP_EVT: return ("API_SEND_RESPONSE_EVT"); 127245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_API_SEND_EVENT_EVT: return ("API_SEND_EVENT_EVT"); 127345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_NV_READ_EVT: return ("NV_READ_EVT"); 127445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_NV_WRITE_EVT: return ("NV_WRITE_EVT"); 127545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RSP_TIMEOUT_EVT: return ("RESPONSE_TIMEOUT_EVT"); 127645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_CHECK_QUEUE_EVT: return ("CHECK_QUEUE"); 127745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 127845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 127945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", event); 128045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 128145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 128245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 128345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 128445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 128545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 128645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_state_name 128745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 128845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the state name. 128945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 129045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 129145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 129245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 129345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_get_state_name (UINT8 state) 129445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 129545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[40]; 129645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 129745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (state) 129845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 129945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_DISABLED: return ("DISABLED"); 130045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_STARTUP: return ("STARTUP"); 130145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_IDLE: return ("IDLE"); 130245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_WAIT_RSP: return ("WAIT_RSP"); 130345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_REMOVE_GATE: return ("REMOVE_GATE"); 130445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_APP_DEREGISTER: return ("APP_DEREGISTER"); 130545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_STATE_RESTORE: return ("RESTORE"); 130645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 130745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 130845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 130945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", state); 131045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 131145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 131245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 131345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 131445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 131545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 131645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_get_type_inst_names 131745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 131845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns command/response/event name. 131945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 132045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 132145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 132245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 132345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_get_type_inst_names (UINT8 pipe, UINT8 type, UINT8 inst) 132445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 132545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char buff[100]; 132645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int xx; 132745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 132845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu xx = sprintf (buff, "Type: %s ", nfa_hciu_type_2_str (type)); 132945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 133045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (type) 133145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 133245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_COMMAND_TYPE: 133345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (&buff[xx], "Inst: %s ", nfa_hciu_instr_2_str (inst)); 133445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 133545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVENT_TYPE: 133645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (&buff[xx], "Evt: %s ", nfa_hciu_evt_2_str (pipe, inst)); 133745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 133845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_RESPONSE_TYPE: 133945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (&buff[xx], "Resp: %s ", nfa_hciu_get_response_name (inst)); 134045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 134145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 134245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (&buff[xx], "Inst: %u ", inst); 134345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 134445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 134545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (buff); 134645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 134745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 134845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 134945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 135045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 135145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 135245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfa_hciu_instr_2_str 135345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 135445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function returns the instruction name. 135545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 135645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns pointer to the name 135745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 135845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 135945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuchar *nfa_hciu_evt_2_str (UINT8 pipe_id, UINT8 evt) 136045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 136145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static char unknown[40]; 136245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFA_HCI_DYN_PIPE *p_pipe; 136345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 136445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ( (pipe_id != NFA_HCI_ADMIN_PIPE) 136545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&(pipe_id != NFA_HCI_LINK_MANAGEMENT_PIPE) 136645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu &&((p_pipe = nfa_hciu_find_pipe_by_pid (pipe_id)) != NULL) ) 136745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 136845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pipe->local_gate == NFA_HCI_CONNECTIVITY_GATE) 136945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 137045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (evt) 137145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 137245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_CONNECTIVITY: 137345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_CONNECTIVITY"); 137445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_TRANSACTION: 137545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_TRANSACTION"); 137645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_OPERATION_ENDED: 137745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_OPERATION_ENDED"); 137845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 137945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 138045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 138145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 138245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 138345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 138445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (evt) 138545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 138645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_HCI_END_OF_OPERATION: 138745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_END_OF_OPERATION"); 138845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_POST_DATA: 138945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_POST_DATA"); 139045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_EVT_HOT_PLUG: 139145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return ("EVT_HOT_PLUG"); 139245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 139345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu sprintf (unknown, "?? Unknown: %u ?? ", evt); 139445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (unknown); 139545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 139645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 139745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 139845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 139945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 140045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void handle_debug_loopback (BT_HDR *p_buf, UINT8 pipe, UINT8 type, UINT8 instruction) 140145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 140245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p = (UINT8 *) (p_buf + 1) + p_buf->offset; 140345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu static UINT8 next_pipe = 0x10; 140445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 140545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (type == NFA_HCI_COMMAND_TYPE) 140645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 140745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (instruction) 140845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 140945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ADM_CREATE_PIPE: 141045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[6] = next_pipe++; 141145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[5] = p[4]; 141245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[4] = p[3]; 141345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[3] = p[2]; 141445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[2] = 3; 141545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK; 141645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len = p_buf->offset + 7; 141745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 141845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 141945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NFA_HCI_ANY_GET_PARAMETER: 142045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK; 1421eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memcpy (&p[2], (UINT8 *) nfa_hci_cb.cfg.admin_gate.session_id, NFA_HCI_SESSION_ID_LEN); 142245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len = p_buf->offset + 2 + NFA_HCI_SESSION_ID_LEN; 142345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 142445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 142545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 142645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK; 142745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->len = p_buf->offset + 2; 142845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 142945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 143045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 143145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else if (type == NFA_HCI_RESPONSE_TYPE) 143245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 143345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_buf); 143445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 143545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 143645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 143745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_buf->event = NFA_HCI_CHECK_QUEUE_EVT; 143845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfa_sys_sendmsg (p_buf); 143945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 144045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 1441