1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2011-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the action functions the NFA_CE state machine.
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
258a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h>
278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h>
288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "ce_api.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "ndef_utils.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ce_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h"
339343bf46e1ffabdd10973a3b71baa503567e319dRuchi Kandoi
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
388a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf;
398a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
408a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled;
418a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Protocol-specific event handlers
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_handle_t3t_evt
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handler for Type-3 tag card emulation events
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t3t_evt(tCE_EVENT event, tCE_DATA* p_ce_data) {
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nfa_ce_handle_t3t_evt: event 0x%x", event);
61641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  /* For the felica on host for nfcFcallback */
62641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  for (uint8_t idx = 0; idx < NFA_CE_LISTEN_INFO_IDX_INVALID; idx++) {
63641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    if ((p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
64641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_FELICA) &&
65641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
66641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      p_cb->idx_cur_active = idx;
67641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      p_cb->p_active_conn_cback =
68641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
69641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      break;
70641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    }
71641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  }
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T3T_NDEF_UPDATE_START_EVT:
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Notify app using callback associated with the active ndef */
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) {
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.status = NFA_STATUS_OK;
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_START_EVT, &conn_evt);
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf(
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_START_EVT, but no active "
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "NDEF");
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T3T_NDEF_UPDATE_CPLT_EVT:
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Notify app using callback associated with the active ndef */
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) {
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ndef_write_cplt.status = NFA_STATUS_OK;
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length;
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data;
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt);
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf(
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_CPLT_EVT, but no active "
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "NDEF");
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T3T_RAW_FRAME_EVT:
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) {
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.data.status = p_ce_data->raw_frame.status;
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) +
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                               p_ce_data->raw_frame.p_data->offset;
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.data.len = p_ce_data->raw_frame.p_data->len;
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_DATA_EVT, &conn_evt);
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
107641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        /* If we have not notified the app of activation, do so now */
108641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        if (p_cb->listen_info[p_cb->idx_cur_active].flags &
109641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND) {
110641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          p_cb->listen_info[p_cb->idx_cur_active].flags &=
111641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna              ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
112641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna
113641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          conn_evt.ce_activated.handle =
114641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna              NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
115641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          memcpy(&(conn_evt.ce_activated.activate_ntf),
116641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna                 &p_cb->activation_params, sizeof(tNFC_ACTIVATE_DEVT));
117641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          conn_evt.ce_activated.status = NFA_STATUS_OK;
118641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna
119641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
120641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        }
121641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        /* Notify app of t3t raw data */
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ce_data.status = p_ce_data->raw_frame.status;
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ce_data.handle =
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active));
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ce_data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) +
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  p_ce_data->raw_frame.p_data->offset;
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len;
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_CE_DATA_EVT, &conn_evt);
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_ce_data->raw_frame.p_data);
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1346767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "nfa_ce_handle_t3t_evt unhandled event=0x%02x", event);
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_handle_t4t_evt
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handler for Type-4 tag card emulation events (for NDEF case)
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t4t_evt(tCE_EVENT event, tCE_DATA* p_ce_data) {
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1536767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nfa_ce_handle_t4t_evt: event 0x%x", event);
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* AID for NDEF selected. we had notified the app of activation. */
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_NDEF;
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->listen_info[p_cb->idx_cur_active].flags &
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) {
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->p_active_conn_cback =
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T4T_NDEF_UPDATE_START_EVT:
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_OK;
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_START_EVT, &conn_evt);
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T4T_NDEF_UPDATE_CPLT_EVT:
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length;
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data;
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (NDEF_MsgValidate(p_ce_data->update_info.p_data,
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           p_ce_data->update_info.length, true) != NDEF_OK)
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED;
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ndef_write_cplt.status = NFA_STATUS_OK;
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt);
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case CE_T4T_NDEF_UPDATE_ABORT_EVT:
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ndef_write_cplt.len = 0;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED;
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ndef_write_cplt.p_data = NULL;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt);
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* CE_T4T_RAW_FRAME_EVT is not used in NFA CE */
1926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "nfa_ce_handle_t4t_evt unhandled event=0x%02x", event);
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
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_ce_handle_t4t_aid_evt
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handler for Type-4 tag AID events (for AIDs registered using
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFA_CeRegisterT4tAidOnDH)
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t4t_aid_evt(tCE_EVENT event, tCE_DATA* p_ce_data) {
2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx;
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
2146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nfa_ce_handle_t4t_aid_evt: event 0x%x", event);
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Get listen_info for this aid callback */
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID;
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       listen_info_idx++) {
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cb->listen_info[listen_info_idx].flags &
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_CE_LISTEN_INFO_IN_USE) &&
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[listen_info_idx].flags &
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_CE_LISTEN_INFO_T4T_AID) &&
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[listen_info_idx].t4t_aid_handle ==
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         p_ce_data->raw_frame.aid_handle)) {
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->idx_cur_active = listen_info_idx;
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->p_active_conn_cback =
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (event == CE_T4T_RAW_FRAME_EVT) {
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) {
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Found listen_info entry */
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_activated.handle =
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* If we have not notified the app of activation, do so now */
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->listen_info[p_cb->idx_cur_active].flags &
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) {
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[p_cb->idx_cur_active].flags &=
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy(&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params,
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               sizeof(tNFC_ACTIVATE_DEVT));
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.ce_activated.status = NFA_STATUS_OK;
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Notify app of AID data */
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_data.status = p_ce_data->raw_frame.status;
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_data.handle =
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) +
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                p_ce_data->raw_frame.p_data->offset;
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len;
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->p_active_conn_cback)(NFA_CE_DATA_EVT, &conn_evt);
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "nfa_ce_handle_t4t_aid_evt: unable to find listen_info for aid hdl "
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "%i",
2626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          p_ce_data->raw_frame.aid_handle);
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_ce_data->raw_frame.p_data);
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Discovery configuration and discovery event handlers
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_discovery_cback
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing event from discovery callback
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_discovery_cback(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data) {
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_MSG ce_msg;
2846767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISC_START_EVT:
2886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
2896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "nfa_ce_handle_disc_start (status=0x%x)", p_data->start);
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISC_ACTIVATED_EVT:
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ce_msg.activate_ntf.hdr.event = NFA_CE_ACTIVATE_NTF_EVT;
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ce_msg.activate_ntf.p_activation_params = &p_data->activate;
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ce_hdl_event((NFC_HDR*)&ce_msg);
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISC_DEACTIVATED_EVT:
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* DM broadcasts deactivaiton event in listen sleep state, so check before
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * processing */
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_ce_cb.flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) {
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ce_msg.hdr.event = NFA_CE_DEACTIVATE_NTF_EVT;
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ce_msg.hdr.layer_specific = p_data->deactivate.type;
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ce_hdl_event((NFC_HDR*)&ce_msg);
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
3096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("Unexpected event");
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_ce_t3t_set_listen_params
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set t3t listening parameters
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_ce_t3t_set_listen_params(void) {
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
32653d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  uint8_t tlv[128], *p_params;
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t tlv_size;
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t t3t_flags2_mask = 0xFFFF; /* Mask of which T3T_IDs are disabled */
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t t3t_idx = 0;
33053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  uint8_t adv_Feat = 1;
33153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  uint8_t t3tPMM[NCI_T3T_PMM_LEN] = {0xFF, 0xFF, 0xFF, 0xFF,
33253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna                                     0xFF, 0xFF, 0xFF, 0xFF};
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Point to start of tlv buffer */
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_params = tlv;
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Set system code and NFCID2 */
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < NFA_CE_LISTEN_INFO_MAX; i++) {
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) {
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Set tag's system code and NFCID2 */
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_STREAM(p_params, NFC_PMID_LF_T3T_ID1 + t3t_idx); /* type */
34353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna      /* length */
34453d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna      UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_ID(NFC_GetNCIVersion()));
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* System Code */
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT16_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_system_code);
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ARRAY_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_nfcid2,
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                         NCI_RF_F_UID_LEN);
34953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna      if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
35053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna        ARRAY_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_pmm,
35153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna                           NCI_T3T_PMM_LEN);
35253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna      }
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Set mask for this ID */
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      t3t_flags2_mask &= ~((uint16_t)(1 << t3t_idx));
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      t3t_idx++;
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* For NCI draft 22+, the polarity of NFC_PMID_LF_T3T_FLAGS2 is flipped */
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  t3t_flags2_mask = ~t3t_flags2_mask;
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p_params, NFC_PMID_LF_T3T_FLAGS2);      /* type */
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_FLAGS2); /* length */
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Mask of IDs to disable listening */
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_STREAM(p_params, t3t_flags2_mask);
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
36753d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
36853d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    /*Name changed in NCI2.0*/
36953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_T3T_RD_ALLOWED);  /* type */
37053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_RD_ALLOWED); /* length */
37153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  } else {
37253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_CON_ADV_FEAT);  /* type */
37353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_CON_ADV_FEAT); /* length */
37453d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  }
37553d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  UINT8_TO_STREAM(p_params, adv_Feat);
37653d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna
37753d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  if (NFC_GetNCIVersion() != NCI_VERSION_2_0) {
37853d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_T3T_PMM);  /* type */
37953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_PMM); /* length */
38053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna    ARRAY_TO_BE_STREAM(p_params, t3tPMM, NCI_T3T_PMM_LEN);
38153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna  }
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tlv_size = (uint8_t)(p_params - tlv);
383d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  if (appl_dta_mode_flag == 0x01) {
384d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna    nfa_dm_cb.eDtaMode |= NFA_DTA_HCEF_MODE;
385d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  }
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_dm_check_set_config(tlv_size, (uint8_t*)tlv, false);
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_t3t_generate_rand_nfcid
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Generate a random NFCID2 for Type-3 tag
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_t3t_generate_rand_nfcid(uint8_t nfcid2[NCI_RF_F_UID_LEN]) {
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t rand_seed = GKI_get_tick_count();
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* For Type-3 tag, nfcid2 starts witn 02:fe */
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[0] = 0x02;
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[1] = 0xFE;
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* The remaining 6 bytes are random */
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[2] = (uint8_t)(rand_seed & 0xFF);
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[3] = (uint8_t)(rand_seed >> 8 & 0xFF);
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rand_seed >>= (rand_seed & 3);
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[4] = (uint8_t)(rand_seed & 0xFF);
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[5] = (uint8_t)(rand_seed >> 8 & 0xFF);
4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rand_seed >>= (rand_seed & 3);
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[6] = (uint8_t)(rand_seed & 0xFF);
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfcid2[7] = (uint8_t)(rand_seed >> 8 & 0xFF);
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_start_listening
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start listening
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK if successful
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_ce_start_listening(void) {
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_DM_DISC_TECH_PROTO_MASK listen_mask;
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_HANDLE disc_handle;
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx;
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /*************************************************************************/
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Construct protocol preference list to listen for */
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* First, get protocol preference for active NDEF (if any) */
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFA_CE_LISTEN_INFO_IN_USE) &&
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle ==
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFA_HANDLE_INVALID)) {
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    listen_mask = 0;
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask &
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_PROTOCOL_MASK_T3T) {
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* set T3T config params */
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ce_t3t_set_listen_params();
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      listen_mask |= NFA_DM_DISC_MASK_LF_T3T;
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask &
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_PROTOCOL_MASK_ISO_DEP) {
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      listen_mask |= nfa_ce_cb.isodep_disc_mask;
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    disc_handle = nfa_dm_add_rf_discover(listen_mask, NFA_DM_DISC_HOST_ID_DH,
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                         nfa_ce_discovery_cback);
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (disc_handle == NFA_HANDLE_INVALID)
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (NFA_STATUS_FAILED);
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle =
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          disc_handle;
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Next, add protocols from non-NDEF, if any */
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID;
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       listen_info_idx++) {
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* add RF discovery to DM only if it is not added yet */
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cb->listen_info[listen_info_idx].flags &
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_CE_LISTEN_INFO_IN_USE) &&
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[listen_info_idx].rf_disc_handle ==
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_HANDLE_INVALID)) {
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->listen_info[listen_info_idx].flags &
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_LISTEN_INFO_FELICA) {
4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* set T3T config params */
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_ce_t3t_set_listen_params();
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        disc_handle = nfa_dm_add_rf_discover(NFA_DM_DISC_MASK_LF_T3T,
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             NFA_DM_DISC_HOST_ID_DH,
4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             nfa_ce_discovery_cback);
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (disc_handle == NFA_HANDLE_INVALID)
4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return (NFA_STATUS_FAILED);
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle;
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_cb->listen_info[listen_info_idx].flags &
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 NFA_CE_LISTEN_INFO_T4T_AID) {
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        disc_handle = nfa_dm_add_rf_discover(nfa_ce_cb.isodep_disc_mask,
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             NFA_DM_DISC_HOST_ID_DH,
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                             nfa_ce_discovery_cback);
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (disc_handle == NFA_HANDLE_INVALID)
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return (NFA_STATUS_FAILED);
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle;
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else if (p_cb->listen_info[listen_info_idx].flags &
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               NFA_CE_LISTEN_INFO_UICC) {
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        listen_mask = 0;
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (nfa_ee_is_active(p_cb->listen_info[listen_info_idx].ee_handle)) {
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_cb->listen_info[listen_info_idx].tech_mask &
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_TECHNOLOGY_MASK_A) {
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP;
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_cb->listen_info[listen_info_idx].tech_mask &
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_TECHNOLOGY_MASK_B) {
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_cb->listen_info[listen_info_idx].tech_mask &
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_TECHNOLOGY_MASK_F) {
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_mask |= NFA_DM_DISC_MASK_LF_T3T;
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_cb->listen_info[listen_info_idx].tech_mask &
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_TECHNOLOGY_MASK_B_PRIME) {
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_mask |= NFA_DM_DISC_MASK_L_B_PRIME;
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (listen_mask) {
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Start listening for requested technologies */
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* register discovery callback to NFA DM */
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          disc_handle = nfa_dm_add_rf_discover(
5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              listen_mask,
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (tNFA_DM_DISC_HOST_ID)(
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_cb->listen_info[listen_info_idx].ee_handle & 0x00FF),
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              nfa_ce_discovery_cback);
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (disc_handle == NFA_HANDLE_INVALID)
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            return (NFA_STATUS_FAILED);
5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          else {
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle;
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_cb->listen_info[listen_info_idx].tech_proto_mask = listen_mask;
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
5356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          LOG(ERROR) << StringPrintf(
5366767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi              "UICC[0x%x] is not activated",
5376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi              p_cb->listen_info[listen_info_idx].ee_handle);
5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFA_STATUS_OK;
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_restart_listen_check
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
551552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Called on deactivation. Check if any active listen_info
552552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  entries to listen for
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if listening is restarted.
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE if listening not restarted
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_restart_listen_check(void) {
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx;
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if any active entries in listen_info table */
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_MAX;
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       listen_info_idx++) {
5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE)
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Restart listening if there are any active listen_info entries */
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) {
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* restart listening */
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_start_listening();
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* No active listen_info entries */
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_remove_listen_info_entry
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
585552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Remove entry from listen_info table. (when API deregister is
586552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  called or listen_start failed)
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_remove_listen_info_entry(uint8_t listen_info_idx, bool notify_app) {
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
5976767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("NFA_CE: removing listen_info entry %i", listen_info_idx);
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify app that listening has stopped  if requested (for API deregister) */
6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* For LISTEN_START failures, app has already notified of NFA_LISTEN_START_EVT
6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * failure */
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (notify_app) {
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) {
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_OK;
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->listen_info[listen_info_idx].p_conn_cback)(
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt);
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_cb->listen_info[listen_info_idx].flags &
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             NFA_CE_LISTEN_INFO_UICC) {
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_OK;
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->listen_info[listen_info_idx].p_conn_cback)(
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt);
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else {
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_deregistered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx;
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_cb->listen_info[listen_info_idx].p_conn_cback)(
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_DEREGISTERED_EVT, &conn_evt);
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Handle NDEF stopping */
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) {
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear NDEF contents */
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->listen_info[listen_info_idx].protocol_mask &
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_PROTOCOL_MASK_T3T) {
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->listen_info[listen_info_idx].protocol_mask = 0;
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* clear T3T Flags for NDEF */
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ce_t3t_set_listen_params();
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Free scratch buffer for this NDEF, if one was allocated */
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_free_scratch_buf();
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If stopping listening Felica system code, then clear T3T Flags for this */
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_cb->listen_info[listen_info_idx].flags &
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           NFA_CE_LISTEN_INFO_FELICA) {
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].protocol_mask = 0;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear T3T Flags for registered Felica system code */
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_ce_t3t_set_listen_params();
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If stopping listening T4T AID, then deregister this AID from CE_T4T */
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_cb->listen_info[listen_info_idx].flags &
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           NFA_CE_LISTEN_INFO_T4T_AID) {
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Free t4t_aid_cback used by this AID */
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T4tDeregisterAID(p_cb->listen_info[listen_info_idx].t4t_aid_handle);
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->listen_info[listen_info_idx].rf_disc_handle != NFA_HANDLE_INVALID) {
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_dm_delete_rf_discover(
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].rf_disc_handle);
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID;
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Remove entry from listen_info table */
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[listen_info_idx].flags = 0;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_free_scratch_buf
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      free scratch buffer (if one is allocated)
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_free_scratch_buf(void) {
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->p_scratch_buf) {
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_mem_co_free(p_cb->p_scratch_buf);
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->p_scratch_buf = NULL;
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_realloc_scratch_buffer
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set scratch buffer if necessary (for writable NDEF messages)
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK if successful
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_ce_realloc_scratch_buffer(void) {
6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_STATUS result = NFA_STATUS_OK;
6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If current NDEF message is read-only, then we do not need a scratch buffer
6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   */
6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfa_ce_cb.listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_CE_LISTEN_INFO_READONLY_NDEF) {
6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Free existing scratch buffer, if one was allocated */
6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_free_scratch_buf();
7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If no scratch buffer allocated yet, or if current scratch buffer size is
7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * different from current ndef size, */
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* then allocate a new scratch buffer. */
7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((nfa_ce_cb.p_scratch_buf == NULL) ||
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (nfa_ce_cb.scratch_buf_size != nfa_ce_cb.ndef_max_size)) {
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Free existing scratch buffer, if one was allocated */
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ce_free_scratch_buf();
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      nfa_ce_cb.p_scratch_buf =
7100c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi          (uint8_t*)nfa_mem_co_alloc(nfa_ce_cb.ndef_max_size);
7110c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (nfa_ce_cb.p_scratch_buf != NULL) {
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ce_cb.scratch_buf_size = nfa_ce_cb.ndef_max_size;
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
7146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf(
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "Unable to allocate scratch buffer for writable NDEF message (%i "
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            "bytes)",
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfa_ce_cb.ndef_max_size);
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        result = NFA_STATUS_FAILED;
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (result);
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_set_content
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set NDEF contents
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS nfa_ce_set_content(void) {
7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_PROTOCOL_MASK ndef_protocol_mask;
7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool readonly;
7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if listening for NDEF */
7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_CE_LISTEN_INFO_IN_USE)) {
7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Not listening for NDEF */
7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFA_STATUS_OK);
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Setting NDEF contents");
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  readonly = (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_CE_LISTEN_INFO_READONLY_NDEF)
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 ? true
7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 : false;
7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ndef_protocol_mask =
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask;
7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Allocate a scratch buffer if needed (for handling write-requests) */
7580c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = nfa_ce_realloc_scratch_buffer();
7590c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFA_STATUS_OK) {
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_T3T) &&
7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (status == NFA_STATUS_OK)) {
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Type3Tag    - NFC-F */
7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = CE_T3tSetLocalNDEFMsg(readonly, p_cb->ndef_max_size,
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_cb->ndef_cur_size, p_cb->p_ndef_data,
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_cb->p_scratch_buf);
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) &&
7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (status == NFA_STATUS_OK)) {
7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* ISODEP/4A,4B- NFC-A or NFC-B */
7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = CE_T4tSetLocalNDEFMsg(readonly, p_cb->ndef_max_size,
7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_cb->ndef_cur_size, p_cb->p_ndef_data,
7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_cb->p_scratch_buf);
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status != NFA_STATUS_OK) {
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear NDEF contents */
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to set contents (error %02x)", status);
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_activate_ntf
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Action when activation has occured (NFA_CE_ACTIVATE_NTF_EVT)
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Find the listen_info entry assocated with this activation
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - get the app callback that registered for this listen
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - call CE_SetActivatedTagType with activation parameters
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_activate_ntf(tNFA_CE_MSG* p_ce_msg) {
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_ACTIVATE_DEVT* p_activation_params =
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ce_msg->activate_ntf.p_activation_params;
8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tCE_CBACK* p_ce_cback = NULL;
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t t3t_system_code = 0xFFFF;
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID;
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_nfcid2 = NULL;
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool t4t_activate_pending = false;
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
813641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  bool t3t_activate_pending = false;
814641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  bool t3t_offhost_entry_found = false;
815641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  uint8_t t3t_activate_idx = 0;
816641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  uint8_t t3t_offhost_idx = 0;
817641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna
8186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
8196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol);
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Tag is in listen active state */
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->flags |= NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP;
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Store activation parameters */
8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(&p_cb->activation_params, p_activation_params,
8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         sizeof(tNFC_ACTIVATE_DEVT));
8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Find the listen_info entry corresponding to this activation */
8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) {
8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Look for T3T entries in listen_info table that match activated system
8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * code and NFCID2 */
8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID;
8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         listen_info_idx++) {
8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Look for entries with NFA_PROTOCOL_MASK_T3T */
8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->listen_info[listen_info_idx].flags &
8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_CE_LISTEN_INFO_IN_USE) {
8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_cb->listen_info[listen_info_idx].protocol_mask &
8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFA_PROTOCOL_MASK_T3T) {
8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Check if system_code and nfcid2 that matches activation params */
8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_nfcid2 = p_cb->listen_info[listen_info_idx].t3t_nfcid2;
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          t3t_system_code = p_cb->listen_info[listen_info_idx].t3t_system_code;
8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Compare NFCID2 (note: NFCC currently does not return system code in
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * activation parameters) */
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if ((memcmp(p_nfcid2,
8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cb->activation_params.rf_tech_param.param.lf.nfcid2,
8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      NCI_RF_F_UID_LEN) == 0)
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) {
849641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            p_cb->listen_info[listen_info_idx].flags |=
850641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna                NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
851641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            t3t_activate_pending = true;
852641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            t3t_activate_idx = listen_info_idx;
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Check if entry is for T3T UICC */
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_cb->listen_info[listen_info_idx].flags &
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             NFA_CE_LISTEN_INFO_UICC) &&
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cb->listen_info[listen_info_idx].tech_mask &
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             NFA_TECHNOLOGY_MASK_F)) {
861641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          t3t_offhost_entry_found = true;
862641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          t3t_offhost_idx = listen_info_idx;
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ce_cback = nfa_ce_handle_t3t_evt;
868641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    /* If listening for PROTO_T3T on DH and eSE/UICC, then notify CE module
869641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna     * now and wait for reader/writer to SELECT a target */
870641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    if (t3t_activate_pending && t3t_offhost_entry_found) {
871641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code,
872641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna                             p_ce_cback);
873641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      return true;
874641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    } else if (t3t_activate_pending) {
875641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      listen_info_idx = t3t_activate_idx;
876641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    } else if (t3t_offhost_entry_found) {
877641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      listen_info_idx = t3t_offhost_idx;
878641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna    }
8796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) {
8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ce_cback = nfa_ce_handle_t4t_evt;
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* For T4T, we do not know which AID will be selected yet */
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* For all T4T entries in listen_info, set T4T_ACTIVATE_NOTIFY_PENDING flag
8856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) {
8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) {
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) {
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Found listen_info table entry for T4T raw listen */
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[i].flags |= NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* If entry if for NDEF, select it, so application gets nofitifed of
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           * ACTIVATE_EVT now */
8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_info_idx = NFA_CE_LISTEN_INFO_IDX_NDEF;
8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          t4t_activate_pending = true;
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NFCEE_INCLUDED == TRUE)
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Check if entry is for ISO_DEP UICC */
9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) {
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (((p_cb->activation_params.rf_tech_param.mode ==
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_DISCOVERY_TYPE_LISTEN_A) &&
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_cb->listen_info[i].tech_proto_mask &
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFA_DM_DISC_MASK_LA_ISO_DEP)) ||
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              ((p_cb->activation_params.rf_tech_param.mode ==
9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_DISCOVERY_TYPE_LISTEN_B) &&
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_cb->listen_info[i].tech_proto_mask &
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFA_DM_DISC_MASK_LB_ISO_DEP))) {
9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            listen_info_idx = i;
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif
9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If listening for ISO_DEP, but not NDEF nor UICC, then notify CE module
9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * now and wait for reader/writer to SELECT an AID */
9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (t4t_activate_pending &&
9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID)) {
9236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      CE_SetActivatedTagType(&p_cb->activation_params, 0, p_ce_cback);
9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cb->activation_params.intf_param.type ==
9276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             NFC_INTERFACE_EE_DIRECT_RF) {
9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* search any entry listening UICC */
9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) {
9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC)) {
9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        listen_info_idx = i;
9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if valid listen_info entry was found */
9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) ||
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) &&
9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       !(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_CE_LISTEN_INFO_IN_USE))) {
9436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "No listen_info found for this activation. listen_info_idx=%d",
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        listen_info_idx);
9464a179646f6d5567830a0383050aee7610a0222a6Ruchi Kandoi    return true;
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[listen_info_idx].flags &=
9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
951641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna  p_cb->listen_info[listen_info_idx].flags &=
952641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna      ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Get CONN_CBACK for this activation */
9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback;
9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->idx_cur_active = listen_info_idx;
9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) ||
9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_cb->listen_info[p_cb->idx_cur_active].flags &
9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFA_CE_LISTEN_INFO_UICC)) {
9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memcpy(&(conn_evt.activated.activate_ntf), &p_cb->activation_params,
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           sizeof(tNFC_ACTIVATE_DEVT));
9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_cb->p_active_conn_cback)(NFA_ACTIVATED_EVT, &conn_evt);
9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_evt.ce_activated.handle =
9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memcpy(&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params,
9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           sizeof(tNFC_ACTIVATE_DEVT));
9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_evt.ce_activated.status = NFA_STATUS_OK;
9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* we don't need any CE subsystem in case of NFCEE direct RF interface */
9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_cback) {
9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Notify CE subsystem */
9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code,
9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           p_ce_cback);
9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_deactivate_ntf
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Action when deactivate occurs. (NFA_CE_DEACTIVATE_NTF_EVT)
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
990552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - If deactivate due to API deregister, then remove its entry
991552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    from listen_info table
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - If NDEF was modified while activated, then restore
994552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    original NDEF contents
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Restart listening (if any active entries in listen table)
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_deactivate_ntf(tNFA_CE_MSG* p_ce_msg) {
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_DEACT_TYPE deact_type = (tNFC_DEACT_TYPE)p_ce_msg->hdr.layer_specific;
10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("deact_type=%d", deact_type);
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if deactivating to SLEEP mode */
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((deact_type == NFC_DEACTIVATE_TYPE_SLEEP) ||
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (deact_type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ce_cb.idx_wild_card == NFA_CE_LISTEN_INFO_IDX_INVALID) {
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify deactivated as sleep and wait for reactivation or deactivation
10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * to idle */
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.deactivated.type = deact_type;
10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if T4T AID application has not been selected then p_active_conn_cback
10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * could be NULL */
10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->p_active_conn_cback)
10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_deactivated.handle =
10236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)nfa_ce_cb.idx_wild_card);
10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_deactivated.type = deact_type;
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->p_active_conn_cback)
10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    deact_type = NFC_DEACTIVATE_TYPE_IDLE;
10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Tag is in idle state */
10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->flags &= ~NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP;
10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* First, notify app of deactivation */
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) {
10396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) {
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) &&
10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (i == p_cb->idx_cur_active)) {
10426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        conn_evt.deactivated.type = deact_type;
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) &&
10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 (p_cb->listen_info[i].protocol_mask &
10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  NFA_PROTOCOL_MASK_ISO_DEP)) {
10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (!(p_cb->listen_info[i].flags &
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND)) {
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            conn_evt.deactivated.type = deact_type;
10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            conn_evt.ce_deactivated.handle =
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            conn_evt.ce_deactivated.type = deact_type;
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) &&
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) {
1062641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */
1063641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna        if (!(p_cb->listen_info[i].flags &
1064641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna              NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
1065641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
1066641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            conn_evt.deactivated.type = deact_type;
1067641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
1068641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          } else {
1069641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            conn_evt.ce_deactivated.handle =
1070641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna                NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
1071641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            conn_evt.ce_deactivated.type = deact_type;
1072641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna            (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
1073641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna          }
10746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if app initiated the deactivation (due to API deregister). If so,
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * remove entry from listen_info table. */
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->flags & NFA_CE_FLAGS_APP_INIT_DEACTIVATION) {
10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->flags &= ~NFA_CE_FLAGS_APP_INIT_DEACTIVATION;
10836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_remove_listen_info_entry(p_cb->idx_cur_active, true);
10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->p_active_conn_cback = NULL;
10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_INVALID;
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Restart listening (if any listen_info entries are still active) */
10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ce_restart_listen_check();
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_disable_local_tag
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disable local NDEF tag
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - clean up control block
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - remove NDEF discovery configuration
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_disable_local_tag(void) {
11076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA evt_data;
11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Disabling local NDEF tag");
11116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If local NDEF tag is in use, then disable it */
11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_CE_LISTEN_INFO_IN_USE) {
11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NDEF Tag is in not idle state */
11166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) &&
11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF)) {
11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* wait for deactivation */
11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION;
11206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Notify DM to stop listening for ndef  */
11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle !=
11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFA_HANDLE_INVALID) {
11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_dm_delete_rf_discover(
11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle);
11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle =
11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFA_HANDLE_INVALID;
11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ce_remove_listen_info_entry(NFA_CE_LISTEN_INFO_IDX_NDEF, true);
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Notify application */
11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFA_STATUS_OK;
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &evt_data);
11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_api_cfg_local_tag
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Configure local NDEF tag
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - store ndef attributes in to control block
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      - update discovery configuration
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_cfg_local_tag(tNFA_CE_MSG* p_ce_msg) {
11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if disabling local tag */
11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->local_tag.protocol_mask == 0) {
11566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_disable_local_tag();
11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "Configuring local NDEF tag: protocol_mask=%01x cur_size=%i, "
11626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "max_size=%i, readonly=%i uid_len=%i",
11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ce_msg->local_tag.protocol_mask, p_ce_msg->local_tag.ndef_cur_size,
11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ce_msg->local_tag.ndef_max_size, p_ce_msg->local_tag.read_only,
11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ce_msg->local_tag.uid_len);
11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If local tag was already set, then check if NFA_CeConfigureLocalTag called
11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * to change protocol mask  */
11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFA_CE_LISTEN_INFO_IN_USE) &&
11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle !=
11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFA_HANDLE_INVALID) &&
11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask &
11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) !=
11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       (p_ce_msg->local_tag.protocol_mask &
11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)))) {
11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Listening for different tag protocols. Stop discovery */
11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_dm_delete_rf_discover(
11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle);
11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle =
11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_HANDLE_INVALID;
11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear NDEF contents */
11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Store NDEF info to control block */
11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->p_ndef_data = p_ce_msg->local_tag.p_ndef_data;
11906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->ndef_cur_size = p_ce_msg->local_tag.ndef_cur_size;
11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->ndef_max_size = p_ce_msg->local_tag.ndef_max_size;
11926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Fill in LISTEN_INFO entry for NDEF */
11946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags =
11956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFA_CE_LISTEN_INFO_IN_USE;
11966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask =
11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ce_msg->local_tag.protocol_mask;
11986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].p_conn_cback =
11996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify;
12006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->local_tag.read_only)
12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags |=
12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_CE_LISTEN_INFO_READONLY_NDEF;
12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].t3t_system_code =
12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      T3T_SYSTEM_CODE_NDEF;
12056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Set NDEF contents */
12076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  conn_evt.status = NFA_STATUS_FAILED;
12086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask &
12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) {
12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Ok to set contents now */
12126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ce_set_content() != NFA_STATUS_OK) {
12136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
12146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "nfa_ce_api_cfg_local_tag: could not set contents");
12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT,
12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     &conn_evt);
12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Start listening and notify app of status */
12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_evt.status = nfa_ce_start_listening();
12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt);
12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_api_reg_listen
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register listen params for Felica system code, T4T AID,
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  or UICC
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_reg_listen(tNFA_CE_MSG* p_ce_msg) {
12396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID;
12436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
12456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Registering UICC/Felica/Type-4 tag listener. Type=%i",
12466767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      p_ce_msg->reg_listen.listen_type);
12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Look for available entry in listen_info table */
12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* - If registering UICC listen, make sure there isn't another entry for the
12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * ee_handle  */
12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* - Skip over entry 0 (reserved for local NDEF tag) */
12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 1; i < NFA_CE_LISTEN_INFO_MAX; i++) {
12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) &&
12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) &&
12566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[i].ee_handle == p_ce_msg->reg_listen.ee_handle)) {
12576767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("UICC (0x%x) listening already specified",
12586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                                 p_ce_msg->reg_listen.ee_handle);
12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_FAILED;
12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT,
12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     &conn_evt);
12626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If this is a free entry, and we haven't found one yet, remember it */
12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if ((!(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE)) &&
12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID)) {
12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      listen_info_idx = i;
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
12696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
12706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Add new entry to listen_info table */
12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) {
12736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Maximum listen callbacks exceeded (%i)",
12746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               NFA_CE_LISTEN_INFO_MAX);
12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) {
12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_FAILED;
12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT,
12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     &conn_evt);
12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Notify application */
12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_registered.handle = NFA_HANDLE_INVALID;
12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.ce_registered.status = NFA_STATUS_FAILED;
12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_ce_msg->reg_listen.p_conn_cback)(NFA_CE_REGISTERED_EVT, &conn_evt);
12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
12896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("NFA_CE: adding listen_info entry %i", listen_info_idx);
12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Store common parameters */
12926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Mark entry as 'in-use', and NFA_CE_LISTEN_INFO_START_NTF_PND */
12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* (LISTEN_START_EVT will be notified when discovery successfully starts */
12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].flags =
12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_CE_LISTEN_INFO_IN_USE | NFA_CE_LISTEN_INFO_START_NTF_PND;
12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID;
12976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].protocol_mask = 0;
12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Store type-specific parameters */
13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (p_ce_msg->reg_listen.listen_type) {
13016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case NFA_CE_REG_TYPE_ISO_DEP:
13026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].protocol_mask =
13036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFA_PROTOCOL_MASK_ISO_DEP;
13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_T4T_AID;
13056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].p_conn_cback =
13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ce_msg->reg_listen.p_conn_cback;
13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Register this AID with CE_T4T */
13090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        p_cb->listen_info[listen_info_idx].t4t_aid_handle = CE_T4tRegisterAID(
13100c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi            p_ce_msg->reg_listen.aid_len, p_ce_msg->reg_listen.aid,
13110c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi            nfa_ce_handle_t4t_aid_evt);
13120c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        if (p_cb->listen_info[listen_info_idx].t4t_aid_handle ==
13130c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi            CE_T4T_AID_HANDLE_INVALID) {
13146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          LOG(ERROR) << StringPrintf("Unable to register AID");
13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[listen_info_idx].flags = 0;
13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Notify application */
13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          conn_evt.ce_registered.handle = NFA_HANDLE_INVALID;
13196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          conn_evt.ce_registered.status = NFA_STATUS_FAILED;
13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (*p_ce_msg->reg_listen.p_conn_cback)(NFA_CE_REGISTERED_EVT,
13216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                               &conn_evt);
13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return true;
13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
13256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_cb->listen_info[listen_info_idx].t4t_aid_handle ==
13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            CE_T4T_WILDCARD_AID_HANDLE)
13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_ce_cb.idx_wild_card = listen_info_idx;
13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case NFA_CE_REG_TYPE_FELICA:
13316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].protocol_mask =
13326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFA_PROTOCOL_MASK_T3T;
13336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_FELICA;
13346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].p_conn_cback =
13356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ce_msg->reg_listen.p_conn_cback;
13366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Store system code and nfcid2 */
13386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].t3t_system_code =
13396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ce_msg->reg_listen.system_code;
13406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy(p_cb->listen_info[listen_info_idx].t3t_nfcid2,
13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               p_ce_msg->reg_listen.nfcid2, NCI_RF_F_UID_LEN);
134253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna        memcpy(p_cb->listen_info[listen_info_idx].t3t_pmm,
134353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna               p_ce_msg->reg_listen.t3tPmm, NCI_T3T_PMM_LEN);
13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case NFA_CE_REG_TYPE_UICC:
13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_UICC;
13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].p_conn_cback =
13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &nfa_dm_conn_cback_event_notify;
13516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Store EE handle and Tech */
13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].ee_handle =
13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ce_msg->reg_listen.ee_handle;
13556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->listen_info[listen_info_idx].tech_mask =
13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ce_msg->reg_listen.tech_mask;
13576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
13606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Start listening */
13630c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  conn_evt.status = nfa_ce_start_listening();
13640c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (conn_evt.status != NFA_STATUS_OK) {
13656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
13666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "nfa_ce_api_reg_listen: unable to register new listen params with DM");
13676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cb->listen_info[listen_info_idx].flags = 0;
13686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Nofitify app of status */
13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) {
13726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_cb->listen_info[listen_info_idx].p_conn_cback)(
13736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt);
13746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    conn_evt.ce_registered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx;
13766767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
13776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("nfa_ce_api_reg_listen: registered handle 0x%04X",
13786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        conn_evt.ce_registered.handle);
13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_cb->listen_info[listen_info_idx].p_conn_cback)(NFA_CE_REGISTERED_EVT,
13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                       &conn_evt);
13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_api_dereg_listen
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister listen params
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_dereg_listen(tNFA_CE_MSG* p_ce_msg) {
13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CE_CB* p_cb = &nfa_ce_cb;
13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t listen_info_idx;
13986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFA_CONN_EVT_DATA conn_evt;
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Check if deregistering UICC , or virtual secure element listen */
14026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->dereg_listen.listen_info == NFA_CE_LISTEN_INFO_UICC) {
14036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Deregistering UICC listen. Look for listen_info for this UICC ee handle
14046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
14056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_MAX;
14066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         listen_info_idx++) {
14076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_cb->listen_info[listen_info_idx].flags &
14086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           NFA_CE_LISTEN_INFO_IN_USE) &&
14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_cb->listen_info[listen_info_idx].flags &
14106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           NFA_CE_LISTEN_INFO_UICC) &&
14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_cb->listen_info[listen_info_idx].ee_handle ==
14126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           p_ce_msg->dereg_listen.handle)) {
14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* UICC is in not idle state */
14146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) &&
14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cb->idx_cur_active == listen_info_idx)) {
14166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* wait for deactivation */
14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION;
14186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
14196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
14206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Stop listening */
14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_cb->listen_info[listen_info_idx].rf_disc_handle !=
14226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_HANDLE_INVALID) {
14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfa_dm_delete_rf_discover(
14246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_cb->listen_info[listen_info_idx].rf_disc_handle);
14256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_cb->listen_info[listen_info_idx].rf_disc_handle =
14266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFA_HANDLE_INVALID;
14276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
14286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Remove entry and notify application */
14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_ce_remove_listen_info_entry(listen_info_idx, true);
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
14346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (listen_info_idx == NFA_CE_LISTEN_INFO_MAX) {
14376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("cannot find listen_info for UICC");
14386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_INVALID_PARAM;
14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT,
14406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     &conn_evt);
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
14426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
14446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
14456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Deregistering virtual secure element listen */
14466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    listen_info_idx = p_ce_msg->dereg_listen.handle & NFA_HANDLE_MASK;
14476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfa_ce_cb.idx_wild_card == listen_info_idx) {
14486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_ce_cb.idx_wild_card = NFA_CE_LISTEN_INFO_IDX_INVALID;
14496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((listen_info_idx < NFA_CE_LISTEN_INFO_MAX) &&
14526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cb->listen_info[listen_info_idx].flags &
14536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         NFA_CE_LISTEN_INFO_IN_USE)) {
14546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* virtual secure element is in not idle state */
14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) &&
14566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_cb->idx_cur_active == listen_info_idx)) {
14576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* wait for deactivation */
14586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION;
14596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
14606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
14616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Stop listening */
14626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_cb->listen_info[listen_info_idx].rf_disc_handle !=
14636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFA_HANDLE_INVALID) {
14646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_delete_rf_discover(
14656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_cb->listen_info[listen_info_idx].rf_disc_handle);
14666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_cb->listen_info[listen_info_idx].rf_disc_handle =
14676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFA_HANDLE_INVALID;
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
14696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Remove entry and notify application */
14716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfa_ce_remove_listen_info_entry(listen_info_idx, true);
14726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
14736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
14746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
14756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "cannot find listen_info for "
14766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "Felica/T4tAID");
14776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_evt.status = NFA_STATUS_INVALID_PARAM;
14786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_conn_cback_event_notify(NFA_CE_DEREGISTERED_EVT, &conn_evt);
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
14806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_ce_api_cfg_isodep_tech
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1489552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Configure the technologies (NFC-A and/or NFC-B) to listen
1490552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  for ISO-DEP
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE (message buffer to be freed by caller)
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_cfg_isodep_tech(tNFA_CE_MSG* p_ce_msg) {
14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfa_ce_cb.isodep_disc_mask = 0;
14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_A)
14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_cb.isodep_disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP;
14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_B)
15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_ce_cb.isodep_disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1504