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