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 * NFA interface to HCI 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 248a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h> 258a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h> 268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_hci_api.h" 286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_hci_defs.h" 296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfa_hci_int.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 318a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf; 328a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 338a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled; 348a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciRegister 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will register an application with hci and 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** returns an application handle and provides a mechanism to 41552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** register a callback with HCI to receive NFA HCI event 42552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** notification. When the application is registered (or if an 43552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** error occurs), the app will be notified with 44552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NFA_HCI_REGISTER_EVT. Previous session information including 45552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** allocated gates, created pipes and pipes states will be 46552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** returned as part of tNFA_HCI_REGISTER data. 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 526fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciRegister(char* p_app_name, tNFA_HCI_CBACK* p_cback, 536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool b_send_conn_evts) { 546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_REGISTER_APP* p_msg; 556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t app_name_len; 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_app_name == NULL) { 586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Application name"); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cback == NULL) { 646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "Application should provide callback function to " 666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "register!"); 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Application Name: %s", p_app_name); 726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi app_name_len = (uint8_t)strlen(p_app_name); 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Register the application with HCI */ 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_app_name != NULL) && (app_name_len <= NFA_MAX_HCI_APP_NAME_LEN) && 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_REGISTER_APP*)GKI_getbuf( 796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_REGISTER_APP))) != NULL)) { 806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_REGISTER_APP_EVT; 816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Save application name and callback */ 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(p_msg->app_name, 0, sizeof(p_msg->app_name)); 846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi strncpy(p_msg->app_name, p_app_name, NFA_MAX_HCI_APP_NAME_LEN); 856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->p_cback = p_cback; 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->b_send_conn_evts = b_send_conn_evts; 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciGetGateAndPipeList 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will get the list of gates allocated to the 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application and list of dynamic pipes created by the 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application. The app will be notified with 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_GET_GATE_PIPE_LIST_EVT. List of allocated dynamic 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** gates to the application and list of pipes created by the 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application will be returned as part of 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tNFA_HCI_GET_GATE_PIPE_LIST data. 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciGetGateAndPipeList(tNFA_HANDLE hci_handle) { 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_GET_APP_GATE_PIPE* p_msg; 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 1156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 1166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1206767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 1216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x", hci_handle); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Register the application with HCI */ 1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_GET_APP_GATE_PIPE*)GKI_getbuf( 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_GET_APP_GATE_PIPE))) != NULL)) { 1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_GET_APP_GATE_PIPE_EVT; 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciDeregister 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to deregister an application 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** from HCI. The app will be notified by NFA_HCI_DEREGISTER_EVT 143552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** after deleting all the pipes owned by the app and 144552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** deallocating all the gates allocated to the app or if an 145552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** error occurs. Even if deregistration fails, the app has to 146552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** register again to provide a new cback function. 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 148552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Returns NFA_STATUS_OK if the application is deregistered 149552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** successfully 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciDeregister(char* p_app_name) { 1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_DEREGISTER_APP* p_msg; 1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int xx; 1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t app_name_len; 1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_app_name == NULL) { 1596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Invalid Application"); 1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 1646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Application Name: %s", p_app_name); 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi app_name_len = (uint8_t)strlen(p_app_name); 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (app_name_len > NFA_MAX_HCI_APP_NAME_LEN) return (NFA_STATUS_FAILED); 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Find the application registration */ 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) { 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) && 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (!strncmp(p_app_name, &nfa_hci_cb.cfg.reg_app_names[xx][0], 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi app_name_len))) 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (xx == NFA_HCI_MAX_APP_CB) { 1786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("Application Name: %s NOT FOUND", p_app_name); 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Deregister the application with HCI */ 1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_DEREGISTER_APP*)GKI_getbuf( 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_DEREGISTER_APP))) != NULL)) { 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_DEREGISTER_APP_EVT; 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(p_msg->app_name, 0, sizeof(p_msg->app_name)); 1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi strncpy(p_msg->app_name, p_app_name, NFA_MAX_HCI_APP_NAME_LEN); 1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciAllocGate 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 202a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description This function will allocate the gate if any specified or an 203a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** available generic gate for the app to provide an entry point 204a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** for a particular service to other host or to establish 205a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** communication with other host. When the gate is 206a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** allocated (or if an error occurs), the app will be notified 207552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** with NFA_HCI_ALLOCATE_GATE_EVT with the gate id. The 208552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** allocated Gate information will be stored in non volatile 209552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** memory. 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if this API started 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED if no generic gate is available 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciAllocGate(tNFA_HANDLE hci_handle, uint8_t gate) { 2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_ALLOC_GATE* p_msg; 2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 2196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2206767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((gate) && ((gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) || 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (gate > NFA_HCI_LAST_PROP_GATE) || 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (gate == NFA_HCI_CONNECTIVITY_GATE))) { 2276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Cannot allocate gate:0x%02x", gate); 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2336767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, Gate:0x%02x", hci_handle, gate); 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to allocate gate to the application */ 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_ALLOC_GATE*)GKI_getbuf( 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_ALLOC_GATE))) != NULL)) { 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_ALLOC_GATE_EVT; 2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->gate = gate; 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciDeallocGate 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will release the specified gate that was 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** previously allocated to the application. When the generic 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** gate is released (or if an error occurs), the app will be 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notified with NFA_HCI_DEALLOCATE_GATE_EVT with the gate id. 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciDeallocGate(tNFA_HANDLE hci_handle, uint8_t gate) { 2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_DEALLOC_GATE* p_msg; 2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 2666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) || 2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (gate > NFA_HCI_LAST_PROP_GATE) || (gate == NFA_HCI_CONNECTIVITY_GATE)) { 2736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Cannot deallocate the gate:0x%02x", gate); 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, gate:0x%02X", hci_handle, gate); 2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to deallocate the gate that was previously allocated to the 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * application */ 2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_DEALLOC_GATE*)GKI_getbuf( 2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_DEALLOC_GATE))) != NULL)) { 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_DEALLOC_GATE_EVT; 2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->gate = gate; 2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciGetHostList 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will request the host controller to return the 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** list of hosts that are present in the host network. When 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** host controller responds with the host list (or if an error 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** occurs), the app will be notified with NFA_HCI_HOST_LIST_EVT 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciGetHostList(tNFA_HANDLE hci_handle) { 3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_GET_HOST_LIST* p_msg; 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 3136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x", hci_handle); 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to get list of host in the hci network */ 3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_GET_HOST_LIST*)GKI_getbuf( 3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_GET_HOST_LIST))) != NULL)) { 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_GET_HOST_LIST_EVT; 3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciCreatePipe 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to create a dynamic pipe with the 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** specified host. When the dynamic pipe is created (or 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** if an error occurs), the app will be notified with 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_CREATE_PIPE_EVT with the pipe id. If a pipe exists 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** between the two gates passed as argument and if it was 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** created earlier by the calling application then the pipe 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** id of the existing pipe will be returned and a new pipe 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** will not be created. After successful creation of pipe, 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** registry entry will be created for the dynamic pipe and 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** all information related to the pipe will be stored in non 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** volatile memory. 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciCreatePipe(tNFA_HANDLE hci_handle, uint8_t source_gate_id, 3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t dest_host, uint8_t dest_gate) { 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_CREATE_PIPE_EVT* p_msg; 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx; 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 3616767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "hci_handle:0x%04x, source gate:0x%02X, " 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "destination host:0x%02X , destination gate:0x%02X", 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi hci_handle, source_gate_id, dest_host, dest_gate); 3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 3666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((source_gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) || 3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (source_gate_id > NFA_HCI_LAST_PROP_GATE)) { 3736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid local Gate:0x%02x", source_gate_id); 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (((dest_gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) && 3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (dest_gate != NFA_HCI_LOOP_BACK_GATE) && 3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (dest_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) || 3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (dest_gate > NFA_HCI_LAST_PROP_GATE)) { 3826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3836767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Destination Gate:0x%02x", dest_gate); 3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) 3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_hci_cb.inactive_host[xx] == dest_host) break; 3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (xx != NFA_HCI_MAX_HOST_IN_NETWORK) { 3916767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Host not active:0x%02x", dest_host); 3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to create a pipe between two specified gates */ 3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (!nfa_hci_cb.b_low_power_mode) && 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_CREATE_PIPE_EVT*)GKI_getbuf( 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_CREATE_PIPE_EVT))) != NULL)) { 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_CREATE_PIPE_EVT; 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->source_gate = source_gate_id; 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->dest_host = dest_host; /* Host id of the destination host */ 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->dest_gate = dest_gate; /* Gate id of the destination gate */ 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciOpenPipe 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to open a dynamic pipe. 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the dynamic pipe is opened (or 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** if an error occurs), the app will be notified with 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_OPEN_PIPE_EVT with the pipe id. 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciOpenPipe(tNFA_HANDLE hci_handle, uint8_t pipe) { 4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_OPEN_PIPE_EVT* p_msg; 4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 4306767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4316767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) || 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) { 4376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe); 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to open a pipe if it is in closed state */ 4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (!nfa_hci_cb.b_low_power_mode) && 4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_OPEN_PIPE_EVT*)GKI_getbuf( 4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_OPEN_PIPE_EVT))) != NULL)) { 4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_OPEN_PIPE_EVT; 4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; /* Pipe ID of the pipe to open */ 4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciGetRegistry 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function requests a peer host to return the desired 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** registry field value for the gate that the pipe is on. 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the peer host responds,the app is notified with 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_GET_REG_RSP_EVT or 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** if an error occurs in sending the command the app will be 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notified by NFA_HCI_CMD_SENT_EVT 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciGetRegistry(tNFA_HANDLE hci_handle, uint8_t pipe, 4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t reg_inx) { 4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_GET_REGISTRY* p_msg; 4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 4816767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) { 4876767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x Pipe: 0x%02x", hci_handle, pipe); 4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to get list of gates supported by the specified host */ 4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_GET_REGISTRY*)GKI_getbuf( 4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_GET_REGISTRY))) != NULL)) { 4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_GET_REGISTRY_EVT; 5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->reg_inx = reg_inx; 5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciSendCommand 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to send a command on a pipe created 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** by the application. 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The app will be notified by NFA_HCI_CMD_SENT_EVT if an error 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** occurs. 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the peer host responds,the app is notified with 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_RSP_RCVD_EVT 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciSendCommand(tNFA_HANDLE hci_handle, uint8_t pipe, 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t cmd_code, uint16_t cmd_size, 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_SEND_CMD_EVT* p_msg; 5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 5326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5336767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) { 5386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5396767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((cmd_size && (p_data == NULL)) || (cmd_size > NFA_MAX_HCI_CMD_LEN)) { 5446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid cmd size:0x%02x", cmd_size); 5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02x Code: 0x%02x", 5516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi hci_handle, pipe, cmd_code); 5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to post event data on a particular pipe */ 5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_SEND_CMD_EVT*)GKI_getbuf( 5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_SEND_CMD_EVT))) != NULL)) { 5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_SEND_CMD_EVT; 5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->cmd_code = cmd_code; 5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->cmd_len = cmd_size; 5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (cmd_size) memcpy(p_msg->data, p_data, cmd_size); 5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciSendEvent 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to send any event on a pipe created 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** by the application. 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The app will be notified by NFA_HCI_EVENT_SENT_EVT 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** after successfully sending the event on the specified pipe 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or if an error occurs. The application should wait for this 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** event before releasing event buffer passed as argument. 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** If the app is expecting a response to the event then it can 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** provide response buffer for collecting the response. If it 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** provides a response buffer it can also provide response 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** timeout indicating maximum timeout for the response. 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Maximum of NFA_MAX_HCI_EVENT_LEN bytes APDU can be received 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** using internal buffer if no response buffer is provided by 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the application. The app will be notified by 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_EVENT_RCVD_EVT after receiving the response event 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or on timeout if app provided response buffer and response 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** timeout. If response buffer and response timeout is provided 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** by the application, it should wait for this event before 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** releasing the response buffer. If the application did not 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** provide response timeout then it should not release the 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** response buffer until it receives NFA_HCI_EVENT_RCVD_EVT or 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** after timeout it sends next event on the same pipe 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** and receives NFA_HCI_EVENT_SENT_EVT for that event. 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciSendEvent(tNFA_HANDLE hci_handle, uint8_t pipe, 6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t evt_code, uint16_t evt_size, 6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data, uint16_t rsp_size, 6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_rsp_buf, uint16_t rsp_timeout) { 6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_SEND_EVENT_EVT* p_msg; 6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02x Code: 0x%02x", 6116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi hci_handle, pipe, evt_code); 6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 6146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) { 6206767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_size && (p_data == NULL)) { 6266767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Event size:0x%02x", evt_size); 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (rsp_size && (p_rsp_buf == NULL)) { 6326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 6336767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "No Event buffer, but invalid event buffer size " 6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ":%u", 6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_size); 6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to post event data on a particular pipe */ 6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_SEND_EVENT_EVT*)GKI_getbuf( 6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_SEND_EVENT_EVT))) != NULL)) { 6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_SEND_EVENT_EVT; 6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->evt_code = evt_code; 6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->evt_len = evt_size; 6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->p_evt_buf = p_data; 6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->rsp_len = rsp_size; 6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->p_rsp_buf = p_rsp_buf; 6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->rsp_timeout = rsp_timeout; 6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciClosePipe 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to close a dynamic pipe. 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the dynamic pipe is closed (or 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** if an error occurs), the app will be notified with 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_HCI_CLOSE_PIPE_EVT with the pipe id. 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciClosePipe(tNFA_HANDLE hci_handle, uint8_t pipe) { 6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_CLOSE_PIPE_EVT* p_msg; 6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6766767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe); 6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 6806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6816767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) || 6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) { 6876767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to close a pipe if it is in opened state */ 6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (!nfa_hci_cb.b_low_power_mode) && 6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_CLOSE_PIPE_EVT*)GKI_getbuf( 6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_CLOSE_PIPE_EVT))) != NULL)) { 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_CLOSE_PIPE_EVT; 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciDeletePipe 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to delete a particular dynamic pipe. 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the dynamic pipe is deleted (or if an error occurs), 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the app will be notified with NFA_HCI_DELETE_PIPE_EVT with 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the pipe id. After successful deletion of pipe, registry 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** entry will be deleted for the dynamic pipe and all 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** information related to the pipe will be deleted from non 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** volatile memory. 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciDeletePipe(tNFA_HANDLE hci_handle, uint8_t pipe) { 7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_DELETE_PIPE_EVT* p_msg; 7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 7276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) || 7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) { 7346767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7396767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7406767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe); 7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to delete a pipe created by the application identified by hci 7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * handle */ 7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (!nfa_hci_cb.b_low_power_mode) && 7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_DELETE_PIPE_EVT*)GKI_getbuf( 7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_DELETE_PIPE_EVT))) != NULL)) { 7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_DELETE_PIPE_EVT; 7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciAddStaticPipe 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to add a static pipe for sending 763552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** 7816 APDUs. When the static pipe is added (or if an error 764552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** occurs), the app will be notified with 765552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NFA_HCI_ADD_STATIC_PIPE_EVT with the status. 766552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successfully initiated 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_STATUS_FAILED otherwise 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS NFA_HciAddStaticPipe(tNFA_HANDLE hci_handle, uint8_t host, 7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t gate, uint8_t pipe) { 7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_API_ADD_STATIC_PIPE_EVT* p_msg; 7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx; 7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) { 7776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid hci_handle:0x%04x", hci_handle); 7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_HOST_IN_NETWORK; xx++) 7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_hci_cb.inactive_host[xx] == host) break; 7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (xx != NFA_HCI_MAX_HOST_IN_NETWORK) { 7866767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7876767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Host not active:0x%02x", host); 7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (gate <= NFA_HCI_LAST_HOST_SPECIFIC_GATE) { 7926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Gate:0x%02x", gate); 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pipe <= NFA_HCI_LAST_DYNAMIC_PIPE) { 7986767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 7996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Invalid Pipe:0x%02x", pipe); 8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8046767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe); 8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Request HCI to delete a pipe created by the application identified by hci 8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * handle */ 8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) && 8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_msg = (tNFA_HCI_API_ADD_STATIC_PIPE_EVT*)GKI_getbuf( 8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFA_HCI_API_ADD_STATIC_PIPE_EVT))) != NULL)) { 8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = NFA_HCI_API_ADD_STATIC_PIPE_EVT; 8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hci_handle = hci_handle; 8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->host = host; 8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->gate = gate; 8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->pipe = pipe; 8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Unable to add static pipe */ 8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFA_HciDebug 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Debug function. 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid NFA_HciDebug(uint8_t action, uint8_t size, uint8_t* p_data) { 8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int xx; 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_DYN_GATE* pg = nfa_hci_cb.cfg.dyn_gates; 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HCI_DYN_PIPE* pp = nfa_hci_cb.cfg.dyn_pipes; 8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_msg; 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (action) { 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_HCI_DEBUG_DISPLAY_CB: 8406767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8416767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_HciDebug Host List:"); 8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) { 8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) { 8446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf(" Host Inx: %u Name: %s", xx, 8466767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi &nfa_hci_cb.cfg.reg_app_names[xx][0]); 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_HciDebug Gate List:"); 8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) { 8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pg->gate_id != 0) { 8546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi " Gate Inx: %x ID: 0x%02x Owner: 0x%04x " 8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "PipeInxMask: 0x%08x", 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi xx, pg->gate_id, pg->gate_owner, pg->pipe_inx_mask); 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8616767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_HciDebug Pipe List:"); 8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) { 8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (pp->pipe_id != 0) { 8656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 8666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi " Pipe Inx: %x ID: 0x%02x State: %u " 8676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "LocalGate: " 8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "0x%02x Dest Gate: 0x%02x Host: 0x%02x", 8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi xx, pp->pipe_id, pp->pipe_state, pp->local_gate, pp->dest_gate, 8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp->dest_host); 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_HCI_DEBUG_SIM_HCI_EVENT: 8760c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID); 8770c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_msg != NULL) { 8786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1); 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->event = NFA_HCI_CHECK_QUEUE_EVT; 8816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len = size; 8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset = 0; 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p, p_data, size); 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_sys_sendmsg(p_msg); 8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_HCI_DEBUG_ENABLE_LOOPBACK: 8916767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_HciDebug HCI_LOOPBACK_DEBUG = TRUE"); 89381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_ON; 8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_HCI_DEBUG_DISABLE_LOOPBACK: 8976767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8986767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_HciDebug HCI_LOOPBACK_DEBUG = FALSE"); 89981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_OFF; 9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 903