1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the utility functions for the NFA HCI.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "nfa_dm_int.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_api.h"
276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_hci_defs.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_hci_int.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_nv_co.h"
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys.h"
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_sys_int.h"
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_api.h"
346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "trace_api.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void handle_debug_loopback(NFC_HDR* p_buf, uint8_t pipe, uint8_t type,
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  uint8_t instruction);
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool HCI_LOOPBACK_DEBUG = false;
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_pipe_by_pid
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      look for the pipe control block based on pipe id
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the pipe control block, or NULL if not found
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_find_pipe_by_pid(uint8_t pipe_id) {
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp = nfa_hci_cb.cfg.dyn_pipes;
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through looking for a match */
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) {
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pp->pipe_id == pipe_id) return (pp);
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_gate_by_gid
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the gate control block for the given gate id
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the gate control block, or NULL if not found
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_GATE* nfa_hciu_find_gate_by_gid(uint8_t gate_id) {
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg = nfa_hci_cb.cfg.dyn_gates;
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) {
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pg->gate_id == gate_id) return (pg);
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_gate_by_owner
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the the first gate control block for the given owner
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the gate control block, or NULL if not found
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_GATE* nfa_hciu_find_gate_by_owner(tNFA_HANDLE app_handle) {
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg = nfa_hci_cb.cfg.dyn_gates;
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) {
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pg->gate_owner == app_handle) return (pg);
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_gate_with_nopipes_by_owner
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the the first gate control block with no pipes
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  for the given owner
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the gate control block, or NULL if not found
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_GATE* nfa_hciu_find_gate_with_nopipes_by_owner(
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    tNFA_HANDLE app_handle) {
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg = nfa_hci_cb.cfg.dyn_gates;
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) {
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((pg->gate_owner == app_handle) && (pg->pipe_inx_mask == 0)) return (pg);
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_count_pipes_on_gate
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Count the number of pipes on the given gate
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          the number of pipes on the gate
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t nfa_hciu_count_pipes_on_gate(tNFA_HCI_DYN_GATE* p_gate) {
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t mask = 1;
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t count = 0;
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_PIPE_CB; xx++) {
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_gate->pipe_inx_mask & mask) count++;
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    mask = mask << 1;
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (count);
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_count_open_pipes_on_gate
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Count the number of opened pipes on the given gate
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          the number of pipes in OPENED state on the gate
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t nfa_hciu_count_open_pipes_on_gate(tNFA_HCI_DYN_GATE* p_gate) {
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp = nfa_hci_cb.cfg.dyn_pipes;
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx = 0;
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t mask = 1;
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t count = 0;
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) {
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* For each pipe on this gate, check if it is open */
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_gate->pipe_inx_mask & mask) &&
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->pipe_state == NFA_HCI_PIPE_OPENED))
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      count++;
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    mask = mask << 1;
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (count);
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_gate_owner
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the application that owns a gate
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          application handle
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HANDLE nfa_hciu_get_gate_owner(uint8_t gate_id) {
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1860c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  pg = nfa_hciu_find_gate_by_gid(gate_id);
1870c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (pg == NULL) return (NFA_HANDLE_INVALID);
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (pg->gate_owner);
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_pipe_owner
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the application that owns a pipe
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          application handle
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HANDLE nfa_hciu_get_pipe_owner(uint8_t pipe_id) {
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2050c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  pp = nfa_hciu_find_pipe_by_pid(pipe_id);
2060c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (pp == NULL) return (NFA_HANDLE_INVALID);
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2080c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  pg = nfa_hciu_find_gate_by_gid(pp->local_gate);
2090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (pg == NULL) return (NFA_HANDLE_INVALID);
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (pg->gate_owner);
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_alloc_gate
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allocate an gate control block
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the allocated gate, or NULL if cannot allocate
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_GATE* nfa_hciu_alloc_gate(uint8_t gate_id,
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                       tNFA_HANDLE app_handle) {
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t app_inx = app_handle & NFA_HANDLE_MASK;
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* First, check if the application handle is valid */
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((gate_id != NFA_HCI_CONNECTIVITY_GATE) &&
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (gate_id < NFA_HCI_FIRST_PROP_GATE) &&
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (((app_handle & NFA_HANDLE_GROUP_MASK) != NFA_HANDLE_GROUP_HCI) ||
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       (app_inx >= NFA_HCI_MAX_APP_CB) ||
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       (nfa_hci_cb.p_app_cback[app_inx] == NULL))) {
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NULL);
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (gate_id != 0) {
2390c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    pg = nfa_hciu_find_gate_by_gid(gate_id);
2400c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (pg != NULL) return (pg);
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If gate_id is 0, we need to assign a free one */
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Loop through all possible gate IDs checking if they are already used */
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (gate_id = NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE;
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         gate_id <= NFA_HCI_LAST_PROP_GATE; gate_id++) {
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Skip connectivity gate */
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (gate_id == NFA_HCI_CONNECTIVITY_GATE) gate_id++;
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Check if the gate is already allocated */
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_hciu_find_gate_by_gid(gate_id) == NULL) break;
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (gate_id > NFA_HCI_LAST_PROP_GATE) {
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_TRACE_ERROR2(
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "nfa_hci_alloc_gate - no free Gate ID: %u  App Handle: 0x%04x",
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          gate_id, app_handle);
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (NULL);
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Now look for a free control block */
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pg = nfa_hci_cb.cfg.dyn_gates; xx < NFA_HCI_MAX_GATE_CB;
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pg++) {
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pg->gate_id == 0) {
2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Found a free gate control block */
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pg->gate_id = gate_id;
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pg->gate_owner = app_handle;
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pg->pipe_inx_mask = 0;
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_TRACE_DEBUG2("nfa_hciu_alloc_gate id:%d  app_handle: 0x%04x", gate_id,
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                       app_handle);
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.nv_write_needed = true;
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (pg);
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, no free gate control block */
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_ERROR2(
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_hci_alloc_gate - no CB  Gate ID: %u  App Handle: 0x%04x", gate_id,
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      app_handle);
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_msg
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will fragment the given packet, if necessary
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  and send it on the given pipe.
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_msg(uint8_t pipe_id, uint8_t type,
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t instruction, uint16_t msg_len,
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t* p_msg) {
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_data;
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool first_pkt = true;
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t data_len;
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status = NFA_STATUS_OK;
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t max_seg_hcp_pkt_size = nfa_hci_cb.buff_size - NCI_DATA_HDR_SIZE;
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  char buff[100];
306df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG3(
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_hciu_send_msg pipe_id:%d   %s  len:%d", pipe_id,
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hciu_get_type_inst_names(pipe_id, type, instruction, buff), msg_len);
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG4("nfa_hciu_send_msg pipe_id:%d   Type: %u  Inst: %u  len: %d",
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   pipe_id, type, instruction, msg_len);
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (instruction == NFA_HCI_ANY_GET_PARAMETER)
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hci_cb.param_in_use = *p_msg;
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while ((first_pkt == true) || (msg_len != 0)) {
3190c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    p_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3200c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (p_buf != NULL) {
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* First packet has a 2-byte header, subsequent fragments have a 1-byte
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * header */
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      data_len =
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          first_pkt ? (max_seg_hcp_pkt_size - 2) : (max_seg_hcp_pkt_size - 1);
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data = (uint8_t*)(p_buf + 1) + p_buf->offset;
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Last or only segment has "no fragmentation" bit set */
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (msg_len > data_len) {
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data++ = (NFA_HCI_MESSAGE_FRAGMENTATION << 7) | (pipe_id & 0x7F);
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        data_len = msg_len;
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data++ = (NFA_HCI_NO_MESSAGE_FRAGMENTATION << 7) | (pipe_id & 0x7F);
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->len = 1;
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Message header only goes in the first segment */
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (first_pkt) {
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        first_pkt = false;
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data++ = (type << 6) | instruction;
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len++;
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (data_len != 0) {
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy(p_data, p_msg, data_len);
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len += data_len;
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        msg_len -= data_len;
3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (msg_len > 0) p_msg += data_len;
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      DispHcp(((uint8_t*)(p_buf + 1) + p_buf->offset), p_buf->len, false,
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (bool)((p_buf->len - data_len) == 2));
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (HCI_LOOPBACK_DEBUG)
3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        handle_debug_loopback(p_buf, pipe_id, type, instruction);
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = NFC_SendData(nfa_hci_cb.conn_id, p_buf);
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_TRACE_ERROR0("nfa_hciu_send_data_packet no buffers");
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFA_STATUS_NO_BUFFERS;
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Start timer if response to wait for a particular time for the response  */
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (type == NFA_HCI_COMMAND_TYPE) {
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hci_cb.cmd_sent = instruction;
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.hci_state == NFA_HCI_STATE_IDLE)
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_RSP;
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_sys_start_timer(&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT,
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        p_nfa_hci_cfg->hcp_response_timeout);
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_allocated_gate_list
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      fills in a list of allocated gates
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          the number of gates
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t nfa_hciu_get_allocated_gate_list(uint8_t* p_gate_list) {
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* p_cb;
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t count = 0;
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, p_cb = nfa_hci_cb.cfg.dyn_gates; xx < NFA_HCI_MAX_GATE_CB;
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, p_cb++) {
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->gate_id != 0) {
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_gate_list++ = p_cb->gate_id;
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      count++;
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_get_allocated_gate_list () returns: %u", count);
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (count);
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_alloc_pipe
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Allocate a pipe control block
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the pipe control block, or NULL if
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  cannot allocate
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_alloc_pipe(uint8_t pipe_id) {
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If we already have a pipe of the same ID, release it first it */
4270c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  pp = nfa_hciu_find_pipe_by_pid(pipe_id);
4280c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (pp != NULL) {
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE) return pp;
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hciu_release_pipe(pipe_id);
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Look for a free pipe control block */
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pp->pipe_id == 0) {
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_TRACE_DEBUG2("nfa_hciu_alloc_pipe:%d, index:%d", pipe_id, xx);
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pp->pipe_id = pipe_id;
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.nv_write_needed = true;
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (pp);
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_alloc_pipe:%d, NO free entries !!", pipe_id);
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_release_gate
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Remove a generic gate from gate list
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hciu_release_gate(uint8_t gate_id) {
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* p_gate = nfa_hciu_find_gate_by_gid(gate_id);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_gate != NULL) {
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_DEBUG3(
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "nfa_hciu_release_gate () ID: %d  owner: 0x%04x  pipe_inx_mask: 0x%04x",
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        gate_id, p_gate->gate_owner, p_gate->pipe_inx_mask);
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_gate->gate_id = 0;
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_gate->gate_owner = 0;
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_gate->pipe_inx_mask = 0;
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hci_cb.nv_write_needed = true;
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_WARNING1("nfa_hciu_release_gate () ID: %d  NOT FOUND", gate_id);
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_add_pipe_to_gate
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Add pipe to generic gate
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK, if successfully add the pipe on to the gate
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFA_HCI_ADM_E_NO_PIPES_AVAILABLE, otherwise
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_RESPONSE nfa_hciu_add_pipe_to_gate(uint8_t pipe_id, uint8_t local_gate,
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                            uint8_t dest_host,
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                            uint8_t dest_gate) {
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* p_gate;
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* p_pipe;
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t pipe_index;
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_gate = nfa_hciu_find_gate_by_gid(local_gate);
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_gate != NULL) {
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Allocate a pipe control block */
4970c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    p_pipe = nfa_hciu_alloc_pipe(pipe_id);
4980c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (p_pipe != NULL) {
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->pipe_id = pipe_id;
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED;
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->dest_host = dest_host;
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->dest_gate = dest_gate;
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->local_gate = local_gate;
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Save the pipe in the gate that it belongs to */
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pipe_index = (uint8_t)(p_pipe - nfa_hci_cb.cfg.dyn_pipes);
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_gate->pipe_inx_mask |= (uint32_t)(1 << pipe_index);
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_TRACE_DEBUG4(
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "nfa_hciu_add_pipe_to_gate  Gate ID: 0x%02x  Pipe ID: 0x%02x  "
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "pipe_index: %u  App Handle: 0x%08x",
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          local_gate, pipe_id, pipe_index, p_gate->gate_owner);
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (NFA_HCI_ANY_OK);
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_add_pipe_to_gate: 0x%02x  NOT FOUND", local_gate);
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NFA_HCI_ADM_E_NO_PIPES_AVAILABLE);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_add_pipe_to_static_gate
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Add pipe to identity management gate
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_HCI_ANY_OK, if successfully add the pipe on to the gate
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFA_HCI_ADM_E_NO_PIPES_AVAILABLE, otherwise
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_RESPONSE nfa_hciu_add_pipe_to_static_gate(uint8_t local_gate,
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                   uint8_t pipe_id,
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                   uint8_t dest_host,
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                   uint8_t dest_gate) {
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* p_pipe;
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t pipe_index;
5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_EVENT4(
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_hciu_add_pipe_to_static_gate (%u)  Pipe: 0x%02x  Dest Host: 0x%02x  "
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "Dest Gate: 0x%02x)",
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_gate, pipe_id, dest_host, dest_gate);
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Allocate a pipe control block */
5450c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  p_pipe = nfa_hciu_alloc_pipe(pipe_id);
5460c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (p_pipe != NULL) {
5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_pipe->pipe_id = pipe_id;
5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_pipe->pipe_state = NFA_HCI_PIPE_CLOSED;
5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_pipe->dest_host = dest_host;
5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_pipe->dest_gate = dest_gate;
5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_pipe->local_gate = local_gate;
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If this is the ID gate, save the pipe index in the ID gate info     */
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* block. Note that for loopback, it is enough to just create the pipe */
5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) {
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pipe_index = (uint8_t)(p_pipe - nfa_hci_cb.cfg.dyn_pipes);
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask |= (uint32_t)(1 << pipe_index);
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFA_HCI_ANY_OK;
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFA_HCI_ADM_E_NO_PIPES_AVAILABLE;
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_active_pipe_by_owner
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the first pipe associated with the given app
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to pipe, or NULL if none found
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_find_active_pipe_by_owner(tNFA_HANDLE app_handle) {
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_by_owner () app_handle:0x%x",
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   app_handle);
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through all pipes looking for the owner */
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((pp->pipe_id != 0) && (pp->pipe_id >= NFA_HCI_FIRST_DYNAMIC_PIPE) &&
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->pipe_id <= NFA_HCI_LAST_DYNAMIC_PIPE) &&
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_hciu_is_active_host(pp->dest_host))) {
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (((pg = nfa_hciu_find_gate_by_gid(pp->local_gate)) != NULL) &&
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (pg->gate_owner == app_handle))
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return (pp);
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
600a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function         nfa_hciu_check_pipe_between_gates
601a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
602a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description      Check if there is a pipe between specified Terminal host
603a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**                  gate and and the specified UICC gate
604a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
605a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns          TRUE, if there exists a pipe between the two specified gated
606a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**                  FALSE, otherwise
607a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
608a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_hciu_check_pipe_between_gates(uint8_t local_gate, uint8_t dest_host,
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                       uint8_t dest_gate) {
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG3(
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_hciu_check_pipe_between_gates () Local gate: 0x%02X, Host[0x%02X] "
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "gate: 0x%02X",
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_gate, dest_host, dest_gate);
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through all pipes looking for the owner */
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((pp->pipe_id != 0) && (pp->pipe_id >= NFA_HCI_FIRST_DYNAMIC_PIPE) &&
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->pipe_id <= NFA_HCI_LAST_DYNAMIC_PIPE) &&
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->local_gate == local_gate) && (pp->dest_host == dest_host) &&
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->dest_gate == dest_gate)) {
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
627a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
629a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return false;
632a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu}
633a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
634a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/*******************************************************************************
635a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_pipe_by_owner
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the first pipe associated with the given app
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to pipe, or NULL if none found
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_find_pipe_by_owner(tNFA_HANDLE app_handle) {
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_by_owner () app_handle:0x%x",
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   app_handle);
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through all pipes looking for the owner */
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pp->pipe_id != 0) {
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (((pg = nfa_hciu_find_gate_by_gid(pp->local_gate)) != NULL) &&
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (pg->gate_owner == app_handle))
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return (pp);
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_pipe_on_gate
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the first pipe associated with the given gate
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to pipe, or NULL if none found
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_find_pipe_on_gate(uint8_t gate_id) {
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_on_gate () Gate:0x%x", gate_id);
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through all pipes looking for the owner */
6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (pp->pipe_id != 0) {
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (((pg = nfa_hciu_find_gate_by_gid(pp->local_gate)) != NULL) &&
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (pg->gate_id == gate_id))
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return (pp);
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_is_active_host
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if the host is currently active
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if the host is active in the host network
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, if the host is not active in the host network
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_hciu_is_active_host(uint8_t host_id) {
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) {
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.inactive_host[xx] == host_id) return false;
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_is_host_reseting
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if the host is currently reseting
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if the host is reseting
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, if the host is not reseting
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_hciu_is_host_reseting(uint8_t host_id) {
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) {
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.reset_host[xx] == host_id) return true;
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return false;
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_is_no_host_resetting
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if no host is reseting
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if no host is resetting at this time
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, if one or more host is resetting
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_hciu_is_no_host_resetting(void) {
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) {
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.reset_host[xx] != 0) return false;
7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_find_active_pipe_on_gate
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the first active pipe associated with the given gate
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to pipe, or NULL if none found
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_DYN_PIPE* nfa_hciu_find_active_pipe_on_gate(uint8_t gate_id) {
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_find_active_pipe_on_gate () Gate:0x%x", gate_id);
7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Loop through all pipes looking for the owner */
7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((pp->pipe_id != 0) && (pp->pipe_id >= NFA_HCI_FIRST_DYNAMIC_PIPE) &&
7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (pp->pipe_id <= NFA_HCI_LAST_DYNAMIC_PIPE) &&
7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_hciu_is_active_host(pp->dest_host))) {
7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (((pg = nfa_hciu_find_gate_by_gid(pp->local_gate)) != NULL) &&
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (pg->gate_id == gate_id))
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return (pp);
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If here, not found */
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (NULL);
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_release_pipe
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      remove the specified pipe
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_HCI_ANY_OK, if removed
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFA_HCI_ANY_E_NOK, if otherwise
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_HCI_RESPONSE nfa_hciu_release_pipe(uint8_t pipe_id) {
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* p_gate;
7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* p_pipe;
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t pipe_index;
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_EVENT1("nfa_hciu_release_pipe: %u", pipe_id);
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8040c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  p_pipe = nfa_hciu_find_pipe_by_pid(pipe_id);
8050c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (p_pipe == NULL) return (NFA_HCI_ANY_E_NOK);
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE) {
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_DEBUG1("ignore pipe: %d", pipe_id);
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFA_HCI_ANY_E_NOK);
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pipe_index = (uint8_t)(p_pipe - nfa_hci_cb.cfg.dyn_pipes);
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_pipe->local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE) {
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Remove pipe from ID management gate */
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask &= ~(uint32_t)(1 << pipe_index);
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8180c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    p_gate = nfa_hciu_find_gate_by_gid(p_pipe->local_gate);
8190c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (p_gate == NULL) {
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Mark the pipe control block as free */
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_pipe->pipe_id = 0;
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (NFA_HCI_ANY_E_NOK);
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Remove pipe from gate */
8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_gate->pipe_inx_mask &= ~(uint32_t)(1 << pipe_index);
8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Reset pipe control block */
8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(p_pipe, 0, sizeof(tNFA_HCI_DYN_PIPE));
8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_hci_cb.nv_write_needed = true;
8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFA_HCI_ANY_OK;
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_remove_all_pipes_from_host
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      remove all the pipes that are connected to a specific host
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hciu_remove_all_pipes_from_host(uint8_t host) {
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_GATE* pg;
8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* pp;
8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_EVT_DATA evt_data;
8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_EVENT1("nfa_hciu_remove_all_pipes_from_host (0x%02x)", host);
8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Remove all pipes from the specified host connected to all generic gates */
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xx++, pp++) {
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((pp->pipe_id == 0) ||
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((host != 0) && ((pp->dest_host != host) ||
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                         (pp->pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE))))
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      continue;
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8600c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    pg = nfa_hciu_find_gate_by_gid(pp->local_gate);
8610c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (pg != NULL) {
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.deleted.status = NFA_STATUS_OK;
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.deleted.pipe = pp->pipe_id;
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hciu_send_to_app(NFA_HCI_DELETE_PIPE_EVT, &evt_data, pg->gate_owner);
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hciu_release_pipe(pp->pipe_id);
8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_create_pipe_cmd
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Create dynamic pipe between the specified gates
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_create_pipe_cmd(uint8_t source_gate,
8816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                          uint8_t dest_host,
8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                          uint8_t dest_gate) {
8836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t data[3];
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  data[0] = source_gate;
8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  data[1] = dest_host;
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  data[2] = dest_gate;
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG3(
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "nfa_hciu_send_create_pipe_cmd source_gate:%d, dest_host:%d, "
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "dest_gate:%d",
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      source_gate, dest_host, dest_gate);
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = nfa_hciu_send_msg(NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE,
8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             NFA_HCI_ADM_CREATE_PIPE, 3, data);
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_delete_pipe_cmd
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Delete the dynamic pipe
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_delete_pipe_cmd(uint8_t pipe) {
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG1("nfa_hciu_send_delete_pipe_cmd: %d", pipe);
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (pipe > NFA_HCI_LAST_DYNAMIC_PIPE) {
9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_DEBUG1("ignore pipe: %d", pipe);
9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFA_HCI_ANY_E_NOK);
9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_hci_cb.pipe_in_use = pipe;
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = nfa_hciu_send_msg(NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE,
9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             NFA_HCI_ADM_DELETE_PIPE, 1, &pipe);
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_clear_all_pipe_cmd
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      delete all the dynamic pipe connected to device host,
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  to close all static pipes connected to device host,
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  and to set registry values related to static pipes to
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  theri default values.
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_clear_all_pipe_cmd(void) {
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t id_ref_data = 0x0102;
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFA_TRACE_DEBUG0("nfa_hciu_send_clear_all_pipe_cmd");
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status =
9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hciu_send_msg(NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE,
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        NFA_HCI_ADM_CLEAR_ALL_PIPE, 2, (uint8_t*)&id_ref_data);
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_open_pipe_cmd
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Open a closed pipe
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_open_pipe_cmd(uint8_t pipe) {
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_hci_cb.pipe_in_use = pipe;
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = nfa_hciu_send_msg(pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_OPEN_PIPE,
9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             0, NULL);
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_close_pipe_cmd
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Close an opened pipe
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_close_pipe_cmd(uint8_t pipe) {
9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_hci_cb.pipe_in_use = pipe;
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = nfa_hciu_send_msg(pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_CLOSE_PIPE,
9876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             0, NULL);
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_get_param_cmd
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read a parameter value from gate registry
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_get_param_cmd(uint8_t pipe, uint8_t index) {
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10040c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = nfa_hciu_send_msg(pipe, NFA_HCI_COMMAND_TYPE,
10050c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi                             NFA_HCI_ANY_GET_PARAMETER, 1, &index);
10060c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) nfa_hci_cb.param_in_use = index;
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_set_param_cmd
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set a parameter value in a gate registry
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_hciu_send_set_param_cmd(uint8_t pipe, uint8_t index,
10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        uint8_t length, uint8_t* p_data) {
10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS status;
10236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t data[255];
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  data[0] = index;
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(&data[1], p_data, length);
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10290c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status =
10300c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      nfa_hciu_send_msg(pipe, NFA_HCI_COMMAND_TYPE, NFA_HCI_ANY_SET_PARAMETER,
10310c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi                        (uint16_t)(length + 1), data);
10320c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) nfa_hci_cb.param_in_use = index;
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_to_app
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send an event back to an application
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hciu_send_to_app(tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* p_evt,
10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          tNFA_HANDLE app_handle) {
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t app_inx = app_handle & NFA_HANDLE_MASK;
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* First, check if the application handle is valid */
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (((app_handle & NFA_HANDLE_GROUP_MASK) == NFA_HANDLE_GROUP_HCI) &&
10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (app_inx < NFA_HCI_MAX_APP_CB)) {
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.p_app_cback[app_inx] != NULL) {
10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.p_app_cback[app_inx](event, p_evt);
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (app_handle != NFA_HANDLE_INVALID) {
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_TRACE_WARNING2(
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "nfa_hciu_send_to_app no callback,  event: 0x%04x  app_handle: 0x%04x",
10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event, app_handle);
10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_to_all_apps
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send an event back to all applications
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hciu_send_to_all_apps(tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* p_evt) {
10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t app_inx;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (app_inx = 0; app_inx < NFA_HCI_MAX_APP_CB; app_inx++) {
10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_hci_cb.p_app_cback[app_inx] != NULL)
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.p_app_cback[app_inx](event, p_evt);
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_send_to_apps_handling_connectivity_evts
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send a connectivity event to all the application interested
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  in connectivity events
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hciu_send_to_apps_handling_connectivity_evts(
10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* p_evt) {
10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t app_inx;
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (app_inx = 0; app_inx < NFA_HCI_MAX_APP_CB; app_inx++) {
10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((nfa_hci_cb.p_app_cback[app_inx] != NULL) &&
11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_hci_cb.cfg.b_send_conn_evts[app_inx]))
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_hci_cb.p_app_cback[app_inx](event, p_evt);
11036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_response_name
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the error code name.
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_get_response_name(uint8_t rsp_code) {
11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (rsp_code) {
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_OK:
11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_OK");
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_NOT_CONNECTED:
11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_NOT_CONNECTED");
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_CMD_PAR_UNKNOWN:
11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_CMD_PAR_UNKNOWN");
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_NOK:
11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_NOK");
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_E_NO_PIPES_AVAILABLE:
11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_E_NO_PIPES_AVAILABLE");
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_REG_PAR_UNKNOWN:
11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_REG_PAR_UNKNOWN");
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_PIPE_NOT_OPENED:
11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_PIPE_NOT_OPENED");
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_CMD_NOT_SUPPORTED:
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_CMD_NOT_SUPPORTED");
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_INHIBITED:
11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_INHIBITED");
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_TIMEOUT:
11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_TIMEOUT");
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_REG_ACCESS_DENIED:
11416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_REG_ACCESS_DENIED");
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_E_PIPE_ACCESS_DENIED:
11436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_E_PIPE_ACCESS_DENIED");
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
11456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
11466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_type_2_str
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the type name.
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_type_2_str(uint8_t type) {
11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (type) {
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_COMMAND_TYPE:
11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("COMMAND");
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_EVENT_TYPE:
11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("EVENT");
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_RESPONSE_TYPE:
11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("RESPONSE");
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_instr_2_str
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the instruction name.
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_instr_2_str(uint8_t instruction) {
11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (instruction) {
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_SET_PARAMETER:
11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_SET_PARAMETER");
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_GET_PARAMETER:
11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_GET_PARAMETER");
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_OPEN_PIPE:
11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_OPEN_PIPE");
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ANY_CLOSE_PIPE:
11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ANY_CLOSE_PIPE");
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_CREATE_PIPE:
11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_CREATE_PIPE");
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_DELETE_PIPE:
11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_DELETE_PIPE");
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_NOTIFY_PIPE_CREATED:
11956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_NOTIFY_PIPE_CREATED");
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_NOTIFY_PIPE_DELETED:
11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_NOTIFY_PIPE_DELETED");
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_CLEAR_ALL_PIPE:
11996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_CLEAR_ALL_PIPE");
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED:
12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("ADM_NOTIFY_ALL_PIPE_CLEARED");
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_event_name
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the event code name.
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_get_event_name(uint16_t event) {
12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_REGISTER_APP_EVT:
12196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_REGISTER");
12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_DEREGISTER_APP_EVT:
12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_DEREGISTER");
12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_GET_APP_GATE_PIPE_EVT:
12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_GET_GATE_LIST");
12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_ALLOC_GATE_EVT:
12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_ALLOC_GATE");
12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_DEALLOC_GATE_EVT:
12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_DEALLOC_GATE");
12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_GET_HOST_LIST_EVT:
12296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_GET_HOST_LIST");
12306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_GET_REGISTRY_EVT:
12316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_GET_REG_VALUE");
12326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_SET_REGISTRY_EVT:
12336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_SET_REG_VALUE");
12346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_CREATE_PIPE_EVT:
12356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_CREATE_PIPE");
12366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_OPEN_PIPE_EVT:
12376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_OPEN_PIPE");
12386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_CLOSE_PIPE_EVT:
12396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_CLOSE_PIPE");
12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_DELETE_PIPE_EVT:
12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_DELETE_PIPE");
12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_SEND_CMD_EVT:
12436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_SEND_COMMAND_EVT");
12446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_SEND_RSP_EVT:
12456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_SEND_RESPONSE_EVT");
12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_API_SEND_EVENT_EVT:
12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("API_SEND_EVENT_EVT");
12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_RSP_NV_READ_EVT:
12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("NV_READ_EVT");
12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_RSP_NV_WRITE_EVT:
12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("NV_WRITE_EVT");
12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_RSP_TIMEOUT_EVT:
12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("RESPONSE_TIMEOUT_EVT");
12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_CHECK_QUEUE_EVT:
12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("CHECK_QUEUE");
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_state_name
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the state name.
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_get_state_name(uint8_t state) {
12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (state) {
12736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_DISABLED:
12746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("DISABLED");
12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_STARTUP:
12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("STARTUP");
12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("WAIT_NETWK_ENABLE");
12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_IDLE:
12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("IDLE");
12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_WAIT_RSP:
12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("WAIT_RSP");
12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_REMOVE_GATE:
12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("REMOVE_GATE");
12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_APP_DEREGISTER:
12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("APP_DEREGISTER");
12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_RESTORE:
12886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("RESTORE");
12896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NFA_HCI_STATE_RESTORE_NETWK_ENABLE:
12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("WAIT_NETWK_ENABLE_AFTER_RESTORE");
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_hciu_get_type_inst_names
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns command/response/event name.
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1303df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu** Returns          none
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_get_type_inst_names(uint8_t pipe, uint8_t type, uint8_t inst,
13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                   char* p_buff) {
13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  xx = sprintf(p_buff, "Type: %s [0x%02x] ", nfa_hciu_type_2_str(type), type);
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (type) {
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_COMMAND_TYPE:
13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      sprintf(&p_buff[xx], "Inst: %s [0x%02x] ", nfa_hciu_instr_2_str(inst),
13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              inst);
13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_EVENT_TYPE:
13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      sprintf(&p_buff[xx], "Evt: %s [0x%02x] ", nfa_hciu_evt_2_str(pipe, inst),
13196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              inst);
13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_RESPONSE_TYPE:
13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      sprintf(&p_buff[xx], "Resp: %s [0x%02x] ",
13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              nfa_hciu_get_response_name(inst), inst);
13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      sprintf(&p_buff[xx], "Inst: %u ", inst);
13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
13296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (p_buff);
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1334df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu** Function         nfa_hciu_evt_2_str
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1336df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu** Description      This function returns the event name.
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoichar* nfa_hciu_evt_2_str(uint8_t pipe_id, uint8_t evt) {
13426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HCI_DYN_PIPE* p_pipe;
13436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((pipe_id != NFA_HCI_ADMIN_PIPE) &&
13456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (pipe_id != NFA_HCI_LINK_MANAGEMENT_PIPE) &&
13466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_pipe = nfa_hciu_find_pipe_by_pid(pipe_id)) != NULL)) {
13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_pipe->local_gate == NFA_HCI_CONNECTIVITY_GATE) {
13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      switch (evt) {
13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case NFA_HCI_EVT_CONNECTIVITY:
13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return ("EVT_CONNECTIVITY");
13516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case NFA_HCI_EVT_TRANSACTION:
13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return ("EVT_TRANSACTION");
13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case NFA_HCI_EVT_OPERATION_ENDED:
13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return ("EVT_OPERATION_ENDED");
13556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        default:
13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return ("UNKNOWN");
13576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
13596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (evt) {
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_EVT_HCI_END_OF_OPERATION:
13636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("EVT_END_OF_OPERATION");
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_EVT_POST_DATA:
13656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("EVT_POST_DATA");
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_HCI_EVT_HOT_PLUG:
13676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("EVT_HOT_PLUG");
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("UNKNOWN");
13706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void handle_debug_loopback(NFC_HDR* p_buf, uint8_t pipe, uint8_t type,
13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  uint8_t instruction) {
13766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = (uint8_t*)(p_buf + 1) + p_buf->offset;
13776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  static uint8_t next_pipe = 0x10;
13786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (type == NFA_HCI_COMMAND_TYPE) {
13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (instruction) {
13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case NFA_HCI_ADM_CREATE_PIPE:
13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[6] = next_pipe++;
13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[5] = p[4];
13846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[4] = p[3];
13856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[3] = p[2];
13866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[2] = 3;
13876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK;
13886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len = p_buf->offset + 7;
13896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case NFA_HCI_ANY_GET_PARAMETER:
13926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK;
13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy(&p[2], (uint8_t*)nfa_hci_cb.cfg.admin_gate.session_id,
13946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               NFA_HCI_SESSION_ID_LEN);
13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len = p_buf->offset + 2 + NFA_HCI_SESSION_ID_LEN;
13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      default:
13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p[1] = (NFA_HCI_RESPONSE_TYPE << 6) | NFA_HCI_ANY_OK;
14006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len = p_buf->offset + 2;
14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
14036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (type == NFA_HCI_RESPONSE_TYPE) {
14046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_buf);
14056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
14066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_buf->event = NFA_HCI_CHECK_QUEUE_EVT;
14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_sys_sendmsg(p_buf);
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1411