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