1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains function of the NFC unit to receive/process NCI
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  commands.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h>
288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h>
298a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
328a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "bt_types.h"
338a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "gki.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_defs.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
398a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf;
408a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
418a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled;
428a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_core_rsp
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI responses in the CORE group
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE-caller of this function to free the GKI buffer p_msg
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nci_proc_core_rsp(NFC_HDR* p_msg) {
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool free = true;
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_old = nfc_cb.last_cmd;
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nci_proc_core_rsp opcode:0x%x", op_code);
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* process the message based on the opcode and message type */
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (op_code) {
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_RESET:
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_reset_rsp(pp, false);
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_INIT:
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_init_rsp(p_msg);
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      free = false;
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_GET_CONFIG:
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_get_config_rsp(p_msg);
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_SET_CONFIG:
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_set_config_status(pp, len);
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_CONN_CREATE:
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_conn_create_rsp(p, p_msg->len, *p_old);
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_CONN_CLOSE:
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_report_conn_close_evt(*p_old, *pp);
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
925e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna    case NCI_MSG_CORE_SET_POWER_SUB_STATE:
935e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna      nfc_ncif_event_status(NFC_SET_POWER_SUB_STATE_REVT, *pp);
945e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna      break;
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return free;
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_core_ntf
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI notifications in the CORE group
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_core_ntf(NFC_HDR* p_msg) {
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t conn_id;
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
1216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nci_proc_core_ntf opcode:0x%x", op_code);
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* process the message based on the opcode and message type */
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (op_code) {
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_RESET:
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_reset_rsp(pp, true);
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_GEN_ERR_STATUS:
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* process the error ntf */
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* in case of timeout: notify the static connection callback */
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_event_status(NFC_GEN_ERROR_REVT, *pp);
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_error_status(NFC_RF_CONN_ID, *pp);
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_INTF_ERR_STATUS:
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      conn_id = *(pp + 1);
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_error_status(conn_id, *pp);
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_CORE_CONN_CREDITS:
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_credits(pp, len);
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_rf_management_rsp
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI responses in the RF Management group
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_rf_management_rsp(NFC_HDR* p_msg) {
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_old = nfc_cb.last_cmd;
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (op_code) {
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_DISCOVER:
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_RSP);
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_rf_management_status(NFC_START_DEVT, *pp);
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_DISCOVER_SELECT:
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_rf_management_status(NFC_SELECT_DEVT, *pp);
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_T3T_POLLING:
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_DISCOVER_MAP:
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_rf_management_status(NFC_MAP_DEVT, *pp);
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_DEACTIVATE:
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_RSP) == false) {
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_deactivate(*pp, *p_old, false);
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE)
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_SET_ROUTING:
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_event_status(NFC_SET_ROUTING_REVT, *pp);
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_GET_ROUTING:
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (*pp != NFC_STATUS_OK)
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_ncif_event_status(NFC_GET_ROUTING_REVT, *pp);
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_PARAMETER_UPDATE:
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_event_status(NFC_RF_COMM_PARAMS_UPDATE_REVT, *pp);
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
215d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna    case NCI_MSG_RF_ISO_DEP_NAK_PRESENCE:
216d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna      nfc_ncif_proc_isodep_nak_presence_check_status(*pp, false);
217d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna      break;
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_rf_management_ntf
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI notifications in the RF Management group
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_rf_management_ntf(NFC_HDR* p_msg) {
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (op_code) {
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case NCI_MSG_RF_DISCOVER:
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_discover_ntf(p, p_msg->len);
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_DEACTIVATE:
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_NTF) == false) {
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
25213c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna      if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
25313c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna        nfc_cb.deact_reason = *(pp + 1);
25413c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna      }
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_deactivate(NFC_STATUS_OK, *pp, true);
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_INTF_ACTIVATED:
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_NTF) == false) {
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_activate(pp, len);
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_FIELD:
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_rf_field_ntf(*pp);
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_T3T_POLLING:
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_t3t_polling_ntf(pp, len);
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE)
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_GET_ROUTING:
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_get_routing(pp, len);
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_EE_ACTION:
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_ee_action(pp, len);
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_RF_EE_DISCOVERY_REQ:
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_ncif_proc_ee_discover_req(pp, len);
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
289d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna    case NCI_MSG_RF_ISO_DEP_NAK_PRESENCE:
290d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna      nfc_ncif_proc_isodep_nak_presence_check_status(*pp, true);
291d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna      break;
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE)
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_ee_management_rsp
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI responses in the NFCEE Management group
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_ee_management_rsp(NFC_HDR* p_msg) {
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback;
3141361d5216ba2017a629dc7438395ca47eede2175Myles Watson  tNFC_RESPONSE nfc_response;
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_old = nfc_cb.last_cmd;
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
3226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
3236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nci_proc_ee_management_rsp opcode:0x%x", op_code);
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (op_code) {
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_NFCEE_DISCOVER:
3281361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.nfcee_discover.status = *pp++;
3291361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.nfcee_discover.num_nfcee = *pp++;
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3311361d5216ba2017a629dc7438395ca47eede2175Myles Watson      if (nfc_response.nfcee_discover.status != NFC_STATUS_OK)
3321361d5216ba2017a629dc7438395ca47eede2175Myles Watson        nfc_response.nfcee_discover.num_nfcee = 0;
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      event = NFC_NFCEE_DISCOVER_REVT;
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NCI_MSG_NFCEE_MODE_SET:
3381361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.mode_set.status = *pp;
3391361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.mode_set.nfcee_id = *p_old++;
3401361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.mode_set.mode = *p_old++;
34181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna      if (nfc_cb.nci_version != NCI_VERSION_2_0 || *pp != NCI_STATUS_OK) {
34281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna        nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF;
34381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna        event = NFC_NFCEE_MODE_SET_REVT;
34481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna      } else {
34581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna        /* else response reports OK status on notification */
34681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna        return;
34781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna      }
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna    case NCI_MSG_NFCEE_POWER_LINK_CTRL:
3511361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.pl_control.status = *pp;
3521361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.pl_control.nfcee_id = *p_old++;
3531361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.pl_control.pl_control = *p_old++;
35481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna      event = NFC_NFCEE_PL_CONTROL_REVT;
35581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna      break;
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cback = NULL;
3586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3621361d5216ba2017a629dc7438395ca47eede2175Myles Watson  if (p_cback) (*p_cback)(event, &nfc_response);
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_ee_management_ntf
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI notifications in the NFCEE Management group
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_ee_management_ntf(NFC_HDR* p_msg) {
3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback;
3781361d5216ba2017a629dc7438395ca47eede2175Myles Watson  tNFC_RESPONSE nfc_response;
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
38081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna  uint8_t* p_old = nfc_cb.last_cmd;
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xx;
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t yy;
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_NFCEE_TLV* p_tlv;
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
3886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
3896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("nci_proc_ee_management_ntf opcode:0x%x", op_code);
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (op_code == NCI_MSG_NFCEE_DISCOVER) {
3931361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_info.nfcee_id = *pp++;
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3951361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_info.ee_status = *pp++;
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    yy = *pp;
3971361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_info.num_interface = *pp++;
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p = pp;
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4001361d5216ba2017a629dc7438395ca47eede2175Myles Watson    if (nfc_response.nfcee_info.num_interface > NFC_MAX_EE_INTERFACE)
4011361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.nfcee_info.num_interface = NFC_MAX_EE_INTERFACE;
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4031361d5216ba2017a629dc7438395ca47eede2175Myles Watson    for (xx = 0; xx < nfc_response.nfcee_info.num_interface; xx++) {
4041361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.nfcee_info.ee_interface[xx] = *pp++;
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    pp = p + yy;
4081361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_info.num_tlvs = *pp++;
4096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
4106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "nfcee_id: 0x%x num_interface:0x%x/0x%x, num_tlvs:0x%x",
4116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        nfc_response.nfcee_info.nfcee_id, nfc_response.nfcee_info.num_interface,
4126767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        yy, nfc_response.nfcee_info.num_tlvs);
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4141361d5216ba2017a629dc7438395ca47eede2175Myles Watson    if (nfc_response.nfcee_info.num_tlvs > NFC_MAX_EE_TLVS)
4151361d5216ba2017a629dc7438395ca47eede2175Myles Watson      nfc_response.nfcee_info.num_tlvs = NFC_MAX_EE_TLVS;
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4171361d5216ba2017a629dc7438395ca47eede2175Myles Watson    p_tlv = &nfc_response.nfcee_info.ee_tlv[0];
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4191361d5216ba2017a629dc7438395ca47eede2175Myles Watson    for (xx = 0; xx < nfc_response.nfcee_info.num_tlvs; xx++, p_tlv++) {
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_tlv->tag = *pp++;
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_tlv->len = yy = *pp++;
4226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
4236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("tag:0x%x, len:0x%x", p_tlv->tag, p_tlv->len);
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_tlv->len > NFC_MAX_EE_INFO) p_tlv->len = NFC_MAX_EE_INFO;
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p = pp;
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_ARRAY(p_tlv->info, pp, p_tlv->len);
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      pp = p += yy;
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
42981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna  } else if (op_code == NCI_MSG_NFCEE_MODE_SET) {
4301361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.mode_set.status = *pp;
4311361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.mode_set.nfcee_id = *p_old++;
4321361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.mode_set.mode = *p_old++;
43381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna    event = NFC_NFCEE_MODE_SET_REVT;
43481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna    nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF;
43581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna    nfc_stop_timer(&nfc_cb.nci_mode_set_ntf_timer);
43681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna  } else if (op_code == NCI_MSG_NFCEE_STATUS) {
43781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna    event = NFC_NFCEE_STATUS_REVT;
4381361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_status.status = NCI_STATUS_OK;
4391361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_status.nfcee_id = *pp++;
4401361d5216ba2017a629dc7438395ca47eede2175Myles Watson    nfc_response.nfcee_status.nfcee_status = *pp;
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cback = NULL;
4436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4461361d5216ba2017a629dc7438395ca47eede2175Myles Watson  if (p_cback) (*p_cback)(event, &nfc_response);
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_prop_rsp
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI responses in the Proprietary group
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_prop_rsp(NFC_HDR* p_msg) {
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_evt;
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_VS_CBACK* p_cback = (tNFC_VS_CBACK*)nfc_cb.p_vsc_cback;
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset;
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /*If there's a pending/stored command, restore the associated address of the
4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * callback function */
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cback)
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_cback)((tNFC_VS_EVT)(NCI_RSP_BIT | op_code), p_msg->len, p_evt);
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
481d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Function         nci_proc_prop_raw_vs_rsp
482d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
483d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Description      Process RAW VS responses
484d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
485d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Returns          void
486d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
487d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna*******************************************************************************/
488d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khannavoid nci_proc_prop_raw_vs_rsp(NFC_HDR* p_msg) {
489d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  uint8_t op_code;
490d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  tNFC_VS_CBACK* p_cback = (tNFC_VS_CBACK*)nfc_cb.p_vsc_cback;
491d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
492d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  /* find the start of the NCI message and parse the NCI header */
493d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  uint8_t* p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset;
494d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  uint8_t* p = p_evt + 1;
495d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  NCI_MSG_PRS_HDR1(p, op_code);
496d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
497d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  /* If there's a pending/stored command, restore the associated address of the
498d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna   * callback function */
499d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  if (p_cback) {
500d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna    (*p_cback)((tNFC_VS_EVT)(NCI_RSP_BIT | op_code), p_msg->len, p_evt);
501d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna    nfc_cb.p_vsc_cback = NULL;
502d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  }
503d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  nfc_cb.rawVsCbflag = false;
504d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  nfc_ncif_update_window();
505d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna}
506d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
507d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna/*******************************************************************************
508d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nci_proc_prop_ntf
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NCI notifications in the Proprietary group
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_prop_ntf(NFC_HDR* p_msg) {
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_evt;
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *pp, len, op_code;
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int i;
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* find the start of the NCI message and parse the NCI header */
5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset;
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pp = p + 1;
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NCI_MSG_PRS_HDR1(pp, op_code);
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  len = *pp++;
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < NFC_NUM_VS_CBACKS; i++) {
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfc_cb.p_vs_cb[i]) {
5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*nfc_cb.p_vs_cb[i])((tNFC_VS_EVT)(NCI_NTF_BIT | op_code), p_msg->len,
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           p_evt);
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
535