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