diff --git a/Android.bp b/Android.bp
index f049a1d..9679a81 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,45 +1 @@
-subdirs = ["src"]
-cc_library_shared {
-    name: "nfc_nci.bcm2079x.default",
-    proprietary: true,
-    relative_install_path: "hw",
-    srcs: [
-        "halimpl/bcm2079x/gki/common/*.c",
-        "halimpl/bcm2079x/gki/ulinux/*.c",
-        "halimpl/bcm2079x/hal/hal/*.c",
-        "halimpl/bcm2079x/adaptation/*.cpp",
-        "halimpl/bcm2079x/adaptation/*.c",
-        "halimpl/bcm2079x/nfc_nci.c",
-        "src/adaptation/CrcChecksum.cpp",
-        "src/nfca_version.c",
-    ],
-    header_libs: [
-        "libhardware_headers",
-        "libhardware_legacy_headers",
-    ],
-    shared_libs: [
-        "libcutils",
-        "liblog",
-        "libhwbinder",
-    ],
-    local_include_dirs: [
-        "halimpl/bcm2079x/include",
-        "halimpl/bcm2079x/gki/ulinux",
-        "halimpl/bcm2079x/gki/common",
-        "halimpl/bcm2079x/adaptation",
-        "src/hal/include",
-        "src/hal/int",
-        "src/nfc/include",
-        "src/nfa/include",
-        "src/udrv/include",
-        "src/include",
-    ],
-    cflags: [
-        "-DBUILDCFG=1",
-        "-Wno-deprecated-register",
-        "-Wno-unused-parameter",
-        "-Wno-missing-field-initializers",
-        "-DNFC_HAL_TARGET=TRUE",
-        "-DNFC_RW_ONLY=TRUE",
-    ],
-}
+subdirs = ["src", "utils"]
diff --git a/halimpl/Android.mk b/halimpl/Android.mk
deleted file mode 100644
index cfd03be..0000000
--- a/halimpl/Android.mk
+++ /dev/null
@@ -1,2 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/halimpl/bcm2079x/adaptation/CondVar.cpp b/halimpl/bcm2079x/adaptation/CondVar.cpp
deleted file mode 100644
index 44b6f2c..0000000
--- a/halimpl/bcm2079x/adaptation/CondVar.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Encapsulate a condition variable for thread synchronization.
- *
- ******************************************************************************/
-#define LOG_TAG "NfcNciHal"
-#include "CondVar.h"
-#include <errno.h>
-#include <string.h>
-#include "_OverrideLog.h"
-
-/*******************************************************************************
-**
-** Function:        CondVar
-**
-** Description:     Initialize member variables.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-CondVar::CondVar() {
-  pthread_condattr_t attr;
-  pthread_condattr_init(&attr);
-  pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
-  memset(&mCondition, 0, sizeof(mCondition));
-  int const res = pthread_cond_init(&mCondition, &attr);
-  if (res) {
-    ALOGE("CondVar::CondVar: fail init; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        ~CondVar
-**
-** Description:     Cleanup all resources.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-CondVar::~CondVar() {
-  int const res = pthread_cond_destroy(&mCondition);
-  if (res) {
-    ALOGE("CondVar::~CondVar: fail destroy; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        wait
-**
-** Description:     Block the caller and wait for a condition.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void CondVar::wait(Mutex& mutex) {
-  int const res = pthread_cond_wait(&mCondition, mutex.nativeHandle());
-  if (res) {
-    ALOGE("CondVar::wait: fail wait; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        wait
-**
-** Description:     Block the caller and wait for a condition.
-**                  millisec: Timeout in milliseconds.
-**
-** Returns:         True if wait is successful; false if timeout occurs.
-**
-*******************************************************************************/
-bool CondVar::wait(Mutex& mutex, long millisec) {
-  bool retVal = false;
-  struct timespec absoluteTime;
-
-  if (clock_gettime(CLOCK_MONOTONIC, &absoluteTime) == -1) {
-    ALOGE("CondVar::wait: fail get time; errno=0x%X", errno);
-  } else {
-    absoluteTime.tv_sec += millisec / 1000;
-    long ns = absoluteTime.tv_nsec + ((millisec % 1000) * 1000000);
-    if (ns > 1000000000) {
-      absoluteTime.tv_sec++;
-      absoluteTime.tv_nsec = ns - 1000000000;
-    } else
-      absoluteTime.tv_nsec = ns;
-  }
-
-  int waitResult =
-      pthread_cond_timedwait(&mCondition, mutex.nativeHandle(), &absoluteTime);
-  if ((waitResult != 0) && (waitResult != ETIMEDOUT))
-    ALOGE("CondVar::wait: fail timed wait; error=0x%X", waitResult);
-  retVal = (waitResult == 0);  // waited successfully
-  return retVal;
-}
-
-/*******************************************************************************
-**
-** Function:        notifyOne
-**
-** Description:     Unblock the waiting thread.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void CondVar::notifyOne() {
-  int const res = pthread_cond_signal(&mCondition);
-  if (res) {
-    ALOGE("CondVar::notifyOne: fail signal; error=0x%X", res);
-  }
-}
diff --git a/halimpl/bcm2079x/adaptation/CondVar.h b/halimpl/bcm2079x/adaptation/CondVar.h
deleted file mode 100644
index 82e5c6c..0000000
--- a/halimpl/bcm2079x/adaptation/CondVar.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Encapsulate a condition variable for thread synchronization.
- *
- ******************************************************************************/
-
-#pragma once
-#include <pthread.h>
-#include "Mutex.h"
-
-class CondVar {
- public:
-  /*******************************************************************************
-  **
-  ** Function:        CondVar
-  **
-  ** Description:     Initialize member variables.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  CondVar();
-
-  /*******************************************************************************
-  **
-  ** Function:        ~CondVar
-  **
-  ** Description:     Cleanup all resources.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  ~CondVar();
-
-  /*******************************************************************************
-  **
-  ** Function:        wait
-  **
-  ** Description:     Block the caller and wait for a condition.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void wait(Mutex& mutex);
-
-  /*******************************************************************************
-  **
-  ** Function:        wait
-  **
-  ** Description:     Block the caller and wait for a condition.
-  **                  millisec: Timeout in milliseconds.
-  **
-  ** Returns:         True if wait is successful; false if timeout occurs.
-  **
-  *******************************************************************************/
-  bool wait(Mutex& mutex, long millisec);
-
-  /*******************************************************************************
-  **
-  ** Function:        notifyOne
-  **
-  ** Description:     Unblock the waiting thread.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void notifyOne();
-
- private:
-  pthread_cond_t mCondition;
-};
diff --git a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
deleted file mode 100644
index 1c84426..0000000
--- a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
+++ /dev/null
@@ -1,373 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  HAL Adaptation Interface (HAI). This interface regulates the interaction
- *  between standard Android HAL and Broadcom-specific HAL.  It adapts
- *  Broadcom-specific features to the Android framework.
- *
- ******************************************************************************/
-#define LOG_TAG "NfcNciHal"
-#include "HalAdaptation.h"
-#include <cutils/properties.h>
-#include <errno.h>
-#include <pthread.h>
-#include "SyncEvent.h"
-#include "_OverrideLog.h"
-#include "android_logmsg.h"
-#include "buildcfg.h"
-#include "config.h"
-#include "nfc_hal_int.h"
-#include "nfc_hal_post_reset.h"
-extern void delete_hal_non_volatile_store(bool forceDelete);
-extern void verify_hal_non_volatile_store();
-extern void resetConfig();
-extern "C" {
-#include "userial.h"
-}
-
-extern void configureCrystalFrequency();
-
-///////////////////////////////////////
-// private declaration, definition
-
-static nfc_stack_callback_t* gAndroidHalCallback = NULL;
-static nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL;
-static SyncEvent gOpenCompletedEvent;
-static SyncEvent gPostInitCompletedEvent;
-static SyncEvent gCloseCompletedEvent;
-
-uint32_t ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL;  // 0x017F00;
-
-static void BroadcomHalCallback(uint8_t event, tHAL_NFC_STATUS status);
-static void BroadcomHalDataCallback(uint16_t data_len, uint8_t* p_data);
-
-static bool isColdBoot = true;
-
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-extern const uint8_t nfca_version_string[];
-extern const uint8_t nfa_version_string[];
-
-tNFC_HAL_DM_PRE_SET_MEM nfc_hal_pre_set_mem_20795a1[] = {
-    {0x0016403c, 0x00000008},
-    {0x0016403c, 0x00000000},
-    {0x0014008c, 0x00000001},
-    {0, 0}};
-
-extern tNFC_HAL_DM_PRE_SET_MEM* p_nfc_hal_dm_pre_set_mem;
-
-///////////////////////////////////////
-
-int HaiInitializeLibrary(const bcm2079x_dev_t* device) {
-  ALOGD("%s: enter", __func__);
-  ALOGE("%s: ver=%s nfa=%s", __func__, nfca_version_string, nfa_version_string);
-  int retval = EACCES;
-  unsigned long freq = 0;
-  unsigned long num = 0;
-  char temp[120];
-  int8_t prop_value;
-  uint8_t logLevel = 0;
-
-  logLevel = InitializeGlobalAppLogLevel();
-
-  if (GetNumValue(NAME_GLOBAL_RESET, &num, sizeof(num))) {
-    if (num == 1) {
-      // Send commands to disable boc
-      p_nfc_hal_dm_pre_set_mem = nfc_hal_pre_set_mem_20795a1;
-    }
-  }
-
-  configureCrystalFrequency();
-  verify_hal_non_volatile_store();
-  if (GetNumValue(NAME_PRESERVE_STORAGE, (char*)&num, sizeof(num)) &&
-      (num == 1))
-    ALOGD("%s: preserve HAL NV store", __func__);
-  else {
-    delete_hal_non_volatile_store(false);
-  }
-
-  if (GetNumValue(NAME_USE_RAW_NCI_TRACE, &num, sizeof(num))) {
-    if (num == 1) {
-      // display protocol traces in raw format
-      ProtoDispAdapterUseRawOutput(TRUE);
-    }
-  }
-
-  // Initialize protocol logging level
-  InitializeProtocolLogLevel();
-
-  tUSERIAL_OPEN_CFG cfg;
-  struct tUART_CONFIG uart;
-
-  if (GetStrValue(NAME_UART_PARITY, temp, sizeof(temp))) {
-    if (strcmp(temp, "even") == 0)
-      uart.m_iParity = USERIAL_PARITY_EVEN;
-    else if (strcmp(temp, "odd") == 0)
-      uart.m_iParity = USERIAL_PARITY_ODD;
-    else if (strcmp(temp, "none") == 0)
-      uart.m_iParity = USERIAL_PARITY_NONE;
-  } else
-    uart.m_iParity = USERIAL_PARITY_NONE;
-
-  if (GetStrValue(NAME_UART_STOPBITS, temp, sizeof(temp))) {
-    if (strcmp(temp, "1") == 0)
-      uart.m_iStopbits = USERIAL_STOPBITS_1;
-    else if (strcmp(temp, "2") == 0)
-      uart.m_iStopbits = USERIAL_STOPBITS_2;
-    else if (strcmp(temp, "1.5") == 0)
-      uart.m_iStopbits = USERIAL_STOPBITS_1_5;
-  } else if (GetNumValue(NAME_UART_STOPBITS, &num, sizeof(num))) {
-    if (num == 1)
-      uart.m_iStopbits = USERIAL_STOPBITS_1;
-    else if (num == 2)
-      uart.m_iStopbits = USERIAL_STOPBITS_2;
-  } else
-    uart.m_iStopbits = USERIAL_STOPBITS_1;
-
-  if (GetNumValue(NAME_UART_DATABITS, &num, sizeof(num))) {
-    if (5 <= num && num <= 8) uart.m_iDatabits = (1 << (num + 1));
-  } else
-    uart.m_iDatabits = USERIAL_DATABITS_8;
-
-  if (GetNumValue(NAME_UART_BAUD, &num, sizeof(num))) {
-    if (num == 300)
-      uart.m_iBaudrate = USERIAL_BAUD_300;
-    else if (num == 600)
-      uart.m_iBaudrate = USERIAL_BAUD_600;
-    else if (num == 1200)
-      uart.m_iBaudrate = USERIAL_BAUD_1200;
-    else if (num == 2400)
-      uart.m_iBaudrate = USERIAL_BAUD_2400;
-    else if (num == 9600)
-      uart.m_iBaudrate = USERIAL_BAUD_9600;
-    else if (num == 19200)
-      uart.m_iBaudrate = USERIAL_BAUD_19200;
-    else if (num == 57600)
-      uart.m_iBaudrate = USERIAL_BAUD_57600;
-    else if (num == 115200)
-      uart.m_iBaudrate = USERIAL_BAUD_115200;
-    else if (num == 230400)
-      uart.m_iBaudrate = USERIAL_BAUD_230400;
-    else if (num == 460800)
-      uart.m_iBaudrate = USERIAL_BAUD_460800;
-    else if (num == 921600)
-      uart.m_iBaudrate = USERIAL_BAUD_921600;
-  } else if (GetStrValue(NAME_UART_BAUD, temp, sizeof(temp))) {
-    if (strcmp(temp, "auto") == 0) uart.m_iBaudrate = USERIAL_BAUD_AUTO;
-  } else
-    uart.m_iBaudrate = USERIAL_BAUD_115200;
-
-  memset(&cfg, 0, sizeof(tUSERIAL_OPEN_CFG));
-  cfg.fmt = uart.m_iDatabits | uart.m_iParity | uart.m_iStopbits;
-  cfg.baud = uart.m_iBaudrate;
-
-  ALOGD("%s: uart config=0x%04x, %d\n", __func__, cfg.fmt, cfg.baud);
-  USERIAL_Init(&cfg);
-
-  if (GetNumValue(NAME_NFCC_ENABLE_TIMEOUT, &num, sizeof(num))) {
-    p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout = num;
-  }
-
-  if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num)) && num == 0) {
-    // Since NFA_MAX_EE_SUPPORTED is explicetly set to 0, no UICC support is
-    // needed.
-    p_nfc_hal_cfg->nfc_hal_hci_uicc_support = 0;
-  }
-
-  prop_value = property_get_bool("nfc.bcm2079x.isColdboot", 0);
-  if (prop_value) {
-    isColdBoot = true;
-    property_set("nfc.bcm2079x.isColdboot", "0");
-  }
-  // Set 'first boot' flag based on static variable that will get set to false
-  // after the stack has first initialized the EE.
-  p_nfc_hal_cfg->nfc_hal_first_boot = isColdBoot ? TRUE : FALSE;
-
-  HAL_NfcInitialize();
-  HAL_NfcSetTraceLevel(logLevel);  // Initialize HAL's logging level
-
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiTerminateLibrary() {
-  int retval = EACCES;
-  ALOGD("%s: enter", __func__);
-
-  HAL_NfcTerminate();
-  gAndroidHalCallback = NULL;
-  gAndroidHalDataCallback = NULL;
-  GKI_shutdown();
-  resetConfig();
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiOpen(const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc,
-            nfc_stack_data_callback_t* halDataCallbackFunc) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  gAndroidHalCallback = halCallbackFunc;
-  gAndroidHalDataCallback = halDataCallbackFunc;
-
-  SyncEventGuard guard(gOpenCompletedEvent);
-  HAL_NfcOpen(BroadcomHalCallback, BroadcomHalDataCallback);
-  gOpenCompletedEvent.wait();
-
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-void BroadcomHalCallback(uint8_t event, tHAL_NFC_STATUS status) {
-  ALOGD("%s: enter; event=0x%X", __func__, event);
-  switch (event) {
-    case HAL_NFC_OPEN_CPLT_EVT: {
-      ALOGD("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __func__, status);
-      SyncEventGuard guard(gOpenCompletedEvent);
-      gOpenCompletedEvent.notifyOne();
-      break;
-    }
-
-    case HAL_NFC_POST_INIT_CPLT_EVT: {
-      ALOGD("%s: HAL_NFC_POST_INIT_CPLT_EVT", __func__);
-      SyncEventGuard guard(gPostInitCompletedEvent);
-      gPostInitCompletedEvent.notifyOne();
-      break;
-    }
-
-    case HAL_NFC_CLOSE_CPLT_EVT: {
-      ALOGD("%s: HAL_NFC_CLOSE_CPLT_EVT", __func__);
-      SyncEventGuard guard(gCloseCompletedEvent);
-      gCloseCompletedEvent.notifyOne();
-      break;
-    }
-
-    case HAL_NFC_ERROR_EVT: {
-      ALOGD("%s: HAL_NFC_ERROR_EVT", __func__);
-      {
-        SyncEventGuard guard(gOpenCompletedEvent);
-        gOpenCompletedEvent.notifyOne();
-      }
-      {
-        SyncEventGuard guard(gPostInitCompletedEvent);
-        gPostInitCompletedEvent.notifyOne();
-      }
-      {
-        SyncEventGuard guard(gCloseCompletedEvent);
-        gCloseCompletedEvent.notifyOne();
-      }
-      break;
-    }
-  }
-  gAndroidHalCallback(event, status);
-  ALOGD("%s: exit; event=0x%X", __func__, event);
-}
-
-void BroadcomHalDataCallback(uint16_t data_len, uint8_t* p_data) {
-  ALOGD("%s: enter; len=%u", __func__, data_len);
-  gAndroidHalDataCallback(data_len, p_data);
-}
-
-int HaiClose(const bcm2079x_dev_t* device) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  SyncEventGuard guard(gCloseCompletedEvent);
-  HAL_NfcClose();
-  gCloseCompletedEvent.wait();
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiCoreInitialized(const bcm2079x_dev_t* device,
-                       uint8_t* coreInitResponseParams) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  SyncEventGuard guard(gPostInitCompletedEvent);
-  HAL_NfcCoreInitialized(0, coreInitResponseParams);
-  gPostInitCompletedEvent.wait();
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiWrite(const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data) {
-  ALOGD("%s: enter; len=%u", __func__, dataLen);
-  int retval = EACCES;
-
-  HAL_NfcWrite(dataLen, const_cast<uint8_t*>(data));
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiPreDiscover(const bcm2079x_dev_t* device) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  // This function is a clear indication that the stack is initializing
-  // EE.  So we can reset the cold-boot flag here.
-  isColdBoot = false;
-  retval = HAL_NfcPreDiscover() ? 1 : 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiControlGranted(const bcm2079x_dev_t* device) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  HAL_NfcControlGranted();
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiPowerCycle(const bcm2079x_dev_t* device) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  HAL_NfcPowerCycle();
-  retval = 0;
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-int HaiGetMaxNfcee(const bcm2079x_dev_t* device, uint8_t* maxNfcee) {
-  ALOGD("%s: enter", __func__);
-  int retval = EACCES;
-
-  // This function is a clear indication that the stack is initializing
-  // EE.  So we can reset the cold-boot flag here.
-  isColdBoot = false;
-
-  if (maxNfcee) {
-    *maxNfcee = HAL_NfcGetMaxNfcee();
-    ALOGD("%s: max_ee from HAL to use %d", __func__, *maxNfcee);
-    retval = 0;
-  }
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
diff --git a/halimpl/bcm2079x/adaptation/Mutex.cpp b/halimpl/bcm2079x/adaptation/Mutex.cpp
deleted file mode 100644
index c8ebd63..0000000
--- a/halimpl/bcm2079x/adaptation/Mutex.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Encapsulate a mutex for thread synchronization.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-#include "Mutex.h"
-#include <errno.h>
-#include <string.h>
-#include "_OverrideLog.h"
-
-/*******************************************************************************
-**
-** Function:        Mutex
-**
-** Description:     Initialize member variables.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-Mutex::Mutex() {
-  memset(&mMutex, 0, sizeof(mMutex));
-  int res = pthread_mutex_init(&mMutex, NULL);
-  if (res != 0) {
-    ALOGE("Mutex::Mutex: fail init; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        ~Mutex
-**
-** Description:     Cleanup all resources.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-Mutex::~Mutex() {
-  int res = pthread_mutex_destroy(&mMutex);
-  if (res != 0) {
-    ALOGE("Mutex::~Mutex: fail destroy; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        lock
-**
-** Description:     Block the thread and try lock the mutex.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void Mutex::lock() {
-  int res = pthread_mutex_lock(&mMutex);
-  if (res != 0) {
-    ALOGE("Mutex::lock: fail lock; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        unlock
-**
-** Description:     Unlock a mutex to unblock a thread.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void Mutex::unlock() {
-  int res = pthread_mutex_unlock(&mMutex);
-  if (res != 0) {
-    ALOGE("Mutex::unlock: fail unlock; error=0x%X", res);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        tryLock
-**
-** Description:     Try to lock the mutex.
-**
-** Returns:         True if the mutex is locked.
-**
-*******************************************************************************/
-bool Mutex::tryLock() {
-  int res = pthread_mutex_trylock(&mMutex);
-  if ((res != 0) && (res != EBUSY)) {
-    ALOGE("Mutex::tryLock: error=0x%X", res);
-  }
-  return res == 0;
-}
-
-/*******************************************************************************
-**
-** Function:        nativeHandle
-**
-** Description:     Get the handle of the mutex.
-**
-** Returns:         Handle of the mutex.
-**
-*******************************************************************************/
-pthread_mutex_t* Mutex::nativeHandle() { return &mMutex; }
diff --git a/halimpl/bcm2079x/adaptation/Mutex.h b/halimpl/bcm2079x/adaptation/Mutex.h
deleted file mode 100644
index 741563c..0000000
--- a/halimpl/bcm2079x/adaptation/Mutex.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Encapsulate a mutex for thread synchronization.
- *
- ******************************************************************************/
-
-#pragma once
-#include <pthread.h>
-
-class Mutex {
- public:
-  /*******************************************************************************
-  **
-  ** Function:        Mutex
-  **
-  ** Description:     Initialize member variables.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  Mutex();
-
-  /*******************************************************************************
-  **
-  ** Function:        ~Mutex
-  **
-  ** Description:     Cleanup all resources.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  ~Mutex();
-
-  /*******************************************************************************
-  **
-  ** Function:        lock
-  **
-  ** Description:     Block the thread and try lock the mutex.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void lock();
-
-  /*******************************************************************************
-  **
-  ** Function:        unlock
-  **
-  ** Description:     Unlock a mutex to unblock a thread.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void unlock();
-
-  /*******************************************************************************
-  **
-  ** Function:        tryLock
-  **
-  ** Description:     Try to lock the mutex.
-  **
-  ** Returns:         True if the mutex is locked.
-  **
-  *******************************************************************************/
-  bool tryLock();
-
-  /*******************************************************************************
-  **
-  ** Function:        nativeHandle
-  **
-  ** Description:     Get the handle of the mutex.
-  **
-  ** Returns:         Handle of the mutex.
-  **
-  *******************************************************************************/
-  pthread_mutex_t* nativeHandle();
-
- private:
-  pthread_mutex_t mMutex;
-};
diff --git a/halimpl/bcm2079x/adaptation/NonVolatileStore.cpp b/halimpl/bcm2079x/adaptation/NonVolatileStore.cpp
deleted file mode 100644
index f5b3f0c..0000000
--- a/halimpl/bcm2079x/adaptation/NonVolatileStore.cpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-
-#include "_OverrideLog.h"
-#include "gki.h"
-extern "C" {
-#include "nfc_hal_nv_ci.h"
-#include "nfc_hal_target.h"
-}
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <string>
-#include "CrcChecksum.h"
-#include "config.h"
-
-// directory of HAL's non-volatile storage
-static const char* default_location = "/data/nfc";
-static const char* filename_prefix = "/halStorage.bin";
-static const std::string get_storage_location();
-void delete_hal_non_volatile_store(bool forceDelete);
-void verify_hal_non_volatile_store();
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_co_read
-**
-** Description      This function is called by NFA to read in data from the
-**                  previously opened file.
-**
-** Parameters       p_buf   - buffer to read the data into.
-**                  nbytes  - number of bytes to read into the buffer.
-**
-** Returns          void
-**
-**                  Note: Upon completion of the request, nfc_hal_nv_ci_read ()
-*is
-**                        called with the buffer of data, along with the number
-**                        of bytes read into the buffer, and a status.  The
-**                        call-in function should only be called when ALL
-*requested
-**                        bytes have been read, the end of file has been
-*detected,
-**                        or an error has occurred.
-**
-*******************************************************************************/
-void nfc_hal_nv_co_read(uint8_t* p_buf, uint16_t nbytes, uint8_t block) {
-  std::string fn = get_storage_location();
-  char filename[256];
-
-  fn.append(filename_prefix);
-  if (fn.length() > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), block);
-
-  ALOGD("%s: buffer len=%u; file=%s", __func__, nbytes, filename);
-  int fileStream = open(filename, O_RDONLY);
-  if (fileStream >= 0) {
-    unsigned short checksum = 0;
-    size_t actualReadCrc = read(fileStream, &checksum, sizeof(checksum));
-    size_t actualReadData = read(fileStream, p_buf, nbytes);
-    close(fileStream);
-    if (actualReadData > 0) {
-      ALOGD("%s: data size=%zu", __func__, actualReadData);
-      nfc_hal_nv_ci_read(actualReadData, NFC_HAL_NV_CO_OK, block);
-    } else {
-      ALOGE("%s: fail to read", __func__);
-      nfc_hal_nv_ci_read(0, NFC_HAL_NV_CO_FAIL, block);
-    }
-  } else {
-    ALOGD("%s: fail to open", __func__);
-    nfc_hal_nv_ci_read(0, NFC_HAL_NV_CO_FAIL, block);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_co_write
-**
-** Description      This function is called by io to send file data to the
-**                  phone.
-**
-** Parameters       p_buf   - buffer to read the data from.
-**                  nbytes  - number of bytes to write out to the file.
-**
-** Returns          void
-**
-**                  Note: Upon completion of the request, nfc_hal_nv_ci_write ()
-*is
-**                        called with the file descriptor and the status.  The
-**                        call-in function should only be called when ALL
-*requested
-**                        bytes have been written, or an error has been
-*detected,
-**
-*******************************************************************************/
-void nfc_hal_nv_co_write(const uint8_t* p_buf, uint16_t nbytes, uint8_t block) {
-  std::string fn = get_storage_location();
-  char filename[256];
-  int fileStream = 0;
-
-  fn.append(filename_prefix);
-  if (fn.length() > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), block);
-  ALOGD("%s: bytes=%u; file=%s", __func__, nbytes, filename);
-
-  fileStream = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
-  if (fileStream >= 0) {
-    unsigned short checksum = crcChecksumCompute(p_buf, nbytes);
-    size_t actualWrittenCrc = write(fileStream, &checksum, sizeof(checksum));
-    size_t actualWrittenData = write(fileStream, p_buf, nbytes);
-    ALOGD("%s: %zu bytes written", __func__, actualWrittenData);
-    if ((actualWrittenData == nbytes) &&
-        (actualWrittenCrc == sizeof(checksum))) {
-      nfc_hal_nv_ci_write(NFC_HAL_NV_CO_OK);
-    } else {
-      ALOGE("%s: fail to write", __func__);
-      nfc_hal_nv_ci_write(NFC_HAL_NV_CO_FAIL);
-    }
-    close(fileStream);
-  } else {
-    ALOGE("%s: fail to open, error = %d", __func__, errno);
-    nfc_hal_nv_ci_write(NFC_HAL_NV_CO_FAIL);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         get_storage_location
-**
-** Description      Get the absolute directory path of the HAL's storage
-*location.
-**
-** Parameters       none
-**
-** Returns          Absolute path.
-**
-*******************************************************************************/
-const std::string get_storage_location() {
-  char buffer[100];
-  memset(buffer, 0, sizeof(buffer));
-  if (!GetStrValue(NAME_NFA_STORAGE, buffer, sizeof(buffer)))
-    return default_location;
-  else
-    return std::string(buffer);
-}
-
-/*******************************************************************************
-**
-** Function         delete_hal_non_volatile_store
-**
-** Description      Delete all the content of the HAL's storage location.
-**
-** Parameters       forceDelete: unconditionally delete the storage.
-**
-** Returns          none
-**
-*******************************************************************************/
-void delete_hal_non_volatile_store(bool forceDelete) {
-  static bool firstTime = true;
-  std::string fn = get_storage_location();
-  char filename[256];
-  int stat = 0;
-
-  if ((firstTime == false) && (forceDelete == false)) return;
-  firstTime = false;
-
-  ALOGD("%s", __func__);
-
-  fn.append(filename_prefix);
-  if (fn.length() > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), DH_NV_BLOCK);
-  remove(filename);
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
-  remove(filename);
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
-  remove(filename);
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
-  remove(filename);
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F5_NV_BLOCK);
-  remove(filename);
-}
-
-/*******************************************************************************
-**
-** Function         verify_hal_non_volatile_store
-**
-** Description      Verify the content of all non-volatile store.
-**
-** Parameters       none
-**
-** Returns          none
-**
-*******************************************************************************/
-void verify_hal_non_volatile_store() {
-  ALOGD("%s", __func__);
-  std::string fn = get_storage_location();
-  char filename[256];
-  bool isValid = false;
-
-  fn.append(filename_prefix);
-  if (fn.length() > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-
-  snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), DH_NV_BLOCK);
-  if (crcChecksumVerifyIntegrity(filename)) {
-    snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
-    if (crcChecksumVerifyIntegrity(filename)) {
-      snprintf(filename, sizeof(filename), "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
-      if (crcChecksumVerifyIntegrity(filename)) {
-        snprintf(filename, sizeof(filename), "%s%u", fn.c_str(),
-                 HC_F2_NV_BLOCK);
-        if (crcChecksumVerifyIntegrity(filename)) {
-          snprintf(filename, sizeof(filename), "%s%u", fn.c_str(),
-                   HC_F5_NV_BLOCK);
-          if (crcChecksumVerifyIntegrity(filename)) isValid = true;
-        }
-      }
-    }
-  }
-
-  if (isValid == false) delete_hal_non_volatile_store(true);
-}
diff --git a/halimpl/bcm2079x/adaptation/StartupConfig.cpp b/halimpl/bcm2079x/adaptation/StartupConfig.cpp
deleted file mode 100644
index 333bc3b..0000000
--- a/halimpl/bcm2079x/adaptation/StartupConfig.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- * Construct a buffer that contains multiple Type-Length-Value contents
- * that is used by the HAL in a CORE_SET_CONFIG NCI command.
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-#include "StartupConfig.h"
-#include "_OverrideLog.h"
-
-const uint8_t StartupConfig::mMaxLength = 255;
-
-/*******************************************************************************
-**
-** Function:        initialize
-**
-** Description:     Initialize all member variables.
-**
-** Returns:         None
-**
-*******************************************************************************/
-StartupConfig::StartupConfig() {
-  // set first byte to 0, which is length of payload
-  mBuffer.append((uint8_string::size_type)1, (uint8_string::value_type)0);
-}
-
-/*******************************************************************************
-**
-** Function:        initialize
-**
-** Description:     Reset all member variables.
-**
-** Returns:         None
-**
-*******************************************************************************/
-void StartupConfig::initialize() {
-  mBuffer.clear();
-  // set first byte to 0, which is length of payload
-  mBuffer.append((uint8_string::size_type)1, (uint8_string::value_type)0);
-}
-
-/*******************************************************************************
-**
-** Function:        getInternalBuffer
-**
-** Description:     Get the pointer to buffer that contains multiple
-**                  Type-Length-Value contents.
-**
-** Returns:         Pointer to buffer.
-**
-*******************************************************************************/
-const uint8_t* StartupConfig::getInternalBuffer() { return mBuffer.data(); }
-
-/*******************************************************************************
-**
-** Function:        append
-**
-** Description:     Append new config data to internal buffer.
-**                  newContent: buffer containing new content; newContent[0] is
-**                          payload length; newContent[1..end] is payload.
-**                  newContentLen: total length of newContent.
-**
-** Returns:         True if ok.
-**
-*******************************************************************************/
-bool StartupConfig::append(const uint8_t* newContent, uint8_t newContentLen) {
-  static const char fn[] = "StartupConfig::append";
-  if ((newContentLen + mBuffer.size()) > mMaxLength) {
-    ALOGE("%s: exceed max length", fn);
-    return false;
-  }
-
-  ALOGD("%s: try append %zu bytes", fn,
-        (uint8_string::size_type)(newContentLen));
-  // append new payload into private buffer
-  mBuffer.append(newContent + 1, (uint8_string::size_type)(newContentLen - 1));
-  // increase size counter of payload in private buffer
-  mBuffer[0] = mBuffer[0] + newContentLen - 1;
-  ALOGD("%s: new size %u bytes", fn, mBuffer[0]);
-  return true;
-};
-
-/*******************************************************************************
-**
-** Function:        disableSecureElement
-**
-** Description:     Adjust a TLV to disable secure element(s).  The TLV's type
-*is 0xC2.
-**                  bitmask: 0xC0 = do not detect any secure element.
-**                           0x40 = do not detect secure element in slot 0.
-**                           0x80 = do not detect secure element in slot 1.
-**
-** Returns:         True if ok.
-**
-*******************************************************************************/
-bool StartupConfig::disableSecureElement(uint8_t bitmask) {
-  const uint8_t maxLen = mBuffer[0];
-  uint8_t index = 1, tlvType = 0, tlvLen = 0;
-  bool found0xC2 = false;
-
-  while (true) {
-    if (index > maxLen) break;
-    tlvType = mBuffer[index];
-    index++;
-    tlvLen = mBuffer[index];
-    index++;
-    if (tlvType == 0xC2)  // this TLV controls secure elements
-    {
-      index++;  // index of second byte in TLV's value
-      mBuffer[index] = mBuffer[index] | bitmask;  // turn on certain bits
-      found0xC2 = true;
-    } else
-      index += tlvLen;
-  }
-
-  if (found0xC2 == false) {
-    uint8_t tlv[] = {0x04, 0xC2, 0x02, 0x61, 0x00};
-    tlv[4] = tlv[4] | bitmask;
-    found0xC2 = append(tlv, 5);
-  }
-  return found0xC2;
-}
diff --git a/halimpl/bcm2079x/adaptation/SyncEvent.h b/halimpl/bcm2079x/adaptation/SyncEvent.h
deleted file mode 100644
index 4f9384f..0000000
--- a/halimpl/bcm2079x/adaptation/SyncEvent.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Synchronize two or more threads using a condition variable and a mutex.
- *
- ******************************************************************************/
-#pragma once
-#include "CondVar.h"
-#include "Mutex.h"
-
-class SyncEvent {
- public:
-  /*******************************************************************************
-  **
-  ** Function:        ~SyncEvent
-  **
-  ** Description:     Cleanup all resources.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  ~SyncEvent() {}
-
-  /*******************************************************************************
-  **
-  ** Function:        start
-  **
-  ** Description:     Start a synchronization operation.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void start() { mMutex.lock(); }
-
-  /*******************************************************************************
-  **
-  ** Function:        wait
-  **
-  ** Description:     Block the thread and wait for the event to occur.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void wait() { mCondVar.wait(mMutex); }
-
-  /*******************************************************************************
-  **
-  ** Function:        wait
-  **
-  ** Description:     Block the thread and wait for the event to occur.
-  **                  millisec: Timeout in milliseconds.
-  **
-  ** Returns:         True if wait is successful; false if timeout occurs.
-  **
-  *******************************************************************************/
-  bool wait(long millisec) {
-    bool retVal = mCondVar.wait(mMutex, millisec);
-    return retVal;
-  }
-
-  /*******************************************************************************
-  **
-  ** Function:        notifyOne
-  **
-  ** Description:     Notify a blocked thread that the event has occured.
-  *Unblocks it.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void notifyOne() { mCondVar.notifyOne(); }
-
-  /*******************************************************************************
-  **
-  ** Function:        end
-  **
-  ** Description:     End a synchronization operation.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  void end() { mMutex.unlock(); }
-
- private:
-  CondVar mCondVar;
-  Mutex mMutex;
-};
-
-/*****************************************************************************/
-/*****************************************************************************/
-
-/*****************************************************************************
-**
-**  Name:           SyncEventGuard
-**
-**  Description:    Automatically start and end a synchronization event.
-**
-*****************************************************************************/
-class SyncEventGuard {
- public:
-  /*******************************************************************************
-  **
-  ** Function:        SyncEventGuard
-  **
-  ** Description:     Start a synchronization operation.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  SyncEventGuard(SyncEvent& event) : mEvent(event) {
-    event.start();  // automatically start operation
-  };
-
-  /*******************************************************************************
-  **
-  ** Function:        ~SyncEventGuard
-  **
-  ** Description:     End a synchronization operation.
-  **
-  ** Returns:         None.
-  **
-  *******************************************************************************/
-  ~SyncEventGuard() {
-    mEvent.end();  // automatically end operation
-  };
-
- private:
-  SyncEvent& mEvent;
-};
diff --git a/halimpl/bcm2079x/adaptation/_OverrideLog.cpp b/halimpl/bcm2079x/adaptation/_OverrideLog.cpp
deleted file mode 100644
index 0fe9bae..0000000
--- a/halimpl/bcm2079x/adaptation/_OverrideLog.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-
-/******************************************************************************
- *
- *  Override the ALOGD(), ALOGE(), and other logging macros from
- *  /system/core/include/cutils/log.h
- *
- ******************************************************************************/
-#include "_OverrideLog.h"
-#include <cutils/properties.h>
-#include <stdio.h>
-#include <string.h>
-#include "android_logmsg.h"
-#include "config.h"
-
-unsigned char appl_trace_level = BT_TRACE_LEVEL_DEBUG;
-
-/*******************************************************************************
-**
-** Function:        InitializeGlobalAppLogLevel
-**
-** Description:     Initialize and get global logging level from
-**                  Android property nfc.app_log_level.
-**
-** Returns:         Global log level:
-**                  BT_TRACE_LEVEL_NONE    0        * No trace messages to be
-*generated
-**                  BT_TRACE_LEVEL_ERROR   1        * Error condition trace
-*messages
-**                  BT_TRACE_LEVEL_WARNING 2        * Warning condition trace
-*messages
-**                  BT_TRACE_LEVEL_API     3        * API traces
-**                  BT_TRACE_LEVEL_EVENT   4        * Debug messages for events
-**                  BT_TRACE_LEVEL_DEBUG   5        * Debug messages (general)
-**
-*******************************************************************************/
-unsigned char InitializeGlobalAppLogLevel() {
-  unsigned long num = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  num = 1;
-  if (GetNumValue(NAME_APPL_TRACE_LEVEL, &num, sizeof(num)))
-    appl_trace_level = (unsigned char)num;
-
-  int len = property_get("nfc.app_log_level", valueStr, "");
-  if (len > 0) {
-    // let Android property override default value
-    sscanf(valueStr, "%lu", &num);
-    appl_trace_level = (unsigned char)num;
-  }
-
-  // 0xFF is a special value used by the stack to query the current
-  // trace level; it does not change any trace level
-  if (appl_trace_level == 0xFF) appl_trace_level = BT_TRACE_LEVEL_DEBUG;
-  ALOGD("%s: level=%u", __func__, appl_trace_level);
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) {
-    // display protocol traces in raw format
-    ProtoDispAdapterUseRawOutput(TRUE);
-  }
-  return appl_trace_level;
-}
-
-uint32_t InitializeProtocolLogLevel() {
-  uint32_t num = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  if (GetNumValue(NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof(num)))
-    ScrProtocolTraceFlag = num;
-
-  int len = property_get("nfc.enable_protocol_log", valueStr, "");
-  if (len > 0) {
-    if (strncmp("0", valueStr, 1) == 0) {
-      ScrProtocolTraceFlag = 0;
-    } else {
-      ScrProtocolTraceFlag = ~0;
-    }
-  }
-
-  return ScrProtocolTraceFlag;
-}
diff --git a/halimpl/bcm2079x/adaptation/android_logmsg.cpp b/halimpl/bcm2079x/adaptation/android_logmsg.cpp
deleted file mode 100644
index afd03c2..0000000
--- a/halimpl/bcm2079x/adaptation/android_logmsg.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "android_logmsg.h"
-#include <cutils/log.h>
-#include "_OverrideLog.h"
-#include "buildcfg.h"
-#include "nfc_target.h"
-
-extern uint32_t ScrProtocolTraceFlag;
-#define MAX_NCI_PACKET_SIZE 259
-#define BTE_LOG_BUF_SIZE 1024
-#define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
-#define MAX_LOGCAT_LINE 4096
-#define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
-static char log_line[MAX_LOGCAT_LINE];
-static const char* sTable = "0123456789abcdef";
-static bool sIsUseRaw = FALSE;
-static void ToHex(const uint8_t* data, uint16_t len, char* hexString,
-                  uint16_t hexStringSize);
-static void dumpbin(const char* data, int size, uint32_t trace_layer,
-                    uint32_t trace_type);
-static inline void word2hex(const char* data, char** hex);
-static inline void byte2char(const char* data, char** str);
-static inline void byte2hex(const char* data, char** str);
-
-void BTDISP_LOCK_LOG() {}
-
-void BTDISP_UNLOCK_LOG() {}
-
-void BTDISP_INIT_LOCK() {}
-
-void BTDISP_UNINIT_LOCK() {}
-
-void ProtoDispAdapterUseRawOutput(bool isUseRaw) { sIsUseRaw = isUseRaw; }
-
-void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
-                                      bool is_recv) {
-  // Protocol decoder is not available, so decode NCI packet into hex numbers.
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_NCI)) return;
-  char line_buf[(MAX_NCI_PACKET_SIZE * 2) + 1];
-  ToHex(nciPacket, nciPacketLen, line_buf, sizeof(line_buf));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR" : "BrcmNciX",
-                      line_buf);
-}
-
-void ToHex(const uint8_t* data, uint16_t len, char* hexString,
-           uint16_t hexStringSize) {
-  int i = 0, j = 0;
-  for (i = 0, j = 0; i < len && j < hexStringSize - 3; i++) {
-    hexString[j++] = sTable[(*data >> 4) & 0xf];
-    hexString[j++] = sTable[*data & 0xf];
-    data++;
-  }
-  hexString[j] = '\0';
-}
-
-// Protodisp code calls ScrLog() to print decoded texts.
-void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...) {
-  static char buffer[BTE_LOG_BUF_SIZE];
-  va_list ap;
-
-  va_start(ap, fmt_str);
-  vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
-  va_end(ap);
-  __android_log_write(ANDROID_LOG_INFO, "BrcmNci", buffer);
-}
-
-uint8_t* scru_dump_hex(uint8_t* p, char* pTitle, uint32_t len, uint32_t layer,
-                       uint32_t type) {
-  if (pTitle && *pTitle) PRINT(pTitle);
-  dumpbin((char*)p, len, layer, type);
-  return p;
-}
-
-void dumpbin(const char* data, int size, uint32_t trace_layer,
-             uint32_t trace_type) {
-  char line_buff[256];
-  char* line;
-  int i, j, addr;
-  const int width = 16;
-  if (size <= 0) return;
-  for (i = 0; i < size / width; i++) {
-    line = line_buff;
-    // write address:
-    addr = i * width;
-    word2hex((const char*)&addr, &line);
-    *line++ = ':';
-    *line++ = ' ';
-    // write hex of data
-    for (j = 0; j < width; j++) {
-      byte2hex(&data[j], &line);
-      *line++ = ' ';
-    }
-    // write char of data
-    for (j = 0; j < width; j++) byte2char(data++, &line);
-    // wirte the end of line
-    *line = 0;
-    // output the line
-    PRINT(line_buff);
-  }
-  // last line of left over if any
-  int leftover = size % width;
-  if (leftover > 0) {
-    line = line_buff;
-    // write address:
-    addr = i * width;
-    word2hex((const char*)&addr, &line);
-    *line++ = ':';
-    *line++ = ' ';
-    // write hex of data
-    for (j = 0; j < leftover; j++) {
-      byte2hex(&data[j], &line);
-      *line++ = ' ';
-    }
-    // write hex padding
-    for (; j < width; j++) {
-      *line++ = ' ';
-      *line++ = ' ';
-      *line++ = ' ';
-    }
-    // write char of data
-    for (j = 0; j < leftover; j++) byte2char(data++, &line);
-    // write the end of line
-    *line = 0;
-    // output the line
-    PRINT(line_buff);
-  }
-}
-
-inline void word2hex(const char* data, char** hex) {
-  byte2hex(&data[1], hex);
-  byte2hex(&data[0], hex);
-}
-
-inline void byte2char(const char* data, char** str) {
-  **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
-  ++(*str);
-}
-
-inline void byte2hex(const char* data, char** str) {
-  **str = sTable[(*data >> 4) & 0xf];
-  ++*str;
-  **str = sTable[*data & 0xf];
-  ++*str;
-}
-
-// Decode a few Bluetooth HCI packets into hex numbers.
-void DispHciCmd(NFC_HDR* p_buf) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
-}
-
-// Decode a few Bluetooth HCI packets into hex numbers.
-void DispHciEvt(NFC_HDR* p_buf) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
-}
-
-/*******************************************************************************
-**
-** Function         DispLLCP
-**
-** Description      Log LLCP packet as hex-ascii bytes.
-**
-** Returns          None.
-**
-*******************************************************************************/
-void DispLLCP(NFC_HDR* p_buf, bool is_recv) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR" : "BrcmLlcpX",
-                      log_line);
-}
-
-/*******************************************************************************
-**
-** Function         DispHcp
-**
-** Description      Log raw HCP packet as hex-ascii bytes
-**
-** Returns          None.
-**
-*******************************************************************************/
-void DispHcp(uint8_t* data, uint16_t len, bool is_recv) {
-  uint32_t nBytes = (len * 2) + 1;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  // Only trace HCP if we're tracing HCI as well
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmHcpR" : "BrcmHcpX",
-                      log_line);
-}
-
-void DispSNEP(uint8_t local_sap, uint8_t remote_sap, NFC_HDR* p_buf,
-              bool is_first, bool is_rx) {}
-void DispCHO(uint8_t* pMsg, uint32_t MsgLen, bool is_rx) {}
-void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx) {}
-void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx) {}
-void DispCET4Tags(NFC_HDR* p_buf, bool is_rx) {}
-void DispRWI93Tag(NFC_HDR* p_buf, bool is_rx, uint8_t command_to_respond) {}
-void DispNDEFMsg(uint8_t* pMsg, uint32_t MsgLen, bool is_recv) {}
-
-/*******************************************************************************
-**
-** Function:        LogMsg
-**
-** Description:     Print messages from NFC stack.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
-  static char buffer[BTE_LOG_BUF_SIZE];
-  va_list ap;
-  uint32_t trace_type =
-      trace_set_mask & 0x07;  // lower 3 bits contain trace type
-  int android_log_type = ANDROID_LOG_INFO;
-
-  va_start(ap, fmt_str);
-  vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
-  va_end(ap);
-  if (trace_type == TRACE_TYPE_ERROR) android_log_type = ANDROID_LOG_ERROR;
-  __android_log_write(android_log_type, LOGMSG_TAG_NAME, buffer);
-}
-
-void LogMsg_0(uint32_t maskTraceSet, const char* p_str) {
-  LogMsg(maskTraceSet, p_str);
-}
-
-void LogMsg_1(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1) {
-  LogMsg(maskTraceSet, fmt_str, p1);
-}
-
-void LogMsg_2(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2);
-}
-
-void LogMsg_3(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3);
-}
-
-void LogMsg_4(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4);
-}
-
-void LogMsg_5(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5);
-}
-
-void LogMsg_6(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
-              uintptr_t p6) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5, p6);
-}
diff --git a/halimpl/bcm2079x/adaptation/config.cpp b/halimpl/bcm2079x/adaptation/config.cpp
deleted file mode 100644
index 709ea19..0000000
--- a/halimpl/bcm2079x/adaptation/config.cpp
+++ /dev/null
@@ -1,672 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-
-#include "config.h"
-#include <stdio.h>
-#include <sys/stat.h>
-#include <list>
-#include <string>
-#include <vector>
-#include "_OverrideLog.h"
-
-const char* transport_config_paths[] = {"/odm/etc/", "/vendor/etc/", "/etc/"};
-const int transport_config_path_size =
-    (sizeof(transport_config_paths) / sizeof(transport_config_paths[0]));
-
-#define config_name "libnfc-brcm.conf"
-#define extra_config_base "libnfc-brcm-"
-#define extra_config_ext ".conf"
-#define IsStringValue 0x80000000
-
-using namespace ::std;
-
-class CNfcParam : public string {
- public:
-  CNfcParam();
-  CNfcParam(const char* name, const string& value);
-  CNfcParam(const char* name, unsigned long value);
-  virtual ~CNfcParam();
-  unsigned long numValue() const { return m_numValue; }
-  const char* str_value() const { return m_str_value.c_str(); }
-  size_t str_len() const { return m_str_value.length(); }
-
- private:
-  string m_str_value;
-  unsigned long m_numValue;
-};
-
-class CNfcConfig : public vector<const CNfcParam*> {
- public:
-  virtual ~CNfcConfig();
-  static CNfcConfig& GetInstance();
-  friend void readOptionalConfig(const char* optional);
-
-  bool getValue(const char* name, char* pValue, size_t& len) const;
-  bool getValue(const char* name, unsigned long& rValue) const;
-  bool getValue(const char* name, unsigned short& rValue) const;
-  const CNfcParam* find(const char* p_name) const;
-  void clean();
-
- private:
-  CNfcConfig();
-  bool readConfig(const char* name, bool bResetContent);
-  void moveFromList();
-  void moveToList();
-  void add(const CNfcParam* pParam);
-  list<const CNfcParam*> m_list;
-  bool mValidFile;
-
-  unsigned long state;
-
-  inline bool Is(unsigned long f) { return (state & f) == f; }
-  inline void Set(unsigned long f) { state |= f; }
-  inline void Reset(unsigned long f) { state &= ~f; }
-};
-
-/*******************************************************************************
-**
-** Function:    isPrintable()
-**
-** Description: detremine if a char is printable
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline bool isPrintable(char c) {
-  return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-         (c >= '0' && c <= '9') || c == '/' || c == '_' || c == '-' || c == '.';
-}
-
-/*******************************************************************************
-**
-** Function:    isDigit()
-**
-** Description: detremine if a char is numeral digit
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline bool isDigit(char c, int base) {
-  if ('0' <= c && c <= '9') return true;
-  if (base == 16) {
-    if (('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    getDigitValue()
-**
-** Description: return numercal value of a char
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline int getDigitValue(char c, int base) {
-  if ('0' <= c && c <= '9') return c - '0';
-  if (base == 16) {
-    if ('A' <= c && c <= 'F')
-      return c - 'A' + 10;
-    else if ('a' <= c && c <= 'f')
-      return c - 'a' + 10;
-  }
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function:    findConfigFilePathFromTransportConfigPaths()
-**
-** Description: find a config file path with a given config name from transport
-**              config paths
-**
-** Returns:     none
-**
-*******************************************************************************/
-void findConfigFilePathFromTransportConfigPaths(const string& configName,
-                                                string& filePath) {
-  for (int i = 0; i < transport_config_path_size - 1; i++) {
-    filePath.assign(transport_config_paths[i]);
-    filePath += configName;
-    struct stat file_stat;
-    if (stat(filePath.c_str(), &file_stat) == 0 && S_ISREG(file_stat.st_mode)) {
-      return;
-    }
-  }
-  filePath.assign(transport_config_paths[transport_config_path_size - 1]);
-  filePath += configName;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::readConfig()
-**
-** Description: read Config settings and parse them into a linked list
-**              move the element from linked list to a array at the end
-**
-** Returns:     none
-**
-*******************************************************************************/
-bool CNfcConfig::readConfig(const char* name, bool bResetContent) {
-  enum {
-    BEGIN_LINE = 1,
-    TOKEN,
-    STR_VALUE,
-    NUM_VALUE,
-    BEGIN_HEX,
-    BEGIN_QUOTE,
-    END_LINE
-  };
-
-  FILE* fd = NULL;
-  string token;
-  string strValue;
-  unsigned long numValue = 0;
-  CNfcParam* pParam = NULL;
-  int i = 0;
-  int base = 0;
-  char c = 0;
-
-  state = BEGIN_LINE;
-  /* open config file, read it into a buffer */
-  if ((fd = fopen(name, "rb")) == NULL) {
-    ALOGD("%s Cannot open config file %s\n", __func__, name);
-    if (bResetContent) {
-      ALOGD("%s Using default value for all settings\n", __func__);
-      mValidFile = false;
-    }
-    return false;
-  }
-  ALOGD("%s Opened %s config %s\n", __func__,
-        (bResetContent ? "base" : "optional"), name);
-
-  mValidFile = true;
-  if (size() > 0) {
-    if (bResetContent)
-      clean();
-    else
-      moveToList();
-  }
-
-  while (!feof(fd) && fread(&c, 1, 1, fd) == 1) {
-    switch (state & 0xff) {
-      case BEGIN_LINE:
-        if (c == '#')
-          state = END_LINE;
-        else if (isPrintable(c)) {
-          i = 0;
-          token.erase();
-          strValue.erase();
-          state = TOKEN;
-          token.push_back(c);
-        }
-        break;
-      case TOKEN:
-        if (c == '=') {
-          token.push_back('\0');
-          state = BEGIN_QUOTE;
-        } else if (isPrintable(c))
-          token.push_back(c);
-        else
-          state = END_LINE;
-        break;
-      case BEGIN_QUOTE:
-        if (c == '"') {
-          state = STR_VALUE;
-          base = 0;
-        } else if (c == '0')
-          state = BEGIN_HEX;
-        else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          i = 0;
-        } else if (c == '{') {
-          state = NUM_VALUE;
-          base = 16;
-          i = 0;
-          Set(IsStringValue);
-        } else
-          state = END_LINE;
-        break;
-      case BEGIN_HEX:
-        if (c == 'x' || c == 'X') {
-          state = NUM_VALUE;
-          base = 16;
-          numValue = 0;
-          i = 0;
-          break;
-        } else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          break;
-        } else if (c != '\n' && c != '\r') {
-          state = END_LINE;
-          break;
-        }
-      // fal through to numValue to handle numValue
-
-      case NUM_VALUE:
-        if (isDigit(c, base)) {
-          numValue *= base;
-          numValue += getDigitValue(c, base);
-          ++i;
-        } else if (base == 16 &&
-                   (c == ':' || c == '-' || c == ' ' || c == '}')) {
-          if (i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) {
-              unsigned char c = (numValue >> (n * 8)) & 0xFF;
-              strValue.push_back(c);
-            }
-          }
-          Set(IsStringValue);
-          numValue = 0;
-          i = 0;
-        } else {
-          if (c == '\n' || c == '\r')
-            state = BEGIN_LINE;
-          else
-            state = END_LINE;
-          if (Is(IsStringValue) && base == 16 && i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) strValue.push_back(((numValue >> (n * 8)) & 0xFF));
-          }
-          if (strValue.length() > 0)
-            pParam = new CNfcParam(token.c_str(), strValue);
-          else
-            pParam = new CNfcParam(token.c_str(), numValue);
-          add(pParam);
-          strValue.erase();
-          numValue = 0;
-        }
-        break;
-      case STR_VALUE:
-        if (c == '"') {
-          strValue.push_back('\0');
-          state = END_LINE;
-          pParam = new CNfcParam(token.c_str(), strValue);
-          add(pParam);
-        } else if (isPrintable(c))
-          strValue.push_back(c);
-        break;
-      case END_LINE:
-        if (c == '\n' || c == '\r') state = BEGIN_LINE;
-        break;
-      default:
-        break;
-    }
-  }
-
-  fclose(fd);
-
-  moveFromList();
-  return size() > 0;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::CNfcConfig()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::CNfcConfig() : mValidFile(true) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::~CNfcConfig()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::~CNfcConfig() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::GetInstance()
-**
-** Description: get class singleton object
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig& CNfcConfig::GetInstance() {
-  static CNfcConfig theInstance;
-
-  if (theInstance.size() == 0 && theInstance.mValidFile) {
-    string strPath;
-    findConfigFilePathFromTransportConfigPaths(config_name, strPath);
-    theInstance.readConfig(strPath.c_str(), true);
-  }
-
-  return theInstance;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a string value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, char* pValue, size_t& len) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() > 0) {
-    memset(pValue, 0, len);
-    if (len > pParam->str_len()) len = pParam->str_len();
-    memcpy(pValue, pParam->str_value(), len);
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a long numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned long& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned long>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a short numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned short& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned short>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::find()
-**
-** Description: search if a setting exist in the setting array
-**
-** Returns:     pointer to the setting object
-**
-*******************************************************************************/
-const CNfcParam* CNfcConfig::find(const char* p_name) const {
-  if (size() == 0) return NULL;
-
-  for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it) {
-    if (**it < p_name)
-      continue;
-    else if (**it == p_name) {
-      if ((*it)->str_len() > 0)
-        ALOGD("%s found %s=%s\n", __func__, p_name, (*it)->str_value());
-      else
-        ALOGD("%s found %s=(0x%lX)\n", __func__, p_name, (*it)->numValue());
-      return *it;
-    } else
-      break;
-  }
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::clean()
-**
-** Description: reset the setting array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::clean() {
-  if (size() == 0) return;
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it) delete *it;
-  clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::Add()
-**
-** Description: add a setting object to the list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::add(const CNfcParam* pParam) {
-  if (m_list.size() == 0) {
-    m_list.push_back(pParam);
-    return;
-  }
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it) {
-    if (**it < pParam->c_str()) continue;
-    m_list.insert(it, pParam);
-    return;
-  }
-  m_list.push_back(pParam);
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveFromList()
-**
-** Description: move the setting object from list to array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveFromList() {
-  if (m_list.size() == 0) return;
-
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it)
-    push_back(*it);
-  m_list.clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveToList()
-**
-** Description: move the setting object from array to list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveToList() {
-  if (m_list.size() != 0) m_list.clear();
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
-    m_list.push_back(*it);
-  clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam() : m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::~CNfcParam()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::~CNfcParam() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, const string& value)
-    : string(name), m_str_value(value), m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, unsigned long value)
-    : string(name), m_numValue(value) {}
-
-/*******************************************************************************
-**
-** Function:    GetStrValue
-**
-** Description: API function for getting a string value of a setting
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern "C" int GetStrValue(const char* name, char* pValue, unsigned long l) {
-  size_t len = l;
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  bool b = rConfig.getValue(name, pValue, len);
-  return b ? len : 0;
-}
-
-/*******************************************************************************
-**
-** Function:    GetNumValue
-**
-** Description: API function for getting a numerical value of a setting
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern "C" int GetNumValue(const char* name, void* pValue, unsigned long len) {
-  if (!pValue) return false;
-
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-  const CNfcParam* pParam = rConfig.find(name);
-
-  if (pParam == NULL) return false;
-  unsigned long v = pParam->numValue();
-  if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4) {
-    const unsigned char* p = (const unsigned char*)pParam->str_value();
-    for (size_t i = 0; i < pParam->str_len(); ++i) {
-      v *= 256;
-      v += *p++;
-    }
-  }
-  switch (len) {
-    case sizeof(unsigned long):
-      *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
-      break;
-    case sizeof(unsigned short):
-      *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
-      break;
-    case sizeof(unsigned char):
-      *(static_cast<unsigned char*>(pValue)) = (unsigned char)v;
-      break;
-    default:
-      return false;
-  }
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function:    resetConfig
-**
-** Description: reset settings array
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern void resetConfig() {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  rConfig.clean();
-}
-
-/*******************************************************************************
-**
-** Function:    readOptionalConfig()
-**
-** Description: read Config settings from an optional conf file
-**
-** Returns:     none
-**
-*******************************************************************************/
-void readOptionalConfig(const char* extra) {
-  string strPath;
-  string configName(extra_config_base);
-  configName += extra;
-  configName += extra_config_ext;
-
-  findConfigFilePathFromTransportConfigPaths(configName, strPath);
-  CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
-}
diff --git a/halimpl/bcm2079x/adaptation/patchram.cpp b/halimpl/bcm2079x/adaptation/patchram.cpp
deleted file mode 100644
index 3fc4b5a..0000000
--- a/halimpl/bcm2079x/adaptation/patchram.cpp
+++ /dev/null
@@ -1,594 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-
-#include "_OverrideLog.h"
-#include "config.h"
-#include "nfc_hal_int.h"
-#include "userial.h"
-extern "C" {
-#include "nfc_hal_post_reset.h"
-}
-#include <cutils/properties.h>
-#include <inttypes.h>
-#include <malloc.h>
-#include <string>
-#include "StartupConfig.h"
-#include "spdhelper.h"
-
-#define FW_PRE_PATCH "FW_PRE_PATCH"
-#define FW_PATCH "FW_PATCH"
-#define MAX_RF_DATA_CREDITS "MAX_RF_DATA_CREDITS"
-
-#define MAX_BUFFER (512)
-static char sPrePatchFn[MAX_BUFFER + 1];
-static char sPatchFn[MAX_BUFFER + 1];
-static void* sPrmBuf = NULL;
-static void* sI2cFixPrmBuf = NULL;
-
-#define CONFIG_MAX_LEN 256
-static uint8_t sConfig[CONFIG_MAX_LEN];
-static StartupConfig sStartupConfig;
-static StartupConfig sLptdConfig;
-static StartupConfig sPreDiscoveryConfig;
-static StartupConfig sXtalCustomParam;
-extern uint8_t* p_nfc_hal_dm_start_up_cfg;  // defined in the HAL
-static uint8_t nfa_dm_start_up_vsc_cfg[CONFIG_MAX_LEN];
-extern uint8_t* p_nfc_hal_dm_start_up_vsc_cfg;  // defined in the HAL
-extern uint8_t* p_nfc_hal_dm_lptd_cfg;          // defined in the HAL
-static uint8_t sDontSendLptd[] = {0};
-extern uint8_t* p_nfc_hal_pre_discover_cfg;    // defined in the HAL
-extern uint8_t* p_nfc_hal_dm_xtal_params_cfg;  // defined in HAL
-
-extern tSNOOZE_MODE_CONFIG gSnoozeModeCfg;
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-static void mayDisableSecureElement(StartupConfig& config);
-
-/* Default patchfile (in NCD format) */
-#ifndef NFA_APP_DEFAULT_PATCHFILE_NAME
-#define NFA_APP_DEFAULT_PATCHFILE_NAME "\0"
-#endif
-
-/* Default patchfile (in NCD format) */
-#ifndef NFA_APP_DEFAULT_I2C_PATCHFILE_NAME
-#define NFA_APP_DEFAULT_I2C_PATCHFILE_NAME "\0"
-#endif
-
-tNFC_POST_RESET_CB nfc_post_reset_cb = {
-    /* Default Patch & Pre-Patch */
-    NFA_APP_DEFAULT_PATCHFILE_NAME,
-    NULL,
-    NFA_APP_DEFAULT_I2C_PATCHFILE_NAME,
-    NULL,
-
-    /* Default UART baud rate */
-    NFC_HAL_DEFAULT_BAUD,
-
-    /* Default tNFC_HAL_DEV_INIT_CFG (flags, num_xtal_cfg, {brcm_hw_id,
-       xtal-freq, xtal-index} ) */
-    {2, /* number of valid entries */
-     {
-         {0x43341000, 37400,
-          NFC_HAL_XTAL_INDEX_37400},  // All revisions of 43341 use 37,400
-         {0x20795000, 26000, NFC_HAL_XTAL_INDEX_26000},
-         {0, 0, 0},
-         {0, 0, 0},
-         {0, 0, 0},
-     }},
-
-    /* Default low power mode settings */
-    NFC_HAL_LP_SNOOZE_MODE_NONE,    /* Snooze Mode          */
-    NFC_HAL_LP_IDLE_THRESHOLD_HOST, /* Idle Threshold Host  */
-    NFC_HAL_LP_IDLE_THRESHOLD_HC,   /* Idle Threshold HC    */
-    NFC_HAL_LP_ACTIVE_LOW,          /* NFC_WAKE Active Mode */
-    NFC_HAL_LP_ACTIVE_HIGH,         /* DH_WAKE Active Mode  */
-
-    NFA_APP_MAX_NUM_REINIT, /* max retry to get NVM type */
-    0,                      /* current retry count */
-    TRUE,                   /* debug mode for downloading patchram */
-    FALSE /* skip downloading patchram after reinit because of patch download
-             failure */
-};
-
-/*******************************************************************************
-**
-** Function         getFileLength
-**
-** Description      return the size of a file
-**
-** Returns          file size in number of bytes
-**
-*******************************************************************************/
-static long getFileLength(FILE* fp) {
-  long sz;
-  fseek(fp, 0L, SEEK_END);
-  sz = ftell(fp);
-  fseek(fp, 0L, SEEK_SET);
-
-  return (sz > 0) ? sz : 0;
-}
-
-/*******************************************************************************
-**
-** Function         isFileExist
-**
-** Description      Check if file name exists (android does not support fexists)
-**
-** Returns          TRUE if file exists
-**
-*******************************************************************************/
-static bool isFileExist(const char* pFilename) {
-  FILE* pf;
-
-  pf = fopen(pFilename, "r");
-  if (pf != NULL) {
-    fclose(pf);
-    return TRUE;
-  }
-  return FALSE;
-}
-
-/*******************************************************************************
-**
-** Function         findPatchramFile
-**
-** Description      Find the patchram file name specified in the .conf
-**
-** Returns          pointer to the file name
-**
-*******************************************************************************/
-static const char* findPatchramFile(const char* pConfigName, char* pBuffer,
-                                    int bufferLen) {
-  ALOGD("%s: config=%s", __func__, pConfigName);
-
-  if (pConfigName == NULL) {
-    ALOGD("%s No patchfile defined\n", __func__);
-    return NULL;
-  }
-
-  if (GetStrValue(pConfigName, &pBuffer[0], bufferLen)) {
-    ALOGD("%s found patchfile %s\n", __func__, pBuffer);
-    return (pBuffer[0] == '\0') ? NULL : pBuffer;
-  }
-
-  ALOGD("%s Cannot find patchfile '%s'\n", __func__, pConfigName);
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function:    continueAfterSetSnoozeMode
-**
-** Description: Called after Snooze Mode is enabled.
-**
-** Returns:     none
-**
-*******************************************************************************/
-static void continueAfterSetSnoozeMode(tHAL_NFC_STATUS status) {
-  ALOGD("%s: status=%u", __func__, status);
-  // let stack download firmware during next initialization
-  nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE;
-  if (status == NCI_STATUS_OK)
-    HAL_NfcPreInitDone(HAL_NFC_STATUS_OK);
-  else
-    HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
-}
-
-/*******************************************************************************
-**
-** Function:    postDownloadPatchram
-**
-** Description: Called after patch download
-**
-** Returns:     none
-**
-*******************************************************************************/
-static void postDownloadPatchram(tHAL_NFC_STATUS status) {
-  ALOGD("%s: status=%i", __func__, status);
-  GetStrValue(NAME_SNOOZE_MODE_CFG, (char*)&gSnoozeModeCfg,
-              sizeof(gSnoozeModeCfg));
-  if (status != HAL_NFC_STATUS_OK) {
-    ALOGE("%s: Patch download failed", __func__);
-    if (status == HAL_NFC_STATUS_REFUSED) {
-      SpdHelper::setPatchAsBad();
-    } else
-      SpdHelper::incErrorCount();
-
-    /* If in SPD Debug mode, fail immediately and obviously */
-    if (SpdHelper::isSpdDebug())
-      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
-    else {
-      /* otherwise, power cycle the chip and let the stack startup normally */
-      ALOGD("%s: re-init; don't download firmware", __func__);
-      // stop stack from downloading firmware during next initialization
-      nfc_post_reset_cb.spd_skip_on_power_cycle = TRUE;
-      USERIAL_PowerupDevice(0);
-      HAL_NfcReInit();
-    }
-  }
-  /* Set snooze mode here */
-  else if (gSnoozeModeCfg.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) {
-    status = HAL_NfcSetSnoozeMode(
-        gSnoozeModeCfg.snooze_mode, gSnoozeModeCfg.idle_threshold_dh,
-        gSnoozeModeCfg.idle_threshold_nfcc, gSnoozeModeCfg.nfc_wake_active_mode,
-        gSnoozeModeCfg.dh_wake_active_mode, continueAfterSetSnoozeMode);
-    if (status != NCI_STATUS_OK) {
-      ALOGE("%s: Setting snooze mode failed, status=%i", __func__, status);
-      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
-    }
-  } else {
-    ALOGD("%s: Not using Snooze Mode", __func__);
-    HAL_NfcPreInitDone(HAL_NFC_STATUS_OK);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:    prmCallback
-**
-** Description: Patchram callback (for static patchram mode)
-**
-** Returns:     none
-**
-*******************************************************************************/
-void prmCallback(uint8_t event) {
-  ALOGD("%s: event=0x%x", __func__, event);
-  switch (event) {
-    case NFC_HAL_PRM_CONTINUE_EVT:
-      /* This event does not occur if static patchram buf is used */
-      break;
-
-    case NFC_HAL_PRM_COMPLETE_EVT:
-      postDownloadPatchram(HAL_NFC_STATUS_OK);
-      break;
-
-    case NFC_HAL_PRM_ABORT_EVT:
-      postDownloadPatchram(HAL_NFC_STATUS_FAILED);
-      break;
-
-    case NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT:
-      ALOGD("%s: invalid patch...skipping patch download", __func__);
-      postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
-      break;
-
-    case NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT:
-      ALOGD("%s: patch authentication failed", __func__);
-      postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
-      break;
-
-    case NFC_HAL_PRM_ABORT_NO_NVM_EVT:
-      ALOGD("%s: No NVM detected", __func__);
-      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
-      break;
-
-    default:
-      ALOGD("%s: not handled event=0x%x", __func__, event);
-      break;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         getNfaValues
-**
-** Description      Get configuration values needed by NFA layer
-**
-** Returns:         None
-**
-*******************************************************************************/
-static void getNfaValues(uint32_t chipid) {
-  unsigned long num = 0;
-  int actualLen = 0;
-
-  sStartupConfig.initialize();
-  sLptdConfig.initialize();
-  sPreDiscoveryConfig.initialize();
-
-  actualLen =
-      GetStrValue(NAME_NFA_DM_START_UP_CFG, (char*)sConfig, sizeof(sConfig));
-  if (actualLen) sStartupConfig.append(sConfig, actualLen);
-
-  // Set antenna tuning configuration if configured.
-  actualLen =
-      GetStrValue(NAME_PREINIT_DSP_CFG, (char*)sConfig, sizeof(sConfig));
-  if (actualLen) sStartupConfig.append(sConfig, actualLen);
-
-  if (GetStrValue(NAME_NFA_DM_START_UP_VSC_CFG, (char*)nfa_dm_start_up_vsc_cfg,
-                  sizeof(nfa_dm_start_up_vsc_cfg))) {
-    p_nfc_hal_dm_start_up_vsc_cfg = &nfa_dm_start_up_vsc_cfg[0];
-    ALOGD("START_UP_VSC_CFG[0] = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
-          nfa_dm_start_up_vsc_cfg[0], nfa_dm_start_up_vsc_cfg[1],
-          nfa_dm_start_up_vsc_cfg[2], nfa_dm_start_up_vsc_cfg[3],
-          nfa_dm_start_up_vsc_cfg[4], nfa_dm_start_up_vsc_cfg[5],
-          nfa_dm_start_up_vsc_cfg[6], nfa_dm_start_up_vsc_cfg[7]);
-  }
-
-  actualLen = GetStrValue(NAME_LPTD_CFG, (char*)sConfig, sizeof(sConfig));
-  if (actualLen) {
-    sLptdConfig.append(sConfig, actualLen);
-    p_nfc_hal_dm_lptd_cfg =
-        const_cast<uint8_t*>(sLptdConfig.getInternalBuffer());
-  } else {
-    // Default to not sending any LPTD setting.
-    p_nfc_hal_dm_lptd_cfg = sDontSendLptd;
-  }
-
-  mayDisableSecureElement(sStartupConfig);
-  p_nfc_hal_dm_start_up_cfg =
-      const_cast<uint8_t*>(sStartupConfig.getInternalBuffer());
-
-  actualLen = GetStrValue(NAME_NFA_DM_PRE_DISCOVERY_CFG, (char*)sConfig,
-                          sizeof(sConfig));
-  if (actualLen) {
-    sPreDiscoveryConfig.append(sConfig, actualLen);
-    mayDisableSecureElement(sPreDiscoveryConfig);
-    p_nfc_hal_pre_discover_cfg =
-        const_cast<uint8_t*>(sPreDiscoveryConfig.getInternalBuffer());
-  }
-
-  // configure how many secure elements are available for each type of chip
-  if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support > 0) {
-    if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20791_GEN) {
-      nfc_hal_cb.max_ee = BRCM_NFC_20791_GEN_MAX_EE;
-      p_nfc_hal_cfg->nfc_hal_hci_uicc_support =
-          HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
-    } else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_43341_GEN) {
-      nfc_hal_cb.max_ee = BRCM_NFC_43341_GEN_MAX_EE;
-      p_nfc_hal_cfg->nfc_hal_hci_uicc_support =
-          HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
-    } else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20795_GEN) {
-      nfc_hal_cb.max_ee = BRCM_NFC_20795_GEN_MAX_EE;
-      p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST |
-                                                HAL_NFC_HCI_UICC1_HOST |
-                                                HAL_NFC_HCI_UICC2_HOST;
-    }
-
-    // let .conf variable determine how many EE's to discover
-    if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num)))
-      nfc_hal_cb.max_ee = num;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         StartPatchDownload
-**
-** Description      Reads configuration settings, and begins the download
-**                  process if patch files are configured.
-**
-** Returns:         None
-**
-*******************************************************************************/
-static void StartPatchDownload(uint32_t chipid) {
-  ALOGD("%s: chipid=%" PRIu32, __func__, chipid);
-
-  char chipID[30];
-  sprintf(chipID, "%" PRIu32, chipid);
-  ALOGD("%s: chidId=%s", __func__, chipID);
-
-  readOptionalConfig(chipID);  // Read optional chip specific settings
-  readOptionalConfig("fime");  // Read optional FIME specific settings
-  getNfaValues(chipid);        // Get NFA configuration values into variables
-
-  findPatchramFile(FW_PATCH, sPatchFn, sizeof(sPatchFn));
-  findPatchramFile(FW_PRE_PATCH, sPrePatchFn, sizeof(sPatchFn));
-
-  {
-    FILE* fd;
-    /* If an I2C fix patch file was specified, then tell the stack about it */
-    if (sPrePatchFn[0] != '\0') {
-      fd = fopen(sPrePatchFn, "rb");
-      if (fd != NULL) {
-        uint32_t lenPrmBuffer = getFileLength(fd);
-
-        sI2cFixPrmBuf = malloc(lenPrmBuffer);
-        if (sI2cFixPrmBuf != NULL) {
-          size_t actualLen = fread(sI2cFixPrmBuf, 1, lenPrmBuffer, fd);
-          if (actualLen == lenPrmBuffer) {
-            ALOGD("%s Setting I2C fix to %s (size: %" PRIu32 ")", __func__,
-                  sPrePatchFn, lenPrmBuffer);
-            HAL_NfcPrmSetI2cPatch((uint8_t*)sI2cFixPrmBuf,
-                                  (uint16_t)lenPrmBuffer, 0);
-          } else
-            ALOGE(
-                "%s fail reading i2c fix; actual len=%zu; expected len="
-                "%" PRIu32,
-                __func__, actualLen, lenPrmBuffer);
-        } else {
-          ALOGE("%s Unable to get buffer to i2c fix (%" PRIu32 " bytes)",
-                __func__, lenPrmBuffer);
-        }
-
-        fclose(fd);
-      } else {
-        ALOGE("%s Unable to open i2c fix patchfile %s", __func__, sPrePatchFn);
-      }
-    }
-  }
-
-  {
-    FILE* fd;
-
-    /* If a patch file was specified, then download it now */
-    if (sPatchFn[0] != '\0') {
-      uint32_t bDownloadStarted = false;
-
-      /* open patchfile, read it into a buffer */
-      fd = fopen(sPatchFn, "rb");
-      if (fd != NULL) {
-        uint32_t lenPrmBuffer = getFileLength(fd);
-        ALOGD("%s Downloading patchfile %s (size: %" PRIu32 ") format=%u",
-              __func__, sPatchFn, lenPrmBuffer, NFC_HAL_PRM_FORMAT_NCD);
-        sPrmBuf = malloc(lenPrmBuffer);
-        if (sPrmBuf != NULL) {
-          size_t actualLen = fread(sPrmBuf, 1, lenPrmBuffer, fd);
-          if (actualLen == lenPrmBuffer) {
-            if (!SpdHelper::isPatchBad((uint8_t*)sPrmBuf, lenPrmBuffer)) {
-              /* Download patch using static memeory mode */
-              HAL_NfcPrmDownloadStart(NFC_HAL_PRM_FORMAT_NCD, 0,
-                                      (uint8_t*)sPrmBuf, lenPrmBuffer, 0,
-                                      prmCallback);
-              bDownloadStarted = true;
-            }
-          } else
-            ALOGE("%s fail reading patchram", __func__);
-        } else
-          ALOGE("%s Unable to buffer to hold patchram (%" PRIu32 " bytes)",
-                __func__, lenPrmBuffer);
-
-        fclose(fd);
-      } else
-        ALOGE("%s Unable to open patchfile %s", __func__, sPatchFn);
-
-      /* If the download never got started */
-      if (!bDownloadStarted) {
-        /* If debug mode, fail in an obvious way, otherwise try to start stack
-         */
-        postDownloadPatchram(SpdHelper::isSpdDebug() ? HAL_NFC_STATUS_FAILED
-                                                     : HAL_NFC_STATUS_OK);
-      }
-    } else {
-      ALOGE(
-          "%s: No patchfile specified or disabled. Proceeding to post-download "
-          "procedure...",
-          __func__);
-      postDownloadPatchram(HAL_NFC_STATUS_OK);
-    }
-  }
-
-  ALOGD("%s: exit", __func__);
-}
-
-/*******************************************************************************
-**
-** Function:    nfc_hal_post_reset_init
-**
-** Description: Called by the NFC HAL after controller has been reset.
-**              Begin to download firmware patch files.
-**
-** Returns:     none
-**
-*******************************************************************************/
-void nfc_hal_post_reset_init(uint32_t brcm_hw_id, uint8_t nvm_type) {
-  ALOGD("%s: brcm_hw_id=0x%" PRIu32 ", nvm_type=%d", __func__, brcm_hw_id,
-        nvm_type);
-  tHAL_NFC_STATUS stat = HAL_NFC_STATUS_FAILED;
-  uint8_t max_credits = 1, allow_no_nvm = 0;
-
-  p_nfc_hal_cfg->nfc_hal_prm_nvm_required =
-      TRUE;  // don't download firmware if controller cannot detect EERPOM
-
-  if (nvm_type == NCI_SPD_NVM_TYPE_NONE) {
-    GetNumValue(NAME_ALLOW_NO_NVM, &allow_no_nvm, sizeof(allow_no_nvm));
-    if (allow_no_nvm == 0) {
-      ALOGD("%s: No NVM detected, FAIL the init stage to force a retry",
-            __func__);
-      USERIAL_PowerupDevice(0);
-      stat = HAL_NfcReInit();
-      return;
-    }
-
-    p_nfc_hal_cfg->nfc_hal_prm_nvm_required =
-        FALSE;  // allow download firmware if controller cannot detect EERPOM
-  }
-
-  /* Start downloading the patch files */
-  StartPatchDownload(brcm_hw_id);
-
-  if (GetNumValue(MAX_RF_DATA_CREDITS, &max_credits, sizeof(max_credits)) &&
-      (max_credits > 0)) {
-    ALOGD("%s : max_credits=%d", __func__, max_credits);
-    HAL_NfcSetMaxRfDataCredits(max_credits);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:        mayDisableSecureElement
-**
-** Description:     Optionally adjust a TLV to disable secure element.  This
-*feature
-**                  is enabled by setting the system property
-**                  nfc.disable_secure_element to a bit mask represented by a
-*hex
-**                  octet: C0 = do not detect any secure element.
-**                         40 = do not detect secure element in slot 0.
-**                         80 = do not detect secure element in slot 1.
-**
-**                  config: a sequence of TLV's.
-**
-*******************************************************************************/
-void mayDisableSecureElement(StartupConfig& config) {
-  unsigned int bitmask = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-  int len = property_get("nfc.disable_secure_element", valueStr, "");
-  if (len > 0) {
-    sscanf(valueStr, "%x", &bitmask);  // read system property as a hex octet
-    ALOGD("%s: disable 0x%02X", __func__, (uint8_t)bitmask);
-    config.disableSecureElement((uint8_t)(bitmask & 0xC0));
-  }
-}
-
-/*******************************************************************************
-**
-** Function:    configureCrystalFrequency
-**
-** Description: Configure controller's crystal frequency by reading values from
-**              .conf file.  If .conf file does not define any value, then use
-**              default values defined in struct nfc_post_reset_cb.
-**
-** Returns:     none
-**
-*******************************************************************************/
-void configureCrystalFrequency() {
-  unsigned long num = 0;
-  uint32_t hwId = 0;
-  uint16_t xtalFreq = 0;
-  uint8_t xtalIndex = 0;
-  int actualLen = 0;
-
-  if (GetNumValue(NAME_XTAL_HARDWARE_ID, &num, sizeof(num))) hwId = num;
-
-  if (GetNumValue(NAME_XTAL_FREQUENCY, &num, sizeof(num)))
-    xtalFreq = (uint16_t)num;
-
-  if (GetNumValue(NAME_XTAL_FREQ_INDEX, &num, sizeof(num)))
-    xtalIndex = (uint8_t)num;
-
-  actualLen =
-      GetStrValue(NAME_XTAL_PARAMS_CFG, (char*)sConfig, sizeof(sConfig));
-  if (actualLen &&
-      (xtalIndex ==
-       NFC_HAL_XTAL_INDEX_SPECIAL))  // whether to use custom crystal frequency
-  {
-    sXtalCustomParam.append(sConfig, actualLen);
-    p_nfc_hal_dm_xtal_params_cfg =
-        const_cast<uint8_t*>(sXtalCustomParam.getInternalBuffer());
-  }
-
-  if ((hwId == 0) && (xtalFreq == 0) && (xtalIndex == 0)) return;
-
-  ALOGD("%s: hwId=0x%" PRIX32 "; freq=%u; index=%u", __func__, hwId, xtalFreq,
-        xtalIndex);
-  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].brcm_hw_id =
-      (hwId & BRCM_NFC_GEN_MASK);
-  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_freq = xtalFreq;
-  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_index = xtalIndex;
-  nfc_post_reset_cb.dev_init_config.num_xtal_cfg = 1;
-}
diff --git a/halimpl/bcm2079x/adaptation/spdhelper.cpp b/halimpl/bcm2079x/adaptation/spdhelper.cpp
deleted file mode 100644
index b936753..0000000
--- a/halimpl/bcm2079x/adaptation/spdhelper.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-#include "spdhelper.h"
-#include "_OverrideLog.h"
-#include "config.h"
-
-void SpdHelper::setPatchAsBad() { getInstance().setPatchAsBadImpl(); }
-
-void SpdHelper::incErrorCount() { getInstance().incErrorCountImpl(); }
-
-bool SpdHelper::isPatchBad(uint8_t* prm, uint32_t len) {
-  return getInstance().isPatchBadImpl(prm, len);
-}
-
-bool SpdHelper::isSpdDebug() {
-  bool b = getInstance().isSpdDebugImpl();
-  ALOGD("%s SpdDebug is %s", __func__, (b ? "TRUE" : "FALSE"));
-  return b;
-}
-
-void SpdHelper::incErrorCountImpl() {
-  if (++mErrorCount >= mMaxErrorCount) {
-    setPatchAsBadImpl();
-  }
-}
-
-void SpdHelper::setPatchAsBadImpl() { mIsPatchBad = true; }
-
-inline const char* toHex(uint8_t b) {
-  static char hex[] = "0123456789ABCDEF";
-  static char c[3];
-  c[0] = hex[((b >> 4) & 0x0F)];
-  c[1] = hex[((b >> 0) & 0x0F)];
-  c[2] = '\0';
-  return &c[0];
-}
-
-bool SpdHelper::isPatchBadImpl(uint8_t* prm, uint32_t len) {
-  string strNew;
-
-  // Get the patch ID from the prm data.
-  for (uint32_t i = 0; i < 8 && i < len; ++i) strNew.append(toHex(*prm++));
-
-  // If it is not the same patch as before, then reset things.
-  if (strNew != mPatchId) {
-    mPatchId = strNew;
-    mErrorCount = 0;
-    mIsPatchBad = false;
-  }
-
-  // Otherwise the 'mIsPatchBad' will tell if its bad or not.
-  ALOGD("%s '%s' (%d) is %sa known bad patch file", __func__, mPatchId.c_str(),
-        mErrorCount, (mIsPatchBad ? "" : "not "));
-
-  return mIsPatchBad;
-}
-
-SpdHelper& SpdHelper::getInstance() {
-  static SpdHelper* theInstance = NULL;
-  if (theInstance == NULL) theInstance = new SpdHelper;
-  return *theInstance;
-}
-
-SpdHelper::SpdHelper() {
-  mErrorCount = 0;
-  mPatchId.erase();
-  if (!GetNumValue((char*)NAME_SPD_MAXRETRYCOUNT, &mMaxErrorCount,
-                   sizeof(mMaxErrorCount)))
-    mMaxErrorCount = DEFAULT_SPD_MAXRETRYCOUNT;
-  mIsPatchBad = false;
-  if (!GetNumValue((char*)NAME_SPD_DEBUG, &mSpdDebug, sizeof(mSpdDebug)))
-    mSpdDebug = false;
-}
diff --git a/halimpl/bcm2079x/adaptation/userial_linux.c b/halimpl/bcm2079x/adaptation/userial_linux.c
deleted file mode 100644
index 3313a2e..0000000
--- a/halimpl/bcm2079x/adaptation/userial_linux.c
+++ /dev/null
@@ -1,1731 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "USERIAL_LINUX"
-
-#include <string.h>
-#include "_OverrideLog.h"
-#include "gki.h"
-#include "nfc_hal_api.h"
-#include "nfc_hal_int.h"
-#include "nfc_target.h"
-#include "userial.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <gki_int.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <termios.h>
-#include <unistd.h>
-#include "bcm2079x.h"
-#include "config.h"
-#include "upio.h"
-
-#define HCISU_EVT EVENT_MASK(APPL_EVT_0)
-#define MAX_ERROR 10
-#define default_transport "/dev/bcm2079x"
-
-#define NUM_RESET_ATTEMPTS 5
-#define NFC_WAKE_ASSERTED_ON_POR UPIO_OFF
-
-#ifndef BTE_APPL_MAX_USERIAL_DEV_NAME
-#define BTE_APPL_MAX_USERIAL_DEV_NAME (256)
-#endif
-extern uint8_t appl_trace_level;
-
-/* Mapping of USERIAL_PORT_x to linux */
-extern uint32_t ScrProtocolTraceFlag;
-static tUPIO_STATE current_nfc_wake_state = UPIO_OFF;
-int uart_port = 0;
-int isLowSpeedTransport = 0;
-int nfc_wake_delay = 0;
-int nfc_write_delay = 0;
-int gPowerOnDelay = 300;
-static int gPrePowerOffDelay = 0;   // default value
-static int gPostPowerOffDelay = 0;  // default value
-static pthread_mutex_t close_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-char userial_dev[BTE_APPL_MAX_USERIAL_DEV_NAME + 1];
-char power_control_dev[BTE_APPL_MAX_USERIAL_DEV_NAME + 1];
-tSNOOZE_MODE_CONFIG gSnoozeModeCfg = {
-    NFC_HAL_LP_SNOOZE_MODE_SPI_I2C, /* Sleep Mode (0=Disabled 1=UART
-                                       8=SPI/I2C) */
-    NFC_HAL_LP_IDLE_THRESHOLD_HOST, /* Idle Threshold Host */
-    NFC_HAL_LP_IDLE_THRESHOLD_HC,   /* Idle Threshold HC */
-    NFC_HAL_LP_ACTIVE_LOW,          /* NFC Wake active mode (0=ActiveLow
-                                       1=ActiveHigh) */
-    NFC_HAL_LP_ACTIVE_HIGH          /* Host Wake active mode (0=ActiveLow
-                                       1=ActiveHigh) */
-};
-
-uint8_t bcmi2cnfc_client_addr = 0;
-uint8_t bcmi2cnfc_read_multi_packets = 0;
-
-#define USERIAL_Debug_verbose \
-  ((ScrProtocolTraceFlag & 0x80000000) == 0x80000000)
-
-#include <sys/socket.h>
-
-static uint8_t spi_negotiation[10] = {
-    0xF0, /* CMD */
-    0x00, /* SPI PARM Negotiation */
-    0x01, /* SPI Version */
-    0x00, /* SPI Mode:0, SPI_INT active low */
-    0x00, /* 8Bit, MSB first, Little Endian byte order */
-    0x00, /* Reserved */
-    0xFF, /* Sleep timeout Lower Byte */
-    0xFF, /* Sleep timeout Upper Byte */
-    0x00, /* Reserved */
-    0x00  /* Reserved */
-};
-static uint8_t spi_nego_res[20];
-
-/* Modes used when powering off (independent
-   of what the stack/jni has configured */
-#define POM_NORMAL (0)  /* Normal */
-#define POM_CE3SO (1)   /* Go to CE3-SO */
-#define POM_NFC_OFF (2) /* Set NFC Off bit */
-
-static int gPowerOffMode = POM_NORMAL;
-
-static uint8_t ce3_so_cmd[10] = {
-    0x10, 0x2F, /* CMD */
-    0x08, 0x06, /* size of cmd */
-    0x02,       /* CE3 power-level */
-    0xF3,       /* LpmUicc */
-    0x01,       /* LpmListenTech */
-    0x01,       /* Param */
-    0x00,       /* Forced */
-    0x00        /* Debug */
-};
-
-static uint8_t set_nfc_off_cmd[5] = {
-    0x10, 0x2F, /* CMD */
-    0x38, 0x01, /* size of cmd */
-    0x01        /* setNfcOff */
-};
-
-#include <ctype.h>
-
-#define USING_BRCM_USB TRUE
-
-/* use tc interface to change baudrate instead of close/open sequence which can
- * fail on some platforms
- * due to tx line movement when opeing/closing the UART. the 43xx do not like
- * this. */
-#ifndef USERIAL_USE_TCIO_BAUD_CHANGE
-#define USERIAL_USE_TCIO_BAUD_CHANGE FALSE
-#endif
-
-#ifndef USERIAL_USE_IO_BT_WAKE
-#define USERIAL_USE_IO_BT_WAKE FALSE
-#endif
-
-/* this are the ioctl values used for bt_wake ioctl via UART driver. you may
- * need to redefine at for
- * you platform! Logically they need to be unique and not colide with existing
- * uart ioctl's.
- */
-#ifndef USERIAL_IO_BT_WAKE_ASSERT
-#define USERIAL_IO_BT_WAKE_ASSERT 0x8003
-#endif
-#ifndef USERIAL_IO_BT_WAKE_DEASSERT
-#define USERIAL_IO_BT_WAKE_DEASSERT 0x8004
-#endif
-#ifndef USERIAL_IO_BT_WAKE_GET_ST
-#define USERIAL_IO_BT_WAKE_GET_ST 0x8005
-#endif
-
-/* the read limit in this current implementation depends on the GKI_BUF3_SIZE
- * It would be better to use some ring buffer from the USERIAL_Read() is reading
- * instead of putting it into GKI buffers.
- */
-#define READ_LIMIT (USERIAL_POOL_BUF_SIZE - NFC_HDR_SIZE)
-/*
- * minimum buffer size requirement to read a full sized packet from NFCC = 255 +
- * 4 byte header
- */
-#define MIN_BUFSIZE 259
-#define POLL_TIMEOUT 1000
-/* priority of the reader thread */
-#define USERIAL_READ_TRHEAD_PRIO 90
-/* time (ms) to wait before trying to allocate again a GKI buffer */
-#define NO_GKI_BUFFER_RECOVER_TIME 100
-#define MAX_SERIAL_PORT (USERIAL_PORT_15 + 1)
-
-extern void dumpbin(const char* data, int size);
-extern uint8_t* scru_dump_hex(uint8_t* p, char* p_title, uint32_t len,
-                              uint32_t trace_layer, uint32_t trace_type);
-
-static pthread_t worker_thread1 = 0;
-
-typedef struct {
-  volatile unsigned long bt_wake_state;
-  int sock;
-  tUSERIAL_CBACK* ser_cb;
-  uint16_t baud;
-  uint8_t data_bits;
-  uint16_t parity;
-  uint8_t stop_bits;
-  uint8_t port;
-  tUSERIAL_OPEN_CFG open_cfg;
-  int sock_power_control;
-  int client_device_address;
-  struct timespec write_time;
-} tLINUX_CB;
-
-static tLINUX_CB
-    linux_cb; /* case of multipel port support use array : [MAX_SERIAL_PORT] */
-
-void userial_close_thread(uint32_t params);
-
-static uint8_t device_name[BTE_APPL_MAX_USERIAL_DEV_NAME + 1];
-static int bSerialPortDevice = false;
-static int _timeout = POLL_TIMEOUT;
-static bool is_close_thread_is_waiting = false;
-
-static int change_client_addr(int addr);
-
-int perf_log_every_count = 0;
-typedef struct {
-  const char* label;
-  long lapse;
-  long bytes;
-  long count;
-  long overhead;
-} tPERF_DATA;
-
-/*******************************************************************************
-**
-** Function         perf_reset
-**
-** Description      reset performance measurement data
-**
-** Returns          none
-**
-*******************************************************************************/
-void perf_reset(tPERF_DATA* t) { t->count = t->bytes = t->lapse = 0; }
-
-/*******************************************************************************
-**
-** Function         perf_log
-**
-** Description      produce a log entry of cvurrent performance data
-**
-** Returns          none
-**
-*******************************************************************************/
-void perf_log(tPERF_DATA* t) {
-  // round to nearest ms
-  // t->lapse += 500;
-  // t->lapse /= 1000;
-  if (t->lapse) {
-    if (t->bytes)
-      ALOGD(
-          "%s:%s, bytes=%ld, lapse=%ld (%d.%02d kbps) (bus data rate %d.%02d "
-          "kbps) overhead %d(%d percent)\n",
-          __func__, t->label, t->bytes, t->lapse,
-          (int)(8 * t->bytes / t->lapse),
-          (int)(800 * t->bytes / (t->lapse)) % 100,
-          (int)(9 * (t->bytes + t->count * t->overhead) / t->lapse),
-          (int)(900 * (t->bytes + t->count * t->overhead) / (t->lapse)) % 100,
-          (int)(t->count * t->overhead),
-          (int)(t->count * t->overhead * 100 / t->bytes));
-    else
-      ALOGD("%s:%s, lapse=%ld (average %ld)\n", __func__, t->label, t->lapse,
-            (int)t->lapse / t->count);
-  }
-  perf_reset(t);
-}
-
-/*******************************************************************************
-**
-** Function         perf_update
-**
-** Description      update perforamnce measurement data
-**
-** Returns          none
-**
-*******************************************************************************/
-void perf_update(tPERF_DATA* t, long lapse, long bytes) {
-  if (!perf_log_every_count) return;
-  // round to nearest ms
-  lapse += 500;
-  lapse /= 1000;
-  t->count++;
-  t->bytes += bytes;
-  t->lapse += lapse;
-  if (t->count == perf_log_every_count) perf_log(t);
-}
-
-static tPERF_DATA perf_poll = {"USERIAL_Poll", 0, 0, 0, 0};
-static tPERF_DATA perf_read = {"USERIAL_Read", 0, 0, 0, 9};
-static tPERF_DATA perf_write = {"USERIAL_Write", 0, 0, 0, 3};
-static tPERF_DATA perf_poll_2_poll = {"USERIAL_Poll_to_Poll", 0, 0, 0, 0};
-static clock_t _poll_t0 = 0;
-
-static uint32_t userial_baud_tbl[] = {
-    300,     /* USERIAL_BAUD_300          0 */
-    600,     /* USERIAL_BAUD_600          1 */
-    1200,    /* USERIAL_BAUD_1200         2 */
-    2400,    /* USERIAL_BAUD_2400         3 */
-    9600,    /* USERIAL_BAUD_9600         4 */
-    19200,   /* USERIAL_BAUD_19200        5 */
-    57600,   /* USERIAL_BAUD_57600        6 */
-    115200,  /* USERIAL_BAUD_115200       7 */
-    230400,  /* USERIAL_BAUD_230400       8 */
-    460800,  /* USERIAL_BAUD_460800       9 */
-    921600,  /* USERIAL_BAUD_921600       10 */
-    1000000, /* USERIAL_BAUD_1M           11 */
-    1500000, /* USERIAL_BAUD_1_5M         12 */
-    2000000, /* USERIAL_BAUD_2M           13 */
-    3000000, /* USERIAL_BAUD_3M           14 */
-    4000000  /* USERIAL_BAUD_4M           15 */
-};
-
-/*******************************************************************************
-**
-** Function         wake_state
-**
-** Description      return current state of NFC_WAKE gpio
-**
-** Returns          GPIO value to wake NFCC
-**
-*******************************************************************************/
-static inline int wake_state() {
-  return ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH)
-              ? UPIO_ON
-              : UPIO_OFF);
-}
-
-/*******************************************************************************
-**
-** Function         sleep_state
-**
-** Description      return current state of NFC_WAKE gpio
-**
-** Returns          GPIO value to allow NFCC to goto sleep
-**
-*******************************************************************************/
-static inline int sleep_state() {
-  return ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH)
-              ? UPIO_OFF
-              : UPIO_ON);
-}
-
-/*******************************************************************************
-**
-** Function         isWake
-**
-** Description      return current state of NFC_WAKE gpio based on the active
-*mode setting
-**
-** Returns          asserted_state if it's awake, deasserted_state if it's
-*allowed to sleep
-**
-*******************************************************************************/
-static inline int isWake(int state) {
-  int asserted_state =
-      ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH)
-           ? UPIO_ON
-           : UPIO_OFF);
-  return (state != -1) ? state == asserted_state
-                       : current_nfc_wake_state == asserted_state;
-}
-
-/*******************************************************************************
-**
-** Function           setWriteDelay
-**
-** Description        Record a delay for the next write operation
-**
-** Input Parameter    delay in milliseconds
-**
-** Comments           use this function to register a delay before next write,
-**                    This is used in three instances: power up delay, wake
-*delay
-**                    and write delay
-**
-*******************************************************************************/
-static void setWriteDelay(int delay) {
-  if (delay <= 0) {
-    // Set a minimum delay of 5ms between back-to-back writes
-    delay = 5;
-  }
-
-  clock_gettime(CLOCK_MONOTONIC, &linux_cb.write_time);
-  if (delay > 1000) {
-    linux_cb.write_time.tv_sec += delay / 1000;
-    delay %= 1000;
-  }
-  unsigned long write_delay = delay * 1000 * 1000;
-  linux_cb.write_time.tv_nsec += write_delay;
-  if (linux_cb.write_time.tv_nsec > 1000 * 1000 * 1000) {
-    linux_cb.write_time.tv_nsec -= 1000 * 1000 * 1000;
-    linux_cb.write_time.tv_sec++;
-  }
-}
-
-/*******************************************************************************
-**
-** Function           doWriteDelay
-**
-** Description        Execute a delay as registered in setWriteDelay()
-**
-** Output Parameter   none
-**
-** Returns            none
-**
-** Comments           This function calls GKI_Delay to execute a delay to
-*fulfill
-**                    the delay registered earlier.
-**
-*******************************************************************************/
-static void doWriteDelay() {
-  struct timespec now;
-  clock_gettime(CLOCK_MONOTONIC, &now);
-  long delay = 0;
-
-  if (now.tv_sec > linux_cb.write_time.tv_sec)
-    return;
-  else if (now.tv_sec == linux_cb.write_time.tv_sec) {
-    if (now.tv_nsec > linux_cb.write_time.tv_nsec) return;
-    delay = (linux_cb.write_time.tv_nsec - now.tv_nsec) / 1000000;
-  } else
-    delay = (linux_cb.write_time.tv_sec - now.tv_sec) * 1000 +
-            linux_cb.write_time.tv_nsec / 1000000 - now.tv_nsec / 1000000;
-
-  if (delay > 0 && delay < 1000) {
-    ALOGD_IF((appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-             "doWriteDelay() delay %ld ms", delay);
-    GKI_delay(delay);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         create_signal_fds
-**
-** Description      create a socketpair for read thread to use
-**
-** Returns          file descriptor
-**
-*******************************************************************************/
-
-static int signal_fds[2];
-static inline int create_signal_fds(struct pollfd* set) {
-  if (signal_fds[0] == 0 &&
-      socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0) {
-    ALOGE("%s create_signal_sockets:socketpair failed, errno: %d", __func__,
-          errno);
-    return -1;
-  }
-  set->fd = signal_fds[0];
-  return signal_fds[0];
-}
-
-/*******************************************************************************
-**
-** Function         close_signal_fds
-**
-** Description      close the socketpair
-**
-** Returns          none
-**
-*******************************************************************************/
-static inline void close_signal_fds() {
-  int stat = 0;
-
-  stat = close(signal_fds[0]);
-  if (stat == -1) ALOGE("%s, fail close index 0; errno=%d", __func__, errno);
-  signal_fds[0] = 0;
-
-  stat = close(signal_fds[1]);
-  if (stat == -1) ALOGE("%s, fail close index 1; errno=%d", __func__, errno);
-  signal_fds[1] = 0;
-}
-
-/*******************************************************************************
-**
-** Function         send_wakeup_signal
-**
-** Description      send a one byte data to the socket as signal to the read
-*thread
-**                  for it to stop
-**
-** Returns          number of bytes sent, or error no
-**
-*******************************************************************************/
-static inline int send_wakeup_signal() {
-  char sig_on = 1;
-  ALOGD("%s: Sending signal to %d", __func__, signal_fds[1]);
-  return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
-}
-
-/*******************************************************************************
-**
-** Function         reset_signal
-**
-** Description      read the one byte data from the socket
-**
-** Returns          received data
-**
-*******************************************************************************/
-static inline int reset_signal() {
-  char sig_recv = 0;
-  ALOGD("%s: Receiving signal from %d", __func__, signal_fds[0]);
-  recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
-  return (int)sig_recv;
-}
-
-/*******************************************************************************
-**
-** Function         is_signaled
-**
-** Description      test if there's data waiting on the socket
-**
-** Returns          TRUE is data is available
-**
-*******************************************************************************/
-static inline int is_signaled(struct pollfd* set) {
-  return ((set->revents & POLLIN) == POLLIN) ||
-         ((set->revents & POLLRDNORM) == POLLRDNORM);
-}
-
-/******************************************************************************/
-
-typedef unsigned char uchar;
-
-BUFFER_Q Userial_in_q;
-
-/*******************************************************************************
- **
- ** Function           USERIAL_GetLineSpeed
- **
- ** Description        This function convert USERIAL baud to line speed.
- **
- ** Output Parameter   None
- **
- ** Returns            line speed
- **
- *******************************************************************************/
-extern uint32_t USERIAL_GetLineSpeed(uint8_t baud) {
-  return (baud <= USERIAL_BAUD_4M) ? userial_baud_tbl[baud - USERIAL_BAUD_300]
-                                   : 0;
-}
-
-/*******************************************************************************
- **
- ** Function           USERIAL_GetBaud
- **
- ** Description        This function convert line speed to USERIAL baud.
- **
- ** Output Parameter   None
- **
- ** Returns            line speed
- **
- *******************************************************************************/
-extern uint8_t USERIAL_GetBaud(uint32_t line_speed) {
-  uint8_t i;
-  for (i = USERIAL_BAUD_300; i <= USERIAL_BAUD_921600; i++) {
-    if (userial_baud_tbl[i - USERIAL_BAUD_300] == line_speed) return i;
-  }
-
-  return USERIAL_BAUD_AUTO;
-}
-
-/*******************************************************************************
-**
-** Function           USERIAL_Init
-**
-** Description        This function initializes the  serial driver.
-**
-** Output Parameter   None
-**
-** Returns            Nothing
-**
-*******************************************************************************/
-
-void USERIAL_Init(void* p_cfg) {
-  ALOGI(__func__);
-
-  // if userial_close_thread() is waiting to run; let it go first;
-  // let it finish; then continue this function
-  while (true) {
-    pthread_mutex_lock(&close_thread_mutex);
-    if (is_close_thread_is_waiting) {
-      pthread_mutex_unlock(&close_thread_mutex);
-      ALOGI("USERIAL_Init(): wait for close-thread");
-      sleep(1);
-    } else
-      break;
-  }
-
-  memset(&linux_cb, 0, sizeof(linux_cb));
-  linux_cb.sock = -1;
-  linux_cb.ser_cb = NULL;
-  linux_cb.sock_power_control = -1;
-  linux_cb.client_device_address = 0;
-  GKI_init_q(&Userial_in_q);
-  pthread_mutex_unlock(&close_thread_mutex);
-}
-
-/*******************************************************************************
- **
- ** Function           my_read
- **
- ** Description        This function read a packet from driver.
- **
- ** Output Parameter   None
- **
- ** Returns            number of bytes in the packet or error code
- **
- *******************************************************************************/
-int my_read(int fd, uchar* pbuf, int len) {
-  struct pollfd fds[2];
-
-  int n = 0;
-  int ret = 0;
-  int count = 0;
-  int offset = 0;
-  clock_t t1, t2;
-
-  if (!isLowSpeedTransport && _timeout != POLL_TIMEOUT)
-    ALOGD_IF((appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-             "%s: enter, pbuf=%lx, len = %d\n", __func__, (unsigned long)pbuf,
-             len);
-  memset(pbuf, 0, len);
-  /* need to use select in order to avoid collistion between read and close on
-   * same fd */
-  /* Initialize the input set */
-  fds[0].fd = fd;
-  fds[0].events = POLLIN | POLLERR | POLLRDNORM;
-  fds[0].revents = 0;
-
-  create_signal_fds(&fds[1]);
-  fds[1].events = POLLIN | POLLERR | POLLRDNORM;
-  fds[1].revents = 0;
-  t1 = clock();
-  n = TEMP_FAILURE_RETRY(poll(fds, 2, _timeout));
-  t2 = clock();
-  perf_update(&perf_poll, t2 - t1, 0);
-  if (_poll_t0) perf_update(&perf_poll_2_poll, t2 - _poll_t0, 0);
-
-  _poll_t0 = t2;
-  /* See if there was an error */
-  if (n < 0) {
-    ALOGD("select failed; errno = %d\n", errno);
-    return -errno;
-  } else if (n == 0)
-    return -EAGAIN;
-
-  if (is_signaled(&fds[1])) {
-    ALOGD("%s: exit signal received\n", __func__);
-    reset_signal();
-    return -1;
-  }
-  if (!bSerialPortDevice || len < MIN_BUFSIZE)
-    count = len;
-  else
-    count = 1;
-  do {
-    t2 = clock();
-    ret = TEMP_FAILURE_RETRY(read(fd, pbuf + offset, (size_t)count));
-    if (ret > 0) perf_update(&perf_read, clock() - t2, ret);
-
-    if (ret <= 0 || !bSerialPortDevice || len < MIN_BUFSIZE) break;
-
-    if (isLowSpeedTransport) goto done;
-
-    if (offset == 0) {
-      if (pbuf[offset] == HCIT_TYPE_NFC)
-        count = 3;
-      else if (pbuf[offset] == HCIT_TYPE_EVENT)
-        count = 2;
-      else {
-        ALOGD("%s: unknown HCIT type header pbuf[%d] = %x\n", __func__, offset,
-              pbuf[offset]);
-        break;
-      }
-      offset = 1;
-    } else if (offset == 1) {
-      offset += count;
-      count = pbuf[offset - 1];
-      if (count > (len - offset))  // if (count > (remaining buffer size))
-        count =
-            len - offset;  // only read what the remaining buffer size can hold
-    } else {
-      offset += ret;
-      count -= ret;
-    }
-    if (count == 0) {
-      ret = offset;
-      break;
-    }
-  } while (count > 0);
-
-#if VALIDATE_PACKET
-  /*
-   * vallidate the packet structure
-   */
-  if (ret > 0 && len >= MIN_BUFSIZE) {
-    count = 0;
-    while (count < ret) {
-      if (pbuf[count] == HCIT_TYPE_NFC) {
-        if (USERIAL_Debug_verbose)
-          scru_dump_hex(pbuf + count, NULL, pbuf[count + 3] + 4, 0, 0);
-        count += pbuf[count + 3] + 4;
-      } else if (pbuf[count] == HCIT_TYPE_EVENT) {
-        if (USERIAL_Debug_verbose)
-          scru_dump_hex(pbuf + count, NULL, pbuf[count + 2] + 3, 0, 0);
-        count += pbuf[count + 2] + 3;
-      } else {
-        ALOGD("%s: unknown HCIT type header pbuf[%d] = %x, remain %d bytes\n",
-              __func__, count, pbuf[count], ret - count);
-        scru_dump_hex(pbuf + count, NULL, ret - count, 0, 0);
-        break;
-      }
-    } /* while*/
-  }
-#endif
-done:
-  if (!isLowSpeedTransport)
-    ALOGD_IF((appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-             "%s: return %d(0x%x) bytes, errno=%d count=%d, n=%d, timeout=%d\n",
-             __func__, ret, ret, errno, count, n, _timeout);
-  if (_timeout == POLL_TIMEOUT) _timeout = -1;
-  return ret;
-}
-extern bool gki_chk_buf_damage(void* p_buf);
-static int sRxLength = 0;
-
-/*******************************************************************************
- **
- ** Function           userial_read_thread
- **
- ** Description        entry point of read thread.
- **
- ** Output Parameter   None
- **
- ** Returns            0
- **
- *******************************************************************************/
-uint32_t userial_read_thread(uint32_t arg) {
-  int rx_length;
-  int error_count = 0;
-  int bErrorReported = 0;
-  int iMaxError = MAX_ERROR;
-  NFC_HDR* p_buf = NULL;
-
-  worker_thread1 = pthread_self();
-
-  ALOGD("start userial_read_thread, id=%lx", worker_thread1);
-  _timeout = POLL_TIMEOUT;
-
-  for (; linux_cb.sock > 0;) {
-    NFC_HDR* p_buf;
-    uint8_t* current_packet;
-
-    p_buf = (NFC_HDR*)GKI_getpoolbuf(USERIAL_POOL_ID);
-    if (p_buf != NULL) {
-      p_buf->offset = 0;
-      p_buf->layer_specific = 0;
-
-      current_packet = (uint8_t*)(p_buf + 1);
-      rx_length = my_read(linux_cb.sock, current_packet, READ_LIMIT);
-
-    } else {
-      ALOGE(
-          "userial_read_thread(): unable to get buffer from GKI p_buf = %p "
-          "poolid = %d\n",
-          p_buf, USERIAL_POOL_ID);
-      rx_length = 0; /* paranoia setting */
-      GKI_delay(NO_GKI_BUFFER_RECOVER_TIME);
-      continue;
-    }
-    if (rx_length > 0) {
-      bErrorReported = 0;
-      error_count = 0;
-      iMaxError = 3;
-      if (rx_length > sRxLength) sRxLength = rx_length;
-      p_buf->len = (uint16_t)rx_length;
-      GKI_enqueue(&Userial_in_q, p_buf);
-      if (!isLowSpeedTransport)
-        ALOGD_IF(
-            (appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-            "userial_read_thread(): enqueued p_buf=%p, count=%d, length=%d\n",
-            p_buf, Userial_in_q.count, rx_length);
-
-      if (linux_cb.ser_cb != NULL)
-        (*linux_cb.ser_cb)(linux_cb.port, USERIAL_RX_READY_EVT,
-                           (tUSERIAL_EVT_DATA*)p_buf);
-
-      GKI_send_event(USERIAL_HAL_TASK, HCISU_EVT);
-    } else {
-      GKI_freebuf(p_buf);
-      if (rx_length == -EAGAIN)
-        continue;
-      else if (rx_length == -1) {
-        ALOGD("userial_read_thread(): exiting\n");
-        break;
-      } else if (rx_length == 0 && !isWake(-1))
-        continue;
-      ++error_count;
-      if (rx_length <= 0 &&
-          ((error_count > 0) && ((error_count % iMaxError) == 0))) {
-        if (bErrorReported == 0) {
-          ALOGE(
-              "userial_read_thread(): my_read returned (%d) error count = %d, "
-              "errno=%d return USERIAL_ERR_EVT\n",
-              rx_length, error_count, errno);
-          if (linux_cb.ser_cb != NULL)
-            (*linux_cb.ser_cb)(linux_cb.port, USERIAL_ERR_EVT,
-                               (tUSERIAL_EVT_DATA*)p_buf);
-
-          GKI_send_event(USERIAL_HAL_TASK, HCISU_EVT);
-          ++bErrorReported;
-        }
-        if (sRxLength == 0) {
-          ALOGE(
-              "userial_read_thread(): my_read returned (%d) error count = %d, "
-              "errno=%d exit read thread\n",
-              rx_length, error_count, errno);
-          break;
-        }
-      }
-    }
-  } /* for */
-
-  ALOGD("userial_read_thread(): freeing GKI_buffers\n");
-  while ((p_buf = (NFC_HDR*)GKI_dequeue(&Userial_in_q)) != NULL) {
-    GKI_freebuf(p_buf);
-    ALOGD("userial_read_thread: dequeued buffer from Userial_in_q\n");
-  }
-
-  GKI_exit_task(GKI_get_taskid());
-  ALOGD("USERIAL READ: EXITING TASK\n");
-
-  return 0;
-}
-
-/*******************************************************************************
- **
- ** Function           userial_to_tcio_baud
- **
- ** Description        helper function converts USERIAL baud rates into TCIO
- *conforming baud rates
- **
- ** Output Parameter   None
- **
- ** Returns            TRUE - success
- **                    FALSE - unsupported baud rate, default of 115200 is used
- **
- *******************************************************************************/
-bool userial_to_tcio_baud(uint8_t cfg_baud, uint32_t* baud) {
-  if (cfg_baud == USERIAL_BAUD_600)
-    *baud = B600;
-  else if (cfg_baud == USERIAL_BAUD_1200)
-    *baud = B1200;
-  else if (cfg_baud == USERIAL_BAUD_9600)
-    *baud = B9600;
-  else if (cfg_baud == USERIAL_BAUD_19200)
-    *baud = B19200;
-  else if (cfg_baud == USERIAL_BAUD_57600)
-    *baud = B57600;
-  else if (cfg_baud == USERIAL_BAUD_115200)
-    *baud = B115200 | CBAUDEX;
-  else if (cfg_baud == USERIAL_BAUD_230400)
-    *baud = B230400;
-  else if (cfg_baud == USERIAL_BAUD_460800)
-    *baud = B460800;
-  else if (cfg_baud == USERIAL_BAUD_921600)
-    *baud = B921600;
-  else if (cfg_baud == USERIAL_BAUD_1M)
-    *baud = B1000000;
-  else if (cfg_baud == USERIAL_BAUD_2M)
-    *baud = B2000000;
-  else if (cfg_baud == USERIAL_BAUD_3M)
-    *baud = B3000000;
-  else if (cfg_baud == USERIAL_BAUD_4M)
-    *baud = B4000000;
-  else {
-    ALOGE("userial_to_tcio_baud: unsupported baud idx %i", cfg_baud);
-    *baud = B115200;
-    return false;
-  }
-  return true;
-}
-
-#if (USERIAL_USE_IO_BT_WAKE == TRUE)
-/*******************************************************************************
- **
- ** Function           userial_io_init_bt_wake
- **
- ** Description        helper function to set the open state of the bt_wake if
- *ioctl
- **                    is used. it should not hurt in the rfkill case but it
- *might
- **                    be better to compile it out.
- **
- ** Returns            none
- **
- *******************************************************************************/
-void userial_io_init_bt_wake(int fd, unsigned long* p_wake_state) {
-  /* assert BT_WAKE for ioctl. should NOT hurt on rfkill version */
-  ioctl(fd, USERIAL_IO_BT_WAKE_ASSERT, NULL);
-  ioctl(fd, USERIAL_IO_BT_WAKE_GET_ST, p_wake_state);
-  if (*p_wake_state == 0)
-    ALOGI(
-        "\n***userial_io_init_bt_wake(): Ooops, asserted BT_WAKE signal, but "
-        "still got BT_WAKE state == to %d\n",
-        *p_wake_state);
-
-  *p_wake_state = 1;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function           USERIAL_Open
-**
-** Description        Open the indicated serial port with the given
-*configuration
-**
-** Output Parameter   None
-**
-** Returns            Nothing
-**
-*******************************************************************************/
-void USERIAL_Open(tUSERIAL_PORT port, tUSERIAL_OPEN_CFG* p_cfg,
-                  tUSERIAL_CBACK* p_cback) {
-  uint32_t baud = 0;
-  uint8_t data_bits = 0;
-  uint16_t parity = 0;
-  uint8_t stop_bits = 0;
-  struct termios termios;
-  const char ttyusb[] = "/dev/ttyUSB";
-  const char devtty[] = "/dev/tty";
-  unsigned long num = 0;
-  int ret = 0;
-
-  ALOGI("USERIAL_Open(): enter");
-
-  // if userial_close_thread() is waiting to run; let it go first;
-  // let it finish; then continue this function
-  while (true) {
-    pthread_mutex_lock(&close_thread_mutex);
-    if (is_close_thread_is_waiting) {
-      pthread_mutex_unlock(&close_thread_mutex);
-      ALOGI("USERIAL_Open(): wait for close-thread");
-      sleep(1);
-    } else
-      break;
-  }
-
-  // restore default power off delay settings incase they were changed in
-  // userial_set_poweroff_delays()
-  gPrePowerOffDelay = 0;
-  gPostPowerOffDelay = 0;
-
-  if (!GetStrValue(NAME_TRANSPORT_DRIVER, userial_dev, sizeof(userial_dev)))
-    strcpy(userial_dev, default_transport);
-  if (GetNumValue(NAME_UART_PORT, &num, sizeof(num))) uart_port = num;
-  if (GetNumValue(NAME_LOW_SPEED_TRANSPORT, &num, sizeof(num)))
-    isLowSpeedTransport = num;
-  if (GetNumValue(NAME_NFC_WAKE_DELAY, &num, sizeof(num))) nfc_wake_delay = num;
-  if (GetNumValue(NAME_NFC_WRITE_DELAY, &num, sizeof(num)))
-    nfc_write_delay = num;
-  if (GetNumValue(NAME_PERF_MEASURE_FREQ, &num, sizeof(num)))
-    perf_log_every_count = num;
-  if (GetNumValue(NAME_POWER_ON_DELAY, &num, sizeof(num))) gPowerOnDelay = num;
-  if (GetNumValue(NAME_PRE_POWER_OFF_DELAY, &num, sizeof(num)))
-    gPrePowerOffDelay = num;
-  if (GetNumValue(NAME_POST_POWER_OFF_DELAY, &num, sizeof(num)))
-    gPostPowerOffDelay = num;
-  if (GetNumValue(NAME_POWER_OFF_MODE, &num, sizeof(num))) gPowerOffMode = num;
-  ALOGI(
-      "USERIAL_Open() device: %s port=%d, uart_port=%d WAKE_DELAY(%d) "
-      "WRITE_DELAY(%d) POWER_ON_DELAY(%d) PRE_POWER_OFF_DELAY(%d) "
-      "POST_POWER_OFF_DELAY(%d)",
-      (char*)userial_dev, port, uart_port, nfc_wake_delay, nfc_write_delay,
-      gPowerOnDelay, gPrePowerOffDelay, gPostPowerOffDelay);
-
-  strcpy((char*)device_name, (char*)userial_dev);
-  sRxLength = 0;
-  _poll_t0 = 0;
-
-  if ((strncmp(userial_dev, ttyusb, sizeof(ttyusb) - 1) == 0) ||
-      (strncmp(userial_dev, devtty, sizeof(devtty) - 1) == 0)) {
-    if (uart_port >= MAX_SERIAL_PORT) {
-      ALOGD("Port > MAX_SERIAL_PORT\n");
-      goto done_open;
-    }
-    bSerialPortDevice = true;
-    sprintf((char*)device_name, "%s%d", (char*)userial_dev, uart_port);
-    ALOGI("USERIAL_Open() using device_name: %s ", (char*)device_name);
-    if (!userial_to_tcio_baud(p_cfg->baud, &baud)) goto done_open;
-
-    if (p_cfg->fmt & USERIAL_DATABITS_8)
-      data_bits = CS8;
-    else if (p_cfg->fmt & USERIAL_DATABITS_7)
-      data_bits = CS7;
-    else if (p_cfg->fmt & USERIAL_DATABITS_6)
-      data_bits = CS6;
-    else if (p_cfg->fmt & USERIAL_DATABITS_5)
-      data_bits = CS5;
-    else
-      goto done_open;
-
-    if (p_cfg->fmt & USERIAL_PARITY_NONE)
-      parity = 0;
-    else if (p_cfg->fmt & USERIAL_PARITY_EVEN)
-      parity = PARENB;
-    else if (p_cfg->fmt & USERIAL_PARITY_ODD)
-      parity = (PARENB | PARODD);
-    else
-      goto done_open;
-
-    if (p_cfg->fmt & USERIAL_STOPBITS_1)
-      stop_bits = 0;
-    else if (p_cfg->fmt & USERIAL_STOPBITS_2)
-      stop_bits = CSTOPB;
-    else
-      goto done_open;
-  } else
-    strcpy((char*)device_name, (char*)userial_dev);
-
-  {
-    ALOGD("%s Opening %s\n", __func__, device_name);
-    linux_cb.sock = open((char*)device_name, O_RDWR | O_NOCTTY);
-    if (linux_cb.sock == -1) {
-      ALOGI("%s unable to open %s", __func__, device_name);
-      GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE);
-      goto done_open;
-    }
-    ALOGD("%s sock = %d\n", __func__, linux_cb.sock);
-    if (GetStrValue(NAME_POWER_CONTROL_DRIVER, power_control_dev,
-                    sizeof(power_control_dev)) &&
-        power_control_dev[0] != '\0') {
-      if (strcmp(power_control_dev, userial_dev) == 0)
-        linux_cb.sock_power_control = linux_cb.sock;
-      else {
-        linux_cb.sock_power_control =
-            open((char*)power_control_dev, O_RDWR | O_NOCTTY);
-        if (linux_cb.sock_power_control == -1) {
-          ALOGI("%s unable to open %s", __func__, power_control_dev);
-        }
-      }
-    }
-    if (bSerialPortDevice) {
-      tcflush(linux_cb.sock, TCIOFLUSH);
-      tcgetattr(linux_cb.sock, &termios);
-
-      termios.c_cflag &= ~(CSIZE | PARENB);
-      termios.c_cflag = CLOCAL | CREAD | data_bits | stop_bits | parity;
-      if (!parity) termios.c_cflag |= IGNPAR;
-      // termios.c_cflag &= ~CRTSCTS;
-      termios.c_oflag = 0;
-      termios.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
-      termios.c_iflag &=
-          ~(BRKINT | ICRNL | INLCR | ISTRIP | IXON | IGNBRK | PARMRK | INPCK);
-      termios.c_lflag = 0;
-      termios.c_iflag = 0;
-      cfsetospeed(&termios, baud);
-      cfsetispeed(&termios, baud);
-
-      termios.c_cc[VTIME] = 0;
-      termios.c_cc[VMIN] = 1;
-      tcsetattr(linux_cb.sock, TCSANOW, &termios);
-
-      tcflush(linux_cb.sock, TCIOFLUSH);
-
-#if (USERIAL_USE_IO_BT_WAKE == TRUE)
-      userial_io_init_bt_wake(linux_cb.sock, &linux_cb.bt_wake_state);
-#endif
-      GKI_delay(gPowerOnDelay);
-    } else {
-      USERIAL_PowerupDevice(port);
-    }
-  }
-
-  linux_cb.ser_cb = p_cback;
-  linux_cb.port = port;
-  memcpy(&linux_cb.open_cfg, p_cfg, sizeof(tUSERIAL_OPEN_CFG));
-  GKI_create_task((TASKPTR)userial_read_thread, USERIAL_HAL_TASK,
-                  (int8_t*)"USERIAL_HAL_TASK", 0, 0, (pthread_cond_t*)NULL,
-                  NULL);
-
-#if (USERIAL_DEBUG == TRUE)
-  ALOGD("Leaving USERIAL_Open\n");
-#endif
-
-#if (SERIAL_AMBA == TRUE)
-  /* give 20ms time for reader thread */
-  GKI_delay(20);
-#endif
-
-done_open:
-  pthread_mutex_unlock(&close_thread_mutex);
-  ALOGI("USERIAL_Open(): exit");
-  return;
-}
-
-/*******************************************************************************
-**
-** Function           USERIAL_Read
-**
-** Description        Read data from a serial port using byte buffers.
-**
-** Output Parameter   None
-**
-** Returns            Number of bytes actually read from the serial port and
-**                    copied into p_data.  This may be less than len.
-**
-*******************************************************************************/
-
-static NFC_HDR* pbuf_USERIAL_Read = NULL;
-
-uint16_t USERIAL_Read(tUSERIAL_PORT port, uint8_t* p_data, uint16_t len) {
-  uint16_t total_len = 0;
-  uint16_t copy_len = 0;
-  uint8_t* current_packet = NULL;
-
-#if (USERIAL_DEBUG == TRUE)
-  ALOGD("%s ++ len=%d pbuf_USERIAL_Read=%p, p_data=%p\n", __func__, len,
-        pbuf_USERIAL_Read, p_data);
-#endif
-  do {
-    if (pbuf_USERIAL_Read != NULL) {
-      current_packet =
-          ((uint8_t*)(pbuf_USERIAL_Read + 1)) + (pbuf_USERIAL_Read->offset);
-
-      if ((pbuf_USERIAL_Read->len) <= (len - total_len))
-        copy_len = pbuf_USERIAL_Read->len;
-      else
-        copy_len = (len - total_len);
-
-      memcpy((p_data + total_len), current_packet, copy_len);
-
-      total_len += copy_len;
-
-      pbuf_USERIAL_Read->offset += copy_len;
-      pbuf_USERIAL_Read->len -= copy_len;
-
-      if (pbuf_USERIAL_Read->len == 0) {
-        GKI_freebuf(pbuf_USERIAL_Read);
-        pbuf_USERIAL_Read = NULL;
-      }
-    }
-
-    if (pbuf_USERIAL_Read == NULL && (total_len < len))
-      pbuf_USERIAL_Read = (NFC_HDR*)GKI_dequeue(&Userial_in_q);
-
-  } while ((pbuf_USERIAL_Read != NULL) && (total_len < len));
-
-#if (USERIAL_DEBUG == TRUE)
-  ALOGD("%s: returned %d bytes", __func__, total_len);
-#endif
-  return total_len;
-}
-
-/*******************************************************************************
-**
-** Function           USERIAL_Readbuf
-**
-** Description        Read data from a serial port using GKI buffers.
-**
-** Output Parameter   Pointer to a GKI buffer which contains the data.
-**
-** Returns            Nothing
-**
-** Comments           The caller of this function is responsible for freeing the
-**                    GKI buffer when it is finished with the data.  If there is
-**                    no data to be read, the value of the returned pointer is
-**                    NULL.
-**
-*******************************************************************************/
-
-void USERIAL_ReadBuf(tUSERIAL_PORT port, NFC_HDR** p_buf) {}
-
-/*******************************************************************************
-**
-** Function           USERIAL_WriteBuf
-**
-** Description        Write data to a serial port using a GKI buffer.
-**
-** Output Parameter   None
-**
-** Returns            TRUE  if buffer accepted for write.
-**                    FALSE if there is already a buffer being processed.
-**
-** Comments           The buffer will be freed by the serial driver.  Therefore,
-**                    the application calling this function must not free the
-**                    buffer.
-**
-*******************************************************************************/
-
-bool USERIAL_WriteBuf(tUSERIAL_PORT port, NFC_HDR* p_buf) { return false; }
-
-/*******************************************************************************
-**
-** Function           USERIAL_Write
-**
-** Description        Write data to a serial port using a byte buffer.
-**
-** Output Parameter   None
-**
-** Returns            Number of bytes actually written to the transport.  This
-**                    may be less than len.
-**
-*******************************************************************************/
-uint16_t USERIAL_Write(tUSERIAL_PORT port, uint8_t* p_data, uint16_t len) {
-  int ret = 0, total = 0;
-  int i = 0;
-  clock_t t;
-
-  ALOGD_IF((appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-           "USERIAL_Write: (%d bytes)", len);
-  pthread_mutex_lock(&close_thread_mutex);
-
-  doWriteDelay();
-  t = clock();
-  while (len != 0 && linux_cb.sock != -1) {
-    ret = TEMP_FAILURE_RETRY(write(linux_cb.sock, p_data + total, len));
-    if (ret < 0) {
-      ALOGE("USERIAL_Write len = %d, ret = %d, errno = %d", len, ret, errno);
-      break;
-    } else {
-      ALOGD_IF((appl_trace_level >= BT_TRACE_LEVEL_DEBUG),
-               "USERIAL_Write len = %d, ret = %d", len, ret);
-    }
-
-    total += ret;
-    len -= ret;
-  }
-  perf_update(&perf_write, clock() - t, total);
-
-  /* register a delay for next write */
-  setWriteDelay(total * nfc_write_delay / 1000);
-
-  pthread_mutex_unlock(&close_thread_mutex);
-
-  return ((uint16_t)total);
-}
-
-/*******************************************************************************
-**
-** Function           userial_change_rate
-**
-** Description        change naud rate
-**
-** Output Parameter   None
-**
-** Returns            None
-**
-*******************************************************************************/
-void userial_change_rate(uint8_t baud) {
-#if (USING_BRCM_USB == FALSE)
-  struct termios termios;
-#endif
-#if (USERIAL_USE_TCIO_BAUD_CHANGE == TRUE)
-  uint32_t tcio_baud;
-#endif
-
-#if (USING_BRCM_USB == FALSE)
-  tcflush(linux_cb.sock, TCIOFLUSH);
-
-  tcgetattr(linux_cb.sock, &termios);
-
-  cfmakeraw(&termios);
-  cfsetospeed(&termios, baud);
-  cfsetispeed(&termios, baud);
-
-  termios.c_cflag |= (CLOCAL | CREAD | CRTSCTS | stop_bits);
-
-  tcsetattr(linux_cb.sock, TCSANOW, &termios);
-  tcflush(linux_cb.sock, TCIOFLUSH);
-
-#else
-#if (USERIAL_USE_TCIO_BAUD_CHANGE == FALSE)
-  fprintf(stderr, "userial_change_rate: Closing UART Port\n");
-  ALOGI("userial_change_rate: Closing UART Port\n");
-  USERIAL_Close(linux_cb.port);
-
-  GKI_delay(50);
-
-  /* change baud rate in settings - leave everything else the same  */
-  linux_cb.open_cfg.baud = baud;
-
-  ALOGD("userial_change_rate: Attempting to reopen the UART Port at 0x%08x\n",
-        (unsigned int)USERIAL_GetLineSpeed(baud));
-  ALOGI("userial_change_rate: Attempting to reopen the UART Port at %i\n",
-        (unsigned int)USERIAL_GetLineSpeed(baud));
-
-  USERIAL_Open(linux_cb.port, &linux_cb.open_cfg, linux_cb.ser_cb);
-#else /* amba uart */
-  fprintf(stderr, "userial_change_rate(): changeing baud rate via TCIO \n");
-  ALOGI("userial_change_rate: (): changeing baud rate via TCIO \n");
-  /* change baud rate in settings - leave everything else the same  */
-  linux_cb.open_cfg.baud = baud;
-  if (!userial_to_tcio_baud(linux_cb.open_cfg.baud, &tcio_baud)) return;
-
-  tcflush(linux_cb.sock, TCIOFLUSH);
-
-  /* get current settings. they should be fine besides baud rate we want to
-   * change */
-  tcgetattr(linux_cb.sock, &termios);
-
-  /* set input/output baudrate */
-  cfsetospeed(&termios, tcio_baud);
-  cfsetispeed(&termios, tcio_baud);
-  tcsetattr(linux_cb.sock, TCSANOW, &termios);
-
-  tcflush(linux_cb.sock, TCIOFLUSH);
-#endif
-#endif /* USING_BRCM_USB  */
-}
-
-/*******************************************************************************
-**
-** Function           userial_close_port
-**
-** Description        close the transport driver
-**
-** Returns            Nothing
-**
-*******************************************************************************/
-void userial_close_port(void) { USERIAL_Close(linux_cb.port); }
-
-/*******************************************************************************
-**
-** Function           USERIAL_Ioctl
-**
-** Description        Perform an operation on a serial port.
-**
-** Output Parameter   The p_data parameter is either an input or output
-*depending
-**                    on the operation.
-**
-** Returns            Nothing
-**
-*******************************************************************************/
-
-void USERIAL_Ioctl(tUSERIAL_PORT port, tUSERIAL_OP op,
-                   tUSERIAL_IOCTL_DATA* p_data) {
-#if (defined(LINUX_OS) && LINUX_OS == TRUE)
-  USB_SCO_CONTROL ioctl_data;
-
-/* just ignore port parameter as we are using USB in this case  */
-#endif
-
-  switch (op) {
-    case USERIAL_OP_FLUSH:
-      break;
-    case USERIAL_OP_FLUSH_RX:
-      break;
-    case USERIAL_OP_FLUSH_TX:
-      break;
-    case USERIAL_OP_BAUD_WR:
-      ALOGI(
-          "USERIAL_Ioctl: Received USERIAL_OP_BAUD_WR on port: %d, ioctl "
-          "baud%i\n",
-          port, p_data->baud);
-      linux_cb.port = port;
-      userial_change_rate(p_data->baud);
-      break;
-
-    default:
-      break;
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         USERIAL_SetPowerOffDelays
-**
-** Description      Set power off delays used during USERIAL_Close().  The
-**                  values in the conf. file setting override these if set.
-**
-** Returns          None.
-**
-*******************************************************************************/
-void USERIAL_SetPowerOffDelays(int pre_poweroff_delay,
-                               int post_poweroff_delay) {
-  gPrePowerOffDelay = pre_poweroff_delay;
-  gPostPowerOffDelay = post_poweroff_delay;
-}
-
-/*******************************************************************************
-**
-** Function           USERIAL_Close
-**
-** Description        Close a serial port
-**
-** Output Parameter   None
-**
-** Returns            Nothing
-**
-*******************************************************************************/
-void USERIAL_Close(tUSERIAL_PORT port) {
-  pthread_attr_t attr;
-  pthread_t close_thread;
-  uint8_t res[10];
-  uint32_t delay = 100;
-
-  ALOGD("%s: enter; gPowerOffMode=%d", __func__, gPowerOffMode);
-
-  /* Do we need to put NFCC into certain mode before switching off?... */
-  if (gPowerOffMode != POM_NORMAL) {
-    switch (gPowerOffMode) {
-      case POM_CE3SO:
-        ALOGD("%s: Sending Set_PwrLevel cmd to go to CE3-SO mode", __func__);
-        USERIAL_Write(port, ce3_so_cmd, sizeof(ce3_so_cmd));
-        delay = 1000;
-        break;
-
-      case POM_NFC_OFF:
-        ALOGD("%s: Sending Set_NfcOff cmd", __func__);
-        USERIAL_Write(port, set_nfc_off_cmd, sizeof(set_nfc_off_cmd));
-        break;
-    }
-
-    USERIAL_Read(port, res, sizeof(res));
-    GKI_delay(delay);
-  }
-
-  // check to see if thread is already running
-  if (pthread_mutex_trylock(&close_thread_mutex) == 0) {
-    // mutex aquired so thread is not running
-    is_close_thread_is_waiting = TRUE;
-    pthread_mutex_unlock(&close_thread_mutex);
-
-    // close transport in a new thread so we don't block the caller
-    // make thread detached, no other thread will join
-    pthread_attr_init(&attr);
-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    pthread_create(&close_thread, &attr, (void*)userial_close_thread, NULL);
-    pthread_attr_destroy(&attr);
-  } else {
-    // mutex not aquired to thread is already running
-    ALOGD("USERIAL_Close(): already closing \n");
-  }
-  ALOGD("%s: exit", __func__);
-}
-
-/*******************************************************************************
-**
-** Function         userial_close_thread
-**
-** Description      Thread to close USERIAL
-**
-** Returns          None.
-**
-*******************************************************************************/
-void userial_close_thread(uint32_t params) {
-  NFC_HDR* p_buf = NULL;
-  int result;
-
-  ALOGD("%s: closing transport (%d)\n", __func__, linux_cb.sock);
-  pthread_mutex_lock(&close_thread_mutex);
-  is_close_thread_is_waiting = false;
-
-  if (linux_cb.sock <= 0) {
-    ALOGD("%s: already closed (%d)\n", __func__, linux_cb.sock);
-    pthread_mutex_unlock(&close_thread_mutex);
-    return;
-  }
-
-  send_wakeup_signal();
-  result = pthread_join(worker_thread1, NULL);
-  if (result < 0)
-    ALOGE("%s: pthread_join() FAILED: result: %d", __func__, result);
-  else
-    ALOGD("%s: pthread_join() joined: result: %d", __func__, result);
-
-  if (linux_cb.sock_power_control > 0) {
-    result = ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL, sleep_state());
-    ALOGD("%s: Delay %dms before turning off the chip", __func__,
-          gPrePowerOffDelay);
-    GKI_delay(gPrePowerOffDelay);
-    result = ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 0);
-    ALOGD("%s: Delay %dms after turning off the chip", __func__,
-          gPostPowerOffDelay);
-    GKI_delay(gPostPowerOffDelay);
-  }
-  result = close(linux_cb.sock);
-  if (result == -1)
-    ALOGE("%s: fail close linux_cb.sock; errno=%d", __func__, errno);
-
-  if (linux_cb.sock_power_control > 0 &&
-      linux_cb.sock_power_control != linux_cb.sock)
-    result = close(linux_cb.sock_power_control);
-  if (result == -1)
-    ALOGE("%s: fail close linux_cb.sock_power_control; errno=%d", __func__,
-          errno);
-
-  linux_cb.sock_power_control = -1;
-  linux_cb.sock = -1;
-
-  close_signal_fds();
-  pthread_mutex_unlock(&close_thread_mutex);
-  ALOGD("%s: exiting", __func__);
-}
-
-/*******************************************************************************
-**
-** Function           USERIAL_Feature
-**
-** Description        Check whether a feature of the serial API is supported.
-**
-** Output Parameter   None
-**
-** Returns            TRUE  if the feature is supported
-**                    FALSE if the feature is not supported
-**
-*******************************************************************************/
-
-bool USERIAL_Feature(tUSERIAL_FEATURE feature) {
-  switch (feature) {
-    case USERIAL_FEAT_PORT_1:
-    case USERIAL_FEAT_PORT_2:
-    case USERIAL_FEAT_PORT_3:
-    case USERIAL_FEAT_PORT_4:
-
-    case USERIAL_FEAT_BAUD_600:
-    case USERIAL_FEAT_BAUD_1200:
-    case USERIAL_FEAT_BAUD_9600:
-    case USERIAL_FEAT_BAUD_19200:
-    case USERIAL_FEAT_BAUD_57600:
-    case USERIAL_FEAT_BAUD_115200:
-
-    case USERIAL_FEAT_STOPBITS_1:
-    case USERIAL_FEAT_STOPBITS_2:
-
-    case USERIAL_FEAT_PARITY_NONE:
-    case USERIAL_FEAT_PARITY_EVEN:
-    case USERIAL_FEAT_PARITY_ODD:
-
-    case USERIAL_FEAT_DATABITS_5:
-    case USERIAL_FEAT_DATABITS_6:
-    case USERIAL_FEAT_DATABITS_7:
-    case USERIAL_FEAT_DATABITS_8:
-
-    case USERIAL_FEAT_FC_HW:
-    case USERIAL_FEAT_BUF_BYTE:
-
-    case USERIAL_FEAT_OP_FLUSH_RX:
-    case USERIAL_FEAT_OP_FLUSH_TX:
-      return true;
-    default:
-      return false;
-  }
-
-  return false;
-}
-
-/*****************************************************************************
-**
-** Function         UPIO_Set
-**
-** Description
-**      This function sets one or more GPIO devices to the given state.
-**      Multiple GPIOs of the same type can be masked together to set more
-**      than one GPIO. This function can only be used on types UPIO_LED and
-**      UPIO_GENERAL.
-**
-** Input Parameters:
-**      type    The type of device.
-**      pio     Indicates the particular GPIOs.
-**      state   The desired state.
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      None.
-**
-*****************************************************************************/
-void UPIO_Set(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE new_state) {
-  int ret;
-  if (type == UPIO_GENERAL) {
-    if (pio == NFC_HAL_LP_NFC_WAKE_GPIO) {
-      if (new_state == UPIO_ON || new_state == UPIO_OFF) {
-        if (linux_cb.sock_power_control > 0) {
-          ALOGD("%s: ioctl, state=%d", __func__, new_state);
-          ret = ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL, new_state);
-          if (isWake(new_state) && nfc_wake_delay > 0 &&
-              new_state != current_nfc_wake_state) {
-            ALOGD("%s: ioctl, old state=%d, insert delay for %d ms", __func__,
-                  current_nfc_wake_state, nfc_wake_delay);
-            setWriteDelay(nfc_wake_delay);
-          }
-          current_nfc_wake_state = new_state;
-        }
-      }
-    }
-  }
-}
-
-/*****************************************************************************
-**
-** Function         setReadPacketSize
-**
-** Description
-**      This function sets the packetSize to the driver.
-**      this enables faster read operation of NCI/HCI responses
-**
-** Input Parameters:
-**      len     number of bytes to read per operation.
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      None.
-**
-*****************************************************************************/
-void setReadPacketSize(int len) {
-  int ret;
-  ALOGD("%s: ioctl, len=%d", __func__, len);
-  ret = ioctl(linux_cb.sock, BCMNFC_READ_FULL_PACKET, len);
-}
-
-bool USERIAL_IsClosed() { return (linux_cb.sock == -1) ? true : false; }
-
-void USERIAL_PowerupDevice(tUSERIAL_PORT port) {
-  int ret = -1;
-  unsigned long num = 0;
-  unsigned int resetSuccess = 0;
-  unsigned int numTries = 0;
-  unsigned char spi_negotiation[64];
-  int delay = gPowerOnDelay;
-  ALOGD("%s: enter", __func__);
-
-  if (GetNumValue(NAME_READ_MULTI_PACKETS, &num, sizeof(num)))
-    bcmi2cnfc_read_multi_packets = num;
-
-  if (bcmi2cnfc_read_multi_packets > 0)
-    ioctl(linux_cb.sock, BCMNFC_READ_MULTI_PACKETS,
-          bcmi2cnfc_read_multi_packets);
-
-  while (!resetSuccess && numTries < NUM_RESET_ATTEMPTS) {
-    if (numTries++ > 0) {
-      ALOGW("BCM2079x: retrying reset, attempt %d/%d", numTries,
-            NUM_RESET_ATTEMPTS);
-    }
-    if (linux_cb.sock_power_control > 0) {
-      current_nfc_wake_state = NFC_WAKE_ASSERTED_ON_POR;
-      ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL,
-            NFC_WAKE_ASSERTED_ON_POR);
-      ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 0);
-      GKI_delay(10);
-      ret = ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 1);
-    }
-
-    ret = GetStrValue(NAME_SPI_NEGOTIATION, (char*)spi_negotiation,
-                      sizeof(spi_negotiation));
-    if (ret > 0 && spi_negotiation[0] > 0 &&
-        spi_negotiation[0] < sizeof(spi_negotiation) - 1) {
-      int len = spi_negotiation[0];
-      /* Wake control is not available: Start SPI negotiation*/
-      USERIAL_Write(port, &spi_negotiation[1], len);
-      USERIAL_Read(port, spi_nego_res, sizeof(spi_nego_res));
-    }
-
-    if (GetNumValue(NAME_CLIENT_ADDRESS, &num, sizeof(num)))
-      bcmi2cnfc_client_addr = num & 0xFF;
-    if (bcmi2cnfc_client_addr != 0 && 0x07 < bcmi2cnfc_client_addr &&
-        bcmi2cnfc_client_addr < 0x78) {
-      /* Delay needed after turning on chip */
-      GKI_delay(delay);
-      ALOGD("Change client address to %x\n", bcmi2cnfc_client_addr);
-      ret = change_client_addr(bcmi2cnfc_client_addr);
-      if (!ret) {
-        resetSuccess = 1;
-        linux_cb.client_device_address = bcmi2cnfc_client_addr;
-        /* Delay long enough for address change */
-        /* MACO xxx this needs to be at least 200 ms for BCM2079x B3 */
-        delay = 200;
-      }
-    } else {
-      resetSuccess = 1;
-    }
-  }
-
-  if (!resetSuccess) {
-    ALOGE("BCM2079x: failed to initialize NFC controller");
-  }
-
-  GKI_delay(delay);
-  ALOGD("%s: exit", __func__);
-}
-
-#define DEFAULT_CLIENT_ADDRESS 0x77
-#define ALIAS_CLIENT_ADDRESS 0x79
-static int change_client_addr(int addr) {
-  int ret;
-  int i;
-  char addr_data[] = {0xFA, 0xF2, 0x00, 0x00, 0x00,
-                      0x38, 0x00, 0x00, 0x00, 0x2A};
-  int size = sizeof(addr_data) - 1;
-
-  addr_data[5] = addr & 0xFF;
-
-  /* set the checksum */
-  ret = 0;
-  for (i = 1; i < size; ++i) ret += addr_data[i];
-  addr_data[size] = (ret & 0xFF);
-  ALOGD("change_client_addr() change addr from 0x%x to 0x%x\n",
-        DEFAULT_CLIENT_ADDRESS, addr);
-  /* ignore the return code from IOCTL */
-  /* always revert back to the default client address */
-  ioctl(linux_cb.sock, BCMNFC_SET_CLIENT_ADDR, DEFAULT_CLIENT_ADDRESS);
-  /* Send address change command (skipping first byte) */
-  ret = TEMP_FAILURE_RETRY(write(linux_cb.sock, &addr_data[1], size));
-
-  /* If it fails, it is likely a B3 we are talking to */
-  if (ret != size) {
-    ALOGD(
-        "change_client_addr() change addr to 0x%x by setting BSP address to "
-        "0x%x\n",
-        addr, ALIAS_CLIENT_ADDRESS);
-    /* legacy kernel */
-    /* MACO xxx commented out code below only works with new kernel driver,
-     * but Mako/Manta ship with old one */
-    ret = ioctl(linux_cb.sock, BCMNFC_CHANGE_ADDR, addr);
-    return ret;
-    /*
-    ret = ioctl(linux_cb.sock, BCMNFC_SET_CLIENT_ADDR, ALIAS_CLIENT_ADDRESS);
-    size++;
-    ret = write(linux_cb.sock, addr_data, size);
-    */
-  }
-
-  if (ret == size) {
-    ALOGD("change_client_addr() set client address 0x%x to client driver\n",
-          addr);
-    ret = ioctl(linux_cb.sock, BCMNFC_SET_CLIENT_ADDR, addr);
-  } else {
-    ret = -EIO;
-  }
-  return ret;
-}
diff --git a/halimpl/bcm2079x/gki/common/gki.h b/halimpl/bcm2079x/gki/common/gki.h
deleted file mode 100644
index f452719..0000000
--- a/halimpl/bcm2079x/gki/common/gki.h
+++ /dev/null
@@ -1,487 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef GKI_H
-#define GKI_H
-
-#ifdef BUILDCFG
-#if (NFC_HAL_TARGET == FALSE)
-#include "buildcfg.h"
-#else
-/* Build config when building HAL */
-#include "buildcfg_hal.h"
-#endif
-#endif
-
-#ifndef NFC_STANDALONE
-#define NFC_STANDALONE FALSE
-#endif
-
-/* Include platform-specific over-rides */
-#if (NFC_STANDALONE == TRUE)
-#include "bt_types.h"
-#include "gki_target.h"
-#elif (NFC_HAL_TARGET == TRUE)
-/* If building NFC HAL, then use hal target file */
-#include "gki_hal_target.h"
-#include "nfc_types.h"
-#else
-/* For non-nfc_standalone, include Bluetooth definitions */
-#include "bt_types.h"
-#endif
-
-#define GKI_BUFFER_DEBUG FALSE
-
-/* Error codes */
-#define GKI_SUCCESS 0x00
-#define GKI_FAILURE 0x01
-#define GKI_INVALID_TASK 0xF0
-#define GKI_INVALID_POOL 0xFF
-
-/************************************************************************
-** Mailbox definitions. Each task has 4 mailboxes that are used to
-** send buffers to the task.
-*/
-#define TASK_MBOX_0 0
-#define TASK_MBOX_1 1
-#define TASK_MBOX_2 2
-#define TASK_MBOX_3 3
-
-#define NUM_TASK_MBOX 4
-
-/************************************************************************
-** Event definitions.
-**
-** There are 4 reserved events used to signal messages rcvd in task mailboxes.
-** There are 4 reserved events used to signal timeout events.
-** There are 8 general purpose events available for applications.
-*/
-#define MAX_EVENTS 16
-
-#define TASK_MBOX_0_EVT_MASK 0x0001
-#define TASK_MBOX_1_EVT_MASK 0x0002
-#define TASK_MBOX_2_EVT_MASK 0x0004
-#define TASK_MBOX_3_EVT_MASK 0x0008
-
-#define TIMER_0 0
-#define TIMER_1 1
-#define TIMER_2 2
-#define TIMER_3 3
-
-#define TIMER_0_EVT_MASK 0x0010
-#define TIMER_1_EVT_MASK 0x0020
-#define TIMER_2_EVT_MASK 0x0040
-#define TIMER_3_EVT_MASK 0x0080
-
-#define APPL_EVT_0 8
-#define APPL_EVT_1 9
-#define APPL_EVT_2 10
-#define APPL_EVT_3 11
-#define APPL_EVT_4 12
-#define APPL_EVT_5 13
-#define APPL_EVT_6 14
-#define APPL_EVT_7 15
-
-#define EVENT_MASK(evt) ((uint16_t)(0x0001 << (evt)))
-
-/************************************************************************
-**  Max Time Queue
-**/
-#ifndef GKI_MAX_TIMER_QUEUES
-#define GKI_MAX_TIMER_QUEUES 3
-#endif
-
-/************************************************************************
-**  Macro to determine the pool buffer size based on the GKI POOL ID at compile
-*time.
-**  Pool IDs index from 0 to GKI_NUM_FIXED_BUF_POOLS - 1
-*/
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 1)
-
-#ifndef GKI_POOL_ID_0
-#define GKI_POOL_ID_0 0
-#endif /* ifndef GKI_POOL_ID_0 */
-
-#ifndef GKI_BUF0_SIZE
-#define GKI_BUF0_SIZE 0
-#endif /* ifndef GKI_BUF0_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 1 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 2)
-
-#ifndef GKI_POOL_ID_1
-#define GKI_POOL_ID_1 0
-#endif /* ifndef GKI_POOL_ID_1 */
-
-#ifndef GKI_BUF1_SIZE
-#define GKI_BUF1_SIZE 0
-#endif /* ifndef GKI_BUF1_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 2 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 3)
-
-#ifndef GKI_POOL_ID_2
-#define GKI_POOL_ID_2 0
-#endif /* ifndef GKI_POOL_ID_2 */
-
-#ifndef GKI_BUF2_SIZE
-#define GKI_BUF2_SIZE 0
-#endif /* ifndef GKI_BUF2_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 3 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 4)
-
-#ifndef GKI_POOL_ID_3
-#define GKI_POOL_ID_3 0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF3_SIZE
-#define GKI_BUF3_SIZE 0
-#endif /* ifndef GKI_BUF3_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 4 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 5)
-
-#ifndef GKI_POOL_ID_4
-#define GKI_POOL_ID_4 0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF4_SIZE
-#define GKI_BUF4_SIZE 0
-#endif /* ifndef GKI_BUF4_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 5 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 6)
-
-#ifndef GKI_POOL_ID_5
-#define GKI_POOL_ID_5 0
-#endif /* ifndef GKI_POOL_ID_5 */
-
-#ifndef GKI_BUF5_SIZE
-#define GKI_BUF5_SIZE 0
-#endif /* ifndef GKI_BUF5_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 6 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 7)
-
-#ifndef GKI_POOL_ID_6
-#define GKI_POOL_ID_6 0
-#endif /* ifndef GKI_POOL_ID_6 */
-
-#ifndef GKI_BUF6_SIZE
-#define GKI_BUF6_SIZE 0
-#endif /* ifndef GKI_BUF6_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 7 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 8)
-
-#ifndef GKI_POOL_ID_7
-#define GKI_POOL_ID_7 0
-#endif /* ifndef GKI_POOL_ID_7 */
-
-#ifndef GKI_BUF7_SIZE
-#define GKI_BUF7_SIZE 0
-#endif /* ifndef GKI_BUF7_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 8 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 9)
-
-#ifndef GKI_POOL_ID_8
-#define GKI_POOL_ID_8 0
-#endif /* ifndef GKI_POOL_ID_8 */
-
-#ifndef GKI_BUF8_SIZE
-#define GKI_BUF8_SIZE 0
-#endif /* ifndef GKI_BUF8_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 9 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 10)
-
-#ifndef GKI_POOL_ID_9
-#define GKI_POOL_ID_9 0
-#endif /* ifndef GKI_POOL_ID_9 */
-
-#ifndef GKI_BUF9_SIZE
-#define GKI_BUF9_SIZE 0
-#endif /* ifndef GKI_BUF9_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 10 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 11)
-
-#ifndef GKI_POOL_ID_10
-#define GKI_POOL_ID_10 0
-#endif /* ifndef GKI_POOL_ID_10 */
-
-#ifndef GKI_BUF10_SIZE
-#define GKI_BUF10_SIZE 0
-#endif /* ifndef GKI_BUF10_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 11 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 12)
-
-#ifndef GKI_POOL_ID_11
-#define GKI_POOL_ID_11 0
-#endif /* ifndef GKI_POOL_ID_11 */
-
-#ifndef GKI_BUF11_SIZE
-#define GKI_BUF11_SIZE 0
-#endif /* ifndef GKI_BUF11_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 12 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 13)
-
-#ifndef GKI_POOL_ID_12
-#define GKI_POOL_ID_12 0
-#endif /* ifndef GKI_POOL_ID_12 */
-
-#ifndef GKI_BUF12_SIZE
-#define GKI_BUF12_SIZE 0
-#endif /* ifndef GKI_BUF12_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 13 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 14)
-
-#ifndef GKI_POOL_ID_13
-#define GKI_POOL_ID_13 0
-#endif /* ifndef GKI_POOL_ID_13 */
-
-#ifndef GKI_BUF13_SIZE
-#define GKI_BUF13_SIZE 0
-#endif /* ifndef GKI_BUF13_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 14 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 15)
-
-#ifndef GKI_POOL_ID_14
-#define GKI_POOL_ID_14 0
-#endif /* ifndef GKI_POOL_ID_14 */
-
-#ifndef GKI_BUF14_SIZE
-#define GKI_BUF14_SIZE 0
-#endif /* ifndef GKI_BUF14_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 15 */
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 16)
-
-#ifndef GKI_POOL_ID_15
-#define GKI_POOL_ID_15 0
-#endif /* ifndef GKI_POOL_ID_15 */
-
-#ifndef GKI_BUF15_SIZE
-#define GKI_BUF15_SIZE 0
-#endif /* ifndef GKI_BUF15_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 16 */
-
-/* Timer list entry callback type
-*/
-typedef void(TIMER_CBACK)(void* p_tle);
-
-/* Define a timer list entry
-*/
-typedef struct _tle {
-  struct _tle* p_next;
-  struct _tle* p_prev;
-  TIMER_CBACK* p_cback;
-  int32_t ticks;
-  uintptr_t param;
-  uint16_t event;
-  uint8_t in_use;
-} TIMER_LIST_ENT;
-
-/* Define a timer list queue
-*/
-typedef struct {
-  TIMER_LIST_ENT* p_first;
-  TIMER_LIST_ENT* p_last;
-  int32_t last_ticks;
-} TIMER_LIST_Q;
-
-/***********************************************************************
-** This queue is a general purpose buffer queue, for application use.
-*/
-typedef struct {
-  void* p_first;
-  void* p_last;
-  uint16_t count;
-} BUFFER_Q;
-
-#define GKI_IS_QUEUE_EMPTY(p_q) ((p_q)->count == 0)
-
-/* Task constants
-*/
-#ifndef TASKPTR
-typedef void (*TASKPTR)(uint32_t);
-#endif
-
-/* General pool accessible to GKI_getbuf() */
-#define GKI_PUBLIC_POOL 0
-#define GKI_RESTRICTED_POOL 1 /* Inaccessible pool to GKI_getbuf() */
-
-/***********************************************************************
-** Function prototypes
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Task management
-*/
-extern uint8_t GKI_create_task(TASKPTR, uint8_t, int8_t*, uint16_t*, uint16_t,
-                               void*, void*);
-extern void GKI_exit_task(uint8_t);
-extern uint8_t GKI_get_taskid(void);
-extern void GKI_init(void);
-extern int8_t* GKI_map_taskname(uint8_t);
-extern uint8_t GKI_resume_task(uint8_t);
-extern void GKI_run(void*);
-extern void GKI_stop(void);
-extern uint8_t GKI_suspend_task(uint8_t);
-extern uint8_t GKI_is_task_running(uint8_t);
-extern void GKI_shutdown(void);
-
-/* memory management
-*/
-extern void GKI_shiftdown(uint8_t* p_mem, uint32_t len, uint32_t shift_amount);
-extern void GKI_shiftup(uint8_t* p_dest, uint8_t* p_src, uint32_t len);
-
-/* To send buffers and events between tasks
-*/
-extern uint8_t GKI_isend_event(uint8_t, uint16_t);
-extern void GKI_isend_msg(uint8_t, uint8_t, void*);
-extern void* GKI_read_mbox(uint8_t);
-extern void GKI_send_msg(uint8_t, uint8_t, void*);
-extern uint8_t GKI_send_event(uint8_t, uint16_t);
-
-/* To get and release buffers, change owner and get size
-*/
-extern void GKI_change_buf_owner(void*, uint8_t);
-extern uint8_t GKI_create_pool(uint16_t, uint16_t, uint8_t, void*);
-extern void GKI_delete_pool(uint8_t);
-extern void* GKI_find_buf_start(void*);
-extern void GKI_freebuf(void*);
-#if (GKI_BUFFER_DEBUG == TRUE)
-#define GKI_getbuf(size) GKI_getbuf_debug(size, __func__, __LINE__)
-extern void* GKI_getbuf_debug(uint16_t, const char*, int);
-#else
-extern void* GKI_getbuf(uint16_t);
-#endif
-extern uint16_t GKI_get_buf_size(void*);
-#if (GKI_BUFFER_DEBUG == TRUE)
-#define GKI_getpoolbuf(id) GKI_getpoolbuf_debug(id, __func__, __LINE__)
-extern void* GKI_getpoolbuf_debug(uint8_t, const char*, int);
-#else
-extern void* GKI_getpoolbuf(uint8_t);
-#endif
-
-extern uint16_t GKI_poolcount(uint8_t);
-extern uint16_t GKI_poolfreecount(uint8_t);
-extern uint16_t GKI_poolutilization(uint8_t);
-extern void GKI_register_mempool(void* p_mem);
-extern uint8_t GKI_set_pool_permission(uint8_t, uint8_t);
-
-/* User buffer queue management
-*/
-extern void* GKI_dequeue(BUFFER_Q*);
-extern void GKI_enqueue(BUFFER_Q*, void*);
-extern void GKI_enqueue_head(BUFFER_Q*, void*);
-extern void* GKI_getfirst(BUFFER_Q*);
-extern void* GKI_getlast(BUFFER_Q*);
-extern void* GKI_getnext(void*);
-extern void GKI_init_q(BUFFER_Q*);
-extern bool GKI_queue_is_empty(BUFFER_Q*);
-extern void* GKI_remove_from_queue(BUFFER_Q*, void*);
-extern uint16_t GKI_get_pool_bufsize(uint8_t);
-
-/* Timer management
-*/
-extern void GKI_add_to_timer_list(TIMER_LIST_Q*, TIMER_LIST_ENT*);
-extern void GKI_delay(uint32_t);
-extern uint32_t GKI_get_tick_count(void);
-extern int8_t* GKI_get_time_stamp(int8_t*);
-extern void GKI_init_timer_list(TIMER_LIST_Q*);
-extern void GKI_init_timer_list_entry(TIMER_LIST_ENT*);
-extern int32_t GKI_ready_to_sleep(void);
-extern void GKI_remove_from_timer_list(TIMER_LIST_Q*, TIMER_LIST_ENT*);
-extern void GKI_start_timer(uint8_t, int32_t, bool);
-extern void GKI_stop_timer(uint8_t);
-extern void GKI_timer_update(int32_t);
-extern uint16_t GKI_update_timer_list(TIMER_LIST_Q*, int32_t);
-extern uint32_t GKI_get_remaining_ticks(TIMER_LIST_Q*, TIMER_LIST_ENT*);
-extern uint16_t GKI_wait(uint16_t, uint32_t);
-
-/* Start and Stop system time tick callback
- * true for start system tick if time queue is not empty
- * false to stop system tick if time queue is empty
-*/
-typedef void(SYSTEM_TICK_CBACK)(bool);
-
-/* Time queue management for system ticks
-*/
-extern bool GKI_timer_queue_empty(void);
-extern void GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK*);
-
-/* Disable Interrupts, Enable Interrupts
-*/
-extern void GKI_enable(void);
-extern void GKI_disable(void);
-extern void GKI_sched_lock(void);
-extern void GKI_sched_unlock(void);
-
-/* Allocate (Free) memory from an OS
-*/
-extern void* GKI_os_malloc(uint32_t);
-extern void GKI_os_free(void*);
-
-/* os timer operation */
-extern uint32_t GKI_get_os_tick_count(void);
-
-/* Exception handling
-*/
-extern void GKI_exception(uint16_t, char*);
-
-#if (GKI_DEBUG == TRUE)
-extern void GKI_PrintBufferUsage(uint8_t* p_num_pools, uint16_t* p_cur_used);
-extern void GKI_PrintBuffer(void);
-extern void GKI_print_task(void);
-#else
-#undef GKI_PrintBufferUsage
-#define GKI_PrintBuffer() NULL
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/halimpl/bcm2079x/gki/common/gki_buffer.c b/halimpl/bcm2079x/gki/common/gki_buffer.c
deleted file mode 100644
index b413f5c..0000000
--- a/halimpl/bcm2079x/gki/common/gki_buffer.c
+++ /dev/null
@@ -1,1484 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include <stdio.h>
-#include "gki_int.h"
-
-#if (GKI_NUM_TOTAL_BUF_POOLS > 16)
-#error Number of pools out of range (16 Max)!
-#endif
-
-#if (BTU_STACK_LITE_ENABLED == FALSE)
-static void gki_add_to_pool_list(uint8_t pool_id);
-static void gki_remove_from_pool_list(uint8_t pool_id);
-#endif /*  BTU_STACK_LITE_ENABLED == FALSE */
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-#define LOG_TAG "GKI_DEBUG"
-#include <android/log.h>
-#include <cutils/log.h>
-#define LOGD(format, ...)                                       \
-  LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | \
-             TRACE_TYPE_GENERIC,                                \
-         format, ##__VA_ARGS__)
-#endif
-/*******************************************************************************
-**
-** Function         gki_init_free_queue
-**
-** Description      Internal function called at startup to initialize a free
-**                  queue. It is called once for each free queue.
-**
-** Returns          void
-**
-*******************************************************************************/
-static void gki_init_free_queue(uint8_t id, uint16_t size, uint16_t total,
-                                void* p_mem) {
-  uint16_t i;
-  uint16_t act_size;
-  BUFFER_HDR_T* hdr;
-  BUFFER_HDR_T* hdr1 = NULL;
-  uint32_t* magic;
-  int32_t tempsize = size;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* Ensure an even number of longwords */
-  tempsize = (int32_t)ALIGN_POOL(size);
-  act_size = (uint16_t)(tempsize + BUFFER_PADDING_SIZE);
-
-  /* Remember pool start and end addresses */
-  if (p_mem) {
-    p_cb->pool_start[id] = (uint8_t*)p_mem;
-    p_cb->pool_end[id] = (uint8_t*)p_mem + (act_size * total);
-  }
-
-  p_cb->pool_size[id] = act_size;
-
-  p_cb->freeq[id].size = (uint16_t)tempsize;
-  p_cb->freeq[id].total = total;
-  p_cb->freeq[id].cur_cnt = 0;
-  p_cb->freeq[id].max_cnt = 0;
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-  LOGD(
-      "gki_init_free_queue() init pool=%d, size=%d (aligned=%d) total=%d "
-      "start=%p",
-      id, size, tempsize, total, p_mem);
-#endif
-
-  /* Initialize  index table */
-  if (p_mem) {
-    hdr = (BUFFER_HDR_T*)p_mem;
-    p_cb->freeq[id].p_first = hdr;
-    for (i = 0; i < total; i++) {
-      hdr->task_id = GKI_INVALID_TASK;
-      hdr->q_id = id;
-      hdr->status = BUF_STATUS_FREE;
-      magic = (uint32_t*)((uint8_t*)hdr + BUFFER_HDR_SIZE + tempsize);
-      *magic = MAGIC_NO;
-      hdr1 = hdr;
-      hdr = (BUFFER_HDR_T*)((uint8_t*)hdr + act_size);
-      hdr1->p_next = hdr;
-    }
-    hdr1->p_next = NULL;
-    p_cb->freeq[id].p_last = hdr1;
-  }
-  return;
-}
-
-#if (GKI_USE_DEFERED_ALLOC_BUF_POOLS == TRUE)
-static bool gki_alloc_free_queue(uint8_t id) {
-  FREE_QUEUE_T* Q;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-#if GKI_BUFFER_DEBUG
-  ALOGD("\ngki_alloc_free_queue in, id:%d \n", id);
-#endif
-
-  Q = &p_cb->freeq[p_cb->pool_list[id]];
-
-  if (Q->p_first == 0) {
-    void* p_mem = GKI_os_malloc((Q->size + BUFFER_PADDING_SIZE) * Q->total);
-    if (p_mem) {
-// re-initialize the queue with allocated memory
-#if GKI_BUFFER_DEBUG
-      ALOGD(
-          "\ngki_alloc_free_queue calling  gki_init_free_queue, id:%d  "
-          "size:%d, totol:%d\n",
-          id, Q->size, Q->total);
-#endif
-      gki_init_free_queue(id, Q->size, Q->total, p_mem);
-#if GKI_BUFFER_DEBUG
-      ALOGD("\ngki_alloc_free_queue ret OK, id:%d  size:%d, totol:%d\n", id,
-            Q->size, Q->total);
-#endif
-      return true;
-    }
-    GKI_exception(GKI_ERROR_BUF_SIZE_TOOBIG,
-                  "gki_alloc_free_queue: Not enough memory");
-  }
-#if GKI_BUFFER_DEBUG
-  ALOGD("\ngki_alloc_free_queue out failed, id:%d\n", id);
-#endif
-  return false;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         gki_buffer_init
-**
-** Description      Called once internally by GKI at startup to initialize all
-**                  buffers and free buffer pools.
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_buffer_init(void) {
-  uint8_t i, tt, mb;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* Initialize mailboxes */
-  for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
-    for (mb = 0; mb < NUM_TASK_MBOX; mb++) {
-      p_cb->OSTaskQFirst[tt][mb] = NULL;
-      p_cb->OSTaskQLast[tt][mb] = NULL;
-    }
-  }
-
-  for (tt = 0; tt < GKI_NUM_TOTAL_BUF_POOLS; tt++) {
-    p_cb->pool_start[tt] = NULL;
-    p_cb->pool_end[tt] = NULL;
-    p_cb->pool_size[tt] = 0;
-
-    p_cb->freeq[tt].p_first = 0;
-    p_cb->freeq[tt].p_last = 0;
-    p_cb->freeq[tt].size = 0;
-    p_cb->freeq[tt].total = 0;
-    p_cb->freeq[tt].cur_cnt = 0;
-    p_cb->freeq[tt].max_cnt = 0;
-  }
-
-  /* Use default from target.h */
-  p_cb->pool_access_mask = GKI_DEF_BUFPOOL_PERM_MASK;
-
-#if (GKI_USE_DEFERED_ALLOC_BUF_POOLS == FALSE && \
-     GKI_USE_DYNAMIC_BUFFERS == TRUE)
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 0)
-  p_cb->bufpool0 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF0_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF0_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 1)
-  p_cb->bufpool1 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF1_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF1_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 2)
-  p_cb->bufpool2 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF2_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF2_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 3)
-  p_cb->bufpool3 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF3_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF3_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 4)
-  p_cb->bufpool4 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF4_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF4_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 5)
-  p_cb->bufpool5 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF5_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF5_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 6)
-  p_cb->bufpool6 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF6_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF6_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 7)
-  p_cb->bufpool7 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF7_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF7_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 8)
-  p_cb->bufpool8 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF8_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF8_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 9)
-  p_cb->bufpool9 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF9_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF9_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 10)
-  p_cb->bufpool10 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF10_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF10_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 11)
-  p_cb->bufpool11 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF11_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF11_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 12)
-  p_cb->bufpool12 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF12_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF12_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 13)
-  p_cb->bufpool13 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF13_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF13_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 14)
-  p_cb->bufpool14 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF14_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF14_MAX);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 15)
-  p_cb->bufpool15 = (uint8_t*)GKI_os_malloc(
-      (GKI_BUF15_SIZE + BUFFER_PADDING_SIZE) * GKI_BUF15_MAX);
-#endif
-
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 0)
-  gki_init_free_queue(0, GKI_BUF0_SIZE, GKI_BUF0_MAX, p_cb->bufpool0);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 1)
-  gki_init_free_queue(1, GKI_BUF1_SIZE, GKI_BUF1_MAX, p_cb->bufpool1);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 2)
-  gki_init_free_queue(2, GKI_BUF2_SIZE, GKI_BUF2_MAX, p_cb->bufpool2);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 3)
-  gki_init_free_queue(3, GKI_BUF3_SIZE, GKI_BUF3_MAX, p_cb->bufpool3);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 4)
-  gki_init_free_queue(4, GKI_BUF4_SIZE, GKI_BUF4_MAX, p_cb->bufpool4);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 5)
-  gki_init_free_queue(5, GKI_BUF5_SIZE, GKI_BUF5_MAX, p_cb->bufpool5);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 6)
-  gki_init_free_queue(6, GKI_BUF6_SIZE, GKI_BUF6_MAX, p_cb->bufpool6);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 7)
-  gki_init_free_queue(7, GKI_BUF7_SIZE, GKI_BUF7_MAX, p_cb->bufpool7);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 8)
-  gki_init_free_queue(8, GKI_BUF8_SIZE, GKI_BUF8_MAX, p_cb->bufpool8);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 9)
-  gki_init_free_queue(9, GKI_BUF9_SIZE, GKI_BUF9_MAX, p_cb->bufpool9);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 10)
-  gki_init_free_queue(10, GKI_BUF10_SIZE, GKI_BUF10_MAX, p_cb->bufpool10);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 11)
-  gki_init_free_queue(11, GKI_BUF11_SIZE, GKI_BUF11_MAX, p_cb->bufpool11);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 12)
-  gki_init_free_queue(12, GKI_BUF12_SIZE, GKI_BUF12_MAX, p_cb->bufpool12);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 13)
-  gki_init_free_queue(13, GKI_BUF13_SIZE, GKI_BUF13_MAX, p_cb->bufpool13);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 14)
-  gki_init_free_queue(14, GKI_BUF14_SIZE, GKI_BUF14_MAX, p_cb->bufpool14);
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 15)
-  gki_init_free_queue(15, GKI_BUF15_SIZE, GKI_BUF15_MAX, p_cb->bufpool15);
-#endif
-
-  /* add pools to the pool_list which is arranged in the order of size */
-  for (i = 0; i < GKI_NUM_FIXED_BUF_POOLS; i++) {
-    p_cb->pool_list[i] = i;
-  }
-
-  p_cb->curr_total_no_of_pools = GKI_NUM_FIXED_BUF_POOLS;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_init_q
-**
-** Description      Called by an application to initialize a buffer queue.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_init_q(BUFFER_Q* p_q) {
-  p_q->p_first = p_q->p_last = NULL;
-  p_q->count = 0;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_getbuf
-**
-** Description      Called by an application to get a free buffer which
-**                  is of size greater or equal to the requested size.
-**
-**                  Note: This routine only takes buffers from public pools.
-**                        It will not use any buffers from pools
-**                        marked GKI_RESTRICTED_POOL.
-**
-** Parameters       size - (input) number of bytes needed.
-**
-** Returns          A pointer to the buffer, or NULL if none available
-**
-*******************************************************************************/
-#if (GKI_BUFFER_DEBUG == TRUE)
-void* GKI_getbuf_debug(uint16_t size, const char* _function_, int _line_)
-#else
-void* GKI_getbuf(uint16_t size)
-#endif
-{
-  uint8_t i;
-  FREE_QUEUE_T* Q;
-  BUFFER_HDR_T* p_hdr;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-#if (GKI_BUFFER_DEBUG == TRUE)
-  uint8_t x;
-#endif
-
-  if (size == 0) {
-    GKI_exception(GKI_ERROR_BUF_SIZE_ZERO, "getbuf: Size is zero");
-    return (NULL);
-  }
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-  LOGD("GKI_getbuf() requesting %d func:%s(line=%d)", size, _function_, _line_);
-#endif
-  /* Find the first buffer pool that is public that can hold the desired size */
-  for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
-    if (size <= p_cb->freeq[p_cb->pool_list[i]].size) break;
-  }
-
-  if (i == p_cb->curr_total_no_of_pools) {
-    GKI_exception(GKI_ERROR_BUF_SIZE_TOOBIG, "getbuf: Size is too big");
-    return (NULL);
-  }
-
-  /* Make sure the buffers aren't disturbed til finished with allocation */
-  GKI_disable();
-
-  /* search the public buffer pools that are big enough to hold the size
-   * until a free buffer is found */
-  for (; i < p_cb->curr_total_no_of_pools; i++) {
-    /* Only look at PUBLIC buffer pools (bypass RESTRICTED pools) */
-    if (((uint16_t)1 << p_cb->pool_list[i]) & p_cb->pool_access_mask) continue;
-
-    Q = &p_cb->freeq[p_cb->pool_list[i]];
-    if (Q->cur_cnt < Q->total) {
-#if (GKI_USE_DEFERED_ALLOC_BUF_POOLS == TRUE)
-      if (Q->p_first == 0 && gki_alloc_free_queue(i) != true) {
-        GKI_TRACE_ERROR_0("GKI_getbuf() out of buffer");
-        GKI_enable();
-        return NULL;
-      }
-#endif
-
-      if (Q->p_first == 0) {
-        /* gki_alloc_free_queue() failed to alloc memory */
-        GKI_TRACE_ERROR_0("GKI_getbuf() fail alloc free queue");
-        GKI_enable();
-        return NULL;
-      }
-
-      p_hdr = Q->p_first;
-      Q->p_first = p_hdr->p_next;
-
-      if (!Q->p_first) Q->p_last = NULL;
-
-      if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
-
-      GKI_enable();
-
-      p_hdr->task_id = GKI_get_taskid();
-
-      p_hdr->status = BUF_STATUS_UNLINKED;
-      p_hdr->p_next = NULL;
-      p_hdr->Type = 0;
-#if (GKI_BUFFER_DEBUG == TRUE)
-      LOGD("GKI_getbuf() allocated, %x, %x (%d of %d used) %d",
-           (uint8_t*)p_hdr + BUFFER_HDR_SIZE, p_hdr, Q->cur_cnt, Q->total,
-           p_cb->freeq[i].total);
-
-      strncpy(p_hdr->_function, _function_, _GKI_MAX_FUNCTION_NAME_LEN);
-      p_hdr->_function[_GKI_MAX_FUNCTION_NAME_LEN] = '\0';
-      p_hdr->_line = _line_;
-#endif
-      return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
-    }
-  }
-
-  GKI_TRACE_ERROR_0("GKI_getbuf() unable to allocate buffer!!!!!");
-#if (GKI_BUFFER_DEBUG == TRUE)
-  LOGD("GKI_getbuf() unable to allocate buffer!!!!!");
-  LOGD("******************** GKI Memory Pool Dump ********************");
-
-  p_cb = &gki_cb.com;
-
-  LOGD("Dumping total of %d buffer pools", p_cb->curr_total_no_of_pools);
-
-  for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
-    p_hdr = (BUFFER_HDR_T*)p_cb->pool_start[i];
-
-    LOGD("pool %d has a total of %d buffers (start=%p)", i,
-         p_cb->freeq[i].total, p_hdr);
-
-    for (x = 0; p_hdr && x < p_cb->freeq[i].total; x++) {
-      if (p_hdr->status != BUF_STATUS_FREE) {
-        LOGD("pool:%d, buf[%d]:%x, hdr:%x status=%d func:%s(line=%d)", i, x,
-             (uint8_t*)p_hdr + BUFFER_HDR_SIZE, p_hdr, p_hdr->status,
-             p_hdr->_function, p_hdr->_line);
-      }
-
-      p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_hdr + p_cb->pool_size[i]);
-    }
-  }
-  LOGD("**************************************************************");
-#endif
-
-  GKI_TRACE_ERROR_0("Failed to allocate GKI buffer");
-
-  GKI_enable();
-
-  return (NULL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_getpoolbuf
-**
-** Description      Called by an application to get a free buffer from
-**                  a specific buffer pool.
-**
-**                  Note: If there are no more buffers available from the pool,
-**                        the public buffers are searched for an available
-*buffer.
-**
-** Parameters       pool_id - (input) pool ID to get a buffer out of.
-**
-** Returns          A pointer to the buffer, or NULL if none available
-**
-*******************************************************************************/
-#if (GKI_BUFFER_DEBUG == TRUE)
-void* GKI_getpoolbuf_debug(uint8_t pool_id, const char* _function_, int _line_)
-#else
-void* GKI_getpoolbuf(uint8_t pool_id)
-#endif
-{
-  FREE_QUEUE_T* Q;
-  BUFFER_HDR_T* p_hdr;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (NULL);
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-  LOGD("GKI_getpoolbuf() requesting from %d func:%s(line=%d)", pool_id,
-       _function_, _line_);
-#endif
-  /* Make sure the buffers aren't disturbed til finished with allocation */
-  GKI_disable();
-
-  Q = &p_cb->freeq[pool_id];
-  if (Q->cur_cnt < Q->total) {
-#if (GKI_USE_DEFERED_ALLOC_BUF_POOLS == TRUE)
-    if (Q->p_first == 0 && gki_alloc_free_queue(pool_id) != true) return NULL;
-#endif
-
-    if (Q->p_first == 0) {
-      /* gki_alloc_free_queue() failed to alloc memory */
-      GKI_TRACE_ERROR_0("GKI_getpoolbuf() fail alloc free queue");
-      return NULL;
-    }
-
-    p_hdr = Q->p_first;
-    Q->p_first = p_hdr->p_next;
-
-    if (!Q->p_first) Q->p_last = NULL;
-
-    if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
-
-    GKI_enable();
-
-    p_hdr->task_id = GKI_get_taskid();
-
-    p_hdr->status = BUF_STATUS_UNLINKED;
-    p_hdr->p_next = NULL;
-    p_hdr->Type = 0;
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-    LOGD("GKI_getpoolbuf() allocated, %x, %x (%d of %d used) %d",
-         (uint8_t*)p_hdr + BUFFER_HDR_SIZE, p_hdr, Q->cur_cnt, Q->total,
-         p_cb->freeq[pool_id].total);
-
-    strncpy(p_hdr->_function, _function_, _GKI_MAX_FUNCTION_NAME_LEN);
-    p_hdr->_function[_GKI_MAX_FUNCTION_NAME_LEN] = '\0';
-    p_hdr->_line = _line_;
-#endif
-    return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
-  }
-
-  /* If here, no buffers in the specified pool */
-  GKI_enable();
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-  /* try for free buffers in public pools */
-  return (GKI_getbuf_debug(p_cb->freeq[pool_id].size, _function_, _line_));
-#else
-  /* try for free buffers in public pools */
-  return (GKI_getbuf(p_cb->freeq[pool_id].size));
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         GKI_freebuf
-**
-** Description      Called by an application to return a buffer to the free
-*pool.
-**
-** Parameters       p_buf - (input) address of the beginning of a buffer.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_freebuf(void* p_buf) {
-  FREE_QUEUE_T* Q;
-  BUFFER_HDR_T* p_hdr;
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-  if (!p_buf || gki_chk_buf_damage(p_buf)) {
-    GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Free - Buf Corrupted");
-    return;
-  }
-#endif
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-  LOGD("GKI_freebuf() freeing, %x, %x, func:%s(line=%d)", p_buf, p_hdr,
-       p_hdr->_function, p_hdr->_line);
-#endif
-
-  if (p_hdr->status != BUF_STATUS_UNLINKED) {
-    GKI_exception(GKI_ERROR_FREEBUF_BUF_LINKED, "Freeing Linked Buf");
-    return;
-  }
-
-  if (p_hdr->q_id >= GKI_NUM_TOTAL_BUF_POOLS) {
-    GKI_exception(GKI_ERROR_FREEBUF_BAD_QID, "Bad Buf QId");
-    return;
-  }
-
-  GKI_disable();
-
-  /*
-  ** Release the buffer
-  */
-  Q = &gki_cb.com.freeq[p_hdr->q_id];
-  if (Q->p_last)
-    Q->p_last->p_next = p_hdr;
-  else
-    Q->p_first = p_hdr;
-
-  Q->p_last = p_hdr;
-  p_hdr->p_next = NULL;
-  p_hdr->status = BUF_STATUS_FREE;
-  p_hdr->task_id = GKI_INVALID_TASK;
-  if (Q->cur_cnt > 0) Q->cur_cnt--;
-
-  GKI_enable();
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_buf_size
-**
-** Description      Called by an application to get the size of a buffer.
-**
-** Parameters       p_buf - (input) address of the beginning of a buffer.
-**
-** Returns          the size of the buffer
-**
-*******************************************************************************/
-uint16_t GKI_get_buf_size(void* p_buf) {
-  BUFFER_HDR_T* p_hdr;
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-  if ((uint32_t)p_hdr & 1) return (0);
-
-  if (p_hdr->q_id < GKI_NUM_TOTAL_BUF_POOLS) {
-    return (gki_cb.com.freeq[p_hdr->q_id].size);
-  }
-
-  return (0);
-}
-
-/*******************************************************************************
-**
-** Function         gki_chk_buf_damage
-**
-** Description      Called internally by OSS to check for buffer corruption.
-**
-** Returns          TRUE if there is a problem, else FALSE
-**
-*******************************************************************************/
-bool gki_chk_buf_damage(void* p_buf) {
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-
-  uint32_t* magic;
-  magic = (uint32_t*)((uint8_t*)p_buf + GKI_get_buf_size(p_buf));
-
-  if ((uint32_t)magic & 1) return true;
-
-  if (*magic == MAGIC_NO) return false;
-
-  return true;
-
-#else
-
-  return false;
-
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         GKI_send_msg
-**
-** Description      Called by applications to send a buffer to a task
-**
-** Returns          Nothing
-**
-*******************************************************************************/
-void GKI_send_msg(uint8_t task_id, uint8_t mbox, void* msg) {
-  BUFFER_HDR_T* p_hdr;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* If task non-existant or not started, drop buffer */
-  if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) ||
-      (p_cb->OSRdyTbl[task_id] == TASK_DEAD)) {
-    GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
-    GKI_freebuf(msg);
-    return;
-  }
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-  if (gki_chk_buf_damage(msg)) {
-    GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
-    return;
-  }
-#endif
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)msg - BUFFER_HDR_SIZE);
-
-  if (p_hdr->status != BUF_STATUS_UNLINKED) {
-    GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
-    return;
-  }
-
-  GKI_disable();
-
-  if (p_cb->OSTaskQFirst[task_id][mbox])
-    p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
-  else
-    p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
-
-  p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
-
-  p_hdr->p_next = NULL;
-  p_hdr->status = BUF_STATUS_QUEUED;
-  p_hdr->task_id = task_id;
-
-  GKI_enable();
-
-  GKI_send_event(task_id, (uint16_t)EVENT_MASK(mbox));
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_read_mbox
-**
-** Description      Called by applications to read a buffer from one of
-**                  the task mailboxes.  A task can only read its own mailbox.
-**
-** Parameters:      mbox  - (input) mailbox ID to read (0, 1, 2, or 3)
-**
-** Returns          NULL if the mailbox was empty, else the address of a buffer
-**
-*******************************************************************************/
-void* GKI_read_mbox(uint8_t mbox) {
-  uint8_t task_id = GKI_get_taskid();
-  void* p_buf = NULL;
-  BUFFER_HDR_T* p_hdr;
-
-  if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX)) return (NULL);
-
-  GKI_disable();
-
-  if (gki_cb.com.OSTaskQFirst[task_id][mbox]) {
-    p_hdr = gki_cb.com.OSTaskQFirst[task_id][mbox];
-    gki_cb.com.OSTaskQFirst[task_id][mbox] = p_hdr->p_next;
-
-    p_hdr->p_next = NULL;
-    p_hdr->status = BUF_STATUS_UNLINKED;
-
-    p_buf = (uint8_t*)p_hdr + BUFFER_HDR_SIZE;
-  }
-
-  GKI_enable();
-
-  return (p_buf);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_enqueue
-**
-** Description      Enqueue a buffer at the tail of the queue
-**
-** Parameters:      p_q  -  (input) pointer to a queue.
-**                  p_buf - (input) address of the buffer to enqueue
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_enqueue(BUFFER_Q* p_q, void* p_buf) {
-  BUFFER_HDR_T* p_hdr;
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-  if (gki_chk_buf_damage(p_buf)) {
-    GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Enqueue - Buffer corrupted");
-    return;
-  }
-#endif
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-  if (p_hdr->status != BUF_STATUS_UNLINKED) {
-    GKI_exception(GKI_ERROR_ENQUEUE_BUF_LINKED, "Eneueue - buf already linked");
-    return;
-  }
-
-  GKI_disable();
-
-  /* Since the queue is exposed (C vs C++), keep the pointers in exposed format
-   */
-  if (p_q->p_first) {
-    BUFFER_HDR_T* p_last_hdr =
-        (BUFFER_HDR_T*)((uint8_t*)p_q->p_last - BUFFER_HDR_SIZE);
-    p_last_hdr->p_next = p_hdr;
-  } else
-    p_q->p_first = p_buf;
-
-  p_q->p_last = p_buf;
-  p_q->count++;
-
-  p_hdr->p_next = NULL;
-  p_hdr->status = BUF_STATUS_QUEUED;
-
-  GKI_enable();
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_enqueue_head
-**
-** Description      Enqueue a buffer at the head of the queue
-**
-** Parameters:      p_q  -  (input) pointer to a queue.
-**                  p_buf - (input) address of the buffer to enqueue
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_enqueue_head(BUFFER_Q* p_q, void* p_buf) {
-  BUFFER_HDR_T* p_hdr;
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-  if (gki_chk_buf_damage(p_buf)) {
-    GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Enqueue - Buffer corrupted");
-    return;
-  }
-#endif
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-  if (p_hdr->status != BUF_STATUS_UNLINKED) {
-    GKI_exception(GKI_ERROR_ENQUEUE_BUF_LINKED,
-                  "Eneueue head - buf already linked");
-    return;
-  }
-
-  GKI_disable();
-
-  if (p_q->p_first) {
-    p_hdr->p_next = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
-    p_q->p_first = p_buf;
-  } else {
-    p_q->p_first = p_buf;
-    p_q->p_last = p_buf;
-    p_hdr->p_next = NULL;
-  }
-  p_q->count++;
-
-  p_hdr->status = BUF_STATUS_QUEUED;
-
-  GKI_enable();
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_dequeue
-**
-** Description      Dequeues a buffer from the head of a queue
-**
-** Parameters:      p_q  - (input) pointer to a queue.
-**
-** Returns          NULL if queue is empty, else buffer
-**
-*******************************************************************************/
-void* GKI_dequeue(BUFFER_Q* p_q) {
-  BUFFER_HDR_T* p_hdr;
-
-  GKI_disable();
-
-  if (!p_q || !p_q->count) {
-    GKI_enable();
-    return (NULL);
-  }
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
-
-  /* Keep buffers such that GKI header is invisible
-  */
-  if (p_hdr->p_next)
-    p_q->p_first = ((uint8_t*)p_hdr->p_next + BUFFER_HDR_SIZE);
-  else {
-    p_q->p_first = NULL;
-    p_q->p_last = NULL;
-  }
-
-  p_q->count--;
-
-  p_hdr->p_next = NULL;
-  p_hdr->status = BUF_STATUS_UNLINKED;
-
-  GKI_enable();
-
-  return ((uint8_t*)p_hdr + BUFFER_HDR_SIZE);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_remove_from_queue
-**
-** Description      Dequeue a buffer from the middle of the queue
-**
-** Parameters:      p_q  - (input) pointer to a queue.
-**                  p_buf - (input) address of the buffer to enqueue
-**
-** Returns          NULL if queue is empty, else buffer
-**
-*******************************************************************************/
-void* GKI_remove_from_queue(BUFFER_Q* p_q, void* p_buf) {
-  BUFFER_HDR_T* p_prev;
-  BUFFER_HDR_T* p_buf_hdr;
-
-  GKI_disable();
-
-  if (p_buf == p_q->p_first) {
-    GKI_enable();
-    return (GKI_dequeue(p_q));
-  }
-
-  p_buf_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-  p_prev = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
-
-  for (; p_prev; p_prev = p_prev->p_next) {
-    /* If the previous points to this one, move the pointers around */
-    if (p_prev->p_next == p_buf_hdr) {
-      p_prev->p_next = p_buf_hdr->p_next;
-
-      /* If we are removing the last guy in the queue, update p_last */
-      if (p_buf == p_q->p_last) p_q->p_last = p_prev + 1;
-
-      /* One less in the queue */
-      p_q->count--;
-
-      /* The buffer is now unlinked */
-      p_buf_hdr->p_next = NULL;
-      p_buf_hdr->status = BUF_STATUS_UNLINKED;
-
-      GKI_enable();
-      return (p_buf);
-    }
-  }
-
-  GKI_enable();
-  return (NULL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_getfirst
-**
-** Description      Return a pointer to the first buffer in a queue
-**
-** Parameters:      p_q  - (input) pointer to a queue.
-**
-** Returns          NULL if queue is empty, else buffer address
-**
-*******************************************************************************/
-void* GKI_getfirst(BUFFER_Q* p_q) { return (p_q->p_first); }
-
-/*******************************************************************************
-**
-** Function         GKI_getlast
-**
-** Description      Return a pointer to the last buffer in a queue
-**
-** Parameters:      p_q  - (input) pointer to a queue.
-**
-** Returns          NULL if queue is empty, else buffer address
-**
-*******************************************************************************/
-void* GKI_getlast(BUFFER_Q* p_q) { return (p_q->p_last); }
-
-/*******************************************************************************
-**
-** Function         GKI_getnext
-**
-** Description      Return a pointer to the next buffer in a queue
-**
-** Parameters:      p_buf  - (input) pointer to the buffer to find the next one
-*from.
-**
-** Returns          NULL if no more buffers in the queue, else next buffer
-*address
-**
-*******************************************************************************/
-void* GKI_getnext(void* p_buf) {
-  BUFFER_HDR_T* p_hdr;
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-  if (p_hdr->p_next)
-    return ((uint8_t*)p_hdr->p_next + BUFFER_HDR_SIZE);
-  else
-    return (NULL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_queue_is_empty
-**
-** Description      Check the status of a queue.
-**
-** Parameters:      p_q  - (input) pointer to a queue.
-**
-** Returns          TRUE if queue is empty, else FALSE
-**
-*******************************************************************************/
-bool GKI_queue_is_empty(BUFFER_Q* p_q) { return ((bool)(p_q->count == 0)); }
-
-/*******************************************************************************
-**
-** Function         GKI_find_buf_start
-**
-** Description      This function is called with an address inside a buffer,
-**                  and returns the start address ofthe buffer.
-**
-**                  The buffer should be one allocated from one of GKI's pools.
-**
-** Parameters:      p_user_area - (input) address of anywhere in a GKI buffer.
-**
-** Returns          void * - Address of the beginning of the specified buffer if
-*successful,
-**                          otherwise NULL if unsuccessful
-**
-*******************************************************************************/
-void* GKI_find_buf_start(void* p_user_area) {
-  uint16_t xx, size;
-  uint32_t yy;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-  uint8_t* p_ua = (uint8_t*)p_user_area;
-
-  for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++) {
-    if ((p_ua > p_cb->pool_start[xx]) && (p_ua < p_cb->pool_end[xx])) {
-      yy = (uint32_t)(p_ua - p_cb->pool_start[xx]);
-
-      size = p_cb->pool_size[xx];
-
-      yy = (yy / size) * size;
-
-      return ((void*)(p_cb->pool_start[xx] + yy + sizeof(BUFFER_HDR_T)));
-    }
-  }
-
-  /* If here, invalid address - not in one of our buffers */
-  GKI_exception(GKI_ERROR_BUF_SIZE_ZERO, "GKI_get_buf_start:: bad addr");
-
-  return (NULL);
-}
-
-/********************************************************
-* The following functions are not needed for light stack
-*********************************************************/
-#ifndef BTU_STACK_LITE_ENABLED
-#define BTU_STACK_LITE_ENABLED FALSE
-#endif
-
-#if (BTU_STACK_LITE_ENABLED == FALSE)
-
-/*******************************************************************************
-**
-** Function         GKI_set_pool_permission
-**
-** Description      This function is called to set or change the permissions for
-**                  the specified pool ID.
-**
-** Parameters       pool_id -       (input) pool ID to be set or changed
-**                  permission -    (input) GKI_PUBLIC_POOL or
-*GKI_RESTRICTED_POOL
-**
-** Returns          GKI_SUCCESS if successful
-**                  GKI_INVALID_POOL if unsuccessful
-**
-*******************************************************************************/
-uint8_t GKI_set_pool_permission(uint8_t pool_id, uint8_t permission) {
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  if (pool_id < GKI_NUM_TOTAL_BUF_POOLS) {
-    if (permission == GKI_RESTRICTED_POOL)
-      p_cb->pool_access_mask =
-          (uint16_t)(p_cb->pool_access_mask | (1 << pool_id));
-
-    else /* mark the pool as public */
-      p_cb->pool_access_mask =
-          (uint16_t)(p_cb->pool_access_mask & ~(1 << pool_id));
-
-    return (GKI_SUCCESS);
-  } else
-    return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
-** Function         gki_add_to_pool_list
-**
-** Description      Adds pool to the pool list which is arranged in the
-**                  order of size
-**
-** Returns          void
-**
-*******************************************************************************/
-static void gki_add_to_pool_list(uint8_t pool_id) {
-  int32_t i, j;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* Find the position where the specified pool should be inserted into the list
-   */
-  for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
-    if (p_cb->freeq[pool_id].size <= p_cb->freeq[p_cb->pool_list[i]].size)
-      break;
-  }
-
-  /* Insert the new buffer pool ID into the list of pools */
-  for (j = p_cb->curr_total_no_of_pools; j > i; j--) {
-    p_cb->pool_list[j] = p_cb->pool_list[j - 1];
-  }
-
-  p_cb->pool_list[i] = pool_id;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         gki_remove_from_pool_list
-**
-** Description      Removes pool from the pool list. Called when a pool is
-*deleted
-**
-** Returns          void
-**
-*******************************************************************************/
-static void gki_remove_from_pool_list(uint8_t pool_id) {
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-  uint8_t i;
-
-  for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
-    if (pool_id == p_cb->pool_list[i]) break;
-  }
-
-  while (i < (p_cb->curr_total_no_of_pools - 1)) {
-    p_cb->pool_list[i] = p_cb->pool_list[i + 1];
-    i++;
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_igetpoolbuf
-**
-** Description      Called by an interrupt service routine to get a free buffer
-*from
-**                  a specific buffer pool.
-**
-** Parameters       pool_id - (input) pool ID to get a buffer out of.
-**
-** Returns          A pointer to the buffer, or NULL if none available
-**
-*******************************************************************************/
-void* GKI_igetpoolbuf(uint8_t pool_id) {
-  FREE_QUEUE_T* Q;
-  BUFFER_HDR_T* p_hdr;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (NULL);
-
-  Q = &gki_cb.com.freeq[pool_id];
-  if (Q->cur_cnt < Q->total) {
-    p_hdr = Q->p_first;
-    Q->p_first = p_hdr->p_next;
-
-    if (!Q->p_first) Q->p_last = NULL;
-
-    if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
-
-    p_hdr->task_id = GKI_get_taskid();
-
-    p_hdr->status = BUF_STATUS_UNLINKED;
-    p_hdr->p_next = NULL;
-    p_hdr->Type = 0;
-
-    return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
-  }
-
-  return (NULL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_poolcount
-**
-** Description      Called by an application to get the total number of buffers
-**                  in the specified buffer pool.
-**
-** Parameters       pool_id - (input) pool ID to get the free count of.
-**
-** Returns          the total number of buffers in the pool
-**
-*******************************************************************************/
-uint16_t GKI_poolcount(uint8_t pool_id) {
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (0);
-
-  return (gki_cb.com.freeq[pool_id].total);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_poolfreecount
-**
-** Description      Called by an application to get the number of free buffers
-**                  in the specified buffer pool.
-**
-** Parameters       pool_id - (input) pool ID to get the free count of.
-**
-** Returns          the number of free buffers in the pool
-**
-*******************************************************************************/
-uint16_t GKI_poolfreecount(uint8_t pool_id) {
-  FREE_QUEUE_T* Q;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (0);
-
-  Q = &gki_cb.com.freeq[pool_id];
-
-  return ((uint16_t)(Q->total - Q->cur_cnt));
-}
-
-/*******************************************************************************
-**
-** Function         GKI_change_buf_owner
-**
-** Description      Called to change the task ownership of a buffer.
-**
-** Parameters:      p_buf   - (input) pointer to the buffer
-**                  task_id - (input) task id to change ownership to
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_change_buf_owner(void* p_buf, uint8_t task_id) {
-  BUFFER_HDR_T* p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
-
-  p_hdr->task_id = task_id;
-
-  return;
-}
-
-#if (GKI_SEND_MSG_FROM_ISR == TRUE)
-/*******************************************************************************
-**
-** Function         GKI_isend_msg
-**
-** Description      Called from interrupt context to send a buffer to a task
-**
-** Returns          Nothing
-**
-*******************************************************************************/
-void GKI_isend_msg(uint8_t task_id, uint8_t mbox, void* msg) {
-  BUFFER_HDR_T* p_hdr;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* If task non-existant or not started, drop buffer */
-  if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) ||
-      (p_cb->OSRdyTbl[task_id] == TASK_DEAD)) {
-    GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
-    GKI_freebuf(msg);
-    return;
-  }
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-  if (gki_chk_buf_damage(msg)) {
-    GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
-    return;
-  }
-#endif
-
-#if (GKI_ENABLE_OWNER_CHECK == TRUE)
-  if (gki_chk_buf_owner(msg)) {
-    GKI_exception(GKI_ERROR_NOT_BUF_OWNER, "Send by non-owner");
-    return;
-  }
-#endif
-
-  p_hdr = (BUFFER_HDR_T*)((uint8_t*)msg - BUFFER_HDR_SIZE);
-
-  if (p_hdr->status != BUF_STATUS_UNLINKED) {
-    GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
-    return;
-  }
-
-  if (p_cb->OSTaskQFirst[task_id][mbox])
-    p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
-  else
-    p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
-
-  p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
-
-  p_hdr->p_next = NULL;
-  p_hdr->status = BUF_STATUS_QUEUED;
-  p_hdr->task_id = task_id;
-
-  GKI_isend_event(task_id, (uint16_t)EVENT_MASK(mbox));
-
-  return;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         GKI_create_pool
-**
-** Description      Called by applications to create a buffer pool.
-**
-** Parameters:      size        - (input) length (in bytes) of each buffer in
-*the pool
-**                  count       - (input) number of buffers to allocate for the
-*pool
-**                  permission  - (input) restricted or public access?
-**                                        (GKI_PUBLIC_POOL or
-*GKI_RESTRICTED_POOL)
-**                  p_mem_pool  - (input) pointer to an OS memory pool, NULL if
-*not provided
-**
-** Returns          the buffer pool ID, which should be used in calls to
-**                  GKI_getpoolbuf(). If a pool could not be created, this
-**                  function returns 0xff.
-**
-*******************************************************************************/
-uint8_t GKI_create_pool(uint16_t size, uint16_t count, uint8_t permission,
-                        void* p_mem_pool) {
-  uint8_t xx;
-  uint32_t mem_needed;
-  int32_t tempsize = size;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  /* First make sure the size of each pool has a valid size with room for the
-   * header info */
-  if (size > MAX_USER_BUF_SIZE) return (GKI_INVALID_POOL);
-
-  /* First, look for an unused pool */
-  for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++) {
-    if (!p_cb->pool_start[xx]) break;
-  }
-
-  if (xx == GKI_NUM_TOTAL_BUF_POOLS) return (GKI_INVALID_POOL);
-
-  /* Ensure an even number of longwords */
-  tempsize = (int32_t)ALIGN_POOL(size);
-
-  mem_needed = (tempsize + BUFFER_PADDING_SIZE) * count;
-
-  if (!p_mem_pool) p_mem_pool = GKI_os_malloc(mem_needed);
-
-  if (p_mem_pool) {
-    /* Initialize the new pool */
-    gki_init_free_queue(xx, size, count, p_mem_pool);
-    gki_add_to_pool_list(xx);
-    (void)GKI_set_pool_permission(xx, permission);
-    p_cb->curr_total_no_of_pools++;
-
-    return (xx);
-  } else
-    return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_delete_pool
-**
-** Description      Called by applications to delete a buffer pool.  The
-*function
-**                  calls the operating specific function to free the actual
-*memory.
-**                  An exception is generated if an error is detected.
-**
-** Parameters:      pool_id - (input) Id of the poll being deleted.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_delete_pool(uint8_t pool_id) {
-  FREE_QUEUE_T* Q;
-  tGKI_COM_CB* p_cb = &gki_cb.com;
-
-  if ((pool_id >= GKI_NUM_TOTAL_BUF_POOLS) || (!p_cb->pool_start[pool_id]))
-    return;
-
-  GKI_disable();
-  Q = &p_cb->freeq[pool_id];
-
-  if (!Q->cur_cnt) {
-    Q->size = 0;
-    Q->total = 0;
-    Q->cur_cnt = 0;
-    Q->max_cnt = 0;
-    Q->p_first = NULL;
-    Q->p_last = NULL;
-
-    GKI_os_free(p_cb->pool_start[pool_id]);
-
-    p_cb->pool_start[pool_id] = NULL;
-    p_cb->pool_end[pool_id] = NULL;
-    p_cb->pool_size[pool_id] = 0;
-
-    gki_remove_from_pool_list(pool_id);
-    p_cb->curr_total_no_of_pools--;
-  } else
-    GKI_exception(GKI_ERROR_DELETE_POOL_BAD_QID, "Deleting bad pool");
-
-  GKI_enable();
-
-  return;
-}
-
-#endif /*  BTU_STACK_LITE_ENABLED == FALSE */
-
-/*******************************************************************************
-**
-** Function         GKI_get_pool_bufsize
-**
-** Description      Called by an application to get the size of buffers in a
-*pool
-**
-** Parameters       Pool ID.
-**
-** Returns          the size of buffers in the pool
-**
-*******************************************************************************/
-uint16_t GKI_get_pool_bufsize(uint8_t pool_id) {
-  if (pool_id < GKI_NUM_TOTAL_BUF_POOLS)
-    return (gki_cb.com.freeq[pool_id].size);
-
-  return (0);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_poolutilization
-**
-** Description      Called by an application to get the buffer utilization
-**                  in the specified buffer pool.
-**
-** Parameters       pool_id - (input) pool ID to get the free count of.
-**
-** Returns          % of buffers used from 0 to 100
-**
-*******************************************************************************/
-uint16_t GKI_poolutilization(uint8_t pool_id) {
-  FREE_QUEUE_T* Q;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (100);
-
-  Q = &gki_cb.com.freeq[pool_id];
-
-  if (Q->total == 0) return (100);
-
-  return ((Q->cur_cnt * 100) / Q->total);
-}
diff --git a/halimpl/bcm2079x/gki/common/gki_common.h b/halimpl/bcm2079x/gki/common/gki_common.h
deleted file mode 100644
index f44e292..0000000
--- a/halimpl/bcm2079x/gki/common/gki_common.h
+++ /dev/null
@@ -1,419 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef GKI_COMMON_H
-#define GKI_COMMON_H
-
-#include "gki.h"
-
-#ifndef GKI_DEBUG
-#define GKI_DEBUG FALSE
-#endif
-
-/* Task States: (For OSRdyTbl) */
-#define TASK_DEAD 0    /* b0000 */
-#define TASK_READY 1   /* b0001 */
-#define TASK_WAIT 2    /* b0010 */
-#define TASK_DELAY 4   /* b0100 */
-#define TASK_SUSPEND 8 /* b1000 */
-
-/********************************************************************
-**  Internal Error codes
-*********************************************************************/
-#define GKI_ERROR_BUF_CORRUPTED 0xFFFF
-#define GKI_ERROR_NOT_BUF_OWNER 0xFFFE
-#define GKI_ERROR_FREEBUF_BAD_QID 0xFFFD
-#define GKI_ERROR_FREEBUF_BUF_LINKED 0xFFFC
-#define GKI_ERROR_SEND_MSG_BAD_DEST 0xFFFB
-#define GKI_ERROR_SEND_MSG_BUF_LINKED 0xFFFA
-#define GKI_ERROR_ENQUEUE_BUF_LINKED 0xFFF9
-#define GKI_ERROR_DELETE_POOL_BAD_QID 0xFFF8
-#define GKI_ERROR_BUF_SIZE_TOOBIG 0xFFF7
-#define GKI_ERROR_BUF_SIZE_ZERO 0xFFF6
-#define GKI_ERROR_ADDR_NOT_IN_BUF 0xFFF5
-
-/********************************************************************
-**  Misc constants
-*********************************************************************/
-
-#define GKI_MAX_INT32 (0x7fffffffL)
-#define GKI_MAX_TIMESTAMP (0xffffffffL)
-
-/********************************************************************
-**  Buffer Management Data Structures
-*********************************************************************/
-
-typedef struct _buffer_hdr {
-  struct _buffer_hdr* p_next; /* next buffer in the queue */
-  uint8_t q_id;               /* id of the queue */
-  uint8_t task_id;            /* task which allocated the buffer*/
-  uint8_t status;             /* FREE, UNLINKED or QUEUED */
-  uint8_t Type;
-
-#if (GKI_BUFFER_DEBUG == TRUE)
-/* for tracking who allocated the buffer */
-#define _GKI_MAX_FUNCTION_NAME_LEN (50)
-  char _function[_GKI_MAX_FUNCTION_NAME_LEN + 1];
-  int _line;
-#endif
-
-} BUFFER_HDR_T;
-
-typedef struct _free_queue {
-  BUFFER_HDR_T* p_first; /* first buffer in the queue */
-  BUFFER_HDR_T* p_last;  /* last buffer in the queue */
-  uint16_t size;         /* size of the buffers in the pool */
-  uint16_t total;        /* toatal number of buffers */
-  uint16_t cur_cnt;      /* number of  buffers currently allocated */
-  uint16_t max_cnt;      /* maximum number of buffers allocated at any time */
-} FREE_QUEUE_T;
-
-/* Buffer related defines
-*/
-#define ALIGN_POOL(pl_size) \
-  ((((pl_size) + 3) / sizeof(uint32_t)) * sizeof(uint32_t))
-/* Offset past header */
-#define BUFFER_HDR_SIZE (sizeof(BUFFER_HDR_T))
-/* Header + Magic Number */
-#define BUFFER_PADDING_SIZE (sizeof(BUFFER_HDR_T) + sizeof(uint32_t))
-/* pool size must allow for header */
-#define MAX_USER_BUF_SIZE ((uint16_t)0xffff - BUFFER_PADDING_SIZE)
-#define MAGIC_NO 0xDDBADDBA
-
-#define BUF_STATUS_FREE 0
-#define BUF_STATUS_UNLINKED 1
-#define BUF_STATUS_QUEUED 2
-
-#define GKI_USE_DEFERED_ALLOC_BUF_POOLS TRUE
-
-/* Exception related structures (Used in debug mode only)
-*/
-#if (GKI_DEBUG == TRUE)
-typedef struct {
-  uint16_t type;
-  uint8_t taskid;
-  uint8_t msg[GKI_MAX_EXCEPTION_MSGLEN];
-} EXCEPTION_T;
-#endif
-
-/* Put all GKI variables into one control block
-*/
-typedef struct {
-/* Task management variables
-*/
-/* The stack and stack size are not used on Windows
-*/
-#if (GKI_USE_DYNAMIC_BUFFERS == FALSE)
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 0)
-  uint8_t bufpool0[(ALIGN_POOL(GKI_BUF0_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF0_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 1)
-  uint8_t bufpool1[(ALIGN_POOL(GKI_BUF1_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF1_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 2)
-  uint8_t bufpool2[(ALIGN_POOL(GKI_BUF2_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF2_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 3)
-  uint8_t bufpool3[(ALIGN_POOL(GKI_BUF3_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF3_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 4)
-  uint8_t bufpool4[(ALIGN_POOL(GKI_BUF4_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF4_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 5)
-  uint8_t bufpool5[(ALIGN_POOL(GKI_BUF5_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF5_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 6)
-  uint8_t bufpool6[(ALIGN_POOL(GKI_BUF6_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF6_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 7)
-  uint8_t bufpool7[(ALIGN_POOL(GKI_BUF7_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF7_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 8)
-  uint8_t bufpool8[(ALIGN_POOL(GKI_BUF8_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF8_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 9)
-  uint8_t bufpool9[(ALIGN_POOL(GKI_BUF9_SIZE) + BUFFER_PADDING_SIZE) *
-                   GKI_BUF9_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 10)
-  uint8_t bufpool10[(ALIGN_POOL(GKI_BUF10_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF10_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 11)
-  uint8_t bufpool11[(ALIGN_POOL(GKI_BUF11_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF11_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 12)
-  uint8_t bufpool12[(ALIGN_POOL(GKI_BUF12_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF12_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 13)
-  uint8_t bufpool13[(ALIGN_POOL(GKI_BUF13_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF13_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 14)
-  uint8_t bufpool14[(ALIGN_POOL(GKI_BUF14_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF14_MAX];
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 15)
-  uint8_t bufpool15[(ALIGN_POOL(GKI_BUF15_SIZE) + BUFFER_PADDING_SIZE) *
-                    GKI_BUF15_MAX];
-#endif
-
-#else
-/* Definitions for dynamic buffer use */
-#if (GKI_NUM_FIXED_BUF_POOLS > 0)
-  uint8_t* bufpool0;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 1)
-  uint8_t* bufpool1;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 2)
-  uint8_t* bufpool2;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 3)
-  uint8_t* bufpool3;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 4)
-  uint8_t* bufpool4;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 5)
-  uint8_t* bufpool5;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 6)
-  uint8_t* bufpool6;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 7)
-  uint8_t* bufpool7;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 8)
-  uint8_t* bufpool8;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 9)
-  uint8_t* bufpool9;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 10)
-  uint8_t* bufpool10;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 11)
-  uint8_t* bufpool11;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 12)
-  uint8_t* bufpool12;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 13)
-  uint8_t* bufpool13;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 14)
-  uint8_t* bufpool14;
-#endif
-
-#if (GKI_NUM_FIXED_BUF_POOLS > 15)
-  uint8_t* bufpool15;
-#endif
-
-#endif
-
-  uint8_t* OSStack[GKI_MAX_TASKS];     /* pointer to beginning of stack */
-  uint16_t OSStackSize[GKI_MAX_TASKS]; /* stack size available to each task */
-
-  int8_t* OSTName[GKI_MAX_TASKS]; /* name of the task */
-
-  uint8_t OSRdyTbl[GKI_MAX_TASKS]; /* current state of the task */
-  uint16_t OSWaitEvt
-      [GKI_MAX_TASKS]; /* events that have to be processed by the task */
-  uint16_t OSWaitForEvt[GKI_MAX_TASKS]; /* events the task is waiting for*/
-
-  uint32_t OSTicks;   /* system ticks from start */
-  uint32_t OSIdleCnt; /* idle counter */
-  int16_t
-      OSDisableNesting; /* counter to keep track of interrupt disable nesting */
-  int16_t OSLockNesting; /* counter to keep track of sched lock nesting */
-  int16_t OSIntNesting;  /* counter to keep track of interrupt nesting */
-
-  /* Timer related variables
-  */
-  int32_t OSTicksTilExp; /* Number of ticks till next timer expires */
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-  uint32_t OSTicksTilStop; /* inactivity delay timer; OS Ticks till stopping
-                              system tick */
-#endif
-  int32_t OSNumOrigTicks; /* Number of ticks between last timer expiration to
-                             the next one */
-
-  int32_t OSWaitTmr
-      [GKI_MAX_TASKS]; /* ticks the task has to wait, for specific events */
-
-/* Only take up space timers used in the system (GKI_NUM_TIMERS defined in
- * target.h) */
-#if (GKI_NUM_TIMERS > 0)
-  int32_t OSTaskTmr0[GKI_MAX_TASKS];
-  int32_t OSTaskTmr0R[GKI_MAX_TASKS];
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-  int32_t OSTaskTmr1[GKI_MAX_TASKS];
-  int32_t OSTaskTmr1R[GKI_MAX_TASKS];
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-  int32_t OSTaskTmr2[GKI_MAX_TASKS];
-  int32_t OSTaskTmr2R[GKI_MAX_TASKS];
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-  int32_t OSTaskTmr3[GKI_MAX_TASKS];
-  int32_t OSTaskTmr3R[GKI_MAX_TASKS];
-#endif
-
-  /* Buffer related variables
-  */
-  BUFFER_HDR_T* OSTaskQFirst[GKI_MAX_TASKS]
-                            [NUM_TASK_MBOX]; /* array of pointers to the first
-                                                event in the task mailbox */
-  BUFFER_HDR_T* OSTaskQLast[GKI_MAX_TASKS]
-                           [NUM_TASK_MBOX]; /* array of pointers to the last
-                                               event in the task mailbox */
-
-  /* Define the buffer pool management variables
-  */
-  FREE_QUEUE_T freeq[GKI_NUM_TOTAL_BUF_POOLS];
-
-  uint16_t pool_buf_size[GKI_NUM_TOTAL_BUF_POOLS];
-  uint16_t pool_max_count[GKI_NUM_TOTAL_BUF_POOLS];
-  uint16_t pool_additions[GKI_NUM_TOTAL_BUF_POOLS];
-
-  /* Define the buffer pool start addresses
-  */
-  uint8_t* pool_start[GKI_NUM_TOTAL_BUF_POOLS]; /* array of pointers to the
-                                                   start of each buffer pool */
-  uint8_t*
-      pool_end[GKI_NUM_TOTAL_BUF_POOLS]; /* array of pointers to the end of each
-                                            buffer pool */
-  uint16_t pool_size
-      [GKI_NUM_TOTAL_BUF_POOLS]; /* actual size of the buffers in a pool */
-
-  /* Define the buffer pool access control variables */
-  void* p_user_mempool; /* User O/S memory pool */
-  uint16_t
-      pool_access_mask; /* Bits are set if the corresponding buffer pool is a
-                           restricted pool */
-  uint8_t pool_list[GKI_NUM_TOTAL_BUF_POOLS]; /* buffer pools arranged in the
-                                                 order of size */
-  uint8_t
-      curr_total_no_of_pools; /* number of fixed buf pools + current number of
-                                 dynamic pools */
-
-  bool timer_nesting; /* flag to prevent timer interrupt nesting */
-
-  /* Time queue arrays */
-  TIMER_LIST_Q* timer_queues[GKI_MAX_TIMER_QUEUES];
-  /* System tick callback */
-  SYSTEM_TICK_CBACK* p_tick_cb;
-  bool system_tick_running; /* TRUE if system tick is running. Valid only if
-                               p_tick_cb is not NULL */
-
-#if (GKI_DEBUG == TRUE)
-  uint16_t ExceptionCnt; /* number of GKI exceptions that have happened */
-  EXCEPTION_T Exception[GKI_MAX_EXCEPTION];
-#endif
-
-} tGKI_COM_CB;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Internal GKI function prototypes
-*/
-extern bool gki_chk_buf_damage(void*);
-extern bool gki_chk_buf_owner(void*);
-extern void gki_buffer_init(void);
-extern void gki_timers_init(void);
-extern void gki_adjust_timer_count(int32_t);
-
-extern void OSStartRdy(void);
-extern void OSCtxSw(void);
-extern void OSIntCtxSw(void);
-extern void OSSched(void);
-extern void OSIntEnter(void);
-extern void OSIntExit(void);
-
-/* Debug aids
-*/
-typedef void (*FP_PRINT)(char*, ...);
-
-#if (GKI_DEBUG == TRUE)
-
-typedef void (*PKT_PRINT)(uint8_t*, uint16_t);
-
-extern void gki_print_task(FP_PRINT);
-extern void gki_print_exception(FP_PRINT);
-extern void gki_print_timer(FP_PRINT);
-extern void gki_print_stack(FP_PRINT);
-extern void gki_print_buffer(FP_PRINT);
-extern void gki_print_buffer_statistics(FP_PRINT, int16_t);
-extern void gki_print_used_bufs(FP_PRINT, uint8_t);
-extern void gki_dump(uint8_t*, uint16_t, FP_PRINT);
-extern void gki_dump2(uint16_t*, uint16_t, FP_PRINT);
-extern void gki_dump4(uint32_t*, uint16_t, FP_PRINT);
-
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/halimpl/bcm2079x/gki/common/gki_debug.c b/halimpl/bcm2079x/gki/common/gki_debug.c
deleted file mode 100644
index 33bd3b5..0000000
--- a/halimpl/bcm2079x/gki/common/gki_debug.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "gki_int.h"
-
-#if (GKI_DEBUG == TRUE)
-
-const int8_t* const OSTaskStates[] = {
-    (int8_t*)"DEAD",                                                /* 0 */
-    (int8_t*)"REDY",                                                /* 1 */
-    (int8_t*)"WAIT",                                                /* 2 */
-    (int8_t*)"",     (int8_t*)"DELY",                               /* 4 */
-    (int8_t*)"",     (int8_t*)"",     (int8_t*)"", (int8_t*)"SUSP", /* 8 */
-};
-
-/*******************************************************************************
-**
-** Function         GKI_PrintBufferUsage
-**
-** Description      Displays Current Buffer Pool summary
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_PrintBufferUsage(uint8_t* p_num_pools, uint16_t* p_cur_used) {
-  int i;
-  FREE_QUEUE_T* p;
-  uint8_t num = gki_cb.com.curr_total_no_of_pools;
-  uint16_t cur[GKI_NUM_TOTAL_BUF_POOLS];
-
-  GKI_TRACE_0("");
-  GKI_TRACE_0("--- GKI Buffer Pool Summary (R - restricted, P - public) ---");
-
-  GKI_TRACE_0("POOL     SIZE  USED  MAXU  TOTAL");
-  GKI_TRACE_0("------------------------------");
-  for (i = 0; i < gki_cb.com.curr_total_no_of_pools; i++) {
-    p = &gki_cb.com.freeq[i];
-    if ((1 << i) & gki_cb.com.pool_access_mask) {
-      GKI_TRACE_5("%02d: (R), %4d, %3d, %3d, %3d", i, p->size, p->cur_cnt,
-                  p->max_cnt, p->total);
-    } else {
-      GKI_TRACE_5("%02d: (P), %4d, %3d, %3d, %3d", i, p->size, p->cur_cnt,
-                  p->max_cnt, p->total);
-    }
-    cur[i] = p->cur_cnt;
-  }
-  if (p_num_pools) *p_num_pools = num;
-  if (p_cur_used) memcpy(p_cur_used, cur, num * 2);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_PrintBuffer
-**
-** Description      Called internally by OSS to print the buffer pools
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_PrintBuffer(void) {
-  uint16_t i;
-  for (i = 0; i < GKI_NUM_TOTAL_BUF_POOLS; i++) {
-    GKI_TRACE_5("pool:%4u free %4u cur %3u max %3u  total%3u", i,
-                gki_cb.com.freeq[i].size, gki_cb.com.freeq[i].cur_cnt,
-                gki_cb.com.freeq[i].max_cnt, gki_cb.com.freeq[i].total);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         gki_calc_stack
-**
-** Description      This function tries to calculate the amount of
-**                  stack used by looking non magic num. Magic num is consider
-**                  the first byte in the stack.
-**
-** Returns          the number of unused byte on the stack. 4 in case of stack
-*overrun
-**
-*******************************************************************************/
-uint16_t gki_calc_stack(uint8_t task) {
-  int j, stacksize;
-  uint32_t MagicNum;
-  uint32_t* p;
-
-  stacksize = (int)gki_cb.com.OSStackSize[task];
-  p = (uint32_t*)gki_cb.com.OSStack[task]; /* assume stack is aligned, */
-  MagicNum = *p;
-
-  for (j = 0; j < stacksize; j++) {
-    if (*p++ != MagicNum) break;
-  }
-
-  return (j * sizeof(uint32_t));
-}
-
-/*******************************************************************************
-**
-** Function         GKI_print_task
-**
-** Description      Print task stack usage.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_print_task(void) {
-#ifdef _BT_WIN32
-  GKI_TRACE_0("Service not available under insight");
-#else
-  uint8_t TaskId;
-
-  GKI_TRACE_0("TID TASKNAME STATE FREE_STACK  STACK");
-  for (TaskId = 0; TaskId < GKI_MAX_TASKS; TaskId++) {
-    if (gki_cb.com.OSRdyTbl[TaskId] != TASK_DEAD) {
-      GKI_TRACE_5("%2u   %-8s %-5s  0x%04X     0x%04X Bytes", (uint16_t)TaskId,
-                  gki_cb.com.OSTName[TaskId],
-                  OSTaskStates[gki_cb.com.OSRdyTbl[TaskId]],
-                  gki_calc_stack(TaskId), gki_cb.com.OSStackSize[TaskId]);
-    }
-  }
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         gki_print_buffer_statistics
-**
-** Description      Called internally by OSS to print the buffer pools
-*statistics
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_print_buffer_statistics(FP_PRINT print, int16_t pool) {
-  uint16_t i;
-  BUFFER_HDR_T* hdr;
-  uint16_t size, act_size, maxbuffs;
-  uint32_t* magic;
-
-  if (pool > GKI_NUM_TOTAL_BUF_POOLS || pool < 0) {
-    print("Not a valid Buffer pool\n");
-    return;
-  }
-
-  size = gki_cb.com.freeq[pool].size;
-  maxbuffs = gki_cb.com.freeq[pool].total;
-  act_size = size + BUFFER_PADDING_SIZE;
-  print("Buffer Pool[%u] size=%u cur_cnt=%u max_cnt=%u  total=%u\n", pool,
-        gki_cb.com.freeq[pool].size, gki_cb.com.freeq[pool].cur_cnt,
-        gki_cb.com.freeq[pool].max_cnt, gki_cb.com.freeq[pool].total);
-
-  print("      Owner  State    Sanity\n");
-  print("----------------------------\n");
-  hdr = (BUFFER_HDR_T*)(gki_cb.com.pool_start[pool]);
-  for (i = 0; i < maxbuffs; i++) {
-    magic = (uint32_t*)((uint8_t*)hdr + BUFFER_HDR_SIZE + size);
-    print("%3d: 0x%02x %4d %10s\n", i, hdr->task_id, hdr->status,
-          (*magic == MAGIC_NO) ? "OK" : "CORRUPTED");
-    hdr = (BUFFER_HDR_T*)((uint8_t*)hdr + act_size);
-  }
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         gki_print_used_bufs
-**
-** Description      Dumps used buffers in the particular pool
-**
-*******************************************************************************/
-void gki_print_used_bufs(FP_PRINT print, uint8_t pool_id) {
-  uint8_t* p_start;
-  uint16_t buf_size;
-  uint16_t num_bufs;
-  BUFFER_HDR_T* p_hdr;
-  uint16_t i;
-  uint32_t* magic;
-  uint16_t* p;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS &&
-      gki_cb.com.pool_start[pool_id] != 0) {
-    print("Not a valid Buffer pool\n");
-    return;
-  }
-
-  p_start = gki_cb.com.pool_start[pool_id];
-  buf_size = gki_cb.com.freeq[pool_id].size + BUFFER_PADDING_SIZE;
-  num_bufs = gki_cb.com.freeq[pool_id].total;
-
-  for (i = 0; i < num_bufs; i++, p_start += buf_size) {
-    p_hdr = (BUFFER_HDR_T*)p_start;
-    magic = (uint32_t*)((uint8_t*)p_hdr + buf_size - sizeof(uint32_t));
-    p = (uint16_t*)p_hdr;
-
-    if (p_hdr->status != BUF_STATUS_FREE) {
-      print(
-          "%d:0x%x (Q:%d,Task:%s,Stat:%d,%s) %04x %04x %04x %04x %04x %04x "
-          "%04x %04x\n",
-          i, p_hdr, p_hdr->q_id, GKI_map_taskname(p_hdr->task_id),
-          p_hdr->status, (*magic == MAGIC_NO) ? "OK" : "CORRUPTED", p[0], p[1],
-          p[2], p[3], p[4], p[5], p[6], p[7]);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         gki_print_task
-**
-** Description      This function prints the task states.
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_print_task(FP_PRINT print) {
-  uint8_t i;
-
-  print("TID VID TASKNAME STATE WAIT WAITFOR TIMEOUT STACK\n");
-  print("-------------------------------------------------\n");
-  for (i = 0; i < GKI_MAX_TASKS; i++) {
-    if (gki_cb.com.OSRdyTbl[i] != TASK_DEAD) {
-      print("%2u  %-8s %-5s %04X    %04X %7u %u/%u Bytes\n", (uint16_t)i,
-            gki_cb.com.OSTName[i], OSTaskStates[gki_cb.com.OSRdyTbl[i]],
-            gki_cb.com.OSWaitEvt[i], gki_cb.com.OSWaitForEvt[i],
-            gki_cb.com.OSWaitTmr[i], gki_calc_stack(i),
-            gki_cb.com.OSStackSize[i]);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         gki_print_exception
-**
-** Description      This function prints the exception information.
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_print_exception(FP_PRINT print) {
-  uint16_t i;
-  EXCEPTION_T* pExp;
-
-  print("GKI Exceptions:\n");
-  for (i = 0; i < gki_cb.com.ExceptionCnt; i++) {
-    pExp = &gki_cb.com.Exception[i];
-    print("%d: Type=%d, Task=%d: %s\n", i, (int32_t)pExp->type,
-          (int32_t)pExp->taskid, (int8_t*)pExp->msg);
-  }
-}
-
-/*****************************************************************************/
-void gki_dump(uint8_t* s, uint16_t len, FP_PRINT print) {
-  uint16_t i, j;
-
-  for (i = 0, j = 0; i < len; i++) {
-    if (j == 0)
-      print("\n%lX: %02X, ", &s[i], s[i]);
-    else if (j == 7)
-      print("%02X,  ", s[i]);
-    else
-      print("%02X, ", s[i]);
-    if (++j == 16) j = 0;
-  }
-  print("\n");
-}
-
-void gki_dump2(uint16_t* s, uint16_t len, FP_PRINT print) {
-  uint16_t i, j;
-
-  for (i = 0, j = 0; i < len; i++) {
-    if (j == 0)
-      print("\n%lX: %04X, ", &s[i], s[i]);
-    else
-      print("%04X, ", s[i]);
-    if (++j == 8) j = 0;
-  }
-  print("\n");
-}
-
-void gki_dump4(uint32_t* s, uint16_t len, FP_PRINT print) {
-  uint16_t i, j;
-
-  for (i = 0, j = 0; i < len; i++) {
-    if (j == 0)
-      print("\n%lX: %08lX, ", &s[i], s[i]);
-    else
-      print("%08lX, ", s[i]);
-    if (++j == 4) j = 0;
-  }
-  print("\n");
-}
-
-#endif
diff --git a/halimpl/bcm2079x/gki/common/gki_inet.h b/halimpl/bcm2079x/gki/common/gki_inet.h
deleted file mode 100644
index 079dfe3..0000000
--- a/halimpl/bcm2079x/gki/common/gki_inet.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef GKI_INET_H
-#define GKI_INET_H
-
-#include "data_types.h"
-
-#define htons ntohs
-#define htonl ntohl
-
-#define htonets nettohs
-#define htonetl nettohl
-
-#if (BIG_ENDIAN == TRUE)
-#define ntohs(n) (n)
-#define ntohl(n) (n)
-#define ntoh6(n) (n)
-
-#define nettohs(n) (n)
-#define nettohl(n) (n)
-#else
-extern uint16_t ntohs(uint16_t n);
-extern uint32_t ntohl(uint32_t n);
-extern uint8_t* ntoh6(uint8_t* p);
-
-#define nettohs(n) ((uint16_t)((((n) << 8) & 0xff00) | (((n) >> 8) & 0x00ff)))
-#define nettohl(n)                                        \
-  ((((n)&0x000000ff) << 24) | (((n) << 8) & 0x00ff0000) | \
-   (((n) >> 8) & 0x0000ff00) | (((n) >> 24) & 0x000000ff))
-#endif
-
-#endif /* GKI_INET_H */
diff --git a/halimpl/bcm2079x/gki/common/gki_time.c b/halimpl/bcm2079x/gki/common/gki_time.c
deleted file mode 100644
index 830ae21..0000000
--- a/halimpl/bcm2079x/gki/common/gki_time.c
+++ /dev/null
@@ -1,950 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "gki_int.h"
-
-#ifndef BT_ERROR_TRACE_0
-#define BT_ERROR_TRACE_0(l, m)
-#endif
-
-/* Make sure that this has been defined in target.h */
-#ifndef GKI_NUM_TIMERS
-#error NO TIMERS: Must define at least 1 timer in the system!
-#endif
-
-/* Largest signed positive timer count */
-#define GKI_NO_NEW_TMRS_STARTED (0x7fffffffL)
-/* Marks an unused timer list entry (initial value) */
-#define GKI_UNUSED_LIST_ENTRY (0x80000000L)
-#define GKI_MAX_INT32 (0x7fffffffL)
-
-/*******************************************************************************
-**
-** Function         gki_timers_init
-**
-** Description      This internal function is called once at startup to
-*initialize
-**                  all the timer structures.
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_timers_init(void) {
-  uint8_t tt;
-
-  gki_cb.com.OSTicksTilExp =
-      0; /* Remaining time (of OSTimeCurTimeout) before next timer expires */
-  gki_cb.com.OSNumOrigTicks = 0;
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-  gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
-#endif
-
-  for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
-    gki_cb.com.OSWaitTmr[tt] = 0;
-
-#if (GKI_NUM_TIMERS > 0)
-    gki_cb.com.OSTaskTmr0[tt] = 0;
-    gki_cb.com.OSTaskTmr0R[tt] = 0;
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-    gki_cb.com.OSTaskTmr1[tt] = 0;
-    gki_cb.com.OSTaskTmr1R[tt] = 0;
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-    gki_cb.com.OSTaskTmr2[tt] = 0;
-    gki_cb.com.OSTaskTmr2R[tt] = 0;
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-    gki_cb.com.OSTaskTmr3[tt] = 0;
-    gki_cb.com.OSTaskTmr3R[tt] = 0;
-#endif
-  }
-
-  for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
-    gki_cb.com.timer_queues[tt] = NULL;
-  }
-
-  gki_cb.com.p_tick_cb = NULL;
-  gki_cb.com.system_tick_running = false;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         gki_timers_is_timer_running
-**
-** Description      This internal function is called to test if any gki timer
-*are running
-**
-**
-** Returns          TRUE if at least one time is running in the system, FALSE
-*else.
-**
-*******************************************************************************/
-bool gki_timers_is_timer_running(void) {
-  uint8_t tt;
-  for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
-#if (GKI_NUM_TIMERS > 0)
-    if (gki_cb.com.OSTaskTmr0[tt]) {
-      return true;
-    }
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-    if (gki_cb.com.OSTaskTmr1[tt]) {
-      return true;
-    }
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-    if (gki_cb.com.OSTaskTmr2[tt]) {
-      return true;
-    }
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-    if (gki_cb.com.OSTaskTmr3[tt]) {
-      return true;
-    }
-#endif
-  }
-
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_tick_count
-**
-** Description      This function returns the current system ticks
-**
-** Returns          The current number of system ticks
-**
-*******************************************************************************/
-uint32_t GKI_get_tick_count(void) { return gki_cb.com.OSTicks; }
-
-/*******************************************************************************
-**
-** Function         GKI_ready_to_sleep
-**
-** Description      This function returns the number of system ticks until the
-**                  next timer will expire.  It is typically called by a power
-**                  savings manager to find out how long it can have the system
-**                  sleep before it needs to service the next entry.
-**
-** Parameters:      None
-**
-** Returns          Number of ticks til the next timer expires
-**                  Note: the value is a signed  value.  This value should be
-**                      compared to x > 0, to avoid misinterpreting negative
-*tick
-**                      values.
-**
-*******************************************************************************/
-int32_t GKI_ready_to_sleep(void) { return (gki_cb.com.OSTicksTilExp); }
-
-/*******************************************************************************
-**
-** Function         GKI_start_timer
-**
-** Description      An application can call this function to start one of
-**                  it's four general purpose timers. Any of the four timers
-**                  can be 1-shot or continuous. If a timer is already running,
-**                  it will be reset to the new parameters.
-**
-** Parameters       tnum            - (input) timer number to be started
-*(TIMER_0,
-**                                              TIMER_1, TIMER_2, or TIMER_3)
-**                  ticks           - (input) the number of system ticks til the
-**                                              timer expires.
-**                  is_continuous   - (input) TRUE if timer restarts
-*automatically,
-**                                              else FALSE if it is a
-*'one-shot'.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_start_timer(uint8_t tnum, int32_t ticks, bool is_continuous) {
-  int32_t reload;
-  int32_t orig_ticks;
-  uint8_t task_id = GKI_get_taskid();
-  bool bad_timer = false;
-
-  if (ticks <= 0) ticks = 1;
-
-  orig_ticks = ticks; /* save the ticks in case adjustment is necessary */
-
-  /* If continuous timer, set reload, else set it to 0 */
-  if (is_continuous)
-    reload = ticks;
-  else
-    reload = 0;
-
-  GKI_disable();
-
-  if (gki_timers_is_timer_running() == false) {
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-    /* if inactivity delay timer is not running, start system tick */
-    if (gki_cb.com.OSTicksTilStop == 0) {
-#endif
-      if (gki_cb.com.p_tick_cb) {
-        /* start system tick */
-        gki_cb.com.system_tick_running = true;
-        (gki_cb.com.p_tick_cb)(true);
-      }
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-    } else {
-      /* clear inactivity delay timer */
-      gki_cb.com.OSTicksTilStop = 0;
-    }
-#endif
-  }
-  /* Add the time since the last task timer update.
-  ** Note that this works when no timers are active since
-  ** both OSNumOrigTicks and OSTicksTilExp are 0.
-  */
-  if (GKI_MAX_INT32 - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) >
-      ticks) {
-    ticks += gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp;
-  } else
-    ticks = GKI_MAX_INT32;
-
-  switch (tnum) {
-#if (GKI_NUM_TIMERS > 0)
-    case TIMER_0:
-      gki_cb.com.OSTaskTmr0R[task_id] = reload;
-      gki_cb.com.OSTaskTmr0[task_id] = ticks;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-    case TIMER_1:
-      gki_cb.com.OSTaskTmr1R[task_id] = reload;
-      gki_cb.com.OSTaskTmr1[task_id] = ticks;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-    case TIMER_2:
-      gki_cb.com.OSTaskTmr2R[task_id] = reload;
-      gki_cb.com.OSTaskTmr2[task_id] = ticks;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-    case TIMER_3:
-      gki_cb.com.OSTaskTmr3R[task_id] = reload;
-      gki_cb.com.OSTaskTmr3[task_id] = ticks;
-      break;
-#endif
-    default:
-      bad_timer = true; /* Timer number is bad, so do not use */
-  }
-
-  /* Update the expiration timeout if a legitimate timer */
-  if (!bad_timer) {
-    /* Only update the timeout value if it is less than any other newly started
-     * timers */
-    gki_adjust_timer_count(orig_ticks);
-  }
-
-  GKI_enable();
-}
-
-/*******************************************************************************
-**
-** Function         GKI_stop_timer
-**
-** Description      An application can call this function to stop one of
-**                  it's four general purpose timers. There is no harm in
-**                  stopping a timer that is already stopped.
-**
-** Parameters       tnum            - (input) timer number to be started
-*(TIMER_0,
-**                                              TIMER_1, TIMER_2, or TIMER_3)
-** Returns          void
-**
-*******************************************************************************/
-void GKI_stop_timer(uint8_t tnum) {
-  uint8_t task_id = GKI_get_taskid();
-
-  GKI_disable();
-
-  switch (tnum) {
-#if (GKI_NUM_TIMERS > 0)
-    case TIMER_0:
-      gki_cb.com.OSTaskTmr0R[task_id] = 0;
-      gki_cb.com.OSTaskTmr0[task_id] = 0;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-    case TIMER_1:
-      gki_cb.com.OSTaskTmr1R[task_id] = 0;
-      gki_cb.com.OSTaskTmr1[task_id] = 0;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-    case TIMER_2:
-      gki_cb.com.OSTaskTmr2R[task_id] = 0;
-      gki_cb.com.OSTaskTmr2[task_id] = 0;
-      break;
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-    case TIMER_3:
-      gki_cb.com.OSTaskTmr3R[task_id] = 0;
-      gki_cb.com.OSTaskTmr3[task_id] = 0;
-      break;
-#endif
-  }
-
-  if (gki_timers_is_timer_running() == false) {
-    if (gki_cb.com.p_tick_cb) {
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-      /* if inactivity delay timer is not running */
-      if ((gki_cb.com.system_tick_running) &&
-          (gki_cb.com.OSTicksTilStop == 0)) {
-        /* set inactivity delay timer */
-        /* when timer expires, system tick will be stopped */
-        gki_cb.com.OSTicksTilStop = GKI_DELAY_STOP_SYS_TICK;
-      }
-#else
-      gki_cb.com.system_tick_running = false;
-      (gki_cb.com.p_tick_cb)(false); /* stop system tick */
-#endif
-    }
-  }
-
-  GKI_enable();
-}
-
-/*******************************************************************************
-**
-** Function         GKI_timer_update
-**
-** Description      This function is called by an OS to drive the GKI's timers.
-**                  It is typically called at every system tick to
-**                  update the timers for all tasks, and check for timeouts.
-**
-**                  Note: It has been designed to also allow for variable tick
-*updates
-**                      so that systems with strict power savings requirements
-*can
-**                      have the update occur at variable intervals.
-**
-** Parameters:      ticks_since_last_update - (input) This is the number of
-*TICKS that have
-**                          occurred since the last time GKI_timer_update was
-*called.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_timer_update(int32_t ticks_since_last_update) {
-  uint8_t task_id;
-  long next_expiration; /* Holds the next soonest expiration time after this
-                           update */
-
-  /* Increment the number of ticks used for time stamps */
-  gki_cb.com.OSTicks += ticks_since_last_update;
-
-  /* If any timers are running in any tasks, decrement the remaining time til
-   * the timer updates need to take place (next expiration occurs)
-   */
-  gki_cb.com.OSTicksTilExp -= ticks_since_last_update;
-
-  /* Don't allow timer interrupt nesting */
-  if (gki_cb.com.timer_nesting) return;
-
-  gki_cb.com.timer_nesting = 1;
-
-#if (GKI_DELAY_STOP_SYS_TICK > 0)
-  /* if inactivity delay timer is set and expired */
-  if (gki_cb.com.OSTicksTilStop) {
-    if (gki_cb.com.OSTicksTilStop <= (uint32_t)ticks_since_last_update) {
-      if (gki_cb.com.p_tick_cb) {
-        gki_cb.com.system_tick_running = false;
-        (gki_cb.com.p_tick_cb)(false); /* stop system tick */
-      }
-      gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
-      gki_cb.com.timer_nesting = 0;
-      return;
-    } else
-      gki_cb.com.OSTicksTilStop -= ticks_since_last_update;
-  }
-#endif
-
-  /* No need to update the ticks if no timeout has occurred */
-  if (gki_cb.com.OSTicksTilExp > 0) {
-    gki_cb.com.timer_nesting = 0;
-    return;
-  }
-
-  GKI_disable();
-
-  next_expiration = GKI_NO_NEW_TMRS_STARTED;
-
-  /* If here then gki_cb.com.OSTicksTilExp <= 0. If negative, then increase
-     gki_cb.com.OSNumOrigTicks
-     to account for the difference so timer updates below are decremented by the
-     full number
-     of ticks. gki_cb.com.OSNumOrigTicks is reset at the bottom of this function
-     so changing this
-     value only affects the timer updates below
-   */
-  gki_cb.com.OSNumOrigTicks -= gki_cb.com.OSTicksTilExp;
-
-  /* Check for OS Task Timers */
-  for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++) {
-    if (gki_cb.com.OSRdyTbl[task_id] == TASK_DEAD) {
-      // task is shutdown do not try to service timers
-      continue;
-    }
-
-    if (gki_cb.com.OSWaitTmr[task_id] > 0) /* If timer is running */
-    {
-      gki_cb.com.OSWaitTmr[task_id] -= gki_cb.com.OSNumOrigTicks;
-      if (gki_cb.com.OSWaitTmr[task_id] <= 0) {
-        /* Timer Expired */
-        gki_cb.com.OSRdyTbl[task_id] = TASK_READY;
-      }
-    }
-
-#if (GKI_NUM_TIMERS > 0)
-    /* If any timer is running, decrement */
-    if (gki_cb.com.OSTaskTmr0[task_id] > 0) {
-      gki_cb.com.OSTaskTmr0[task_id] -= gki_cb.com.OSNumOrigTicks;
-
-      if (gki_cb.com.OSTaskTmr0[task_id] <= 0) {
-/* Set Timer 0 Expired event mask and reload timer */
-#if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-        GKI_isend_event(task_id, TIMER_0_EVT_MASK);
-#else
-        GKI_send_event(task_id, TIMER_0_EVT_MASK);
-#endif
-        gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
-      }
-    }
-
-    /* Check to see if this timer is the next one to expire */
-    if (gki_cb.com.OSTaskTmr0[task_id] > 0 &&
-        gki_cb.com.OSTaskTmr0[task_id] < next_expiration)
-      next_expiration = gki_cb.com.OSTaskTmr0[task_id];
-#endif
-
-#if (GKI_NUM_TIMERS > 1)
-    /* If any timer is running, decrement */
-    if (gki_cb.com.OSTaskTmr1[task_id] > 0) {
-      gki_cb.com.OSTaskTmr1[task_id] -= gki_cb.com.OSNumOrigTicks;
-
-      if (gki_cb.com.OSTaskTmr1[task_id] <= 0) {
-/* Set Timer 1 Expired event mask and reload timer */
-#if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-        GKI_isend_event(task_id, TIMER_1_EVT_MASK);
-#else
-        GKI_send_event(task_id, TIMER_1_EVT_MASK);
-#endif
-        gki_cb.com.OSTaskTmr1[task_id] = gki_cb.com.OSTaskTmr1R[task_id];
-      }
-    }
-
-    /* Check to see if this timer is the next one to expire */
-    if (gki_cb.com.OSTaskTmr1[task_id] > 0 &&
-        gki_cb.com.OSTaskTmr1[task_id] < next_expiration)
-      next_expiration = gki_cb.com.OSTaskTmr1[task_id];
-#endif
-
-#if (GKI_NUM_TIMERS > 2)
-    /* If any timer is running, decrement */
-    if (gki_cb.com.OSTaskTmr2[task_id] > 0) {
-      gki_cb.com.OSTaskTmr2[task_id] -= gki_cb.com.OSNumOrigTicks;
-
-      if (gki_cb.com.OSTaskTmr2[task_id] <= 0) {
-/* Set Timer 2 Expired event mask and reload timer */
-#if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-        GKI_isend_event(task_id, TIMER_2_EVT_MASK);
-#else
-        GKI_send_event(task_id, TIMER_2_EVT_MASK);
-#endif
-        gki_cb.com.OSTaskTmr2[task_id] = gki_cb.com.OSTaskTmr2R[task_id];
-      }
-    }
-
-    /* Check to see if this timer is the next one to expire */
-    if (gki_cb.com.OSTaskTmr2[task_id] > 0 &&
-        gki_cb.com.OSTaskTmr2[task_id] < next_expiration)
-      next_expiration = gki_cb.com.OSTaskTmr2[task_id];
-#endif
-
-#if (GKI_NUM_TIMERS > 3)
-    /* If any timer is running, decrement */
-    if (gki_cb.com.OSTaskTmr3[task_id] > 0) {
-      gki_cb.com.OSTaskTmr3[task_id] -= gki_cb.com.OSNumOrigTicks;
-
-      if (gki_cb.com.OSTaskTmr3[task_id] <= 0) {
-/* Set Timer 3 Expired event mask and reload timer */
-#if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-        GKI_isend_event(task_id, TIMER_3_EVT_MASK);
-#else
-        GKI_send_event(task_id, TIMER_3_EVT_MASK);
-#endif
-        gki_cb.com.OSTaskTmr3[task_id] = gki_cb.com.OSTaskTmr3R[task_id];
-      }
-    }
-
-    /* Check to see if this timer is the next one to expire */
-    if (gki_cb.com.OSTaskTmr3[task_id] > 0 &&
-        gki_cb.com.OSTaskTmr3[task_id] < next_expiration)
-      next_expiration = gki_cb.com.OSTaskTmr3[task_id];
-#endif
-  }
-
-  /* Set the next timer experation value if there is one to start */
-  if (next_expiration < GKI_NO_NEW_TMRS_STARTED) {
-    gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = next_expiration;
-  } else {
-    gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = 0;
-  }
-
-  gki_cb.com.timer_nesting = 0;
-
-  GKI_enable();
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_timer_queue_empty
-**
-** Description      This function is called by applications to see whether the
-*timer
-**                  queue is empty
-**
-** Parameters
-**
-** Returns          bool
-**
-*******************************************************************************/
-bool GKI_timer_queue_empty(void) {
-  uint8_t tt;
-
-  for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
-    if (gki_cb.com.timer_queues[tt]) return false;
-  }
-
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_timer_queue_register_callback
-**
-** Description      This function is called by applications to register system
-*tick
-**                  start/stop callback for time queues
-**
-**
-** Parameters       p_callback - (input) pointer to the system tick callback
-**
-** Returns          bool
-**
-*******************************************************************************/
-void GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK* p_callback) {
-  gki_cb.com.p_tick_cb = p_callback;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_init_timer_list
-**
-** Description      This function is called by applications when they
-**                  want to initialize a timer list.
-**
-** Parameters       p_timer_listq   - (input) pointer to the timer list queue
-*object
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_init_timer_list(TIMER_LIST_Q* p_timer_listq) {
-  p_timer_listq->p_first = NULL;
-  p_timer_listq->p_last = NULL;
-  p_timer_listq->last_ticks = 0;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_init_timer_list_entry
-**
-** Description      This function is called by the applications when they
-**                  want to initialize a timer list entry. This must be
-**                  done prior to first use of the entry.
-**
-** Parameters       p_tle           - (input) pointer to a timer list queue
-*entry
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_init_timer_list_entry(TIMER_LIST_ENT* p_tle) {
-  p_tle->p_next = NULL;
-  p_tle->p_prev = NULL;
-  p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
-  p_tle->in_use = false;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_update_timer_list
-**
-** Description      This function is called by the applications when they
-**                  want to update a timer list. This should be at every
-**                  timer list unit tick, e.g. once per sec, once per minute
-*etc.
-**
-** Parameters       p_timer_listq   - (input) pointer to the timer list queue
-*object
-**                  num_units_since_last_update - (input) number of units since
-*the last update
-**                                  (allows for variable unit update)
-**
-**      NOTE: The following timer list update routines should not be used for
-*exact time
-**            critical purposes.  The timer tasks should be used when exact
-*timing is needed.
-**
-** Returns          the number of timers that have expired
-**
-*******************************************************************************/
-uint16_t GKI_update_timer_list(TIMER_LIST_Q* p_timer_listq,
-                               int32_t num_units_since_last_update) {
-  TIMER_LIST_ENT* p_tle;
-  uint16_t num_time_out = 0;
-  int32_t rem_ticks;
-  int32_t temp_ticks;
-
-  p_tle = p_timer_listq->p_first;
-
-  /* First, get the guys who have previously timed out */
-  /* Note that the tick value of the timers should always be '0' */
-  while ((p_tle) && (p_tle->ticks <= 0)) {
-    num_time_out++;
-    p_tle = p_tle->p_next;
-  }
-
-  /* Timer entriy tick values are relative to the preceeding entry */
-  rem_ticks = num_units_since_last_update;
-
-  /* Now, adjust remaining timer entries */
-  while ((p_tle != NULL) && (rem_ticks > 0)) {
-    temp_ticks = p_tle->ticks;
-    p_tle->ticks -= rem_ticks;
-
-    /* See if this timer has just timed out */
-    if (p_tle->ticks <= 0) {
-      /* We set the number of ticks to '0' so that the legacy code
-       * that assumes a '0' or nonzero value will still work as coded. */
-      p_tle->ticks = 0;
-
-      num_time_out++;
-    }
-
-    rem_ticks -= temp_ticks; /* Decrement the remaining ticks to process */
-    p_tle = p_tle->p_next;
-  }
-
-  if (p_timer_listq->last_ticks > 0) {
-    p_timer_listq->last_ticks -= num_units_since_last_update;
-
-    /* If the last timer has expired set last_ticks to 0 so that other list
-    * update
-    * functions will calculate correctly
-    */
-    if (p_timer_listq->last_ticks < 0) p_timer_listq->last_ticks = 0;
-  }
-
-  return (num_time_out);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_remaining_ticks
-**
-** Description      This function is called by an application to get remaining
-**                  ticks to expire
-**
-** Parameters       p_timer_listq   - (input) pointer to the timer list queue
-*object
-**                  p_target_tle    - (input) pointer to a timer list queue
-*entry
-**
-** Returns          0 if timer is not used or timer is not in the list
-**                  remaining ticks if success
-**
-*******************************************************************************/
-uint32_t GKI_get_remaining_ticks(TIMER_LIST_Q* p_timer_listq,
-                                 TIMER_LIST_ENT* p_target_tle) {
-  TIMER_LIST_ENT* p_tle;
-  uint32_t rem_ticks = 0;
-
-  if (p_target_tle->in_use) {
-    p_tle = p_timer_listq->p_first;
-
-    /* adding up all of ticks in previous entries */
-    while ((p_tle) && (p_tle != p_target_tle)) {
-      rem_ticks += p_tle->ticks;
-      p_tle = p_tle->p_next;
-    }
-
-    /* if found target entry */
-    if (p_tle == p_target_tle) {
-      rem_ticks += p_tle->ticks;
-    } else {
-      BT_ERROR_TRACE_0(TRACE_LAYER_GKI,
-                       "GKI_get_remaining_ticks: No timer entry in the list");
-      return (0);
-    }
-  } else {
-    BT_ERROR_TRACE_0(TRACE_LAYER_GKI,
-                     "GKI_get_remaining_ticks: timer entry is not active");
-  }
-
-  return (rem_ticks);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_add_to_timer_list
-**
-** Description      This function is called by an application to add a timer
-**                  entry to a timer list.
-**
-**                  Note: A timer value of '0' will effectively insert an
-*already
-**                      expired event.  Negative tick values will be ignored.
-**
-** Parameters       p_timer_listq   - (input) pointer to the timer list queue
-*object
-**                  p_tle           - (input) pointer to a timer list queue
-*entry
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_add_to_timer_list(TIMER_LIST_Q* p_timer_listq, TIMER_LIST_ENT* p_tle) {
-  uint32_t nr_ticks_total;
-  uint8_t tt;
-  TIMER_LIST_ENT* p_temp;
-  if (p_tle == NULL || p_timer_listq == NULL) {
-    GKI_TRACE_3("%s: invalid argument %x, %x****************************<<",
-                __func__, p_timer_listq, p_tle);
-    return;
-  }
-
-  /* Only process valid tick values */
-  if (p_tle->ticks >= 0) {
-    /* If this entry is the last in the list */
-    if (p_tle->ticks >= p_timer_listq->last_ticks) {
-      /* If this entry is the only entry in the list */
-      if (p_timer_listq->p_first == NULL)
-        p_timer_listq->p_first = p_tle;
-      else {
-        /* Insert the entry onto the end of the list */
-        if (p_timer_listq->p_last != NULL)
-          p_timer_listq->p_last->p_next = p_tle;
-
-        p_tle->p_prev = p_timer_listq->p_last;
-      }
-
-      p_tle->p_next = NULL;
-      p_timer_listq->p_last = p_tle;
-      nr_ticks_total = p_tle->ticks;
-      p_tle->ticks -= p_timer_listq->last_ticks;
-
-      p_timer_listq->last_ticks = nr_ticks_total;
-    } else /* This entry needs to be inserted before the last entry */
-    {
-      /* Find the entry that the new one needs to be inserted in front of */
-      p_temp = p_timer_listq->p_first;
-      while (p_tle->ticks > p_temp->ticks) {
-        /* Update the tick value if looking at an unexpired entry */
-        if (p_temp->ticks > 0) p_tle->ticks -= p_temp->ticks;
-
-        p_temp = p_temp->p_next;
-      }
-
-      /* The new entry is the first in the list */
-      if (p_temp == p_timer_listq->p_first) {
-        p_tle->p_next = p_timer_listq->p_first;
-        p_timer_listq->p_first->p_prev = p_tle;
-        p_timer_listq->p_first = p_tle;
-      } else {
-        p_temp->p_prev->p_next = p_tle;
-        p_tle->p_prev = p_temp->p_prev;
-        p_temp->p_prev = p_tle;
-        p_tle->p_next = p_temp;
-      }
-      p_temp->ticks -= p_tle->ticks;
-    }
-
-    p_tle->in_use = true;
-
-    /* if we already add this timer queue to the array */
-    for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
-      if (gki_cb.com.timer_queues[tt] == p_timer_listq) return;
-    }
-    /* add this timer queue to the array */
-    for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
-      if (gki_cb.com.timer_queues[tt] == NULL) break;
-    }
-    if (tt < GKI_MAX_TIMER_QUEUES) {
-      gki_cb.com.timer_queues[tt] = p_timer_listq;
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_remove_from_timer_list
-**
-** Description      This function is called by an application to remove a timer
-**                  entry from a timer list.
-**
-** Parameters       p_timer_listq   - (input) pointer to the timer list queue
-*object
-**                  p_tle           - (input) pointer to a timer list queue
-*entry
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_remove_from_timer_list(TIMER_LIST_Q* p_timer_listq,
-                                TIMER_LIST_ENT* p_tle) {
-  uint8_t tt;
-
-  /* Verify that the entry is valid */
-  if (p_tle == NULL || p_tle->in_use == false ||
-      p_timer_listq->p_first == NULL) {
-    return;
-  }
-
-  /* Add the ticks remaining in this timer (if any) to the next guy in the list.
-  ** Note: Expired timers have a tick value of '0'.
-  */
-  if (p_tle->p_next != NULL) {
-    p_tle->p_next->ticks += p_tle->ticks;
-  } else {
-    p_timer_listq->last_ticks -= p_tle->ticks;
-  }
-
-  /* Unlink timer from the list.
-  */
-  if (p_timer_listq->p_first == p_tle) {
-    p_timer_listq->p_first = p_tle->p_next;
-
-    if (p_timer_listq->p_first != NULL) p_timer_listq->p_first->p_prev = NULL;
-
-    if (p_timer_listq->p_last == p_tle) p_timer_listq->p_last = NULL;
-  } else {
-    if (p_timer_listq->p_last == p_tle) {
-      p_timer_listq->p_last = p_tle->p_prev;
-
-      if (p_timer_listq->p_last != NULL) p_timer_listq->p_last->p_next = NULL;
-    } else {
-      if (p_tle->p_next != NULL && p_tle->p_next->p_prev == p_tle)
-        p_tle->p_next->p_prev = p_tle->p_prev;
-      else {
-        /* Error case - chain messed up ?? */
-        return;
-      }
-
-      if (p_tle->p_prev != NULL && p_tle->p_prev->p_next == p_tle)
-        p_tle->p_prev->p_next = p_tle->p_next;
-      else {
-        /* Error case - chain messed up ?? */
-        return;
-      }
-    }
-  }
-
-  p_tle->p_next = p_tle->p_prev = NULL;
-  p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
-  p_tle->in_use = false;
-
-  /* if timer queue is empty */
-  if (p_timer_listq->p_first == NULL && p_timer_listq->p_last == NULL) {
-    for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
-      if (gki_cb.com.timer_queues[tt] == p_timer_listq) {
-        gki_cb.com.timer_queues[tt] = NULL;
-        break;
-      }
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         gki_adjust_timer_count
-**
-** Description      This function is called whenever a new timer or GKI_wait
-*occurs
-**                  to adjust (if necessary) the current time til the first
-*expiration.
-**                  This only needs to make an adjustment if the new timer (in
-*ticks) is
-**                  less than the number of ticks remaining on the current
-*timer.
-**
-** Parameters:      ticks - (input) number of system ticks of the new timer
-*entry
-**
-**                  NOTE:  This routine MUST be called while interrupts are
-*disabled to
-**                          avoid updates while adjusting the timer variables.
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_adjust_timer_count(int32_t ticks) {
-  if (ticks > 0) {
-    /* See if the new timer expires before the current first expiration */
-    if (gki_cb.com.OSNumOrigTicks == 0 ||
-        (ticks < gki_cb.com.OSTicksTilExp && gki_cb.com.OSTicksTilExp > 0)) {
-      gki_cb.com.OSNumOrigTicks =
-          (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) + ticks;
-      gki_cb.com.OSTicksTilExp = ticks;
-    }
-  }
-
-  return;
-}
diff --git a/halimpl/bcm2079x/gki/ulinux/data_types.h b/halimpl/bcm2079x/gki/ulinux/data_types.h
deleted file mode 100644
index 060c870..0000000
--- a/halimpl/bcm2079x/gki/ulinux/data_types.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef DATA_TYPES_H
-#define DATA_TYPES_H
-
-#include <stdbool.h>
-#include <stdint.h>
-#ifndef NULL
-#define NULL 0
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-typedef uint32_t TIME_STAMP;
-
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-typedef unsigned char UBYTE;
-
-#ifdef __arm
-#define PACKED __packed
-#define INLINE __inline
-#else
-#define PACKED
-#define INLINE
-#endif
-
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN FALSE
-#endif
-
-#define UINT16_LOW_BYTE(x) ((x)&0xff)
-#define UINT16_HI_BYTE(x) ((x) >> 8)
-
-#endif
diff --git a/halimpl/bcm2079x/gki/ulinux/gki_int.h b/halimpl/bcm2079x/gki/ulinux/gki_int.h
deleted file mode 100644
index 6c60be0..0000000
--- a/halimpl/bcm2079x/gki/ulinux/gki_int.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef GKI_INT_H
-#define GKI_INT_H
-
-#include <pthread.h>
-#include "gki_common.h"
-
-/**********************************************************************
-** OS specific definitions
-*/
-#ifdef ANDROID
-#include <sys/times.h>
-#endif
-
-typedef struct {
-  pthread_mutex_t GKI_mutex;
-  pthread_t thread_id[GKI_MAX_TASKS];
-  pthread_mutex_t thread_evt_mutex[GKI_MAX_TASKS];
-  pthread_cond_t thread_evt_cond[GKI_MAX_TASKS];
-  pthread_mutex_t thread_timeout_mutex[GKI_MAX_TASKS];
-  pthread_cond_t thread_timeout_cond[GKI_MAX_TASKS];
-  int no_timer_suspend; /* 1: no suspend, 0 stop calling GKI_timer_update() */
-  pthread_mutex_t gki_timer_mutex;
-  pthread_cond_t gki_timer_cond;
-  int gki_timer_wake_lock_on;
-#if (GKI_DEBUG == TRUE)
-  pthread_mutex_t GKI_trace_mutex;
-#endif
-} tGKI_OS;
-
-/* condition to exit or continue GKI_run() timer loop */
-#define GKI_TIMER_TICK_RUN_COND 1
-#define GKI_TIMER_TICK_STOP_COND 0
-#define GKI_TIMER_TICK_EXIT_COND 2
-
-extern void gki_system_tick_start_stop_cback(bool start);
-
-/* Contains common control block as well as OS specific variables */
-typedef struct {
-  tGKI_OS os;
-  tGKI_COM_CB com;
-} tGKI_CB;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern tGKI_CB gki_cb;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/halimpl/bcm2079x/gki/ulinux/gki_ulinux.c b/halimpl/bcm2079x/gki/ulinux/gki_ulinux.c
deleted file mode 100644
index 74743c4..0000000
--- a/halimpl/bcm2079x/gki/ulinux/gki_ulinux.c
+++ /dev/null
@@ -1,1252 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include <errno.h>
-#include <malloc.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#define GKI_DEBUG FALSE
-
-#include <hardware_legacy/power.h> /* Android header */
-#include <pthread.h>               /* must be 1st header defined  */
-#include <time.h>
-#include "gki_int.h"
-#include "gki_target.h"
-
-/* Temp android logging...move to android tgt config file */
-
-#ifndef LINUX_NATIVE
-#include <cutils/log.h>
-#else
-#define LOGV(format, ...) fprintf(stdout, LOG_TAG format, ##__VA_ARGS__)
-#define LOGE(format, ...) fprintf(stderr, LOG_TAG format, ##__VA_ARGS__)
-#define LOGI(format, ...) fprintf(stdout, LOG_TAG format, ##__VA_ARGS__)
-
-#define SCHED_NORMAL 0
-#define SCHED_FIFO 1
-#define SCHED_RR 2
-#define SCHED_BATCH 3
-
-#endif
-
-/* Define the structure that holds the GKI variables
-*/
-tGKI_CB gki_cb;
-
-#define NANOSEC_PER_MILLISEC (1000000)
-#define NSEC_PER_SEC (1000 * NANOSEC_PER_MILLISEC)
-
-/* works only for 1ms to 1000ms heart beat ranges */
-#define LINUX_SEC (1000 / TICKS_PER_SEC)
-// #define GKI_TICK_TIMER_DEBUG
-
-#define LOCK(m) pthread_mutex_lock(&m)
-#define UNLOCK(m) pthread_mutex_unlock(&m)
-#define INIT(m) pthread_mutex_init(&m, NULL)
-
-/* this kind of mutex go into tGKI_OS control block!!!! */
-/* static pthread_mutex_t GKI_sched_mutex; */
-/*static pthread_mutex_t thread_delay_mutex;
-static pthread_cond_t thread_delay_cond;
-static pthread_mutex_t gki_timer_update_mutex;
-static pthread_cond_t   gki_timer_update_cond;
-*/
-#ifdef NO_GKI_RUN_RETURN
-static pthread_t timer_thread_id = 0;
-#endif
-
-/* For Android */
-
-#ifndef GKI_SHUTDOWN_EVT
-#define GKI_SHUTDOWN_EVT APPL_EVT_7
-#endif
-
-typedef struct {
-  uint8_t task_id;         /* GKI task id */
-  TASKPTR task_entry;      /* Task entry function*/
-  uintptr_t params;        /* Extra params to pass to task entry function */
-  pthread_cond_t* pCond;   /* for android*/
-  pthread_mutex_t* pMutex; /* for android*/
-} gki_pthread_info_t;
-gki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS];
-
-static void* GKI_run_worker_thread(void*);
-
-/*******************************************************************************
-**
-** Function         gki_task_entry
-**
-** Description      entry point of GKI created tasks
-**
-** Returns          void
-**
-*******************************************************************************/
-void gki_task_entry(uintptr_t params) {
-  pthread_t thread_id = pthread_self();
-  gki_pthread_info_t* p_pthread_info = (gki_pthread_info_t*)params;
-  GKI_TRACE_5("gki_task_entry task_id=%i, thread_id=%x/%x, pCond/pMutex=%x/%x",
-              p_pthread_info->task_id,
-              gki_cb.os.thread_id[p_pthread_info->task_id], pthread_self(),
-              p_pthread_info->pCond, p_pthread_info->pMutex);
-
-  gki_cb.os.thread_id[p_pthread_info->task_id] = thread_id;
-  /* Call the actual thread entry point */
-  (p_pthread_info->task_entry)(p_pthread_info->params);
-
-  GKI_TRACE_1("gki_task task_id=%i terminating", p_pthread_info->task_id);
-  gki_cb.os.thread_id[p_pthread_info->task_id] = 0;
-
-  pthread_exit(0); /* GKI tasks have no return value */
-}
-/* end android */
-
-#ifndef ANDROID
-void GKI_TRACE(char* fmt, ...) {
-  LOCK(gki_cb.os.GKI_trace_mutex);
-  va_list ap;
-
-  va_start(ap, fmt);
-  vfprintf(stderr, fmt, ap);
-  fprintf(stderr, "\n");
-
-  va_end(ap);
-  UNLOCK(gki_cb.os.GKI_trace_mutex);
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         GKI_init
-**
-** Description      This function is called once at startup to initialize
-**                  all the timer structures.
-**
-** Returns          void
-**
-*******************************************************************************/
-
-void GKI_init(void) {
-  pthread_mutexattr_t attr;
-  tGKI_OS* p_os;
-
-  memset(&gki_cb, 0, sizeof(gki_cb));
-
-  gki_buffer_init();
-  gki_timers_init();
-  gki_cb.com.OSTicks = (uint32_t)times(0);
-
-  pthread_mutexattr_init(&attr);
-
-#ifndef __CYGWIN__
-  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
-#endif
-  p_os = &gki_cb.os;
-  pthread_mutex_init(&p_os->GKI_mutex, &attr);
-/* pthread_mutex_init(&GKI_sched_mutex, NULL); */
-#if (GKI_DEBUG == TRUE)
-  pthread_mutex_init(&p_os->GKI_trace_mutex, NULL);
-#endif
-  /* pthread_mutex_init(&thread_delay_mutex, NULL); */ /* used in GKI_delay */
-  /* pthread_cond_init (&thread_delay_cond, NULL); */
-
-  /* Initialiase GKI_timer_update suspend variables & mutexes to be in running
-   * state.
-   * this works too even if GKI_NO_TICK_STOP is defined in btld.txt */
-  p_os->no_timer_suspend = GKI_TIMER_TICK_RUN_COND;
-  pthread_mutex_init(&p_os->gki_timer_mutex, NULL);
-  pthread_cond_init(&p_os->gki_timer_cond, NULL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_os_tick_count
-**
-** Description      This function is called to retrieve the native OS system
-*tick.
-**
-** Returns          Tick count of native OS.
-**
-*******************************************************************************/
-uint32_t GKI_get_os_tick_count(void) {
-  /* TODO - add any OS specific code here
-  **/
-  return (gki_cb.com.OSTicks);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_create_task
-**
-** Description      This function is called to create a new OSS task.
-**
-** Parameters:      task_entry  - (input) pointer to the entry function of the
-*task
-**                  task_id     - (input) Task id is mapped to priority
-**                  taskname    - (input) name given to the task
-**                  stack       - (input) pointer to the top of the stack
-*(highest memory location)
-**                  stacksize   - (input) size of the stack allocated for the
-*task
-**
-** Returns          GKI_SUCCESS if all OK, GKI_FAILURE if any problem
-**
-** NOTE             This function take some parameters that may not be needed
-**                  by your particular OS. They are here for compatability
-**                  of the function prototype.
-**
-*******************************************************************************/
-uint8_t GKI_create_task(TASKPTR task_entry, uint8_t task_id, int8_t* taskname,
-                        uint16_t* stack, uint16_t stacksize, void* pCondVar,
-                        void* pMutex) {
-  uint16_t i;
-  uint8_t* p;
-  struct sched_param param;
-  int policy, ret = 0;
-  pthread_condattr_t attr;
-  pthread_attr_t attr1;
-
-  pthread_condattr_init(&attr);
-  pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
-  GKI_TRACE_5(
-      "GKI_create_task func=0x%x  id=%d  name=%s  stack=0x%x  stackSize=%d",
-      task_entry, task_id, taskname, stack, stacksize);
-
-  if (task_id >= GKI_MAX_TASKS) {
-    GKI_TRACE_0("Error! task ID > max task allowed");
-    return (GKI_FAILURE);
-  }
-
-  gki_cb.com.OSRdyTbl[task_id] = TASK_READY;
-  gki_cb.com.OSTName[task_id] = taskname;
-  gki_cb.com.OSWaitTmr[task_id] = 0;
-  gki_cb.com.OSWaitEvt[task_id] = 0;
-
-  /* Initialize mutex and condition variable objects for events and timeouts */
-  pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL);
-  pthread_cond_init(&gki_cb.os.thread_evt_cond[task_id], &attr);
-  pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL);
-  pthread_cond_init(&gki_cb.os.thread_timeout_cond[task_id], &attr);
-
-  pthread_attr_init(&attr1);
-/* by default, pthread creates a joinable thread */
-#if (FALSE == GKI_PTHREAD_JOINABLE)
-  pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
-
-  GKI_TRACE_3("GKI creating task %i, pCond/pMutex=%x/%x", task_id, pCondVar,
-              pMutex);
-#else
-  GKI_TRACE_1("GKI creating JOINABLE task %i", task_id);
-#endif
-
-  /* On Android, the new tasks starts running before
-   * 'gki_cb.os.thread_id[task_id]' is initialized */
-  /* Pass task_id to new task so it can initialize gki_cb.os.thread_id[task_id]
-   * for it calls GKI_wait */
-  gki_pthread_info[task_id].task_id = task_id;
-  gki_pthread_info[task_id].task_entry = task_entry;
-  gki_pthread_info[task_id].params = 0;
-  gki_pthread_info[task_id].pCond = (pthread_cond_t*)pCondVar;
-  gki_pthread_info[task_id].pMutex = (pthread_mutex_t*)pMutex;
-
-  ret = pthread_create(&gki_cb.os.thread_id[task_id], &attr1,
-                       (void*)gki_task_entry, &gki_pthread_info[task_id]);
-
-  if (ret != 0) {
-    GKI_TRACE_2("pthread_create failed(%d), %s!", ret, taskname);
-    return GKI_FAILURE;
-  }
-
-  if (pthread_getschedparam(gki_cb.os.thread_id[task_id], &policy, &param) ==
-      0) {
-#if defined(PBS_SQL_TASK)
-    if (task_id == PBS_SQL_TASK) {
-      GKI_TRACE_0("PBS SQL lowest priority task");
-      policy = SCHED_NORMAL;
-    } else
-#endif
-    {
-      policy = SCHED_RR;
-      param.sched_priority = 30 - task_id - 2;
-    }
-    pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, &param);
-  }
-
-  GKI_TRACE_6("Leaving GKI_create_task %x %d %x %s %x %d", task_entry, task_id,
-              gki_cb.os.thread_id[task_id], taskname, stack, stacksize);
-
-  return (GKI_SUCCESS);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_shutdown
-**
-** Description      shutdowns the GKI tasks/threads in from max task id to 0 and
-*frees
-**                  pthread resources!
-**                  IMPORTANT: in case of join method, GKI_shutdown must be
-*called outside
-**                  a GKI thread context!
-**
-** Returns          void
-**
-*******************************************************************************/
-#define WAKE_LOCK_ID "brcm_nfca"
-
-void GKI_shutdown(void) {
-  uint8_t task_id;
-  volatile int* p_run_cond = &gki_cb.os.no_timer_suspend;
-  int oldCOnd = 0;
-#if (FALSE == GKI_PTHREAD_JOINABLE)
-  int i = 0;
-#else
-  int result;
-#endif
-
-  /* release threads and set as TASK_DEAD. going from low to high priority fixes
-   * GKI_exception problem due to btu->hci sleep request events  */
-  for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--) {
-    if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD) {
-      gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD;
-
-      /* paranoi settings, make sure that we do not execute any mailbox events
-       */
-      gki_cb.com.OSWaitEvt[task_id - 1] &=
-          ~(TASK_MBOX_0_EVT_MASK | TASK_MBOX_1_EVT_MASK | TASK_MBOX_2_EVT_MASK |
-            TASK_MBOX_3_EVT_MASK);
-      GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT));
-
-#if (FALSE == GKI_PTHREAD_JOINABLE)
-      i = 0;
-
-      while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10))
-        usleep(100 * 1000);
-#else
-      /* wait for proper Arnold Schwarzenegger task state */
-      result = pthread_join(gki_cb.os.thread_id[task_id - 1], NULL);
-      if (result < 0) {
-        GKI_TRACE_1("pthread_join() FAILED: result: %d", result);
-      }
-#endif
-      GKI_TRACE_1("GKI_shutdown(): task %s dead", gki_cb.com.OSTName[task_id]);
-      GKI_exit_task(task_id - 1);
-    }
-  }
-
-  /* Destroy mutex and condition variable objects */
-  pthread_mutex_destroy(&gki_cb.os.GKI_mutex);
-/*    pthread_mutex_destroy(&GKI_sched_mutex); */
-#if (GKI_DEBUG == TRUE)
-  pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex);
-#endif
-/*    pthread_mutex_destroy(&thread_delay_mutex);
- pthread_cond_destroy (&thread_delay_cond); */
-#if (FALSE == GKI_PTHREAD_JOINABLE)
-  i = 0;
-#endif
-
-#ifdef NO_GKI_RUN_RETURN
-  shutdown_timer = 1;
-#endif
-  if (gki_cb.os.gki_timer_wake_lock_on) {
-    GKI_TRACE_0("GKI_shutdown :  release_wake_lock(brcm_btld)");
-    gki_cb.os.gki_timer_wake_lock_on = 0;
-  }
-  oldCOnd = *p_run_cond;
-  *p_run_cond = GKI_TIMER_TICK_EXIT_COND;
-  if (oldCOnd == GKI_TIMER_TICK_STOP_COND)
-    pthread_cond_signal(&gki_cb.os.gki_timer_cond);
-}
-
-/*******************************************************************************
- **
- ** Function        GKI_run
- **
- ** Description     This function runs a task
- **
- ** Parameters:     start: TRUE start system tick (again), FALSE stop
- **
- ** Returns         void
- **
- *********************************************************************************/
-void gki_system_tick_start_stop_cback(bool start) {
-  tGKI_OS* p_os = &gki_cb.os;
-  volatile int* p_run_cond = &p_os->no_timer_suspend;
-  volatile static int wake_lock_count;
-  if (start == false) {
-    /* this can lead to a race condition. however as we only read this variable
-     * in the timer loop
-     * we should be fine with this approach. otherwise uncomment below mutexes.
-     */
-    /* GKI_disable(); */
-    *p_run_cond = GKI_TIMER_TICK_STOP_COND;
-/* GKI_enable(); */
-#ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> STOP GKI_timer_update(), wake_lock_count:%d",
-               --wake_lock_count);
-#endif
-    gki_cb.os.gki_timer_wake_lock_on = 0;
-  } else {
-    /* restart GKI_timer_update() loop */
-    gki_cb.os.gki_timer_wake_lock_on = 1;
-    *p_run_cond = GKI_TIMER_TICK_RUN_COND;
-    pthread_mutex_lock(&p_os->gki_timer_mutex);
-    pthread_cond_signal(&p_os->gki_timer_cond);
-    pthread_mutex_unlock(&p_os->gki_timer_mutex);
-
-#ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> START GKI_timer_update(), wake_lock_count:%d",
-               ++wake_lock_count);
-#endif
-  }
-}
-
-/*******************************************************************************
-**
-** Function         timer_thread
-**
-** Description      Timer thread
-**
-** Parameters:      id  - (input) timer ID
-**
-** Returns          void
-**
-*********************************************************************************/
-#ifdef NO_GKI_RUN_RETURN
-void timer_thread(signed long id) {
-  GKI_TRACE_1("%s enter", __func__);
-  struct timespec delay;
-  int timeout = 1000; /* 10  ms per system tick  */
-  int err;
-
-  while (!shutdown_timer) {
-    delay.tv_sec = timeout / 1000;
-    delay.tv_nsec = 1000 * 1000 * (timeout % 1000);
-
-    /* [u]sleep can't be used because it uses SIGALRM */
-
-    do {
-      err = nanosleep(&delay, &delay);
-    } while (err < 0 && errno == EINTR);
-
-    GKI_timer_update(1);
-  }
-  GKI_TRACE_1("%s exit", __func__);
-  pthread_exit(NULL);
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         GKI_run
-**
-** Description      This function runs a task
-**
-** Parameters:      p_task_id  - (input) pointer to task id
-**
-** Returns          void
-**
-** NOTE             This function is only needed for operating systems where
-**                  starting a task is a 2-step process. Most OS's do it in
-**                  one step, If your OS does it in one step, this function
-**                  should be empty.
-*********************************************************************************/
-void GKI_run(void* p_task_id) {
-  GKI_TRACE_1("%s enter", __func__);
-  int retval = EACCES;
-  static pthread_t workerThreadId = 0;
-
-  retval = pthread_create(&workerThreadId, NULL, GKI_run_worker_thread, NULL);
-  if (retval != 0) {
-    GKI_TRACE_ERROR_2("%s: fail create thread %d", __func__, retval);
-  }
-  GKI_TRACE_1("%s exit", __func__);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_run_worker_thread
-**
-** Description      This function runs a task
-**
-** Parameters:      None
-**
-** Returns:         error code
-*********************************************************************************/
-void* GKI_run_worker_thread(void* dummy) {
-  GKI_TRACE_1("%s: enter", __func__);
-  struct timespec delay;
-  int err = 0;
-  volatile int* p_run_cond = &gki_cb.os.no_timer_suspend;
-
-#ifndef GKI_NO_TICK_STOP
-  /* register start stop function which disable timer loop in GKI_run() when no
-   * timers are
-   * in any GKI/BTA/BTU this should save power when BTLD is idle! */
-  GKI_timer_queue_register_callback(gki_system_tick_start_stop_cback);
-  GKI_TRACE_1("%s: Start/Stop GKI_timer_update_registered!", __func__);
-#endif
-
-#ifdef NO_GKI_RUN_RETURN
-  GKI_TRACE_1("%s: GKI_run == NO_GKI_RUN_RETURN", __func__);
-  pthread_attr_t timer_attr;
-
-  shutdown_timer = 0;
-
-  pthread_attr_init(&timer_attr);
-  pthread_attr_setdetachstate(&timer_attr, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&timer_thread_id, &timer_attr, timer_thread, NULL) != 0) {
-    GKI_TRACE_1("%s: pthread_create failed to create timer_thread!", __func__);
-    return NULL;
-  }
-#else
-  GKI_TRACE_3("%s: run_cond(%x)=%d ", __func__, p_run_cond, *p_run_cond);
-  for (; GKI_TIMER_TICK_EXIT_COND != *p_run_cond;) {
-    do {
-      /* adjust hear bit tick in btld by changning TICKS_PER_SEC!!!!! this
-       * formula works only for
-       * 1-1000ms heart beat units! */
-      delay.tv_sec = LINUX_SEC / 1000;
-      delay.tv_nsec = 1000 * 1000 * (LINUX_SEC % 1000);
-
-      /* [u]sleep can't be used because it uses SIGALRM */
-      do {
-        err = nanosleep(&delay, &delay);
-      } while (err < 0 && errno == EINTR);
-
-      /* the unit should be alsways 1 (1 tick). only if you vary for some reason
-       * heart beat tick
-       * e.g. power saving you may want to provide more ticks
-       */
-      GKI_timer_update(1);
-      /* BT_TRACE_2( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, "update: tv_sec: %d,
-       * tv_nsec: %d", delay.tv_sec, delay.tv_nsec ); */
-    } while (GKI_TIMER_TICK_RUN_COND == *p_run_cond);
-
-/* currently on reason to exit above loop is no_timer_suspend ==
- * GKI_TIMER_TICK_STOP_COND
- * block timer main thread till re-armed by  */
-#ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> SUSPENDED GKI_timer_update()");
-#endif
-    if (GKI_TIMER_TICK_EXIT_COND != *p_run_cond) {
-      GKI_TRACE_1("%s: waiting timer mutex", __func__);
-      pthread_mutex_lock(&gki_cb.os.gki_timer_mutex);
-      pthread_cond_wait(&gki_cb.os.gki_timer_cond, &gki_cb.os.gki_timer_mutex);
-      pthread_mutex_unlock(&gki_cb.os.gki_timer_mutex);
-      GKI_TRACE_1("%s: exited timer mutex", __func__);
-    }
-/* potentially we need to adjust os gki_cb.com.OSTicks */
-
-#ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> RESTARTED GKI_timer_update(): run_cond: %d", *p_run_cond);
-#endif
-  } /* for */
-#endif
-  GKI_TRACE_1("%s: exit", __func__);
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_stop
-**
-** Description      This function is called to stop
-**                  the tasks and timers when the system is being stopped
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put specific code here.
-**
-*******************************************************************************/
-void GKI_stop(void) {
-  uint8_t task_id;
-
-  /*  gki_queue_timer_cback(FALSE); */
-  /* TODO - add code here if needed*/
-
-  for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++) {
-    if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) {
-      GKI_exit_task(task_id);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         GKI_wait
-**
-** Description      This function is called by tasks to wait for a specific
-**                  event or set of events. The task may specify the duration
-**                  that it wants to wait for, or 0 if infinite.
-**
-** Parameters:      flag -    (input) the event or set of events to wait for
-**                  timeout - (input) the duration that the task wants to wait
-**                                    for the specific events (in system ticks)
-**
-**
-** Returns          the event mask of received events or zero if timeout
-**
-*******************************************************************************/
-uint16_t GKI_wait(uint16_t flag, uint32_t timeout) {
-  uint16_t evt;
-  uint8_t rtask;
-  struct timespec abstime = {0, 0};
-  int sec;
-  int nano_sec;
-
-  rtask = GKI_get_taskid();
-  GKI_TRACE_3("GKI_wait %d %x %d", rtask, flag, timeout);
-  if (rtask >= GKI_MAX_TASKS) {
-    pthread_exit(NULL);
-    return 0;
-  }
-
-  gki_pthread_info_t* p_pthread_info = &gki_pthread_info[rtask];
-  if (p_pthread_info->pCond != NULL && p_pthread_info->pMutex != NULL) {
-    int ret;
-    GKI_TRACE_3("GKI_wait task=%i, pCond/pMutex = %x/%x", rtask,
-                p_pthread_info->pCond, p_pthread_info->pMutex);
-    ret = pthread_mutex_lock(p_pthread_info->pMutex);
-    ret = pthread_cond_signal(p_pthread_info->pCond);
-    ret = pthread_mutex_unlock(p_pthread_info->pMutex);
-    p_pthread_info->pMutex = NULL;
-    p_pthread_info->pCond = NULL;
-  }
-  gki_cb.com.OSWaitForEvt[rtask] = flag;
-
-  /* protect OSWaitEvt[rtask] from modification from an other thread */
-  pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[rtask]);
-
-#if 0 /* for clean scheduling we probably should always call \
-         pthread_cond_wait() */
-    /* Check if anything in any of the mailboxes. There is a potential race condition where OSTaskQFirst[rtask]
-     has been modified. however this should only result in addtional call to  pthread_cond_wait() but as
-     the cond is met, it will exit immediately (depending on schedulling) */
-    if (gki_cb.com.OSTaskQFirst[rtask][0])
-    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][1])
-    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][2])
-    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][3])
-    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK;
-#endif
-
-  if (!(gki_cb.com.OSWaitEvt[rtask] & flag)) {
-    if (timeout) {
-      //            timeout = GKI_MS_TO_TICKS(timeout);     /* convert from
-      //            milliseconds to ticks */
-
-      /* get current system time */
-      //            clock_gettime(CLOCK_MONOTONIC, &currSysTime);
-      //            abstime.tv_sec = currSysTime.time;
-      //            abstime.tv_nsec = NANOSEC_PER_MILLISEC *
-      //            currSysTime.millitm;
-      clock_gettime(CLOCK_MONOTONIC, &abstime);
-
-      /* add timeout */
-      sec = timeout / 1000;
-      nano_sec = (timeout % 1000) * NANOSEC_PER_MILLISEC;
-      abstime.tv_nsec += nano_sec;
-      if (abstime.tv_nsec > NSEC_PER_SEC) {
-        abstime.tv_sec += (abstime.tv_nsec / NSEC_PER_SEC);
-        abstime.tv_nsec = abstime.tv_nsec % NSEC_PER_SEC;
-      }
-      abstime.tv_sec += sec;
-
-      pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask],
-                             &gki_cb.os.thread_evt_mutex[rtask], &abstime);
-
-    } else {
-      pthread_cond_wait(&gki_cb.os.thread_evt_cond[rtask],
-                        &gki_cb.os.thread_evt_mutex[rtask]);
-    }
-
-    /* TODO: check, this is probably neither not needed depending on
-     phtread_cond_wait() implmentation,
-     e.g. it looks like it is implemented as a counter in which case multiple
-     cond_signal
-     should NOT be lost! */
-    // we are waking up after waiting for some events, so refresh variables
-    // no need to call GKI_disable() here as we know that we will have some
-    // events as we've been waking up after condition pending or timeout
-    if (gki_cb.com.OSTaskQFirst[rtask][0])
-      gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][1])
-      gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][2])
-      gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK;
-    if (gki_cb.com.OSTaskQFirst[rtask][3])
-      gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK;
-
-    if (gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD) {
-      gki_cb.com.OSWaitEvt[rtask] = 0;
-      /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock when cond
-       * is met */
-      pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
-      GKI_TRACE_1("GKI TASK_DEAD received. exit thread %d...", rtask);
-
-      gki_cb.os.thread_id[rtask] = 0;
-      pthread_exit(NULL);
-      return (EVENT_MASK(GKI_SHUTDOWN_EVT));
-    }
-  }
-
-  /* Clear the wait for event mask */
-  gki_cb.com.OSWaitForEvt[rtask] = 0;
-
-  /* Return only those bits which user wants... */
-  evt = gki_cb.com.OSWaitEvt[rtask] & flag;
-
-  /* Clear only those bits which user wants... */
-  gki_cb.com.OSWaitEvt[rtask] &= ~flag;
-
-  /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock mutex when
-   * cond is met */
-  pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
-  GKI_TRACE_4("GKI_wait %d %x %d %x resumed", rtask, flag, timeout, evt);
-
-  return (evt);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_delay
-**
-** Description      This function is called by tasks to sleep unconditionally
-**                  for a specified amount of time. The duration is in
-*milliseconds
-**
-** Parameters:      timeout -    (input) the duration in milliseconds
-**
-** Returns          void
-**
-*******************************************************************************/
-
-void GKI_delay(uint32_t timeout) {
-  uint8_t rtask = GKI_get_taskid();
-  struct timespec delay;
-  int err;
-
-  GKI_TRACE_2("GKI_delay %d %d", rtask, timeout);
-
-  delay.tv_sec = timeout / 1000;
-  delay.tv_nsec = 1000 * 1000 * (timeout % 1000);
-
-  /* [u]sleep can't be used because it uses SIGALRM */
-
-  do {
-    err = nanosleep(&delay, &delay);
-  } while (err < 0 && errno == EINTR);
-
-  /* Check if task was killed while sleeping */
-  /* NOTE
-  **      if you do not implement task killing, you do not
-  **      need this check.
-  */
-  if (rtask && gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD) {
-  }
-
-  GKI_TRACE_2("GKI_delay %d %d done", rtask, timeout);
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_send_event
-**
-** Description      This function is called by tasks to send events to other
-**                  tasks. Tasks can also send events to themselves.
-**
-** Parameters:      task_id -  (input) The id of the task to which the event has
-*to
-**                  be sent
-**                  event   -  (input) The event that has to be sent
-**
-**
-** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-*******************************************************************************/
-uint8_t GKI_send_event(uint8_t task_id, uint16_t event) {
-  GKI_TRACE_2("GKI_send_event %d %x", task_id, event);
-
-  /* use efficient coding to avoid pipeline stalls */
-  if (task_id < GKI_MAX_TASKS) {
-    /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
-    pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[task_id]);
-
-    /* Set the event bit */
-    gki_cb.com.OSWaitEvt[task_id] |= event;
-
-    pthread_cond_signal(&gki_cb.os.thread_evt_cond[task_id]);
-
-    pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[task_id]);
-
-    GKI_TRACE_2("GKI_send_event %d %x done", task_id, event);
-    return (GKI_SUCCESS);
-  }
-  return (GKI_FAILURE);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_isend_event
-**
-** Description      This function is called from ISRs to send events to other
-**                  tasks. The only difference between this function and
-*GKI_send_event
-**                  is that this function assumes interrupts are already
-*disabled.
-**
-** Parameters:      task_id -  (input) The destination task Id for the event.
-**                  event   -  (input) The event flag
-**
-** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put your code here, otherwise you can delete the entire
-**                  body of the function.
-**
-*******************************************************************************/
-uint8_t GKI_isend_event(uint8_t task_id, uint16_t event) {
-  GKI_TRACE_2("GKI_isend_event %d %x", task_id, event);
-  GKI_TRACE_2("GKI_isend_event %d %x done", task_id, event);
-  return GKI_send_event(task_id, event);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_taskid
-**
-** Description      This function gets the currently running task ID.
-**
-** Returns          task ID
-**
-** NOTE             The Widcomm upper stack and profiles may run as a single
-*task.
-**                  If you only have one GKI task, then you can hard-code this
-**                  function to return a '1'. Otherwise, you should have some
-**                  OS-specific method to determine the current task.
-**
-*******************************************************************************/
-uint8_t GKI_get_taskid(void) {
-  int i;
-
-  pthread_t thread_id = pthread_self();
-  for (i = 0; i < GKI_MAX_TASKS; i++) {
-    if (gki_cb.os.thread_id[i] == thread_id) {
-      GKI_TRACE_2("GKI_get_taskid %x %d done", thread_id, i);
-      return (i);
-    }
-  }
-
-  GKI_TRACE_1("GKI_get_taskid: thread id = %x, task id = -1", thread_id);
-
-  return (-1);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_map_taskname
-**
-** Description      This function gets the task name of the taskid passed as
-*arg.
-**                  If GKI_MAX_TASKS is passed as arg the currently running task
-**                  name is returned
-**
-** Parameters:      task_id -  (input) The id of the task whose name is being
-**                  sought. GKI_MAX_TASKS is passed to get the name of the
-**                  currently running task.
-**
-** Returns          pointer to task name
-**
-** NOTE             this function needs no customization
-**
-*******************************************************************************/
-int8_t* GKI_map_taskname(uint8_t task_id) {
-  GKI_TRACE_1("GKI_map_taskname %d", task_id);
-
-  if (task_id < GKI_MAX_TASKS) {
-    GKI_TRACE_2("GKI_map_taskname %d %s done", task_id,
-                gki_cb.com.OSTName[task_id]);
-    return (gki_cb.com.OSTName[task_id]);
-  } else if (task_id == GKI_MAX_TASKS) {
-    return (gki_cb.com.OSTName[GKI_get_taskid()]);
-  } else {
-    return (int8_t*)"BAD";
-  }
-}
-
-/*******************************************************************************
-**
-** Function         GKI_enable
-**
-** Description      This function enables interrupts.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_enable(void) {
-  GKI_TRACE_0("GKI_enable");
-  pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
-  /* 	pthread_mutex_xx is nesting save, no need for this: already_disabled =
-   * 0; */
-  GKI_TRACE_0("Leaving GKI_enable");
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_disable
-**
-** Description      This function disables interrupts.
-**
-** Returns          void
-**
-*******************************************************************************/
-
-void GKI_disable(void) {
-  // GKI_TRACE_0("GKI_disable");
-
-  /*	pthread_mutex_xx is nesting save, no need for this: if
-     (!already_disabled) {
-      already_disabled = 1; */
-  pthread_mutex_lock(&gki_cb.os.GKI_mutex);
-  /*  } */
-  // GKI_TRACE_0("Leaving GKI_disable");
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_exception
-**
-** Description      This function throws an exception.
-**                  This is normally only called for a nonrecoverable error.
-**
-** Parameters:      code    -  (input) The code for the error
-**                  msg     -  (input) The message that has to be logged
-**
-** Returns          void
-**
-*******************************************************************************/
-
-void GKI_exception(uint16_t code, char* msg) {
-  uint8_t task_id;
-  int i = 0;
-
-  GKI_TRACE_ERROR_0("GKI_exception(): Task State Table");
-
-  for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++) {
-    GKI_TRACE_ERROR_3("TASK ID [%d] task name [%s] state [%d]", task_id,
-                      gki_cb.com.OSTName[task_id],
-                      gki_cb.com.OSRdyTbl[task_id]);
-  }
-
-  GKI_TRACE_ERROR_2("GKI_exception %d %s", code, msg);
-  GKI_TRACE_ERROR_0(
-      "********************************************************************");
-  GKI_TRACE_ERROR_2("* GKI_exception(): %d %s", code, msg);
-  GKI_TRACE_ERROR_0(
-      "********************************************************************");
-
-#if (GKI_DEBUG == TRUE)
-  GKI_disable();
-
-  if (gki_cb.com.ExceptionCnt < GKI_MAX_EXCEPTION) {
-    EXCEPTION_T* pExp;
-
-    pExp = &gki_cb.com.Exception[gki_cb.com.ExceptionCnt++];
-    pExp->type = code;
-    pExp->taskid = GKI_get_taskid();
-    strncpy((char*)pExp->msg, msg, GKI_MAX_EXCEPTION_MSGLEN - 1);
-  }
-
-  GKI_enable();
-#endif
-
-  GKI_TRACE_ERROR_2("GKI_exception %d %s done", code, msg);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_get_time_stamp
-**
-** Description      This function formats the time into a user area
-**
-** Parameters:      tbuf -  (output) the address to the memory containing the
-**                  formatted time
-**
-** Returns          the address of the user area containing the formatted time
-**                  The format of the time is ????
-**
-** NOTE             This function is only called by OBEX.
-**
-*******************************************************************************/
-int8_t* GKI_get_time_stamp(int8_t* tbuf) {
-  uint32_t ms_time;
-  uint32_t s_time;
-  uint32_t m_time;
-  uint32_t h_time;
-  int8_t* p_out = tbuf;
-
-  gki_cb.com.OSTicks = times(0);
-  ms_time = GKI_TICKS_TO_MS(gki_cb.com.OSTicks);
-  s_time = ms_time / 100; /* 100 Ticks per second */
-  m_time = s_time / 60;
-  h_time = m_time / 60;
-
-  ms_time -= s_time * 100;
-  s_time -= m_time * 60;
-  m_time -= h_time * 60;
-
-  *p_out++ = (int8_t)((h_time / 10) + '0');
-  *p_out++ = (int8_t)((h_time % 10) + '0');
-  *p_out++ = ':';
-  *p_out++ = (int8_t)((m_time / 10) + '0');
-  *p_out++ = (int8_t)((m_time % 10) + '0');
-  *p_out++ = ':';
-  *p_out++ = (int8_t)((s_time / 10) + '0');
-  *p_out++ = (int8_t)((s_time % 10) + '0');
-  *p_out++ = ':';
-  *p_out++ = (int8_t)((ms_time / 10) + '0');
-  *p_out++ = (int8_t)((ms_time % 10) + '0');
-  *p_out++ = ':';
-  *p_out = 0;
-
-  return (tbuf);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_register_mempool
-**
-** Description      This function registers a specific memory pool.
-**
-** Parameters:      p_mem -  (input) pointer to the memory pool
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If your OS has different memory pools, you
-**                  can tell GKI the pool to use by calling this function.
-**
-*******************************************************************************/
-void GKI_register_mempool(void* p_mem) {
-  gki_cb.com.p_user_mempool = p_mem;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_os_malloc
-**
-** Description      This function allocates memory
-**
-** Parameters:      size -  (input) The size of the memory that has to be
-**                  allocated
-**
-** Returns          the address of the memory allocated, or NULL if failed
-**
-** NOTE             This function is called by the Widcomm stack when
-**                  dynamic memory allocation is used.
-**
-*******************************************************************************/
-void* GKI_os_malloc(uint32_t size) { return (malloc(size)); }
-
-/*******************************************************************************
-**
-** Function         GKI_os_free
-**
-** Description      This function frees memory
-**
-** Parameters:      size -  (input) The address of the memory that has to be
-**                  freed
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. It is only called from within GKI if dynamic
-**
-*******************************************************************************/
-void GKI_os_free(void* p_mem) {
-  if (p_mem != NULL) free(p_mem);
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_suspend_task()
-**
-** Description      This function suspends the task specified in the argument.
-**
-** Parameters:      task_id  - (input) the id of the task that has to suspended
-**
-** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to implement task suspension
-*capability,
-**                  put specific code here.
-**
-*******************************************************************************/
-uint8_t GKI_suspend_task(uint8_t task_id) {
-  GKI_TRACE_1("GKI_suspend_task %d - NOT implemented", task_id);
-
-  GKI_TRACE_1("GKI_suspend_task %d done", task_id);
-
-  return (GKI_SUCCESS);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_resume_task()
-**
-** Description      This function resumes the task specified in the argument.
-**
-** Parameters:      task_id  - (input) the id of the task that has to resumed
-**
-** Returns          GKI_SUCCESS if all OK
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to implement task suspension
-*capability,
-**                  put specific code here.
-**
-*******************************************************************************/
-uint8_t GKI_resume_task(uint8_t task_id) {
-  GKI_TRACE_1("GKI_resume_task %d - NOT implemented", task_id);
-
-  GKI_TRACE_1("GKI_resume_task %d done", task_id);
-
-  return (GKI_SUCCESS);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_exit_task
-**
-** Description      This function is called to stop a GKI task.
-**
-** Parameters:      task_id  - (input) the id of the task that has to be stopped
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put specific code here to kill a task.
-**
-*******************************************************************************/
-void GKI_exit_task(uint8_t task_id) {
-  GKI_disable();
-  gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD;
-
-  /* Destroy mutex and condition variable objects */
-  pthread_mutex_destroy(&gki_cb.os.thread_evt_mutex[task_id]);
-  pthread_cond_destroy(&gki_cb.os.thread_evt_cond[task_id]);
-  pthread_mutex_destroy(&gki_cb.os.thread_timeout_mutex[task_id]);
-  pthread_cond_destroy(&gki_cb.os.thread_timeout_cond[task_id]);
-
-  GKI_enable();
-
-  // GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
-
-  GKI_TRACE_1("GKI_exit_task %d done", task_id);
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_sched_lock
-**
-** Description      This function is called by tasks to disable scheduler
-**                  task context switching.
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put code here to tell the OS to disable context switching.
-**
-*******************************************************************************/
-void GKI_sched_lock(void) {
-  GKI_TRACE_0("GKI_sched_lock");
-  GKI_disable();
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_sched_unlock
-**
-** Description      This function is called by tasks to enable scheduler
-*switching.
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Widcomm stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put code here to tell the OS to re-enable context switching.
-**
-*******************************************************************************/
-void GKI_sched_unlock(void) {
-  GKI_TRACE_0("GKI_sched_unlock");
-  GKI_enable();
-}
-
-/*******************************************************************************
-**
-** Function         GKI_shiftdown
-**
-** Description      shift memory down (to make space to insert a record)
-**
-*******************************************************************************/
-void GKI_shiftdown(uint8_t* p_mem, uint32_t len, uint32_t shift_amount) {
-  register uint8_t* ps = p_mem + len - 1;
-  register uint8_t* pd = ps + shift_amount;
-  register uint32_t xx;
-
-  for (xx = 0; xx < len; xx++) *pd-- = *ps--;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_shiftup
-**
-** Description      shift memory up (to delete a record)
-**
-*******************************************************************************/
-void GKI_shiftup(uint8_t* p_dest, uint8_t* p_src, uint32_t len) {
-  register uint8_t* ps = p_src;
-  register uint8_t* pd = p_dest;
-  register uint32_t xx;
-
-  for (xx = 0; xx < len; xx++) *pd++ = *ps++;
-}
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
deleted file mode 100644
index b40bcc4..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  NFC Hardware Abstraction Layer API: Implementation for Broadcom NFC
- *  controllers
- *
- ******************************************************************************/
-#include "nfc_hal_api.h"
-#include <string.h>
-#include "gki.h"
-#include "nfc_hal_int.h"
-#include "nfc_hal_target.h"
-
-/*******************************************************************************
-** NFC_HAL_TASK declarations
-*******************************************************************************/
-#define NFC_HAL_TASK_STR ((int8_t*)"NFC_HAL_TASK")
-#define NFC_HAL_TASK_STACK_SIZE 0x400
-uint32_t nfc_hal_task_stack[(NFC_HAL_TASK_STACK_SIZE + 3) / 4];
-
-/*******************************************************************************
-**
-** Function         HAL_NfcInitialize
-**
-** Description      Called when HAL library is loaded.
-**
-**                  Initialize GKI and start the HCIT task
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcInitialize(void) {
-  /* Initialize HAL control block */
-  nfc_hal_main_init();
-
-  HAL_TRACE_API1("HAL_NfcInitialize (): NFC_HAL_TASK id=%i", NFC_HAL_TASK);
-
-#ifndef NFC_HAL_SHARED_GKI
-  /* Initialize GKI (not needed if using shared NFC/HAL GKI resources) */
-  GKI_init();
-  GKI_enable();
-#endif
-
-  /* Create the NCI transport task */
-  GKI_create_task(
-      (TASKPTR)nfc_hal_main_task, NFC_HAL_TASK, NFC_HAL_TASK_STR,
-      (uint16_t*)((uint8_t*)nfc_hal_task_stack + NFC_HAL_TASK_STACK_SIZE),
-      sizeof(nfc_hal_task_stack), NULL, NULL);
-
-#ifndef NFC_HAL_SHARED_GKI
-  /* Start GKI scheduler (not needed if using shared NFC/HAL GKI resources) */
-  GKI_run(0);
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcTerminate
-**
-** Description      Called to terminate NFC HAL
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcTerminate(void) { HAL_TRACE_API0("HAL_NfcTerminate ()"); }
-
-/*******************************************************************************
-**
-** Function         HAL_NfcOpen
-**
-** Description      Open transport and intialize the NFCC, and
-**                  Register callback for HAL event notifications,
-**
-**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcOpen(tHAL_NFC_CBACK* p_hal_cback,
-                 tHAL_NFC_DATA_CBACK* p_data_cback) {
-  HAL_TRACE_API0("HAL_NfcOpen ()");
-
-  /* Only handle if HAL is not opened (stack cback is NULL) */
-  if (p_hal_cback) {
-    nfc_hal_dm_init();
-    nfc_hal_cb.p_stack_cback = p_hal_cback;
-    nfc_hal_cb.p_data_cback = p_data_cback;
-
-    /* Send startup event to NFC_HAL_TASK */
-    GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_INITIALIZE);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcClose
-**
-** Description      Prepare for shutdown. A HAL_CLOSE_DONE_EVENT will be
-**                  reported when complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcClose(void) {
-  HAL_TRACE_API0("HAL_NfcClose ()");
-
-  /* Only handle if HAL is opened (stack cback is not-NULL) */
-  if (nfc_hal_cb.p_stack_cback) {
-    /* Send shutdown event to NFC_HAL_TASK */
-    GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcCoreInitialized
-**
-** Description      Called after the CORE_INIT_RSP is received from the NFCC.
-**                  At this time, the HAL can do any chip-specific
-*configuration,
-**                  and when finished signal the libnfc-nci with event
-**                  HAL_POST_INIT_DONE.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcCoreInitialized(uint16_t data_len,
-                            uint8_t* p_core_init_rsp_params) {
-  NFC_HDR* p_msg;
-  uint16_t size;
-
-  HAL_TRACE_API0("HAL_NfcCoreInitialized ()");
-
-  /* NCI payload len + NCI header size */
-  size = p_core_init_rsp_params[2] + NCI_MSG_HDR_SIZE;
-
-  /* Send message to NFC_HAL_TASK */
-  p_msg = (NFC_HDR*)GKI_getbuf((uint16_t)(size + NFC_HDR_SIZE));
-  if (p_msg != NULL) {
-    p_msg->event = NFC_HAL_EVT_POST_CORE_RESET;
-    p_msg->offset = 0;
-    p_msg->len = size;
-    p_msg->layer_specific = 0;
-    memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_core_init_rsp_params, size);
-
-    GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcWrite
-**
-** Description      Send an NCI control message or data packet to the
-**                  transport. If an NCI command message exceeds the transport
-**                  size, HAL is responsible for fragmenting it, Data packets
-**                  must be of the correct size.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcWrite(uint16_t data_len, uint8_t* p_data) {
-  NFC_HDR* p_msg;
-  uint8_t mt;
-
-  HAL_TRACE_API0("HAL_NfcWrite ()");
-
-  if (data_len > (NCI_MAX_CTRL_SIZE + NCI_MSG_HDR_SIZE)) {
-    HAL_TRACE_ERROR1("HAL_NfcWrite (): too many bytes (%d)", data_len);
-    return;
-  }
-
-  /* Send message to NFC_HAL_TASK */
-  p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_msg != NULL) {
-    p_msg->event = NFC_HAL_EVT_TO_NFC_NCI;
-    p_msg->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
-    p_msg->len = data_len;
-    memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, data_len);
-
-    /* Check if message is a command or data */
-    mt = (*(p_data)&NCI_MT_MASK) >> NCI_MT_SHIFT;
-    p_msg->layer_specific = (mt == NCI_MT_CMD) ? NFC_HAL_WAIT_RSP_CMD : 0;
-
-    GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPreDiscover
-**
-** Description      Perform any vendor-specific pre-discovery actions (if
-*needed)
-**                  If any actions were performed TRUE will be returned, and
-**                  HAL_PRE_DISCOVER_DONE_EVENT will notify when actions are
-**                  completed.
-**
-** Returns          TRUE if vendor-specific pre-discovery actions initialized
-**                  FALSE if no vendor-specific pre-discovery actions are
-*needed.
-**
-*******************************************************************************/
-bool HAL_NfcPreDiscover(void) {
-  bool status = false;
-
-  NFC_HDR* p_msg;
-
-  HAL_TRACE_API0("HAL_NfcPreDiscover ()");
-  if (nfc_hal_cb.pre_discover_done == false) {
-    nfc_hal_cb.pre_discover_done = true;
-    if (p_nfc_hal_pre_discover_cfg && *p_nfc_hal_pre_discover_cfg) {
-      status = true;
-      /* Send message to NFC_HAL_TASK */
-      p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-      if (p_msg != NULL) {
-        p_msg->event = NFC_HAL_EVT_PRE_DISCOVER;
-        GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-      }
-    }
-  }
-
-  HAL_TRACE_API1("HAL_NfcPreDiscover status:%d", status);
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcControlGranted
-**
-** Description      Grant control to HAL control for sending NCI commands.
-**
-**                  Call in response to HAL_REQUEST_CONTROL_EVENT.
-**
-**                  Must only be called when there are no NCI commands pending.
-**
-**                  HAL_RELEASE_CONTROL_EVENT will notify when HAL no longer
-**                  needs control of NCI.
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcControlGranted(void) {
-  NFC_HDR* p_msg;
-  HAL_TRACE_API0("HAL_NfcControlGranted ()");
-
-  /* Send message to NFC_HAL_TASK */
-  p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_msg != NULL) {
-    p_msg->event = NFC_HAL_EVT_CONTROL_GRANTED;
-    GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPowerCycle
-**
-** Description      Restart NFCC by power cyle
-**
-**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcPowerCycle(void) {
-  HAL_TRACE_API0("HAL_NfcPowerCycle ()");
-
-  /* Only handle if HAL is opened (stack cback is not-NULL) */
-  if (nfc_hal_cb.p_stack_cback) {
-    /* Send power cycle event to NFC_HAL_TASK */
-    GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_POWER_CYCLE);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcGetMaxNfcee
-**
-** Description      Retrieve the maximum number of NFCEEs supported by NFCC
-**
-** Returns          the maximum number of NFCEEs supported by NFCC
-**
-*******************************************************************************/
-uint8_t HAL_NfcGetMaxNfcee(void) {
-  HAL_TRACE_API1("HAL_NfcGetMaxNfcee: %d", nfc_hal_cb.max_ee);
-  return nfc_hal_cb.max_ee;
-}
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c
deleted file mode 100644
index b2fec1b..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c
+++ /dev/null
@@ -1,1331 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Vendor-specific handler for DM events
- *
- ******************************************************************************/
-#include <string.h>
-#include "nfc_hal_int.h"
-#include "nfc_hal_post_reset.h"
-#include "upio.h"
-#include "userial.h"
-
-/*****************************************************************************
-** Constants and types
-*****************************************************************************/
-
-#define NFC_HAL_I93_RW_CFG_LEN (5)
-#define NFC_HAL_I93_RW_CFG_PARAM_LEN (3)
-#define NFC_HAL_I93_AFI (0)
-#define NFC_HAL_I93_ENABLE_SMART_POLL (1)
-
-static uint8_t nfc_hal_dm_i93_rw_cfg[NFC_HAL_I93_RW_CFG_LEN] = {
-    NCI_PARAM_ID_I93_DATARATE, NFC_HAL_I93_RW_CFG_PARAM_LEN,
-    NFC_HAL_I93_FLAG_DATA_RATE,   /* Bit0:Sub carrier, Bit1:Data rate,
-                                     Bit4:Enable/Disable AFI */
-    NFC_HAL_I93_AFI,              /* AFI if Bit 4 is set in the flag byte */
-    NFC_HAL_I93_ENABLE_SMART_POLL /* Bit0:Enable/Disable smart poll */
-};
-
-static uint8_t nfc_hal_dm_set_fw_fsm_cmd[NCI_MSG_HDR_SIZE + 1] = {
-    NCI_MTS_CMD | NCI_GID_PROP, NCI_MSG_SET_FWFSM, 0x01, 0x00,
-};
-#define NCI_SET_FWFSM_OFFSET_ENABLE 3
-
-/* length of parameters in XTAL_INDEX CMD */
-#define NCI_PROP_PARAM_SIZE_XTAL_INDEX 3
-#ifndef NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX
-#define NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX 20
-#endif
-
-const uint8_t nfc_hal_dm_get_build_info_cmd[NCI_MSG_HDR_SIZE] = {
-    NCI_MTS_CMD | NCI_GID_PROP, NCI_MSG_GET_BUILD_INFO, 0x00};
-#define NCI_BUILD_INFO_OFFSET_HWID 25 /* HW ID offset in build info RSP */
-
-const uint8_t nfc_hal_dm_get_patch_version_cmd[NCI_MSG_HDR_SIZE] = {
-    NCI_MTS_CMD | NCI_GID_PROP, NCI_MSG_GET_PATCH_VERSION, 0x00};
-/* Length of patch version string in PATCH_INFO */
-#define NCI_PATCH_INFO_VERSION_LEN 16
-
-/*****************************************************************************
-** Extern function prototypes
-*****************************************************************************/
-extern uint8_t* p_nfc_hal_dm_lptd_cfg;
-extern uint8_t* p_nfc_hal_dm_pll_325_cfg;
-extern uint8_t* p_nfc_hal_dm_start_up_cfg;
-extern uint8_t* p_nfc_hal_dm_start_up_vsc_cfg;
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-extern tNFC_HAL_DM_PRE_SET_MEM* p_nfc_hal_dm_pre_set_mem;
-
-/*****************************************************************************
-** Local function prototypes
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_config
-**
-** Description      Send NCI config items to NFCC
-**
-** Returns          tHAL_NFC_STATUS
-**
-*******************************************************************************/
-tHAL_NFC_STATUS nfc_hal_dm_set_config(uint8_t tlv_size, uint8_t* p_param_tlvs,
-                                      tNFC_HAL_NCI_CBACK* p_cback) {
-  uint8_t *p_buff, *p;
-  uint8_t num_param = 0, param_len, rem_len, *p_tlv;
-  uint16_t cmd_len = NCI_MSG_HDR_SIZE + tlv_size + 1;
-  tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
-
-  if ((tlv_size == 0) || (p_param_tlvs == NULL)) {
-    return status;
-  }
-
-  p_buff = (uint8_t*)GKI_getbuf((uint16_t)(NCI_MSG_HDR_SIZE + tlv_size));
-  if (p_buff != NULL) {
-    p = p_buff;
-
-    NCI_MSG_BLD_HDR0(p, NCI_MT_CMD, NCI_GID_CORE);
-    NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_SET_CONFIG);
-    UINT8_TO_STREAM(p, (uint8_t)(tlv_size + 1));
-
-    rem_len = tlv_size;
-    p_tlv = p_param_tlvs;
-    while (rem_len > 1) {
-      num_param++; /* number of params */
-
-      p_tlv++;              /* param type   */
-      param_len = *p_tlv++; /* param length */
-
-      rem_len -= 2; /* param type and length */
-      if (rem_len >= param_len) {
-        rem_len -= param_len;
-        p_tlv += param_len; /* next param_type */
-
-        if (rem_len == 0) {
-          status = HAL_NFC_STATUS_OK;
-          break;
-        }
-      } else {
-        /* error found */
-        break;
-      }
-    }
-
-    if (status == HAL_NFC_STATUS_OK) {
-      UINT8_TO_STREAM(p, num_param);
-      ARRAY_TO_STREAM(p, p_param_tlvs, tlv_size);
-
-      nfc_hal_dm_send_nci_cmd(p_buff, cmd_len, p_cback);
-    } else {
-      HAL_TRACE_ERROR0("nfc_hal_dm_set_config ():Bad TLV");
-    }
-
-    GKI_freebuf(p_buff);
-  }
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_fw_fsm
-**
-** Description      Enable or disable FW FSM
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_set_fw_fsm(bool enable, tNFC_HAL_NCI_CBACK* p_cback) {
-  if (enable)
-    nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] =
-        0x01; /* Enable, default is disabled */
-  else
-    nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x00; /* Disable */
-
-  nfc_hal_dm_send_nci_cmd(nfc_hal_dm_set_fw_fsm_cmd, NCI_MSG_HDR_SIZE + 1,
-                          p_cback);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_config_nfcc_cback
-**
-** Description      Callback for NCI vendor specific command complete
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_config_nfcc_cback(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                                  uint8_t* p_data) {
-  if (nfc_hal_cb.dev_cb.next_dm_config == NFC_HAL_DM_CONFIG_NONE) {
-    nfc_hal_hci_enable();
-  } else {
-    nfc_hal_dm_config_nfcc();
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_send_startup_vsc
-**
-** Description      Send VS command before NFA start-up
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_dm_send_startup_vsc(void) {
-  uint8_t *p, *p_end;
-  uint16_t len;
-
-  HAL_TRACE_DEBUG0("nfc_hal_dm_send_startup_vsc ()");
-
-  /* VSC must have NCI header at least */
-  if (nfc_hal_cb.dev_cb.next_startup_vsc + NCI_MSG_HDR_SIZE - 1 <=
-      *p_nfc_hal_dm_start_up_vsc_cfg) {
-    p = p_nfc_hal_dm_start_up_vsc_cfg + nfc_hal_cb.dev_cb.next_startup_vsc;
-    len = *(p + 2);
-    p_end = p + NCI_MSG_HDR_SIZE - 1 + len;
-
-    if (p_end <=
-        p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg) {
-      /* move to next VSC */
-      nfc_hal_cb.dev_cb.next_startup_vsc += NCI_MSG_HDR_SIZE + len;
-
-      /* if this is last VSC */
-      if (p_end ==
-          p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg)
-        nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
-
-      nfc_hal_dm_send_nci_cmd(p, (uint16_t)(NCI_MSG_HDR_SIZE + len),
-                              nfc_hal_dm_config_nfcc_cback);
-      return;
-    }
-  }
-
-  HAL_TRACE_ERROR0("nfc_hal_dm_send_startup_vsc (): Bad start-up VSC");
-
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-  nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_config_nfcc
-**
-** Description      Send VS config before NFA start-up
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_config_nfcc(void) {
-  HAL_TRACE_DEBUG1("nfc_hal_dm_config_nfcc (): next_dm_config = %d",
-                   nfc_hal_cb.dev_cb.next_dm_config);
-
-  if ((p_nfc_hal_dm_lptd_cfg[0]) &&
-      (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_LPTD)) {
-    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_PLL_325;
-
-    if (nfc_hal_dm_set_config(
-            p_nfc_hal_dm_lptd_cfg[0], &p_nfc_hal_dm_lptd_cfg[1],
-            nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) {
-      return;
-    } else {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT,
-                               HAL_NFC_STATUS_FAILED);
-      return;
-    }
-  }
-
-  if ((p_nfc_hal_dm_pll_325_cfg) &&
-      (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_PLL_325)) {
-    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP;
-
-    if (nfc_hal_dm_set_config(
-            NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN, p_nfc_hal_dm_pll_325_cfg,
-            nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) {
-      return;
-    } else {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT,
-                               HAL_NFC_STATUS_FAILED);
-      return;
-    }
-  }
-
-  if ((p_nfc_hal_dm_start_up_cfg[0]) &&
-      (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP)) {
-    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_I93_DATA_RATE;
-    if (nfc_hal_dm_set_config(
-            p_nfc_hal_dm_start_up_cfg[0], &p_nfc_hal_dm_start_up_cfg[1],
-            nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) {
-      return;
-    } else {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT,
-                               HAL_NFC_STATUS_FAILED);
-      return;
-    }
-  }
-
-#if (NFC_HAL_I93_FLAG_DATA_RATE == NFC_HAL_I93_FLAG_DATA_RATE_HIGH)
-  if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_I93_DATA_RATE) {
-    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_FW_FSM;
-    if (nfc_hal_dm_set_config(NFC_HAL_I93_RW_CFG_LEN, nfc_hal_dm_i93_rw_cfg,
-                              nfc_hal_dm_config_nfcc_cback) ==
-        HAL_NFC_STATUS_OK) {
-      return;
-    } else {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT,
-                               HAL_NFC_STATUS_FAILED);
-      return;
-    }
-  }
-#endif
-
-  /* FW FSM is disabled as default in NFCC */
-  if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_FW_FSM) {
-    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP_VSC;
-    nfc_hal_dm_set_fw_fsm(NFC_HAL_DM_MULTI_TECH_RESP,
-                          nfc_hal_dm_config_nfcc_cback);
-    return;
-  }
-
-  if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP_VSC) {
-    if (p_nfc_hal_dm_start_up_vsc_cfg && *p_nfc_hal_dm_start_up_vsc_cfg) {
-      nfc_hal_dm_send_startup_vsc();
-      return;
-    }
-  }
-
-  /* nothing to config */
-  nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
-  nfc_hal_dm_config_nfcc_cback(0, 0, NULL);
-}
-
-/*******************************************************************************
-**
-** Function:    nfc_hal_dm_get_xtal_index
-**
-** Description: Return Xtal index and frequency
-**
-** Returns:     tNFC_HAL_XTAL_INDEX
-**
-*******************************************************************************/
-tNFC_HAL_XTAL_INDEX nfc_hal_dm_get_xtal_index(uint32_t brcm_hw_id,
-                                              uint16_t* p_xtal_freq) {
-  uint8_t xx;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_get_xtal_index() brcm_hw_id:0x%x", brcm_hw_id);
-
-  for (xx = 0; xx < nfc_post_reset_cb.dev_init_config.num_xtal_cfg; xx++) {
-    if ((brcm_hw_id & BRCM_NFC_GEN_MASK) ==
-        nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].brcm_hw_id) {
-      *p_xtal_freq = nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_freq;
-      return (nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_index);
-    }
-  }
-
-  /* if not found */
-  *p_xtal_freq = 0;
-  return (NFC_HAL_XTAL_INDEX_MAX);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_xtal_freq_index
-**
-** Description      Set crystal frequency index
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_set_xtal_freq_index(void) {
-  uint8_t nci_brcm_xtal_index_cmd[NCI_MSG_HDR_SIZE +
-                                  NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX];
-  uint8_t* p;
-  tNFC_HAL_XTAL_INDEX xtal_index;
-  uint16_t xtal_freq;
-  uint8_t cmd_len = NCI_PROP_PARAM_SIZE_XTAL_INDEX;
-  extern uint8_t* p_nfc_hal_dm_xtal_params_cfg;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_set_xtal_freq_index (): brcm_hw_id = 0x%x",
-                   nfc_hal_cb.dev_cb.brcm_hw_id);
-
-  xtal_index =
-      nfc_hal_dm_get_xtal_index(nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq);
-  if ((xtal_index == NFC_HAL_XTAL_INDEX_SPECIAL) &&
-      (p_nfc_hal_dm_xtal_params_cfg)) {
-    cmd_len +=
-        p_nfc_hal_dm_xtal_params_cfg[0]; /* [0] is the length of extra params */
-  }
-
-  p = nci_brcm_xtal_index_cmd;
-  UINT8_TO_STREAM(p, (NCI_MTS_CMD | NCI_GID_PROP));
-  UINT8_TO_STREAM(p, NCI_MSG_GET_XTAL_INDEX_FROM_DH);
-  UINT8_TO_STREAM(p, cmd_len);
-  UINT8_TO_STREAM(p, xtal_index);
-  UINT16_TO_STREAM(p, xtal_freq);
-  if (cmd_len > NCI_PROP_PARAM_SIZE_XTAL_INDEX) {
-    memcpy(p, &p_nfc_hal_dm_xtal_params_cfg[1],
-           p_nfc_hal_dm_xtal_params_cfg[0]);
-  }
-
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_XTAL_SET);
-
-  nfc_hal_dm_send_nci_cmd(nci_brcm_xtal_index_cmd, NCI_MSG_HDR_SIZE + cmd_len,
-                          NULL);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_power_level_zero
-**
-** Description      set power level to 0
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_dm_set_power_level_zero(void) {
-  uint8_t
-      nci_brcm_set_pwr_level_cmd[NCI_MSG_HDR_SIZE + NCI_PARAM_LEN_POWER_LEVEL];
-  uint8_t* p;
-  uint8_t cmd_len = NCI_PARAM_LEN_POWER_LEVEL;
-
-  p = nci_brcm_set_pwr_level_cmd;
-  UINT8_TO_STREAM(p, (NCI_MTS_CMD | NCI_GID_PROP));
-  UINT8_TO_STREAM(p, NCI_MSG_POWER_LEVEL);
-  UINT8_TO_STREAM(p, NCI_PARAM_LEN_POWER_LEVEL);
-  memset(p, 0, NCI_PARAM_LEN_POWER_LEVEL);
-
-  nfc_hal_dm_send_nci_cmd(nci_brcm_set_pwr_level_cmd,
-                          NCI_MSG_HDR_SIZE + cmd_len,
-                          nfc_hal_main_exit_op_done);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_send_get_build_info_cmd
-**
-** Description      Send NCI_MSG_GET_BUILD_INFO CMD
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_send_get_build_info_cmd(void) {
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_BUILD_INFO);
-
-  /* get build information to find out HW */
-  nfc_hal_dm_send_nci_cmd(nfc_hal_dm_get_build_info_cmd, NCI_MSG_HDR_SIZE,
-                          NULL);
-}
-/*******************************************************************************
-**
-** Function:    nfc_hal_dm_adjust_hw_id
-**
-** Description: The hw_id of certain chips are shifted by 8 bits.
-**              Adjust the hw_id before processing.
-**
-** Returns:     Nothing
-**
-*******************************************************************************/
-static uint32_t nfc_hal_dm_adjust_hw_id(uint32_t hw_id) {
-  if ((hw_id & 0xF0000000) == 0)
-    hw_id <<= 4; /* shift hw_id by 4 bits to align w the format of most chips */
-  return hw_id;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_check_xtal
-**
-** Description      check if need to send xtal command.
-**                  If not, proceed to next step get_patch_version.
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_dm_check_xtal(void) {
-  uint16_t xtal_freq;
-  tNFC_HAL_XTAL_INDEX xtal_index;
-
-  /* if NFCC needs to set Xtal frequency before getting patch version */
-  xtal_index =
-      nfc_hal_dm_get_xtal_index(nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq);
-  if ((xtal_index < NFC_HAL_XTAL_INDEX_MAX) ||
-      (xtal_index == NFC_HAL_XTAL_INDEX_SPECIAL)) {
-    {
-      /* set Xtal index before getting patch version */
-      nfc_hal_dm_set_xtal_freq_index();
-      return;
-    }
-  }
-
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PATCH_INFO);
-
-  nfc_hal_dm_send_nci_cmd(nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE,
-                          NULL);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_pre_set_mem_cback
-**
-** Description      This is pre-set mem complete callback.
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_dm_pre_set_mem_cback(tNFC_HAL_BTVSC_CPLT* pData) {
-  uint8_t status = pData->p_param_buf[0];
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_pre_set_mem_cback: %d", status);
-  /* if it is completed */
-  if (status == HCI_SUCCESS) {
-    if (!nfc_hal_dm_check_pre_set_mem()) {
-      return;
-    }
-  }
-  nfc_hal_dm_check_xtal();
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_check_pre_set_mem
-**
-** Description      Check if need to send the command.
-**
-** Returns          TRUE if done.
-**
-*******************************************************************************/
-bool nfc_hal_dm_check_pre_set_mem(void) {
-  uint8_t cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_PRE_SET_MEM_LENGTH];
-  uint8_t* p;
-  uint32_t addr = 0;
-
-  if (p_nfc_hal_dm_pre_set_mem)
-    addr = p_nfc_hal_dm_pre_set_mem[nfc_hal_cb.pre_set_mem_idx].addr;
-  HAL_TRACE_DEBUG2("nfc_hal_dm_check_pre_set_mem: %d/0x%x",
-                   nfc_hal_cb.pre_set_mem_idx, addr);
-  if (addr == 0) {
-    return true;
-  }
-  p = cmd;
-
-  /* Add the command */
-  UINT16_TO_STREAM(p, HCI_BRCM_PRE_SET_MEM);
-  UINT8_TO_STREAM(p, HCI_BRCM_PRE_SET_MEM_LENGTH);
-
-  UINT8_TO_STREAM(p, HCI_BRCM_PRE_SET_MEM_TYPE);
-  UINT32_TO_STREAM(p, addr);
-  UINT8_TO_STREAM(p, 0);
-  UINT32_TO_STREAM(p,
-                   p_nfc_hal_dm_pre_set_mem[nfc_hal_cb.pre_set_mem_idx].data);
-  nfc_hal_cb.pre_set_mem_idx++;
-
-  nfc_hal_dm_send_bt_cmd(
-      cmd, NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_PRE_SET_MEM_LENGTH,
-      nfc_hal_dm_pre_set_mem_cback);
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_got_vs_rsp
-**
-** Description      Received VS RSP. Clean up control block to allow next NCI
-*cmd
-**
-** Returns          void
-**
-*******************************************************************************/
-tNFC_HAL_NCI_CBACK* nfc_hal_dm_got_vs_rsp(void) {
-  tNFC_HAL_NCI_CBACK* p_cback = NULL;
-  nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
-  p_cback = (tNFC_HAL_NCI_CBACK*)nfc_hal_cb.ncit_cb.p_vsc_cback;
-  nfc_hal_cb.ncit_cb.p_vsc_cback = NULL;
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-  return p_cback;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_proc_msg_during_init
-**
-** Description      Process NCI message while initializing NFCC
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_proc_msg_during_init(NFC_HDR* p_msg) {
-  uint8_t* p;
-  uint8_t reset_reason, reset_type;
-  uint8_t mt, pbf, gid, op_code;
-  uint8_t *p_old, old_gid, old_oid, old_mt;
-  uint8_t u8;
-  tNFC_HAL_NCI_CBACK* p_cback = NULL;
-  uint8_t chipverlen;
-  uint8_t chipverstr[NCI_SPD_HEADER_CHIPVER_LEN];
-  uint32_t hw_id = 0;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_proc_msg_during_init(): init state:%d",
-                   nfc_hal_cb.dev_cb.initializing_state);
-
-  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-
-  NCI_MSG_PRS_HDR0(p, mt, pbf, gid);
-  NCI_MSG_PRS_HDR1(p, op_code);
-
-  /* check if waiting for this response */
-  if ((nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD) ||
-      (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC)) {
-    if (mt == NCI_MT_RSP) {
-      p_old = nfc_hal_cb.ncit_cb.last_hdr;
-      NCI_MSG_PRS_HDR0(p_old, old_mt, pbf, old_gid);
-      old_oid = ((*p_old) & NCI_OID_MASK);
-      /* make sure this is the RSP we are waiting for before updating the
-       * command window */
-      if ((old_gid == gid) && (old_oid == op_code)) {
-        nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
-        p_cback = (tNFC_HAL_NCI_CBACK*)nfc_hal_cb.ncit_cb.p_vsc_cback;
-        nfc_hal_cb.ncit_cb.p_vsc_cback = NULL;
-        nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-      }
-    }
-  }
-
-  if (gid == NCI_GID_CORE) {
-    if (op_code == NCI_MSG_CORE_RESET) {
-      if (mt == NCI_MT_NTF) {
-        if ((nfc_hal_cb.dev_cb.initializing_state ==
-             NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) ||
-            (nfc_hal_cb.dev_cb.initializing_state ==
-             NFC_HAL_INIT_STATE_POST_XTAL_SET)) {
-          /*
-          ** Core reset ntf in the following cases;
-          ** 1) after power up (raising REG_PU)
-          ** 2) after setting xtal index
-          ** Start pre-initializing NFCC
-          */
-          nfc_hal_main_stop_quick_timer(&nfc_hal_cb.timer);
-          nfc_hal_dm_pre_init_nfcc();
-        } else {
-          /* Core reset ntf after post-patch download, Call reset notification
-           * callback */
-          p++; /* Skip over param len */
-          STREAM_TO_UINT8(reset_reason, p);
-          STREAM_TO_UINT8(reset_type, p);
-          nfc_hal_prm_spd_reset_ntf(reset_reason, reset_type);
-        }
-      }
-    } else if (p_cback) {
-      (*p_cback)((tNFC_HAL_NCI_EVT)(op_code), p_msg->len,
-                 (uint8_t*)(p_msg + 1) + p_msg->offset);
-    }
-  } else if (gid == NCI_GID_PROP) /* this is for download patch */
-  {
-    if (mt == NCI_MT_NTF)
-      op_code |= NCI_NTF_BIT;
-    else
-      op_code |= NCI_RSP_BIT;
-
-    if (nfc_hal_cb.dev_cb.initializing_state ==
-        NFC_HAL_INIT_STATE_W4_XTAL_SET) {
-      if (op_code == (NCI_RSP_BIT | NCI_MSG_GET_XTAL_INDEX_FROM_DH)) {
-        /* start timer in case that NFCC doesn't send RESET NTF after loading
-         * patch from NVM */
-        NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_POST_XTAL_SET);
-
-        nfc_hal_main_start_quick_timer(
-            &nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE,
-            ((p_nfc_hal_cfg->nfc_hal_post_xtal_timeout) *
-             QUICK_TIMER_TICKS_PER_SEC) /
-                1000);
-      }
-    } else if ((op_code == NFC_VS_GET_BUILD_INFO_EVT) &&
-               (nfc_hal_cb.dev_cb.initializing_state ==
-                NFC_HAL_INIT_STATE_W4_BUILD_INFO)) {
-      p += NCI_BUILD_INFO_OFFSET_HWID;
-
-      STREAM_TO_UINT32(hw_id, p);
-      nfc_hal_cb.dev_cb.brcm_hw_id = nfc_hal_dm_adjust_hw_id(hw_id);
-      HAL_TRACE_DEBUG2("brcm_hw_id: 0x%x -> 0x%x", hw_id,
-                       nfc_hal_cb.dev_cb.brcm_hw_id);
-
-      STREAM_TO_UINT8(chipverlen, p);
-      memset(chipverstr, 0, NCI_SPD_HEADER_CHIPVER_LEN);
-
-      STREAM_TO_ARRAY(chipverstr, p, chipverlen);
-
-      /* If chip is not 20791 and 43341, set flag to send the "Disable" VSC */
-      if (((nfc_hal_cb.dev_cb.brcm_hw_id & BRCM_NFC_GEN_MASK) !=
-           BRCM_NFC_20791_GEN) &&
-          ((nfc_hal_cb.dev_cb.brcm_hw_id & BRCM_NFC_GEN_MASK) !=
-           BRCM_NFC_43341_GEN)) {
-        nfc_hal_cb.hal_flags |= NFC_HAL_FLAGS_NEED_DISABLE_VSC;
-      }
-
-      nfc_hal_hci_handle_build_info(chipverlen, chipverstr);
-      nfc_hal_cb.pre_set_mem_idx = 0;
-      if (!nfc_hal_dm_check_pre_set_mem()) {
-        /* pre-set mem started */
-        return;
-      }
-      nfc_hal_dm_check_xtal();
-    } else if ((op_code == NFC_VS_GET_PATCH_VERSION_EVT) &&
-               (nfc_hal_cb.dev_cb.initializing_state ==
-                NFC_HAL_INIT_STATE_W4_PATCH_INFO)) {
-      /* Store NVM info to control block */
-
-      /* Skip over rsp len */
-      p++;
-
-      /* Get project id */
-      STREAM_TO_UINT16(nfc_hal_cb.nvm_cb.project_id, p);
-
-      /* RFU */
-      p++;
-
-      /* Get chip version string */
-      STREAM_TO_UINT8(u8, p);
-      if (u8 > NFC_HAL_PRM_MAX_CHIP_VER_LEN) u8 = NFC_HAL_PRM_MAX_CHIP_VER_LEN;
-      memcpy(nfc_hal_cb.nvm_cb.chip_ver, p, u8);
-      p += NCI_PATCH_INFO_VERSION_LEN;
-
-      /* Get major/minor version */
-      STREAM_TO_UINT16(nfc_hal_cb.nvm_cb.ver_major, p);
-      STREAM_TO_UINT16(nfc_hal_cb.nvm_cb.ver_minor, p);
-
-      /* Skip over max_size and patch_max_size */
-      p += 4;
-
-      /* Get current lpm patch size */
-      STREAM_TO_UINT16(nfc_hal_cb.nvm_cb.lpm_size, p);
-      STREAM_TO_UINT16(nfc_hal_cb.nvm_cb.fpm_size, p);
-
-      /* clear all flags which may be set during previous initialization */
-      nfc_hal_cb.nvm_cb.flags = 0;
-
-      /* Set patch present flag */
-      if ((nfc_hal_cb.nvm_cb.fpm_size) || (nfc_hal_cb.nvm_cb.lpm_size))
-        nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_PATCH_PRESENT;
-
-      /* LPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is
-       * present in nvm) */
-      STREAM_TO_UINT8(u8, p);
-      if (u8) {
-        /* LPM patch in NVM fails CRC check */
-        nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_LPM_BAD;
-      }
-
-      /* FPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is
-       * present in nvm) */
-      STREAM_TO_UINT8(u8, p);
-      if (u8) {
-        /* FPM patch in NVM fails CRC check */
-        nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_FPM_BAD;
-      }
-
-      /* Check if downloading patch to RAM only (no NVM) */
-      STREAM_TO_UINT8(nfc_hal_cb.nvm_cb.nvm_type, p);
-      if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE) {
-        nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_NO_NVM;
-      }
-
-      /* let platform update baudrate or download patch */
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_APP_COMPLETE);
-      nfc_hal_post_reset_init(nfc_hal_cb.dev_cb.brcm_hw_id,
-                              nfc_hal_cb.nvm_cb.nvm_type);
-    } else if (p_cback) {
-      (*p_cback)((tNFC_HAL_NCI_EVT)(op_code), p_msg->len,
-                 (uint8_t*)(p_msg + 1) + p_msg->offset);
-    } else if (op_code == NFC_VS_SEC_PATCH_AUTH_EVT) {
-      HAL_TRACE_DEBUG0("signature!!");
-      nfc_hal_prm_nci_command_complete_cback(
-          (tNFC_HAL_NCI_EVT)(op_code), p_msg->len,
-          (uint8_t*)(p_msg + 1) + p_msg->offset);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_proc_msg_during_exit
-**
-** Description      Process NCI message while shutting down NFCC
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_proc_msg_during_exit(NFC_HDR* p_msg) {
-  uint8_t* p;
-  uint8_t mt, pbf, gid, op_code;
-  uint8_t *p_old, old_gid, old_oid, old_mt;
-  uint8_t u8;
-  tNFC_HAL_NCI_CBACK* p_cback = NULL;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_proc_msg_during_exit(): state:%d",
-                   nfc_hal_cb.dev_cb.initializing_state);
-
-  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-
-  NCI_MSG_PRS_HDR0(p, mt, pbf, gid);
-  NCI_MSG_PRS_HDR1(p, op_code);
-  u8 = *p;
-
-  /* check if waiting for this response */
-  if ((nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD) ||
-      (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC)) {
-    if (mt == NCI_MT_RSP) {
-      p_old = nfc_hal_cb.ncit_cb.last_hdr;
-      NCI_MSG_PRS_HDR0(p_old, old_mt, pbf, old_gid);
-      old_oid = ((*p_old) & NCI_OID_MASK);
-      /* make sure this is the RSP we are waiting for before updating the
-       * command window */
-      if ((old_gid == gid) && (old_oid == op_code)) {
-        p_cback = nfc_hal_dm_got_vs_rsp();
-        if (p_cback) {
-          if (gid == NCI_GID_PROP) {
-            if (mt == NCI_MT_NTF)
-              op_code |= NCI_NTF_BIT;
-            else
-              op_code |= NCI_RSP_BIT;
-
-            if (op_code == NFC_VS_POWER_LEVEL_RSP) {
-              (*p_cback)((tNFC_HAL_NCI_EVT)(op_code), p_msg->len,
-                         (uint8_t*)(p_msg + 1) + p_msg->offset);
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_send_nci_cmd
-**
-** Description      Send NCI command to NFCC while initializing BRCM NFCC
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_send_nci_cmd(const uint8_t* p_data, uint16_t len,
-                             tNFC_HAL_NCI_CBACK* p_cback) {
-  NFC_HDR* p_buf;
-  uint8_t* ps;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_send_nci_cmd (): nci_wait_rsp = 0x%x",
-                   nfc_hal_cb.ncit_cb.nci_wait_rsp);
-
-  if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) {
-    HAL_TRACE_ERROR0("nfc_hal_dm_send_nci_cmd(): no command window");
-    return;
-  }
-
-  p_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_buf != NULL) {
-    nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_VSC;
-
-    p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
-    p_buf->event = NFC_HAL_EVT_TO_NFC_NCI;
-    p_buf->len = len;
-
-    memcpy((uint8_t*)(p_buf + 1) + p_buf->offset, p_data, len);
-
-    /* Keep a copy of the command and send to NCI transport */
-
-    /* save the message header to double check the response */
-    ps = (uint8_t*)(p_buf + 1) + p_buf->offset;
-    memcpy(nfc_hal_cb.ncit_cb.last_hdr, ps, NFC_HAL_SAVED_HDR_SIZE);
-    memcpy(nfc_hal_cb.ncit_cb.last_cmd, ps + NCI_MSG_HDR_SIZE,
-           NFC_HAL_SAVED_CMD_SIZE);
-
-    /* save the callback for NCI VSCs */
-    nfc_hal_cb.ncit_cb.p_vsc_cback = (void*)p_cback;
-
-    nfc_hal_nci_send_cmd(p_buf);
-
-    /* start NFC command-timeout timer */
-    nfc_hal_main_start_quick_timer(
-        &nfc_hal_cb.ncit_cb.nci_wait_rsp_timer,
-        (uint16_t)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
-        ((uint32_t)NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_send_pend_cmd
-**
-** Description      Send a command to NFCC
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_send_pend_cmd(void) {
-  NFC_HDR* p_buf = nfc_hal_cb.ncit_cb.p_pend_cmd;
-  uint8_t* p;
-
-  if (p_buf == NULL) return;
-
-  /* check low power mode state */
-  if (!nfc_hal_dm_power_mode_execute(NFC_HAL_LP_TX_DATA_EVT)) {
-    return;
-  }
-
-  if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP) {
-#if (NFC_HAL_TRACE_PROTOCOL == TRUE)
-    DispHciCmd(p_buf);
-#endif
-
-    /* save the message header to double check the response */
-    p = (uint8_t*)(p_buf + 1) + p_buf->offset;
-    memcpy(nfc_hal_cb.ncit_cb.last_hdr, p, NFC_HAL_SAVED_HDR_SIZE);
-
-    /* add packet type for BT message */
-    p_buf->offset--;
-    p_buf->len++;
-
-    p = (uint8_t*)(p_buf + 1) + p_buf->offset;
-    *p = HCIT_TYPE_COMMAND;
-
-    USERIAL_Write(USERIAL_NFC_PORT, p, p_buf->len);
-
-    GKI_freebuf(p_buf);
-    nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
-
-    /* start NFC command-timeout timer */
-    nfc_hal_main_start_quick_timer(
-        &nfc_hal_cb.ncit_cb.nci_wait_rsp_timer,
-        (uint16_t)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
-        ((uint32_t)NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_send_bt_cmd
-**
-** Description      Send BT message to NFCC while initializing BRCM NFCC
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_send_bt_cmd(const uint8_t* p_data, uint16_t len,
-                            tNFC_HAL_BTVSC_CPLT_CBACK* p_cback) {
-  NFC_HDR* p_buf;
-  char buff[300];
-  char tmp[4];
-  buff[0] = 0;
-  int i;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_send_bt_cmd (): nci_wait_rsp = 0x%x",
-                   nfc_hal_cb.ncit_cb.nci_wait_rsp);
-
-  for (i = 0; i < len; i++) {
-    sprintf(tmp, "%02x ", p_data[i]);
-    strcat(buff, tmp);
-  }
-  HAL_TRACE_DEBUG2("nfc_hal_dm_send_bt_cmd (): HCI Write (%d bytes): %s", len,
-                   buff);
-
-  if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) {
-    HAL_TRACE_ERROR0("nfc_hal_dm_send_bt_cmd(): no command window");
-    return;
-  }
-
-  p_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_buf != NULL) {
-    nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_PROP;
-
-    p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
-    p_buf->len = len;
-
-    memcpy((uint8_t*)(p_buf + 1) + p_buf->offset, p_data, len);
-
-    /* save the callback for NCI VSCs)  */
-    nfc_hal_cb.ncit_cb.p_vsc_cback = (void*)p_cback;
-
-    nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf;
-    if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE) {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_CONTROL_DONE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_REQUEST_CONTROL_EVT, HAL_NFC_STATUS_OK);
-      return;
-    }
-
-    nfc_hal_dm_send_pend_cmd();
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_nfc_wake
-**
-** Description      Set NFC_WAKE line
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_set_nfc_wake(uint8_t cmd) {
-  HAL_TRACE_DEBUG1("nfc_hal_dm_set_nfc_wake () %s",
-                   (cmd == NFC_HAL_ASSERT_NFC_WAKE ? "ASSERT" : "DEASSERT"));
-
-  /*
-  **  nfc_wake_active_mode             cmd              result of voltage on
-  *NFC_WAKE
-  **
-  **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_ASSERT_NFC_WAKE (0)    pull down
-  *NFC_WAKE (GND)
-  **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_DEASSERT_NFC_WAKE (1)  pull up
-  *NFC_WAKE (VCC)
-  **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_ASSERT_NFC_WAKE (0)    pull up
-  *NFC_WAKE (VCC)
-  **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_DEASSERT_NFC_WAKE (1)  pull down
-  *NFC_WAKE (GND)
-  */
-
-  if (cmd == nfc_hal_cb.dev_cb.nfc_wake_active_mode)
-    UPIO_Set(UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO,
-             UPIO_OFF); /* pull down NFC_WAKE */
-  else
-    UPIO_Set(UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO,
-             UPIO_ON); /* pull up NFC_WAKE */
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_power_mode_execute
-**
-** Description      If snooze mode is enabled in full power mode,
-**                     Assert NFC_WAKE before sending data
-**                     Deassert NFC_WAKE when idle timer expires
-**
-** Returns          TRUE if DH can send data to NFCC
-**
-*******************************************************************************/
-bool nfc_hal_dm_power_mode_execute(tNFC_HAL_LP_EVT event) {
-  bool send_to_nfcc = false;
-
-  HAL_TRACE_DEBUG1("nfc_hal_dm_power_mode_execute () event = %d", event);
-
-  if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) {
-    if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) {
-      /* if any transport activity */
-      if ((event == NFC_HAL_LP_TX_DATA_EVT) ||
-          (event == NFC_HAL_LP_RX_DATA_EVT)) {
-        /* if idle timer is not running */
-        if (nfc_hal_cb.dev_cb.lp_timer.in_use == false) {
-          nfc_hal_dm_set_nfc_wake(NFC_HAL_ASSERT_NFC_WAKE);
-        }
-
-        /* start or extend idle timer */
-        nfc_hal_main_start_quick_timer(&nfc_hal_cb.dev_cb.lp_timer, 0x00,
-                                       ((uint32_t)NFC_HAL_LP_IDLE_TIMEOUT) *
-                                           QUICK_TIMER_TICKS_PER_SEC / 1000);
-      } else if (event == NFC_HAL_LP_TIMEOUT_EVT) {
-        /* let NFCC go to snooze mode */
-        nfc_hal_dm_set_nfc_wake(NFC_HAL_DEASSERT_NFC_WAKE);
-      }
-    }
-
-    send_to_nfcc = true;
-  }
-
-  return (send_to_nfcc);
-}
-
-/*******************************************************************************
-**
-** Function         nci_brcm_lp_timeout_cback
-**
-** Description      callback function for low power timeout
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nci_brcm_lp_timeout_cback(void* p_tle) {
-  HAL_TRACE_DEBUG0("nci_brcm_lp_timeout_cback ()");
-
-  nfc_hal_dm_power_mode_execute(NFC_HAL_LP_TIMEOUT_EVT);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_pre_init_nfcc
-**
-** Description      This function initializes Broadcom specific control blocks
-*for
-**                  NCI transport
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_pre_init_nfcc(void) {
-  HAL_TRACE_DEBUG0("nfc_hal_dm_pre_init_nfcc ()");
-
-  /* if it was waiting for core reset notification after raising REG_PU */
-  if (nfc_hal_cb.dev_cb.initializing_state ==
-      NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) {
-    nfc_hal_dm_send_get_build_info_cmd();
-  }
-  /* if it was waiting for core reset notification after setting Xtal */
-  else if (nfc_hal_cb.dev_cb.initializing_state ==
-           NFC_HAL_INIT_STATE_POST_XTAL_SET) {
-    {
-      /* Core reset ntf after xtal setting indicating NFCC loaded patch from NVM
-       */
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PATCH_INFO);
-
-      nfc_hal_dm_send_nci_cmd(nfc_hal_dm_get_patch_version_cmd,
-                              NCI_MSG_HDR_SIZE, NULL);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_shutting_down_nfcc
-**
-** Description      This function initializes Broadcom specific control blocks
-*for
-**                  NCI transport
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_shutting_down_nfcc(void) {
-  HAL_TRACE_DEBUG0("nfc_hal_dm_shutting_down_nfcc ()");
-
-  nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_CLOSING;
-
-  /* reset low power mode variables */
-  if ((nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) &&
-      (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)) {
-    nfc_hal_dm_set_nfc_wake(NFC_HAL_ASSERT_NFC_WAKE);
-  }
-
-  nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
-
-  nfc_hal_cb.dev_cb.power_mode = NFC_HAL_POWER_MODE_FULL;
-  nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE;
-
-  /* Stop all timers */
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.dev_cb.lp_timer);
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.prm.timer);
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  nfc_hal_cb.hci_cb.hcp_conn_id = 0;
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.hci_cb.hci_timer);
-#endif
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.timer);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_init
-**
-** Description      This function initializes Broadcom specific control blocks
-*for
-**                  NCI transport
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_dm_init(void) {
-  HAL_TRACE_DEBUG0("nfc_hal_dm_init ()");
-
-  nfc_hal_cb.dev_cb.lp_timer.p_cback = nci_brcm_lp_timeout_cback;
-
-  nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback;
-#endif
-
-  nfc_hal_cb.pre_discover_done = false;
-
-  nfc_post_reset_cb.spd_nvm_detection_cur_count = 0;
-  nfc_post_reset_cb.spd_skip_on_power_cycle = false;
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcDevInitDone
-**
-** Description      Notify that pre-initialization of NFCC is complete
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcPreInitDone(tHAL_NFC_STATUS status) {
-  HAL_TRACE_DEBUG1("HAL_NfcPreInitDone () status=%d", status);
-
-  if (nfc_hal_cb.dev_cb.initializing_state ==
-      NFC_HAL_INIT_STATE_W4_APP_COMPLETE) {
-    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-
-    nfc_hal_main_pre_init_done(status);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcReInit
-**
-** Description      This function is called to restart initialization after
-*REG_PU
-**                  toggled because of failure to detect NVM type or download
-*patchram.
-**
-** Note             This function should be called only during the HAL init
-*process
-**
-** Returns          HAL_NFC_STATUS_OK if successfully initiated
-**                  HAL_NFC_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcReInit(void) {
-  tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
-
-  HAL_TRACE_DEBUG1("HAL_NfcReInit () init st=0x%x",
-                   nfc_hal_cb.dev_cb.initializing_state);
-  if (nfc_hal_cb.dev_cb.initializing_state ==
-      NFC_HAL_INIT_STATE_W4_APP_COMPLETE) {
-    {
-      /* Wait for NFCC to enable - Core reset notification */
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_NFCC_ENABLE);
-
-      /* NFCC Enable timeout */
-      nfc_hal_main_start_quick_timer(
-          &nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE,
-          ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout) *
-           QUICK_TIMER_TICKS_PER_SEC) /
-              1000);
-    }
-
-    status = HAL_NFC_STATUS_OK;
-  }
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_dm_set_snooze_mode_cback
-**
-** Description      This is snooze update complete callback.
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_dm_set_snooze_mode_cback(tNFC_HAL_BTVSC_CPLT* pData) {
-  uint8_t status = pData->p_param_buf[0];
-  tHAL_NFC_STATUS hal_status;
-  tHAL_NFC_STATUS_CBACK* p_cback;
-
-  /* if it is completed */
-  if (status == HCI_SUCCESS) {
-    /* update snooze mode */
-    nfc_hal_cb.dev_cb.snooze_mode = nfc_hal_cb.dev_cb.new_snooze_mode;
-
-    nfc_hal_dm_set_nfc_wake(NFC_HAL_ASSERT_NFC_WAKE);
-
-    if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) {
-      /* start idle timer */
-      nfc_hal_main_start_quick_timer(&nfc_hal_cb.dev_cb.lp_timer, 0x00,
-                                     ((uint32_t)NFC_HAL_LP_IDLE_TIMEOUT) *
-                                         QUICK_TIMER_TICKS_PER_SEC / 1000);
-    } else {
-      nfc_hal_main_stop_quick_timer(&nfc_hal_cb.dev_cb.lp_timer);
-    }
-    hal_status = HAL_NFC_STATUS_OK;
-  } else {
-    hal_status = HAL_NFC_STATUS_FAILED;
-  }
-
-  if (nfc_hal_cb.dev_cb.p_prop_cback) {
-    p_cback = nfc_hal_cb.dev_cb.p_prop_cback;
-    nfc_hal_cb.dev_cb.p_prop_cback = NULL;
-    (*p_cback)(hal_status);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetSnoozeMode
-**
-** Description      Set snooze mode
-**                  snooze_mode
-**                      NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled
-**                      NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART
-**                      NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C
-**
-**                  idle_threshold_dh/idle_threshold_nfcc
-**                      Idle Threshold Host in 100ms unit
-**
-**                  nfc_wake_active_mode/dh_wake_active_mode
-**                      NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting
-**                      NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is
-*asserting
-**
-**                  p_snooze_cback
-**                      Notify status of operation
-**
-** Returns          tHAL_NFC_STATUS
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcSetSnoozeMode(uint8_t snooze_mode,
-                                     uint8_t idle_threshold_dh,
-                                     uint8_t idle_threshold_nfcc,
-                                     uint8_t nfc_wake_active_mode,
-                                     uint8_t dh_wake_active_mode,
-                                     tHAL_NFC_STATUS_CBACK* p_snooze_cback) {
-  uint8_t cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH];
-  uint8_t* p;
-
-  HAL_TRACE_API1("HAL_NfcSetSnoozeMode (): snooze_mode = %d", snooze_mode);
-
-  nfc_hal_cb.dev_cb.new_snooze_mode = snooze_mode;
-  nfc_hal_cb.dev_cb.nfc_wake_active_mode = nfc_wake_active_mode;
-  nfc_hal_cb.dev_cb.p_prop_cback = p_snooze_cback;
-
-  p = cmd;
-
-  /* Add the HCI command */
-  UINT16_TO_STREAM(p, HCI_BRCM_WRITE_SLEEP_MODE);
-  UINT8_TO_STREAM(p, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
-
-  memset(p, 0x00, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
-
-  UINT8_TO_STREAM(p, snooze_mode); /* Sleep Mode               */
-
-  UINT8_TO_STREAM(p, idle_threshold_dh);    /* Idle Threshold Host      */
-  UINT8_TO_STREAM(p, idle_threshold_nfcc);  /* Idle Threshold HC        */
-  UINT8_TO_STREAM(p, nfc_wake_active_mode); /* BT Wake Active Mode      */
-  UINT8_TO_STREAM(p, dh_wake_active_mode);  /* Host Wake Active Mode    */
-
-  nfc_hal_dm_send_bt_cmd(
-      cmd, NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH,
-      nfc_hal_dm_set_snooze_mode_cback);
-  return (NCI_STATUS_OK);
-}
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c
deleted file mode 100644
index 0363f26..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This file contains compile-time configurable constants for BRCM HAL
- *  modules
- *
- ******************************************************************************/
-#include "nci_defs.h"
-#include "nfc_brcm_defs.h"
-#include "nfc_hal_int.h"
-
-/* the SetConfig at start up*/
-uint8_t nfc_hal_start_up_cfg[] = {
-    /* TLV len */ 31,
-    /* B0 */ NCI_PARAM_ID_EMVCO_ENABLE,
-    /* B1 */ 1,
-    /* B2 */
-    1, /* (1 = enable emvco mode, 0 = disable emvco mode) Default = 0.*/
-    /* B3 */ NCI_PARAM_ID_CONTINUE_MODE, /* NFCC will restart discovery
-                                            after deactivated */
-    /* B4 */ 1,
-    /* B5 */ 1, /* (1 = enable, 0 = disable) Default = 0.*/
-    /* B6 */ NCI_PARAM_ID_RFU_CONFIG,
-    /* B7 */ 0x14,
-    /* B8 */ 0x00,
-    /* B9 */ 0x00,
-    /* B10*/ 0x00,
-    /* B11*/ 0x00,
-    /* B12*/ 0x0E,
-    /* B13*/ 0xE8,
-    /* B14*/ 0xF0,
-    /* B15*/ 0x55,
-    /* B16*/ 0x00,
-    /* B17*/ 0x0F, /* CE3 SO delay in sec */
-    /* B18*/ 0x00,
-    /* B19*/ 0x00,
-    /* B20*/ 0x00,
-    /* B21*/ 0x00,
-    /* B22*/ 0x00,
-    /* B23*/ 0x00,
-    /* B24*/ 0x00,
-    /* B25*/ 0x00,
-    /* B26*/ 0x00,
-    /* B27*/ 0x00,
-    /* B28*/ NCI_PARAM_ID_ACT_ORDER, /* polling sequence */
-    /* B29*/ 1,
-    /* B30*/ 1, /* (1 = active mode polling before passive, 0 = passive
-                   polling first) Default = 0.*/
-};
-
-uint8_t* p_nfc_hal_dm_start_up_cfg = (uint8_t*)nfc_hal_start_up_cfg;
-
-/* the VSCs at start up:
- * The VSCs are specified in TLV format similar to nfa_start_up_cfg[]
- * first byte is the TLV total len.
- * B0 is the first T; i.e. the opcode for the VSC
- * B1 is the len of the VSC parameters/payload
- * */
-uint8_t nfc_hal_dm_start_up_vsc_cfg[] = {
-    /* TLV len */ 5,
-    /* B0 */ NCI_MTS_CMD | NCI_GID_PROP,
-    /* B1 */ NCI_MSG_FRAME_LOG,
-    /* B2 */ 2,
-    /* B3 */ 0, /* 1 to enable RF frames */
-    /* B4 */ 1  /* 1 to enable SWP frames */
-};
-
-uint8_t* p_nfc_hal_dm_start_up_vsc_cfg = NULL;
-
-/* the SetConfig at HAL_NfcPreDiscover. This is done once after HAL_NfcOpen */
-uint8_t nfc_hal_pre_discover_cfg[] = {
-    /* TLV len */ 0x0A,
-    /* B0 */ NCI_PARAM_ID_SWPCFG,
-    /* B1 */ 0x08,
-    /* B2 */ 0x01,
-    /* B3 */ 0x08,
-    /* B4 */ 0x00,
-    /* B5 */ 0x04,
-    /* B6 */ 0x80,
-    /* B7 */ 0xC3,
-    /* B8 */ 0xC9,
-    /* B9 */ 0x01};
-
-uint8_t* p_nfc_hal_pre_discover_cfg = NULL;
-
-/* LPTD parameters (LowPowerTagDetection)
- * This is typical values for 20791B2
- * The timing and threshold parameters used for a customer handset/hardware may
- * vary
- * depending on antenna and should be verified during a customer testing phase.
- * the data fields without comments are too complicated. Please see ""
- * */
-const uint8_t nfc_hal_dm_lptd_cfg[] = {
-    21,                        /* total TLV length excluding itself */
-    NCI_PARAM_ID_TAGSNIFF_CFG, /* type */
-    19,                        /* length */
-    0x01,                      /* B0 enable: 0/disable, 1/enable*/
-    0x02, /* B1 poll count: number of full power poll before starting lptd
-             poll */
-    0xFF, /* B2 sniff count lsb: number of lptd poll before switching to
-             full power poll */
-    0xFF, /* B3 sniff count msb */
-    0x80, /* B4 threshold: Bigger thresholds give a smaller LPTD range but
-             more immunity to false detections. Smaller thresholds increase
-             LPTD range at the cost of greater likelihood of false
-             detections. */
-    0x40, /* B5 delay lsb: delay (us) to sampling power */
-    0x00, /* B6 delay msb */
-    0x40, /* B7 carrier threshold lsb */
-    0x00, /* B8 carrier threshold msb */
-    0x80, /* B9 mode: Bitwise variable used to enable various algorithm
-             modes.*/
-    0x80, /* B10 0-offset lsb */
-    0x00, /* B11 0-offset msb */
-    0x10, /* B12 field sense time lsb */
-    0x00, /* B13 field sense time msb */
-    0x00, /* B14 false detect threshold lsb: 0x00 to disable LPTD NTF. The
-             number of false tag detections to resport LPTD NTF. */
-    0x00, /* B15 false detect threshold msb. A false tag detect - full poll
-             results in no tag being detected.*/
-    0x75, /* B16 mode1; Bitwise variable used to enable various algorithm
-             modes. */
-    0x0D, /* B17 lptd ant cfg rx */
-    0x30, /* B18 lptd rdr cfg ve */
-};
-
-uint8_t* p_nfc_hal_dm_lptd_cfg = (uint8_t*)&nfc_hal_dm_lptd_cfg[0];
-
-/*
-** NFCC has a table which has 9 XTAL frequencies: 9.6, 13, 16.2,  19.2, 24, 26,
-*38.4, 52 and 37.4 in MHz.
-** For these 9 xtal frequencies, host doesn't need to configure PLL325.
-** For 43341, host doesn't need to configure it at all.
-*/
-uint8_t* p_nfc_hal_dm_pll_325_cfg = NULL;
-
-/*
-** Proprietary pre-set is required, if not NULL.
-*/
-tNFC_HAL_DM_PRE_SET_MEM* p_nfc_hal_dm_pre_set_mem = NULL;
-
-tNFC_HAL_CFG nfc_hal_cfg = {
-    false, /* set nfc_hal_prm_nvm_required to TRUE, if the platform wants to
-              abort PRM process without NVM */
-    (uint16_t)NFC_HAL_NFCC_ENABLE_TIMEOUT, /* max time to wait for RESET NTF
-                                         *after setting REG_PU to high
-                                         ** If NFCC doesn't have NVM or cannot
-                                         *load patch from NVM without Xtal
-                                         *setting
-                                         ** then set it to short to optimize
-                                         *bootup time because NFCC cannot send
-                                         *RESET NTF.
-                                         ** Otherwise, it depends on NVM type
-                                         *and size of patchram.
-                                         */
-    (uint16_t)NFC_HAL_NFCC_ENABLE_TIMEOUT  /* max time to wait for RESET NTF
-                                         *after setting Xtal frequency
-                                         ** It depends on NVM type and size of
-                                         *patchram.
-                                         */
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-    ,
-    true, /* set nfc_hal_first_boot to TRUE, if platform enables NFC for the
-             first time after bootup */
-    (HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST |
-     HAL_NFC_HCI_UICC2_HOST) /* Set bit(s) for supported UICC(s) */
-#endif
-};
-
-tNFC_HAL_CFG* p_nfc_hal_cfg = (tNFC_HAL_CFG*)&nfc_hal_cfg;
-
-const uint8_t nfc_hal_dm_xtal_params_cfg[] = {
-    8,    /* length */
-    0x00, /* B0 Rfpll_cfg_pll_xtal_div_2                  */
-    0x00, /* B1 Rfpll_cfg_pll_vcocal1_0_cal_ref_timeout   */
-    0x00, /* B2 Rfpll_cfg_pll_vcocal2_cal_count           */
-    0x00, /* B3 Rfpll_cfg_pll_vcocal3_cal_count           */
-    0x00, /* B4 Rfpll_cfg_pll_dsm_b_msb_wild_base         */
-    0x00, /* B5 Rfpll_cfg_pll_dsm_b_lsb_3_wild_base_3     */
-    0x00, /* B6 Rfpll_cfg_pll_dsm_b_lsb_2_wild_base_2     */
-    0x00  /* B7 Rfpll_cfg_pll_dsm_b_lsb_1_wild_base_1     */
-};
-
-/* By default, the XTAL command does not need these extra params. */
-uint8_t* p_nfc_hal_dm_xtal_params_cfg = NULL;
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c
deleted file mode 100644
index 1033327..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c
+++ /dev/null
@@ -1,851 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Vendor-specific handler for HCI events
- *
- ******************************************************************************/
-#include "gki.h"
-#include "nfc_hal_api.h"
-#include "nfc_hal_int.h"
-#include "nfc_hal_target.h"
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-#include "nfc_hal_nv_ci.h"
-#include "nfc_hal_nv_co.h"
-
-#include <string.h>
-
-#ifndef NFC_HAL_HCI_NV_READ_TIMEOUT
-#define NFC_HAL_HCI_NV_READ_TIMEOUT 1000
-#endif
-
-#ifndef NFC_HAL_HCI_NFCC_RSP_TIMEOUT
-#define NFC_HAL_HCI_NFCC_RSP_TIMEOUT 3000
-#endif
-
-#define NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET 0x0C
-#define NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET 0x32
-#define NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET 0x7F
-#define NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET 0xB4
-
-#define NFC_HAL_HCI_PIPE_VALID_MASK 0x80
-
-#define NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL 0xFF
-#define NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL 0xFE
-
-/* Version string for BCM20791B3 */
-const uint8_t NFC_HAL_DM_BCM20791B3_STR[] = "20791B3";
-#define NFC_HAL_DM_BCM20791B3_STR_LEN (sizeof(NFC_HAL_DM_BCM20791B3_STR) - 1)
-
-/* Version string for BCM20791B4 */
-const uint8_t NFC_HAL_DM_BCM20791B4_STR[] = "20791B4";
-#define NFC_HAL_DM_BCM20791B4_STR_LEN (sizeof(NFC_HAL_DM_BCM20791B4_STR) - 1)
-
-/* Version string for BCM43341B0 */
-const uint8_t NFC_HAL_DM_BCM43341B0_STR[] = "43341B0";
-#define NFC_HAL_DM_BCM43341B0_STR_LEN (sizeof(NFC_HAL_DM_BCM43341B0_STR) - 1)
-
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-/****************************************************************************
-** Internal function prototypes
-****************************************************************************/
-static void nfc_hal_hci_set_next_hci_netwk_config(uint8_t block);
-static void nfc_hal_hci_remove_dyn_pipe_to_uicc1(void);
-static void nfc_hal_hci_handle_nv_read(uint8_t block, tHAL_NFC_STATUS status,
-                                       uint16_t size);
-static void nfc_hal_hci_init_complete(tHAL_NFC_STATUS status);
-static void nfc_hal_hci_vsc_cback(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                                  uint8_t* p_data);
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_evt_hdlr
-**
-** Description      Processing event for NFA HCI
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_evt_hdlr(tNFC_HAL_HCI_EVENT_DATA* p_evt_data) {
-  HAL_TRACE_DEBUG0("nfc_hal_hci_evt_hdlr ()");
-
-  switch (p_evt_data->hdr.event) {
-    case NFC_HAL_HCI_RSP_NV_READ_EVT:
-      if ((nfc_hal_cb.hci_cb.p_hci_netwk_info_buf &&
-           (p_evt_data->nv_read.block == HC_F3_NV_BLOCK ||
-            p_evt_data->nv_read.block == HC_F4_NV_BLOCK ||
-            p_evt_data->nv_read.block == HC_F5_NV_BLOCK)) ||
-          (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf &&
-           p_evt_data->nv_read.block == HC_F2_NV_BLOCK)) {
-        nfc_hal_hci_handle_nv_read(p_evt_data->nv_read.block,
-                                   p_evt_data->nv_read.status,
-                                   p_evt_data->nv_read.size);
-      } else {
-        /* Invalid block or no buffer, Ignore */
-        HAL_TRACE_ERROR1(
-            "nfc_hal_hci_evt_hdlr: No buffer for handling read NV block: "
-            "0x%02x",
-            p_evt_data->nv_read.block);
-      }
-      break;
-
-    case NFC_HAL_HCI_RSP_NV_WRITE_EVT:
-      /* NV Ram write completed - nothing to do... */
-      break;
-
-    default:
-      break;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_enable
-**
-** Description      Program nv data on to controller
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_hci_enable(void) {
-  uint8_t* p_hci_netwk_cmd;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_enable ()");
-
-  if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE) {
-    HAL_TRACE_DEBUG1(
-        "nfc_hal_hci_enable (): No HCI NETWK CMD to send for NVM Type: 0x%02x",
-        nfc_hal_cb.nvm_cb.nvm_type);
-    nfc_hal_hci_init_complete(HAL_NFC_STATUS_OK);
-    return;
-  }
-
-  if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf) {
-    p_hci_netwk_cmd = (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf -
-                                 NCI_MSG_HDR_SIZE);
-    GKI_freebuf(p_hci_netwk_cmd);
-    nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL;
-  }
-
-  if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) {
-    p_hci_netwk_cmd =
-        (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE);
-    GKI_freebuf(p_hci_netwk_cmd);
-    nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL;
-  }
-
-  if ((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST) ||
-      ((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) &&
-       ((!nfc_hal_cb.hci_cb.hci_fw_workaround) ||
-        (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))) ||
-      (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST)) {
-    p_hci_netwk_cmd =
-        (uint8_t*)GKI_getbuf(NCI_MSG_HDR_SIZE + NFC_HAL_HCI_NETWK_INFO_SIZE);
-    if (p_hci_netwk_cmd == NULL) {
-      HAL_TRACE_ERROR0(
-          "nfc_hal_hci_enable: unable to allocate buffer for reading hci "
-          "network info from nvram");
-      nfc_hal_hci_init_complete(HAL_NFC_STATUS_FAILED);
-    } else {
-      nfc_hal_cb.hci_cb.p_hci_netwk_info_buf =
-          (uint8_t*)(p_hci_netwk_cmd + NCI_MSG_HDR_SIZE);
-      nfc_hal_cb.hci_cb.hci_netwk_config_block = 0;
-      if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST) {
-        memset(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0,
-               NFC_HAL_HCI_NETWK_INFO_SIZE);
-        nfc_hal_nv_co_read((uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_info_buf,
-                           NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F3_NV_BLOCK);
-        nfc_hal_main_start_quick_timer(&nfc_hal_cb.hci_cb.hci_timer,
-                                       NFC_HAL_HCI_VSC_TIMEOUT_EVT,
-                                       NFC_HAL_HCI_NV_READ_TIMEOUT);
-      } else {
-        HAL_TRACE_DEBUG1(
-            "nfc_hal_hci_enable (): Skip send F3 HCI NETWK CMD for UICC Mask: "
-            "0x%02x",
-            p_nfc_hal_cfg->nfc_hal_hci_uicc_support);
-        nfc_hal_hci_set_next_hci_netwk_config(HC_F3_NV_BLOCK);
-      }
-    }
-  } else {
-    HAL_TRACE_DEBUG2(
-        "nfc_hal_hci_enable (): No HCI NETWK CMD to send for UICC Mask: 0x%02x "
-        "& NVM Type: 0x%02x",
-        p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
-    nfc_hal_hci_set_next_hci_netwk_config(HC_F2_NV_BLOCK);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_handle_build_info
-**
-** Description      handle build info evt
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_hci_handle_build_info(uint8_t chipverlen, uint8_t* p_chipverstr) {
-  HAL_TRACE_DEBUG0("nfc_hal_hci_handle_build_info ()");
-
-  if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) &&
-      (memcmp(NFC_HAL_DM_BCM20791B3_STR, p_chipverstr,
-              NFC_HAL_DM_BCM20791B3_STR_LEN) == 0)) {
-    /* BCM2079B3 FW - eSE restarted for patch download */
-    nfc_hal_cb.hci_cb.hci_fw_workaround = true;
-    nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = true;
-  } else if (((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) &&
-              (memcmp(NFC_HAL_DM_BCM20791B4_STR, p_chipverstr,
-                      NFC_HAL_DM_BCM20791B4_STR_LEN) == 0)) ||
-             ((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) &&
-              (memcmp(NFC_HAL_DM_BCM43341B0_STR, p_chipverstr,
-                      NFC_HAL_DM_BCM43341B0_STR_LEN) == 0))) {
-    /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */
-    nfc_hal_cb.hci_cb.hci_fw_workaround = true;
-    nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = false;
-  } else {
-    /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */
-    nfc_hal_cb.hci_cb.hci_fw_workaround = false;
-    nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = false;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_handle_hci_netwk_info
-**
-** Description      Handler function for HCI Network Notification
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_handle_hci_netwk_info(uint8_t* p_data) {
-  uint8_t* p = p_data;
-  uint16_t data_len;
-  uint8_t target_handle = 0;
-  uint8_t hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN];
-  uint8_t block = 0;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_handle_hci_netwk_info ()");
-
-  /* skip NCI header byte0 (MT,GID), byte1 (OID) */
-  p += 2;
-
-  STREAM_TO_UINT8(data_len, p);
-  target_handle = *(uint8_t*)p;
-
-  if (target_handle == NFC_HAL_HCI_DH_TARGET_HANDLE) {
-    /* Correct the session id assigned by DH */
-    *(p + 1) = nfc_hal_cb.hci_cb.dh_session_id[0];
-    nfc_hal_nv_co_write(p, data_len, HC_F2_NV_BLOCK);
-    return;
-  }
-
-  if (target_handle == NFC_HAL_HCI_UICC0_TARGET_HANDLE) {
-    block = HC_F3_NV_BLOCK;
-  } else if (target_handle == NFC_HAL_HCI_UICC1_TARGET_HANDLE) {
-    block = HC_F4_NV_BLOCK;
-  } else if (target_handle == NFC_HAL_HCI_UICC2_TARGET_HANDLE) {
-    block = HC_F5_NV_BLOCK;
-  } else {
-    HAL_TRACE_DEBUG1(
-        "nfc_hal_hci_handle_hci_netwk_info(): Invalid Target handle: 0x%02x",
-        target_handle);
-    return;
-  }
-
-  if ((!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd) ||
-      (p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] &
-       NFC_HAL_HCI_PIPE_VALID_MASK) ||
-      (p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] &
-       NFC_HAL_HCI_PIPE_VALID_MASK) ||
-      (p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] &
-       NFC_HAL_HCI_PIPE_VALID_MASK) ||
-      (p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] &
-       NFC_HAL_HCI_PIPE_VALID_MASK)) {
-    /* HCI Network notification received for UICC0/UICC1/UICC2, Update nv data
-     */
-    nfc_hal_nv_co_write(p, data_len, block);
-  } else {
-    HAL_TRACE_DEBUG1(
-        "nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, "
-        "Reset nv file: 0x%02x",
-        p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]);
-    hci_netwk_cmd[0] = target_handle;
-    memset(&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN);
-    nfc_hal_nv_co_write(hci_netwk_cmd, 1, block);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh
-**
-** Description      Fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh(void) {
-  NFC_HDR* p_msg;
-  uint8_t *p, *ps;
-
-  HAL_TRACE_DEBUG1(
-      "nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (): Fake "
-      "ADM_NOTIFY_ALL_PIPE_CLEARED (0x%02x) from HAL",
-      NFC_HAL_HCI_HOST_ID_UICC1);
-
-  /* Start of new message. Allocate a buffer for message */
-  p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_msg != NULL) {
-    /* Initialize NFC_HDR */
-    p_msg->len = NCI_DATA_HDR_SIZE + 0x03;
-    p_msg->event = 0;
-    p_msg->offset = 0;
-    p_msg->layer_specific = 0;
-
-    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    ps = p;
-    NCI_DATA_BLD_HDR(p, nfc_hal_cb.hci_cb.hcp_conn_id, 0x03);
-    /* HCP header with ADMIN pipe id and chaining bit set */
-    *p++ = ((1 << 0x07) | (NFC_HAL_HCI_ADMIN_PIPE & 0x7F));
-    /* HCP Message header with Command type instruction and
-     * ADM_NOTIFY_ALL_PIPE_CLEARED command */
-    *p++ = ((NFC_HAL_HCI_COMMAND_TYPE << 6) |
-            (NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED & 0x3F));
-    /* HCP Data with UICC1 host id */
-    *p = NFC_HAL_HCI_HOST_ID_UICC1;
-
-#ifdef DISP_NCI
-    DISP_NCI(ps, (uint16_t)p_msg->len, true);
-#endif
-    nfc_hal_send_nci_msg_to_nfc_task(p_msg);
-
-  } else {
-    HAL_TRACE_ERROR0(
-        "Unable to allocate buffer for faking ADM_NOTIFY_ALL_PIPE_CLEARED cmd "
-        "from HAL to stack");
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_handle_hcp_pkt_to_hc
-**
-** Description      Handle HCP Packet from NFC task to Host Controller
-**
-** Returns          FALSE to send the packet to host controller
-**                  TRUE to drop the packet and fake credit ntf for hcp
-*connection
-**
-*******************************************************************************/
-bool nfc_hal_hci_handle_hcp_pkt_to_hc(uint8_t* p_data) {
-  uint8_t chaining_bit;
-  uint8_t pipe;
-  uint8_t type;
-  uint8_t inst;
-  uint8_t index;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_handle_hcp_pkt_to_hc ()");
-
-  chaining_bit = ((*p_data) >> 0x07) & 0x01;
-  pipe = (*p_data++) & 0x7F;
-
-  if ((chaining_bit) && (pipe == NFC_HAL_HCI_ADMIN_PIPE)) {
-    type = ((*p_data) >> 0x06) & 0x03;
-
-    if (type == NFC_HAL_HCI_COMMAND_TYPE) {
-      inst = (*p_data++ & 0x3F);
-      if (inst == NFC_HAL_HCI_ANY_GET_PARAMETER) {
-        index = *(p_data++);
-        if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) {
-          /* Set flag to modify session id[0] on response
-           * from host controller to set session id cmd
-           */
-          nfc_hal_cb.hci_cb.update_session_id = true;
-        }
-      } else if (inst == NFC_HAL_HCI_ANY_SET_PARAMETER) {
-        index = *(p_data++);
-        if (index == NFC_HAL_HCI_WHITELIST_INDEX) {
-          if ((nfc_hal_cb.hci_cb.hci_fw_workaround) &&
-              (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)) {
-            /* Set flag to fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task
-             * after
-             * response from host controller to set whitelist cmd
-             */
-            nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = true;
-          }
-        } else if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) {
-          nfc_hal_cb.hci_cb.dh_session_id[0] = *p_data;
-          if (p_nfc_hal_cfg->nfc_hal_first_boot)
-            *p_data = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL;
-          else
-            *p_data = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL;
-        }
-      }
-    } else if (type == NFC_HAL_HCI_RESPONSE_TYPE) {
-      if ((nfc_hal_cb.hci_cb.hci_fw_workaround) &&
-          (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC) &&
-          (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1)) {
-        /* Got response to the fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd sent by HAL
-         * to nfc task */
-        nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = false;
-        /* return TRUE to drop this hcp without forwarding to host controller */
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_handle_hcp_pkt_from_hc
-**
-** Description      Handle HCP Packet from Host controller to Terminal Host
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_handle_hcp_pkt_from_hc(uint8_t* p_data) {
-  uint8_t chaining_bit;
-  uint8_t pipe;
-  uint8_t type;
-  uint8_t inst;
-  uint8_t hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN];
-  uint8_t source_host;
-  uint8_t block = 0;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_handle_hcp_pkt_from_hc ()");
-
-  chaining_bit = ((*p_data) >> 0x07) & 0x01;
-  pipe = (*p_data++) & 0x7F;
-
-  if ((chaining_bit) && (pipe == NFC_HAL_HCI_ADMIN_PIPE)) {
-    type = ((*p_data) >> 0x06) & 0x03;
-
-    if (type == NFC_HAL_HCI_COMMAND_TYPE) {
-      if (!nfc_hal_cb.hci_cb.hci_fw_workaround) return;
-
-      inst = (*p_data++ & 0x3F);
-
-      if (inst == NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED) {
-        STREAM_TO_UINT8(source_host, p_data);
-
-        HAL_TRACE_DEBUG1(
-            "nfc_hal_hci_handle_hcp_pkt_from_hc (): Received "
-            "ADM_NOTIFY_ALL_PIPE_CLEARED command for UICC: 0x%02x",
-            source_host);
-        if (source_host == NFC_HAL_HCI_HOST_ID_UICC0) {
-          block = HC_F3_NV_BLOCK;
-          hci_netwk_cmd[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE;
-        } else if (source_host == NFC_HAL_HCI_HOST_ID_UICC1) {
-          block = HC_F4_NV_BLOCK;
-          hci_netwk_cmd[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE;
-        } else if (source_host == NFC_HAL_HCI_HOST_ID_UICC2) {
-          block = HC_F5_NV_BLOCK;
-          hci_netwk_cmd[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE;
-        }
-
-        if (source_host >= NFC_HAL_HCI_HOST_ID_UICC0) {
-          /* Reset Session ID */
-          memset(&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN);
-          nfc_hal_nv_co_write(hci_netwk_cmd, 1, block);
-          HAL_TRACE_DEBUG1(
-              "nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv "
-              "file for block: 0x%02x",
-              block);
-        }
-      }
-    } else if (type == NFC_HAL_HCI_RESPONSE_TYPE) {
-      if (nfc_hal_cb.hci_cb.update_session_id) {
-        nfc_hal_cb.hci_cb.update_session_id = false;
-        inst = (*p_data++ & 0x3F);
-        if (inst == NFC_HAL_HCI_ANY_OK) {
-          /* Correct the session id assigned by DH */
-          *p_data = nfc_hal_cb.hci_cb.dh_session_id[0];
-        }
-      } else if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) {
-        /* NVM Type is UICC and got response from host controller
-         * to Set whitelist command. Now fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to
-         * NFC Task and then forward the whitelist cmd response
-         */
-        nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh();
-      }
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_handle_nv_read
-**
-** Description      handler function for nv read complete event
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_handle_nv_read(uint8_t block, tHAL_NFC_STATUS status,
-                                uint16_t size) {
-  uint8_t* p;
-  uint8_t* p_hci_netwk_info = NULL;
-
-  HAL_TRACE_DEBUG3(
-      "nfc_hal_hci_handle_nv_read (): Block: [0x%02x], Status: [0x%02x], Size: "
-      "[0x%04x]",
-      block, status, size);
-
-  /* Stop timer as NVDATA Read Completed */
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.hci_cb.hci_timer);
-
-  switch (block) {
-    case HC_F3_NV_BLOCK:
-    case HC_F4_NV_BLOCK:
-    case HC_F5_NV_BLOCK:
-      if ((status != HAL_NFC_STATUS_OK) ||
-          (size > NFC_HAL_HCI_NETWK_INFO_SIZE) ||
-          (size < NFC_HAL_HCI_MIN_NETWK_INFO_SIZE) ||
-          ((nfc_hal_cb.hci_cb.hci_fw_workaround) && (block == HC_F4_NV_BLOCK) &&
-           (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC))) {
-        HAL_TRACE_DEBUG1(
-            "nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set "
-            "DEFAULT Configuration for block:0x%02x",
-            block);
-        memset(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0,
-               NFC_HAL_HCI_NETWK_INFO_SIZE);
-        if (block == HC_F3_NV_BLOCK)
-          nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] =
-              NFC_HAL_HCI_UICC0_TARGET_HANDLE;
-        else if (block == HC_F4_NV_BLOCK)
-          nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] =
-              NFC_HAL_HCI_UICC1_TARGET_HANDLE;
-        else
-          nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] =
-              NFC_HAL_HCI_UICC2_TARGET_HANDLE;
-
-        memset(&nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[1], 0xFF,
-               NFC_HAL_HCI_SESSION_ID_LEN);
-        size = NFC_HAL_HCI_NETWK_INFO_SIZE;
-      }
-
-      p_hci_netwk_info =
-          (uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE;
-      break;
-
-    case HC_F2_NV_BLOCK:
-      nfc_hal_cb.hci_cb.dh_session_id[0] =
-          nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1];
-      if (p_nfc_hal_cfg->nfc_hal_first_boot)
-        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] =
-            NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL;
-      else
-        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] =
-            NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL;
-
-      if ((status != HAL_NFC_STATUS_OK) ||
-          (size > NFC_HAL_HCI_DH_NETWK_INFO_SIZE) ||
-          (size < NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE)) {
-        HAL_TRACE_DEBUG1(
-            "nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set "
-            "DEFAULT Configuration for block:0x%02x",
-            block);
-        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[0] =
-            NFC_HAL_HCI_DH_TARGET_HANDLE;
-        nfc_hal_cb.hci_cb.dh_session_id[0] = 0xFF;
-        memset(&nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[2], 0xFF,
-               (NFC_HAL_HCI_SESSION_ID_LEN - 1));
-        memset((nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf +
-                NFC_HAL_HCI_SESSION_ID_LEN + 1),
-               0, (NFC_HAL_HCI_DH_NETWK_INFO_SIZE - NFC_HAL_HCI_SESSION_ID_LEN -
-                   1));
-        size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE;
-        p_hci_netwk_info = (uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf -
-                           NCI_MSG_HDR_SIZE;
-      } else {
-        if ((nfc_hal_cb.hci_cb.hci_fw_workaround) &&
-            (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)) {
-          /* if NVM Type is UICC, then UICC1 will find session id mismatch when
-           * activated for patch download,
-           * and will remove pipes connected to DH even before DH is enabled, So
-           * DH will update NFCC
-           * control block by removing all dynamic pipes connected to UICC1 */
-
-          nfc_hal_hci_remove_dyn_pipe_to_uicc1();
-          size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE;
-        }
-        p_hci_netwk_info =
-            (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf -
-                       NCI_MSG_HDR_SIZE);
-      }
-      break;
-
-    default:
-      return;
-  }
-
-  p = p_hci_netwk_info;
-  /* Send HCI Network ntf command using nv data */
-  NCI_MSG_BLD_HDR0(p, NCI_MT_CMD, NCI_GID_PROP);
-  NCI_MSG_BLD_HDR1(p, NCI_MSG_HCI_NETWK);
-  UINT8_TO_STREAM(p, (uint8_t)size);
-
-  nfc_hal_dm_send_nci_cmd(p_hci_netwk_info, (uint16_t)(NCI_MSG_HDR_SIZE + size),
-                          nfc_hal_hci_vsc_cback);
-
-  nfc_hal_cb.hci_cb.hci_netwk_config_block = block;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_remove_dyn_pipe_to_uicc1
-**
-** Description      Prepare hci network command read from nv file removing
-**                  all pipes connected to UICC1
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_remove_dyn_pipe_to_uicc1(void) {
-  uint8_t *p, *np;
-  uint8_t num_dyn_pipes = 0, new_num_dyn_pipes = 0;
-  uint8_t xx;
-  uint8_t source_host, dest_host, pipe_id;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_remove_dyn_pipe_to_uicc1 ()");
-
-  p = (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf +
-                 NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE);
-  np = p;
-  num_dyn_pipes = *(p - 1);
-
-  for (xx = 0; xx < num_dyn_pipes; xx++, p += NFC_HAL_HCI_PIPE_INFO_SIZE) {
-    source_host = *(uint8_t*)(p);
-    dest_host = *(uint8_t*)(p + 1);
-    pipe_id = *(uint8_t*)(p + 4);
-
-    if ((source_host != NFC_HAL_HCI_HOST_ID_UICC1) &&
-        (dest_host != NFC_HAL_HCI_HOST_ID_UICC1)) {
-      memcpy(np, p, NFC_HAL_HCI_PIPE_INFO_SIZE);
-      np += NFC_HAL_HCI_PIPE_INFO_SIZE;
-      new_num_dyn_pipes++;
-    }
-  }
-
-  memset((uint8_t*)(np), 0,
-         NFC_HAL_HCI_PIPE_INFO_SIZE * (20 - new_num_dyn_pipes));
-
-  /* Update number of pipes after removing pipes connected to UICC1 */
-  p = (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf +
-                 NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE);
-  *(p - 1) = new_num_dyn_pipes;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_init_complete
-**
-** Description      Notify VSC initialization is complete
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_init_complete(tHAL_NFC_STATUS status) {
-  uint8_t* p_hci_netwk_cmd;
-
-  HAL_TRACE_DEBUG1("nfc_hal_hci_init_complete (): Status: [0x%02x]", status);
-
-  if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf) {
-    p_hci_netwk_cmd = (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf -
-                                 NCI_MSG_HDR_SIZE);
-    GKI_freebuf(p_hci_netwk_cmd);
-    nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL;
-  }
-
-  if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) {
-    p_hci_netwk_cmd =
-        (uint8_t*)(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE);
-    GKI_freebuf(p_hci_netwk_cmd);
-    nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL;
-  }
-
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-
-  nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT, status);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_set_next_hci_netwk_config
-**
-** Description      set next hci network configuration
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_hci_set_next_hci_netwk_config(uint8_t block) {
-  uint8_t* p_hci_netwk_cmd;
-
-  HAL_TRACE_DEBUG1("nfc_hal_hci_set_next_hci_netwk_config (): Block: [0x%02x]",
-                   block);
-
-  switch (block) {
-    case HC_F3_NV_BLOCK:
-      if ((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) &&
-          (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) &&
-          ((!nfc_hal_cb.hci_cb.hci_fw_workaround) ||
-           (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))) {
-        /* Send command to read nvram data for 0xF4 */
-        memset(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0,
-               NFC_HAL_HCI_NETWK_INFO_SIZE);
-        nfc_hal_nv_co_read((uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_info_buf,
-                           NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F4_NV_BLOCK);
-        nfc_hal_main_start_quick_timer(&nfc_hal_cb.hci_cb.hci_timer,
-                                       NFC_HAL_HCI_VSC_TIMEOUT_EVT,
-                                       NFC_HAL_HCI_NV_READ_TIMEOUT);
-        break;
-      }
-      HAL_TRACE_DEBUG2(
-          "nfc_hal_hci_set_next_hci_netwk_config (): Skip send F4 HCI NETWK "
-          "CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x",
-          p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
-
-    case HC_F4_NV_BLOCK:
-      if ((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST) &&
-          (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf)) {
-        /* Send command to read nvram data for 0xF5 */
-        memset(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0,
-               NFC_HAL_HCI_NETWK_INFO_SIZE);
-        nfc_hal_nv_co_read((uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_info_buf,
-                           NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F5_NV_BLOCK);
-        nfc_hal_main_start_quick_timer(&nfc_hal_cb.hci_cb.hci_timer,
-                                       NFC_HAL_HCI_VSC_TIMEOUT_EVT,
-                                       NFC_HAL_HCI_NV_READ_TIMEOUT);
-        break;
-      }
-      HAL_TRACE_DEBUG2(
-          "nfc_hal_hci_set_next_hci_netwk_config (): Skip send F5 HCI NETWK "
-          "CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x",
-          p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
-
-    case HC_F5_NV_BLOCK:
-      p_hci_netwk_cmd = (uint8_t*)GKI_getbuf(NCI_MSG_HDR_SIZE +
-                                             NFC_HAL_HCI_DH_NETWK_INFO_SIZE);
-      if (p_hci_netwk_cmd == NULL) {
-        HAL_TRACE_ERROR0(
-            "nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer "
-            "for reading hci network info from nvram");
-        nfc_hal_hci_init_complete(HAL_NFC_STATUS_FAILED);
-      } else {
-        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf =
-            (uint8_t*)(p_hci_netwk_cmd + NCI_MSG_HDR_SIZE);
-        /* Send command to read nvram data for 0xF2 */
-        memset(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, 0,
-               NFC_HAL_HCI_DH_NETWK_INFO_SIZE);
-        nfc_hal_nv_co_read((uint8_t*)nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf,
-                           NFC_HAL_HCI_DH_NETWK_INFO_SIZE, HC_F2_NV_BLOCK);
-        nfc_hal_main_start_quick_timer(&nfc_hal_cb.hci_cb.hci_timer,
-                                       NFC_HAL_HCI_VSC_TIMEOUT_EVT,
-                                       NFC_HAL_HCI_NV_READ_TIMEOUT);
-      }
-      break;
-
-    case HC_F2_NV_BLOCK:
-      nfc_hal_hci_init_complete(HAL_NFC_STATUS_OK);
-      break;
-
-    default:
-      HAL_TRACE_ERROR1(
-          "nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer to "
-          "send VSC 0x%02x",
-          block);
-      /* Brcm initialization failed */
-      nfc_hal_hci_init_complete(HAL_NFC_STATUS_FAILED);
-      break;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_hci_vsc_cback
-**
-** Description      process VS callback event from stack
-**
-** Returns          none
-**
-*******************************************************************************/
-static void nfc_hal_hci_vsc_cback(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                                  uint8_t* p_data) {
-  uint8_t* p_ret = NULL;
-  uint8_t status;
-
-  p_ret = p_data + NCI_MSG_HDR_SIZE;
-  status = *p_ret;
-
-  HAL_TRACE_DEBUG3(
-      "nfc_hal_hci_vsc_cback (): Event: [0x%02x], Data length: [0x%04x], "
-      "Status: [0x%02x]",
-      event, data_len, status);
-
-  if (event != NFC_VS_HCI_NETWK_RSP) return;
-
-  if (status != HAL_NFC_STATUS_OK) {
-    nfc_hal_hci_init_complete(HAL_NFC_STATUS_FAILED);
-    return;
-  }
-
-  switch (nfc_hal_cb.hci_cb.hci_netwk_config_block) {
-    case HC_F3_NV_BLOCK:
-    case HC_F4_NV_BLOCK:
-    case HC_F5_NV_BLOCK:
-    case HC_F2_NV_BLOCK:
-      nfc_hal_hci_set_next_hci_netwk_config(
-          nfc_hal_cb.hci_cb.hci_netwk_config_block);
-      break;
-
-    default:
-      /* Ignore the event */
-      break;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_cmd_timeout_cback
-**
-** Description      callback function for timeout
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_hci_timeout_cback(void* p_tle) {
-  TIMER_LIST_ENT* p_tlent = (TIMER_LIST_ENT*)p_tle;
-
-  HAL_TRACE_DEBUG0("nfc_hal_hci_timeout_cback ()");
-
-  if (p_tlent->event == NFC_HAL_HCI_VSC_TIMEOUT_EVT) {
-    HAL_TRACE_ERROR0(
-        "nfc_hal_hci_timeout_cback: Timeout - NFC HAL HCI BRCM Initialization "
-        "Failed!");
-    nfc_hal_hci_init_complete(HAL_NFC_STATUS_FAILED);
-  }
-}
-
-#endif
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c
deleted file mode 100644
index 73bf6a5..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2010-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This file contains the call-in functions for NFC HAL HCI
- *
- ******************************************************************************/
-#include <string.h>
-#include "gki.h"
-#include "nfc_hal_api.h"
-#include "nfc_hal_int.h"
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-#include "nfc_hal_nv_ci.h"
-#include "nfc_hal_nv_co.h"
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_ci_read
-**
-** Description      call-in function for non volatile memory read acess
-**
-** Returns          none
-**
-*******************************************************************************/
-void nfc_hal_nv_ci_read(uint16_t num_bytes_read, tNFC_HAL_NV_CO_STATUS status,
-                        uint8_t block) {
-  tNFC_HAL_HCI_EVENT_DATA* p_msg;
-
-  /* Send message to NCIT task */
-  p_msg = (tNFC_HAL_HCI_EVENT_DATA*)GKI_getbuf(sizeof(tNFC_HAL_HCI_EVENT_DATA));
-  if (p_msg != NULL) {
-    p_msg->nv_read.hdr.event = NFC_HAL_HCI_RSP_NV_READ_EVT;
-    p_msg->hdr.offset = 0;
-    p_msg->hdr.len = sizeof(tNFC_HAL_HCI_RSP_NV_READ_EVT);
-    p_msg->hdr.layer_specific = 0;
-
-    if ((status == NFC_HAL_NV_CO_OK) && (num_bytes_read != 0))
-      p_msg->nv_read.status = HAL_NFC_STATUS_OK;
-    else
-      p_msg->nv_read.status = HAL_NFC_STATUS_FAILED;
-
-    p_msg->nv_read.size = num_bytes_read;
-    p_msg->nv_read.block = block;
-
-    GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_ci_write
-**
-** Description      call-in function for non volatile memory write acess
-**
-** Returns          none
-**
-*******************************************************************************/
-void nfc_hal_nv_ci_write(tNFC_HAL_NV_CO_STATUS status) {
-  tNFC_HAL_HCI_EVENT_DATA* p_msg;
-
-  p_msg = (tNFC_HAL_HCI_EVENT_DATA*)GKI_getbuf(sizeof(tNFC_HAL_HCI_EVENT_DATA));
-  if (p_msg != NULL) {
-    p_msg->nv_write.hdr.event = NFC_HAL_HCI_RSP_NV_WRITE_EVT;
-    p_msg->nv_write.hdr.offset = 0;
-    p_msg->nv_write.hdr.len = sizeof(tNFC_HAL_HCI_RSP_NV_READ_EVT);
-    p_msg->nv_write.hdr.layer_specific = 0;
-    p_msg->nv_write.status = HAL_NFC_STATUS_OK;
-
-    GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-  }
-}
-
-#endif
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c b/halimpl/bcm2079x/hal/hal/nfc_hal_main.c
deleted file mode 100644
index 7b4e79b..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c
+++ /dev/null
@@ -1,740 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2010-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Functions for handling NFC HAL NCI Transport events
- *
- ******************************************************************************/
-#include <string.h>
-#include "nfc_hal_int.h"
-#include "nfc_hal_post_reset.h"
-#include "upio.h"
-#include "userial.h"
-
-/****************************************************************************
-** Definitions
-****************************************************************************/
-
-/* Default NFC HAL NCI port configuration  */
-NFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg = {
-    NFC_HAL_SHARED_TRANSPORT_ENABLED, /* bSharedTransport */
-    USERIAL_BAUD_115200,              /* Baud rate */
-    USERIAL_FC_HW                     /* Flow control */
-};
-
-/* Control block for NFC HAL NCI transport */
-tNFC_HAL_CB nfc_hal_cb;
-
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-/****************************************************************************
-** Internal function prototypes
-****************************************************************************/
-static void nfc_hal_main_userial_cback(tUSERIAL_PORT port, tUSERIAL_EVT evt,
-                                       tUSERIAL_EVT_DATA* p_data);
-static void nfc_hal_main_handle_terminate(void);
-static void nfc_hal_main_timeout_cback(void* p_tle);
-
-#if (NFC_HAL_DEBUG == TRUE)
-const char* const nfc_hal_init_state_str[] = {
-    "IDLE",           /* Initialization is done                */
-    "W4_XTAL_SET",    /* Waiting for crystal setting rsp       */
-    "POST_XTAL_SET",  /* Waiting for reset ntf after xtal set  */
-    "W4_NFCC_ENABLE", /* Waiting for reset ntf atter REG_PU up */
-    "W4_BUILD_INFO",  /* Waiting for build info rsp            */
-    "W4_PATCH_INFO",  /* Waiting for patch info rsp            */
-    "W4_APP_COMPL",   /* Waiting for complete from application */
-    "W4_POST_INIT",   /* Waiting for complete of post init     */
-    "W4_CONTROL",     /* Waiting for control release           */
-    "W4_PREDISC",     /* Waiting for complete of prediscover   */
-    "CLOSING"         /* Shutting down                         */
-};
-#endif
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_init
-**
-** Description      This function initializes control block for NFC HAL
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfc_hal_main_init(void) {
-  /* Clear control block */
-  memset(&nfc_hal_cb, 0, sizeof(tNFC_HAL_CB));
-
-  nfc_hal_cb.ncit_cb.nci_ctrl_size = NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE;
-  nfc_hal_cb.trace_level = NFC_HAL_INITIAL_TRACE_LEVEL;
-  nfc_hal_cb.timer.p_cback = nfc_hal_main_timeout_cback;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_open_transport
-**
-** Description      Open transport and prepare for new incoming message;
-**
-** Returns          nothing
-**
-*******************************************************************************/
-static void nfc_hal_main_open_transport(void) {
-  tUSERIAL_OPEN_CFG open_cfg;
-
-  /* Initialize control block */
-  nfc_hal_cb.ncit_cb.rcv_state =
-      NFC_HAL_RCV_IDLE_ST; /* to process packet type */
-
-  if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
-    GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
-    nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
-  }
-
-  /* open transport */
-  open_cfg.fmt =
-      (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1);
-  open_cfg.baud = nfc_hal_trans_cfg.userial_baud;
-  open_cfg.fc = nfc_hal_trans_cfg.userial_fc;
-  open_cfg.buf = USERIAL_BUF_BYTE;
-
-  USERIAL_Open(USERIAL_NFC_PORT, &open_cfg, nfc_hal_main_userial_cback);
-
-  {
-    /* Wait for NFCC to enable - Core reset notification */
-    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_NFCC_ENABLE);
-
-    /* NFCC Enable timeout */
-    nfc_hal_main_start_quick_timer(
-        &nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE,
-        ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout) *
-         QUICK_TIMER_TICKS_PER_SEC) /
-            1000);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_close
-**
-** Description      Check and shutdown NFCC
-**
-** Returns          None
-**
-*******************************************************************************/
-void nfc_hal_main_close(void) {
-  tHAL_NFC_CBACK* p_stack_cback_temp;
-
-  if ((nfc_hal_cb.dev_cb.initializing_state !=
-       NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF) &&
-      (nfc_hal_cb.hal_flags & NFC_HAL_FLAGS_NEED_DISABLE_VSC)) {
-    nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF;
-    nfc_hal_dm_set_power_level_zero();
-  } else {
-    nfc_hal_main_handle_terminate();
-
-    /* Close uart */
-    USERIAL_Close(USERIAL_NFC_PORT);
-
-    if (nfc_hal_cb.p_stack_cback) {
-      p_stack_cback_temp = nfc_hal_cb.p_stack_cback;
-      nfc_hal_cb.p_stack_cback = NULL;
-      p_stack_cback_temp(HAL_NFC_CLOSE_CPLT_EVT, HAL_NFC_STATUS_OK);
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfa_hal_pre_discover_done_cback
-**
-** Description      Pre-discovery CFG is sent.
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfa_hal_pre_discover_done_cback(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                                     uint8_t* p_data) {
-  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-  nfc_hal_cb.p_stack_cback(HAL_NFC_PRE_DISCOVER_CPLT_EVT, HAL_NFC_STATUS_OK);
-}
-
-/*******************************************************************************
-**
-** Function         nfa_hal_send_pre_discover_cfg
-**
-** Description      sending Pre-discovery CFG
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfa_hal_send_pre_discover_cfg(void) {
-  if (nfc_hal_dm_set_config(
-          p_nfc_hal_pre_discover_cfg[0], &p_nfc_hal_pre_discover_cfg[1],
-          nfa_hal_pre_discover_done_cback) != HAL_NFC_STATUS_OK) {
-    nfa_hal_pre_discover_done_cback(0, 0, NULL);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_send_error
-**
-** Description      send an Error event to NFC stack
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfc_hal_main_send_error(tHAL_NFC_STATUS status) {
-  /* Notify stack */
-  nfc_hal_cb.p_stack_cback(HAL_NFC_ERROR_EVT, status);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_userial_cback
-**
-** Description      USERIAL callback for NCI transport
-**
-** Returns          nothing
-**
-*******************************************************************************/
-static void nfc_hal_main_userial_cback(tUSERIAL_PORT port, tUSERIAL_EVT evt,
-                                       tUSERIAL_EVT_DATA* p_data) {
-  if (evt == USERIAL_RX_READY_EVT) {
-    /* Notify transport task of serial port event */
-    GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_DATA_RDY);
-  } else if (evt == USERIAL_TX_DONE_EVT) {
-    /* Serial driver has finshed sending data from USERIAL_Write */
-    /* Currently, no action is needed for this event */
-  } else if (evt == USERIAL_ERR_EVT) {
-    HAL_TRACE_ERROR0(
-        "nfc_hal_main_userial_cback: USERIAL_ERR_EVT. Notifying NFC_TASK of "
-        "transport error");
-    if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) {
-      nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-      nfc_hal_nci_cmd_timeout_cback(
-          (void*)&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-    } else {
-      nfc_hal_main_send_error(HAL_NFC_STATUS_ERR_TRANSPORT);
-    }
-  } else if (evt == USERIAL_WAKEUP_EVT) {
-    HAL_TRACE_DEBUG1("nfc_hal_main_userial_cback: USERIAL_WAKEUP_EVT: %d",
-                     p_data->sigs);
-  } else {
-    HAL_TRACE_DEBUG1("nfc_hal_main_userial_cback: unhandled userial evt: %i",
-                     evt);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_exit_op_done
-**
-** Description      handle completion of HAL exit operation
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfc_hal_main_exit_op_done(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                               uint8_t* p_data) {
-  nfc_hal_main_close();
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_pre_init_done
-**
-** Description      notify complete of pre-initialization
-**
-** Returns          nothing
-**
-*******************************************************************************/
-void nfc_hal_main_pre_init_done(tHAL_NFC_STATUS status) {
-  HAL_TRACE_DEBUG1("nfc_hal_main_pre_init_done () status = %d", status);
-
-  if (status != HAL_NFC_STATUS_OK) {
-    nfc_hal_main_handle_terminate();
-
-    /* Close uart */
-    USERIAL_Close(USERIAL_NFC_PORT);
-  }
-
-  /* Notify NFC Task the status of initialization */
-  nfc_hal_cb.p_stack_cback(HAL_NFC_OPEN_CPLT_EVT, status);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_timeout_cback
-**
-** Description      callback function for timeout
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_main_timeout_cback(void* p_tle) {
-  TIMER_LIST_ENT* p_tlent = (TIMER_LIST_ENT*)p_tle;
-
-  HAL_TRACE_DEBUG0("nfc_hal_main_timeout_cback ()");
-
-  switch (p_tlent->event) {
-    case NFC_HAL_TTYPE_POWER_CYCLE:
-      nfc_hal_main_open_transport();
-      break;
-
-    case NFC_HAL_TTYPE_NFCC_ENABLE:
-      /* NFCC should have enabled now, notify transport openned */
-      nfc_hal_dm_pre_init_nfcc();
-      break;
-
-    default:
-      HAL_TRACE_DEBUG1(
-          "nfc_hal_main_timeout_cback: unhandled timer event (0x%04x)",
-          p_tlent->event);
-      break;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_handle_terminate
-**
-** Description      Handle NFI transport shutdown
-**
-** Returns          nothing
-**
-*******************************************************************************/
-static void nfc_hal_main_handle_terminate(void) {
-  NFC_HDR* p_msg;
-
-  /* dequeue and free buffer */
-  if (nfc_hal_cb.ncit_cb.p_pend_cmd != NULL) {
-    GKI_freebuf(nfc_hal_cb.ncit_cb.p_pend_cmd);
-    nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
-  }
-
-  /* Free unsent nfc rx buffer */
-  if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
-    GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
-    nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
-  }
-
-  /* Free buffer for pending fragmented response/notification */
-  if (nfc_hal_cb.ncit_cb.p_frag_msg) {
-    GKI_freebuf(nfc_hal_cb.ncit_cb.p_frag_msg);
-    nfc_hal_cb.ncit_cb.p_frag_msg = NULL;
-  }
-
-  /* Free buffers in the tx mbox */
-  while ((p_msg = (NFC_HDR*)GKI_read_mbox(NFC_HAL_TASK_MBOX)) != NULL) {
-    GKI_freebuf(p_msg);
-  }
-
-  /* notify closing transport */
-  nfc_hal_dm_shutting_down_nfcc();
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_start_quick_timer
-**
-** Description      Start a timer for the specified amount of time.
-**                  NOTE: The timeout resolution depends on including modules.
-**                  QUICK_TIMER_TICKS_PER_SEC should be used to convert from
-**                  time to ticks.
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_main_start_quick_timer(TIMER_LIST_ENT* p_tle, uint16_t type,
-                                    uint32_t timeout) {
-  NFC_HDR* p_msg;
-
-  /* if timer list is currently empty, start periodic GKI timer */
-  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
-    /* if timer starts on other than NCIT task (script wrapper) */
-    if (GKI_get_taskid() != NFC_HAL_TASK) {
-      /* post event to start timer in NCIT task */
-      p_msg = (NFC_HDR*)GKI_getbuf(NFC_HDR_SIZE);
-      if (p_msg != NULL) {
-        p_msg->event = NFC_HAL_EVT_TO_START_QUICK_TIMER;
-        GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
-      }
-    } else {
-      GKI_start_timer(NFC_HAL_QUICK_TIMER_ID,
-                      ((GKI_SECS_TO_TICKS(1) / QUICK_TIMER_TICKS_PER_SEC)),
-                      true);
-    }
-  }
-
-  GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
-
-  p_tle->event = type;
-  p_tle->ticks = timeout; /* Save the number of ticks for the timer */
-
-  GKI_add_to_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_stop_quick_timer
-**
-** Description      Stop a timer.
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_main_stop_quick_timer(TIMER_LIST_ENT* p_tle) {
-  GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
-
-  /* if timer list is empty stop periodic GKI timer */
-  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
-    GKI_stop_timer(NFC_HAL_QUICK_TIMER_ID);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_process_quick_timer_evt
-**
-** Description      Process quick timer event
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_main_process_quick_timer_evt(void) {
-  TIMER_LIST_ENT* p_tle;
-
-  GKI_update_timer_list(&nfc_hal_cb.quick_timer_queue, 1);
-
-  while ((nfc_hal_cb.quick_timer_queue.p_first) &&
-         (!nfc_hal_cb.quick_timer_queue.p_first->ticks)) {
-    p_tle = nfc_hal_cb.quick_timer_queue.p_first;
-    GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
-
-    if (p_tle->p_cback) {
-      (*p_tle->p_cback)(p_tle);
-    }
-  }
-
-  /* if timer list is empty stop periodic GKI timer */
-  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
-    GKI_stop_timer(NFC_HAL_QUICK_TIMER_ID);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_send_nci_msg_to_nfc_task
-**
-** Description      This function is called to send nci message to nfc task
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_send_nci_msg_to_nfc_task(NFC_HDR* p_msg) {
-#ifdef NFC_HAL_SHARED_GKI
-  /* Using shared NFC/HAL GKI resources - send message buffer directly to
-   * NFC_TASK for processing */
-  p_msg->event = BT_EVT_TO_NFC_NCI;
-  GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
-#else
-  /* Send NCI message to the stack */
-  nfc_hal_cb.p_data_cback(p_msg->len, (uint8_t*)((p_msg + 1) + p_msg->offset));
-  GKI_freebuf(p_msg);
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_send_credit_ntf_for_cid
-**
-** Description      This function is called to send credit ntf
-**                  for the specified connection id to nfc task
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_send_credit_ntf_for_cid(uint8_t cid) {
-  NFC_HDR* p_msg;
-  uint8_t *p, *ps;
-
-  /* Start of new message. Allocate a buffer for message */
-  p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-  if (p_msg != NULL) {
-    /* Initialize NFC_HDR */
-    p_msg->len = NCI_DATA_HDR_SIZE + 0x03;
-    p_msg->event = 0;
-    p_msg->offset = 0;
-    p_msg->layer_specific = 0;
-
-    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    ps = p;
-    NCI_MSG_BLD_HDR0(p, NCI_MT_NTF, NCI_GID_CORE);
-    NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_CONN_CREDITS);
-    UINT8_TO_STREAM(p, 0x03);
-
-    /* Number of credit entries */
-    *p++ = 0x01;
-    /* Connection id of the credit ntf */
-    *p++ = cid;
-    /* Number of credits */
-    *p = 0x01;
-#ifdef DISP_NCI
-    DISP_NCI(ps, (uint16_t)p_msg->len, true);
-#endif
-    nfc_hal_send_nci_msg_to_nfc_task(p_msg);
-  } else {
-    HAL_TRACE_ERROR0(
-        "Unable to allocate buffer for Sending credit ntf to stack");
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_send_message
-**
-** Description      This function is calledto send an NCI message.
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_main_send_message(NFC_HDR* p_msg) {
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  uint8_t cid, pbf;
-  uint16_t data_len;
-#endif
-  uint8_t *ps, *pp;
-  uint16_t len = p_msg->len;
-#ifdef DISP_NCI
-  uint8_t delta;
-#endif
-
-  HAL_TRACE_DEBUG1("nfc_hal_main_send_message() ls:0x%x",
-                   p_msg->layer_specific);
-  if ((p_msg->layer_specific == NFC_HAL_WAIT_RSP_CMD) ||
-      (p_msg->layer_specific == NFC_HAL_WAIT_RSP_VSC)) {
-    nfc_hal_nci_send_cmd(p_msg);
-  } else {
-    /* NFC task has fragmented the data packet to the appropriate size
-     * and data credit is available; just send it */
-
-    /* add NCI packet type in front of message */
-    nfc_hal_nci_add_nfc_pkt_type(p_msg);
-
-    /* send this packet to transport */
-    ps = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    pp = ps + 1;
-#ifdef DISP_NCI
-    delta = p_msg->len - len;
-    DISP_NCI(ps + delta, (uint16_t)(p_msg->len - delta), false);
-#endif
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-    if (nfc_hal_cb.hci_cb.hcp_conn_id) {
-      NCI_DATA_PRS_HDR(pp, pbf, cid, data_len);
-      if (cid == nfc_hal_cb.hci_cb.hcp_conn_id) {
-        if (nfc_hal_hci_handle_hcp_pkt_to_hc(pp)) {
-          HAL_TRACE_DEBUG0(
-              "nfc_hal_main_send_message() - Drop rsp to Fake cmd, Fake credit "
-              "ntf");
-          GKI_freebuf(p_msg);
-          nfc_hal_send_credit_ntf_for_cid(cid);
-          return;
-        }
-      }
-    }
-#endif
-
-    /* check low power mode state */
-    if (nfc_hal_dm_power_mode_execute(NFC_HAL_LP_TX_DATA_EVT)) {
-      USERIAL_Write(USERIAL_NFC_PORT, ps, p_msg->len);
-    } else {
-      HAL_TRACE_ERROR0(
-          "nfc_hal_main_send_message(): drop data in low power mode");
-    }
-    GKI_freebuf(p_msg);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_main_task
-**
-** Description      NFC HAL NCI transport event processing task
-**
-** Returns          0
-**
-*******************************************************************************/
-uint32_t nfc_hal_main_task(uint32_t param) {
-  uint16_t event;
-  uint8_t byte;
-  uint8_t num_interfaces;
-  uint8_t* p;
-  NFC_HDR* p_msg;
-  bool free_msg;
-
-  HAL_TRACE_DEBUG0("NFC_HAL_TASK started");
-
-  /* Main loop */
-  while (true) {
-    event = GKI_wait(0xFFFF, 0);
-
-    /* Handle NFC_HAL_TASK_EVT_INITIALIZE (for initializing NCI transport) */
-    if (event & NFC_HAL_TASK_EVT_INITIALIZE) {
-      HAL_TRACE_DEBUG0(
-          "NFC_HAL_TASK got NFC_HAL_TASK_EVT_INITIALIZE signal. Opening NFC "
-          "transport...");
-
-      nfc_hal_main_open_transport();
-    }
-
-    /* Check for terminate event */
-    if (event & NFC_HAL_TASK_EVT_TERMINATE) {
-      HAL_TRACE_DEBUG0("NFC_HAL_TASK got NFC_HAL_TASK_EVT_TERMINATE");
-
-      nfc_hal_main_close();
-
-      continue;
-    }
-
-    /* Check for power cycle event */
-    if (event & NFC_HAL_TASK_EVT_POWER_CYCLE) {
-      HAL_TRACE_DEBUG0("NFC_HAL_TASK got NFC_HAL_TASK_EVT_POWER_CYCLE");
-      nfc_hal_main_handle_terminate();
-
-      /* Close uart */
-      USERIAL_Close(USERIAL_NFC_PORT);
-
-      /* power cycle timeout */
-      nfc_hal_main_start_quick_timer(
-          &nfc_hal_cb.timer, NFC_HAL_TTYPE_POWER_CYCLE,
-          (NFC_HAL_POWER_CYCLE_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000);
-      continue;
-    }
-
-    /* NCI message ready to be sent to NFCC */
-    if (event & NFC_HAL_TASK_EVT_MBOX) {
-      while ((p_msg = (NFC_HDR*)GKI_read_mbox(NFC_HAL_TASK_MBOX)) != NULL) {
-        free_msg = true;
-        switch (p_msg->event & NFC_EVT_MASK) {
-          case NFC_HAL_EVT_TO_NFC_NCI:
-            nfc_hal_main_send_message(p_msg);
-            /* do not free buffer. NCI VS code may keep it for processing later
-             */
-            free_msg = false;
-            break;
-
-          case NFC_HAL_EVT_POST_CORE_RESET:
-            NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_POST_INIT_DONE);
-
-            /* set NCI Control packet size from CORE_INIT_RSP */
-            p = (uint8_t*)(p_msg + 1) + p_msg->offset + NCI_MSG_HDR_SIZE;
-            p += 5;
-            STREAM_TO_UINT8(num_interfaces, p);
-            p += (num_interfaces + 3);
-            nfc_hal_cb.ncit_cb.nci_ctrl_size = *p;
-
-            /* start post initialization */
-            nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_LPTD;
-            nfc_hal_cb.dev_cb.next_startup_vsc = 1;
-
-            nfc_hal_dm_config_nfcc();
-            break;
-
-          case NFC_HAL_EVT_TO_START_QUICK_TIMER:
-            GKI_start_timer(
-                NFC_HAL_QUICK_TIMER_ID,
-                ((GKI_SECS_TO_TICKS(1) / QUICK_TIMER_TICKS_PER_SEC)), true);
-            break;
-
-          case NFC_HAL_EVT_HCI:
-            nfc_hal_hci_evt_hdlr((tNFC_HAL_HCI_EVENT_DATA*)p_msg);
-            break;
-
-          case NFC_HAL_EVT_PRE_DISCOVER:
-            NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE);
-            nfa_hal_send_pre_discover_cfg();
-            break;
-
-          case NFC_HAL_EVT_CONTROL_GRANTED:
-            nfc_hal_dm_send_pend_cmd();
-            break;
-
-          default:
-            break;
-        }
-
-        if (free_msg) GKI_freebuf(p_msg);
-      }
-    }
-
-    /* Data waiting to be read from serial port */
-    if (event & NFC_HAL_TASK_EVT_DATA_RDY) {
-      while (true) {
-        /* Read one byte to see if there is anything waiting to be read */
-        if (USERIAL_Read(USERIAL_NFC_PORT, &byte, 1) == 0) {
-          break;
-        }
-
-        if (nfc_hal_nci_receive_msg(byte)) {
-          /* complete of receiving NCI message */
-          nfc_hal_nci_assemble_nci_msg();
-          if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
-            if (nfc_hal_nci_preproc_rx_nci_msg(nfc_hal_cb.ncit_cb.p_rcv_msg)) {
-              /* Send NCI message to the stack */
-              nfc_hal_send_nci_msg_to_nfc_task(nfc_hal_cb.ncit_cb.p_rcv_msg);
-            } else {
-              if (nfc_hal_cb.ncit_cb.p_rcv_msg)
-                GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
-            }
-            nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
-          }
-        }
-      } /* while (TRUE) */
-    }
-
-    /* Process quick timer tick */
-    if (event & NFC_HAL_QUICK_TIMER_EVT_MASK) {
-      nfc_hal_main_process_quick_timer_evt();
-    }
-  }
-
-  HAL_TRACE_DEBUG0("nfc_hal_main_task terminated");
-
-  GKI_exit_task(GKI_get_taskid());
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetTraceLevel
-**
-** Description      This function sets the trace level for HAL.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t HAL_NfcSetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) nfc_hal_cb.trace_level = new_level;
-
-  return (nfc_hal_cb.trace_level);
-}
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c
deleted file mode 100644
index 8d57eeb..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c
+++ /dev/null
@@ -1,826 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2010-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This file contains function of the NFC unit to receive/process NCI/VS
- *  commands/responses.
- *
- ******************************************************************************/
-#include <string.h>
-#include "nci_defs.h"
-#include "nfc_hal_int.h"
-#include "nfc_hal_post_reset.h"
-#include "userial.h"
-
-/*****************************************************************************
-** Constants and types
-*****************************************************************************/
-
-/*****************************************************************************
-** Local function prototypes
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_assemble_nci_msg
-**
-** Description      This function is called to reassemble the received NCI
-**                  response/notification packet, if required.
-**                  (The data packets are posted to NFC task for reassembly)
-**
-** Returns          void.
-**
-*******************************************************************************/
-void nfc_hal_nci_assemble_nci_msg(void) {
-  NFC_HDR* p_msg = nfc_hal_cb.ncit_cb.p_rcv_msg;
-  uint8_t u8;
-  uint8_t *p, *pp;
-  uint8_t hdr[2];
-  uint8_t *ps, *pd;
-  uint16_t size, needed;
-  bool disp_again = false;
-
-  if ((p_msg == NULL) || (p_msg->len < NCI_MSG_HDR_SIZE)) return;
-
-#ifdef DISP_NCI
-  DISP_NCI((uint8_t*)(p_msg + 1) + p_msg->offset, (uint16_t)(p_msg->len), true);
-#endif
-
-  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-  u8 = *p++;
-  /* remove the PBF bit for potential reassembly later */
-  hdr[0] = u8 & ~NCI_PBF_MASK;
-  if ((u8 & NCI_MT_MASK) == NCI_MT_DATA) {
-    /* clear the RFU in octet1 */
-    *(p) = 0;
-    /* data packet reassembly is performed in NFC task */
-    return;
-  } else {
-    *(p) &= NCI_OID_MASK;
-  }
-
-  hdr[1] = *p;
-  pp = hdr;
-  /* save octet0 and octet1 of an NCI header in layer_specific for the received
-   * packet */
-  STREAM_TO_UINT16(p_msg->layer_specific, pp);
-
-  if (nfc_hal_cb.ncit_cb.p_frag_msg) {
-    if (nfc_hal_cb.ncit_cb.p_frag_msg->layer_specific !=
-        p_msg->layer_specific) {
-      /* check if these fragments are of the same NCI message */
-      HAL_TRACE_ERROR2(
-          "nfc_hal_nci_assemble_nci_msg() - different messages 0x%x, 0x%x!!",
-          nfc_hal_cb.ncit_cb.p_frag_msg->layer_specific, p_msg->layer_specific);
-      nfc_hal_cb.ncit_cb.nci_ras |= NFC_HAL_NCI_RAS_ERROR;
-    } else if (nfc_hal_cb.ncit_cb.nci_ras == 0) {
-      disp_again = true;
-      /* if not previous reassembly error, append the new fragment */
-      p_msg->offset += NCI_MSG_HDR_SIZE;
-      p_msg->len -= NCI_MSG_HDR_SIZE;
-      size = GKI_get_buf_size(nfc_hal_cb.ncit_cb.p_frag_msg);
-      needed = (NFC_HDR_SIZE + nfc_hal_cb.ncit_cb.p_frag_msg->len +
-                nfc_hal_cb.ncit_cb.p_frag_msg->offset + p_msg->len);
-      if (size >= needed) {
-        /* the buffer for reassembly is big enough to append the new fragment */
-        ps = (uint8_t*)(p_msg + 1) + p_msg->offset;
-        pd = (uint8_t*)(nfc_hal_cb.ncit_cb.p_frag_msg + 1) +
-             nfc_hal_cb.ncit_cb.p_frag_msg->offset +
-             nfc_hal_cb.ncit_cb.p_frag_msg->len;
-        memcpy(pd, ps, p_msg->len);
-        nfc_hal_cb.ncit_cb.p_frag_msg->len += p_msg->len;
-        /* adjust the NCI packet length */
-        pd = (uint8_t*)(nfc_hal_cb.ncit_cb.p_frag_msg + 1) +
-             nfc_hal_cb.ncit_cb.p_frag_msg->offset + 2;
-        *pd = (uint8_t)(nfc_hal_cb.ncit_cb.p_frag_msg->len - NCI_MSG_HDR_SIZE);
-      } else {
-        nfc_hal_cb.ncit_cb.nci_ras |= NFC_HAL_NCI_RAS_TOO_BIG;
-        HAL_TRACE_ERROR2(
-            "nfc_hal_nci_assemble_nci_msg() buffer overrun (%d + %d)!!",
-            nfc_hal_cb.ncit_cb.p_frag_msg->len, p_msg->len);
-      }
-    }
-    /* we are done with this new fragment, free it */
-    GKI_freebuf(p_msg);
-  } else {
-    nfc_hal_cb.ncit_cb.p_frag_msg = p_msg;
-  }
-
-  if ((u8 & NCI_PBF_MASK) == NCI_PBF_NO_OR_LAST) {
-    /* last fragment */
-    p_msg = nfc_hal_cb.ncit_cb.p_frag_msg;
-    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    *p = u8; /* this should make the PBF flag as Last Fragment */
-    nfc_hal_cb.ncit_cb.p_frag_msg = NULL;
-
-    p_msg->layer_specific = nfc_hal_cb.ncit_cb.nci_ras;
-    /* still report the data packet, if the incoming packet is too big */
-    if (nfc_hal_cb.ncit_cb.nci_ras & NFC_HAL_NCI_RAS_ERROR) {
-      /* NFCC reported NCI fragments for different NCI messages and this is the
-       * last fragment - drop it */
-      HAL_TRACE_ERROR0("nfc_hal_nci_assemble_nci_msg() clearing NCI_RAS_ERROR");
-      GKI_freebuf(p_msg);
-      p_msg = NULL;
-    }
-#ifdef DISP_NCI
-    if ((nfc_hal_cb.ncit_cb.nci_ras == 0) && (disp_again)) {
-      DISP_NCI((uint8_t*)(p_msg + 1) + p_msg->offset, (uint16_t)(p_msg->len),
-               true);
-    }
-#endif
-    /* clear the error flags, so the next NCI packet is clean */
-    nfc_hal_cb.ncit_cb.nci_ras = 0;
-  } else {
-    /* still reassembling */
-    p_msg = NULL;
-  }
-
-  nfc_hal_cb.ncit_cb.p_rcv_msg = p_msg;
-}
-
-/*****************************************************************************
-**
-** Function         nfc_hal_nci_receive_nci_msg
-**
-** Description
-**      Handle incoming data (NCI events) from the serial port.
-**
-**      If there is data waiting from the serial port, this funciton reads the
-**      data and parses it. Once an entire NCI message has been read, it sends
-**      the message the the NFC_TASK for processing
-**
-*****************************************************************************/
-static bool nfc_hal_nci_receive_nci_msg(tNFC_HAL_NCIT_CB* p_cb, uint8_t byte) {
-  uint16_t len;
-  bool msg_received = false;
-
-  switch (p_cb->rcv_state) {
-    case NFC_HAL_RCV_NCI_MSG_ST:
-
-      /* Initialize rx parameters */
-      p_cb->rcv_state = NFC_HAL_RCV_NCI_HDR_ST;
-      p_cb->rcv_len = NCI_MSG_HDR_SIZE;
-
-      /* Start of new message. Allocate a buffer for message */
-      p_cb->p_rcv_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-      if (p_cb->p_rcv_msg != NULL) {
-        /* Initialize NFC_HDR */
-        p_cb->p_rcv_msg->len = 0;
-        p_cb->p_rcv_msg->event = 0;
-        p_cb->p_rcv_msg->offset = 0;
-
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-      } else {
-        HAL_TRACE_ERROR0("Unable to allocate buffer for incoming NCI message.");
-      }
-      p_cb->rcv_len--;
-      break;
-
-    case NFC_HAL_RCV_NCI_HDR_ST:
-
-      if (p_cb->p_rcv_msg) {
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-      }
-
-      p_cb->rcv_len--;
-
-      /* Check if we read in entire NFC message header yet */
-      if (p_cb->rcv_len == 0) {
-        p_cb->rcv_len = byte;
-
-        /* If non-zero payload, then go to receive-data state */
-        if (byte > 0) {
-          p_cb->rcv_state = NFC_HAL_RCV_NCI_PAYLOAD_ST;
-        } else {
-          msg_received = true;
-          p_cb->rcv_state = NFC_HAL_RCV_IDLE_ST;
-        }
-      }
-      break;
-
-    case NFC_HAL_RCV_NCI_PAYLOAD_ST:
-
-      p_cb->rcv_len--;
-      if (p_cb->p_rcv_msg) {
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-
-        if (p_cb->rcv_len > 0) {
-          /* Read in the rest of the message */
-          len = USERIAL_Read(USERIAL_NFC_PORT,
-                             ((uint8_t*)(p_cb->p_rcv_msg + 1) +
-                              p_cb->p_rcv_msg->offset + p_cb->p_rcv_msg->len),
-                             p_cb->rcv_len);
-          p_cb->p_rcv_msg->len += len;
-          p_cb->rcv_len -= len;
-        }
-      }
-
-      /* Check if we read in entire message yet */
-      if (p_cb->rcv_len == 0) {
-        msg_received = true;
-        p_cb->rcv_state = NFC_HAL_RCV_IDLE_ST;
-      }
-      break;
-  }
-
-  return (msg_received);
-}
-
-/*****************************************************************************
-**
-** Function         nfc_hal_nci_receive_bt_msg
-**
-** Description
-**      Handle incoming BRCM specific data from the serial port.
-**
-**      If there is data waiting from the serial port, this funciton reads the
-**      data and parses it. Once an entire message has been read, it returns
-**      TRUE.
-**
-*****************************************************************************/
-static bool nfc_hal_nci_receive_bt_msg(tNFC_HAL_NCIT_CB* p_cb, uint8_t byte) {
-  uint16_t len;
-  bool msg_received = false;
-
-  switch (p_cb->rcv_state) {
-    case NFC_HAL_RCV_BT_MSG_ST:
-
-      /* Initialize rx parameters */
-      p_cb->rcv_state = NFC_HAL_RCV_BT_HDR_ST;
-      p_cb->rcv_len = HCIE_PREAMBLE_SIZE;
-
-      p_cb->p_rcv_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
-      if (p_cb->p_rcv_msg != NULL) {
-        /* Initialize NFC_HDR */
-        p_cb->p_rcv_msg->len = 0;
-        p_cb->p_rcv_msg->event = 0;
-        p_cb->p_rcv_msg->offset = 0;
-
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-      } else {
-        HAL_TRACE_ERROR0(
-            "[nfc] Unable to allocate buffer for incoming NCI message.");
-      }
-      p_cb->rcv_len--;
-      break;
-
-    case NFC_HAL_RCV_BT_HDR_ST:
-      if (p_cb->p_rcv_msg) {
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-      }
-      p_cb->rcv_len--;
-
-      /* Check if we received entire preamble yet */
-      if (p_cb->rcv_len == 0) {
-        /* Received entire preamble. Length is in the last byte(s) of the
-         * preamble */
-        p_cb->rcv_len = byte;
-
-        /* Verify that buffer is big enough to fit message */
-        if ((p_cb->p_rcv_msg) && ((sizeof(NFC_HDR) + HCIE_PREAMBLE_SIZE +
-                                   byte) > GKI_get_buf_size(p_cb->p_rcv_msg))) {
-          /* Message cannot fit into buffer */
-          GKI_freebuf(p_cb->p_rcv_msg);
-          p_cb->p_rcv_msg = NULL;
-
-          HAL_TRACE_ERROR0("Invalid length for incoming BT HCI message.");
-        }
-
-        /* Message length is valid */
-        if (byte) {
-          /* Read rest of message */
-          p_cb->rcv_state = NFC_HAL_RCV_BT_PAYLOAD_ST;
-        } else {
-          /* Message has no additional parameters. (Entire message has been
-           * received) */
-          msg_received = true;
-          p_cb->rcv_state = NFC_HAL_RCV_IDLE_ST; /* Next, wait for packet type
-                                                    of next message */
-        }
-      }
-      break;
-
-    case NFC_HAL_RCV_BT_PAYLOAD_ST:
-      p_cb->rcv_len--;
-      if (p_cb->p_rcv_msg) {
-        *((uint8_t*)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->offset +
-          p_cb->p_rcv_msg->len++) = byte;
-
-        if (p_cb->rcv_len > 0) {
-          /* Read in the rest of the message */
-          len = USERIAL_Read(USERIAL_NFC_PORT,
-                             ((uint8_t*)(p_cb->p_rcv_msg + 1) +
-                              p_cb->p_rcv_msg->offset + p_cb->p_rcv_msg->len),
-                             p_cb->rcv_len);
-          p_cb->p_rcv_msg->len += len;
-          p_cb->rcv_len -= len;
-        }
-      }
-
-      /* Check if we read in entire message yet */
-      if (p_cb->rcv_len == 0) {
-        msg_received = true;
-        p_cb->rcv_state =
-            NFC_HAL_RCV_IDLE_ST; /* Next, wait for packet type of next message
-                                    */
-      }
-      break;
-  }
-
-/* If we received entire message */
-#if (NFC_HAL_TRACE_PROTOCOL == TRUE)
-  if (msg_received && p_cb->p_rcv_msg) {
-    /* Display protocol trace message */
-    DispHciEvt(p_cb->p_rcv_msg);
-  }
-#endif
-
-  return (msg_received);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_proc_rx_bt_msg
-**
-** Description      Received BT message from NFCC
-**
-**                  Notify command complete if initializing NFCC
-**                  Forward BT message to NFC task
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_nci_proc_rx_bt_msg(void) {
-  uint8_t* p;
-  NFC_HDR* p_msg;
-  uint16_t opcode, old_opcode;
-  tNFC_HAL_BTVSC_CPLT vcs_cplt_params;
-  tNFC_HAL_BTVSC_CPLT_CBACK* p_cback = NULL;
-
-  /* if complete BT message is received successfully */
-  if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
-    p_msg = nfc_hal_cb.ncit_cb.p_rcv_msg;
-    HAL_TRACE_DEBUG1(
-        "nfc_hal_nci_proc_rx_bt_msg (): GOT an BT msgs init_sta:%d",
-        nfc_hal_cb.dev_cb.initializing_state);
-    HAL_TRACE_DEBUG2("event: 0x%x, wait_rsp:0x%x", p_msg->event,
-                     nfc_hal_cb.ncit_cb.nci_wait_rsp);
-    /* increase the cmd window here */
-    if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP) {
-      p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-      if (*p == HCI_COMMAND_COMPLETE_EVT) {
-        p += 3; /* code, len, cmd window */
-        STREAM_TO_UINT16(opcode, p);
-        p = nfc_hal_cb.ncit_cb.last_hdr;
-        STREAM_TO_UINT16(old_opcode, p);
-        if (opcode == old_opcode) {
-          nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
-          p_cback = (tNFC_HAL_BTVSC_CPLT_CBACK*)nfc_hal_cb.ncit_cb.p_vsc_cback;
-          nfc_hal_cb.ncit_cb.p_vsc_cback = NULL;
-          nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
-        }
-      }
-    }
-
-    /* if initializing BRCM NFCC */
-    if ((nfc_hal_cb.dev_cb.initializing_state ==
-         NFC_HAL_INIT_STATE_W4_APP_COMPLETE) ||
-        (nfc_hal_cb.dev_cb.initializing_state ==
-         NFC_HAL_INIT_STATE_W4_BUILD_INFO) ||
-        (nfc_hal_cb.dev_cb.initializing_state ==
-         NFC_HAL_INIT_STATE_W4_CONTROL_DONE)) {
-      /* this is command complete event for baud rate update or download patch
-       */
-      p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-
-      p += 1; /* skip opcode */
-      STREAM_TO_UINT8(vcs_cplt_params.param_len, p);
-
-      p += 1; /* skip num command packets */
-      STREAM_TO_UINT16(vcs_cplt_params.opcode, p);
-
-      vcs_cplt_params.param_len -= 3;
-      vcs_cplt_params.p_param_buf = p;
-
-      if (nfc_hal_cb.dev_cb.initializing_state ==
-          NFC_HAL_INIT_STATE_W4_CONTROL_DONE) {
-        NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-        nfc_hal_cb.p_stack_cback(HAL_NFC_RELEASE_CONTROL_EVT,
-                                 HAL_NFC_STATUS_OK);
-      }
-      if (p_cback) {
-        nfc_hal_cb.ncit_cb.p_vsc_cback = NULL;
-        (*p_cback)(&vcs_cplt_params);
-      }
-
-      /* do not BT send message to NFC task */
-      GKI_freebuf(p_msg);
-    } else {
-      /* do not BT send message to NFC task */
-      GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
-    }
-    nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
-  }
-}
-
-/*****************************************************************************
-**
-** Function         nfc_hal_nci_receive_msg
-**
-** Description
-**      Handle incoming data (NCI events) from the serial port.
-**
-**      If there is data waiting from the serial port, this funciton reads the
-**      data and parses it. Once an entire NCI message has been read, it sends
-**      the message the the NFC_TASK for processing
-**
-*****************************************************************************/
-bool nfc_hal_nci_receive_msg(uint8_t byte) {
-  tNFC_HAL_NCIT_CB* p_cb = &(nfc_hal_cb.ncit_cb);
-  bool msg_received = false;
-
-  if (p_cb->rcv_state == NFC_HAL_RCV_IDLE_ST) {
-    /* if this is NCI message */
-    if (byte == HCIT_TYPE_NFC) {
-      p_cb->rcv_state = NFC_HAL_RCV_NCI_MSG_ST;
-    }
-    /* if this is BT message */
-    else if (byte == HCIT_TYPE_EVENT) {
-      p_cb->rcv_state = NFC_HAL_RCV_BT_MSG_ST;
-    } else {
-      HAL_TRACE_ERROR1("Unknown packet type drop this byte 0x%x", byte);
-    }
-  } else if (p_cb->rcv_state <= NFC_HAL_RCV_NCI_PAYLOAD_ST) {
-    msg_received = nfc_hal_nci_receive_nci_msg(p_cb, byte);
-  } else {
-    if (nfc_hal_nci_receive_bt_msg(p_cb, byte)) {
-      /* received BT message */
-      nfc_hal_nci_proc_rx_bt_msg();
-    }
-  }
-
-  return (msg_received);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_preproc_rx_nci_msg
-**
-** Description      NFCC sends NCI message to DH while initializing NFCC
-**                  processing low power mode
-**
-** Returns          TRUE, if NFC task need to receive NCI message
-**
-*******************************************************************************/
-bool nfc_hal_nci_preproc_rx_nci_msg(NFC_HDR* p_msg) {
-  uint8_t *p, *pp;
-  uint8_t mt, pbf, gid, op_code;
-  uint8_t payload_len;
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  uint8_t cid;
-  uint16_t data_len;
-#endif
-
-  HAL_TRACE_DEBUG0("nfc_hal_nci_preproc_rx_nci_msg()");
-
-  if (nfc_hal_cb.dev_cb.initializing_state ==
-      NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF) {
-    /* if turning off BRCM NFCC */
-    nfc_hal_dm_proc_msg_during_exit(p_msg);
-    /* do not send message to NFC task while shutting down */
-    return false;
-  }
-
-  /* if initializing BRCM NFCC */
-  if (nfc_hal_cb.dev_cb.initializing_state != NFC_HAL_INIT_STATE_IDLE) {
-    nfc_hal_dm_proc_msg_during_init(p_msg);
-    /* do not send message to NFC task while initializing NFCC */
-    return false;
-  } else {
-    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    pp = p;
-    NCI_MSG_PRS_HDR0(p, mt, pbf, gid);
-    NCI_MSG_PRS_HDR1(p, op_code);
-    payload_len = *p++;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-    if (mt == NCI_MT_DATA) {
-      if (nfc_hal_cb.hci_cb.hcp_conn_id) {
-        NCI_DATA_PRS_HDR(pp, pbf, cid, data_len);
-        if (cid == nfc_hal_cb.hci_cb.hcp_conn_id) {
-          nfc_hal_hci_handle_hcp_pkt_from_hc(pp);
-        }
-      }
-    }
-
-    if (gid == NCI_GID_PROP) /* this is for hci netwk ntf */
-    {
-      if (mt == NCI_MT_NTF) {
-        if (op_code == NCI_MSG_HCI_NETWK) {
-          nfc_hal_hci_handle_hci_netwk_info((uint8_t*)(p_msg + 1) +
-                                            p_msg->offset);
-        }
-      }
-    } else
-#endif
-        if (gid == NCI_GID_RF_MANAGE) {
-      if (mt == NCI_MT_NTF) {
-        if (op_code == NCI_MSG_RF_INTF_ACTIVATED) {
-          if ((nfc_hal_cb.max_rf_credits) && (payload_len > 5)) {
-            /* API used wants to limit the RF data credits */
-            p += 5; /* skip RF disc id, interface, protocol, tech&mode, payload
-                       size */
-            if (*p > nfc_hal_cb.max_rf_credits) {
-              HAL_TRACE_DEBUG2("RfDataCredits %d->%d", *p,
-                               nfc_hal_cb.max_rf_credits);
-              *p = nfc_hal_cb.max_rf_credits;
-            }
-          }
-        }
-      }
-    }
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-    else if (gid == NCI_GID_CORE) {
-      if (mt == NCI_MT_RSP) {
-        if (op_code == NCI_MSG_CORE_CONN_CREATE) {
-          if (nfc_hal_cb.hci_cb.b_wait_hcp_conn_create_rsp) {
-            p++; /* skip status byte */
-            nfc_hal_cb.hci_cb.b_wait_hcp_conn_create_rsp = false;
-            p++; /* skip buff size */
-            p++; /* num of buffers */
-            nfc_hal_cb.hci_cb.hcp_conn_id = *p;
-          }
-        }
-      }
-    }
-#endif
-  }
-
-  if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) {
-    if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) {
-      /* extend idle timer */
-      nfc_hal_dm_power_mode_execute(NFC_HAL_LP_RX_DATA_EVT);
-    }
-  }
-
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_add_nfc_pkt_type
-**
-** Description      Add packet type (HCIT_TYPE_NFC)
-**
-** Returns          TRUE, if NFCC can receive NCI message
-**
-*******************************************************************************/
-void nfc_hal_nci_add_nfc_pkt_type(NFC_HDR* p_msg) {
-  uint8_t* p;
-  uint8_t hcit;
-
-  /* add packet type in front of NCI header */
-  if (p_msg->offset > 0) {
-    p_msg->offset--;
-    p_msg->len++;
-
-    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-    *p = HCIT_TYPE_NFC;
-  } else {
-    HAL_TRACE_ERROR0(
-        "nfc_hal_nci_add_nfc_pkt_type () : No space for packet type");
-    hcit = HCIT_TYPE_NFC;
-    USERIAL_Write(USERIAL_NFC_PORT, &hcit, 1);
-  }
-}
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-/*******************************************************************************
-**
-** Function         nci_brcm_check_cmd_create_hcp_connection
-**
-** Description      Check if this is command to create HCP connection
-**
-** Returns          None
-**
-*******************************************************************************/
-static void nci_brcm_check_cmd_create_hcp_connection(NFC_HDR* p_msg) {
-  uint8_t* p;
-  uint8_t mt, pbf, gid, op_code;
-
-  nfc_hal_cb.hci_cb.b_wait_hcp_conn_create_rsp = false;
-
-  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
-
-  if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE) {
-    NCI_MSG_PRS_HDR0(p, mt, pbf, gid);
-    NCI_MSG_PRS_HDR1(p, op_code);
-
-    if (gid == NCI_GID_CORE) {
-      if (mt == NCI_MT_CMD) {
-        if (op_code == NCI_MSG_CORE_CONN_CREATE) {
-          if (((NCI_CORE_PARAM_SIZE_CON_CREATE + 4) == *p++) &&
-              (NCI_DEST_TYPE_NFCEE == *p++) && (1 == *p++) &&
-              (NCI_CON_CREATE_TAG_NFCEE_VAL == *p++) && (2 == *p++)) {
-            p++;
-            if (NCI_NFCEE_INTERFACE_HCI_ACCESS == *p) {
-              nfc_hal_cb.hci_cb.b_wait_hcp_conn_create_rsp = true;
-              return;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-#endif
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_send_cmd
-**
-** Description      Send NCI command to the transport
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_nci_send_cmd(NFC_HDR* p_buf) {
-  bool continue_to_process = true;
-  uint8_t *ps, *pd;
-  uint16_t max_len;
-  uint16_t buf_len, offset;
-  uint8_t* p;
-  uint8_t hdr[NCI_MSG_HDR_SIZE];
-  uint8_t nci_ctrl_size = nfc_hal_cb.ncit_cb.nci_ctrl_size;
-  uint8_t delta = 0;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  if ((nfc_hal_cb.hci_cb.hcp_conn_id == 0) &&
-      (nfc_hal_cb.nvm_cb.nvm_type != NCI_SPD_NVM_TYPE_NONE))
-    nci_brcm_check_cmd_create_hcp_connection((NFC_HDR*)p_buf);
-#endif
-
-  /* check low power mode state */
-  continue_to_process = nfc_hal_dm_power_mode_execute(NFC_HAL_LP_TX_DATA_EVT);
-
-  if (!continue_to_process) {
-    /* save the command to be sent until NFCC is free. */
-    nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf;
-    return;
-  }
-
-  max_len = nci_ctrl_size + NCI_MSG_HDR_SIZE;
-  buf_len = p_buf->len;
-  offset = p_buf->offset;
-#ifdef DISP_NCI
-  if (buf_len > max_len) {
-    /* this command needs to be fragmented. display the complete packet first */
-    DISP_NCI((uint8_t*)(p_buf + 1) + p_buf->offset, p_buf->len, false);
-  }
-#endif
-  ps = (uint8_t*)(p_buf + 1) + p_buf->offset;
-  memcpy(hdr, ps, NCI_MSG_HDR_SIZE);
-  while (buf_len > max_len) {
-    HAL_TRACE_DEBUG2("buf_len (%d) > max_len (%d)", buf_len, max_len);
-    /* the NCI command is bigger than the NFCC Max Control Packet Payload Length
-     * fragment the command */
-
-    p_buf->len = max_len;
-    ps = (uint8_t*)(p_buf + 1) + p_buf->offset;
-    /* mark the control packet as fragmented */
-    *ps |= NCI_PBF_ST_CONT;
-    /* adjust the length of this fragment */
-    ps += 2;
-    *ps = nci_ctrl_size;
-
-    /* add NCI packet type in front of message */
-    nfc_hal_nci_add_nfc_pkt_type(p_buf);
-
-    /* send this fragment to transport */
-    p = (uint8_t*)(p_buf + 1) + p_buf->offset;
-
-#ifdef DISP_NCI
-    delta = p_buf->len - max_len;
-    DISP_NCI(p + delta, (uint16_t)(p_buf->len - delta), false);
-#endif
-    USERIAL_Write(USERIAL_NFC_PORT, p, p_buf->len);
-
-    /* adjust the len and offset to reflect that part of the command is already
-     * sent */
-    buf_len -= nci_ctrl_size;
-    offset += nci_ctrl_size;
-    HAL_TRACE_DEBUG2("p_buf->len: %d buf_len (%d)", p_buf->len, buf_len);
-    p_buf->len = buf_len;
-    p_buf->offset = offset;
-    pd = (uint8_t*)(p_buf + 1) + p_buf->offset;
-    /* restore the NCI header */
-    memcpy(pd, hdr, NCI_MSG_HDR_SIZE);
-    pd += 2;
-    *pd = (uint8_t)(p_buf->len - NCI_MSG_HDR_SIZE);
-  }
-
-  HAL_TRACE_DEBUG1("p_buf->len: %d", p_buf->len);
-
-  /* add NCI packet type in front of message */
-  nfc_hal_nci_add_nfc_pkt_type(p_buf);
-
-  /* send this fragment to transport */
-  p = (uint8_t*)(p_buf + 1) + p_buf->offset;
-
-#ifdef DISP_NCI
-  delta = p_buf->len - buf_len;
-  DISP_NCI(p + delta, (uint16_t)(p_buf->len - delta), false);
-#endif
-  USERIAL_Write(USERIAL_NFC_PORT, p, p_buf->len);
-
-  GKI_freebuf(p_buf);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nci_cmd_timeout_cback
-**
-** Description      callback function for timeout
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_nci_cmd_timeout_cback(void* p_tle) {
-  TIMER_LIST_ENT* p_tlent = (TIMER_LIST_ENT*)p_tle;
-
-  HAL_TRACE_DEBUG0("nfc_hal_nci_cmd_timeout_cback ()");
-
-  nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
-
-  if (p_tlent->event == NFC_HAL_TTYPE_NCI_WAIT_RSP) {
-    if (nfc_hal_cb.dev_cb.initializing_state <=
-        NFC_HAL_INIT_STATE_W4_PATCH_INFO) {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_main_pre_init_done(HAL_NFC_STATUS_ERR_CMD_TIMEOUT);
-    } else if (nfc_hal_cb.dev_cb.initializing_state ==
-               NFC_HAL_INIT_STATE_W4_APP_COMPLETE) {
-      if (nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_IDLE) {
-        nfc_hal_prm_process_timeout(NULL);
-      } else {
-        NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-        nfc_hal_main_pre_init_done(HAL_NFC_STATUS_ERR_CMD_TIMEOUT);
-      }
-    } else if (nfc_hal_cb.dev_cb.initializing_state ==
-               NFC_HAL_INIT_STATE_W4_POST_INIT_DONE) {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_POST_INIT_CPLT_EVT,
-                               HAL_NFC_STATUS_ERR_CMD_TIMEOUT);
-    } else if (nfc_hal_cb.dev_cb.initializing_state ==
-               NFC_HAL_INIT_STATE_W4_CONTROL_DONE) {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_RELEASE_CONTROL_EVT,
-                               HAL_NFC_STATUS_ERR_CMD_TIMEOUT);
-    } else if (nfc_hal_cb.dev_cb.initializing_state ==
-               NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE) {
-      NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-      nfc_hal_cb.p_stack_cback(HAL_NFC_PRE_DISCOVER_CPLT_EVT,
-                               HAL_NFC_STATUS_ERR_CMD_TIMEOUT);
-    } else if (nfc_hal_cb.dev_cb.initializing_state ==
-               NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF) {
-      nfc_hal_main_close();
-    }
-  }
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetMaxRfDataCredits
-**
-** Description      This function sets the maximum RF data credit for HAL.
-**                  If 0, use the value reported from NFCC.
-**
-** Returns          none
-**
-*******************************************************************************/
-void HAL_NfcSetMaxRfDataCredits(uint8_t max_credits) {
-  HAL_TRACE_DEBUG2("HAL_NfcSetMaxRfDataCredits %d->%d",
-                   nfc_hal_cb.max_rf_credits, max_credits);
-  nfc_hal_cb.max_rf_credits = max_credits;
-}
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c b/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c
deleted file mode 100644
index 3d9e76f..0000000
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c
+++ /dev/null
@@ -1,1172 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#include <string.h>
-#include "nfc_hal_int.h"
-#include "userial.h"
-
-/*****************************************************************************
-* Definitions
-*****************************************************************************/
-
-/* Internal flags */
-/* Application provided patchram in a single buffer */
-#define NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF 0x01
-/* Reserved for future use */
-#define NFC_HAL_PRM_FLAGS_RFU 0x02
-#define NFC_HAL_PRM_FLAGS_SIGNATURE_SENT 0x04   /* Signature sent to NFCC */
-#define NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED 0x08 /* PreI2C patch required */
-/* B3 Patch (no RESET_NTF after patch download) */
-#define NFC_HAL_PRM_FLAGS_BCM20791B3 0x10
-#define NFC_HAL_PRM_FLAGS_RM_RF 0x20 /* Erase Personality data */
-
-/* Secure patch download definitions */
-/* PRJID + MAJORVER + MINORVER + COUNT */
-#define NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN 7
-
-/* Enumeration of power modes IDs */
-#define NFC_HAL_PRM_SPD_POWER_MODE_LPM 0
-#define NFC_HAL_PRM_SPD_POWER_MODE_FPM 1
-
-/* Version string for BCM20791B3 */
-const uint8_t NFC_HAL_PRM_BCM20791B3_STR[] = "20791B3";
-#define NFC_HAL_PRM_BCM20791B3_STR_LEN (sizeof(NFC_HAL_PRM_BCM20791B3_STR) - 1)
-
-/* timeout for SPD events (in ms)   */
-#define NFC_HAL_PRM_SPD_TOUT (6000)
-/* delay before sending any new command (ms)*/
-#define NFC_HAL_PRM_END_DELAY (250)
-
-#if (NFC_HAL_PRM_DEBUG == TRUE)
-#define NFC_HAL_PRM_STATE(str) \
-  HAL_TRACE_DEBUG2("%s st: %d", str, nfc_hal_cb.prm.state)
-#else
-#define NFC_HAL_PRM_STATE(str)
-#endif
-
-void nfc_hal_prm_post_baud_update(tHAL_NFC_STATUS status);
-typedef struct {
-  uint16_t offset;
-  uint8_t len;
-} tNFC_HAL_PRM_RM_RF;
-
-const tNFC_HAL_PRM_RM_RF nfc_hal_prm_rm_rf_20795a1[] = {
-    {0x0000, 0xFB}, {0x019C, 0x08}, {0x05E8, 0xFB}, {0, 0}};
-static bool nfc_hal_prm_nvm_rw_cmd(void);
-
-/*****************************************************************************
-** Extern variable from nfc_hal_dm_cfg.c
-*****************************************************************************/
-extern tNFC_HAL_CFG* p_nfc_hal_cfg;
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_handle_download_complete
-**
-** Description      Patch download complete (for secure patch download)
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_handle_download_complete(uint8_t event) {
-  nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_IDLE;
-
-  /* Notify application now */
-  if (nfc_hal_cb.prm.p_cback) (nfc_hal_cb.prm.p_cback)(event);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_send_next_segment
-**
-** Description      Send next patch segment (for secure patch download)
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_send_next_segment(void) {
-  uint8_t* p_src;
-  uint16_t len, offset = nfc_hal_cb.prm.cur_patch_offset;
-  uint8_t hcit, oid, hdr0, type;
-  uint8_t chipverlen;
-  uint8_t chipverstr[NCI_SPD_HEADER_CHIPVER_LEN];
-  uint8_t patch_hdr_size = NCI_MSG_HDR_SIZE + 1; /* 1 is for HCIT */
-
-  /* Validate that segment is at least big enought to have NCI_MSG_HDR_SIZE + 1
-   * (hcit) */
-  if (nfc_hal_cb.prm.cur_patch_len_remaining < patch_hdr_size) {
-    HAL_TRACE_ERROR0("Unexpected end of patch.");
-    nfc_hal_prm_spd_handle_download_complete(
-        NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-    return;
-  }
-
-  /* Parse NCI command header */
-  p_src = (uint8_t*)(nfc_hal_cb.prm.p_cur_patch_data + offset);
-  STREAM_TO_UINT8(hcit, p_src);
-  STREAM_TO_UINT8(hdr0, p_src);
-  STREAM_TO_UINT8(oid, p_src);
-  STREAM_TO_UINT8(len, p_src);
-  STREAM_TO_UINT8(type, p_src);
-
-  /* Update number of bytes comsumed */
-  nfc_hal_cb.prm.cur_patch_offset += (len + patch_hdr_size);
-  nfc_hal_cb.prm.cur_patch_len_remaining -= (len + patch_hdr_size);
-
-  /* Check if sending signature byte */
-  if ((oid == NCI_MSG_SECURE_PATCH_DOWNLOAD) &&
-      (type == NCI_SPD_TYPE_SIGNATURE)) {
-    nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
-  }
-  /* Check for header */
-  else if ((oid == NCI_MSG_SECURE_PATCH_DOWNLOAD) &&
-           (type == NCI_SPD_TYPE_HEADER)) {
-    /* Check if patch is for BCM20791B3 */
-    p_src += NCI_SPD_HEADER_OFFSET_CHIPVERLEN;
-    STREAM_TO_UINT8(chipverlen, p_src);
-    if (memcmp(nfc_hal_cb.nvm_cb.chip_ver, p_src, chipverlen) != 0) {
-      HAL_TRACE_ERROR0("Unexpected chip ver.");
-      nfc_hal_prm_spd_handle_download_complete(
-          NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-      return;
-    }
-    STREAM_TO_ARRAY(chipverstr, p_src, NCI_SPD_HEADER_CHIPVER_LEN);
-
-    if (memcmp(NFC_HAL_PRM_BCM20791B3_STR, chipverstr,
-               NFC_HAL_PRM_BCM20791B3_STR_LEN) == 0) {
-      /* Patch is for BCM2079B3 - do not wait for RESET_NTF after patch download
-       */
-      nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_BCM20791B3;
-    } else {
-      /* Patch is for BCM2079B4 or newer - wait for RESET_NTF after patch
-       * download */
-      nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_BCM20791B3;
-    }
-  }
-
-  /* Send the command (not including HCIT here) */
-  nfc_hal_dm_send_nci_cmd(
-      (uint8_t*)(nfc_hal_cb.prm.p_cur_patch_data + offset + 1),
-      (uint8_t)(len + NCI_MSG_HDR_SIZE),
-      nfc_hal_prm_nci_command_complete_cback);
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_handle_next_patch_start
-**
-** Description      Handle start of next patch (for secure patch download)
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_handle_next_patch_start(void) {
-  uint32_t cur_patch_mask;
-  uint32_t cur_patch_len;
-  bool found_patch_to_download = false;
-
-  while (!found_patch_to_download) {
-    /* Get length of current patch */
-    cur_patch_len =
-        nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len;
-
-    /* Check if this is a patch we need to download */
-    cur_patch_mask =
-        ((uint32_t)1 << nfc_hal_cb.prm
-                            .spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx]
-                            .power_mode);
-    if (nfc_hal_cb.prm.spd_patch_needed_mask & cur_patch_mask) {
-      found_patch_to_download = true;
-    } else {
-      /* Do not need to download this patch. Skip to next patch */
-      HAL_TRACE_DEBUG1(
-          "Skipping patch for power_mode %i.",
-          nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx]
-              .power_mode);
-
-      nfc_hal_cb.prm.spd_cur_patch_idx++;
-      if (nfc_hal_cb.prm.spd_cur_patch_idx >= nfc_hal_cb.prm.spd_patch_count) {
-        /* No more to download */
-        nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_COMPLETE_EVT);
-        return;
-      } else if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)) {
-        /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the
-         * next patch header */
-        (nfc_hal_cb.prm.p_cback)(NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
-        return;
-      } else {
-        /* Patch in buffer. Skip over current patch. Check next patch */
-        nfc_hal_cb.prm.cur_patch_len_remaining -= (uint16_t)cur_patch_len;
-        nfc_hal_cb.prm.cur_patch_offset += (uint16_t)cur_patch_len;
-      }
-    }
-  }
-
-  /* Begin downloading patch */
-  HAL_TRACE_DEBUG1(
-      "Downloading patch for power_mode %i.",
-      nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx]
-          .power_mode);
-  nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_DOWNLOADING;
-  nfc_hal_prm_spd_send_next_segment();
-}
-
-#if (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_download_i2c_fix
-**
-** Description      Start downloading patch for i2c fix
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_download_i2c_fix(void) {
-  uint8_t *p, *p_start;
-  uint16_t patchfile_project_id;
-  uint16_t patchfile_ver_major;
-  uint16_t patchfile_ver_minor;
-  uint16_t patchfile_patchsize;
-  uint8_t u8;
-
-  HAL_TRACE_DEBUG0("Downloading I2C fix...");
-
-  /* Save pointer and offset of patchfile, so we can resume after downloading
-   * the i2c fix */
-  nfc_hal_cb.prm.spd_patch_offset = nfc_hal_cb.prm.cur_patch_offset;
-  nfc_hal_cb.prm.spd_patch_len_remaining =
-      nfc_hal_cb.prm.cur_patch_len_remaining;
-
-  /* Initialize pointers for downloading i2c fix */
-  nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm_i2c.p_patch;
-  nfc_hal_cb.prm.cur_patch_offset = 0;
-  nfc_hal_cb.prm.cur_patch_len_remaining = nfc_hal_cb.prm_i2c.len;
-
-  /* Parse the i2c patchfile */
-  if (nfc_hal_cb.prm.cur_patch_len_remaining >=
-      NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN) {
-    /* Parse patchfile header */
-    p = (uint8_t*)nfc_hal_cb.prm.p_cur_patch_data;
-    p_start = p;
-    STREAM_TO_UINT16(patchfile_project_id, p);
-    STREAM_TO_UINT16(patchfile_ver_major, p);
-    STREAM_TO_UINT16(patchfile_ver_minor, p);
-
-    /* RFU */
-    p++;
-
-    /* Check how many patches are in the patch file */
-    STREAM_TO_UINT8(u8, p);
-
-    /* Should only be one patch */
-    if (u8 > 1) {
-      HAL_TRACE_ERROR1("Invalid i2c fix: invalid number of patches (%i)", u8);
-      nfc_hal_prm_spd_handle_download_complete(
-          NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-      return;
-    }
-
-    /* Get info about the i2c patch*/
-    STREAM_TO_UINT8(u8, p); /* power mode (not needed for i2c patch)    */
-    STREAM_TO_UINT16(patchfile_patchsize, p); /* size of patch */
-
-    /* 5 byte RFU */
-    p += 5;
-
-    /* Adjust length to exclude patchfiloe header */
-    nfc_hal_cb.prm.cur_patch_len_remaining -=
-        (uint16_t)(p - p_start); /* Adjust size of patchfile */
-    nfc_hal_cb.prm.cur_patch_offset += (uint16_t)(
-        p - p_start); /* Bytes of patchfile transmitted/processed so far */
-
-    /* Begin sending patch to the NFCC */
-    nfc_hal_prm_spd_send_next_segment();
-  } else {
-    /* ERROR: Bad length for patchfile */
-    HAL_TRACE_ERROR0("Invalid i2c fix: unexpected end of patch");
-    nfc_hal_prm_spd_handle_download_complete(
-        NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-  }
-}
-#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_check_version_continue
-**
-** Description      Check patchfile version with current downloaded version
-**
-** Returns          void
-**
-*******************************************************************************/
-static void nfc_hal_prm_spd_check_version_continue(void) {
-  HAL_TRACE_DEBUG1("nfc_hal_prm_spd_check_version_continue 0x%02x",
-                   nfc_hal_cb.prm.flags);
-  if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_RM_RF) {
-    HAL_TRACE_DEBUG0("erase relevant blocks in NVM");
-    nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_RM_RF;
-    if (!nfc_hal_prm_nvm_rw_cmd()) {
-      /* nvm rw started successfully */
-      return;
-    }
-  }
-#if (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)
-  if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED) {
-    HAL_TRACE_DEBUG0("I2C patch fix required.");
-    /* Download i2c fix first */
-    nfc_hal_prm_spd_download_i2c_fix();
-    return;
-  }
-#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
-
-  /* Download first segment */
-  nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
-  if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)) {
-    /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the next
-     * patch segment */
-    (nfc_hal_cb.prm.p_cback)(NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
-  } else {
-    nfc_hal_prm_spd_handle_next_patch_start();
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_check_version
-**
-** Description      Check patchfile version with current downloaded version
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_check_version(void) {
-  uint8_t *p, *p_start, i;
-  uint32_t nvm_patch_present_mask = 0;
-  uint32_t patchfile_patch_present_mask;
-  uint16_t patchfile_project_id = 0;
-  uint16_t patchfile_ver_major = 0;
-  uint16_t patchfile_ver_minor = 0;
-  uint16_t patchfile_patchsize;
-
-  uint8_t return_code = NFC_HAL_PRM_COMPLETE_EVT;
-
-  /* Initialize patchfile offset pointers */
-  p = p_start = NULL;
-  patchfile_patchsize = 0;
-
-  /* the good patches in NVM */
-  if (nfc_hal_cb.nvm_cb.lpm_size &&
-      !(nfc_hal_cb.nvm_cb.flags & (NFC_HAL_NVM_FLAGS_LPM_BAD)))
-    nvm_patch_present_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_LPM);
-
-  if (nfc_hal_cb.nvm_cb.fpm_size &&
-      !(nfc_hal_cb.nvm_cb.flags & (NFC_HAL_NVM_FLAGS_FPM_BAD)))
-    nvm_patch_present_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_FPM);
-
-  /* Get patchfile version */
-  if (nfc_hal_cb.prm.cur_patch_len_remaining >=
-      NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN) {
-    /* Parse patchfile header */
-    p = (uint8_t*)nfc_hal_cb.prm.p_cur_patch_data;
-    p_start = p;
-    STREAM_TO_UINT16(patchfile_project_id, p);
-    STREAM_TO_UINT16(patchfile_ver_major, p);
-    STREAM_TO_UINT16(patchfile_ver_minor, p);
-
-    /* RFU */
-    p++;
-
-    /* Check how many patches are in the patch file */
-    STREAM_TO_UINT8(nfc_hal_cb.prm.spd_patch_count, p);
-
-    if (nfc_hal_cb.prm.spd_patch_count > NFC_HAL_PRM_MAX_PATCH_COUNT) {
-      HAL_TRACE_ERROR2(
-          "Unsupported patchfile (number of patches (%i) exceeds maximum (%i)",
-          nfc_hal_cb.prm.spd_patch_count, NFC_HAL_PRM_MAX_PATCH_COUNT);
-    }
-
-    /* Mask of patches that are present in the patchfile */
-    patchfile_patch_present_mask = 0;
-
-    /* Get lengths for each patch */
-    for (i = 0; i < nfc_hal_cb.prm.spd_patch_count; i++) {
-      /* Get power mode for this patch */
-      STREAM_TO_UINT8(nfc_hal_cb.prm.spd_patch_desc[i].power_mode, p);
-
-      /* Update mask of power-modes present in the patchfile */
-      patchfile_patch_present_mask |=
-          ((uint32_t)1 << nfc_hal_cb.prm.spd_patch_desc[i].power_mode);
-
-      /* Get length of patch */
-      STREAM_TO_UINT16(nfc_hal_cb.prm.spd_patch_desc[i].len, p);
-
-      /* Add total size of patches */
-      patchfile_patchsize += nfc_hal_cb.prm.spd_patch_desc[i].len;
-
-      /* 5 byte RFU */
-      p += 5;
-    }
-
-    /* Adjust offset to after the patch file header */
-    nfc_hal_cb.prm.cur_patch_offset += (uint16_t)(
-        p - p_start); /* Bytes of patchfile transmitted/processed so far */
-    nfc_hal_cb.prm.cur_patch_len_remaining -=
-        (uint16_t)(p - p_start); /* Adjust size of patchfile */
-
-    HAL_TRACE_DEBUG4(
-        "NVM Patch info: flags=0x%04x,   Ver=%i.%i, PatchMask=0x%08x",
-        nfc_hal_cb.nvm_cb.flags, nfc_hal_cb.nvm_cb.ver_major,
-        nfc_hal_cb.nvm_cb.ver_minor, nvm_patch_present_mask);
-    HAL_TRACE_DEBUG6(
-        "Patchfile info: ProjID=0x%04x,  Ver=%i.%i, Num patches=%i, "
-        "PatchMask=0x%08x, PatchSize=%i",
-        patchfile_project_id, patchfile_ver_major, patchfile_ver_minor,
-        nfc_hal_cb.prm.spd_patch_count, patchfile_patch_present_mask,
-        patchfile_patchsize);
-
-    /*********************************************************************
-    * Version check of patchfile against NVM
-    *********************************************************************/
-    /* Download the patchfile if no patches in NVM */
-    if ((nfc_hal_cb.nvm_cb.project_id == 0) ||
-        !(nfc_hal_cb.nvm_cb.flags & NFC_HAL_NVM_FLAGS_PATCH_PRESENT)) {
-      /* No patch in NVM, need to download all */
-      nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask;
-      if (nfc_hal_cb.dev_cb.brcm_hw_id == BRCM_20795A1_ID) {
-        nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_RM_RF;
-        nfc_hal_cb.prm.p_param = (void*)nfc_hal_prm_rm_rf_20795a1;
-        nfc_hal_cb.prm.param_idx = 0;
-      }
-
-      HAL_TRACE_DEBUG2("No previous patch detected. Downloading patch %i.%i",
-                       patchfile_ver_major, patchfile_ver_minor);
-    }
-    /* Skip download if project ID of patchfile does not match NVM */
-    else if (nfc_hal_cb.nvm_cb.project_id != patchfile_project_id) {
-      /* Project IDs mismatch */
-      HAL_TRACE_DEBUG2(
-          "Patch download skipped: Mismatched Project ID (NVM ProjId: 0x%04x, "
-          "Patchfile ProjId: 0x%04x)",
-          nfc_hal_cb.nvm_cb.project_id, patchfile_project_id);
-
-      return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT;
-    }
-    /* Skip download if version of patchfile is equal to version in NVM */
-    /*                  and patches of the power modes are the same as the good
-       patches in NVM */
-    else if ((nfc_hal_cb.nvm_cb.ver_major == patchfile_ver_major) &&
-             (nfc_hal_cb.nvm_cb.ver_minor == patchfile_ver_minor) &&
-             ((nvm_patch_present_mask | patchfile_patch_present_mask) ==
-              nvm_patch_present_mask)) /* if the NVM patch include all the
-                                          patched in file */
-    {
-      HAL_TRACE_DEBUG2(
-          "Patch download skipped. NVM patch (version %i.%i) is the same than "
-          "the patchfile ",
-          nfc_hal_cb.nvm_cb.ver_major, nfc_hal_cb.nvm_cb.ver_minor);
-
-      return_code = NFC_HAL_PRM_COMPLETE_EVT;
-    }
-    /* Remaining cases: Download all patches in the patchfile */
-    else {
-      nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask;
-
-      HAL_TRACE_DEBUG4(
-          "Downloading patch version: %i.%i (previous version in NVM: "
-          "%i.%i)...",
-          patchfile_ver_major, patchfile_ver_minor, nfc_hal_cb.nvm_cb.ver_major,
-          nfc_hal_cb.nvm_cb.ver_minor);
-    }
-
-  } else {
-    /* Invalid patch file header */
-    HAL_TRACE_ERROR0("Invalid patch file header.");
-
-    return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT;
-  }
-
-  /* If we need to download anything, get the first patch to download */
-  if (nfc_hal_cb.prm.spd_patch_needed_mask) {
-    HAL_TRACE_ERROR4(
-        "Downloading patch version: %i.%i (previous version in NVM: %i.%i)...",
-        patchfile_ver_major, patchfile_ver_minor, nfc_hal_cb.nvm_cb.ver_major,
-        nfc_hal_cb.nvm_cb.ver_minor);
-#if (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)
-    /* Check if I2C patch is needed: if                                     */
-    /*      - I2C patch file was provided using HAL_NfcPrmSetI2cPatch, and */
-    /*      -   current patch in NVM has ProjectID=0, or                    */
-    /*          FPM is not present or corrupted, or                         */
-    /*          or patchfile is major-ver 76+                               */
-    /*          or patchfile is not for B3 (always download for B4 onward)  */
-    if ((nfc_hal_cb.prm_i2c.p_patch) &&
-        ((nfc_hal_cb.nvm_cb.project_id == 0) ||
-         (nfc_hal_cb.nvm_cb.fpm_size == 0) ||
-         (nfc_hal_cb.nvm_cb.flags & NFC_HAL_NVM_FLAGS_FPM_BAD) ||
-         (patchfile_ver_major >= 76) ||
-         (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_BCM20791B3)))) {
-      HAL_TRACE_DEBUG0("I2C patch fix required.");
-      nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED;
-    }
-#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
-    nfc_hal_prm_spd_check_version_continue();
-  } else {
-    static bool firstTime = true;
-    if (firstTime) {
-      HAL_TRACE_ERROR2("NVM patch version is %d.%d",
-                       nfc_hal_cb.nvm_cb.ver_major,
-                       nfc_hal_cb.nvm_cb.ver_minor);
-      firstTime = false;
-    }
-    /* Download complete */
-    nfc_hal_prm_spd_handle_download_complete(return_code);
-  }
-}
-
-#if (NFC_HAL_TRACE_VERBOSE == TRUE)
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_status_str
-**
-** Description      Return status string for a given spd status code
-**
-** Returns          Status string
-**
-*******************************************************************************/
-uint8_t* nfc_hal_prm_spd_status_str(uint8_t spd_status_code) {
-  char* p_str;
-
-  switch (spd_status_code) {
-    case NCI_STATUS_SPD_ERROR_DEST:
-      p_str = "SPD_ERROR_DEST";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_PROJECTID:
-      p_str = "SPD_ERROR_PROJECTID";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_CHIPVER:
-      p_str = "SPD_ERROR_CHIPVER";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_MAJORVER:
-      p_str = "SPD_ERROR_MAJORVER";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_INVALID_PARAM:
-      p_str = "SPD_ERROR_INVALID_PARAM";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_INVALID_SIG:
-      p_str = "SPD_ERROR_INVALID_SIG";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_NVM_CORRUPTED:
-      p_str = "SPD_ERROR_NVM_CORRUPTED";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_PWR_MODE:
-      p_str = "SPD_ERROR_PWR_MODE";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_MSG_LEN:
-      p_str = "SPD_ERROR_MSG_LEN";
-      break;
-
-    case NCI_STATUS_SPD_ERROR_PATCHSIZE:
-      p_str = "SPD_ERROR_PATCHSIZE";
-      break;
-
-    default:
-      p_str = "Unspecified Error";
-      break;
-  }
-
-  return ((uint8_t*)p_str);
-}
-#endif /* (NFC_HAL_TRACE_VERBOSE == TRUE) */
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_nvm_rw_cmd
-**
-** Description      Non Volatile Read Write Command; for now only write zeros
-**
-** Returns          TRUE if done.
-**
-*******************************************************************************/
-static bool nfc_hal_prm_nvm_rw_cmd(void) {
-  tNFC_HAL_PRM_RM_RF* p_param = (tNFC_HAL_PRM_RM_RF*)(nfc_hal_cb.prm.p_param);
-  uint8_t *p_buff, *p, *p_end;
-  uint8_t len = 0;
-  uint16_t cmd_len;
-
-  if (p_param) len = p_param[nfc_hal_cb.prm.param_idx].len;
-  HAL_TRACE_DEBUG2("nfc_hal_prm_nvm_rw_cmd: %d/%d", nfc_hal_cb.prm.param_idx,
-                   len);
-  if (len == 0) {
-    return true;
-  }
-  cmd_len = len + 7;
-
-  p_buff = (uint8_t*)GKI_getbuf(cmd_len);
-  if (p_buff == NULL) {
-    HAL_TRACE_ERROR0("NVM No buffer");
-    nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_EVT);
-    return true;
-  }
-
-  p = p_buff;
-
-  UINT8_TO_STREAM(p, (NCI_MTS_CMD | NCI_GID_PROP));
-  UINT8_TO_STREAM(p, NCI_MSG_EEPROM_RW);
-  UINT8_TO_STREAM(p, (len + 4));
-  UINT8_TO_STREAM(p, 1); /* 1=write 0=read */
-  UINT16_TO_STREAM(p, p_param[nfc_hal_cb.prm.param_idx].offset);
-  UINT8_TO_STREAM(p, len);
-  memset(p, 0, len); /* Fill remaining bytes with zeros*/
-
-  nfc_hal_cb.prm.param_idx++;
-  nfc_hal_dm_send_nci_cmd(p_buff, cmd_len,
-                          nfc_hal_prm_nci_command_complete_cback);
-  GKI_freebuf(p_buff);
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_nci_command_complete_cback
-**
-** Description      Callback for NCI vendor specific command complete
-**                  (for secure patch download)
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_nci_command_complete_cback(tNFC_HAL_NCI_EVT event,
-                                            uint16_t data_len,
-                                            uint8_t* p_data) {
-  uint8_t status, u8;
-  uint8_t* p;
-  uint32_t post_signature_delay;
-
-  NFC_HAL_PRM_STATE("nfc_hal_prm_nci_command_complete_cback");
-
-  /* Stop the command-timeout timer */
-  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.prm.timer);
-
-  /* Skip over NCI header */
-  p = p_data + NCI_MSG_HDR_SIZE;
-
-  /* Handle SECURE_PATCH_DOWNLOAD Rsp */
-  if (event == NFC_VS_SEC_PATCH_DOWNLOAD_EVT) {
-    /* Status and error code */
-    STREAM_TO_UINT8(status, p);
-    STREAM_TO_UINT8(u8, p);
-
-    if (status != NCI_STATUS_OK) {
-#if (NFC_HAL_TRACE_VERBOSE == TRUE)
-      HAL_TRACE_ERROR2("Patch download failed, reason code=0x%X (%s)", status,
-                       nfc_hal_prm_spd_status_str(status));
-#else
-      HAL_TRACE_ERROR1("Patch download failed, reason code=0x%X", status);
-#endif
-
-      /* Notify application */
-      nfc_hal_prm_spd_handle_download_complete(
-          NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-      return;
-    }
-
-    /* If last segment (SIGNATURE) sent */
-    if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SIGNATURE_SENT) {
-      /* Wait for authentication complete (SECURE_PATCH_DOWNLOAD NTF), including
-       * time to commit to NVM (for BCM43341B0) */
-      nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTHENTICATING;
-      nfc_hal_main_start_quick_timer(
-          &nfc_hal_cb.prm.timer, 0x00,
-          (NFC_HAL_PRM_COMMIT_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000);
-      return;
-    }
-    /* Download next segment */
-    else if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) {
-      /* If patch is in a buffer, get next patch from buffer */
-      nfc_hal_prm_spd_send_next_segment();
-    } else {
-      /* Notify adaptation layer to get next patch segment (via
-       * HAL_NfcPrmDownloadContinue) */
-      (nfc_hal_cb.prm.p_cback)(NFC_HAL_PRM_CONTINUE_EVT);
-    }
-  }
-  /* Handle SECURE_PATCH_DOWNLOAD NTF */
-  else if (event == NFC_VS_SEC_PATCH_AUTH_EVT) {
-    HAL_TRACE_DEBUG1("prm flags:0x%x.", nfc_hal_cb.prm.flags);
-    /* Status and error code */
-    STREAM_TO_UINT8(status, p);
-    STREAM_TO_UINT8(u8, p);
-
-    /* Sanity check - should only get this NTF while in AUTHENTICATING stage */
-    if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTHENTICATING) {
-      if (status != NCI_STATUS_OK) {
-        HAL_TRACE_ERROR0("Patch authentication failed");
-        nfc_hal_prm_spd_handle_download_complete(
-            NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT);
-        return;
-      }
-
-#if (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)
-      if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED) {
-        HAL_TRACE_DEBUG1(
-            "PreI2C patch downloaded...waiting %i ms for NFCC to reboot.",
-            nfc_hal_cb.prm_i2c.prei2c_delay);
-
-        /* Restore pointers to patchfile */
-        nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED;
-        nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm.p_spd_patch;
-        nfc_hal_cb.prm.cur_patch_offset = nfc_hal_cb.prm.spd_patch_offset;
-        nfc_hal_cb.prm.cur_patch_len_remaining =
-            nfc_hal_cb.prm.spd_patch_len_remaining;
-
-        /* Resume normal patch download */
-        nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
-        nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
-
-        /* Post PreI2C delay */
-        nfc_hal_main_start_quick_timer(
-            &nfc_hal_cb.prm.timer, 0x00,
-            (nfc_hal_cb.prm_i2c.prei2c_delay * QUICK_TIMER_TICKS_PER_SEC) /
-                1000);
-
-        return;
-      }
-#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
-
-      /* Wait for NFCC to save the patch to NVM */
-      if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_BCM20791B3)) {
-        /* 20791B4 or newer - wait for RESET_NTF; including time to commit to
-         * NVM (for BCM20791B4+) */
-        post_signature_delay = NFC_HAL_PRM_COMMIT_DELAY;
-        HAL_TRACE_DEBUG1(
-            "Patch downloaded and authenticated. Waiting %i ms for RESET "
-            "NTF...",
-            post_signature_delay);
-
-      } else if (nfc_hal_cb.nvm_cb.flags & NFC_HAL_NVM_FLAGS_NO_NVM) {
-        /* No NVM. Wait for NFCC to restart */
-        post_signature_delay = NFC_HAL_PRM_END_DELAY;
-        HAL_TRACE_DEBUG1(
-            "Patch downloaded and authenticated. Waiting %i ms for NFCC to "
-            "restart...",
-            post_signature_delay);
-      } else {
-        /* Wait for NFCC to save the patch to NVM (need about 1 ms per byte) */
-        post_signature_delay =
-            nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len;
-        if (post_signature_delay < nfc_hal_cb.prm.patchram_delay)
-          post_signature_delay = nfc_hal_cb.prm.patchram_delay;
-        HAL_TRACE_DEBUG1(
-            "Patch downloaded and authenticated. Waiting %i ms for NVM update "
-            "to complete...",
-            post_signature_delay);
-      }
-
-      nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTH_DONE;
-
-      nfc_hal_main_start_quick_timer(
-          &nfc_hal_cb.prm.timer, 0x00,
-          (post_signature_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000);
-    } else {
-      HAL_TRACE_ERROR0("Got unexpected SECURE_PATCH_DOWNLOAD NTF");
-      nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_EVT);
-    }
-  }
-  /* Handle NCI_MSG_GET_PATCH_VERSION RSP */
-  else if (event == NFC_VS_GET_PATCH_VERSION_EVT) {
-    nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_COMPLETE_EVT);
-  } else if (event == NFC_VS_EEPROM_RW_EVT) {
-    STREAM_TO_UINT8(status, p);
-    if (status == NCI_STATUS_OK) {
-      if (nfc_hal_prm_nvm_rw_cmd()) {
-        nfc_hal_prm_spd_check_version_continue();
-      }
-    } else {
-      HAL_TRACE_ERROR0("NVM failed");
-      nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_EVT);
-    }
-  } else {
-    /* Invalid response from NFCC during patch download */
-    HAL_TRACE_ERROR1(
-        "Invalid response from NFCC during patch download (opcode=0x%02X)",
-        event);
-    nfc_hal_prm_spd_handle_download_complete(
-        NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
-  }
-
-  NFC_HAL_PRM_STATE("prm_nci_command_complete_cback");
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_nfcc_ready_to_continue
-**
-** Description      Continue to download patch or notify application
-*completition
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_nfcc_ready_to_continue(void) {
-  uint8_t get_patch_version_cmd[NCI_MSG_HDR_SIZE] = {
-      NCI_MTS_CMD | NCI_GID_PROP, NCI_MSG_GET_PATCH_VERSION, 0x00};
-
-  /* Clear the bit for the patch we just downloaded */
-  nfc_hal_cb.prm.spd_patch_needed_mask &=
-      ~((uint32_t)1 << nfc_hal_cb.prm
-                           .spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx]
-                           .power_mode);
-
-  /* Check if another patch to download */
-  nfc_hal_cb.prm.spd_cur_patch_idx++;
-  if ((nfc_hal_cb.prm.spd_patch_needed_mask) &&
-      (nfc_hal_cb.prm.spd_cur_patch_idx < nfc_hal_cb.prm.spd_patch_count)) {
-    nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
-    nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
-
-    if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) {
-      /* If patch is in a buffer, get next patch from buffer */
-      nfc_hal_prm_spd_handle_next_patch_start();
-    } else {
-      /* Notify adaptation layer to get next patch header (via
-       * HAL_NfcPrmDownloadContinue) */
-      (nfc_hal_cb.prm.p_cback)(NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
-    }
-
-  } else {
-    /* Done downloading */
-    HAL_TRACE_DEBUG0(
-        "Patch downloaded and authenticated. Get new patch version.");
-    /* add get patch info again to verify the effective FW version */
-    nfc_hal_dm_send_nci_cmd(get_patch_version_cmd, NCI_MSG_HDR_SIZE,
-                            nfc_hal_prm_nci_command_complete_cback);
-    nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_W4_GET_VERSION;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_spd_reset_ntf
-**
-** Description      Received RESET NTF from NFCC, indicating it has completed
-**                  reset after patch download.
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_spd_reset_ntf(uint8_t reset_reason, uint8_t reset_type) {
-  /* Check if we were expecting a RESET NTF */
-  if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) {
-    HAL_TRACE_DEBUG2(
-        "Received RESET NTF after patch download (reset_reason=%i, "
-        "reset_type=%i)",
-        reset_reason, reset_type);
-
-    /* Stop waiting for RESET NTF */
-    nfc_hal_main_stop_quick_timer(&nfc_hal_cb.prm.timer);
-
-    {
-      /* Continue with patch download */
-      nfc_hal_prm_nfcc_ready_to_continue();
-    }
-  } else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) {
-    HAL_TRACE_DEBUG0(
-        "Received RESET NTF after pre-I2C patch download. Proceeding with "
-        "patch download...");
-
-    /* Stop waiting for RESET NTF */
-    nfc_hal_main_stop_quick_timer(&nfc_hal_cb.prm.timer);
-    nfc_hal_prm_spd_handle_next_patch_start();
-  } else {
-    HAL_TRACE_ERROR2(
-        "Received unexpected RESET NTF (reset_reason=%i, reset_type=%i)",
-        reset_reason, reset_type);
-  }
-}
-
-/*******************************************************************************
-**
-** Function:    nfc_post_final_baud_update
-**
-** Description: Called after baud rate udate
-**
-** Returns:     Nothing
-**
-*******************************************************************************/
-void nfc_hal_prm_post_baud_update(tHAL_NFC_STATUS status) {
-  NFC_HAL_PRM_STATE("nfc_hal_prm_post_baud_update");
-
-  if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) {
-    /* Proceed with next step of patch download sequence */
-    nfc_hal_prm_nfcc_ready_to_continue();
-  }
-}
-
-/*******************************************************************************
-**
-** Function         nfc_hal_prm_process_timeout
-**
-** Description      Process timer expireation for patch download
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_prm_process_timeout(void* p_tle) {
-  NFC_HAL_PRM_STATE("nfc_hal_prm_process_timeout");
-
-  if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) {
-    if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_BCM20791B3)) {
-      /* Timeout waiting for RESET NTF after signature sent */
-      HAL_TRACE_ERROR0("Timeout waiting for RESET NTF after patch download");
-      nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_EVT);
-    } else {
-      nfc_hal_prm_nfcc_ready_to_continue();
-    }
-  } else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) {
-    HAL_TRACE_DEBUG0(
-        "Delay after PreI2C patch download...proceeding to download firmware "
-        "patch");
-    nfc_hal_prm_spd_handle_next_patch_start();
-  } else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_W4_GET_VERSION) {
-    HAL_TRACE_DEBUG0("get patch version timeout???");
-    nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_COMPLETE_EVT);
-  } else {
-    HAL_TRACE_ERROR1("Patch download: command timeout (state=%i)",
-                     nfc_hal_cb.prm.state);
-
-    nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_EVT);
-  }
-
-  NFC_HAL_PRM_STATE("nfc_hal_prm_process_timeout");
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmDownloadStart
-**
-** Description      Initiate patch download
-**
-** Input Params
-**                  format_type     patch format type
-**                                  (NFC_HAL_PRM_FORMAT_BIN,
-*NFC_HAL_PRM_FORMAT_HCD, or
-**                                   NFC_HAL_PRM_FORMAT_NCD)
-**
-**                  dest_address    destination adderess (needed for BIN format
-*only)
-**
-**                  p_patchram_buf  pointer to patchram buffer. If NULL,
-**                                  then app must call
-*HAL_NfcPrmDownloadContinue when
-**                                  NFC_HAL_PRM_CONTINUE_EVT is received, to
-*send the next
-**                                  segment of patchram
-**
-**                  patchram_len    size of p_patchram_buf (if non-NULL)
-**
-**                  patchram_delay  The delay after each patch.
-**                                  If the given value is less than the size of
-*the patchram,
-**                                  the size of patchram is used instead.
-**
-**                  p_cback         callback for download status
-**
-**
-** Returns          TRUE if successful, otherwise FALSE
-**
-**
-*******************************************************************************/
-bool HAL_NfcPrmDownloadStart(tNFC_HAL_PRM_FORMAT format_type,
-                             uint32_t dest_address, uint8_t* p_patchram_buf,
-                             uint32_t patchram_len, uint32_t patchram_delay,
-                             tNFC_HAL_PRM_CBACK* p_cback) {
-  HAL_TRACE_API0("HAL_NfcPrmDownloadStart ()");
-
-  memset(&nfc_hal_cb.prm, 0, sizeof(tNFC_HAL_PRM_CB));
-
-  if (p_patchram_buf) {
-    nfc_hal_cb.prm.p_cur_patch_data = p_patchram_buf;
-    nfc_hal_cb.prm.cur_patch_offset = 0;
-    nfc_hal_cb.prm.cur_patch_len_remaining = (uint16_t)patchram_len;
-    nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF;
-
-    if (patchram_len == 0) return false;
-  }
-
-  nfc_hal_cb.prm.p_cback = p_cback;
-  nfc_hal_cb.prm.dest_ram = dest_address;
-  nfc_hal_cb.prm.format = format_type;
-  nfc_hal_cb.prm.patchram_delay = patchram_delay;
-
-  nfc_hal_cb.prm.timer.p_cback = nfc_hal_prm_process_timeout;
-
-  if (format_type == NFC_HAL_PRM_FORMAT_NCD) {
-    /* Store patch buffer pointer and length */
-    nfc_hal_cb.prm.p_spd_patch = p_patchram_buf;
-    nfc_hal_cb.prm.spd_patch_len_remaining = (uint16_t)patchram_len;
-    nfc_hal_cb.prm.spd_patch_offset = 0;
-
-    /* If patch download is required, but no NVM is available, then abort */
-    if ((p_nfc_hal_cfg->nfc_hal_prm_nvm_required) &&
-        (nfc_hal_cb.nvm_cb.flags & NFC_HAL_NVM_FLAGS_NO_NVM)) {
-      HAL_TRACE_ERROR0(
-          "This platform requires NVM and the NVM is not available - Abort");
-      nfc_hal_prm_spd_handle_download_complete(NFC_HAL_PRM_ABORT_NO_NVM_EVT);
-      return false;
-    }
-
-    /* Compare patch version in NVM with version in patchfile */
-    nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_COMPARE_VERSION;
-    if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) {
-      /* If patchfile is in a buffer, get patch version from buffer */
-      nfc_hal_prm_spd_check_version();
-    } else {
-      /* If patchfile is not in a buffer, then request patchfile header from
-       * adaptation layer. */
-      (nfc_hal_cb.prm.p_cback)(NFC_HAL_PRM_SPD_GET_PATCHFILE_HDR_EVT);
-    }
-  } else {
-    HAL_TRACE_ERROR0("Unexpected patch format.");
-    return false;
-  }
-
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmDownloadContinue
-**
-** Description      Send next segment of patchram to controller. Called when
-**                  NFC_HAL_PRM_CONTINUE_EVT is received.
-**
-**                  Only needed if HAL_NfcPrmDownloadStart was called with
-**                  p_patchram_buf=NULL
-**
-** Input Params     p_patch_data    pointer to patch data
-**                  patch_data_len  patch data len
-**
-** Returns          TRUE if successful, otherwise FALSE
-**
-*******************************************************************************/
-bool HAL_NfcPrmDownloadContinue(uint8_t* p_patch_data,
-                                uint16_t patch_data_len) {
-  HAL_TRACE_API2("HAL_NfcPrmDownloadContinue ():state = %d, patch_data_len=%d",
-                 nfc_hal_cb.prm.state, patch_data_len);
-
-  /* Check if we are in a valid state for this API */
-  if ((nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_COMPARE_VERSION) &&
-      (nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) &&
-      (nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_DOWNLOADING))
-    return false;
-
-  if (patch_data_len == 0) return false;
-
-  nfc_hal_cb.prm.cur_patch_offset = 0;
-  nfc_hal_cb.prm.p_cur_patch_data = p_patch_data;
-  nfc_hal_cb.prm.cur_patch_len_remaining = patch_data_len;
-
-  /* Call appropriate handler */
-  if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_COMPARE_VERSION) {
-    nfc_hal_prm_spd_check_version();
-  } else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) {
-    nfc_hal_prm_spd_handle_next_patch_start();
-  } else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_DOWNLOADING) {
-    nfc_hal_prm_spd_send_next_segment();
-  } else {
-    HAL_TRACE_ERROR1("Unexpected patch state:%d.", nfc_hal_cb.prm.state);
-  }
-
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmSetI2cPatch
-**
-** Description      Specify patchfile for BCM20791B3 I2C fix. This fix
-**                  must be downloaded prior to initial patch download for I2C
-**                  transport
-**
-** Input Params     p_i2c_patchfile_buf: pointer to patch for i2c fix
-**                  i2c_patchfile_len: length of patch
-**                  prei2c_delay: the delay before downloading main patch
-**                                if 0 is given, NFC_HAL_PRM_POST_I2C_FIX_DELAY
-*is used instead.
-**
-** Returns          Nothing
-**
-**
-*******************************************************************************/
-void HAL_NfcPrmSetI2cPatch(uint8_t* p_i2c_patchfile_buf,
-                           uint16_t i2c_patchfile_len, uint32_t prei2c_delay) {
-#if (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)
-  HAL_TRACE_API0("HAL_NfcPrmSetI2cPatch ()");
-
-  nfc_hal_cb.prm_i2c.prei2c_delay = NFC_HAL_PRM_POST_I2C_FIX_DELAY;
-  if (prei2c_delay) nfc_hal_cb.prm_i2c.prei2c_delay = prei2c_delay;
-  nfc_hal_cb.prm_i2c.p_patch = p_i2c_patchfile_buf;
-  nfc_hal_cb.prm_i2c.len = i2c_patchfile_len;
-#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
-}
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmSetSpdNciCmdPayloadSize
-**
-** Description      Set Host-to-NFCC NCI message size for secure patch download
-**
-**                  This API must be called before calling
-*HAL_NfcPrmDownloadStart.
-**                  If the API is not called, then PRM will use the default
-**                  message size.
-**
-**                  Typically, this API is only called for platforms that have
-**                  message-size limitations in the transport/driver.
-**
-**                  Valid message size range:
-*NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE to 255.
-**
-** Returns          HAL_NFC_STATUS_OK if successful
-**                  HAL_NFC_STATUS_FAILED otherwise
-**
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcPrmSetSpdNciCmdPayloadSize(uint8_t max_payload_size) {
-  /* Validate: minimum size is NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE */
-  if (max_payload_size < NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE) {
-    HAL_TRACE_ERROR2(
-        "HAL_NfcPrmSetSpdNciCmdPayloadSize: invalid size (%i). Must be between "
-        "%i and 255",
-        max_payload_size, NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE);
-    return (HAL_NFC_STATUS_FAILED);
-  } else {
-    HAL_TRACE_API1(
-        "HAL_NfcPrmSetSpdNciCmdPayloadSize: new message size during download: "
-        "%i",
-        max_payload_size);
-    nfc_hal_cb.ncit_cb.nci_ctrl_size = max_payload_size;
-    return (HAL_NFC_STATUS_OK);
-  }
-}
diff --git a/halimpl/bcm2079x/include/HalAdaptation.h b/halimpl/bcm2079x/include/HalAdaptation.h
deleted file mode 100644
index a6e3bd1..0000000
--- a/halimpl/bcm2079x/include/HalAdaptation.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  HAL Adaptation Interface (HAI). This interface regulates the interaction
- *  between standard Android HAL and Broadcom-specific HAL.  It adapts
- *  Broadcom-specific features to the Android framework.
- *
- ******************************************************************************/
-#pragma once
-#include <hardware/hardware.h>
-#include <hardware/nfc.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct {
-  struct nfc_nci_device nci_device;
-  // below declarations are private variables within Broadcom HAL
-  void* data;
-} bcm2079x_dev_t;
-
-/*
-All functions return POSIX error codes (see errno):
-  0 means success.
-  non-zero means failure; for example EACCES.
-*/
-
-extern int HaiInitializeLibrary(const bcm2079x_dev_t* device);
-extern int HaiTerminateLibrary();
-extern int HaiOpen(const bcm2079x_dev_t* device,
-                   nfc_stack_callback_t* halCallbackFunc,
-                   nfc_stack_data_callback_t* halDataCallbackFunc);
-extern int HaiClose(const bcm2079x_dev_t* device);
-extern int HaiCoreInitialized(const bcm2079x_dev_t* device,
-                              uint8_t* coreInitResponseParams);
-extern int HaiWrite(const bcm2079x_dev_t* dev, uint16_t dataLen,
-                    const uint8_t* data);
-extern int HaiPreDiscover(const bcm2079x_dev_t* device);
-extern int HaiControlGranted(const bcm2079x_dev_t* device);
-extern int HaiPowerCycle(const bcm2079x_dev_t* device);
-extern int HaiGetMaxNfcee(const bcm2079x_dev_t* device, uint8_t* maxNfcee);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/halimpl/bcm2079x/include/StartupConfig.h b/halimpl/bcm2079x/include/StartupConfig.h
deleted file mode 100644
index 1dbb5c3..0000000
--- a/halimpl/bcm2079x/include/StartupConfig.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- * Construct a buffer that contains multiple Type-Length-Value contents
- * that is used by the HAL in a CORE_SET_CONFIG NCI command.
- ******************************************************************************/
-
-#pragma once
-#include <string>
-#include "bt_types.h"
-
-class StartupConfig {
- public:
-  typedef std::basic_string<uint8_t> uint8_string;
-  StartupConfig();
-
-  /*******************************************************************************
-  **
-  ** Function:        initialize
-  **
-  ** Description:     Reset all member variables.
-  **
-  ** Returns:         None
-  **
-  *******************************************************************************/
-  void initialize();
-
-  /*******************************************************************************
-  **
-  ** Function:        getInternalBuffer
-  **
-  ** Description:     Get the pointer to buffer that contains multiple
-  **                  Type-Length-Value contents.
-  **
-  ** Returns:         Pointer to buffer.
-  **
-  *******************************************************************************/
-  const uint8_t* getInternalBuffer();
-
-  /*******************************************************************************
-  **
-  ** Function:        append
-  **
-  ** Description:     Append new config data to internal buffer.
-  **                  newContent: buffer containing new content; newContent[0]
-  *is
-  **                          payload length; newContent[1..end] is payload.
-  **                  newContentLen: total length of newContent.
-  **
-  ** Returns:         True if ok.
-  **
-  *******************************************************************************/
-  bool append(const uint8_t* newContent, uint8_t newContentLen);
-
-  /*******************************************************************************
-  **
-  ** Function:        disableSecureElement
-  **
-  ** Description:     Adjust a TLV to disable secure element(s).  The TLV's type
-  *is 0xC2.
-  **                  bitmask: 0xC0 = do not detect any secure element.
-  **                           0x40 = do not detect secure element in slot 0.
-  **                           0x80 = do not detect secure element in slot 1.
-  **
-  ** Returns:         True if ok.
-  **
-  *******************************************************************************/
-  bool disableSecureElement(uint8_t bitmask);
-
- private:
-  static const uint8_t mMaxLength;
-  uint8_string mBuffer;
-};
diff --git a/halimpl/bcm2079x/include/_OverrideLog.h b/halimpl/bcm2079x/include/_OverrideLog.h
deleted file mode 100644
index 7f9a65f..0000000
--- a/halimpl/bcm2079x/include/_OverrideLog.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Override the Android logging macro(s) from
- *  /system/core/include/cutils/log.h. This header must be the first header
- *  included by a *.cpp file so the original Android macro can be replaced.
- *  Do not include this header in another header, because that will create
- *  unnecessary dependency.
- *
- ******************************************************************************/
-#pragma once
-
-// Override Android's ALOGD macro by adding a boolean expression.
-#define ALOGD(...) \
-  ((void)ALOGD_IF(appl_trace_level >= BT_TRACE_LEVEL_DEBUG, __VA_ARGS__))
-
-#include <cutils/log.h>  //define Android logging macros
-#include "bt_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern unsigned char appl_trace_level;
-extern uint32_t ScrProtocolTraceFlag;
-
-/*******************************************************************************
-**
-** Function:        InitializeGlobalAppLogLevel
-**
-** Description:     Initialize and get global logging level from .conf or
-**                  Android property nfc.app_log_level.  The Android property
-**                  overrides .conf variable.
-**
-** Returns:         Global log level:
-**                  BT_TRACE_LEVEL_NONE    0        * No trace messages to be
-*generated
-**                  BT_TRACE_LEVEL_ERROR   1        * Error condition trace
-*messages
-**                  BT_TRACE_LEVEL_WARNING 2        * Warning condition trace
-*messages
-**                  BT_TRACE_LEVEL_API     3        * API traces
-**                  BT_TRACE_LEVEL_EVENT   4        * Debug messages for events
-**                  BT_TRACE_LEVEL_DEBUG   5        * Debug messages (general)
-**
-*******************************************************************************/
-unsigned char InitializeGlobalAppLogLevel();
-uint32_t InitializeProtocolLogLevel();
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/halimpl/bcm2079x/include/android_logmsg.h b/halimpl/bcm2079x/include/android_logmsg.h
deleted file mode 100644
index 4dfccbc..0000000
--- a/halimpl/bcm2079x/include/android_logmsg.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-/******************************************************************************
- * Decode NFC packets and print them to ADB log.
- * If protocol decoder is not present, then decode packets into hex numbers.
- ******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "data_types.h"
-#include "nfc_types.h"
-
-#define DISP_NCI ProtoDispAdapterDisplayNciPacket
-void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
-                                      bool is_recv);
-void ProtoDispAdapterUseRawOutput(bool isUseRaw);
-void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...);
-void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...);
-void LogMsg_0(uint32_t trace_set_mask, const char* p_str);
-void LogMsg_1(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1);
-void LogMsg_2(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2);
-void LogMsg_3(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3);
-void LogMsg_4(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4);
-void LogMsg_5(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5);
-void LogMsg_6(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
-              uintptr_t p6);
-uint8_t* scru_dump_hex(uint8_t* p, char* pTitle, uint32_t len, uint32_t layer,
-                       uint32_t type);
-void BTDISP_LOCK_LOG();
-void BTDISP_UNLOCK_LOG();
-void BTDISP_INIT_LOCK();
-void BTDISP_UNINIT_LOCK();
-void DispHciCmd(NFC_HDR* p_buf);
-void DispHciEvt(NFC_HDR* p_buf);
-void DispLLCP(NFC_HDR* p_buf, bool is_recv);
-void DispHcp(uint8_t* data, uint16_t len, bool is_recv);
-void DispSNEP(uint8_t local_sap, uint8_t remote_sap, NFC_HDR* p_buf,
-              bool is_first, bool is_rx);
-void DispCHO(uint8_t* pMsg, uint32_t MsgLen, bool is_rx);
-void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx);
-void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx);
-void DispCET4Tags(NFC_HDR* p_buf, bool is_rx);
-void DispRWI93Tag(NFC_HDR* p_buf, bool is_rx, uint8_t command_to_respond);
-void DispNDEFMsg(uint8_t* pMsg, uint32_t MsgLen, bool is_recv);
-
-#ifdef __cplusplus
-};
-#endif
diff --git a/halimpl/bcm2079x/include/bcm2079x.h b/halimpl/bcm2079x/include/bcm2079x.h
deleted file mode 100644
index 5f45224..0000000
--- a/halimpl/bcm2079x/include/bcm2079x.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#ifndef _BCM2079X_H
-#define _BCM2079X_H
-
-#define BCMNFC_MAGIC 0xFA
-
-/*
- * BCMNFC power control via ioctl
- * BCMNFC_POWER_CTL(0): power off
- * BCMNFC_POWER_CTL(1): power on
- * BCMNFC_WAKE_CTL(0): wake off
- * BCMNFC_WAKE_CTL(1): wake on
- */
-#define BCMNFC_POWER_CTL _IO(BCMNFC_MAGIC, 0x01)
-#define BCMNFC_CHANGE_ADDR _IO(BCMNFC_MAGIC, 0x02)
-#define BCMNFC_READ_FULL_PACKET _IO(BCMNFC_MAGIC, 0x03)
-#define BCMNFC_SET_WAKE_ACTIVE_STATE _IO(BCMNFC_MAGIC, 0x04)
-#define BCMNFC_WAKE_CTL _IO(BCMNFC_MAGIC, 0x05)
-#define BCMNFC_READ_MULTI_PACKETS _IO(BCMNFC_MAGIC, 0x06)
-#define BCMNFC_SET_CLIENT_ADDR _IO(BCMNFC_MAGIC, 0x07)
-
-struct bcm2079x_platform_data {
-  unsigned int irq_gpio;
-  unsigned int en_gpio;
-  int wake_gpio;
-};
-
-#endif
diff --git a/halimpl/bcm2079x/include/buildcfg.h b/halimpl/bcm2079x/include/buildcfg.h
deleted file mode 100644
index d2e743d..0000000
--- a/halimpl/bcm2079x/include/buildcfg.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#pragma once
-#include <memory.h>
-#include <stdio.h>
-#include <string.h>
-#include "data_types.h"
-
-#define BTE_APPL_MAX_USERIAL_DEV_NAME (256)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern uint8_t* scru_dump_hex(uint8_t* p, char* p_title, uint32_t len,
-                              uint32_t trace_layer, uint32_t trace_type);
-void DispNci(uint8_t* p, uint16_t len, bool is_recv);
-void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
-                                      bool is_recv);
-#define DISP_NCI ProtoDispAdapterDisplayNciPacket
-#define LOGMSG_TAG_NAME "NfcNciHal"
-
-#ifdef __cplusplus
-};
-#endif
diff --git a/halimpl/bcm2079x/include/buildcfg_hal.h b/halimpl/bcm2079x/include/buildcfg_hal.h
deleted file mode 100644
index 0908226..0000000
--- a/halimpl/bcm2079x/include/buildcfg_hal.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2001-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-// override any HAL-specific macros
-#pragma once
-
-#include "bt_types.h"
-
-// NFC_HAL_TASK=0 is already defined in gki_hal_target.h; it executes the
-// Broadcom HAL
-#define USERIAL_HAL_TASK 1     // execute userial's read thread
-#define GKI_RUNNER_HAL_TASK 2  // execute GKI_run(), which runs forever
-#define GKI_MAX_TASKS 3        // total of 3 tasks
-
-#define GKI_BUF0_MAX 16
-#define GKI_BUF1_MAX 16
-
-#define NFC_HAL_PRM_POST_I2C_FIX_DELAY (500)
diff --git a/halimpl/bcm2079x/include/gki_target.h b/halimpl/bcm2079x/include/gki_target.h
deleted file mode 100644
index afb4f78..0000000
--- a/halimpl/bcm2079x/include/gki_target.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2001-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#pragma once
-#include "gki_hal_target.h"
diff --git a/halimpl/bcm2079x/include/spdhelper.h b/halimpl/bcm2079x/include/spdhelper.h
deleted file mode 100644
index 8eea553..0000000
--- a/halimpl/bcm2079x/include/spdhelper.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#pragma once
-
-#include <string>
-
-using namespace std;
-#define DEFAULT_SPD_MAXRETRYCOUNT (3)
-
-class SpdHelper {
- public:
-  static bool isPatchBad(uint8_t* prm, uint32_t len);
-  static void setPatchAsBad();
-  static void incErrorCount();
-  static bool isSpdDebug();
-
- private:
-  SpdHelper();
-  static SpdHelper& getInstance();
-
-  bool isPatchBadImpl(uint8_t* prm, uint32_t len);
-  void setPatchAsBadImpl();
-  void incErrorCountImpl();
-  bool isSpdDebugImpl() { return mSpdDebug; }
-  string mPatchId;
-  int mErrorCount;
-  int mMaxErrorCount;
-  bool mIsPatchBad;
-  bool mSpdDebug;
-};
diff --git a/halimpl/bcm2079x/include/userial.h b/halimpl/bcm2079x/include/userial.h
deleted file mode 100644
index ab845d8..0000000
--- a/halimpl/bcm2079x/include/userial.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2001-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This file contains serial definitions from WIDCOMM's Universal Embedded
- *  Drivers API.
- *
- ******************************************************************************/
-
-#ifndef USERIAL_H
-#define USERIAL_H
-
-/*******************************************************************************
-** Serial APIs
-*******************************************************************************/
-
-/**** port IDs ****/
-#define USERIAL_PORT_1 0
-#define USERIAL_PORT_2 1
-#define USERIAL_PORT_3 2
-#define USERIAL_PORT_4 3
-#define USERIAL_PORT_5 4
-#define USERIAL_PORT_6 5
-#define USERIAL_PORT_7 6
-#define USERIAL_PORT_8 7
-#define USERIAL_PORT_9 8
-#define USERIAL_PORT_10 9
-#define USERIAL_PORT_11 10
-#define USERIAL_PORT_12 11
-#define USERIAL_PORT_13 12
-#define USERIAL_PORT_14 13
-#define USERIAL_PORT_15 14
-#define USERIAL_PORT_16 15
-#define USERIAL_PORT_17 16
-#define USERIAL_PORT_18 17
-
-typedef uint8_t tUSERIAL_PORT;
-
-/**** baud rates ****/
-#define USERIAL_BAUD_300 0
-#define USERIAL_BAUD_600 1
-#define USERIAL_BAUD_1200 2
-#define USERIAL_BAUD_2400 3
-#define USERIAL_BAUD_9600 4
-#define USERIAL_BAUD_19200 5
-#define USERIAL_BAUD_57600 6
-#define USERIAL_BAUD_115200 7
-#define USERIAL_BAUD_230400 8
-#define USERIAL_BAUD_460800 9
-#define USERIAL_BAUD_921600 10
-#define USERIAL_BAUD_1M 11
-#define USERIAL_BAUD_1_5M 12
-#define USERIAL_BAUD_2M 13
-#define USERIAL_BAUD_3M 14
-#define USERIAL_BAUD_4M 15
-#define USERIAL_BAUD_AUTO 16
-
-/**** Data Format ****/
-
-/* Stop Bits */
-#define USERIAL_STOPBITS_1 1
-#define USERIAL_STOPBITS_1_5 (1 << 1)
-#define USERIAL_STOPBITS_2 (1 << 2)
-
-/* Parity Bits */
-#define USERIAL_PARITY_NONE (1 << 3)
-#define USERIAL_PARITY_EVEN (1 << 4)
-#define USERIAL_PARITY_ODD (1 << 5)
-
-/* Data Bits */
-#define USERIAL_DATABITS_5 (1 << 6)
-#define USERIAL_DATABITS_6 (1 << 7)
-#define USERIAL_DATABITS_7 (1 << 8)
-#define USERIAL_DATABITS_8 (1 << 9)
-
-/**** Flow Control ****/
-#define USERIAL_FC_NONE 0
-#define USERIAL_FC_HW 1
-#define USERIAL_FC_SW 2
-
-/**** Data Buffering Mechanism ****/
-#define USERIAL_BUF_BYTE 0
-#define USERIAL_BUF_GKI 1
-
-/**** Signals ****/
-#define USERIAL_SIG_RTSCTS 1
-#define USERIAL_SIG_DSRDTR (1 << 1)
-#define USERIAL_SIG_RI (1 << 2)
-#define USERIAL_SIG_CD (1 << 3)
-#define USERIAL_SIG_DTE_DEVICE (1 << 4)
-
-/**** Errors *****/
-#define USERIAL_ERR_OVERRUN 1
-#define USERIAL_ERR_PARITY (1 << 1)
-#define USERIAL_ERR_FRAMING (1 << 2)
-#define USERIAL_ERR_BREAK (1 << 3)
-
-/**** Serial Operations ****/
-#define USERIAL_OP_FLUSH 0
-#define USERIAL_OP_FLUSH_RX 1
-#define USERIAL_OP_FLUSH_TX 2
-#define USERIAL_OP_BREAK_OFF 3
-#define USERIAL_OP_BREAK_ON 4
-#define USERIAL_OP_BAUD_RD 5
-#define USERIAL_OP_BAUD_WR 6
-#define USERIAL_OP_FMT_RD 7
-#define USERIAL_OP_FMT_WR 8
-#define USERIAL_OP_SIG_RD 9
-#define USERIAL_OP_SIG_WR 10
-#define USERIAL_OP_FC_RD 11
-#define USERIAL_OP_FC_WR 12
-#define USERIAL_OP_CTS_AS_WAKEUP 13 /* H4IBSS */
-#define USERIAL_OP_CTS_AS_FC 14     /* H4IBSS */
-
-#if (defined(LINUX_OS) && LINUX_OS == TRUE)
-#define USERIAL_OP_SCO_UP 20   /* LINUX SCO */
-#define USERIAL_OP_SCO_DOWN 21 /* LINUX SCO */
-#endif
-
-typedef uint8_t tUSERIAL_OP;
-
-/**** Serial feature types ****/
-#define USERIAL_FEAT_PORT_1 0
-#define USERIAL_FEAT_PORT_2 1
-#define USERIAL_FEAT_PORT_3 2
-#define USERIAL_FEAT_PORT_4 3
-#define USERIAL_FEAT_BAUD_AUTO 4
-#define USERIAL_FEAT_BAUD_300 5
-#define USERIAL_FEAT_BAUD_600 6
-#define USERIAL_FEAT_BAUD_1200 7
-#define USERIAL_FEAT_BAUD_2400 8
-#define USERIAL_FEAT_BAUD_9600 9
-#define USERIAL_FEAT_BAUD_19200 10
-#define USERIAL_FEAT_BAUD_57600 11
-#define USERIAL_FEAT_BAUD_115200 12
-#define USERIAL_FEAT_BAUD_230400 13
-#define USERIAL_FEAT_BAUD_460800 14
-#define USERIAL_FEAT_BAUD_921600 15
-#define USERIAL_FEAT_STOPBITS_1 16
-#define USERIAL_FEAT_STOPBITS_1_5 17
-#define USERIAL_FEAT_STOPBITS_2 18
-#define USERIAL_FEAT_PARITY_NONE 19
-#define USERIAL_FEAT_PARITY_EVEN 20
-#define USERIAL_FEAT_PARITY_ODD 21
-#define USERIAL_FEAT_DATABITS_5 22
-#define USERIAL_FEAT_DATABITS_6 23
-#define USERIAL_FEAT_DATABITS_7 24
-#define USERIAL_FEAT_DATABITS_8 25
-#define USERIAL_FEAT_FC_NONE 26
-#define USERIAL_FEAT_FC_HW 27
-#define USERIAL_FEAT_FC_SW 28
-#define USERIAL_FEAT_BUF_BYTE 29
-#define USERIAL_FEAT_BUF_GKI 30
-#define USERIAL_FEAT_SIG_RTS 31
-#define USERIAL_FEAT_SIG_CTS 32
-#define USERIAL_FEAT_SIG_DSR 33
-#define USERIAL_FEAT_SIG_DTR 34
-#define USERIAL_FEAT_SIG_RI 35
-#define USERIAL_FEAT_SIG_CD 36
-#define USERIAL_FEAT_OP_FLUSH 37
-#define USERIAL_FEAT_OP_FLUSH_RX 38
-#define USERIAL_FEAT_OP_FLUSH_TX 39
-#define USERIAL_FEAT_OP_BREAK 40
-#define USERIAL_FEAT_OP_BAUD_RD 41
-#define USERIAL_FEAT_OP_BAUD_WR 42
-#define USERIAL_FEAT_OP_FMT_RD 43
-#define USERIAL_FEAT_OP_FMT_WR 44
-#define USERIAL_FEAT_OP_SIG_RD 45
-#define USERIAL_FEAT_OP_SIG_WR 46
-#define USERIAL_FEAT_OP_FC_RD 47
-#define USERIAL_FEAT_OP_FC_WR 48
-
-typedef uint8_t tUSERIAL_FEATURE;
-
-/**** Event types ****/
-#define USERIAL_RX_READY_EVT 0
-#define USERIAL_TX_DONE_EVT 1
-#define USERIAL_SIG_EVT 2
-#define USERIAL_ERR_EVT 3
-#define USERIAL_WAKEUP_EVT 4 /* H4IBSS */
-
-typedef uint8_t tUSERIAL_EVT;
-
-/* Structure used to configure serial port during open        */
-typedef struct {
-  uint16_t fmt;    /* Data format                       */
-  uint8_t baud;    /* Baud rate                         */
-  uint8_t fc;      /* Flow control                      */
-  uint8_t buf;     /* Data buffering mechanism          */
-  uint8_t pool;    /* GKI buffer pool for received data */
-  uint16_t size;   /* Size of GKI buffer pool           */
-  uint16_t offset; /* Offset in GKI buffer pool         */
-} tUSERIAL_OPEN_CFG;
-
-/* Union used to pass ioctl arguments */
-typedef union {
-  uint16_t fmt;
-  uint8_t baud;
-  uint8_t fc;
-  uint8_t sigs;
-#if (defined(LINUX_OS) && LINUX_OS == TRUE)
-  uint16_t sco_handle;
-#endif
-} tUSERIAL_IOCTL_DATA;
-
-/* Union to pass event data */
-typedef union {
-  uint8_t sigs;
-  uint8_t error;
-} tUSERIAL_EVT_DATA;
-
-/* callback for events */
-typedef void(tUSERIAL_CBACK)(tUSERIAL_PORT, tUSERIAL_EVT, tUSERIAL_EVT_DATA*);
-
-/*******************************************************************************
-** Function Prototypes
-*******************************************************************************/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void USERIAL_Init(void*);
-extern void USERIAL_Open(tUSERIAL_PORT, tUSERIAL_OPEN_CFG*, tUSERIAL_CBACK*);
-extern void USERIAL_ReadBuf(tUSERIAL_PORT, NFC_HDR**);
-extern uint16_t USERIAL_Read(tUSERIAL_PORT, uint8_t*, uint16_t);
-extern bool USERIAL_WriteBuf(tUSERIAL_PORT, NFC_HDR*);
-extern uint16_t USERIAL_Write(tUSERIAL_PORT, uint8_t*, uint16_t);
-extern void USERIAL_Ioctl(tUSERIAL_PORT, tUSERIAL_OP, tUSERIAL_IOCTL_DATA*);
-extern void USERIAL_Close(tUSERIAL_PORT);
-extern bool USERIAL_Feature(tUSERIAL_FEATURE);
-extern bool USERIAL_IsClosed();
-extern void USERIAL_SetPowerOffDelays(int, int);
-extern void USERIAL_PowerupDevice(tUSERIAL_PORT port);
-
-/*******************************************************************************
- **
- ** Function           USERIAL_GetLineSpeed
- **
- ** Description        This function convert USERIAL baud to line speed.
- **
- ** Output Parameter   None
- **
- ** Returns            line speed
- **
- *******************************************************************************/
-extern uint32_t USERIAL_GetLineSpeed(uint8_t baud);
-/*******************************************************************************
- **
- ** Function           USERIAL_GetBaud
- **
- ** Description        This function convert line speed to USERIAL baud.
- **
- ** Output Parameter   None
- **
- ** Returns            line speed
- **
- *******************************************************************************/
-extern uint8_t USERIAL_GetBaud(uint32_t line_speed);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* USERIAL_H */
diff --git a/halimpl/bcm2079x/nfc_nci.c b/halimpl/bcm2079x/nfc_nci.c
deleted file mode 100644
index 6948fb6..0000000
--- a/halimpl/bcm2079x/nfc_nci.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#define LOG_TAG "NfcNciHal"
-#include <errno.h>
-#include <hardware/hardware.h>
-#include <hardware/nfc.h>
-#include <malloc.h>
-#include <string.h>
-#include "HalAdaptation.h"
-#include "_OverrideLog.h"
-
-/*********************************
- * NCI HAL method implementations.
- *********************************/
-
-static int hal_open(const struct nfc_nci_device* p_dev,
-                    nfc_stack_callback_t* p_hal_cback,
-                    nfc_stack_data_callback_t* p_hal_data_callback) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiOpen(dev, p_hal_cback, p_hal_data_callback);
-  return retval;
-}
-
-static int hal_write(const struct nfc_nci_device* p_dev, uint16_t data_len,
-                     const uint8_t* p_data) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiWrite(dev, data_len, p_data);
-  return retval;
-}
-
-static int hal_core_initialized(const struct nfc_nci_device* p_dev,
-                                uint8_t* p_core_init_rsp_params) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiCoreInitialized(dev, p_core_init_rsp_params);
-  return retval;
-}
-
-static int hal_pre_discover(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiPreDiscover(dev);
-  return retval;
-}
-
-static int hal_close(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiClose(dev);
-  return retval;
-}
-
-static int hal_control_granted(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiControlGranted(dev);
-  return retval;
-}
-
-static int hal_power_cycle(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiPowerCycle(dev);
-  return retval;
-}
-
-static int hal_get_max_nfcee(const struct nfc_nci_device* p_dev,
-                             uint8_t* maxNfcee) {
-  int retval = 0;
-  bcm2079x_dev_t* dev = (bcm2079x_dev_t*)p_dev;
-
-  retval = HaiGetMaxNfcee(dev, maxNfcee);
-  return retval;
-}
-
-/*************************************
- * Generic device handling.
- *************************************/
-
-/* Close an opened nfc device instance */
-static int nfc_close(hw_device_t* dev) {
-  int retval = 0;
-  free(dev);
-  retval = HaiTerminateLibrary();
-  return retval;
-}
-
-static int nfc_open(const hw_module_t* module, const char* name,
-                    hw_device_t** device) {
-  ALOGD("%s: enter; name=%s", __func__, name);
-  int retval = 0;  // 0 is ok; -1 is error
-
-  if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
-    bcm2079x_dev_t* dev = calloc(1, sizeof(bcm2079x_dev_t));
-
-    // Common hw_device_t fields
-    dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->nci_device.common.version = 0x00010000;  // [31:16] major, [15:0] minor
-    dev->nci_device.common.module = (struct hw_module_t*)module;
-    dev->nci_device.common.close = nfc_close;
-
-    // NCI HAL method pointers
-    dev->nci_device.open = hal_open;
-    dev->nci_device.write = hal_write;
-    dev->nci_device.core_initialized = hal_core_initialized;
-    dev->nci_device.pre_discover = hal_pre_discover;
-    dev->nci_device.close = hal_close;
-    dev->nci_device.control_granted = hal_control_granted;
-    dev->nci_device.power_cycle = hal_power_cycle;
-    // dev->nci_device.get_max_ee = hal_get_max_nfcee;
-
-    // Copy in
-    *device = (hw_device_t*)dev;
-
-    retval = HaiInitializeLibrary(dev);
-  } else {
-    retval = -EINVAL;
-  }
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-static struct hw_module_methods_t nfc_module_methods = {
-    .open = nfc_open,
-};
-
-struct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
-    .common =
-        {
-            .tag = HARDWARE_MODULE_TAG,
-            .module_api_version = 0x0100,  // [15:8] major, [7:0] minor (1.0)
-            .hal_api_version = 0x00,       // 0 is only valid value
-            .id = NFC_NCI_BCM2079X_HARDWARE_MODULE_ID,
-            .name = "BCM2079x NFC NCI HW HAL",
-            .author = "Broadcom Corporation",
-            .methods = &nfc_module_methods,
-        },
-};
diff --git a/halimpl/pn54x/Android.bp b/halimpl/pn54x/Android.bp
deleted file mode 100644
index e69de29..0000000
--- a/halimpl/pn54x/Android.bp
+++ /dev/null
diff --git a/halimpl/pn54x/Android.mk b/halimpl/pn54x/Android.mk
deleted file mode 100644
index c5a0030..0000000
--- a/halimpl/pn54x/Android.mk
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#variables for NFC_NXP_CHIP_TYPE
-PN547C2 := 1
-PN548C2 := 2
-PN551   := 3
-PN553   := 4
-NQ110 := $PN547C2
-NQ120 := $PN547C2
-NQ210 := $PN548C2
-NQ220 := $PN548C2
-#NXP PN547 Enable
-ifeq ($(PN547C2),1)
-D_CFLAGS += -DPN547C2=1
-endif
-ifeq ($(PN548C2),2)
-D_CFLAGS += -DPN548C2=2
-endif
-ifeq ($(PN551),3)
-D_CFLAGS += -DPN551=3
-endif
-ifeq ($(PN553),4)
-D_CFLAGS += -DPN553=4
-endif
-
-ifeq ($(NXP_CHIP_TYPE),$(PN547C2))
-D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN547C2
-else ifeq ($(NXP_CHIP_TYPE),$(PN548C2))
-D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN548C2
-else ifeq ($(NXP_CHIP_TYPE),$(PN551))
-D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551
-else ifeq ($(NXP_CHIP_TYPE),$(PN553))
-D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN553
-else
-D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN553
-endif
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_MODULE := nfc_nci.$(TARGET_DEVICE)
-LOCAL_PROPRIETARY_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := \
-    $(call all-c-files-under, common) \
-    $(call all-c-files-under, dnld) \
-    $(call all-c-files-under, hal) \
-    $(call all-c-files-under, log) \
-    $(call all-c-files-under, self-test) \
-    $(call all-c-files-under, tml) \
-    $(call all-c-files-under, utils) \
-    $(call all-cpp-files-under, utils) \
-    nfc_nci.c
-
-LOCAL_SHARED_LIBRARIES := liblog libcutils libdl libhardware
-
-LOCAL_CFLAGS := $(D_CFLAGS)
-LOCAL_C_INCLUDES += \
-    $(LOCAL_PATH)/utils \
-    $(LOCAL_PATH)/inc \
-    $(LOCAL_PATH)/common \
-    $(LOCAL_PATH)/dnld \
-    $(LOCAL_PATH)/hal \
-    $(LOCAL_PATH)/log \
-    $(LOCAL_PATH)/tml \
-    $(LOCAL_PATH)/self-test \
-
-LOCAL_CFLAGS += -DANDROID \
-        -DNXP_UICC_ENABLE -DNXP_HW_SELF_TEST
-LOCAL_CFLAGS += -DNFC_NXP_HFO_SETTINGS=FALSE
-#LOCAL_CFLAGS += -DFELICA_CLT_ENABLE
-
-
-#
-# nfc_nci.$(TARGET_DEVICE)
-#
-include $(BUILD_SHARED_LIBRARY)
diff --git a/halimpl/pn54x/common/phNfcCommon.h b/halimpl/pn54x/common/phNfcCommon.h
deleted file mode 100644
index 638a133..0000000
--- a/halimpl/pn54x/common/phNfcCommon.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- *  OSAL header files related to memory, debug, random, semaphore and mutex
- * functions.
- */
-
-#ifndef PHNFCCOMMON_H
-#define PHNFCCOMMON_H
-
-/*
-************************* Include Files ****************************************
-*/
-
-#include <phDal4Nfc_messageQueueLib.h>
-#include <phNfcCompId.h>
-#include <phNfcStatus.h>
-#include <phOsalNfc_Timer.h>
-#include <pthread.h>
-#include <semaphore.h>
-
-#define FW_DLL_ROOT_DIR "/system/vendor/firmware/"
-#define FW_DLL_EXTENSION ".so"
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-
-/* Actual FW library name*/
-#define FW_LIB_PATH FW_DLL_ROOT_DIR "libpn548ad_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Setttings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn548ad_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn548ad_fw_pku" FW_DLL_EXTENSION
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-/* Actual FW library name*/
-#define FW_LIB_PATH FLASH_CONF_ROOT_DIR "libpn551_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn551_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn551_fw_pku" FW_DLL_EXTENSION
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-/* Actual FW library name*/
-#define FW_LIB_PATH FLASH_CONF_ROOT_DIR "libpn553_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn553_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn553_fw_pku" FW_DLL_EXTENSION
-#else
-/* Actual FW library name*/
-#define FW_LIB_PATH FW_DLL_ROOT_DIR "libpn547_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn547_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn547_fw_pku" FW_DLL_EXTENSION
-#endif
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-#define COMPILATION_MW "PN548C2"
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-#define COMPILATION_MW "PN551"
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-#define COMPILATION_MW "PN553"
-#else
-#define COMPILATION_MW "PN547C2"
-#endif
-
-/* HAL Version number (Updated as per release) */
-#define NXP_MW_VERSION_MAJ (3U)
-#define NXP_MW_VERSION_MIN (5U)
-
-/*
- *****************************************************************
- ***********  System clock source selection configuration ********
- *****************************************************************
- */
-
-#define CLK_SRC_UNDEF 0
-#define CLK_SRC_XTAL 1
-#define CLK_SRC_PLL 2
-#define CLK_SRC_PADDIRECT 3
-
-/*Extern crystal clock source*/
-/* Use one of CLK_SRC_<value> */
-#define NXP_SYS_CLK_SRC_SEL CLK_SRC_PLL
-/*Direct clock*/
-
-/*
- *****************************************************************
- ***********  System clock frequency selection configuration ****************
- * If Clk_Src is set to PLL, make sure to set the Clk_Freq also*
- *****************************************************************
- */
-#define CLK_FREQ_UNDEF 0
-#define CLK_FREQ_13MHZ 1
-#define CLK_FREQ_19_2MHZ 2
-#define CLK_FREQ_24MHZ 3
-#define CLK_FREQ_26MHZ 4
-#define CLK_FREQ_38_4MHZ 5
-#define CLK_FREQ_52MHZ 6
-
-/* Set to one of CLK_FREQ_<value> */
-#define NXP_SYS_CLK_FREQ_SEL CLK_FREQ_19_2MHZ
-
-#define CLK_TO_CFG_DEF 1
-#define CLK_TO_CFG_MAX 6
-/*
- *  information to configure OSAL
- */
-typedef struct phOsalNfc_Config {
-  uint8_t* pLogFile;            /* Log File Name*/
-  uintptr_t dwCallbackThreadId; /* Client ID to which message is posted */
-} phOsalNfc_Config_t, *pphOsalNfc_Config_t /* Pointer to #phOsalNfc_Config_t */;
-
-/*
- * Deferred call declaration.
- * This type of API is called from ClientApplication (main thread) to notify
- * specific callback.
- */
-typedef void (*pphOsalNfc_DeferFuncPointer_t)(void*);
-
-/*
- * Deferred message specific info declaration.
- */
-typedef struct phOsalNfc_DeferedCallInfo {
-  pphOsalNfc_DeferFuncPointer_t pDeferedCall; /* pointer to Deferred callback */
-  void* pParam; /* contains timer message specific details*/
-} phOsalNfc_DeferedCallInfo_t;
-
-/*
- * States in which a OSAL timer exist.
- */
-typedef enum {
-  eTimerIdle = 0,          /* Indicates Initial state of timer */
-  eTimerRunning = 1,       /* Indicate timer state when started */
-  eTimerStopped = 2        /* Indicates timer state when stopped */
-} phOsalNfc_TimerStates_t; /* Variable representing State of timer */
-
-/*
- **Timer Handle structure containing details of a timer.
- */
-typedef struct phOsalNfc_TimerHandle {
-  uint32_t TimerId;     /* ID of the timer */
-  timer_t hTimerHandle; /* Handle of the timer */
-  /* Timer callback function to be invoked */
-  pphOsalNfc_TimerCallbck_t Application_callback;
-  void* pContext; /* Parameter to be passed to the callback function */
-  phOsalNfc_TimerStates_t eState; /* Timer states */
-  /* Osal Timer message posted on User Thread */
-  phLibNfc_Message_t tOsalMessage;
-  /* Deferred Call structure to Invoke Callback function */
-  phOsalNfc_DeferedCallInfo_t tDeferedCallInfo;
-  /* Variables for Structure Instance and Structure Ptr */
-} phOsalNfc_TimerHandle_t, *pphOsalNfc_TimerHandle_t;
-
-#endif /*  PHOSALNFC_H  */
diff --git a/halimpl/pn54x/common/phNfcCompId.h b/halimpl/pn54x/common/phNfcCompId.h
deleted file mode 100644
index 9930e0c..0000000
--- a/halimpl/pn54x/common/phNfcCompId.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * NFC Component ID Values - Used for Function Return Codes
- */
-
-#ifndef PHNFCCOMPID_H
-#define PHNFCCOMPID_H
-
-/*
- *  Component IDs
- *
- *  IDs for all NFC components. Combined with the Status Code they build the
- * value (status)
- *  returned by each function.
- *
- *  ID Number Spaces:
- *  - 01..1F: HAL
- *  - 20..3F: NFC-MW (Local Device)
- *  - 40..5F: NFC-MW (Remote Device)
- *  .
- *
- *         The value CID_NFC_NONE does not exist for Component IDs. Do not use
- * this value except
- *         for NFCSTATUS_SUCCESS. The enumeration function uses CID_NFC_NONE
- *         to mark unassigned "References".
- */
-/* Unassigned or doesn't apply (see #NFCSTATUS_SUCCESS) */
-#define CID_NFC_NONE 0x00
-#define CID_NFC_TML 0x01 /* Transport Mapping Layer */
-#define CID_NFC_LLC 0x07 /* Logical Link Control Layer */
-/* NFC Controller(NFCC) Interface Layer */
-#define CID_NFC_NCI 0x08
-/* Firmware Download Management Layer */
-#define CID_NFC_DNLD 0x09
-#define CID_NFC_HAL 0x10 /* Hardware Abstraction Layer */
-/* Operating System Abstraction Layer*/
-#define CID_NFC_OSAL CID_NFC_NONE
-#define CID_FRI_NFC_OVR_HAL 0x20       /* NFC-Device, HAL-based */
-#define CID_FRI_NFC_NDEF_RECORD 0x22   /* NDEF Record Tools Library. */
-#define CID_FRI_NFC_NDEF_MAP 0x23      /* NDEF Mapping. */
-#define CID_FRI_NFC_NDEF_REGISTRY 0x24 /* NDEF_REGISTRY. */
-/* Automatic Device Discovery. */
-#define CID_FRI_NFC_AUTO_DEV_DIS 0x25
-#define CID_FRI_NFC_NDEF_SMTCRDFMT 0x26 /* Smart Card Formatting */
-#define CID_NFC_LIB 0x30                /* NFC Library Layer*/
-/* The maximum CID value that is defined. */
-#define CID_MAX_VALUE 0xF0
-/* Logical Link Control Protocol */
-#define CID_FRI_NFC_LLCP 0x40
-#define CID_FRI_NFC_LLCP_TRANSPORT 0x50
-#define CID_FRI_NFC_LLCP_MAC 0x60
-
-#endif /* PHNFCCOMPID_H */
diff --git a/halimpl/pn54x/common/phNfcStatus.h b/halimpl/pn54x/common/phNfcStatus.h
deleted file mode 100644
index f3aa51a..0000000
--- a/halimpl/pn54x/common/phNfcStatus.h
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * NFC Status Values - Function Return Codes
- */
-
-#ifndef PHNFCSTATUS_H
-#define PHNFCSTATUS_H
-
-#include <phNfcTypes.h>
-
-/* Internally required by PHNFCSTVAL. */
-#define PHNFCSTSHL8 (8U)
-/* Required by PHNFCSTVAL. */
-#define PHNFCSTBLOWER ((NFCSTATUS)(0x00FFU))
-
-/*
- *  NFC Status Composition Macro
- *
- *  This is the macro which must be used to compose status values.
- *
- *  phNfcCompID Component ID, as defined in phNfcCompId.h .
- *  phNfcStatus Status values, as defined in phNfcStatus.h .
- *
- *  The macro is not required for the NFCSTATUS_SUCCESS value.
- *  This is the only return value to be used directly.
- *  For all other values it shall be used in assignment and conditional
- * statements, e.g.:
- *     NFCSTATUS status = PHNFCSTVAL(phNfcCompID, phNfcStatus); ...
- *     if (status == PHNFCSTVAL(phNfcCompID, phNfcStatus)) ...
- */
-#define PHNFCSTVAL(phNfcCompID, phNfcStatus)               \
-  (((phNfcStatus) == (NFCSTATUS_SUCCESS))                  \
-       ? (NFCSTATUS_SUCCESS)                               \
-       : ((((NFCSTATUS)(phNfcStatus)) & (PHNFCSTBLOWER)) | \
-          (((uint16_t)(phNfcCompID)) << (PHNFCSTSHL8))))
-
-/*
- * PHNFCSTATUS
- * Get grp_retval from Status Code
- */
-#define PHNFCSTATUS(phNfcStatus) ((phNfcStatus)&0x00FFU)
-#define PHNFCCID(phNfcStatus) (((phNfcStatus)&0xFF00U) >> 8)
-
-#define PHNFC_I2C_FRAGMENT_SIZE 512
-/*
- *  Status Codes
- *
- *  Generic Status codes for the NFC components. Combined with the Component ID
- *  they build the value (status) returned by each function.
- *  Example:
- *      grp_comp_id "Component ID" -  e.g. 0x10, plus
- *      status code as listed in this file - e.g. 0x03
- *      result in a status value of 0x0003.
- */
-
-/*
- * The function indicates successful completion
- */
-#define NFCSTATUS_SUCCESS (0x0000)
-
-/*
- *  The function indicates successful completion
- */
-#define NFCSTATUS_OK (NFCSTATUS_SUCCESS)
-
-/*
- * At least one parameter could not be properly interpreted
- */
-#define NFCSTATUS_INVALID_PARAMETER (0x0001)
-
-/*
- * The buffer provided by the caller is too small
- */
-#define NFCSTATUS_BUFFER_TOO_SMALL (0x0003)
-
-/*
- * Device specifier/handle value is invalid for the operation
- */
-#define NFCSTATUS_INVALID_DEVICE (0x0006)
-
-/*
- * The function executed successfully but could have returned
- * more information than space provided by the caller
- */
-#define NFCSTATUS_MORE_INFORMATION (0x0008)
-
-/*
- * No response from the remote device received: Time-out
- */
-#define NFCSTATUS_RF_TIMEOUT (0x0009)
-
-/*
- * RF Error during data transaction with the remote device
- */
-#define NFCSTATUS_RF_ERROR (0x000A)
-
-/*
- * Not enough resources Memory, Timer etc(e.g. allocation failed.)
- */
-#define NFCSTATUS_INSUFFICIENT_RESOURCES (0x000C)
-
-/*
- * A non-blocking function returns this immediately to indicate
- * that an internal operation is in progress
- */
-#define NFCSTATUS_PENDING (0x000D)
-
-/*
- * A board communication error occurred
- * (e.g. Configuration went wrong)
- */
-#define NFCSTATUS_BOARD_COMMUNICATION_ERROR (0x000F)
-
-/*
- * Invalid State of the particular state machine
- */
-#define NFCSTATUS_INVALID_STATE (0x0011)
-
-/*
- * This Layer is Not initialized, hence initialization required.
- */
-#define NFCSTATUS_NOT_INITIALISED (0x0031)
-
-/*
- * The Layer is already initialized, hence initialization repeated.
- */
-#define NFCSTATUS_ALREADY_INITIALISED (0x0032)
-
-/*
- * Feature not supported
- */
-#define NFCSTATUS_FEATURE_NOT_SUPPORTED (0x0033)
-
-/*  The Unregistration command has failed because the user wants to unregister
- * on
- * an element for which he was not registered
- */
-#define NFCSTATUS_NOT_REGISTERED (0x0034)
-
-/* The Registration command has failed because the user wants to register on
- * an element for which he is already registered
- */
-#define NFCSTATUS_ALREADY_REGISTERED (0x0035)
-
-/*  Single Tag with Multiple
-    Protocol support detected */
-#define NFCSTATUS_MULTIPLE_PROTOCOLS (0x0036)
-
-/*
- * Feature not supported
- */
-#define NFCSTATUS_MULTIPLE_TAGS (0x0037)
-
-/*
- * A DESELECT event has occurred
- */
-#define NFCSTATUS_DESELECTED (0x0038)
-
-/*
- * A RELEASE event has occurred
- */
-#define NFCSTATUS_RELEASED (0x0039)
-
-/*
- * The operation is currently not possible or not allowed
- */
-#define NFCSTATUS_NOT_ALLOWED (0x003A)
-
-/*
- * FW version error while performing FW download,
- * FW major version mismatch (cannot downgrade FW major version) or FW version
- * already upto date
- * User may be trying to flash Mobile FW on top of Infra FW, which is not
- * allowed
- * Download appropriate version of FW
- */
-#define NFCSTATUS_FW_VERSION_ERROR (0x003C)
-
-/*
- *  The system is busy with the previous operation.
- */
-#define NFCSTATUS_BUSY (0x006F)
-
-/* NDEF Mapping error codes */
-
-/* The remote device (type) is not valid for this request. */
-#define NFCSTATUS_INVALID_REMOTE_DEVICE (0x001D)
-
-/* Read operation failed */
-#define NFCSTATUS_READ_FAILED (0x0014)
-
-/*
- * Write operation failed
- */
-#define NFCSTATUS_WRITE_FAILED (0x0015)
-
-/* Non Ndef Compliant */
-#define NFCSTATUS_NO_NDEF_SUPPORT (0x0016)
-
-/* Could not proceed further with the write operation: reached card EOF*/
-#define NFCSTATUS_EOF_NDEF_CONTAINER_REACHED (0x001A)
-
-/* Incorrect number of bytes received from the card*/
-#define NFCSTATUS_INVALID_RECEIVE_LENGTH (0x001B)
-
-/* The data format/composition is not understood/correct. */
-#define NFCSTATUS_INVALID_FORMAT (0x001C)
-
-/* There is not sufficient storage available. */
-#define NFCSTATUS_INSUFFICIENT_STORAGE (0x001F)
-
-/* The Ndef Format procedure has failed. */
-#define NFCSTATUS_FORMAT_ERROR (0x0023)
-
-/* The NCI Cedit error */
-#define NFCSTATUS_CREDIT_TIMEOUT (0x0024)
-
-/*
- * Response Time out for the control message(NFCC not responded)
- */
-#define NFCSTATUS_RESPONSE_TIMEOUT (0x0025)
-
-/*
- * Device is already connected
- */
-#define NFCSTATUS_ALREADY_CONNECTED (0x0026)
-
-/*
- * Device is already connected
- */
-#define NFCSTATUS_ANOTHER_DEVICE_CONNECTED (0x0027)
-
-/*
- * Single Target Detected and Activated
- */
-#define NFCSTATUS_SINGLE_TAG_ACTIVATED (0x0028)
-
-/*
- * Single Target Detected
- */
-#define NFCSTATUS_SINGLE_TAG_DISCOVERED (0x0029)
-
-/*
- * Secure element Detected and Activated
- */
-#define NFCSTATUS_SECURE_ELEMENT_ACTIVATED (0x0028)
-
-/*
- * Unknown error Status Codes
- */
-#define NFCSTATUS_UNKNOWN_ERROR (0x00FE)
-
-/*
- * Status code for failure
- */
-#define NFCSTATUS_FAILED (0x00FF)
-
-/*
- * The function/command has been aborted
- */
-#define NFCSTATUS_CMD_ABORTED (0x0002)
-
-/*
- * No target found after poll
- */
-#define NFCSTATUS_NO_TARGET_FOUND (0x000A)
-
-/* Attempt to disconnect a not connected remote device. */
-#define NFCSTATUS_NO_DEVICE_CONNECTED (0x000B)
-
-/* External RF field detected. */
-#define NFCSTATUS_EXTERNAL_RF_DETECTED (0x000E)
-
-/* Message is not allowed by the state machine
- * (e.g. configuration went wrong)
- */
-#define NFCSTATUS_MSG_NOT_ALLOWED_BY_FSM (0x0010)
-
-/*
- * No access has been granted
- */
-#define NFCSTATUS_ACCESS_DENIED (0x001E)
-
-/* No registry node matches the specified input data. */
-#define NFCSTATUS_NODE_NOT_FOUND (0x0017)
-
-/* The current module is busy ; one might retry later */
-#define NFCSTATUS_SMX_BAD_STATE (0x00F0)
-
-/* The Abort mechanism has failed for unexpected reason: user can try again*/
-#define NFCSTATUS_ABORT_FAILED (0x00F2)
-
-/* The Registration command has failed because the user wants to register as
- * target
- * on a operating mode not supported
- */
-#define NFCSTATUS_REG_OPMODE_NOT_SUPPORTED (0x00F5)
-
-/*
- * Shutdown in progress, cannot handle the request at this time.
- */
-#define NFCSTATUS_SHUTDOWN (0x0091)
-
-/*
- * Target is no more in RF field
- */
-#define NFCSTATUS_TARGET_LOST (0x0092)
-
-/*
- * Request is rejected
- */
-#define NFCSTATUS_REJECTED (0x0093)
-
-/*
- * Target is not connected
- */
-#define NFCSTATUS_TARGET_NOT_CONNECTED (0x0094)
-
-/*
- * Invalid handle for the operation
- */
-#define NFCSTATUS_INVALID_HANDLE (0x0095)
-
-/*
- * Process aborted
- */
-#define NFCSTATUS_ABORTED (0x0096)
-
-/*
- * Requested command is not supported
- */
-#define NFCSTATUS_COMMAND_NOT_SUPPORTED (0x0097)
-
-/*
- * Tag is not NDEF compilant
- */
-#define NFCSTATUS_NON_NDEF_COMPLIANT (0x0098)
-
-/*
- * Not enough memory available to complete the requested operation
- */
-#define NFCSTATUS_NOT_ENOUGH_MEMORY (0x001F)
-
-/*
- * Indicates incoming connection
- */
-#define NFCSTATUS_INCOMING_CONNECTION (0x0045)
-
-/*
- * Indicates Connection was successful
- */
-#define NFCSTATUS_CONNECTION_SUCCESS (0x0046)
-
-/*
- * Indicates Connection failed
- */
-#define NFCSTATUS_CONNECTION_FAILED (0x0047)
-
-#endif /* PHNFCSTATUS_H */
diff --git a/halimpl/pn54x/common/phNfcTypes.h b/halimpl/pn54x/common/phNfcTypes.h
deleted file mode 100644
index d80ad50..0000000
--- a/halimpl/pn54x/common/phNfcTypes.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef PHNFCTYPES_H
-#define PHNFCTYPES_H
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef TRUE
-#define TRUE (0x01) /* Logical True Value */
-#endif
-#ifndef FALSE
-#define FALSE (0x00) /* Logical False Value */
-#endif
-typedef uint8_t utf8_t;     /* UTF8 Character String */
-typedef uint8_t bool_t;     /* boolean data type */
-typedef uint16_t NFCSTATUS; /* Return values */
-#define STATIC static
-
-#define PHNFC_MAX_UID_LENGTH 0x0AU /* Maximum UID length expected */
-/* Maximum ATR_RES (General Bytes) length expected */
-#define PHNFC_MAX_ATR_LENGTH 0x30U
-#define PHNFC_NFCID_LENGTH 0x0AU /* Maximum length of NFCID 1.3*/
-#define PHNFC_ATQA_LENGTH 0x02U  /* ATQA length */
-
-/*
- * NFC Data structure
- */
-typedef struct phNfc_sData {
-  uint8_t* buffer; /* Buffer to store data */
-  uint32_t length; /* Buffer length */
-} phNfc_sData_t;
-
-/*
- * Possible Hardware Configuration exposed to upper layer.
- * Typically this should be port name (Ex:"COM1","COM2") to which PN54X is
- * connected.
- */
-typedef enum {
-  ENUM_LINK_TYPE_COM1,
-  ENUM_LINK_TYPE_COM2,
-  ENUM_LINK_TYPE_COM3,
-  ENUM_LINK_TYPE_COM4,
-  ENUM_LINK_TYPE_COM5,
-  ENUM_LINK_TYPE_COM6,
-  ENUM_LINK_TYPE_COM7,
-  ENUM_LINK_TYPE_COM8,
-  ENUM_LINK_TYPE_I2C,
-  ENUM_LINK_TYPE_SPI,
-  ENUM_LINK_TYPE_USB,
-  ENUM_LINK_TYPE_TCP,
-  ENUM_LINK_TYPE_NB
-} phLibNfc_eConfigLinkType;
-
-/*
- * Deferred message. This message type will be posted to the client application
- * thread
- * to notify that a deferred call must be invoked.
- */
-#define PH_LIBNFC_DEFERREDCALL_MSG (0x311)
-
-/*
- * Deferred call declaration.
- * This type of API is called from ClientApplication ( main thread) to notify
- * specific callback.
- */
-typedef void (*pphLibNfc_DeferredCallback_t)(void*);
-
-/*
- * Deferred parameter declaration.
- * This type of data is passed as parameter from ClientApplication (main thread)
- * to the
- * callback.
- */
-typedef void* pphLibNfc_DeferredParameter_t;
-
-/*
- * Possible Hardware Configuration exposed to upper layer.
- * Typically this should be at least the communication link (Ex:"COM1","COM2")
- * the controller is connected to.
- */
-typedef struct phLibNfc_sConfig {
-  uint8_t* pLogFile; /* Log File Name*/
-  /* Hardware communication link to the controller */
-  phLibNfc_eConfigLinkType nLinkType;
-  /* The client ID (thread ID or message queue ID) */
-  uintptr_t nClientId;
-} phLibNfc_sConfig_t, *pphLibNfc_sConfig_t;
-
-/*
- * NFC Message structure contains message specific details like
- * message type, message specific data block details, etc.
- */
-typedef struct phLibNfc_Message {
-  uint32_t eMsgType; /* Type of the message to be posted*/
-  void* pMsgData;    /* Pointer to message specific data block in case any*/
-  uint32_t Size;     /* Size of the datablock*/
-} phLibNfc_Message_t, *pphLibNfc_Message_t;
-
-/*
- * Deferred message specific info declaration.
- * This type of information is packed as message data when
- * PH_LIBNFC_DEFERREDCALL_MSG
- * type message is posted to message handler thread.
- */
-typedef struct phLibNfc_DeferredCall {
-  pphLibNfc_DeferredCallback_t pCallback;   /* pointer to Deferred callback */
-  pphLibNfc_DeferredParameter_t pParameter; /* pointer to Deferred parameter */
-} phLibNfc_DeferredCall_t;
-
-/*
- * Definitions for supported protocol
- */
-typedef struct phNfc_sSupProtocol {
-  unsigned int MifareUL : 1;    /* Protocol Mifare Ultra Light or any NFC Forum
-                                   Type-2 tags */
-  unsigned int MifareStd : 1;   /* Protocol Mifare Standard. */
-  unsigned int ISO14443_4A : 1; /* Protocol ISO14443-4 Type A.  */
-  unsigned int ISO14443_4B : 1; /* Protocol ISO14443-4 Type B.  */
-  unsigned int ISO15693 : 1;    /* Protocol ISO15693 HiTag.  */
-  unsigned int Felica : 1;      /* Protocol Felica. */
-  unsigned int NFC : 1;         /* Protocol NFC. */
-  unsigned int Jewel : 1;       /* Protocol Innovision Jewel Tag. or Any T1T*/
-  unsigned int
-      Desfire : 1;          /*TRUE indicates specified feature (mapping
-                            or formatting)for DESFire tag supported else not supported.*/
-  unsigned int Kovio : 1;   /* Protocol Kovio Tag*/
-  unsigned int HID : 1;     /* Protocol HID(Picopass) Tag*/
-  unsigned int Bprime : 1;  /* Protocol BPrime Tag*/
-  unsigned int EPCGEN2 : 1; /* Protocol EPCGEN2 Tag*/
-} phNfc_sSupProtocol_t;
-
-/*
- *  Enumerated MIFARE Commands
- */
-
-typedef enum phNfc_eMifareCmdList {
-  phNfc_eMifareRaw = 0x00U,      /* This command performs raw transcations */
-  phNfc_eMifareAuthentA = 0x60U, /* This command performs an authentication with
-                                    KEY A for a sector. */
-  phNfc_eMifareAuthentB = 0x61U, /* This command performs an authentication with
-                                    KEY B for a sector. */
-  phNfc_eMifareRead16 = 0x30U,  /* Read 16 Bytes from a Mifare Standard block */
-  phNfc_eMifareRead = 0x30U,    /* Read Mifare Standard */
-  phNfc_eMifareWrite16 = 0xA0U, /* Write 16 Bytes to a Mifare Standard block */
-  phNfc_eMifareWrite4 = 0xA2U,  /* Write 4 bytes. */
-  phNfc_eMifareInc = 0xC1U,     /* Increment */
-  phNfc_eMifareDec = 0xC0U,     /* Decrement */
-  phNfc_eMifareTransfer = 0xB0U,    /* Transfer */
-  phNfc_eMifareRestore = 0xC2U,     /* Restore.   */
-  phNfc_eMifareReadSector = 0x38U,  /* Read Sector.   */
-  phNfc_eMifareWriteSector = 0xA8U, /* Write Sector.   */
-  /* Above commands could be used for preparing raw command but below one can
-     not be */
-  phNfc_eMifareReadN = 0x01,      /* Proprietary Command */
-  phNfc_eMifareWriteN = 0x02,     /* Proprietary Command */
-  phNfc_eMifareSectorSel = 0x03,  /* Proprietary Command */
-  phNfc_eMifareAuth = 0x04,       /* Proprietary Command */
-  phNfc_eMifareProxCheck = 0x05,  /* Proprietary Command */
-  phNfc_eMifareInvalidCmd = 0xFFU /* Invalid Command */
-} phNfc_eMifareCmdList_t;
-
-/*
- * Information about ISO14443A
- */
-typedef struct phNfc_sIso14443AInfo {
-  uint8_t Uid[PHNFC_MAX_UID_LENGTH]; /* UID information of the TYPE A
-                                      * Tag Discovered */
-  uint8_t UidLength;                 /* UID information length */
-  uint8_t
-      AppData[PHNFC_MAX_ATR_LENGTH]; /* Application data information of the
-               1                      * tag discovered (= Historical bytes for
-                                      * type A) */
-  uint8_t AppDataLength;             /* Application data length */
-  uint8_t Sak;                       /* SAK information of the TYPE A
-                                      * Tag Discovered */
-  uint8_t AtqA[PHNFC_ATQA_LENGTH];   /* ATQA informationof the TYPE A
-                                      * Tag Discovered */
-  uint8_t MaxDataRate;               /* Maximum data rate supported
-                                      * by the tag Discovered */
-  uint8_t Fwi_Sfgt;                  /* Frame waiting time and start up
-                                      * frame guard */
-} phNfc_sIso14443AInfo_t;
-
-/* Remote device information structure */
-typedef union phNfc_uRemoteDevInfo {
-  phNfc_sIso14443AInfo_t Iso14443A_Info; /* ISO1443A Remote device info */
-} phNfc_uRemoteDevInfo_t;
-
-/*
-*
-*  The RF Device Type List is used to identify the type of
-*  remote device that is discovered and connected.
-*
-*/
-
-typedef enum phNfc_eRFDevType {
-  phNfc_eUnknown_DevType = 0x00U,
-
-  phNfc_eISO14443_A_PCD,
-  phNfc_eISO14443_B_PCD,
-  phNfc_eISO14443_BPrime_PCD,
-  phNfc_eFelica_PCD,
-  phNfc_eJewel_PCD,
-  phNfc_eISO15693_PCD,
-  phNfc_eEpcGen2_PCD,
-  phNfc_ePCD_DevType,
-
-  phNfc_ePICC_DevType,
-  phNfc_eISO14443_A_PICC,
-  phNfc_eISO14443_4A_PICC,
-  phNfc_eISO14443_3A_PICC,
-  phNfc_eMifare_PICC,
-  phNfc_eISO14443_B_PICC,
-  phNfc_eISO14443_4B_PICC,
-  phNfc_eISO14443_BPrime_PICC,
-  phNfc_eFelica_PICC,
-  phNfc_eJewel_PICC,
-  phNfc_eISO15693_PICC,
-  phNfc_eEpcGen2_PICC,
-
-  phNfc_eNfcIP1_Target,
-  phNfc_eNfcIP1_Initiator,
-
-  phNfc_eInvalid_DevType
-
-} phNfc_eRFDevType_t;
-
-/*
- * The Remote Device Type List is used to identify the type of
- * remote device that is discovered/connected
- */
-typedef phNfc_eRFDevType_t phNfc_eRemDevType_t;
-typedef phNfc_eRemDevType_t phHal_eRemDevType_t;
-
-/*
- *   Union for each available type of Commands.
- */
-
-typedef union phNfc_uCommand {
-  phNfc_eMifareCmdList_t MfCmd; /* Mifare command structure.  */
-} phNfc_uCmdList_t;
-
-/*
- *  The Remote Device Information Structure holds information about one single
- * Remote
- *  Device detected.
- */
-typedef struct phNfc_sRemoteDevInformation {
-  uint8_t SessionOpened;                /* Flag indicating the validity of
-                                         * the handle of the remote device.
-                                         * 1 = Device is not activer (Only discovered), 2 =
-                                         * Device is active and ready for use*/
-  phNfc_eRemDevType_t RemDevType;       /* Remote device type */
-  phNfc_uRemoteDevInfo_t RemoteDevInfo; /* Union of available Remote Device */
-} phNfc_sRemoteDevInformation_t;
-
-/*
- * Transceive Information Data Structure for sending commands/response to the
- * remote device
- */
-
-typedef struct phNfc_sTransceiveInfo {
-  phNfc_uCmdList_t cmd; /* Command for transceive */
-  uint8_t addr;         /* Start Block Number */
-  uint8_t NumBlock;     /* Number of Blocks to perform operation */
-  /* For Felica only*/
-  uint16_t* ServiceCodeList; /* 2 Byte service Code List */
-  uint16_t* Blocklist;       /* 2 Byte Block list */
-  phNfc_sData_t sSendData;   /* Send data */
-  phNfc_sData_t sRecvData;   /* Recv data */
-  /* For EPC-GEN */
-  uint32_t dwWordPtr;  /* Word address for the memory write */
-  uint8_t bWordPtrLen; /* Specifies the length of word pointer
-                       00: 8  bits
-                       01: 16 bits
-                       10: 24 bits
-                       11: 32 bits
-                       */
-  uint8_t bWordCount;  /* Number of words to be read or written */
-} phNfc_sTransceiveInfo_t;
-
-#define UNUSED(X) (void)X;
-
-#endif /* PHNFCTYPES_H */
diff --git a/halimpl/pn54x/dnld/phDnldNfc.c b/halimpl/pn54x/dnld/phDnldNfc.c
deleted file mode 100644
index d2258ef..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Download Component
- * Download Interface routines implementation
- */
-
-#include <dlfcn.h>
-#include <phDnldNfc_Internal.h>
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phTmlNfc.h>
-
-static void*
-    pFwLibHandle;    /* Global firmware lib handle used in this file only */
-uint16_t wMwVer = 0; /* Middleware version no */
-uint16_t wFwVer = 0; /* Firmware version no */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-uint8_t gRecFWDwnld;  // flag set to true to indicate dummy FW download
-#endif
-static pphDnldNfc_DlContext_t gpphDnldContext = NULL; /* Download contex */
-static pphDnldNfc_RspCb_t UserCb; /* Upper layer call back function */
-static void* UserCtxt;            /* Pointer to upper layer context */
-#undef EEPROM_Read_Mem_IMP
-
-/* Function prototype declaration */
-static void phDnldNfc_ReadComplete(void* pContext, NFCSTATUS status,
-                                   void* pInfo);
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_Reset
-**
-** Description      Performs a soft reset of the download module
-**
-** Parameters       pNotify  - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - reset request to NFCC is successful
-**                  NFCSTATUS_FAILED - reset request failed due to internal
-**                                     error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_Reset(pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
-      (gpphDnldContext->tCmdId) = PH_DL_CMD_RESET;
-      (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
-      (gpphDnldContext->tRspBuffInfo.wLen) = 0;
-      (gpphDnldContext->tUserData.pBuff) = NULL;
-      (gpphDnldContext->tUserData.wLen) = 0;
-      (gpphDnldContext->UserCb) = pNotify;
-      (gpphDnldContext->UserCtxt) = pContext;
-
-      wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventReset);
-
-      if (NFCSTATUS_PENDING == wStatus) {
-        NXPLOG_FWDNLD_D("Reset Request submitted successfully");
-      } else {
-        NXPLOG_FWDNLD_E("Reset Request Failed!!");
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_GetVersion
-**
-** Description      Retrieves Hardware version, ROM Code version, Protected Data
-**                  version, Trim data version, User data version, and Firmware
-**                  version information
-**
-** Parameters       pVersionInfo - response buffer which gets updated with
-**                                 complete version info from NFCC
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - GetVersion request to NFCC is successful
-**                  NFCSTATUS_FAILED - GetVersion request failed due to internal
-**                                     error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_GetVersion(pphDnldNfc_Buff_t pVersionInfo,
-                               pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pVersionInfo) || (NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((NULL != pVersionInfo->pBuff) && (0 != pVersionInfo->wLen)) {
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pVersionInfo->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pVersionInfo->wLen;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_GETVERSION;
-        (gpphDnldContext->tUserData.pBuff) = NULL;
-        (gpphDnldContext->tUserData.wLen) = 0;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventGetVer);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("GetVersion Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("GetVersion Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_GetSessionState
-**
-** Description      Retrieves the current session state of NFCC
-**
-** Parameters       pSession - response buffer which gets updated with complete
-**                             version info from NFCC
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - GetSessionState request to NFCC is
-**                                      successful
-**                  NFCSTATUS_FAILED - GetSessionState request failed due to
-**                                     internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_GetSessionState(pphDnldNfc_Buff_t pSession,
-                                    pphDnldNfc_RspCb_t pNotify,
-                                    void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pSession) || (NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((NULL != pSession->pBuff) && (0 != pSession->wLen)) {
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pSession->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pSession->wLen;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_GETSESSIONSTATE;
-        (gpphDnldContext->tUserData.pBuff) = NULL;
-        (gpphDnldContext->tUserData.wLen) = 0;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus =
-            phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventGetSesnSt);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("GetSessionState Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("GetSessionState Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_CheckIntegrity
-**
-** Description      Inspects the integrity of EEPROM and FLASH contents of the
-**                  NFCC, provides CRC for each section
-**                  NOTE: The user data section CRC is valid only after fresh
-**                        download
-**
-** Parameters       bChipVer - current ChipVersion for including additional
-**                             parameters in request payload
-**                  pCRCData - response buffer which gets updated with
-**                             respective section CRC status and CRC bytes from
-**                             NFCC
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - CheckIntegrity request is successful
-**                  NFCSTATUS_FAILED - CheckIntegrity request failed due to
-**                                     internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_CheckIntegrity(uint8_t bChipVer, pphDnldNfc_Buff_t pCRCData,
-                                   pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((PHDNLDNFC_HWVER_MRA2_1 == bChipVer) ||
-          (PHDNLDNFC_HWVER_MRA2_2 == bChipVer)
-#if (NFC_NXP_CHIP_TYPE == PN551)
-          || (PHDNLDNFC_HWVER_PN551_MRA1_0 == bChipVer)
-#elif (NFC_NXP_CHIP_TYPE == PN548C2)
-          || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bChipVer)
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-          || (PHDNLDNFC_HWVER_PN553_MRA1_0 == bChipVer) ||
-          (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & bChipVer)
-#endif
-              ) {
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_ChkIntg;
-      } else {
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
-      }
-
-      if ((NULL != pCRCData->pBuff) && (0 != pCRCData->wLen)) {
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pCRCData->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pCRCData->wLen;
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_CHECKINTEGRITY;
-        (gpphDnldContext->tUserData.pBuff) = NULL;
-        (gpphDnldContext->tUserData.wLen) = 0;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus =
-            phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventIntegChk);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("CheckIntegrity Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("CheckIntegrity Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-/*******************************************************************************
-**
-** Function         phDnldNfc_ReadLog
-**
-** Description      Retrieves log data from EEPROM
-**
-** Parameters       pData - response buffer which gets updated with data from
-**                          EEPROM
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - Read request to NFCC is successful
-**                  NFCSTATUS_FAILED - Read request failed due to internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_ReadLog(pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify,
-                            void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pNotify) || (NULL == pData) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((NULL != pData->pBuff) && (0 != pData->wLen)) {
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_READ;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRead;
-        (gpphDnldContext->FrameInp.dwAddr) = PHDNLDNFC_EEPROM_LOG_START_ADDR;
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pData->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pData->wLen;
-        (gpphDnldContext->tUserData.pBuff) = NULL;
-        (gpphDnldContext->tUserData.wLen) = 0;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        memset(&(gpphDnldContext->tRWInfo), 0,
-               sizeof(gpphDnldContext->tRWInfo));
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventRead);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("Read Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("Read Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_Write
-**
-** Description      Writes requested  data of length len to desired EEPROM/FLASH
-**                  address
-**
-** Parameters       bRecoverSeq - flag to indicate whether recover sequence data
-**                                needs to be written or not
-**                  pData - data buffer to write into EEPROM/FLASH by user
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - Write request to NFCC is successful
-**                  NFCSTATUS_FAILED - Write request failed due to internal
-**                                     error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_Write(bool_t bRecoverSeq, pphDnldNfc_Buff_t pData,
-                          pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t* pImgPtr = NULL;
-  uint16_t wLen = 0;
-  phDnldNfc_Buff_t tImgBuff;
-
-  if ((NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if (NULL != pData) {
-        pImgPtr = pData->pBuff;
-        wLen = pData->wLen;
-      } else {
-        if (bRecoverSeq == false) {
-          pImgPtr = (uint8_t*)gpphDnldContext->nxp_nfc_fw;
-          wLen = gpphDnldContext->nxp_nfc_fw_len;
-
-        } else {
-          if (PH_DL_STATUS_PLL_ERROR == (gpphDnldContext->tLastStatus)) {
-            wStatus = phDnldNfc_LoadRecInfo();
-          } else if (PH_DL_STATUS_SIGNATURE_ERROR ==
-                     (gpphDnldContext->tLastStatus)) {
-            wStatus = phDnldNfc_LoadPKInfo();
-          } else {
-          }
-
-          if (NFCSTATUS_SUCCESS == wStatus) {
-            pImgPtr = (uint8_t*)gpphDnldContext->nxp_nfc_fwp;
-            wLen = gpphDnldContext->nxp_nfc_fwp_len;
-          } else {
-            NXPLOG_FWDNLD_E("Platform Recovery Image extraction Failed!!");
-            pImgPtr = NULL;
-            wLen = 0;
-          }
-        }
-      }
-
-      if ((NULL != pImgPtr) && (0 != wLen)) {
-        tImgBuff.pBuff = pImgPtr;
-        tImgBuff.wLen = wLen;
-
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_WRITE;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTWrite;
-        (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
-        (gpphDnldContext->tRspBuffInfo.wLen) = 0;
-        (gpphDnldContext->tUserData.pBuff) = pImgPtr;
-        (gpphDnldContext->tUserData.wLen) = wLen;
-        (gpphDnldContext->bResendLastFrame) = false;
-
-        memset(&(gpphDnldContext->tRWInfo), 0,
-               sizeof(gpphDnldContext->tRWInfo));
-        (gpphDnldContext->tRWInfo.bFirstWrReq) = true;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventWrite);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("Write Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("Write Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Download Image Primitives extraction failed!!");
-        wStatus = NFCSTATUS_FAILED;
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_Log
-**
-** Description      Provides a full page free write to EEPROM
-**
-** Parameters       pData - data buffer to write into EEPROM/FLASH by user
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - Write request to NFCC is successful
-**                  NFCSTATUS_FAILED - Write request failed due to internal
-**                                     error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific error
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_Log(pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify,
-                        void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pNotify) || (NULL == pData) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((NULL != (pData->pBuff)) &&
-          ((0 != (pData->wLen) && (PHDNLDNFC_MAX_LOG_SIZE >= (pData->wLen))))) {
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_LOG;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTLog;
-        (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
-        (gpphDnldContext->tRspBuffInfo.wLen) = 0;
-        (gpphDnldContext->tUserData.pBuff) = (pData->pBuff);
-        (gpphDnldContext->tUserData.wLen) = (pData->wLen);
-
-        memset(&(gpphDnldContext->tRWInfo), 0,
-               sizeof(gpphDnldContext->tRWInfo));
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventLog);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("Log Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("Log Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Input Parameters for Log!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_Force
-**
-** Description      Used as an emergency recovery procedure for NFCC due to
-**                  corrupt settings of system platform specific parameters by
-**                  the host
-**
-** Parameters       pInputs - input buffer which contains  clk src & clk freq
-**                            settings for desired platform
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - Emergency Recovery request is successful
-**                  NFCSTATUS_FAILED - Emergency Recovery failed due to internal
-**                                     error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_Force(pphDnldNfc_Buff_t pInputs, pphDnldNfc_RspCb_t pNotify,
-                          void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t bClkSrc = 0x00, bClkFreq = 0x00;
-  uint8_t bPldVal[3] = {
-      0x11, 0x00, 0x00}; /* default values to be used if input not provided */
-
-  if ((NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      (gpphDnldContext->tCmdId) = PH_DL_CMD_FORCE;
-      (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTForce;
-      (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
-      (gpphDnldContext->tRspBuffInfo.wLen) = 0;
-
-      if ((0 != (pInputs->wLen)) || (NULL != (pInputs->pBuff))) {
-        if (CLK_SRC_XTAL == (pInputs->pBuff[0])) {
-          bClkSrc = phDnldNfc_ClkSrcXtal;
-        } else if (CLK_SRC_PLL == (pInputs->pBuff[0])) {
-          bClkSrc = phDnldNfc_ClkSrcPLL;
-          if (CLK_FREQ_13MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_13Mhz;
-          } else if (CLK_FREQ_19_2MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_19_2Mhz;
-          } else if (CLK_FREQ_24MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_24Mhz;
-          } else if (CLK_FREQ_26MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_26Mhz;
-          } else if (CLK_FREQ_38_4MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_38_4Mhz;
-          } else if (CLK_FREQ_52MHZ == (pInputs->pBuff[1])) {
-            bClkFreq = phDnldNfc_ClkFreq_52Mhz;
-          } else {
-            NXPLOG_FWDNLD_E(
-                "Invalid Clk Frequency !! Using default value of 19.2Mhz..");
-            bClkFreq = phDnldNfc_ClkFreq_19_2Mhz;
-          }
-
-        } else if (CLK_SRC_PADDIRECT == (pInputs->pBuff[0])) {
-          bClkSrc = phDnldNfc_ClkSrcPad;
-        } else {
-          NXPLOG_FWDNLD_E("Invalid Clk src !! Using default value of PLL..");
-          bClkSrc = phDnldNfc_ClkSrcPLL;
-        }
-
-        bPldVal[0] = 0U;
-        bPldVal[0] = ((bClkSrc << 3U) | bClkFreq);
-      } else {
-        NXPLOG_FWDNLD_E("Clk src inputs not provided!! Using default values..");
-      }
-
-      (gpphDnldContext->tUserData.pBuff) = bPldVal;
-      (gpphDnldContext->tUserData.wLen) = sizeof(bPldVal);
-
-      memset(&(gpphDnldContext->tRWInfo), 0, sizeof(gpphDnldContext->tRWInfo));
-      (gpphDnldContext->UserCb) = pNotify;
-      (gpphDnldContext->UserCtxt) = pContext;
-
-      wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventForce);
-
-      if (NFCSTATUS_PENDING == wStatus) {
-        NXPLOG_FWDNLD_D("Force Command Request submitted successfully");
-      } else {
-        NXPLOG_FWDNLD_E("Force Command Request Failed!!");
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_SetHwDevHandle
-**
-** Description      Stores the HwDev handle to download context. The handle is
-**                  required for subsequent operations
-**
-** Parameters       None
-**
-** Returns          None                -
-**
-*******************************************************************************/
-void phDnldNfc_SetHwDevHandle(void) {
-  pphDnldNfc_DlContext_t psDnldContext = NULL;
-
-  if (NULL == gpphDnldContext) {
-    NXPLOG_FWDNLD_D("Allocating Mem for Dnld Context..");
-    /* Create the memory for Download Mgmt Context */
-    psDnldContext =
-        (pphDnldNfc_DlContext_t)malloc(sizeof(phDnldNfc_DlContext_t));
-
-    if (psDnldContext != NULL) {
-      (void)memset((void*)psDnldContext, 0, sizeof(phDnldNfc_DlContext_t));
-      gpphDnldContext = psDnldContext;
-    } else {
-      NXPLOG_FWDNLD_E("Error Allocating Mem for Dnld Context..")
-    }
-  } else {
-    (void)memset((void*)gpphDnldContext, 0, sizeof(phDnldNfc_DlContext_t));
-  }
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ReSetHwDevHandle
-**
-** Description      Frees the HwDev handle to download context.
-**
-** Parameters       None
-**
-** Returns          None                -
-**
-*******************************************************************************/
-void phDnldNfc_ReSetHwDevHandle(void) {
-  if (gpphDnldContext != NULL) {
-    NXPLOG_FWDNLD_E("Freeing Mem for Dnld Context..")
-    free(gpphDnldContext);
-    gpphDnldContext = NULL;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_RawReq
-**
-** Description      Sends raw frame request to NFCC.
-**                  It is currently used for sending an NCI RESET cmd after
-**                  doing a production key update
-**
-** Parameters       pFrameData - input buffer, contains raw frame packet to be
-**                               sent to NFCC
-**                  pRspData - response buffer received from NFCC
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - GetSessionState request to NFCC is
-**                                      successful
-**                  NFCSTATUS_FAILED - GetSessionState request failed due to
-**                                     internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_RawReq(pphDnldNfc_Buff_t pFrameData,
-                           pphDnldNfc_Buff_t pRspData,
-                           pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pFrameData) || (NULL == pNotify) || (NULL == pRspData) ||
-      (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Raw Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if (((NULL != pFrameData->pBuff) && (0 != pFrameData->wLen)) &&
-          ((NULL != pRspData->pBuff) && (0 != pRspData->wLen))) {
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pRspData->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pRspData->wLen;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRaw;
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_NONE;
-        (gpphDnldContext->tUserData.pBuff) = pFrameData->pBuff;
-        (gpphDnldContext->tUserData.wLen) = pFrameData->wLen;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventRaw);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("RawFrame Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("RawFrame Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_InitImgInfo
-**
-** Description      Extracts image information and stores it in respective
-**                  variables, to be used internally for write operation
-**
-** Parameters       None
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_InitImgInfo(void) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t* pImageInfo = NULL;
-  uint16_t ImageInfoLen = 0;
-  char fwFileName[256];
-  char fwpathName[256];
-  char* pathName = NULL;
-
-  /* if memory is not allocated then allocate memory for download context
-   * structure */
-  phDnldNfc_SetHwDevHandle();
-
-  /*Read Firmware file name from config file*/
-  if (GetNxpStrValue(NAME_NXP_FW_NAME, fwFileName, sizeof(fwFileName)) ==
-      true) {
-    strcpy(fwpathName, FW_DLL_ROOT_DIR);
-    strncat(fwpathName, fwFileName, strlen(fwFileName));
-    pathName = fwpathName;
-  }
-
-/* load the library and get the image info pointer */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  if (gRecFWDwnld == true)
-    wStatus = phDnldNfc_LoadRecoveryFW(pathName, &pImageInfo, &ImageInfoLen);
-  else
-#endif
-    wStatus = phDnldNfc_LoadFW(pathName, &pImageInfo, &ImageInfoLen);
-
-  NXPLOG_FWDNLD_E("FW Image Length - ImageInfoLen %d", ImageInfoLen);
-  NXPLOG_FWDNLD_E("FW Image Info Pointer - pImageInfo %p", pImageInfo);
-
-  if ((pImageInfo == NULL) || (ImageInfoLen == 0)) {
-    NXPLOG_FWDNLD_E(
-        "Image extraction Failed - invalid imginfo or imginfolen!!");
-    wStatus = NFCSTATUS_FAILED;
-  }
-
-  if (wStatus != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("Error loading libpn54x_fw !!\n");
-  }
-
-  /* get the MW version */
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    // NXPLOG_FWDNLD_D("MW Major Version Num - %x",NXP_MW_VERSION_MAJ);
-    // NXPLOG_FWDNLD_D("MW Minor Version Num - %x",NXP_MW_VERSION_MIN);
-    wMwVer = (((uint16_t)(NXP_MW_VERSION_MAJ) << 8U) | (NXP_MW_VERSION_MIN));
-  }
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    gpphDnldContext->nxp_nfc_fw = (uint8_t*)pImageInfo;
-    gpphDnldContext->nxp_nfc_fw_len = ImageInfoLen;
-    if ((NULL != gpphDnldContext->nxp_nfc_fw) &&
-        (0 != gpphDnldContext->nxp_nfc_fw_len)) {
-      NXPLOG_FWDNLD_E("FW Major Version Num - %x",
-                      gpphDnldContext->nxp_nfc_fw[5]);
-      NXPLOG_FWDNLD_E("FW Minor Version Num - %x",
-                      gpphDnldContext->nxp_nfc_fw[4]);
-      NXPLOG_FWDNLD_E("FW Image Length - %d", ImageInfoLen);
-      NXPLOG_FWDNLD_E("FW Image Info Pointer - %p", pImageInfo);
-
-      /* get the FW version */
-      wFwVer = (((uint16_t)(gpphDnldContext->nxp_nfc_fw[5]) << 8U) |
-                (gpphDnldContext->nxp_nfc_fw[4]));
-      wStatus = NFCSTATUS_SUCCESS;
-    } else {
-      NXPLOG_FWDNLD_E("Image details extraction Failed!!");
-      wStatus = NFCSTATUS_FAILED;
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_LoadRecInfo
-**
-** Description      Extracts recovery sequence image information and stores it
-**                  in respective variables, to be used internally for write
-**                  operation
-**
-** Parameters       None
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_LoadRecInfo(void) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t* pImageInfo = NULL;
-  uint16_t ImageInfoLen = 0;
-
-  /* if memory is not allocated then allocate memory for donwload context
-   * structure */
-  phDnldNfc_SetHwDevHandle();
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  if (gRecFWDwnld == true)
-    wStatus =
-        phDnldNfc_LoadRecoveryFW(PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
-  else
-#endif
-    wStatus = phDnldNfc_LoadFW(PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
-  if ((pImageInfo == NULL) || (ImageInfoLen == 0)) {
-    NXPLOG_FWDNLD_E(
-        "Image extraction Failed - invalid imginfo or imginfolen!!");
-    wStatus = NFCSTATUS_FAILED;
-  }
-
-  /* load the PLL recovery image library */
-  if (wStatus != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("Error loading libpn54x_fw_platform !!\n");
-  }
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    /* fetch the PLL recovery image pointer and the image length */
-    gpphDnldContext->nxp_nfc_fwp = (uint8_t*)pImageInfo;
-    gpphDnldContext->nxp_nfc_fwp_len = ImageInfoLen;
-    if ((NULL != gpphDnldContext->nxp_nfc_fwp) &&
-        (0 != gpphDnldContext->nxp_nfc_fwp_len)) {
-      NXPLOG_FWDNLD_D("Recovery Image Length - %d", ImageInfoLen);
-      NXPLOG_FWDNLD_D("Recovery Image Info Pointer - %p", pImageInfo);
-      wStatus = NFCSTATUS_SUCCESS;
-    } else {
-      NXPLOG_FWDNLD_E("Recovery Image details extraction Failed!!");
-      wStatus = NFCSTATUS_FAILED;
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_LoadPKInfo
-**
-** Description      Extracts production sequence image information and stores it
-**                  in respective variables, to be used internally for write
-**                  operation
-**
-** Parameters       None
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_LoadPKInfo(void) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t* pImageInfo = NULL;
-  uint16_t ImageInfoLen = 0;
-
-  /* if memory is not allocated then allocate memory for donwload context
-   * structure */
-  phDnldNfc_SetHwDevHandle();
-
-/* load the PKU image library */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  if (gRecFWDwnld == true)
-    wStatus =
-        phDnldNfc_LoadRecoveryFW(PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
-  else
-#endif
-    wStatus = phDnldNfc_LoadFW(PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
-  if ((pImageInfo == NULL) || (ImageInfoLen == 0)) {
-    NXPLOG_FWDNLD_E(
-        "Image extraction Failed - invalid imginfo or imginfolen!!");
-    wStatus = NFCSTATUS_FAILED;
-  }
-
-  if (wStatus != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("Error loading libpn54x_fw_pku !!\n");
-  }
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    /* fetch the PKU image pointer and the image length */
-    gpphDnldContext->nxp_nfc_fwp = (uint8_t*)pImageInfo;
-    gpphDnldContext->nxp_nfc_fwp_len = ImageInfoLen;
-
-    if ((NULL != gpphDnldContext->nxp_nfc_fwp) &&
-        (0 != gpphDnldContext->nxp_nfc_fwp_len)) {
-      NXPLOG_FWDNLD_D("PKU Image Length - %d", ImageInfoLen);
-      NXPLOG_FWDNLD_D("PKU Image Info Pointer - %p", pImageInfo);
-      wStatus = NFCSTATUS_SUCCESS;
-    } else {
-      NXPLOG_FWDNLD_E("PKU Image details extraction Failed!!");
-      wStatus = NFCSTATUS_FAILED;
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_CloseFwLibHandle
-**
-** Description      Closes previously opened fw library handle as part of
-**                  dynamic loader processing
-**
-** Parameters       None
-**
-** Returns          None
-**
-*******************************************************************************/
-void phDnldNfc_CloseFwLibHandle(void) {
-  NFCSTATUS wStatus;
-
-  wStatus = phDnldNfc_UnloadFW();
-  if (wStatus != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("free library FAILED !!\n");
-  } else {
-    NXPLOG_FWDNLD_E("free library SUCCESS !!\n");
-  }
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_LoadFW
-**
-** Description      Load the firmware version form firmware lib
-**
-** Parameters       pathName    - Firmware image path
-**                  pImgInfo    - Firmware image handle
-**                  pImgInfoLen - Firmware image length
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_LoadFW(const char* pathName, uint8_t** pImgInfo,
-                           uint16_t* pImgInfoLen) {
-  void* pImageInfo = NULL;
-  void* pImageInfoLen = NULL;
-  if (pathName == NULL) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    pathName = "/system/vendor/firmware/libpn548ad_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-    pathName = "/system/vendor/firmware/libpn551_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-    pathName = "/system/vendor/firmware/libpn553_fw.so";
-#else
-    pathName = "/system/vendor/firmware/libpn547_fw.so";
-#endif
-  }
-
-  /* check if the handle is not NULL then free the library */
-  if (pFwLibHandle != NULL) {
-    phDnldNfc_UnloadFW();
-    pFwLibHandle = NULL;
-  }
-
-  /* load the DLL file */
-  pFwLibHandle = dlopen(pathName, RTLD_LAZY);
-  NXPLOG_FWDNLD_D("@@@%s", pathName);
-
-  /* if library load failed then handle will be NULL */
-  if (pFwLibHandle == NULL) {
-    NXPLOG_FWDNLD_E(
-        "NULL handler : unable to load the library file, specify correct path");
-    return NFCSTATUS_FAILED;
-  }
-
-  dlerror(); /* Clear any existing error */
-
-  /* load the address of download image pointer and image size */
-  pImageInfo = (void*)dlsym(pFwLibHandle, "gphDnldNfc_DlSeq");
-
-  if (dlerror() || (NULL == pImageInfo)) {
-    NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DlSeq");
-    return NFCSTATUS_FAILED;
-  }
-  (*pImgInfo) = (*(uint8_t**)pImageInfo);
-
-  pImageInfoLen = (void*)dlsym(pFwLibHandle, "gphDnldNfc_DlSeqSz");
-  if (dlerror() || (NULL == pImageInfoLen)) {
-    NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DlSeqSz");
-    return NFCSTATUS_FAILED;
-  }
-
-  (*pImgInfoLen) = (uint16_t)(*((uint16_t*)pImageInfoLen));
-
-  return NFCSTATUS_SUCCESS;
-}
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-/*******************************************************************************
-**
-** Function         phDnldNfc_LoadRecoveryFW
-**
-** Description      Load the dummy firmware version form firmware lib for
-**                  recovery. This will change the FW version of the NFCC
-**                  firmware and enable flashing of firmware of same version.
-**
-** Parameters       pathName    - Firmware image path
-**                  pImgInfo    - Firmware image handle
-**                  pImgInfoLen - Firmware image length
-**
-** Returns          NFCSTATUS
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_LoadRecoveryFW(const char* pathName, uint8_t** pImgInfo,
-                                   uint16_t* pImgInfoLen) {
-  void* pImageInfo = NULL;
-  void* pImageInfoLen = NULL;
-
-  /* check for path name */
-  if (pathName == NULL) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    pathName = "/system/vendor/firmware/libpn548ad_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-    pathName = "/system/vendor/firmware/libpn551_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-    pathName = "/system/vendor/firmware/libpn553_fw.so";
-#else
-    pathName = "/system/vendor/firmware/libpn547_fw.so";
-#endif
-  }
-
-  /* check if the handle is not NULL then free the library */
-  if (pFwLibHandle != NULL) {
-    phDnldNfc_UnloadFW();
-    pFwLibHandle = NULL;
-  }
-  /* load the DLL file */
-  pFwLibHandle = dlopen(pathName, RTLD_LAZY);
-  NXPLOG_FWDNLD_D("phDnldNfc_LoadRecoveryFW %s ", pathName);
-
-  /* if library load failed then handle will be NULL */
-  if (pFwLibHandle == NULL) {
-    NXPLOG_FWDNLD_E(
-        "NULL handler : unable to load the library file, specify correct path");
-    return NFCSTATUS_FAILED;
-  }
-
-  dlerror(); /* Clear any existing error */
-
-  /* load the address of download image pointer and image size */
-  pImageInfo = (void*)dlsym(pFwLibHandle, "gphDnldNfc_DummyDlSeq");
-
-  if (dlerror() || (NULL == pImageInfo)) {
-    NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DummyDlSeq");
-    return NFCSTATUS_FAILED;
-  }
-
-  (*pImgInfo) = (*(uint8_t**)pImageInfo);
-  pImageInfoLen = (void*)dlsym(pFwLibHandle, "gphDnldNfc_DlSeqDummyFwSz");
-  if (dlerror() || (NULL == pImageInfoLen)) {
-    NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DlSeqDummyFwSz");
-    return NFCSTATUS_FAILED;
-  }
-
-  (*pImgInfoLen) = (uint16_t)(*((uint16_t*)pImageInfoLen));
-
-  return NFCSTATUS_SUCCESS;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_UnloadFW
-**
-** Description      Deinit the firmware handle
-**
-** Parameters       None
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_UnloadFW(void) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  int32_t status;
-
-  /* check if the handle is not NULL then free the library */
-  if (pFwLibHandle != NULL) {
-    status = dlclose(pFwLibHandle);
-    pFwLibHandle = NULL;
-
-    dlerror(); /* Clear any existing error */
-    if (status != 0) {
-      wStatus = NFCSTATUS_FAILED;
-      NXPLOG_FWDNLD_E("Free library file failed");
-    }
-  }
-
-  return wStatus;
-}
-
-#ifdef EEPROM_Read_Mem_IMP
-/*******************************************************************************
-**
-** Function         phDnldNfc_ReadMem
-**
-** Description      Dumps the contents of EEPROM. The handle is required for
-**                  subsequent operations
-**
-** Parameters       pHwRef - pointer to the hardware device
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - request to NFCC is successful
-**                  NFCSTATUS_FAILED - request failed due to internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_ReadMem(void* pHwRef, pphDnldNfc_RspCb_t pNotify,
-                            void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint32_t wAddr = 0x2011C0; /* eeprom platform specific area start address */
-  uint32_t wRdAddr = 0;
-  uint8_t* pAddr;
-  static uint8_t bRdData[3519]; /* buffer to hold the read data */
-  static phDnldNfc_Buff_t Data;
-
-  if ((NULL == pNotify) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    /* Call Tml Ioctl to enable download mode */
-    wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      /* Set the obtained device handle to download module */
-      phDnldNfc_SetHwDevHandle();
-    } else {
-      wStatus = NFCSTATUS_FAILED;
-    }
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      pAddr = (uint8_t*)&wAddr;
-
-      wRdAddr = (pAddr[3]);
-      wRdAddr <<= 8;
-      wRdAddr |= (pAddr[2]);
-      wRdAddr <<= 8;
-      wRdAddr |= (pAddr[1]);
-      wRdAddr <<= 8;
-      wRdAddr |= (pAddr[0]);
-
-      Data.pBuff = bRdData;
-      Data.wLen = sizeof(bRdData);
-      UserCb = pNotify;
-      UserCtxt = pContext;
-
-      wStatus = phDnldNfc_Read(&Data, wRdAddr,
-                               (pphDnldNfc_RspCb_t)phDnldNfc_ReadComplete,
-                               gpphDnldContext);
-    } else {
-      Data.pBuff = NULL;
-      Data.wLen = 0;
-      wStatus = NFCSTATUS_FAILED;
-    }
-
-    if (NFCSTATUS_PENDING == wStatus) {
-      NXPLOG_FWDNLD_D("Read Request submitted successfully..");
-    } else {
-      NXPLOG_FWDNLD_E("Read Request submission failed!!");
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ReadComplete
-**
-** Description      Read complete
-**
-** Parameters       pContext - caller layer context
-**                  status   - status of the transaction
-**                  pInfo    - transaction info
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phDnldNfc_ReadComplete(void* pContext, NFCSTATUS status,
-                                   void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  UNUSED(pContext);
-
-  /* Call Tml Ioctl to enable/restore normal mode */
-  wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableNormalMode);
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    NXPLOG_FWDNLD_D("Read Done!!");
-  }
-
-  UserCb(&UserCtxt, status, pInfo);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_Read
-**
-** Description      Retrieves requested data of specified length from desired
-**                  EEPROM address
-**
-** Parameters       pData - response buffer which gets updated with data from
-**                          EEPROM
-**                  dwRdAddr - EEPROM address for data read
-**                  pNotify - notify caller after getting response
-**                  pContext - caller context
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - Read request to NFCC is successful
-**                  NFCSTATUS_FAILED - Read request failed due to internal error
-**                  NFCSTATUS_NOT_ALLOWED - command not allowed
-**                  Other command specific errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_Read(pphDnldNfc_Buff_t pData, uint32_t dwRdAddr,
-                         pphDnldNfc_RspCb_t pNotify, void* pContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if ((NULL == pNotify) || (NULL == pData) || (NULL == pContext)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
-    } else {
-      if ((NULL != pData->pBuff) && (0 != pData->wLen)) {
-        (gpphDnldContext->tCmdId) = PH_DL_CMD_READ;
-        (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRead;
-        (gpphDnldContext->FrameInp.dwAddr) = dwRdAddr;
-        (gpphDnldContext->tRspBuffInfo.pBuff) = pData->pBuff;
-        (gpphDnldContext->tRspBuffInfo.wLen) = pData->wLen;
-        (gpphDnldContext->tUserData.pBuff) = NULL;
-        (gpphDnldContext->tUserData.wLen) = 0;
-        (gpphDnldContext->UserCb) = pNotify;
-        (gpphDnldContext->UserCtxt) = pContext;
-
-        memset(&(gpphDnldContext->tRWInfo), 0,
-               sizeof(gpphDnldContext->tRWInfo));
-
-        wStatus = phDnldNfc_CmdHandler(gpphDnldContext, phDnldNfc_EventRead);
-
-        if (NFCSTATUS_PENDING == wStatus) {
-          NXPLOG_FWDNLD_D("Read Request submitted successfully");
-        } else {
-          NXPLOG_FWDNLD_E("Read Request Failed!!");
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    }
-  }
-
-  return wStatus;
-}
-#endif
diff --git a/halimpl/pn54x/dnld/phDnldNfc.h b/halimpl/pn54x/dnld/phDnldNfc.h
deleted file mode 100644
index 5b7e420..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Firmware Download Interface File
- */
-#ifndef PHDNLDNFC_H
-#define PHDNLDNFC_H
-
-#include <phNfcStatus.h>
-
-/*
- *
- * Callback for handling the received data/response from PN54X.
- * Parameters to be passed/registered to download context during respective
- * download function call:
- *      pContext - Upper layer context
- *      wStatus  - Status of the transaction
- *      pInfo    - Contains the Transaction Info
- */
-typedef void (*pphDnldNfc_RspCb_t)(void* pContext, NFCSTATUS wStatus,
-                                   void* pInfo);
-
-#define PHLIBNFC_FWDNLD_SESSNOPEN (0x01U)   /* download session is Open */
-#define PHLIBNFC_FWDNLD_SESSNCLOSED (0x00U) /* download session is Closed */
-
-#define PHDNLDNFC_HWVER_MRA1_0 (0x01U) /* ChipVersion MRA1.0 */
-#define PHDNLDNFC_HWVER_MRA1_1 (0x02U) /* ChipVersion MRA1.1 */
-#define PHDNLDNFC_HWVER_MRA2_0 (0x03U) /* ChipVersion MRA2.0 */
-#define PHDNLDNFC_HWVER_MRA2_1 (0x04U) /* ChipVersion MRA2.1 */
-#define PHDNLDNFC_HWVER_MRA2_2 (0x05U) /* ChipVersion MRA2.2 */
-
-/* PN548AD ChipVersion MRA1.0 */
-#define PHDNLDNFC_HWVER_PN548AD_MRA1_0 (0x08U)
-
-/* PN551 ChipVersion MRA1.0 */
-#define PHDNLDNFC_HWVER_PN551_MRA1_0 (0x08U)
-/* PN553-NCI1.0 ChipVersion MRA1.0 */
-#define PHDNLDNFC_HWVER_PN553_MRA1_0 (0x0BU)
-/* PN553 A0 -> 0x40 hardware version
-   PN553 B0 -> 0x41
-   PN80T A0 -> 0x50
-   PN80T B0 -> 0x51 */
-#define PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED (0x40U)
-/*
- * Enum definition contains Download Life Cycle States
- */
-typedef enum phDnldNfc_LC {
-  phDnldNfc_LCCreat = 11, /* Life Cycle Creation*/
-  phDnldNfc_LCInit = 13,  /* Life Cycle Initializing */
-  phDnldNfc_LCOper = 17,  /* Life Cycle Operational */
-  phDnldNfc_LCTerm = 19   /* Life Cycle Termination */
-} phDnldNfc_LC_t;
-
-/*
- * Enum definition contains Clk Source Options for Force command request
- */
-typedef enum phDnldNfc_ClkSrc {
-  phDnldNfc_ClkSrcXtal = 1U, /* Crystal */
-  phDnldNfc_ClkSrcPLL = 2U,  /* PLL output */
-  phDnldNfc_ClkSrcPad = 3U   /* Directly use clk on CLK_IN Pad */
-} phDnldNfc_ClkSrc_t;
-
-/*
- * Enum definition contains Clk Frequency value for Force command request
- */
-typedef enum phDnldNfc_ClkFreq {
-  phDnldNfc_ClkFreq_13Mhz = 0U,   /* 13Mhz Clk Frequency */
-  phDnldNfc_ClkFreq_19_2Mhz = 1U, /* 19.2Mhz Clk Frequency */
-  phDnldNfc_ClkFreq_24Mhz = 2U,   /* 24Mhz Clk Frequency */
-  phDnldNfc_ClkFreq_26Mhz = 3U,   /* 26Mhz Clk Frequency */
-  phDnldNfc_ClkFreq_38_4Mhz = 4U, /* 38.4Mhz Clk Frequency */
-  phDnldNfc_ClkFreq_52Mhz = 5U    /* 52Mhz Clk Frequency */
-} phDnldNfc_ClkFreq_t;
-
-/*
- * Struct contains buffer where user payload shall be stored
- */
-typedef struct phDnldNfc_Buff {
-  uint8_t* pBuff; /*pointer to the buffer where user payload shall be stored*/
-  uint16_t wLen;  /*Buffer length*/
-} phDnldNfc_Buff_t, *pphDnldNfc_Buff_t; /* pointer to #phDnldNfc_Buff_t */
-
-/*
-*********************** Function Prototype Declaration *************************
-*/
-
-extern NFCSTATUS phDnldNfc_Reset(pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_GetVersion(pphDnldNfc_Buff_t pVersionInfo,
-                                      pphDnldNfc_RspCb_t pNotify,
-                                      void* pContext);
-extern NFCSTATUS phDnldNfc_CheckIntegrity(uint8_t bChipVer,
-                                          pphDnldNfc_Buff_t pCRCData,
-                                          pphDnldNfc_RspCb_t pNotify,
-                                          void* pContext);
-extern NFCSTATUS phDnldNfc_GetSessionState(pphDnldNfc_Buff_t pSession,
-                                           pphDnldNfc_RspCb_t pNotify,
-                                           void* pContext);
-extern NFCSTATUS phDnldNfc_Force(pphDnldNfc_Buff_t pInputs,
-                                 pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_Read(pphDnldNfc_Buff_t pData, uint32_t dwRdAddr,
-                                pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_ReadLog(pphDnldNfc_Buff_t pData,
-                                   pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_Write(bool_t bRecoverSeq, pphDnldNfc_Buff_t pData,
-                                 pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_Log(pphDnldNfc_Buff_t pData,
-                               pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern void phDnldNfc_SetHwDevHandle(void);
-void phDnldNfc_ReSetHwDevHandle(void);
-extern NFCSTATUS phDnldNfc_ReadMem(void* pHwRef, pphDnldNfc_RspCb_t pNotify,
-                                   void* pContext);
-extern NFCSTATUS phDnldNfc_RawReq(pphDnldNfc_Buff_t pFrameData,
-                                  pphDnldNfc_Buff_t pRspData,
-                                  pphDnldNfc_RspCb_t pNotify, void* pContext);
-extern NFCSTATUS phDnldNfc_InitImgInfo(void);
-extern NFCSTATUS phDnldNfc_LoadRecInfo(void);
-extern NFCSTATUS phDnldNfc_LoadPKInfo(void);
-extern void phDnldNfc_CloseFwLibHandle(void);
-extern NFCSTATUS phDnldNfc_LoadFW(const char* pathName, uint8_t** pImgInfo,
-                                  uint16_t* pImgInfoLen);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-extern NFCSTATUS phDnldNfc_LoadRecoveryFW(const char* pathName,
-                                          uint8_t** pImgInfo,
-                                          uint16_t* pImgInfoLen);
-#endif
-extern NFCSTATUS phDnldNfc_UnloadFW(void);
-#endif /* PHDNLDNFC_H */
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Cmd.h b/halimpl/pn54x/dnld/phDnldNfc_Cmd.h
deleted file mode 100644
index 31992f6..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Cmd.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Firmware Download command values
- */
-
-#ifndef PHDNLDNFC_CMD_H
-#define PHDNLDNFC_CMD_H
-
-#include <phNfcStatus.h>
-
-/*
- * Enum definition contains Firmware Download Command Ids
- */
-typedef enum phDnldNfc_CmdId {
-  PH_DL_CMD_NONE = 0x00,           /* Invalid Cmd */
-  PH_DL_CMD_RESET = 0xF0,          /* Reset */
-  PH_DL_CMD_GETVERSION = 0xF1,     /* Get Version */
-  PH_DL_CMD_CHECKINTEGRITY = 0xE0, /* Check Integrity */
-  PH_DL_CMD_WRITE = 0xC0,          /* Write */
-  PH_DL_CMD_READ = 0xA2,           /* Read */
-  PH_DL_CMD_LOG = 0xA7,            /* Log */
-  PH_DL_CMD_FORCE = 0xD0,          /* Force */
-  PH_DL_CMD_GETSESSIONSTATE = 0xF2 /* Get Session State */
-} phDnldNfc_CmdId_t;
-
-#endif /* PHDNLDNFC_CMD_H */
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Internal.c b/halimpl/pn54x/dnld/phDnldNfc_Internal.c
deleted file mode 100644
index 2a66af1..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Internal.c
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Internal Download Management routines
- * Download Component
- */
-
-#include <phDnldNfc_Internal.h>
-#include <phDnldNfc_Utils.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal_utils.h>
-#include <phTmlNfc.h>
-
-/* Minimum length of payload including 1 byte CmdId */
-#define PHDNLDNFC_MIN_PLD_LEN (0x04U)
-
-/* Offset of Length byte within the frame */
-#define PHDNLDNFC_FRAME_HDR_OFFSET (0x00)
-/* Offset of FrameId within the frame */
-#define PHDNLDNFC_FRAMEID_OFFSET (PHDNLDNFC_FRAME_HDR_LEN)
-/* Offset of status byte within the frame */
-#define PHDNLDNFC_FRAMESTATUS_OFFSET PHDNLDNFC_FRAMEID_OFFSET
-/* Offset within frame where payload starts*/
-#define PHDNLDNFC_PLD_OFFSET (PHDNLDNFC_MIN_PLD_LEN - 1)
-
-#define PHDNLDNFC_FRAME_RDDATA_OFFSET \
-  ((PHDNLDNFC_FRAME_HDR_LEN) +        \
-   (PHDNLDNFC_MIN_PLD_LEN)) /* recvd frame offset where data starts */
-
-/* Size of first secure write frame Signature */
-#define PHDNLDNFC_FRAME_SIGNATURE_SIZE (0xC0U)
-/* Size of first secure write frame payload */
-#define PHDNLDNFC_FIRST_FRAME_PLD_SIZE (0xE4U)
-
-/* Status response for first fragmented write frame */
-#define PHDNLDNFC_FIRST_FRAGFRAME_RESP (0x2DU)
-/* Status response for subsequent fragmented write frame */
-#define PHDNLDNFC_NEXT_FRAGFRAME_RESP (0x2EU)
-
-#define PHDNLDNFC_SET_HDR_FRAGBIT(n) \
-  ((n) | (1 << 10)) /* Header chunk bit set macro */
-#define PHDNLDNFC_CLR_HDR_FRAGBIT(n) \
-  ((n) & ~(1U << 10)) /* Header chunk bit clear macro */
-#define PHDNLDNFC_CHK_HDR_FRAGBIT(n) \
-  ((n)&0x04) /* macro to check if frag bit is set in Hdr */
-
-/* Timeout value to wait for response from NFCC */
-#define PHDNLDNFC_RSP_TIMEOUT (2500)
-/* Timeout value to wait before resending the last frame */
-#define PHDNLDNFC_RETRY_FRAME_WRITE (50)
-
-/* size of EEPROM user data length */
-#define PHDNLDNFC_USERDATA_EEPROM_LENSIZE (0x02U)
-/* size of EEPROM offset */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSIZE (0x02U)
-
-#ifdef NXP_PN547C1_DOWNLOAD
-/* EEPROM offset and length value for PN547C1 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x003CU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0DC0U)
-#else
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-/* EEPROM offset and length value for PN548AD */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x02BCU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C00U)
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-/* EEPROM offset and length value for PN551 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x02BCU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C00U)
-#else
-/* EEPROM offset and length value for PN547C2 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x023CU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C80U)
-#endif
-
-#endif
-#define PH_LIBNFC_VEN_RESET_ON_DOWNLOAD_TIMEOUT (1)
-
-/* Function prototype declarations */
-static void phDnldNfc_ProcessSeqState(void* pContext,
-                                      phTmlNfc_TransactInfo_t* pInfo);
-static void phDnldNfc_ProcessRWSeqState(void* pContext,
-                                        phTmlNfc_TransactInfo_t* pInfo);
-static NFCSTATUS phDnldNfc_ProcessFrame(void* pContext,
-                                        phTmlNfc_TransactInfo_t* pInfo);
-static NFCSTATUS phDnldNfc_ProcessRecvInfo(void* pContext,
-                                           phTmlNfc_TransactInfo_t* pInfo);
-static NFCSTATUS phDnldNfc_BuildFramePkt(pphDnldNfc_DlContext_t pDlContext);
-static NFCSTATUS phDnldNfc_CreateFramePld(pphDnldNfc_DlContext_t pDlContext);
-static NFCSTATUS phDnldNfc_SetupResendTimer(pphDnldNfc_DlContext_t pDlContext);
-static NFCSTATUS phDnldNfc_UpdateRsp(pphDnldNfc_DlContext_t pDlContext,
-                                     phTmlNfc_TransactInfo_t* pInfo,
-                                     uint16_t wPldLen);
-static void phDnldNfc_RspTimeOutCb(uint32_t TimerId, void* pContext);
-static void phDnldNfc_ResendTimeOutCb(uint32_t TimerId, void* pContext);
-
-/*
-*************************** Function Definitions ***************************
-*/
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_CmdHandler
-**
-** Description      Download Command Handler Mechanism
-**                  - holds the sub states for each command processing
-**                  - coordinates with TML download thread to complete a
-**                    download command request
-**                  - calls the user callback on completion of a cmd
-**
-** Parameters       pContext  - pointer to the download context structure
-**                  TrigEvent - event requested by user
-**
-** Returns          NFC status:
-**                  NFCSTATUS_PENDING - download request sent to NFCC
-**                                      successfully,response pending
-**                  NFCSTATUS_BUSY - handler is busy processing a download
-**                                   request
-**                  NFCSTATUS_INVALID_PARAMETER - one or more of the supplied
-**                                                parameters could not be
-**                                                interpreted properly
-**                  Other errors
-**
-*******************************************************************************/
-NFCSTATUS phDnldNfc_CmdHandler(void* pContext, phDnldNfc_Event_t TrigEvent) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if (NULL == pDlCtxt) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameter!!");
-    status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    switch (TrigEvent) {
-      case phDnldNfc_EventReset:
-      case phDnldNfc_EventGetVer:
-      case phDnldNfc_EventIntegChk:
-      case phDnldNfc_EventGetSesnSt:
-      case phDnldNfc_EventRaw: {
-        if (phDnldNfc_EventInvalid == (pDlCtxt->tCurrEvent)) {
-          NXPLOG_FWDNLD_D("Processing Normal Sequence..");
-          pDlCtxt->tCurrEvent = TrigEvent;
-          pDlCtxt->tDnldInProgress = phDnldNfc_TransitionBusy;
-
-          phDnldNfc_ProcessSeqState(pDlCtxt, NULL);
-
-          status = pDlCtxt->wCmdSendStatus;
-        } else {
-          NXPLOG_FWDNLD_E("Prev Norml Sequence not completed/restored!!");
-          status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-        }
-        break;
-      }
-      case phDnldNfc_EventWrite:
-      case phDnldNfc_EventRead:
-      case phDnldNfc_EventLog:
-      case phDnldNfc_EventForce: {
-        if (phDnldNfc_EventInvalid == (pDlCtxt->tCurrEvent)) {
-          NXPLOG_FWDNLD_D("Processing R/W Sequence..");
-          pDlCtxt->tCurrEvent = TrigEvent;
-          pDlCtxt->tDnldInProgress = phDnldNfc_TransitionBusy;
-
-          phDnldNfc_ProcessRWSeqState(pDlCtxt, NULL);
-
-          status = pDlCtxt->wCmdSendStatus;
-        } else {
-          NXPLOG_FWDNLD_E("Prev R/W Sequence not completed/restored!!");
-          status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-        }
-        break;
-      }
-      default: {
-        /* Unknown Event */
-        NXPLOG_FWDNLD_E("Unknown Event Parameter!!");
-        status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-        break;
-      }
-    }
-  }
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ProcessSeqState
-**
-** Description      Processes all cmd/resp sequences except read & write
-**
-** Parameters       pContext - pointer to the download context structure
-**                  pInfo - pointer to the Transaction buffer updated by TML
-**                          Thread
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phDnldNfc_ProcessSeqState(void* pContext,
-                                      phTmlNfc_TransactInfo_t* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  NFCSTATUS wIntStatus;
-  uint32_t TimerId;
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if (NULL == pDlCtxt) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameter!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    switch (pDlCtxt->tCurrState) {
-      case phDnldNfc_StateInit: {
-        NXPLOG_FWDNLD_D("Initializing Sequence..");
-
-        if (0 == (pDlCtxt->TimerInfo.dwRspTimerId)) {
-          TimerId = phOsalNfc_Timer_Create();
-
-          if (0 == TimerId) {
-            NXPLOG_FWDNLD_W("Response Timer Create failed!!");
-            wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
-            pDlCtxt->wCmdSendStatus = wStatus;
-            break;
-          } else {
-            NXPLOG_FWDNLD_D("Response Timer Created Successfully");
-            (pDlCtxt->TimerInfo.dwRspTimerId) = TimerId;
-            (pDlCtxt->TimerInfo.TimerStatus) = 0;
-            (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-          }
-        }
-        pDlCtxt->tCurrState = phDnldNfc_StateSend;
-      }
-      case phDnldNfc_StateSend: {
-        wStatus = phDnldNfc_BuildFramePkt(pDlCtxt);
-
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          pDlCtxt->tCurrState = phDnldNfc_StateRecv;
-
-          wStatus = phTmlNfc_Write(
-              (pDlCtxt->tCmdRspFrameInfo.aFrameBuff),
-              (uint16_t)(pDlCtxt->tCmdRspFrameInfo.dwSendlength),
-              (pphTmlNfc_TransactCompletionCb_t)&phDnldNfc_ProcessSeqState,
-              pDlCtxt);
-        }
-        pDlCtxt->wCmdSendStatus = wStatus;
-        break;
-      }
-      case phDnldNfc_StateRecv: {
-        wStatus = phDnldNfc_ProcessRecvInfo(pContext, pInfo);
-
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          wStatus = phOsalNfc_Timer_Start((pDlCtxt->TimerInfo.dwRspTimerId),
-                                          PHDNLDNFC_RSP_TIMEOUT,
-                                          &phDnldNfc_RspTimeOutCb, pDlCtxt);
-
-          if (NFCSTATUS_SUCCESS == wStatus) {
-            NXPLOG_FWDNLD_D("Response timer started");
-            pDlCtxt->TimerInfo.TimerStatus = 1;
-            pDlCtxt->tCurrState = phDnldNfc_StateTimer;
-          } else {
-            NXPLOG_FWDNLD_W("Response timer not started");
-            pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-          }
-          /* Call TML_Read function and register the call back function */
-          wStatus = phTmlNfc_Read(
-              pDlCtxt->tCmdRspFrameInfo.aFrameBuff,
-              (uint16_t)PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE,
-              (pphTmlNfc_TransactCompletionCb_t)&phDnldNfc_ProcessSeqState,
-              (void*)pDlCtxt);
-
-          /* set read status to pDlCtxt->wCmdSendStatus to enable callback */
-          pDlCtxt->wCmdSendStatus = wStatus;
-          break;
-        } else {
-          /* Setting TimerExpStatus below to avoid frame processing in response
-           * state */
-          (pDlCtxt->TimerInfo.wTimerExpStatus) = NFCSTATUS_RF_TIMEOUT;
-          pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-        }
-      }
-      case phDnldNfc_StateTimer: {
-        if (1 == (pDlCtxt->TimerInfo.TimerStatus)) /*Is Timer Running*/
-        {
-          /*Stop Timer*/
-          (void)phOsalNfc_Timer_Stop(pDlCtxt->TimerInfo.dwRspTimerId);
-          (pDlCtxt->TimerInfo.TimerStatus) = 0; /*timer stopped*/
-        }
-        pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-      }
-      case phDnldNfc_StateResponse: {
-        if (NFCSTATUS_RF_TIMEOUT != (pDlCtxt->TimerInfo.wTimerExpStatus)) {
-          /* Process response */
-          wStatus = phDnldNfc_ProcessFrame(pContext, pInfo);
-        } else {
-          if (phDnldNfc_EventReset != pDlCtxt->tCurrEvent) {
-            wStatus = (pDlCtxt->TimerInfo.wTimerExpStatus);
-          } else {
-            wStatus = NFCSTATUS_SUCCESS;
-          }
-          (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-        }
-
-        /* Abort TML read operation which is always kept open */
-        wIntStatus = phTmlNfc_ReadAbort();
-
-        if (NFCSTATUS_SUCCESS != wIntStatus) {
-          /* TODO:-Action to take in this case:-Tml read abort failed!? */
-          NXPLOG_FWDNLD_W("Tml Read Abort failed!!");
-        }
-
-        pDlCtxt->tCurrEvent = phDnldNfc_EventInvalid;
-        pDlCtxt->tDnldInProgress = phDnldNfc_TransitionIdle;
-        pDlCtxt->tCurrState = phDnldNfc_StateInit;
-
-        /* Delete the timer & reset timer primitives in context */
-        (void)phOsalNfc_Timer_Delete(pDlCtxt->TimerInfo.dwRspTimerId);
-        (pDlCtxt->TimerInfo.dwRspTimerId) = 0;
-        (pDlCtxt->TimerInfo.TimerStatus) = 0;
-        (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-
-        if ((NULL != (pDlCtxt->UserCb)) && (NULL != (pDlCtxt->UserCtxt))) {
-          pDlCtxt->UserCb((pDlCtxt->UserCtxt), wStatus,
-                          &(pDlCtxt->tRspBuffInfo));
-        }
-        break;
-      }
-      default: {
-        pDlCtxt->tCurrEvent = phDnldNfc_EventInvalid;
-        pDlCtxt->tDnldInProgress = phDnldNfc_TransitionIdle;
-        break;
-      }
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ProcessRWSeqState
-**
-** Description      Processes read/write cmd/rsp sequence
-**
-** Parameters       pContext - pointer to the download context structure
-**                  pInfo - pointer to the Transaction buffer updated by TML
-**                             Thread
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phDnldNfc_ProcessRWSeqState(void* pContext,
-                                        phTmlNfc_TransactInfo_t* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  NFCSTATUS wIntStatus = wStatus;
-  uint32_t TimerId;
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if (NULL == pDlCtxt) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameter!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    switch (pDlCtxt->tCurrState) {
-      case phDnldNfc_StateInit: {
-        if (0 == (pDlCtxt->TimerInfo.dwRspTimerId)) {
-          TimerId = phOsalNfc_Timer_Create();
-
-          if (0 == TimerId) {
-            NXPLOG_FWDNLD_E("Response Timer Create failed!!");
-            wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
-          } else {
-            NXPLOG_FWDNLD_D("Response Timer Created Successfully");
-            (pDlCtxt->TimerInfo.dwRspTimerId) = TimerId;
-            (pDlCtxt->TimerInfo.TimerStatus) = 0;
-            (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-          }
-        }
-        pDlCtxt->tCurrState = phDnldNfc_StateSend;
-      }
-      case phDnldNfc_StateSend: {
-        if (pDlCtxt->bResendLastFrame == false) {
-          wStatus = phDnldNfc_BuildFramePkt(pDlCtxt);
-        } else {
-          pDlCtxt->bResendLastFrame = false;
-        }
-
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          pDlCtxt->tCurrState = phDnldNfc_StateRecv;
-
-          wStatus = phTmlNfc_Write(
-              (pDlCtxt->tCmdRspFrameInfo.aFrameBuff),
-              (uint16_t)(pDlCtxt->tCmdRspFrameInfo.dwSendlength),
-              (pphTmlNfc_TransactCompletionCb_t)&phDnldNfc_ProcessRWSeqState,
-              pDlCtxt);
-        }
-        pDlCtxt->wCmdSendStatus = wStatus;
-        break;
-      }
-      case phDnldNfc_StateRecv: {
-        wStatus = phDnldNfc_ProcessRecvInfo(pContext, pInfo);
-
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          /* processing For Pipelined write before calling timer below */
-          wStatus = phOsalNfc_Timer_Start((pDlCtxt->TimerInfo.dwRspTimerId),
-                                          PHDNLDNFC_RSP_TIMEOUT,
-                                          &phDnldNfc_RspTimeOutCb, pDlCtxt);
-
-          if (NFCSTATUS_SUCCESS == wStatus) {
-            NXPLOG_FWDNLD_D("Response timer started");
-            pDlCtxt->TimerInfo.TimerStatus = 1;
-            pDlCtxt->tCurrState = phDnldNfc_StateTimer;
-          } else {
-            NXPLOG_FWDNLD_W("Response timer not started");
-            pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-            /* Todo:- diagnostic in this case */
-          }
-          /* Call TML_Read function and register the call back function */
-          wStatus = phTmlNfc_Read(
-              pDlCtxt->tCmdRspFrameInfo.aFrameBuff,
-              (uint16_t)PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE,
-              (pphTmlNfc_TransactCompletionCb_t)&phDnldNfc_ProcessRWSeqState,
-              (void*)pDlCtxt);
-
-          /* set read status to pDlCtxt->wCmdSendStatus to enable callback */
-          pDlCtxt->wCmdSendStatus = wStatus;
-          break;
-        } else {
-          /* Setting TimerExpStatus below to avoid frame processing in reponse
-           * state */
-          (pDlCtxt->TimerInfo.wTimerExpStatus) = NFCSTATUS_RF_TIMEOUT;
-          pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-        }
-      }
-      case phDnldNfc_StateTimer: {
-        if (1 == (pDlCtxt->TimerInfo.TimerStatus)) /*Is Timer Running*/
-        {
-          /* Stop Timer */
-          (void)phOsalNfc_Timer_Stop(pDlCtxt->TimerInfo.dwRspTimerId);
-          (pDlCtxt->TimerInfo.TimerStatus) = 0; /*timer stopped*/
-        }
-        pDlCtxt->tCurrState = phDnldNfc_StateResponse;
-      }
-      case phDnldNfc_StateResponse: {
-        if (NFCSTATUS_RF_TIMEOUT != (pDlCtxt->TimerInfo.wTimerExpStatus)) {
-          /* Process response */
-          wStatus = phDnldNfc_ProcessFrame(pContext, pInfo);
-
-          if (NFCSTATUS_BUSY == wStatus) {
-            /* store the status for use in subsequent processing */
-            wIntStatus = wStatus;
-
-            /* setup the resend wait timer */
-            wStatus = phDnldNfc_SetupResendTimer(pDlCtxt);
-
-            if (NFCSTATUS_SUCCESS == wStatus) {
-              /* restore the last mem_bsy status to avoid re-building frame
-               * below */
-              wStatus = wIntStatus;
-            }
-          }
-        } else {
-          wStatus = (pDlCtxt->TimerInfo.wTimerExpStatus);
-          (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-        }
-
-        if ((0 != (pDlCtxt->tRWInfo.wRemBytes)) &&
-            (NFCSTATUS_SUCCESS == wStatus)) {
-          /* Abort TML read operation which is always kept open */
-          wIntStatus = phTmlNfc_ReadAbort();
-
-          if (NFCSTATUS_SUCCESS != wIntStatus) {
-            NXPLOG_FWDNLD_W("Tml read abort failed!");
-          }
-
-          wStatus = phDnldNfc_BuildFramePkt(pDlCtxt);
-
-          if (NFCSTATUS_SUCCESS == wStatus) {
-            pDlCtxt->tCurrState = phDnldNfc_StateRecv;
-            wStatus = phTmlNfc_Write(
-                (pDlCtxt->tCmdRspFrameInfo.aFrameBuff),
-                (uint16_t)(pDlCtxt->tCmdRspFrameInfo.dwSendlength),
-                (pphTmlNfc_TransactCompletionCb_t)&phDnldNfc_ProcessRWSeqState,
-                pDlCtxt);
-
-            /* TODO:- Verify here if TML_Write returned NFC_PENDING status &
-               take appropriate
-                  action otherwise ?? */
-          }
-        } else if (NFCSTATUS_BUSY == wStatus) {
-          /* No processing to be done,since resend wait timer should have
-           * already been started */
-        } else {
-          (pDlCtxt->tRWInfo.bFramesSegmented) = false;
-          /* Abort TML read operation which is always kept open */
-          wIntStatus = phTmlNfc_ReadAbort();
-
-          if (NFCSTATUS_SUCCESS != wIntStatus) {
-            NXPLOG_FWDNLD_W("Tml read abort failed!");
-          }
-
-          pDlCtxt->tCurrEvent = phDnldNfc_EventInvalid;
-          pDlCtxt->tDnldInProgress = phDnldNfc_TransitionIdle;
-          pDlCtxt->tCurrState = phDnldNfc_StateInit;
-          pDlCtxt->bResendLastFrame = false;
-
-          /* Delete the timer & reset timer primitives in context */
-          (void)phOsalNfc_Timer_Delete(pDlCtxt->TimerInfo.dwRspTimerId);
-          (pDlCtxt->TimerInfo.dwRspTimerId) = 0;
-          (pDlCtxt->TimerInfo.TimerStatus) = 0;
-          (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-
-          if ((NULL != (pDlCtxt->UserCb)) && (NULL != (pDlCtxt->UserCtxt))) {
-            pDlCtxt->UserCb((pDlCtxt->UserCtxt), wStatus,
-                            &(pDlCtxt->tRspBuffInfo));
-          }
-        }
-        break;
-      }
-      default: {
-        pDlCtxt->tCurrEvent = phDnldNfc_EventInvalid;
-        pDlCtxt->tDnldInProgress = phDnldNfc_TransitionIdle;
-        break;
-      }
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_BuildFramePkt
-**
-** Description      Forms the frame packet
-**
-** Parameters       pDlContext - pointer to the download context structure
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_BuildFramePkt(pphDnldNfc_DlContext_t pDlContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint16_t wFrameLen = 0;
-  uint16_t wCrcVal;
-  uint8_t* pFrameByte;
-
-  if (NULL == pDlContext) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameter!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (phDnldNfc_FTWrite == (pDlContext->FrameInp.Type)) {
-      if ((0 == (pDlContext->tUserData.wLen)) ||
-          (NULL == (pDlContext->tUserData.pBuff))) {
-        NXPLOG_FWDNLD_E("Invalid Input Parameter(s) for Write!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      } else {
-        if ((pDlContext->tRWInfo.bFirstWrReq) == true) {
-          (pDlContext->tRWInfo.wRemBytes) = (pDlContext->tUserData.wLen);
-          (pDlContext->tRWInfo.wOffset) = 0;
-        }
-      }
-    } else if (phDnldNfc_FTRead == (pDlContext->FrameInp.Type)) {
-      if ((0 == (pDlContext->tRspBuffInfo.wLen)) ||
-          (NULL == (pDlContext->tRspBuffInfo.pBuff))) {
-        NXPLOG_FWDNLD_E("Invalid Input Parameter(s) for Read!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      } else {
-        if ((pDlContext->tRWInfo.bFramesSegmented) == false) {
-          NXPLOG_FWDNLD_D("Verifying RspBuffInfo for Read Request..");
-          wFrameLen = (pDlContext->tRspBuffInfo.wLen) + PHDNLDNFC_MIN_PLD_LEN;
-
-          (pDlContext->tRWInfo.wRWPldSize) =
-              (PHDNLDNFC_CMDRESP_MAX_PLD_SIZE - PHDNLDNFC_MIN_PLD_LEN);
-          (pDlContext->tRWInfo.wRemBytes) = (pDlContext->tRspBuffInfo.wLen);
-          (pDlContext->tRWInfo.dwAddr) = (pDlContext->FrameInp.dwAddr);
-          (pDlContext->tRWInfo.wOffset) = 0;
-          (pDlContext->tRWInfo.wBytesRead) = 0;
-
-          if (PHDNLDNFC_CMDRESP_MAX_PLD_SIZE < wFrameLen) {
-            (pDlContext->tRWInfo.bFramesSegmented) = true;
-          }
-        }
-      }
-    } else if (phDnldNfc_FTLog == (pDlContext->FrameInp.Type)) {
-      if ((0 == (pDlContext->tUserData.wLen)) ||
-          (NULL == (pDlContext->tUserData.pBuff))) {
-        NXPLOG_FWDNLD_E("Invalid Input Parameter(s) for Log!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      }
-    } else {
-    }
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      wStatus = phDnldNfc_CreateFramePld(pDlContext);
-    }
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      wFrameLen = 0;
-      wFrameLen = (pDlContext->tCmdRspFrameInfo.dwSendlength);
-
-      if (phDnldNfc_FTRaw != (pDlContext->FrameInp.Type)) {
-        if (phDnldNfc_FTWrite != (pDlContext->FrameInp.Type)) {
-          pFrameByte = (uint8_t*)&wFrameLen;
-
-          pDlContext->tCmdRspFrameInfo.aFrameBuff[PHDNLDNFC_FRAME_HDR_OFFSET] =
-              pFrameByte[1];
-          pDlContext->tCmdRspFrameInfo
-              .aFrameBuff[PHDNLDNFC_FRAME_HDR_OFFSET + 1] = pFrameByte[0];
-
-          NXPLOG_FWDNLD_D("Inserting FrameId ..");
-          pDlContext->tCmdRspFrameInfo.aFrameBuff[PHDNLDNFC_FRAMEID_OFFSET] =
-              (pDlContext->tCmdId);
-
-          wFrameLen += PHDNLDNFC_FRAME_HDR_LEN;
-        } else {
-          if (0 != (pDlContext->tRWInfo.wRWPldSize)) {
-            if ((pDlContext->tRWInfo.bFramesSegmented) == true) {
-              /* Turning ON the Fragmentation bit in FrameLen */
-              wFrameLen = PHDNLDNFC_SET_HDR_FRAGBIT(wFrameLen);
-            }
-
-            pFrameByte = (uint8_t*)&wFrameLen;
-
-            pDlContext->tCmdRspFrameInfo
-                .aFrameBuff[PHDNLDNFC_FRAME_HDR_OFFSET] = pFrameByte[1];
-            pDlContext->tCmdRspFrameInfo
-                .aFrameBuff[PHDNLDNFC_FRAME_HDR_OFFSET + 1] = pFrameByte[0];
-
-            /* To ensure we have no frag bit set for crc calculation */
-            wFrameLen = PHDNLDNFC_CLR_HDR_FRAGBIT(wFrameLen);
-
-            wFrameLen += PHDNLDNFC_FRAME_HDR_LEN;
-          }
-        }
-        if (wFrameLen > PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE) {
-          NXPLOG_FWDNLD_D("wFrameLen exceeds the limit");
-          return NFCSTATUS_FAILED;
-        }
-        /* calculate CRC16 */
-        wCrcVal = phDnldNfc_CalcCrc16((pDlContext->tCmdRspFrameInfo.aFrameBuff),
-                                      wFrameLen);
-
-        pFrameByte = (uint8_t*)&wCrcVal;
-
-        /* Insert the computed Crc value */
-        pDlContext->tCmdRspFrameInfo.aFrameBuff[wFrameLen] = pFrameByte[1];
-        pDlContext->tCmdRspFrameInfo.aFrameBuff[wFrameLen + 1] = pFrameByte[0];
-
-        wFrameLen += PHDNLDNFC_FRAME_CRC_LEN;
-      }
-
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) = wFrameLen;
-      NXPLOG_FWDNLD_D("Frame created successfully");
-    } else {
-      NXPLOG_FWDNLD_E("Frame creation failed!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_CreateFramePld
-**
-** Description      Forms the frame payload
-**
-** Parameters       pDlContext - pointer to the download context structure
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_CreateFramePld(pphDnldNfc_DlContext_t pDlContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint16_t wBuffIdx = 0;
-  uint16_t wChkIntgVal = 0;
-  uint16_t wFrameLen = 0;
-
-  if (NULL == pDlContext) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameter!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    memset((pDlContext->tCmdRspFrameInfo.aFrameBuff), 0,
-           PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE);
-    (pDlContext->tCmdRspFrameInfo.dwSendlength) = 0;
-
-    if (phDnldNfc_FTNone == (pDlContext->FrameInp.Type)) {
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) += PHDNLDNFC_MIN_PLD_LEN;
-    } else if (phDnldNfc_ChkIntg == (pDlContext->FrameInp.Type)) {
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) += PHDNLDNFC_MIN_PLD_LEN;
-
-      wChkIntgVal = PHDNLDNFC_USERDATA_EEPROM_OFFSET;
-      memcpy(&(pDlContext->tCmdRspFrameInfo
-                   .aFrameBuff[PHDNLDNFC_FRAME_RDDATA_OFFSET]),
-             &wChkIntgVal, sizeof(wChkIntgVal));
-
-      wChkIntgVal = PHDNLDNFC_USERDATA_EEPROM_LEN;
-      memcpy(&(pDlContext->tCmdRspFrameInfo
-                   .aFrameBuff[PHDNLDNFC_FRAME_RDDATA_OFFSET +
-                               PHDNLDNFC_USERDATA_EEPROM_OFFSIZE]),
-             &wChkIntgVal, sizeof(wChkIntgVal));
-
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-          PHDNLDNFC_USERDATA_EEPROM_LENSIZE;
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-          PHDNLDNFC_USERDATA_EEPROM_OFFSIZE;
-    } else if (phDnldNfc_FTWrite == (pDlContext->FrameInp.Type)) {
-      wBuffIdx = (pDlContext->tRWInfo.wOffset);
-
-      if ((pDlContext->tRWInfo.bFramesSegmented) == false) {
-        wFrameLen = (pDlContext->tUserData.pBuff[wBuffIdx]);
-        wFrameLen <<= 8;
-        wFrameLen |= (pDlContext->tUserData.pBuff[wBuffIdx + 1]);
-
-        (pDlContext->tRWInfo.wRWPldSize) = wFrameLen;
-      }
-
-      if ((pDlContext->tRWInfo.wRWPldSize) > PHDNLDNFC_CMDRESP_MAX_PLD_SIZE) {
-        if ((pDlContext->tRWInfo.bFirstChunkResp) == false) {
-          (pDlContext->tRWInfo.wRemChunkBytes) = wFrameLen;
-          (pDlContext->tRWInfo.wOffset) += PHDNLDNFC_FRAME_HDR_LEN;
-          wBuffIdx = (pDlContext->tRWInfo.wOffset);
-        }
-
-        if (PHDNLDNFC_CMDRESP_MAX_PLD_SIZE <
-            (pDlContext->tRWInfo.wRemChunkBytes)) {
-          (pDlContext->tRWInfo.wBytesToSendRecv) =
-              PHDNLDNFC_CMDRESP_MAX_PLD_SIZE;
-          (pDlContext->tRWInfo.bFramesSegmented) = true;
-        } else {
-          (pDlContext->tRWInfo.wBytesToSendRecv) =
-              (pDlContext->tRWInfo.wRemChunkBytes);
-          (pDlContext->tRWInfo.bFramesSegmented) = false;
-        }
-
-        memcpy(&(pDlContext->tCmdRspFrameInfo
-                     .aFrameBuff[PHDNLDNFC_FRAMEID_OFFSET]),
-               &(pDlContext->tUserData.pBuff[wBuffIdx]),
-               (pDlContext->tRWInfo.wBytesToSendRecv));
-      } else {
-        (pDlContext->tRWInfo.wRWPldSize) = 0;
-        (pDlContext->tRWInfo.wBytesToSendRecv) =
-            (wFrameLen + PHDNLDNFC_FRAME_HDR_LEN);
-
-        memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[0]),
-               &(pDlContext->tUserData.pBuff[wBuffIdx]),
-               (pDlContext->tRWInfo.wBytesToSendRecv));
-      }
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-          (pDlContext->tRWInfo.wBytesToSendRecv);
-    } else if (phDnldNfc_FTRead == (pDlContext->FrameInp.Type)) {
-      (pDlContext->tRWInfo.wBytesToSendRecv) =
-          ((pDlContext->tRWInfo.wRemBytes) > (pDlContext->tRWInfo.wRWPldSize))
-              ? (pDlContext->tRWInfo.wRWPldSize)
-              : (pDlContext->tRWInfo.wRemBytes);
-
-      wBuffIdx = (PHDNLDNFC_PLD_OFFSET +
-                  ((sizeof(pDlContext->tRWInfo.wBytesToSendRecv)) %
-                   PHDNLDNFC_MIN_PLD_LEN) -
-                  1);
-
-      memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[wBuffIdx]),
-             &(pDlContext->tRWInfo.wBytesToSendRecv),
-             (sizeof(pDlContext->tRWInfo.wBytesToSendRecv)));
-
-      wBuffIdx += sizeof(pDlContext->tRWInfo.wBytesToSendRecv);
-
-      memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[wBuffIdx]),
-             &(pDlContext->tRWInfo.dwAddr), sizeof(pDlContext->tRWInfo.dwAddr));
-
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-          (PHDNLDNFC_MIN_PLD_LEN + (sizeof(pDlContext->tRWInfo.dwAddr)));
-    } else if (phDnldNfc_FTLog == (pDlContext->FrameInp.Type)) {
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) += PHDNLDNFC_MIN_PLD_LEN;
-
-      wBuffIdx = (PHDNLDNFC_MIN_PLD_LEN + PHDNLDNFC_FRAME_HDR_LEN);
-
-      memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[wBuffIdx]),
-             (pDlContext->tUserData.pBuff), (pDlContext->tUserData.wLen));
-
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-          (pDlContext->tUserData.wLen);
-    } else if (phDnldNfc_FTForce == (pDlContext->FrameInp.Type)) {
-      (pDlContext->tCmdRspFrameInfo.dwSendlength) += PHDNLDNFC_MIN_PLD_LEN;
-
-      wBuffIdx = PHDNLDNFC_PLD_OFFSET;
-
-      memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[wBuffIdx]),
-             (pDlContext->tUserData.pBuff), (pDlContext->tUserData.wLen));
-    } else if (phDnldNfc_FTRaw == (pDlContext->FrameInp.Type)) {
-      if ((0 == (pDlContext->tUserData.wLen)) ||
-          (NULL == (pDlContext->tUserData.pBuff))) {
-        NXPLOG_FWDNLD_E("Invalid Input Parameter(s) for Raw Request!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-      } else {
-        memcpy(&(pDlContext->tCmdRspFrameInfo.aFrameBuff[wBuffIdx]),
-               (pDlContext->tUserData.pBuff), (pDlContext->tUserData.wLen));
-
-        (pDlContext->tCmdRspFrameInfo.dwSendlength) +=
-            (pDlContext->tUserData.wLen);
-      }
-    } else {
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ProcessFrame
-**
-** Description      Processes response frame received
-**
-** Parameters       pContext - pointer to the download context structure
-**                  pInfo - pointer to the Transaction buffer updated by TML
-**                          Thread
-**
-** Returns          NFCSTATUS_SUCCESS - parameters successfully validated
-**                  NFCSTATUS_INVALID_PARAMETER - invalid parameters
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_ProcessFrame(void* pContext,
-                                        phTmlNfc_TransactInfo_t* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint16_t wCrcVal, wRecvdCrc, wRecvdLen, wPldLen;
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if ((NULL == pDlCtxt) || (NULL == pInfo)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if ((PH_DL_STATUS_OK != pInfo->wStatus) || (0 == pInfo->wLength) ||
-        (NULL == pInfo->pBuff)) {
-      NXPLOG_FWDNLD_E("Dnld Cmd Request Failed!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-    } else {
-      if (phDnldNfc_FTRaw == (pDlCtxt->FrameInp.Type)) {
-        if ((0 != (pDlCtxt->tRspBuffInfo.wLen)) &&
-            (NULL != (pDlCtxt->tRspBuffInfo.pBuff))) {
-          memcpy((pDlCtxt->tRspBuffInfo.pBuff), (pInfo->pBuff),
-                 (pInfo->wLength));
-
-          (pDlCtxt->tRspBuffInfo.wLen) = (pInfo->wLength);
-        } else {
-          NXPLOG_FWDNLD_E("Cannot update Response buff with received data!!");
-        }
-      } else {
-        /* calculate CRC16 */
-        wCrcVal = phDnldNfc_CalcCrc16(
-            (pInfo->pBuff), ((pInfo->wLength) - PHDNLDNFC_FRAME_CRC_LEN));
-
-        wRecvdCrc = 0;
-        wRecvdCrc = (((uint16_t)(pInfo->pBuff[(pInfo->wLength) - 2]) << 8U) |
-                     (pInfo->pBuff[(pInfo->wLength) - 1]));
-
-        if (wRecvdCrc == wCrcVal) {
-          wRecvdLen =
-              (((uint16_t)(pInfo->pBuff[PHDNLDNFC_FRAME_HDR_OFFSET]) << 8U) |
-               (pInfo->pBuff[PHDNLDNFC_FRAME_HDR_OFFSET + 1]));
-
-          wPldLen = ((pInfo->wLength) -
-                     (PHDNLDNFC_FRAME_HDR_LEN + PHDNLDNFC_FRAME_CRC_LEN));
-
-          if (wRecvdLen != wPldLen) {
-            NXPLOG_FWDNLD_E("Invalid frame payload length received");
-            wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-          } else {
-            wStatus = phDnldNfc_UpdateRsp(pDlCtxt, pInfo, (wPldLen - 1));
-          }
-        } else {
-          NXPLOG_FWDNLD_E("Invalid frame received");
-          wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-        }
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ProcessRecvInfo
-**
-** Description      Processes the response during the state phDnldNfc_StateRecv
-**
-** Parameters       pContext - pointer to the download context structure
-**                  pInfo - pointer to the Transaction buffer updated by TML
-**                          Thread
-**
-** Returns          NFCSTATUS_SUCCESS - parameters successfully validated
-**                  NFCSTATUS_INVALID_PARAMETER - invalid parameters
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_ProcessRecvInfo(void* pContext,
-                                           phTmlNfc_TransactInfo_t* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if (NULL != pContext) {
-    if (NULL == pInfo) {
-      NXPLOG_FWDNLD_E("Invalid pInfo received from TML!!");
-      wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-    } else {
-      wStatus = PHNFCSTATUS(pInfo->wStatus);
-
-      if (NFCSTATUS_SUCCESS == wStatus) {
-        NXPLOG_FWDNLD_D("Send Success");
-      } else {
-        NXPLOG_FWDNLD_E("Tml Write error!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-      }
-    }
-  } else {
-    NXPLOG_FWDNLD_E("Invalid context received from TML!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_SetupResendTimer
-**
-** Description      Sets up the timer for resending the previous write frame
-**
-** Parameters       pDlContext - pointer to the download context structure
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_SetupResendTimer(pphDnldNfc_DlContext_t pDlContext) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  wStatus = phOsalNfc_Timer_Start((pDlContext->TimerInfo.dwRspTimerId),
-                                  PHDNLDNFC_RETRY_FRAME_WRITE,
-                                  &phDnldNfc_ResendTimeOutCb, pDlContext);
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    NXPLOG_FWDNLD_D("Frame Resend wait timer started");
-    (pDlContext->TimerInfo.TimerStatus) = 1;
-    pDlContext->tCurrState = phDnldNfc_StateTimer;
-  } else {
-    NXPLOG_FWDNLD_W("Frame Resend wait timer not started");
-    (pDlContext->TimerInfo.TimerStatus) = 0; /*timer stopped*/
-    pDlContext->tCurrState = phDnldNfc_StateResponse;
-    /* Todo:- diagnostic in this case */
-  }
-
-  return wStatus;
-}
-
-#if !defined(PH_LIBNFC_VEN_RESET_ON_DOWNLOAD_TIMEOUT)
-#error PH_LIBNFC_VEN_RESET_ON_DOWNLOAD_TIMEOUT has to be defined
-#endif
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_RspTimeOutCb
-**
-** Description      Callback function in case of timer expiration
-**
-** Parameters       TimerId  - expired timer id
-**                  pContext - pointer to the download context structure
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phDnldNfc_RspTimeOutCb(uint32_t TimerId, void* pContext) {
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if (NULL != pDlCtxt) {
-    UNUSED(TimerId);
-
-    if (1 == pDlCtxt->TimerInfo.TimerStatus) {
-      /* No response received and the timer expired */
-      pDlCtxt->TimerInfo.TimerStatus = 0; /* Reset timer status flag */
-
-      NXPLOG_FWDNLD_D("%x", pDlCtxt->tLastStatus);
-
-#if (PH_LIBNFC_VEN_RESET_ON_DOWNLOAD_TIMEOUT == TRUE)
-      if (PH_DL_STATUS_SIGNATURE_ERROR == pDlCtxt->tLastStatus) {
-        /* Do a VEN Reset of the chip. */
-        NXPLOG_FWDNLD_E("Performing a VEN Reset");
-        phTmlNfc_IoCtl(phTmlNfc_e_EnableNormalMode);
-        phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
-        NXPLOG_FWDNLD_E("VEN Reset Done");
-      }
-#endif
-
-      (pDlCtxt->TimerInfo.wTimerExpStatus) = NFCSTATUS_RF_TIMEOUT;
-
-      if ((phDnldNfc_EventRead == pDlCtxt->tCurrEvent) ||
-          (phDnldNfc_EventWrite == pDlCtxt->tCurrEvent)) {
-        phDnldNfc_ProcessRWSeqState(pDlCtxt, NULL);
-      } else {
-        phDnldNfc_ProcessSeqState(pDlCtxt, NULL);
-      }
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_ResendTimeOutCb
-**
-** Description      Callback function in case of Frame Resend Wait timer
-**                  expiration
-**
-** Parameters       TimerId  - expired timer id
-**                  pContext - pointer to the download context structure
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phDnldNfc_ResendTimeOutCb(uint32_t TimerId, void* pContext) {
-  pphDnldNfc_DlContext_t pDlCtxt = (pphDnldNfc_DlContext_t)pContext;
-
-  if (NULL != pDlCtxt) {
-    UNUSED(TimerId);
-
-    if (1 == pDlCtxt->TimerInfo.TimerStatus) {
-      /* No response received and the timer expired */
-      pDlCtxt->TimerInfo.TimerStatus = 0; /* Reset timer status flag */
-
-      (pDlCtxt->TimerInfo.wTimerExpStatus) = 0;
-
-      pDlCtxt->tCurrState = phDnldNfc_StateSend;
-
-      /* set the flag to trigger last frame re-transmission */
-      pDlCtxt->bResendLastFrame = true;
-
-      phDnldNfc_ProcessRWSeqState(pDlCtxt, NULL);
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_UpdateRsp
-**
-** Description      verifies the payload status byte and copies data
-**                  to response buffer if successful
-**
-** Parameters       pDlContext - pointer to the download context structure
-**                  pInfo - pointer to the Transaction buffer updated by TML
-**                          Thread
-**                  wPldLen - Length of the payload bytes to copy to response
-**                            buffer
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-static NFCSTATUS phDnldNfc_UpdateRsp(pphDnldNfc_DlContext_t pDlContext,
-                                     phTmlNfc_TransactInfo_t* pInfo,
-                                     uint16_t wPldLen) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint16_t wReadLen = 0;
-
-  if ((NULL == pDlContext) || (NULL == pInfo)) {
-    NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
-    wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    if (PH_DL_CMD_WRITE == (pDlContext->tCmdId)) {
-      if (PH_DL_STATUS_OK == (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        /* first write frame response received case */
-        if ((pDlContext->tRWInfo.bFirstWrReq) == true) {
-          NXPLOG_FWDNLD_D("First Write Frame Success Status received!!");
-          (pDlContext->tRWInfo.bFirstWrReq) = false;
-        }
-
-        if ((pDlContext->tRWInfo.bFirstChunkResp) == true) {
-          if ((pDlContext->tRWInfo.bFramesSegmented) == false) {
-            NXPLOG_FWDNLD_D("Chunked Write Frame Success Status received!!");
-            (pDlContext->tRWInfo.wRemChunkBytes) -=
-                (pDlContext->tRWInfo.wBytesToSendRecv);
-            (pDlContext->tRWInfo.bFirstChunkResp) = false;
-          } else {
-            NXPLOG_FWDNLD_E("UnExpected Status received!!");
-            wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-          }
-        }
-
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          (pDlContext->tRWInfo.wRemBytes) -=
-              (pDlContext->tRWInfo.wBytesToSendRecv);
-          (pDlContext->tRWInfo.wOffset) +=
-              (pDlContext->tRWInfo.wBytesToSendRecv);
-        }
-      } else if (((pDlContext->tRWInfo.bFirstChunkResp) == false) &&
-                 ((pDlContext->tRWInfo.bFramesSegmented) == true) &&
-                 (PHDNLDNFC_FIRST_FRAGFRAME_RESP ==
-                  (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET]))) {
-        (pDlContext->tRWInfo.bFirstChunkResp) = true;
-        (pDlContext->tRWInfo.wRemChunkBytes) -=
-            (pDlContext->tRWInfo.wBytesToSendRecv);
-        (pDlContext->tRWInfo.wRemBytes) -=
-            ((pDlContext->tRWInfo.wBytesToSendRecv) + PHDNLDNFC_FRAME_HDR_LEN);
-        (pDlContext->tRWInfo.wOffset) += (pDlContext->tRWInfo.wBytesToSendRecv);
-
-        /* first write frame response received case */
-        if ((pDlContext->tRWInfo.bFirstWrReq) == true) {
-          NXPLOG_FWDNLD_D("First Write Frame Success Status received!!");
-          (pDlContext->tRWInfo.bFirstWrReq) = false;
-        }
-      } else if (((pDlContext->tRWInfo.bFirstChunkResp) == true) &&
-                 ((pDlContext->tRWInfo.bFramesSegmented) == true) &&
-                 (PHDNLDNFC_NEXT_FRAGFRAME_RESP ==
-                  (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET]))) {
-        (pDlContext->tRWInfo.wRemChunkBytes) -=
-            (pDlContext->tRWInfo.wBytesToSendRecv);
-        (pDlContext->tRWInfo.wRemBytes) -=
-            (pDlContext->tRWInfo.wBytesToSendRecv);
-        (pDlContext->tRWInfo.wOffset) += (pDlContext->tRWInfo.wBytesToSendRecv);
-      } else if (PH_DL_STATUS_FIRMWARE_VERSION_ERROR ==
-                 (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        NXPLOG_FWDNLD_E(
-            "FW version Error !!!could be either due to FW major version "
-            "mismatch or Firmware Already Up To Date !!");
-        (pDlContext->tRWInfo.bFirstWrReq) = false;
-        /* resetting wRemBytes to 0 to avoid any further write frames send */
-        (pDlContext->tRWInfo.wRemBytes) = 0;
-        (pDlContext->tRWInfo.wOffset) = 0;
-        wStatus = NFCSTATUS_FW_VERSION_ERROR;
-      } else if (PH_DL_STATUS_PLL_ERROR ==
-                 (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        NXPLOG_FWDNLD_E("PLL Error Status received!!");
-        (pDlContext->tLastStatus) = PH_DL_STATUS_PLL_ERROR;
-        wStatus = NFCSTATUS_WRITE_FAILED;
-      } else if (PH_DL_STATUS_SIGNATURE_ERROR ==
-                 (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        NXPLOG_FWDNLD_E("Signature Mismatch Error received!!");
-        /* save the status for use in loading the relevant recovery image
-         * (either signature or platform) */
-        (pDlContext->tLastStatus) = PH_DL_STATUS_SIGNATURE_ERROR;
-        wStatus = NFCSTATUS_REJECTED;
-      } else if (PH_DL_STATUS_MEM_BSY ==
-                 (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        NXPLOG_FWDNLD_E("Mem Busy Status received!!");
-        (pDlContext->tLastStatus) = PH_DL_STATUS_MEM_BSY;
-        wStatus = NFCSTATUS_BUSY;
-      } else {
-        NXPLOG_FWDNLD_E("Unsuccessful Status received!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-      }
-    } else if (PH_DL_CMD_READ == (pDlContext->tCmdId)) {
-      if (PH_DL_STATUS_OK == (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        wReadLen = (((uint16_t)(pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET + 3])
-                     << 8U) |
-                    (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET + 2]));
-
-        if (wReadLen != (pDlContext->tRWInfo.wBytesToSendRecv)) {
-          NXPLOG_FWDNLD_E("Desired Length bytes not received!!");
-          wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-        } else {
-          memcpy(
-              &(pDlContext->tRspBuffInfo.pBuff[(pDlContext->tRWInfo.wOffset)]),
-              &(pInfo->pBuff[PHDNLDNFC_FRAME_RDDATA_OFFSET]), wReadLen);
-
-          (pDlContext->tRWInfo.wBytesRead) += wReadLen;
-
-          (pDlContext->tRspBuffInfo.wLen) = (pDlContext->tRWInfo.wBytesRead);
-
-          (pDlContext->tRWInfo.wRemBytes) -=
-              (pDlContext->tRWInfo.wBytesToSendRecv);
-          (pDlContext->tRWInfo.dwAddr) +=
-              (pDlContext->tRWInfo.wBytesToSendRecv);
-          (pDlContext->tRWInfo.wOffset) +=
-              (pDlContext->tRWInfo.wBytesToSendRecv);
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Unsuccessful Status received!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-      }
-    } else {
-      if (PH_DL_STATUS_OK == (pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET])) {
-        if ((0 != (pDlContext->tRspBuffInfo.wLen)) &&
-            (NULL != (pDlContext->tRspBuffInfo.pBuff))) {
-          memcpy((pDlContext->tRspBuffInfo.pBuff),
-                 &(pInfo->pBuff[PHDNLDNFC_FRAMESTATUS_OFFSET + 1]), wPldLen);
-
-          (pDlContext->tRspBuffInfo.wLen) = wPldLen;
-        }
-      } else {
-        NXPLOG_FWDNLD_E("Unsuccessful Status received!!");
-        wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED);
-      }
-    }
-  }
-
-  return wStatus;
-}
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Internal.h b/halimpl/pn54x/dnld/phDnldNfc_Internal.h
deleted file mode 100644
index 9a9d422..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Internal.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Internal Primitives (Functions + Variables) used for Firmware Download
- */
-#ifndef PHDNLDNFC_INTERNAL_H
-#define PHDNLDNFC_INTERNAL_H
-
-#include <phDnldNfc.h>
-#include <phDnldNfc_Cmd.h>
-#include <phDnldNfc_Status.h>
-
-#define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE                 \
-  (0x100U) /* DL Host Frame Buffer Size for all CMD/RSP \
-                except pipelined WRITE */
-#if (PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE > PHNFC_I2C_FRAGMENT_SIZE)
-#undef PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE
-#define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE (PHNFC_I2C_FRAGMENT_SIZE)
-#endif
-
-/* DL Host Short Frame Buffer Size for pipelined WRITE RSP */
-#define PHDNLDNFC_WRITERSP_BUFF_SIZE (0x08U)
-
-/* DL Host Frame Buffer Header Length */
-#define PHDNLDNFC_FRAME_HDR_LEN (0x02U)
-/* DL Host Frame Buffer CRC Length */
-#define PHDNLDNFC_FRAME_CRC_LEN (PHDNLDNFC_FRAME_HDR_LEN)
-#define PHDNLDNFC_FRAME_ID_LEN (0x01U) /* Length of Cmd Id */
-
-/* size of EEPROM/Flash address */
-#define PHDNLDNFC_EEFL_ADDR_SIZE (0x03U)
-/* 2 Byte size of data */
-#define PHDNLDNFC_DATA_SIZE (PHDNLDNFC_FRAME_HDR_LEN)
-
-/* Start of EEPROM address for log */
-#define PHDNLDNFC_EEPROM_LOG_START_ADDR (0x201F80U)
-/* End of EEPROM address for log */
-#define PHDNLDNFC_EEPROM_LOG_END_ADDR (0x201FBFU)
-
-#define PHDNLDNFC_MAX_LOG_SIZE \
-  ((PHDNLDNFC_EEPROM_LOG_END_ADDR - PHDNLDNFC_EEPROM_LOG_START_ADDR) + 1)
-
-/* DL Max Payload Size */
-#define PHDNLDNFC_CMDRESP_MAX_PLD_SIZE \
-  ((PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE) - \
-   (PHDNLDNFC_FRAME_HDR_LEN + PHDNLDNFC_FRAME_CRC_LEN))
-
-/*
- * Enum definition contains Download Event Types
- */
-typedef enum phDnldNfc_Event {
-  phDnldNfc_EventInvalid = 0x00, /*Invalid Event Value*/
-  phDnldNfc_EventReset,          /* Reset event */
-  phDnldNfc_EventGetVer,         /* Get Version event*/
-  phDnldNfc_EventWrite,          /* Write event*/
-  phDnldNfc_EventRead,           /* Read event*/
-  phDnldNfc_EventIntegChk,       /* Integrity Check event*/
-  phDnldNfc_EventGetSesnSt,      /* Get Session State event*/
-  phDnldNfc_EventLog,            /* Log event*/
-  phDnldNfc_EventForce,          /* Force event*/
-  phDnldNfc_EventRaw, /* Raw Req/Rsp event,used currently for sending NCI RESET
-                         cmd */
-  phDnldNfc_EVENT_INT_MAX /* Max Event Count*/
-} phDnldNfc_Event_t;
-
-/*
- * Enum definition contains Download Handler states for each event requested
- */
-typedef enum phDnldNfc_State {
-  phDnldNfc_StateInit = 0x00, /* Handler init state */
-  phDnldNfc_StateSend,        /* Send frame to NFCC state */
-  phDnldNfc_StateRecv,        /* Recv Send complete State */
-  phDnldNfc_StateTimer, /* State to stop prev set timer on Recv or handle timed
-                           out scenario */
-  phDnldNfc_StateResponse,  /* Process response from NFCC state */
-  phDnldNfc_StatePipelined, /* Write requests to be pipelined state */
-  phDnldNfc_StateInvalid    /* Invalid Handler state */
-} phDnldNfc_State_t;
-
-/*
- * Enum definition contains Download Handler Transition
- */
-typedef enum phDnldNfc_Transition {
-  phDnldNfc_TransitionIdle =
-      0x00, /* Handler in Idle state - No Download in progress */
-  phDnldNfc_TransitionBusy,   /* Handler is busy processing download request */
-  phDnldNfc_TransitionInvalid /* Invalid Handler Transition */
-} phDnldNfc_Transition_t;
-
-/*
- * Enum definition contains the Frame input type for CmdId in process
- */
-typedef enum {
-  phDnldNfc_FTNone = 0, /* input type None */
-  phDnldNfc_ChkIntg, /* user eeprom offset & len to be added for Check Integrity
-                        Request */
-  phDnldNfc_FTWrite, /* Frame inputs for Write request */
-  phDnldNfc_FTLog,   /* Frame inputs for Log request */
-  phDnldNfc_FTForce, /* Frame input for Force cmd request */
-  phDnldNfc_FTRead,  /* Addr input required for read request */
-  phDnldNfc_FTRaw    /* Raw Req/Rsp type */
-} phDnldNfc_FrameInputType_t;
-
-/*
- * Contains Host Frame Buffer information.
- */
-typedef struct phDnldNfc_FrameInfo {
-  uint16_t dwSendlength; /* length of the payload  */
-  uint8_t
-      aFrameBuff[PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE]; /* Buffer to store command
-                                                      that needs to be sent*/
-} phDnldNfc_FrameInfo_t,
-    *pphDnldNfc_FrameInfo_t; /* pointer to #phDnldNfc_FrameInfo_t */
-
-/*
- * Frame Input Type & Value for CmdId in Process
- */
-typedef struct phDnldNfc_FrameInput {
-  phDnldNfc_FrameInputType_t
-      Type;        /* Type of frame input required for current cmd in process */
-  uint32_t dwAddr; /* Address value required for Read/Write Cmd*/
-} phDnldNfc_FrameInput_t,
-    *pphDnldNfc_FrameInput_t; /* pointer to #phDnldNfc_FrameInput_t */
-
-/*
- * Context for the response timeout
- */
-typedef struct phDnldNfc_RspTimerInfo {
-  uint32_t dwRspTimerId;     /* Timer for Core to handle response */
-  uint8_t TimerStatus;       /* 0 = Timer not running 1 = timer running*/
-  NFCSTATUS wTimerExpStatus; /* Holds the status code on timer expiry */
-} phDnldNfc_RspTimerInfo_t;
-
-/*
- * Read/Write Processing Info
- */
-typedef struct phDnldNfc_RWInfo {
-  uint32_t dwAddr;    /* current Addr updated for read/write */
-  uint16_t wOffset;   /* current offset within the user buffer to read/write */
-  uint16_t wRemBytes; /* Remaining bytes to read/write */
-  uint16_t wRemChunkBytes; /* Remaining bytes within the chunked frame */
-  uint16_t wRWPldSize;     /* Size of the read/write payload per transaction */
-  uint16_t wBytesToSendRecv; /* Num of Bytes being written/read currently */
-  uint16_t wBytesRead;       /* Bytes read from read cmd currently */
-  bool_t bFramesSegmented;   /* Flag to indicate if Read/Write frames are
-                                segmented */
-  bool_t bFirstWrReq; /* Flag to indicate if this is the first write frame being
-                         sent */
-  bool_t
-      bFirstChunkResp; /* Flag to indicate if we got the first chunk response */
-} phDnldNfc_RWInfo_t, *pphDnldNfc_RWInfo_t; /* pointer to #phDnldNfc_RWInfo_t */
-
-/*
- * Download context structure
- */
-typedef struct phDnldNfc_DlContext {
-  const uint8_t* nxp_nfc_fw; /* Pointer to firmware version from image */
-  const uint8_t*
-      nxp_nfc_fwp; /* Pointer to firmware version from get_version cmd */
-  uint16_t nxp_nfc_fwp_len; /* Length of firmware image length */
-  uint16_t nxp_nfc_fw_len;  /* Firmware image length */
-  bool_t bResendLastFrame;  /* Flag to resend the last write frame after MEM_BSY
-                               status */
-  phDnldNfc_Transition_t
-      tDnldInProgress; /* Flag to indicate if download request is ongoing */
-  phDnldNfc_Event_t tCurrEvent; /* Current event being processed */
-  phDnldNfc_State_t tCurrState; /* Current state being processed */
-  pphDnldNfc_RspCb_t UserCb;    /* Upper layer call back function */
-  void* UserCtxt;               /* Pointer to upper layer context */
-  phDnldNfc_Buff_t tUserData;   /* Data buffer provided by caller */
-  phDnldNfc_Buff_t
-      tRspBuffInfo; /* Buffer to store payload field of the received response*/
-  phDnldNfc_FrameInfo_t tCmdRspFrameInfo; /* Buffer to hold the cmd/resp frame
-                                             except pipeline write */
-  phDnldNfc_FrameInfo_t
-      tPipeLineWrFrameInfo; /* Buffer to hold the pipelined write frame */
-  NFCSTATUS
-  wCmdSendStatus; /* Holds the status of cmd request made to cmd handler */
-  phDnldNfc_CmdId_t tCmdId; /* Cmd Id of the currently processed cmd */
-  phDnldNfc_FrameInput_t
-      FrameInp; /* input value required for current cmd in process */
-  phDnldNfc_RspTimerInfo_t
-      TimerInfo;              /* Timer context handled into download context*/
-  phDnldNfc_Buff_t tTKey;     /* Defualt Transport Key provided by caller */
-  phDnldNfc_RWInfo_t tRWInfo; /* Read/Write segmented frame info */
-  phDnldNfc_Status_t tLastStatus; /* saved status to distinguish signature or
-                                     pltform recovery */
-} phDnldNfc_DlContext_t,
-    *pphDnldNfc_DlContext_t; /* pointer to #phDnldNfc_DlContext_t structure */
-
-/* The phDnldNfc_CmdHandler function declaration */
-extern NFCSTATUS phDnldNfc_CmdHandler(void* pContext,
-                                      phDnldNfc_Event_t TrigEvent);
-
-#endif /* PHDNLDNFC_INTERNAL_H */
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Status.h b/halimpl/pn54x/dnld/phDnldNfc_Status.h
deleted file mode 100644
index a5b9125..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Status.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Firmware Download Status Values
- */
-#ifndef PHDNLDNFC_STATUS_H
-#define PHDNLDNFC_STATUS_H
-
-#include <phNfcStatus.h>
-
-/* reusing LibNfcStatus.h value below as a placeholder for now, need to find
-   the right value */
-#define NFCSTATUS_ABORTED (0x0096) /* Command aborted */
-
-/*
- * Enum definition contains Firmware Download Status codes
- */
-typedef enum phDnldNfc_Status {
-  PH_DL_STATUS_PLL_ERROR = 0x0D,
-  PH_DL_STATUS_LC_WRONG = 0x13,
-  PH_DL_STATUS_LC_TERMINATION_NOT_SUPPORTED = 0x14,
-  PH_DL_STATUS_LC_CREATION_NOT_SUPPORTED = 0x15,
-  PH_DL_STATUS_LC_UNKNOWN = 0x16,
-  PH_DL_STATUS_AUTHENTICATION_ERROR = 0x19,
-  PH_DL_STATUS_NOT_AUTHENTICATED = 0x1A,
-  PH_DL_STATUS_AUTHENTICATION_LOST = 0x1B,
-  PH_DL_STATUS_WRITE_PROTECTED = 0x1C,
-  PH_DL_STATUS_READ_PROTECTED = 0x1D,
-  PH_DL_STATUS_ADDR_RANGE_OFL_ERROR = 0x1E,
-  PH_DL_STATUS_BUFFER_OFL_ERROR = 0x1F,
-  PH_DL_STATUS_MEM_BSY = 0x20,
-  PH_DL_STATUS_SIGNATURE_ERROR = 0x21,
-  PH_DL_STATUS_SESSION_WAS_OPEN = 0x22,
-  PH_DL_STATUS_SESSION_WAS_CLOSED = 0x23,
-  /* the Firmware version passed to CommitSession is not greater than
-      the EEPROM resident stored Firmware version number */
-  PH_DL_STATUS_FIRMWARE_VERSION_ERROR = 0x24,
-  PH_DL_STATUS_LOOPBACK_DATA_MISSMATCH_ERROR = 0x25,
-  /*****************************/
-  PH_DL_STATUS_HOST_PAYLOAD_UFL_ERROR = 0x26,
-  PH_DL_STATUS_HOST_PAYLOAD_OFL_ERROR = 0x27,
-  PH_DL_STATUS_PROTOCOL_ERROR = 0x28,
-  /* Download codes re-mapped to generic entries */
-  PH_DL_STATUS_INVALID_ADDR = NFCSTATUS_INVALID_PARAMETER,
-  PH_DL_STATUS_GENERIC_ERROR = NFCSTATUS_FAILED,
-  PH_DL_STATUS_ABORTED_CMD = NFCSTATUS_ABORTED,
-  PH_DL_STATUS_FLASH_WRITE_PROTECTED = PH_DL_STATUS_WRITE_PROTECTED,
-  PH_DL_STATUS_FLASH_READ_PROTECTED = PH_DL_STATUS_READ_PROTECTED,
-  PH_DL_STATUS_USERDATA_WRITE_PROTECTED = PH_DL_STATUS_WRITE_PROTECTED,
-  PH_DL_STATUS_USERDATA_READ_PROTECTED = PH_DL_STATUS_READ_PROTECTED,
-  PH_DL_STATUS_OK = NFCSTATUS_SUCCESS
-} phDnldNfc_Status_t;
-
-#endif /* PHDNLDNFC_STATUS_H */
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Utils.c b/halimpl/pn54x/dnld/phDnldNfc_Utils.c
deleted file mode 100644
index 014ca66..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Utils.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Download Component
- * Download Utility routines implementation
- */
-
-#include <phDnldNfc_Utils.h>
-#include <phNxpLog.h>
-
-static uint16_t const aCrcTab[256] = {
-    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,
-    0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,
-    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,
-    0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
-    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,
-    0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,
-    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,
-    0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
-    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,
-    0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,
-    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,
-    0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
-    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,
-    0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,
-    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,
-    0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
-    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,
-    0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,
-    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,
-    0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
-    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,
-    0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,
-    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,
-    0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
-    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,
-    0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,
-    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,
-    0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
-    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};
-
-/*******************************************************************************
-**
-** Function         phDnldNfc_CalcCrc16
-**
-** Description      Calculates CRC16 for the frame buffer
-**
-** Parameters       pBuff - CRC16 calculation input buffer
-**                  wLen  - input buffer length
-**
-** Returns          wCrc  - computed 2 byte CRC16 value
-**
-*******************************************************************************/
-uint16_t phDnldNfc_CalcCrc16(uint8_t* pBuff, uint16_t wLen) {
-  uint16_t wTmp;
-  uint16_t wValue;
-  uint16_t wCrc = 0xffff;
-  uint32_t i;
-
-  if ((NULL == pBuff) || (0 == wLen)) {
-    NXPLOG_FWDNLD_W("Invalid Params supplied!!");
-  } else {
-    /* Perform CRC calculation according to ccitt with a initial value of 0x1d0f
-     */
-    for (i = 0; i < wLen; i++) {
-      wValue = 0x00ffU & (uint16_t)pBuff[i];
-      wTmp = (wCrc >> 8U) ^ wValue;
-      wCrc = (wCrc << 8U) ^ aCrcTab[wTmp];
-    }
-  }
-
-  return wCrc;
-}
diff --git a/halimpl/pn54x/dnld/phDnldNfc_Utils.h b/halimpl/pn54x/dnld/phDnldNfc_Utils.h
deleted file mode 100644
index 4b4e2af..0000000
--- a/halimpl/pn54x/dnld/phDnldNfc_Utils.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Firmware Download Utilities File
- */
-#ifndef PHDNLDNFC_UTILS_H
-#define PHDNLDNFC_UTILS_H
-
-#include <phDnldNfc.h>
-
-extern uint16_t phDnldNfc_CalcCrc16(uint8_t* pBuff, uint16_t wLen);
-
-#endif /* PHDNLDNFC_UTILS_H */
diff --git a/halimpl/pn54x/dnld/phNxpNciHal_Dnld.c b/halimpl/pn54x/dnld/phNxpNciHal_Dnld.c
deleted file mode 100644
index 42cadba..0000000
--- a/halimpl/pn54x/dnld/phNxpNciHal_Dnld.c
+++ /dev/null
@@ -1,1808 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <phDnldNfc.h>
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal_Dnld.h>
-#include <phNxpNciHal_utils.h>
-#include <phTmlNfc.h>
-
-/* Macro */
-#define PHLIBNFC_IOCTL_DNLD_MAX_ATTEMPTS 3
-#define PHLIBNFC_IOCTL_DNLD_GETVERLEN (0x0BU)
-#define PHLIBNFC_IOCTL_DNLD_GETVERLEN_MRA2_1 (0x09U)
-#define PHLIBNFC_DNLD_MEM_READ (0xECU)
-#define PHLIBNFC_DNLD_MEM_WRITE (0xEDU)
-#define PHLIBNFC_DNLD_READ_LOG (0xEEU)
-#define NFC_MEM_READ (0xD0U)
-#define NFC_MEM_WRITE (0xD1U)
-#define NFC_FW_DOWNLOAD (0x09F7U)
-
-/* External global variable to get FW version */
-extern uint16_t wFwVer;
-extern uint16_t wMwVer;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-extern uint8_t gRecFWDwnld;
-#endif
-/* RF Configuration structure */
-typedef struct phLibNfc_IoctlSetRfConfig {
-  uint8_t bNumOfParams;   /* Number of Rf configurable parameters to be set */
-  uint8_t* pInputBuffer;  /* Buffer containing Rf configurable parameters */
-  uint8_t bSetSysPmuFlag; /* Flag to decide wether to set SystemPmu or no from
-                             the first byte */
-} phLibNfc_IoctlSetRfConfig;
-
-/* Structure to hold information from EEPROM */
-typedef struct phLibNfc_EELogParams {
-  uint16_t wCurrMwVer;      /* Holds current MW version on the chip */
-  uint16_t wCurrFwVer;      /* Holds current FW version on the chip */
-  uint16_t wNumDnldTrig;    /* Total number of times dnld has been attempted */
-  uint16_t wNumDnldSuccess; /* Total number of times dnld has been successful */
-  uint16_t wNumDnldFail;    /* Total number of times dnld has Failed */
-  uint16_t wDnldFailCnt;    /* holds the number of times dnld has failed,will be
-                               reset on success */
-  bool_t bConfig; /* Flag to be set in dnld mode after successful dnld,to be
-                    reset in NCI Mode
-                    after setting the NCI configuration */
-} phLibNfc_EELogParams_t;
-
-/* FW download module context structure */
-typedef struct {
-  bool_t bDnldEepromWrite; /* Flag to indicate eeprom write request*/
-  bool_t
-      bSkipSeq; /* Flag to indicate FW download sequence to be skipped or not */
-  bool_t bSkipReset; /* Flag to indicate Reset cmd to be skipped or not in FW
-                        download sequence */
-  bool_t bSkipForce; /* Flag to indicate Force cmd to be skipped or not in FW
-                        recovery sequence */
-  bool_t bPrevSessnOpen; /* Flag to indicate previous download session is open
-                            or not */
-  bool_t bLibNfcCtxtMem; /* flag to indicate if mem was allocated for
-                            gpphLibNfc_Context */
-  bool_t bDnldInitiated; /* Flag to indicate if fw upgrade was initiated */
-  bool_t
-      bSendNciCmd; /* Flag to indicate if NCI cmd to be sent or not,after PKU */
-  uint8_t bChipVer;     /* holds the hw chip version */
-  bool_t bDnldRecovery; /* Flag to indicate if dnld recovery sequence needs to
-                           be triggered */
-  bool_t bForceDnld; /* Flag to indicate if forced download option is enabled */
-  bool_t bRetryDnld; /* Flag to indicate retry download after successful
-                        recovery complete */
-  uint8_t
-      bDnldAttempts;  /* Holds the count of no. of dnld attempts made.max 3 */
-  uint16_t IoctlCode; /* Ioctl code*/
-  bool_t bDnldAttemptFailed; /* Flag to indicate last download attempt failed */
-  NFCSTATUS bLastStatus; /* Holds the actual download write attempt status */
-  phLibNfc_EELogParams_t
-      tLogParams;     /* holds the params that could be logged to reserved EE
-                         address */
-  uint8_t bClkSrcVal; /* Holds the System clock source read from config file */
-  uint8_t
-      bClkFreqVal; /* Holds the System clock frequency read from config file */
-} phNxpNciHal_fw_Ioctl_Cntx_t;
-
-/* Global variables used in this file only*/
-static phNxpNciHal_fw_Ioctl_Cntx_t gphNxpNciHal_fw_IoctlCtx;
-
-/* Local function prototype */
-static NFCSTATUS phNxpNciHal_fw_dnld_reset(void* pContext, NFCSTATUS status,
-                                           void* pInfo);
-
-static void phNxpNciHal_fw_dnld_reset_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_force(void* pContext, NFCSTATUS status,
-                                           void* pInfo);
-
-static void phNxpNciHal_fw_dnld_force_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo);
-
-static void phNxpNciHal_fw_dnld_normal_cb(void* pContext, NFCSTATUS status,
-                                          void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_normal(void* pContext, NFCSTATUS status,
-                                            void* pInfo);
-
-static void phNxpNciHal_fw_dnld_get_version_cb(void* pContext, NFCSTATUS status,
-                                               void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_get_version(void* pContext,
-                                                 NFCSTATUS status, void* pInfo);
-
-static void phNxpNciHal_fw_dnld_get_sessn_state_cb(void* pContext,
-                                                   NFCSTATUS status,
-                                                   void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_get_sessn_state(void* pContext,
-                                                     NFCSTATUS status,
-                                                     void* pInfo);
-
-static void phNxpNciHal_fw_dnld_log_read_cb(void* pContext, NFCSTATUS status,
-                                            void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_log_read(void* pContext, NFCSTATUS status,
-                                              void* pInfo);
-
-static void phNxpNciHal_fw_dnld_write_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_write(void* pContext, NFCSTATUS status,
-                                           void* pInfo);
-
-static void phNxpNciHal_fw_dnld_chk_integrity_cb(void* pContext,
-                                                 NFCSTATUS status, void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_chk_integrity(void* pContext,
-                                                   NFCSTATUS status,
-                                                   void* pInfo);
-
-static void phNxpNciHal_fw_dnld_log_cb(void* pContext, NFCSTATUS status,
-                                       void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_log(void* pContext, NFCSTATUS status,
-                                         void* pInfo);
-
-static void phNxpNciHal_fw_dnld_send_ncicmd_Cb(void* pContext, NFCSTATUS status,
-                                               void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_send_ncicmd(void* pContext,
-                                                 NFCSTATUS status, void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_recover(void* pContext, NFCSTATUS status,
-                                             void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_dnld_complete(void* pContext, NFCSTATUS status,
-                                              void* pInfo);
-
-/* Internal function to verify Crc Status byte received during CheckIntegrity */
-static NFCSTATUS phLibNfc_VerifyCrcStatus(uint8_t bCrcStatus);
-
-static void phNxpNciHal_fw_dnld_recover_cb(void* pContext, NFCSTATUS status,
-                                           void* pInfo);
-
-static NFCSTATUS phNxpNciHal_fw_seq_handler(
-    NFCSTATUS (*seq_handler[])(void* pContext, NFCSTATUS status, void* pInfo));
-
-/* Array of pointers to start fw download seq */
-static NFCSTATUS (*phNxpNciHal_dwnld_seqhandler[])(void* pContext,
-                                                   NFCSTATUS status,
-                                                   void* pInfo) = {
-#if (NFC_NXP_CHIP_TYPE == PN547C2)
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_normal,
-#endif
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log_read,
-    phNxpNciHal_fw_dnld_write,
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log,
-    phNxpNciHal_fw_dnld_chk_integrity,
-    NULL};
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-/* Array of pointers to start dummy fw download seq */
-static NFCSTATUS (*phNxpNciHal_dummy_rec_dwnld_seqhandler[])(void* pContext,
-                                                             NFCSTATUS status,
-                                                             void* pInfo) = {
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log_read,
-    phNxpNciHal_fw_dnld_write,
-    NULL};
-#endif
-
-/* Download Recovery Sequence */
-static NFCSTATUS (*phNxpNciHal_dwnld_rec_seqhandler[])(void* pContext,
-                                                       NFCSTATUS status,
-                                                       void* pInfo) = {
-    phNxpNciHal_fw_dnld_reset, phNxpNciHal_fw_dnld_force,
-    phNxpNciHal_fw_dnld_recover, phNxpNciHal_fw_dnld_send_ncicmd, NULL};
-
-/* Download Log Sequence */
-static NFCSTATUS (*phNxpNciHal_dwnld_log_seqhandler[])(void* pContext,
-                                                       NFCSTATUS status,
-                                                       void* pInfo) = {
-    phNxpNciHal_fw_dnld_log, NULL};
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_reset_cb
-**
-** Description      Download Reset callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_reset_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  UNUSED(pInfo);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_reset_cb - Request Successful");
-  } else {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset_cb - Request Failed!!");
-  }
-  p_cb_data->status = status;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_reset
-**
-** Description      Download Reset
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_reset(void* pContext, NFCSTATUS status,
-                                           void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if (((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) ||
-      ((gphNxpNciHal_fw_IoctlCtx.bSkipReset) == true)) {
-    if ((gphNxpNciHal_fw_IoctlCtx.bSkipReset) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.bSkipReset) = false;
-    }
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset Create dnld_cb_data  failed");
-    return NFCSTATUS_FAILED;
-  }
-  wStatus = phDnldNfc_Reset((pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_reset_cb,
-                            (void*)&cb_data);
-
-  if (wStatus != NFCSTATUS_PENDING) {
-    NXPLOG_FWDNLD_E("phDnldNfc_Reset failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_normal_cb
-**
-** Description      Download Normal callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_normal_cb(void* pContext, NFCSTATUS status,
-                                          void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  UNUSED(pInfo);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_normal_cb - Request Successful");
-  } else {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_normal_cb - Request Failed!!");
-    /* In this fail scenario trick the sequence handler to call next recover
-     * sequence */
-    status = NFCSTATUS_SUCCESS;
-  }
-  p_cb_data->status = status;
-
-  SEM_POST(p_cb_data);
-  usleep(1000 * 10);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_force_cb
-**
-** Description      Download Force callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_force_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  UNUSED(pInfo);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_FWDNLD_D("phLibNfc_DnldForceCb - Request Successful");
-    (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = true;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipReset) = true;
-  } else {
-    /* In this fail scenario trick the sequence handler to call next recover
-     * sequence */
-    status = NFCSTATUS_SUCCESS;
-    NXPLOG_FWDNLD_E("phLibNfc_DnldForceCb - Request Failed!!");
-  }
-  p_cb_data->status = status;
-
-  SEM_POST(p_cb_data);
-  usleep(1000 * 10);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_normal
-**
-** Description      Download Normal
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_normal(void* pContext, NFCSTATUS status,
-                                            void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t bClkVal[2];
-  phDnldNfc_Buff_t tData;
-  phNxpNciHal_Sem_t cb_data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if ((gphNxpNciHal_fw_IoctlCtx.bSkipForce) == true) {
-    return NFCSTATUS_SUCCESS;
-  } else {
-    /*
-    bClkVal[0] = NXP_SYS_CLK_SRC_SEL;
-    bClkVal[1] = NXP_SYS_CLK_FREQ_SEL;
-    */
-    bClkVal[0] = gphNxpNciHal_fw_IoctlCtx.bClkSrcVal;
-    bClkVal[1] = gphNxpNciHal_fw_IoctlCtx.bClkFreqVal;
-
-    (tData.pBuff) = bClkVal;
-    (tData.wLen) = sizeof(bClkVal);
-
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts)++;
-    }
-
-    if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset Create dnld_cb_data  failed");
-      return NFCSTATUS_FAILED;
-    }
-    wStatus = phDnldNfc_Force(
-        &tData, (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_normal_cb,
-        (void*)&cb_data);
-
-    if (NFCSTATUS_PENDING != wStatus) {
-      NXPLOG_FWDNLD_E("phDnldNfc_Normal failed");
-      (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-      goto clean_and_return;
-    }
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_normal semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_normal cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_force
-**
-** Description      Download Force
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_force(void* pContext, NFCSTATUS status,
-                                           void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  uint8_t bClkVal[2];
-  phDnldNfc_Buff_t tData;
-  phNxpNciHal_Sem_t cb_data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if ((gphNxpNciHal_fw_IoctlCtx.bSkipForce) == true) {
-    return NFCSTATUS_SUCCESS;
-  } else {
-    /*
-    bClkVal[0] = NXP_SYS_CLK_SRC_SEL;
-    bClkVal[1] = NXP_SYS_CLK_FREQ_SEL;
-    */
-    bClkVal[0] = gphNxpNciHal_fw_IoctlCtx.bClkSrcVal;
-    bClkVal[1] = gphNxpNciHal_fw_IoctlCtx.bClkFreqVal;
-
-    (tData.pBuff) = bClkVal;
-    (tData.wLen) = sizeof(bClkVal);
-
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts)++;
-    }
-
-    if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_reset Create dnld_cb_data  failed");
-      return NFCSTATUS_FAILED;
-    }
-    wStatus = phDnldNfc_Force(&tData,
-                              (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_force_cb,
-                              (void*)&cb_data);
-
-    if (NFCSTATUS_PENDING != wStatus) {
-      NXPLOG_FWDNLD_E("phDnldNfc_Force failed");
-      (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-      goto clean_and_return;
-    }
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_force semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_force cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_get_version_cb
-**
-** Description      Download Get version callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_get_version_cb(void* pContext, NFCSTATUS status,
-                                               void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  pphDnldNfc_Buff_t pRespBuff;
-  uint16_t wFwVern = 0;
-  uint16_t wMwVern = 0;
-  uint8_t bHwVer = 0;
-  uint8_t bExpectedLen = 0;
-  uint8_t bNewVer[2];
-  uint8_t bCurrVer[2];
-
-  if ((NFCSTATUS_SUCCESS == wStatus) && (NULL != pInfo)) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_get_version_cb - Request Successful");
-
-    pRespBuff = (pphDnldNfc_Buff_t)pInfo;
-
-    if ((0 != pRespBuff->wLen) && (NULL != pRespBuff->pBuff)) {
-      bHwVer = (pRespBuff->pBuff[0]);
-      bHwVer &= 0x0F; /* 0x0F is the mask to extract chip version */
-
-      if ((PHDNLDNFC_HWVER_MRA2_1 == bHwVer) ||
-          (PHDNLDNFC_HWVER_MRA2_2 == bHwVer)
-#if (NFC_NXP_CHIP_TYPE == PN551)
-          || (PHDNLDNFC_HWVER_PN551_MRA1_0 == bHwVer)
-#elif (NFC_NXP_CHIP_TYPE == PN548C2)
-          || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bHwVer)
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-          || (PHDNLDNFC_HWVER_PN553_MRA1_0 == bHwVer ||
-              PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0])
-#endif
-              ) {
-        bExpectedLen = PHLIBNFC_IOCTL_DNLD_GETVERLEN_MRA2_1;
-        (gphNxpNciHal_fw_IoctlCtx.bChipVer) = bHwVer;
-#if (NFC_NXP_CHIP_TYPE == PN553)
-        if (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0]) {
-          (gphNxpNciHal_fw_IoctlCtx.bChipVer) = pRespBuff->pBuff[0];
-        }
-#endif
-      } else if ((bHwVer >= PHDNLDNFC_HWVER_MRA1_0) &&
-                 (bHwVer <= PHDNLDNFC_HWVER_MRA2_0)) {
-        bExpectedLen = PHLIBNFC_IOCTL_DNLD_GETVERLEN;
-        (gphNxpNciHal_fw_IoctlCtx.bChipVer) = bHwVer;
-      } else {
-        wStatus = NFCSTATUS_FAILED;
-        NXPLOG_FWDNLD_E(
-            "phNxpNciHal_fw_dnld_get_version_cb - Invalid ChipVersion!!");
-      }
-    } else {
-      wStatus = NFCSTATUS_FAILED;
-      NXPLOG_FWDNLD_E(
-          "phNxpNciHal_fw_dnld_get_version_cb - Version Resp Buff "
-          "Invalid...\n");
-    }
-
-    if ((NFCSTATUS_SUCCESS == wStatus) && (bExpectedLen == pRespBuff->wLen) &&
-        (NULL != pRespBuff->pBuff)) {
-      NXPLOG_FWDNLD_D(
-          "phNxpNciHal_fw_dnld_get_version_cb - Valid Version Resp "
-          "Buff!!...\n");
-
-      /* Validate version details to confirm if continue with the next sequence
-       * of Operations. */
-      memcpy(bCurrVer, &(pRespBuff->pBuff[bExpectedLen - 2]), sizeof(bCurrVer));
-      wFwVern = wFwVer;
-      wMwVern = wMwVer;
-
-      memcpy(bNewVer, &wFwVern, sizeof(bNewVer));
-
-      /* check if the ROM code version and FW Major version is valid for the
-       * chip*/
-      /* ES2.2 Rom Version - 0x7 and Valid FW Major Version - 0x1 */
-      if ((pRespBuff->pBuff[1] == 0x07) && (bNewVer[1] != 0x01)) {
-        NXPLOG_FWDNLD_E(
-            "C1 FW on C2 chip is not allowed - FW Major Version!= 1 on ES2.2");
-        wStatus = NFCSTATUS_NOT_ALLOWED;
-      }
-      /* Major Version number check */
-      else if ((FALSE == (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated)) &&
-               (bNewVer[1] < bCurrVer[1])) {
-        NXPLOG_FWDNLD_E("Version Check Failed - MajorVerNum Mismatch\n");
-        NXPLOG_FWDNLD_E("NewVer %d != CurrVer %d\n", bNewVer[1], bCurrVer[1]);
-        wStatus = NFCSTATUS_NOT_ALLOWED;
-      }
-      /* Minor Version number check - before download.*/
-      else if ((FALSE == (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated)) &&
-               ((bNewVer[0] == bCurrVer[0]) && (bNewVer[1] == bCurrVer[1]))) {
-        wStatus = NFCSTATUS_SUCCESS;
-#if (PH_LIBNFC_ENABLE_FORCE_DOWNLOAD == 0)
-        NXPLOG_FWDNLD_D("Version Already UpToDate!!\n");
-        (gphNxpNciHal_fw_IoctlCtx.bSkipSeq) = TRUE;
-#else
-        (gphNxpNciHal_fw_IoctlCtx.bForceDnld) = TRUE;
-#endif
-
-      }
-      /* Minor Version number check - after download
-       * after download, we should get the same version information.*/
-      else if ((TRUE == (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated)) &&
-               ((bNewVer[0] != bCurrVer[0]) || (bNewVer[1] != bCurrVer[1]))) {
-        NXPLOG_FWDNLD_E("Version Not Updated After Download!!\n");
-        wStatus = NFCSTATUS_FAILED;
-      } else {
-        NXPLOG_FWDNLD_D("Version Check Successful\n");
-        /* Store the Mw & Fw Version for updating in EEPROM Log Area after
-         * successful download */
-        if (TRUE == (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated)) {
-          NXPLOG_FWDNLD_W("Updating Fw & Mw Versions..");
-          (gphNxpNciHal_fw_IoctlCtx.tLogParams.wCurrMwVer) = wMwVern;
-          (gphNxpNciHal_fw_IoctlCtx.tLogParams.wCurrFwVer) = wFwVern;
-        }
-      }
-    } else {
-      NXPLOG_FWDNLD_E(
-          "phNxpNciHal_fw_dnld_get_version_cb - Version Resp Buff "
-          "Invalid...\n");
-    }
-  } else {
-    wStatus = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version_cb - Request Failed!!");
-  }
-
-  p_cb_data->status = wStatus;
-  SEM_POST(p_cb_data);
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_get_version
-**
-** Description      Download Get version
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_get_version(void* pContext,
-                                                 NFCSTATUS status,
-                                                 void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  static uint8_t bGetVerRes[11];
-  phDnldNfc_Buff_t tDnldBuff;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if (((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) ||
-      ((gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) == true)) {
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version cb_data creation failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  tDnldBuff.pBuff = bGetVerRes;
-  tDnldBuff.wLen = sizeof(bGetVerRes);
-
-  wStatus = phDnldNfc_GetVersion(
-      &tDnldBuff, (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_get_version_cb,
-      (void*)&cb_data);
-  if (wStatus != NFCSTATUS_PENDING) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_get_sessn_state_cb
-**
-** Description      Download Get session state callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_get_sessn_state_cb(void* pContext,
-                                                   NFCSTATUS status,
-                                                   void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  pphDnldNfc_Buff_t pRespBuff;
-  if ((NFCSTATUS_SUCCESS == wStatus) && (NULL != pInfo)) {
-    NXPLOG_FWDNLD_D(
-        "phNxpNciHal_fw_dnld_get_sessn_state_cb - Request Successful");
-
-    pRespBuff = (pphDnldNfc_Buff_t)pInfo;
-
-    if ((3 == (pRespBuff->wLen)) && (NULL != (pRespBuff->pBuff))) {
-      NXPLOG_FWDNLD_D(
-          "phNxpNciHal_fw_dnld_get_sessn_state_cb - Valid Session State Resp "
-          "Buff!!...");
-
-      if (phDnldNfc_LCOper == pRespBuff->pBuff[2]) {
-        if (PHLIBNFC_FWDNLD_SESSNOPEN == pRespBuff->pBuff[0]) {
-          NXPLOG_FWDNLD_E("Prev Fw Upgrade Session still Open..");
-          (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) = true;
-          if ((gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) == true) {
-            NXPLOG_FWDNLD_D(
-                "Session still Open after Prev Fw Upgrade attempt!!");
-
-            if ((gphNxpNciHal_fw_IoctlCtx.bDnldAttempts) <
-                PHLIBNFC_IOCTL_DNLD_MAX_ATTEMPTS) {
-              NXPLOG_FWDNLD_W("Setting Dnld Retry ..");
-              (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = true;
-            } else {
-              NXPLOG_FWDNLD_E("Max Dnld Retry Counts Exceeded!!");
-              (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-            }
-            wStatus = NFCSTATUS_FAILED;
-          }
-        } else {
-          gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen = false;
-        }
-      } else {
-        wStatus = NFCSTATUS_FAILED;
-        NXPLOG_FWDNLD_E(
-            "NFCC not in Operational State..Fw Upgrade not allowed!!");
-      }
-    } else {
-      wStatus = NFCSTATUS_FAILED;
-      NXPLOG_FWDNLD_E(
-          "phNxpNciHal_fw_dnld_get_sessn_state_cb - Session State Resp Buff "
-          "Invalid...");
-    }
-  } else {
-    wStatus = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_E(
-        "phNxpNciHal_fw_dnld_get_sessn_state_cb - Request Failed!!");
-  }
-
-  p_cb_data->status = wStatus;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_get_sessn_state
-**
-** Description      Download Get session state
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_get_sessn_state(void* pContext,
-                                                     NFCSTATUS status,
-                                                     void* pInfo) {
-  phDnldNfc_Buff_t tDnldBuff;
-  static uint8_t bGSnStateRes[3];
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if (gphNxpNciHal_fw_IoctlCtx.bSkipSeq == true) {
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_get_version cb_data creation failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  tDnldBuff.pBuff = bGSnStateRes;
-  tDnldBuff.wLen = sizeof(bGSnStateRes);
-
-  wStatus = phDnldNfc_GetSessionState(
-      &tDnldBuff, &phNxpNciHal_fw_dnld_get_sessn_state_cb, (void*)&cb_data);
-  if (wStatus != NFCSTATUS_PENDING) {
-    NXPLOG_FWDNLD_E("phDnldNfc_GetSessionState failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phDnldNfc_GetSessionState semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phDnldNfc_GetSessionState cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_log_read_cb
-**
-** Description      Download Logread callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_log_read_cb(void* pContext, NFCSTATUS status,
-                                            void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-
-  if ((NFCSTATUS_SUCCESS == status) && (NULL != pInfo)) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_log_read_cb - Request Successful");
-  } else {
-    status = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_read_cb - Request Failed!!");
-  }
-
-  p_cb_data->status = status;
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_log_read
-**
-** Description      Download Log Read
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_log_read(void* pContext, NFCSTATUS status,
-                                              void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  phDnldNfc_Buff_t Data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if (((((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) ||
-        ((gphNxpNciHal_fw_IoctlCtx.bForceDnld) == true)) &&
-       ((gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) == false)) ||
-      ((((gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) == true)) &&
-       ((gphNxpNciHal_fw_IoctlCtx.bRetryDnld) == true)))
-
-  {
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_read cb_data creation failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  (Data.pBuff) = (void*)&(gphNxpNciHal_fw_IoctlCtx.tLogParams);
-  (Data.wLen) = sizeof(phLibNfc_EELogParams_t);
-
-  wStatus = phDnldNfc_ReadLog(
-      &Data, (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_log_read_cb,
-      (void*)&cb_data);
-  if (wStatus != NFCSTATUS_PENDING) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_read failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_read semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_read cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_write_cb
-**
-** Description      Download Write callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_write_cb(void* pContext, NFCSTATUS status,
-                                         void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  UNUSED(pInfo);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_write_cb - Request Successful");
-    (gphNxpNciHal_fw_IoctlCtx.bDnldEepromWrite) = false;
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.wNumDnldSuccess) += 1;
-
-      if ((gphNxpNciHal_fw_IoctlCtx.tLogParams.wDnldFailCnt) > 0) {
-        NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_write_cb - Resetting DnldFailCnt");
-        (gphNxpNciHal_fw_IoctlCtx.tLogParams.wDnldFailCnt) = 0;
-      }
-
-      if ((gphNxpNciHal_fw_IoctlCtx.tLogParams.bConfig) == false) {
-        NXPLOG_FWDNLD_D(
-            "phNxpNciHal_fw_dnld_write_cb - Setting bConfig for use by NCI "
-            "mode");
-        (gphNxpNciHal_fw_IoctlCtx.tLogParams.bConfig) = true;
-      }
-    }
-
-    /* Reset the previously set DnldAttemptFailed flag */
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldAttemptFailed) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.bDnldAttemptFailed) = false;
-    }
-  } else {
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) == true) {
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.wNumDnldFail) += 1;
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.wDnldFailCnt) += 1;
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.bConfig) = false;
-    }
-    if (NFCSTATUS_WRITE_FAILED == status) {
-      (gphNxpNciHal_fw_IoctlCtx.bSkipSeq) = true;
-      (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = true;
-    }
-    // status = NFCSTATUS_FAILED;
-
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_write_cb - Request Failed!!");
-  }
-
-  p_cb_data->status = status;
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_write
-**
-** Description      Download Write
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_write(void* pContext, NFCSTATUS status,
-                                           void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  UNUSED(pContext);
-  UNUSED(status);
-  UNUSED(pInfo);
-  if ((gphNxpNciHal_fw_IoctlCtx.bRetryDnld) == true) {
-    (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-  }
-
-  if (((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) &&
-      ((gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) == false)) {
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_write cb_data creation failed");
-    return NFCSTATUS_FAILED;
-  }
-  if ((gphNxpNciHal_fw_IoctlCtx.bForceDnld) == false) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_write - Incrementing NumDnldTrig..");
-    (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = true;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts)++;
-    (gphNxpNciHal_fw_IoctlCtx.tLogParams.wNumDnldTrig) += 1;
-  }
-  wStatus = phDnldNfc_Write(false, NULL,
-                            (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_write_cb,
-                            (void*)&cb_data);
-  if ((gphNxpNciHal_fw_IoctlCtx.bForceDnld) == false) {
-    if (wStatus != NFCSTATUS_PENDING) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_write failed");
-      wStatus = NFCSTATUS_FAILED;
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.wNumDnldFail) += 1;
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.wDnldFailCnt) += 1;
-      (gphNxpNciHal_fw_IoctlCtx.tLogParams.bConfig) = false;
-      goto clean_and_return;
-    }
-  }
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_write semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_write cb failed");
-    wStatus = cb_data.status;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_chk_integrity_cb
-**
-** Description      Download Check Integrity callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_chk_integrity_cb(void* pContext,
-                                                 NFCSTATUS status,
-                                                 void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  pphDnldNfc_Buff_t pRespBuff;
-  // uint8_t bUserDataCrc[4];
-
-  if ((NFCSTATUS_SUCCESS == wStatus) && (NULL != pInfo)) {
-    NXPLOG_FWDNLD_D(
-        "phNxpNciHal_fw_dnld_chk_integrity_cb - Request Successful");
-    pRespBuff = (pphDnldNfc_Buff_t)pInfo;
-
-    if ((31 == (pRespBuff->wLen)) && (NULL != (pRespBuff->pBuff))) {
-      NXPLOG_FWDNLD_D(
-          "phNxpNciHal_fw_dnld_chk_integrity_cb - Valid Resp Buff!!...\n");
-      wStatus = phLibNfc_VerifyCrcStatus(pRespBuff->pBuff[0]);
-      /*
-      memcpy(bUserDataCrc, &(pRespBuff->pBuff[27]),
-              sizeof(bUserDataCrc));*/
-    } else {
-      NXPLOG_FWDNLD_E(
-          "phNxpNciHal_fw_dnld_chk_integrity_cb - Resp Buff Invalid...\n");
-    }
-  } else {
-    wStatus = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_chk_integrity_cb - Request Failed!!");
-  }
-
-  p_cb_data->status = wStatus;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_chk_integrity
-**
-** Description      Download Check Integrity
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_chk_integrity(void* pContext,
-                                                   NFCSTATUS status,
-                                                   void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  phDnldNfc_Buff_t tDnldBuff;
-  static uint8_t bChkIntgRes[31];
-  UNUSED(pInfo);
-  UNUSED(pContext);
-  UNUSED(status);
-  if (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen == true) {
-    NXPLOG_FWDNLD_D(
-        "Previous Upload session is open..Cannot issue ChkIntegrity Cmd!!");
-    return NFCSTATUS_SUCCESS;
-  }
-
-  if ((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) {
-    return NFCSTATUS_SUCCESS;
-  } else if (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen == true) {
-    NXPLOG_FWDNLD_E(
-        "Previous Upload session is open..Cannot issue ChkIntegrity Cmd!!");
-    return NFCSTATUS_SUCCESS;
-  }
-
-  tDnldBuff.pBuff = bChkIntgRes;
-  tDnldBuff.wLen = sizeof(bChkIntgRes);
-
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E(
-        "phNxpNciHal_fw_dnld_chk_integrity cb_data creation failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  wStatus = phDnldNfc_CheckIntegrity(
-      (gphNxpNciHal_fw_IoctlCtx.bChipVer), &tDnldBuff,
-      &phNxpNciHal_fw_dnld_chk_integrity_cb, (void*)&cb_data);
-  if (wStatus != NFCSTATUS_PENDING) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_chk_integrity failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_chk_integrity semaphore error");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_chk_integrity cb failed");
-    wStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  wStatus = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_recover
-**
-** Description      Download Recover
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_recover(void* pContext, NFCSTATUS status,
-                                             void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-
-  UNUSED(pInfo);
-  UNUSED(status);
-  UNUSED(pContext);
-  if ((gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) == true) {
-    if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_recover cb_data creation failed");
-      return NFCSTATUS_FAILED;
-    }
-    (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts)++;
-
-    /* resetting this flag to avoid cyclic issuance of recovery sequence in case
-     * of failure */
-    (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-
-    wStatus = phDnldNfc_Write(
-        true, NULL, (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_recover_cb,
-        (void*)&cb_data);
-
-    if (NFCSTATUS_PENDING != wStatus) {
-      (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-      goto clean_and_return;
-    }
-    /* Wait for callback response */
-    if (SEM_WAIT(cb_data)) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_recover semaphore error");
-      wStatus = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-
-    if (cb_data.status != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_recover cb failed");
-      wStatus = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-    wStatus = NFCSTATUS_SUCCESS;
-
-  clean_and_return:
-    phNxpNciHal_cleanup_cb_data(&cb_data);
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_recover_cb
-**
-** Description      Download Recover callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_recover_cb(void* pContext, NFCSTATUS status,
-                                           void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  UNUSED(pContext);
-  UNUSED(pInfo);
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    if ((gphNxpNciHal_fw_IoctlCtx.bSkipForce) == false) {
-      NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_recoverCb - Request Successful");
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = true;
-    } else {
-      NXPLOG_FWDNLD_D(
-          "phNxpNciHal_fw_dnld_recoverCb - Production key update Request "
-          "Successful");
-      (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = true;
-    }
-  } else {
-    wStatus = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_recoverCb - Request Failed!!");
-  }
-
-  /* resetting this flag to avoid cyclic issuance of recovery sequence in case
-   * of failure */
-  (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-
-  /* reset previously set SkipForce */
-  (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-  p_cb_data->status = wStatus;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_send_ncicmd_cb
-**
-** Description      Download Send NCI Command callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_send_ncicmd_cb(void* pContext, NFCSTATUS status,
-                                               void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  pphDnldNfc_Buff_t pRespBuff;
-  UNUSED(pContext);
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_send_ncicmdCb - Request Successful");
-    pRespBuff = (pphDnldNfc_Buff_t)pInfo;
-
-    if ((0 != (pRespBuff->wLen)) && (NULL != (pRespBuff->pBuff))) {
-      if (0 == (pRespBuff->pBuff[3])) {
-        NXPLOG_FWDNLD_D("Successful Response received for Nci Reset Cmd");
-      } else {
-        NXPLOG_FWDNLD_E("Nci Reset Request Failed!!");
-      }
-    } else {
-      NXPLOG_FWDNLD_E("Invalid Response received for Nci Reset Request!!");
-    }
-    /* Call Tml Ioctl to enable download mode */
-    wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      NXPLOG_FWDNLD_D("Switched Successfully to dnld mode..");
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = true;
-    } else {
-      NXPLOG_FWDNLD_E("Switching back to dnld mode Failed!!");
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-      wStatus = NFCSTATUS_FAILED;
-    }
-  } else {
-    NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_send_ncicmdCb - Request Failed!!");
-  }
-
-  (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = false;
-  p_cb_data->status = wStatus;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_send_ncicmd
-**
-** Description      Download Send NCI Command
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_send_ncicmd(void* pContext,
-                                                 NFCSTATUS status,
-                                                 void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  static uint8_t bNciCmd[4] = {0x20, 0x00, 0x01,
-                               0x00}; /* Nci Reset Cmd with KeepConfig option */
-  static uint8_t bNciResp[6];
-  phDnldNfc_Buff_t tsData;
-  phDnldNfc_Buff_t trData;
-  phNxpNciHal_Sem_t cb_data;
-
-  UNUSED(pInfo);
-  UNUSED(status);
-  UNUSED(pContext);
-  if ((gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) == false) {
-    return NFCSTATUS_SUCCESS;
-  } else {
-    /* Call Tml Ioctl to enable/restore normal mode */
-    wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableNormalMode);
-
-    if (NFCSTATUS_SUCCESS != wStatus) {
-      NXPLOG_FWDNLD_E("Switching to NormalMode Failed!!");
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = false;
-    } else {
-      if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-        NXPLOG_FWDNLD_E(
-            "phNxpNciHal_fw_dnld_send_ncicmd cb_data creation failed");
-        return NFCSTATUS_FAILED;
-      }
-      (tsData.pBuff) = bNciCmd;
-      (tsData.wLen) = sizeof(bNciCmd);
-      (trData.pBuff) = bNciResp;
-      (trData.wLen) = sizeof(bNciResp);
-
-      wStatus = phDnldNfc_RawReq(
-          &tsData, &trData,
-          (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_send_ncicmd_cb,
-          (void*)&cb_data);
-      if (NFCSTATUS_PENDING != wStatus) {
-        goto clean_and_return;
-      }
-      /* Wait for callback response */
-      if (SEM_WAIT(cb_data)) {
-        NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_send_ncicmd semaphore error");
-        wStatus = NFCSTATUS_FAILED;
-        goto clean_and_return;
-      }
-
-      if (cb_data.status != NFCSTATUS_SUCCESS) {
-        NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_send_ncicmd cb failed");
-        wStatus = NFCSTATUS_FAILED;
-        goto clean_and_return;
-      }
-      wStatus = NFCSTATUS_SUCCESS;
-
-    clean_and_return:
-      phNxpNciHal_cleanup_cb_data(&cb_data);
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_log_cb
-**
-** Description      Download Log callback
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_fw_dnld_log_cb(void* pContext, NFCSTATUS status,
-                                       void* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS wStatus = status;
-  UNUSED(pContext);
-  UNUSED(pInfo);
-
-  if (NFCSTATUS_SUCCESS == wStatus) {
-    NXPLOG_FWDNLD_D("phLibNfc_DnldLogCb - Request Successful");
-    (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-  } else {
-    wStatus = NFCSTATUS_FAILED;
-    NXPLOG_FWDNLD_E("phLibNfc_DnldLogCb - Request Failed!!");
-  }
-  p_cb_data->status = wStatus;
-
-  SEM_POST(p_cb_data);
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_log
-**
-** Description      Download Log
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_log(void* pContext, NFCSTATUS status,
-                                         void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  phDnldNfc_Buff_t tData;
-
-  UNUSED(pInfo);
-  UNUSED(status);
-  UNUSED(pContext);
-  if ((((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == true) ||
-       ((gphNxpNciHal_fw_IoctlCtx.bForceDnld) == true)) &&
-      ((gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) == false)) {
-    return NFCSTATUS_SUCCESS;
-  } else {
-    if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log cb_data creation failed");
-      return NFCSTATUS_FAILED;
-    }
-    (tData.pBuff) = (void*)&(gphNxpNciHal_fw_IoctlCtx.tLogParams);
-    (tData.wLen) = sizeof(gphNxpNciHal_fw_IoctlCtx.tLogParams);
-
-    wStatus =
-        phDnldNfc_Log(&tData, (pphDnldNfc_RspCb_t)&phNxpNciHal_fw_dnld_log_cb,
-                      (void*)&cb_data);
-
-    if (wStatus != NFCSTATUS_PENDING) {
-      NXPLOG_FWDNLD_E("phDnldNfc_Log failed");
-      (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-      wStatus = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-    /* Wait for callback response */
-    if (SEM_WAIT(cb_data)) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log semaphore error");
-      wStatus = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-
-    if (cb_data.status != NFCSTATUS_SUCCESS) {
-      NXPLOG_FWDNLD_E("phNxpNciHal_fw_dnld_log_cb failed");
-      wStatus = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-
-    wStatus = NFCSTATUS_SUCCESS;
-
-  clean_and_return:
-    phNxpNciHal_cleanup_cb_data(&cb_data);
-
-    return wStatus;
-  }
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_seq_handler
-**
-** Description      Sequence Handler
-**
-** Returns          NFCSTATUS_SUCCESS if sequence completed uninterrupted
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_seq_handler(
-    NFCSTATUS (*seq_handler[])(void* pContext, NFCSTATUS status, void* pInfo)) {
-  char* pContext = "FW-Download";
-  int16_t seq_counter = 0;
-  phDnldNfc_Buff_t pInfo;
-  NFCSTATUS status = NFCSTATUS_FAILED;
-
-  status = phTmlNfc_ReadAbort();
-  if (NFCSTATUS_SUCCESS != status) {
-    NXPLOG_FWDNLD_E("Tml Read Abort failed!!");
-    return status;
-  }
-
-  while (seq_handler[seq_counter] != NULL) {
-    status = NFCSTATUS_FAILED;
-    status = (seq_handler[seq_counter])(pContext, status, &pInfo);
-    if (NFCSTATUS_SUCCESS != status) {
-      NXPLOG_FWDNLD_E(" phNxpNciHal_fw_seq_handler : FAILED");
-      break;
-    }
-    seq_counter++;
-  }
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_dnld_complete
-**
-** Description      Download Sequence Complete
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_dnld_complete(void* pContext, NFCSTATUS status,
-                                              void* pInfo) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  NFCSTATUS fStatus = status;
-  UNUSED(pInfo);
-  UNUSED(pContext);
-
-  if (NFCSTATUS_WRITE_FAILED == status) {
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldAttempts) <
-        PHLIBNFC_IOCTL_DNLD_MAX_ATTEMPTS) {
-      (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = true;
-    } else {
-      NXPLOG_FWDNLD_E("Max Dnld Retry Counts Exceeded!!");
-      (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-    }
-  } else if (NFCSTATUS_REJECTED == status) {
-    if ((gphNxpNciHal_fw_IoctlCtx.bDnldAttempts) <
-        PHLIBNFC_IOCTL_DNLD_MAX_ATTEMPTS) {
-      (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = true;
-
-      /* in case of signature error we need to try recover sequence directly
-       * bypassing the force cmd */
-      (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = true;
-    } else {
-      NXPLOG_FWDNLD_E("Max Dnld Retry Counts Exceeded!!");
-      (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-      (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-    }
-  }
-
-  if ((gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) == true) {
-    (gphNxpNciHal_fw_IoctlCtx.bLastStatus) = status;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldAttemptFailed) = true;
-
-    NXPLOG_FWDNLD_E("Invoking Pending Download Log Sequence..");
-    (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-    /* Perform the Logging sequence */
-    wStatus = phNxpNciHal_fw_seq_handler(phNxpNciHal_dwnld_log_seqhandler);
-    if (NFCSTATUS_SUCCESS != gphNxpNciHal_fw_IoctlCtx.bLastStatus) {
-      /* update the previous Download Write status to upper layer and not the
-       * status of Log command */
-      wStatus = gphNxpNciHal_fw_IoctlCtx.bLastStatus;
-      NXPLOG_FWDNLD_E(
-          "phNxpNciHal_fw_dnld_complete: Last Download Write Status before Log "
-          "command bLastStatus = 0x%x",
-          gphNxpNciHal_fw_IoctlCtx.bLastStatus);
-    }
-    status = phNxpNciHal_fw_dnld_complete(pContext, wStatus, &pInfo);
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_FWDNLD_D(" phNxpNciHal_fw_dnld_complete : SUCCESS");
-    } else {
-      NXPLOG_FWDNLD_E(" phNxpNciHal_fw_dnld_complete : FAILED");
-    }
-  } else if ((gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) == true) {
-    NXPLOG_FWDNLD_E("Invoking Download Recovery Sequence..");
-
-    if (NFCSTATUS_SUCCESS == wStatus) {
-      /* Perform the download Recovery sequence */
-      wStatus = phNxpNciHal_fw_seq_handler(phNxpNciHal_dwnld_rec_seqhandler);
-
-      status = phNxpNciHal_fw_dnld_complete(pContext, wStatus, &pInfo);
-      if (NFCSTATUS_SUCCESS == status) {
-        NXPLOG_FWDNLD_D(" phNxpNciHal_fw_dnld_complete : SUCCESS");
-      } else {
-        NXPLOG_FWDNLD_E(" phNxpNciHal_fw_dnld_complete : FAILED");
-      }
-    }
-  } else if ((gphNxpNciHal_fw_IoctlCtx.bRetryDnld) == true) {
-    (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bForceDnld) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipSeq) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = false;
-
-    /* Perform the download sequence ... after successful recover attempt */
-    wStatus = phNxpNciHal_fw_seq_handler(phNxpNciHal_dwnld_seqhandler);
-
-    status = phNxpNciHal_fw_dnld_complete(pContext, wStatus, &pInfo);
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_FWDNLD_D(" phNxpNciHal_fw_dnld_complete : SUCCESS");
-    } else {
-      NXPLOG_FWDNLD_E(" phNxpNciHal_fw_dnld_complete : FAILED");
-    }
-  } else {
-    NXPLOG_FWDNLD_D("phNxpNciHal_fw_dnld_complete: Download Status = 0x%x",
-                    status);
-    if ((gphNxpNciHal_fw_IoctlCtx.bSkipSeq) == false) {
-      if (NFCSTATUS_SUCCESS == status) {
-        if (NFC_FW_DOWNLOAD == gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Fw Download success.. ");
-        } else if (PHLIBNFC_DNLD_MEM_READ ==
-                   gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Read Request success.. ");
-        } else if (PHLIBNFC_DNLD_MEM_WRITE ==
-                   gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Write Request success.. ");
-        } else if (PHLIBNFC_DNLD_READ_LOG ==
-                   gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("ReadLog Request success.. ");
-        } else {
-          NXPLOG_FWDNLD_E("Invalid Request!!");
-        }
-      } else {
-        if (NFC_FW_DOWNLOAD == gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Fw Download Failed!!");
-        } else if (NFC_MEM_READ == gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Read Request Failed!!");
-        } else if (NFC_MEM_WRITE == gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("Write Request Failed!!");
-        } else if (PHLIBNFC_DNLD_READ_LOG ==
-                   gphNxpNciHal_fw_IoctlCtx.IoctlCode) {
-          NXPLOG_FWDNLD_E("ReadLog Request Failed!!");
-        } else {
-          NXPLOG_FWDNLD_E("Invalid Request!!");
-        }
-      }
-    }
-
-    if (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd == false) {
-      /* Call Tml Ioctl to enable/restore normal mode */
-      wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableNormalMode);
-
-      if (NFCSTATUS_SUCCESS != wStatus) {
-        NXPLOG_FWDNLD_E("Switching to NormalMode Failed!!");
-      } else {
-        wStatus = fStatus;
-      }
-    }
-
-    (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bChipVer) = 0;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipSeq) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bForceDnld) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipReset) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = false;
-    (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts) = 0;
-
-    if (gphNxpNciHal_fw_IoctlCtx.bDnldAttemptFailed == false) {
-    } else {
-      NXPLOG_FWDNLD_E("Returning Download Failed Status to Caller!!");
-
-      (gphNxpNciHal_fw_IoctlCtx.bLastStatus) = NFCSTATUS_SUCCESS;
-      (gphNxpNciHal_fw_IoctlCtx.bDnldAttemptFailed) = false;
-    }
-    phDnldNfc_CloseFwLibHandle();
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_fw_download_seq
-**
-** Description      Download Sequence
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_fw_download_seq(uint8_t bClkSrcVal, uint8_t bClkFreqVal) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  phDnldNfc_Buff_t pInfo;
-  char* pContext = "FW-Download";
-
-  /* reset the global flags */
-  gphNxpNciHal_fw_IoctlCtx.IoctlCode = NFC_FW_DOWNLOAD;
-  (gphNxpNciHal_fw_IoctlCtx.bPrevSessnOpen) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bDnldInitiated) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bChipVer) = 0;
-  (gphNxpNciHal_fw_IoctlCtx.bSkipSeq) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bForceDnld) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bDnldRecovery) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bRetryDnld) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bSkipReset) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bSkipForce) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bSendNciCmd) = false;
-  (gphNxpNciHal_fw_IoctlCtx.bDnldAttempts) = 0;
-  (gphNxpNciHal_fw_IoctlCtx.bClkSrcVal) = bClkSrcVal;
-  (gphNxpNciHal_fw_IoctlCtx.bClkFreqVal) = bClkFreqVal;
-  /* Get firmware version */
-  if (NFCSTATUS_SUCCESS == phDnldNfc_InitImgInfo()) {
-    NXPLOG_FWDNLD_D("phDnldNfc_InitImgInfo:SUCCESS");
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    if (gRecFWDwnld == true) {
-      status =
-          phNxpNciHal_fw_seq_handler(phNxpNciHal_dummy_rec_dwnld_seqhandler);
-    } else
-#endif
-    {
-      status = phNxpNciHal_fw_seq_handler(phNxpNciHal_dwnld_seqhandler);
-    }
-  } else {
-    NXPLOG_FWDNLD_E("phDnldNfc_InitImgInfo: FAILED");
-  }
-
-  /* Chage to normal mode */
-  status = phNxpNciHal_fw_dnld_complete(pContext, status, &pInfo);
-  /*if (NFCSTATUS_SUCCESS == status)
-  {
-      NXPLOG_FWDNLD_D(" phNxpNciHal_fw_dnld_complete : SUCCESS");
-  }
-  else
-  {
-      NXPLOG_FWDNLD_E(" phNxpNciHal_fw_dnld_complete : FAILED");
-  }*/
-
-  return status;
-}
-
-static NFCSTATUS phLibNfc_VerifyCrcStatus(uint8_t bCrcStatus) {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553))
-  uint8_t bBitPos = 1;
-  uint8_t bShiftVal = 2;
-#else
-  uint8_t bBitPos = 0;
-  uint8_t bShiftVal = 1;
-#endif
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  while (bBitPos < 7) {
-    if (!(bCrcStatus & bShiftVal)) {
-      switch (bBitPos) {
-        case 0: {
-          NXPLOG_FWDNLD_E("User Data Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 1: {
-          NXPLOG_FWDNLD_E("Trim Data Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 2: {
-          NXPLOG_FWDNLD_E("Protected Data Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 3: {
-          NXPLOG_FWDNLD_E("Patch Code Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 4: {
-          NXPLOG_FWDNLD_E("Function Code Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 5: {
-          NXPLOG_FWDNLD_E("Patch Table Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        case 6: {
-          NXPLOG_FWDNLD_E("Function Table Crc is NOT OK!!");
-          wStatus = NFCSTATUS_FAILED;
-          break;
-        }
-        default: { break; }
-      }
-    }
-
-    bShiftVal <<= 1;
-    ++bBitPos;
-  }
-
-  return wStatus;
-}
diff --git a/halimpl/pn54x/dnld/phNxpNciHal_Dnld.h b/halimpl/pn54x/dnld/phNxpNciHal_Dnld.h
deleted file mode 100644
index d32fead..0000000
--- a/halimpl/pn54x/dnld/phNxpNciHal_Dnld.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_DNLD_H_
-#define _PHNXPNCIHAL_DNLD_H_
-
-#include <phNfcStatus.h>
-#include <phNfcTypes.h>
-
-NFCSTATUS phNxpNciHal_fw_download_seq(uint8_t bClkSrcVal, uint8_t bClkFreqVal);
-
-#endif /* _PHNXPNCIHAL_DNLD_H_ */
diff --git a/halimpl/pn54x/hal/phNxpNciHal.c b/halimpl/pn54x/hal/phNxpNciHal.c
deleted file mode 100644
index 5a799d5..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal.c
+++ /dev/null
@@ -1,2653 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <phDal4Nfc_messageQueueLib.h>
-#include <phDnldNfc.h>
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal.h>
-#include <phNxpNciHal_Adaptation.h>
-#include <phNxpNciHal_Dnld.h>
-#include <phNxpNciHal_NfcDepSWPrio.h>
-#include <phNxpNciHal_ext.h>
-#include <phTmlNfc.h>
-#include <sys/stat.h>
-/*********************** Global Variables *************************************/
-#define PN547C2_CLOCK_SETTING
-#undef PN547C2_FACTORY_RESET_DEBUG
-#define CORE_RES_STATUS_BYTE 3
-/* FW Mobile major number */
-#define FW_MOBILE_MAJOR_NUMBER_PN553 0x01
-#define FW_MOBILE_MAJOR_NUMBER_PN81A 0x02
-#define FW_MOBILE_MAJOR_NUMBER_PN551 0x05
-#define FW_MOBILE_MAJOR_NUMBER_PN48AD 0x01
-
-#if (NFC_NXP_CHIP_TYPE == PN551)
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN551
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN553
-#else
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN48AD
-#endif
-/* Processing of ISO 15693 EOF */
-extern uint8_t icode_send_eof;
-extern uint8_t icode_detected;
-static uint8_t cmd_icode_eof[] = {0x00, 0x00, 0x00};
-
-/* FW download success flag */
-static uint8_t fw_download_success = 0;
-
-static uint8_t config_access = false;
-static uint8_t config_success = true;
-/* NCI HAL Control structure */
-phNxpNciHal_Control_t nxpncihal_ctrl;
-
-/* NXP Poll Profile structure */
-phNxpNciProfile_Control_t nxpprofile_ctrl;
-
-/* TML Context */
-extern phTmlNfc_Context_t* gpphTmlNfc_Context;
-extern void phTmlNfc_set_fragmentation_enabled(
-    phTmlNfc_i2cfragmentation_t result);
-/* global variable to get FW version from NCI response*/
-uint32_t wFwVerRsp;
-/* External global variable to get FW version */
-extern uint16_t wFwVer;
-
-extern uint16_t fw_maj_ver;
-extern uint16_t rom_version;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-extern uint8_t gRecFWDwnld;
-static uint8_t gRecFwRetryCount;  // variable to hold dummy FW recovery count
-#endif
-static uint8_t Rx_data[NCI_MAX_DATA_LEN];
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-uint8_t discovery_cmd[50] = {0};
-uint8_t discovery_cmd_len = 0;
-#endif
-uint32_t timeoutTimerId = 0;
-phNxpNciHal_Sem_t config_data;
-
-phNxpNciClock_t phNxpNciClock = {0, {0}, false};
-
-phNxpNciRfSetting_t phNxpNciRfSet = {false, {0}};
-
-phNxpNciMwEepromArea_t phNxpNciMwEepromArea = {false, {0}};
-
-/**************** local methods used in this file only ************************/
-static NFCSTATUS phNxpNciHal_fw_download(void);
-static void phNxpNciHal_open_complete(NFCSTATUS status);
-static void phNxpNciHal_write_complete(void* pContext,
-                                       phTmlNfc_TransactInfo_t* pInfo);
-static void phNxpNciHal_read_complete(void* pContext,
-                                      phTmlNfc_TransactInfo_t* pInfo);
-static void phNxpNciHal_close_complete(NFCSTATUS status);
-static void phNxpNciHal_core_initialized_complete(NFCSTATUS status);
-static void phNxpNciHal_pre_discover_complete(NFCSTATUS status);
-static void phNxpNciHal_power_cycle_complete(NFCSTATUS status);
-static void phNxpNciHal_kill_client_thread(
-    phNxpNciHal_Control_t* p_nxpncihal_ctrl);
-static void* phNxpNciHal_client_thread(void* arg);
-static void phNxpNciHal_get_clk_freq(void);
-static void phNxpNciHal_set_clock(void);
-static void phNxpNciHal_check_factory_reset(void);
-static void phNxpNciHal_print_res_status(uint8_t* p_rx_data, uint16_t* p_len);
-static NFCSTATUS phNxpNciHal_CheckValidFwVersion(void);
-static void phNxpNciHal_enable_i2c_fragmentation();
-static NFCSTATUS phNxpNciHal_get_mw_eeprom(void);
-static NFCSTATUS phNxpNciHal_set_mw_eeprom(void);
-static int phNxpNciHal_fw_mw_ver_check();
-NFCSTATUS phNxpNciHal_check_clock_config(void);
-NFCSTATUS phNxpNciHal_china_tianjin_rf_setting(void);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-static NFCSTATUS phNxpNciHalRFConfigCmdRecSequence();
-static NFCSTATUS phNxpNciHal_CheckRFCmdRespStatus();
-#endif
-int check_config_parameter();
-
-/******************************************************************************
- * Function         phNxpNciHal_client_thread
- *
- * Description      This function is a thread handler which handles all TML and
- *                  NCI messages.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void* phNxpNciHal_client_thread(void* arg) {
-  phNxpNciHal_Control_t* p_nxpncihal_ctrl = (phNxpNciHal_Control_t*)arg;
-  phLibNfc_Message_t msg;
-
-  NXPLOG_NCIHAL_D("thread started");
-
-  p_nxpncihal_ctrl->thread_running = 1;
-
-  while (p_nxpncihal_ctrl->thread_running == 1) {
-    /* Fetch next message from the NFC stack message queue */
-    if (phDal4Nfc_msgrcv(p_nxpncihal_ctrl->gDrvCfg.nClientId, &msg, 0, 0) ==
-        -1) {
-      NXPLOG_NCIHAL_E("NFC client received bad message");
-      continue;
-    }
-
-    if (p_nxpncihal_ctrl->thread_running == 0) {
-      break;
-    }
-
-    switch (msg.eMsgType) {
-      case PH_LIBNFC_DEFERREDCALL_MSG: {
-        phLibNfc_DeferredCall_t* deferCall =
-            (phLibNfc_DeferredCall_t*)(msg.pMsgData);
-
-        REENTRANCE_LOCK();
-        deferCall->pCallback(deferCall->pParameter);
-        REENTRANCE_UNLOCK();
-
-        break;
-      }
-
-      case NCI_HAL_OPEN_CPLT_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-          /* Send the event */
-          (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_OPEN_CPLT_EVT,
-                                              HAL_NFC_STATUS_OK);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-
-      case NCI_HAL_CLOSE_CPLT_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-          /* Send the event */
-          (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_CLOSE_CPLT_EVT,
-                                              HAL_NFC_STATUS_OK);
-          phNxpNciHal_kill_client_thread(&nxpncihal_ctrl);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-
-      case NCI_HAL_POST_INIT_CPLT_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-          /* Send the event */
-          (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_POST_INIT_CPLT_EVT,
-                                              HAL_NFC_STATUS_OK);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-
-      case NCI_HAL_PRE_DISCOVER_CPLT_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-          /* Send the event */
-          (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_PRE_DISCOVER_CPLT_EVT,
-                                              HAL_NFC_STATUS_OK);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-
-      case NCI_HAL_ERROR_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-          /* Send the event */
-          (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_ERROR_EVT,
-                                              HAL_NFC_STATUS_FAILED);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-
-      case NCI_HAL_RX_MSG: {
-        REENTRANCE_LOCK();
-        if (nxpncihal_ctrl.p_nfc_stack_data_cback != NULL) {
-          (*nxpncihal_ctrl.p_nfc_stack_data_cback)(nxpncihal_ctrl.rsp_len,
-                                                   nxpncihal_ctrl.p_rsp_data);
-        }
-        REENTRANCE_UNLOCK();
-        break;
-      }
-    }
-  }
-
-  NXPLOG_NCIHAL_D("NxpNciHal thread stopped");
-
-  return NULL;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_kill_client_thread
- *
- * Description      This function safely kill the client thread and clean all
- *                  resources.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_kill_client_thread(
-    phNxpNciHal_Control_t* p_nxpncihal_ctrl) {
-  NXPLOG_NCIHAL_D("Terminating phNxpNciHal client thread...");
-
-  p_nxpncihal_ctrl->p_nfc_stack_cback = NULL;
-  p_nxpncihal_ctrl->p_nfc_stack_data_cback = NULL;
-  p_nxpncihal_ctrl->thread_running = 0;
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_fw_download
- *
- * Description      This function download the PN54X secure firmware to IC. If
- *                  firmware version in Android filesystem and firmware in the
- *                  IC is same then firmware download will return with success
- *                  without downloading the firmware.
- *
- * Returns          NFCSTATUS_SUCCESS if firmware download successful
- *                  NFCSTATUS_FAILED in case of failure
- *
- ******************************************************************************/
-static NFCSTATUS phNxpNciHal_fw_download(void) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01, 0x00};
-
-  phNxpNciHal_get_clk_freq();
-  status = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
-  if (NFCSTATUS_SUCCESS == status) {
-    /* Set the obtained device handle to download module */
-    phDnldNfc_SetHwDevHandle();
-    NXPLOG_NCIHAL_D("Calling Seq handler for FW Download \n");
-    status = phNxpNciHal_fw_download_seq(nxpprofile_ctrl.bClkSrcVal,
-                                         nxpprofile_ctrl.bClkFreqVal);
-    if (status != NFCSTATUS_SUCCESS) {
-      /* Abort any pending read and write */
-      phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-      phTmlNfc_ReadAbort();
-      phTmlNfc_WriteAbort();
-    }
-    phDnldNfc_ReSetHwDevHandle();
-  } else {
-    status = NFCSTATUS_FAILED;
-  }
-
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_CheckValidFwVersion
- *
- * Description      This function checks the valid FW for Mobile device.
- *                  If the FW doesn't belong the Mobile device it further
- *                  checks nxp config file to override.
- *
- * Returns          NFCSTATUS_SUCCESS if valid fw version found
- *                  NFCSTATUS_NOT_ALLOWED in case of FW not valid for mobile
- *                  device
- *
- ******************************************************************************/
-static NFCSTATUS phNxpNciHal_CheckValidFwVersion(void) {
-  NFCSTATUS status = NFCSTATUS_NOT_ALLOWED;
-  const unsigned char sfw_infra_major_no = 0x02;
-  unsigned char ufw_current_major_no = 0x00;
-  unsigned long num = 0;
-  int isfound = 0;
-
-  /* extract the firmware's major no */
-  ufw_current_major_no = ((0x00FF) & (wFwVer >> 8U));
-
-  NXPLOG_NCIHAL_D("%s current_major_no = 0x%x", __FUNCTION__,
-                  ufw_current_major_no);
-  if ((ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER) ||
-      ((ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN81A &&
-        (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0)))
-#if (NFC_NXP_CHIP_TYPE == PN553)
-      || ((rom_version == 0x00) &&
-          (ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN81A))
-#endif
-          )
-
-  {
-    status = NFCSTATUS_SUCCESS;
-  } else if (ufw_current_major_no == sfw_infra_major_no) {
-    if (rom_version == FW_MOBILE_ROM_VERSION_PN553 &&
-        nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-      NXPLOG_NCIHAL_D(" PN81A  allow Fw download with major number =  0x%x",
-                      ufw_current_major_no);
-      status = NFCSTATUS_SUCCESS;
-    } else {
-      /* Check the nxp config file if still want to go for download */
-      /* By default NAME_NXP_FW_PROTECION_OVERRIDE will not be defined in config
-         file.
-         If user really want to override the Infra firmware over mobile
-         firmware, please
-         put "NXP_FW_PROTECION_OVERRIDE=0x01" in libnfc-nxp.conf file.
-         Please note once Infra firmware downloaded to Mobile device, The device
-         can never be updated to Mobile firmware*/
-      isfound =
-          GetNxpNumValue(NAME_NXP_FW_PROTECION_OVERRIDE, &num, sizeof(num));
-      if (isfound > 0) {
-        if (num == 0x01) {
-          NXPLOG_NCIHAL_D("Override Infra FW over Mobile");
-          status = NFCSTATUS_SUCCESS;
-        } else {
-          NXPLOG_NCIHAL_D(
-              "Firmware download not allowed (NXP_FW_PROTECION_OVERRIDE "
-              "invalid value)");
-        }
-      } else {
-        NXPLOG_NCIHAL_D(
-            "Firmware download not allowed (NXP_FW_PROTECION_OVERRIDE not "
-            "defined)");
-      }
-    }
-  }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  else if (gRecFWDwnld == TRUE) {
-    status = NFCSTATUS_SUCCESS;
-  }
-#endif
-  else if (wFwVerRsp == 0) {
-    NXPLOG_NCIHAL_E(
-        "FW Version not received by NCI command >>> Force Firmware download");
-    status = NFCSTATUS_SUCCESS;
-  } else {
-    NXPLOG_NCIHAL_E("Wrong FW Version >>> Firmware download not allowed");
-  }
-
-  return status;
-}
-
-static void phNxpNciHal_get_clk_freq(void) {
-  unsigned long num = 0;
-  int isfound = 0;
-
-  nxpprofile_ctrl.bClkSrcVal = 0;
-  nxpprofile_ctrl.bClkFreqVal = 0;
-  nxpprofile_ctrl.bTimeout = 0;
-
-  isfound = GetNxpNumValue(NAME_NXP_SYS_CLK_SRC_SEL, &num, sizeof(num));
-  if (isfound > 0) {
-    nxpprofile_ctrl.bClkSrcVal = num;
-  }
-
-  num = 0;
-  isfound = 0;
-  isfound = GetNxpNumValue(NAME_NXP_SYS_CLK_FREQ_SEL, &num, sizeof(num));
-  if (isfound > 0) {
-    nxpprofile_ctrl.bClkFreqVal = num;
-  }
-
-  num = 0;
-  isfound = 0;
-  isfound = GetNxpNumValue(NAME_NXP_SYS_CLOCK_TO_CFG, &num, sizeof(num));
-  if (isfound > 0) {
-    nxpprofile_ctrl.bTimeout = num;
-  }
-
-  NXPLOG_FWDNLD_D("gphNxpNciHal_fw_IoctlCtx.bClkSrcVal = 0x%x",
-                  nxpprofile_ctrl.bClkSrcVal);
-  NXPLOG_FWDNLD_D("gphNxpNciHal_fw_IoctlCtx.bClkFreqVal = 0x%x",
-                  nxpprofile_ctrl.bClkFreqVal);
-  NXPLOG_FWDNLD_D("gphNxpNciHal_fw_IoctlCtx.bClkFreqVal = 0x%x",
-                  nxpprofile_ctrl.bTimeout);
-
-  if ((nxpprofile_ctrl.bClkSrcVal < CLK_SRC_XTAL) ||
-      (nxpprofile_ctrl.bClkSrcVal > CLK_SRC_PLL)) {
-    NXPLOG_FWDNLD_E(
-        "Clock source value is wrong in config file, setting it as default");
-    nxpprofile_ctrl.bClkSrcVal = NXP_SYS_CLK_SRC_SEL;
-  }
-  if ((nxpprofile_ctrl.bClkFreqVal < CLK_FREQ_13MHZ) ||
-      (nxpprofile_ctrl.bClkFreqVal > CLK_FREQ_52MHZ)) {
-    NXPLOG_FWDNLD_E(
-        "Clock frequency value is wrong in config file, setting it as default");
-    nxpprofile_ctrl.bClkFreqVal = NXP_SYS_CLK_FREQ_SEL;
-  }
-  if ((nxpprofile_ctrl.bTimeout < CLK_TO_CFG_DEF) ||
-      (nxpprofile_ctrl.bTimeout > CLK_TO_CFG_MAX)) {
-    NXPLOG_FWDNLD_E(
-        "Clock timeout value is wrong in config file, setting it as default");
-    nxpprofile_ctrl.bTimeout = CLK_TO_CFG_DEF;
-  }
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_open
- *
- * Description      This function is called by libnfc-nci during the
- *                  initialization of the NFCC. It opens the physical connection
- *                  with NFCC (PN54X) and creates required client thread for
- *                  operation.
- *                  After open is complete, status is informed to libnfc-nci
- *                  through callback function.
- *
- * Returns          This function return NFCSTATUS_SUCCES (0) in case of success
- *                  In case of failure returns other failure value.
- *
- ******************************************************************************/
-int phNxpNciHal_open(nfc_stack_callback_t* p_cback,
-                     nfc_stack_data_callback_t* p_data_cback) {
-  phOsalNfc_Config_t tOsalConfig;
-  phTmlNfc_Config_t tTmlConfig;
-  char* nfc_dev_node = NULL;
-  const uint16_t max_len = 260;
-  NFCSTATUS wConfigStatus = NFCSTATUS_SUCCESS;
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  /*NCI_INIT_CMD*/
-  static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01, 0x00};
-  /*NCI2_0_INIT_CMD*/
-  static uint8_t cmd_init_nci2_0[] = {0x20, 0x01, 0x02, 0x00, 0x00};
-  if (nxpncihal_ctrl.halStatus == HAL_STATUS_OPEN) {
-    NXPLOG_NCIHAL_E("phNxpNciHal_open already open");
-    return NFCSTATUS_SUCCESS;
-  }
-  /* reset config cache */
-  resetNxpConfig();
-
-  int init_retry_cnt = 0;
-  int8_t ret_val = 0x00;
-
-  /* initialize trace level */
-  phNxpLog_InitializeLogLevel();
-
-  /*Create the timer for extns write response*/
-  timeoutTimerId = phOsalNfc_Timer_Create();
-
-  if (phNxpNciHal_init_monitor() == NULL) {
-    NXPLOG_NCIHAL_E("Init monitor failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  CONCURRENCY_LOCK();
-  memset(&nxpncihal_ctrl, 0x00, sizeof(nxpncihal_ctrl));
-  memset(&tOsalConfig, 0x00, sizeof(tOsalConfig));
-  memset(&tTmlConfig, 0x00, sizeof(tTmlConfig));
-  memset(&nxpprofile_ctrl, 0, sizeof(phNxpNciProfile_Control_t));
-
-  /* By default HAL status is HAL_STATUS_OPEN */
-  nxpncihal_ctrl.halStatus = HAL_STATUS_OPEN;
-
-  nxpncihal_ctrl.p_nfc_stack_cback = p_cback;
-  nxpncihal_ctrl.p_nfc_stack_data_cback = p_data_cback;
-  /*nci version NCI_VERSION_UNKNOWN version by default*/
-  nxpncihal_ctrl.nci_info.nci_version = NCI_VERSION_UNKNOWN;
-  /* Read the nfc device node name */
-  nfc_dev_node = (char*)malloc(max_len * sizeof(char));
-  if (nfc_dev_node == NULL) {
-    NXPLOG_NCIHAL_E("malloc of nfc_dev_node failed ");
-    goto clean_and_return;
-  } else if (!GetNxpStrValue(NAME_NXP_NFC_DEV_NODE, nfc_dev_node,
-                             sizeof(nfc_dev_node))) {
-    NXPLOG_NCIHAL_E(
-        "Invalid nfc device node name keeping the default device node "
-        "/dev/pn54x");
-    strcpy(nfc_dev_node, "/dev/pn54x");
-  }
-
-  /* Configure hardware link */
-  nxpncihal_ctrl.gDrvCfg.nClientId = phDal4Nfc_msgget(0, 0600);
-  nxpncihal_ctrl.gDrvCfg.nLinkType = ENUM_LINK_TYPE_I2C; /* For PN54X */
-  tTmlConfig.pDevName = (int8_t*)nfc_dev_node;
-  tOsalConfig.dwCallbackThreadId = (uintptr_t)nxpncihal_ctrl.gDrvCfg.nClientId;
-  tOsalConfig.pLogFile = NULL;
-  tTmlConfig.dwGetMsgThreadId = (uintptr_t)nxpncihal_ctrl.gDrvCfg.nClientId;
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  memset(discovery_cmd, 0, sizeof(discovery_cmd));
-  discovery_cmd_len = 0;
-#endif
-
-  /* Initialize TML layer */
-  wConfigStatus = phTmlNfc_Init(&tTmlConfig);
-  if (wConfigStatus != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("phTmlNfc_Init Failed");
-    goto clean_and_return;
-  } else {
-    if (nfc_dev_node != NULL) {
-      free(nfc_dev_node);
-      nfc_dev_node = NULL;
-    }
-  }
-
-  /* Create the client thread */
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  ret_val = pthread_create(&nxpncihal_ctrl.client_thread, &attr,
-                           phNxpNciHal_client_thread, &nxpncihal_ctrl);
-  pthread_attr_destroy(&attr);
-  if (ret_val != 0) {
-    NXPLOG_NCIHAL_E("pthread_create failed");
-    wConfigStatus = phTmlNfc_Shutdown();
-    goto clean_and_return;
-  }
-
-  CONCURRENCY_UNLOCK();
-
-  /* call read pending */
-  status = phTmlNfc_Read(
-      nxpncihal_ctrl.p_cmd_data, NCI_MAX_DATA_LEN,
-      (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_read_complete, NULL);
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("TML Read status error status = %x", status);
-    wConfigStatus = phTmlNfc_Shutdown();
-    wConfigStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-init_retry:
-
-  phNxpNciHal_ext_init();
-
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-  if ((status != NFCSTATUS_SUCCESS) &&
-      (nxpncihal_ctrl.retry_cnt >= MAX_RETRY_COUNT)) {
-    NXPLOG_NCIHAL_E("Force FW Download, NFCC not coming out from Standby");
-    wConfigStatus = NFCSTATUS_FAILED;
-    goto force_download;
-  } else if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("NCI_CORE_RESET: Failed");
-    if (init_retry_cnt < 3) {
-      init_retry_cnt++;
-      (void)phNxpNciHal_power_cycle();
-      goto init_retry;
-    } else
-      init_retry_cnt = 0;
-    wConfigStatus = phTmlNfc_Shutdown();
-    wConfigStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
-  if (status == NFCSTATUS_SUCCESS) {
-    if (nxpncihal_ctrl.nci_info.nci_version != NCI_VERSION_2_0) {
-      NXPLOG_NCIHAL_E("Chip is in NCI1.0 mode reset the chip again");
-      status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-      if (status == NFCSTATUS_SUCCESS) {
-        if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-          status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0),
-                                            cmd_init_nci2_0);
-        } else {
-          status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci), cmd_init_nci);
-        }
-      }
-    }
-  }
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("NCI_CORE_INIT : Failed");
-    if (init_retry_cnt < 3) {
-      init_retry_cnt++;
-      (void)phNxpNciHal_power_cycle();
-      goto init_retry;
-    } else
-      init_retry_cnt = 0;
-    wConfigStatus = phTmlNfc_Shutdown();
-    wConfigStatus = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-  phNxpNciHal_enable_i2c_fragmentation();
-  /*Get FW version from device*/
-  status = phDnldNfc_InitImgInfo();
-  NXPLOG_NCIHAL_E("FW version for FW file = 0x%x", wFwVer);
-  NXPLOG_NCIHAL_E("FW version from device = 0x%x", wFwVerRsp);
-  if ((wFwVerRsp & 0x0000FFFF) == wFwVer) {
-    NXPLOG_NCIHAL_D("FW uptodate not required");
-    phDnldNfc_ReSetHwDevHandle();
-  } else {
-  force_download:
-    if (wFwVerRsp == 0) {
-      phDnldNfc_InitImgInfo();
-    }
-    if (NFCSTATUS_SUCCESS == phNxpNciHal_CheckValidFwVersion()) {
-      NXPLOG_NCIHAL_D("FW update required");
-      fw_download_success = 0;
-      status = phNxpNciHal_fw_download();
-      if (status != NFCSTATUS_SUCCESS) {
-        if (NFCSTATUS_SUCCESS != phNxpNciHal_fw_mw_ver_check()) {
-          NXPLOG_NCIHAL_D("Chip Version Middleware Version mismatch!!!!");
-          phOsalNfc_Timer_Cleanup();
-          phTmlNfc_Shutdown();
-          wConfigStatus = NFCSTATUS_FAILED;
-          goto clean_and_return;
-        }
-        NXPLOG_NCIHAL_E("FW Download failed - NFCC init will continue");
-      } else {
-        wConfigStatus = NFCSTATUS_SUCCESS;
-        fw_download_success = 1;
-        /* call read pending */
-        status = phTmlNfc_Read(
-            nxpncihal_ctrl.p_cmd_data, NCI_MAX_DATA_LEN,
-            (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_read_complete, NULL);
-        if (status != NFCSTATUS_PENDING) {
-          NXPLOG_NCIHAL_E("TML Read status error status = %x", status);
-          wConfigStatus = phTmlNfc_Shutdown();
-          wConfigStatus = NFCSTATUS_FAILED;
-          goto clean_and_return;
-        }
-      }
-    } else {
-      if (wFwVerRsp == 0) phDnldNfc_ReSetHwDevHandle();
-    }
-  }
-  /* Call open complete */
-  phNxpNciHal_open_complete(wConfigStatus);
-
-  return wConfigStatus;
-
-clean_and_return:
-  CONCURRENCY_UNLOCK();
-  if (nfc_dev_node != NULL) {
-    free(nfc_dev_node);
-    nfc_dev_node = NULL;
-  }
-  /* Report error status */
-  (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_OPEN_CPLT_EVT,
-                                      HAL_NFC_STATUS_FAILED);
-
-  nxpncihal_ctrl.p_nfc_stack_cback = NULL;
-  nxpncihal_ctrl.p_nfc_stack_data_cback = NULL;
-  phNxpNciHal_cleanup_monitor();
-  nxpncihal_ctrl.halStatus = HAL_STATUS_CLOSE;
-  return NFCSTATUS_FAILED;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_fw_mw_check
- *
- * Description      This function inform the status of phNxpNciHal_fw_mw_check
- *                  function to libnfc-nci.
- *
- * Returns          int.
- *
- ******************************************************************************/
-int phNxpNciHal_fw_mw_ver_check() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  if (!(strcmp(COMPILATION_MW, "PN553")) &&
-      (rom_version == FW_MOBILE_ROM_VERSION_PN553) &&
-      (fw_maj_ver == 0x01 || fw_maj_ver == 0x02)) {
-    status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN551") &&
-             (rom_version == FW_MOBILE_ROM_VERSION_PN551) &&
-             (fw_maj_ver == 0x05)) {
-    status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN548C2") &&
-             (rom_version == FW_MOBILE_ROM_VERSION_PN548AD) &&
-             (fw_maj_ver == 0x01)) {
-    status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN547C2") &&
-             (rom_version == FW_MOBILE_ROM_VERSION_PN547C2) &&
-             (fw_maj_ver == 0x01)) {
-    status = NFCSTATUS_SUCCESS;
-  }
-  return status;
-}
-/******************************************************************************
- * Function         phNxpNciHal_open_complete
- *
- * Description      This function inform the status of phNxpNciHal_open
- *                  function to libnfc-nci.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_open_complete(NFCSTATUS status) {
-  static phLibNfc_Message_t msg;
-
-  if (status == NFCSTATUS_SUCCESS) {
-    msg.eMsgType = NCI_HAL_OPEN_CPLT_MSG;
-    nxpncihal_ctrl.hal_open_status = true;
-  } else {
-    msg.eMsgType = NCI_HAL_ERROR_MSG;
-  }
-
-  msg.pMsgData = NULL;
-  msg.Size = 0;
-
-  phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId,
-                        (phLibNfc_Message_t*)&msg);
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_write
- *
- * Description      This function write the data to NFCC through physical
- *                  interface (e.g. I2C) using the PN54X driver interface.
- *                  Before sending the data to NFCC, phNxpNciHal_write_ext
- *                  is called to check if there is any extension processing
- *                  is required for the NCI packet being sent out.
- *
- * Returns          It returns number of bytes successfully written to NFCC.
- *
- ******************************************************************************/
-int phNxpNciHal_write(uint16_t data_len, const uint8_t* p_data) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  static phLibNfc_Message_t msg;
-  if (nxpncihal_ctrl.halStatus != HAL_STATUS_OPEN) {
-    return NFCSTATUS_FAILED;
-  }
-  /* Create local copy of cmd_data */
-  memcpy(nxpncihal_ctrl.p_cmd_data, p_data, data_len);
-  nxpncihal_ctrl.cmd_len = data_len;
-  if (nxpncihal_ctrl.cmd_len > NCI_MAX_DATA_LEN) {
-    NXPLOG_NCIHAL_D("cmd_len exceeds limit NCI_MAX_DATA_LEN");
-    goto clean_and_return;
-  }
-#ifdef P2P_PRIO_LOGIC_HAL_IMP
-  /* Specific logic to block RF disable when P2P priority logic is busy */
-  if (p_data[0] == 0x21 && p_data[1] == 0x06 && p_data[2] == 0x01 &&
-      EnableP2P_PrioLogic == true) {
-    NXPLOG_NCIHAL_D("P2P priority logic busy: Disable it.");
-    phNxpNciHal_clean_P2P_Prio();
-  }
-#endif
-
-  /* Check for NXP ext before sending write */
-  status =
-      phNxpNciHal_write_ext(&nxpncihal_ctrl.cmd_len, nxpncihal_ctrl.p_cmd_data,
-                            &nxpncihal_ctrl.rsp_len, nxpncihal_ctrl.p_rsp_data);
-  if (status != NFCSTATUS_SUCCESS) {
-    /* Do not send packet to PN54X, send response directly */
-    msg.eMsgType = NCI_HAL_RX_MSG;
-    msg.pMsgData = NULL;
-    msg.Size = 0;
-
-    phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId,
-                          (phLibNfc_Message_t*)&msg);
-    goto clean_and_return;
-  }
-
-  CONCURRENCY_LOCK();
-  data_len = phNxpNciHal_write_unlocked(nxpncihal_ctrl.cmd_len,
-                                        nxpncihal_ctrl.p_cmd_data);
-  CONCURRENCY_UNLOCK();
-
-  if (icode_send_eof == 1) {
-    usleep(10000);
-    icode_send_eof = 2;
-    phNxpNciHal_send_ext_cmd(3, cmd_icode_eof);
-  }
-
-clean_and_return:
-  /* No data written */
-  return data_len;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_write_unlocked
- *
- * Description      This is the actual function which is being called by
- *                  phNxpNciHal_write. This function writes the data to NFCC.
- *                  It waits till write callback provide the result of write
- *                  process.
- *
- * Returns          It returns number of bytes successfully written to NFCC.
- *
- ******************************************************************************/
-int phNxpNciHal_write_unlocked(uint16_t data_len, const uint8_t* p_data) {
-  NFCSTATUS status = NFCSTATUS_INVALID_PARAMETER;
-  phNxpNciHal_Sem_t cb_data;
-  nxpncihal_ctrl.retry_cnt = 0;
-  static uint8_t reset_ntf[] = {0x60, 0x00, 0x06, 0xA0, 0x00,
-                                0xC7, 0xD4, 0x00, 0x00};
-
-  /* Create the local semaphore */
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_write_unlocked Create cb data failed");
-    data_len = 0;
-    goto clean_and_return;
-  }
-
-  /* Create local copy of cmd_data */
-  memcpy(nxpncihal_ctrl.p_cmd_data, p_data, data_len);
-  nxpncihal_ctrl.cmd_len = data_len;
-
-retry:
-
-  data_len = nxpncihal_ctrl.cmd_len;
-
-  status = phTmlNfc_Write(
-      (uint8_t*)nxpncihal_ctrl.p_cmd_data, (uint16_t)nxpncihal_ctrl.cmd_len,
-      (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_write_complete,
-      (void*)&cb_data);
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("write_unlocked status error");
-    data_len = 0;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_NCIHAL_E("write_unlocked semaphore error");
-    data_len = 0;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    data_len = 0;
-    if (nxpncihal_ctrl.retry_cnt++ < MAX_RETRY_COUNT) {
-      NXPLOG_NCIHAL_E(
-          "write_unlocked failed - PN54X Maybe in Standby Mode - Retry");
-      /* 10ms delay to give NFCC wake up delay */
-      usleep(1000 * 10);
-      goto retry;
-    } else {
-      NXPLOG_NCIHAL_E(
-          "write_unlocked failed - PN54X Maybe in Standby Mode (max count = "
-          "0x%x)",
-          nxpncihal_ctrl.retry_cnt);
-
-      status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-
-      if (NFCSTATUS_SUCCESS == status) {
-        NXPLOG_NCIHAL_D("PN54X Reset - SUCCESS\n");
-      } else {
-        NXPLOG_NCIHAL_D("PN54X Reset - FAILED\n");
-      }
-      if (nxpncihal_ctrl.p_nfc_stack_data_cback != NULL &&
-          nxpncihal_ctrl.p_rx_data != NULL &&
-          nxpncihal_ctrl.hal_open_status == true) {
-        NXPLOG_NCIHAL_D(
-            "Send the Core Reset NTF to upper layer, which will trigger the "
-            "recovery\n");
-        // Send the Core Reset NTF to upper layer, which will trigger the
-        // recovery.
-        nxpncihal_ctrl.rx_data_len = sizeof(reset_ntf);
-        memcpy(nxpncihal_ctrl.p_rx_data, reset_ntf, sizeof(reset_ntf));
-        (*nxpncihal_ctrl.p_nfc_stack_data_cback)(nxpncihal_ctrl.rx_data_len,
-                                                 nxpncihal_ctrl.p_rx_data);
-      }
-    }
-  }
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-  return data_len;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_write_complete
- *
- * Description      This function handles write callback.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_write_complete(void* pContext,
-                                       phTmlNfc_TransactInfo_t* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-
-  if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("write successful status = 0x%x", pInfo->wStatus);
-  } else {
-    NXPLOG_NCIHAL_E("write error status = 0x%x", pInfo->wStatus);
-  }
-
-  p_cb_data->status = pInfo->wStatus;
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_read_complete
- *
- * Description      This function is called whenever there is an NCI packet
- *                  received from NFCC. It could be RSP or NTF packet. This
- *                  function provide the received NCI packet to libnfc-nci
- *                  using data callback of libnfc-nci.
- *                  There is a pending read called from each
- *                  phNxpNciHal_read_complete so each a packet received from
- *                  NFCC can be provide to libnfc-nci.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_read_complete(void* pContext,
-                                      phTmlNfc_TransactInfo_t* pInfo) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  UNUSED(pContext);
-  if (nxpncihal_ctrl.read_retry_cnt == 1) {
-    nxpncihal_ctrl.read_retry_cnt = 0;
-  }
-
-  if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("read successful status = 0x%x", pInfo->wStatus);
-
-    nxpncihal_ctrl.p_rx_data = pInfo->pBuff;
-    nxpncihal_ctrl.rx_data_len = pInfo->wLength;
-
-    status = phNxpNciHal_process_ext_rsp(nxpncihal_ctrl.p_rx_data,
-                                         &nxpncihal_ctrl.rx_data_len);
-
-    phNxpNciHal_print_res_status(nxpncihal_ctrl.p_rx_data,
-                                 &nxpncihal_ctrl.rx_data_len);
-    /* Check if response should go to hal module only */
-    if (nxpncihal_ctrl.hal_ext_enabled == TRUE &&
-        (nxpncihal_ctrl.p_rx_data[0x00] & NCI_MT_MASK) == NCI_MT_RSP) {
-      if (status == NFCSTATUS_FAILED) {
-        NXPLOG_NCIHAL_D("enter into NFCC init recovery");
-        nxpncihal_ctrl.ext_cb_data.status = status;
-      }
-      /* Unlock semaphore only for responses*/
-      if ((nxpncihal_ctrl.p_rx_data[0x00] & NCI_MT_MASK) == NCI_MT_RSP ||
-          ((icode_detected == true) && (icode_send_eof == 3))) {
-        /* Unlock semaphore */
-        SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
-      }
-    }  // Notification Checking
-    else if ((nxpncihal_ctrl.hal_ext_enabled == TRUE) &&
-             ((nxpncihal_ctrl.p_rx_data[0x00] & NCI_MT_MASK) == NCI_MT_NTF) &&
-             (nxpncihal_ctrl.nci_info.wait_for_ntf == TRUE)) {
-      /* Unlock semaphore waiting for only  ntf*/
-      SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
-      nxpncihal_ctrl.nci_info.wait_for_ntf = FALSE;
-    }
-    /* Read successful send the event to higher layer */
-    else if ((nxpncihal_ctrl.p_nfc_stack_data_cback != NULL) &&
-             (status == NFCSTATUS_SUCCESS)) {
-      (*nxpncihal_ctrl.p_nfc_stack_data_cback)(nxpncihal_ctrl.rx_data_len,
-                                               nxpncihal_ctrl.p_rx_data);
-    }
-  } else {
-    NXPLOG_NCIHAL_E("read error status = 0x%x", pInfo->wStatus);
-  }
-
-  if (nxpncihal_ctrl.halStatus == HAL_STATUS_CLOSE &&
-      nxpncihal_ctrl.nci_info.wait_for_ntf == FALSE) {
-    NXPLOG_NCIHAL_E(" Ignoring read , HAL close triggered");
-    return;
-  }
-  /* Read again because read must be pending always.*/
-  status = phTmlNfc_Read(
-      Rx_data, NCI_MAX_DATA_LEN,
-      (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_read_complete, NULL);
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("read status error status = %x", status);
-    /* TODO: Not sure how to handle this ? */
-  }
-
-  return;
-}
-
-void read_retry() {
-  /* Read again because read must be pending always.*/
-  NFCSTATUS status = phTmlNfc_Read(
-      Rx_data, NCI_MAX_DATA_LEN,
-      (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_read_complete, NULL);
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("read status error status = %x", status);
-    /* TODO: Not sure how to handle this ? */
-  }
-}
-/******************************************************************************
- * Function         phNxpNciHal_core_initialized
- *
- * Description      This function is called by libnfc-nci after successful open
- *                  of NFCC. All proprietary setting for PN54X are done here.
- *                  After completion of proprietary settings notification is
- *                  provided to libnfc-nci through callback function.
- *
- * Returns          Always returns NFCSTATUS_SUCCESS (0).
- *
- ******************************************************************************/
-int phNxpNciHal_core_initialized(uint8_t* p_core_init_rsp_params) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  static uint8_t p2p_listen_mode_routing_cmd[] = {0x21, 0x01, 0x07, 0x00, 0x01,
-                                                  0x01, 0x03, 0x00, 0x01, 0x05};
-
-  uint8_t swp_full_pwr_mode_on_cmd[] = {0x20, 0x02, 0x05, 0x01,
-                                        0xA0, 0xF1, 0x01, 0x01};
-
-  static uint8_t android_l_aid_matching_mode_on_cmd[] = {
-      0x20, 0x02, 0x05, 0x01, 0xA0, 0x91, 0x01, 0x01};
-  static uint8_t swp_switch_timeout_cmd[] = {0x20, 0x02, 0x06, 0x01, 0xA0,
-                                             0xF3, 0x02, 0x00, 0x00};
-  config_success = true;
-  uint8_t* buffer = NULL;
-  long bufflen = 260;
-  long retlen = 0;
-  int isfound;
-  /* Temp fix to re-apply the proper clock setting */
-  int temp_fix = 1;
-  unsigned long num = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  // initialize dummy FW recovery variables
-  gRecFwRetryCount = 0;
-  gRecFWDwnld = 0;
-#endif
-  // recovery --start
-  /*NCI_INIT_CMD*/
-  static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01,
-                                    0x00};  // keep configuration
-  static uint8_t cmd_init_nci2_0[] = {0x20, 0x01, 0x02, 0x00, 0x00};
-  /* reset config cache */
-  static uint8_t retry_core_init_cnt;
-  if (nxpncihal_ctrl.halStatus != HAL_STATUS_OPEN) {
-    return NFCSTATUS_FAILED;
-  }
-  if ((*p_core_init_rsp_params > 0) &&
-      (*p_core_init_rsp_params < 4))  // initializing for recovery.
-  {
-  retry_core_init:
-    config_access = false;
-    if (buffer != NULL) {
-      free(buffer);
-      buffer = NULL;
-    }
-    if (retry_core_init_cnt > 3) {
-      return NFCSTATUS_FAILED;
-    }
-
-    status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_NCIHAL_D("PN54X Reset - SUCCESS\n");
-    } else {
-      NXPLOG_NCIHAL_D("PN54X Reset - FAILED\n");
-    }
-
-    status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-    if ((status != NFCSTATUS_SUCCESS) &&
-        (nxpncihal_ctrl.retry_cnt >= MAX_RETRY_COUNT)) {
-      NXPLOG_NCIHAL_E("Force FW Download, NFCC not coming out from Standby");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    } else if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NCI_CORE_RESET: Failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-
-    if (*p_core_init_rsp_params == 2) {
-      NXPLOG_NCIHAL_E(" Last command is CORE_RESET!!");
-      goto invoke_callback;
-    }
-    if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-      status =
-          phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
-    } else {
-      status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci), cmd_init_nci);
-    }
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NCI_CORE_INIT : Failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-
-    if (*p_core_init_rsp_params == 3) {
-      NXPLOG_NCIHAL_E(" Last command is CORE_INIT!!");
-      goto invoke_callback;
-    }
-  }
-  // recovery --end
-
-  buffer = (uint8_t*)malloc(bufflen * sizeof(uint8_t));
-  if (NULL == buffer) {
-    return NFCSTATUS_FAILED;
-  }
-  config_access = true;
-  retlen = 0;
-  isfound = GetNxpByteArrayValue(NAME_NXP_ACT_PROP_EXTN, (char*)buffer, bufflen,
-                                 &retlen);
-  if (retlen > 0) {
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP ACT Proprietary Ext failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-  }
-
-  // Check if firmware download success
-  status = phNxpNciHal_get_mw_eeprom();
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("NXP GET MW EEPROM AREA Proprietary Ext failed");
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  }
-
-  //
-  status = phNxpNciHal_check_clock_config();
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("phNxpNciHal_check_clock_config failed");
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  }
-
-#ifdef PN547C2_CLOCK_SETTING
-  if (isNxpConfigModified() || (fw_download_success == 1) ||
-      (phNxpNciClock.issetConfig)
-#if (NFC_NXP_HFO_SETTINGS == TRUE)
-      || temp_fix == 1
-#endif
-      ) {
-    // phNxpNciHal_get_clk_freq();
-    phNxpNciHal_set_clock();
-    phNxpNciClock.issetConfig = false;
-#if (NFC_NXP_HFO_SETTINGS == TRUE)
-    if (temp_fix == 1) {
-      NXPLOG_NCIHAL_D(
-          "Applying Default Clock setting and DPLL register at power on");
-      /*
-      # A0, 0D, 06, 06, 83, 55, 2A, 04, 00 RF_CLIF_CFG_TARGET CLIF_DPLL_GEAR_REG
-      # A0, 0D, 06, 06, 82, 33, 14, 17, 00 RF_CLIF_CFG_TARGET CLIF_DPLL_INIT_REG
-      # A0, 0D, 06, 06, 84, AA, 85, 00, 80 RF_CLIF_CFG_TARGET
-      CLIF_DPLL_INIT_FREQ_REG
-      # A0, 0D, 06, 06, 81, 63, 00, 00, 00 RF_CLIF_CFG_TARGET
-      CLIF_DPLL_CONTROL_REG
-      */
-      static uint8_t cmd_dpll_set_reg_nci[] = {
-          0x20, 0x02, 0x25, 0x04, 0xA0, 0x0D, 0x06, 0x06, 0x83, 0x55,
-          0x2A, 0x04, 0x00, 0xA0, 0x0D, 0x06, 0x06, 0x82, 0x33, 0x14,
-          0x17, 0x00, 0xA0, 0x0D, 0x06, 0x06, 0x84, 0xAA, 0x85, 0x00,
-          0x80, 0xA0, 0x0D, 0x06, 0x06, 0x81, 0x63, 0x00, 0x00, 0x00};
-
-      status = phNxpNciHal_send_ext_cmd(sizeof(cmd_dpll_set_reg_nci),
-                                        cmd_dpll_set_reg_nci);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("NXP DPLL REG ACT Proprietary Ext failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-      /* reset the NFCC after applying the clock setting and DPLL setting */
-      // phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-      temp_fix = 0;
-      goto retry_core_init;
-    }
-#endif
-  }
-#endif
-
-  phNxpNciHal_check_factory_reset();
-  retlen = 0;
-  config_access = true;
-  isfound = GetNxpByteArrayValue(NAME_NXP_NFC_PROFILE_EXTN, (char*)buffer,
-                                 bufflen, &retlen);
-  if (retlen > 0) {
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP ACT Proprietary Ext failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-  }
-
-  if (isNxpConfigModified() || (fw_download_success == 1)) {
-    retlen = 0;
-    fw_download_success = 0;
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    NXPLOG_NCIHAL_D("Performing TVDD Settings");
-    isfound = GetNxpNumValue(NAME_NXP_EXT_TVDD_CFG, &num, sizeof(num));
-    if (isfound > 0) {
-      if (num == 1) {
-        isfound = GetNxpByteArrayValue(NAME_NXP_EXT_TVDD_CFG_1, (char*)buffer,
-                                       bufflen, &retlen);
-        if (retlen > 0) {
-          status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-          if (status != NFCSTATUS_SUCCESS) {
-            NXPLOG_NCIHAL_E("EXT TVDD CFG 1 Settings failed");
-            retry_core_init_cnt++;
-            goto retry_core_init;
-          }
-        }
-      } else if (num == 2) {
-        isfound = GetNxpByteArrayValue(NAME_NXP_EXT_TVDD_CFG_2, (char*)buffer,
-                                       bufflen, &retlen);
-        if (retlen > 0) {
-          status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-          if (status != NFCSTATUS_SUCCESS) {
-            NXPLOG_NCIHAL_E("EXT TVDD CFG 2 Settings failed");
-            retry_core_init_cnt++;
-            goto retry_core_init;
-          }
-        }
-      } else if (num == 3) {
-        isfound = GetNxpByteArrayValue(NAME_NXP_EXT_TVDD_CFG_3, (char*)buffer,
-                                       bufflen, &retlen);
-        if (retlen > 0) {
-          status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-          if (status != NFCSTATUS_SUCCESS) {
-            NXPLOG_NCIHAL_E("EXT TVDD CFG 3 Settings failed");
-            retry_core_init_cnt++;
-            goto retry_core_init;
-          }
-        }
-      } else {
-        NXPLOG_NCIHAL_E("Wrong Configuration Value %ld", num);
-      }
-    }
-#endif
-    retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    config_access = false;
-#endif
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 1");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_1, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 1 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 2");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_2, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 2 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 3");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_3, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 3 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 4");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_4, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 4 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 5");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_5, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 5 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-
-    NXPLOG_NCIHAL_D("Performing RF Settings BLK 6");
-    isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_6, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("RF Settings BLK 6 failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    config_access = true;
-#endif
-    NXPLOG_NCIHAL_D("Performing NAME_NXP_CORE_CONF_EXTN Settings");
-    isfound = GetNxpByteArrayValue(NAME_NXP_CORE_CONF_EXTN, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      /* NXP ACT Proprietary Ext */
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("NXP Core configuration failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-
-    retlen = 0;
-
-    isfound = GetNxpByteArrayValue(NAME_NXP_CORE_MFCKEY_SETTING, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      /* NXP ACT Proprietary Ext */
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("Setting mifare keys failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-
-    retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    config_access = false;
-#endif
-    isfound = GetNxpByteArrayValue(NAME_NXP_CORE_RF_FIELD, (char*)buffer,
-                                   bufflen, &retlen);
-    if (retlen > 0) {
-      /* NXP ACT Proprietary Ext */
-      status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      if (status == NFCSTATUS_SUCCESS) {
-        status = phNxpNciHal_CheckRFCmdRespStatus();
-        /*STATUS INVALID PARAM 0x09*/
-        if (status == 0x09) {
-          phNxpNciHalRFConfigCmdRecSequence();
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else
-#endif
-          if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("Setting NXP_CORE_RF_FIELD status failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    config_access = true;
-#endif
-
-    retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    /* NXP SWP switch timeout Setting*/
-    if (GetNxpNumValue(NAME_NXP_SWP_SWITCH_TIMEOUT, (void*)&retlen,
-                       sizeof(retlen))) {
-      // Check the permissible range [0 - 60]
-      if (0 <= retlen && retlen <= 60) {
-        if (0 < retlen) {
-          unsigned int timeout = retlen * 1000;
-          unsigned int timeoutHx = 0x0000;
-
-          char tmpbuffer[10] = {0};
-          snprintf((char*)tmpbuffer, 10, "%04x", timeout);
-          sscanf((char*)tmpbuffer, "%x", &timeoutHx);
-
-          swp_switch_timeout_cmd[7] = (timeoutHx & 0xFF);
-          swp_switch_timeout_cmd[8] = ((timeoutHx & 0xFF00) >> 8);
-        }
-
-        status = phNxpNciHal_send_ext_cmd(sizeof(swp_switch_timeout_cmd),
-                                          swp_switch_timeout_cmd);
-        if (status != NFCSTATUS_SUCCESS) {
-          NXPLOG_NCIHAL_E("SWP switch timeout Setting Failed");
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      } else {
-        NXPLOG_NCIHAL_E("SWP switch timeout Setting Failed - out of range!");
-      }
-    }
-
-    status = phNxpNciHal_china_tianjin_rf_setting();
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("phNxpNciHal_china_tianjin_rf_setting failed");
-      return NFCSTATUS_FAILED;
-    }
-#endif
-    // Update eeprom value
-    status = phNxpNciHal_set_mw_eeprom();
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP Update MW EEPROM Proprietary Ext failed");
-    }
-  }
-
-  retlen = 0;
-
-  isfound = GetNxpByteArrayValue(NAME_NXP_CORE_STANDBY, (char*)buffer, bufflen,
-                                 &retlen);
-  if (retlen > 0) {
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("Stand by mode enable failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-  }
-  retlen = 0;
-
-  isfound =
-      GetNxpByteArrayValue(NAME_NXP_CORE_CONF, (char*)buffer, bufflen, &retlen);
-  if (retlen > 0) {
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("Core Set Config failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-  }
-
-  config_access = false;
-  // if recovery mode and length of last command is 0 then only reset the P2P
-  // listen mode routing.
-  if ((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4) &&
-      p_core_init_rsp_params[35] == 0) {
-    /* P2P listen mode routing */
-    status = phNxpNciHal_send_ext_cmd(sizeof(p2p_listen_mode_routing_cmd),
-                                      p2p_listen_mode_routing_cmd);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("P2P listen mode routing failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-  }
-
-  retlen = 0;
-
-  /* SWP FULL PWR MODE SETTING ON */
-  if (GetNxpNumValue(NAME_NXP_SWP_FULL_PWR_ON, (void*)&retlen,
-                     sizeof(retlen))) {
-    if (1 == retlen) {
-      status = phNxpNciHal_send_ext_cmd(sizeof(swp_full_pwr_mode_on_cmd),
-                                        swp_full_pwr_mode_on_cmd);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("SWP FULL PWR MODE SETTING ON CMD FAILED");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    } else {
-      swp_full_pwr_mode_on_cmd[7] = 0x00;
-      status = phNxpNciHal_send_ext_cmd(sizeof(swp_full_pwr_mode_on_cmd),
-                                        swp_full_pwr_mode_on_cmd);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("SWP FULL PWR MODE SETTING OFF CMD FAILED");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-  }
-
-  /* Android L AID Matching Platform Setting*/
-  if (GetNxpNumValue(NAME_AID_MATCHING_PLATFORM, (void*)&retlen,
-                     sizeof(retlen))) {
-    if (1 == retlen) {
-      status =
-          phNxpNciHal_send_ext_cmd(sizeof(android_l_aid_matching_mode_on_cmd),
-                                   android_l_aid_matching_mode_on_cmd);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("Android L AID Matching Platform Setting Failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    } else if (2 == retlen) {
-      android_l_aid_matching_mode_on_cmd[7] = 0x00;
-      status =
-          phNxpNciHal_send_ext_cmd(sizeof(android_l_aid_matching_mode_on_cmd),
-                                   android_l_aid_matching_mode_on_cmd);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("Android L AID Matching Platform Setting Failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-  }
-
-  if ((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4)) {
-    static phLibNfc_Message_t msg;
-    uint16_t tmp_len = 0;
-    uint8_t uicc_set_mode[] = {0x22, 0x01, 0x02, 0x02, 0x01};
-    uint8_t set_screen_state[] = {0x2F, 0x15, 01, 00};  // SCREEN ON
-    uint8_t nfcc_core_conn_create[] = {0x20, 0x04, 0x06, 0x03, 0x01,
-                                       0x01, 0x02, 0x01, 0x01};
-    uint8_t nfcc_mode_set_on[] = {0x22, 0x01, 0x02, 0x01, 0x01};
-
-    NXPLOG_NCIHAL_E(
-        "Sending DH and NFCC core connection command as raw packet!!");
-    status = phNxpNciHal_send_ext_cmd(sizeof(nfcc_core_conn_create),
-                                      nfcc_core_conn_create);
-
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E(
-          "Sending DH and NFCC core connection command as raw packet!! Failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-
-    NXPLOG_NCIHAL_E("Sending DH and NFCC mode set as raw packet!!");
-    status =
-        phNxpNciHal_send_ext_cmd(sizeof(nfcc_mode_set_on), nfcc_mode_set_on);
-
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("Sending DH and NFCC mode set as raw packet!! Failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-
-    NXPLOG_NCIHAL_E("Sending UICC Select Command as raw packet!!");
-    status = phNxpNciHal_send_ext_cmd(sizeof(uicc_set_mode), uicc_set_mode);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("Sending UICC Select Command as raw packet!! Failed");
-      retry_core_init_cnt++;
-      goto retry_core_init;
-    }
-
-    if (*(p_core_init_rsp_params + 1) == 1)  // RF state is Discovery!!
-    {
-      NXPLOG_NCIHAL_E("Sending Set Screen ON State Command as raw packet!!");
-      status =
-          phNxpNciHal_send_ext_cmd(sizeof(set_screen_state), set_screen_state);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E(
-            "Sending Set Screen ON State Command as raw packet!! Failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-
-      NXPLOG_NCIHAL_E("Sending discovery as raw packet!!");
-      status = phNxpNciHal_send_ext_cmd(p_core_init_rsp_params[2],
-                                        (uint8_t*)&p_core_init_rsp_params[3]);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("Sending discovery as raw packet Failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-
-    } else {
-      NXPLOG_NCIHAL_E("Sending Set Screen OFF State Command as raw packet!!");
-      set_screen_state[3] = 0x01;  // Screen OFF
-      status =
-          phNxpNciHal_send_ext_cmd(sizeof(set_screen_state), set_screen_state);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E(
-            "Sending Set Screen OFF State Command as raw packet!! Failed");
-        retry_core_init_cnt++;
-        goto retry_core_init;
-      }
-    }
-    NXPLOG_NCIHAL_E("Sending last command for Recovery ");
-
-    if (p_core_init_rsp_params[35] > 0) {  // if length of last command is 0
-                                           // then it doesn't need to send last
-                                           // command.
-      if (!(((p_core_init_rsp_params[36] == 0x21) &&
-             (p_core_init_rsp_params[37] == 0x03)) &&
-            (*(p_core_init_rsp_params + 1) == 1)) &&
-          !((p_core_init_rsp_params[36] == 0x21) &&
-            (p_core_init_rsp_params[37] == 0x06) &&
-            (p_core_init_rsp_params[39] == 0x00) &&
-            (*(p_core_init_rsp_params + 1) == 0x00)))
-      // if last command is discovery and RF status is also discovery state,
-      // then it doesn't need to execute or similarly
-      // if the last command is deactivate to idle and RF status is also idle ,
-      // no need to execute the command .
-      {
-        tmp_len = p_core_init_rsp_params[35];
-
-        /* Check for NXP ext before sending write */
-        status = phNxpNciHal_write_ext(
-            &tmp_len, (uint8_t*)&p_core_init_rsp_params[36],
-            &nxpncihal_ctrl.rsp_len, nxpncihal_ctrl.p_rsp_data);
-        if (status != NFCSTATUS_SUCCESS) {
-          if (buffer) {
-            free(buffer);
-            buffer = NULL;
-          }
-          /* Do not send packet to PN54X, send response directly */
-          msg.eMsgType = NCI_HAL_RX_MSG;
-          msg.pMsgData = NULL;
-          msg.Size = 0;
-
-          phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId,
-                                (phLibNfc_Message_t*)&msg);
-          return NFCSTATUS_SUCCESS;
-        }
-
-        p_core_init_rsp_params[35] = (uint8_t)tmp_len;
-
-        status = phNxpNciHal_send_ext_cmd(
-            p_core_init_rsp_params[35], (uint8_t*)&p_core_init_rsp_params[36]);
-        if (status != NFCSTATUS_SUCCESS) {
-          NXPLOG_NCIHAL_E("Sending last command for Recovery Failed");
-          retry_core_init_cnt++;
-          goto retry_core_init;
-        }
-      }
-    }
-  }
-
-  retry_core_init_cnt = 0;
-
-  if (buffer) {
-    free(buffer);
-    buffer = NULL;
-  }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  // initialize dummy FW recovery variables
-  gRecFWDwnld = 0;
-  gRecFwRetryCount = 0;
-#endif
-  if (!((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4)))
-    phNxpNciHal_core_initialized_complete(status);
-  else {
-  invoke_callback:
-    config_access = false;
-    if (nxpncihal_ctrl.p_nfc_stack_data_cback != NULL) {
-      *p_core_init_rsp_params = 0;
-      NXPLOG_NCIHAL_E("Invoking data callback!!");
-      (*nxpncihal_ctrl.p_nfc_stack_data_cback)(nxpncihal_ctrl.rx_data_len,
-                                               nxpncihal_ctrl.p_rx_data);
-    }
-  }
-
-  if (config_success == false) return NFCSTATUS_FAILED;
-#ifdef PN547C2_CLOCK_SETTING
-  if (isNxpConfigModified()) {
-    updateNxpConfigTimestamp();
-  }
-#endif
-  return NFCSTATUS_SUCCESS;
-}
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-/******************************************************************************
- * Function         phNxpNciHal_CheckRFCmdRespStatus
- *
- * Description      This function is called to check the resp status of
- *                  RF update commands.
- *
- * Returns          NFCSTATUS_SUCCESS           if successful,
- *                  NFCSTATUS_INVALID_PARAMETER if parameter is inavlid
- *                  NFCSTATUS_FAILED            if failed response
- *
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_CheckRFCmdRespStatus() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  static uint16_t INVALID_PARAM = 0x09;
-  if ((nxpncihal_ctrl.rx_data_len > 0) && (nxpncihal_ctrl.p_rx_data[2] > 0)) {
-    if (nxpncihal_ctrl.p_rx_data[3] == 0x09) {
-      status = INVALID_PARAM;
-    } else if (nxpncihal_ctrl.p_rx_data[3] != NFCSTATUS_SUCCESS) {
-      status = NFCSTATUS_FAILED;
-    }
-  }
-  return status;
-}
-/******************************************************************************
- * Function         phNxpNciHalRFConfigCmdRecSequence
- *
- * Description      This function is called to handle dummy FW recovery sequence
- *                  Whenever RF settings are failed to apply with invalid param
- *                  response, recovery mechanism includes dummy firmware
- *download
- *                  followed by firmware download and then config settings. The
- *dummy
- *                  firmware changes the major number of the firmware inside
- *NFCC.
- *                  Then actual firmware dowenload will be successful. This can
- *be
- *                  retried maximum three times.
- *
- * Returns          Always returns NFCSTATUS_SUCCESS
- *
- ******************************************************************************/
-NFCSTATUS phNxpNciHalRFConfigCmdRecSequence() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint16_t recFWState = 1;
-  gRecFWDwnld = true;
-  gRecFwRetryCount++;
-  if (gRecFwRetryCount > 0x03) {
-    NXPLOG_NCIHAL_D("Max retry count for RF config FW recovery exceeded ");
-    gRecFWDwnld = false;
-    return NFCSTATUS_FAILED;
-  }
-  do {
-    status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-    phDnldNfc_InitImgInfo();
-    if (NFCSTATUS_SUCCESS == phNxpNciHal_CheckValidFwVersion()) {
-      fw_download_success = 0;
-      status = phNxpNciHal_fw_download();
-      if (status == NFCSTATUS_SUCCESS) {
-        fw_download_success = 1;
-      }
-      status = phTmlNfc_Read(
-          nxpncihal_ctrl.p_cmd_data, NCI_MAX_DATA_LEN,
-          (pphTmlNfc_TransactCompletionCb_t)&phNxpNciHal_read_complete, NULL);
-      if (status != NFCSTATUS_PENDING) {
-        NXPLOG_NCIHAL_E("TML Read status error status = %x", status);
-        phOsalNfc_Timer_Cleanup();
-        phTmlNfc_Shutdown();
-        status = NFCSTATUS_FAILED;
-      }
-      break;
-    }
-    gRecFWDwnld = false;
-  } while (recFWState--);
-  gRecFWDwnld = false;
-  return status;
-}
-#endif
-/******************************************************************************
- * Function         phNxpNciHal_core_initialized_complete
- *
- * Description      This function is called when phNxpNciHal_core_initialized
- *                  complete all proprietary command exchanges. This function
- *                  informs libnfc-nci about completion of core initialize
- *                  and result of that through callback.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_core_initialized_complete(NFCSTATUS status) {
-  static phLibNfc_Message_t msg;
-
-  if (status == NFCSTATUS_SUCCESS) {
-    msg.eMsgType = NCI_HAL_POST_INIT_CPLT_MSG;
-  } else {
-    msg.eMsgType = NCI_HAL_ERROR_MSG;
-  }
-  msg.pMsgData = NULL;
-  msg.Size = 0;
-
-  phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId,
-                        (phLibNfc_Message_t*)&msg);
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_pre_discover
- *
- * Description      This function is called by libnfc-nci to perform any
- *                  proprietary exchange before RF discovery. When proprietary
- *                  exchange is over completion is informed to libnfc-nci
- *                  through phNxpNciHal_pre_discover_complete function.
- *
- * Returns          It always returns NFCSTATUS_SUCCESS (0).
- *
- ******************************************************************************/
-int phNxpNciHal_pre_discover(void) {
-  /* Nothing to do here for initial version */
-  return NFCSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_pre_discover_complete
- *
- * Description      This function informs libnfc-nci about completion and
- *                  status of phNxpNciHal_pre_discover through callback.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_pre_discover_complete(NFCSTATUS status) {
-  static phLibNfc_Message_t msg;
-
-  if (status == NFCSTATUS_SUCCESS) {
-    msg.eMsgType = NCI_HAL_PRE_DISCOVER_CPLT_MSG;
-  } else {
-    msg.eMsgType = NCI_HAL_ERROR_MSG;
-  }
-  msg.pMsgData = NULL;
-  msg.Size = 0;
-
-  phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &msg);
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_close
- *
- * Description      This function close the NFCC interface and free all
- *                  resources.This is called by libnfc-nci on NFC service stop.
- *
- * Returns          Always return NFCSTATUS_SUCCESS (0).
- *
- ******************************************************************************/
-int phNxpNciHal_close(void) {
-  NFCSTATUS status;
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01, 0x00};
-
-  static uint8_t cmd_ce_disc_nci[] = {0x21, 0x03, 0x07, 0x03, 0x80,
-                                      0x01, 0x81, 0x01, 0x82, 0x01};
-
-  if (nxpncihal_ctrl.halStatus == HAL_STATUS_CLOSE) {
-    NXPLOG_NCIHAL_E("phNxpNciHal_close is already closed, ignoring close");
-    return NFCSTATUS_FAILED;
-  }
-  CONCURRENCY_LOCK();
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_ce_disc_nci), cmd_ce_disc_nci);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("CMD_CE_DISC_NCI: Failed");
-  }
-
-  nxpncihal_ctrl.halStatus = HAL_STATUS_CLOSE;
-
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("NCI_CORE_RESET: Failed");
-  }
-
-  if (NULL != gpphTmlNfc_Context->pDevHandle) {
-    phNxpNciHal_close_complete(NFCSTATUS_SUCCESS);
-    /* Abort any pending read and write */
-    status = phTmlNfc_ReadAbort();
-    status = phTmlNfc_WriteAbort();
-
-    phOsalNfc_Timer_Cleanup();
-
-    status = phTmlNfc_Shutdown();
-
-    phDal4Nfc_msgrelease(nxpncihal_ctrl.gDrvCfg.nClientId);
-
-    memset(&nxpncihal_ctrl, 0x00, sizeof(nxpncihal_ctrl));
-
-    NXPLOG_NCIHAL_D("phNxpNciHal_close - phOsalNfc_DeInit completed");
-  }
-
-  CONCURRENCY_UNLOCK();
-
-  phNxpNciHal_cleanup_monitor();
-
-  /* Return success always */
-  return NFCSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_close_complete
- *
- * Description      This function inform libnfc-nci about result of
- *                  phNxpNciHal_close.
- *
- * Returns          void.
- *
- ******************************************************************************/
-void phNxpNciHal_close_complete(NFCSTATUS status) {
-  static phLibNfc_Message_t msg;
-
-  if (status == NFCSTATUS_SUCCESS) {
-    msg.eMsgType = NCI_HAL_CLOSE_CPLT_MSG;
-  } else {
-    msg.eMsgType = NCI_HAL_ERROR_MSG;
-  }
-  msg.pMsgData = NULL;
-  msg.Size = 0;
-
-  phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &msg);
-
-  return;
-}
-/******************************************************************************
- * Function         phNxpNciHal_notify_i2c_fragmentation
- *
- * Description      This function can be used by HAL to inform
- *                 libnfc-nci that i2c fragmentation is enabled/disabled
- *
- * Returns          void.
- *
- ******************************************************************************/
-void phNxpNciHal_notify_i2c_fragmentation(void) {
-  if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-    /*inform libnfc-nci that i2c fragmentation is enabled/disabled */
-    (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_ENABLE_I2C_FRAGMENTATION_EVT,
-                                        HAL_NFC_STATUS_OK);
-  }
-}
-/******************************************************************************
- * Function         phNxpNciHal_control_granted
- *
- * Description      Called by libnfc-nci when NFCC control is granted to HAL.
- *
- * Returns          Always returns NFCSTATUS_SUCCESS (0).
- *
- ******************************************************************************/
-int phNxpNciHal_control_granted(void) {
-  /* Take the concurrency lock so no other calls from upper layer
-   * will be allowed
-   */
-  CONCURRENCY_LOCK();
-
-  if (NULL != nxpncihal_ctrl.p_control_granted_cback) {
-    (*nxpncihal_ctrl.p_control_granted_cback)();
-  }
-  /* At the end concurrency unlock so calls from upper layer will
-   * be allowed
-   */
-  CONCURRENCY_UNLOCK();
-  return NFCSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_request_control
- *
- * Description      This function can be used by HAL to request control of
- *                  NFCC to libnfc-nci. When control is provided to HAL it is
- *                  notified through phNxpNciHal_control_granted.
- *
- * Returns          void.
- *
- ******************************************************************************/
-void phNxpNciHal_request_control(void) {
-  if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-    /* Request Control of NCI Controller from NCI NFC Stack */
-    (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_REQUEST_CONTROL_EVT,
-                                        HAL_NFC_STATUS_OK);
-  }
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_release_control
- *
- * Description      This function can be used by HAL to release the control of
- *                  NFCC back to libnfc-nci.
- *
- * Returns          void.
- *
- ******************************************************************************/
-void phNxpNciHal_release_control(void) {
-  if (nxpncihal_ctrl.p_nfc_stack_cback != NULL) {
-    /* Release Control of NCI Controller to NCI NFC Stack */
-    (*nxpncihal_ctrl.p_nfc_stack_cback)(HAL_NFC_RELEASE_CONTROL_EVT,
-                                        HAL_NFC_STATUS_OK);
-  }
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_power_cycle
- *
- * Description      This function is called by libnfc-nci when power cycling is
- *                  performed. When processing is complete it is notified to
- *                  libnfc-nci through phNxpNciHal_power_cycle_complete.
- *
- * Returns          Always return NFCSTATUS_SUCCESS (0).
- *
- ******************************************************************************/
-int phNxpNciHal_power_cycle(void) {
-  NXPLOG_NCIHAL_D("Power Cycle");
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  if (nxpncihal_ctrl.halStatus != HAL_STATUS_OPEN) {
-    NXPLOG_NCIHAL_D("Power Cycle failed due to hal status not open");
-    return NFCSTATUS_FAILED;
-  }
-  status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_NCIHAL_D("PN54X Reset - SUCCESS\n");
-  } else {
-    NXPLOG_NCIHAL_D("PN54X Reset - FAILED\n");
-  }
-
-  phNxpNciHal_power_cycle_complete(NFCSTATUS_SUCCESS);
-  return NFCSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_power_cycle_complete
- *
- * Description      This function is called to provide the status of
- *                  phNxpNciHal_power_cycle to libnfc-nci through callback.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_power_cycle_complete(NFCSTATUS status) {
-  static phLibNfc_Message_t msg;
-
-  if (status == NFCSTATUS_SUCCESS) {
-    msg.eMsgType = NCI_HAL_OPEN_CPLT_MSG;
-  } else {
-    msg.eMsgType = NCI_HAL_ERROR_MSG;
-  }
-  msg.pMsgData = NULL;
-  msg.Size = 0;
-
-  phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &msg);
-
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_get_mw_eeprom
- *
- * Description      This function is called to retreive data in mw eeprom area
- *
- * Returns          NFCSTATUS.
- *
- ******************************************************************************/
-static NFCSTATUS phNxpNciHal_get_mw_eeprom(void) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint8_t retry_cnt = 0;
-  static uint8_t get_mw_eeprom_cmd[] = {0x20, 0x03, 0x03, 0x01, 0xA0, 0x0F};
-  uint8_t bConfig;
-
-retry_send_ext:
-  if (retry_cnt > 3) {
-    return NFCSTATUS_FAILED;
-  }
-
-  phNxpNciMwEepromArea.isGetEepromArea = true;
-  status =
-      phNxpNciHal_send_ext_cmd(sizeof(get_mw_eeprom_cmd), get_mw_eeprom_cmd);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("unable to get the mw eeprom data");
-    phNxpNciMwEepromArea.isGetEepromArea = false;
-    retry_cnt++;
-    goto retry_send_ext;
-  }
-  phNxpNciMwEepromArea.isGetEepromArea = false;
-
-  if (phNxpNciMwEepromArea.p_rx_data[12]) {
-    fw_download_success = 1;
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_set_mw_eeprom
- *
- * Description      This function is called to update data in mw eeprom area
- *
- * Returns          void.
- *
- ******************************************************************************/
-static NFCSTATUS phNxpNciHal_set_mw_eeprom(void) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint8_t retry_cnt = 0;
-  uint8_t set_mw_eeprom_cmd[39] = {0};
-  uint8_t cmd_header[] = {0x20, 0x02, 0x24, 0x01, 0xA0, 0x0F, 0x20};
-
-  memcpy(set_mw_eeprom_cmd, cmd_header, sizeof(cmd_header));
-  phNxpNciMwEepromArea.p_rx_data[12] = 0;
-  memcpy(set_mw_eeprom_cmd + sizeof(cmd_header), phNxpNciMwEepromArea.p_rx_data,
-         sizeof(phNxpNciMwEepromArea.p_rx_data));
-
-retry_send_ext:
-  if (retry_cnt > 3) {
-    return NFCSTATUS_FAILED;
-  }
-
-  status =
-      phNxpNciHal_send_ext_cmd(sizeof(set_mw_eeprom_cmd), set_mw_eeprom_cmd);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("unable to update the mw eeprom data");
-    retry_cnt++;
-    goto retry_send_ext;
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_set_clock
- *
- * Description      This function is called after successfull download
- *                  to apply the clock setting provided in config file
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_set_clock(void) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  int retryCount = 0;
-
-retrySetclock:
-  phNxpNciClock.isClockSet = true;
-  if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_PLL) {
-    static uint8_t set_clock_cmd[] = {0x20, 0x02, 0x09, 0x02, 0xA0, 0x03,
-                                      0x01, 0x11, 0xA0, 0x04, 0x01, 0x01};
-#if (NFC_NXP_CHIP_TYPE == PN553)
-    uint8_t param_clock_src = 0x00;
-#else
-    uint8_t param_clock_src = CLK_SRC_PLL;
-    param_clock_src = param_clock_src << 3;
-#endif
-
-    if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_13MHZ) {
-      param_clock_src |= 0x00;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_19_2MHZ) {
-      param_clock_src |= 0x01;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_24MHZ) {
-      param_clock_src |= 0x02;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_26MHZ) {
-      param_clock_src |= 0x03;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_38_4MHZ) {
-      param_clock_src |= 0x04;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_52MHZ) {
-      param_clock_src |= 0x05;
-    } else {
-      NXPLOG_NCIHAL_E("Wrong clock freq, send default PLL@19.2MHz");
-#if (NFC_NXP_CHIP_TYPE == PN553)
-      param_clock_src = 0x01;
-#else
-      param_clock_src = 0x11;
-#endif
-    }
-
-    set_clock_cmd[7] = param_clock_src;
-    set_clock_cmd[11] = nxpprofile_ctrl.bTimeout;
-    status = phNxpNciHal_send_ext_cmd(sizeof(set_clock_cmd), set_clock_cmd);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("PLL colck setting failed !!");
-    }
-  } else if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_XTAL) {
-    static uint8_t set_clock_cmd[] = {0x20, 0x02, 0x05, 0x01,
-                                      0xA0, 0x03, 0x01, 0x08};
-    status = phNxpNciHal_send_ext_cmd(sizeof(set_clock_cmd), set_clock_cmd);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("XTAL colck setting failed !!");
-    }
-  } else {
-    NXPLOG_NCIHAL_E("Wrong clock source. Dont apply any modification")
-  }
-
-  // Checking for SET CONFG SUCCESS, re-send the command  if not.
-  phNxpNciClock.isClockSet = false;
-  if (phNxpNciClock.p_rx_data[3] != NFCSTATUS_SUCCESS) {
-    if (retryCount++ < 3) {
-      NXPLOG_NCIHAL_E("Set-clk failed retry again ");
-      goto retrySetclock;
-    } else {
-      NXPLOG_NCIHAL_D("Set clk  failed -  max count = 0x%x exceeded ",
-                      retryCount);
-      //            NXPLOG_NCIHAL_E("Set Config is failed for Clock Due to
-      //            elctrical disturbances, aborting the NFC process");
-      //            abort ();
-    }
-  }
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_check_clock_config
- *
- * Description      This function is called after successfull download
- *                  to check if clock settings in config file and chip
- *                  is same
- *
- * Returns          void.
- *
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_check_clock_config(void) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint8_t param_clock_src;
-  static uint8_t get_clock_cmd[] = {0x20, 0x03, 0x07, 0x03, 0xA0,
-                                    0x02, 0xA0, 0x03, 0xA0, 0x04};
-  phNxpNciClock.isClockSet = true;
-  phNxpNciHal_get_clk_freq();
-  status = phNxpNciHal_send_ext_cmd(sizeof(get_clock_cmd), get_clock_cmd);
-
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("unable to retrieve get_clk_src_sel");
-    return status;
-  }
-  param_clock_src = check_config_parameter();
-  if (phNxpNciClock.p_rx_data[12] == param_clock_src &&
-      phNxpNciClock.p_rx_data[16] == nxpprofile_ctrl.bTimeout) {
-    phNxpNciClock.issetConfig = false;
-  } else {
-    phNxpNciClock.issetConfig = true;
-  }
-  phNxpNciClock.isClockSet = false;
-
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_china_tianjin_rf_setting
- *
- * Description      This function is called to check RF Setting
- *
- * Returns          Status.
- *
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_china_tianjin_rf_setting(void) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  int isfound = 0;
-  int rf_enable = false;
-  int rf_val = 0;
-  int send_flag;
-  uint8_t retry_cnt = 0;
-  int enable_bit = 0;
-  static uint8_t get_rf_cmd[] = {0x20, 0x03, 0x03, 0x01, 0xA0, 0x85};
-
-retry_send_ext:
-  if (retry_cnt > 3) {
-    return NFCSTATUS_FAILED;
-  }
-  send_flag = true;
-  phNxpNciRfSet.isGetRfSetting = true;
-  status = phNxpNciHal_send_ext_cmd(sizeof(get_rf_cmd), get_rf_cmd);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("unable to get the RF setting");
-    phNxpNciRfSet.isGetRfSetting = false;
-    retry_cnt++;
-    goto retry_send_ext;
-  }
-  phNxpNciRfSet.isGetRfSetting = false;
-  if (phNxpNciRfSet.p_rx_data[3] != 0x00) {
-    NXPLOG_NCIHAL_E("GET_CONFIG_RSP is FAILED for CHINA TIANJIN");
-    return status;
-  }
-  rf_val = phNxpNciRfSet.p_rx_data[10];
-  isfound = (GetNxpNumValue(NAME_NXP_CHINA_TIANJIN_RF_ENABLED,
-                            (void*)&rf_enable, sizeof(rf_enable)));
-  if (isfound > 0) {
-    enable_bit = rf_val & 0x40;
-    if ((enable_bit != 0x40) && (rf_enable == 1)) {
-      phNxpNciRfSet.p_rx_data[10] |= 0x40;  // Enable if it is disabled
-    } else if ((enable_bit == 0x40) && (rf_enable == 0)) {
-      phNxpNciRfSet.p_rx_data[10] &= 0xBF;  // Disable if it is Enabled
-    } else {
-      send_flag = false;  // No need to change in RF setting
-    }
-
-    if (send_flag == true) {
-      static uint8_t set_rf_cmd[] = {0x20, 0x02, 0x08, 0x01, 0xA0, 0x85,
-                                     0x04, 0x50, 0x08, 0x68, 0x00};
-      memcpy(&set_rf_cmd[4], &phNxpNciRfSet.p_rx_data[5], 7);
-      status = phNxpNciHal_send_ext_cmd(sizeof(set_rf_cmd), set_rf_cmd);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("unable to set the RF setting");
-        retry_cnt++;
-        goto retry_send_ext;
-      }
-    }
-  }
-
-  return status;
-}
-
-int check_config_parameter() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  uint8_t param_clock_src = CLK_SRC_PLL;
-  if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_PLL) {
-#if (NFC_NXP_CHIP_TYPE != PN553)
-    param_clock_src = param_clock_src << 3;
-#endif
-    if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_13MHZ) {
-      param_clock_src |= 0x00;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_19_2MHZ) {
-      param_clock_src |= 0x01;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_24MHZ) {
-      param_clock_src |= 0x02;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_26MHZ) {
-      param_clock_src |= 0x03;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_38_4MHZ) {
-      param_clock_src |= 0x04;
-    } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_52MHZ) {
-      param_clock_src |= 0x05;
-    } else {
-      NXPLOG_NCIHAL_E("Wrong clock freq, send default PLL@19.2MHz");
-      param_clock_src = 0x11;
-    }
-  } else if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_XTAL) {
-    param_clock_src = 0x08;
-
-  } else {
-    NXPLOG_NCIHAL_E("Wrong clock source. Dont apply any modification")
-  }
-  return param_clock_src;
-}
-/******************************************************************************
- * Function         phNxpNciHal_enable_i2c_fragmentation
- *
- * Description      This function is called to process the response status
- *                  and print the status byte.
- *
- * Returns          void.
- *
- ******************************************************************************/
-void phNxpNciHal_enable_i2c_fragmentation() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  static uint8_t fragmentation_enable_config_cmd[] = {0x20, 0x02, 0x05, 0x01,
-                                                      0xA0, 0x05, 0x01, 0x10};
-  int isfound = 0;
-  long i2c_status = 0x00;
-  long config_i2c_vlaue = 0xff;
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01, 0x00};
-  /*NCI_INIT_CMD*/
-  static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
-  static uint8_t cmd_init_nci2_0[] = {0x20, 0x01, 0x02, 0x00, 0x00};
-  static uint8_t get_i2c_fragmentation_cmd[] = {0x20, 0x03, 0x03,
-                                                0x01, 0xA0, 0x05};
-  isfound = (GetNxpNumValue(NAME_NXP_I2C_FRAGMENTATION_ENABLED,
-                            (void*)&i2c_status, sizeof(i2c_status)));
-  status = phNxpNciHal_send_ext_cmd(sizeof(get_i2c_fragmentation_cmd),
-                                    get_i2c_fragmentation_cmd);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("unable to retrieve  get_i2c_fragmentation_cmd");
-  } else {
-    if (nxpncihal_ctrl.p_rx_data[8] == 0x10) {
-      config_i2c_vlaue = 0x01;
-      phNxpNciHal_notify_i2c_fragmentation();
-      phTmlNfc_set_fragmentation_enabled(I2C_FRAGMENTATION_ENABLED);
-    } else if (nxpncihal_ctrl.p_rx_data[8] == 0x00) {
-      config_i2c_vlaue = 0x00;
-    }
-    if (config_i2c_vlaue == i2c_status) {
-      NXPLOG_NCIHAL_E("i2c_fragmentation_status existing");
-    } else {
-      if (i2c_status == 0x01) {
-        /* NXP I2C fragmenation enabled*/
-        status =
-            phNxpNciHal_send_ext_cmd(sizeof(fragmentation_enable_config_cmd),
-                                     fragmentation_enable_config_cmd);
-        if (status != NFCSTATUS_SUCCESS) {
-          NXPLOG_NCIHAL_E("NXP fragmentation enable failed");
-        }
-      } else if (i2c_status == 0x00 || config_i2c_vlaue == 0xff) {
-        fragmentation_enable_config_cmd[7] = 0x00;
-        /* NXP I2C fragmentation disabled*/
-        status =
-            phNxpNciHal_send_ext_cmd(sizeof(fragmentation_enable_config_cmd),
-                                     fragmentation_enable_config_cmd);
-        if (status != NFCSTATUS_SUCCESS) {
-          NXPLOG_NCIHAL_E("NXP fragmentation disable failed");
-        }
-      }
-      status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("NCI_CORE_RESET: Failed");
-      }
-      if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-        status =
-            phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
-      } else {
-        status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci), cmd_init_nci);
-      }
-      if (status != NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_E("NCI_CORE_INIT : Failed");
-      } else if (i2c_status == 0x01) {
-        phNxpNciHal_notify_i2c_fragmentation();
-        phTmlNfc_set_fragmentation_enabled(I2C_FRAGMENTATION_ENABLED);
-      }
-    }
-  }
-}
-/******************************************************************************
- * Function         phNxpNciHal_check_factory_reset
- *
- * Description      This function is called at init time to check
- *                  the presence of ese related info. If file are not
- *                  present set the SWP_INT_SESSION_ID_CFG to FF to
- *                  force the NFCEE to re-run its initialization sequence.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_check_factory_reset(void) {
-  struct stat st;
-  int ret = 0;
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  const char config_eseinfo_path[] = "/data/nfc/nfaStorage.bin1";
-  static uint8_t reset_ese_session_identity_set[] = {
-      0x20, 0x02, 0x17, 0x02, 0xA0, 0xEA, 0x08, 0xFF, 0xFF,
-      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0xEB, 0x08,
-      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
-#ifdef PN547C2_FACTORY_RESET_DEBUG
-  static uint8_t reset_ese_session_identity[] = {0x20, 0x03, 0x05, 0x02,
-                                                 0xA0, 0xEA, 0xA0, 0xEB};
-#endif
-  if (stat(config_eseinfo_path, &st) == -1) {
-    NXPLOG_NCIHAL_D("%s file not present = %s", __func__, config_eseinfo_path);
-    ret = -1;
-  } else {
-    ret = 0;
-  }
-
-  if (ret == -1) {
-#ifdef PN547C2_FACTORY_RESET_DEBUG
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(sizeof(reset_ese_session_identity),
-                                      reset_ese_session_identity);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP reset_ese_session_identity command failed");
-    }
-#endif
-    status = phNxpNciHal_send_ext_cmd(sizeof(reset_ese_session_identity_set),
-                                      reset_ese_session_identity_set);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP reset_ese_session_identity_set command failed");
-    }
-#ifdef PN547C2_FACTORY_RESET_DEBUG
-    /* NXP ACT Proprietary Ext */
-    status = phNxpNciHal_send_ext_cmd(sizeof(reset_ese_session_identity),
-                                      reset_ese_session_identity);
-    if (status != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_E("NXP reset_ese_session_identity command failed");
-    }
-#endif
-  }
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_print_res_status
- *
- * Description      This function is called to process the response status
- *                  and print the status byte.
- *
- * Returns          void.
- *
- ******************************************************************************/
-static void phNxpNciHal_print_res_status(uint8_t* p_rx_data, uint16_t* p_len) {
-  static uint8_t response_buf[][30] = {"STATUS_OK",
-                                       "STATUS_REJECTED",
-                                       "STATUS_RF_FRAME_CORRUPTED",
-                                       "STATUS_FAILED",
-                                       "STATUS_NOT_INITIALIZED",
-                                       "STATUS_SYNTAX_ERROR",
-                                       "STATUS_SEMANTIC_ERROR",
-                                       "RFU",
-                                       "RFU",
-                                       "STATUS_INVALID_PARAM",
-                                       "STATUS_MESSAGE_SIZE_EXCEEDED",
-                                       "STATUS_UNDEFINED"};
-  int status_byte;
-  if (p_rx_data[0] == 0x40 && (p_rx_data[1] == 0x02 || p_rx_data[1] == 0x03)) {
-    if (p_rx_data[2] && p_rx_data[3] <= 10) {
-      status_byte = p_rx_data[CORE_RES_STATUS_BYTE];
-      NXPLOG_NCIHAL_D("%s: response status =%s", __func__,
-                      response_buf[status_byte]);
-    } else {
-      NXPLOG_NCIHAL_D("%s: response status =%s", __func__, response_buf[11]);
-    }
-    if (phNxpNciClock.isClockSet) {
-      int i;
-      for (i = 0; i < *p_len; i++) {
-        phNxpNciClock.p_rx_data[i] = p_rx_data[i];
-      }
-    }
-
-    else if (phNxpNciRfSet.isGetRfSetting) {
-      int i;
-      for (i = 0; i < *p_len; i++) {
-        phNxpNciRfSet.p_rx_data[i] = p_rx_data[i];
-        // NXPLOG_NCIHAL_D("%s: response status =0x%x",__func__,p_rx_data[i]);
-      }
-    } else if (phNxpNciMwEepromArea.isGetEepromArea) {
-      int i;
-      for (i = 8; i < *p_len; i++) {
-        phNxpNciMwEepromArea.p_rx_data[i - 8] = p_rx_data[i];
-      }
-    }
-  }
-
-  if (p_rx_data[2] && (config_access == true)) {
-    if (p_rx_data[3] != NFCSTATUS_SUCCESS) {
-      NXPLOG_NCIHAL_W("Invalid Data from config file.");
-      config_success = false;
-    }
-  }
-}
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-NFCSTATUS phNxpNciHal_core_reset_recovery() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-
-  uint8_t buffer[260];
-  long bufflen = 260;
-
-  /*NCI_INIT_CMD*/
-  static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
-  /*NCI_RESET_CMD*/
-  static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01,
-                                    0x00};  // keep configuration
-  static uint8_t cmd_init_nci2_0[] = {0x20, 0x01, 0x02, 0x00, 0x00};
-  /* reset config cache */
-  uint8_t retry_core_init_cnt = 0;
-
-  if (discovery_cmd_len == 0) {
-    goto FAILURE;
-  }
-  NXPLOG_NCIHAL_D("%s: recovery", __func__);
-
-retry_core_init:
-  if (retry_core_init_cnt > 3) {
-    goto FAILURE;
-  }
-
-  status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("PN54X Reset - FAILED\n");
-    goto FAILURE;
-  }
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-  if ((status != NFCSTATUS_SUCCESS) &&
-      (nxpncihal_ctrl.retry_cnt >= MAX_RETRY_COUNT)) {
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  } else if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("NCI_CORE_RESET: Failed");
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  }
-  if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-    status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
-  } else {
-    status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci), cmd_init_nci);
-  }
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("NCI_CORE_INIT : Failed");
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  }
-
-  status = phNxpNciHal_send_ext_cmd(discovery_cmd_len, discovery_cmd);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("RF_DISCOVERY : Failed");
-    retry_core_init_cnt++;
-    goto retry_core_init;
-  }
-
-  return NFCSTATUS_SUCCESS;
-FAILURE:
-  abort();
-}
-
-void phNxpNciHal_discovery_cmd_ext(uint8_t* p_cmd_data, uint16_t cmd_len) {
-  NXPLOG_NCIHAL_D("phNxpNciHal_discovery_cmd_ext");
-  if (cmd_len > 0 && cmd_len <= sizeof(discovery_cmd)) {
-    memcpy(discovery_cmd, p_cmd_data, cmd_len);
-    discovery_cmd_len = cmd_len;
-  }
-}
-#endif
diff --git a/halimpl/pn54x/hal/phNxpNciHal.h b/halimpl/pn54x/hal/phNxpNciHal.h
deleted file mode 100644
index 00ec236..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_H_
-#define _PHNXPNCIHAL_H_
-
-#include <hardware/nfc.h>
-#include <phNxpNciHal_utils.h>
-
-/********************* Definitions and structures *****************************/
-#define MAX_RETRY_COUNT 5
-#define NCI_MAX_DATA_LEN 300
-#define NCI_POLL_DURATION 500
-#define HAL_NFC_ENABLE_I2C_FRAGMENTATION_EVT 0x07
-#undef P2P_PRIO_LOGIC_HAL_IMP
-#define NCI_VERSION_2_0 0x20
-#define NCI_VERSION_1_1 0x11
-#define NCI_VERSION_1_0 0x10
-#define NCI_VERSION_UNKNOWN 0x00
-typedef void(phNxpNciHal_control_granted_callback_t)();
-
-/*ROM CODE VERSION FW*/
-#define FW_MOBILE_ROM_VERSION_PN551 0x10
-#define FW_MOBILE_ROM_VERSION_PN553 0x11
-#define FW_MOBILE_ROM_VERSION_PN548AD 0x10
-#define FW_MOBILE_ROM_VERSION_PN547C2 0x08
-/* NCI Data */
-
-#define NCI_MT_CMD 0x20
-#define NCI_MT_RSP 0x40
-#define NCI_MT_NTF 0x60
-
-#define CORE_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED 0x02
-#define CORE_RESET_TRIGGER_TYPE_POWERED_ON 0x01
-#define NCI_MSG_CORE_RESET 0x00
-#define NCI_MSG_CORE_INIT 0x01
-#define NCI_MT_MASK 0xE0
-#define NCI_OID_MASK 0x3F
-typedef struct nci_data {
-  uint16_t len;
-  uint8_t p_data[NCI_MAX_DATA_LEN];
-} nci_data_t;
-
-typedef enum { HAL_STATUS_CLOSE = 0, HAL_STATUS_OPEN } phNxpNci_HalStatus;
-
-/* Macros to enable and disable extensions */
-#define HAL_ENABLE_EXT() (nxpncihal_ctrl.hal_ext_enabled = 1)
-#define HAL_DISABLE_EXT() (nxpncihal_ctrl.hal_ext_enabled = 0)
-typedef struct phNxpNciInfo {
-  uint8_t nci_version;
-  bool_t wait_for_ntf;
-} phNxpNciInfo_t;
-/* NCI Control structure */
-typedef struct phNxpNciHal_Control {
-  phNxpNci_HalStatus halStatus; /* Indicate if hal is open or closed */
-  pthread_t client_thread;      /* Integration thread handle */
-  uint8_t thread_running;       /* Thread running if set to 1, else set to 0 */
-  phLibNfc_sConfig_t gDrvCfg;   /* Driver config data */
-
-  /* Rx data */
-  uint8_t* p_rx_data;
-  uint16_t rx_data_len;
-
-  /* libnfc-nci callbacks */
-  nfc_stack_callback_t* p_nfc_stack_cback;
-  nfc_stack_data_callback_t* p_nfc_stack_data_cback;
-
-  /* control granted callback */
-  phNxpNciHal_control_granted_callback_t* p_control_granted_cback;
-
-  /* HAL open status */
-  bool_t hal_open_status;
-
-  /* HAL extensions */
-  uint8_t hal_ext_enabled;
-
-  /* Waiting semaphore */
-  phNxpNciHal_Sem_t ext_cb_data;
-
-  uint16_t cmd_len;
-  uint8_t p_cmd_data[NCI_MAX_DATA_LEN];
-  uint16_t rsp_len;
-  uint8_t p_rsp_data[NCI_MAX_DATA_LEN];
-
-  /* retry count used to force download */
-  uint16_t retry_cnt;
-  uint8_t read_retry_cnt;
-  phNxpNciInfo_t nci_info;
-} phNxpNciHal_Control_t;
-
-typedef struct phNxpNciClock {
-  bool_t isClockSet;
-  uint8_t p_rx_data[20];
-  bool_t issetConfig;
-} phNxpNciClock_t;
-
-typedef struct phNxpNciRfSetting {
-  bool_t isGetRfSetting;
-  uint8_t p_rx_data[20];
-} phNxpNciRfSetting_t;
-
-typedef struct phNxpNciMwEepromArea {
-  bool_t isGetEepromArea;
-  uint8_t p_rx_data[32];
-} phNxpNciMwEepromArea_t;
-
-typedef enum {
-  NFC_FORUM_PROFILE,
-  EMV_CO_PROFILE,
-  INVALID_PROFILe
-} phNxpNciProfile_t;
-/* NXP Poll Profile control structure */
-typedef struct phNxpNciProfile_Control {
-  phNxpNciProfile_t profile_type;
-  uint8_t bClkSrcVal; /* Holds the System clock source read from config file */
-  uint8_t
-      bClkFreqVal;  /* Holds the System clock frequency read from config file */
-  uint8_t bTimeout; /* Holds the Timeout Value */
-} phNxpNciProfile_Control_t;
-
-/* Internal messages to handle callbacks */
-#define NCI_HAL_OPEN_CPLT_MSG 0x411
-#define NCI_HAL_CLOSE_CPLT_MSG 0x412
-#define NCI_HAL_POST_INIT_CPLT_MSG 0x413
-#define NCI_HAL_PRE_DISCOVER_CPLT_MSG 0x414
-#define NCI_HAL_ERROR_MSG 0x415
-#define NCI_HAL_RX_MSG 0xF01
-
-#define NCIHAL_CMD_CODE_LEN_BYTE_OFFSET (2U)
-#define NCIHAL_CMD_CODE_BYTE_LEN (3U)
-
-/******************** NCI HAL exposed functions *******************************/
-
-void phNxpNciHal_request_control(void);
-void phNxpNciHal_release_control(void);
-int phNxpNciHal_write_unlocked(uint16_t data_len, const uint8_t* p_data);
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-NFCSTATUS phNxpNciHal_core_reset_recovery();
-void phNxpNciHal_discovery_cmd_ext(uint8_t* p_cmd_data, uint16_t cmd_len);
-#endif
-#endif /* _PHNXPNCIHAL_H_ */
diff --git a/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.c b/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.c
deleted file mode 100644
index 4243904..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.c
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <phNxpLog.h>
-#include <phNxpNciHal.h>
-#include <phNxpNciHal_NfcDepSWPrio.h>
-
-/* Timeout value to wait for NFC-DEP detection.*/
-#define CUSTOM_POLL_TIMEOUT 160
-#define CLEAN_UP_TIMEOUT 250
-#define MAX_WRITE_RETRY 5
-
-/******************* Global variables *****************************************/
-extern phNxpNciHal_Control_t nxpncihal_ctrl;
-extern NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd);
-static uint8_t cmd_stop_rf_discovery[] = {0x21, 0x06, 0x01, 0x00}; /* IDLE */
-static uint8_t cmd_resume_rf_discovery[] = {0x21, 0x06, 0x01,
-                                            0x03}; /* RF_DISCOVER */
-
-/*RF_DISCOVER_SELECT_CMD*/
-static uint8_t cmd_select_rf_discovery[] = {0x21, 0x04, 0x03, 0x01, 0x04, 0x02};
-
-static uint8_t cmd_poll[64];
-static uint8_t cmd_poll_len = 0;
-int discover_type = 0xFF;
-uint32_t cleanup_timer;
-
-/*PRIO LOGIC related dead functions undefined*/
-#ifdef P2P_PRIO_LOGIC_HAL_IMP
-
-static int iso_dep_detected = 0x00;
-static int poll_timer_fired = 0x00;
-static uint8_t bIgnorep2plogic = 0;
-static uint8_t* p_iso_ntf_buff = NULL; /* buffer to store second notification */
-static uint8_t bIgnoreIsoDep = 0;
-static uint32_t custom_poll_timer;
-
-/************** NFC-DEP SW PRIO functions *************************************/
-
-static NFCSTATUS phNxpNciHal_start_polling_loop(void);
-static NFCSTATUS phNxpNciHal_stop_polling_loop(void);
-static NFCSTATUS phNxpNciHal_resume_polling_loop(void);
-static void phNxpNciHal_NfcDep_store_ntf(uint8_t* p_cmd_data, uint16_t cmd_len);
-
-/*******************************************************************************
-**
-** Function         cleanup_timer_handler
-**
-** Description      Callback function for cleanup timer.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void cleanup_timer_handler(uint32_t timerId, void* pContext) {
-  NXPLOG_NCIHAL_D(">> cleanup_timer_handler.");
-
-  NXPLOG_NCIHAL_D(
-      ">> cleanup_timer_handler. ISO_DEP not detected second time.");
-
-  phOsalNfc_Timer_Delete(cleanup_timer);
-  cleanup_timer = 0;
-  iso_dep_detected = 0x00;
-  EnableP2P_PrioLogic = false;
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         custom_poll_timer_handler
-**
-** Description      Callback function for custom poll timer.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void custom_poll_timer_handler(uint32_t timerId, void* pContext) {
-  NXPLOG_NCIHAL_D(">> custom_poll_timer_handler.");
-
-  NXPLOG_NCIHAL_D(
-      ">> custom_poll_timer_handler. NFC_DEP not detected. so giving early "
-      "chance to ISO_DEP.");
-
-  phOsalNfc_Timer_Delete(custom_poll_timer);
-
-  if (iso_dep_detected == 0x01) {
-    poll_timer_fired = 0x01;
-
-    /*
-     * Restart polling loop.
-     * When the polling loop is stopped, polling will be restarted.
-     */
-    NXPLOG_NCIHAL_D(">> custom_poll_timer_handler - restart polling loop.");
-
-    phNxpNciHal_stop_polling_loop();
-  } else {
-    NXPLOG_NCIHAL_E(
-        ">> custom_poll_timer_handler - invalid flag state (iso_dep_detected)");
-  }
-
-  return;
-}
-/*******************************************************************************
-**
-** Function         phNxpNciHal_stop_polling_loop
-**
-** Description      Sends stop polling cmd to NFCC
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_stop_polling_loop() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  pthread_t pthread;
-  discover_type = STOP_POLLING;
-
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&pthread, &attr, tmp_thread, (void*)&discover_type) != 0) {
-    NXPLOG_NCIHAL_E("fail to create pthread");
-  }
-  pthread_attr_destroy(&attr);
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_resume_polling_loop
-**
-** Description      Sends resume polling cmd to NFCC
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_resume_polling_loop() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  pthread_t pthread;
-  discover_type = RESUME_POLLING;
-
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&pthread, &attr, tmp_thread, (void*)&discover_type) != 0) {
-    NXPLOG_NCIHAL_E("fail to create pthread");
-  }
-  pthread_attr_destroy(&attr);
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_start_polling_loop
-**
-** Description      Sends start polling cmd to NFCC
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_start_polling_loop() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  phNxpNciHal_Sem_t cb_data;
-  pthread_t pthread;
-  discover_type = START_POLLING;
-
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&pthread, &attr, tmp_thread, (void*)&discover_type) != 0) {
-    NXPLOG_NCIHAL_E("fail to create pthread");
-  }
-  pthread_attr_destroy(&attr);
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_NfcDep_rsp_ext
-**
-** Description      Implements algorithm for NFC-DEP protocol priority over
-**                  ISO-DEP protocol.
-**                  Following the algorithm:
-**                  IF ISO-DEP detected first time,set the ISO-DEP detected flag
-**                  and resume polling loop with 60ms timeout value.
-**                      a) if than NFC-DEP detected than send the response to
-**                         libnfc-nci stack and stop the timer.
-**                      b) if NFC-DEP not detected with in 60ms, than restart
-**                         the polling loop to give early chance to ISO-DEP with
-**                         a cleanup timer.
-**                      c) if ISO-DEP detected second time send the response to
-**                         libnfc-nci stack and stop the cleanup timer.
-**                      d) if ISO-DEP not detected with in cleanup timeout, than
-**                         clear the ISO-DEP detection flag.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_NfcDep_rsp_ext(uint8_t* p_ntf, uint16_t* p_len) {
-  NFCSTATUS status = NFCSTATUS_INVALID_PARAMETER;
-
-  NXPLOG_NCIHAL_D(">> p_ntf[0]=%02x , p_ntf[1]=%02x", p_ntf[0], p_ntf[1]);
-
-  if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04) {
-    // Tag selected, Disable P2P Prio logic.
-    bIgnoreIsoDep = 1;
-    NXPLOG_NCIHAL_D(">> Tag selected, Disable P2P Prio logic.");
-
-  } else if (((p_ntf[0] == 0x61 && p_ntf[1] == 0x06) ||
-              (p_ntf[0] == 0x41 && p_ntf[1] == 0x06)) &&
-             bIgnoreIsoDep == 1) {
-    // Tag deselected, enable P2P Prio logic.
-    bIgnoreIsoDep = 0x00;
-    NXPLOG_NCIHAL_D(">> Tag deselected, enable P2P Prio logic.");
-  }
-  if (bIgnoreIsoDep == 0x00 && p_ntf[0] == 0x61 && p_ntf[1] == 0x05 &&
-      *p_len > 5) {
-    if (p_ntf[5] == 0x04 && p_ntf[6] < 0x80) {
-      NXPLOG_NCIHAL_D(">> ISO DEP detected.");
-
-      if (iso_dep_detected == 0x00) {
-        NXPLOG_NCIHAL_D(">> ISO DEP detected first time. Resume polling loop");
-
-        iso_dep_detected = 0x01;
-        status = phNxpNciHal_resume_polling_loop();
-
-        custom_poll_timer = phOsalNfc_Timer_Create();
-        NXPLOG_NCIHAL_D("custom poll timer started - %d", custom_poll_timer);
-
-        status = phOsalNfc_Timer_Start(custom_poll_timer, CUSTOM_POLL_TIMEOUT,
-                                       &custom_poll_timer_handler, NULL);
-
-        if (NFCSTATUS_SUCCESS == status) {
-          NXPLOG_NCIHAL_D("custom poll timer started");
-        } else {
-          NXPLOG_NCIHAL_E("custom poll timer not started!!!");
-          status = NFCSTATUS_FAILED;
-        }
-
-        status = NFCSTATUS_FAILED;
-      } else {
-        NXPLOG_NCIHAL_D(">> ISO DEP detected second time.");
-        /* Store notification */
-        phNxpNciHal_NfcDep_store_ntf(p_ntf, *p_len);
-
-        /* Stop Cleanup_timer */
-        phOsalNfc_Timer_Stop(cleanup_timer);
-        phOsalNfc_Timer_Delete(cleanup_timer);
-        cleanup_timer = 0;
-        EnableP2P_PrioLogic = false;
-        iso_dep_detected = 0;
-        status = NFCSTATUS_SUCCESS;
-      }
-    } else if (p_ntf[5] == 0x05) {
-      NXPLOG_NCIHAL_D(">> NFC-DEP Detected - stopping the custom poll timer");
-
-      phOsalNfc_Timer_Stop(custom_poll_timer);
-      phOsalNfc_Timer_Delete(custom_poll_timer);
-      EnableP2P_PrioLogic = false;
-      iso_dep_detected = 0;
-      status = NFCSTATUS_SUCCESS;
-    } else {
-      NXPLOG_NCIHAL_D(
-          ">>  detected other technology- stopping the custom poll timer");
-      phOsalNfc_Timer_Stop(custom_poll_timer);
-      phOsalNfc_Timer_Delete(custom_poll_timer);
-      EnableP2P_PrioLogic = false;
-      iso_dep_detected = 0;
-      status = NFCSTATUS_INVALID_PARAMETER;
-    }
-  } else if (bIgnoreIsoDep == 0x00 &&
-             ((p_ntf[0] == 0x41 && p_ntf[1] == 0x06) ||
-              (p_ntf[0] == 0x61 && p_ntf[1] == 0x06))) {
-    NXPLOG_NCIHAL_D(">> RF disabled");
-    if (poll_timer_fired == 0x01) {
-      poll_timer_fired = 0x00;
-
-      NXPLOG_NCIHAL_D(">>restarting polling loop.");
-
-      /* start polling loop */
-      phNxpNciHal_start_polling_loop();
-      EnableP2P_PrioLogic = false;
-      NXPLOG_NCIHAL_D(
-          ">> NFC DEP NOT  detected - custom poll timer expired - RF disabled");
-
-      cleanup_timer = phOsalNfc_Timer_Create();
-
-      /* Start cleanup_timer */
-      NFCSTATUS status = phOsalNfc_Timer_Start(cleanup_timer, CLEAN_UP_TIMEOUT,
-                                               &cleanup_timer_handler, NULL);
-
-      if (NFCSTATUS_SUCCESS == status) {
-        NXPLOG_NCIHAL_D("cleanup timer started");
-      } else {
-        NXPLOG_NCIHAL_E("cleanup timer not started!!!");
-        status = NFCSTATUS_FAILED;
-      }
-
-      status = NFCSTATUS_FAILED;
-    } else {
-      status = NFCSTATUS_SUCCESS;
-    }
-  }
-  if (bIgnoreIsoDep == 0x00 && iso_dep_detected == 1) {
-    if ((p_ntf[0] == 0x41 && p_ntf[1] == 0x06) ||
-        (p_ntf[0] == 0x61 && p_ntf[1] == 0x06)) {
-      NXPLOG_NCIHAL_D(">>iso_dep_detected Disconnect related notification");
-      status = NFCSTATUS_FAILED;
-    } else {
-      NXPLOG_NCIHAL_W("Never come here");
-    }
-  }
-
-  return status;
-}
-/*******************************************************************************
-**
-** Function         phNxpNciHal_NfcDep_store_ntf
-**
-** Description      Stores the iso dep notification locally.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phNxpNciHal_NfcDep_store_ntf(uint8_t* p_cmd_data,
-                                         uint16_t cmd_len) {
-  p_iso_ntf_buff = NULL;
-
-  p_iso_ntf_buff = malloc(sizeof(uint8_t) * cmd_len);
-  if (p_iso_ntf_buff == NULL) {
-    NXPLOG_NCIHAL_E("Error allocating memory (p_iso_ntf_buff)");
-    return;
-  }
-  memcpy(p_iso_ntf_buff, p_cmd_data, cmd_len);
-  bIgnorep2plogic = 1;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_NfcDep_comapre_ntf
-**
-** Description      Compare the notification with previous iso dep notification.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_NfcDep_comapre_ntf(uint8_t* p_cmd_data,
-                                         uint16_t cmd_len) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  int32_t ret_val = -1;
-
-  if (bIgnorep2plogic == 1) {
-    ret_val = memcmp(p_cmd_data, p_iso_ntf_buff, cmd_len);
-    if (ret_val != 0) {
-      NXPLOG_NCIHAL_E("Third notification is not equal to last");
-    } else {
-      NXPLOG_NCIHAL_E(
-          "Third notification is equal to last (disable p2p logic)");
-      status = NFCSTATUS_SUCCESS;
-    }
-    bIgnorep2plogic = 0;
-  }
-  if (p_iso_ntf_buff != NULL) {
-    free(p_iso_ntf_buff);
-    p_iso_ntf_buff = NULL;
-  }
-
-  return status;
-}
-
-extern NFCSTATUS phNxpNciHal_clean_P2P_Prio() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  iso_dep_detected = 0x00;
-  EnableP2P_PrioLogic = false;
-  poll_timer_fired = 0x00;
-  bIgnorep2plogic = 0x00;
-  bIgnoreIsoDep = 0x00;
-
-  status = phOsalNfc_Timer_Stop(cleanup_timer);
-  status |= phOsalNfc_Timer_Delete(cleanup_timer);
-
-  status |= phOsalNfc_Timer_Stop(custom_poll_timer);
-  status |= phOsalNfc_Timer_Delete(custom_poll_timer);
-  cleanup_timer = 0;
-  return status;
-}
-
-#endif
-/*******************************************************************************
-**
-** Function         hal_write_cb
-**
-** Description      Callback function for hal write.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void hal_write_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-
-  if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("hal_write_cb: write successful status = 0x%x",
-                    pInfo->wStatus);
-  } else {
-    NXPLOG_NCIHAL_E("hal_write_cb: write error status = 0x%x", pInfo->wStatus);
-  }
-
-  p_cb_data->status = pInfo->wStatus;
-
-  SEM_POST(p_cb_data);
-  return;
-}
-
-/*******************************************************************************
- **
- ** Function         tmp_thread
- **
- ** Description      Thread to execute custom poll commands .
- **
- ** Returns          None
- **
- *******************************************************************************/
-void* tmp_thread(void* tmp) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint16_t data_len;
-  NXPLOG_NCIHAL_E("tmp_thread: enter type=0x0%x", *((int*)tmp));
-  usleep(10 * 1000);
-
-  switch (*((int*)tmp)) {
-    case START_POLLING: {
-      CONCURRENCY_LOCK();
-      data_len = phNxpNciHal_write_unlocked(cmd_poll_len, cmd_poll);
-      CONCURRENCY_UNLOCK();
-
-      if (data_len != cmd_poll_len) {
-        NXPLOG_NCIHAL_E("phNxpNciHal_start_polling_loop: data len mismatch");
-        status = NFCSTATUS_FAILED;
-      }
-    } break;
-
-    case RESUME_POLLING: {
-      CONCURRENCY_LOCK();
-      data_len = phNxpNciHal_write_unlocked(sizeof(cmd_resume_rf_discovery),
-                                            cmd_resume_rf_discovery);
-      CONCURRENCY_UNLOCK();
-
-      if (data_len != sizeof(cmd_resume_rf_discovery)) {
-        NXPLOG_NCIHAL_E("phNxpNciHal_resume_polling_loop: data len mismatch");
-        status = NFCSTATUS_FAILED;
-      }
-    } break;
-
-    case STOP_POLLING: {
-      CONCURRENCY_LOCK();
-      data_len = phNxpNciHal_write_unlocked(sizeof(cmd_stop_rf_discovery),
-                                            cmd_stop_rf_discovery);
-      CONCURRENCY_UNLOCK();
-
-      if (data_len != sizeof(cmd_stop_rf_discovery)) {
-        NXPLOG_NCIHAL_E("phNxpNciHal_stop_polling_loop: data len mismatch");
-        status = NFCSTATUS_FAILED;
-      }
-    } break;
-
-    case DISCOVER_SELECT: {
-      CONCURRENCY_LOCK();
-      data_len = phNxpNciHal_write_unlocked(sizeof(cmd_select_rf_discovery),
-                                            cmd_select_rf_discovery);
-      CONCURRENCY_UNLOCK();
-
-      if (data_len != sizeof(cmd_resume_rf_discovery)) {
-        NXPLOG_NCIHAL_E("phNxpNciHal_resume_polling_loop: data len mismatch");
-        status = NFCSTATUS_FAILED;
-      }
-    } break;
-
-    default:
-      NXPLOG_NCIHAL_E("No Matching case");
-      status = NFCSTATUS_FAILED;
-      break;
-  }
-
-  NXPLOG_NCIHAL_E("tmp_thread: exit");
-  return NULL;
-}
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_select_RF_Discovery
- **
- ** Description     Sends RF_DISCOVER_SELECT_CMD
- ** Parameters    RfID ,  RfProtocolType
- ** Returns          NFCSTATUS_PENDING if success
- **
- *******************************************************************************/
-NFCSTATUS phNxpNciHal_select_RF_Discovery(unsigned int RfID,
-                                          unsigned int RfProtocolType) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  pthread_t pthread;
-  discover_type = DISCOVER_SELECT;
-  cmd_select_rf_discovery[3] = RfID;
-  cmd_select_rf_discovery[4] = RfProtocolType;
-
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&pthread, &attr, tmp_thread, (void*)&discover_type) != 0) {
-    NXPLOG_NCIHAL_E("fail to create pthread");
-  }
-  pthread_attr_destroy(&attr);
-  return status;
-}
-/*******************************************************************************
-**
-** Function         phNxpNciHal_NfcDep_cmd_ext
-**
-** Description      Stores the polling loop configuration locally.
-**
-** Returns          None
-**
-*******************************************************************************/
-void phNxpNciHal_NfcDep_cmd_ext(uint8_t* p_cmd_data, uint16_t* cmd_len) {
-  if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
-    if (*cmd_len == 6 && p_cmd_data[3] == 0x01 && p_cmd_data[4] == 0x02 &&
-        p_cmd_data[5] == 0x01) {
-      /* DO NOTHING */
-    } else {
-      /* Store the polling loop configuration */
-      cmd_poll_len = *cmd_len;
-      memset(&cmd_poll, 0, cmd_poll_len);
-      memcpy(&cmd_poll, p_cmd_data, cmd_poll_len);
-    }
-  }
-
-  return;
-}
diff --git a/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.h b/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.h
deleted file mode 100644
index 12bf9d4..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_NfcDepSWPrio.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_NFCDEPSWPRIO_H_
-#define _PHNXPNCIHAL_NFCDEPSWPRIO_H_
-
-#include <phNxpNciHal.h>
-#include <phTmlNfc.h>
-#include <string.h>
-
-#define START_POLLING 0x00
-#define RESUME_POLLING 0x01
-#define STOP_POLLING 0x02
-#define DISCOVER_SELECT 0x03
-#define CLEAR_PIPE_RSP 0x04
-
-extern uint8_t EnableP2P_PrioLogic;
-
-extern NFCSTATUS phNxpNciHal_NfcDep_rsp_ext(uint8_t* p_ntf, uint16_t* p_len);
-extern void phNxpNciHal_NfcDep_cmd_ext(uint8_t* p_cmd_data, uint16_t* cmd_len);
-extern NFCSTATUS phNxpNciHal_NfcDep_comapre_ntf(uint8_t* p_cmd_data,
-                                                uint16_t cmd_len);
-extern NFCSTATUS phNxpNciHal_select_RF_Discovery(unsigned int RfID,
-                                                 unsigned int RfProtocolType);
-extern NFCSTATUS phNxpNciHal_clean_P2P_Prio();
-extern NFCSTATUS phNxpNciHal_send_clear_pipe_rsp(void);
-
-#endif /* _PHNXPNCIHAL_NFCDEPSWPRIO_H_ */
diff --git a/halimpl/pn54x/hal/phNxpNciHal_dta.c b/halimpl/pn54x/hal/phNxpNciHal_dta.c
deleted file mode 100644
index a6611ea..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_dta.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
-* Copyright (C) 2012-2014 NXP Semiconductors
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal_dta.h>
-
-/*********************** Global Variables *************************************/
-static phNxpDta_Control_t nxpdta_ctrl = {0, 0, 0};
-
-/*******************************************************************************
-**
-** Function         phNxpEnable_DtaMode
-**
-** Description      This function configures
-**                  HAL in DTA mode
-**
-*******************************************************************************/
-void phNxpEnable_DtaMode(uint16_t pattern_no) {
-  nxpdta_ctrl.dta_ctrl_flag = false;
-  nxpdta_ctrl.dta_t1t_flag = false;
-  nxpdta_ctrl.dta_pattern_no = pattern_no;
-  ALOGD(">>>>DTA - Mode is enabled");
-  nxpdta_ctrl.dta_ctrl_flag = true;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpDisable_DtaMode
-**
-** Description      This function disable DTA mode
-**
-*******************************************************************************/
-void phNxpDisable_DtaMode(void) {
-  nxpdta_ctrl.dta_ctrl_flag = false;
-  nxpdta_ctrl.dta_t1t_flag = false;
-  NXPLOG_NCIHAL_D(">>>>DTA - Mode is Disabled");
-}
-
-/******************************************************************************
- * Function         phNxpDta_IsEnable
- *
- * Description      This function checks the DTA mode is enable or not.
- *
- * Returns          It returns TRUE if DTA enabled otherwise FALSE
- *
- ******************************************************************************/
-NFCSTATUS phNxpDta_IsEnable(void) { return nxpdta_ctrl.dta_ctrl_flag; }
-
-/******************************************************************************
- * Function         phNxpDta_T1TEnable
- *
- * Description      This function  enables  DTA mode for T1T tag.
- *
- *
- ******************************************************************************/
-void phNxpDta_T1TEnable(void) { nxpdta_ctrl.dta_t1t_flag = true; }
-/******************************************************************************
- * Function         phNxpNHal_DtaUpdate
- *
- * Description      This function changes the command and responses specific
- *                  to make DTA application success
- *
- * Returns          It return NFCSTATUS_SUCCESS then continue with send else
- *                  sends NFCSTATUS_FAILED direct response is prepared and
- *                  do not send anything to NFCC.
- *
- ******************************************************************************/
-
-NFCSTATUS phNxpNHal_DtaUpdate(uint16_t* cmd_len, uint8_t* p_cmd_data,
-                              uint16_t* rsp_len, uint8_t* p_rsp_data) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  if (nxpdta_ctrl.dta_ctrl_flag == true) {
-    // Workaround for DTA, block the set config command with general bytes */
-    if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-        p_cmd_data[2] == 0x17 && p_cmd_data[3] == 0x01 &&
-        p_cmd_data[4] == 0x29 && p_cmd_data[5] == 0x14) {
-      *rsp_len = 5;
-      NXPLOG_NCIHAL_D(">>>>DTA - Block set config command");
-      phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
-
-      p_rsp_data[0] = 0x40;
-      p_rsp_data[1] = 0x02;
-      p_rsp_data[2] = 0x02;
-      p_rsp_data[3] = 0x00;
-      p_rsp_data[4] = 0x00;
-
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
-
-      status = NFCSTATUS_FAILED;
-      NXPLOG_NCIHAL_D(
-          "Going through DTA workaround - Block set config command END");
-
-    } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x08 &&
-               p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0xFF &&
-               p_cmd_data[4] == 0xFF) {
-      NXPLOG_NCIHAL_D(">>>>DTA Change Felica system code");
-      *rsp_len = 4;
-      p_rsp_data[0] = 0x41;
-      p_rsp_data[1] = 0x08;
-      p_rsp_data[2] = 0x01;
-      p_rsp_data[3] = 0x00;
-      status = NFCSTATUS_FAILED;
-
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 4);
-    } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-               p_cmd_data[2] == 0x10 && p_cmd_data[3] == 0x05 &&
-               p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
-      NXPLOG_NCIHAL_D(">>>>DTA Update LA_SEL_INFO param");
-
-      p_cmd_data[12] = 0x40;
-      p_cmd_data[18] = 0x02;
-      status = NFCSTATUS_SUCCESS;
-    } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-               p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
-               p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
-      NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
-      *rsp_len = 5;
-      p_rsp_data[0] = 0x40;
-      p_rsp_data[1] = 0x02;
-      p_rsp_data[2] = 0x02;
-      p_rsp_data[3] = 0x00;
-      p_rsp_data[4] = 0x00;
-      status = NFCSTATUS_FAILED;
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
-    } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
-      NXPLOG_NCIHAL_D(">>>>DTA Add NFC-F listen tech params");
-      p_cmd_data[2] += 6;
-      p_cmd_data[3] += 3;
-      p_cmd_data[*cmd_len] = 0x80;
-      p_cmd_data[*cmd_len + 1] = 0x01;
-      p_cmd_data[*cmd_len + 2] = 0x82;
-      p_cmd_data[*cmd_len + 3] = 0x01;
-      p_cmd_data[*cmd_len + 4] = 0x85;
-      p_cmd_data[*cmd_len + 5] = 0x01;
-
-      *cmd_len += 6;
-      status = NFCSTATUS_SUCCESS;
-    } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-               p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
-               p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x20 &&
-               nxpdta_ctrl.dta_pattern_no == 0x1000) {
-      NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
-      *rsp_len = 5;
-      p_rsp_data[0] = 0x40;
-      p_rsp_data[1] = 0x02;
-      p_rsp_data[2] = 0x02;
-      p_rsp_data[3] = 0x00;
-      p_rsp_data[4] = 0x00;
-      status = NFCSTATUS_FAILED;
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
-    } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-               p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
-               p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x01 &&
-               p_cmd_data[6] == 0x00) {
-      NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
-      *rsp_len = 5;
-      p_rsp_data[0] = 0x40;
-      p_rsp_data[1] = 0x02;
-      p_rsp_data[2] = 0x02;
-      p_rsp_data[3] = 0x00;
-      p_rsp_data[4] = 0x00;
-      status = NFCSTATUS_FAILED;
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
-    } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-               p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 &&
-               p_cmd_data[4] == 0x50 && p_cmd_data[5] == 0x01 &&
-               p_cmd_data[6] == 0x00 && nxpdta_ctrl.dta_pattern_no == 0x1000) {
-      NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
-      *rsp_len = 5;
-      p_rsp_data[0] = 0x40;
-      p_rsp_data[1] = 0x02;
-      p_rsp_data[2] = 0x02;
-      p_rsp_data[3] = 0x00;
-      p_rsp_data[4] = 0x00;
-      status = NFCSTATUS_FAILED;
-      phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
-    } else {
-    }
-    if (nxpdta_ctrl.dta_t1t_flag == true) {
-      if (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x78 &&
-          p_cmd_data[4] == 0x00 && p_cmd_data[5] == 0x00) {
-        /*if (nxpdta_ctrl.dta_pattern_no == 0)
-        {
-          NXPLOG_NCIHAL_D(">>>>DTA - T1T modification block RID command Custom
-        Response (pattern 0)");
-          phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
-          *rsp_len = 10;
-          p_rsp_data[0] = 0x00;
-          p_rsp_data[1] = 0x00;
-          p_rsp_data[2] = 0x07;
-          p_rsp_data[3] = 0x12;
-          p_rsp_data[4] = 0x49;
-          p_rsp_data[5] = 0x00;
-          p_rsp_data[6] = 0x00;
-          p_rsp_data[7] = 0x00;
-          p_rsp_data[8] = 0x00;
-          p_rsp_data[9] = 0x00;
-
-          status = NFCSTATUS_FAILED;
-
-          phNxpNciHal_print_packet("DTARECV", p_rsp_data, *rsp_len);
-        }
-        else
-        {*/
-        NXPLOG_NCIHAL_D("Change RID command's UID echo bytes to 0");
-
-        nxpdta_ctrl.dta_t1t_flag = false;
-        p_cmd_data[6] = 0x00;
-        p_cmd_data[7] = 0x00;
-        p_cmd_data[8] = 0x00;
-        p_cmd_data[9] = 0x00;
-        status = NFCSTATUS_SUCCESS;
-        /*}*/
-      }
-    }
-  }
-  return status;
-}
diff --git a/halimpl/pn54x/hal/phNxpNciHal_dta.h b/halimpl/pn54x/hal/phNxpNciHal_dta.h
deleted file mode 100644
index ebcae1a..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_dta.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-* Copyright (C) 2012-2014 NXP Semiconductors
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef _PHNXPNCIHAL_DTA_H_
-#define _PHNXPNCIHAL_DTA_H_
-
-#include <phNxpNciHal_utils.h>
-/* DTA Control structure */
-typedef struct phNxpDta_Control {
-  uint8_t dta_ctrl_flag;
-  uint16_t dta_pattern_no;
-  uint8_t dta_t1t_flag;
-} phNxpDta_Control_t;
-
-void phNxpEnable_DtaMode(uint16_t pattern_no);
-void phNxpDisable_DtaMode(void);
-NFCSTATUS phNxpDta_IsEnable(void);
-void phNxpDta_T1TEnable(void);
-NFCSTATUS phNxpNHal_DtaUpdate(uint16_t* cmd_len, uint8_t* p_cmd_data,
-                              uint16_t* rsp_len, uint8_t* p_rsp_data);
-
-#endif /* _PHNXPNICHAL_DTA_H_ */
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.c b/halimpl/pn54x/hal/phNxpNciHal_ext.c
deleted file mode 100644
index 864f9ae..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.c
+++ /dev/null
@@ -1,945 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <log/log.h>
-#include <phDal4Nfc_messageQueueLib.h>
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal.h>
-#include <phNxpNciHal_NfcDepSWPrio.h>
-#include <phNxpNciHal_ext.h>
-#include <phTmlNfc.h>
-
-/* Timeout value to wait for response from PN548AD */
-#define HAL_EXTNS_WRITE_RSP_TIMEOUT (1000)
-
-#undef P2P_PRIO_LOGIC_HAL_IMP
-
-/******************* Global variables *****************************************/
-extern phNxpNciHal_Control_t nxpncihal_ctrl;
-extern phNxpNciProfile_Control_t nxpprofile_ctrl;
-
-extern uint32_t cleanup_timer;
-uint8_t icode_detected = 0x00;
-uint8_t icode_send_eof = 0x00;
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-uint8_t nfcdep_detected = 0x00;
-#endif
-static uint8_t ee_disc_done = 0x00;
-uint8_t EnableP2P_PrioLogic = false;
-static uint32_t RfDiscID = 1;
-static uint32_t RfProtocolType = 4;
-/* NFCEE Set mode */
-static uint8_t setEEModeDone = 0x00;
-static uint8_t cmd_nfcee_setmode_enable[] = {0x22, 0x01, 0x02, 0x01, 0x01};
-
-/* External global variable to get FW version from NCI response*/
-extern uint32_t wFwVerRsp;
-/* External global variable to get FW version from FW file*/
-extern uint16_t wFwVer;
-
-uint16_t fw_maj_ver;
-uint16_t rom_version;
-/* local buffer to store CORE_INIT response */
-static uint32_t bCoreInitRsp[40];
-static uint32_t iCoreInitRspLen;
-
-extern uint32_t timeoutTimerId;
-
-extern NFCSTATUS read_retry();
-
-/************** HAL extension functions ***************************************/
-static void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void* pContext);
-
-/*Proprietary cmd sent to HAL to send reader mode flag
- * Last byte of 4 byte proprietary cmd data contains ReaderMode flag
- * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol
- * if FrameRF interface is selected. This needs to be done as the FW
- * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is
- * previously selected with DISCOVER_SELECT_CMD
- */
-#define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE
-static uint8_t gFelicaReaderMode;
-
-static NFCSTATUS phNxpNciHal_ext_process_nfc_init_rsp(uint8_t* p_ntf,
-                                                      uint16_t* p_len);
-/*******************************************************************************
-**
-** Function         phNxpNciHal_ext_init
-**
-** Description      initialize extension function
-**
-*******************************************************************************/
-void phNxpNciHal_ext_init(void) {
-  icode_detected = 0x00;
-  icode_send_eof = 0x00;
-  setEEModeDone = 0x00;
-  EnableP2P_PrioLogic = false;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_process_ext_rsp
-**
-** Description      Process extension function response
-**
-** Returns          NFCSTATUS_SUCCESS if success
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint16_t rf_technology_length_param = 0;
-
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && *p_len < 14) {
-    if (*p_len <= 6) {
-      android_errorWriteLog(0x534e4554, "118152591");
-    }
-    NXPLOG_NCIHAL_E("RF_INTF_ACTIVATED_NTF length error!");
-    status = NFCSTATUS_FAILED;
-    return status;
-  }
-
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x03 &&
-      p_ntf[5] == 0x05 && nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) {
-    p_ntf[4] = 0xFF;
-    p_ntf[5] = 0xFF;
-    p_ntf[6] = 0xFF;
-    NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling");
-  }
-
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 &&
-      p_ntf[5] == 0x05 && p_ntf[6] == 0x02 && gFelicaReaderMode) {
-    /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP
-         * when FrameRF interface is selected*/
-    p_ntf[5] = 0x03;
-    NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1");
-  }
-
-#ifdef P2P_PRIO_LOGIC_HAL_IMP
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 &&
-      p_ntf[5] == 0x04 && nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE) {
-    EnableP2P_PrioLogic = true;
-  }
-
-  NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X", EnableP2P_PrioLogic);
-  if (phNxpDta_IsEnable() == false) {
-    if ((icode_detected != 1) && (EnableP2P_PrioLogic == true)) {
-      if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED) {
-        status = phNxpNciHal_NfcDep_rsp_ext(p_ntf, p_len);
-        if (status != NFCSTATUS_INVALID_PARAMETER) {
-          return status;
-        }
-      }
-    }
-  }
-#endif
-
-  status = NFCSTATUS_SUCCESS;
-
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    if (nfcdep_detected) {
-      nfcdep_detected = 0x00;
-    }
-#endif
-
-    switch (p_ntf[4]) {
-      case 0x00:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF");
-        break;
-      case 0x01:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF");
-        break;
-      case 0x02:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP");
-        break;
-      case 0x03:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-        nfcdep_detected = 0x01;
-#endif
-        break;
-      case 0x80:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
-        break;
-      default:
-        NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown");
-        break;
-    }
-
-    switch (p_ntf[5]) {
-      case 0x01:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T");
-        phNxpDta_T1TEnable();
-        break;
-      case 0x02:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T");
-        break;
-      case 0x03:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T");
-        break;
-      case 0x04:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP");
-        break;
-      case 0x05:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP");
-        break;
-      case 0x06:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693");
-        break;
-      case 0x80:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE");
-        break;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      case 0x81:
-#else
-      case 0x8A:
-#endif
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio");
-        break;
-      default:
-        NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown");
-        break;
-    }
-
-    switch (p_ntf[6]) {
-      case 0x00:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll");
-        break;
-      case 0x01:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll");
-        break;
-      case 0x02:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll");
-        break;
-      case 0x03:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll");
-        break;
-      case 0x05:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll");
-        break;
-      case 0x06:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll");
-        break;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      case 0x70:
-#else
-      case 0x77:
-#endif
-        NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio");
-        break;
-      case 0x80:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen");
-        break;
-      case 0x81:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen");
-        break;
-      case 0x82:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen");
-        break;
-      case 0x83:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen");
-        break;
-      case 0x85:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen");
-        break;
-      case 0x86:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen");
-        break;
-      default:
-        NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown");
-        break;
-    }
-  }
-  phNxpNciHal_ext_process_nfc_init_rsp(p_ntf, p_len);
-
-  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[2] == 0x15 &&
-      p_ntf[4] == 0x01 && p_ntf[5] == 0x06 && p_ntf[6] == 0x06) {
-    NXPLOG_NCIHAL_D("> Going through workaround - notification of ISO 15693");
-    icode_detected = 0x01;
-    p_ntf[21] = 0x01;
-    p_ntf[22] = 0x01;
-  } else if (icode_detected == 1 && icode_send_eof == 2) {
-    icode_send_eof = 3;
-  } else if (p_ntf[0] == 0x00 && p_ntf[1] == 0x00 && icode_detected == 1) {
-    if (icode_send_eof == 3) {
-      icode_send_eof = 0;
-    }
-    if (nxpncihal_ctrl.nci_info.nci_version != NCI_VERSION_2_0) {
-      if (p_ntf[p_ntf[2] + 2] == 0x00) {
-        NXPLOG_NCIHAL_D("> Going through workaround - data of ISO 15693");
-        p_ntf[2]--;
-        (*p_len)--;
-      } else {
-        p_ntf[p_ntf[2] + 2] |= 0x01;
-      }
-    }
-  } else if (p_ntf[2] == 0x02 && p_ntf[1] == 0x00 && icode_detected == 1) {
-    NXPLOG_NCIHAL_D("> ICODE EOF response do not send to upper layer");
-  } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x06 && icode_detected == 1) {
-    NXPLOG_NCIHAL_D("> Polling Loop Re-Started");
-    icode_detected = 0;
-    icode_send_eof = 0;
-  } else if (*p_len == 4 && p_ntf[0] == 0x40 && p_ntf[1] == 0x02 &&
-             p_ntf[2] == 0x01 && p_ntf[3] == 0x06) {
-    NXPLOG_NCIHAL_D("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x",
-                    p_ntf[21], p_ntf[22], p_ntf[23]);
-    p_ntf[0] = 0x40;
-    p_ntf[1] = 0x02;
-    p_ntf[2] = 0x02;
-    p_ntf[3] = 0x00;
-    p_ntf[4] = 0x00;
-    *p_len = 5;
-  }
-  // 4200 02 00 01
-  else if (p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01) {
-    NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP");
-    if (p_ntf[4] == 0x01) {
-      p_ntf[4] = 0x00;
-
-      ee_disc_done = 0x00;
-    }
-    NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END");
-
-  } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/) {
-    if (cleanup_timer != 0) {
-      /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */
-      if (0 == (*(p_ntf + 2 + (*(p_ntf + 2))))) {
-        phNxpNciHal_select_RF_Discovery(RfDiscID, RfProtocolType);
-        status = NFCSTATUS_FAILED;
-        return status;
-      } else {
-        RfDiscID = p_ntf[3];
-        RfProtocolType = p_ntf[4];
-      }
-      status = NFCSTATUS_FAILED;
-      return status;
-    }
-  } else if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer != 0) {
-    status = NFCSTATUS_FAILED;
-    return status;
-  }
-#if (NFC_NXP_CHIP_TYPE == PN547C2)
-  else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 &&
-           p_ntf[5] == 0x80 && p_ntf[6] == 0x00) {
-    NXPLOG_NCIHAL_D(
-        "Going through workaround - iso-dep  interface  mifare protocol with "
-        "sak value not equal to 0x20");
-    rf_technology_length_param = p_ntf[9];
-    if ((p_ntf[9 + rf_technology_length_param] & 0x20) != 0x20) {
-      p_ntf[4] = 0x80;
-    }
-  }
-#endif
-  else if (*p_len == 4 && p_ntf[0] == 0x4F && p_ntf[1] == 0x11 &&
-           p_ntf[2] == 0x01) {
-    if (p_ntf[3] == 0x00) {
-      NXPLOG_NCIHAL_D(
-          ">  Workaround for ISO-DEP Presence Check, ignore response and wait "
-          "for notification");
-      p_ntf[0] = 0x60;
-      p_ntf[1] = 0x06;
-      p_ntf[2] = 0x03;
-      p_ntf[3] = 0x01;
-      p_ntf[4] = 0x00;
-      p_ntf[5] = 0x01;
-      *p_len = 6;
-    } else {
-      NXPLOG_NCIHAL_D(
-          ">  Workaround for ISO-DEP Presence Check, presence check return "
-          "failed");
-      p_ntf[0] = 0x60;
-      p_ntf[1] = 0x08;
-      p_ntf[2] = 0x02;
-      p_ntf[3] = 0xB2;
-      p_ntf[4] = 0x00;
-      *p_len = 5;
-    }
-  } else if (*p_len == 4 && p_ntf[0] == 0x6F && p_ntf[1] == 0x11 &&
-             p_ntf[2] == 0x01) {
-    if (p_ntf[3] == 0x01) {
-      NXPLOG_NCIHAL_D(
-          ">  Workaround for ISO-DEP Presence Check - Card still in field");
-      p_ntf[0] = 0x00;
-      p_ntf[1] = 0x00;
-      p_ntf[2] = 0x01;
-      p_ntf[3] = 0x7E;
-    } else {
-      NXPLOG_NCIHAL_D(
-          ">  Workaround for ISO-DEP Presence Check - Card not in field");
-      p_ntf[0] = 0x60;
-      p_ntf[1] = 0x08;
-      p_ntf[2] = 0x02;
-      p_ntf[3] = 0xB2;
-      p_ntf[4] = 0x00;
-      *p_len = 5;
-    }
-  }
-  /*
-  else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5]
-  == 0x00 && p_ntf[6] == 0x01)
-  {
-      NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not
-  supported, disabling");
-      p_ntf[4] = 0xFF;
-      p_ntf[5] = 0xFF;
-      p_ntf[6] = 0xFF;
-  }*/
-
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_ext_process_nfc_init_rsp
- *
- * Description      This function is used to process the HAL NFC core reset rsp
- *                  and ntf and core init rsp of NCI 1.0 or NCI2.0 and update
- *                  NCI version.
- *                  It also handles error response such as core_reset_ntf with
- *                  error status in both NCI2.0 and NCI1.0.
- *
- * Returns          Returns NFCSTATUS_SUCCESS if parsing response is successful
- *                  or returns failure.
- *
- *******************************************************************************/
-static NFCSTATUS phNxpNciHal_ext_process_nfc_init_rsp(uint8_t* p_ntf,
-                                                      uint16_t* p_len) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  /* Parsing CORE_RESET_RSP and CORE_RESET_NTF to update NCI version.*/
-  if (p_ntf == NULL || *p_len == 0x00) {
-    return NFCSTATUS_FAILED;
-  }
-  if (p_ntf[0] == NCI_MT_RSP &&
-      ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)) {
-    if (p_ntf[2] == 0x01 && p_ntf[3] == 0x00) {
-      NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI2.0");
-      if (nxpncihal_ctrl.hal_ext_enabled == TRUE) {
-        nxpncihal_ctrl.nci_info.wait_for_ntf = TRUE;
-      }
-    } else if (p_ntf[2] == 0x03 && p_ntf[3] == 0x00) {
-      NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI1.0");
-      nxpncihal_ctrl.nci_info.nci_version = p_ntf[4];
-    }
-  } else if (p_ntf[0] == NCI_MT_NTF &&
-             ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)) {
-    if (p_ntf[3] == CORE_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED ||
-        p_ntf[3] == CORE_RESET_TRIGGER_TYPE_POWERED_ON) {
-      NXPLOG_NCIHAL_D("CORE_RESET_NTF NCI2.0 reason CORE_RESET_CMD received !");
-      nxpncihal_ctrl.nci_info.nci_version = p_ntf[5];
-      int len = p_ntf[2] + 2; /*include 2 byte header*/
-      wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
-                  (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
-      NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
-                      p_ntf[len - 1], p_ntf[len]);
-    } else {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-      if (nfcdep_detected &&
-          !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 &&
-            ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 &&
-              p_ntf[8] == 0x00) ||
-             (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 &&
-              p_ntf[8] == 0x00)))) {
-        nfcdep_detected = 0x00;
-      }
-#endif
-      phNxpNciHal_emergency_recovery();
-      status = NFCSTATUS_FAILED;
-    } /* Parsing CORE_INIT_RSP*/
-  } else if (p_ntf[0] == NCI_MT_RSP &&
-             ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_INIT)) {
-    if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
-      NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI2.0 received !");
-    } else {
-      NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI1.0 received !");
-      int len = p_ntf[2] + 2; /*include 2 byte header*/
-      wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
-                  (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
-      if (wFwVerRsp == 0) status = NFCSTATUS_FAILED;
-      iCoreInitRspLen = *p_len;
-      memcpy(bCoreInitRsp, p_ntf, *p_len);
-      NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
-                      p_ntf[len - 1], p_ntf[len]);
-      fw_maj_ver = p_ntf[len - 1];
-      rom_version = p_ntf[len - 2];
-    }
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_process_ext_cmd_rsp
- *
- * Description      This function process the extension command response. It
- *                  also checks the received response to expected response.
- *
- * Returns          returns NFCSTATUS_SUCCESS if response is as expected else
- *                  returns failure.
- *
- ******************************************************************************/
-static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,
-                                                 uint8_t* p_cmd) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  uint16_t data_written = 0;
-
-  /* Create the local semaphore */
-  if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL) !=
-      NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("Create ext_cb_data failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS;
-
-  /* Send ext command */
-  data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd);
-  if (data_written != cmd_len) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext");
-    goto clean_and_return;
-  }
-
-  /* Start timer */
-  status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT,
-                                 &hal_extns_write_rsp_timeout_cb, NULL);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_NCIHAL_D("Response timer started");
-  } else {
-    NXPLOG_NCIHAL_E("Response timer not started!!!");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for rsp */
-  NXPLOG_NCIHAL_D("Waiting after ext cmd sent");
-  if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) {
-    NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
-    goto clean_and_return;
-  }
-
-  /* Stop Timer */
-  status = phOsalNfc_Timer_Stop(timeoutTimerId);
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_NCIHAL_D("Response timer stopped");
-  } else {
-    NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-  /* Start timer to wait for NTF*/
-  if (nxpncihal_ctrl.nci_info.wait_for_ntf == TRUE) {
-    status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT,
-                                   &hal_extns_write_rsp_timeout_cb, NULL);
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_NCIHAL_D("Response timer started");
-    } else {
-      NXPLOG_NCIHAL_E("Response timer not started!!!");
-      status = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-    if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) {
-      NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
-      /* Stop Timer */
-      status = phOsalNfc_Timer_Stop(timeoutTimerId);
-      goto clean_and_return;
-    }
-    status = phOsalNfc_Timer_Stop(timeoutTimerId);
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_NCIHAL_D("Response timer stopped");
-    } else {
-      NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
-      status = NFCSTATUS_FAILED;
-      goto clean_and_return;
-    }
-  }
-
-  if (nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E(
-        "Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x",
-        nxpncihal_ctrl.ext_cb_data.status);
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  NXPLOG_NCIHAL_D("Checking response");
-  status = NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data);
-  nxpncihal_ctrl.nci_info.wait_for_ntf = FALSE;
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_write_ext
- *
- * Description      This function inform the status of phNxpNciHal_open
- *                  function to libnfc-nci.
- *
- * Returns          It return NFCSTATUS_SUCCESS then continue with send else
- *                  sends NFCSTATUS_FAILED direct response is prepared and
- *                  do not send anything to NFCC.
- *
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
-                                uint16_t* rsp_len, uint8_t* p_rsp_data) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  unsigned long retval = 0;
-  int isfound =
-      GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long));
-
-  phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len);
-
-  if (phNxpDta_IsEnable() == true) {
-    status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data, rsp_len, p_rsp_data);
-  }
-
-  if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE &&
-      p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE &&
-      p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE) {
-    NXPLOG_NCIHAL_D("Received proprietary command to set Felica Reader mode:%d",
-                    p_cmd_data[3]);
-    gFelicaReaderMode = p_cmd_data[3];
-    /* frame the dummy response */
-    *rsp_len = 4;
-    p_rsp_data[0] = 0x00;
-    p_rsp_data[1] = 0x00;
-    p_rsp_data[2] = 0x00;
-    p_rsp_data[3] = 0x00;
-    status = NFCSTATUS_FAILED;
-  } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-             p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 &&
-             p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 &&
-             p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x01) {
-    nxpprofile_ctrl.profile_type = EMV_CO_PROFILE;
-    NXPLOG_NCIHAL_D("EMV_CO_PROFILE mode - Enabled");
-    status = NFCSTATUS_SUCCESS;
-  } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
-             p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 &&
-             p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 &&
-             p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x00) {
-    NXPLOG_NCIHAL_D("NFC_FORUM_PROFILE mode - Enabled");
-    nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE;
-    status = NFCSTATUS_SUCCESS;
-  }
-
-  if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) {
-    if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x06 &&
-        p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x03) {
-#if 0
-            //Needs clarification whether to keep it or not
-            NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard");
-            phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-            *rsp_len = 4;
-            p_rsp_data[0] = 0x41;
-            p_rsp_data[1] = 0x06;
-            p_rsp_data[2] = 0x01;
-            p_rsp_data[3] = 0x00;
-            phNxpNciHal_print_packet("RECV", p_rsp_data, 4);
-            status = NFCSTATUS_FAILED;
-#endif
-    } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
-      NXPLOG_NCIHAL_D("EmvCo Poll mode - Discover map only for A and B");
-      p_cmd_data[2] = 0x05;
-      p_cmd_data[3] = 0x02;
-      p_cmd_data[4] = 0x00;
-      p_cmd_data[5] = 0x01;
-      p_cmd_data[6] = 0x01;
-      p_cmd_data[7] = 0x01;
-      *cmd_len = 8;
-    }
-  }
-
-  if (retval == 0x01 && p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) {
-    NXPLOG_NCIHAL_D("Going through extns - Adding Mifare in RF Discovery");
-    p_cmd_data[2] += 3;
-    p_cmd_data[3] += 1;
-    p_cmd_data[*cmd_len] = 0x80;
-    p_cmd_data[*cmd_len + 1] = 0x01;
-    p_cmd_data[*cmd_len + 2] = 0x80;
-    *cmd_len += 3;
-    status = NFCSTATUS_SUCCESS;
-    NXPLOG_NCIHAL_D(
-        "Going through extns - Adding Mifare in RF Discovery - END");
-  } else if (p_cmd_data[3] == 0x81 && p_cmd_data[4] == 0x01 &&
-             p_cmd_data[5] == 0x03) {
-    NXPLOG_NCIHAL_D("> Going through workaround - set host list");
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    *cmd_len = 8;
-
-    p_cmd_data[2] = 0x05;
-    p_cmd_data[6] = 0x02;
-    p_cmd_data[7] = 0xC0;
-#else
-    *cmd_len = 7;
-
-    p_cmd_data[2] = 0x04;
-    p_cmd_data[6] = 0xC0;
-#endif
-
-    NXPLOG_NCIHAL_D("> Going through workaround - set host list - END");
-    status = NFCSTATUS_SUCCESS;
-  } else if (icode_detected) {
-    if ((p_cmd_data[3] & 0x40) == 0x40 &&
-        (p_cmd_data[4] == 0x21 || p_cmd_data[4] == 0x22 ||
-         p_cmd_data[4] == 0x24 || p_cmd_data[4] == 0x27 ||
-         p_cmd_data[4] == 0x28 || p_cmd_data[4] == 0x29 ||
-         p_cmd_data[4] == 0x2a)) {
-      NXPLOG_NCIHAL_D("> Send EOF set");
-      icode_send_eof = 1;
-    }
-
-    if (p_cmd_data[3] == 0x20 || p_cmd_data[3] == 0x24 ||
-        p_cmd_data[3] == 0x60) {
-      NXPLOG_NCIHAL_D("> NFC ISO_15693 Proprietary CMD ");
-      p_cmd_data[3] += 0x02;
-    }
-  } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
-    NXPLOG_NCIHAL_D("> Polling Loop Started");
-    icode_detected = 0;
-    icode_send_eof = 0;
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    // Cache discovery cmd for recovery
-    phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len);
-#endif
-  }
-  // 22000100
-  else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 &&
-           p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x00) {
-    // ee_disc_done = 0x01;//Reader Over SWP event getting
-    *rsp_len = 0x05;
-    p_rsp_data[0] = 0x42;
-    p_rsp_data[1] = 0x00;
-    p_rsp_data[2] = 0x02;
-    p_rsp_data[3] = 0x00;
-    p_rsp_data[4] = 0x00;
-    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
-    status = NFCSTATUS_FAILED;
-  }
-  // 2002 0904 3000 3100 3200 5000
-  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
-           ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*||
-            (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
-            )) {
-    *cmd_len += 0x01;
-    p_cmd_data[2] += 0x01;
-    p_cmd_data[9] = 0x01;
-    p_cmd_data[10] = 0x40;
-    p_cmd_data[11] = 0x50;
-    p_cmd_data[12] = 0x00;
-
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
-    //        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
-  }
-  //    20020703300031003200
-  //    2002 0301 3200
-  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
-           ((p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) ||
-            (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 &&
-             p_cmd_data[4] == 0x32))) {
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
-    phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-    *rsp_len = 5;
-    p_rsp_data[0] = 0x40;
-    p_rsp_data[1] = 0x02;
-    p_rsp_data[2] = 0x02;
-    p_rsp_data[3] = 0x00;
-    p_rsp_data[4] = 0x00;
-
-    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
-    status = NFCSTATUS_FAILED;
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
-  }
-
-  // 2002 0D04 300104 310100 320100 500100
-  // 2002 0401 320100
-  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
-           (
-               /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
-               (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 &&
-                p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00))) {
-    //        p_cmd_data[12] = 0x40;
-
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
-    phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-    p_cmd_data[6] = 0x60;
-
-    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
-    //        status = NFCSTATUS_FAILED;
-    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
-  } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) {
-    NXPLOG_NCIHAL_D(
-        "> Going through workaround - Add Mifare Classic in Discovery Map");
-    p_cmd_data[*cmd_len] = 0x80;
-    p_cmd_data[*cmd_len + 1] = 0x01;
-    p_cmd_data[*cmd_len + 2] = 0x80;
-    p_cmd_data[5] = 0x01;
-    p_cmd_data[6] = 0x01;
-    p_cmd_data[2] += 3;
-    p_cmd_data[3] += 1;
-    *cmd_len += 3;
-  } else if (*cmd_len == 3 && p_cmd_data[0] == 0x00 && p_cmd_data[1] == 0x00 &&
-             p_cmd_data[2] == 0x00) {
-    NXPLOG_NCIHAL_D("> Going through workaround - ISO-DEP Presence Check ");
-    p_cmd_data[0] = 0x2F;
-    p_cmd_data[1] = 0x11;
-    p_cmd_data[2] = 0x00;
-    status = NFCSTATUS_SUCCESS;
-    NXPLOG_NCIHAL_D(
-        "> Going through workaround - ISO-DEP Presence Check - End");
-  }
-#if 0
-    else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
-                 ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) ||
-                     (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) ||
-                     (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) ||
-                     (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) ||
-                     (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) ||
-                     (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02))
-             )
-    {
-        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
-        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-        *rsp_len = 5;
-        p_rsp_data[0] = 0x40;
-        p_rsp_data[1] = 0x02;
-        p_rsp_data[2] = 0x02;
-        p_rsp_data[3] = 0x00;
-        p_rsp_data[4] = 0x00;
-
-        phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
-        status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
-    }
-
-    else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
-           ((p_cmd_data[3] == 0x00) ||
-           ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/
-    {
-        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
-        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
-        *rsp_len = 5;
-        p_rsp_data[0] = 0x40;
-        p_rsp_data[1] = 0x02;
-        p_rsp_data[2] = 0x02;
-        p_rsp_data[3] = 0x00;
-        p_rsp_data[4] = 0x00;
-
-        phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
-        status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
-    }
-#endif
-  else if ((wFwVerRsp & 0x0000FFFF) == wFwVer) {
-    /* skip CORE_RESET and CORE_INIT from Brcm */
-    if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x00 &&
-        p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x01) {
-      //            *rsp_len = 6;
-      //
-      //            NXPLOG_NCIHAL_D("> Going - core reset optimization");
-      //
-      //            p_rsp_data[0] = 0x40;
-      //            p_rsp_data[1] = 0x00;
-      //            p_rsp_data[2] = 0x03;
-      //            p_rsp_data[3] = 0x00;
-      //            p_rsp_data[4] = 0x10;
-      //            p_rsp_data[5] = 0x01;
-      //
-      //            status = NFCSTATUS_FAILED;
-      //            NXPLOG_NCIHAL_D("> Going - core reset optimization - END");
-    }
-    /* CORE_INIT */
-    else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x01 &&
-             p_cmd_data[2] == 0x00) {
-      //            NXPLOG_NCIHAL_D("> Going - core init optimization");
-      //            *rsp_len = iCoreInitRspLen;
-      //            memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen);
-      //            status = NFCSTATUS_FAILED;
-      //            NXPLOG_NCIHAL_D("> Going - core init optimization - END");
-    }
-  }
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) {
-    uint8_t temp;
-    uint8_t* p = p_cmd_data + 4;
-    uint8_t* end = p_cmd_data + *cmd_len;
-    while (p < end) {
-      if (*p == 0x53)  // LF_T3T_FLAGS
-      {
-        NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS swap");
-        temp = *(p + 3);
-        *(p + 3) = *(p + 2);
-        *(p + 2) = temp;
-        NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS - End");
-        status = NFCSTATUS_SUCCESS;
-        break;
-      }
-      if (*p == 0xA0) {
-        p += *(p + 2) + 3;
-      } else {
-        p += *(p + 1) + 2;
-      }
-    }
-  }
-#endif
-
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpNciHal_send_ext_cmd
- *
- * Description      This function send the extension command to NFCC. No
- *                  response is checked by this function but it waits for
- *                  the response to come.
- *
- * Returns          Returns NFCSTATUS_SUCCESS if sending cmd is successful and
- *                  response is received.
- *
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-
-  HAL_ENABLE_EXT();
-  nxpncihal_ctrl.cmd_len = cmd_len;
-  memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len);
-  status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len,
-                                           nxpncihal_ctrl.p_cmd_data);
-  HAL_DISABLE_EXT();
-
-  return status;
-}
-
-/******************************************************************************
- * Function         hal_extns_write_rsp_timeout_cb
- *
- * Description      Timer call back function
- *
- * Returns          None
- *
- ******************************************************************************/
-static void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void* pContext) {
-  UNUSED(timerId);
-  UNUSED(pContext);
-  NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!");
-  nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED;
-  usleep(1);
-  SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
-
-  return;
-}
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.h b/halimpl/pn54x/hal/phNxpNciHal_ext.h
deleted file mode 100644
index 72387e9..0000000
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_EXT_H_
-#define _PHNXPNCIHAL_EXT_H_
-
-#include <phNxpNciHal.h>
-#include <phNxpNciHal_dta.h>
-#include <string.h>
-
-void phNxpNciHal_ext_init(void);
-NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len);
-NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd);
-NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
-                                uint16_t* rsp_len, uint8_t* p_rsp_data);
-
-#endif /* _PHNXPNICHAL_EXT_H_ */
diff --git a/halimpl/pn54x/inc/phNxpNciHal_Adaptation.h b/halimpl/pn54x/inc/phNxpNciHal_Adaptation.h
deleted file mode 100644
index b4d5566..0000000
--- a/halimpl/pn54x/inc/phNxpNciHal_Adaptation.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _PHNXPNCIHAL_ADAPTATION_H_
-#define _PHNXPNCIHAL_ADAPTATION_H_
-
-#include <hardware/hardware.h>
-#include <hardware/nfc.h>
-
-typedef struct {
-  struct nfc_nci_device nci_device;
-
-  /* Local definitions */
-} pn547_dev_t;
-
-/* NXP HAL functions */
-
-int phNxpNciHal_open(nfc_stack_callback_t* p_cback,
-                     nfc_stack_data_callback_t* p_data_cback);
-int phNxpNciHal_write(uint16_t data_len, const uint8_t* p_data);
-int phNxpNciHal_core_initialized(uint8_t* p_core_init_rsp_params);
-int phNxpNciHal_pre_discover(void);
-int phNxpNciHal_close(void);
-int phNxpNciHal_control_granted(void);
-int phNxpNciHal_power_cycle(void);
-
-#endif /* _PHNXPNCIHAL_ADAPTATION_H_ */
diff --git a/halimpl/pn54x/inc/phNxpNciHal_Api.h b/halimpl/pn54x/inc/phNxpNciHal_Api.h
deleted file mode 100644
index e1e0649..0000000
--- a/halimpl/pn54x/inc/phNxpNciHal_Api.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_API_H_
-#define _PHNXPNCIHAL_API_H_
-
-#include <phNfcStatus.h>
-#include <phNxpNciHal.h>
-#include <phTmlNfc.h>
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_get_version
- **
- ** Description      Function to get the HW, FW and SW versions.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_get_version(uint32_t* hw_ver, uint32_t* fw_ver,
-                                  uint32_t* sw_ver);
-
-#endif /* _PHNXPNCIHAL_API_H_ */
diff --git a/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h b/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h
deleted file mode 100644
index ee7c8d6..0000000
--- a/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _PHNXPNCIHAL_SELFTEST_H_
-#define _PHNXPNCIHAL_SELFTEST_H_
-
-#ifdef NXP_HW_SELF_TEST
-
-#include <phNfcStatus.h>
-#include <phNxpNciHal.h>
-#include <phTmlNfc.h>
-
-/* PRBS Generation type  */
-typedef enum {
-  NFC_FW_PRBS, /* FW software would generate the PRBS */
-  NFC_HW_PRBS  /* Hardware would generate the PRBS */
-} phNxpNfc_PrbsType_t;
-
-/* Different HW PRBS types */
-typedef enum { NFC_HW_PRBS9, NFC_HW_PRBS15 } phNxpNfc_PrbsHwType_t;
-/* RF Technology */
-typedef enum {
-  NFC_RF_TECHNOLOGY_A,
-  NFC_RF_TECHNOLOGY_B,
-  NFC_RF_TECHNOLOGY_F,
-} phNxpNfc_Tech_t;
-
-/* Bit rates */
-typedef enum {
-  NFC_BIT_RATE_106,
-  NFC_BIT_RATE_212,
-  NFC_BIT_RATE_424,
-  NFC_BIT_RATE_848,
-} phNxpNfc_Bitrate_t;
-
-typedef struct phAntenna_St_Resp {
-  /* Txdo Raw Value*/
-  uint16_t wTxdoRawValue;
-  uint16_t wTxdoMeasuredRangeMin;            /*Txdo Measured Range Max */
-  uint16_t wTxdoMeasuredRangeMax;            /*Txdo Measured Range Min */
-  uint16_t wTxdoMeasuredTolerance;           /*Txdo Measured Range Tolerance */
-                                             /* Agc Values */
-  uint16_t wAgcValue;                        /*Agc Min Value*/
-  uint16_t wAgcValueTolerance;               /*Txdo Measured Range*/
-                                             /* Agc value with NFCLD */
-  uint16_t wAgcValuewithfixedNFCLD;          /*Agc Value with Fixed NFCLD Max */
-  uint16_t wAgcValuewithfixedNFCLDTolerance; /*Agc Value with Fixed NFCLD
-                                                Tolerance */
-  /* Agc Differential Values With Open/Short RM */
-  uint16_t wAgcDifferentialWithOpen1;          /*Agc Differential With Open 1*/
-  uint16_t wAgcDifferentialWithOpenTolerance1; /*Agc Differential With Open
-                                                  Tolerance 1*/
-  uint16_t wAgcDifferentialWithOpen2;          /*Agc Differential With Open 2*/
-  uint16_t wAgcDifferentialWithOpenTolerance2; /*Agc Differential With Open
-                                                  Tolerance 2*/
-} phAntenna_St_Resp_t; /* Instance of Transaction structure */
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_TestMode_open
- **
- ** Description      It opens the physical connection with NFCC (pn547) and
- **                  creates required client thread for operation.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_TestMode_open(void);
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_TestMode_close
- **
- ** Description      This function close the NFCC interface and free all
- **                  resources.
- **
- ** Returns          None.
- **
- ******************************************************************************/
-
-void phNxpNciHal_TestMode_close(void);
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_SwpTest
- **
- ** Description      Test function to validate the SWP line. SWP line number is
- **                  is sent as parameter to the API.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_SwpTest(uint8_t swp_line);
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_PrbsTestStart
- **
- ** Description      Test function start RF generation for RF technology and bit
- **                  rate. RF technology and bit rate are sent as parameter to
- **                  the API.
- **
- ** Returns          NFCSTATUS_SUCCESS if RF generation successful,
- **                  otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_PrbsType_t prbs_type,
-                                    phNxpNfc_PrbsHwType_t hw_prbs_type,
-                                    phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate);
-#else
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate);
-#endif
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_PrbsTestStop
- **
- ** Description      Test function stop RF generation for RF technology started
- **                  by phNxpNciHal_PrbsTestStart.
- **
- ** Returns          NFCSTATUS_SUCCESS if operation successful,
- **                  otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_PrbsTestStop();
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_AntennaSelfTest
-**
-** Description      Test function to validate the Antenna's discrete
-**                  components connection.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-
-NFCSTATUS phNxpNciHal_AntennaSelfTest(phAntenna_St_Resp_t* phAntenna_St_Resp);
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_RfFieldTest
-**
-** Description      Test function performs RF filed test.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-
-NFCSTATUS phNxpNciHal_RfFieldTest(uint8_t on);
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_DownloadPinTest
- **
- ** Description      Test function to validate the FW download pin connection.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_DownloadPinTest(void);
-
-#endif /* _NXP_HW_SELF_TEST_H_ */
-#endif /* _PHNXPNCIHAL_SELFTEST_H_ */
diff --git a/halimpl/pn54x/libnfc-brcm.conf b/halimpl/pn54x/libnfc-brcm.conf
deleted file mode 100644
index 14c6912..0000000
--- a/halimpl/pn54x/libnfc-brcm.conf
+++ /dev/null
@@ -1,400 +0,0 @@
-###################### Start of libnfc-brcm.conf #######################
-
-###############################################################################
-# Application options
-APPL_TRACE_LEVEL=0xFF
-PROTOCOL_TRACE_LEVEL=0xFFFFFFFF
-
-###############################################################################
-# performance measurement
-# Change this setting to control how often USERIAL log the performance (throughput)
-# data on read/write/poll
-# defailt is to log performance dara for every 100 read or write
-#REPORT_PERFORMANCE_MEASURE=100
-
-###############################################################################
-# File used for NFA storage
-NFA_STORAGE="/data/nfc"
-
-###############################################################################
-# Snooze Mode Settings
-#
-#  By default snooze mode is enabled.  Set SNOOZE_MODE_CFG byte[0] to 0
-#  to disable.
-#
-#  If SNOOZE_MODE_CFG is not provided, the default settings are used:
-#  They are as follows:
-#       8             Sleep Mode (0=Disabled 1=UART 8=SPI/I2C)
-#       0             Idle Threshold Host
-#       0             Idle Threshold HC
-#       0             NFC Wake active mode (0=ActiveLow 1=ActiveHigh)
-#       1             Host Wake active mode (0=ActiveLow 1=ActiveHigh)
-#
-#SNOOZE_MODE_CFG={08:00:00:00:01}
-
-###############################################################################
-# Insert a delay in milliseconds after NFC_WAKE and before write to NFCC
-#NFC_WAKE_DELAY=20
-
-###############################################################################
-# Various Delay settings (in ms) used in USERIAL
-#  POWER_ON_DELAY
-#    Delay after turning on chip, before writing to transport (default 300)
-#  PRE_POWER_OFF_DELAY
-#    Delay after deasserting NFC-Wake before turn off chip (default 0)
-#  POST_POWER_OFF_DELAY
-#    Delay after turning off chip, before USERIAL_close returns (default 0)
-#
-#POWER_ON_DELAY=300
-#PRE_POWER_OFF_DELAY=0
-#POST_POWER_OFF_DELAY=0
-
-###############################################################################
-# Maximum time (ms) to wait for RESET NTF after setting REG_PU to high
-# The default is 1000.
-#NFCC_ENABLE_TIMEOUT=0
-
-###############################################################################
-# LPTD mode configuration
-#  byte[0] is the length of the remaining bytes in this value
-#     if set to 0, LPTD params will NOT be sent to NFCC (i.e. disabled).
-#  byte[1] is the param id it should be set to B9.
-#  byte[2] is the length of the LPTD parameters
-#  byte[3] indicates if LPTD is enabled
-#     if set to 0, LPTD will be disabled (parameters will still be sent).
-#  byte[4-n] are the LPTD parameters.
-#  By default, LPTD is enabled and default settings are used.
-#  See nfc_hal_dm_cfg.c for defaults
-#LPTD_CFG={23:B9:21:01:02:FF:FF:04:A0:0F:40:00:80:02:02:10:00:00:00:31:0C:30:00:00:00:00:00:00:00:00:00:00:00:00:00:00}
-
-###############################################################################
-# Startup Configuration (100 bytes maximum)
-#
-# For the 0xCA parameter, byte[9] (marked by 'AA') is for UICC0, and byte[10] (marked by BB) is
-#    for UICC1.  The values are defined as:
-#   0 : UICCx only supports ISO_DEP in low power mode.
-#   2 : UICCx only supports Mifare in low power mode.
-#   3 : UICCx supports both ISO_DEP and Mifare in low power mode.
-#
-#                                                                          AA BB
-#NFA_DM_START_UP_CFG={1F:CB:01:01:A5:01:01:CA:14:00:00:00:00:06:E8:03:00:00:00:00:00:00:00:00:00:00:00:00:00:80:01:01}
-
-###############################################################################
-# Startup Vendor Specific Configuration (100 bytes maximum);
-#  byte[0] TLV total len = 0x5
-#  byte[1] NCI_MTS_CMD|NCI_GID_PROP = 0x2f
-#  byte[2] NCI_MSG_FRAME_LOG = 0x9
-#  byte[3] 2
-#  byte[4] 0=turn off RF frame logging; 1=turn on
-#  byte[5] 0=turn off SWP frame logging; 1=turn on
-#  NFA_DM_START_UP_VSC_CFG={05:2F:09:02:01:01}
-
-###############################################################################
-# Antenna Configuration - This data is used when setting 0xC8 config item
-# at startup (before discovery is started).  If not used, no value is sent.
-#
-# The settings for this value are documented here:
-# http://wcgbu.broadcom.com/wpan/PM/Project%20Document%20Library/bcm20791B0/
-#   Design/Doc/PHY%20register%20settings/BCM20791-B2-1027-02_PHY_Recommended_Reg_Settings.xlsx
-# This document is maintained by Paul Forshaw.
-#
-# The values marked as ?? should be tweaked per antenna or customer/app:
-# {20:C8:1E:06:??:00:??:??:??:00:??:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:??:01:00:00:40:04}
-# array[0] = 0x20 is length of the payload from array[1] to the end
-# array[1] = 0xC8 is PREINIT_DSP_CFG
-#PREINIT_DSP_CFG={20:C8:1E:06:1F:00:0F:03:3C:00:04:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:48:01:00:00:40:04}
-
-###############################################################################
-# Configure crystal frequency when internal LPO can't detect the frequency.
-#XTAL_FREQUENCY=0
-###############################################################################
-# Configure the default Destination Gate used by HCI (the default is 4, which
-# is the ETSI loopback gate.
-NFA_HCI_DEFAULT_DEST_GATE=0xF0
-
-###############################################################################
-# Configure the single default SE to use.  The default is to use the first
-# SE that is detected by the stack.  This value might be used when the phone
-# supports multiple SE (e.g. 0xF3 and 0xF4) but you want to force it to use
-# one of them (e.g. 0xF4).
-#ACTIVE_SE=0xF3
-
-###############################################################################
-# Configure the default NfcA/IsoDep techology and protocol route. Can be
-# either a secure element (e.g. 0xF4) or the host (0x00)
-#DEFAULT_ISODEP_ROUTE=0x00
-
-###############################################################################
-# Configure the NFC Extras to open and use a static pipe.  If the value is
-# not set or set to 0, then the default is use a dynamic pipe based on a
-# destination gate (see NFA_HCI_DEFAULT_DEST_GATE).  Note there is a value
-# for each UICC (where F3="UICC0" and F4="UICC1")
-#NFA_HCI_STATIC_PIPE_ID_F3=0x70
-#NFA_HCI_STATIC_PIPE_ID_01=0x19
-NFA_HCI_STATIC_PIPE_ID_C0=0x19
-###############################################################################
-# When disconnecting from Oberthur secure element, perform a warm-reset of
-# the secure element to deselect the applet.
-# The default hex value of the command is 0x3.  If this variable is undefined,
-# then this feature is not used.
-#OBERTHUR_WARM_RESET_COMMAND=0x03
-
-###############################################################################
-# Force UICC to only listen to the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F
-UICC_LISTEN_TECH_MASK=0x07
-
-###############################################################################
-# Force HOST listen feature enable or disable.
-# 0: Disable
-# 1: Enable
-HOST_LISTEN_ENABLE=0x01
-
-###############################################################################
-# Enabling/Disabling Forward functionality
-# Disable           0x00
-# Enable            0x01
-NXP_FWD_FUNCTIONALITY_ENABLE=0x01
-
-###############################################################################
-# Allow UICC to be powered off if there is no traffic.
-# Timeout is in ms. If set to 0, then UICC will not be powered off.
-#UICC_IDLE_TIMEOUT=30000
-UICC_IDLE_TIMEOUT=0
-
-###############################################################################
-# AID for Empty Select command
-# If specified, this AID will be substituted when an Empty SELECT command is
-# detected.  The first byte is the length of the AID.  Maximum length is 16.
-AID_FOR_EMPTY_SELECT={08:A0:00:00:01:51:00:00:00}
-###############################################################################
-# Maximum Number of Credits to be allowed by the NFCC
-#   This value overrides what the NFCC specifices allowing the host to have
-#   the control to work-around transport limitations.  If this value does
-#   not exist or is set to 0, the NFCC will provide the number of credits.
-MAX_RF_DATA_CREDITS=1
-
-###############################################################################
-# This setting allows you to disable registering the T4t Virtual SE that causes
-# the NFCC to send PPSE requests to the DH.
-# The default setting is enabled (i.e. T4t Virtual SE is registered).
-#REGISTER_VIRTUAL_SE=1
-
-###############################################################################
-# When screen is turned off, specify the desired power state of the controller.
-# 0: power-off-sleep state; DEFAULT
-# 1: full-power state
-# 2: screen-off card-emulation (CE4/CE3/CE1 modes are used)
-SCREEN_OFF_POWER_STATE=1
-
-###############################################################################
-# Firmware patch file
-#  If the value is not set then patch download is disabled.
-#FW_PATCH="/vendor/firmware/bcm2079x_firmware.ncd"
-
-###############################################################################
-# Firmware pre-patch file (sent before the above patch file)
-#  If the value is not set then pre-patch is not used.
-#FW_PRE_PATCH="/vendor/firmware/bcm2079x_pre_firmware.ncd"
-
-###############################################################################
-# Firmware patch format
-#   1 = HCD
-#   2 = NCD (default)
-#NFA_CONFIG_FORMAT=2
-
-###############################################################################
-# SPD Debug mode
-#  If set to 1, any failure of downloading a patch will trigger a hard-stop
-#SPD_DEBUG=0
-
-###############################################################################
-# SPD Max Retry Count
-#  The number of attempts to download a patch before giving up (defualt is 3).
-#  Note, this resets after a power-cycle.
-#SPD_MAX_RETRY_COUNT=3
-
-###############################################################################
-# transport driver
-#
-# TRANSPORT_DRIVER=<driver>
-#
-#  where <driver> can be, for example:
-#    "/dev/ttyS"        (UART)
-#    "/dev/bcmi2cnfc"   (I2C)
-#    "hwtun"            (HW Tunnel)
-#    "/dev/bcmspinfc"   (SPI)
-#    "/dev/btusb0"      (BT USB)
-#TRANSPORT_DRIVER="/dev/bcm2079x-i2c"
-
-###############################################################################
-# power control driver
-# Specify a kernel driver that support ioctl commands to control NFC_EN and
-# NFC_WAKE gpio signals.
-#
-# POWER_CONTRL_DRIVER=<driver>
-#  where <driver> can be, for example:
-#    "/dev/nfcpower"
-#    "/dev/bcmi2cnfc"   (I2C)
-#    "/dev/bcmspinfc"   (SPI)
-#    i2c and spi driver may be used to control NFC_EN and NFC_WAKE signal
-#POWER_CONTROL_DRIVER="/dev/bcm2079x-i2c"
-
-###############################################################################
-# I2C transport driver options
-# Mako does not support 10-bit I2C addresses
-# Revert to 7-bit address
-#BCMI2CNFC_ADDRESS=0x77
-
-###############################################################################
-# I2C transport driver try to read multiple packets in read() if data is available
-# remove the comment below to enable this feature
-#READ_MULTIPLE_PACKETS=1
-
-###############################################################################
-# SPI transport driver options
-#SPI_NEGOTIATION={0A:F0:00:01:00:00:00:FF:FF:00:00}
-
-###############################################################################
-# UART transport driver options
-#
-# PORT=1,2,3,...
-# BAUD=115200, 19200, 9600, 4800,
-# DATABITS=8, 7, 6, 5
-# PARITY="even" | "odd" | "none"
-# STOPBITS="0" | "1" | "1.5" | "2"
-
-#UART_PORT=2
-#UART_BAUD=115200
-#UART_DATABITS=8
-#UART_PARITY="none"
-#UART_STOPBITS="1"
-
-###############################################################################
-# Insert a delay in microseconds per byte after a write to NFCC.
-# after writing a block of data to the NFCC, delay this an amopunt of time before
-# writing next block of data.  the delay is calculated as below
-#   NFC_WRITE_DELAY * (number of byte written) / 1000 milliseconds
-# e.g. after 259 bytes is written, delay (259 * 20 / 1000) 5 ms before next write
-#NFC_WRITE_DELAY=20
-
-###############################################################################
-# Maximum Number of Credits to be allowed by the NFCC
-#   This value overrides what the NFCC specifices allowing the host to have
-#   the control to work-around transport limitations.  If this value does
-#   not exist or is set to 0, the NFCC will provide the number of credits.
-MAX_RF_DATA_CREDITS=1
-
-###############################################################################
-# Default poll duration (in ms)
-#  The defualt is 500ms if not set (see nfc_target.h)
-#NFA_DM_DISC_DURATION_POLL=333
-###############################################################################
-# Antenna Configuration - This data is used when setting 0xC8 config item
-# at startup (before discovery is started).  If not used, no value is sent.
-#
-# The settings for this value are documented here:
-# http://wcgbu.broadcom.com/wpan/PM/Project%20Document%20Library/bcm20791B0/
-#   Design/Doc/PHY%20register%20settings/BCM20791-B2-1027-02_PHY_Recommended_Reg_Settings.xlsx
-# This document is maintained by Paul Forshaw.
-#
-# The values marked as ?? should be tweaked per antenna or customer/app:
-# {20:C8:1E:06:??:00:??:??:??:00:??:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:??:01:00:00:40:04}
-# array[0] = 0x20 is length of the payload from array[1] to the end
-# array[1] = 0xC8 is PREINIT_DSP_CFG
-#PREINIT_DSP_CFG={20:C8:1E:06:1F:00:0F:03:3C:00:04:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:48:01:00:00:40:04}
-
-###############################################################################
-# Choose the presence-check algorithm for type-4 tag.  If not defined, the default value is 1.
-# 0  NFA_RW_PRES_CHK_DEFAULT; Let stack selects an algorithm
-# 1  NFA_RW_PRES_CHK_I_BLOCK; ISO-DEP protocol's empty I-block
-# 2  NFA_RW_PRES_CHK_RESET; Deactivate to Sleep, then re-activate
-# 3  NFA_RW_PRES_CHK_RB_CH0; Type-4 tag protocol's ReadBinary command on channel 0
-# 4  NFA_RW_PRES_CHK_RB_CH3; Type-4 tag protocol's ReadBinary command on channel 3
-PRESENCE_CHECK_ALGORITHM=1
-
-###############################################################################
-# Force tag polling for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B |
-#            NFA_TECHNOLOGY_MASK_F | NFA_TECHNOLOGY_MASK_ISO15693 |
-#            NFA_TECHNOLOGY_MASK_B_PRIME | NFA_TECHNOLOGY_MASK_KOVIO |
-#            NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE.
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_B             0x02    /* NFC Technology B             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-# NFA_TECHNOLOGY_MASK_ISO15693      0x08    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_KOVIO         0x20    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_A_ACTIVE      0x40    /* NFC Technology A active mode */
-# NFA_TECHNOLOGY_MASK_F_ACTIVE      0x80    /* NFC Technology F active mode */
-POLLING_TECH_MASK=0xEF
-
-###############################################################################
-# Force P2P to only listen for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F |
-#            NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-# NFA_TECHNOLOGY_MASK_A_ACTIVE      0x40    /* NFC Technology A active mode */
-# NFA_TECHNOLOGY_MASK_F_ACTIVE      0x80    /* NFC Technology F active mode */
-P2P_LISTEN_TECH_MASK=0xC5
-
-PRESERVE_STORAGE=0x01
-
-###############################################################################
-# Override the stack default for NFA_EE_MAX_EE_SUPPORTED set in nfc_target.h.
-# The value is set to 3 by default as it assumes we will discover 0xF2,
-# 0xF3, and 0xF4. If a platform will exclude and SE, this value can be reduced
-# so that the stack will not wait any longer than necessary.
-
-# Maximum EE supported number
-# NXP PN547C2 0x02
-# NXP PN65T 0x03
-# NXP PN548C2 0x02
-# NXP PN66T 0x03
-NFA_MAX_EE_SUPPORTED=0x02
-
-###############################################################################
-# NCI Hal Module name
-NCI_HAL_MODULE="nfc_nci"
-
-##############################################################################
-# Deactivate notification wait time out in seconds used in ETSI Reader mode
-# 0 - Infinite wait
-#NFA_DM_DISC_NTF_TIMEOUT=0
-
-###############################################################################
-# AID_MATCHING constants
-# AID_MATCHING_EXACT_ONLY 0x00
-# AID_MATCHING_EXACT_OR_PREFIX 0x01
-# AID_MATCHING_PREFIX_ONLY 0x02
-AID_MATCHING_MODE=0x01
-
-###############################################################################
-# Default Secure Element route id
-DEFAULT_OFFHOST_ROUTE=0x02
-
-###############################################################################
-# Vendor Specific Proprietary Protocol & Discovery Configuration
-# Set to 0xFF if unsupported
-#  byte[0] NCI_PROTOCOL_18092_ACTIVE
-#  byte[1] NCI_PROTOCOL_B_PRIME
-#  byte[2] NCI_PROTOCOL_DUAL
-#  byte[3] NCI_PROTOCOL_15693
-#  byte[4] NCI_PROTOCOL_KOVIO
-#  byte[5] NCI_PROTOCOL_MIFARE
-#  byte[6] NCI_DISCOVERY_TYPE_POLL_KOVIO
-#  byte[7] NCI_DISCOVERY_TYPE_POLL_B_PRIME
-#  byte[8] NCI_DISCOVERY_TYPE_LISTEN_B_PRIME
-NFA_PROPRIETARY_CFG={05:FF:FF:06:81:80:70:FF:FF}
-
-###############################################################################
-# Bail out mode
-#  If set to 1, NFCC is using bail out mode for either Type A or Type B poll.
-NFA_POLL_BAIL_OUT_MODE=0x01
diff --git a/halimpl/pn54x/libnfc-brcm_NCI2_0.conf b/halimpl/pn54x/libnfc-brcm_NCI2_0.conf
deleted file mode 100644
index a4d3290..0000000
--- a/halimpl/pn54x/libnfc-brcm_NCI2_0.conf
+++ /dev/null
@@ -1,407 +0,0 @@
-###################### Start of libnfc-brcm.conf #######################
-
-###############################################################################
-# Application options
-APPL_TRACE_LEVEL=0xFF
-PROTOCOL_TRACE_LEVEL=0xFFFFFFFF
-
-###############################################################################
-# performance measurement
-# Change this setting to control how often USERIAL log the performance (throughput)
-# data on read/write/poll
-# defailt is to log performance dara for every 100 read or write
-#REPORT_PERFORMANCE_MEASURE=100
-
-###############################################################################
-# File used for NFA storage
-NFA_STORAGE="/data/nfc"
-
-###############################################################################
-# Snooze Mode Settings
-#
-#  By default snooze mode is enabled.  Set SNOOZE_MODE_CFG byte[0] to 0
-#  to disable.
-#
-#  If SNOOZE_MODE_CFG is not provided, the default settings are used:
-#  They are as follows:
-#       8             Sleep Mode (0=Disabled 1=UART 8=SPI/I2C)
-#       0             Idle Threshold Host
-#       0             Idle Threshold HC
-#       0             NFC Wake active mode (0=ActiveLow 1=ActiveHigh)
-#       1             Host Wake active mode (0=ActiveLow 1=ActiveHigh)
-#
-#SNOOZE_MODE_CFG={08:00:00:00:01}
-
-###############################################################################
-# Insert a delay in milliseconds after NFC_WAKE and before write to NFCC
-#NFC_WAKE_DELAY=20
-
-###############################################################################
-# Various Delay settings (in ms) used in USERIAL
-#  POWER_ON_DELAY
-#    Delay after turning on chip, before writing to transport (default 300)
-#  PRE_POWER_OFF_DELAY
-#    Delay after deasserting NFC-Wake before turn off chip (default 0)
-#  POST_POWER_OFF_DELAY
-#    Delay after turning off chip, before USERIAL_close returns (default 0)
-#
-#POWER_ON_DELAY=300
-#PRE_POWER_OFF_DELAY=0
-#POST_POWER_OFF_DELAY=0
-
-###############################################################################
-# Maximum time (ms) to wait for RESET NTF after setting REG_PU to high
-# The default is 1000.
-#NFCC_ENABLE_TIMEOUT=0
-
-###############################################################################
-# LPTD mode configuration
-#  byte[0] is the length of the remaining bytes in this value
-#     if set to 0, LPTD params will NOT be sent to NFCC (i.e. disabled).
-#  byte[1] is the param id it should be set to B9.
-#  byte[2] is the length of the LPTD parameters
-#  byte[3] indicates if LPTD is enabled
-#     if set to 0, LPTD will be disabled (parameters will still be sent).
-#  byte[4-n] are the LPTD parameters.
-#  By default, LPTD is enabled and default settings are used.
-#  See nfc_hal_dm_cfg.c for defaults
-#LPTD_CFG={23:B9:21:01:02:FF:FF:04:A0:0F:40:00:80:02:02:10:00:00:00:31:0C:30:00:00:00:00:00:00:00:00:00:00:00:00:00:00}
-
-###############################################################################
-# Startup Configuration (100 bytes maximum)
-#
-# For the 0xCA parameter, byte[9] (marked by 'AA') is for UICC0, and byte[10] (marked by BB) is
-#    for UICC1.  The values are defined as:
-#   0 : UICCx only supports ISO_DEP in low power mode.
-#   2 : UICCx only supports Mifare in low power mode.
-#   3 : UICCx supports both ISO_DEP and Mifare in low power mode.
-#
-#                                                                          AA BB
-#NFA_DM_START_UP_CFG={1F:CB:01:01:A5:01:01:CA:14:00:00:00:00:06:E8:03:00:00:00:00:00:00:00:00:00:00:00:00:00:80:01:01}
-
-###############################################################################
-# Startup Vendor Specific Configuration (100 bytes maximum);
-#  byte[0] TLV total len = 0x5
-#  byte[1] NCI_MTS_CMD|NCI_GID_PROP = 0x2f
-#  byte[2] NCI_MSG_FRAME_LOG = 0x9
-#  byte[3] 2
-#  byte[4] 0=turn off RF frame logging; 1=turn on
-#  byte[5] 0=turn off SWP frame logging; 1=turn on
-#  NFA_DM_START_UP_VSC_CFG={05:2F:09:02:01:01}
-
-###############################################################################
-# Antenna Configuration - This data is used when setting 0xC8 config item
-# at startup (before discovery is started).  If not used, no value is sent.
-#
-# The settings for this value are documented here:
-# http://wcgbu.broadcom.com/wpan/PM/Project%20Document%20Library/bcm20791B0/
-#   Design/Doc/PHY%20register%20settings/BCM20791-B2-1027-02_PHY_Recommended_Reg_Settings.xlsx
-# This document is maintained by Paul Forshaw.
-#
-# The values marked as ?? should be tweaked per antenna or customer/app:
-# {20:C8:1E:06:??:00:??:??:??:00:??:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:??:01:00:00:40:04}
-# array[0] = 0x20 is length of the payload from array[1] to the end
-# array[1] = 0xC8 is PREINIT_DSP_CFG
-#PREINIT_DSP_CFG={20:C8:1E:06:1F:00:0F:03:3C:00:04:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:48:01:00:00:40:04}
-
-###############################################################################
-# Configure crystal frequency when internal LPO can't detect the frequency.
-#XTAL_FREQUENCY=0
-###############################################################################
-# Configure the default Destination Gate used by HCI (the default is 4, which
-# is the ETSI loopback gate.
-NFA_HCI_DEFAULT_DEST_GATE=0xF0
-
-###############################################################################
-# Configure the single default SE to use.  The default is to use the first
-# SE that is detected by the stack.  This value might be used when the phone
-# supports multiple SE (e.g. 0xF3 and 0xF4) but you want to force it to use
-# one of them (e.g. 0xF4).
-#ACTIVE_SE=0xF3
-
-###############################################################################
-# Configure the default NfcA/IsoDep techology and protocol route. Can be
-# either a secure element (e.g. 0xF4) or the host (0x00)
-#DEFAULT_ISODEP_ROUTE=0x00
-
-###############################################################################
-# Configure the NFC Extras to open and use a static pipe.  If the value is
-# not set or set to 0, then the default is use a dynamic pipe based on a
-# destination gate (see NFA_HCI_DEFAULT_DEST_GATE).  Note there is a value
-# for each UICC (where F3="UICC0" and F4="UICC1")
-#NFA_HCI_STATIC_PIPE_ID_F3=0x70
-#NFA_HCI_STATIC_PIPE_ID_01=0x19
-NFA_HCI_STATIC_PIPE_ID_C0=0x19
-###############################################################################
-# When disconnecting from Oberthur secure element, perform a warm-reset of
-# the secure element to deselect the applet.
-# The default hex value of the command is 0x3.  If this variable is undefined,
-# then this feature is not used.
-#OBERTHUR_WARM_RESET_COMMAND=0x03
-
-###############################################################################
-# Force UICC to only listen to the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F
-UICC_LISTEN_TECH_MASK=0x07
-
-###############################################################################
-# Force HOST listen feature enable or disable.
-# 0: Disable
-# 1: Enable
-HOST_LISTEN_ENABLE=0x01
-
-###############################################################################
-# Enabling/Disabling Forward functionality
-# Disable           0x00
-# Enable            0x01
-NXP_FWD_FUNCTIONALITY_ENABLE=0x01
-
-###############################################################################
-# Allow UICC to be powered off if there is no traffic.
-# Timeout is in ms. If set to 0, then UICC will not be powered off.
-#UICC_IDLE_TIMEOUT=30000
-UICC_IDLE_TIMEOUT=0
-
-###############################################################################
-# AID for Empty Select command
-# If specified, this AID will be substituted when an Empty SELECT command is
-# detected.  The first byte is the length of the AID.  Maximum length is 16.
-AID_FOR_EMPTY_SELECT={08:A0:00:00:01:51:00:00:00}
-###############################################################################
-# Maximum Number of Credits to be allowed by the NFCC
-#   This value overrides what the NFCC specifices allowing the host to have
-#   the control to work-around transport limitations.  If this value does
-#   not exist or is set to 0, the NFCC will provide the number of credits.
-MAX_RF_DATA_CREDITS=1
-
-###############################################################################
-# This setting allows you to disable registering the T4t Virtual SE that causes
-# the NFCC to send PPSE requests to the DH.
-# The default setting is enabled (i.e. T4t Virtual SE is registered).
-#REGISTER_VIRTUAL_SE=1
-
-###############################################################################
-# When screen is turned off, specify the desired power state of the controller.
-# 0: power-off-sleep state; DEFAULT
-# 1: full-power state
-# 2: screen-off card-emulation (CE4/CE3/CE1 modes are used)
-SCREEN_OFF_POWER_STATE=1
-
-###############################################################################
-# Firmware patch file
-#  If the value is not set then patch download is disabled.
-#FW_PATCH="/vendor/firmware/bcm2079x_firmware.ncd"
-
-###############################################################################
-# Firmware pre-patch file (sent before the above patch file)
-#  If the value is not set then pre-patch is not used.
-#FW_PRE_PATCH="/vendor/firmware/bcm2079x_pre_firmware.ncd"
-
-###############################################################################
-# Firmware patch format
-#   1 = HCD
-#   2 = NCD (default)
-#NFA_CONFIG_FORMAT=2
-
-###############################################################################
-# SPD Debug mode
-#  If set to 1, any failure of downloading a patch will trigger a hard-stop
-#SPD_DEBUG=0
-
-###############################################################################
-# SPD Max Retry Count
-#  The number of attempts to download a patch before giving up (defualt is 3).
-#  Note, this resets after a power-cycle.
-#SPD_MAX_RETRY_COUNT=3
-
-###############################################################################
-# transport driver
-#
-# TRANSPORT_DRIVER=<driver>
-#
-#  where <driver> can be, for example:
-#    "/dev/ttyS"        (UART)
-#    "/dev/bcmi2cnfc"   (I2C)
-#    "hwtun"            (HW Tunnel)
-#    "/dev/bcmspinfc"   (SPI)
-#    "/dev/btusb0"      (BT USB)
-#TRANSPORT_DRIVER="/dev/bcm2079x-i2c"
-
-###############################################################################
-# power control driver
-# Specify a kernel driver that support ioctl commands to control NFC_EN and
-# NFC_WAKE gpio signals.
-#
-# POWER_CONTRL_DRIVER=<driver>
-#  where <driver> can be, for example:
-#    "/dev/nfcpower"
-#    "/dev/bcmi2cnfc"   (I2C)
-#    "/dev/bcmspinfc"   (SPI)
-#    i2c and spi driver may be used to control NFC_EN and NFC_WAKE signal
-#POWER_CONTROL_DRIVER="/dev/bcm2079x-i2c"
-
-###############################################################################
-# I2C transport driver options
-# Mako does not support 10-bit I2C addresses
-# Revert to 7-bit address
-#BCMI2CNFC_ADDRESS=0x77
-
-###############################################################################
-# I2C transport driver try to read multiple packets in read() if data is available
-# remove the comment below to enable this feature
-#READ_MULTIPLE_PACKETS=1
-
-###############################################################################
-# SPI transport driver options
-#SPI_NEGOTIATION={0A:F0:00:01:00:00:00:FF:FF:00:00}
-
-###############################################################################
-# UART transport driver options
-#
-# PORT=1,2,3,...
-# BAUD=115200, 19200, 9600, 4800,
-# DATABITS=8, 7, 6, 5
-# PARITY="even" | "odd" | "none"
-# STOPBITS="0" | "1" | "1.5" | "2"
-
-#UART_PORT=2
-#UART_BAUD=115200
-#UART_DATABITS=8
-#UART_PARITY="none"
-#UART_STOPBITS="1"
-
-###############################################################################
-# Insert a delay in microseconds per byte after a write to NFCC.
-# after writing a block of data to the NFCC, delay this an amopunt of time before
-# writing next block of data.  the delay is calculated as below
-#   NFC_WRITE_DELAY * (number of byte written) / 1000 milliseconds
-# e.g. after 259 bytes is written, delay (259 * 20 / 1000) 5 ms before next write
-#NFC_WRITE_DELAY=20
-
-###############################################################################
-# Maximum Number of Credits to be allowed by the NFCC
-#   This value overrides what the NFCC specifices allowing the host to have
-#   the control to work-around transport limitations.  If this value does
-#   not exist or is set to 0, the NFCC will provide the number of credits.
-MAX_RF_DATA_CREDITS=1
-
-###############################################################################
-# Default poll duration (in ms)
-#  The defualt is 500ms if not set (see nfc_target.h)
-#NFA_DM_DISC_DURATION_POLL=333
-###############################################################################
-# Antenna Configuration - This data is used when setting 0xC8 config item
-# at startup (before discovery is started).  If not used, no value is sent.
-#
-# The settings for this value are documented here:
-# http://wcgbu.broadcom.com/wpan/PM/Project%20Document%20Library/bcm20791B0/
-#   Design/Doc/PHY%20register%20settings/BCM20791-B2-1027-02_PHY_Recommended_Reg_Settings.xlsx
-# This document is maintained by Paul Forshaw.
-#
-# The values marked as ?? should be tweaked per antenna or customer/app:
-# {20:C8:1E:06:??:00:??:??:??:00:??:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:??:01:00:00:40:04}
-# array[0] = 0x20 is length of the payload from array[1] to the end
-# array[1] = 0xC8 is PREINIT_DSP_CFG
-#PREINIT_DSP_CFG={20:C8:1E:06:1F:00:0F:03:3C:00:04:24:00:1C:00:75:00:77:00:76:00:1C:00:03:00:0A:00:48:01:00:00:40:04}
-
-###############################################################################
-# Choose the presence-check algorithm for type-4 tag.  If not defined, the default value is 1.
-# 0  NFA_RW_PRES_CHK_DEFAULT; Let stack selects an algorithm
-# 1  NFA_RW_PRES_CHK_I_BLOCK; ISO-DEP protocol's empty I-block
-# 2  NFA_RW_PRES_CHK_RESET; Deactivate to Sleep, then re-activate
-# 3  NFA_RW_PRES_CHK_RB_CH0; Type-4 tag protocol's ReadBinary command on channel 0
-# 4  NFA_RW_PRES_CHK_RB_CH3; Type-4 tag protocol's ReadBinary command on channel 3
-# 5  NFA_RW_PRES_CHK_ISO_DEP_NAK; Type - 4 tag protocol iso-dep nak presence check
-#    command is sent waiting for rsp and ntf.
-PRESENCE_CHECK_ALGORITHM=5
-
-###############################################################################
-# Force tag polling for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B |
-#            NFA_TECHNOLOGY_MASK_F | NFA_TECHNOLOGY_MASK_ISO15693 |
-#            NFA_TECHNOLOGY_MASK_B_PRIME | NFA_TECHNOLOGY_MASK_KOVIO |
-#NFA_TECHNOLOGY_MASK_ACTIVE
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_B             0x02    /* NFC Technology B             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-# NFA_TECHNOLOGY_MASK_ISO15693      0x08    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_KOVIO         0x20    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_ACTIVE        0x40    /* NFC Technology Active        */
-POLLING_TECH_MASK=0x6F
-
-###############################################################################
-# Force P2P to only listen for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F |
-#NFA_TECHNOLOGY_MASK_ACTIVE
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-#NFA_TECHNOLOGY_MASK_ACTIVE         0x40    /* NFC Technology Active        */
-P2P_LISTEN_TECH_MASK=0x45
-
-PRESERVE_STORAGE=0x01
-
-###############################################################################
-# Override the stack default for NFA_EE_MAX_EE_SUPPORTED set in nfc_target.h.
-# The value is set to 3 by default as it assumes we will discover 0xF2,
-# 0xF3, and 0xF4. If a platform will exclude and SE, this value can be reduced
-# so that the stack will not wait any longer than necessary.
-
-# Maximum EE supported number
-# NXP PN547C2 0x02
-# NXP PN65T 0x03
-# NXP PN548C2 0x02
-# NXP PN66T 0x03
-NFA_MAX_EE_SUPPORTED=0x02
-
-###############################################################################
-# NCI Hal Module name
-NCI_HAL_MODULE="nfc_nci"
-
-##############################################################################
-# Deactivate notification wait time out in seconds used in ETSI Reader mode
-# 0 - Infinite wait
-#NFA_DM_DISC_NTF_TIMEOUT=0
-
-###############################################################################
-# AID_MATCHING constants
-# AID_MATCHING_EXACT_ONLY 0x00
-# AID_MATCHING_EXACT_OR_PREFIX 0x01
-# AID_MATCHING_PREFIX_ONLY 0x02
-# AID_MATCHING_EXACT_OR_SUBSET_OR_PREFIX 0x03
-AID_MATCHING_MODE=0x03
-
-###############################################################################
-# Default Secure Element route id
-DEFAULT_OFFHOST_ROUTE=0x02
-
-###############################################################################
-# Vendor Specific Proprietary Protocol & Discovery Configuration
-# Set to 0xFF if unsupported
-#  byte[0] NCI_PROTOCOL_18092_ACTIVE
-#  byte[1] NCI_PROTOCOL_B_PRIME
-#  byte[2] NCI_PROTOCOL_DUAL
-#  byte[3] NCI_PROTOCOL_15693
-#  byte[4] NCI_PROTOCOL_KOVIO
-#  byte[5] NCI_PROTOCOL_MIFARE
-#  byte[6] NCI_DISCOVERY_TYPE_POLL_KOVIO
-#  byte[7] NCI_DISCOVERY_TYPE_POLL_B_PRIME
-#  byte[8] NCI_DISCOVERY_TYPE_LISTEN_B_PRIME
-NFA_PROPRIETARY_CFG={05:FF:FF:06:81:80:70:FF:FF}
-
-###############################################################################
-# Bail out mode
-#  If set to 1, NFCC is using bail out mode for either Type A or Type B poll.
-NFA_POLL_BAIL_OUT_MODE=0x01
-###############################################################################
-# Enable/Disable Block Route feature.
-# Block Route will restrict routing to first matched rule
-# Block Route enable   0x01
-# Block Route disable  0x00
-NFA_BLOCK_ROUTE=0x00
diff --git a/halimpl/pn54x/libnfc-nxp-PN547C2_example.conf b/halimpl/pn54x/libnfc-nxp-PN547C2_example.conf
deleted file mode 100644
index 913030f..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN547C2_example.conf
+++ /dev/null
@@ -1,224 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn54x)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn54x)
-
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-#
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn54x"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn547_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-
-NXP_SYS_CLK_SRC_SEL=0x01
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-
-NXP_SYS_CLK_FREQ_SEL=0x00
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-#Atonomous Mode
-#Enable 0x01
-#Disable 0x00
-NXP_CORE_SCRN_OFF_AUTONOMOUS_ENABLE=0x00
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-# NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-NXP_CORE_CONF_EXTN={20, 02, 16, 04,
-    A0, EC, 01, 01,
-    A0, ED, 01, 01,
-    A0, 5E, 01, 01,
-    A0, 0D, 06, 3E, 2D, 15, 88, 15, 00
-    }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 01
-        }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2B, 0D,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        60, 01, 0E,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-
-NXP_DEFAULT_SE=0x02
-
-NXP_DEFAULT_NFCEE_TIMEOUT=0x06
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-##############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-
-NXP_NFC_CHIP=0x01
-
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-# CE when Screen state is locked
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
diff --git a/halimpl/pn54x/libnfc-nxp-PN548AD_example.conf b/halimpl/pn54x/libnfc-nxp-PN548AD_example.conf
deleted file mode 100644
index 53121b2..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN548AD_example.conf
+++ /dev/null
@@ -1,271 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn54x)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn54x)
-
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-#
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn54x"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn548ad_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, There are currently three
-#configurations (1, 2 and 3) are supported, out of them only one can be
-#supported.
-
-NXP_EXT_TVDD_CFG=0x01
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 02, 09, 00}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 4.7V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 56, 64, 0A}
-
-###############################################################################
-#config3: use DCDC in CE, use Tx_Pwr_Req, SLALM, monitoring 5V from DCDC,
-#DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_3={20, 02, 0B, 02, A0, 66, 01, 01, A0, 0E, 03, 52, 64, 0A}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-NXP_CORE_CONF_EXTN={20, 02, 19, 06,
-    A0, EC, 01, 01,
-    A0, ED, 01, 00,
-    A0, 5E, 01, 01,
-    A0, 40, 01, 01,
-    A0, DD, 01, 2D,
-    A0, 96, 01, 01
-    }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 01
-        }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2E, 0E,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-
-NXP_DEFAULT_SE=0x03
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-
-NXP_NFC_CHIP=0x03
-
-###############################################################################
-# CE when Screen state is locked
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-NXP_DEFAULT_NFCEE_TIMEOUT=0x06
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable 0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
diff --git a/halimpl/pn54x/libnfc-nxp-PN551_example.conf b/halimpl/pn54x/libnfc-nxp-PN551_example.conf
deleted file mode 100644
index ba42b20..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN551_example.conf
+++ /dev/null
@@ -1,273 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn54x)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn54x)
-
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-#
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn544"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn551_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-
-NXP_SYS_CLOCK_TO_CFG=0x06
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, There are currently three
-#configurations (1, 2 and 3) are supported, out of them only one can be
-#supported.
-
-NXP_EXT_TVDD_CFG=0x01
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 02, 09, 00}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 3.3V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 56, 24, 08 }
-
-###############################################################################
-#config3: use DCDC in CE, use Tx_Pwr_Req, SLALM, monitoring 5V from DCDC,
-#DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_3={20, 02, 0B, 02, A0, 66, 01, 01, A0, 0E, 03, 52, 40, 0A}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-NXP_CORE_CONF_EXTN={20, 02, 19, 06,
-    A0, EC, 01, 01,
-    A0, ED, 01, 00,
-    A0, 5E, 01, 01,
-    A0, 40, 01, 01,
-    A0, DD, 01, 2D,
-    A0, 96, 01, 01
-    }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 01
-        }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2E, 0E,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-
-NXP_DEFAULT_SE=0x03
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-#PN551              0x05
-#PN67T              0x06
-
-NXP_NFC_CHIP=0x05
-
-###############################################################################
-# CE when Screen state is locked
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-NXP_DEFAULT_NFCEE_TIMEOUT=0x06
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable 0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
diff --git a/halimpl/pn54x/libnfc-nxp-PN553_example.conf b/halimpl/pn54x/libnfc-nxp-PN553_example.conf
deleted file mode 100644
index 818e473..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN553_example.conf
+++ /dev/null
@@ -1,447 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn547)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn547)
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn553"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, two configurations (1 and 2) supported,
-# out of them only one can be configured at a time.
-NXP_EXT_TVDD_CFG=0x02
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0F, 01, A0, 0E, 0B, 31, 01, 01, 31, 00, 00, 00, 01, 00, D0, 0C}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 3.3V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0F, 01, A0, 0E, 0B, 11, 01, C2, B2, 00, B2, 1E, 1F, 00, D0, 0C}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Set configuration optimization decision setting
-# Enable    = 0x01
-# Disable   = 0x00
-NXP_SET_CONFIG_ALWAYS=0x00
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-# Clock timeout settings A004
-# eSE (SVDD) PWR REQ settings A0F2
-# How eSE connected to PN553 A012
-# UICC2 bit rate A0D1
-# SWP1A interface A0D4
-# DWP intf behavior config, SVDD Load activated by default if set to 0x31 - A037
-NXP_CORE_CONF_EXTN={20, 02, 25, 09,
-    A0, EC, 01, 01,
-    A0, ED, 01, 00,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 40, 01, 01,
-    A0, DD, 01, 2D,
-    A0, D1, 01, 02,
-    A0, D4, 01, 01,
-    A0, 37, 01, 35
-   }
-#       A0, F2, 01, 01,
-#       A0, 40, 01, 01,
-#       A0, 41, 01, 02,
-#       A0, 43, 01, 04,
-#       A0, 02, 01, 01,
-#       A0, 03, 01, 11,
-#       A0, 07, 01, 03,
-#       A0, 08, 01, 01
-#       }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set
-# to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 00 }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set
-# to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2E, 0E,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-# UICC2             0x04
-
-NXP_DEFAULT_SE=0x07
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-#PN551              0x05
-#PN67T              0x06
-#PN553              0x07
-#PN80T              0x08
-NXP_NFC_CHIP=0x07
-
-###############################################################################
-# CE when Screen state is locked
-# This setting is for DEFAULT_AID_ROUTE,
-# DEFAULT_DESFIRE_ROUTE and DEFAULT_MIFARE_CLT_ROUTE
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-###############################################################################
-NXP_DEFAULT_NFCEE_TIMEOUT=20
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-#Set the default AID Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_AID_PWR_STATE=0x19
-
-###############################################################################
-#Set the Mifare Desfire Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_DESFIRE_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Mifare CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_MIFARE_CLT_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Felica CLT route Location :
-#This settings will be used when application does not set this parameter
-# eSE  0x01
-# UICC 0x02
-# UICC2 0x03
-DEFAULT_FELICA_CLT_ROUTE=0x01
-
-###############################################################################
-#Set the Felica CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_FELICA_CLT_PWR_STATE=0x1B
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable  0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x22
-
-###############################################################################
-#Timeout value  in milliseconds for NFCC standby mode.The range is between 5000
-#msec to 20000 msec and zero is to disable.
-NXP_NFCC_STANDBY_TIMEOUT=20000
-
-###############################################################################
-#Dynamic RSSI feature enable
-# Disable           0x00
-# Enable            0x01
-NXP_AGC_DEBUG_ENABLE=0x00
-
-###############################################################################
-#Virtual Mode ESE and Wired Mode ongoing delay Wired Mode
-# For Technology routing to ESE Technology Mask = 4
-# For ISO-DEP Protocol routing to ESE Mask      = 2
-# It can also take TECH|PROTO    = 6
-# To ignore the delay set mask to = 0
-NXP_ESE_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#Virtual Mode UICC and Wired Mode  ongoing delay Wired Mode
-#For Technology routing to UICC Technology Mask = 4
-#For ISO-DEP Protocol routing to UICC set Mask  = 2
-#For Select AID Routing to UICC       set Mask  = 1
-#It can also take values TECH|PROTO|SELECT_AID  = 7 , 6 , 5 ,3 .To ignore delay
-#set mask = 0
-NXP_UICC_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#RF field true delay Wired Mode
-# delay wired mode = 1
-# allow wired mode = 0
-NXP_WIRED_MODE_RF_FIELD_ENABLE=0x00
-
-###############################################################################
-#Config to allow adding aids
-#NFC on/off is required after this config
-#1 = enabling adding aid  to NFCC routing table.
-#0 = disabling adding aid to NFCC routing table.
-NXP_ENABLE_ADD_AID=0x01
-
-###############################################################################
-# JCOP-3.3 continuous process timeout in msec and value should be in Hexadecimal
-# JCOP CP TIMEOUT
-NXP_CP_TIMEOUT={00, 77}
-
-###############################################################################
-# Enable/Disable checking default proto SE Id
-# Disable           0x00
-# Enable            0x01
-NXP_CHECK_DEFAULT_PROTO_SE_ID=0x01
-
-###############################################################################
-#NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE
-#Enable/Disable block number checks for china transit use case
-#Enable  0x01
-#Disable  0x00
-NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
-
-###############################################################################
-# Restrict routing to first matched rule only.
-# Blacklist enable   0x01
-# Blacklist disable  0x00
-NXP_PROP_BLACKLIST_ROUTING=0x00
-
-###############################################################################
-# Timeout value in milliseconds to send response for Felica command received
-NXP_HCEF_CMD_RSP_TIMEOUT_VALUE=5000
-
-###############################################################################
\ No newline at end of file
diff --git a/halimpl/pn54x/libnfc-nxp-PN553_example_NCI2_0.conf b/halimpl/pn54x/libnfc-nxp-PN553_example_NCI2_0.conf
deleted file mode 100644
index 3dca16e..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN553_example_NCI2_0.conf
+++ /dev/null
@@ -1,449 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn547)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn547)
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn553"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, two configurations (1 and 2) supported,
-# out of them only one can be configured at a time.
-NXP_EXT_TVDD_CFG=0x02
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0F, 01, A0, 0E, 0B, 31, 01, 01, 31, 00, 00, 00, 01, 00, D0, 0C}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 3.3V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0F, 01, A0, 0E, 0B, 11, 01, C2, B2, 00, B2, 1E, 1F, 00, D0, 0C}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Set configuration optimization decision setting
-# Enable    = 0x01
-# Disable   = 0x00
-NXP_SET_CONFIG_ALWAYS=0x00
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-# Clock timeout settings A004
-# eSE (SVDD) PWR REQ settings A0F2
-# How eSE connected to PN553 A012
-# UICC2 bit rate A0D1
-# SWP1A interface A0D4
-# DWP intf behavior config, SVDD Load activated by default if set to 0x31 - A037
-NXP_CORE_CONF_EXTN={20, 02, 25, 09,
-    A0, EC, 01, 01,
-    A0, ED, 01, 00,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 40, 01, 01,
-    A0, DD, 01, 2D,
-    A0, D1, 01, 02,
-    A0, D4, 01, 01,
-    A0, 37, 01, 35
-   }
-#       A0, F2, 01, 01,
-#       A0, 40, 01, 01,
-#       A0, 41, 01, 02,
-#       A0, 43, 01, 04,
-#       A0, 02, 01, 01,
-#       A0, 03, 01, 11,
-#       A0, 07, 01, 03,
-#       A0, 08, 01, 01
-#       }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set
-# to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 00 }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set
-# to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 34, 10,
-        85, 01, 01,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01,
-        68, 01, 00
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-# UICC2             0x04
-
-NXP_DEFAULT_SE=0x07
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-#PN551              0x05
-#PN67T              0x06
-#PN553              0x07
-#PN80T              0x08
-NXP_NFC_CHIP=0x07
-
-###############################################################################
-# CE when Screen state is locked
-# This setting is for DEFAULT_AID_ROUTE,
-# DEFAULT_DESFIRE_ROUTE and DEFAULT_MIFARE_CLT_ROUTE
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-###############################################################################
-NXP_DEFAULT_NFCEE_TIMEOUT=20
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-#Set the default AID Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_AID_PWR_STATE=0x19
-
-###############################################################################
-#Set the Mifare Desfire Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_DESFIRE_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Mifare CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_MIFARE_CLT_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Felica CLT route Location :
-#This settings will be used when application does not set this parameter
-# eSE  0x01
-# UICC 0x02
-# UICC2 0x03
-DEFAULT_FELICA_CLT_ROUTE=0x01
-
-###############################################################################
-#Set the Felica CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_FELICA_CLT_PWR_STATE=0x1B
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable  0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x22
-
-###############################################################################
-#Timeout value  in milliseconds for NFCC standby mode.The range is between 5000
-#msec to 20000 msec and zero is to disable.
-NXP_NFCC_STANDBY_TIMEOUT=20000
-
-###############################################################################
-#Dynamic RSSI feature enable
-# Disable           0x00
-# Enable            0x01
-NXP_AGC_DEBUG_ENABLE=0x00
-
-###############################################################################
-#Virtual Mode ESE and Wired Mode ongoing delay Wired Mode
-# For Technology routing to ESE Technology Mask = 4
-# For ISO-DEP Protocol routing to ESE Mask      = 2
-# It can also take TECH|PROTO    = 6
-# To ignore the delay set mask to = 0
-NXP_ESE_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#Virtual Mode UICC and Wired Mode  ongoing delay Wired Mode
-#For Technology routing to UICC Technology Mask = 4
-#For ISO-DEP Protocol routing to UICC set Mask  = 2
-#For Select AID Routing to UICC       set Mask  = 1
-#It can also take values TECH|PROTO|SELECT_AID  = 7 , 6 , 5 ,3 .To ignore delay
-#set mask = 0
-NXP_UICC_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#RF field true delay Wired Mode
-# delay wired mode = 1
-# allow wired mode = 0
-NXP_WIRED_MODE_RF_FIELD_ENABLE=0x00
-
-###############################################################################
-#Config to allow adding aids
-#NFC on/off is required after this config
-#1 = enabling adding aid  to NFCC routing table.
-#0 = disabling adding aid to NFCC routing table.
-NXP_ENABLE_ADD_AID=0x01
-
-###############################################################################
-# JCOP-3.3 continuous process timeout in msec and value should be in Hexadecimal
-# JCOP CP TIMEOUT
-NXP_CP_TIMEOUT={00, 77}
-
-###############################################################################
-# Enable/Disable checking default proto SE Id
-# Disable           0x00
-# Enable            0x01
-NXP_CHECK_DEFAULT_PROTO_SE_ID=0x01
-
-###############################################################################
-#NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE
-#Enable/Disable block number checks for china transit use case
-#Enable  0x01
-#Disable  0x00
-NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
-
-###############################################################################
-# Restrict routing to first matched rule only.
-# Blacklist enable   0x01
-# Blacklist disable  0x00
-NXP_PROP_BLACKLIST_ROUTING=0x00
-
-###############################################################################
-# Timeout value in milliseconds to send response for Felica command received
-NXP_HCEF_CMD_RSP_TIMEOUT_VALUE=5000
-
-###############################################################################
\ No newline at end of file
diff --git a/halimpl/pn54x/libnfc-nxp-PN65T_example.conf b/halimpl/pn54x/libnfc-nxp-PN65T_example.conf
deleted file mode 100644
index 317776c..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN65T_example.conf
+++ /dev/null
@@ -1,273 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn54x)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn54x)
-
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-#
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn54x"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn547_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-
-NXP_SYS_CLK_SRC_SEL=0x01
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-
-NXP_SYS_CLK_FREQ_SEL=0x00
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# Standby enable settings
-NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-#Atonomous Mode
-#Enable 0x01
-#Disable 0x00
-NXP_CORE_SCRN_OFF_AUTONOMOUS_ENABLE=0x00
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-# NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-NXP_CORE_CONF_EXTN={20, 02, 1A, 05,
-    A0, EC, 01, 01,
-    A0, ED, 01, 01,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 0D, 06, 3E, 2D, 15, 88, 15, 00
-    }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 01
-        }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2B, 0D,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        60, 01, 0E,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-
-NXP_DEFAULT_SE=0x02
-
-NXP_DEFAULT_NFCEE_TIMEOUT=0x06
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-##############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-
-NXP_NFC_CHIP=0x02
-
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0xFF
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0xFF
-
-###############################################################################
-# CE when Screen state is locked
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable 0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x21
diff --git a/halimpl/pn54x/libnfc-nxp-PN66T_example.conf b/halimpl/pn54x/libnfc-nxp-PN66T_example.conf
deleted file mode 100644
index d63881f..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN66T_example.conf
+++ /dev/null
@@ -1,305 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn54x)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn54x)
-
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-#
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn54x"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn548ad_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-
-NXP_SYS_CLOCK_TO_CFG=0x01
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, There are currently three
-#configurations (1, 2 and 3) are supported, out of them only one can be
-#supported.
-
-NXP_EXT_TVDD_CFG=0x01
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 02, 09, 00}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 4.7V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0B, 02, A0, 66, 01, 00, A0, 0E, 03, 56, 64, 0A}
-
-###############################################################################
-#config3: use DCDC in CE, use Tx_Pwr_Req, SLALM, monitoring 5V from DCDC,
-#DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_3={20, 02, 0B, 02, A0, 66, 01, 01, A0, 0E, 03, 52, 64, 0A}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-# Clock timeout settings A004
-NXP_CORE_CONF_EXTN={20, 02, 1D, 07,
-    A0, EC, 01, 01,
-    A0, ED, 01, 03,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 40, 01, 01,
-    A0, DD, 01, 2D,
-    A0, F2, 01, 01
-    }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 01
-        }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2E, 0E,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-
-NXP_DEFAULT_SE=0x03
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-
-NXP_NFC_CHIP=0x04
-
-###############################################################################
-# CE when Screen state is locked
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-NXP_DEFAULT_NFCEE_TIMEOUT=0x06
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host 0x00
-# eSE  0x01
-# UICC 0x02
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable 0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x21
diff --git a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf b/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
deleted file mode 100644
index 45d276c..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
+++ /dev/null
@@ -1,487 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn547)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn547)
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn553"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-NXP_SYS_CLOCK_TO_CFG=0x06
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, two configurations (1 and 2) supported,
-# out of them only one can be configured at a time.
-NXP_EXT_TVDD_CFG=0x02
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0F, 01, A0, 0E, 0B, 31, 01, 01, 31, 00, 00, 00, 01, 00, D0, 0C}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 3.3V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0F, 01, A0, 0E, 0B, 11, 01, C2, B2, 00, B2, 1E, 1F, 00, D0, 0C}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Set configuration optimization decision setting
-# Enable    = 0x01
-# Disable   = 0x00
-NXP_SET_CONFIG_ALWAYS=0x00
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-# Clock timeout settings A004
-# eSE (SVDD) PWR REQ settings A0F2
-# Window size A0D8
-# DWP Speed   A0D5
-# How eSE connected to PN553 A012
-# UICC2 bit rate A0D1
-# SWP1A interface A0D4
-# DWP intf behavior config, SVDD Load activated by default if set to 0x31 A037
-NXP_CORE_CONF_EXTN={20, 02, 29, 0A,
-    A0, EC, 01, 01,
-    A0, ED, 01, 01,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 40, 01, 01,
-    A0, D1, 01, 02,
-    A0, D4, 01, 01,
-    A0, 37, 01, 35,
-    A0, D8, 01, 02,
-    A0, D5, 01, 0A
-   }
-#       A0, F2, 01, 01,
-#       A0, 40, 01, 01,
-#       A0, 41, 01, 02,
-#       A0, 43, 01, 04,
-#       A0, 02, 01, 01,
-#       A0, 03, 01, 11,
-#       A0, 07, 01, 03,
-#       A0, 08, 01, 01
-#       }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set
-# to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 00 }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set
-# to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 2E, 0E,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-# UICC2             0x04
-NXP_DEFAULT_SE=0x07
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-#PN551              0x05
-#PN67T              0x06
-#PN553              0x07
-#PN80T              0x08
-NXP_NFC_CHIP=0x08
-
-###############################################################################
-# CE when Screen state is locked
-# This setting is for DEFAULT_AID_ROUTE,
-# DEFAULT_DESFIRE_ROUTE and DEFAULT_MIFARE_CLT_ROUTE
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-###############################################################################
-NXP_DEFAULT_NFCEE_TIMEOUT=20
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-#Set the Felica CLT route Location :
-#This settings will be used when application does not set this parameter
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_FELICA_CLT_ROUTE=0x01
-
-###############################################################################
-#Set the default AID Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_AID_PWR_STATE=0x19
-
-###############################################################################
-#Set the Mifare Desfire Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_DESFIRE_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Mifare CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_MIFARE_CLT_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Felica CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_FELICA_CLT_PWR_STATE=0x1B
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable  0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x22
-
-###############################################################################
-#Timeout value  in milliseconds for NFCC standby mode.The range is between 5000
-#msec to 20000 msec and zero is to disable.
-NXP_NFCC_STANDBY_TIMEOUT=20000
-
-###############################################################################
-#Dynamic RSSI feature enable
-# Disable           0x00
-# Enable            0x01
-NXP_AGC_DEBUG_ENABLE=0x00
-
-###############################################################################
-#Virtual Mode ESE and Wired Mode ongoing delay Wired Mode
-# For Technology routing to ESE Technology Mask = 4
-# For ISO-DEP Protocol routing to ESE Mask      = 2
-# It can also take TECH|PROTO    = 6
-# To ignore the delay set mask to = 0
-NXP_ESE_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#Virtual Mode UICC and Wired Mode  ongoing delay Wired Mode
-#For Technology routing to UICC Technology Mask = 4
-#For ISO-DEP Protocol routing to UICC set Mask  = 2
-#For Select AID Routing to UICC       set Mask  = 1
-#It can also take values TECH|PROTO|SELECT_AID  = 7 , 6 , 5 ,3 .To ignore delay
-#set mask = 0
-NXP_UICC_WIRED_PRT_MASK=0x00
-
-################################################################################
-#RF field true delay Wired Mode
-# delay wired mode = 1
-# allow wired mode = 0
-NXP_WIRED_MODE_RF_FIELD_ENABLE=0x00
-
-###############################################################################
-#Config to allow adding aids
-#NFC on/off is required after this config
-#1 = enabling adding aid  to NFCC routing table.
-#0 = disabling adding aid to NFCC routing table.
-NXP_ENABLE_ADD_AID=0x01
-
-###############################################################################
-# JCOP-3.3 continuous process timeout in msec and value should be in Hexadecimal
-# JCOP CP TIMEOUT
-NXP_CP_TIMEOUT={00, 77}
-
-###############################################################################
-# Enable/Disable checking default proto SE Id
-# Disable           0x00
-# Enable            0x01
-NXP_CHECK_DEFAULT_PROTO_SE_ID=0x01
-
-###############################################################################
-#NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE
-#Enable/Disable block number checks for china transit use case
-#Enable  0x01
-#Disable  0x00
-NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
-
-###############################################################################
-# Wired mode resume timeout vaule in wired mode resume feature enable
-# DWP resume time out in ms( 4 bytes hex value and LSB first)
-#example 1000 = 0x03E8
-#exmaple 2000 = 0x07D0
-#example 500 = 0x01F4
-NXP_WIREDMODE_RESUME_TIMEOUT={E8,03,00,00}
-###############################################################################
-# Power to eSE is controlled by DH or PMU depending on following configurations
-#define DH_PWR_CONTROL         1
-#define PMU_PWR_CONTROL        2
-NXP_ESE_POWER_DH_CONTROL=1
-
-###############################################################################
-# Timeout value in milliseconds for wired mode resume after RF field event timeout
-NXP_NFCC_RF_FIELD_EVENT_TIMEOUT=3000
-
-###############################################################################
-# NXP PMU Support configuration is sent if PMU_PWR_CONTROL is configured
-# External PMU available in phone ON and phone OFF case if NXP_ESE_POWER_EXT_PMU=1
-# External PMU available only in phone ON case if NXP_ESE_POWER_EXT_PMU=2
-NXP_ESE_POWER_EXT_PMU=2
-
-###############################################################################
-# Whether to allow wired mode in desfire and mifare CLT
-# Disable           0x00
-# Enable            0x01
-NXP_ALLOW_WIRED_IN_MIFARE_DESFIRE_CLT=0x00
-
-###############################################################################
-# Restrict routing to first matched rule only.
-# Blacklist enable   0x01
-# Blacklist disable  0x00
-NXP_PROP_BLACKLIST_ROUTING=0x00
-
-###############################################################################
-# Send DWP interface reset command as part of SE open
-# Disable           0x00
-# Enable            0x01
-NXP_DWP_INTF_RESET_ENABLE=0x01
-
-###############################################################################
-# Timeout value in milliseconds for JCOP OS download to complete
-OS_DOWNLOAD_TIMEOUT_VALUE=60000
-
-###############################################################################
-# Timeout value in milliseconds to send response for Felica command received
-NXP_HCEF_CMD_RSP_TIMEOUT_VALUE=5000
-
-###############################################################################
\ No newline at end of file
diff --git a/halimpl/pn54x/libnfc-nxp-PN80T_example_NCI2_0.conf b/halimpl/pn54x/libnfc-nxp-PN80T_example_NCI2_0.conf
deleted file mode 100644
index 1f64ec7..0000000
--- a/halimpl/pn54x/libnfc-nxp-PN80T_example_NCI2_0.conf
+++ /dev/null
@@ -1,488 +0,0 @@
-## This file is used by NFC NXP NCI HAL(external/libnfc-nci/halimpl/pn547)
-## and NFC Service Java Native Interface Extensions (packages/apps/Nfc/nci/jni/extns/pn547)
-###############################################################################
-# Application options
-# Logging Levels
-# NXPLOG_DEFAULT_LOGLEVEL    0x01
-# ANDROID_LOG_DEBUG          0x03
-# ANDROID_LOG_WARN           0x02
-# ANDROID_LOG_ERROR          0x01
-# ANDROID_LOG_SILENT         0x00
-NXPLOG_EXTNS_LOGLEVEL=0x03
-NXPLOG_NCIHAL_LOGLEVEL=0x03
-NXPLOG_NCIX_LOGLEVEL=0x03
-NXPLOG_NCIR_LOGLEVEL=0x03
-NXPLOG_FWDNLD_LOGLEVEL=0x03
-NXPLOG_TML_LOGLEVEL=0x03
-
-###############################################################################
-# Nfc Device Node name
-NXP_NFC_DEV_NODE="/dev/pn553"
-
-###############################################################################
-# Extension for Mifare reader enable
-MIFARE_READER_ENABLE=0x01
-
-###############################################################################
-# Vzw Feature enable
-VZW_FEATURE_ENABLE=0x01
-
-###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_fw.so"
-
-###############################################################################
-# System clock source selection configuration
-#define CLK_SRC_XTAL       1
-#define CLK_SRC_PLL        2
-NXP_SYS_CLK_SRC_SEL=0x02
-
-###############################################################################
-# System clock frequency selection configuration
-#define CLK_FREQ_13MHZ         1
-#define CLK_FREQ_19_2MHZ       2
-#define CLK_FREQ_24MHZ         3
-#define CLK_FREQ_26MHZ         4
-#define CLK_FREQ_38_4MHZ       5
-#define CLK_FREQ_52MHZ         6
-NXP_SYS_CLK_FREQ_SEL=0x02
-
-###############################################################################
-# The timeout value to be used for clock request acknowledgment
-# min value = 0x01 to max = 0x06
-NXP_SYS_CLOCK_TO_CFG=0x06
-
-###############################################################################
-# NXP proprietary settings
-NXP_ACT_PROP_EXTN={2F, 02, 00}
-
-###############################################################################
-# NFC forum profile settings
-NXP_NFC_PROFILE_EXTN={20, 02, 05, 01, A0, 44, 01, 00}
-
-###############################################################################
-# NFCC Configuration Control
-# Allow NFCC to manage RF Config       0x01
-# Don't allow NFCC to manage RF Config 0x00
-NXP_NFC_MERGE_RF_PARAMS={20, 02, 04, 01, 85, 01, 01}
-
-###############################################################################
-# Standby enable settings
-#NXP_CORE_STANDBY={2F, 00, 01, 01}
-
-###############################################################################
-# NXP TVDD configurations settings
-# Allow NFCC to configure External TVDD, two configurations (1 and 2) supported,
-# out of them only one can be configured at a time.
-NXP_EXT_TVDD_CFG=0x02
-
-###############################################################################
-#config1:SLALM, 3.3V for both RM and CM
-NXP_EXT_TVDD_CFG_1={20, 02, 0F, 01, A0, 0E, 0B, 31, 01, 01, 31, 00, 00, 00, 01, 00, D0, 0C}
-
-###############################################################################
-#config2: use DCDC in CE, use Tx_Pwr_Req, set CFG2 mode, SLALM,
-#monitoring 5V from DCDC, 3.3V for both RM and CM, DCDCWaitTime=4.2ms
-NXP_EXT_TVDD_CFG_2={20, 02, 0F, 01, A0, 0E, 0B, 11, 01, C2, B2, 00, B2, 1E, 1F, 00, D0, 0C}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_1={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_2={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_3={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_4={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_5={
-#}
-
-###############################################################################
-# NXP RF configuration ALM/PLM settings
-# This section needs to be updated with the correct values based on the platform
-#NXP_RF_CONF_BLK_6={
-#}
-
-###############################################################################
-# Set configuration optimization decision setting
-# Enable    = 0x01
-# Disable   = 0x00
-NXP_SET_CONFIG_ALWAYS=0x00
-
-###############################################################################
-# Core configuration extensions
-# It includes
-# Wired mode settings A0ED, A0EE
-# Tag Detector A040, A041, A043
-# Low Power mode A007
-# Clock settings A002, A003
-# PbF settings A008
-# Clock timeout settings A004
-# eSE (SVDD) PWR REQ settings A0F2
-# Window size A0D8
-# DWP Speed   A0D5
-# How eSE connected to PN553 A012
-# UICC2 bit rate A0D1
-# SWP1A interface A0D4
-# DWP intf behavior config, SVDD Load activated by default if set to 0x31 A037
-NXP_CORE_CONF_EXTN={20, 02, 29, 0A,
-    A0, EC, 01, 01,
-    A0, ED, 01, 01,
-    A0, 5E, 01, 01,
-    A0, 12, 01, 02,
-    A0, 40, 01, 01,
-    A0, D1, 01, 02,
-    A0, D4, 01, 01,
-    A0, 37, 01, 35,
-    A0, D8, 01, 02,
-    A0, D5, 01, 0A
-   }
-#       A0, F2, 01, 01,
-#       A0, 40, 01, 01,
-#       A0, 41, 01, 02,
-#       A0, 43, 01, 04,
-#       A0, 02, 01, 01,
-#       A0, 03, 01, 11,
-#       A0, 07, 01, 03,
-#       A0, 08, 01, 01
-#       }
-
-###############################################################################
-# Core configuration rf field filter settings to enable set to 01 to disable set
-# to 00 last bit
-NXP_CORE_RF_FIELD={ 20, 02, 05, 01, A0, 62, 01, 00 }
-
-###############################################################################
-# To enable i2c fragmentation set i2c fragmentation enable 0x01 to disable set
-# to 0x00
-NXP_I2C_FRAGMENTATION_ENABLED=0x00
-
-###############################################################################
-# Core configuration settings
-NXP_CORE_CONF={ 20, 02, 31, 0F,
-        85, 01, 01,
-        28, 01, 00,
-        21, 01, 00,
-        30, 01, 08,
-        31, 01, 03,
-        32, 01, 60,
-        38, 01, 01,
-        33, 04, 01, 02, 03, 04,
-        54, 01, 06,
-        50, 01, 02,
-        5B, 01, 00,
-        80, 01, 01,
-        81, 01, 01,
-        82, 01, 0E,
-        18, 01, 01
-        }
-
-###############################################################################
-# Mifare Classic Key settings
-#NXP_CORE_MFCKEY_SETTING={20, 02, 25,04, A0, 51, 06, A0, A1, A2, A3, A4, A5,
-#                                     A0, 52, 06, D3, F7, D3, F7, D3, F7,
-#                                     A0, 53, 06, FF, FF, FF, FF, FF, FF,
-#                                     A0, 54, 06, 00, 00, 00, 00, 00, 00}
-
-###############################################################################
-# Default SE Options
-# No secure element 0x00
-# eSE               0x01
-# UICC              0x02
-# UICC2             0x04
-NXP_DEFAULT_SE=0x07
-
-###############################################################################
-#Enable SWP full power mode when phone is power off
-NXP_SWP_FULL_PWR_ON=0x00
-
-###############################################################################
-#### Select the CHIP ####
-#PN547C2            0x01
-#PN65T              0x02
-#PN548AD            0x03
-#PN66T              0x04
-#PN551              0x05
-#PN67T              0x06
-#PN553              0x07
-#PN80T              0x08
-NXP_NFC_CHIP=0x08
-
-###############################################################################
-# CE when Screen state is locked
-# This setting is for DEFAULT_AID_ROUTE,
-# DEFAULT_DESFIRE_ROUTE and DEFAULT_MIFARE_CLT_ROUTE
-# Disable           0x00
-# Enable            0x01
-NXP_CE_ROUTE_STRICT_DISABLE=0x01
-
-###############################################################################
-#Timeout in secs to get NFCEE Discover notification
-NXP_DEFAULT_NFCEE_DISC_TIMEOUT=20
-
-###############################################################################
-NXP_DEFAULT_NFCEE_TIMEOUT=20
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_START_TIMEOUT=0x0A
-
-###############################################################################
-#Timeout in secs
-NXP_SWP_RD_TAG_OP_TIMEOUT=0x01
-
-###############################################################################
-#Set the default AID route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_AID_ROUTE=0x00
-
-###############################################################################
-#Set the Mifare Desfire route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_DESFIRE_ROUTE=0x02
-
-###############################################################################
-#Set the Mifare CLT route Location :
-#This settings will be used when application does not set this parameter
-# host  0x00
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_MIFARE_CLT_ROUTE=0x02
-
-###############################################################################
-#Set the Felica CLT route Location :
-#This settings will be used when application does not set this parameter
-# eSE   0x01
-# UICC  0x02
-# UICC2 0x03
-DEFAULT_FELICA_CLT_ROUTE=0x01
-
-###############################################################################
-#Set the default AID Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_AID_PWR_STATE=0x19
-
-###############################################################################
-#Set the Mifare Desfire Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_DESFIRE_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Mifare CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_MIFARE_CLT_PWR_STATE=0x1B
-
-###############################################################################
-#Set the Felica CLT Power state :
-#This settings will be used when application does not set this parameter
-# bit pos 0 = Switch On
-# bit pos 1 = Switch Off
-# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
-DEFAULT_FELICA_CLT_PWR_STATE=0x1B
-
-###############################################################################
-# AID Matching platform options
-# AID_MATCHING_L 0x01
-# AID_MATCHING_K 0x02
-AID_MATCHING_PLATFORM=0x01
-
-###############################################################################
-# P61 interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LS_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 LTSM interface options
-# NFC 0x01
-# SPI 0x02
-NXP_P61_LTSM_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-#CHINA_TIANJIN_RF_SETTING
-#Enable  0x01
-#Disable  0x00
-NXP_CHINA_TIANJIN_RF_ENABLED=0x01
-
-###############################################################################
-#SWP_SWITCH_TIMEOUT_SETTING
-# Allowed range of swp timeout setting is 0x00 to 0x3C [0 - 60].
-# Timeout in milliseconds, for example
-# No Timeout  0x00
-# 10 millisecond timeout 0x0A
-NXP_SWP_SWITCH_TIMEOUT=0x0A
-
-###############################################################################
-# P61 interface options for JCOP Download
-# NFC 0x01
-# SPI 0x02
-NXP_P61_JCOP_DEFAULT_INTERFACE=0x01
-
-###############################################################################
-# P61 JCOP OS download  options
-# FRAMEWORK API BY APPLICATION 0x00
-# AT BOOT_TIME 0x01
-NXP_JCOPDL_AT_BOOT_ENABLE=0x00
-
-###############################################################################
-# Loader service version
-# NFC service checks for LS version 2.0 or 2.1
-# LS2.0 0x20
-# LS2.1 0x21
-# LS2.2 0x22
-# AT NFC service intialization
-NXP_LOADER_SERVICE_VERSION=0x22
-
-###############################################################################
-#Timeout value  in milliseconds for NFCC standby mode.The range is between 5000
-#msec to 20000 msec and zero is to disable.
-NXP_NFCC_STANDBY_TIMEOUT=20000
-
-###############################################################################
-#Dynamic RSSI feature enable
-# Disable           0x00
-# Enable            0x01
-NXP_AGC_DEBUG_ENABLE=0x00
-
-###############################################################################
-#Virtual Mode ESE and Wired Mode ongoing delay Wired Mode
-# For Technology routing to ESE Technology Mask = 4
-# For ISO-DEP Protocol routing to ESE Mask      = 2
-# It can also take TECH|PROTO    = 6
-# To ignore the delay set mask to = 0
-NXP_ESE_WIRED_PRT_MASK=0x00
-
-###############################################################################
-#Virtual Mode UICC and Wired Mode  ongoing delay Wired Mode
-#For Technology routing to UICC Technology Mask = 4
-#For ISO-DEP Protocol routing to UICC set Mask  = 2
-#For Select AID Routing to UICC       set Mask  = 1
-#It can also take values TECH|PROTO|SELECT_AID  = 7 , 6 , 5 ,3 .To ignore delay
-#set mask = 0
-NXP_UICC_WIRED_PRT_MASK=0x00
-
-################################################################################
-#RF field true delay Wired Mode
-# delay wired mode = 1
-# allow wired mode = 0
-NXP_WIRED_MODE_RF_FIELD_ENABLE=0x00
-
-###############################################################################
-#Config to allow adding aids
-#NFC on/off is required after this config
-#1 = enabling adding aid  to NFCC routing table.
-#0 = disabling adding aid to NFCC routing table.
-NXP_ENABLE_ADD_AID=0x01
-
-###############################################################################
-# JCOP-3.3 continuous process timeout in msec and value should be in Hexadecimal
-# JCOP CP TIMEOUT
-NXP_CP_TIMEOUT={00, 77}
-
-###############################################################################
-# Enable/Disable checking default proto SE Id
-# Disable           0x00
-# Enable            0x01
-NXP_CHECK_DEFAULT_PROTO_SE_ID=0x01
-
-###############################################################################
-#NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE
-#Enable/Disable block number checks for china transit use case
-#Enable  0x01
-#Disable  0x00
-NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
-
-###############################################################################
-# Wired mode resume timeout vaule in wired mode resume feature enable
-# DWP resume time out in ms( 4 bytes hex value and LSB first)
-#example 1000 = 0x03E8
-#exmaple 2000 = 0x07D0
-#example 500 = 0x01F4
-NXP_WIREDMODE_RESUME_TIMEOUT={E8,03,00,00}
-###############################################################################
-# Power to eSE is controlled by DH or PMU depending on following configurations
-#define DH_PWR_CONTROL         1
-#define PMU_PWR_CONTROL        2
-NXP_ESE_POWER_DH_CONTROL=1
-
-###############################################################################
-# Timeout value in milliseconds for wired mode resume after RF field event timeout
-NXP_NFCC_RF_FIELD_EVENT_TIMEOUT=3000
-
-###############################################################################
-# NXP PMU Support configuration is sent if PMU_PWR_CONTROL is configured
-# External PMU available in phone ON and phone OFF case if NXP_ESE_POWER_EXT_PMU=1
-# External PMU available only in phone ON case if NXP_ESE_POWER_EXT_PMU=2
-NXP_ESE_POWER_EXT_PMU=2
-
-###############################################################################
-# Whether to allow wired mode in desfire and mifare CLT
-# Disable           0x00
-# Enable            0x01
-NXP_ALLOW_WIRED_IN_MIFARE_DESFIRE_CLT=0x00
-
-###############################################################################
-# Restrict routing to first matched rule only.
-# Blacklist enable   0x01
-# Blacklist disable  0x00
-NXP_PROP_BLACKLIST_ROUTING=0x00
-
-###############################################################################
-# Send DWP interface reset command as part of SE open
-# Disable           0x00
-# Enable            0x01
-NXP_DWP_INTF_RESET_ENABLE=0x01
-
-###############################################################################
-# Timeout value in milliseconds for JCOP OS download to complete
-OS_DOWNLOAD_TIMEOUT_VALUE=60000
-
-###############################################################################
-# Timeout value in milliseconds to send response for Felica command received
-NXP_HCEF_CMD_RSP_TIMEOUT_VALUE=5000
-
-###############################################################################
\ No newline at end of file
diff --git a/halimpl/pn54x/log/phNxpLog.c b/halimpl/pn54x/log/phNxpLog.c
deleted file mode 100644
index 49d6911..0000000
--- a/halimpl/pn54x/log/phNxpLog.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <string.h>
-#if !defined(NXPLOG__H_INCLUDED)
-#include "phNxpConfig.h"
-#include "phNxpLog.h"
-#endif
-#include <cutils/properties.h>
-
-const char* NXPLOG_ITEM_EXTNS = "NxpExtns";
-const char* NXPLOG_ITEM_NCIHAL = "NxpHal";
-const char* NXPLOG_ITEM_NCIX = "NxpNciX";
-const char* NXPLOG_ITEM_NCIR = "NxpNciR";
-const char* NXPLOG_ITEM_FWDNLD = "NxpFwDnld";
-const char* NXPLOG_ITEM_TML = "NxpTml";
-
-#ifdef NXP_HCI_REQ
-const char* NXPLOG_ITEM_HCPX = "NxpHcpX";
-const char* NXPLOG_ITEM_HCPR = "NxpHcpR";
-#endif /*NXP_HCI_REQ*/
-
-/* global log level structure */
-nci_log_level_t gLog_level;
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetGlobalLogLevel
- *
- * Description      Sets the global log level for all modules.
- *                  This value is set by Android property
- *nfc.nxp_log_level_global.
- *                  If value can be overridden by module log level.
- *
- * Returns          The value of global log level
- *
- ******************************************************************************/
-static uint8_t phNxpLog_SetGlobalLogLevel(void) {
-  uint8_t level = NXPLOG_DEFAULT_LOGLEVEL;
-  unsigned long num = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  int len = property_get(PROP_NAME_NXPLOG_GLOBAL_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    level = (unsigned char)num;
-  }
-  memset(&gLog_level, level, sizeof(nci_log_level_t));
-  return level;
-}
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetHALLogLevel
- *
- * Description      Sets the HAL layer log level.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void phNxpLog_SetHALLogLevel(uint8_t level) {
-  unsigned long num = 0;
-  int len;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  if (GetNxpNumValue(NAME_NXPLOG_HAL_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.hal_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-    ;
-  }
-
-  len = property_get(PROP_NAME_NXPLOG_HAL_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    gLog_level.hal_log_level = (unsigned char)num;
-  }
-}
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetExtnsLogLevel
- *
- * Description      Sets the Extensions layer log level.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void phNxpLog_SetExtnsLogLevel(uint8_t level) {
-  unsigned long num = 0;
-  int len;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-  if (GetNxpNumValue(NAME_NXPLOG_EXTNS_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.extns_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-    ;
-  }
-
-  len = property_get(PROP_NAME_NXPLOG_EXTNS_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    gLog_level.extns_log_level = (unsigned char)num;
-  }
-}
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetTmlLogLevel
- *
- * Description      Sets the Tml layer log level.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void phNxpLog_SetTmlLogLevel(uint8_t level) {
-  unsigned long num = 0;
-  int len;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-  if (GetNxpNumValue(NAME_NXPLOG_TML_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.tml_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-    ;
-  }
-
-  len = property_get(PROP_NAME_NXPLOG_TML_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    gLog_level.tml_log_level = (unsigned char)num;
-  }
-}
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetDnldLogLevel
- *
- * Description      Sets the FW download layer log level.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void phNxpLog_SetDnldLogLevel(uint8_t level) {
-  unsigned long num = 0;
-  int len;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-  if (GetNxpNumValue(NAME_NXPLOG_FWDNLD_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.dnld_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-    ;
-  }
-
-  len = property_get(PROP_NAME_NXPLOG_FWDNLD_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    gLog_level.dnld_log_level = (unsigned char)num;
-  }
-}
-
-/*******************************************************************************
- *
- * Function         phNxpLog_SetNciTxLogLevel
- *
- * Description      Sets the NCI transaction layer log level.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void phNxpLog_SetNciTxLogLevel(uint8_t level) {
-  unsigned long num = 0;
-  int len;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-  if (GetNxpNumValue(NAME_NXPLOG_NCIX_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.ncix_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-  }
-  if (GetNxpNumValue(NAME_NXPLOG_NCIR_LOGLEVEL, &num, sizeof(num))) {
-    gLog_level.ncir_log_level =
-        (level > (unsigned char)num) ? level : (unsigned char)num;
-    ;
-  }
-
-  len = property_get(PROP_NAME_NXPLOG_NCI_LOGLEVEL, valueStr, "");
-  if (len > 0) {
-    /* let Android property override .conf variable */
-    sscanf(valueStr, "%lu", &num);
-    gLog_level.ncix_log_level = (unsigned char)num;
-    gLog_level.ncir_log_level = (unsigned char)num;
-  }
-}
-
-/******************************************************************************
- * Function         phNxpLog_InitializeLogLevel
- *
- * Description      Initialize and get log level of module from libnfc-nxp.conf
- *or
- *                  Android runtime properties.
- *                  The Android property nfc.nxp_global_log_level is to
- *                  define log level for all modules. Modules log level will
- *overwide global level.
- *                  The Android property will overwide the level
- *                  in libnfc-nxp.conf
- *
- *                  Android property names:
- *                      nfc.nxp_log_level_global    * defines log level for all
- *modules
- *                      nfc.nxp_log_level_extns     * extensions module log
- *                      nfc.nxp_log_level_hal       * Hal module log
- *                      nfc.nxp_log_level_dnld      * firmware download module
- *log
- *                      nfc.nxp_log_level_tml       * TML module log
- *                      nfc.nxp_log_level_nci       * NCI transaction log
- *
- *                  Log Level values:
- *                      NXPLOG_LOG_SILENT_LOGLEVEL  0        * No trace to show
- *                      NXPLOG_LOG_ERROR_LOGLEVEL   1        * Show Error trace
- *only
- *                      NXPLOG_LOG_WARN_LOGLEVEL    2        * Show Warning
- *trace and Error trace
- *                      NXPLOG_LOG_DEBUG_LOGLEVEL   3        * Show all traces
- *
- * Returns          void
- *
- ******************************************************************************/
-void phNxpLog_InitializeLogLevel(void) {
-  uint8_t level = phNxpLog_SetGlobalLogLevel();
-  phNxpLog_SetHALLogLevel(level);
-  phNxpLog_SetExtnsLogLevel(level);
-  phNxpLog_SetTmlLogLevel(level);
-  phNxpLog_SetDnldLogLevel(level);
-  phNxpLog_SetNciTxLogLevel(level);
-
-  ALOGD(
-      "%s: global =%u, Fwdnld =%u, extns =%u, \
-                hal =%u, tml =%u, ncir =%u, \
-                ncix =%u",
-      __func__, gLog_level.global_log_level, gLog_level.dnld_log_level,
-      gLog_level.extns_log_level, gLog_level.hal_log_level,
-      gLog_level.tml_log_level, gLog_level.ncir_log_level,
-      gLog_level.ncix_log_level);
-}
diff --git a/halimpl/pn54x/log/phNxpLog.h b/halimpl/pn54x/log/phNxpLog.h
deleted file mode 100644
index 5037a4c..0000000
--- a/halimpl/pn54x/log/phNxpLog.h
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined(NXPLOG__H_INCLUDED)
-#define NXPLOG__H_INCLUDED
-
-#include <log/log.h>
-
-typedef struct nci_log_level {
-  uint8_t global_log_level;
-  uint8_t extns_log_level;
-  uint8_t hal_log_level;
-  uint8_t dnld_log_level;
-  uint8_t tml_log_level;
-  uint8_t ncix_log_level;
-  uint8_t ncir_log_level;
-} nci_log_level_t;
-
-/* global log level Ref */
-extern nci_log_level_t gLog_level;
-
-/* define log module included when compile */
-#define ENABLE_EXTNS_TRACES TRUE
-#define ENABLE_HAL_TRACES TRUE
-#define ENABLE_TML_TRACES TRUE
-#define ENABLE_FWDNLD_TRACES TRUE
-#define ENABLE_NCIX_TRACES TRUE
-#define ENABLE_NCIR_TRACES TRUE
-
-#define ENABLE_HCPX_TRACES FALSE
-#define ENABLE_HCPR_TRACES FALSE
-
-/* ####################### Set the log module name in .conf file
- * ########################## */
-#define NAME_NXPLOG_EXTNS_LOGLEVEL "NXPLOG_EXTNS_LOGLEVEL"
-#define NAME_NXPLOG_HAL_LOGLEVEL "NXPLOG_NCIHAL_LOGLEVEL"
-#define NAME_NXPLOG_NCIX_LOGLEVEL "NXPLOG_NCIX_LOGLEVEL"
-#define NAME_NXPLOG_NCIR_LOGLEVEL "NXPLOG_NCIR_LOGLEVEL"
-#define NAME_NXPLOG_FWDNLD_LOGLEVEL "NXPLOG_FWDNLD_LOGLEVEL"
-#define NAME_NXPLOG_TML_LOGLEVEL "NXPLOG_TML_LOGLEVEL"
-
-/* ####################### Set the log module name by Android property
- * ########################## */
-#define PROP_NAME_NXPLOG_GLOBAL_LOGLEVEL "nfc.nxp_log_level_global"
-#define PROP_NAME_NXPLOG_EXTNS_LOGLEVEL "nfc.nxp_log_level_extns"
-#define PROP_NAME_NXPLOG_HAL_LOGLEVEL "nfc.nxp_log_level_hal"
-#define PROP_NAME_NXPLOG_NCI_LOGLEVEL "nfc.nxp_log_level_nci"
-#define PROP_NAME_NXPLOG_FWDNLD_LOGLEVEL "nfc.nxp_log_level_dnld"
-#define PROP_NAME_NXPLOG_TML_LOGLEVEL "nfc.nxp_log_level_tml"
-
-/* ####################### Set the logging level for EVERY COMPONENT here
- * ######################## :START: */
-#define NXPLOG_LOG_SILENT_LOGLEVEL 0x00
-#define NXPLOG_LOG_ERROR_LOGLEVEL 0x01
-#define NXPLOG_LOG_WARN_LOGLEVEL 0x02
-#define NXPLOG_LOG_DEBUG_LOGLEVEL 0x03
-/* ####################### Set the default logging level for EVERY COMPONENT
- * here ########################## :END: */
-
-/* The Default log level for all the modules. */
-#define NXPLOG_DEFAULT_LOGLEVEL NXPLOG_LOG_ERROR_LOGLEVEL
-
-/* ################################################################################################################
- */
-/* ############################################### Component Names
- * ################################################ */
-/* ################################################################################################################
- */
-
-extern const char* NXPLOG_ITEM_EXTNS;  /* Android logging tag for NxpExtns  */
-extern const char* NXPLOG_ITEM_NCIHAL; /* Android logging tag for NxpNciHal */
-extern const char* NXPLOG_ITEM_NCIX;   /* Android logging tag for NxpNciX   */
-extern const char* NXPLOG_ITEM_NCIR;   /* Android logging tag for NxpNciR   */
-extern const char* NXPLOG_ITEM_FWDNLD; /* Android logging tag for NxpFwDnld */
-extern const char* NXPLOG_ITEM_TML;    /* Android logging tag for NxpTml    */
-
-#ifdef NXP_HCI_REQ
-extern const char* NXPLOG_ITEM_HCPX; /* Android logging tag for NxpHcpX   */
-extern const char* NXPLOG_ITEM_HCPR; /* Android logging tag for NxpHcpR   */
-#endif                               /*NXP_HCI_REQ*/
-
-/* ######################################## Defines used for Logging data
- * ######################################### */
-#ifdef NXP_VRBS_REQ
-#define NXPLOG_FUNC_ENTRY(COMP) \
-  LOG_PRI(ANDROID_LOG_VERBOSE, (COMP), "+:%s", (__func__))
-#define NXPLOG_FUNC_EXIT(COMP) \
-  LOG_PRI(ANDROID_LOG_VERBOSE, (COMP), "-:%s", (__func__))
-#endif /*NXP_VRBS_REQ*/
-
-/* ################################################################################################################
- */
-/* ######################################## Logging APIs of actual modules
- * ######################################## */
-/* ################################################################################################################
- */
-/* Logging APIs used by NxpExtns module */
-#if (ENABLE_EXTNS_TRACES == TRUE)
-#define NXPLOG_EXTNS_D(...)                                       \
-  {                                                               \
-    if (gLog_level.extns_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_EXTNS, __VA_ARGS__); \
-  }
-#define NXPLOG_EXTNS_W(...)                                      \
-  {                                                              \
-    if (gLog_level.extns_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_EXTNS, __VA_ARGS__); \
-  }
-#define NXPLOG_EXTNS_E(...)                                       \
-  {                                                               \
-    if (gLog_level.extns_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_EXTNS, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_EXTNS_D(...)
-#define NXPLOG_EXTNS_W(...)
-#define NXPLOG_EXTNS_E(...)
-#endif /* Logging APIs used by NxpExtns module */
-
-/* Logging APIs used by NxpNciHal module */
-#if (ENABLE_HAL_TRACES == TRUE)
-#define NXPLOG_NCIHAL_D(...)                                       \
-  {                                                                \
-    if (gLog_level.hal_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)     \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_NCIHAL, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIHAL_W(...)                                      \
-  {                                                               \
-    if (gLog_level.hal_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)     \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_NCIHAL, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIHAL_E(...)                                       \
-  {                                                                \
-    if (gLog_level.hal_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)     \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_NCIHAL, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_NCIHAL_D(...)
-#define NXPLOG_NCIHAL_W(...)
-#define NXPLOG_NCIHAL_E(...)
-#endif /* Logging APIs used by HAL module */
-
-/* Logging APIs used by NxpNciX module */
-#if (ENABLE_NCIX_TRACES == TRUE)
-#define NXPLOG_NCIX_D(...)                                       \
-  {                                                              \
-    if (gLog_level.ncix_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_NCIX, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIX_W(...)                                      \
-  {                                                             \
-    if (gLog_level.ncix_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_NCIX, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIX_E(...)                                       \
-  {                                                              \
-    if (gLog_level.ncix_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_NCIX, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_NCIX_D(...)
-#define NXPLOG_NCIX_W(...)
-#define NXPLOG_NCIX_E(...)
-#endif /* Logging APIs used by NCIx module */
-
-/* Logging APIs used by NxpNciR module */
-#if (ENABLE_NCIR_TRACES == TRUE)
-#define NXPLOG_NCIR_D(...)                                       \
-  {                                                              \
-    if (gLog_level.ncir_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_NCIR, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIR_W(...)                                      \
-  {                                                             \
-    if (gLog_level.ncir_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_NCIR, __VA_ARGS__); \
-  }
-#define NXPLOG_NCIR_E(...)                                       \
-  {                                                              \
-    if (gLog_level.ncir_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_NCIR, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_NCIR_D(...)
-#define NXPLOG_NCIR_W(...)
-#define NXPLOG_NCIR_E(...)
-#endif /* Logging APIs used by NCIR module */
-
-/* Logging APIs used by NxpFwDnld module */
-#if (ENABLE_FWDNLD_TRACES == TRUE)
-#define NXPLOG_FWDNLD_D(...)                                       \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_FWDNLD_W(...)                                      \
-  {                                                               \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_FWDNLD_E(...)                                       \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_FWDNLD_D(...)
-#define NXPLOG_FWDNLD_W(...)
-#define NXPLOG_FWDNLD_E(...)
-#endif /* Logging APIs used by NxpFwDnld module */
-
-/* Logging APIs used by NxpTml module */
-#if (ENABLE_TML_TRACES == TRUE)
-#define NXPLOG_TML_D(...)                                       \
-  {                                                             \
-    if (gLog_level.tml_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_TML, __VA_ARGS__); \
-  }
-#define NXPLOG_TML_W(...)                                      \
-  {                                                            \
-    if (gLog_level.tml_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_TML, __VA_ARGS__); \
-  }
-#define NXPLOG_TML_E(...)                                       \
-  {                                                             \
-    if (gLog_level.tml_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)  \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_TML, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_TML_D(...)
-#define NXPLOG_TML_W(...)
-#define NXPLOG_TML_E(...)
-#endif /* Logging APIs used by NxpTml module */
-
-#ifdef NXP_HCI_REQ
-/* Logging APIs used by NxpHcpX module */
-#if (ENABLE_HCPX_TRACES == TRUE)
-#define NXPLOG_HCPX_D(...)                                         \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_HCPX_W(...)                                        \
-  {                                                               \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_HCPX_E(...)                                         \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_HCPX_D(...)
-#define NXPLOG_HCPX_W(...)
-#define NXPLOG_HCPX_E(...)
-#endif /* Logging APIs used by NxpHcpX module */
-
-/* Logging APIs used by NxpHcpR module */
-#if (ENABLE_HCPR_TRACES == TRUE)
-#define NXPLOG_HCPR_D(...)                                         \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_DEBUG_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_DEBUG, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_HCPR_W(...)                                        \
-  {                                                               \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_WARN_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_WARN, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#define NXPLOG_HCPR_E(...)                                         \
-  {                                                                \
-    if (gLog_level.dnld_log_level >= NXPLOG_LOG_ERROR_LOGLEVEL)    \
-      LOG_PRI(ANDROID_LOG_ERROR, NXPLOG_ITEM_FWDNLD, __VA_ARGS__); \
-  }
-#else
-#define NXPLOG_HCPR_D(...)
-#define NXPLOG_HCPR_W(...)
-#define NXPLOG_HCPR_E(...)
-#endif /* Logging APIs used by NxpHcpR module */
-#endif /* NXP_HCI_REQ */
-
-#ifdef NXP_VRBS_REQ
-#if (ENABLE_EXTNS_TRACES == TRUE)
-#define NXPLOG_EXTNS_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_EXTNS)
-#define NXPLOG_EXTNS_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_EXTNS)
-#else
-#define NXPLOG_EXTNS_ENTRY()
-#define NXPLOG_EXTNS_EXIT()
-#endif
-
-#if (ENABLE_HAL_TRACES == TRUE)
-#define NXPLOG_NCIHAL_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_NCIHAL)
-#define NXPLOG_NCIHAL_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_NCIHAL)
-#else
-#define NXPLOG_NCIHAL_ENTRY()
-#define NXPLOG_NCIHAL_EXIT()
-#endif
-
-#if (ENABLE_NCIX_TRACES == TRUE)
-#define NXPLOG_NCIX_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_NCIX)
-#define NXPLOG_NCIX_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_NCIX)
-#else
-#define NXPLOG_NCIX_ENTRY()
-#define NXPLOG_NCIX_EXIT()
-#endif
-
-#if (ENABLE_NCIR_TRACES == TRUE)
-#define NXPLOG_NCIR_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_NCIR)
-#define NXPLOG_NCIR_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_NCIR)
-#else
-#define NXPLOG_NCIR_ENTRY()
-#define NXPLOG_NCIR_EXIT()
-#endif
-
-#ifdef NXP_HCI_REQ
-
-#if (ENABLE_HCPX_TRACES == TRUE)
-#define NXPLOG_HCPX_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_HCPX)
-#define NXPLOG_HCPX_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_HCPX)
-#else
-#define NXPLOG_HCPX_ENTRY()
-#define NXPLOG_HCPX_EXIT()
-#endif
-
-#if (ENABLE_HCPR_TRACES == TRUE)
-#define NXPLOG_HCPR_ENTRY() NXPLOG_FUNC_ENTRY(NXPLOG_ITEM_HCPR)
-#define NXPLOG_HCPR_EXIT() NXPLOG_FUNC_EXIT(NXPLOG_ITEM_HCPR)
-#else
-#define NXPLOG_HCPR_ENTRY()
-#define NXPLOG_HCPR_EXIT()
-#endif
-#endif /* NXP_HCI_REQ */
-
-#endif /* NXP_VRBS_REQ */
-
-void phNxpLog_InitializeLogLevel(void);
-
-#endif /* NXPLOG__H_INCLUDED */
diff --git a/halimpl/pn54x/nfc_nci.c b/halimpl/pn54x/nfc_nci.c
deleted file mode 100644
index 611c83c..0000000
--- a/halimpl/pn54x/nfc_nci.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "NxpNfcNciHal"
-
-#include <errno.h>
-#include <hardware/hardware.h>
-#include <hardware/nfc.h>
-#include <log/log.h>
-#include <phNxpNciHal_Adaptation.h>
-#include <stdlib.h>
-#include <string.h>
-
-/*****************************************************************************
- * NXP NCI HAL Function implementations.
- *****************************************************************************/
-
-/*******************************************************************************
-**
-** Function         hal_open
-**
-** Description      It opens and initialzes the physical connection with NFCC.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_open(const struct nfc_nci_device* p_dev,
-                    nfc_stack_callback_t p_hal_cback,
-                    nfc_stack_data_callback_t* p_hal_data_callback) {
-  int retval = 0;
-
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-  retval = phNxpNciHal_open(p_hal_cback, p_hal_data_callback);
-
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_write
-**
-** Description      Write the data to NFCC.
-**
-** Returns          Number of bytes successfully written to NFCC.
-**
-*******************************************************************************/
-static int hal_write(const struct nfc_nci_device* p_dev, uint16_t data_len,
-                     const uint8_t* p_data) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_write(data_len, p_data);
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_core_initialized
-**
-** Description      Notify NFCC after successful initialization of NFCC.
-**                  All proprietary settings can be done here.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_core_initialized(const struct nfc_nci_device* p_dev,
-                                uint8_t* p_core_init_rsp_params) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_core_initialized(p_core_init_rsp_params);
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_pre_discover
-**
-** Description      Notify NFCC before start discovery.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_pre_discover(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_pre_discover();
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_close
-**
-** Description      Close the NFCC interface and free all resources.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_close(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_close();
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_control_granted
-**
-** Description      Notify NFCC that control is granted to HAL.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_control_granted(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_control_granted();
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         hal_power_cycle
-**
-** Description      Notify power cycling has performed.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int hal_power_cycle(const struct nfc_nci_device* p_dev) {
-  int retval = 0;
-  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
-
-  retval = phNxpNciHal_power_cycle();
-  return retval;
-}
-
-/*************************************
- * Generic device handling.
- *************************************/
-
-/*******************************************************************************
-**
-** Function         nfc_close
-**
-** Description      Close the nfc device instance.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int nfc_close(hw_device_t* dev) {
-  int retval = 0;
-  free(dev);
-  return retval;
-}
-
-/*******************************************************************************
-**
-** Function         nfc_open
-**
-** Description      Open the nfc device instance.
-**
-** Returns          0 if successful
-**
-*******************************************************************************/
-static int nfc_open(const hw_module_t* module, const char* name,
-                    hw_device_t** device) {
-  ALOGD("%s: enter; name=%s", __func__, name);
-  int retval = 0; /* 0 is ok; -1 is error */
-
-  if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
-    pn547_dev_t* dev = calloc(1, sizeof(pn547_dev_t));
-
-    /* Common hw_device_t fields */
-    dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->nci_device.common.version =
-        0x00010000; /* [31:16] major, [15:0] minor */
-    dev->nci_device.common.module = (struct hw_module_t*)module;
-    dev->nci_device.common.close = nfc_close;
-
-    /* NCI HAL method pointers */
-    dev->nci_device.open = hal_open;
-    dev->nci_device.write = hal_write;
-    dev->nci_device.core_initialized = hal_core_initialized;
-    dev->nci_device.pre_discover = hal_pre_discover;
-    dev->nci_device.close = hal_close;
-    dev->nci_device.control_granted = hal_control_granted;
-    dev->nci_device.power_cycle = hal_power_cycle;
-
-    *device = (hw_device_t*)dev;
-  } else {
-    retval = -EINVAL;
-  }
-
-  ALOGD("%s: exit %d", __func__, retval);
-  return retval;
-}
-
-/* Android hardware module definition */
-static struct hw_module_methods_t nfc_module_methods = {
-    .open = nfc_open,
-};
-
-/* NFC module definition */
-struct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
-    .common =
-        {
-            .tag = HARDWARE_MODULE_TAG,
-            .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */
-            .hal_api_version = 0x00,      /* 0 is only valid value */
-            .id = NFC_NCI_HARDWARE_MODULE_ID,
-            .name = "NXP PN54X NFC NCI HW HAL",
-            .author = "NXP Semiconductors",
-            .methods = &nfc_module_methods,
-        },
-};
diff --git a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c b/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
deleted file mode 100644
index 37d6a3e..0000000
--- a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
+++ /dev/null
@@ -1,1847 +0,0 @@
-/*
- * Copyright (C) 2012-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifdef NXP_HW_SELF_TEST
-
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal_SelfTest.h>
-#include <phOsalNfc_Timer.h>
-#include <pthread.h>
-
-/* Timeout value to wait for response from PN54X */
-#define HAL_WRITE_RSP_TIMEOUT (2000)
-#define HAL_WRITE_MAX_RETRY (10)
-
-/******************* Structures and definitions *******************************/
-
-typedef uint8_t (*st_validator_t)(nci_data_t* exp,
-                                  phTmlNfc_TransactInfo_t* act);
-
-phAntenna_St_Resp_t phAntenna_resp;
-
-typedef struct nci_test_data {
-  nci_data_t cmd;
-  nci_data_t exp_rsp;
-  nci_data_t exp_ntf;
-  st_validator_t rsp_validator;
-  st_validator_t ntf_validator;
-
-} nci_test_data_t;
-
-/******************* Global variables *****************************************/
-
-static int thread_running = 0;
-static uint32_t timeoutTimerId = 0;
-static int hal_write_timer_fired = 0;
-
-/* TML Context */
-extern phTmlNfc_Context_t* gpphTmlNfc_Context;
-
-/* Global HAL Ref */
-extern phNxpNciHal_Control_t nxpncihal_ctrl;
-
-/* Driver parameters */
-phLibNfc_sConfig_t gDrvCfg;
-
-NFCSTATUS gtxldo_status = NFCSTATUS_FAILED;
-NFCSTATUS gagc_value_status = NFCSTATUS_FAILED;
-NFCSTATUS gagc_nfcld_status = NFCSTATUS_FAILED;
-NFCSTATUS gagc_differential_status = NFCSTATUS_FAILED;
-
-static uint8_t st_validator_testEquals(nci_data_t* exp,
-                                       phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_null(nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_testSWP1_vltg(nci_data_t* exp,
-                                          phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_testAntenna_Txldo(nci_data_t* exp,
-                                              phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_testAntenna_AgcVal(nci_data_t* exp,
-                                               phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(
-    nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
-static uint8_t st_validator_testAntenna_AgcVal_Differential(
-    nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
-                                 phNxpNfc_PrbsHwType_t hw_prbs_type,
-                                 uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
-#else
-NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
-#endif
-/* Test data to validate SWP line 2*/
-static nci_test_data_t swp2_test_data[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x03, {0x2F, 0x02, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x04, {0x2F, 0x3E, 0x01, 0x01} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x3E, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x04, {0x6F, 0x3E, 0x02, 0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_testEquals},
-
-};
-
-/* Test data to validate SWP line 1*/
-static nci_test_data_t swp1_test_data[] = {
-
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x03, {0x2F, 0x02, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x04, {0x2F, 0x3E, 0x01, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x3E, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x04, {0x6F, 0x3E, 0x02, 0x00} /* ext_ntf */
-     },
-
-     st_validator_testEquals, /* validator */
-     st_validator_testSWP1_vltg},
-};
-
-static nci_test_data_t prbs_test_data[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    },
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#endif
-    }};
-
-/* for rf field test, first requires to disable the standby mode */
-static nci_test_data_t rf_field_on_test_data[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    {{
-         0x03, {0x2F, 0x02, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#endif
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x2F, 0x3D, 0x02, 0x20, 0x01} /* cmd */
-#else
-         0x08, {0x2F, 0x3D, 0x05, 0x20, 0x01, 0x00, 0x00, 0x00} /* cmd */
-#endif
-     },
-     {
-         0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    },
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#endif
-    }};
-
-static nci_test_data_t rf_field_off_test_data[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    {{
-         0x03, {0x2F, 0x02, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#endif
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x2F, 0x3D, 0x02, 0x20, 0x00} /* cmd */
-#else
-         0x08, {0x2F, 0x3D, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00} /* cmd */
-#endif
-     },
-     {
-         0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    },
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#endif
-    }};
-
-/* Download pin test data 1 */
-static nci_test_data_t download_pin_test_data1[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-};
-
-/* Download pin test data 2 */
-static nci_test_data_t download_pin_test_data2[] = {
-    {{
-         0x08, {0x00, 0x04, 0xD0, 0x11, 0x00, 0x00, 0x5B, 0x46} /* cmd */
-     },
-     {
-         0x08, {0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x87, 0x16} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-};
-/* Antenna self test data*/
-static nci_test_data_t antenna_self_test_data[] = {
-    {{
-         0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
-     },
-     {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-    {{
-         0x03, {0x2F, 0x02, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null},
-#endif
-    {{
-         0x05,
-         {0x2F, 0x3D, 0x02, 0x01, 0x80} /* TxLDO cureent measurement cmd */
-     },
-     {
-         0x03, {0x4F, 0x3D, 05} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testAntenna_Txldo,
-     st_validator_null},
-    {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-         0x07,
-         {0x2F, 0x3D, 0x04, 0x02, 0xC8, 0x60, 0x03} /* AGC measurement cmd */
-#else
-         0x07,
-         {0x2F, 0x3D, 0x04, 0x02, 0xCD, 0x60, 0x03} /* AGC measurement cmd */
-#endif
-     },
-     {
-         0x03, {0x4F, 0x3D, 05} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testAntenna_AgcVal,
-     st_validator_null},
-    {{
-         0x07,
-         {0x2F, 0x3D, 0x04, 0x04, 0x20, 0x08,
-          0x20} /* AGC with NFCLD measurement cmd */
-     },
-     {
-         0x03, {0x4F, 0x3D, 05} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testAntenna_AgcVal_FixedNfcLd,
-     st_validator_null},
-    {{
-         0x07,
-         {0x2F, 0x3D, 0x04, 0x08, 0x8C, 0x60,
-          0x03} /* AGC with NFCLD measurement cmd */
-     },
-     {
-         0x03, {0x4F, 0x3D, 05} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testAntenna_AgcVal_Differential,
-     st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-    },
-    {{
-         0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
-     },
-     {
-         0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-         0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null
-#endif
-    }};
-
-/************** Self test functions ***************************************/
-
-static uint8_t st_validator_testEquals(nci_data_t* exp,
-                                       phTmlNfc_TransactInfo_t* act);
-static void hal_write_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo);
-static void hal_write_rsp_timeout_cb(uint32_t TimerId, void* pContext);
-static void hal_read_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo);
-
-/*******************************************************************************
-**
-** Function         st_validator_null
-**
-** Description      Null Validator
-**
-** Returns          One
-**
-*******************************************************************************/
-static uint8_t st_validator_null(nci_data_t* exp,
-                                 phTmlNfc_TransactInfo_t* act) {
-  UNUSED(exp);
-  UNUSED(act);
-  return 1;
-}
-
-/*******************************************************************************
-**
-** Function         st_validator_testSWP1_vltg
-**
-** Description      Validator function to validate swp1 connection.
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testSWP1_vltg(nci_data_t* exp,
-                                          phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-
-  if ((act->wLength == 0x05) &&
-      (memcmp(exp->p_data, act->pBuff, exp->len) == 0)) {
-    if (act->pBuff[4] == 0x01 || act->pBuff[4] == 0x02) {
-      result = 1;
-    }
-  }
-
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         st_validator_testAntenna_Txldo
-**
-** Description      Validator function to validate Antenna TxLDO current
-**                  measurement.
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testAntenna_Txldo(nci_data_t* exp,
-                                              phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-  uint8_t mesuredrange = 0;
-  long measured_val = 0;
-  int tolerance = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-
-  NXPLOG_NCIHAL_D("st_validator_testAntenna_Txldo = 0x%x", act->pBuff[3]);
-  if (0x05 == act->pBuff[2]) {
-    if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
-      result = 1;
-      NXPLOG_NCIHAL_D("Antenna: TxLDO current measured raw value in mA : 0x%x",
-                      act->pBuff[4]);
-      if (0x00 == act->pBuff[5]) {
-        NXPLOG_NCIHAL_D("Measured range : 0x00 = 50 - 100 mA");
-        measured_val = ((0.40 * act->pBuff[4]) + 50);
-        NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld",
-                        measured_val);
-      } else {
-        NXPLOG_NCIHAL_D("Measured range : 0x01 = 20 - 70 mA");
-        measured_val = ((0.40 * act->pBuff[4]) + 20);
-        NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld",
-                        measured_val);
-      }
-
-      tolerance = (phAntenna_resp.wTxdoMeasuredRangeMax *
-                   phAntenna_resp.wTxdoMeasuredTolerance) /
-                  100;
-      if ((measured_val <= phAntenna_resp.wTxdoMeasuredRangeMax + tolerance)) {
-        tolerance = (phAntenna_resp.wTxdoMeasuredRangeMin *
-                     phAntenna_resp.wTxdoMeasuredTolerance) /
-                    100;
-        if ((measured_val >=
-             phAntenna_resp.wTxdoMeasuredRangeMin - tolerance)) {
-          gtxldo_status = NFCSTATUS_SUCCESS;
-          NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement PASS");
-        } else {
-          gtxldo_status = NFCSTATUS_FAILED;
-          NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL");
-        }
-      } else {
-        gtxldo_status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL");
-      }
-    } else {
-      gtxldo_status = NFCSTATUS_FAILED;
-      NXPLOG_NCIHAL_E(
-          "Test Antenna Response for TxLDO measurement failed: Invalid status");
-    }
-
-  } else {
-    gtxldo_status = NFCSTATUS_FAILED;
-    NXPLOG_NCIHAL_E(
-        "Test Antenna Response for TxLDO measurement failed: Invalid payload "
-        "length");
-  }
-
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         st_validator_testAntenna_AgcVal
-**
-** Description      Validator function reads AGC value of antenna and print the
-**                  info
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testAntenna_AgcVal(nci_data_t* exp,
-                                               phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-  int agc_tolerance = 0;
-  long agc_val = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-
-  if (0x05 == act->pBuff[2]) {
-    if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
-      result = 1;
-      agc_tolerance =
-          (phAntenna_resp.wAgcValue * phAntenna_resp.wAgcValueTolerance) / 100;
-      agc_val = ((act->pBuff[5] << 8) | (act->pBuff[4]));
-      NXPLOG_NCIHAL_D("AGC value : %ld", agc_val);
-      if (((phAntenna_resp.wAgcValue - agc_tolerance) <= agc_val) &&
-          (agc_val <= (phAntenna_resp.wAgcValue + agc_tolerance))) {
-        gagc_value_status = NFCSTATUS_SUCCESS;
-        NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values  PASS");
-      } else {
-        gagc_value_status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values  FAIL");
-      }
-    } else {
-      gagc_value_status = NFCSTATUS_FAILED;
-      NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values  FAIL");
-    }
-  } else {
-    gagc_value_status = NFCSTATUS_FAILED;
-    NXPLOG_NCIHAL_E(
-        "Test Antenna Response for AGC value failed: Invalid payload length");
-  }
-
-  return result;
-}
-/*******************************************************************************
-**
-** Function         st_validator_testAntenna_AgcVal_FixedNfcLd
-**
-** Description      Validator function reads and print AGC value of
-**                  antenna with fixed NFCLD
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(
-    nci_data_t* exp, phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-  int agc_nfcld_tolerance = 0;
-  long agc_nfcld = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-
-  if (0x05 == act->pBuff[2]) {
-    if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
-      result = 1;
-      agc_nfcld_tolerance = (phAntenna_resp.wAgcValuewithfixedNFCLD *
-                             phAntenna_resp.wAgcValuewithfixedNFCLDTolerance) /
-                            100;
-      agc_nfcld = ((act->pBuff[5] << 8) | (act->pBuff[4]));
-      NXPLOG_NCIHAL_D("AGC value with Fixed Nfcld  : %ld", agc_nfcld);
-
-      if (((phAntenna_resp.wAgcValuewithfixedNFCLD - agc_nfcld_tolerance) <=
-           agc_nfcld) &&
-          (agc_nfcld <=
-           (phAntenna_resp.wAgcValuewithfixedNFCLD + agc_nfcld_tolerance))) {
-        gagc_nfcld_status = NFCSTATUS_SUCCESS;
-        NXPLOG_NCIHAL_E(
-            "Test Antenna Response for AGC value with fixed NFCLD PASS");
-      } else {
-        gagc_nfcld_status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_E(
-            "Test Antenna Response for AGC value with fixed NFCLD FAIL");
-      }
-    } else {
-      gagc_nfcld_status = NFCSTATUS_FAILED;
-      NXPLOG_NCIHAL_E(
-          "Test Antenna Response for AGC value with fixed NFCLD failed: "
-          "Invalid status");
-    }
-  } else {
-    gagc_nfcld_status = NFCSTATUS_FAILED;
-    NXPLOG_NCIHAL_E(
-        "Test Antenna Response for AGC value with fixed NFCLD failed: Invalid "
-        "payload length");
-  }
-
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         st_validator_testAntenna_AgcVal_Differential
-**
-** Description      Reads the AGC value with open/short RM from buffer and print
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testAntenna_AgcVal_Differential(
-    nci_data_t* exp, phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-  int agc_toleranceopne1 = 0;
-  int agc_toleranceopne2 = 0;
-  long agc_differentialOpne1 = 0;
-  long agc_differentialOpne2 = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-
-  if (0x05 == act->pBuff[2]) {
-    if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
-      result = 1;
-      agc_toleranceopne1 = (phAntenna_resp.wAgcDifferentialWithOpen1 *
-                            phAntenna_resp.wAgcDifferentialWithOpenTolerance1) /
-                           100;
-      agc_toleranceopne2 = (phAntenna_resp.wAgcDifferentialWithOpen2 *
-                            phAntenna_resp.wAgcDifferentialWithOpenTolerance2) /
-                           100;
-      agc_differentialOpne1 = ((act->pBuff[5] << 8) | (act->pBuff[4]));
-      agc_differentialOpne2 = ((act->pBuff[7] << 8) | (act->pBuff[6]));
-      NXPLOG_NCIHAL_D("AGC value differential Opne 1  : %ld",
-                      agc_differentialOpne1);
-      NXPLOG_NCIHAL_D("AGC value differentialOpne  2 : %ld",
-                      agc_differentialOpne2);
-
-      if (((agc_differentialOpne1 >=
-            phAntenna_resp.wAgcDifferentialWithOpen1 - agc_toleranceopne1) &&
-           (agc_differentialOpne1 <=
-            phAntenna_resp.wAgcDifferentialWithOpen1 + agc_toleranceopne1)) &&
-          ((agc_differentialOpne2 >=
-            phAntenna_resp.wAgcDifferentialWithOpen2 - agc_toleranceopne2) &&
-           (agc_differentialOpne2 <=
-            phAntenna_resp.wAgcDifferentialWithOpen2 + agc_toleranceopne2))) {
-        gagc_differential_status = NFCSTATUS_SUCCESS;
-        NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential Open PASS");
-      } else {
-        gagc_differential_status = NFCSTATUS_FAILED;
-        NXPLOG_NCIHAL_E(
-            "Test Antenna Response for AGC Differential Open  FAIL");
-      }
-    } else {
-      NXPLOG_NCIHAL_E(
-          "Test Antenna Response for AGC Differential failed: Invalid status");
-      gagc_differential_status = NFCSTATUS_FAILED;
-    }
-
-  } else {
-    NXPLOG_NCIHAL_E(
-        "Test Antenna Response for AGC Differential failed: Invalid payload "
-        "length");
-    gagc_differential_status = NFCSTATUS_FAILED;
-  }
-
-  return result;
-}
-/*******************************************************************************
-**
-** Function         st_validator_testEquals
-**
-** Description      Validator function to validate for equality between actual
-**                  and expected values.
-**
-** Returns          One if successful otherwise Zero.
-**
-*******************************************************************************/
-static uint8_t st_validator_testEquals(nci_data_t* exp,
-                                       phTmlNfc_TransactInfo_t* act) {
-  uint8_t result = 0;
-
-  if (NULL == exp || NULL == act) {
-    return result;
-  }
-  if (exp->len <= act->wLength &&
-      (memcmp(exp->p_data, act->pBuff, exp->len) == 0)) {
-    result = 1;
-  }
-
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         hal_write_rsp_timeout_cb
-**
-** Description      Callback function for hal write response timer.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void hal_write_rsp_timeout_cb(uint32_t timerId, void* pContext) {
-  UNUSED(timerId);
-  NXPLOG_NCIHAL_E("hal_write_rsp_timeout_cb - write timeout!!!");
-  hal_write_timer_fired = 1;
-  hal_read_cb(pContext, NULL);
-}
-
-/*******************************************************************************
-**
-** Function         hal_write_cb
-**
-** Description      Callback function for hal write.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void hal_write_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-
-  if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("write successful status = 0x%x", pInfo->wStatus);
-  } else {
-    NXPLOG_NCIHAL_E("write error status = 0x%x", pInfo->wStatus);
-  }
-
-  p_cb_data->status = pInfo->wStatus;
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         hal_read_cb
-**
-** Description      Callback function for hal read.
-**
-** Returns          None
-**
-*******************************************************************************/
-static void hal_read_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
-  NFCSTATUS status;
-  if (hal_write_timer_fired == 1) {
-    NXPLOG_NCIHAL_D("hal_read_cb - response timeout occurred");
-
-    hal_write_timer_fired = 0;
-    p_cb_data->status = NFCSTATUS_RESPONSE_TIMEOUT;
-    status = phTmlNfc_ReadAbort();
-  } else {
-    NFCSTATUS status = phOsalNfc_Timer_Stop(timeoutTimerId);
-
-    if (NFCSTATUS_SUCCESS == status) {
-      NXPLOG_NCIHAL_D("Response timer stopped");
-    } else {
-      NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
-      p_cb_data->status = NFCSTATUS_FAILED;
-    }
-    if (pInfo == NULL) {
-      NXPLOG_NCIHAL_E("Empty TransactInfo");
-      p_cb_data->status = NFCSTATUS_FAILED;
-    } else {
-      if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
-        NXPLOG_NCIHAL_D("hal_read_cb successful status = 0x%x", pInfo->wStatus);
-        p_cb_data->status = NFCSTATUS_SUCCESS;
-      } else {
-        NXPLOG_NCIHAL_E("hal_read_cb error status = 0x%x", pInfo->wStatus);
-        p_cb_data->status = NFCSTATUS_FAILED;
-      }
-
-      p_cb_data->status = pInfo->wStatus;
-      nci_test_data_t* test_data = (nci_test_data_t*)p_cb_data->pContext;
-
-      if (test_data->exp_rsp.len == 0) {
-        /* Compare the actual notification with expected notification.*/
-        if (test_data->ntf_validator(&(test_data->exp_ntf), pInfo) == 1) {
-          p_cb_data->status = NFCSTATUS_SUCCESS;
-        } else {
-          p_cb_data->status = NFCSTATUS_FAILED;
-        }
-      }
-
-      /* Compare the actual response with expected response.*/
-      else if (test_data->rsp_validator(&(test_data->exp_rsp), pInfo) == 1) {
-        p_cb_data->status = NFCSTATUS_SUCCESS;
-      } else {
-        p_cb_data->status = NFCSTATUS_FAILED;
-      }
-
-      test_data->exp_rsp.len = 0;
-    }
-  }
-
-  SEM_POST(p_cb_data);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_test_rx_thread
-**
-** Description      Thread to fetch and process messages from message queue.
-**
-** Returns          NULL
-**
-*******************************************************************************/
-static void* phNxpNciHal_test_rx_thread(void* arg) {
-  phLibNfc_Message_t msg;
-  UNUSED(arg);
-  NXPLOG_NCIHAL_D("Self test thread started");
-
-  thread_running = 1;
-
-  while (thread_running == 1) {
-    /* Fetch next message from the NFC stack message queue */
-    if (phDal4Nfc_msgrcv(gDrvCfg.nClientId, &msg, 0, 0) == -1) {
-      NXPLOG_NCIHAL_E("Received bad message");
-      continue;
-    }
-
-    if (thread_running == 0) {
-      break;
-    }
-
-    switch (msg.eMsgType) {
-      case PH_LIBNFC_DEFERREDCALL_MSG: {
-        phLibNfc_DeferredCall_t* deferCall =
-            (phLibNfc_DeferredCall_t*)(msg.pMsgData);
-
-        REENTRANCE_LOCK();
-        deferCall->pCallback(deferCall->pParameter);
-        REENTRANCE_UNLOCK();
-
-        break;
-      }
-    }
-  }
-
-  NXPLOG_NCIHAL_D("Self test thread stopped");
-
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_readLocked
-**
-** Description      Reads response and notification from NFCC and waits for
-**                  read completion, for a definitive timeout value.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
-**                  NFCSTATUS_RESPONSE_TIMEOUT in case of timeout.
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_readLocked(nci_test_data_t* pData) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  phNxpNciHal_Sem_t cb_data;
-  uint16_t read_len = 16;
-  /* RX Buffer */
-  uint32_t rx_data[NCI_MAX_DATA_LEN];
-
-  /* Create the local semaphore */
-  if (phNxpNciHal_init_cb_data(&cb_data, pData) != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phTmlNfc_Read Create cb data failed");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* call read pending */
-  status =
-      phTmlNfc_Read((uint8_t*)rx_data, (uint16_t)read_len,
-                    (pphTmlNfc_TransactCompletionCb_t)&hal_read_cb, &cb_data);
-
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("TML Read status error status = %x", status);
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_WRITE_RSP_TIMEOUT,
-                                 &hal_write_rsp_timeout_cb, &cb_data);
-
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_NCIHAL_D("Response timer started");
-  } else {
-    NXPLOG_NCIHAL_E("Response timer not started");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_NCIHAL_E("phTmlNfc_Read semaphore error");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status == NFCSTATUS_RESPONSE_TIMEOUT) {
-    NXPLOG_NCIHAL_E("Response timeout!!!");
-    status = NFCSTATUS_RESPONSE_TIMEOUT;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("phTmlNfc_Read failed  ");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_writeLocked
-**
-** Description      Send command to NFCC and waits for cmd write completion, for
-**                  a definitive timeout value.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
-**                  NFCSTATUS_RESPONSE_TIMEOUT in case of timeout.
-**
-*******************************************************************************/
-static NFCSTATUS phNxpNciHal_writeLocked(nci_test_data_t* pData) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  phNxpNciHal_Sem_t cb_data;
-  int retryCnt = 0;
-
-  /* Create the local semaphore */
-  if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phTmlNfc_Write Create cb data failed");
-    goto clean_and_return;
-  }
-
-retry:
-  status =
-      phTmlNfc_Write(pData->cmd.p_data, pData->cmd.len,
-                     (pphTmlNfc_TransactCompletionCb_t)&hal_write_cb, &cb_data);
-
-  if (status != NFCSTATUS_PENDING) {
-    NXPLOG_NCIHAL_E("phTmlNfc_Write status error");
-    goto clean_and_return;
-  }
-
-  /* Wait for callback response */
-  if (SEM_WAIT(cb_data)) {
-    NXPLOG_NCIHAL_E("write_unlocked semaphore error");
-    status = NFCSTATUS_FAILED;
-    goto clean_and_return;
-  }
-
-  if (cb_data.status != NFCSTATUS_SUCCESS && retryCnt < HAL_WRITE_MAX_RETRY) {
-    retryCnt++;
-    NXPLOG_NCIHAL_E(
-        "write_unlocked failed - PN54X Maybe in Standby Mode - Retry %d",
-        retryCnt);
-    goto retry;
-  }
-
-  status = cb_data.status;
-
-clean_and_return:
-  phNxpNciHal_cleanup_cb_data(&cb_data);
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_performTest
-**
-** Description      Performs a single cycle of command,response and
-**                  notification.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_performTest(nci_test_data_t* pData) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  if (NULL == pData) {
-    return NFCSTATUS_FAILED;
-  }
-
-  CONCURRENCY_LOCK();
-
-  status = phNxpNciHal_writeLocked(pData);
-
-  if (status == NFCSTATUS_RESPONSE_TIMEOUT) {
-    goto clean_and_return;
-  }
-  if (status != NFCSTATUS_SUCCESS) {
-    goto clean_and_return;
-  }
-
-  status = phNxpNciHal_readLocked(pData);
-
-  if (status != NFCSTATUS_SUCCESS) {
-    goto clean_and_return;
-  }
-
-  if (0 != pData->exp_ntf.len) {
-    status = phNxpNciHal_readLocked(pData);
-
-    if (status != NFCSTATUS_SUCCESS) {
-      goto clean_and_return;
-    }
-  }
-
-clean_and_return:
-  CONCURRENCY_UNLOCK();
-  return status;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_TestMode_open
- **
- ** Description      It opens the physical connection with NFCC (PN54X) and
- **                  creates required client thread for operation.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_TestMode_open(void) {
-  /* Thread */
-  pthread_t test_rx_thread;
-
-  phOsalNfc_Config_t tOsalConfig;
-  phTmlNfc_Config_t tTmlConfig;
-  char* nfc_dev_node = NULL;
-  const uint16_t max_len = 260;
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  uint16_t read_len = 255;
-  int8_t ret_val = 0x00;
-  /* initialize trace level */
-  phNxpLog_InitializeLogLevel();
-
-  if (phNxpNciHal_init_monitor() == NULL) {
-    NXPLOG_NCIHAL_E("Init monitor failed");
-    return NFCSTATUS_FAILED;
-  }
-
-  CONCURRENCY_LOCK();
-
-  memset(&tOsalConfig, 0x00, sizeof(tOsalConfig));
-  memset(&tTmlConfig, 0x00, sizeof(tTmlConfig));
-
-  /* Read the nfc device node name */
-  nfc_dev_node = (char*)malloc(max_len * sizeof(char));
-  if (nfc_dev_node == NULL) {
-    NXPLOG_NCIHAL_E("malloc of nfc_dev_node failed ");
-    goto clean_and_return;
-  } else if (!GetNxpStrValue(NAME_NXP_NFC_DEV_NODE, nfc_dev_node,
-                             sizeof(nfc_dev_node))) {
-    NXPLOG_NCIHAL_E(
-        "Invalid nfc device node name keeping the default device node "
-        "/dev/pn54x");
-    strcpy(nfc_dev_node, "/dev/pn54x");
-  }
-
-  gDrvCfg.nClientId = phDal4Nfc_msgget(0, 0600);
-  gDrvCfg.nLinkType = ENUM_LINK_TYPE_I2C; /* For PN54X */
-  tTmlConfig.pDevName = (int8_t*)nfc_dev_node;
-  tOsalConfig.dwCallbackThreadId = (uintptr_t)gDrvCfg.nClientId;
-  tOsalConfig.pLogFile = NULL;
-  tTmlConfig.dwGetMsgThreadId = (uintptr_t)gDrvCfg.nClientId;
-  nxpncihal_ctrl.gDrvCfg.nClientId = (uintptr_t)gDrvCfg.nClientId;
-
-  /* Initialize TML layer */
-  status = phTmlNfc_Init(&tTmlConfig);
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_E("phTmlNfc_Init Failed");
-    goto clean_and_return;
-  } else {
-    if (nfc_dev_node != NULL) {
-      free(nfc_dev_node);
-      nfc_dev_node = NULL;
-    }
-  }
-
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-  ret_val =
-      pthread_create(&test_rx_thread, &attr, phNxpNciHal_test_rx_thread, NULL);
-  pthread_attr_destroy(&attr);
-  if (ret_val != 0) {
-    NXPLOG_NCIHAL_E("pthread_create failed");
-    phTmlNfc_Shutdown();
-    goto clean_and_return;
-  }
-
-  timeoutTimerId = phOsalNfc_Timer_Create();
-
-  if (timeoutTimerId == 0xFFFF) {
-    NXPLOG_NCIHAL_E("phOsalNfc_Timer_Create failed");
-  } else {
-    NXPLOG_NCIHAL_D("phOsalNfc_Timer_Create SUCCESS");
-  }
-  CONCURRENCY_UNLOCK();
-
-  return NFCSTATUS_SUCCESS;
-
-clean_and_return:
-  CONCURRENCY_UNLOCK();
-  if (nfc_dev_node != NULL) {
-    free(nfc_dev_node);
-    nfc_dev_node = NULL;
-  }
-  phNxpNciHal_cleanup_monitor();
-  return NFCSTATUS_FAILED;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_TestMode_close
- **
- ** Description      This function close the NFCC interface and free all
- **                  resources.
- **
- ** Returns          None.
- **
- ******************************************************************************/
-
-void phNxpNciHal_TestMode_close() {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  CONCURRENCY_LOCK();
-
-  if (NULL != gpphTmlNfc_Context->pDevHandle) {
-    /* Abort any pending read and write */
-    status = phTmlNfc_ReadAbort();
-    status = phTmlNfc_WriteAbort();
-
-    phOsalNfc_Timer_Cleanup();
-
-    status = phTmlNfc_Shutdown();
-
-    NXPLOG_NCIHAL_D("phNxpNciHal_close return status = %d", status);
-
-    thread_running = 0;
-
-    phDal4Nfc_msgrelease(gDrvCfg.nClientId);
-
-    status = phOsalNfc_Timer_Delete(timeoutTimerId);
-  }
-
-  CONCURRENCY_UNLOCK();
-
-  phNxpNciHal_cleanup_monitor();
-
-  /* Return success always */
-  return;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_SwpTest
- **
- ** Description      Test function to validate the SWP line. SWP line number is
- **                  is sent as parameter to the API.
- **
- ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_SwpTest(uint8_t swp_line) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  int len = 0;
-  int cnt = 0;
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - start\n");
-
-  if (swp_line == 0x01) {
-    len = (sizeof(swp1_test_data) / sizeof(swp1_test_data[0]));
-
-    for (cnt = 0; cnt < len; cnt++) {
-      status = phNxpNciHal_performTest(&(swp1_test_data[cnt]));
-      if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-        break;
-      }
-    }
-  } else if (swp_line == 0x02) {
-    len = (sizeof(swp2_test_data) / sizeof(swp2_test_data[0]));
-
-    for (cnt = 0; cnt < len; cnt++) {
-      status = phNxpNciHal_performTest(&(swp2_test_data[cnt]));
-      if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-        break;
-      }
-    }
-  } else {
-    status = NFCSTATUS_FAILED;
-  }
-
-  if (status == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - SUCCESSS\n");
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - FAILED\n");
-  }
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - end\n");
-
-  return status;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_PrbsTestStart
- **
- ** Description      Test function start RF generation for RF technology and bit
- **                  rate. RF technology and bit rate are sent as parameter to
- **                  the API.
- **
- ** Returns          NFCSTATUS_SUCCESS if RF generation successful,
- **                  otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_PrbsType_t prbs_type,
-                                    phNxpNfc_PrbsHwType_t hw_prbs_type,
-                                    phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate)
-#else
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate)
-#endif
-{
-  NFCSTATUS status = NFCSTATUS_FAILED;
-
-  nci_test_data_t prbs_cmd_data;
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
-  prbs_cmd_data.cmd.len = 0x09;
-#else
-  uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
-  prbs_cmd_data.cmd.len = 0x07;
-#endif
-
-  memcpy(prbs_cmd_data.exp_rsp.p_data, &rsp_cmd_info[0], sizeof(rsp_cmd_info));
-  prbs_cmd_data.exp_rsp.len = sizeof(rsp_cmd_info);
-
-  // prbs_cmd_data.exp_rsp.len = 0x00;
-  prbs_cmd_data.exp_ntf.len = 0x00;
-  prbs_cmd_data.rsp_validator = st_validator_testEquals;
-  prbs_cmd_data.ntf_validator = st_validator_null;
-
-  uint8_t len = 0;
-  uint8_t cnt = 0;
-
-//    [NCI] -> [0x2F 0x30 0x04 0x00 0x00 0x01 0xFF]
-
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  status =
-      phNxpNciHal_getPrbsCmd(prbs_type, hw_prbs_type, tech, bitrate,
-                             prbs_cmd_data.cmd.p_data, prbs_cmd_data.cmd.len);
-#else
-  status = phNxpNciHal_getPrbsCmd(tech, bitrate, prbs_cmd_data.cmd.p_data,
-                                  prbs_cmd_data.cmd.len);
-#endif
-
-  if (status == NFCSTATUS_FAILED) {
-    // Invalid Param.
-    NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - INVALID_PARAM\n");
-
-    goto clean_and_return;
-  }
-
-  len = (sizeof(prbs_test_data) / sizeof(prbs_test_data[0]));
-
-  for (cnt = 0; cnt < len; cnt++) {
-    status = phNxpNciHal_performTest(&(prbs_test_data[cnt]));
-    if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-      break;
-    }
-  }
-
-  /* Ignoring status, as there will be no response - Applicable till FW version
-   * 8.1.1*/
-  status = phNxpNciHal_performTest(&prbs_cmd_data);
-clean_and_return:
-
-  if (status == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - SUCCESSS\n");
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - FAILED\n");
-  }
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - end\n");
-
-  return status;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_PrbsTestStop
- **
- ** Description      Test function stop RF generation for RF technology started
- **                  by phNxpNciHal_PrbsTestStart.
- **
- ** Returns          NFCSTATUS_SUCCESS if operation successful,
- **                  otherwise NFCSTATUS_FAILED.
- **
- ******************************************************************************/
-
-NFCSTATUS phNxpNciHal_PrbsTestStop() {
-  NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - Start\n");
-
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-
-  status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
-
-  if (NFCSTATUS_SUCCESS == status) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - SUCCESS\n");
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - FAILED\n");
-  }
-  NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - end\n");
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_getPrbsCmd
-**
-** Description      Test function frames the PRBS command.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
-                                 phNxpNfc_PrbsHwType_t hw_prbs_type,
-                                 uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
-#else
-NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
-#endif
-{
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  int position_tech_param = 0;
-  int position_bit_param = 0;
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - tech 0x%x bitrate = 0x%x", tech,
-                  bitrate);
-  if (NULL == prbs_cmd ||
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-      prbs_cmd_len != 0x09)
-#else
-      prbs_cmd_len != 0x07)
-#endif
-  {
-    return status;
-  }
-
-  prbs_cmd[0] = 0x2F;
-  prbs_cmd[1] = 0x30;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  prbs_cmd[2] = 0x06;
-  prbs_cmd[3] = (uint8_t)prbs_type;
-  // 0xFF Error value used for validation.
-  prbs_cmd[4] = (uint8_t)hw_prbs_type;
-  prbs_cmd[5] = 0xFF;  // TECH
-  prbs_cmd[6] = 0xFF;  // BITRATE
-  prbs_cmd[7] = 0x01;
-  prbs_cmd[8] = 0xFF;
-  position_tech_param = 5;
-  position_bit_param = 6;
-#else
-  prbs_cmd[2] = 0x04;
-  // 0xFF Error value used for validation.
-  prbs_cmd[3] = 0xFF;  // TECH
-  // 0xFF Error value used for validation.
-  prbs_cmd[4] = 0xFF;  // BITRATE
-  prbs_cmd[5] = 0x01;
-  prbs_cmd[6] = 0xFF;
-  position_tech_param = 3;
-  position_bit_param = 4;
-#endif
-
-  switch (tech) {
-    case NFC_RF_TECHNOLOGY_A:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_A");
-      prbs_cmd[position_tech_param] = 0x00;
-      break;
-    case NFC_RF_TECHNOLOGY_B:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_B");
-      prbs_cmd[position_tech_param] = 0x01;
-      break;
-    case NFC_RF_TECHNOLOGY_F:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_F");
-      prbs_cmd[position_tech_param] = 0x02;
-      break;
-    default:
-      break;
-  }
-
-  switch (bitrate) {
-    case NFC_BIT_RATE_106:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_106");
-      if (prbs_cmd[position_tech_param] != 0x02) {
-        prbs_cmd[position_bit_param] = 0x00;
-      }
-      break;
-    case NFC_BIT_RATE_212:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_212");
-      prbs_cmd[position_bit_param] = 0x01;
-      break;
-    case NFC_BIT_RATE_424:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_424");
-      prbs_cmd[position_bit_param] = 0x02;
-      break;
-    case NFC_BIT_RATE_848:
-      NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_848");
-      if (prbs_cmd[position_tech_param] != 0x02) {
-        prbs_cmd[position_bit_param] = 0x03;
-      }
-      break;
-    default:
-      break;
-  }
-
-  if (prbs_cmd[position_tech_param] == 0xFF ||
-      prbs_cmd[position_bit_param] == 0xFF) {
-    // Invalid Param.
-    status = NFCSTATUS_FAILED;
-  }
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_RfFieldTest
-**
-** Description      Test function performs RF filed test.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_RfFieldTest(uint8_t on) {
-  NFCSTATUS status = NFCSTATUS_SUCCESS;
-  int len = 0;
-  int cnt = 0;
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - start %x\n", on);
-
-  if (on == 0x01) {
-    len = (sizeof(rf_field_on_test_data) / sizeof(rf_field_on_test_data[0]));
-
-    for (cnt = 0; cnt < len; cnt++) {
-      status = phNxpNciHal_performTest(&(rf_field_on_test_data[cnt]));
-      if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-        break;
-      }
-    }
-  } else if (on == 0x00) {
-    len = (sizeof(rf_field_off_test_data) / sizeof(rf_field_off_test_data[0]));
-
-    for (cnt = 0; cnt < len; cnt++) {
-      status = phNxpNciHal_performTest(&(rf_field_off_test_data[cnt]));
-      if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-        break;
-      }
-    }
-  } else {
-    status = NFCSTATUS_FAILED;
-  }
-
-  if (status == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - SUCCESSS\n");
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - FAILED\n");
-  }
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - end\n");
-
-  return status;
-}
-
-/*******************************************************************************
- **
- ** Function         phNxpNciHal_AntennaTest
- **
- ** Description
- **
- ** Returns
- **
- ******************************************************************************/
-NFCSTATUS phNxpNciHal_AntennaTest() {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_DownloadPinTest
-**
-** Description      Test function to validate the FW download pin connection.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_DownloadPinTest(void) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  int len = 0;
-  int cnt = 0;
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - start\n");
-
-  len = (sizeof(download_pin_test_data1) / sizeof(download_pin_test_data1[0]));
-
-  for (cnt = 0; cnt < len; cnt++) {
-    status = phNxpNciHal_performTest(&(download_pin_test_data1[cnt]));
-    if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-      break;
-    }
-  }
-
-  if (status != NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
-    return status;
-  }
-
-  status = NFCSTATUS_FAILED;
-  status = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
-  if (NFCSTATUS_SUCCESS != status) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
-    return status;
-  }
-
-  status = NFCSTATUS_FAILED;
-  len = (sizeof(download_pin_test_data2) / sizeof(download_pin_test_data2[0]));
-
-  for (cnt = 0; cnt < len; cnt++) {
-    status = phNxpNciHal_performTest(&(download_pin_test_data2[cnt]));
-    if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-      break;
-    }
-  }
-
-  if (status == NFCSTATUS_SUCCESS) {
-    NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - SUCCESSS\n");
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
-  }
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - end\n");
-
-  return status;
-}
-/*******************************************************************************
-**
-** Function         phNxpNciHal_AntennaSelfTest
-**
-** Description      Test function to validate the Antenna's discrete
-**                  components connection.
-**
-** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
-**
-*******************************************************************************/
-NFCSTATUS phNxpNciHal_AntennaSelfTest(phAntenna_St_Resp_t* phAntenna_St_Resp) {
-  NFCSTATUS status = NFCSTATUS_FAILED;
-  NFCSTATUS antenna_st_status = NFCSTATUS_FAILED;
-  int len = 0;
-  int cnt = 0;
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - start\n");
-  memcpy(&phAntenna_resp, phAntenna_St_Resp, sizeof(phAntenna_St_Resp_t));
-  len = (sizeof(antenna_self_test_data) / sizeof(antenna_self_test_data[0]));
-
-  for (cnt = 0; cnt < len; cnt++) {
-    status = phNxpNciHal_performTest(&(antenna_self_test_data[cnt]));
-    if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
-      NXPLOG_NCIHAL_E(
-          "phNxpNciHal_AntennaSelfTest: commnad execution - FAILED\n");
-      break;
-    }
-  }
-
-  if (status == NFCSTATUS_SUCCESS) {
-    if ((gtxldo_status == NFCSTATUS_SUCCESS) &&
-        (gagc_value_status == NFCSTATUS_SUCCESS) &&
-        (gagc_nfcld_status == NFCSTATUS_SUCCESS) &&
-        (gagc_differential_status == NFCSTATUS_SUCCESS)) {
-      antenna_st_status = NFCSTATUS_SUCCESS;
-      NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - SUCESS\n");
-    } else {
-      NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n");
-    }
-  } else {
-    NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n");
-  }
-
-  NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - end\n");
-
-  return antenna_st_status;
-}
-
-#endif /*#ifdef NXP_HW_SELF_TEST*/
diff --git a/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.c b/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.c
deleted file mode 100644
index f43774d..0000000
--- a/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * DAL independent message queue implementation for Android (can be used under
- * Linux too)
- */
-
-#include <errno.h>
-#include <linux/ipc.h>
-#include <phDal4Nfc_messageQueueLib.h>
-#include <phNxpLog.h>
-#include <pthread.h>
-#include <semaphore.h>
-
-typedef struct phDal4Nfc_message_queue_item {
-  phLibNfc_Message_t nMsg;
-  struct phDal4Nfc_message_queue_item* pPrev;
-  struct phDal4Nfc_message_queue_item* pNext;
-} phDal4Nfc_message_queue_item_t;
-
-typedef struct phDal4Nfc_message_queue {
-  phDal4Nfc_message_queue_item_t* pItems;
-  pthread_mutex_t nCriticalSectionMutex;
-  sem_t nProcessSemaphore;
-
-} phDal4Nfc_message_queue_t;
-
-/*******************************************************************************
-**
-** Function         phDal4Nfc_msgget
-**
-** Description      Allocates message queue
-**
-** Parameters       Ignored, included only for Linux queue API compatibility
-**
-** Returns          (int) value of pQueue if successful
-**                  -1, if failed to allocate memory or to init mutex
-**
-*******************************************************************************/
-intptr_t phDal4Nfc_msgget(key_t key, int msgflg) {
-  phDal4Nfc_message_queue_t* pQueue;
-  UNUSED(key);
-  UNUSED(msgflg);
-  pQueue =
-      (phDal4Nfc_message_queue_t*)malloc(sizeof(phDal4Nfc_message_queue_t));
-  if (pQueue == NULL) return -1;
-  memset(pQueue, 0, sizeof(phDal4Nfc_message_queue_t));
-  if (pthread_mutex_init(&pQueue->nCriticalSectionMutex, NULL) == -1) {
-    free(pQueue);
-    return -1;
-  }
-  if (sem_init(&pQueue->nProcessSemaphore, 0, 0) == -1) {
-    free(pQueue);
-    return -1;
-  }
-
-  return ((intptr_t)pQueue);
-}
-
-/*******************************************************************************
-**
-** Function         phDal4Nfc_msgrelease
-**
-** Description      Releases message queue
-**
-** Parameters       msqid - message queue handle
-**
-** Returns          None
-**
-*******************************************************************************/
-void phDal4Nfc_msgrelease(intptr_t msqid) {
-  phDal4Nfc_message_queue_t* pQueue = (phDal4Nfc_message_queue_t*)msqid;
-
-  if (pQueue != NULL) {
-    sem_post(&pQueue->nProcessSemaphore);
-    usleep(3000);
-    if (sem_destroy(&pQueue->nProcessSemaphore)) {
-      NXPLOG_TML_E("Failed to destroy semaphore (errno=0x%08x)", errno);
-    }
-    pthread_mutex_destroy(&pQueue->nCriticalSectionMutex);
-
-    free(pQueue);
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phDal4Nfc_msgctl
-**
-** Description      Destroys message queue
-**
-** Parameters       msqid - message queue handle
-**                  cmd, buf - ignored, included only for Linux queue API
-**                  compatibility
-**
-** Returns          0,  if successful
-**                  -1, if invalid handle is passed
-**
-*******************************************************************************/
-int phDal4Nfc_msgctl(intptr_t msqid, int cmd, void* buf) {
-  phDal4Nfc_message_queue_t* pQueue;
-  phDal4Nfc_message_queue_item_t* p;
-  UNUSED(cmd);
-  UNUSED(buf);
-  if (msqid == 0) return -1;
-
-  pQueue = (phDal4Nfc_message_queue_t*)msqid;
-  pthread_mutex_lock(&pQueue->nCriticalSectionMutex);
-  if (pQueue->pItems != NULL) {
-    p = pQueue->pItems;
-    while (p->pNext != NULL) {
-      p = p->pNext;
-    }
-    while (p->pPrev != NULL) {
-      p = p->pPrev;
-      free(p->pNext);
-      p->pNext = NULL;
-    }
-    free(p);
-  }
-  pQueue->pItems = NULL;
-  pthread_mutex_unlock(&pQueue->nCriticalSectionMutex);
-  pthread_mutex_destroy(&pQueue->nCriticalSectionMutex);
-  free(pQueue);
-
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function         phDal4Nfc_msgsnd
-**
-** Description      Sends a message to the queue. The message will be added at
-**                  the end of the queue as appropriate for FIFO policy
-**
-** Parameters       msqid  - message queue handle
-**                  msgp   - message to be sent
-**                  msgsz  - message size
-**                  msgflg - ignored
-**
-** Returns          0,  if successful
-**                  -1, if invalid parameter passed or failed to allocate memory
-**
-*******************************************************************************/
-intptr_t phDal4Nfc_msgsnd(intptr_t msqid, phLibNfc_Message_t* msg, int msgflg) {
-  phDal4Nfc_message_queue_t* pQueue;
-  phDal4Nfc_message_queue_item_t* p;
-  phDal4Nfc_message_queue_item_t* pNew;
-  UNUSED(msgflg);
-  if ((msqid == 0) || (msg == NULL)) return -1;
-
-  pQueue = (phDal4Nfc_message_queue_t*)msqid;
-  pNew = (phDal4Nfc_message_queue_item_t*)malloc(
-      sizeof(phDal4Nfc_message_queue_item_t));
-  if (pNew == NULL) return -1;
-  memset(pNew, 0, sizeof(phDal4Nfc_message_queue_item_t));
-  memcpy(&pNew->nMsg, msg, sizeof(phLibNfc_Message_t));
-  pthread_mutex_lock(&pQueue->nCriticalSectionMutex);
-
-  if (pQueue->pItems != NULL) {
-    p = pQueue->pItems;
-    while (p->pNext != NULL) {
-      p = p->pNext;
-    }
-    p->pNext = pNew;
-    pNew->pPrev = p;
-  } else {
-    pQueue->pItems = pNew;
-  }
-  pthread_mutex_unlock(&pQueue->nCriticalSectionMutex);
-
-  sem_post(&pQueue->nProcessSemaphore);
-
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function         phDal4Nfc_msgrcv
-**
-** Description      Gets the oldest message from the queue.
-**                  If the queue is empty the function waits (blocks on a mutex)
-**                  until a message is posted to the queue with phDal4Nfc_msgsnd
-**
-** Parameters       msqid  - message queue handle
-**                  msgp   - message to be received
-**                  msgsz  - message size
-**                  msgtyp - ignored
-**                  msgflg - ignored
-**
-** Returns          0,  if successful
-**                  -1, if invalid parameter passed
-**
-*******************************************************************************/
-int phDal4Nfc_msgrcv(intptr_t msqid, phLibNfc_Message_t* msg, long msgtyp,
-                     int msgflg) {
-  phDal4Nfc_message_queue_t* pQueue;
-  phDal4Nfc_message_queue_item_t* p;
-  UNUSED(msgflg);
-  UNUSED(msgtyp);
-  if ((msqid == 0) || (msg == NULL)) return -1;
-
-  pQueue = (phDal4Nfc_message_queue_t*)msqid;
-
-  sem_wait(&pQueue->nProcessSemaphore);
-
-  pthread_mutex_lock(&pQueue->nCriticalSectionMutex);
-
-  if (pQueue->pItems != NULL) {
-    memcpy(msg, &(pQueue->pItems)->nMsg, sizeof(phLibNfc_Message_t));
-    p = pQueue->pItems->pNext;
-    free(pQueue->pItems);
-    pQueue->pItems = p;
-  }
-  pthread_mutex_unlock(&pQueue->nCriticalSectionMutex);
-
-  return 0;
-}
diff --git a/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.h b/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.h
deleted file mode 100644
index 1e0ede2..0000000
--- a/halimpl/pn54x/tml/phDal4Nfc_messageQueueLib.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * DAL independent message queue implementation for Android
- */
-
-#ifndef PHDAL4NFC_MESSAGEQUEUE_H
-#define PHDAL4NFC_MESSAGEQUEUE_H
-
-#include <linux/ipc.h>
-#include <phNfcTypes.h>
-
-intptr_t phDal4Nfc_msgget(key_t key, int msgflg);
-void phDal4Nfc_msgrelease(intptr_t msqid);
-int phDal4Nfc_msgctl(intptr_t msqid, int cmd, void* buf);
-intptr_t phDal4Nfc_msgsnd(intptr_t msqid, phLibNfc_Message_t* msg, int msgflg);
-int phDal4Nfc_msgrcv(intptr_t msqid, phLibNfc_Message_t* msg, long msgtyp,
-                     int msgflg);
-
-#endif /*  PHDAL4NFC_MESSAGEQUEUE_H  */
diff --git a/halimpl/pn54x/tml/phOsalNfc_Timer.c b/halimpl/pn54x/tml/phOsalNfc_Timer.c
deleted file mode 100644
index 3f5269d..0000000
--- a/halimpl/pn54x/tml/phOsalNfc_Timer.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * OSAL Implementation for Timers.
- */
-
-#include <phNfcCommon.h>
-#include <phNfcTypes.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal.h>
-#include <phOsalNfc_Timer.h>
-#include <signal.h>
-
-#define PH_NFC_MAX_TIMER (5U)
-static phOsalNfc_TimerHandle_t apTimerInfo[PH_NFC_MAX_TIMER];
-
-extern phNxpNciHal_Control_t nxpncihal_ctrl;
-
-/*
- * Defines the base address for generating timerid.
- */
-#define PH_NFC_TIMER_BASE_ADDRESS (100U)
-
-/*
- *  Defines the value for invalid timerid returned during timeSetEvent
- */
-#define PH_NFC_TIMER_ID_ZERO (0x00)
-
-/*
- * Invalid timer ID type. This ID used indicate timer creation is failed */
-#define PH_NFC_TIMER_ID_INVALID (0xFFFF)
-
-/* Forward declarations */
-static void phOsalNfc_PostTimerMsg(phLibNfc_Message_t* pMsg);
-static void phOsalNfc_DeferredCall(void* pParams);
-static void phOsalNfc_Timer_Expired(union sigval sv);
-
-/*
- *************************** Function Definitions ******************************
- */
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Create
-**
-** Description      Creates a timer which shall call back the specified function
-**                  when the timer expires. Fails if OSAL module is not
-**                  initialized or timers are already occupied
-**
-** Parameters       None
-**
-** Returns          TimerId
-**                  TimerId value of PH_OSALNFC_TIMER_ID_INVALID indicates that
-**                  timer is not created
-**
-*******************************************************************************/
-uint32_t phOsalNfc_Timer_Create(void) {
-  /* dwTimerId is also used as an index at which timer object can be stored */
-  uint32_t dwTimerId = PH_OSALNFC_TIMER_ID_INVALID;
-  static struct sigevent se;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  /* Timer needs to be initialized for timer usage */
-
-  se.sigev_notify = SIGEV_THREAD;
-  se.sigev_notify_function = phOsalNfc_Timer_Expired;
-  se.sigev_notify_attributes = NULL;
-  dwTimerId = phUtilNfc_CheckForAvailableTimer();
-
-  /* Check whether timers are available, if yes create a timer handle structure
-   */
-  if ((PH_NFC_TIMER_ID_ZERO != dwTimerId) && (dwTimerId <= PH_NFC_MAX_TIMER)) {
-    pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwTimerId - 1];
-    /* Build the Timer Id to be returned to Caller Function */
-    dwTimerId += PH_NFC_TIMER_BASE_ADDRESS;
-    se.sigev_value.sival_int = (int)dwTimerId;
-    /* Create POSIX timer */
-    if (timer_create(CLOCK_REALTIME, &se, &(pTimerHandle->hTimerHandle)) ==
-        -1) {
-      dwTimerId = PH_NFC_TIMER_ID_INVALID;
-    } else {
-      /* Set the state to indicate timer is ready */
-      pTimerHandle->eState = eTimerIdle;
-      /* Store the Timer Id which shall act as flag during check for timer
-       * availability */
-      pTimerHandle->TimerId = dwTimerId;
-    }
-  } else {
-    dwTimerId = PH_NFC_TIMER_ID_INVALID;
-  }
-
-  /* Timer ID invalid can be due to Uninitialized state,Non availability of
-   * Timer */
-  return dwTimerId;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Start
-**
-** Description      Starts the requested, already created, timer.
-**                  If the timer is already running, timer stops and restarts
-**                  with the new timeout value and new callback function in case
-**                  any ??????
-**                  Creates a timer which shall call back the specified function
-**                  when the timer expires
-**
-** Parameters       dwTimerId - valid timer ID obtained during timer creation
-**                  dwRegTimeCnt - requested timeout in milliseconds
-**                  pApplication_callback - application callback interface to be
-**                                          called when timer expires
-**                  pContext - caller context, to be passed to the application
-**                             callback function
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - the operation was successful
-**                  NFCSTATUS_NOT_INITIALISED - OSAL Module is not initialized
-**                  NFCSTATUS_INVALID_PARAMETER - invalid parameter passed to
-**                                                the function
-**                  PH_OSALNFC_TIMER_START_ERROR - timer could not be created
-**                                                 due to system error
-**
-*******************************************************************************/
-NFCSTATUS phOsalNfc_Timer_Start(uint32_t dwTimerId, uint32_t dwRegTimeCnt,
-                                pphOsalNfc_TimerCallbck_t pApplication_callback,
-                                void* pContext) {
-  NFCSTATUS wStartStatus = NFCSTATUS_SUCCESS;
-
-  struct itimerspec its;
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  /* Retrieve the index at which the timer handle structure is stored */
-  dwIndex = dwTimerId - PH_NFC_TIMER_BASE_ADDRESS - 0x01;
-  pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-  /* OSAL Module needs to be initialized for timer usage */
-  /* Check whether the handle provided by user is valid */
-  if ((dwIndex < PH_NFC_MAX_TIMER) && (0x00 != pTimerHandle->TimerId) &&
-      (NULL != pApplication_callback)) {
-    its.it_interval.tv_sec = 0;
-    its.it_interval.tv_nsec = 0;
-    its.it_value.tv_sec = dwRegTimeCnt / 1000;
-    its.it_value.tv_nsec = 1000000 * (dwRegTimeCnt % 1000);
-    if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0) {
-      /* This would inadvertently stop the timer*/
-      its.it_value.tv_nsec = 1;
-    }
-    pTimerHandle->Application_callback = pApplication_callback;
-    pTimerHandle->pContext = pContext;
-    pTimerHandle->eState = eTimerRunning;
-    /* Arm the timer */
-    if ((timer_settime(pTimerHandle->hTimerHandle, 0, &its, NULL)) == -1) {
-      wStartStatus = PHNFCSTVAL(CID_NFC_OSAL, PH_OSALNFC_TIMER_START_ERROR);
-    }
-  } else {
-    wStartStatus = PHNFCSTVAL(CID_NFC_OSAL, NFCSTATUS_INVALID_PARAMETER);
-  }
-
-  return wStartStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Stop
-**
-** Description      Stops already started timer
-**                  Allows to stop running timer. In case timer is stopped,
-**                  timer callback will not be notified any more
-**
-** Parameters       dwTimerId - valid timer ID obtained during timer creation
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - the operation was successful
-**                  NFCSTATUS_NOT_INITIALISED - OSAL Module is not initialized
-**                  NFCSTATUS_INVALID_PARAMETER - invalid parameter passed to
-**                                                the function
-**                  PH_OSALNFC_TIMER_STOP_ERROR - timer could not be stopped due
-**                                                to system error
-**
-*******************************************************************************/
-NFCSTATUS phOsalNfc_Timer_Stop(uint32_t dwTimerId) {
-  NFCSTATUS wStopStatus = NFCSTATUS_SUCCESS;
-  static struct itimerspec its = {{0, 0}, {0, 0}};
-
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  dwIndex = dwTimerId - PH_NFC_TIMER_BASE_ADDRESS - 0x01;
-  pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-  /* OSAL Module and Timer needs to be initialized for timer usage */
-  /* Check whether the TimerId provided by user is valid */
-  if ((dwIndex < PH_NFC_MAX_TIMER) && (0x00 != pTimerHandle->TimerId) &&
-      (pTimerHandle->eState != eTimerIdle)) {
-    /* Stop the timer only if the callback has not been invoked */
-    if (pTimerHandle->eState == eTimerRunning) {
-      if ((timer_settime(pTimerHandle->hTimerHandle, 0, &its, NULL)) == -1) {
-        wStopStatus = PHNFCSTVAL(CID_NFC_OSAL, PH_OSALNFC_TIMER_STOP_ERROR);
-      } else {
-        /* Change the state of timer to Stopped */
-        pTimerHandle->eState = eTimerStopped;
-      }
-    }
-  } else {
-    wStopStatus = PHNFCSTVAL(CID_NFC_OSAL, NFCSTATUS_INVALID_PARAMETER);
-  }
-
-  return wStopStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Delete
-**
-** Description      Deletes previously created timer
-**                  Allows to delete previously created timer. In case timer is
-**                  running, it is first stopped and then deleted
-**
-** Parameters       dwTimerId - valid timer ID obtained during timer creation
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - the operation was successful
-**                  NFCSTATUS_NOT_INITIALISED - OSAL Module is not initialized
-**                  NFCSTATUS_INVALID_PARAMETER - invalid parameter passed to
-**                                                the function
-**                  PH_OSALNFC_TIMER_DELETE_ERROR - timer could not be stopped
-**                                                  due to system error
-**
-*******************************************************************************/
-NFCSTATUS phOsalNfc_Timer_Delete(uint32_t dwTimerId) {
-  NFCSTATUS wDeleteStatus = NFCSTATUS_SUCCESS;
-
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  dwIndex = dwTimerId - PH_NFC_TIMER_BASE_ADDRESS - 0x01;
-  pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-  /* OSAL Module and Timer needs to be initialized for timer usage */
-
-  /* Check whether the TimerId passed by user is valid and Deregistering of
-   * timer is successful */
-  if ((dwIndex < PH_NFC_MAX_TIMER) && (0x00 != pTimerHandle->TimerId) &&
-      (NFCSTATUS_SUCCESS == phOsalNfc_CheckTimerPresence(pTimerHandle))) {
-    /* Cancel the timer before deleting */
-    if (timer_delete(pTimerHandle->hTimerHandle) == -1) {
-      wDeleteStatus = PHNFCSTVAL(CID_NFC_OSAL, PH_OSALNFC_TIMER_DELETE_ERROR);
-    }
-    /* Clear Timer structure used to store timer related data */
-    memset(pTimerHandle, (uint8_t)0x00, sizeof(phOsalNfc_TimerHandle_t));
-  } else {
-    wDeleteStatus = PHNFCSTVAL(CID_NFC_OSAL, NFCSTATUS_INVALID_PARAMETER);
-  }
-  return wDeleteStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Cleanup
-**
-** Description      Deletes all previously created timers
-**                  Allows to delete previously created timers. In case timer is
-**                  running, it is first stopped and then deleted
-**
-** Parameters       None
-**
-** Returns          None
-**
-*******************************************************************************/
-void phOsalNfc_Timer_Cleanup(void) {
-  /* Delete all timers */
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  for (dwIndex = 0; dwIndex < PH_NFC_MAX_TIMER; dwIndex++) {
-    pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-    /* OSAL Module and Timer needs to be initialized for timer usage */
-
-    /* Check whether the TimerId passed by user is valid and Deregistering of
-     * timer is successful */
-    if ((0x00 != pTimerHandle->TimerId) &&
-        (NFCSTATUS_SUCCESS == phOsalNfc_CheckTimerPresence(pTimerHandle))) {
-      /* Cancel the timer before deleting */
-      if (timer_delete(pTimerHandle->hTimerHandle) == -1) {
-        NXPLOG_TML_E("timer %d delete error!", dwIndex);
-      }
-      /* Clear Timer structure used to store timer related data */
-      memset(pTimerHandle, (uint8_t)0x00, sizeof(phOsalNfc_TimerHandle_t));
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_DeferredCall
-**
-** Description      Invokes the timer callback function after timer expiration.
-**                  Shall invoke the callback function registered by the timer
-**                  caller function
-**
-** Parameters       pParams - parameters indicating the ID of the timer
-**
-** Returns          None                -
-**
-*******************************************************************************/
-static void phOsalNfc_DeferredCall(void* pParams) {
-  /* Retrieve the timer id from the parameter */
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-  if (NULL != pParams) {
-    /* Retrieve the index at which the timer handle structure is stored */
-    dwIndex = (uintptr_t)pParams - PH_NFC_TIMER_BASE_ADDRESS - 0x01;
-    pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-    if (pTimerHandle->Application_callback != NULL) {
-      /* Invoke the callback function with osal Timer ID */
-      pTimerHandle->Application_callback((uintptr_t)pParams,
-                                         pTimerHandle->pContext);
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_PostTimerMsg
-**
-** Description      Posts message on the user thread
-**                  Shall be invoked upon expiration of a timer
-**                  Shall post message on user thread through which timer
-**                  callback function shall be invoked
-**
-** Parameters       pMsg - pointer to the message structure posted on user
-**                         thread
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phOsalNfc_PostTimerMsg(phLibNfc_Message_t* pMsg) {
-  (void)phDal4Nfc_msgsnd(
-      nxpncihal_ctrl.gDrvCfg
-          .nClientId /*gpphOsalNfc_Context->dwCallbackThreadID*/,
-      pMsg, 0);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_Timer_Expired
-**
-** Description      posts message upon expiration of timer
-**                  Shall be invoked when any one timer is expired
-**                  Shall post message on user thread to invoke respective
-**                  callback function provided by the caller of Timer function
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phOsalNfc_Timer_Expired(union sigval sv) {
-  uint32_t dwIndex;
-  phOsalNfc_TimerHandle_t* pTimerHandle;
-
-  dwIndex = ((uint32_t)(sv.sival_int)) - PH_NFC_TIMER_BASE_ADDRESS - 0x01;
-  pTimerHandle = (phOsalNfc_TimerHandle_t*)&apTimerInfo[dwIndex];
-  /* Timer is stopped when callback function is invoked */
-  pTimerHandle->eState = eTimerStopped;
-
-  pTimerHandle->tDeferedCallInfo.pDeferedCall = &phOsalNfc_DeferredCall;
-  pTimerHandle->tDeferedCallInfo.pParam = (void*)((intptr_t)(sv.sival_int));
-
-  pTimerHandle->tOsalMessage.eMsgType = PH_LIBNFC_DEFERREDCALL_MSG;
-  pTimerHandle->tOsalMessage.pMsgData = (void*)&pTimerHandle->tDeferedCallInfo;
-
-  /* Post a message on the queue to invoke the function */
-  phOsalNfc_PostTimerMsg((phLibNfc_Message_t*)&pTimerHandle->tOsalMessage);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phUtilNfc_CheckForAvailableTimer
-**
-** Description      Find an available timer id
-**
-** Parameters       void
-**
-** Returns          Available timer id
-**
-*******************************************************************************/
-uint32_t phUtilNfc_CheckForAvailableTimer(void) {
-  /* Variable used to store the index at which the object structure details
-     can be stored. Initialize it as not available. */
-  uint32_t dwIndex = 0x00;
-  uint32_t dwRetval = 0x00;
-
-  /* Check whether Timer object can be created */
-  for (dwIndex = 0x00; ((dwIndex < PH_NFC_MAX_TIMER) && (0x00 == dwRetval));
-       dwIndex++) {
-    if (!(apTimerInfo[dwIndex].TimerId)) {
-      dwRetval = (dwIndex + 0x01);
-    }
-  }
-
-  return (dwRetval);
-}
-
-/*******************************************************************************
-**
-** Function         phOsalNfc_CheckTimerPresence
-**
-** Description      Checks the requested timer is present or not
-**
-** Parameters       pObjectHandle - timer context
-**
-** Returns          NFCSTATUS_SUCCESS if found
-**                  Other value if not found
-**
-*******************************************************************************/
-NFCSTATUS phOsalNfc_CheckTimerPresence(void* pObjectHandle) {
-  uint32_t dwIndex;
-  NFCSTATUS wRegisterStatus = NFCSTATUS_INVALID_PARAMETER;
-
-  for (dwIndex = 0x00;
-       ((dwIndex < PH_NFC_MAX_TIMER) && (wRegisterStatus != NFCSTATUS_SUCCESS));
-       dwIndex++) {
-    /* For Timer, check whether the requested handle is present or not */
-    if (((&apTimerInfo[dwIndex]) == (phOsalNfc_TimerHandle_t*)pObjectHandle) &&
-        (apTimerInfo[dwIndex].TimerId)) {
-      wRegisterStatus = NFCSTATUS_SUCCESS;
-    }
-  }
-  return wRegisterStatus;
-}
diff --git a/halimpl/pn54x/tml/phOsalNfc_Timer.h b/halimpl/pn54x/tml/phOsalNfc_Timer.h
deleted file mode 100644
index 5315455..0000000
--- a/halimpl/pn54x/tml/phOsalNfc_Timer.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * OSAL header files related to Timer functions.
- */
-
-#ifndef PHOSALNFC_TIMER_H
-#define PHOSALNFC_TIMER_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-************************* Include Files ****************************************
-*/
-
-/*
- * Timer callback interface which will be called once registered timer
- * time out expires.
- *        TimerId  - Timer Id for which callback is called.
- *        pContext - Parameter to be passed to the callback function
- */
-typedef void (*pphOsalNfc_TimerCallbck_t)(uint32_t TimerId, void* pContext);
-
-/*
- * The Timer could not be created due to a
- * system error */
-#define PH_OSALNFC_TIMER_CREATE_ERROR (0X00E0)
-
-/*
- * The Timer could not be started due to a
- * system error or invalid handle */
-#define PH_OSALNFC_TIMER_START_ERROR (0X00E1)
-
-/*
- * The Timer could not be stopped due to a
- * system error or invalid handle */
-#define PH_OSALNFC_TIMER_STOP_ERROR (0X00E2)
-
-/*
- * The Timer could not be deleted due to a
- * system error or invalid handle */
-#define PH_OSALNFC_TIMER_DELETE_ERROR (0X00E3)
-
-/*
- * Invalid timer ID type.This ID used indicate timer creation is failed */
-#define PH_OSALNFC_TIMER_ID_INVALID (0xFFFF)
-
-/*
- * OSAL timer message .This message type will be posted to
- * calling application thread.*/
-#define PH_OSALNFC_TIMER_MSG (0x315)
-
-/*
-***************************Globals,Structure and Enumeration ******************
-*/
-
-uint32_t phOsalNfc_Timer_Create(void);
-NFCSTATUS phOsalNfc_Timer_Start(uint32_t dwTimerId, uint32_t dwRegTimeCnt,
-                                pphOsalNfc_TimerCallbck_t pApplication_callback,
-                                void* pContext);
-NFCSTATUS phOsalNfc_Timer_Stop(uint32_t dwTimerId);
-NFCSTATUS phOsalNfc_Timer_Delete(uint32_t dwTimerId);
-void phOsalNfc_Timer_Cleanup(void);
-uint32_t phUtilNfc_CheckForAvailableTimer(void);
-NFCSTATUS phOsalNfc_CheckTimerPresence(void* pObjectHandle);
-
-#ifdef __cplusplus
-}
-#endif /*  C++ Compilation guard */
-#endif /* PHOSALNFC_TIMER_H */
diff --git a/halimpl/pn54x/tml/phTmlNfc.c b/halimpl/pn54x/tml/phTmlNfc.c
deleted file mode 100644
index 8aad810..0000000
--- a/halimpl/pn54x/tml/phTmlNfc.c
+++ /dev/null
@@ -1,949 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * TML Implementation.
- */
-
-#include <phDal4Nfc_messageQueueLib.h>
-#include <phNxpLog.h>
-#include <phNxpNciHal_utils.h>
-#include <phOsalNfc_Timer.h>
-#include <phTmlNfc.h>
-#include <phTmlNfc_i2c.h>
-
-/*
- * Duration of Timer to wait after sending an Nci packet
- */
-#define PHTMLNFC_MAXTIME_RETRANSMIT (200U)
-#define MAX_WRITE_RETRY_COUNT 0x03
-/* Retry Count = Standby Recovery time of NFCC / Retransmission time + 1 */
-static uint8_t bCurrentRetryCount = (2000 / PHTMLNFC_MAXTIME_RETRANSMIT) + 1;
-
-/* Value to reset variables of TML  */
-#define PH_TMLNFC_RESET_VALUE (0x00)
-
-/* Indicates a Initial or offset value */
-#define PH_TMLNFC_VALUE_ONE (0x01)
-
-/* Initialize Context structure pointer used to access context structure */
-phTmlNfc_Context_t* gpphTmlNfc_Context = NULL;
-phTmlNfc_i2cfragmentation_t fragmentation_enabled = I2C_FRAGMENATATION_DISABLED;
-/* Local Function prototypes */
-static NFCSTATUS phTmlNfc_StartThread(void);
-static void phTmlNfc_CleanUp(void);
-static void phTmlNfc_ReadDeferredCb(void* pParams);
-static void phTmlNfc_WriteDeferredCb(void* pParams);
-static void phTmlNfc_TmlThread(void* pParam);
-static void phTmlNfc_TmlWriterThread(void* pParam);
-static void phTmlNfc_ReTxTimerCb(uint32_t dwTimerId, void* pContext);
-static NFCSTATUS phTmlNfc_InitiateTimer(void);
-
-/* Function definitions */
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_Init
-**
-** Description      Provides initialization of TML layer and hardware interface
-**                  Configures given hardware interface and sends handle to the
-**                  caller
-**
-** Parameters       pConfig - TML configuration details as provided by the upper
-**                            layer
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - initialization successful
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_FAILED - initialization failed (for example,
-**                                     unable to open hardware interface)
-**                  NFCSTATUS_INVALID_DEVICE - device has not been opened or has
-**                                             been disconnected
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_Init(pphTmlNfc_Config_t pConfig) {
-  NFCSTATUS wInitStatus = NFCSTATUS_SUCCESS;
-
-  /* Check if TML layer is already Initialized */
-  if (NULL != gpphTmlNfc_Context) {
-    /* TML initialization is already completed */
-    wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_ALREADY_INITIALISED);
-  }
-  /* Validate Input parameters */
-  else if ((NULL == pConfig) ||
-           (PH_TMLNFC_RESET_VALUE == pConfig->dwGetMsgThreadId)) {
-    /*Parameters passed to TML init are wrong */
-    wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_INVALID_PARAMETER);
-  } else {
-    /* Allocate memory for TML context */
-    gpphTmlNfc_Context = malloc(sizeof(phTmlNfc_Context_t));
-
-    if (NULL == gpphTmlNfc_Context) {
-      wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_FAILED);
-    } else {
-      /* Initialise all the internal TML variables */
-      memset(gpphTmlNfc_Context, PH_TMLNFC_RESET_VALUE,
-             sizeof(phTmlNfc_Context_t));
-      /* Make sure that the thread runs once it is created */
-      gpphTmlNfc_Context->bThreadDone = 1;
-
-      /* Open the device file to which data is read/written */
-      wInitStatus = phTmlNfc_i2c_open_and_configure(
-          pConfig, &(gpphTmlNfc_Context->pDevHandle));
-
-      if (NFCSTATUS_SUCCESS != wInitStatus) {
-        wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_INVALID_DEVICE);
-        gpphTmlNfc_Context->pDevHandle = NULL;
-      } else {
-        gpphTmlNfc_Context->tReadInfo.bEnable = 0;
-        gpphTmlNfc_Context->tWriteInfo.bEnable = 0;
-        gpphTmlNfc_Context->tReadInfo.bThreadBusy = false;
-        gpphTmlNfc_Context->tWriteInfo.bThreadBusy = false;
-
-        if (0 != sem_init(&gpphTmlNfc_Context->rxSemaphore, 0, 0)) {
-          wInitStatus = NFCSTATUS_FAILED;
-        } else if (0 != sem_init(&gpphTmlNfc_Context->txSemaphore, 0, 0)) {
-          wInitStatus = NFCSTATUS_FAILED;
-        } else if (0 != sem_init(&gpphTmlNfc_Context->postMsgSemaphore, 0, 0)) {
-          wInitStatus = NFCSTATUS_FAILED;
-        } else {
-          sem_post(&gpphTmlNfc_Context->postMsgSemaphore);
-          /* Start TML thread (to handle write and read operations) */
-          if (NFCSTATUS_SUCCESS != phTmlNfc_StartThread()) {
-            wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_FAILED);
-          } else {
-            /* Create Timer used for Retransmission of NCI packets */
-            gpphTmlNfc_Context->dwTimerId = phOsalNfc_Timer_Create();
-            if (PH_OSALNFC_TIMER_ID_INVALID != gpphTmlNfc_Context->dwTimerId) {
-              /* Store the Thread Identifier to which Message is to be posted */
-              gpphTmlNfc_Context->dwCallbackThreadId =
-                  pConfig->dwGetMsgThreadId;
-              /* Enable retransmission of Nci packet & set retry count to
-               * default */
-              gpphTmlNfc_Context->eConfig = phTmlNfc_e_DisableRetrans;
-              /* Retry Count = Standby Recovery time of NFCC / Retransmission
-               * time + 1 */
-              gpphTmlNfc_Context->bRetryCount =
-                  (2000 / PHTMLNFC_MAXTIME_RETRANSMIT) + 1;
-              gpphTmlNfc_Context->bWriteCbInvoked = false;
-            } else {
-              wInitStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_FAILED);
-            }
-          }
-        }
-      }
-    }
-  }
-  /* Clean up all the TML resources if any error */
-  if (NFCSTATUS_SUCCESS != wInitStatus) {
-    /* Clear all handles and memory locations initialized during init */
-    phTmlNfc_CleanUp();
-  }
-
-  return wInitStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_ConfigNciPktReTx
-**
-** Description      Provides Enable/Disable Retransmission of NCI packets
-**                  Needed in case of Timeout between Transmission and Reception
-**                  of NCI packets. Retransmission can be enabled only if
-**                  standby mode is enabled
-**
-** Parameters       eConfig - values from phTmlNfc_ConfigRetrans_t
-**                  bRetryCount - Number of times Nci packets shall be
-**                                retransmitted (default = 3)
-**
-** Returns          None
-**
-*******************************************************************************/
-void phTmlNfc_ConfigNciPktReTx(phTmlNfc_ConfigRetrans_t eConfiguration,
-                               uint8_t bRetryCounter) {
-  /* Enable/Disable Retransmission */
-
-  gpphTmlNfc_Context->eConfig = eConfiguration;
-  if (phTmlNfc_e_EnableRetrans == eConfiguration) {
-    /* Check whether Retry counter passed is valid */
-    if (0 != bRetryCounter) {
-      gpphTmlNfc_Context->bRetryCount = bRetryCounter;
-    }
-    /* Set retry counter to its default value */
-    else {
-      /* Retry Count = Standby Recovery time of NFCC / Retransmission time + 1
-       */
-      gpphTmlNfc_Context->bRetryCount =
-          (2000 / PHTMLNFC_MAXTIME_RETRANSMIT) + 1;
-    }
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_StartThread
-**
-** Description      Initializes comport, reader and writer threads
-**
-** Parameters       None
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - threads initialized successfully
-**                  NFCSTATUS_FAILED - initialization failed due to system error
-**
-*******************************************************************************/
-static NFCSTATUS phTmlNfc_StartThread(void) {
-  NFCSTATUS wStartStatus = NFCSTATUS_SUCCESS;
-  void* h_threadsEvent = 0x00;
-  uint32_t dwEvent;
-  int pthread_create_status = 0;
-
-  /* Create Reader and Writer threads */
-  pthread_create_status =
-      pthread_create(&gpphTmlNfc_Context->readerThread, NULL,
-                     (void*)&phTmlNfc_TmlThread, (void*)h_threadsEvent);
-  if (0 != pthread_create_status) {
-    wStartStatus = NFCSTATUS_FAILED;
-  } else {
-    /*Start Writer Thread*/
-    pthread_create_status =
-        pthread_create(&gpphTmlNfc_Context->writerThread, NULL,
-                       (void*)&phTmlNfc_TmlWriterThread, (void*)h_threadsEvent);
-    if (0 != pthread_create_status) {
-      wStartStatus = NFCSTATUS_FAILED;
-    }
-  }
-
-  return wStartStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_ReTxTimerCb
-**
-** Description      This is the timer callback function after timer expiration.
-**
-** Parameters       dwThreadId  - id of the thread posting message
-**                  pContext    - context provided by upper layer
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_ReTxTimerCb(uint32_t dwTimerId, void* pContext) {
-  if ((gpphTmlNfc_Context->dwTimerId == dwTimerId) && (NULL == pContext)) {
-    /* If Retry Count has reached its limit,Retransmit Nci
-       packet */
-    if (0 == bCurrentRetryCount) {
-      /* Since the count has reached its limit,return from timer callback
-         Upper layer Timeout would have happened */
-    } else {
-      bCurrentRetryCount--;
-      gpphTmlNfc_Context->tWriteInfo.bThreadBusy = true;
-      gpphTmlNfc_Context->tWriteInfo.bEnable = 1;
-    }
-    sem_post(&gpphTmlNfc_Context->txSemaphore);
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_InitiateTimer
-**
-** Description      Start a timer for Tx and Rx thread.
-**
-** Parameters       void
-**
-** Returns          NFC status
-**
-*******************************************************************************/
-static NFCSTATUS phTmlNfc_InitiateTimer(void) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  /* Start Timer once Nci packet is sent */
-  wStatus = phOsalNfc_Timer_Start(gpphTmlNfc_Context->dwTimerId,
-                                  (uint32_t)PHTMLNFC_MAXTIME_RETRANSMIT,
-                                  phTmlNfc_ReTxTimerCb, NULL);
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_TmlThread
-**
-** Description      Read the data from the lower layer driver
-**
-** Parameters       pParam  - parameters for Writer thread function
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_TmlThread(void* pParam) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  int32_t dwNoBytesWrRd = PH_TMLNFC_RESET_VALUE;
-  uint8_t temp[260];
-  /* Transaction info buffer to be passed to Callback Thread */
-  static phTmlNfc_TransactInfo_t tTransactionInfo;
-  /* Structure containing Tml callback function and parameters to be invoked
-     by the callback thread */
-  static phLibNfc_DeferredCall_t tDeferredInfo;
-  /* Initialize Message structure to post message onto Callback Thread */
-  static phLibNfc_Message_t tMsg;
-  UNUSED(pParam);
-  NXPLOG_TML_D("PN54X - Tml Reader Thread Started................\n");
-
-  /* Writer thread loop shall be running till shutdown is invoked */
-  while (gpphTmlNfc_Context->bThreadDone) {
-    /* If Tml write is requested */
-    /* Set the variable to success initially */
-    wStatus = NFCSTATUS_SUCCESS;
-    sem_wait(&gpphTmlNfc_Context->rxSemaphore);
-
-    /* If Tml read is requested */
-    if (1 == gpphTmlNfc_Context->tReadInfo.bEnable) {
-      NXPLOG_TML_D("PN54X - Read requested.....\n");
-      /* Set the variable to success initially */
-      wStatus = NFCSTATUS_SUCCESS;
-
-      /* Variable to fetch the actual number of bytes read */
-      dwNoBytesWrRd = PH_TMLNFC_RESET_VALUE;
-
-      /* Read the data from the file onto the buffer */
-      if (NULL != gpphTmlNfc_Context->pDevHandle) {
-        NXPLOG_TML_D("PN54X - Invoking I2C Read.....\n");
-        dwNoBytesWrRd =
-            phTmlNfc_i2c_read(gpphTmlNfc_Context->pDevHandle, temp, 260);
-
-        if (-1 == dwNoBytesWrRd) {
-          NXPLOG_TML_E("PN54X - Error in I2C Read.....\n");
-          sem_post(&gpphTmlNfc_Context->rxSemaphore);
-        } else if (dwNoBytesWrRd > 260) {
-          NXPLOG_TML_E("Numer of bytes read exceeds the limit 260.....\n");
-          sem_post(&gpphTmlNfc_Context->rxSemaphore);
-        } else {
-          memcpy(gpphTmlNfc_Context->tReadInfo.pBuffer, temp, dwNoBytesWrRd);
-
-          NXPLOG_TML_D("PN54X - I2C Read successful.....\n");
-          /* This has to be reset only after a successful read */
-          gpphTmlNfc_Context->tReadInfo.bEnable = 0;
-          if ((phTmlNfc_e_EnableRetrans == gpphTmlNfc_Context->eConfig) &&
-              (0x00 != (gpphTmlNfc_Context->tReadInfo.pBuffer[0] & 0xE0))) {
-            NXPLOG_TML_D("PN54X - Retransmission timer stopped.....\n");
-            /* Stop Timer to prevent Retransmission */
-            uint32_t timerStatus =
-                phOsalNfc_Timer_Stop(gpphTmlNfc_Context->dwTimerId);
-            if (NFCSTATUS_SUCCESS != timerStatus) {
-              NXPLOG_TML_E("PN54X - timer stopped returned failure.....\n");
-            } else {
-              gpphTmlNfc_Context->bWriteCbInvoked = false;
-            }
-          }
-          if (gpphTmlNfc_Context->tWriteInfo.bThreadBusy) {
-            NXPLOG_TML_D("Delay Read if write thread is busy");
-            usleep(2000); /*2ms delay to give prio to write complete */
-          }
-          /* Update the actual number of bytes read including header */
-          gpphTmlNfc_Context->tReadInfo.wLength = (uint16_t)(dwNoBytesWrRd);
-          phNxpNciHal_print_packet("RECV",
-                                   gpphTmlNfc_Context->tReadInfo.pBuffer,
-                                   gpphTmlNfc_Context->tReadInfo.wLength);
-
-          dwNoBytesWrRd = PH_TMLNFC_RESET_VALUE;
-
-          /* Fill the Transaction info structure to be passed to Callback
-           * Function */
-          tTransactionInfo.wStatus = wStatus;
-          tTransactionInfo.pBuff = gpphTmlNfc_Context->tReadInfo.pBuffer;
-          /* Actual number of bytes read is filled in the structure */
-          tTransactionInfo.wLength = gpphTmlNfc_Context->tReadInfo.wLength;
-
-          /* Read operation completed successfully. Post a Message onto Callback
-           * Thread*/
-          /* Prepare the message to be posted on User thread */
-          tDeferredInfo.pCallback = &phTmlNfc_ReadDeferredCb;
-          tDeferredInfo.pParameter = &tTransactionInfo;
-          tMsg.eMsgType = PH_LIBNFC_DEFERREDCALL_MSG;
-          tMsg.pMsgData = &tDeferredInfo;
-          tMsg.Size = sizeof(tDeferredInfo);
-          NXPLOG_TML_D("PN54X - Posting read message.....\n");
-          phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &tMsg);
-        }
-      } else {
-        NXPLOG_TML_D("PN54X -gpphTmlNfc_Context->pDevHandle is NULL");
-      }
-    } else {
-      NXPLOG_TML_D("PN54X - read request NOT enabled");
-      usleep(10 * 1000);
-    }
-  } /* End of While loop */
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_TmlWriterThread
-**
-** Description      Writes the requested data onto the lower layer driver
-**
-** Parameters       pParam  - context provided by upper layer
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_TmlWriterThread(void* pParam) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-  int32_t dwNoBytesWrRd = PH_TMLNFC_RESET_VALUE;
-  /* Transaction info buffer to be passed to Callback Thread */
-  static phTmlNfc_TransactInfo_t tTransactionInfo;
-  /* Structure containing Tml callback function and parameters to be invoked
-     by the callback thread */
-  static phLibNfc_DeferredCall_t tDeferredInfo;
-  /* Initialize Message structure to post message onto Callback Thread */
-  static phLibNfc_Message_t tMsg;
-  /* In case of I2C Write Retry */
-  static uint16_t retry_cnt;
-  UNUSED(pParam);
-  NXPLOG_TML_D("PN54X - Tml Writer Thread Started................\n");
-
-  /* Writer thread loop shall be running till shutdown is invoked */
-  while (gpphTmlNfc_Context->bThreadDone) {
-    NXPLOG_TML_D("PN54X - Tml Writer Thread Running................\n");
-    sem_wait(&gpphTmlNfc_Context->txSemaphore);
-    /* If Tml write is requested */
-    if (1 == gpphTmlNfc_Context->tWriteInfo.bEnable) {
-      NXPLOG_TML_D("PN54X - Write requested.....\n");
-      /* Set the variable to success initially */
-      wStatus = NFCSTATUS_SUCCESS;
-      if (NULL != gpphTmlNfc_Context->pDevHandle) {
-      retry:
-        gpphTmlNfc_Context->tWriteInfo.bEnable = 0;
-        /* Variable to fetch the actual number of bytes written */
-        dwNoBytesWrRd = PH_TMLNFC_RESET_VALUE;
-        /* Write the data in the buffer onto the file */
-        NXPLOG_TML_D("PN54X - Invoking I2C Write.....\n");
-        dwNoBytesWrRd =
-            phTmlNfc_i2c_write(gpphTmlNfc_Context->pDevHandle,
-                               gpphTmlNfc_Context->tWriteInfo.pBuffer,
-                               gpphTmlNfc_Context->tWriteInfo.wLength);
-
-        /* Try I2C Write Five Times, if it fails : Raju */
-        if (-1 == dwNoBytesWrRd) {
-          if (getDownloadFlag() == true) {
-            if (retry_cnt++ < MAX_WRITE_RETRY_COUNT) {
-              NXPLOG_NCIHAL_E("PN54X - Error in I2C Write  - Retry 0x%x",
-                              retry_cnt);
-              // Add a 10 ms delay to ensure NFCC is not still in stand by mode.
-              usleep(10 * 1000);
-              goto retry;
-            }
-          }
-          NXPLOG_TML_E("PN54X - Error in I2C Write.....\n");
-          wStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_FAILED);
-        } else {
-          phNxpNciHal_print_packet("SEND",
-                                   gpphTmlNfc_Context->tWriteInfo.pBuffer,
-                                   gpphTmlNfc_Context->tWriteInfo.wLength);
-        }
-        retry_cnt = 0;
-        if (NFCSTATUS_SUCCESS == wStatus) {
-          NXPLOG_TML_D("PN54X - I2C Write successful.....\n");
-          dwNoBytesWrRd = PH_TMLNFC_VALUE_ONE;
-        }
-        /* Fill the Transaction info structure to be passed to Callback Function
-         */
-        tTransactionInfo.wStatus = wStatus;
-        tTransactionInfo.pBuff = gpphTmlNfc_Context->tWriteInfo.pBuffer;
-        /* Actual number of bytes written is filled in the structure */
-        tTransactionInfo.wLength = (uint16_t)dwNoBytesWrRd;
-
-        /* Prepare the message to be posted on the User thread */
-        tDeferredInfo.pCallback = &phTmlNfc_WriteDeferredCb;
-        tDeferredInfo.pParameter = &tTransactionInfo;
-        /* Write operation completed successfully. Post a Message onto Callback
-         * Thread*/
-        tMsg.eMsgType = PH_LIBNFC_DEFERREDCALL_MSG;
-        tMsg.pMsgData = &tDeferredInfo;
-        tMsg.Size = sizeof(tDeferredInfo);
-
-        /* Check whether Retransmission needs to be started,
-         * If yes, Post message only if
-         * case 1. Message is not posted &&
-         * case 11. Write status is success ||
-         * case 12. Last retry of write is also failure
-         */
-        if ((phTmlNfc_e_EnableRetrans == gpphTmlNfc_Context->eConfig) &&
-            (0x00 != (gpphTmlNfc_Context->tWriteInfo.pBuffer[0] & 0xE0))) {
-          if (gpphTmlNfc_Context->bWriteCbInvoked == false) {
-            if ((NFCSTATUS_SUCCESS == wStatus) || (bCurrentRetryCount == 0)) {
-              NXPLOG_TML_D("PN54X - Posting Write message.....\n");
-              phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId,
-                                    &tMsg);
-              gpphTmlNfc_Context->bWriteCbInvoked = true;
-            }
-          }
-        } else {
-          NXPLOG_TML_D("PN54X - Posting Fresh Write message.....\n");
-          phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &tMsg);
-        }
-      } else {
-        NXPLOG_TML_D("PN54X - gpphTmlNfc_Context->pDevHandle is NULL");
-      }
-
-      /* If Data packet is sent, then NO retransmission */
-      if ((phTmlNfc_e_EnableRetrans == gpphTmlNfc_Context->eConfig) &&
-          (0x00 != (gpphTmlNfc_Context->tWriteInfo.pBuffer[0] & 0xE0))) {
-        NXPLOG_TML_D("PN54X - Starting timer for Retransmission case");
-        wStatus = phTmlNfc_InitiateTimer();
-        if (NFCSTATUS_SUCCESS != wStatus) {
-          /* Reset Variables used for Retransmission */
-          NXPLOG_TML_D("PN54X - Retransmission timer initiate failed");
-          gpphTmlNfc_Context->tWriteInfo.bEnable = 0;
-          bCurrentRetryCount = 0;
-        }
-      }
-    } else {
-      NXPLOG_TML_D("PN54X - Write request NOT enabled");
-      usleep(10000);
-    }
-
-  } /* End of While loop */
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_CleanUp
-**
-** Description      Clears all handles opened during TML initialization
-**
-** Parameters       None
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_CleanUp(void) {
-  NFCSTATUS wRetval = NFCSTATUS_SUCCESS;
-
-  if (NULL == gpphTmlNfc_Context) {
-    return;
-  }
-  if (NULL != gpphTmlNfc_Context->pDevHandle) {
-    (void)phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 0);
-    gpphTmlNfc_Context->bThreadDone = 0;
-  }
-  sem_destroy(&gpphTmlNfc_Context->rxSemaphore);
-  sem_destroy(&gpphTmlNfc_Context->txSemaphore);
-  sem_destroy(&gpphTmlNfc_Context->postMsgSemaphore);
-  phTmlNfc_i2c_close(gpphTmlNfc_Context->pDevHandle);
-  gpphTmlNfc_Context->pDevHandle = NULL;
-  /* Clear memory allocated for storing Context variables */
-  free((void*)gpphTmlNfc_Context);
-  /* Set the pointer to NULL to indicate De-Initialization */
-  gpphTmlNfc_Context = NULL;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_Shutdown
-**
-** Description      Uninitializes TML layer and hardware interface
-**
-** Parameters       None
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - TML configuration released successfully
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_FAILED - un-initialization failed (example: unable
-**                                     to close interface)
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_Shutdown(void) {
-  NFCSTATUS wShutdownStatus = NFCSTATUS_SUCCESS;
-
-  /* Check whether TML is Initialized */
-  if (NULL != gpphTmlNfc_Context) {
-    /* Reset thread variable to terminate the thread */
-    gpphTmlNfc_Context->bThreadDone = 0;
-    usleep(1000);
-    /* Clear All the resources allocated during initialization */
-    sem_post(&gpphTmlNfc_Context->rxSemaphore);
-    usleep(1000);
-    sem_post(&gpphTmlNfc_Context->txSemaphore);
-    usleep(1000);
-    sem_post(&gpphTmlNfc_Context->postMsgSemaphore);
-    usleep(1000);
-    sem_post(&gpphTmlNfc_Context->postMsgSemaphore);
-    usleep(1000);
-    if (0 != pthread_join(gpphTmlNfc_Context->readerThread, (void**)NULL)) {
-      NXPLOG_TML_E("Fail to kill reader thread!");
-    }
-    if (0 != pthread_join(gpphTmlNfc_Context->writerThread, (void**)NULL)) {
-      NXPLOG_TML_E("Fail to kill writer thread!");
-    }
-    NXPLOG_TML_D("bThreadDone == 0");
-
-    phTmlNfc_CleanUp();
-  } else {
-    wShutdownStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_NOT_INITIALISED);
-  }
-
-  return wShutdownStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_Write
-**
-** Description      Asynchronously writes given data block to hardware
-**                  interface/driver. Enables writer thread if there are no
-**                  write requests pending. Returns successfully once writer
-**                  thread completes write operation. Notifies upper layer using
-**                  callback mechanism.
-**
-**                  NOTE:
-**                  * it is important to post a message with id
-**                    PH_TMLNFC_WRITE_MESSAGE to IntegrationThread after data
-**                    has been written to PN54X
-**                  * if CRC needs to be computed, then input buffer should be
-**                    capable to store two more bytes apart from length of
-**                    packet
-**
-** Parameters       pBuffer - data to be sent
-**                  wLength - length of data buffer
-**                  pTmlWriteComplete - pointer to the function to be invoked
-**                                      upon completion
-**                  pContext - context provided by upper layer
-**
-** Returns          NFC status:
-**                  NFCSTATUS_PENDING - command is yet to be processed
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_BUSY - write request is already in progress
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_Write(uint8_t* pBuffer, uint16_t wLength,
-                         pphTmlNfc_TransactCompletionCb_t pTmlWriteComplete,
-                         void* pContext) {
-  NFCSTATUS wWriteStatus;
-
-  /* Check whether TML is Initialized */
-
-  if (NULL != gpphTmlNfc_Context) {
-    if ((NULL != gpphTmlNfc_Context->pDevHandle) && (NULL != pBuffer) &&
-        (PH_TMLNFC_RESET_VALUE != wLength) && (NULL != pTmlWriteComplete)) {
-      if (!gpphTmlNfc_Context->tWriteInfo.bThreadBusy) {
-        /* Setting the flag marks beginning of a Write Operation */
-        gpphTmlNfc_Context->tWriteInfo.bThreadBusy = true;
-        /* Copy the buffer, length and Callback function,
-           This shall be utilized while invoking the Callback function in thread
-           */
-        gpphTmlNfc_Context->tWriteInfo.pBuffer = pBuffer;
-        gpphTmlNfc_Context->tWriteInfo.wLength = wLength;
-        gpphTmlNfc_Context->tWriteInfo.pThread_Callback = pTmlWriteComplete;
-        gpphTmlNfc_Context->tWriteInfo.pContext = pContext;
-
-        wWriteStatus = NFCSTATUS_PENDING;
-        // FIXME: If retry is going on. Stop the retry thread/timer
-        if (phTmlNfc_e_EnableRetrans == gpphTmlNfc_Context->eConfig) {
-          /* Set retry count to default value */
-          // FIXME: If the timer expired there, and meanwhile we have created
-          // a new request. The expired timer will think that retry is still
-          // ongoing.
-          bCurrentRetryCount = gpphTmlNfc_Context->bRetryCount;
-          gpphTmlNfc_Context->bWriteCbInvoked = false;
-        }
-        /* Set event to invoke Writer Thread */
-        gpphTmlNfc_Context->tWriteInfo.bEnable = 1;
-        sem_post(&gpphTmlNfc_Context->txSemaphore);
-      } else {
-        wWriteStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_BUSY);
-      }
-    } else {
-      wWriteStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_INVALID_PARAMETER);
-    }
-  } else {
-    wWriteStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_NOT_INITIALISED);
-  }
-
-  return wWriteStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_Read
-**
-** Description      Asynchronously reads data from the driver
-**                  Number of bytes to be read and buffer are passed by upper
-**                  layer.
-**                  Enables reader thread if there are no read requests pending
-**                  Returns successfully once read operation is completed
-**                  Notifies upper layer using callback mechanism
-**
-** Parameters       pBuffer - location to send read data to the upper layer via
-**                            callback
-**                  wLength - length of read data buffer passed by upper layer
-**                  pTmlReadComplete - pointer to the function to be invoked
-**                                     upon completion of read operation
-**                  pContext - context provided by upper layer
-**
-** Returns          NFC status:
-**                  NFCSTATUS_PENDING - command is yet to be processed
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_BUSY - read request is already in progress
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_Read(uint8_t* pBuffer, uint16_t wLength,
-                        pphTmlNfc_TransactCompletionCb_t pTmlReadComplete,
-                        void* pContext) {
-  NFCSTATUS wReadStatus;
-
-  /* Check whether TML is Initialized */
-  if (NULL != gpphTmlNfc_Context) {
-    if ((gpphTmlNfc_Context->pDevHandle != NULL) && (NULL != pBuffer) &&
-        (PH_TMLNFC_RESET_VALUE != wLength) && (NULL != pTmlReadComplete)) {
-      if (!gpphTmlNfc_Context->tReadInfo.bThreadBusy) {
-        /* Setting the flag marks beginning of a Read Operation */
-        gpphTmlNfc_Context->tReadInfo.bThreadBusy = true;
-        /* Copy the buffer, length and Callback function,
-           This shall be utilized while invoking the Callback function in thread
-           */
-        gpphTmlNfc_Context->tReadInfo.pBuffer = pBuffer;
-        gpphTmlNfc_Context->tReadInfo.wLength = wLength;
-        gpphTmlNfc_Context->tReadInfo.pThread_Callback = pTmlReadComplete;
-        gpphTmlNfc_Context->tReadInfo.pContext = pContext;
-        wReadStatus = NFCSTATUS_PENDING;
-
-        /* Set event to invoke Reader Thread */
-        gpphTmlNfc_Context->tReadInfo.bEnable = 1;
-        sem_post(&gpphTmlNfc_Context->rxSemaphore);
-      } else {
-        wReadStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_BUSY);
-      }
-    } else {
-      wReadStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_INVALID_PARAMETER);
-    }
-  } else {
-    wReadStatus = PHNFCSTVAL(CID_NFC_TML, NFCSTATUS_NOT_INITIALISED);
-  }
-
-  return wReadStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_ReadAbort
-**
-** Description      Aborts pending read request (if any)
-**
-** Parameters       None
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - ongoing read operation aborted
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_NOT_INITIALIZED - TML layer is not initialized
-**                  NFCSTATUS_BOARD_COMMUNICATION_ERROR - unable to cancel read
-**                                                        operation
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_ReadAbort(void) {
-  NFCSTATUS wStatus = NFCSTATUS_INVALID_PARAMETER;
-  gpphTmlNfc_Context->tReadInfo.bEnable = 0;
-
-  /*Reset the flag to accept another Read Request */
-  gpphTmlNfc_Context->tReadInfo.bThreadBusy = false;
-  wStatus = NFCSTATUS_SUCCESS;
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_WriteAbort
-**
-** Description      Aborts pending write request (if any)
-**
-** Parameters       None
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - ongoing write operation aborted
-**                  NFCSTATUS_INVALID_PARAMETER - at least one parameter is
-**                                                invalid
-**                  NFCSTATUS_NOT_INITIALIZED - TML layer is not initialized
-**                  NFCSTATUS_BOARD_COMMUNICATION_ERROR - unable to cancel write
-**                                                        operation
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_WriteAbort(void) {
-  NFCSTATUS wStatus = NFCSTATUS_INVALID_PARAMETER;
-
-  gpphTmlNfc_Context->tWriteInfo.bEnable = 0;
-  /* Stop if any retransmission is in progress */
-  bCurrentRetryCount = 0;
-
-  /* Reset the flag to accept another Write Request */
-  gpphTmlNfc_Context->tWriteInfo.bThreadBusy = false;
-  wStatus = NFCSTATUS_SUCCESS;
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_IoCtl
-**
-** Description      Resets device when insisted by upper layer
-**                  Number of bytes to be read and buffer are passed by upper
-**                  layer
-**                  Enables reader thread if there are no read requests pending
-**                  Returns successfully once read operation is completed
-**                  Notifies upper layer using callback mechanism
-**
-** Parameters       eControlCode       - control code for a specific operation
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS  - ioctl command completed successfully
-**                  NFCSTATUS_FAILED   - ioctl command request failed
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_IoCtl(phTmlNfc_ControlCode_t eControlCode) {
-  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
-  if (NULL == gpphTmlNfc_Context) {
-    wStatus = NFCSTATUS_FAILED;
-  } else {
-    switch (eControlCode) {
-      case phTmlNfc_e_ResetDevice: {
-        /*Reset PN54X*/
-        phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 1);
-        usleep(100 * 1000);
-        phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 0);
-        usleep(100 * 1000);
-        phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 1);
-        break;
-      }
-      case phTmlNfc_e_EnableNormalMode: {
-        /*Reset PN54X*/
-        phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 0);
-        usleep(10 * 1000);
-        phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 1);
-        usleep(100 * 1000);
-        break;
-      }
-      case phTmlNfc_e_EnableDownloadMode: {
-        phTmlNfc_ConfigNciPktReTx(phTmlNfc_e_DisableRetrans, 0);
-        (void)phTmlNfc_i2c_reset(gpphTmlNfc_Context->pDevHandle, 2);
-        usleep(100 * 1000);
-        break;
-      }
-      default: {
-        wStatus = NFCSTATUS_INVALID_PARAMETER;
-        break;
-      }
-    }
-  }
-
-  return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_DeferredCall
-**
-** Description      Posts message on upper layer thread
-**                  upon successful read or write operation
-**
-** Parameters       dwThreadId  - id of the thread posting message
-**                  ptWorkerMsg - message to be posted
-**
-** Returns          None
-**
-*******************************************************************************/
-void phTmlNfc_DeferredCall(uintptr_t dwThreadId,
-                           phLibNfc_Message_t* ptWorkerMsg) {
-  intptr_t bPostStatus;
-  UNUSED(dwThreadId);
-  /* Post message on the user thread to invoke the callback function */
-  sem_wait(&gpphTmlNfc_Context->postMsgSemaphore);
-  bPostStatus =
-      phDal4Nfc_msgsnd(gpphTmlNfc_Context->dwCallbackThreadId, ptWorkerMsg, 0);
-  sem_post(&gpphTmlNfc_Context->postMsgSemaphore);
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_ReadDeferredCb
-**
-** Description      Read thread call back function
-**
-** Parameters       pParams - context provided by upper layer
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_ReadDeferredCb(void* pParams) {
-  /* Transaction info buffer to be passed to Callback Function */
-  phTmlNfc_TransactInfo_t* pTransactionInfo = (phTmlNfc_TransactInfo_t*)pParams;
-
-  /* Reset the flag to accept another Read Request */
-  gpphTmlNfc_Context->tReadInfo.bThreadBusy = false;
-  gpphTmlNfc_Context->tReadInfo.pThread_Callback(
-      gpphTmlNfc_Context->tReadInfo.pContext, pTransactionInfo);
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_WriteDeferredCb
-**
-** Description      Write thread call back function
-**
-** Parameters       pParams - context provided by upper layer
-**
-** Returns          None
-**
-*******************************************************************************/
-static void phTmlNfc_WriteDeferredCb(void* pParams) {
-  /* Transaction info buffer to be passed to Callback Function */
-  phTmlNfc_TransactInfo_t* pTransactionInfo = (phTmlNfc_TransactInfo_t*)pParams;
-
-  /* Reset the flag to accept another Write Request */
-  gpphTmlNfc_Context->tWriteInfo.bThreadBusy = false;
-  gpphTmlNfc_Context->tWriteInfo.pThread_Callback(
-      gpphTmlNfc_Context->tWriteInfo.pContext, pTransactionInfo);
-
-  return;
-}
-
-void phTmlNfc_set_fragmentation_enabled(phTmlNfc_i2cfragmentation_t result) {
-  fragmentation_enabled = result;
-}
-
-phTmlNfc_i2cfragmentation_t phTmlNfc_get_fragmentation_enabled() {
-  return fragmentation_enabled;
-}
diff --git a/halimpl/pn54x/tml/phTmlNfc.h b/halimpl/pn54x/tml/phTmlNfc.h
deleted file mode 100644
index 3955354..0000000
--- a/halimpl/pn54x/tml/phTmlNfc.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Transport Mapping Layer header files containing APIs related to initializing,
- * reading
- * and writing data into files provided by the driver interface.
- *
- * API listed here encompasses Transport Mapping Layer interfaces required to be
- * mapped
- * to different Interfaces and Platforms.
- *
- */
-
-#ifndef PHTMLNFC_H
-#define PHTMLNFC_H
-
-#include <phNfcCommon.h>
-
-/*
- * Message posted by Reader thread upon
- * completion of requested operation
- */
-#define PH_TMLNFC_READ_MESSAGE (0xAA)
-
-/*
- * Message posted by Writer thread upon
- * completion of requested operation
- */
-#define PH_TMLNFC_WRITE_MESSAGE (0x55)
-
-/*
- * Value indicates to reset device
- */
-#define PH_TMLNFC_RESETDEVICE (0x00008001)
-
-/*
-***************************Globals,Structure and Enumeration ******************
-*/
-
-/*
- * Transaction (Tx/Rx) completion information structure of TML
- *
- * This structure holds the completion callback information of the
- * transaction passed from the TML layer to the Upper layer
- * along with the completion callback.
- *
- * The value of field wStatus can be interpreted as:
- *
- *     - NFCSTATUS_SUCCESS                    Transaction performed
- * successfully.
- *     - NFCSTATUS_FAILED                     Failed to wait on Read/Write
- * operation.
- *     - NFCSTATUS_INSUFFICIENT_STORAGE       Not enough memory to store data in
- * case of read.
- *     - NFCSTATUS_BOARD_COMMUNICATION_ERROR  Failure to Read/Write from the
- * file or timeout.
- */
-
-typedef struct phTmlNfc_TransactInfo {
-  NFCSTATUS wStatus;       /* Status of the Transaction Completion*/
-  uint8_t* pBuff;          /* Response Data of the Transaction*/
-  uint16_t wLength;        /* Data size of the Transaction*/
-} phTmlNfc_TransactInfo_t; /* Instance of Transaction structure */
-
-/*
- * TML transreceive completion callback to Upper Layer
- *
- * pContext - Context provided by upper layer
- * pInfo    - Transaction info. See phTmlNfc_TransactInfo
- */
-typedef void (*pphTmlNfc_TransactCompletionCb_t)(
-    void* pContext, phTmlNfc_TransactInfo_t* pInfo);
-
-/*
- * TML Deferred callback interface structure invoked by upper layer
- *
- * This could be used for read/write operations
- *
- * dwMsgPostedThread Message source identifier
- * pParams Parameters for the deferred call processing
- */
-typedef void (*pphTmlNfc_DeferFuncPointer_t)(uint32_t dwMsgPostedThread,
-                                             void* pParams);
-
-/*
- * Enum definition contains  supported ioctl control codes.
- *
- * phTmlNfc_IoCtl
- */
-typedef enum {
-  phTmlNfc_e_Invalid = 0,
-  phTmlNfc_e_ResetDevice = PH_TMLNFC_RESETDEVICE, /* Reset the device */
-  phTmlNfc_e_EnableDownloadMode, /* Do the hardware setting to enter into
-                                    download mode */
-  phTmlNfc_e_EnableNormalMode /* Hardware setting for normal mode of operation
-                                 */
-} phTmlNfc_ControlCode_t;     /* Control code for IOCTL call */
-
-/*
- * Enable / Disable Re-Transmission of Packets
- *
- * phTmlNfc_ConfigNciPktReTx
- */
-typedef enum {
-  phTmlNfc_e_EnableRetrans = 0x00, /*Enable retransmission of Nci packet */
-  phTmlNfc_e_DisableRetrans = 0x01 /*Disable retransmission of Nci packet */
-} phTmlNfc_ConfigRetrans_t;        /* Configuration for Retransmission */
-
-/*
- * Structure containing details related to read and write operations
- *
- */
-typedef struct phTmlNfc_ReadWriteInfo {
-  volatile uint8_t bEnable; /*This flag shall decide whether to perform
-                               Write/Read operation */
-  uint8_t
-      bThreadBusy; /*Flag to indicate thread is busy on respective operation */
-  /* Transaction completion Callback function */
-  pphTmlNfc_TransactCompletionCb_t pThread_Callback;
-  void* pContext;        /*Context passed while invocation of operation */
-  uint8_t* pBuffer;      /*Buffer passed while invocation of operation */
-  uint16_t wLength;      /*Length of data read/written */
-  NFCSTATUS wWorkStatus; /*Status of the transaction performed */
-} phTmlNfc_ReadWriteInfo_t;
-
-/*
- *Base Context Structure containing members required for entire session
- */
-typedef struct phTmlNfc_Context {
-  pthread_t readerThread; /*Handle to the thread which handles write and read
-                             operations */
-  pthread_t writerThread;
-  volatile uint8_t
-      bThreadDone; /*Flag to decide whether to run or abort the thread */
-  phTmlNfc_ConfigRetrans_t
-      eConfig;             /*Retransmission of Nci Packet during timeout */
-  uint8_t bRetryCount;     /*Number of times retransmission shall happen */
-  uint8_t bWriteCbInvoked; /* Indicates whether write callback is invoked during
-                              retransmission */
-  uint32_t dwTimerId;      /* Timer used to retransmit nci packet */
-  phTmlNfc_ReadWriteInfo_t tReadInfo;  /*Pointer to Reader Thread Structure */
-  phTmlNfc_ReadWriteInfo_t tWriteInfo; /*Pointer to Writer Thread Structure */
-  void* pDevHandle;                    /* Pointer to Device Handle */
-  uintptr_t dwCallbackThreadId; /* Thread ID to which message to be posted */
-  uint8_t bEnableCrc;           /*Flag to validate/not CRC for input buffer */
-  sem_t rxSemaphore;
-  sem_t txSemaphore;      /* Lock/Aquire txRx Semaphore */
-  sem_t postMsgSemaphore; /* Semaphore to post message atomically by Reader &
-                             writer thread */
-} phTmlNfc_Context_t;
-
-/*
- * TML Configuration exposed to upper layer.
- */
-typedef struct phTmlNfc_Config {
-  /* Port name connected to PN54X
-   *
-   * Platform specific canonical device name to which PN54X is connected.
-   *
-   * e.g. On Linux based systems this would be /dev/PN54X
-   */
-  int8_t* pDevName;
-  /* Callback Thread ID
-   *
-   * This is the thread ID on which the Reader & Writer thread posts message. */
-  uintptr_t dwGetMsgThreadId;
-  /* Communication speed between DH and PN54X
-   *
-   * This is the baudrate of the bus for communication between DH and PN54X */
-  uint32_t dwBaudRate;
-} phTmlNfc_Config_t, *pphTmlNfc_Config_t; /* pointer to phTmlNfc_Config_t */
-
-/*
- * TML Deferred Callback structure used to invoke Upper layer Callback function.
- */
-typedef struct {
-  /* Deferred callback function to be invoked */
-  pphTmlNfc_DeferFuncPointer_t pDef_call;
-  /* Source identifier
-   *
-   * Identifier of the source which posted the message
-   */
-  uint32_t dwMsgPostedThread;
-  /** Actual Message
-   *
-   * This is passed as a parameter passed to the deferred callback function
-   * pDef_call. */
-  void* pParams;
-} phTmlNfc_DeferMsg_t; /* DeferMsg structure passed to User Thread */
-
-typedef enum {
-  I2C_FRAGMENATATION_DISABLED, /*i2c fragmentation_disabled           */
-  I2C_FRAGMENTATION_ENABLED    /*i2c_fragmentation_enabled          */
-} phTmlNfc_i2cfragmentation_t;
-/* Function declarations */
-NFCSTATUS phTmlNfc_Init(pphTmlNfc_Config_t pConfig);
-NFCSTATUS phTmlNfc_Shutdown(void);
-NFCSTATUS phTmlNfc_Write(uint8_t* pBuffer, uint16_t wLength,
-                         pphTmlNfc_TransactCompletionCb_t pTmlWriteComplete,
-                         void* pContext);
-NFCSTATUS phTmlNfc_Read(uint8_t* pBuffer, uint16_t wLength,
-                        pphTmlNfc_TransactCompletionCb_t pTmlReadComplete,
-                        void* pContext);
-NFCSTATUS phTmlNfc_WriteAbort(void);
-NFCSTATUS phTmlNfc_ReadAbort(void);
-NFCSTATUS phTmlNfc_IoCtl(phTmlNfc_ControlCode_t eControlCode);
-void phTmlNfc_DeferredCall(uintptr_t dwThreadId,
-                           phLibNfc_Message_t* ptWorkerMsg);
-void phTmlNfc_ConfigNciPktReTx(phTmlNfc_ConfigRetrans_t eConfig,
-                               uint8_t bRetryCount);
-void phTmlNfc_set_fragmentation_enabled(phTmlNfc_i2cfragmentation_t enable);
-phTmlNfc_i2cfragmentation_t phTmlNfc_get_fragmentation_enabled();
-#endif /*  PHTMLNFC_H  */
diff --git a/halimpl/pn54x/tml/phTmlNfc_i2c.c b/halimpl/pn54x/tml/phTmlNfc_i2c.c
deleted file mode 100644
index 781f19b..0000000
--- a/halimpl/pn54x/tml/phTmlNfc_i2c.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * DAL I2C port implementation for linux
- *
- * Project: Trusted NFC Linux
- *
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <hardware/nfc.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include <phNfcStatus.h>
-#include <phNxpLog.h>
-#include <phTmlNfc_i2c.h>
-#include <string.h>
-#include "phNxpNciHal_utils.h"
-
-#define CRC_LEN 2
-#define NORMAL_MODE_HEADER_LEN 3
-#define FW_DNLD_HEADER_LEN 2
-#define FW_DNLD_LEN_OFFSET 1
-#define NORMAL_MODE_LEN_OFFSET 2
-#define FRAGMENTSIZE_MAX PHNFC_I2C_FRAGMENT_SIZE
-static bool_t bFwDnldFlag = false;
-extern phTmlNfc_i2cfragmentation_t fragmentation_enabled;
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_i2c_close
-**
-** Description      Closes PN54X device
-**
-** Parameters       pDevHandle - device handle
-**
-** Returns          None
-**
-*******************************************************************************/
-void phTmlNfc_i2c_close(void* pDevHandle) {
-  if (NULL != pDevHandle) {
-    close((intptr_t)pDevHandle);
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_i2c_open_and_configure
-**
-** Description      Open and configure PN54X device
-**
-** Parameters       pConfig     - hardware information
-**                  pLinkHandle - device handle
-**
-** Returns          NFC status:
-**                  NFCSTATUS_SUCCESS - open_and_configure operation success
-**                  NFCSTATUS_INVALID_DEVICE - device open operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_i2c_open_and_configure(pphTmlNfc_Config_t pConfig,
-                                          void** pLinkHandle) {
-  int nHandle;
-
-  NXPLOG_TML_D("Opening port=%s\n", pConfig->pDevName);
-  /* open port */
-  nHandle = open((const char*)pConfig->pDevName, O_RDWR);
-  if (nHandle < 0) {
-    NXPLOG_TML_E("_i2c_open() Failed: retval %x", nHandle);
-    *pLinkHandle = NULL;
-    return NFCSTATUS_INVALID_DEVICE;
-  }
-
-  *pLinkHandle = (void*)((intptr_t)nHandle);
-
-  /*Reset PN54X*/
-  phTmlNfc_i2c_reset((void*)((intptr_t)nHandle), 0);
-  usleep(10 * 1000);
-  phTmlNfc_i2c_reset((void*)((intptr_t)nHandle), 1);
-
-  return NFCSTATUS_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_i2c_read
-**
-** Description      Reads requested number of bytes from PN54X device into given
-**                  buffer
-**
-** Parameters       pDevHandle       - valid device handle
-**                  pBuffer          - buffer for read data
-**                  nNbBytesToRead   - number of bytes requested to be read
-**
-** Returns          numRead   - number of successfully read bytes
-**                  -1        - read operation failure
-**
-*******************************************************************************/
-int phTmlNfc_i2c_read(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToRead) {
-  int ret_Read;
-  int ret_Select;
-  int numRead = 0;
-  struct timeval tv;
-  fd_set rfds;
-  uint16_t totalBtyesToRead = 0;
-
-  int i;
-  UNUSED(nNbBytesToRead);
-  if (NULL == pDevHandle) {
-    return -1;
-  }
-
-  if (bFwDnldFlag == false) {
-    totalBtyesToRead = NORMAL_MODE_HEADER_LEN;
-  } else {
-    totalBtyesToRead = FW_DNLD_HEADER_LEN;
-  }
-
-  /* Read with 2 second timeout, so that the read thread can be aborted
-     when the PN54X does not respond and we need to switch to FW download
-     mode. This should be done via a control socket instead. */
-  FD_ZERO(&rfds);
-  FD_SET((intptr_t)pDevHandle, &rfds);
-  tv.tv_sec = 2;
-  tv.tv_usec = 1;
-
-  ret_Select =
-      select((int)((intptr_t)pDevHandle + (int)1), &rfds, NULL, NULL, &tv);
-  if (ret_Select < 0) {
-    NXPLOG_TML_E("i2c select() errno : %x", errno);
-    return -1;
-  } else if (ret_Select == 0) {
-    NXPLOG_TML_E("i2c select() Timeout");
-    return -1;
-  } else {
-    ret_Read = read((intptr_t)pDevHandle, pBuffer, totalBtyesToRead - numRead);
-    if (ret_Read > 0) {
-      numRead += ret_Read;
-    } else if (ret_Read == 0) {
-      NXPLOG_TML_E("_i2c_read() [hdr]EOF");
-      return -1;
-    } else {
-      NXPLOG_TML_E("_i2c_read() [hdr] errno : %x", errno);
-      return -1;
-    }
-
-    if (bFwDnldFlag == false) {
-      totalBtyesToRead = NORMAL_MODE_HEADER_LEN;
-    } else {
-      totalBtyesToRead = FW_DNLD_HEADER_LEN;
-    }
-
-    if (numRead < totalBtyesToRead) {
-      ret_Read =
-          read((intptr_t)pDevHandle, pBuffer, totalBtyesToRead - numRead);
-      if (ret_Read != totalBtyesToRead - numRead) {
-        NXPLOG_TML_E("_i2c_read() [hdr] errno : %x", errno);
-        return -1;
-      } else {
-        numRead += ret_Read;
-      }
-    }
-    if (bFwDnldFlag == true) {
-      totalBtyesToRead =
-          pBuffer[FW_DNLD_LEN_OFFSET] + FW_DNLD_HEADER_LEN + CRC_LEN;
-    } else {
-      totalBtyesToRead =
-          pBuffer[NORMAL_MODE_LEN_OFFSET] + NORMAL_MODE_HEADER_LEN;
-    }
-    if ((totalBtyesToRead - numRead) != 0) {
-      ret_Read = read((intptr_t)pDevHandle, (pBuffer + numRead),
-                      totalBtyesToRead - numRead);
-      if (ret_Read > 0) {
-        numRead += ret_Read;
-      } else if (ret_Read == 0) {
-        NXPLOG_TML_E("_i2c_read() [pyld] EOF");
-        return -1;
-      } else {
-        if (bFwDnldFlag == false) {
-          NXPLOG_TML_E("_i2c_read() [hdr] received");
-          phNxpNciHal_print_packet("RECV", pBuffer, NORMAL_MODE_HEADER_LEN);
-        }
-        NXPLOG_TML_E("_i2c_read() [pyld] errno : %x", errno);
-        return -1;
-      }
-    } else {
-      NXPLOG_TML_E("_>>>>> Empty packet recieved !!");
-    }
-  }
-  return numRead;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_i2c_write
-**
-** Description      Writes requested number of bytes from given buffer into
-**                  PN54X device
-**
-** Parameters       pDevHandle       - valid device handle
-**                  pBuffer          - buffer for read data
-**                  nNbBytesToWrite  - number of bytes requested to be written
-**
-** Returns          numWrote   - number of successfully written bytes
-**                  -1         - write operation failure
-**
-*******************************************************************************/
-int phTmlNfc_i2c_write(void* pDevHandle, uint8_t* pBuffer,
-                       int nNbBytesToWrite) {
-  int ret;
-  int numWrote = 0;
-  int i;
-  int numBytes = nNbBytesToWrite;
-  if (NULL == pDevHandle) {
-    return -1;
-  }
-  if (fragmentation_enabled == I2C_FRAGMENATATION_DISABLED &&
-      nNbBytesToWrite > FRAGMENTSIZE_MAX) {
-    NXPLOG_TML_E(
-        "i2c_write() data larger than maximum I2C  size,enable I2C "
-        "fragmentation");
-    return -1;
-  }
-  while (numWrote < nNbBytesToWrite) {
-    if (fragmentation_enabled == I2C_FRAGMENTATION_ENABLED &&
-        nNbBytesToWrite > FRAGMENTSIZE_MAX) {
-      if (nNbBytesToWrite - numWrote > FRAGMENTSIZE_MAX) {
-        numBytes = numWrote + FRAGMENTSIZE_MAX;
-      } else {
-        numBytes = nNbBytesToWrite;
-      }
-    }
-    ret = write((intptr_t)pDevHandle, pBuffer + numWrote, numBytes - numWrote);
-    if (ret > 0) {
-      numWrote += ret;
-      if (fragmentation_enabled == I2C_FRAGMENTATION_ENABLED &&
-          numWrote < nNbBytesToWrite) {
-        usleep(500);
-      }
-    } else if (ret == 0) {
-      NXPLOG_TML_E("_i2c_write() EOF");
-      return -1;
-    } else {
-      NXPLOG_TML_E("_i2c_write() errno : %x", errno);
-      if (errno == EINTR || errno == EAGAIN) {
-        continue;
-      }
-      return -1;
-    }
-  }
-
-  return numWrote;
-}
-
-/*******************************************************************************
-**
-** Function         phTmlNfc_i2c_reset
-**
-** Description      Reset PN54X device, using VEN pin
-**
-** Parameters       pDevHandle     - valid device handle
-**                  level          - reset level
-**
-** Returns           0   - reset operation success
-**                  -1   - reset operation failure
-**
-*******************************************************************************/
-#define PN544_SET_PWR _IOW(0xe9, 0x01, unsigned int)
-int phTmlNfc_i2c_reset(void* pDevHandle, long level) {
-  int ret;
-  NXPLOG_TML_D("phTmlNfc_i2c_reset(), VEN level %ld", level);
-
-  if (NULL == pDevHandle) {
-    return -1;
-  }
-
-  ret = ioctl((intptr_t)pDevHandle, PN544_SET_PWR, level);
-  if (level == 2 && ret == 0) {
-    bFwDnldFlag = true;
-  } else {
-    bFwDnldFlag = false;
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function         getDownloadFlag
-**
-** Description      Returns the current mode
-**
-** Parameters       none
-**
-** Returns           Current mode download/NCI
-*******************************************************************************/
-bool_t getDownloadFlag(void) { return bFwDnldFlag; }
diff --git a/halimpl/pn54x/tml/phTmlNfc_i2c.h b/halimpl/pn54x/tml/phTmlNfc_i2c.h
deleted file mode 100644
index 0949a72..0000000
--- a/halimpl/pn54x/tml/phTmlNfc_i2c.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * TML I2C port implementation for linux
- */
-
-/* Basic type definitions */
-#include <phNfcTypes.h>
-#include <phTmlNfc.h>
-
-/* Function declarations */
-void phTmlNfc_i2c_close(void* pDevHandle);
-NFCSTATUS phTmlNfc_i2c_open_and_configure(pphTmlNfc_Config_t pConfig,
-                                          void** pLinkHandle);
-int phTmlNfc_i2c_read(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToRead);
-int phTmlNfc_i2c_write(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToWrite);
-int phTmlNfc_i2c_reset(void* pDevHandle, long level);
-bool_t getDownloadFlag(void);
diff --git a/halimpl/pn54x/utils/phNxpConfig.cpp b/halimpl/pn54x/utils/phNxpConfig.cpp
deleted file mode 100644
index 9e8c7cb..0000000
--- a/halimpl/pn54x/utils/phNxpConfig.cpp
+++ /dev/null
@@ -1,865 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  The original Work has been changed by NXP Semiconductors.
- *
- *  Copyright (C) 2013-2014 NXP Semiconductors
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#include <stdio.h>
-#include <sys/stat.h>
-#include <list>
-#include <string>
-#include <vector>
-
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include "sparse_crc32.h"
-
-#if GENERIC_TARGET
-const char alternative_config_path[] = "/data/vendor/nfc/";
-#else
-const char alternative_config_path[] = "";
-#endif
-
-#if 1
-const char* transport_config_paths[] = {"/odm/etc/", "/vendor/etc/", "/etc/"};
-#else
-const char* transport_config_paths[] = {"res/"};
-#endif
-const int transport_config_path_size =
-    (sizeof(transport_config_paths) / sizeof(transport_config_paths[0]));
-
-#define config_name "libnfc-nxp.conf"
-#define extra_config_base "libnfc-nxp-"
-#define extra_config_ext ".conf"
-#define IsStringValue 0x80000000
-
-const char config_timestamp_path[] =
-    "/data/vendor/nfc/libnfc-nxpConfigState.bin";
-
-namespace {
-
-size_t readConfigFile(const char* fileName, uint8_t** p_data) {
-  FILE* fd = fopen(fileName, "rb");
-  if (fd == nullptr) return 0;
-
-  fseek(fd, 0L, SEEK_END);
-  const size_t file_size = ftell(fd);
-  rewind(fd);
-
-  uint8_t* buffer = new uint8_t[file_size];
-  size_t read = fread(buffer, file_size, 1, fd);
-  fclose(fd);
-
-  if (read == 1) {
-    *p_data = buffer;
-    return file_size;
-  }
-
-  return 0;
-}
-
-}  // namespace
-
-using namespace ::std;
-
-class CNfcParam : public string {
- public:
-  CNfcParam();
-  CNfcParam(const char* name, const string& value);
-  CNfcParam(const char* name, unsigned long value);
-  virtual ~CNfcParam();
-  unsigned long numValue() const { return m_numValue; }
-  const char* str_value() const { return m_str_value.c_str(); }
-  size_t str_len() const { return m_str_value.length(); }
-
- private:
-  string m_str_value;
-  unsigned long m_numValue;
-};
-
-class CNfcConfig : public vector<const CNfcParam*> {
- public:
-  virtual ~CNfcConfig();
-  static CNfcConfig& GetInstance();
-  friend void readOptionalConfig(const char* optional);
-  bool isModified();
-  void resetModified();
-
-  bool getValue(const char* name, char* pValue, size_t len) const;
-  bool getValue(const char* name, unsigned long& rValue) const;
-  bool getValue(const char* name, unsigned short& rValue) const;
-  bool getValue(const char* name, char* pValue, long len, long* readlen) const;
-  const CNfcParam* find(const char* p_name) const;
-  void clean();
-
- private:
-  CNfcConfig();
-  bool readConfig(const char* name, bool bResetContent);
-  void moveFromList();
-  void moveToList();
-  void add(const CNfcParam* pParam);
-  list<const CNfcParam*> m_list;
-  bool mValidFile;
-  uint32_t config_crc32_;
-
-  unsigned long state;
-
-  inline bool Is(unsigned long f) { return (state & f) == f; }
-  inline void Set(unsigned long f) { state |= f; }
-  inline void Reset(unsigned long f) { state &= ~f; }
-};
-
-/*******************************************************************************
-**
-** Function:    isPrintable()
-**
-** Description: determine if 'c' is printable
-**
-** Returns:     1, if printable, otherwise 0
-**
-*******************************************************************************/
-inline bool isPrintable(char c) {
-  return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-         (c >= '0' && c <= '9') || c == '/' || c == '_' || c == '-' || c == '.';
-}
-
-/*******************************************************************************
-**
-** Function:    isDigit()
-**
-** Description: determine if 'c' is numeral digit
-**
-** Returns:     true, if numerical digit
-**
-*******************************************************************************/
-inline bool isDigit(char c, int base) {
-  if ('0' <= c && c <= '9') return true;
-  if (base == 16) {
-    if (('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    getDigitValue()
-**
-** Description: return numerical value of a decimal or hex char
-**
-** Returns:     numerical value if decimal or hex char, otherwise 0
-**
-*******************************************************************************/
-inline int getDigitValue(char c, int base) {
-  if ('0' <= c && c <= '9') return c - '0';
-  if (base == 16) {
-    if ('A' <= c && c <= 'F')
-      return c - 'A' + 10;
-    else if ('a' <= c && c <= 'f')
-      return c - 'a' + 10;
-  }
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function:    findConfigFilePathFromTransportConfigPaths()
-**
-** Description: find a config file path with a given config name from transport
-**              config paths
-**
-** Returns:     none
-**
-*******************************************************************************/
-void findConfigFilePathFromTransportConfigPaths(const string& configName,
-                                                string& filePath) {
-  for (int i = 0; i < transport_config_path_size - 1; i++) {
-    filePath.assign(transport_config_paths[i]);
-    filePath += configName;
-    struct stat file_stat;
-    if (stat(filePath.c_str(), &file_stat) == 0 && S_ISREG(file_stat.st_mode)) {
-      return;
-    }
-  }
-  filePath.assign(transport_config_paths[transport_config_path_size - 1]);
-  filePath += configName;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::readConfig()
-**
-** Description: read Config settings and parse them into a linked list
-**              move the element from linked list to a array at the end
-**
-** Returns:     1, if there are any config data, 0 otherwise
-**
-*******************************************************************************/
-bool CNfcConfig::readConfig(const char* name, bool bResetContent) {
-  enum {
-    BEGIN_LINE = 1,
-    TOKEN,
-    STR_VALUE,
-    NUM_VALUE,
-    BEGIN_HEX,
-    BEGIN_QUOTE,
-    END_LINE
-  };
-
-  uint8_t* p_config = nullptr;
-  size_t config_size = readConfigFile(name, &p_config);
-  if (p_config == nullptr) {
-    ALOGE("%s Cannot open config file %s\n", __func__, name);
-    if (bResetContent) {
-      ALOGE("%s Using default value for all settings\n", __func__);
-      mValidFile = false;
-    }
-    return false;
-  }
-
-  string token;
-  string strValue;
-  unsigned long numValue = 0;
-  CNfcParam* pParam = NULL;
-  int i = 0;
-  int base = 0;
-  char c;
-  int bflag = 0;
-  state = BEGIN_LINE;
-
-  config_crc32_ = sparse_crc32(0, p_config, config_size);
-  mValidFile = true;
-  if (size() > 0) {
-    if (bResetContent)
-      clean();
-    else
-      moveToList();
-  }
-
-  for (size_t offset = 0; offset != config_size; ++offset) {
-    c = p_config[offset];
-    switch (state & 0xff) {
-      case BEGIN_LINE:
-        if (c == '#')
-          state = END_LINE;
-        else if (isPrintable(c)) {
-          i = 0;
-          token.erase();
-          strValue.erase();
-          state = TOKEN;
-          token.push_back(c);
-        }
-        break;
-      case TOKEN:
-        if (c == '=') {
-          token.push_back('\0');
-          state = BEGIN_QUOTE;
-        } else if (isPrintable(c))
-          token.push_back(c);
-        else
-          state = END_LINE;
-        break;
-      case BEGIN_QUOTE:
-        if (c == '"') {
-          state = STR_VALUE;
-          base = 0;
-        } else if (c == '0')
-          state = BEGIN_HEX;
-        else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          i = 0;
-        } else if (c == '{') {
-          state = NUM_VALUE;
-          bflag = 1;
-          base = 16;
-          i = 0;
-          Set(IsStringValue);
-        } else
-          state = END_LINE;
-        break;
-      case BEGIN_HEX:
-        if (c == 'x' || c == 'X') {
-          state = NUM_VALUE;
-          base = 16;
-          numValue = 0;
-          i = 0;
-          break;
-        } else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          break;
-        } else if (c != '\n' && c != '\r') {
-          state = END_LINE;
-          break;
-        }
-      // fall through to numValue to handle numValue
-
-      case NUM_VALUE:
-        if (isDigit(c, base)) {
-          numValue *= base;
-          numValue += getDigitValue(c, base);
-          ++i;
-        } else if (bflag == 1 &&
-                   (c == ' ' || c == '\r' || c == '\n' || c == '\t')) {
-          break;
-        } else if (base == 16 &&
-                   (c == ',' || c == ':' || c == '-' || c == ' ' || c == '}')) {
-          if (c == '}') {
-            bflag = 0;
-          }
-          if (i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) {
-              numValue = numValue >> (n * 8);
-              unsigned char c = (numValue)&0xFF;
-              strValue.push_back(c);
-            }
-          }
-
-          Set(IsStringValue);
-          numValue = 0;
-          i = 0;
-        } else {
-          if (c == '\n' || c == '\r') {
-            if (bflag == 0) {
-              state = BEGIN_LINE;
-            }
-          } else {
-            if (bflag == 0) {
-              state = END_LINE;
-            }
-          }
-          if (Is(IsStringValue) && base == 16 && i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) strValue.push_back(((numValue >> (n * 8)) & 0xFF));
-          }
-          if (strValue.length() > 0)
-            pParam = new CNfcParam(token.c_str(), strValue);
-          else
-            pParam = new CNfcParam(token.c_str(), numValue);
-          add(pParam);
-          strValue.erase();
-          numValue = 0;
-        }
-        break;
-      case STR_VALUE:
-        if (c == '"') {
-          strValue.push_back('\0');
-          state = END_LINE;
-          pParam = new CNfcParam(token.c_str(), strValue);
-          add(pParam);
-        } else if (isPrintable(c))
-          strValue.push_back(c);
-        break;
-      case END_LINE:
-        if (c == '\n' || c == '\r') state = BEGIN_LINE;
-        break;
-      default:
-        break;
-    }
-  }
-
-  delete[] p_config;
-
-  moveFromList();
-  return size() > 0;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::CNfcConfig()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::CNfcConfig() : mValidFile(true), state(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::~CNfcConfig()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::~CNfcConfig() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::GetInstance()
-**
-** Description: get class singleton object
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig& CNfcConfig::GetInstance() {
-  static CNfcConfig theInstance;
-
-  if (theInstance.size() == 0 && theInstance.mValidFile) {
-    string strPath;
-    if (alternative_config_path[0] != '\0') {
-      strPath.assign(alternative_config_path);
-      strPath += config_name;
-      theInstance.readConfig(strPath.c_str(), true);
-      if (!theInstance.empty()) {
-        return theInstance;
-      }
-    }
-    findConfigFilePathFromTransportConfigPaths(config_name, strPath);
-    theInstance.readConfig(strPath.c_str(), true);
-  }
-
-  return theInstance;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a string value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, char* pValue, size_t len) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() > 0) {
-    memset(pValue, 0, len);
-    memcpy(pValue, pParam->str_value(), pParam->str_len());
-    return true;
-  }
-  return false;
-}
-
-bool CNfcConfig::getValue(const char* name, char* pValue, long len,
-                          long* readlen) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() > 0) {
-    if (pParam->str_len() <= (unsigned long)len) {
-      memset(pValue, 0, len);
-      memcpy(pValue, pParam->str_value(), pParam->str_len());
-      *readlen = pParam->str_len();
-    } else {
-      *readlen = -1;
-    }
-
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a long numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned long& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned long>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a short numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned short& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned short>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::find()
-**
-** Description: search if a setting exist in the setting array
-**
-** Returns:     pointer to the setting object
-**
-*******************************************************************************/
-const CNfcParam* CNfcConfig::find(const char* p_name) const {
-  if (size() == 0) return NULL;
-
-  for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it) {
-    if (**it < p_name) {
-      continue;
-    } else if (**it == p_name) {
-      if ((*it)->str_len() > 0) {
-        NXPLOG_EXTNS_D("%s found %s=%s\n", __func__, p_name,
-                       (*it)->str_value());
-      } else {
-        NXPLOG_EXTNS_D("%s found %s=(0x%lx)\n", __func__, p_name,
-                       (*it)->numValue());
-      }
-      return *it;
-    } else
-      break;
-  }
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::clean()
-**
-** Description: reset the setting array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::clean() {
-  if (size() == 0) return;
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it) delete *it;
-  clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::Add()
-**
-** Description: add a setting object to the list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::add(const CNfcParam* pParam) {
-  if (m_list.size() == 0) {
-    m_list.push_back(pParam);
-    return;
-  }
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it) {
-    if (**it < pParam->c_str()) continue;
-    m_list.insert(it, pParam);
-    return;
-  }
-  m_list.push_back(pParam);
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveFromList()
-**
-** Description: move the setting object from list to array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveFromList() {
-  if (m_list.size() == 0) return;
-
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it)
-    push_back(*it);
-  m_list.clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveToList()
-**
-** Description: move the setting object from array to list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveToList() {
-  if (m_list.size() != 0) m_list.clear();
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
-    m_list.push_back(*it);
-  clear();
-}
-
-bool CNfcConfig::isModified() {
-  FILE* fd = fopen(config_timestamp_path, "r+");
-  if (fd == nullptr) {
-    ALOGE("%s Unable to open file '%s' - assuming modified", __func__,
-          config_timestamp_path);
-    return true;
-  }
-
-  uint32_t stored_crc32 = 0;
-  fread(&stored_crc32, sizeof(uint32_t), 1, fd);
-  fclose(fd);
-
-  return stored_crc32 != config_crc32_;
-}
-
-void CNfcConfig::resetModified() {
-  FILE* fd = fopen(config_timestamp_path, "w+");
-  if (fd == nullptr) {
-    ALOGE("%s Unable to open file '%s' for writing", __func__,
-          config_timestamp_path);
-    return;
-  }
-
-  fwrite(&config_crc32_, sizeof(uint32_t), 1, fd);
-  fclose(fd);
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam() : m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::~CNfcParam()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::~CNfcParam() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, const string& value)
-    : string(name), m_str_value(value), m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, unsigned long value)
-    : string(name), m_numValue(value) {}
-
-/*******************************************************************************
-**
-** Function:    GetStrValue
-**
-** Description: API function for getting a string value of a setting
-**
-** Returns:     True if found, otherwise False.
-**
-*******************************************************************************/
-extern "C" int GetNxpStrValue(const char* name, char* pValue,
-                              unsigned long len) {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  return rConfig.getValue(name, pValue, len);
-}
-
-/*******************************************************************************
-**
-** Function:    GetByteArrayValue()
-**
-** Description: Read byte array value from the config file.
-**
-** Parameters:
-**              name - name of the config param to read.
-**              pValue  - pointer to input buffer.
-**              bufflen - input buffer length.
-**              len - out parameter to return the number of bytes read from
-**                    config file, return -1 in case bufflen is not enough.
-**
-** Returns:     TRUE[1] if config param name is found in the config file, else
-**              FALSE[0]
-**
-*******************************************************************************/
-extern "C" int GetNxpByteArrayValue(const char* name, char* pValue,
-                                    long bufflen, long* len) {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  return rConfig.getValue(name, pValue, bufflen, len);
-}
-
-/*******************************************************************************
-**
-** Function:    GetNumValue
-**
-** Description: API function for getting a numerical value of a setting
-**
-** Returns:     true, if successful
-**
-*******************************************************************************/
-extern "C" int GetNxpNumValue(const char* name, void* pValue,
-                              unsigned long len) {
-  if (!pValue) return false;
-
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-  const CNfcParam* pParam = rConfig.find(name);
-
-  if (pParam == NULL) return false;
-  unsigned long v = pParam->numValue();
-  if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4) {
-    const unsigned char* p = (const unsigned char*)pParam->str_value();
-    for (unsigned int i = 0; i < pParam->str_len(); ++i) {
-      v *= 256;
-      v += *p++;
-    }
-  }
-  switch (len) {
-    case sizeof(unsigned long):
-      *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
-      break;
-    case sizeof(unsigned short):
-      *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
-      break;
-    case sizeof(unsigned char):
-      *(static_cast<unsigned char*>(pValue)) = (unsigned char)v;
-      break;
-    default:
-      return false;
-  }
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function:    resetConfig
-**
-** Description: reset settings array
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern "C" void resetNxpConfig()
-
-{
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  rConfig.clean();
-}
-
-/*******************************************************************************
-**
-** Function:    readOptionalConfig()
-**
-** Description: read Config settings from an optional conf file
-**
-** Returns:     none
-**
-*******************************************************************************/
-void readOptionalConfig(const char* extra) {
-  string strPath;
-  string configName(extra_config_base);
-  configName += extra;
-  configName += extra_config_ext;
-
-  if (alternative_config_path[0] != '\0') {
-    strPath.assign(alternative_config_path);
-    strPath += configName;
-  } else {
-    findConfigFilePathFromTransportConfigPaths(configName, strPath);
-  }
-
-  CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
-}
-
-/*******************************************************************************
-**
-** Function:    isNxpConfigModified()
-**
-** Description: check if config file has modified
-**
-** Returns:     0 if not modified, 1 otherwise.
-**
-*******************************************************************************/
-extern "C" int isNxpConfigModified() {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-  return rConfig.isModified();
-}
-
-/*******************************************************************************
-**
-** Function:    updateNxpConfigTimestamp()
-**
-** Description: update if config file has modified
-**
-** Returns:     0 if not modified, 1 otherwise.
-**
-*******************************************************************************/
-extern "C" int updateNxpConfigTimestamp() {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-  rConfig.resetModified();
-  return 0;
-}
diff --git a/halimpl/pn54x/utils/phNxpConfig.h b/halimpl/pn54x/utils/phNxpConfig.h
deleted file mode 100644
index 9488ecc..0000000
--- a/halimpl/pn54x/utils/phNxpConfig.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  The original Work has been changed by NXP Semiconductors.
- *
- *  Copyright (C) 2013-2014 NXP Semiconductors
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int GetNxpStrValue(const char* name, char* p_value, unsigned long len);
-int GetNxpNumValue(const char* name, void* p_value, unsigned long len);
-int GetNxpByteArrayValue(const char* name, char* pValue, long bufflen,
-                         long* len);
-void resetNxpConfig(void);
-int isNxpConfigModified();
-int updateNxpConfigTimestamp();
-
-#ifdef __cplusplus
-};
-#endif
-
-#define NAME_NXPLOG_EXTNS_LOGLEVEL "NXPLOG_EXTNS_LOGLEVEL"
-#define NAME_NXPLOG_NCIHAL_LOGLEVEL "NXPLOG_NCIHAL_LOGLEVEL"
-#define NAME_NXPLOG_NCIX_LOGLEVEL "NXPLOG_NCIX_LOGLEVEL"
-#define NAME_NXPLOG_NCIR_LOGLEVEL "NXPLOG_NCIR_LOGLEVEL"
-#define NAME_NXPLOG_FWDNLD_LOGLEVEL "NXPLOG_FWDNLD_LOGLEVEL"
-#define NAME_NXPLOG_TML_LOGLEVEL "NXPLOG_TML_LOGLEVEL"
-
-#define NAME_MIFARE_READER_ENABLE "MIFARE_READER_ENABLE"
-#define NAME_FW_STORAGE "FW_STORAGE"
-#define NAME_NXP_NFC_DEV_NODE "NXP_NFC_DEV_NODE"
-#define NAME_NXP_FW_NAME "NXP_FW_NAME"
-#define NAME_NXP_FW_PROTECION_OVERRIDE "NXP_FW_PROTECION_OVERRIDE"
-#define NAME_NXP_SYS_CLK_SRC_SEL "NXP_SYS_CLK_SRC_SEL"
-#define NAME_NXP_SYS_CLK_FREQ_SEL "NXP_SYS_CLK_FREQ_SEL"
-#define NAME_NXP_SYS_CLOCK_TO_CFG "NXP_SYS_CLOCK_TO_CFG"
-#define NAME_NXP_ACT_PROP_EXTN "NXP_ACT_PROP_EXTN"
-#define NAME_NXP_EXT_TVDD_CFG "NXP_EXT_TVDD_CFG"
-#define NAME_NXP_EXT_TVDD_CFG_1 "NXP_EXT_TVDD_CFG_1"
-#define NAME_NXP_EXT_TVDD_CFG_2 "NXP_EXT_TVDD_CFG_2"
-#define NAME_NXP_EXT_TVDD_CFG_3 "NXP_EXT_TVDD_CFG_3"
-#define NAME_NXP_RF_CONF_BLK_1 "NXP_RF_CONF_BLK_1"
-#define NAME_NXP_RF_CONF_BLK_2 "NXP_RF_CONF_BLK_2"
-#define NAME_NXP_RF_CONF_BLK_3 "NXP_RF_CONF_BLK_3"
-#define NAME_NXP_RF_CONF_BLK_4 "NXP_RF_CONF_BLK_4"
-#define NAME_NXP_RF_CONF_BLK_5 "NXP_RF_CONF_BLK_5"
-#define NAME_NXP_RF_CONF_BLK_6 "NXP_RF_CONF_BLK_6"
-#define NAME_NXP_CORE_CONF_EXTN "NXP_CORE_CONF_EXTN"
-#define NAME_NXP_CORE_CONF "NXP_CORE_CONF"
-#define NAME_NXP_CORE_MFCKEY_SETTING "NXP_CORE_MFCKEY_SETTING"
-#define NAME_NXP_CORE_STANDBY "NXP_CORE_STANDBY"
-#define NAME_NXP_NFC_PROFILE_EXTN "NXP_NFC_PROFILE_EXTN"
-#define NAME_NXP_CHINA_TIANJIN_RF_ENABLED "NXP_CHINA_TIANJIN_RF_ENABLED"
-#define NAME_NXP_SWP_SWITCH_TIMEOUT "NXP_SWP_SWITCH_TIMEOUT"
-#define NAME_NXP_SWP_FULL_PWR_ON "NXP_SWP_FULL_PWR_ON"
-#define NAME_NXP_CORE_RF_FIELD "NXP_CORE_RF_FIELD"
-#define NAME_NXP_NFC_MERGE_RF_PARAMS "NXP_NFC_MERGE_RF_PARAMS"
-#define NAME_NXP_I2C_FRAGMENTATION_ENABLED "NXP_I2C_FRAGMENTATION_ENABLED"
-#define NAME_AID_MATCHING_PLATFORM "AID_MATCHING_PLATFORM"
-
-/* default configuration */
-#define default_storage_location "/data/vendor/nfc"
-
-#endif
diff --git a/halimpl/pn54x/utils/phNxpNciHal_utils.c b/halimpl/pn54x/utils/phNxpNciHal_utils.c
deleted file mode 100644
index 46e4908..0000000
--- a/halimpl/pn54x/utils/phNxpNciHal_utils.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- *
- *  Copyright (C) 2013-2014 NXP Semiconductors
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include <errno.h>
-#include <pthread.h>
-
-#include <phNxpLog.h>
-#include <phNxpNciHal.h>
-#include <phNxpNciHal_utils.h>
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-extern uint8_t discovery_cmd[50];
-extern uint8_t discovery_cmd_len;
-extern uint8_t nfcdep_detected;
-#endif
-
-/*********************** Link list functions **********************************/
-
-/*******************************************************************************
-**
-** Function         listInit
-**
-** Description      List initialization
-**
-** Returns          1, if list initialized, 0 otherwise
-**
-*******************************************************************************/
-int listInit(struct listHead* pList) {
-  pList->pFirst = NULL;
-  if (pthread_mutex_init(&pList->mutex, NULL) == -1) {
-    NXPLOG_NCIHAL_E("Mutex creation failed (errno=0x%08x)", errno);
-    return 0;
-  }
-
-  return 1;
-}
-
-/*******************************************************************************
-**
-** Function         listDestroy
-**
-** Description      List destruction
-**
-** Returns          1, if list destroyed, 0 if failed
-**
-*******************************************************************************/
-int listDestroy(struct listHead* pList) {
-  int bListNotEmpty = 1;
-  while (bListNotEmpty) {
-    bListNotEmpty = listGetAndRemoveNext(pList, NULL);
-  }
-
-  if (pthread_mutex_destroy(&pList->mutex) == -1) {
-    NXPLOG_NCIHAL_E("Mutex destruction failed (errno=0x%08x)", errno);
-    return 0;
-  }
-
-  return 1;
-}
-
-/*******************************************************************************
-**
-** Function         listAdd
-**
-** Description      Add a node to the list
-**
-** Returns          1, if added, 0 if otherwise
-**
-*******************************************************************************/
-int listAdd(struct listHead* pList, void* pData) {
-  struct listNode* pNode;
-  struct listNode* pLastNode;
-  int result;
-
-  /* Create node */
-  pNode = (struct listNode*)malloc(sizeof(struct listNode));
-  if (pNode == NULL) {
-    result = 0;
-    NXPLOG_NCIHAL_E("Failed to malloc");
-    goto clean_and_return;
-  }
-  pNode->pData = pData;
-  pNode->pNext = NULL;
-
-  pthread_mutex_lock(&pList->mutex);
-
-  /* Add the node to the list */
-  if (pList->pFirst == NULL) {
-    /* Set the node as the head */
-    pList->pFirst = pNode;
-  } else {
-    /* Seek to the end of the list */
-    pLastNode = pList->pFirst;
-    while (pLastNode->pNext != NULL) {
-      pLastNode = pLastNode->pNext;
-    }
-
-    /* Add the node to the current list */
-    pLastNode->pNext = pNode;
-  }
-
-  result = 1;
-
-clean_and_return:
-  pthread_mutex_unlock(&pList->mutex);
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         listRemove
-**
-** Description      Remove node from the list
-**
-** Returns          1, if removed, 0 if otherwise
-**
-*******************************************************************************/
-int listRemove(struct listHead* pList, void* pData) {
-  struct listNode* pNode;
-  struct listNode* pRemovedNode;
-  int result;
-
-  pthread_mutex_lock(&pList->mutex);
-
-  if (pList->pFirst == NULL) {
-    /* Empty list */
-    NXPLOG_NCIHAL_E("Failed to deallocate (list empty)");
-    result = 0;
-    goto clean_and_return;
-  }
-
-  pNode = pList->pFirst;
-  if (pList->pFirst->pData == pData) {
-    /* Get the removed node */
-    pRemovedNode = pNode;
-
-    /* Remove the first node */
-    pList->pFirst = pList->pFirst->pNext;
-  } else {
-    while (pNode->pNext != NULL) {
-      if (pNode->pNext->pData == pData) {
-        /* Node found ! */
-        break;
-      }
-      pNode = pNode->pNext;
-    }
-
-    if (pNode->pNext == NULL) {
-      /* Node not found */
-      result = 0;
-      NXPLOG_NCIHAL_E("Failed to deallocate (not found %8p)", pData);
-      goto clean_and_return;
-    }
-
-    /* Get the removed node */
-    pRemovedNode = pNode->pNext;
-
-    /* Remove the node from the list */
-    pNode->pNext = pNode->pNext->pNext;
-  }
-
-  /* Deallocate the node */
-  free(pRemovedNode);
-
-  result = 1;
-
-clean_and_return:
-  pthread_mutex_unlock(&pList->mutex);
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         listGetAndRemoveNext
-**
-** Description      Get next node on the list and remove it
-**
-** Returns          1, if successful, 0 if otherwise
-**
-*******************************************************************************/
-int listGetAndRemoveNext(struct listHead* pList, void** ppData) {
-  struct listNode* pNode;
-  int result;
-
-  pthread_mutex_lock(&pList->mutex);
-
-  if (pList->pFirst == NULL) {
-    /* Empty list */
-    NXPLOG_NCIHAL_D("Failed to deallocate (list empty)");
-    result = 0;
-    goto clean_and_return;
-  }
-
-  /* Work on the first node */
-  pNode = pList->pFirst;
-
-  /* Return the data */
-  if (ppData != NULL) {
-    *ppData = pNode->pData;
-  }
-
-  /* Remove and deallocate the node */
-  pList->pFirst = pNode->pNext;
-  free(pNode);
-
-  result = 1;
-
-clean_and_return:
-  listDump(pList);
-  pthread_mutex_unlock(&pList->mutex);
-  return result;
-}
-
-/*******************************************************************************
-**
-** Function         listDump
-**
-** Description      Dump list information
-**
-** Returns          None
-**
-*******************************************************************************/
-void listDump(struct listHead* pList) {
-  struct listNode* pNode = pList->pFirst;
-
-  NXPLOG_NCIHAL_D("Node dump:");
-  while (pNode != NULL) {
-    NXPLOG_NCIHAL_D("- %8p (%8p)", pNode, pNode->pData);
-    pNode = pNode->pNext;
-  }
-
-  return;
-}
-
-/* END Linked list source code */
-
-/****************** Semaphore and mutex helper functions **********************/
-
-static phNxpNciHal_Monitor_t* nxpncihal_monitor = NULL;
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_init_monitor
-**
-** Description      Initialize the semaphore monitor
-**
-** Returns          Pointer to monitor, otherwise NULL if failed
-**
-*******************************************************************************/
-phNxpNciHal_Monitor_t* phNxpNciHal_init_monitor(void) {
-  NXPLOG_NCIHAL_D("Entering phNxpNciHal_init_monitor");
-
-  if (nxpncihal_monitor == NULL) {
-    nxpncihal_monitor =
-        (phNxpNciHal_Monitor_t*)malloc(sizeof(phNxpNciHal_Monitor_t));
-  }
-
-  if (nxpncihal_monitor != NULL) {
-    memset(nxpncihal_monitor, 0x00, sizeof(phNxpNciHal_Monitor_t));
-
-    if (pthread_mutex_init(&nxpncihal_monitor->reentrance_mutex, NULL) == -1) {
-      NXPLOG_NCIHAL_E("reentrance_mutex creation returned 0x%08x", errno);
-      goto clean_and_return;
-    }
-
-    if (pthread_mutex_init(&nxpncihal_monitor->concurrency_mutex, NULL) == -1) {
-      NXPLOG_NCIHAL_E("concurrency_mutex creation returned 0x%08x", errno);
-      pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
-      goto clean_and_return;
-    }
-
-    if (listInit(&nxpncihal_monitor->sem_list) != 1) {
-      NXPLOG_NCIHAL_E("Semaphore List creation failed");
-      pthread_mutex_destroy(&nxpncihal_monitor->concurrency_mutex);
-      pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
-      goto clean_and_return;
-    }
-  } else {
-    NXPLOG_NCIHAL_E("nxphal_monitor creation failed");
-    goto clean_and_return;
-  }
-
-  NXPLOG_NCIHAL_D("Returning with SUCCESS");
-
-  return nxpncihal_monitor;
-
-clean_and_return:
-  NXPLOG_NCIHAL_D("Returning with FAILURE");
-
-  if (nxpncihal_monitor != NULL) {
-    free(nxpncihal_monitor);
-    nxpncihal_monitor = NULL;
-  }
-
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_cleanup_monitor
-**
-** Description      Clean up semaphore monitor
-**
-** Returns          None
-**
-*******************************************************************************/
-void phNxpNciHal_cleanup_monitor(void) {
-  if (nxpncihal_monitor != NULL) {
-    pthread_mutex_destroy(&nxpncihal_monitor->concurrency_mutex);
-    REENTRANCE_UNLOCK();
-    pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
-    phNxpNciHal_releaseall_cb_data();
-    listDestroy(&nxpncihal_monitor->sem_list);
-  }
-
-  free(nxpncihal_monitor);
-  nxpncihal_monitor = NULL;
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_get_monitor
-**
-** Description      Get monitor
-**
-** Returns          Pointer to monitor
-**
-*******************************************************************************/
-phNxpNciHal_Monitor_t* phNxpNciHal_get_monitor(void) {
-  return nxpncihal_monitor;
-}
-
-/* Initialize the callback data */
-NFCSTATUS phNxpNciHal_init_cb_data(phNxpNciHal_Sem_t* pCallbackData,
-                                   void* pContext) {
-  /* Create semaphore */
-  if (sem_init(&pCallbackData->sem, 0, 0) == -1) {
-    NXPLOG_NCIHAL_E("Semaphore creation failed (errno=0x%08x)", errno);
-    return NFCSTATUS_FAILED;
-  }
-
-  /* Set default status value */
-  pCallbackData->status = NFCSTATUS_FAILED;
-
-  /* Copy the context */
-  pCallbackData->pContext = pContext;
-
-  /* Add to active semaphore list */
-  if (listAdd(&phNxpNciHal_get_monitor()->sem_list, pCallbackData) != 1) {
-    NXPLOG_NCIHAL_E("Failed to add the semaphore to the list");
-  }
-
-  return NFCSTATUS_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_cleanup_cb_data
-**
-** Description      Clean up callback data
-**
-** Returns          None
-**
-*******************************************************************************/
-void phNxpNciHal_cleanup_cb_data(phNxpNciHal_Sem_t* pCallbackData) {
-  /* Destroy semaphore */
-  if (sem_destroy(&pCallbackData->sem)) {
-    NXPLOG_NCIHAL_E(
-        "phNxpNciHal_cleanup_cb_data: Failed to destroy semaphore "
-        "(errno=0x%08x)",
-        errno);
-  }
-
-  /* Remove from active semaphore list */
-  if (listRemove(&phNxpNciHal_get_monitor()->sem_list, pCallbackData) != 1) {
-    NXPLOG_NCIHAL_E(
-        "phNxpNciHal_cleanup_cb_data: Failed to remove semaphore from the "
-        "list");
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_releaseall_cb_data
-**
-** Description      Release all callback data
-**
-** Returns          None
-**
-*******************************************************************************/
-void phNxpNciHal_releaseall_cb_data(void) {
-  phNxpNciHal_Sem_t* pCallbackData;
-
-  while (listGetAndRemoveNext(&phNxpNciHal_get_monitor()->sem_list,
-                              (void**)&pCallbackData)) {
-    pCallbackData->status = NFCSTATUS_FAILED;
-    sem_post(&pCallbackData->sem);
-  }
-
-  return;
-}
-
-/* END Semaphore and mutex helper functions */
-
-/**************************** Other functions *********************************/
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_print_packet
-**
-** Description      Print packet
-**
-** Returns          None
-**
-*******************************************************************************/
-void phNxpNciHal_print_packet(const char* pString, const uint8_t* p_data,
-                              uint16_t len) {
-  uint32_t i, j;
-  char print_buffer[len * 3 + 1];
-
-  memset(print_buffer, 0, sizeof(print_buffer));
-  for (i = 0; i < len; i++) {
-    snprintf(&print_buffer[i * 2], 3, "%02X", p_data[i]);
-  }
-  if (0 == memcmp(pString, "SEND", 0x04)) {
-    NXPLOG_NCIX_D("len = %3d > %s", len, print_buffer);
-  } else if (0 == memcmp(pString, "RECV", 0x04)) {
-    NXPLOG_NCIR_D("len = %3d > %s", len, print_buffer);
-  }
-
-  return;
-}
-
-/*******************************************************************************
-**
-** Function         phNxpNciHal_emergency_recovery
-**
-** Description      Emergency recovery in case of no other way out
-**
-** Returns          None
-**
-*******************************************************************************/
-
-void phNxpNciHal_emergency_recovery(void) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  if (nfcdep_detected && discovery_cmd_len != 0) {
-    pthread_t pthread;
-    pthread_attr_t attr;
-    pthread_attr_init(&attr);
-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-    if (pthread_create(&pthread, &attr, (void*)phNxpNciHal_core_reset_recovery,
-                       NULL) == 0) {
-      return;
-    }
-  }
-#endif
-  NXPLOG_NCIHAL_E("%s: abort()", __func__);
-  abort();
-}
diff --git a/halimpl/pn54x/utils/phNxpNciHal_utils.h b/halimpl/pn54x/utils/phNxpNciHal_utils.h
deleted file mode 100644
index 3ea33e4..0000000
--- a/halimpl/pn54x/utils/phNxpNciHal_utils.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *
- *  Copyright (C) 2013-2014 NXP Semiconductors
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#ifndef _PHNXPNCIHAL_UTILS_H_
-#define _PHNXPNCIHAL_UTILS_H_
-
-#include <assert.h>
-#include <phNfcStatus.h>
-#include <pthread.h>
-#include <semaphore.h>
-
-/********************* Definitions and structures *****************************/
-
-/* List structures */
-struct listNode {
-  void* pData;
-  struct listNode* pNext;
-};
-
-struct listHead {
-  struct listNode* pFirst;
-  pthread_mutex_t mutex;
-};
-
-/* Semaphore handling structure */
-typedef struct phNxpNciHal_Sem {
-  /* Semaphore used to wait for callback */
-  sem_t sem;
-
-  /* Used to store the status sent by the callback */
-  NFCSTATUS status;
-
-  /* Used to provide a local context to the callback */
-  void* pContext;
-
-} phNxpNciHal_Sem_t;
-
-/* Semaphore helper macros */
-#define SEM_WAIT(cb_data) sem_wait(&((cb_data).sem))
-#define SEM_POST(p_cb_data) sem_post(&((p_cb_data)->sem))
-
-/* Semaphore and mutex monitor */
-typedef struct phNxpNciHal_Monitor {
-  /* Mutex protecting native library against reentrance */
-  pthread_mutex_t reentrance_mutex;
-
-  /* Mutex protecting native library against concurrency */
-  pthread_mutex_t concurrency_mutex;
-
-  /* List used to track pending semaphores waiting for callback */
-  struct listHead sem_list;
-
-} phNxpNciHal_Monitor_t;
-
-/************************ Exposed functions ***********************************/
-/* List functions */
-int listInit(struct listHead* pList);
-int listDestroy(struct listHead* pList);
-int listAdd(struct listHead* pList, void* pData);
-int listRemove(struct listHead* pList, void* pData);
-int listGetAndRemoveNext(struct listHead* pList, void** ppData);
-void listDump(struct listHead* pList);
-
-/* NXP NCI HAL utility functions */
-phNxpNciHal_Monitor_t* phNxpNciHal_init_monitor(void);
-void phNxpNciHal_cleanup_monitor(void);
-phNxpNciHal_Monitor_t* phNxpNciHal_get_monitor(void);
-NFCSTATUS phNxpNciHal_init_cb_data(phNxpNciHal_Sem_t* pCallbackData,
-                                   void* pContext);
-void phNxpNciHal_cleanup_cb_data(phNxpNciHal_Sem_t* pCallbackData);
-void phNxpNciHal_releaseall_cb_data(void);
-void phNxpNciHal_print_packet(const char* pString, const uint8_t* p_data,
-                              uint16_t len);
-void phNxpNciHal_emergency_recovery(void);
-
-/* Lock unlock helper macros */
-/* Lock unlock helper macros */
-#define REENTRANCE_LOCK()        \
-  if (phNxpNciHal_get_monitor()) \
-  pthread_mutex_lock(&phNxpNciHal_get_monitor()->reentrance_mutex)
-#define REENTRANCE_UNLOCK()      \
-  if (phNxpNciHal_get_monitor()) \
-  pthread_mutex_unlock(&phNxpNciHal_get_monitor()->reentrance_mutex)
-#define CONCURRENCY_LOCK()       \
-  if (phNxpNciHal_get_monitor()) \
-  pthread_mutex_lock(&phNxpNciHal_get_monitor()->concurrency_mutex)
-#define CONCURRENCY_UNLOCK()     \
-  if (phNxpNciHal_get_monitor()) \
-  pthread_mutex_unlock(&phNxpNciHal_get_monitor()->concurrency_mutex)
-
-#endif /* _PHNXPNCIHAL_UTILS_H_ */
diff --git a/halimpl/pn54x/utils/sparse_crc32.c b/halimpl/pn54x/utils/sparse_crc32.c
deleted file mode 100644
index 1ce4c63..0000000
--- a/halimpl/pn54x/utils/sparse_crc32.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
- *  code or tables extracted from it, as desired without restriction.
- */
-
-/*
- *  First, the polynomial itself and its table of feedback terms.  The
- *  polynomial is
- *  X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
- *
- *  Note that we take it "backwards" and put the highest-order term in
- *  the lowest-order bit.  The X^32 term is "implied"; the LSB is the
- *  X^31 term, etc.  The X^0 term (usually shown as "+1") results in
- *  the MSB being 1
- *
- *  Note that the usual hardware shift register implementation, which
- *  is what we're using (we're merely optimizing it by doing eight-bit
- *  chunks at a time) shifts bits into the lowest-order term.  In our
- *  implementation, that means shifting towards the right.  Why do we
- *  do it this way?  Because the calculated CRC must be transmitted in
- *  order from highest-order term to lowest-order term.  UARTs transmit
- *  characters in order from LSB to MSB.  By storing the CRC this way
- *  we hand it to the UART in the order low-byte to high-byte; the UART
- *  sends each low-bit to hight-bit; and the result is transmission bit
- *  by bit from highest- to lowest-order term without requiring any bit
- *  shuffling on our part.  Reception works similarly
- *
- *  The feedback terms table consists of 256, 32-bit entries.  Notes
- *
- *      The table can be generated at runtime if desired; code to do so
- *      is shown later.  It might not be obvious, but the feedback
- *      terms simply represent the results of eight shift/xor opera
- *      tions for all combinations of data and CRC register values
- *
- *      The values must be right-shifted by eight bits by the "updcrc
- *      logic; the shift must be unsigned (bring in zeroes).  On some
- *      hardware you could probably optimize the shift in assembler by
- *      using byte-swap instructions
- *      polynomial $edb88320
- *
- *
- * CRC32 code derived from work by Gary S. Brown.
- */
-
-/* Code taken from FreeBSD 8 */
-#include <stdint.h>
-
-static uint32_t crc32_tab[] = {
-    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
-    0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
-    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
-    0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
-    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
-    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
-    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
-    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
-    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
-    0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
-    0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
-    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
-    0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
-    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
-    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
-    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
-    0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
-    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
-    0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
-    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
-    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
-    0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
-    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
-    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
-    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
-    0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
-    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
-    0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
-    0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
-    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
-    0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
-    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
-    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
-    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
-    0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
-    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
-    0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
-    0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
-    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
-
-/*
- * A function that calculates the CRC-32 based on the table above is
- * given below for documentation purposes. An equivalent implementation
- * of this function that's actually used in the kernel can be found
- * in sys/libkern.h, where it can be inlined.
- */
-
-uint32_t sparse_crc32(uint32_t crc_in, const void* buf, int size) {
-  const uint8_t* p = buf;
-  uint32_t crc;
-
-  crc = crc_in ^ ~0U;
-  while (size--) crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
-  return crc ^ ~0U;
-}
diff --git a/halimpl/pn54x/utils/sparse_crc32.h b/halimpl/pn54x/utils/sparse_crc32.h
deleted file mode 100644
index a776921..0000000
--- a/halimpl/pn54x/utils/sparse_crc32.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _LIBSPARSE_SPARSE_CRC32_H_
-#define _LIBSPARSE_SPARSE_CRC32_H_
-
-#include <stdint.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-uint32_t sparse_crc32(uint32_t crc, const void* buf, size_t size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/run_unit_tests.sh b/run_unit_tests.sh
new file mode 100755
index 0000000..c2c9904
--- /dev/null
+++ b/run_unit_tests.sh
@@ -0,0 +1,125 @@
+#!/bin/sh
+
+known_tests=(
+  nfc_test_utils
+)
+
+known_remote_tests=(
+)
+
+
+usage() {
+  binary="$(basename "$0")"
+  echo "Usage: ${binary} --help"
+  echo "       ${binary} [-i <iterations>] [-s <specific device>] [--all] [<test name>[.<filter>] ...] [--<arg> ...]"
+  echo
+  echo "Unknown long arguments are passed to the test."
+  echo
+  echo "Known test names:"
+
+  for name in "${known_tests[@]}"
+  do
+    echo "    ${name}"
+  done
+
+  echo
+  echo "Known tests that need a remote device:"
+  for name in "${known_remote_tests[@]}"
+  do
+    echo "    ${name}"
+  done
+}
+
+iterations=1
+device=
+tests=()
+test_args=()
+while [ $# -gt 0 ]
+do
+  case "$1" in
+    -h|--help)
+      usage
+      exit 0
+      ;;
+    -i)
+      shift
+      if [ $# -eq 0 ]; then
+        echo "error: number of iterations expected" 1>&2
+        usage
+        exit 2
+      fi
+      iterations=$(( $1 ))
+      shift
+      ;;
+    -s)
+      shift
+      if [ $# -eq 0 ]; then
+        echo "error: no device specified" 1>&2
+        usage
+        exit 2
+      fi
+      device="$1"
+      shift
+      ;;
+    --all)
+      tests+=( "${known_tests[@]}" )
+      shift
+      ;;
+    --*)
+      test_args+=( "$1" )
+      shift
+      ;;
+    *)
+      tests+=( "$1" )
+      shift
+      ;;
+  esac
+done
+
+if [ "${#tests[@]}" -eq 0 ]; then
+  tests+=( "${known_tests[@]}" )
+fi
+
+adb=( "adb" )
+if [ -n "${device}" ]; then
+  adb+=( "-s" "${device}" )
+fi
+
+failed_tests=()
+for spec in "${tests[@]}"
+do
+  name="${spec%%.*}"
+  binary="/data/nativetest/${name}/${name}"
+
+  push_command=( "${adb[@]}" push {"${ANDROID_PRODUCT_OUT}",}"${binary}" )
+  test_command=( "${adb[@]}" shell "${binary}" )
+  if [ "${name}" != "${spec}" ]; then
+    filter="${spec#*.}"
+    test_command+=( "--gtest_filter=${filter}" )
+  fi
+  test_command+=( "${test_args[@]}" )
+
+  echo "--- ${name} ---"
+  echo "pushing..."
+  "${push_command[@]}"
+  echo "running..."
+  failed_count=0
+  for i in $(seq 1 ${iterations})
+  do
+    "${test_command[@]}" || failed_count=$(( $failed_count + 1 ))
+  done
+
+  if [ $failed_count != 0 ]; then
+    failed_tests+=( "${name} ${failed_count}/${iterations}" )
+  fi
+done
+
+if [ "${#failed_tests[@]}" -ne 0 ]; then
+  for failed_test in "${failed_tests[@]}"
+  do
+    echo "!!! FAILED TEST: ${failed_test} !!!"
+  done
+  exit 1
+fi
+
+exit 0
diff --git a/src/Android.bp b/src/Android.bp
index 39d3007..0db231d 100644
--- a/src/Android.bp
+++ b/src/Android.bp
@@ -13,6 +13,8 @@
         "libmetricslogger",
         "libpower",
         "libz",
+        "libchrome",
+        "libbase",
 
         // Treble configuration
         "libhidlbase",
@@ -20,45 +22,45 @@
         "libhwbinder",
         "libutils",
         "android.hardware.nfc@1.0",
+        "android.hardware.nfc@1.1",
+    ],
+    static_libs: [
+        "libnfcutils",
     ],
     cflags: [
         "-DBUILDCFG=1",
-        "-Wno-deprecated-register",
-        "-Wno-unused-parameter",
-        "-Wno-missing-field-initializers",
+        "-Wall",
+        "-Werror",
     ],
     local_include_dirs: [
         "include",
         "gki/ulinux",
         "gki/common",
-        "hal/include",
-        "hal/int",
         "nfa/include",
-        "nfa/int",
         "nfc/include",
-        "nfc/int",
     ],
     srcs: [
-        "nfa/ce/*.c",
-        "nfa/dm/*.c",
-        "nfa/ee/*.c",
-        "nfa/hci/*.c",
-        "nfa/int/*.c",
-        "nfa/p2p/*.c",
-        "nfa/rw/*.c",
-        "nfa/sys/*.c",
-        "nfc/int/*.c",
-        "nfc/llcp/*.c",
-        "nfc/nci/*.c",
-        "nfc/ndef/*.c",
-        "nfc/nfc/*.c",
+        "nfa/ce/*.cc",
+        "nfa/dm/*.cc",
+        "nfa/ee/*.cc",
+        "nfa/hci/*.cc",
+        "nfa/p2p/*.cc",
+        "nfa/rw/*.cc",
+        "nfa/sys/*.cc",
+        "nfc/llcp/*.cc",
+        "nfc/nci/*.cc",
+        "nfc/ndef/*.cc",
         "nfc/nfc/*.cc",
-        "nfc/tags/*.c",
-        "adaptation/*.c",
-        "adaptation/*.cpp",
+        "nfc/tags/*.cc",
         "adaptation/*.cc",
-        "gki/common/*.c",
-        "gki/ulinux/*.c",
-        "nfca_version.c",
+        "gki/common/*.cc",
+        "gki/ulinux/*.cc",
     ],
+    product_variables: {
+        debuggable: {
+            cflags: [
+                "-DDCHECK_ALWAYS_ON"
+            ],
+        },
+    },
 }
diff --git a/src/adaptation/CrcChecksum.cpp b/src/adaptation/CrcChecksum.cc
similarity index 87%
rename from src/adaptation/CrcChecksum.cpp
rename to src/adaptation/CrcChecksum.cc
index af20f6e..a94879e 100644
--- a/src/adaptation/CrcChecksum.cpp
+++ b/src/adaptation/CrcChecksum.cc
@@ -16,16 +16,17 @@
  *
  ******************************************************************************/
 #include "CrcChecksum.h"
-#include <errno.h>
+
 #include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
 #include <unistd.h>
 #include <string>
-#include "_OverrideLog.h"
 
-#undef LOG_TAG
-#define LOG_TAG "NfcNciHal"
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 static const unsigned short crctab[256] = {
     0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601,
@@ -69,9 +70,9 @@
 **
 *******************************************************************************/
 unsigned short crcChecksumCompute(const unsigned char* buffer, int bufferLen) {
-  register unsigned short crc = 0;
-  const register unsigned char* cp = buffer;
-  register int cnt = bufferLen;
+  unsigned short crc = 0;
+  const unsigned char* cp = buffer;
+  int cnt = bufferLen;
 
   while (cnt--) {
     crc = ((crc >> 8) & 0xff) ^ crctab[(crc & 0xff) ^ *cp++];
@@ -90,8 +91,9 @@
 **
 *******************************************************************************/
 bool crcChecksumVerifyIntegrity(const char* filename) {
-  ALOGD("%s: filename=%s", __func__, filename);
-  bool isGood = FALSE;
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: filename=%s", __func__, filename);
+  bool isGood = false;
   int fileStream = open(filename, O_RDONLY);
   if (fileStream >= 0) {
     unsigned short checksum = 0;
@@ -107,15 +109,16 @@
     }
     close(fileStream);
     if ((actualReadCrc == sizeof(checksum)) && (data.size() > 0)) {
-      ALOGD("%s: data size=%zu", __func__, data.size());
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s: data size=%zu", __func__, data.size());
       if (checksum ==
           crcChecksumCompute((const unsigned char*)data.data(), data.size()))
-        isGood = TRUE;
+        isGood = true;
       else
-        ALOGE("%s: checksum mismatch", __func__);
+        LOG(ERROR) << StringPrintf("%s: checksum mismatch", __func__);
     } else
-      ALOGE("%s: invalid length", __func__);
+      LOG(ERROR) << StringPrintf("%s: invalid length", __func__);
   } else
-    isGood = TRUE;  // assume file does not exist
+    isGood = true;  // assume file does not exist
   return isGood;
 }
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cc
old mode 100644
new mode 100755
similarity index 65%
rename from src/adaptation/NfcAdaptation.cpp
rename to src/adaptation/NfcAdaptation.cc
index 42bf55f..528bdd7
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cc
@@ -15,43 +15,41 @@
  *  limitations under the License.
  *
  ******************************************************************************/
-#include "_OverrideLog.h"
-
-#include <android/hardware/nfc/1.0/INfc.h>
-#include <android/hardware/nfc/1.0/INfcClientCallback.h>
+#include <android-base/stringprintf.h>
+#include <android/hardware/nfc/1.1/INfc.h>
+#include <base/command_line.h>
+#include <base/logging.h>
+#include <cutils/properties.h>
 #include <hwbinder/ProcessState.h>
-#include <pthread.h>
+
 #include "NfcAdaptation.h"
-#include "debug_nfcsnoop.h"
-#include "nfc_target.h"
-
-extern "C" {
-#include "gki.h"
-#include "nfa_api.h"
-#include "nfc_int.h"
-#include "vendor_cfg.h"
-}
 #include "android_logmsg.h"
-#include "config.h"
-
-#undef LOG_TAG
-#define LOG_TAG "NfcAdaptation"
+#include "debug_nfcsnoop.h"
+#include "nfa_api.h"
+#include "nfa_rw_api.h"
+#include "nfc_config.h"
+#include "nfc_int.h"
 
 using android::OK;
 using android::sp;
 using android::status_t;
 
+using android::base::StringPrintf;
 using android::hardware::ProcessState;
 using android::hardware::Return;
 using android::hardware::Void;
 using android::hardware::nfc::V1_0::INfc;
-using android::hardware::nfc::V1_0::INfcClientCallback;
+using android::hardware::nfc::V1_1::PresenceCheckAlgorithm;
+using INfcV1_1 = android::hardware::nfc::V1_1::INfc;
+using NfcVendorConfig = android::hardware::nfc::V1_1::NfcConfig;
+using android::hardware::nfc::V1_1::INfcClientCallback;
 using android::hardware::hidl_vec;
 
-extern "C" void GKI_shutdown();
-extern void resetConfig();
-extern "C" void verify_stack_non_volatile_store();
-extern "C" void delete_stack_non_volatile_store(bool forceDelete);
+extern bool nfc_debug_enabled;
+
+extern void GKI_shutdown();
+extern void verify_stack_non_volatile_store();
+extern void delete_stack_non_volatile_store(bool forceDelete);
 
 NfcAdaptation* NfcAdaptation::mpInstance = NULL;
 ThreadMutex NfcAdaptation::sLock;
@@ -60,25 +58,43 @@
 ThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
 ThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
 sp<INfc> NfcAdaptation::mHal;
+sp<INfcV1_1> NfcAdaptation::mHal_1_1;
 INfcClientCallback* NfcAdaptation::mCallback;
 
-uint32_t ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL;  // 0x017F00;
-uint8_t appl_trace_level = 0xff;
+bool nfc_debug_enabled = false;
+std::string nfc_storage_path;
 uint8_t appl_dta_mode_flag = 0x00;
-char bcm_nfc_location[120];
 
-static uint8_t nfa_dm_cfg[sizeof(tNFA_DM_CFG)];
-static uint8_t nfa_proprietary_cfg[sizeof(tNFA_PROPRIETARY_CFG)];
-extern tNFA_DM_CFG* p_nfa_dm_cfg;
-extern tNFA_PROPRIETARY_CFG* p_nfa_proprietary_cfg;
+extern tNFA_DM_CFG nfa_dm_cfg;
+extern tNFA_PROPRIETARY_CFG nfa_proprietary_cfg;
+extern tNFA_HCI_CFG nfa_hci_cfg;
 extern uint8_t nfa_ee_max_ee_cfg;
-extern const uint8_t nfca_version_string[];
-extern const uint8_t nfa_version_string[];
-static uint8_t deviceHostWhiteList[NFA_HCI_MAX_HOST_IN_NETWORK];
-static tNFA_HCI_CFG jni_nfa_hci_cfg;
-extern tNFA_HCI_CFG* p_nfa_hci_cfg;
 extern bool nfa_poll_bail_out_mode;
 
+// Whitelist for hosts allowed to create a pipe
+// See ADM_CREATE_PIPE command in the ETSI test specification
+// ETSI TS 102 622, section 6.1.3.1
+static std::vector<uint8_t> host_whitelist;
+
+namespace {
+void initializeGlobalDebugEnabledFlag() {
+  nfc_debug_enabled =
+      (NfcConfig::getUnsigned(NAME_NFC_DEBUG_ENABLED, 0) != 0) ? true : false;
+
+  char valueStr[PROPERTY_VALUE_MAX] = {0};
+  int len = property_get("nfc.debug_enabled", valueStr, "");
+  if (len > 0) {
+    // let Android property override .conf variable
+    unsigned debug_enabled = 0;
+    sscanf(valueStr, "%u", &debug_enabled);
+    nfc_debug_enabled = (debug_enabled == 0) ? false : true;
+  }
+
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: level=%u", __func__, nfc_debug_enabled);
+}
+}  // namespace
+
 class NfcClientCallback : public INfcClientCallback {
  public:
   NfcClientCallback(tHAL_NFC_CBACK* eventCallback,
@@ -87,6 +103,12 @@
     mDataCallback = dataCallback;
   };
   virtual ~NfcClientCallback() = default;
+  Return<void> sendEvent_1_1(
+      ::android::hardware::nfc::V1_1::NfcEvent event,
+      ::android::hardware::nfc::V1_0::NfcStatus event_status) override {
+    mEventCallback((uint8_t)event, (tHAL_NFC_STATUS)event_status);
+    return Void();
+  };
   Return<void> sendEvent(
       ::android::hardware::nfc::V1_0::NfcEvent event,
       ::android::hardware::nfc::V1_0::NfcStatus event_status) override {
@@ -141,10 +163,61 @@
 NfcAdaptation& NfcAdaptation::GetInstance() {
   AutoThreadMutex a(sLock);
 
-  if (!mpInstance) mpInstance = new NfcAdaptation;
+  if (!mpInstance) {
+    mpInstance = new NfcAdaptation;
+    mpInstance->InitializeHalDeviceContext();
+  }
   return *mpInstance;
 }
 
+void NfcAdaptation::GetVendorConfigs(
+    std::map<std::string, ConfigValue>& configMap) {
+  if (mHal_1_1) {
+    mHal_1_1->getConfig([&configMap](NfcVendorConfig config) {
+      std::vector<uint8_t> nfaPropCfg = {
+          config.nfaProprietaryCfg.protocol18092Active,
+          config.nfaProprietaryCfg.protocolBPrime,
+          config.nfaProprietaryCfg.protocolDual,
+          config.nfaProprietaryCfg.protocol15693,
+          config.nfaProprietaryCfg.protocolKovio,
+          config.nfaProprietaryCfg.protocolMifare,
+          config.nfaProprietaryCfg.discoveryPollKovio,
+          config.nfaProprietaryCfg.discoveryPollBPrime,
+          config.nfaProprietaryCfg.discoveryListenBPrime};
+      configMap.emplace(NAME_NFA_PROPRIETARY_CFG, ConfigValue(nfaPropCfg));
+      configMap.emplace(NAME_NFA_POLL_BAIL_OUT_MODE,
+                        ConfigValue(config.nfaPollBailOutMode ? 1 : 0));
+      configMap.emplace(NAME_DEFAULT_OFFHOST_ROUTE,
+                        ConfigValue(config.defaultOffHostRoute));
+      configMap.emplace(NAME_DEFAULT_ROUTE, ConfigValue(config.defaultRoute));
+      configMap.emplace(NAME_DEFAULT_NFCF_ROUTE,
+                        ConfigValue(config.defaultOffHostRouteFelica));
+      configMap.emplace(NAME_DEFAULT_SYS_CODE_ROUTE,
+                        ConfigValue(config.defaultSystemCodeRoute));
+      configMap.emplace(NAME_DEFAULT_SYS_CODE_PWR_STATE,
+                        ConfigValue(config.defaultSystemCodePowerState));
+      configMap.emplace(NAME_OFF_HOST_SIM_PIPE_ID,
+                        ConfigValue(config.offHostSIMPipeId));
+      configMap.emplace(NAME_OFF_HOST_ESE_PIPE_ID,
+                        ConfigValue(config.offHostESEPipeId));
+      configMap.emplace(NAME_ISO_DEP_MAX_TRANSCEIVE,
+                        ConfigValue(config.maxIsoDepTransceiveLength));
+      if (config.hostWhitelist.size() != 0) {
+        configMap.emplace(NAME_DEVICE_HOST_WHITE_LIST,
+                          ConfigValue(config.hostWhitelist));
+      }
+      /* For Backwards compatibility */
+      if (config.presenceCheckAlgorithm ==
+          PresenceCheckAlgorithm::ISO_DEP_NAK) {
+        configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
+                          ConfigValue((uint32_t)NFA_RW_PRES_CHK_ISO_DEP_NAK));
+      } else {
+        configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
+                          ConfigValue((uint32_t)config.presenceCheckAlgorithm));
+      }
+    });
+  }
+}
 /*******************************************************************************
 **
 ** Function:    NfcAdaptation::Initialize()
@@ -156,64 +229,82 @@
 *******************************************************************************/
 void NfcAdaptation::Initialize() {
   const char* func = "NfcAdaptation::Initialize";
-  ALOGD("%s: enter", func);
-  ALOGE("%s: ver=%s nfa=%s", func, nfca_version_string, nfa_version_string);
-  unsigned long num;
+  const char* argv[] = {"libnfc_nci"};
+  // Init log tag
+  base::CommandLine::Init(1, argv);
 
-  if (GetNumValue(NAME_USE_RAW_NCI_TRACE, &num, sizeof(num))) {
-    if (num == 1) {
-      // display protocol traces in raw format
-      ProtoDispAdapterUseRawOutput(TRUE);
-      ALOGD("%s: logging protocol in raw format", func);
-    }
-  }
-  if (!GetStrValue(NAME_NFA_STORAGE, bcm_nfc_location,
-                   sizeof(bcm_nfc_location))) {
-    strlcpy(bcm_nfc_location, "/data/nfc", sizeof(bcm_nfc_location));
+  // Android already logs thread_id, proc_id, timestamp, so disable those.
+  logging::SetLogItems(false, false, false, false);
+
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", func);
+
+  nfc_storage_path = NfcConfig::getString(NAME_NFA_STORAGE, "/data/nfc");
+
+  if (NfcConfig::hasKey(NAME_NFA_DM_CFG)) {
+    std::vector<uint8_t> dm_config = NfcConfig::getBytes(NAME_NFA_DM_CFG);
+    if (dm_config.size() > 0) nfa_dm_cfg.auto_detect_ndef = dm_config[0];
+    if (dm_config.size() > 1) nfa_dm_cfg.auto_read_ndef = dm_config[1];
+    if (dm_config.size() > 2) nfa_dm_cfg.auto_presence_check = dm_config[2];
+    if (dm_config.size() > 3) nfa_dm_cfg.presence_check_option = dm_config[3];
+    // NOTE: The timeout value is not configurable here because the endianess
+    // of a byte array is ambiguous and needlessly difficult to configure.
+    // If this value needs to be configgurable, a numeric config option should
+    // be used.
   }
 
-  initializeProtocolLogLevel();
-
-  if (GetStrValue(NAME_NFA_DM_CFG, (char*)nfa_dm_cfg, sizeof(nfa_dm_cfg)))
-    p_nfa_dm_cfg = (tNFA_DM_CFG*)&nfa_dm_cfg[0];
-
-  if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num))) {
-    nfa_ee_max_ee_cfg = num;
-    ALOGD("%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d", func,
-          nfa_ee_max_ee_cfg);
-  }
-  if (GetNumValue(NAME_NFA_POLL_BAIL_OUT_MODE, &num, sizeof(num))) {
-    nfa_poll_bail_out_mode = num;
-    ALOGD("%s: Overriding NFA_POLL_BAIL_OUT_MODE to use %d", func,
-          nfa_poll_bail_out_mode);
+  if (NfcConfig::hasKey(NAME_NFA_MAX_EE_SUPPORTED)) {
+    nfa_ee_max_ee_cfg = NfcConfig::getUnsigned(NAME_NFA_MAX_EE_SUPPORTED);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d",
+                        func, nfa_ee_max_ee_cfg);
   }
 
-  if (GetStrValue(NAME_NFA_PROPRIETARY_CFG, (char*)nfa_proprietary_cfg,
-                  sizeof(tNFA_PROPRIETARY_CFG))) {
-    p_nfa_proprietary_cfg = (tNFA_PROPRIETARY_CFG*)&nfa_proprietary_cfg[0];
+  if (NfcConfig::hasKey(NAME_NFA_POLL_BAIL_OUT_MODE)) {
+    nfa_poll_bail_out_mode =
+        NfcConfig::getUnsigned(NAME_NFA_POLL_BAIL_OUT_MODE);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s: Overriding NFA_POLL_BAIL_OUT_MODE to use %d", func,
+                        nfa_poll_bail_out_mode);
   }
 
-  // configure device host whitelist of HCI host ID's; see specification ETSI TS
-  // 102 622 V11.1.10
-  //(2012-10), section 6.1.3.1
-  num = GetStrValue(NAME_DEVICE_HOST_WHITE_LIST, (char*)deviceHostWhiteList,
-                    sizeof(deviceHostWhiteList));
-  if (num) {
-    memmove(&jni_nfa_hci_cfg, p_nfa_hci_cfg, sizeof(jni_nfa_hci_cfg));
-    jni_nfa_hci_cfg.num_whitelist_host =
-        (uint8_t)num;  // number of HCI host ID's in the whitelist
-    jni_nfa_hci_cfg.p_whitelist = deviceHostWhiteList;  // array of HCI host
-                                                        // ID's
-    p_nfa_hci_cfg = &jni_nfa_hci_cfg;
+  if (NfcConfig::hasKey(NAME_NFA_PROPRIETARY_CFG)) {
+    std::vector<uint8_t> p_config =
+        NfcConfig::getBytes(NAME_NFA_PROPRIETARY_CFG);
+    if (p_config.size() > 0)
+      nfa_proprietary_cfg.pro_protocol_18092_active = p_config[0];
+    if (p_config.size() > 1)
+      nfa_proprietary_cfg.pro_protocol_b_prime = p_config[1];
+    if (p_config.size() > 2)
+      nfa_proprietary_cfg.pro_protocol_dual = p_config[2];
+    if (p_config.size() > 3)
+      nfa_proprietary_cfg.pro_protocol_15693 = p_config[3];
+    if (p_config.size() > 4)
+      nfa_proprietary_cfg.pro_protocol_kovio = p_config[4];
+    if (p_config.size() > 5) nfa_proprietary_cfg.pro_protocol_mfc = p_config[5];
+    if (p_config.size() > 6)
+      nfa_proprietary_cfg.pro_discovery_kovio_poll = p_config[6];
+    if (p_config.size() > 7)
+      nfa_proprietary_cfg.pro_discovery_b_prime_poll = p_config[7];
+    if (p_config.size() > 8)
+      nfa_proprietary_cfg.pro_discovery_b_prime_listen = p_config[8];
   }
 
-  initializeGlobalAppLogLevel();
+  // Configure whitelist of HCI host ID's
+  // See specification: ETSI TS 102 622, section 6.1.3.1
+  if (NfcConfig::hasKey(NAME_DEVICE_HOST_WHITE_LIST)) {
+    host_whitelist = NfcConfig::getBytes(NAME_DEVICE_HOST_WHITE_LIST);
+    nfa_hci_cfg.num_whitelist_host = host_whitelist.size();
+    nfa_hci_cfg.p_whitelist = &host_whitelist[0];
+  }
+
+  initializeGlobalDebugEnabledFlag();
 
   verify_stack_non_volatile_store();
-  if (GetNumValue(NAME_PRESERVE_STORAGE, (char*)&num, sizeof(num)) &&
-      (num == 1))
-    ALOGD("%s: preserve stack NV store", __func__);
-  else {
+  if (NfcConfig::hasKey(NAME_PRESERVE_STORAGE) &&
+      NfcConfig::getUnsigned(NAME_PRESERVE_STORAGE) == 1) {
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s: preserve stack NV store", __func__);
+  } else {
     delete_stack_non_volatile_store(FALSE);
   }
 
@@ -228,11 +319,8 @@
     mCondVar.wait();
   }
 
-  mHalCallback = NULL;
-  memset(&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
-  InitializeHalDeviceContext();
   debug_nfcsnoop_init();
-  ALOGD("%s: exit", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", func);
 }
 
 /*******************************************************************************
@@ -248,18 +336,27 @@
   const char* func = "NfcAdaptation::Finalize";
   AutoThreadMutex a(sLock);
 
-  ALOGD("%s: enter", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", func);
   GKI_shutdown();
 
-  resetConfig();
+  NfcConfig::clear();
 
-  mCallback = NULL;
-  memset(&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
-
-  ALOGD("%s: exit", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", func);
   delete this;
 }
 
+void NfcAdaptation::FactoryReset() {
+  if (mHal_1_1 != nullptr) {
+    mHal_1_1->factoryReset();
+  }
+}
+
+void NfcAdaptation::DeviceShutdown() {
+  if (mHal_1_1 != nullptr) {
+    mHal_1_1->closeForPowerOffCase();
+  }
+}
+
 /*******************************************************************************
 **
 ** Function:    NfcAdaptation::Dump
@@ -291,11 +388,11 @@
 ** Returns:     none
 **
 *******************************************************************************/
-uint32_t NfcAdaptation::NFCA_TASK(uint32_t arg) {
+uint32_t NfcAdaptation::NFCA_TASK(__attribute__((unused)) uint32_t arg) {
   const char* func = "NfcAdaptation::NFCA_TASK";
-  ALOGD("%s: enter", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", func);
   GKI_run(0);
-  ALOGD("%s: exit", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", func);
   return 0;
 }
 
@@ -308,9 +405,9 @@
 ** Returns:     none
 **
 *******************************************************************************/
-uint32_t NfcAdaptation::Thread(uint32_t arg) {
+uint32_t NfcAdaptation::Thread(__attribute__((unused)) uint32_t arg) {
   const char* func = "NfcAdaptation::Thread";
-  ALOGD("%s: enter", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", func);
 
   {
     ThreadCondVar CondVar;
@@ -323,7 +420,7 @@
   NfcAdaptation::GetInstance().signal();
 
   GKI_exit_task(GKI_get_taskid());
-  ALOGD("%s: exit", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", func);
   return 0;
 }
 
@@ -349,8 +446,6 @@
 *******************************************************************************/
 void NfcAdaptation::InitializeHalDeviceContext() {
   const char* func = "NfcAdaptation::InitializeHalDeviceContext";
-  ALOGD("%s: enter", func);
-  int ret = 0;  // 0 means success
 
   mHalEntryFuncs.initialize = HalInitialize;
   mHalEntryFuncs.terminate = HalTerminate;
@@ -362,12 +457,15 @@
   mHalEntryFuncs.control_granted = HalControlGranted;
   mHalEntryFuncs.power_cycle = HalPowerCycle;
   mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
-  ALOGI("%s: INfc::getService()", func);
-  mHal = INfc::getService();
+  LOG(INFO) << StringPrintf("%s: INfc::getService()", func);
+  mHal = mHal_1_1 = INfcV1_1::getService();
+  if (mHal_1_1 == nullptr) {
+    mHal = INfc::getService();
+  }
   LOG_FATAL_IF(mHal == nullptr, "Failed to retrieve the NFC HAL!");
-  ALOGI("%s: INfc::getService() returned %p (%s)", func, mHal.get(),
-        (mHal->isRemote() ? "remote" : "local"));
-  ALOGD("%s: exit", func);
+  LOG(INFO) << StringPrintf("%s: INfc::getService() returned %p (%s)", func,
+                            mHal.get(),
+                            (mHal->isRemote() ? "remote" : "local"));
 }
 
 /*******************************************************************************
@@ -382,7 +480,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalInitialize() {
   const char* func = "NfcAdaptation::HalInitialize";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
 }
 
 /*******************************************************************************
@@ -397,7 +495,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalTerminate() {
   const char* func = "NfcAdaptation::HalTerminate";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
 }
 
 /*******************************************************************************
@@ -412,9 +510,13 @@
 void NfcAdaptation::HalOpen(tHAL_NFC_CBACK* p_hal_cback,
                             tHAL_NFC_DATA_CBACK* p_data_cback) {
   const char* func = "NfcAdaptation::HalOpen";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   mCallback = new NfcClientCallback(p_hal_cback, p_data_cback);
-  mHal->open(mCallback);
+  if (mHal_1_1 != nullptr) {
+    mHal_1_1->open_1_1(mCallback);
+  } else {
+    mHal->open(mCallback);
+  }
 }
 
 /*******************************************************************************
@@ -428,7 +530,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalClose() {
   const char* func = "NfcAdaptation::HalClose";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   mHal->close();
 }
 
@@ -445,7 +547,7 @@
 void NfcAdaptation::HalDeviceContextCallback(nfc_event_t event,
                                              nfc_status_t event_status) {
   const char* func = "NfcAdaptation::HalDeviceContextCallback";
-  ALOGD("%s: event=%u", func, event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: event=%u", func, event);
   if (mHalCallback) mHalCallback(event, (tHAL_NFC_STATUS)event_status);
 }
 
@@ -462,7 +564,8 @@
 void NfcAdaptation::HalDeviceContextDataCallback(uint16_t data_len,
                                                  uint8_t* p_data) {
   const char* func = "NfcAdaptation::HalDeviceContextDataCallback";
-  ALOGD("%s: len=%u", func, data_len);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: len=%u", func, data_len);
   if (mHalDataCallback) mHalDataCallback(data_len, p_data);
 }
 
@@ -477,7 +580,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalWrite(uint16_t data_len, uint8_t* p_data) {
   const char* func = "NfcAdaptation::HalWrite";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   ::android::hardware::nfc::V1_0::NfcData data;
   data.setToExternal(p_data, data_len);
   mHal->write(data);
@@ -495,7 +598,7 @@
 void NfcAdaptation::HalCoreInitialized(uint16_t data_len,
                                        uint8_t* p_core_init_rsp_params) {
   const char* func = "NfcAdaptation::HalCoreInitialized";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   hidl_vec<uint8_t> data;
   data.setToExternal(p_core_init_rsp_params, data_len);
 
@@ -518,7 +621,7 @@
 *******************************************************************************/
 bool NfcAdaptation::HalPrediscover() {
   const char* func = "NfcAdaptation::HalPrediscover";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   bool retval = FALSE;
   mHal->prediscover();
   return retval;
@@ -539,7 +642,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalControlGranted() {
   const char* func = "NfcAdaptation::HalControlGranted";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   mHal->controlGranted();
 }
 
@@ -554,7 +657,7 @@
 *******************************************************************************/
 void NfcAdaptation::HalPowerCycle() {
   const char* func = "NfcAdaptation::HalPowerCycle";
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
   mHal->powerCycle();
 }
 
@@ -569,8 +672,7 @@
 *******************************************************************************/
 uint8_t NfcAdaptation::HalGetMaxNfcee() {
   const char* func = "NfcAdaptation::HalPowerCycle";
-  uint8_t maxNfcee = 0;
-  ALOGD("%s", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", func);
 
   return nfa_ee_max_ee_cfg;
 }
@@ -586,21 +688,21 @@
 *******************************************************************************/
 void NfcAdaptation::DownloadFirmware() {
   const char* func = "NfcAdaptation::DownloadFirmware";
-  ALOGD("%s: enter", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", func);
   HalInitialize();
 
   mHalOpenCompletedEvent.lock();
-  ALOGD("%s: try open HAL", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: try open HAL", func);
   HalOpen(HalDownloadFirmwareCallback, HalDownloadFirmwareDataCallback);
   mHalOpenCompletedEvent.wait();
 
   mHalCloseCompletedEvent.lock();
-  ALOGD("%s: try close HAL", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: try close HAL", func);
   HalClose();
   mHalCloseCompletedEvent.wait();
 
   HalTerminate();
-  ALOGD("%s: exit", func);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", func);
 }
 
 /*******************************************************************************
@@ -613,17 +715,21 @@
 **
 *******************************************************************************/
 void NfcAdaptation::HalDownloadFirmwareCallback(nfc_event_t event,
+                                                __attribute__((unused))
                                                 nfc_status_t event_status) {
   const char* func = "NfcAdaptation::HalDownloadFirmwareCallback";
-  ALOGD("%s: event=0x%X", func, event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: event=0x%X", func, event);
   switch (event) {
     case HAL_NFC_OPEN_CPLT_EVT: {
-      ALOGD("%s: HAL_NFC_OPEN_CPLT_EVT", func);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s: HAL_NFC_OPEN_CPLT_EVT", func);
       mHalOpenCompletedEvent.signal();
       break;
     }
     case HAL_NFC_CLOSE_CPLT_EVT: {
-      ALOGD("%s: HAL_NFC_CLOSE_CPLT_EVT", func);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s: HAL_NFC_CLOSE_CPLT_EVT", func);
       mHalCloseCompletedEvent.signal();
       break;
     }
@@ -639,7 +745,9 @@
 ** Returns:     None.
 **
 *******************************************************************************/
-void NfcAdaptation::HalDownloadFirmwareDataCallback(uint16_t data_len,
+void NfcAdaptation::HalDownloadFirmwareDataCallback(__attribute__((unused))
+                                                    uint16_t data_len,
+                                                    __attribute__((unused))
                                                     uint8_t* p_data) {}
 
 /*******************************************************************************
diff --git a/src/adaptation/OverrideLog.cpp b/src/adaptation/OverrideLog.cpp
deleted file mode 100644
index 81beafc..0000000
--- a/src/adaptation/OverrideLog.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Override the ALOGD(), ALOGE(), and other logging macros from
- *  /system/core/include/cutils/log.h
- *
- ******************************************************************************/
-#include <cutils/properties.h>
-#include <string.h>
-#include "_OverrideLog.h"
-#include "android_logmsg.h"
-#include "config.h"
-
-#undef LOG_TAG
-#define LOG_TAG "BrcmNfcJni"
-
-/*******************************************************************************
-**
-** Function:        initializeGlobalAppLogLevel
-**
-** Description:     Initialize and get global logging level from .conf or
-**                  Android property nfc.app_log_level.  The Android property
-**                  overrides .conf variable.
-**
-** Returns:         Global log level:
-**                  BT_TRACE_LEVEL_NONE    0 * No trace messages to be generated
-**                  BT_TRACE_LEVEL_ERROR   1 * Error condition trace messages
-**                  BT_TRACE_LEVEL_WARNING 2 * Warning condition trace messages
-**                  BT_TRACE_LEVEL_API     3 * API traces
-**                  BT_TRACE_LEVEL_EVENT   4 * Debug messages for events
-**                  BT_TRACE_LEVEL_DEBUG   5 * Debug messages (general)
-**
-*******************************************************************************/
-unsigned char initializeGlobalAppLogLevel() {
-  unsigned long num = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  num = 1;
-  if (GetNumValue(NAME_APPL_TRACE_LEVEL, &num, sizeof(num)))
-    appl_trace_level = (unsigned char)num;
-
-  int len = property_get("nfc.app_log_level", valueStr, "");
-  if (len > 0) {
-    // let Android property override .conf variable
-    sscanf(valueStr, "%lu", &num);
-    appl_trace_level = (unsigned char)num;
-  }
-
-  // 0xFF is a special value used by the stack to query the current
-  // trace level; it does not change any trace level
-  if (appl_trace_level == 0xFF) appl_trace_level = BT_TRACE_LEVEL_DEBUG;
-  ALOGD("%s: level=%u", __func__, appl_trace_level);
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) {
-    // display protocol traces in raw format
-    ProtoDispAdapterUseRawOutput(TRUE);
-  }
-  return appl_trace_level;
-}
-
-uint32_t initializeProtocolLogLevel() {
-  uint32_t num = 0;
-  char valueStr[PROPERTY_VALUE_MAX] = {0};
-
-  if (GetNumValue(NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof(num)))
-    ScrProtocolTraceFlag = num;
-
-  int len = property_get("nfc.enable_protocol_log", valueStr, "");
-  if (len > 0) {
-    if (strncmp("0", valueStr, 1) == 0) {
-      ScrProtocolTraceFlag = 0;
-    } else {
-      ScrProtocolTraceFlag = ~0;
-    }
-  }
-
-  return ScrProtocolTraceFlag;
-}
-
-void initializeGlobalAppDtaMode() {
-  appl_dta_mode_flag = 0x01;
-  ALOGD("%s: DTA Enabled", __func__);
-}
diff --git a/src/adaptation/android_logmsg.cc b/src/adaptation/android_logmsg.cc
new file mode 100644
index 0000000..bdfe3b9
--- /dev/null
+++ b/src/adaptation/android_logmsg.cc
@@ -0,0 +1,108 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 1999-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <cutils/log.h>
+
+#include "android_logmsg.h"
+#include "buildcfg.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
+#define MAX_NCI_PACKET_SIZE 259
+#define BTE_LOG_BUF_SIZE 1024
+#define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
+#define MAX_LOGCAT_LINE 4096
+#define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
+static char log_line[MAX_LOGCAT_LINE];
+static const char* sTable = "0123456789abcdef";
+
+static void ToHex(const uint8_t* data, uint16_t len, char* hexString,
+                  uint16_t hexStringSize);
+
+void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
+                                      bool is_recv) {
+  if (!nfc_debug_enabled) return;
+
+  char line_buf[(MAX_NCI_PACKET_SIZE * 2) + 1];
+  ToHex(nciPacket, nciPacketLen, line_buf, sizeof(line_buf));
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s:%s", is_recv ? "NciR" : "NciX", line_buf);
+}
+
+void ToHex(const uint8_t* data, uint16_t len, char* hexString,
+           uint16_t hexStringSize) {
+  int i = 0, j = 0;
+  for (i = 0, j = 0; i < len && j < hexStringSize - 3; i++) {
+    hexString[j++] = sTable[(*data >> 4) & 0xf];
+    hexString[j++] = sTable[*data & 0xf];
+    data++;
+  }
+  hexString[j] = '\0';
+}
+
+inline void byte2hex(const char* data, char** str) {
+  **str = sTable[(*data >> 4) & 0xf];
+  ++*str;
+  **str = sTable[*data & 0xf];
+  ++*str;
+}
+
+/***************************************************************************
+**
+** Function         DispLLCP
+**
+** Description      Log LLCP packet as hex-ascii bytes.
+**
+** Returns          None.
+**
+***************************************************************************/
+void DispLLCP(NFC_HDR* p_buf, bool is_recv) {
+  if (!nfc_debug_enabled) return;
+
+  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
+  if (nBytes > sizeof(log_line)) return;
+
+  uint8_t* data = (uint8_t*)p_buf;
+  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
+  ToHex(data, data_len, log_line, sizeof(log_line));
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s:%s", is_recv ? "LlcpR" : "LlcpX", log_line);
+}
+
+/***************************************************************************
+**
+** Function         DispHcp
+**
+** Description      Log raw HCP packet as hex-ascii bytes
+**
+** Returns          None.
+**
+***************************************************************************/
+void DispHcp(uint8_t* data, uint16_t len, bool is_recv) {
+  if (!nfc_debug_enabled) return;
+
+  uint32_t nBytes = (len * 2) + 1;
+  if (nBytes > sizeof(log_line)) return;
+
+  ToHex(data, len, log_line, sizeof(log_line));
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s:%s", is_recv ? "HcpR" : "HcpX", log_line);
+}
diff --git a/src/adaptation/android_logmsg.cpp b/src/adaptation/android_logmsg.cpp
deleted file mode 100644
index c7a7250..0000000
--- a/src/adaptation/android_logmsg.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "_OverrideLog.h"
-
-#include <cutils/log.h>
-#include "android_logmsg.h"
-#include "buildcfg.h"
-#include "nfc_target.h"
-
-extern uint32_t ScrProtocolTraceFlag;
-#define MAX_NCI_PACKET_SIZE 259
-#define BTE_LOG_BUF_SIZE 1024
-#define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
-#define MAX_LOGCAT_LINE 4096
-#define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
-static char log_line[MAX_LOGCAT_LINE];
-static const char* sTable = "0123456789abcdef";
-static bool sIsUseRaw = FALSE;
-static void ToHex(const uint8_t* data, uint16_t len, char* hexString,
-                  uint16_t hexStringSize);
-static void dumpbin(const char* data, int size, uint32_t trace_layer,
-                    uint32_t trace_type);
-static inline void word2hex(const char* data, char** hex);
-static inline void byte2char(const char* data, char** str);
-static inline void byte2hex(const char* data, char** str);
-
-void BTDISP_LOCK_LOG() {}
-
-void BTDISP_UNLOCK_LOG() {}
-
-void BTDISP_INIT_LOCK() {}
-
-void BTDISP_UNINIT_LOCK() {}
-
-void ProtoDispAdapterUseRawOutput(bool isUseRaw) { sIsUseRaw = isUseRaw; }
-
-void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
-                                      bool is_recv) {
-  // Protocol decoder is not available, so decode NCI packet into hex numbers.
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_NCI)) return;
-  char line_buf[(MAX_NCI_PACKET_SIZE * 2) + 1];
-  ToHex(nciPacket, nciPacketLen, line_buf, sizeof(line_buf));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR" : "BrcmNciX",
-                      line_buf);
-}
-
-void ToHex(const uint8_t* data, uint16_t len, char* hexString,
-           uint16_t hexStringSize) {
-  int i = 0, j = 0;
-  for (i = 0, j = 0; i < len && j < hexStringSize - 3; i++) {
-    hexString[j++] = sTable[(*data >> 4) & 0xf];
-    hexString[j++] = sTable[*data & 0xf];
-    data++;
-  }
-  hexString[j] = '\0';
-}
-
-// Protodisp code calls ScrLog() to print decoded texts.
-void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...) {
-  static char buffer[BTE_LOG_BUF_SIZE];
-  va_list ap;
-
-  va_start(ap, fmt_str);
-  vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
-  va_end(ap);
-  __android_log_write(ANDROID_LOG_INFO, "BrcmNci", buffer);
-}
-
-uint8_t* scru_dump_hex(uint8_t* p, char* pTitle, uint32_t len, uint32_t layer,
-                       uint32_t type) {
-  if (pTitle && *pTitle) PRINT(pTitle);
-  dumpbin((char*)p, len, layer, type);
-  return p;
-}
-
-void dumpbin(const char* data, int size, uint32_t trace_layer,
-             uint32_t trace_type) {
-  char line_buff[256];
-  char* line;
-  int i, j, addr;
-  const int width = 16;
-  if (size <= 0) return;
-  for (i = 0; i < size / width; i++) {
-    line = line_buff;
-    // write address:
-    addr = i * width;
-    word2hex((const char*)&addr, &line);
-    *line++ = ':';
-    *line++ = ' ';
-    // write hex of data
-    for (j = 0; j < width; j++) {
-      byte2hex(&data[j], &line);
-      *line++ = ' ';
-    }
-    // write char of data
-    for (j = 0; j < width; j++) byte2char(data++, &line);
-    // wirte the end of line
-    *line = 0;
-    // output the line
-    PRINT(line_buff);
-  }
-  // last line of left over if any
-  int leftover = size % width;
-  if (leftover > 0) {
-    line = line_buff;
-    // write address:
-    addr = i * width;
-    word2hex((const char*)&addr, &line);
-    *line++ = ':';
-    *line++ = ' ';
-    // write hex of data
-    for (j = 0; j < leftover; j++) {
-      byte2hex(&data[j], &line);
-      *line++ = ' ';
-    }
-    // write hex padding
-    for (; j < width; j++) {
-      *line++ = ' ';
-      *line++ = ' ';
-      *line++ = ' ';
-    }
-    // write char of data
-    for (j = 0; j < leftover; j++) byte2char(data++, &line);
-    // write the end of line
-    *line = 0;
-    // output the line
-    PRINT(line_buff);
-  }
-}
-
-inline void word2hex(const char* data, char** hex) {
-  byte2hex(&data[1], hex);
-  byte2hex(&data[0], hex);
-}
-
-inline void byte2char(const char* data, char** str) {
-  **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
-  ++(*str);
-}
-
-inline void byte2hex(const char* data, char** str) {
-  **str = sTable[(*data >> 4) & 0xf];
-  ++*str;
-  **str = sTable[*data & 0xf];
-  ++*str;
-}
-
-// Decode a few Bluetooth HCI packets into hex numbers.
-void DispHciCmd(NFC_HDR* p_buf) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
-}
-
-// Decode a few Bluetooth HCI packets into hex numbers.
-void DispHciEvt(NFC_HDR* p_buf) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
-}
-
-/***************************************************************************
-**
-** Function         DispLLCP
-**
-** Description      Log LLCP packet as hex-ascii bytes.
-**
-** Returns          None.
-**
-***************************************************************************/
-void DispLLCP(NFC_HDR* p_buf, bool is_recv) {
-  uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
-  uint8_t* data = (uint8_t*)p_buf;
-  int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, data_len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR" : "BrcmLlcpX",
-                      log_line);
-}
-
-/***************************************************************************
-**
-** Function         DispHcp
-**
-** Description      Log raw HCP packet as hex-ascii bytes
-**
-** Returns          None.
-**
-***************************************************************************/
-void DispHcp(uint8_t* data, uint16_t len, bool is_recv) {
-  uint32_t nBytes = (len * 2) + 1;
-
-  if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
-
-  // Only trace HCP if we're tracing HCI as well
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return;
-
-  if (nBytes > sizeof(log_line)) return;
-
-  ToHex(data, len, log_line, sizeof(log_line));
-  __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmHcpR" : "BrcmHcpX",
-                      log_line);
-}
-
-void DispSNEP(uint8_t local_sap, uint8_t remote_sap, NFC_HDR* p_buf,
-              bool is_first, bool is_rx) {}
-void DispCHO(uint8_t* pMsg, uint32_t MsgLen, bool is_rx) {}
-void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx) {}
-void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx) {}
-void DispCET4Tags(NFC_HDR* p_buf, bool is_rx) {}
-void DispRWI93Tag(NFC_HDR* p_buf, bool is_rx, uint8_t command_to_respond) {}
-void DispNDEFMsg(uint8_t* pMsg, uint32_t MsgLen, bool is_recv) {}
-
-/*******************************************************************************
-**
-** Function:        LogMsg
-**
-** Description:     Print messages from NFC stack.
-**
-** Returns:         None.
-**
-*******************************************************************************/
-void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
-  static char buffer[BTE_LOG_BUF_SIZE];
-  va_list ap;
-  uint32_t trace_type =
-      trace_set_mask & 0x07;  // lower 3 bits contain trace type
-  int android_log_type = ANDROID_LOG_INFO;
-
-  va_start(ap, fmt_str);
-  vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
-  va_end(ap);
-  if (trace_type == TRACE_TYPE_ERROR) android_log_type = ANDROID_LOG_ERROR;
-  __android_log_write(android_log_type, LOGMSG_TAG_NAME, buffer);
-}
-
-void LogMsg_0(uint32_t maskTraceSet, const char* p_str) {
-  LogMsg(maskTraceSet, p_str);
-}
-
-void LogMsg_1(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1) {
-  LogMsg(maskTraceSet, fmt_str, p1);
-}
-
-void LogMsg_2(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2);
-}
-
-void LogMsg_3(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3);
-}
-
-void LogMsg_4(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4);
-}
-
-void LogMsg_5(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5);
-}
-
-void LogMsg_6(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
-              uintptr_t p6) {
-  LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5, p6);
-}
diff --git a/src/adaptation/config.cpp b/src/adaptation/config.cpp
deleted file mode 100644
index 8085daa..0000000
--- a/src/adaptation/config.cpp
+++ /dev/null
@@ -1,683 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "config.h"
-#include <stdio.h>
-#include <sys/stat.h>
-#include <list>
-#include <string>
-#include <vector>
-#include "_OverrideLog.h"
-
-#undef LOG_TAG
-#define LOG_TAG "NfcAdaptation"
-
-const char* transport_config_paths[] = {"/odm/etc/", "/vendor/etc/", "/etc/"};
-const int transport_config_path_size =
-    (sizeof(transport_config_paths) / sizeof(transport_config_paths[0]));
-
-#define config_name "libnfc-brcm.conf"
-#define extra_config_base "libnfc-brcm-"
-#define extra_config_ext ".conf"
-#define IsStringValue 0x80000000
-
-using namespace ::std;
-
-class CNfcParam : public string {
- public:
-  CNfcParam();
-  CNfcParam(const char* name, const string& value);
-  CNfcParam(const char* name, unsigned long value);
-  virtual ~CNfcParam();
-  unsigned long numValue() const { return m_numValue; }
-  const char* str_value() const { return m_str_value.c_str(); }
-  size_t str_len() const { return m_str_value.length(); }
-
- private:
-  string m_str_value;
-  unsigned long m_numValue;
-};
-
-class CNfcConfig : public vector<const CNfcParam*> {
- public:
-  virtual ~CNfcConfig();
-  static CNfcConfig& GetInstance();
-  friend void readOptionalConfig(const char* optional);
-
-  bool getValue(const char* name, char* pValue, size_t& len) const;
-  bool getValue(const char* name, unsigned long& rValue) const;
-  bool getValue(const char* name, unsigned short& rValue) const;
-  const CNfcParam* find(const char* p_name) const;
-  void clean();
-
- private:
-  CNfcConfig();
-  bool readConfig(const char* name, bool bResetContent);
-  void moveFromList();
-  void moveToList();
-  void add(const CNfcParam* pParam);
-  list<const CNfcParam*> m_list;
-  bool mValidFile;
-
-  unsigned long state;
-
-  inline bool Is(unsigned long f) { return (state & f) == f; }
-  inline void Set(unsigned long f) { state |= f; }
-  inline void Reset(unsigned long f) { state &= ~f; }
-};
-
-/*******************************************************************************
-**
-** Function:    isPrintable()
-**
-** Description: detremine if a char is printable
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline bool isPrintable(char c) {
-  return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-         (c >= '0' && c <= '9') || c == '/' || c == '_' || c == '-' || c == '.';
-}
-
-/*******************************************************************************
-**
-** Function:    isDigit()
-**
-** Description: detremine if a char is numeral digit
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline bool isDigit(char c, int base) {
-  if ('0' <= c && c <= '9') return true;
-  if (base == 16) {
-    if (('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    getDigitValue()
-**
-** Description: return numercal value of a char
-**
-** Returns:     none
-**
-*******************************************************************************/
-inline int getDigitValue(char c, int base) {
-  if ('0' <= c && c <= '9') return c - '0';
-  if (base == 16) {
-    if ('A' <= c && c <= 'F')
-      return c - 'A' + 10;
-    else if ('a' <= c && c <= 'f')
-      return c - 'a' + 10;
-  }
-  return 0;
-}
-
-/*******************************************************************************
-**
-** Function:    findConfigFilePathFromTransportConfigPaths()
-**
-** Description: find a config file path with a given config name from transport
-**              config paths
-**
-** Returns:     none
-**
-*******************************************************************************/
-void findConfigFilePathFromTransportConfigPaths(const string& configName,
-                                                string& filePath) {
-  for (int i = 0; i < transport_config_path_size - 1; i++) {
-    filePath.assign(transport_config_paths[i]);
-    filePath += configName;
-    struct stat file_stat;
-    if (stat(filePath.c_str(), &file_stat) == 0 && S_ISREG(file_stat.st_mode)) {
-      return;
-    }
-  }
-  filePath.assign(transport_config_paths[transport_config_path_size - 1]);
-  filePath += configName;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::readConfig()
-**
-** Description: read Config settings and parse them into a linked list
-**              move the element from linked list to a array at the end
-**
-** Returns:     none
-**
-*******************************************************************************/
-bool CNfcConfig::readConfig(const char* name, bool bResetContent) {
-  enum {
-    BEGIN_LINE = 1,
-    TOKEN,
-    STR_VALUE,
-    NUM_VALUE,
-    BEGIN_HEX,
-    BEGIN_QUOTE,
-    END_LINE
-  };
-
-  FILE* fd = NULL;
-  string token;
-  string strValue;
-  unsigned long numValue = 0;
-  CNfcParam* pParam = NULL;
-  int i = 0;
-  int base = 0;
-  char c = 0;
-
-  state = BEGIN_LINE;
-  /* open config file, read it into a buffer */
-  if ((fd = fopen(name, "rb")) == NULL) {
-    ALOGD("%s Cannot open config file %s\n", __func__, name);
-    if (bResetContent) {
-      ALOGD("%s Using default value for all settings\n", __func__);
-      mValidFile = false;
-    }
-    return false;
-  }
-  ALOGD("%s Opened %s config %s\n", __func__,
-        (bResetContent ? "base" : "optional"), name);
-
-  mValidFile = true;
-  if (size() > 0) {
-    if (bResetContent)
-      clean();
-    else
-      moveToList();
-  }
-
-  for (;;) {
-    if (feof(fd) || fread(&c, 1, 1, fd) != 1) {
-      if (state == BEGIN_LINE) break;
-
-      // got to the EOF but not in BEGIN_LINE state so the file
-      // probably does not end with a newline, so the parser has
-      // not processed current line, simulate a newline in the file
-      c = '\n';
-    }
-
-    switch (state & 0xff) {
-      case BEGIN_LINE:
-        if (c == '#')
-          state = END_LINE;
-        else if (isPrintable(c)) {
-          i = 0;
-          token.erase();
-          strValue.erase();
-          state = TOKEN;
-          token.push_back(c);
-        }
-        break;
-      case TOKEN:
-        if (c == '=') {
-          token.push_back('\0');
-          state = BEGIN_QUOTE;
-        } else if (isPrintable(c))
-          token.push_back(c);
-        else
-          state = END_LINE;
-        break;
-      case BEGIN_QUOTE:
-        if (c == '"') {
-          state = STR_VALUE;
-          base = 0;
-        } else if (c == '0')
-          state = BEGIN_HEX;
-        else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          i = 0;
-        } else if (c == '{') {
-          state = NUM_VALUE;
-          base = 16;
-          i = 0;
-          Set(IsStringValue);
-        } else
-          state = END_LINE;
-        break;
-      case BEGIN_HEX:
-        if (c == 'x' || c == 'X') {
-          state = NUM_VALUE;
-          base = 16;
-          numValue = 0;
-          i = 0;
-          break;
-        } else if (isDigit(c, 10)) {
-          state = NUM_VALUE;
-          base = 10;
-          numValue = getDigitValue(c, base);
-          break;
-        } else if (c != '\n' && c != '\r') {
-          state = END_LINE;
-          break;
-        }
-      // fal through to numValue to handle numValue
-
-      case NUM_VALUE:
-        if (isDigit(c, base)) {
-          numValue *= base;
-          numValue += getDigitValue(c, base);
-          ++i;
-        } else if (base == 16 &&
-                   (c == ':' || c == '-' || c == ' ' || c == '}')) {
-          if (i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) {
-              unsigned char c = (numValue >> (n * 8)) & 0xFF;
-              strValue.push_back(c);
-            }
-          }
-          Set(IsStringValue);
-          numValue = 0;
-          i = 0;
-        } else {
-          if (c == '\n' || c == '\r')
-            state = BEGIN_LINE;
-          else
-            state = END_LINE;
-          if (Is(IsStringValue) && base == 16 && i > 0) {
-            int n = (i + 1) / 2;
-            while (n-- > 0) strValue.push_back(((numValue >> (n * 8)) & 0xFF));
-          }
-          if (strValue.length() > 0)
-            pParam = new CNfcParam(token.c_str(), strValue);
-          else
-            pParam = new CNfcParam(token.c_str(), numValue);
-          add(pParam);
-          strValue.erase();
-          numValue = 0;
-        }
-        break;
-      case STR_VALUE:
-        if (c == '"') {
-          strValue.push_back('\0');
-          state = END_LINE;
-          pParam = new CNfcParam(token.c_str(), strValue);
-          add(pParam);
-        } else if (isPrintable(c))
-          strValue.push_back(c);
-        break;
-      case END_LINE:
-        if (c == '\n' || c == '\r') state = BEGIN_LINE;
-        break;
-      default:
-        break;
-    }
-
-    if (feof(fd)) break;
-  }
-
-  fclose(fd);
-
-  moveFromList();
-  return size() > 0;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::CNfcConfig()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::CNfcConfig() : mValidFile(true), state(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::~CNfcConfig()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig::~CNfcConfig() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::GetInstance()
-**
-** Description: get class singleton object
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcConfig& CNfcConfig::GetInstance() {
-  static CNfcConfig theInstance;
-
-  if (theInstance.size() == 0 && theInstance.mValidFile) {
-    string strPath;
-    findConfigFilePathFromTransportConfigPaths(config_name, strPath);
-    theInstance.readConfig(strPath.c_str(), true);
-  }
-
-  return theInstance;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a string value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, char* pValue, size_t& len) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() > 0) {
-    memset(pValue, 0, len);
-    if (len > pParam->str_len()) len = pParam->str_len();
-    memcpy(pValue, pParam->str_value(), len);
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a long numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned long& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned long>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::getValue()
-**
-** Description: get a short numerical value of a setting
-**
-** Returns:     true if setting exists
-**              false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned short& rValue) const {
-  const CNfcParam* pParam = find(name);
-  if (pParam == NULL) return false;
-
-  if (pParam->str_len() == 0) {
-    rValue = static_cast<unsigned short>(pParam->numValue());
-    return true;
-  }
-  return false;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::find()
-**
-** Description: search if a setting exist in the setting array
-**
-** Returns:     pointer to the setting object
-**
-*******************************************************************************/
-const CNfcParam* CNfcConfig::find(const char* p_name) const {
-  if (size() == 0) return NULL;
-
-  for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it) {
-    if (**it < p_name)
-      continue;
-    else if (**it == p_name) {
-      if ((*it)->str_len() > 0)
-        ALOGD("%s found %s=%s\n", __func__, p_name, (*it)->str_value());
-      else
-        ALOGD("%s found %s=(0x%lX)\n", __func__, p_name, (*it)->numValue());
-      return *it;
-    } else
-      break;
-  }
-  return NULL;
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::clean()
-**
-** Description: reset the setting array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::clean() {
-  if (size() == 0) return;
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it) delete *it;
-  clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::Add()
-**
-** Description: add a setting object to the list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::add(const CNfcParam* pParam) {
-  if (m_list.size() == 0) {
-    m_list.push_back(pParam);
-    return;
-  }
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it) {
-    if (**it < pParam->c_str()) continue;
-    m_list.insert(it, pParam);
-    return;
-  }
-  m_list.push_back(pParam);
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveFromList()
-**
-** Description: move the setting object from list to array
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveFromList() {
-  if (m_list.size() == 0) return;
-
-  for (list<const CNfcParam *>::iterator it = m_list.begin(),
-                                         itEnd = m_list.end();
-       it != itEnd; ++it)
-    push_back(*it);
-  m_list.clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcConfig::moveToList()
-**
-** Description: move the setting object from array to list
-**
-** Returns:     none
-**
-*******************************************************************************/
-void CNfcConfig::moveToList() {
-  if (m_list.size() != 0) m_list.clear();
-
-  for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
-    m_list.push_back(*it);
-  clear();
-}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam() : m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::~CNfcParam()
-**
-** Description: class destructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::~CNfcParam() {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, const string& value)
-    : string(name), m_str_value(value), m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function:    CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns:     none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, unsigned long value)
-    : string(name), m_numValue(value) {}
-
-/*******************************************************************************
-**
-** Function:    GetStrValue
-**
-** Description: API function for getting a string value of a setting
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern "C" int GetStrValue(const char* name, char* pValue, unsigned long l) {
-  size_t len = l;
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  bool b = rConfig.getValue(name, pValue, len);
-  return b ? len : 0;
-}
-
-/*******************************************************************************
-**
-** Function:    GetNumValue
-**
-** Description: API function for getting a numerical value of a setting
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern "C" int GetNumValue(const char* name, void* pValue, unsigned long len) {
-  if (!pValue) return false;
-
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-  const CNfcParam* pParam = rConfig.find(name);
-
-  if (pParam == NULL) return false;
-  unsigned long v = pParam->numValue();
-  if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4) {
-    const unsigned char* p = (const unsigned char*)pParam->str_value();
-    for (size_t i = 0; i < pParam->str_len(); ++i) {
-      v *= 256;
-      v += *p++;
-    }
-  }
-  switch (len) {
-    case sizeof(unsigned long):
-      *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
-      break;
-    case sizeof(unsigned short):
-      *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
-      break;
-    case sizeof(unsigned char):
-      *(static_cast<unsigned char*>(pValue)) = (unsigned char)v;
-      break;
-    default:
-      return false;
-  }
-  return true;
-}
-
-/*******************************************************************************
-**
-** Function:    resetConfig
-**
-** Description: reset settings array
-**
-** Returns:     none
-**
-*******************************************************************************/
-extern void resetConfig() {
-  CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
-  rConfig.clean();
-}
-
-/*******************************************************************************
-**
-** Function:    readOptionalConfig()
-**
-** Description: read Config settings from an optional conf file
-**
-** Returns:     none
-**
-*******************************************************************************/
-void readOptionalConfig(const char* extra) {
-  string strPath;
-  string configName(extra_config_base);
-  configName += extra;
-  configName += extra_config_ext;
-
-  findConfigFilePathFromTransportConfigPaths(configName, strPath);
-  CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
-}
diff --git a/src/adaptation/debug_nfcsnoop.cc b/src/adaptation/debug_nfcsnoop.cc
index b7229d6..9466b9f 100644
--- a/src/adaptation/debug_nfcsnoop.cc
+++ b/src/adaptation/debug_nfcsnoop.cc
@@ -16,16 +16,16 @@
  *
  ******************************************************************************/
 
-#include <assert.h>
+#include <android-base/logging.h>
 #include <resolv.h>
 #include <zlib.h>
 #include <mutex>
 
+#include <ringbuffer.h>
+
 #include "bt_types.h"
 #include "include/debug_nfcsnoop.h"
-#include "include/ringbuffer.h"
 #include "nfc_int.h"
-#include "nfc_types.h"
 
 #define USEC_PER_SEC 1000000ULL
 
@@ -60,8 +60,13 @@
   // Insert data
   header.length = length;
   header.is_received = is_received ? 1 : 0;
-  header.delta_time_ms =
-      last_timestamp_ms ? timestamp_us - last_timestamp_ms : 0;
+
+  uint64_t delta_time_ms = 0;
+  if (last_timestamp_ms) {
+    __builtin_sub_overflow(timestamp_us, last_timestamp_ms, &delta_time_ms);
+  }
+  header.delta_time_ms = delta_time_ms;
+
   last_timestamp_ms = timestamp_us;
 
   ringbuffer_insert(buffer, (uint8_t*)&header, sizeof(nfcsnooz_header_t));
@@ -69,8 +74,8 @@
 }
 
 static bool nfcsnoop_compress(ringbuffer_t* rb_dst, ringbuffer_t* rb_src) {
-  assert(rb_dst != NULL);
-  assert(rb_src != NULL);
+  CHECK(rb_dst != NULL);
+  CHECK(rb_src != NULL);
 
   z_stream zs;
   zs.zalloc = Z_NULL;
diff --git a/src/adaptation/libmain.c b/src/adaptation/libmain.cc
similarity index 61%
rename from src/adaptation/libmain.c
rename to src/adaptation/libmain.cc
index bc78e6c..eb9a9f1 100644
--- a/src/adaptation/libmain.c
+++ b/src/adaptation/libmain.cc
@@ -15,22 +15,26 @@
  *  limitations under the License.
  *
  ******************************************************************************/
-#include "_OverrideLog.h"
-
-#include <errno.h>
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 #include <fcntl.h>
-#include <malloc.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include <vector>
+
 #include "CrcChecksum.h"
-#include "buildcfg.h"
-#include "config.h"
 #include "nfa_nv_ci.h"
-#include "nfa_nv_co.h"
 #include "nfc_hal_nv_co.h"
-#include "nfc_hal_target.h"
-extern char bcm_nfc_location[];
-static const char* sNfaStorageBin = "/nfaStorage.bin";
+
+using android::base::StringPrintf;
+
+extern std::string nfc_storage_path;
+extern bool nfc_debug_enabled;
+
+namespace {
+std::string getFilenameForBlock(const unsigned block) {
+  std::string bin = "nfaStorage.bin";
+  return StringPrintf("%s/%s%u", nfc_storage_path.c_str(), bin.c_str(), block);
+}
+}  // namespace
 
 /*******************************************************************************
 **
@@ -78,34 +82,27 @@
 **
 *******************************************************************************/
 extern void nfa_nv_co_read(uint8_t* pBuffer, uint16_t nbytes, uint8_t block) {
-  char filename[256], filename2[256];
+  std::string filename = getFilenameForBlock(block);
 
-  memset(filename, 0, sizeof(filename));
-  memset(filename2, 0, sizeof(filename2));
-  strcpy(filename2, bcm_nfc_location);
-  strncat(filename2, sNfaStorageBin, sizeof(filename2) - strlen(filename2) - 1);
-  if (strlen(filename2) > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-  sprintf(filename, "%s%u", filename2, block);
-
-  ALOGD("%s: buffer len=%u; file=%s", __func__, nbytes, filename);
-  int fileStream = open(filename, O_RDONLY);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s: buffer len=%u; file=%s", __func__, nbytes, filename.c_str());
+  int fileStream = open(filename.c_str(), O_RDONLY);
   if (fileStream >= 0) {
     unsigned short checksum = 0;
-    size_t actualReadCrc = read(fileStream, &checksum, sizeof(checksum));
+    read(fileStream, &checksum, sizeof(checksum));
     size_t actualReadData = read(fileStream, pBuffer, nbytes);
     close(fileStream);
     if (actualReadData > 0) {
-      ALOGD("%s: data size=%zu", __func__, actualReadData);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s: data size=%zu", __func__, actualReadData);
       nfa_nv_ci_read(actualReadData, NFA_NV_CO_OK, block);
     } else {
-      ALOGE("%s: fail to read", __func__);
+      LOG(ERROR) << StringPrintf("%s: fail to read", __func__);
       nfa_nv_ci_read(0, NFA_NV_CO_FAIL, block);
     }
   } else {
-    ALOGD("%s: fail to open", __func__);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s: fail to open", __func__);
     nfa_nv_ci_read(0, NFA_NV_CO_FAIL, block);
   }
 }
@@ -131,37 +128,29 @@
 *******************************************************************************/
 extern void nfa_nv_co_write(const uint8_t* pBuffer, uint16_t nbytes,
                             uint8_t block) {
-  char filename[256], filename2[256];
+  std::string filename = getFilenameForBlock(block);
 
-  memset(filename, 0, sizeof(filename));
-  memset(filename2, 0, sizeof(filename2));
-  strcpy(filename2, bcm_nfc_location);
-  strncat(filename2, sNfaStorageBin, sizeof(filename2) - strlen(filename2) - 1);
-  if (strlen(filename2) > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-  sprintf(filename, "%s%u", filename2, block);
-  ALOGD("%s: bytes=%u; file=%s", __func__, nbytes, filename);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s: bytes=%u; file=%s", __func__, nbytes, filename.c_str());
 
-  int fileStream = 0;
-
-  fileStream = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+  int fileStream =
+      open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
   if (fileStream >= 0) {
     unsigned short checksum = crcChecksumCompute(pBuffer, nbytes);
     size_t actualWrittenCrc = write(fileStream, &checksum, sizeof(checksum));
     size_t actualWrittenData = write(fileStream, pBuffer, nbytes);
-    ALOGD("%s: %zu bytes written", __func__, actualWrittenData);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s: %zu bytes written", __func__, actualWrittenData);
     if ((actualWrittenData == nbytes) &&
         (actualWrittenCrc == sizeof(checksum))) {
       nfa_nv_ci_write(NFA_NV_CO_OK);
     } else {
-      ALOGE("%s: fail to write", __func__);
+      LOG(ERROR) << StringPrintf("%s: fail to write", __func__);
       nfa_nv_ci_write(NFA_NV_CO_FAIL);
     }
     close(fileStream);
   } else {
-    ALOGE("%s: fail to open, error = %d", __func__, errno);
+    LOG(ERROR) << StringPrintf("%s: fail to open, error = %d", __func__, errno);
     nfa_nv_ci_write(NFA_NV_CO_FAIL);
   }
 }
@@ -179,31 +168,17 @@
 *******************************************************************************/
 void delete_stack_non_volatile_store(bool forceDelete) {
   static bool firstTime = true;
-  char filename[256], filename2[256];
 
   if ((firstTime == false) && (forceDelete == false)) return;
   firstTime = false;
 
-  ALOGD("%s", __func__);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", __func__);
 
-  memset(filename, 0, sizeof(filename));
-  memset(filename2, 0, sizeof(filename2));
-  strcpy(filename2, bcm_nfc_location);
-  strncat(filename2, sNfaStorageBin, sizeof(filename2) - strlen(filename2) - 1);
-  if (strlen(filename2) > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
-  }
-  sprintf(filename, "%s%u", filename2, DH_NV_BLOCK);
-  remove(filename);
-  sprintf(filename, "%s%u", filename2, HC_F3_NV_BLOCK);
-  remove(filename);
-  sprintf(filename, "%s%u", filename2, HC_F4_NV_BLOCK);
-  remove(filename);
-  sprintf(filename, "%s%u", filename2, HC_F2_NV_BLOCK);
-  remove(filename);
-  sprintf(filename, "%s%u", filename2, HC_F5_NV_BLOCK);
-  remove(filename);
+  remove(getFilenameForBlock(DH_NV_BLOCK).c_str());
+  remove(getFilenameForBlock(HC_F2_NV_BLOCK).c_str());
+  remove(getFilenameForBlock(HC_F3_NV_BLOCK).c_str());
+  remove(getFilenameForBlock(HC_F4_NV_BLOCK).c_str());
+  remove(getFilenameForBlock(HC_F5_NV_BLOCK).c_str());
 }
 
 /*******************************************************************************
@@ -218,33 +193,17 @@
 **
 *******************************************************************************/
 void verify_stack_non_volatile_store() {
-  ALOGD("%s", __func__);
-  char filename[256], filename2[256];
-  bool isValid = false;
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", __func__);
 
-  memset(filename, 0, sizeof(filename));
-  memset(filename2, 0, sizeof(filename2));
-  strcpy(filename2, bcm_nfc_location);
-  strncat(filename2, sNfaStorageBin, sizeof(filename2) - strlen(filename2) - 1);
-  if (strlen(filename2) > 200) {
-    ALOGE("%s: filename too long", __func__);
-    return;
+  const std::vector<unsigned> verify_blocks = {DH_NV_BLOCK, HC_F2_NV_BLOCK,
+                                               HC_F3_NV_BLOCK, HC_F4_NV_BLOCK,
+                                               HC_F5_NV_BLOCK};
+
+  size_t verified = 0;
+  for (auto block : verify_blocks) {
+    if (!crcChecksumVerifyIntegrity(getFilenameForBlock(block).c_str())) break;
+    ++verified;
   }
 
-  sprintf(filename, "%s%u", filename2, DH_NV_BLOCK);
-  if (crcChecksumVerifyIntegrity(filename)) {
-    sprintf(filename, "%s%u", filename2, HC_F3_NV_BLOCK);
-    if (crcChecksumVerifyIntegrity(filename)) {
-      sprintf(filename, "%s%u", filename2, HC_F4_NV_BLOCK);
-      if (crcChecksumVerifyIntegrity(filename)) {
-        sprintf(filename, "%s%u", filename2, HC_F2_NV_BLOCK);
-        if (crcChecksumVerifyIntegrity(filename)) {
-          sprintf(filename, "%s%u", filename2, HC_F5_NV_BLOCK);
-          if (crcChecksumVerifyIntegrity(filename)) isValid = true;
-        }
-      }
-    }
-  }
-
-  if (isValid == false) delete_stack_non_volatile_store(true);
+  if (verified != verify_blocks.size()) delete_stack_non_volatile_store(true);
 }
diff --git a/src/adaptation/nfc_config.cc b/src/adaptation/nfc_config.cc
new file mode 100644
index 0000000..5891cc4
--- /dev/null
+++ b/src/adaptation/nfc_config.cc
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "nfc_config.h"
+#include "NfcAdaptation.h"
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+#include <config.h>
+
+using namespace ::std;
+using namespace ::android::base;
+
+namespace {
+
+std::string findConfigPath() {
+  const vector<string> search_path = {"/odm/etc/", "/vendor/etc/",
+                                      "/product/etc/", "/etc/"};
+  const string file_name = "libnfc-nci.conf";
+
+  for (string path : search_path) {
+    path.append(file_name);
+    struct stat file_stat;
+    if (stat(path.c_str(), &file_stat) != 0) continue;
+    if (S_ISREG(file_stat.st_mode)) return path;
+  }
+  return "";
+}
+
+}  // namespace
+
+void NfcConfig::loadConfig() {
+  string config_path = findConfigPath();
+  CHECK(config_path != "");
+  config_.parseFromFile(config_path);
+  /* Read vendor specific configs */
+  NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+  std::map<std::string, ConfigValue> configMap;
+  theInstance.GetVendorConfigs(configMap);
+  for (auto config : configMap) {
+    config_.addConfig(config.first, config.second);
+  }
+}
+
+NfcConfig::NfcConfig() { loadConfig(); }
+
+NfcConfig& NfcConfig::getInstance() {
+  static NfcConfig theInstance;
+  if (theInstance.config_.isEmpty()) {
+    theInstance.loadConfig();
+  }
+  return theInstance;
+}
+
+bool NfcConfig::hasKey(const std::string& key) {
+  return getInstance().config_.hasKey(key);
+}
+
+std::string NfcConfig::getString(const std::string& key) {
+  return getInstance().config_.getString(key);
+}
+
+std::string NfcConfig::getString(const std::string& key,
+                                 std::string default_value) {
+  if (hasKey(key)) return getString(key);
+  return default_value;
+}
+
+unsigned NfcConfig::getUnsigned(const std::string& key) {
+  return getInstance().config_.getUnsigned(key);
+}
+
+unsigned NfcConfig::getUnsigned(const std::string& key,
+                                unsigned default_value) {
+  if (hasKey(key)) return getUnsigned(key);
+  return default_value;
+}
+
+std::vector<uint8_t> NfcConfig::getBytes(const std::string& key) {
+  return getInstance().config_.getBytes(key);
+}
+
+void NfcConfig::clear() { getInstance().config_.clear(); }
diff --git a/src/gki/common/gki.h b/src/gki/common/gki.h
index 1458e32..a6aa2e3 100644
--- a/src/gki/common/gki.h
+++ b/src/gki/common/gki.h
@@ -26,6 +26,8 @@
 #define NFC_STANDALONE FALSE
 #endif
 
+#include <string>
+
 #include "bt_types.h"
 #include "gki_target.h"
 
@@ -40,9 +42,7 @@
 ** send buffers to the task.
 */
 #define TASK_MBOX_0 0
-#define TASK_MBOX_1 1
 #define TASK_MBOX_2 2
-#define TASK_MBOX_3 3
 
 #define NUM_TASK_MBOX 4
 
@@ -53,7 +53,6 @@
 ** There are 4 reserved events used to signal timeout events.
 ** There are 8 general purpose events available for applications.
 */
-#define MAX_EVENTS 16
 
 #define TASK_MBOX_0_EVT_MASK 0x0001
 #define TASK_MBOX_1_EVT_MASK 0x0002
@@ -71,12 +70,6 @@
 #define TIMER_3_EVT_MASK 0x0080
 
 #define APPL_EVT_0 8
-#define APPL_EVT_1 9
-#define APPL_EVT_2 10
-#define APPL_EVT_3 11
-#define APPL_EVT_4 12
-#define APPL_EVT_5 13
-#define APPL_EVT_6 14
 #define APPL_EVT_7 15
 
 #define EVENT_MASK(evt) ((uint16_t)(0x0001 << (evt)))
@@ -301,19 +294,20 @@
 
 /* Timer list entry callback type
 */
-typedef void(TIMER_CBACK)(void* p_tle);
+struct TIMER_LIST_ENT;
+typedef void(TIMER_CBACK)(TIMER_LIST_ENT* p_tle);
 
 /* Define a timer list entry
 */
-typedef struct _tle {
-  struct _tle* p_next;
-  struct _tle* p_prev;
+struct TIMER_LIST_ENT {
+  TIMER_LIST_ENT* p_next;
+  TIMER_LIST_ENT* p_prev;
   TIMER_CBACK* p_cback;
   int32_t ticks;
   uintptr_t param;
   uint16_t event;
   uint8_t in_use;
-} TIMER_LIST_ENT;
+};
 
 /* Define a timer list queue
 */
@@ -332,26 +326,19 @@
   uint16_t count;
 } BUFFER_Q;
 
-#define GKI_IS_QUEUE_EMPTY(p_q) ((p_q)->count == 0)
-
 /* Task constants
 */
 #ifndef TASKPTR
-typedef void (*TASKPTR)(uint32_t);
+typedef uint32_t (*TASKPTR)(uint32_t);
 #endif
 
 /* General pool accessible to GKI_getbuf() */
-#define GKI_PUBLIC_POOL 0
 #define GKI_RESTRICTED_POOL 1 /* Inaccessible pool to GKI_getbuf() */
 
 /***********************************************************************
 ** Function prototypes
 */
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Task management
 */
 extern uint8_t GKI_create_task(TASKPTR, uint8_t, int8_t*, uint16_t*, uint16_t,
@@ -364,7 +351,6 @@
 extern void GKI_run(void*);
 extern void GKI_stop(void);
 extern uint8_t GKI_suspend_task(uint8_t);
-extern uint8_t GKI_is_task_running(uint8_t);
 
 /* memory management
 */
@@ -454,10 +440,6 @@
 
 /* Exception handling
 */
-extern void GKI_exception(uint16_t, char*);
-
-#ifdef __cplusplus
-}
-#endif
+extern void GKI_exception(uint16_t, std::string);
 
 #endif
diff --git a/src/gki/common/gki_buffer.c b/src/gki/common/gki_buffer.cc
similarity index 95%
rename from src/gki/common/gki_buffer.c
rename to src/gki/common/gki_buffer.cc
index 3f95093..b14f6c8 100644
--- a/src/gki/common/gki_buffer.c
+++ b/src/gki/common/gki_buffer.cc
@@ -15,7 +15,8 @@
  *  limitations under the License.
  *
  ******************************************************************************/
-#include <stdio.h>
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 #include "gki_int.h"
 
 #if (GKI_NUM_TOTAL_BUF_POOLS > 16)
@@ -27,6 +28,8 @@
 static void gki_remove_from_pool_list(uint8_t pool_id);
 #endif /*  BTU_STACK_LITE_ENABLED == FALSE */
 
+using android::base::StringPrintf;
+
 /*******************************************************************************
 **
 ** Function         gki_init_free_queue
@@ -94,7 +97,7 @@
   if (Q->p_first == 0) {
     void* p_mem = GKI_os_malloc((Q->size + BUFFER_PADDING_SIZE) * Q->total);
     if (p_mem) {
-// re-initialize the queue with allocated memory
+      // re-initialize the queue with allocated memory
       gki_init_free_queue(id, Q->size, Q->total, p_mem);
       return true;
     }
@@ -248,8 +251,7 @@
 ** Returns          A pointer to the buffer, or NULL if none available
 **
 *******************************************************************************/
-void* GKI_getbuf(uint16_t size)
-{
+void* GKI_getbuf(uint16_t size) {
   uint8_t i;
   FREE_QUEUE_T* Q;
   BUFFER_HDR_T* p_hdr;
@@ -282,14 +284,14 @@
     Q = &p_cb->freeq[p_cb->pool_list[i]];
     if (Q->cur_cnt < Q->total) {
       if (Q->p_first == 0 && gki_alloc_free_queue(i) != true) {
-        GKI_TRACE_ERROR_0("GKI_getbuf() out of buffer");
+        LOG(ERROR) << StringPrintf("out of buffer");
         GKI_enable();
         return NULL;
       }
 
       if (Q->p_first == 0) {
         /* gki_alloc_free_queue() failed to alloc memory */
-        GKI_TRACE_ERROR_0("GKI_getbuf() fail alloc free queue");
+        LOG(ERROR) << StringPrintf("fail alloc free queue");
         GKI_enable();
         return NULL;
       }
@@ -312,7 +314,7 @@
     }
   }
 
-  GKI_TRACE_ERROR_0("GKI_getbuf() unable to allocate buffer!!!!!");
+  LOG(ERROR) << StringPrintf("unable to allocate buffer!!!!!");
 
   GKI_enable();
 
@@ -335,8 +337,7 @@
 ** Returns          A pointer to the buffer, or NULL if none available
 **
 *******************************************************************************/
-void* GKI_getpoolbuf(uint8_t pool_id)
-{
+void* GKI_getpoolbuf(uint8_t pool_id) {
   FREE_QUEUE_T* Q;
   BUFFER_HDR_T* p_hdr;
   tGKI_COM_CB* p_cb = &gki_cb.com;
@@ -352,7 +353,7 @@
 
     if (Q->p_first == 0) {
       /* gki_alloc_free_queue() failed to alloc memory */
-      GKI_TRACE_ERROR_0("GKI_getpoolbuf() fail alloc free queue");
+      LOG(ERROR) << StringPrintf("fail alloc free queue");
       return NULL;
     }
 
@@ -454,7 +455,7 @@
 
   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
 
-  if ((uint32_t)p_hdr & 1) return (0);
+  if ((uintptr_t)p_hdr & 1) return (0);
 
   if (p_hdr->q_id < GKI_NUM_TOTAL_BUF_POOLS) {
     return (gki_cb.com.freeq[p_hdr->q_id].size);
@@ -478,7 +479,7 @@
   uint32_t* magic;
   magic = (uint32_t*)((uint8_t*)p_buf + GKI_get_buf_size(p_buf));
 
-  if ((uint32_t)magic & 1) return true;
+  if ((uintptr_t)magic & 1) return true;
 
   if (*magic == MAGIC_NO) return false;
 
@@ -975,45 +976,6 @@
 
 /*******************************************************************************
 **
-** Function         GKI_igetpoolbuf
-**
-** Description      Called by an interrupt service routine to get a free buffer
-**                  from a specific buffer pool.
-**
-** Parameters       pool_id - (input) pool ID to get a buffer out of.
-**
-** Returns          A pointer to the buffer, or NULL if none available
-**
-*******************************************************************************/
-void* GKI_igetpoolbuf(uint8_t pool_id) {
-  FREE_QUEUE_T* Q;
-  BUFFER_HDR_T* p_hdr;
-
-  if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (NULL);
-
-  Q = &gki_cb.com.freeq[pool_id];
-  if (Q->cur_cnt < Q->total) {
-    p_hdr = Q->p_first;
-    Q->p_first = p_hdr->p_next;
-
-    if (!Q->p_first) Q->p_last = NULL;
-
-    if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
-
-    p_hdr->task_id = GKI_get_taskid();
-
-    p_hdr->status = BUF_STATUS_UNLINKED;
-    p_hdr->p_next = NULL;
-    p_hdr->Type = 0;
-
-    return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
-  }
-
-  return (NULL);
-}
-
-/*******************************************************************************
-**
 ** Function         GKI_poolcount
 **
 ** Description      Called by an application to get the total number of buffers
diff --git a/src/gki/common/gki_common.h b/src/gki/common/gki_common.h
index 8f0cc7a..5cf7028 100644
--- a/src/gki/common/gki_common.h
+++ b/src/gki/common/gki_common.h
@@ -23,9 +23,6 @@
 /* Task States: (For OSRdyTbl) */
 #define TASK_DEAD 0    /* b0000 */
 #define TASK_READY 1   /* b0001 */
-#define TASK_WAIT 2    /* b0010 */
-#define TASK_DELAY 4   /* b0100 */
-#define TASK_SUSPEND 8 /* b1000 */
 
 /********************************************************************
 **  Internal Error codes
@@ -40,14 +37,12 @@
 #define GKI_ERROR_DELETE_POOL_BAD_QID 0xFFF8
 #define GKI_ERROR_BUF_SIZE_TOOBIG 0xFFF7
 #define GKI_ERROR_BUF_SIZE_ZERO 0xFFF6
-#define GKI_ERROR_ADDR_NOT_IN_BUF 0xFFF5
 
 /********************************************************************
 **  Misc constants
 *********************************************************************/
 
 #define GKI_MAX_INT32 (0x7fffffffL)
-#define GKI_MAX_TIMESTAMP (0xffffffffL)
 
 /********************************************************************
 **  Buffer Management Data Structures
@@ -275,10 +270,6 @@
 
 } tGKI_COM_CB;
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Internal GKI function prototypes
 */
 extern bool gki_chk_buf_damage(void*);
@@ -287,15 +278,4 @@
 extern void gki_timers_init(void);
 extern void gki_adjust_timer_count(int32_t);
 
-extern void OSStartRdy(void);
-extern void OSCtxSw(void);
-extern void OSIntCtxSw(void);
-extern void OSSched(void);
-extern void OSIntEnter(void);
-extern void OSIntExit(void);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/src/gki/common/gki_inet.h b/src/gki/common/gki_inet.h
index 079dfe3..720f17f 100644
--- a/src/gki/common/gki_inet.h
+++ b/src/gki/common/gki_inet.h
@@ -20,12 +20,6 @@
 
 #include "data_types.h"
 
-#define htons ntohs
-#define htonl ntohl
-
-#define htonets nettohs
-#define htonetl nettohl
-
 #if (BIG_ENDIAN == TRUE)
 #define ntohs(n) (n)
 #define ntohl(n) (n)
diff --git a/src/gki/common/gki_time.c b/src/gki/common/gki_time.cc
similarity index 97%
rename from src/gki/common/gki_time.c
rename to src/gki/common/gki_time.cc
index 2cb136b..ac9a649 100644
--- a/src/gki/common/gki_time.c
+++ b/src/gki/common/gki_time.cc
@@ -15,12 +15,10 @@
  *  limitations under the License.
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 #include "gki_int.h"
 
-#ifndef BT_ERROR_TRACE_0
-#define BT_ERROR_TRACE_0(l, m)
-#endif
-
 /* Make sure that this has been defined in target.h */
 #ifndef GKI_NUM_TIMERS
 #error NO TIMERS: Must define at least 1 timer in the system!
@@ -32,6 +30,10 @@
 #define GKI_UNUSED_LIST_ENTRY (0x80000000L)
 #define GKI_MAX_INT32 (0x7fffffffL)
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*******************************************************************************
 **
 ** Function         gki_timers_init
@@ -714,13 +716,13 @@
     if (p_tle == p_target_tle) {
       rem_ticks += p_tle->ticks;
     } else {
-      BT_ERROR_TRACE_0(TRACE_LAYER_GKI,
-                       "GKI_get_remaining_ticks: No timer entry in the list");
+      LOG(ERROR) << StringPrintf(
+          "GKI_get_remaining_ticks: No timer entry in the list");
       return (0);
     }
   } else {
-    BT_ERROR_TRACE_0(TRACE_LAYER_GKI,
-                     "GKI_get_remaining_ticks: timer entry is not active");
+    LOG(ERROR) << StringPrintf(
+        "GKI_get_remaining_ticks: timer entry is not active");
   }
 
   return (rem_ticks);
@@ -749,8 +751,9 @@
   uint8_t tt;
   TIMER_LIST_ENT* p_temp;
   if (p_tle == NULL || p_timer_listq == NULL) {
-    GKI_TRACE_3("%s: invalid argument %x, %x****************************<<",
-                __func__, p_timer_listq, p_tle);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "%s: invalid argument %p, %p****************************<<", __func__,
+        p_timer_listq, p_tle);
     return;
   }
 
diff --git a/src/gki/ulinux/data_types.h b/src/gki/ulinux/data_types.h
index 892b798..727cd3c 100644
--- a/src/gki/ulinux/data_types.h
+++ b/src/gki/ulinux/data_types.h
@@ -29,14 +29,10 @@
 #define FALSE 0
 #endif
 
-typedef uint32_t TIME_STAMP;
-
 #ifndef TRUE
 #define TRUE (!FALSE)
 #endif
 
-typedef unsigned char UBYTE;
-
 #ifdef __arm
 #define PACKED __packed
 #define INLINE __inline
@@ -49,7 +45,4 @@
 #define BIG_ENDIAN FALSE
 #endif
 
-#define UINT16_LOW_BYTE(x) ((x)&0xff)
-#define UINT16_HI_BYTE(x) ((x) >> 8)
-
 #endif
diff --git a/src/gki/ulinux/gki_int.h b/src/gki/ulinux/gki_int.h
index 4d3f121..27ff76e 100644
--- a/src/gki/ulinux/gki_int.h
+++ b/src/gki/ulinux/gki_int.h
@@ -54,14 +54,6 @@
   tGKI_COM_CB com;
 } tGKI_CB;
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 extern tGKI_CB gki_cb;
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/src/gki/ulinux/gki_ulinux.c b/src/gki/ulinux/gki_ulinux.cc
similarity index 85%
rename from src/gki/ulinux/gki_ulinux.c
rename to src/gki/ulinux/gki_ulinux.cc
index 31bdcd6..01ba892 100644
--- a/src/gki/ulinux/gki_ulinux.c
+++ b/src/gki/ulinux/gki_ulinux.cc
@@ -17,19 +17,20 @@
  ******************************************************************************/
 #include <errno.h>
 #include <malloc.h>
-#include <stdarg.h>
-#include <stdio.h>
-
 #include <pthread.h> /* must be 1st header defined  */
-#include <time.h>
-#include "bt_trace.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "gki_int.h"
-#include "gki_target.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* Temp android logging...move to android tgt config file */
 
 #ifndef LINUX_NATIVE
-#include <cutils/log.h>
 #else
 #define LOGV(format, ...) fprintf(stdout, LOG_TAG format, ##__VA_ARGS__)
 #define LOGE(format, ...) fprintf(stderr, LOG_TAG format, ##__VA_ARGS__)
@@ -53,10 +54,6 @@
 #define LINUX_SEC (1000 / TICKS_PER_SEC)
 // #define GKI_TICK_TIMER_DEBUG
 
-#define LOCK(m) pthread_mutex_lock(&m)
-#define UNLOCK(m) pthread_mutex_unlock(&m)
-#define INIT(m) pthread_mutex_init(&m, NULL)
-
 /* this kind of mutex go into tGKI_OS control block!!!! */
 /* static pthread_mutex_t GKI_sched_mutex; */
 /*static pthread_mutex_t thread_delay_mutex;
@@ -86,39 +83,26 @@
 ** Returns          void
 **
 *******************************************************************************/
-void gki_task_entry(uintptr_t params) {
+void* gki_task_entry(void* params) {
   pthread_t thread_id = pthread_self();
   gki_pthread_info_t* p_pthread_info = (gki_pthread_info_t*)params;
-  GKI_TRACE_5("gki_task_entry task_id=%i, thread_id=%x/%x, pCond/pMutex=%x/%x",
-              p_pthread_info->task_id,
-              gki_cb.os.thread_id[p_pthread_info->task_id], pthread_self(),
-              p_pthread_info->pCond, p_pthread_info->pMutex);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "gki_task_entry task_id=%i, thread_id=%lx/%lx, pCond/pMutex=%p/%p",
+      p_pthread_info->task_id, gki_cb.os.thread_id[p_pthread_info->task_id],
+      pthread_self(), p_pthread_info->pCond, p_pthread_info->pMutex);
 
   gki_cb.os.thread_id[p_pthread_info->task_id] = thread_id;
   /* Call the actual thread entry point */
   (p_pthread_info->task_entry)(p_pthread_info->params);
 
-  GKI_TRACE_ERROR_1("gki_task task_id=%i terminating", p_pthread_info->task_id);
+  LOG(ERROR) << StringPrintf("gki_task task_id=%i terminating",
+                             p_pthread_info->task_id);
   gki_cb.os.thread_id[p_pthread_info->task_id] = 0;
 
-  return;
+  return NULL;
 }
 /* end android */
 
-#ifndef ANDROID
-void GKI_TRACE(char* fmt, ...) {
-  LOCK(gki_cb.os.GKI_trace_mutex);
-  va_list ap;
-
-  va_start(ap, fmt);
-  vfprintf(stderr, fmt, ap);
-  fprintf(stderr, "\n");
-
-  va_end(ap);
-  UNLOCK(gki_cb.os.GKI_trace_mutex);
-}
-#endif
-
 /*******************************************************************************
 **
 ** Function         GKI_init
@@ -147,7 +131,7 @@
 #endif
   p_os = &gki_cb.os;
   pthread_mutex_init(&p_os->GKI_mutex, &attr);
-/* pthread_mutex_init(&GKI_sched_mutex, NULL); */
+  /* pthread_mutex_init(&GKI_sched_mutex, NULL); */
   /* pthread_mutex_init(&thread_delay_mutex, NULL); */ /* used in GKI_delay */
   /* pthread_cond_init (&thread_delay_cond, NULL); */
 
@@ -200,8 +184,6 @@
 uint8_t GKI_create_task(TASKPTR task_entry, uint8_t task_id, int8_t* taskname,
                         uint16_t* stack, uint16_t stacksize, void* pCondVar,
                         void* pMutex) {
-  uint16_t i;
-  uint8_t* p;
   struct sched_param param;
   int policy, ret = 0;
   pthread_condattr_t attr;
@@ -209,12 +191,13 @@
 
   pthread_condattr_init(&attr);
   pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
-  GKI_TRACE_5(
-      "GKI_create_task func=0x%x  id=%d  name=%s  stack=0x%x  stackSize=%d",
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "GKI_create_task func=0x%p  id=%d  name=%s  stack=0x%p  stackSize=%d",
       task_entry, task_id, taskname, stack, stacksize);
 
   if (task_id >= GKI_MAX_TASKS) {
-    GKI_TRACE_0("Error! task ID > max task allowed");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Error! task ID > max task allowed");
     return (GKI_FAILURE);
   }
 
@@ -234,10 +217,11 @@
 #if (FALSE == GKI_PTHREAD_JOINABLE)
   pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
 
-  GKI_TRACE_3("GKI creating task %i, pCond/pMutex=%x/%x", task_id, pCondVar,
-              pMutex);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "GKI creating task %i, pCond/pMutex=%p/%p", task_id, pCondVar, pMutex);
 #else
-  GKI_TRACE_1("GKI creating JOINABLE task %i", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI creating JOINABLE task %i", task_id);
 #endif
 
   /* On Android, the new tasks starts running before
@@ -250,11 +234,12 @@
   gki_pthread_info[task_id].pCond = (pthread_cond_t*)pCondVar;
   gki_pthread_info[task_id].pMutex = (pthread_mutex_t*)pMutex;
 
-  ret = pthread_create(&gki_cb.os.thread_id[task_id], &attr1,
-                       (void*)gki_task_entry, &gki_pthread_info[task_id]);
+  ret = pthread_create(&gki_cb.os.thread_id[task_id], &attr1, gki_task_entry,
+                       &gki_pthread_info[task_id]);
 
   if (ret != 0) {
-    GKI_TRACE_2("pthread_create failed(%d), %s!", ret, taskname);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("pthread_create failed(%d), %s!", ret, taskname);
     return GKI_FAILURE;
   }
 
@@ -262,7 +247,8 @@
       0) {
 #if (PBS_SQL_TASK == TRUE)
     if (task_id == PBS_SQL_TASK) {
-      GKI_TRACE_0("PBS SQL lowest priority task");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("PBS SQL lowest priority task");
       policy = SCHED_NORMAL;
     } else
 #endif
@@ -273,8 +259,9 @@
     pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, &param);
   }
 
-  GKI_TRACE_6("Leaving GKI_create_task %x %d %x %s %x %d", task_entry, task_id,
-              gki_cb.os.thread_id[task_id], taskname, stack, stacksize);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Leaving GKI_create_task %p %d %lx %s %p %d", task_entry, task_id,
+      gki_cb.os.thread_id[task_id], taskname, stack, stacksize);
 
   return (GKI_SUCCESS);
 }
@@ -293,8 +280,8 @@
 *******************************************************************************/
 #define WAKE_LOCK_ID "brcm_nfca"
 #define PARTIAL_WAKE_LOCK 1
-extern int acquire_wake_lock(int lock, const char* id);
-extern int release_wake_lock(const char* id);
+extern "C" int acquire_wake_lock(int lock, const char* id);
+extern "C" int release_wake_lock(const char* id);
 
 void GKI_shutdown(void) {
   uint8_t task_id;
@@ -328,10 +315,12 @@
       /* wait for proper Arnold Schwarzenegger task state */
       result = pthread_join(gki_cb.os.thread_id[task_id - 1], NULL);
       if (result < 0) {
-        GKI_TRACE_1("pthread_join() FAILED: result: %d", result);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("FAILED: result: %d", result);
       }
 #endif
-      GKI_TRACE_1("GKI_shutdown(): task %s dead", gki_cb.com.OSTName[task_id]);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("task %s dead", gki_cb.com.OSTName[task_id]);
       GKI_exit_task(task_id - 1);
     }
   }
@@ -349,7 +338,8 @@
   shutdown_timer = 1;
 #endif
   if (gki_cb.os.gki_timer_wake_lock_on) {
-    GKI_TRACE_0("GKI_shutdown :  release_wake_lock(brcm_btld)");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("GKI_shutdown :  release_wake_lock(brcm_btld)");
     release_wake_lock(WAKE_LOCK_ID);
     gki_cb.os.gki_timer_wake_lock_on = 0;
   }
@@ -373,7 +363,9 @@
 void gki_system_tick_start_stop_cback(bool start) {
   tGKI_OS* p_os = &gki_cb.os;
   volatile int* p_run_cond = &p_os->no_timer_suspend;
+#ifdef GKI_TICK_TIMER_DEBUG
   static volatile int wake_lock_count;
+#endif
   if (start == false) {
     /* this can lead to a race condition. however as we only read this variable
      * in the timer loop
@@ -383,9 +375,8 @@
     *p_run_cond = GKI_TIMER_TICK_STOP_COND;
 /* GKI_enable(); */
 #ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> STOP GKI_timer_update(), wake_lock_count:%d",
-               --wake_lock_count);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf(">>> STOP wake_lock_count:%d", --wake_lock_count);
 #endif
     release_wake_lock(WAKE_LOCK_ID);
     gki_cb.os.gki_timer_wake_lock_on = 0;
@@ -399,9 +390,8 @@
     pthread_mutex_unlock(&p_os->gki_timer_mutex);
 
 #ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> START GKI_timer_update(), wake_lock_count:%d",
-               ++wake_lock_count);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf(">>> START wake_lock_count:%d", ++wake_lock_count);
 #endif
   }
 }
@@ -419,7 +409,7 @@
 *******************************************************************************/
 #ifdef NO_GKI_RUN_RETURN
 void timer_thread(signed long id) {
-  GKI_TRACE_1("%s enter", __func__);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s enter", __func__);
   struct timespec delay;
   int timeout = 1000; /* 10  ms per system tick  */
   int err;
@@ -436,7 +426,7 @@
 
     GKI_timer_update(1);
   }
-  GKI_TRACE_ERROR_1("%s exit", __func__);
+  LOG(ERROR) << StringPrintf("%s exit", __func__);
   return;
 }
 #endif
@@ -456,8 +446,8 @@
 **                  one step, If your OS does it in one step, this function
 **                  should be empty.
 *******************************************************************************/
-void GKI_run(void* p_task_id) {
-  GKI_TRACE_1("%s enter", __func__);
+void GKI_run(__attribute__((unused)) void* p_task_id) {
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s enter", __func__);
   struct timespec delay;
   int err = 0;
   volatile int* p_run_cond = &gki_cb.os.no_timer_suspend;
@@ -467,11 +457,13 @@
    * timers are
    * in any GKI/BTA/BTU this should save power when BTLD is idle! */
   GKI_timer_queue_register_callback(gki_system_tick_start_stop_cback);
-  APPL_TRACE_DEBUG0("GKI_run(): Start/Stop GKI_timer_update_registered!");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Start/Stop GKI_timer_update_registered!");
 #endif
 
 #ifdef NO_GKI_RUN_RETURN
-  GKI_TRACE_0("GKI_run == NO_GKI_RUN_RETURN");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_run == NO_GKI_RUN_RETURN");
   pthread_attr_t timer_attr;
 
   shutdown_timer = 0;
@@ -479,11 +471,13 @@
   pthread_attr_init(&timer_attr);
   pthread_attr_setdetachstate(&timer_attr, PTHREAD_CREATE_DETACHED);
   if (pthread_create(&timer_thread_id, &timer_attr, timer_thread, NULL) != 0) {
-    GKI_TRACE_0("GKI_run: pthread_create failed to create timer_thread!");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "GKI_run: pthread_create failed to create timer_thread!");
     return GKI_FAILURE;
   }
 #else
-  GKI_TRACE_2("GKI_run, run_cond(%x)=%d ", p_run_cond, *p_run_cond);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_run, run_cond(%p)=%d ", p_run_cond, *p_run_cond);
   for (; GKI_TIMER_TICK_EXIT_COND != *p_run_cond;) {
     do {
       /* adjust hear bit tick in btld by changning TICKS_PER_SEC!!!!! this
@@ -504,33 +498,28 @@
        * e.g. power saving you may want to provide more ticks
        */
       GKI_timer_update(1);
-      /* BT_TRACE_2( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, "update: tv_sec: %d,
-       * tv_nsec: %d", delay.tv_sec, delay.tv_nsec ); */
     } while (GKI_TIMER_TICK_RUN_COND == *p_run_cond);
 
 /* currently on reason to exit above loop is no_timer_suspend ==
  * GKI_TIMER_TICK_STOP_COND
  * block timer main thread till re-armed by  */
 #ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> SUSPENDED GKI_timer_update()");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(">>> SUSPENDED");
 #endif
     if (GKI_TIMER_TICK_EXIT_COND != *p_run_cond) {
-      GKI_TRACE_1("%s waiting timer mutex", __func__);
       pthread_mutex_lock(&gki_cb.os.gki_timer_mutex);
       pthread_cond_wait(&gki_cb.os.gki_timer_cond, &gki_cb.os.gki_timer_mutex);
       pthread_mutex_unlock(&gki_cb.os.gki_timer_mutex);
-      GKI_TRACE_1("%s exited timer mutex", __func__);
     }
 /* potentially we need to adjust os gki_cb.com.OSTicks */
 
 #ifdef GKI_TICK_TIMER_DEBUG
-    BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-               ">>> RESTARTED GKI_timer_update(): run_cond: %d", *p_run_cond);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf(">>> RESTARTED run_cond: %d", *p_run_cond);
 #endif
   } /* for */
 #endif
-  GKI_TRACE_1("%s exit", __func__);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s exit", __func__);
 }
 
 /*******************************************************************************
@@ -584,18 +573,18 @@
   int nano_sec;
 
   rtask = GKI_get_taskid();
-  GKI_TRACE_3("GKI_wait %d %x %d", rtask, flag, timeout);
   if (rtask >= GKI_MAX_TASKS) {
-    GKI_TRACE_ERROR_3("%s() Exiting thread; rtask %d >= %d", __func__, rtask,
-                      GKI_MAX_TASKS);
+    LOG(ERROR) << StringPrintf("%s() Exiting thread; rtask %d >= %d", __func__,
+                               rtask, GKI_MAX_TASKS);
     return EVENT_MASK(GKI_SHUTDOWN_EVT);
   }
 
   gki_pthread_info_t* p_pthread_info = &gki_pthread_info[rtask];
   if (p_pthread_info->pCond != NULL && p_pthread_info->pMutex != NULL) {
     int ret;
-    GKI_TRACE_3("GKI_wait task=%i, pCond/pMutex = %x/%x", rtask,
-                p_pthread_info->pCond, p_pthread_info->pMutex);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("GKI_wait task=%i, pCond/pMutex = %p/%p", rtask,
+                        p_pthread_info->pCond, p_pthread_info->pMutex);
     ret = pthread_mutex_lock(p_pthread_info->pMutex);
     ret = pthread_cond_signal(p_pthread_info->pCond);
     ret = pthread_mutex_unlock(p_pthread_info->pMutex);
@@ -674,7 +663,8 @@
       /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock when cond
        * is met */
       pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
-      GKI_TRACE_ERROR_1("GKI TASK_DEAD received. exit thread %d...", rtask);
+      LOG(ERROR) << StringPrintf("GKI TASK_DEAD received. exit thread %d...",
+                                 rtask);
 
       gki_cb.os.thread_id[rtask] = 0;
       return (EVENT_MASK(GKI_SHUTDOWN_EVT));
@@ -693,8 +683,6 @@
   /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock mutex when
    * cond is met */
   pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
-  GKI_TRACE_4("GKI_wait %d %x %d %x resumed", rtask, flag, timeout, evt);
-
   return (evt);
 }
 
@@ -717,7 +705,8 @@
   struct timespec delay;
   int err;
 
-  GKI_TRACE_2("GKI_delay %d %d", rtask, timeout);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_delay %d %d", rtask, timeout);
 
   delay.tv_sec = timeout / 1000;
   delay.tv_nsec = 1000 * 1000 * (timeout % 1000);
@@ -736,7 +725,8 @@
   if (rtask && gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD) {
   }
 
-  GKI_TRACE_2("GKI_delay %d %d done", rtask, timeout);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_delay %d %d done", rtask, timeout);
   return;
 }
 
@@ -756,8 +746,6 @@
 **
 *******************************************************************************/
 uint8_t GKI_send_event(uint8_t task_id, uint16_t event) {
-  GKI_TRACE_2("GKI_send_event %d %x", task_id, event);
-
   /* use efficient coding to avoid pipeline stalls */
   if (task_id < GKI_MAX_TASKS) {
     /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
@@ -770,7 +758,6 @@
 
     pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[task_id]);
 
-    GKI_TRACE_2("GKI_send_event %d %x done", task_id, event);
     return (GKI_SUCCESS);
   }
   return (GKI_FAILURE);
@@ -797,8 +784,10 @@
 **
 *******************************************************************************/
 uint8_t GKI_isend_event(uint8_t task_id, uint16_t event) {
-  GKI_TRACE_2("GKI_isend_event %d %x", task_id, event);
-  GKI_TRACE_2("GKI_isend_event %d %x done", task_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_isend_event %d %x", task_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_isend_event %d %x done", task_id, event);
   return GKI_send_event(task_id, event);
 }
 
@@ -818,17 +807,12 @@
 *******************************************************************************/
 uint8_t GKI_get_taskid(void) {
   int i;
-
   pthread_t thread_id = pthread_self();
   for (i = 0; i < GKI_MAX_TASKS; i++) {
     if (gki_cb.os.thread_id[i] == thread_id) {
-      GKI_TRACE_2("GKI_get_taskid %x %d done", thread_id, i);
       return (i);
     }
   }
-
-  GKI_TRACE_1("GKI_get_taskid: thread id = %x, task id = -1", thread_id);
-
   return (-1);
 }
 
@@ -850,11 +834,12 @@
 **
 *******************************************************************************/
 int8_t* GKI_map_taskname(uint8_t task_id) {
-  GKI_TRACE_1("GKI_map_taskname %d", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_map_taskname %d", task_id);
 
   if (task_id < GKI_MAX_TASKS) {
-    GKI_TRACE_2("GKI_map_taskname %d %s done", task_id,
-                gki_cb.com.OSTName[task_id]);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "GKI_map_taskname %d %s done", task_id, gki_cb.com.OSTName[task_id]);
     return (gki_cb.com.OSTName[task_id]);
   } else if (task_id == GKI_MAX_TASKS) {
     return (gki_cb.com.OSTName[GKI_get_taskid()]);
@@ -873,11 +858,9 @@
 **
 *******************************************************************************/
 void GKI_enable(void) {
-  GKI_TRACE_0("GKI_enable");
   pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
   /* 	pthread_mutex_xx is nesting save, no need for this: already_disabled =
    * 0; */
-  GKI_TRACE_0("Leaving GKI_enable");
   return;
 }
 
@@ -892,14 +875,16 @@
 *******************************************************************************/
 
 void GKI_disable(void) {
-  // GKI_TRACE_0("GKI_disable");
+  // DLOG_IF(INFO, nfc_debug_enabled) <<
+  // StringPrintf("GKI_disable");
 
   /*	pthread_mutex_xx is nesting save, no need for this: if
      (!already_disabled) {
       already_disabled = 1; */
   pthread_mutex_lock(&gki_cb.os.GKI_mutex);
   /*  } */
-  // GKI_TRACE_0("Leaving GKI_disable");
+  // DLOG_IF(INFO, nfc_debug_enabled) <<
+  // StringPrintf("Leaving GKI_disable");
   return;
 }
 
@@ -917,26 +902,25 @@
 **
 *******************************************************************************/
 
-void GKI_exception(uint16_t code, char* msg) {
+void GKI_exception(uint16_t code, std::string msg) {
   uint8_t task_id;
-  int i = 0;
 
-  GKI_TRACE_ERROR_0("GKI_exception(): Task State Table");
+  LOG(ERROR) << StringPrintf("Task State Table");
 
   for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++) {
-    GKI_TRACE_ERROR_3("TASK ID [%d] task name [%s] state [%d]", task_id,
-                      gki_cb.com.OSTName[task_id],
-                      gki_cb.com.OSRdyTbl[task_id]);
+    LOG(ERROR) << StringPrintf("TASK ID [%d] task name [%s] state [%d]",
+                               task_id, gki_cb.com.OSTName[task_id],
+                               gki_cb.com.OSRdyTbl[task_id]);
   }
 
-  GKI_TRACE_ERROR_2("GKI_exception %d %s", code, msg);
-  GKI_TRACE_ERROR_0(
+  LOG(ERROR) << StringPrintf("%d %s", code, msg.c_str());
+  LOG(ERROR) << StringPrintf(
       "********************************************************************");
-  GKI_TRACE_ERROR_2("* GKI_exception(): %d %s", code, msg);
-  GKI_TRACE_ERROR_0(
+  LOG(ERROR) << StringPrintf("* %d %s", code, msg.c_str());
+  LOG(ERROR) << StringPrintf(
       "********************************************************************");
 
-  GKI_TRACE_ERROR_2("GKI_exception %d %s done", code, msg);
+  LOG(ERROR) << StringPrintf("%d %s done", code, msg.c_str());
 
   return;
 }
@@ -1064,9 +1048,11 @@
 **
 *******************************************************************************/
 uint8_t GKI_suspend_task(uint8_t task_id) {
-  GKI_TRACE_1("GKI_suspend_task %d - NOT implemented", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_suspend_task %d - NOT implemented", task_id);
 
-  GKI_TRACE_1("GKI_suspend_task %d done", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_suspend_task %d done", task_id);
 
   return (GKI_SUCCESS);
 }
@@ -1087,9 +1073,11 @@
 **
 *******************************************************************************/
 uint8_t GKI_resume_task(uint8_t task_id) {
-  GKI_TRACE_1("GKI_resume_task %d - NOT implemented", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_resume_task %d - NOT implemented", task_id);
 
-  GKI_TRACE_1("GKI_resume_task %d done", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_resume_task %d done", task_id);
 
   return (GKI_SUCCESS);
 }
@@ -1110,6 +1098,9 @@
 **
 *******************************************************************************/
 void GKI_exit_task(uint8_t task_id) {
+  if (task_id >= GKI_MAX_TASKS) {
+    return;
+  }
   GKI_disable();
   gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD;
 
@@ -1123,7 +1114,8 @@
 
   // GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
 
-  GKI_TRACE_1("GKI_exit_task %d done", task_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("GKI_exit_task %d done", task_id);
   return;
 }
 
@@ -1142,7 +1134,7 @@
 **
 *******************************************************************************/
 void GKI_sched_lock(void) {
-  GKI_TRACE_0("GKI_sched_lock");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("GKI_sched_lock");
   GKI_disable();
   return;
 }
@@ -1162,7 +1154,7 @@
 **
 *******************************************************************************/
 void GKI_sched_unlock(void) {
-  GKI_TRACE_0("GKI_sched_unlock");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("GKI_sched_unlock");
   GKI_enable();
 }
 
@@ -1174,9 +1166,9 @@
 **
 *******************************************************************************/
 void GKI_shiftdown(uint8_t* p_mem, uint32_t len, uint32_t shift_amount) {
-  register uint8_t* ps = p_mem + len - 1;
-  register uint8_t* pd = ps + shift_amount;
-  register uint32_t xx;
+  uint8_t* ps = p_mem + len - 1;
+  uint8_t* pd = ps + shift_amount;
+  uint32_t xx;
 
   for (xx = 0; xx < len; xx++) *pd-- = *ps--;
 }
@@ -1189,9 +1181,9 @@
 **
 *******************************************************************************/
 void GKI_shiftup(uint8_t* p_dest, uint8_t* p_src, uint32_t len) {
-  register uint8_t* ps = p_src;
-  register uint8_t* pd = p_dest;
-  register uint32_t xx;
+  uint8_t* ps = p_src;
+  uint8_t* pd = p_dest;
+  uint32_t xx;
 
   for (xx = 0; xx < len; xx++) *pd++ = *ps++;
 }
diff --git a/src/hal/include/nfc_hal_api.h b/src/hal/include/nfc_hal_api.h
deleted file mode 100644
index e19a8c5..0000000
--- a/src/hal/include/nfc_hal_api.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  NFC Hardware Abstraction Layer API
- *
- ******************************************************************************/
-#ifndef NFC_HAL_API_H
-#define NFC_HAL_API_H
-#include <hardware/nfc.h>
-#include "data_types.h"
-#include "nfc_hal_target.h"
-
-/*******************************************************************************
-** tHAL_HCI_NETWK_CMD Definitions
-*******************************************************************************/
-#define HAL_NFC_HCI_NO_UICC_HOST 0x00
-#define HAL_NFC_HCI_UICC0_HOST 0x01
-#define HAL_NFC_HCI_UICC1_HOST 0x02
-#define HAL_NFC_HCI_UICC2_HOST 0x04
-
-typedef uint8_t tHAL_NFC_STATUS;
-typedef void(tHAL_NFC_STATUS_CBACK)(tHAL_NFC_STATUS status);
-typedef void(tHAL_NFC_CBACK)(uint8_t event, tHAL_NFC_STATUS status);
-typedef void(tHAL_NFC_DATA_CBACK)(uint16_t data_len, uint8_t* p_data);
-
-/*******************************************************************************
-** tHAL_NFC_ENTRY HAL entry-point lookup table
-*******************************************************************************/
-
-typedef void(tHAL_API_INITIALIZE)(void);
-typedef void(tHAL_API_TERMINATE)(void);
-typedef void(tHAL_API_OPEN)(tHAL_NFC_CBACK* p_hal_cback,
-                            tHAL_NFC_DATA_CBACK* p_data_cback);
-typedef void(tHAL_API_CLOSE)(void);
-typedef void(tHAL_API_CORE_INITIALIZED)(uint16_t data_len,
-                                        uint8_t* p_core_init_rsp_params);
-typedef void(tHAL_API_WRITE)(uint16_t data_len, uint8_t* p_data);
-typedef bool(tHAL_API_PREDISCOVER)(void);
-typedef void(tHAL_API_CONTROL_GRANTED)(void);
-typedef void(tHAL_API_POWER_CYCLE)(void);
-typedef uint8_t(tHAL_API_GET_MAX_NFCEE)(void);
-
-#define NFC_HAL_DM_PRE_SET_MEM_LEN 5
-typedef struct {
-  uint32_t addr;
-  uint32_t data;
-} tNFC_HAL_DM_PRE_SET_MEM;
-
-/* data members for NFC_HAL-HCI */
-typedef struct {
-  bool nfc_hal_prm_nvm_required; /* set nfc_hal_prm_nvm_required to TRUE, if the
-                                    platform wants to abort PRM process without
-                                    NVM */
-  uint16_t nfc_hal_nfcc_enable_timeout; /* max time to wait for RESET NTF after
-                                           setting REG_PU to high */
-  uint16_t nfc_hal_post_xtal_timeout;   /* max time to wait for RESET NTF after
-                                           setting Xtal frequency */
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  bool nfc_hal_first_boot; /* set nfc_hal_first_boot to TRUE, if platform
-                              enables NFC for the first time after bootup */
-  uint8_t nfc_hal_hci_uicc_support; /* set nfc_hal_hci_uicc_support to Zero, if
-                                       no UICC is supported otherwise set
-                                       corresponding bit(s) for every supported
-                                       UICC(s) */
-#endif
-} tNFC_HAL_CFG;
-
-typedef struct {
-  tHAL_API_INITIALIZE* initialize;
-  tHAL_API_TERMINATE* terminate;
-  tHAL_API_OPEN* open;
-  tHAL_API_CLOSE* close;
-  tHAL_API_CORE_INITIALIZED* core_initialized;
-  tHAL_API_WRITE* write;
-  tHAL_API_PREDISCOVER* prediscover;
-  tHAL_API_CONTROL_GRANTED* control_granted;
-  tHAL_API_POWER_CYCLE* power_cycle;
-  tHAL_API_GET_MAX_NFCEE* get_max_ee;
-
-} tHAL_NFC_ENTRY;
-
-/*******************************************************************************
-** HAL API Function Prototypes
-*******************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************************************************
-**
-** Function         HAL_NfcInitialize
-**
-** Description      Called when HAL library is loaded.
-**
-**                  Initialize GKI and start the HCIT task
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcInitialize(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcTerminate
-**
-** Description      Called to terminate NFC HAL
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcTerminate(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcOpen
-**
-** Description      Open transport and intialize the NFCC, and
-**                  Register callback for HAL event notifications,
-**
-**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcOpen(tHAL_NFC_CBACK* p_hal_cback,
-                 tHAL_NFC_DATA_CBACK* p_data_cback);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcClose
-**
-** Description      Prepare for shutdown. A HAL_CLOSE_CPLT_EVT will be
-**                  reported when complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcClose(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcCoreInitialized
-**
-** Description      Called after the CORE_INIT_RSP is received from the NFCC.
-**                  At this time, the HAL can do any chip-specific
-**                  configuration, and when finished signal the libnfc-nci with
-**                  event HAL_POST_INIT_CPLT_EVT.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcCoreInitialized(uint16_t data_len, uint8_t* p_core_init_rsp_params);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcWrite
-**
-** Description      Send an NCI control message or data packet to the
-**                  transport. If an NCI command message exceeds the transport
-**                  size, HAL is responsible for fragmenting it, Data packets
-**                  must be of the correct size.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcWrite(uint16_t data_len, uint8_t* p_data);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPreDiscover
-**
-** Description      Perform any vendor-specific pre-discovery actions (if
-**                  needed). If any actions were performed TRUE will be
-**                  returned, and HAL_PRE_DISCOVER_CPLT_EVT will notify when
-**                  actions are completed.
-**
-** Returns          TRUE if vendor-specific pre-discovery actions initialized
-**                  FALSE if no vendor-specific pre-discovery actions are
-**                  needed.
-**
-*******************************************************************************/
-bool HAL_NfcPreDiscover(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcControlGranted
-**
-** Description      Grant control to HAL control for sending NCI commands.
-**
-**                  Call in response to HAL_REQUEST_CONTROL_EVT.
-**
-**                  Must only be called when there are no NCI commands pending.
-**
-**                  HAL_RELEASE_CONTROL_EVT will notify when HAL no longer
-**                  needs control of NCI.
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcControlGranted(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPowerCycle
-**
-** Description      Restart NFCC by power cyle
-**
-**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcPowerCycle(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcGetMaxNfcee
-**
-** Description      Retrieve the maximum number of NFCEEs supported by NFCC
-**
-** Returns          the maximum number of NFCEEs supported by NFCC
-**
-*******************************************************************************/
-uint8_t HAL_NfcGetMaxNfcee(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* NFC_HAL_API_H  */
diff --git a/src/hal/include/nfc_hal_target.h b/src/hal/include/nfc_hal_target.h
deleted file mode 100644
index 4bb66e6..0000000
--- a/src/hal/include/nfc_hal_target.h
+++ /dev/null
@@ -1,437 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#ifndef NFC_HAL_TARGET_H
-#define NFC_HAL_TARGET_H
-
-#include "data_types.h"
-#include "gki.h"
-
-/****************************************************************************
-** NCI related configuration
-****************************************************************************/
-
-/* Initial Max Control Packet Payload Size (until receiving payload size in
- * INIT_CORE_RSP) */
-#ifndef NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE
-#define NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE 0xFF
-#endif
-
-/* Number of bytes to reserve in front of NCI messages (e.g. for transport
- * header) */
-#ifndef NFC_HAL_NCI_MSG_OFFSET_SIZE
-#define NFC_HAL_NCI_MSG_OFFSET_SIZE 1
-#endif
-
-/* NFC-WAKE */
-#ifndef NFC_HAL_LP_NFC_WAKE_GPIO
-#define NFC_HAL_LP_NFC_WAKE_GPIO UPIO_GENERAL3
-#endif
-
-/* NFCC snooze mode idle timeout before deassert NFC_WAKE in ms */
-#ifndef NFC_HAL_LP_IDLE_TIMEOUT
-#define NFC_HAL_LP_IDLE_TIMEOUT 100
-#endif
-
-/* NFC snooze mode */
-#ifndef NFC_HAL_LP_SNOOZE_MODE
-#define NFC_HAL_LP_SNOOZE_MODE NFC_HAL_LP_SNOOZE_MODE_UART
-#endif
-
-/* Idle Threshold Host in 100ms unit */
-#ifndef NFC_HAL_LP_IDLE_THRESHOLD_HOST
-#define NFC_HAL_LP_IDLE_THRESHOLD_HOST 0
-#endif
-
-/* Idle Threshold HC in 100ms unit */
-#ifndef NFC_HAL_LP_IDLE_THRESHOLD_HC
-#define NFC_HAL_LP_IDLE_THRESHOLD_HC 0
-#endif
-
-/* Default NFCC power-up baud rate */
-#ifndef NFC_HAL_DEFAULT_BAUD
-#define NFC_HAL_DEFAULT_BAUD USERIAL_BAUD_115200
-#endif
-
-/* time (in ms) between power off and on NFCC */
-#ifndef NFC_HAL_POWER_CYCLE_DELAY
-#define NFC_HAL_POWER_CYCLE_DELAY 100
-#endif
-
-/* time (in ms) between power off and on NFCC */
-#ifndef NFC_HAL_NFCC_ENABLE_TIMEOUT
-#define NFC_HAL_NFCC_ENABLE_TIMEOUT 1000
-#endif
-
-#ifndef NFC_HAL_PRM_DEBUG
-#define NFC_HAL_PRM_DEBUG TRUE
-#endif
-
-/* max patch data length (Can be overridden by platform for ACL HCI command
- * size) */
-#ifndef NFC_HAL_PRM_HCD_CMD_MAXLEN
-#define NFC_HAL_PRM_HCD_CMD_MAXLEN 250
-#endif
-
-/* Require PreI2C patch by default */
-#ifndef NFC_HAL_PRE_I2C_PATCH_INCLUDED
-#define NFC_HAL_PRE_I2C_PATCH_INCLUDED TRUE
-#endif
-
-/* Mininum payload size for SPD NCI commands (used to validate
- * HAL_NfcPrmSetSpdNciCmdPayloadSize) */
-/* Default is 32, as required by the NCI specifications; however this value may
- * be          */
-/* over-riden for platforms that have transport packet limitations */
-#ifndef NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE
-#define NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE (32)
-#endif
-
-/* amount of time to wait for authenticating/committing patch to NVM */
-#ifndef NFC_HAL_PRM_COMMIT_DELAY
-#define NFC_HAL_PRM_COMMIT_DELAY (30000)
-#endif
-
-/* amount of time to wait after downloading preI2C patch before downloading
- * LPM/FPM patch */
-#ifndef NFC_HAL_PRM_POST_I2C_FIX_DELAY
-#define NFC_HAL_PRM_POST_I2C_FIX_DELAY (200)
-#endif
-
-/* NFCC will respond to more than one technology during listen discovery  */
-#ifndef NFC_HAL_DM_MULTI_TECH_RESP
-#define NFC_HAL_DM_MULTI_TECH_RESP TRUE
-#endif
-
-/* Data rate for 15693 command/response, it must be same as
- * RW_I93_FLAG_DATA_RATE in nfc_target.h */
-#define NFC_HAL_I93_FLAG_DATA_RATE_LOW 0x00
-#define NFC_HAL_I93_FLAG_DATA_RATE_HIGH 0x02
-
-#ifndef NFC_HAL_I93_FLAG_DATA_RATE
-#define NFC_HAL_I93_FLAG_DATA_RATE NFC_HAL_I93_FLAG_DATA_RATE_HIGH
-#endif
-
-/* NFC HAL HCI */
-#ifndef NFC_HAL_HCI_INCLUDED
-#define NFC_HAL_HCI_INCLUDED TRUE
-#endif
-
-/* Quick Timer */
-#ifndef QUICK_TIMER_TICKS_PER_SEC
-#define QUICK_TIMER_TICKS_PER_SEC 100 /* 10ms timer */
-#endif
-
-#ifndef NFC_HAL_SHARED_TRANSPORT_ENABLED
-#define NFC_HAL_SHARED_TRANSPORT_ENABLED FALSE
-#endif
-
-/* Enable verbose tracing by default */
-#ifndef NFC_HAL_TRACE_VERBOSE
-#define NFC_HAL_TRACE_VERBOSE TRUE
-#endif
-
-#ifndef NFC_HAL_INITIAL_TRACE_LEVEL
-#define NFC_HAL_INITIAL_TRACE_LEVEL 5
-#endif
-
-/* Map NFC serial port to USERIAL_PORT_6 by default */
-#ifndef USERIAL_NFC_PORT
-#define USERIAL_NFC_PORT (USERIAL_PORT_6)
-#endif
-
-/* Restore NFCC baud rate to default on shutdown if baud rate was updated */
-#ifndef NFC_HAL_RESTORE_BAUD_ON_SHUTDOWN
-#define NFC_HAL_RESTORE_BAUD_ON_SHUTDOWN TRUE
-#endif
-
-/* Enable protocol tracing by default */
-#ifndef NFC_HAL_TRACE_PROTOCOL
-#define NFC_HAL_TRACE_PROTOCOL TRUE
-#endif
-
-/* Legacy protocol-trace-enable macro */
-#ifndef BT_TRACE_PROTOCOL
-#define BT_TRACE_PROTOCOL (NFC_HAL_TRACE_PROTOCOL)
-#endif
-
-/* Enable HAL tracing by default */
-#ifndef NFC_HAL_USE_TRACES
-#define NFC_HAL_USE_TRACES TRUE
-#endif
-
-/* HAL trace macros */
-#if (NFC_HAL_USE_TRACES == TRUE)
-#define NCI_TRACE_0(l, t, m) \
-  LogMsg((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), (m))
-#define NCI_TRACE_1(l, t, m, p1) \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), (uintptr_t)(p1))
-#define NCI_TRACE_2(l, t, m, p1, p2)                            \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-         (uintptr_t)(p1), (uintptr_t)(p2))
-#define NCI_TRACE_3(l, t, m, p1, p2, p3)                        \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-         (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3))
-#define NCI_TRACE_4(l, t, m, p1, p2, p3, p4)                    \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-         (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4))
-#define NCI_TRACE_5(l, t, m, p1, p2, p3, p4, p5)                             \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m),              \
-         (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4), \
-         (uintptr_t)(p5))
-#define NCI_TRACE_6(l, t, m, p1, p2, p3, p4, p5, p6)                         \
-  LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m),              \
-         (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4), \
-         (uintptr_t)(p5), (uintptr_t)(p6))
-
-#define HAL_TRACE_ERROR0(m)                              \
-  {                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)  \
-      NCI_TRACE_0(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m); \
-  }
-#define HAL_TRACE_ERROR1(m, p1)                              \
-  {                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)      \
-      NCI_TRACE_1(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define HAL_TRACE_ERROR2(m, p1, p2)                              \
-  {                                                              \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)          \
-      NCI_TRACE_2(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define HAL_TRACE_ERROR3(m, p1, p2, p3)                              \
-  {                                                                  \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)              \
-      NCI_TRACE_3(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define HAL_TRACE_ERROR4(m, p1, p2, p3, p4)                              \
-  {                                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                  \
-      NCI_TRACE_4(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define HAL_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                              \
-  {                                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                      \
-      NCI_TRACE_5(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define HAL_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                         \
-  {                                                                         \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      NCI_TRACE_6(TRACE_LAYER_HAL, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                  p6);                                                      \
-  }
-
-#define HAL_TRACE_WARNING0(m)                              \
-  {                                                        \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)  \
-      NCI_TRACE_0(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m); \
-  }
-#define HAL_TRACE_WARNING1(m, p1)                              \
-  {                                                            \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)      \
-      NCI_TRACE_1(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define HAL_TRACE_WARNING2(m, p1, p2)                              \
-  {                                                                \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)          \
-      NCI_TRACE_2(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define HAL_TRACE_WARNING3(m, p1, p2, p3)                              \
-  {                                                                    \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)              \
-      NCI_TRACE_3(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define HAL_TRACE_WARNING4(m, p1, p2, p3, p4)                              \
-  {                                                                        \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                  \
-      NCI_TRACE_4(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define HAL_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                              \
-  {                                                                            \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                      \
-      NCI_TRACE_5(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define HAL_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                         \
-  {                                                                           \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      NCI_TRACE_6(TRACE_LAYER_HAL, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                  p6);                                                        \
-  }
-
-#define HAL_TRACE_API0(m)                              \
-  {                                                    \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)  \
-      NCI_TRACE_0(TRACE_LAYER_HAL, TRACE_TYPE_API, m); \
-  }
-#define HAL_TRACE_API1(m, p1)                              \
-  {                                                        \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)      \
-      NCI_TRACE_1(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1); \
-  }
-#define HAL_TRACE_API2(m, p1, p2)                              \
-  {                                                            \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)          \
-      NCI_TRACE_2(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define HAL_TRACE_API3(m, p1, p2, p3)                              \
-  {                                                                \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)              \
-      NCI_TRACE_3(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define HAL_TRACE_API4(m, p1, p2, p3, p4)                              \
-  {                                                                    \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)                  \
-      NCI_TRACE_4(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define HAL_TRACE_API5(m, p1, p2, p3, p4, p5)                              \
-  {                                                                        \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)                      \
-      NCI_TRACE_5(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define HAL_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                              \
-  {                                                                            \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_API)                          \
-      NCI_TRACE_6(TRACE_LAYER_HAL, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define HAL_TRACE_EVENT0(m)                              \
-  {                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)  \
-      NCI_TRACE_0(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m); \
-  }
-#define HAL_TRACE_EVENT1(m, p1)                              \
-  {                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)      \
-      NCI_TRACE_1(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define HAL_TRACE_EVENT2(m, p1, p2)                              \
-  {                                                              \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)          \
-      NCI_TRACE_2(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define HAL_TRACE_EVENT3(m, p1, p2, p3)                              \
-  {                                                                  \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)              \
-      NCI_TRACE_3(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define HAL_TRACE_EVENT4(m, p1, p2, p3, p4)                              \
-  {                                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                  \
-      NCI_TRACE_4(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define HAL_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                              \
-  {                                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                      \
-      NCI_TRACE_5(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define HAL_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                         \
-  {                                                                         \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      NCI_TRACE_6(TRACE_LAYER_HAL, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                  p6);                                                      \
-  }
-
-#define HAL_TRACE_DEBUG0(m)                              \
-  {                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)  \
-      NCI_TRACE_0(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m); \
-  }
-#define HAL_TRACE_DEBUG1(m, p1)                              \
-  {                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)      \
-      NCI_TRACE_1(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define HAL_TRACE_DEBUG2(m, p1, p2)                              \
-  {                                                              \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)          \
-      NCI_TRACE_2(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define HAL_TRACE_DEBUG3(m, p1, p2, p3)                              \
-  {                                                                  \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)              \
-      NCI_TRACE_3(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define HAL_TRACE_DEBUG4(m, p1, p2, p3, p4)                              \
-  {                                                                      \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                  \
-      NCI_TRACE_4(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define HAL_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                              \
-  {                                                                          \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                      \
-      NCI_TRACE_5(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define HAL_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                         \
-  {                                                                         \
-    if (nfc_hal_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      NCI_TRACE_6(TRACE_LAYER_HAL, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                  p6);                                                      \
-  }
-
-#else /* Disable HAL tracing */
-
-#define HAL_TRACE_0(l, t, m)
-#define HAL_TRACE_1(l, t, m, p1)
-#define HAL_TRACE_2(l, t, m, p1, p2)
-#define HAL_TRACE_3(l, t, m, p1, p2, p3)
-#define HAL_TRACE_4(l, t, m, p1, p2, p3, p4)
-#define HAL_TRACE_5(l, t, m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_6(l, t, m, p1, p2, p3, p4, p5, p6)
-
-#define HAL_TRACE_ERROR0(m)
-#define HAL_TRACE_ERROR1(m, p1)
-#define HAL_TRACE_ERROR2(m, p1, p2)
-#define HAL_TRACE_ERROR3(m, p1, p2, p3)
-#define HAL_TRACE_ERROR4(m, p1, p2, p3, p4)
-#define HAL_TRACE_ERROR5(m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)
-
-#define HAL_TRACE_WARNING0(m)
-#define HAL_TRACE_WARNING1(m, p1)
-#define HAL_TRACE_WARNING2(m, p1, p2)
-#define HAL_TRACE_WARNING3(m, p1, p2, p3)
-#define HAL_TRACE_WARNING4(m, p1, p2, p3, p4)
-#define HAL_TRACE_WARNING5(m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)
-
-#define HAL_TRACE_API0(m)
-#define HAL_TRACE_API1(m, p1)
-#define HAL_TRACE_API2(m, p1, p2)
-#define HAL_TRACE_API3(m, p1, p2, p3)
-#define HAL_TRACE_API4(m, p1, p2, p3, p4)
-#define HAL_TRACE_API5(m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_API6(m, p1, p2, p3, p4, p5, p6)
-
-#define HAL_TRACE_EVENT0(m)
-#define HAL_TRACE_EVENT1(m, p1)
-#define HAL_TRACE_EVENT2(m, p1, p2)
-#define HAL_TRACE_EVENT3(m, p1, p2, p3)
-#define HAL_TRACE_EVENT4(m, p1, p2, p3, p4)
-#define HAL_TRACE_EVENT5(m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)
-
-#define HAL_TRACE_DEBUG0(m)
-#define HAL_TRACE_DEBUG1(m, p1)
-#define HAL_TRACE_DEBUG2(m, p1, p2)
-#define HAL_TRACE_DEBUG3(m, p1, p2, p3)
-#define HAL_TRACE_DEBUG4(m, p1, p2, p3, p4)
-#define HAL_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)
-#define HAL_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)
-#endif /* Disable HAL tracing */
-
-#endif /* GKI_TARGET_H */
diff --git a/src/hal/include/nfc_types.h b/src/hal/include/nfc_types.h
deleted file mode 100644
index 6ba5efc..0000000
--- a/src/hal/include/nfc_types.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-#ifndef NFC_TYPES_H
-#define NFC_TYPES_H
-
-/****************************************************************************
-** NFC_HDR header definition for NFC messages
-*****************************************************************************/
-typedef struct {
-  uint16_t event;
-  uint16_t len;
-  uint16_t offset;
-  uint16_t layer_specific;
-} NFC_HDR;
-#define NFC_HDR_SIZE (sizeof(NFC_HDR))
-
-/* Mask for NFC_HDR event field */
-#define NFC_EVT_MASK 0xFF00
-#define NFC_SUB_EVT_MASK 0x00FF
-
-/****************************************************************************
-** NFC_HAL_TASK  definitions
-*****************************************************************************/
-
-/* NFC_HAL_TASK event messages */
-/* NCI message for sending to NFCC          */
-#define NFC_HAL_EVT_TO_NFC_NCI 0x0100
-/* Request to start NCIT quick timer        */
-#define NFC_HAL_EVT_POST_CORE_RESET 0x0200
-/* Request to start chip-specific config    */
-#define NFC_HAL_EVT_TO_START_QUICK_TIMER 0x0300
-/* NCI message for hci persistency data     */
-#define NFC_HAL_EVT_HCI 0x0400
-/* NCI message to issue prediscover config  */
-#define NFC_HAL_EVT_PRE_DISCOVER 0x0500
-/* permission to send commands queued in HAL*/
-#define NFC_HAL_EVT_CONTROL_GRANTED 0x0600
-
-/* NFC_HAL_TASK sub event messages */
-#define NFC_HAL_HCI_RSP_NV_READ_EVT (0x01 | NFC_HAL_EVT_HCI)
-#define NFC_HAL_HCI_RSP_NV_WRITE_EVT (0x02 | NFC_HAL_EVT_HCI)
-#define NFC_HAL_HCI_VSC_TIMEOUT_EVT (0x03 | NFC_HAL_EVT_HCI)
-
-/* Event masks for NFC_TASK messages */
-/* NCI message for sending to host stack    */
-#define NFC_EVT_TO_NFC_NCI 0x4000
-/* Error notification to NFC Task           */
-#define NFC_EVT_TO_NFC_ERR 0x4100
-/* Messages between NFC and NCI task        */
-#define NFC_EVT_TO_NFC_MSGS 0x4200
-
-/*****************************************************************************
-** Macros to get and put bytes to and from a stream (Little Endian format).
-*****************************************************************************/
-
-#define UINT32_TO_STREAM(p, u32)     \
-  {                                  \
-    *(p)++ = (uint8_t)(u32);         \
-    *(p)++ = (uint8_t)((u32) >> 8);  \
-    *(p)++ = (uint8_t)((u32) >> 16); \
-    *(p)++ = (uint8_t)((u32) >> 24); \
-  }
-#define UINT24_TO_STREAM(p, u24)     \
-  {                                  \
-    *(p)++ = (uint8_t)(u24);         \
-    *(p)++ = (uint8_t)((u24) >> 8);  \
-    *(p)++ = (uint8_t)((u24) >> 16); \
-  }
-#define UINT16_TO_STREAM(p, u16)    \
-  {                                 \
-    *(p)++ = (uint8_t)(u16);        \
-    *(p)++ = (uint8_t)((u16) >> 8); \
-  }
-#define UINT8_TO_STREAM(p, u8) \
-  { *(p)++ = (uint8_t)(u8); }
-#define INT8_TO_STREAM(p, u8) \
-  { *(p)++ = (int8_t)(u8); }
-#define ARRAY32_TO_STREAM(p, a)                                   \
-  {                                                               \
-    register int ijk;                                             \
-    for (ijk = 0; ijk < 32; ijk++) *(p)++ = (uint8_t)a[31 - ijk]; \
-  }
-#define ARRAY16_TO_STREAM(p, a)                                   \
-  {                                                               \
-    register int ijk;                                             \
-    for (ijk = 0; ijk < 16; ijk++) *(p)++ = (uint8_t)a[15 - ijk]; \
-  }
-#define ARRAY8_TO_STREAM(p, a)                                  \
-  {                                                             \
-    register int ijk;                                           \
-    for (ijk = 0; ijk < 8; ijk++) *(p)++ = (uint8_t)a[7 - ijk]; \
-  }
-#define BDADDR_TO_STREAM(p, a)                    \
-  {                                               \
-    register int ijk;                             \
-    for (ijk = 0; ijk < BD_ADDR_LEN; ijk++)       \
-      *(p)++ = (uint8_t)a[BD_ADDR_LEN - 1 - ijk]; \
-  }
-#define LAP_TO_STREAM(p, a)                   \
-  {                                           \
-    register int ijk;                         \
-    for (ijk = 0; ijk < LAP_LEN; ijk++)       \
-      *(p)++ = (uint8_t)a[LAP_LEN - 1 - ijk]; \
-  }
-#define DEVCLASS_TO_STREAM(p, a)                    \
-  {                                                 \
-    register int ijk;                               \
-    for (ijk = 0; ijk < DEV_CLASS_LEN; ijk++)       \
-      *(p)++ = (uint8_t)a[DEV_CLASS_LEN - 1 - ijk]; \
-  }
-#define ARRAY_TO_STREAM(p, a, len)                            \
-  {                                                           \
-    register int ijk;                                         \
-    for (ijk = 0; ijk < len; ijk++) *(p)++ = (uint8_t)a[ijk]; \
-  }
-#define REVERSE_ARRAY_TO_STREAM(p, a, len)                              \
-  {                                                                     \
-    register int ijk;                                                   \
-    for (ijk = 0; ijk < len; ijk++) *(p)++ = (uint8_t)a[len - 1 - ijk]; \
-  }
-
-#define STREAM_TO_UINT8(u8, p) \
-  {                            \
-    u8 = (uint8_t)(*(p));      \
-    (p) += 1;                  \
-  }
-#define STREAM_TO_UINT16(u16, p)                                \
-  {                                                             \
-    u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); \
-    (p) += 2;                                                   \
-  }
-#define STREAM_TO_UINT24(u32, p)                                    \
-  {                                                                 \
-    u32 = (((uint32_t)(*(p))) + ((((uint32_t)(*((p) + 1)))) << 8) + \
-           ((((uint32_t)(*((p) + 2)))) << 16));                     \
-    (p) += 3;                                                       \
-  }
-#define STREAM_TO_UINT32(u32, p)                                    \
-  {                                                                 \
-    u32 = (((uint32_t)(*(p))) + ((((uint32_t)(*((p) + 1)))) << 8) + \
-           ((((uint32_t)(*((p) + 2)))) << 16) +                     \
-           ((((uint32_t)(*((p) + 3)))) << 24));                     \
-    (p) += 4;                                                       \
-  }
-#define STREAM_TO_BDADDR(a, p)                              \
-  {                                                         \
-    register int ijk;                                       \
-    register uint8_t* pbda = (uint8_t*)a + BD_ADDR_LEN - 1; \
-    for (ijk = 0; ijk < BD_ADDR_LEN; ijk++) *pbda-- = *p++; \
-  }
-#define STREAM_TO_ARRAY32(a, p)                   \
-  {                                               \
-    register int ijk;                             \
-    register uint8_t* _pa = (uint8_t*)a + 31;     \
-    for (ijk = 0; ijk < 32; ijk++) *_pa-- = *p++; \
-  }
-#define STREAM_TO_ARRAY16(a, p)                   \
-  {                                               \
-    register int ijk;                             \
-    register uint8_t* _pa = (uint8_t*)a + 15;     \
-    for (ijk = 0; ijk < 16; ijk++) *_pa-- = *p++; \
-  }
-#define STREAM_TO_ARRAY8(a, p)                   \
-  {                                              \
-    register int ijk;                            \
-    register uint8_t* _pa = (uint8_t*)a + 7;     \
-    for (ijk = 0; ijk < 8; ijk++) *_pa-- = *p++; \
-  }
-#define STREAM_TO_DEVCLASS(a, p)                             \
-  {                                                          \
-    register int ijk;                                        \
-    register uint8_t* _pa = (uint8_t*)a + DEV_CLASS_LEN - 1; \
-    for (ijk = 0; ijk < DEV_CLASS_LEN; ijk++) *_pa-- = *p++; \
-  }
-#define STREAM_TO_LAP(a, p)                             \
-  {                                                     \
-    register int ijk;                                   \
-    register uint8_t* plap = (uint8_t*)a + LAP_LEN - 1; \
-    for (ijk = 0; ijk < LAP_LEN; ijk++) *plap-- = *p++; \
-  }
-#define STREAM_TO_ARRAY(a, p, len)                             \
-  {                                                            \
-    register int ijk;                                          \
-    for (ijk = 0; ijk < len; ijk++) ((uint8_t*)a)[ijk] = *p++; \
-  }
-#define REVERSE_STREAM_TO_ARRAY(a, p, len)         \
-  {                                                \
-    register int ijk;                              \
-    register uint8_t* _pa = (uint8_t*)a + len - 1; \
-    for (ijk = 0; ijk < len; ijk++) *_pa-- = *p++; \
-  }
-
-/*****************************************************************************
-** Macros to get and put bytes to and from a field (Little Endian format).
-** These are the same as to stream, except the pointer is not incremented.
-*****************************************************************************/
-
-#define UINT32_TO_FIELD(p, u32)                    \
-  {                                                \
-    *(uint8_t*)(p) = (uint8_t)(u32);               \
-    *((uint8_t*)(p) + 1) = (uint8_t)((u32) >> 8);  \
-    *((uint8_t*)(p) + 2) = (uint8_t)((u32) >> 16); \
-    *((uint8_t*)(p) + 3) = (uint8_t)((u32) >> 24); \
-  }
-#define UINT24_TO_FIELD(p, u24)                    \
-  {                                                \
-    *(uint8_t*)(p) = (uint8_t)(u24);               \
-    *((uint8_t*)(p) + 1) = (uint8_t)((u24) >> 8);  \
-    *((uint8_t*)(p) + 2) = (uint8_t)((u24) >> 16); \
-  }
-#define UINT16_TO_FIELD(p, u16)                   \
-  {                                               \
-    *(uint8_t*)(p) = (uint8_t)(u16);              \
-    *((uint8_t*)(p) + 1) = (uint8_t)((u16) >> 8); \
-  }
-#define UINT8_TO_FIELD(p, u8) \
-  { *(uint8_t*)(p) = (uint8_t)(u8); }
-
-/*****************************************************************************
-** Macros to get and put bytes to and from a stream (Big Endian format)
-*****************************************************************************/
-
-#define UINT32_TO_BE_STREAM(p, u32)  \
-  {                                  \
-    *(p)++ = (uint8_t)((u32) >> 24); \
-    *(p)++ = (uint8_t)((u32) >> 16); \
-    *(p)++ = (uint8_t)((u32) >> 8);  \
-    *(p)++ = (uint8_t)(u32);         \
-  }
-#define UINT24_TO_BE_STREAM(p, u24)  \
-  {                                  \
-    *(p)++ = (uint8_t)((u24) >> 16); \
-    *(p)++ = (uint8_t)((u24) >> 8);  \
-    *(p)++ = (uint8_t)(u24);         \
-  }
-#define UINT16_TO_BE_STREAM(p, u16) \
-  {                                 \
-    *(p)++ = (uint8_t)((u16) >> 8); \
-    *(p)++ = (uint8_t)(u16);        \
-  }
-#define UINT8_TO_BE_STREAM(p, u8) \
-  { *(p)++ = (uint8_t)(u8); }
-#define ARRAY_TO_BE_STREAM(p, a, len)                         \
-  {                                                           \
-    register int ijk;                                         \
-    for (ijk = 0; ijk < len; ijk++) *(p)++ = (uint8_t)a[ijk]; \
-  }
-
-#define BE_STREAM_TO_UINT8(u8, p) \
-  {                               \
-    u8 = (uint8_t)(*(p));         \
-    (p) += 1;                     \
-  }
-#define BE_STREAM_TO_UINT16(u16, p)                                     \
-  {                                                                     \
-    u16 = (uint16_t)(((uint16_t)(*(p)) << 8) + (uint16_t)(*((p) + 1))); \
-    (p) += 2;                                                           \
-  }
-#define BE_STREAM_TO_UINT24(u32, p)                                   \
-  {                                                                   \
-    u32 = (((uint32_t)(*((p) + 2))) + ((uint32_t)(*((p) + 1)) << 8) + \
-           ((uint32_t)(*(p)) << 16));                                 \
-    (p) += 3;                                                         \
-  }
-#define BE_STREAM_TO_UINT32(u32, p)                                    \
-  {                                                                    \
-    u32 = ((uint32_t)(*((p) + 3)) + ((uint32_t)(*((p) + 2)) << 8) +    \
-           ((uint32_t)(*((p) + 1)) << 16) + ((uint32_t)(*(p)) << 24)); \
-    (p) += 4;                                                          \
-  }
-#define BE_STREAM_TO_ARRAY(p, a, len)                          \
-  {                                                            \
-    register int ijk;                                          \
-    for (ijk = 0; ijk < len; ijk++) ((uint8_t*)a)[ijk] = *p++; \
-  }
-
-/*****************************************************************************
-** Macros to get and put bytes to and from a field (Big Endian format).
-** These are the same as to stream, except the pointer is not incremented.
-*****************************************************************************/
-
-#define UINT32_TO_BE_FIELD(p, u32)                 \
-  {                                                \
-    *(uint8_t*)(p) = (uint8_t)((u32) >> 24);       \
-    *((uint8_t*)(p) + 1) = (uint8_t)((u32) >> 16); \
-    *((uint8_t*)(p) + 2) = (uint8_t)((u32) >> 8);  \
-    *((uint8_t*)(p) + 3) = (uint8_t)(u32);         \
-  }
-#define UINT24_TO_BE_FIELD(p, u24)                \
-  {                                               \
-    *(uint8_t*)(p) = (uint8_t)((u24) >> 16);      \
-    *((uint8_t*)(p) + 1) = (uint8_t)((u24) >> 8); \
-    *((uint8_t*)(p) + 2) = (uint8_t)(u24);        \
-  }
-#define UINT16_TO_BE_FIELD(p, u16)          \
-  {                                         \
-    *(uint8_t*)(p) = (uint8_t)((u16) >> 8); \
-    *((uint8_t*)(p) + 1) = (uint8_t)(u16);  \
-  }
-#define UINT8_TO_BE_FIELD(p, u8) \
-  { *(uint8_t*)(p) = (uint8_t)(u8); }
-
-/*****************************************************************************
-** Define trace levels
-*****************************************************************************/
-
-/* No trace messages to be generated    */
-#define BT_TRACE_LEVEL_NONE 0
-/* Error condition trace messages       */
-#define BT_TRACE_LEVEL_ERROR 1
-/* Warning condition trace messages     */
-#define BT_TRACE_LEVEL_WARNING 2
-/* API traces                           */
-#define BT_TRACE_LEVEL_API 3
-/* Debug messages for events            */
-#define BT_TRACE_LEVEL_EVENT 4
-/* Full debug messages                  */
-#define BT_TRACE_LEVEL_DEBUG 5
-
-#define TRACE_CTRL_GENERAL 0x00000000
-#define TRACE_LAYER_NCI 0x00280000
-#define TRACE_LAYER_HAL 0x00310000
-#define TRACE_LAYER_GKI 0x001a0000
-#define TRACE_ORG_STACK 0x00000000
-#define TRACE_ORG_GKI 0x00000400
-
-#define TRACE_TYPE_ERROR 0x00000000
-#define TRACE_TYPE_WARNING 0x00000001
-#define TRACE_TYPE_API 0x00000002
-#define TRACE_TYPE_EVENT 0x00000003
-#define TRACE_TYPE_DEBUG 0x00000004
-
-#define TRACE_TYPE_GENERIC 0x00000008
-
-#endif /* NFC_TYPES_H */
diff --git a/src/hal/int/nfc_brcm_defs.h b/src/hal/int/nfc_brcm_defs.h
deleted file mode 100644
index c66ecd4..0000000
--- a/src/hal/int/nfc_brcm_defs.h
+++ /dev/null
@@ -1,421 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This file contains the Broadcom-specific defintions that are shared
- *  between HAL, nfc stack, adaptation layer and applications.
- *
- ******************************************************************************/
-
-#ifndef NFC_BRCM_DEFS_H
-#define NFC_BRCM_DEFS_H
-
-/*****************************************************************************
-** Broadcom HW ID definitions
-*****************************************************************************/
-#define BRCM_20791B3_ID 0x20791b03
-#define BRCM_20791B4_ID 0x20791b04
-#define BRCM_20791B5_ID 0x20791b05
-#define BRCM_43341B0_ID 0x43341b00
-#define BRCM_20795T1_ID 0x20795a01
-#define BRCM_20795A0_ID 0x20795a00
-#define BRCM_20795A1_ID 0x20795a10
-
-#define BRCM_NFC_GEN_MASK 0xFFFFF000 /* HW generation mask */
-#define BRCM_NFC_REV_MASK 0x00000FFF /* HW revision mask   */
-#define BRCM_NFC_20791_GEN 0x20791000
-#define BRCM_NFC_20791_GEN_MAX_EE 3 /* HCI access and 2 UICCs */
-#define BRCM_NFC_43341_GEN 0x43341000
-#define BRCM_NFC_43341_GEN_MAX_EE 3 /* HCI access and 2 UICCs */
-#define BRCM_NFC_20795_GEN 0x20795000
-#define BRCM_NFC_20795_GEN_MAX_EE 4 /* HCI access and 3 UICCs */
-
-/*****************************************************************************
-** Broadcom-specific NCI definitions
-*****************************************************************************/
-
-/**********************************************
- * NCI Message Proprietary  Group       - F
- **********************************************/
-#define NCI_MSG_TAG_SET_MEM 0x00
-#define NCI_MSG_TAG_GET_MEM 0x01
-#define NCI_MSG_T1T_SET_HR 0x02
-#define NCI_MSG_SET_CLF_REGISTERS 0x03
-#define NCI_MSG_GET_BUILD_INFO 0x04
-#define NCI_MSG_HCI_NETWK 0x05
-#define NCI_MSG_SET_FWFSM 0x06
-#define NCI_MSG_SET_UICCRDRF 0x07
-#define NCI_MSG_POWER_LEVEL 0x08
-#define NCI_MSG_FRAME_LOG 0x09
-#define NCI_MSG_UICC_READER_ACTION 0x0A
-#define NCI_MSG_SET_PPSE_RESPONSE 0x0B
-#define NCI_MSG_PRBS_SET 0x0C
-/* reset HCI network/close all pipes (S,D) register */
-#define NCI_MSG_RESET_ALL_UICC_CFG 0x0D
-#define NCI_MSG_GET_NFCEE_INFO 0x0E
-#define NCI_MSG_DISABLE_INIT_CHECK 0x0F
-#define NCI_MSG_ANTENNA_SELF_TEST 0x10
-#define NCI_MSG_SET_MAX_PKT_SIZE 0x11
-#define NCI_MSG_NCIP_CLK_REQ_OR_CAR_DET 0x12
-#define NCI_MSG_NCIP_CONFIG_DBUART 0x13
-#define NCI_MSG_NCIP_ENABLE_DVT_DRIVER 0x14
-#define NCI_MSG_SET_ASWP 0x15
-#define NCI_MSG_ENCAPSULATE_NCI 0x16
-#define NCI_MSG_CONFIGURE_ARM_JTAG 0x17
-#define NCI_MSG_STATISTICS 0x18
-#define NCI_MSG_SET_DSP_TABLE 0x19
-#define NCI_MSG_GET_DSP_TABLE 0x1a
-#define NCI_MSG_READY_RX_CMD 0x1b
-#define NCI_MSG_GET_VBAT 0x1c
-#define NCI_MSG_GET_XTAL_INDEX_FROM_DH 0x1d
-#define NCI_MSG_SWP_LOG 0x1e
-#define NCI_MSG_GET_PWRLEVEL 0x1f
-#define NCI_MSG_SET_VBAT_MONITOR 0x20
-#define NCI_MSG_SET_TINT_MODE 0x21
-#define NCI_MSG_ACCESS_APP 0x22
-#define NCI_MSG_SET_SECURE_MODE 0x23
-#define NCI_MSG_GET_NV_DEVICE 0x24
-#define NCI_MSG_LPTD 0x25
-#define NCI_MSG_SET_CE4_AS_SNOOZE 0x26
-#define NCI_MSG_NFCC_SEND_HCI 0x27
-#define NCI_MSG_CE4_PATCH_DOWNLOAD_DONE 0x28
-#define NCI_MSG_EEPROM_RW 0x29
-#define NCI_MSG_GET_CLF_REGISTERS 0x2A
-#define NCI_MSG_RF_TEST 0x2B
-#define NCI_MSG_DEBUG_PRINT 0x2C
-#define NCI_MSG_GET_PATCH_VERSION 0x2D
-#define NCI_MSG_SECURE_PATCH_DOWNLOAD 0x2E
-#define NCI_MSG_SPD_FORMAT_NVM 0x2F
-#define NCI_MSG_SPD_READ_NVM 0x30
-#define NCI_MSG_SWP_BIST 0x31
-#define NCI_MSG_WLESS_DBG_MODE 0x32
-#define NCI_MSG_I2C_REQ_POLARITY 0x33
-#define NCI_MSG_AID_FILTER 0x39
-
-/**********************************************
- * Proprietary  NCI status codes
- **********************************************/
-#define NCI_STATUS_SPD_ERROR_ORDER 0xE0
-#define NCI_STATUS_SPD_ERROR_DEST 0xE1
-#define NCI_STATUS_SPD_ERROR_PROJECTID 0xE2
-#define NCI_STATUS_SPD_ERROR_CHIPVER 0xE3
-#define NCI_STATUS_SPD_ERROR_MAJORVER 0xE4
-#define NCI_STATUS_SPD_ERROR_INVALID_PARAM 0xE5
-#define NCI_STATUS_SPD_ERROR_INVALID_SIG 0xE6
-#define NCI_STATUS_SPD_ERROR_NVM_CORRUPTED 0xE7
-#define NCI_STATUS_SPD_ERROR_PWR_MODE 0xE8
-#define NCI_STATUS_SPD_ERROR_MSG_LEN 0xE9
-#define NCI_STATUS_SPD_ERROR_PATCHSIZE 0xEA
-
-#define NCI_NV_DEVICE_NONE 0x00
-#define NCI_NV_DEVICE_EEPROM 0x08
-#define NCI_NV_DEVICE_UICC1 0x10
-
-/* The events reported on tNFC_VS_CBACK */
-/* The event is (NCI_NTF_BIT|oid) or (NCI_RSP_BIT|oid) */
-#define NFC_VS_HCI_NETWK_EVT (NCI_NTF_BIT | NCI_MSG_HCI_NETWK)
-#define NFC_VS_HCI_NETWK_RSP (NCI_RSP_BIT | NCI_MSG_HCI_NETWK)
-#define NFC_VS_UICC_READER_ACTION_EVT (NCI_NTF_BIT | NCI_MSG_UICC_READER_ACTION)
-#define NFC_VS_POWER_LEVEL_RSP (NCI_RSP_BIT | NCI_MSG_POWER_LEVEL)
-#define NFC_VS_GET_NV_DEVICE_EVT (NCI_RSP_BIT | NCI_MSG_GET_NV_DEVICE)
-#define NFC_VS_LPTD_EVT (NCI_NTF_BIT | NCI_MSG_LPTD)
-#define NFC_VS_GET_BUILD_INFO_EVT (NCI_RSP_BIT | NCI_MSG_GET_BUILD_INFO)
-#define NFC_VS_GET_PATCH_VERSION_EVT (NCI_RSP_BIT | NCI_MSG_GET_PATCH_VERSION)
-#define NFC_VS_SEC_PATCH_DOWNLOAD_EVT \
-  (NCI_RSP_BIT | NCI_MSG_SECURE_PATCH_DOWNLOAD)
-#define NFC_VS_SEC_PATCH_AUTH_EVT (NCI_NTF_BIT | NCI_MSG_SECURE_PATCH_DOWNLOAD)
-#define NFC_VS_EEPROM_RW_EVT (NCI_RSP_BIT | NCI_MSG_EEPROM_RW)
-
-#define NCI_GET_PATCH_VERSION_NVM_OFFSET 37
-
-/* Static and dynamic pipe id and status for each pipe to uicc0 and uicc1. */
-#define NCI_NFCC_PIPE_INFO_NV_SIZE 24
-#define NCI_PERSONALITY_SLOT_SIZE 19
-#define NCI_DYNAMIC_PIPE_SIZE 8
-
-/* Type of TLV in NCI_MSG_HCI_NETWK */
-#define NCI_SWP_INTERFACE_TYPE 0xFF
-/* Type of TLV in NCI_MSG_HCI_NETWK */
-#define NCI_HCI_GATE_TYPE 0xFE
-
-/* Secure Patch Download definitions (patch type definitions) */
-#define NCI_SPD_TYPE_HEADER 0x00
-#define NCI_SPD_TYPE_SRAM 0x01
-#define NCI_SPD_TYPE_AON 0x02
-#define NCI_SPD_TYPE_PATCH_TABLE 0x03
-#define NCI_SPD_TYPE_SECURE_CONFIG 0x04
-#define NCI_SPD_TYPE_CONTROLLED_CONFIG 0x05
-#define NCI_SPD_TYPE_SIGNATURE 0x06
-#define NCI_SPD_TYPE_SIGCHEK 0x07
-
-/* Secure Patch Download definitions (NCI_SPD_TYPE_HEADER definitions) */
-#define NCI_SPD_HEADER_OFFSET_CHIPVERLEN 0x18
-#define NCI_SPD_HEADER_CHIPVER_LEN 16
-
-/* NVM Type (in GET_PATCH_VERSION RSP) */
-#define NCI_SPD_NVM_TYPE_NONE 0x00
-#define NCI_SPD_NVM_TYPE_EEPROM 0x01
-#define NCI_SPD_NVM_TYPE_UICC 0x02
-
-/**********************************************
- * NCI NFCC proprietary features in octet 3
- **********************************************/
-#define NCI_FEAT_SIGNED_PATCH 0x01000000
-
-/**********************************************
- * NCI Interface Types
- **********************************************/
-#define NCI_INTERFACE_VS_MIFARE 0x80
-#define NCI_INTERFACE_VS_CALYPSO_CE 0x81
-#define NCI_INTERFACE_VS_T2T_CE 0x82 /* for Card Emulation side */
-/* for both Reader/Writer and Card Emulation side */
-#define NCI_INTERFACE_VS_15693 0x83
-#define NCI_INTERFACE_VS_T1T_CE 0x84 /* for Card Emulation side */
-
-/**********************************************
- * NCI Proprietary Parameter IDs
- **********************************************/
-#define NCI_PARAM_ID_LA_FSDI 0xA0
-#define NCI_PARAM_ID_LB_FSDI 0xA1
-#define NCI_PARAM_ID_HOST_LISTEN_MASK 0xA2
-#define NCI_PARAM_ID_CHIP_TYPE 0xA3 /* NFCDEP */
-#define NCI_PARAM_ID_PA_ANTICOLL 0xA4
-#define NCI_PARAM_ID_CONTINUE_MODE 0xA5
-#define NCI_PARAM_ID_LBP 0xA6
-#define NCI_PARAM_ID_T1T_RDR_ONLY 0xA7
-#define NCI_PARAM_ID_LA_SENS_RES 0xA8
-#define NCI_PARAM_ID_PWR_SETTING_BITMAP 0xA9
-#define NCI_PARAM_ID_WI_NTF_ENABLE 0xAA
-#define NCI_PARAM_ID_LN_BITRATE 0xAB /* NFCDEP Listen Bitrate */
-#define NCI_PARAM_ID_LF_BITRATE 0xAC /* FeliCa */
-#define NCI_PARAM_ID_SWP_BITRATE_MASK 0xAD
-#define NCI_PARAM_ID_KOVIO 0xAE
-#define NCI_PARAM_ID_UICC_NTF_TO 0xAF
-#define NCI_PARAM_ID_NFCDEP 0xB0
-#define NCI_PARAM_ID_CLF_REGS_CFG 0xB1
-#define NCI_PARAM_ID_NFCDEP_TRANS_TIME 0xB2
-#define NCI_PARAM_ID_CREDIT_TIMER 0xB3
-#define NCI_PARAM_ID_CORRUPT_RX 0xB4
-#define NCI_PARAM_ID_ISODEP 0xB5
-#define NCI_PARAM_ID_LF_CONFIG 0xB6
-#define NCI_PARAM_ID_I93_DATARATE 0xB7
-#define NCI_PARAM_ID_CREDITS_THRESHOLD 0xB8
-#define NCI_PARAM_ID_TAGSNIFF_CFG 0xB9
-#define NCI_PARAM_ID_PA_FSDI 0xBA /* ISODEP */
-#define NCI_PARAM_ID_PB_FSDI 0xBB /* ISODEP */
-#define NCI_PARAM_ID_FRAME_INTF_RETXN 0xBC
-
-#define NCI_PARAM_ID_UICC_RDR_PRIORITY 0xBD
-#define NCI_PARAM_ID_GUARD_TIME 0xBE
-#define NCI_PARAM_ID_STDCONFIG 0xBF /* dont not use this config item */
-/* dont not use this config item  */
-#define NCI_PARAM_ID_PROPCFG 0xC0
-#define NCI_PARAM_ID_MAXTRY2ACTIVATE 0xC1
-#define NCI_PARAM_ID_SWPCFG 0xC2
-#define NCI_PARAM_ID_CLF_LPM_CFG 0xC3
-#define NCI_PARAM_ID_DCLB 0xC4
-#define NCI_PARAM_ID_ACT_ORDER 0xC5
-#define NCI_PARAM_ID_DEP_DELAY_ACT 0xC6
-#define NCI_PARAM_ID_DH_PARITY_CRC_CTL 0xC7
-#define NCI_PARAM_ID_PREINIT_DSP_CFG 0xC8
-#define NCI_PARAM_ID_FW_WORKAROUND 0xC9
-#define NCI_PARAM_ID_RFU_CONFIG 0xCA
-#define NCI_PARAM_ID_EMVCO_ENABLE 0xCB
-#define NCI_PARAM_ID_ANTDRIVER_PARAM 0xCC
-#define NCI_PARAM_ID_PLL325_CFG_PARAM 0xCD
-#define NCI_PARAM_ID_OPNLP_ADPLL_ENABLE 0xCE
-#define NCI_PARAM_ID_CONFORMANCE_MODE 0xCF
-
-#define NCI_PARAM_ID_LPO_ON_OFF_ENABLE 0xD0
-#define NCI_PARAM_ID_FORCE_VANT 0xD1
-#define NCI_PARAM_ID_COEX_CONFIG 0xD2
-#define NCI_PARAM_ID_INTEL_MODE 0xD3
-
-#define NCI_PARAM_ID_AID 0xFF
-
-/**********************************************
- * NCI Parameter ID Lens
- **********************************************/
-#define NCI_PARAM_LEN_PWR_SETTING_BITMAP 3
-#define NCI_PARAM_LEN_HOST_LISTEN_MASK 2
-#define NCI_PARAM_LEN_PLL325_CFG_PARAM 14
-#define NCI_PARAM_LEN_POWER_LEVEL 6
-
-/**********************************************
- * Snooze Mode
- **********************************************/
-#define NFC_SNOOZE_MODE_NONE 0x00    /* Snooze mode disabled    */
-#define NFC_SNOOZE_MODE_UART 0x01    /* Snooze mode for UART    */
-#define NFC_SNOOZE_MODE_SPI_I2C 0x08 /* Snooze mode for SPI/I2C */
-
-#define NFC_SNOOZE_ACTIVE_LOW 0x00  /* high to low voltage is asserting */
-#define NFC_SNOOZE_ACTIVE_HIGH 0x01 /* low to high voltage is asserting */
-
-/**********************************************
- * HCI definitions
- **********************************************/
-#define NFC_HAL_HCI_SESSION_ID_LEN 8
-#define NFC_HAL_HCI_SYNC_ID_LEN 2
-
-/* HCI Network command definitions */
-#define NFC_HAL_HCI_NETWK_INFO_SIZE 250
-#define NFC_HAL_HCI_NO_RW_MODE_NETWK_INFO_SIZE 184
-#define NFC_HAL_HCI_DH_NETWK_INFO_SIZE 111
-#define NFC_HAL_HCI_MIN_NETWK_INFO_SIZE 12
-#define NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE 11
-
-/* Card emulation RF Gate A definitions */
-#define NFC_HAL_HCI_CE_RF_A_UID_REG_LEN 10
-#define NFC_HAL_HCI_CE_RF_A_ATQA_RSP_CODE_LEN 2
-#define NFC_HAL_HCI_CE_RF_A_MAX_HIST_DATA_LEN 15
-#define NFC_HAL_HCI_CE_RF_A_MAX_DATA_RATE_LEN 3
-
-/* Card emulation RF Gate B definitions */
-#define NFC_HAL_HCI_CE_RF_B_PUPI_LEN 4
-#define NFC_HAL_HCI_CE_RF_B_ATQB_LEN 4
-#define NFC_HAL_HCI_CE_RF_B_HIGHER_LAYER_RSP_LEN 61
-#define NFC_HAL_HCI_CE_RF_B_MAX_DATA_RATE_LEN 3
-
-/* Card emulation RF Gate BP definitions */
-#define NFC_HAL_HCI_CE_RF_BP_MAX_PAT_IN_LEN 8
-#define NFC_HAL_HCI_CE_RF_BP_DATA_OUT_LEN 40
-
-/* Reader RF Gate A definitions */
-#define NFC_HAL_HCI_RD_RF_B_HIGHER_LAYER_DATA_LEN 61
-
-/* DH HCI Network command definitions */
-#define NFC_HAL_HCI_DH_MAX_DYN_PIPES 20
-
-/* Target handle for different host in the network */
-#define NFC_HAL_HCI_DH_TARGET_HANDLE 0xF2
-#define NFC_HAL_HCI_UICC0_TARGET_HANDLE 0xF3
-#define NFC_HAL_HCI_UICC1_TARGET_HANDLE 0xF4
-#define NFC_HAL_HCI_UICC2_TARGET_HANDLE 0xF5
-
-/* Card emulation RF Gate A registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t mode; /* Type A card emulation enabled indicator, 0x02:enabled    */
-  uint8_t sak;
-  uint8_t uid_reg_len;
-  uint8_t uid_reg[NFC_HAL_HCI_CE_RF_A_UID_REG_LEN];
-  uint8_t atqa[NFC_HAL_HCI_CE_RF_A_ATQA_RSP_CODE_LEN]; /* ATQA response code */
-  uint8_t app_data_len;
-  uint8_t
-      app_data[NFC_HAL_HCI_CE_RF_A_MAX_HIST_DATA_LEN]; /* 15 bytes optional
-                                                          storage for historic
-                                                          data, use 2 slots */
-  uint8_t fwi_sfgi; /* FRAME WAITING TIME, START-UP FRAME GUARD TIME */
-  uint8_t cid_support;
-  uint8_t datarate_max[NFC_HAL_HCI_CE_RF_A_MAX_DATA_RATE_LEN];
-  uint8_t clt_support;
-} tNCI_HCI_CE_RF_A;
-
-/* Card emulation RF Gate B registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t mode; /* Type B card emulation enabled indicator, 0x02:enabled    */
-  uint8_t pupi_len;
-  uint8_t pupi_reg[NFC_HAL_HCI_CE_RF_B_PUPI_LEN];
-  uint8_t afi;
-  uint8_t
-      atqb[NFC_HAL_HCI_CE_RF_B_ATQB_LEN]; /* 4 bytes ATQB application data */
-  uint8_t higherlayer_resp
-      [NFC_HAL_HCI_CE_RF_B_HIGHER_LAYER_RSP_LEN]; /* 0~ 61 bytes ATRB_INF use
-                                                     1~4 personality slots */
-  uint8_t datarate_max[NFC_HAL_HCI_CE_RF_B_MAX_DATA_RATE_LEN];
-  uint8_t natrb;
-} tNCI_HCI_CE_RF_B;
-
-/* Card emulation RF Gate BP registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t
-      mode; /* Type B prime card emulation enabled indicator, 0x02:enabled */
-  uint8_t pat_in_len;
-  uint8_t pat_in[NFC_HAL_HCI_CE_RF_BP_MAX_PAT_IN_LEN];
-  uint8_t dat_out_len;
-  uint8_t
-      dat_out[NFC_HAL_HCI_CE_RF_BP_DATA_OUT_LEN]; /* ISO7816-3 <=64 byte, and
-                                                     other fields are 9 bytes */
-  uint8_t natr;
-} tNCI_HCI_CE_RF_BP;
-
-/* Card emulation RF Gate F registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t mode; /* Type F card emulation enabled indicator, 0x02:enabled    */
-  uint8_t speed_cap;
-  uint8_t clt_support;
-} tNCI_HCI_CE_RF_F;
-
-/* Reader RF Gate A registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t datarate_max;
-} tNCI_HCI_RD_RF_A;
-
-/* Reader RF Gate B registry information */
-typedef struct {
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-  uint8_t afi;
-  uint8_t hldata_len;
-  uint8_t
-      high_layer_data[NFC_HAL_HCI_RD_RF_B_HIGHER_LAYER_DATA_LEN]; /* INF field
-                                                                     in ATTRIB
-                                                                     command */
-} tNCI_HCI_RD_RF_B;
-
-/* Dynamic pipe information */
-typedef struct {
-  uint8_t source_host;
-  uint8_t dest_host;
-  uint8_t source_gate;
-  uint8_t dest_gate;
-  uint8_t pipe_id; /* if MSB is set then valid, 7 bits for Pipe ID */
-} tNCI_HCI_DYN_PIPE_INFO;
-
-/*************************************************************
- * HCI Network CMD/NTF structure for UICC host in the network
- *************************************************************/
-typedef struct {
-  uint8_t target_handle;
-  uint8_t session_id[NFC_HAL_HCI_SESSION_ID_LEN];
-  uint8_t sync_id[NFC_HAL_HCI_SYNC_ID_LEN];
-  uint8_t static_pipe_info;
-  tNCI_HCI_CE_RF_A ce_rf_a;
-  tNCI_HCI_CE_RF_B ce_rf_b;
-  tNCI_HCI_CE_RF_BP ce_rf_bp;
-  tNCI_HCI_CE_RF_F ce_rf_f;
-  tNCI_HCI_RD_RF_A rw_rf_a;
-  tNCI_HCI_RD_RF_B rw_rf_b;
-} tNCI_HCI_NETWK;
-
-/************************************************
- * HCI Network CMD/NTF structure for Device host
- ************************************************/
-typedef struct {
-  uint8_t target_handle;
-  uint8_t session_id[NFC_HAL_HCI_SESSION_ID_LEN];
-  uint8_t static_pipe_info;
-  uint8_t num_dyn_pipes;
-  tNCI_HCI_DYN_PIPE_INFO dyn_pipe_info[NFC_HAL_HCI_DH_MAX_DYN_PIPES];
-} tNCI_HCI_NETWK_DH;
-
-#endif /* NFC_BRCM_DEFS_H */
diff --git a/src/hal/int/nfc_hal_int.h b/src/hal/int/nfc_hal_int.h
deleted file mode 100644
index 4298205..0000000
--- a/src/hal/int/nfc_hal_int.h
+++ /dev/null
@@ -1,550 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  this file contains the NCI transport internal definitions and functions.
- *
- ******************************************************************************/
-
-#ifndef NFC_HAL_INT_H
-#define NFC_HAL_INT_H
-
-#include "gki.h"
-#include "nci_defs.h"
-#include "nfc_brcm_defs.h"
-#include "nfc_hal_api.h"
-#include "nfc_hal_int_api.h"
-#include "nfc_hal_target.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
-** NFC HAL TASK transport definitions
-****************************************************************************/
-/* NFC HAL Task event masks */
-#define NFC_HAL_TASK_EVT_DATA_RDY EVENT_MASK(APPL_EVT_0)
-#define NFC_HAL_TASK_EVT_INITIALIZE EVENT_MASK(APPL_EVT_5)
-#define NFC_HAL_TASK_EVT_TERMINATE EVENT_MASK(APPL_EVT_6)
-#define NFC_HAL_TASK_EVT_POWER_CYCLE EVENT_MASK(APPL_EVT_7)
-
-#define NFC_HAL_TASK_EVT_MBOX (TASK_MBOX_0_EVT_MASK)
-
-/* NFC HAL Task mailbox definitions */
-#define NFC_HAL_TASK_MBOX (TASK_MBOX_0)
-
-/* NFC HAL Task Timer events */
-#ifndef NFC_HAL_QUICK_TIMER_EVT_MASK
-#define NFC_HAL_QUICK_TIMER_EVT_MASK (TIMER_0_EVT_MASK)
-#endif
-
-#ifndef NFC_HAL_QUICK_TIMER_ID
-#define NFC_HAL_QUICK_TIMER_ID (TIMER_0)
-#endif
-
-/* NFC HAL Task Timer types */
-#define NFC_HAL_TTYPE_NCI_WAIT_RSP 0
-#define NFC_HAL_TTYPE_POWER_CYCLE 1
-#define NFC_HAL_TTYPE_NFCC_ENABLE 2
-
-/* NFC HAL Task Wait Response flag */
-/* wait response on an NCI command                  */
-#define NFC_HAL_WAIT_RSP_CMD 0x10
-/* wait response on an NCI vendor specific command  */
-#define NFC_HAL_WAIT_RSP_VSC 0x20
-/* wait response on a proprietary command           */
-#define NFC_HAL_WAIT_RSP_PROP 0x40
-/* not waiting for anything                         */
-#define NFC_HAL_WAIT_RSP_NONE 0x00
-
-typedef uint8_t tNFC_HAL_WAIT_RSP;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-typedef uint16_t tNFC_HAL_HCI_EVT;
-
-#define NFC_HAL_HCI_PIPE_INFO_SIZE 5
-
-#define NFC_HAL_HCI_ANY_SET_PARAMETER 0x01
-#define NFC_HAL_HCI_ANY_GET_PARAMETER 0x02
-#define NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED 0x15
-
-#define NFC_HAL_HCI_SESSION_IDENTITY_INDEX 0x01
-#define NFC_HAL_HCI_WHITELIST_INDEX 0x03
-
-#define NFC_HAL_HCI_ADMIN_PIPE 0x01
-/* Host ID for UICC 0 */
-#define NFC_HAL_HCI_HOST_ID_UICC0 0x02
-/* Host ID for UICC 1 */
-#define NFC_HAL_HCI_HOST_ID_UICC1 0x03
-/* Host ID for UICC 2 */
-#define NFC_HAL_HCI_HOST_ID_UICC2 0x04
-#define NFC_HAL_HCI_COMMAND_TYPE 0x00
-#define NFC_HAL_HCI_RESPONSE_TYPE 0x02
-
-/* NFC HAL HCI responses */
-#define NFC_HAL_HCI_ANY_OK 0x00
-
-#endif
-
-/* Flag defintions for tNFC_HAL_NVM */
-/* No NVM available                     */
-#define NFC_HAL_NVM_FLAGS_NO_NVM 0x01
-/* FPM patch in NVM failed CRC check    */
-#define NFC_HAL_NVM_FLAGS_LPM_BAD 0x02
-/* LPM patch in NVM failed CRC check    */
-#define NFC_HAL_NVM_FLAGS_FPM_BAD 0x04
-/* Patch is present in NVM              */
-#define NFC_HAL_NVM_FLAGS_PATCH_PRESENT 0x08
-
-/* NFC HAL transport configuration */
-typedef struct {
-  bool shared_transport; /* TRUE if using shared HCI/NCI transport */
-  uint8_t userial_baud;
-  uint8_t userial_fc;
-} tNFC_HAL_TRANS_CFG;
-
-#ifdef TESTER
-/* For Insight, ncit_cfg is runtime-configurable */
-#define NFC_HAL_TRANS_CFG_QUALIFIER
-#else
-/* For all other platforms, ncit_cfg is constant */
-#define NFC_HAL_TRANS_CFG_QUALIFIER const
-#endif
-extern NFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg;
-
-/*****************************************************************************
-* BT HCI definitions
-*****************************************************************************/
-
-/* Tranport message type */
-#define HCIT_TYPE_COMMAND 0x01
-#define HCIT_TYPE_EVENT 0x04
-#define HCIT_TYPE_NFC 0x10
-
-/* Vendor-Specific BT HCI definitions */
-#define HCI_SUCCESS 0x00
-#define HCI_GRP_VENDOR_SPECIFIC (0x3F << 10) /* 0xFC00 */
-#define HCI_BRCM_WRITE_SLEEP_MODE (0x0027 | HCI_GRP_VENDOR_SPECIFIC)
-#define HCI_GRP_HOST_CONT_BASEBAND_CMDS (0x03 << 10) /* 0x0C00 */
-#define HCI_RESET (0x0003 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_COMMAND_COMPLETE_EVT 0x0E
-#define HCI_BRCM_WRITE_SLEEP_MODE_LENGTH 12
-#define HCI_BRCM_UPDATE_BAUD_RATE_UNENCODED_LENGTH 0x06
-#define HCIE_PREAMBLE_SIZE 2
-#define HCI_BRCM_PRE_SET_MEM (0x000C | HCI_GRP_VENDOR_SPECIFIC)
-#define HCI_BRCM_PRE_SET_MEM_LENGTH 10
-#define HCI_BRCM_PRE_SET_MEM_TYPE 8
-
-/****************************************************************************
-** Internal constants and definitions
-****************************************************************************/
-
-/* NFC HAL receiving states */
-enum {
-  NFC_HAL_RCV_IDLE_ST,        /* waiting for packet type byte             */
-  NFC_HAL_RCV_NCI_MSG_ST,     /* waiting for the first byte of NCI header */
-  NFC_HAL_RCV_NCI_HDR_ST,     /* reading NCI header                       */
-  NFC_HAL_RCV_NCI_PAYLOAD_ST, /* reading NCI payload                      */
-  NFC_HAL_RCV_BT_MSG_ST,      /* waiting for the first byte of BT header  */
-  NFC_HAL_RCV_BT_HDR_ST,      /* reading BT HCI header                    */
-  NFC_HAL_RCV_BT_PAYLOAD_ST   /* reading BT HCI payload                   */
-};
-
-/* errors during NCI packet reassembly process */
-#define NFC_HAL_NCI_RAS_TOO_BIG 0x01
-#define NFC_HAL_NCI_RAS_ERROR 0x02
-typedef uint8_t tNFC_HAL_NCI_RAS;
-
-/* NFC HAL power mode */
-enum {
-  NFC_HAL_POWER_MODE_FULL, /* NFCC is full power mode      */
-  NFC_HAL_POWER_MODE_LAST
-};
-typedef uint8_t tNFC_HAL_POWER_MODE;
-
-/* NFC HAL event for low power mode */
-enum {
-  NFC_HAL_LP_TX_DATA_EVT, /* DH is sending data to NFCC   */
-  NFC_HAL_LP_RX_DATA_EVT, /* DH received data from NFCC   */
-  NFC_HAL_LP_TIMEOUT_EVT, /* Timeout                      */
-  NFC_HAL_LP_LAST_EVT
-};
-typedef uint8_t tNFC_HAL_LP_EVT;
-
-#define NFC_HAL_ASSERT_NFC_WAKE 0x00   /* assert NFC_WAKE      */
-#define NFC_HAL_DEASSERT_NFC_WAKE 0x01 /* deassert NFC_WAKE    */
-
-#define NFC_HAL_BT_HCI_CMD_HDR_SIZE 3 /* opcode (2) +  length (1)    */
-#define NFC_HAL_CMD_TOUT (2000)       /* timeout for NCI CMD (in ms) */
-
-#define NFC_HAL_SAVED_HDR_SIZE (2)
-#define NFC_HAL_SAVED_CMD_SIZE (2)
-
-#ifndef NFC_HAL_DEBUG
-#define NFC_HAL_DEBUG TRUE
-#endif
-
-#if (NFC_HAL_DEBUG == TRUE)
-extern const char* const nfc_hal_init_state_str[];
-#define NFC_HAL_SET_INIT_STATE(state)                           \
-  HAL_TRACE_DEBUG3("init state: %d->%d(%s)",                    \
-                   nfc_hal_cb.dev_cb.initializing_state, state, \
-                   nfc_hal_init_state_str[state]);              \
-  nfc_hal_cb.dev_cb.initializing_state = state;
-#else
-#define NFC_HAL_SET_INIT_STATE(state) \
-  nfc_hal_cb.dev_cb.initializing_state = state;
-#endif
-
-/* NFC HAL - NFCC initializing state */
-enum {
-  NFC_HAL_INIT_STATE_IDLE,           /* Initialization is done                */
-  NFC_HAL_INIT_STATE_W4_XTAL_SET,    /* Waiting for crystal setting rsp       */
-  NFC_HAL_INIT_STATE_POST_XTAL_SET,  /* Waiting for reset ntf after xtal set  */
-  NFC_HAL_INIT_STATE_W4_NFCC_ENABLE, /* Waiting for reset ntf atter REG_PU up */
-  NFC_HAL_INIT_STATE_W4_BUILD_INFO,  /* Waiting for build info rsp            */
-  NFC_HAL_INIT_STATE_W4_PATCH_INFO,  /* Waiting for patch info rsp            */
-  NFC_HAL_INIT_STATE_W4_APP_COMPLETE,   /* Waiting for complete from application
-                                           */
-  NFC_HAL_INIT_STATE_W4_POST_INIT_DONE, /* Waiting for complete of post init */
-  NFC_HAL_INIT_STATE_W4_CONTROL_DONE,   /* Waiting for control release */
-  NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE, /* Waiting for complete of prediscover
-                                             */
-  NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF,    /* Waiting for NFCC to turn OFF */
-  NFC_HAL_INIT_STATE_CLOSING /* Shutting down                         */
-};
-typedef uint8_t tNFC_HAL_INIT_STATE;
-
-/* NFC HAL - NFCC config items during post initialization */
-enum {
-  NFC_HAL_DM_CONFIG_LPTD,
-  NFC_HAL_DM_CONFIG_PLL_325,
-  NFC_HAL_DM_CONFIG_START_UP,
-  NFC_HAL_DM_CONFIG_I93_DATA_RATE,
-  NFC_HAL_DM_CONFIG_FW_FSM,
-  NFC_HAL_DM_CONFIG_START_UP_VSC,
-  NFC_HAL_DM_CONFIG_NONE
-};
-typedef uint8_t tNFC_HAL_DM_CONFIG;
-
-/* callback function prototype */
-typedef struct {
-  uint16_t opcode;
-  uint16_t param_len;
-  uint8_t* p_param_buf;
-} tNFC_HAL_BTVSC_CPLT;
-
-typedef void(tNFC_HAL_BTVSC_CPLT_CBACK)(tNFC_HAL_BTVSC_CPLT* p1);
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-/* data type for NFC_HAL_HCI_RSP_NV_READ_EVT */
-typedef struct {
-  NFC_HDR hdr;
-  uint8_t block;
-  uint16_t size;
-  tHAL_NFC_STATUS status;
-} tNFC_HAL_HCI_RSP_NV_READ_EVT;
-
-/* data type for NFC_HAL_HCI_RSP_NV_WRITE_EVT */
-typedef struct {
-  NFC_HDR hdr;
-  tHAL_NFC_STATUS status;
-} tNFC_HAL_HCI_RSP_NV_WRITE_EVT;
-
-/* union of all event data types */
-typedef union {
-  NFC_HDR hdr;
-  /* Internal events */
-  tNFC_HAL_HCI_RSP_NV_READ_EVT nv_read;
-  tNFC_HAL_HCI_RSP_NV_WRITE_EVT nv_write;
-} tNFC_HAL_HCI_EVENT_DATA;
-
-#endif
-/*****************************************************************************
-** Control block for NFC HAL
-*****************************************************************************/
-
-/* Patch RAM Download Control block */
-
-/* PRM states */
-enum {
-  NFC_HAL_PRM_ST_IDLE,
-
-  /* Secure patch download stated */
-  NFC_HAL_PRM_ST_SPD_COMPARE_VERSION,
-  NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER,
-  NFC_HAL_PRM_ST_SPD_DOWNLOADING,
-  NFC_HAL_PRM_ST_SPD_AUTHENTICATING,
-  NFC_HAL_PRM_ST_SPD_AUTH_DONE,
-  NFC_HAL_PRM_ST_W4_GET_VERSION
-};
-typedef uint8_t tNFC_HAL_PRM_STATE;
-
-/* Maximum number of patches (currently 2: LPM and FPM) */
-#define NFC_HAL_PRM_MAX_PATCH_COUNT 2
-#define NFC_HAL_PRM_PATCH_MASK_ALL 0xFFFFFFFF
-#define NFC_HAL_PRM_MAX_CHIP_VER_LEN 8
-
-/* Structures for PRM Control Block */
-typedef struct {
-  uint8_t power_mode;
-  uint16_t len;
-} tNFC_HAL_PRM_PATCHDESC;
-
-typedef struct {
-  tNFC_HAL_PRM_STATE state; /* download state */
-  uint32_t flags;           /* internal flags */
-  uint16_t
-      cur_patch_len_remaining; /* bytes remaining in patchfile to process     */
-  const uint8_t*
-      p_cur_patch_data;      /* pointer to patch currently being downloaded */
-  uint16_t cur_patch_offset; /* offset of next byte to process              */
-  uint32_t dest_ram;
-  TIMER_LIST_ENT timer; /* Timer for patch download                    */
-  void* p_param;        /* general purpose param for PRM               */
-  uint8_t param_idx;    /* information related to general purpose param*/
-
-  /* Secure Patch Download */
-  uint32_t
-      spd_patch_needed_mask; /* Mask of patches that need to be downloaded */
-  uint8_t spd_patch_count;   /* Number of patches left to download */
-  uint8_t spd_cur_patch_idx; /* Current patch being downloaded */
-
-  tNFC_HAL_PRM_PATCHDESC spd_patch_desc[NFC_HAL_PRM_MAX_PATCH_COUNT];
-
-  /* I2C-patch */
-  uint8_t* p_spd_patch;             /* pointer to spd patch             */
-  uint16_t spd_patch_len_remaining; /* patch length                     */
-  uint16_t spd_patch_offset;        /* offset of next byte to process   */
-
-  tNFC_HAL_PRM_FORMAT format;  /* format of patch ram              */
-  tNFC_HAL_PRM_CBACK* p_cback; /* Callback for download status notifications */
-  uint32_t patchram_delay;     /* the dealy after patch */
-} tNFC_HAL_PRM_CB;
-
-/* Information about current patch in NVM */
-typedef struct {
-  uint16_t project_id; /* Current project_id of patch in nvm       */
-  uint16_t ver_major;  /* Current major version of patch in nvm    */
-  uint16_t ver_minor;  /* Current minor version of patch in nvm    */
-  uint16_t fpm_size;   /* Current size of FPM patch in nvm         */
-  uint16_t lpm_size;   /* Current size of LPM patch in nvm         */
-  uint8_t flags;       /* See NFC_HAL_NVM_FLAGS_* flag definitions */
-  uint8_t nvm_type;    /* Current NVM Type - UICC/EEPROM           */
-  uint8_t chip_ver[NFC_HAL_PRM_MAX_CHIP_VER_LEN]; /* patch chip version       */
-} tNFC_HAL_NVM;
-
-/* Patch for I2C fix */
-typedef struct {
-  uint8_t* p_patch;      /* patch for i2c fix                */
-  uint32_t prei2c_delay; /* the dealy after preI2C patch */
-  uint16_t len;          /* i2c patch length                 */
-} tNFC_HAL_PRM_I2C_FIX_CB;
-
-/* Control block for NCI transport */
-typedef struct {
-  uint8_t nci_ctrl_size; /* Max size for NCI messages */
-  uint8_t rcv_state;     /* current rx state */
-  uint16_t rcv_len; /* bytes remaining to be received in current rx state     */
-  NFC_HDR* p_rcv_msg;  /* buffer to receive NCI message */
-  NFC_HDR* p_frag_msg; /* fragmented NCI message; waiting for last fragment */
-  NFC_HDR*
-      p_pend_cmd; /* pending NCI message; waiting for NFCC state to be free */
-  tNFC_HAL_NCI_RAS nci_ras; /* nci reassembly error status */
-  TIMER_LIST_ENT
-  nci_wait_rsp_timer; /* Timer for waiting for nci command response */
-  tNFC_HAL_WAIT_RSP nci_wait_rsp; /* nci wait response flag */
-  uint8_t
-      last_hdr[NFC_HAL_SAVED_HDR_SIZE]; /* part of last NCI command header */
-  uint8_t
-      last_cmd[NFC_HAL_SAVED_CMD_SIZE]; /* part of last NCI command payload */
-  void* p_vsc_cback; /* the callback function for last VSC command */
-} tNFC_HAL_NCIT_CB;
-
-/* Control block for device initialization */
-typedef struct {
-  tNFC_HAL_INIT_STATE initializing_state; /* state of initializing NFCC */
-
-  uint32_t brcm_hw_id; /* BRCM NFCC HW ID                          */
-  tNFC_HAL_DM_CONFIG next_dm_config; /* next config in post initialization */
-  uint8_t next_startup_vsc; /* next start-up VSC offset in post init    */
-
-  tNFC_HAL_POWER_MODE power_mode; /* NFCC power mode                          */
-  uint8_t snooze_mode;            /* current snooze mode                      */
-  uint8_t new_snooze_mode;        /* next snooze mode after receiving cmpl    */
-  uint8_t nfc_wake_active_mode;   /* NFC_HAL_LP_ACTIVE_LOW/HIGH               */
-  TIMER_LIST_ENT lp_timer;        /* timer for low power mode                 */
-
-  tHAL_NFC_STATUS_CBACK*
-      p_prop_cback; /* callback to notify complete of proprietary update */
-} tNFC_HAL_DEV_CB;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-/* data members for NFC_HAL-HCI */
-typedef struct {
-  TIMER_LIST_ENT
-  hci_timer; /* Timer to avoid indefinitely waiting for response */
-  uint8_t*
-      p_hci_netwk_info_buf; /* Buffer for reading HCI Network information */
-  uint8_t* p_hci_netwk_dh_info_buf; /* Buffer for reading HCI Network DH
-                                       information */
-  uint8_t hci_netwk_config_block;  /* Rsp awaiting for hci network configuration
-                                      block */
-  bool b_wait_hcp_conn_create_rsp; /* Waiting for hcp connection create response
-                                      */
-  bool clear_all_pipes_to_uicc1;   /* UICC1 was restarted for patch download */
-  bool update_session_id; /* Next response from NFCC is to Get Session id cmd */
-  bool hci_fw_workaround; /* HAL HCI Workaround need */
-  bool hci_fw_validate_netwk_cmd; /* Flag to indicate if hci network ntf to
-                                     validate */
-  uint8_t hcp_conn_id;            /* NCI Connection id for HCP */
-  uint8_t dh_session_id[1];       /* Byte 0 of DH Session ID */
-} tNFC_HAL_HCI_CB;
-
-#endif
-
-#define NFC_HAL_FLAGS_NEED_DISABLE_VSC 0x01
-typedef uint8_t tNFC_HAL_FLAGS;
-
-typedef struct {
-  tHAL_NFC_CBACK* p_stack_cback;     /* Callback for HAL event notification  */
-  tHAL_NFC_DATA_CBACK* p_data_cback; /* Callback for data event notification  */
-
-  TIMER_LIST_Q quick_timer_queue; /* timer list queue                 */
-  TIMER_LIST_ENT timer;           /* timer for NCI transport task     */
-
-  tNFC_HAL_NCIT_CB ncit_cb; /* NCI transport */
-  tNFC_HAL_DEV_CB dev_cb;   /* device initialization */
-  tNFC_HAL_NVM nvm_cb;      /* Information about current patch in NVM */
-
-  /* Patchram control block */
-  tNFC_HAL_PRM_CB prm;
-  tNFC_HAL_PRM_I2C_FIX_CB prm_i2c;
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-  /* data members for NFC_HAL-HCI */
-  tNFC_HAL_HCI_CB hci_cb;
-#endif
-
-  uint8_t pre_discover_done; /* TRUE, when the prediscover config is complete */
-  tNFC_HAL_FLAGS hal_flags;
-  uint8_t pre_set_mem_idx;
-
-  uint8_t max_rf_credits; /* NFC Max RF data credits */
-  uint8_t max_ee;         /* NFC Max number of NFCEE supported by NFCC */
-  uint8_t trace_level;    /* NFC HAL trace level */
-} tNFC_HAL_CB;
-
-/* Global NCI data */
-extern tNFC_HAL_CB nfc_hal_cb;
-
-extern uint8_t* p_nfc_hal_pre_discover_cfg;
-
-/****************************************************************************
-** Internal nfc functions
-****************************************************************************/
-
-/* From nfc_hal_main.c */
-uint32_t nfc_hal_main_task(uint32_t param);
-void nfc_hal_main_init(void);
-void nfc_hal_main_close(void);
-void nfc_hal_main_pre_init_done(tHAL_NFC_STATUS);
-void nfc_hal_main_exit_op_done(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                               uint8_t* p_data);
-void nfc_hal_main_start_quick_timer(TIMER_LIST_ENT* p_tle, uint16_t type,
-                                    uint32_t timeout);
-void nfc_hal_main_stop_quick_timer(TIMER_LIST_ENT* p_tle);
-void nfc_hal_main_send_error(tHAL_NFC_STATUS status);
-void nfc_hal_send_nci_msg_to_nfc_task(NFC_HDR* p_msg);
-
-/* nfc_hal_nci.c */
-bool nfc_hal_nci_receive_msg(uint8_t byte);
-bool nfc_hal_nci_preproc_rx_nci_msg(NFC_HDR* p_msg);
-NFC_HDR* nfc_hal_nci_postproc_rx_nci_msg(void);
-void nfc_hal_nci_assemble_nci_msg(void);
-void nfc_hal_nci_add_nfc_pkt_type(NFC_HDR* p_msg);
-void nfc_hal_nci_send_cmd(NFC_HDR* p_buf);
-void nfc_hal_nci_cmd_timeout_cback(void* p_tle);
-
-/* nfc_hal_dm.c */
-void nfc_hal_dm_init(void);
-void nfc_hal_dm_set_xtal_freq_index(void);
-void nfc_hal_dm_set_power_level_zero(void);
-void nfc_hal_dm_send_get_build_info_cmd(void);
-void nfc_hal_dm_proc_msg_during_init(NFC_HDR* p_msg);
-void nfc_hal_dm_proc_msg_during_exit(NFC_HDR* p_msg);
-void nfc_hal_dm_config_nfcc(void);
-void nfc_hal_dm_send_nci_cmd(const uint8_t* p_data, uint16_t len,
-                             tNFC_HAL_NCI_CBACK* p_cback);
-void nfc_hal_dm_send_bt_cmd(const uint8_t* p_data, uint16_t len,
-                            tNFC_HAL_BTVSC_CPLT_CBACK* p_cback);
-void nfc_hal_dm_set_nfc_wake(uint8_t cmd);
-void nfc_hal_dm_pre_init_nfcc(void);
-void nfc_hal_dm_shutting_down_nfcc(void);
-bool nfc_hal_dm_power_mode_execute(tNFC_HAL_LP_EVT event);
-void nfc_hal_dm_send_pend_cmd(void);
-tHAL_NFC_STATUS nfc_hal_dm_set_config(uint8_t tlv_size, uint8_t* p_param_tlvs,
-                                      tNFC_HAL_NCI_CBACK* p_cback);
-bool nfc_hal_dm_check_pre_set_mem(void);
-tNFC_HAL_NCI_CBACK* nfc_hal_dm_got_vs_rsp(void);
-
-/* nfc_hal_prm.c */
-void nfc_hal_prm_spd_reset_ntf(uint8_t reset_reason, uint8_t reset_type);
-void nfc_hal_prm_nci_command_complete_cback(tNFC_HAL_NCI_EVT event,
-                                            uint16_t data_len, uint8_t* p_data);
-void nfc_hal_prm_process_timeout(void* p_tle);
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-/* nfc_hal_hci.c */
-void nfc_hal_hci_enable(void);
-void nfc_hal_hci_evt_hdlr(tNFC_HAL_HCI_EVENT_DATA* p_evt_data);
-void nfc_hal_hci_handle_hci_netwk_info(uint8_t* p_data);
-void nfc_hal_hci_handle_hcp_pkt_from_hc(uint8_t* p_data);
-NFC_HDR* nfc_hal_hci_postproc_hcp(void);
-bool nfc_hal_hci_handle_hcp_pkt_to_hc(uint8_t* p_data);
-void nfc_hal_hci_timeout_cback(void* p_tle);
-void nfc_hal_hci_handle_build_info(uint8_t chipverlen, uint8_t* p_chipverstr);
-#else
-#define nfc_hal_hci_enable() NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
-#define nfc_hal_hci_handle_build_info(p, a)
-#define nfc_hal_hci_evt_hdlr(p) ;
-#endif
-
-/* Define default NCI protocol trace function (if protocol tracing is enabled)
- */
-#if (NFC_HAL_TRACE_PROTOCOL == TRUE)
-#if !defined(DISP_NCI)
-#define DISP_NCI (DispNci)
-void DispNci(uint8_t* p, uint16_t len, bool is_recv);
-#endif /* DISP_NCI */
-
-/* For displaying vendor-specific HCI commands */
-void DispHciCmd(NFC_HDR* p_buf);
-void DispHciEvt(NFC_HDR* p_buf);
-#endif /* NFC_HAL_TRACE_PROTOCOL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* NFC_HAL_INT_H */
diff --git a/src/hal/int/nfc_hal_int_api.h b/src/hal/int/nfc_hal_int_api.h
deleted file mode 100644
index ffaf81a..0000000
--- a/src/hal/int/nfc_hal_int_api.h
+++ /dev/null
@@ -1,307 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Internal NFC HAL API functions.
- *
- ******************************************************************************/
-#ifndef NFC_HAL_INT_API_H
-#define NFC_HAL_INT_API_H
-
-/****************************************************************************
-** Device Configuration definitions
-****************************************************************************/
-
-#define NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN (2 + NCI_PARAM_LEN_PLL325_CFG_PARAM)
-
-/* Crystal Frequency Index (in 1 KHz) */
-enum {
-  NFC_HAL_XTAL_INDEX_9600,
-  NFC_HAL_XTAL_INDEX_13000,
-  NFC_HAL_XTAL_INDEX_16200,
-  NFC_HAL_XTAL_INDEX_19200,
-  NFC_HAL_XTAL_INDEX_24000,
-  NFC_HAL_XTAL_INDEX_26000,
-  NFC_HAL_XTAL_INDEX_38400,
-  NFC_HAL_XTAL_INDEX_52000,
-  NFC_HAL_XTAL_INDEX_37400,
-  NFC_HAL_XTAL_INDEX_MAX,
-  NFC_HAL_XTAL_INDEX_SPECIAL = 0xFF
-};
-typedef uint8_t tNFC_HAL_XTAL_INDEX;
-
-/* Broadcom specific device initialization before sending NCI reset */
-
-typedef struct {
-  uint32_t brcm_hw_id;
-  uint16_t xtal_freq;
-  uint8_t xtal_index;
-} tNFC_HAL_DEV_INIT_XTAL_CFG;
-
-#define NFC_HAL_DEV_INIT_MAX_XTAL_CFG 5
-
-typedef struct {
-  uint8_t num_xtal_cfg;
-  tNFC_HAL_DEV_INIT_XTAL_CFG xtal_cfg[NFC_HAL_DEV_INIT_MAX_XTAL_CFG];
-} tNFC_HAL_DEV_INIT_CFG;
-
-/*****************************************************************************
-**  Low Power Mode definitions
-*****************************************************************************/
-
-/* Snooze mode disabled    */
-#define NFC_HAL_LP_SNOOZE_MODE_NONE NFC_SNOOZE_MODE_NONE
-/* Snooze mode for UART    */
-#define NFC_HAL_LP_SNOOZE_MODE_UART NFC_SNOOZE_MODE_UART
-/* Snooze mode for SPI/I2C */
-#define NFC_HAL_LP_SNOOZE_MODE_SPI_I2C NFC_SNOOZE_MODE_SPI_I2C
-
-/* high to low voltage is asserting */
-#define NFC_HAL_LP_ACTIVE_LOW NFC_SNOOZE_ACTIVE_LOW
-/* low to high voltage is asserting */
-#define NFC_HAL_LP_ACTIVE_HIGH NFC_SNOOZE_ACTIVE_HIGH
-
-/*****************************************************************************
-**  Patch RAM Constants
-*****************************************************************************/
-
-/* patch format type */
-#define NFC_HAL_PRM_FORMAT_BIN 0x00
-#define NFC_HAL_PRM_FORMAT_HCD 0x01
-#define NFC_HAL_PRM_FORMAT_NCD 0x02
-typedef uint8_t tNFC_HAL_PRM_FORMAT;
-
-/*****************************************************************************
-**  Patch RAM Callback for event notificaton
-*****************************************************************************/
-/* Events for tNFC_HAL_PRM_CBACK */
-enum {
-  NFC_HAL_PRM_CONTINUE_EVT,
-  NFC_HAL_PRM_COMPLETE_EVT,
-  NFC_HAL_PRM_ABORT_EVT,
-  NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT, /* Patch is invalid (bad version, project
-                                          id, or chip)  */
-  NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT, /* Patch has invalid signature */
-  NFC_HAL_PRM_SPD_GET_PATCHFILE_HDR_EVT, /* Secure Patch Download: request for
-                                            patchfile header  */
-  NFC_HAL_PRM_SPD_GET_NEXT_PATCH,        /* Get first command of next patch in
-                                            patchfile         */
-  NFC_HAL_PRM_ABORT_NO_NVM_EVT /* nfc_hal_prm_nvm_required is TRUE and NVM is
-                                  unavail  */
-};
-
-typedef void(tNFC_HAL_PRM_CBACK)(uint8_t event);
-
-typedef uint8_t tNFC_HAL_NCI_EVT; /* MT + Opcode */
-typedef void(tNFC_HAL_NCI_CBACK)(tNFC_HAL_NCI_EVT event, uint16_t data_len,
-                                 uint8_t* p_data);
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPreInitDone
-**
-** Description      Notify that pre-initialization of NFCC is complete
-**
-** Returns          void
-**
-*******************************************************************************/
-void HAL_NfcPreInitDone(tHAL_NFC_STATUS status);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcReInit
-**
-** Description      This function is called to restart initialization after
-**                  REG_PU toggled because of failure to detect NVM type or
-**                  download patchram.
-**
-** Note             This function should be called only during the HAL init
-**                  process
-**
-** Returns          HAL_NFC_STATUS_OK if successfully initiated
-**                  HAL_NFC_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcReInit(void);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetSnoozeMode
-**
-** Description      Set snooze mode
-**                  snooze_mode
-**                      NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled
-**                      NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART
-**                      NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C
-**
-**                  idle_threshold_dh/idle_threshold_nfcc
-**                      Idle Threshold Host in 100ms unit
-**
-**                  nfc_wake_active_mode/dh_wake_active_mode
-**                      NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting
-**                      NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is
-**                                               asserting
-**
-**                  p_snooze_cback
-**                      Notify status of operation
-**
-** Returns          tHAL_NFC_STATUS
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcSetSnoozeMode(uint8_t snooze_mode,
-                                     uint8_t idle_threshold_dh,
-                                     uint8_t idle_threshold_nfcc,
-                                     uint8_t nfc_wake_active_mode,
-                                     uint8_t dh_wake_active_mode,
-                                     tHAL_NFC_STATUS_CBACK* p_snooze_cback);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmDownloadStart
-**
-** Description      Initiate patch download
-**
-** Input Params
-**                  format_type     patch format type
-**                                  (NFC_HAL_PRM_FORMAT_BIN,
-**                                   NFC_HAL_PRM_FORMAT_HCD, or
-**                                   NFC_HAL_PRM_FORMAT_NCD)
-**
-**                  dest_address    destination adderess (needed for BIN format
-**                                  only)
-**
-**                  p_patchram_buf  pointer to patchram buffer. If NULL, then
-**                                  app must call HAL_NfcPrmDownloadContinue
-**                                  when NFC_HAL_PRM_CONTINUE_EVT is received,
-**                                  to send the next segment of patchram
-**
-**                  patchram_len    size of p_patchram_buf (if non-NULL)
-**
-**                  patchram_delay  The delay after each patch.
-**                                  If the given value is less than the size of
-**                                  the patchram, the size of patchram is used
-**                                  instead.
-**
-**                  p_cback         callback for download status
-**
-**
-** Returns          TRUE if successful, otherwise FALSE
-**
-**
-*******************************************************************************/
-bool HAL_NfcPrmDownloadStart(tNFC_HAL_PRM_FORMAT format_type,
-                             uint32_t dest_address, uint8_t* p_patchram_buf,
-                             uint32_t patchram_len, uint32_t patchram_delay,
-                             tNFC_HAL_PRM_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmDownloadContinue
-**
-** Description      Send next segment of patchram to controller. Called when
-**                  NFC_HAL_PRM_CONTINUE_EVT is received.
-**
-**                  Only needed if HAL_NfcPrmDownloadStart was called with
-**                  p_patchram_buf=NULL
-**
-** Input Params     p_patch_data    pointer to patch data
-**                  patch_data_len  patch data len
-**
-** Returns          TRUE if successful, otherwise FALSE
-**
-*******************************************************************************/
-bool HAL_NfcPrmDownloadContinue(uint8_t* p_patch_data, uint16_t patch_data_len);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmSetI2cPatch
-**
-** Description      Specify patchfile for BCM20791B3 I2C fix. This fix
-**                  must be downloaded prior to initial patch download for I2C
-**                  transport
-**
-** Input Params     p_i2c_patchfile_buf: pointer to patch for i2c fix
-**                  i2c_patchfile_len: length of patch
-**                  prei2c_delay: the delay before downloading main patch
-**                                if 0 is given, NFC_HAL_PRM_POST_I2C_FIX_DELAY
-**                                is used instead.
-**
-** Returns          Nothing
-**
-**
-*******************************************************************************/
-void HAL_NfcPrmSetI2cPatch(uint8_t* p_i2c_patchfile_buf,
-                           uint16_t i2c_patchfile_len, uint32_t prei2c_delay);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcPrmSetSpdNciCmdPayloadSize
-**
-** Description      Set Host-to-NFCC NCI message size for secure patch download
-**
-**                  This API must be called before calling
-**                  HAL_NfcPrmDownloadStart. If the API is not called, then PRM
-**                  will use the default message size.
-**
-**                  Typically, this API is only called for platforms that have
-**                  message-size limitations in the transport/driver.
-**
-**                  Valid message size range:
-**                  NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE to 255.
-**
-** Returns          HAL_NFC_STATUS_OK if successful
-**                  HAL_NFC_STATUS_FAILED otherwise
-**
-**
-*******************************************************************************/
-tHAL_NFC_STATUS HAL_NfcPrmSetSpdNciCmdPayloadSize(uint8_t max_payload_size);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetMaxRfDataCredits
-**
-** Description      This function sets the maximum RF data credit for HAL.
-**                  If 0, use the value reported from NFCC.
-**
-** Returns          none
-**
-*******************************************************************************/
-void HAL_NfcSetMaxRfDataCredits(uint8_t max_credits);
-
-/*******************************************************************************
-**
-** Function         HAL_NfcSetTraceLevel
-**
-** Description      This function sets the trace level for HAL.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t HAL_NfcSetTraceLevel(uint8_t new_level);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* NFC_HAL_INT_API_H */
diff --git a/src/hal/int/nfc_hal_nv_ci.h b/src/hal/int/nfc_hal_nv_ci.h
deleted file mode 100644
index 0a98edf..0000000
--- a/src/hal/int/nfc_hal_nv_ci.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This is the interface file for non valtile memory call-in functions.
- *
- ******************************************************************************/
-#ifndef NFC_HAL_NV_CI_H
-#define NFC_HAL_NV_CI_H
-
-#include "nfc_hal_target.h"
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-#include "nfc_hal_nv_co.h"
-
-/*****************************************************************************
-**  Function Declarations
-*****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_ci_write
-**
-** Description      This function sends an event to NFAA indicating the phone
-**                  has written the number of bytes specified in the call-out
-**                  function, nfa_nv_co_write (), and is ready for more data.
-**                  This function is used to control the TX data flow.
-**                  Note: The data buffer is released by the stack aioer
-**                        calling this function.
-**
-** Parameters       status - NFA_NV_CO_OK, NFA_NV_CO_NOSPACE, or NFA_NV_CO_FAIL
-**                  evt - Used Internally by NFA -> MUST be same value passed
-**                       in call-out function.
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_nv_ci_write(tNFC_HAL_NV_CO_STATUS status);
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_ci_read
-**
-** Description      This function sends an event to NCIT indicating the phone
-**                  has read in the requested amount of data specified in the
-**                  nfa_nv_co_read () call-out function.  It should only be
-**                  called when the requested number of bytes has been read.
-**
-** Parameters       num_bytes_read - number of bytes read into the buffer
-**                      specified in the read callout-function.
-**                  status - NFC_HAL_NV_CO_OK if full buffer of data,
-**                           NFC_HAL_NV_CO_EOF if the end of file has been
-**                           reached,
-**                           NFC_HAL_NV_CO_FAIL if an error has occurred.
-**                  evt - Used Internally by NFA -> MUST be same value passed
-**                       in call-out function.
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfc_hal_nv_ci_read(uint16_t num_bytes_read, tNFC_HAL_NV_CO_STATUS status,
-                        uint8_t block);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* NFC_HAL_HCI_INCLUDED */
-
-#endif /* NFC_HAL_NV_CI_H */
diff --git a/src/hal/int/nfc_hal_nv_co.h b/src/hal/int/nfc_hal_nv_co.h
deleted file mode 100644
index 2891c27..0000000
--- a/src/hal/int/nfc_hal_nv_co.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  This is the interface file for storing nv data
- *
- ******************************************************************************/
-#ifndef NFC_HAL_NV_CO_H
-#define NFC_HAL_NV_CO_H
-
-#include "nfc_hal_target.h"
-
-#if (NFC_HAL_HCI_INCLUDED == TRUE)
-
-#include <time.h>
-
-/*****************************************************************************
-**  Constants and Data Types
-*****************************************************************************/
-
-/**************************
-**  Common Definitions
-***************************/
-
-/* Status codes returned by call-out functions, or in call-in functions as
- * status */
-#define NFC_HAL_NV_CO_OK 0x00
-#define NFC_HAL_NV_CO_FAIL 0x01 /* Used to pass all other errors */
-#define NFC_HAL_NV_CO_EACCES 0x02
-#define NFC_HAL_NV_CO_ENOTEMPTY 0x03
-#define NFC_HAL_NV_CO_EOF 0x04
-#define NFC_HAL_NV_CO_EODIR 0x05
-/* Returned in nfa_nv_ci_open if no room */
-#define NFC_HAL_NV_CO_ENOSPACE 0x06
-#define NFC_HAL_NV_CO_EIS_DIR 0x07
-#define NFC_HAL_NV_CO_RESUME 0x08 /* used in nfa_nv_ci_open, on resume */
-/* used in nfa_nv_ci_open, on resume (no file to resume) */
-#define NFC_HAL_NV_CO_NONE 0x09
-
-typedef uint8_t tNFC_HAL_NV_CO_STATUS;
-
-#define DH_NV_BLOCK 0x01
-#define HC_F3_NV_BLOCK 0x02
-#define HC_F4_NV_BLOCK 0x03
-#define HC_F2_NV_BLOCK 0x04
-#define HC_F5_NV_BLOCK 0x05
-
-/*****************************************************************************
-**  Function Declarations
-*****************************************************************************/
-/**************************
-**  Common Functions
-***************************/
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_co_read
-**
-** Description      This function is called by NFA to read in data from the
-**                  previously opened file.
-**
-** Parameters       p_buf   - buffer to read the data into.
-**                  nbytes  - number of bytes to read into the buffer.
-**
-** Returns          void
-**
-**                  Note: Upon completion of the request, nfa_nv_ci_read () is
-**                        called with the buffer of data, along with the number
-**                        of bytes read into the buffer, and a status.  The
-**                        call-in function should only be called when ALL
-**                        requested bytes have been read, the end of file has
-**                        been detected, or an error has occurred.
-**
-*******************************************************************************/
-void nfc_hal_nv_co_read(uint8_t* p_buf, uint16_t nbytes, uint8_t block);
-
-/*******************************************************************************
-**
-** Function         nfc_hal_nv_co_write
-**
-** Description      This function is called by io to send file data to the
-**                  phone.
-**
-** Parameters       p_buf   - buffer to read the data from.
-**                  nbytes  - number of bytes to write out to the file.
-**
-** Returns          void
-**
-**                  Note: Upon completion of the request, nfa_nv_ci_write () is
-**                        called with the file descriptor and the status. The
-**                        call-in function should only be called when ALL
-**                        requested bytes have been written, or an error has
-**                        been detected,
-**
-*******************************************************************************/
-void nfc_hal_nv_co_write(const uint8_t* p_buf, uint16_t nbytes, uint8_t block);
-
-#endif /* NFC_HAL_HCI_INCLUDED */
-#endif /* NFC_HAL_NV_CO_H */
diff --git a/src/include/CrcChecksum.h b/src/include/CrcChecksum.h
index f3154f2..ffbc9a7 100644
--- a/src/include/CrcChecksum.h
+++ b/src/include/CrcChecksum.h
@@ -19,10 +19,6 @@
 
 #include <stdbool.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*******************************************************************************
 **
 ** Function         crcChecksumCompute
@@ -45,7 +41,3 @@
 **
 *******************************************************************************/
 bool crcChecksumVerifyIntegrity(const char* filename);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/src/include/NfcAdaptation.h b/src/include/NfcAdaptation.h
index 606f66b..cf1054e 100644
--- a/src/include/NfcAdaptation.h
+++ b/src/include/NfcAdaptation.h
@@ -18,6 +18,7 @@
 #pragma once
 #include <pthread.h>
 
+#include "config.h"
 #include "nfc_hal_api.h"
 #include "nfc_target.h"
 
@@ -30,6 +31,10 @@
 struct INfc;
 struct INfcClientCallback;
 }
+namespace V1_1 {
+struct INfc;
+struct INfcClientCallback;
+}
 }
 }
 }
@@ -77,9 +82,12 @@
   virtual ~NfcAdaptation();
   void Initialize();
   void Finalize();
+  void FactoryReset();
+  void DeviceShutdown();
   static NfcAdaptation& GetInstance();
   tHAL_NFC_ENTRY* GetHalEntryFuncs();
   void DownloadFirmware();
+  void GetVendorConfigs(std::map<std::string, ConfigValue>& configMap);
   void Dump(int fd);
 
  private:
@@ -89,9 +97,9 @@
   static ThreadMutex sLock;
   ThreadCondVar mCondVar;
   tHAL_NFC_ENTRY mHalEntryFuncs;  // function pointers for HAL entry points
-  static nfc_nci_device_t* mHalDeviceContext;
   static android::sp<android::hardware::nfc::V1_0::INfc> mHal;
-  static android::hardware::nfc::V1_0::INfcClientCallback* mCallback;
+  static android::sp<android::hardware::nfc::V1_1::INfc> mHal_1_1;
+  static android::hardware::nfc::V1_1::INfcClientCallback* mCallback;
   static tHAL_NFC_CBACK* mHalCallback;
   static tHAL_NFC_DATA_CBACK* mHalDataCallback;
   static ThreadCondVar mHalOpenCompletedEvent;
diff --git a/src/include/_OverrideLog.h b/src/include/_OverrideLog.h
deleted file mode 100644
index dd412ab..0000000
--- a/src/include/_OverrideLog.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Override the Android logging macro(s) from
- *  /system/core/include/cutils/log.h. This header must be the first header
- *  included by a *.cpp file so the original Android macro can be replaced.
- *  Do not include this header in another header, because that will create
- *  unnecessary dependency.
- *
- ******************************************************************************/
-#pragma once
-
-// Override Android's ALOGD macro by adding a boolean expression.
-#define ALOGD(...) \
-  ((void)ALOGD_IF(appl_trace_level >= BT_TRACE_LEVEL_DEBUG, __VA_ARGS__))
-
-#include <cutils/log.h>  //define Android logging macros
-#include "bt_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern unsigned char appl_trace_level;
-extern uint32_t ScrProtocolTraceFlag;
-/* defined for run time DTA mode selection */
-extern unsigned char appl_dta_mode_flag;
-
-void initializeGlobalAppDtaMode();
-
-/*******************************************************************************
-**
-** Function:        initializeGlobalAppLogLevel
-**
-** Description:     Initialize and get global logging level from .conf or
-**                  Android property nfc.app_log_level.  The Android property
-**                  overrides .conf variable.
-**
-** Returns:         Global log level:
-**                  BT_TRACE_LEVEL_NONE    0 * No trace messages to be generated
-**                  BT_TRACE_LEVEL_ERROR   1 * Error condition trace messages
-**                  BT_TRACE_LEVEL_WARNING 2 * Warning condition trace messages
-**                  BT_TRACE_LEVEL_API     3 * API traces
-**                  BT_TRACE_LEVEL_EVENT   4 * Debug messages for events
-**                  BT_TRACE_LEVEL_DEBUG   5 * Debug messages (general)
-**
-*******************************************************************************/
-unsigned char initializeGlobalAppLogLevel();
-uint32_t initializeProtocolLogLevel();
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/src/include/android_logmsg.h b/src/include/android_logmsg.h
index 4dfccbc..ed38807 100644
--- a/src/include/android_logmsg.h
+++ b/src/include/android_logmsg.h
@@ -20,51 +20,11 @@
  * If protocol decoder is not present, then decode packets into hex numbers.
  ******************************************************************************/
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include "data_types.h"
 #include "nfc_types.h"
 
 #define DISP_NCI ProtoDispAdapterDisplayNciPacket
 void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
                                       bool is_recv);
-void ProtoDispAdapterUseRawOutput(bool isUseRaw);
-void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...);
-void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...);
-void LogMsg_0(uint32_t trace_set_mask, const char* p_str);
-void LogMsg_1(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1);
-void LogMsg_2(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2);
-void LogMsg_3(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3);
-void LogMsg_4(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4);
-void LogMsg_5(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5);
-void LogMsg_6(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-              uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
-              uintptr_t p6);
-uint8_t* scru_dump_hex(uint8_t* p, char* pTitle, uint32_t len, uint32_t layer,
-                       uint32_t type);
-void BTDISP_LOCK_LOG();
-void BTDISP_UNLOCK_LOG();
-void BTDISP_INIT_LOCK();
-void BTDISP_UNINIT_LOCK();
-void DispHciCmd(NFC_HDR* p_buf);
-void DispHciEvt(NFC_HDR* p_buf);
 void DispLLCP(NFC_HDR* p_buf, bool is_recv);
 void DispHcp(uint8_t* data, uint16_t len, bool is_recv);
-void DispSNEP(uint8_t local_sap, uint8_t remote_sap, NFC_HDR* p_buf,
-              bool is_first, bool is_rx);
-void DispCHO(uint8_t* pMsg, uint32_t MsgLen, bool is_rx);
-void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx);
-void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx);
-void DispCET4Tags(NFC_HDR* p_buf, bool is_rx);
-void DispRWI93Tag(NFC_HDR* p_buf, bool is_rx, uint8_t command_to_respond);
-void DispNDEFMsg(uint8_t* pMsg, uint32_t MsgLen, bool is_recv);
-
-#ifdef __cplusplus
-};
-#endif
diff --git a/src/include/bt_trace.h b/src/include/bt_trace.h
deleted file mode 100644
index e4d3165..0000000
--- a/src/include/bt_trace.h
+++ /dev/null
@@ -1,1875 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef BT_TRACE_H
-#define BT_TRACE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* External declaration for appl_trace_level here to avoid to add the
- * declaration in all the files using APPL_TRACExxx macros */
-extern uint8_t appl_trace_level;
-
-/* Prototype for message logging function. */
-extern void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...);
-extern void LogMsg_0(uint32_t trace_set_mask, const char* p_str);
-extern void LogMsg_1(uint32_t trace_set_mask, const char* fmt_str,
-                     uintptr_t p1);
-extern void LogMsg_2(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-                     uintptr_t p2);
-extern void LogMsg_3(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-                     uintptr_t p2, uintptr_t p3);
-extern void LogMsg_4(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-                     uintptr_t p2, uintptr_t p3, uintptr_t p4);
-extern void LogMsg_5(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-                     uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5);
-extern void LogMsg_6(uint32_t trace_set_mask, const char* fmt_str, uintptr_t p1,
-                     uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
-                     uintptr_t p6);
-
-#ifdef __cplusplus
-}
-#endif
-
-/******************************************************************************
-**
-** Trace configurable parameters
-**
-******************************************************************************/
-
-/* Enables or disables verbose trace information. */
-#ifndef BT_TRACE_VERBOSE
-#define BT_TRACE_VERBOSE FALSE
-#endif
-
-/* Enables or disables protocol trace information. */
-#ifndef BT_TRACE_PROTOCOL
-#define BT_TRACE_PROTOCOL TRUE /* Android requires TRUE */
-#endif
-
-/******************************************************************************
-**
-** Trace Levels
-**
-** The following values may be used for different levels:
-**      BT_TRACE_LEVEL_NONE    0        * No trace messages to be generated
-**      BT_TRACE_LEVEL_ERROR   1        * Error condition trace messages
-**      BT_TRACE_LEVEL_WARNING 2        * Warning condition trace messages
-**      BT_TRACE_LEVEL_API     3        * API traces
-**      BT_TRACE_LEVEL_EVENT   4        * Debug messages for events
-**      BT_TRACE_LEVEL_DEBUG   5        * Debug messages (general)
-******************************************************************************/
-
-/* Core Stack default trace levels */
-#ifndef HCI_INITIAL_TRACE_LEVEL
-#define HCI_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_DEBUG
-#endif
-
-#ifndef LLCP_INITIAL_TRACE_LEVEL
-#define LLCP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_DEBUG
-#endif
-
-#ifndef APPL_INITIAL_TRACE_LEVEL
-#define APPL_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_DEBUG
-#endif
-
-#ifndef NFC_INITIAL_TRACE_LEVEL
-#define NFC_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_DEBUG
-#endif
-
-#ifndef SMP_INITIAL_TRACE_LEVEL
-#define SMP_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_DEBUG
-#endif
-
-#define BT_TRACE_0(l, t, m) \
-  LogMsg_0((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), (m))
-#define BT_TRACE_1(l, t, m, p1)                                   \
-  LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-           (uintptr_t)(p1))
-#define BT_TRACE_2(l, t, m, p1, p2)                               \
-  LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-           (uintptr_t)(p1), (uintptr_t)(p2))
-#define BT_TRACE_3(l, t, m, p1, p2, p3)                           \
-  LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-           (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3))
-#define BT_TRACE_4(l, t, m, p1, p2, p3, p4)                       \
-  LogMsg_4(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m), \
-           (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4))
-#define BT_TRACE_5(l, t, m, p1, p2, p3, p4, p5)                                \
-  LogMsg_5(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m),              \
-           (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4), \
-           (uintptr_t)(p5))
-#define BT_TRACE_6(l, t, m, p1, p2, p3, p4, p5, p6)                            \
-  LogMsg_6(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t), (m),              \
-           (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3), (uintptr_t)(p4), \
-           (uintptr_t)(p5), (uintptr_t)(p6))
-
-#define BT_ERROR_TRACE_0(l, m) \
-  LogMsg_0(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, (m))
-#define BT_ERROR_TRACE_1(l, m, p1)                                             \
-  LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, (m), \
-           (uintptr_t)(p1))
-#define BT_ERROR_TRACE_2(l, m, p1, p2)                                         \
-  LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, (m), \
-           (uintptr_t)(p1), (uintptr_t)(p2))
-#define BT_ERROR_TRACE_3(l, m, p1, p2, p3)                                     \
-  LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, (m), \
-           (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3))
-
-/* Define tracing for the LLCP unit
-*/
-#define LLCP_TRACE_ERROR0(m)                             \
-  {                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m); \
-  }
-#define LLCP_TRACE_ERROR1(m, p1)                             \
-  {                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define LLCP_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                              \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define LLCP_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define LLCP_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define LLCP_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                         \
-      BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define LLCP_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                        \
-      BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define LLCP_TRACE_WARNING0(m)                             \
-  {                                                        \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m); \
-  }
-#define LLCP_TRACE_WARNING1(m, p1)                             \
-  {                                                            \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define LLCP_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                                \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define LLCP_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                    \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define LLCP_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                        \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define LLCP_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                            \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                         \
-      BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define LLCP_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                           \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                         \
-  }
-
-#define LLCP_TRACE_API0(m)                             \
-  {                                                    \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_API, m); \
-  }
-#define LLCP_TRACE_API1(m, p1)                             \
-  {                                                        \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1); \
-  }
-#define LLCP_TRACE_API2(m, p1, p2)                             \
-  {                                                            \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define LLCP_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define LLCP_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define LLCP_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define LLCP_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API)                             \
-      BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define LLCP_TRACE_EVENT0(m)                             \
-  {                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m); \
-  }
-#define LLCP_TRACE_EVENT1(m, p1)                             \
-  {                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define LLCP_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                              \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define LLCP_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define LLCP_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define LLCP_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                         \
-      BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define LLCP_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                        \
-      BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define LLCP_TRACE_DEBUG0(m)                             \
-  {                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m); \
-  }
-#define LLCP_TRACE_DEBUG1(m, p1)                             \
-  {                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define LLCP_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                              \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define LLCP_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define LLCP_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define LLCP_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                         \
-      BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define LLCP_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                        \
-      BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-/* Define tracing for the NFC unit
-*/
-#define NFC_TRACE_ERROR0(m)                             \
-  {                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m); \
-  }
-#define NFC_TRACE_ERROR1(m, p1)                             \
-  {                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define NFC_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                             \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define NFC_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define NFC_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define NFC_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                         \
-      BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define NFC_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                        \
-      BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NFC_TRACE_WARNING0(m)                             \
-  {                                                       \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m); \
-  }
-#define NFC_TRACE_WARNING1(m, p1)                             \
-  {                                                           \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define NFC_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                               \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define NFC_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                   \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define NFC_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                       \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define NFC_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                           \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                         \
-      BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define NFC_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                          \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                        \
-  }
-
-#define NFC_TRACE_API0(m)                             \
-  {                                                   \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_API, m); \
-  }
-#define NFC_TRACE_API1(m, p1)                             \
-  {                                                       \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1); \
-  }
-#define NFC_TRACE_API2(m, p1, p2)                             \
-  {                                                           \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define NFC_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                               \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define NFC_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                   \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define NFC_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                       \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define NFC_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                           \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API)                             \
-      BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define NFC_TRACE_EVENT0(m)                             \
-  {                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m); \
-  }
-#define NFC_TRACE_EVENT1(m, p1)                             \
-  {                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define NFC_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                             \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define NFC_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define NFC_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define NFC_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                         \
-      BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define NFC_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                        \
-      BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NFC_TRACE_DEBUG0(m)                             \
-  {                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m); \
-  }
-#define NFC_TRACE_DEBUG1(m, p1)                             \
-  {                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define NFC_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                             \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define NFC_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define NFC_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define NFC_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                         \
-      BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define NFC_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                        \
-      BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NCI_TRACE_ERROR0(m)                             \
-  {                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)    \
-      BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m); \
-  }
-#define NCI_TRACE_ERROR1(m, p1)                             \
-  {                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)        \
-      BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define NCI_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                             \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)            \
-      BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define NCI_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                \
-      BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define NCI_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                    \
-      BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define NCI_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                        \
-      BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define NCI_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NCI_TRACE_WARNING0(m)                             \
-  {                                                       \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)    \
-      BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m); \
-  }
-#define NCI_TRACE_WARNING1(m, p1)                             \
-  {                                                           \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)        \
-      BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define NCI_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                               \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)            \
-      BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define NCI_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                   \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                \
-      BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define NCI_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                       \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                    \
-      BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define NCI_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                           \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define NCI_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                          \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                       \
-      BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                        \
-  }
-
-#define NCI_TRACE_API0(m)                             \
-  {                                                   \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)    \
-      BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_API, m); \
-  }
-#define NCI_TRACE_API1(m, p1)                             \
-  {                                                       \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)        \
-      BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1); \
-  }
-#define NCI_TRACE_API2(m, p1, p2)                             \
-  {                                                           \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)            \
-      BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define NCI_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                               \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)                \
-      BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define NCI_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                   \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)                    \
-      BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define NCI_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                       \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)                        \
-      BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define NCI_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                           \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_API)                            \
-      BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define NCI_TRACE_EVENT0(m)                             \
-  {                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)    \
-      BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m); \
-  }
-#define NCI_TRACE_EVENT1(m, p1)                             \
-  {                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)        \
-      BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define NCI_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                             \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)            \
-      BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define NCI_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                \
-      BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define NCI_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                    \
-      BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define NCI_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                        \
-      BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define NCI_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NCI_TRACE_DEBUG0(m)                             \
-  {                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)    \
-      BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m); \
-  }
-#define NCI_TRACE_DEBUG1(m, p1)                             \
-  {                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)        \
-      BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define NCI_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                             \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)            \
-      BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define NCI_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                \
-      BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define NCI_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                    \
-      BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define NCI_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                        \
-      BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define NCI_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (ncit_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define RW_TRACE_ERROR0(m)                             \
-  {                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m); \
-  }
-#define RW_TRACE_ERROR1(m, p1)                             \
-  {                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define RW_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define RW_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define RW_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define RW_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                         \
-      BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define RW_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                             \
-      BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define RW_TRACE_WARNING0(m)                             \
-  {                                                      \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m); \
-  }
-#define RW_TRACE_WARNING1(m, p1)                             \
-  {                                                          \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define RW_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                              \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define RW_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define RW_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define RW_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                         \
-      BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define RW_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define RW_TRACE_API0(m)                             \
-  {                                                  \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_API, m); \
-  }
-#define RW_TRACE_API1(m, p1)                             \
-  {                                                      \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1); \
-  }
-#define RW_TRACE_API2(m, p1, p2)                             \
-  {                                                          \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define RW_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                              \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define RW_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                  \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define RW_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                      \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define RW_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                          \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_API)                             \
-      BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define RW_TRACE_EVENT0(m)                             \
-  {                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m); \
-  }
-#define RW_TRACE_EVENT1(m, p1)                             \
-  {                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define RW_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define RW_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define RW_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define RW_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                         \
-      BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define RW_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                             \
-      BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define RW_TRACE_DEBUG0(m)                             \
-  {                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m); \
-  }
-#define RW_TRACE_DEBUG1(m, p1)                             \
-  {                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define RW_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define RW_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define RW_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define RW_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                         \
-      BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define RW_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                             \
-      BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define CE_TRACE_ERROR0(m)                             \
-  {                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m); \
-  }
-#define CE_TRACE_ERROR1(m, p1)                             \
-  {                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define CE_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define CE_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define CE_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define CE_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                         \
-      BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define CE_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                             \
-      BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define CE_TRACE_WARNING0(m)                             \
-  {                                                      \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m); \
-  }
-#define CE_TRACE_WARNING1(m, p1)                             \
-  {                                                          \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define CE_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                              \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define CE_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define CE_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define CE_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                         \
-      BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define CE_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define CE_TRACE_API0(m)                             \
-  {                                                  \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_API, m); \
-  }
-#define CE_TRACE_API1(m, p1)                             \
-  {                                                      \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1); \
-  }
-#define CE_TRACE_API2(m, p1, p2)                             \
-  {                                                          \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define CE_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                              \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define CE_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                  \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define CE_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                      \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define CE_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                          \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_API)                             \
-      BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define CE_TRACE_EVENT0(m)                             \
-  {                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m); \
-  }
-#define CE_TRACE_EVENT1(m, p1)                             \
-  {                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define CE_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define CE_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define CE_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define CE_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                         \
-      BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define CE_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                             \
-      BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define CE_TRACE_DEBUG0(m)                             \
-  {                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m); \
-  }
-#define CE_TRACE_DEBUG1(m, p1)                             \
-  {                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define CE_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define CE_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define CE_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define CE_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                         \
-      BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define CE_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                             \
-      BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define NDEF_TRACE_ERROR0(m)                             \
-  {                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m); \
-  }
-#define NDEF_TRACE_ERROR1(m, p1)                             \
-  {                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define NDEF_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                              \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define NDEF_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define NDEF_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define NDEF_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                         \
-      BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define NDEF_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                        \
-      BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define NDEF_TRACE_WARNING0(m)                             \
-  {                                                        \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m); \
-  }
-#define NDEF_TRACE_WARNING1(m, p1)                             \
-  {                                                            \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define NDEF_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                                \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define NDEF_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                    \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define NDEF_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                        \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define NDEF_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                            \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                         \
-      BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define NDEF_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                           \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                        \
-      BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                         \
-  }
-
-#define NDEF_TRACE_API0(m)                             \
-  {                                                    \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_API, m); \
-  }
-#define NDEF_TRACE_API1(m, p1)                             \
-  {                                                        \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1); \
-  }
-#define NDEF_TRACE_API2(m, p1, p2)                             \
-  {                                                            \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define NDEF_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                                \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define NDEF_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                    \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define NDEF_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                        \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define NDEF_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                            \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API)                             \
-      BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define NDEF_TRACE_EVENT0(m)                             \
-  {                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m); \
-  }
-#define NDEF_TRACE_EVENT1(m, p1)                             \
-  {                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define NDEF_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                              \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define NDEF_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define NDEF_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define NDEF_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                         \
-      BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define NDEF_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                        \
-      BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-#define NDEF_TRACE_DEBUG0(m)                             \
-  {                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m); \
-  }
-#define NDEF_TRACE_DEBUG1(m, p1)                             \
-  {                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define NDEF_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                              \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define NDEF_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                  \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define NDEF_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                      \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define NDEF_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                          \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                         \
-      BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define NDEF_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                         \
-    if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                        \
-      BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                       \
-  }
-
-/* Define tracing for the NFA unit
-*/
-#define NFA_TRACE_ERROR0(m)                             \
-  {                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) \
-      BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m); \
-  }
-#define NFA_TRACE_ERROR1(m, p1)                             \
-  {                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define NFA_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define NFA_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define NFA_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define NFA_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define NFA_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                    \
-      BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NFA_TRACE_WARNING0(m)                             \
-  {                                                       \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) \
-      BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m); \
-  }
-#define NFA_TRACE_WARNING1(m, p1)                             \
-  {                                                           \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define NFA_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                               \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define NFA_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                   \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define NFA_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                       \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define NFA_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                           \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define NFA_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                          \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                    \
-      BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                        \
-  }
-
-#define NFA_TRACE_API0(m)                             \
-  {                                                   \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) \
-      BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_API, m); \
-  }
-#define NFA_TRACE_API1(m, p1)                             \
-  {                                                       \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1); \
-  }
-#define NFA_TRACE_API2(m, p1, p2)                             \
-  {                                                           \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define NFA_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                               \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define NFA_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                   \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define NFA_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                       \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define NFA_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                           \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define NFA_TRACE_EVENT0(m)                             \
-  {                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) \
-      BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m); \
-  }
-#define NFA_TRACE_EVENT1(m, p1)                             \
-  {                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define NFA_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define NFA_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define NFA_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define NFA_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define NFA_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                    \
-      BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define NFA_TRACE_DEBUG0(m)                             \
-  {                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) \
-      BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m); \
-  }
-#define NFA_TRACE_DEBUG1(m, p1)                             \
-  {                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define NFA_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define NFA_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define NFA_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define NFA_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define NFA_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                    \
-      BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-/* Define tracing for the NFA P2P unit
-*/
-#define P2P_TRACE_ERROR0(m)                             \
-  {                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR) \
-      BT_TRACE_0(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m); \
-  }
-#define P2P_TRACE_ERROR1(m, p1)                             \
-  {                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)     \
-      BT_TRACE_1(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1); \
-  }
-#define P2P_TRACE_ERROR2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)         \
-      BT_TRACE_2(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1, p2); \
-  }
-#define P2P_TRACE_ERROR3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)             \
-      BT_TRACE_3(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1, p2, p3); \
-  }
-#define P2P_TRACE_ERROR4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                 \
-      BT_TRACE_4(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1, p2, p3, p4); \
-  }
-#define P2P_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                     \
-      BT_TRACE_5(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5); \
-  }
-#define P2P_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_ERROR)                    \
-      BT_TRACE_6(TRACE_LAYER_P2P, TRACE_TYPE_ERROR, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define P2P_TRACE_WARNING0(m)                             \
-  {                                                       \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING) \
-      BT_TRACE_0(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m); \
-  }
-#define P2P_TRACE_WARNING1(m, p1)                             \
-  {                                                           \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)     \
-      BT_TRACE_1(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1); \
-  }
-#define P2P_TRACE_WARNING2(m, p1, p2)                             \
-  {                                                               \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)         \
-      BT_TRACE_2(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1, p2); \
-  }
-#define P2P_TRACE_WARNING3(m, p1, p2, p3)                             \
-  {                                                                   \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)             \
-      BT_TRACE_3(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1, p2, p3); \
-  }
-#define P2P_TRACE_WARNING4(m, p1, p2, p3, p4)                             \
-  {                                                                       \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                 \
-      BT_TRACE_4(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1, p2, p3, p4); \
-  }
-#define P2P_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                           \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      BT_TRACE_5(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5); \
-  }
-#define P2P_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                          \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_WARNING)                    \
-      BT_TRACE_6(TRACE_LAYER_P2P, TRACE_TYPE_WARNING, m, p1, p2, p3, p4, p5, \
-                 p6);                                                        \
-  }
-
-#define P2P_TRACE_API0(m)                             \
-  {                                                   \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API) \
-      BT_TRACE_0(TRACE_LAYER_P2P, TRACE_TYPE_API, m); \
-  }
-#define P2P_TRACE_API1(m, p1)                             \
-  {                                                       \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)     \
-      BT_TRACE_1(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1); \
-  }
-#define P2P_TRACE_API2(m, p1, p2)                             \
-  {                                                           \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)         \
-      BT_TRACE_2(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1, p2); \
-  }
-#define P2P_TRACE_API3(m, p1, p2, p3)                             \
-  {                                                               \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)             \
-      BT_TRACE_3(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1, p2, p3); \
-  }
-#define P2P_TRACE_API4(m, p1, p2, p3, p4)                             \
-  {                                                                   \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)                 \
-      BT_TRACE_4(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1, p2, p3, p4); \
-  }
-#define P2P_TRACE_API5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                       \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)                     \
-      BT_TRACE_5(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1, p2, p3, p4, p5); \
-  }
-#define P2P_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                             \
-  {                                                                           \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_API)                         \
-      BT_TRACE_6(TRACE_LAYER_P2P, TRACE_TYPE_API, m, p1, p2, p3, p4, p5, p6); \
-  }
-
-#define P2P_TRACE_EVENT0(m)                             \
-  {                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT) \
-      BT_TRACE_0(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m); \
-  }
-#define P2P_TRACE_EVENT1(m, p1)                             \
-  {                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)     \
-      BT_TRACE_1(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1); \
-  }
-#define P2P_TRACE_EVENT2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)         \
-      BT_TRACE_2(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1, p2); \
-  }
-#define P2P_TRACE_EVENT3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)             \
-      BT_TRACE_3(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1, p2, p3); \
-  }
-#define P2P_TRACE_EVENT4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                 \
-      BT_TRACE_4(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1, p2, p3, p4); \
-  }
-#define P2P_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                     \
-      BT_TRACE_5(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5); \
-  }
-#define P2P_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_EVENT)                    \
-      BT_TRACE_6(TRACE_LAYER_P2P, TRACE_TYPE_EVENT, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-#define P2P_TRACE_DEBUG0(m)                             \
-  {                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) \
-      BT_TRACE_0(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m); \
-  }
-#define P2P_TRACE_DEBUG1(m, p1)                             \
-  {                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)     \
-      BT_TRACE_1(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1); \
-  }
-#define P2P_TRACE_DEBUG2(m, p1, p2)                             \
-  {                                                             \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)         \
-      BT_TRACE_2(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1, p2); \
-  }
-#define P2P_TRACE_DEBUG3(m, p1, p2, p3)                             \
-  {                                                                 \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)             \
-      BT_TRACE_3(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1, p2, p3); \
-  }
-#define P2P_TRACE_DEBUG4(m, p1, p2, p3, p4)                             \
-  {                                                                     \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                 \
-      BT_TRACE_4(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4); \
-  }
-#define P2P_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                             \
-  {                                                                         \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                     \
-      BT_TRACE_5(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5); \
-  }
-#define P2P_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                        \
-  {                                                                        \
-    if (nfa_p2p_cb.trace_level >= BT_TRACE_LEVEL_DEBUG)                    \
-      BT_TRACE_6(TRACE_LAYER_P2P, TRACE_TYPE_DEBUG, m, p1, p2, p3, p4, p5, \
-                 p6);                                                      \
-  }
-
-/* define traces for application */
-#define APPL_TRACE_ERROR0(m)                                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m));                                                    \
-  }
-#define APPL_TRACE_ERROR1(m, p1)                                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1));                                   \
-  }
-#define APPL_TRACE_ERROR2(m, p1, p2)                                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2));                  \
-  }
-#define APPL_TRACE_ERROR3(m, p1, p2, p3)                                \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3)); \
-  }
-#define APPL_TRACE_ERROR4(m, p1, p2, p3, p4)                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4));                                        \
-  }
-#define APPL_TRACE_ERROR5(m, p1, p2, p3, p4, p5)                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5));                       \
-  }
-#define APPL_TRACE_ERROR6(m, p1, p2, p3, p4, p5, p6)                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_ERROR)                       \
-      LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_ERROR,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5), (uintptr_t)(p6));      \
-  }
-
-#define APPL_TRACE_WARNING0(m)                                          \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m));                                                    \
-  }
-#define APPL_TRACE_WARNING1(m, p1)                                      \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1));                                   \
-  }
-#define APPL_TRACE_WARNING2(m, p1, p2)                                  \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2));                  \
-  }
-#define APPL_TRACE_WARNING3(m, p1, p2, p3)                              \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3)); \
-  }
-#define APPL_TRACE_WARNING4(m, p1, p2, p3, p4)                          \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4));                                        \
-  }
-#define APPL_TRACE_WARNING5(m, p1, p2, p3, p4, p5)                      \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5));                       \
-  }
-#define APPL_TRACE_WARNING6(m, p1, p2, p3, p4, p5, p6)                  \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_WARNING)                     \
-      LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_WARNING,                                  \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5), (uintptr_t)(p6));      \
-  }
-
-#define APPL_TRACE_API0(m)                                              \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m));                                                    \
-  }
-#define APPL_TRACE_API1(m, p1)                                          \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1));                                   \
-  }
-#define APPL_TRACE_API2(m, p1, p2)                                      \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2));                  \
-  }
-#define APPL_TRACE_API3(m, p1, p2, p3)                                  \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3)); \
-  }
-#define APPL_TRACE_API4(m, p1, p2, p3, p4)                              \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4));                                        \
-  }
-#define APPL_TRACE_API5(m, p1, p2, p3, p4, p5)                          \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5));                       \
-  }
-#define APPL_TRACE_API6(m, p1, p2, p3, p4, p5, p6)                      \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_API)                         \
-      LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_API,                                      \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5), (uintptr_t)(p6));      \
-  }
-
-#define APPL_TRACE_EVENT0(m)                                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m));                                                    \
-  }
-#define APPL_TRACE_EVENT1(m, p1)                                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1));                                   \
-  }
-#define APPL_TRACE_EVENT2(m, p1, p2)                                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2));                  \
-  }
-#define APPL_TRACE_EVENT3(m, p1, p2, p3)                                \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3)); \
-  }
-#define APPL_TRACE_EVENT4(m, p1, p2, p3, p4)                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4));                                        \
-  }
-#define APPL_TRACE_EVENT5(m, p1, p2, p3, p4, p5)                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5));                       \
-  }
-#define APPL_TRACE_EVENT6(m, p1, p2, p3, p4, p5, p6)                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_EVENT)                       \
-      LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_EVENT,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5), (uintptr_t)(p6));      \
-  }
-
-#define APPL_TRACE_DEBUG0(m)                                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m));                                                    \
-  }
-#define APPL_TRACE_DEBUG1(m, p1)                                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1));                                   \
-  }
-#define APPL_TRACE_DEBUG2(m, p1, p2)                                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2));                  \
-  }
-#define APPL_TRACE_DEBUG3(m, p1, p2, p3)                                \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3)); \
-  }
-#define APPL_TRACE_DEBUG4(m, p1, p2, p3, p4)                            \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4));                                        \
-  }
-#define APPL_TRACE_DEBUG5(m, p1, p2, p3, p4, p5)                        \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5));                       \
-  }
-#define APPL_TRACE_DEBUG6(m, p1, p2, p3, p4, p5, p6)                    \
-  {                                                                     \
-    if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG)                       \
-      LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
-                   TRACE_TYPE_DEBUG,                                    \
-               (m), (uintptr_t)(p1), (uintptr_t)(p2), (uintptr_t)(p3),  \
-               (uintptr_t)(p4), (uintptr_t)(p5), (uintptr_t)(p6));      \
-  }
-
-#endif /* BT_TRACE_H */
diff --git a/src/include/bt_types.h b/src/include/bt_types.h
index b147756..93bcb69 100644
--- a/src/include/bt_types.h
+++ b/src/include/bt_types.h
@@ -22,46 +22,14 @@
 #include "data_types.h"
 #include "nfc_types.h"
 
-#define SCR_PROTO_TRACE_NCI 0x00004000
-#define SCR_PROTO_TRACE_ALL 0x001fffff
-#define SCR_PROTO_TRACE_HCI_SUMMARY 0x00000001
-
-#define TRACE_LAYER_NONE 0x00000000
-#define TRACE_LAYER_HCI 0x00070000
-#define TRACE_LAYER_GKI 0x001a0000
-#define TRACE_LAYER_NFC 0x00270000
-/*it's overwritten in nfc_types.h*/
-#define TRACE_LAYER_NCI 0x00280000
-#define TRACE_LAYER_LLCP 0x00290000
-#define TRACE_LAYER_NDEF 0x002a0000
-#define TRACE_LAYER_RW 0x002b0000
-#define TRACE_LAYER_CE 0x002c0000
-#define TRACE_LAYER_P2P 0x002d0000
-#define TRACE_LAYER_NFA 0x00300000
-/*it's overwritten in nfc_types.h*/
-#define TRACE_LAYER_HAL 0x00310000
-#define TRACE_LAYER_MAX_NUM 0x0032
-
 /* NCI Command, Notification or Data*/
 #define BT_EVT_TO_NFC_NCI 0x4000
-#define BT_EVT_TO_NFC_NCI_VS 0x4200 /* Vendor specific message */
 /* messages between NFC and NCI task */
 #define BT_EVT_TO_NFC_MSGS 0x4300
 
 /* start timer */
 #define BT_EVT_TO_START_TIMER 0x3c00
 
-/* stop timer */
-#define BT_EVT_TO_STOP_TIMER 0x3d00
-
 /* start quick timer */
 #define BT_EVT_TO_START_QUICK_TIMER 0x3e00
-
-#define TRACE_ORG_APPL 0x00000500
-
-#define DEV_CLASS_LEN 3
-typedef uint8_t DEV_CLASS[DEV_CLASS_LEN]; /* Device class */
-
-#define BD_ADDR_LEN 6                 /* Device address length */
-typedef uint8_t BD_ADDR[BD_ADDR_LEN]; /* Device address */
 #endif
diff --git a/src/include/buildcfg.h b/src/include/buildcfg.h
index 932db88..53f7aa2 100644
--- a/src/include/buildcfg.h
+++ b/src/include/buildcfg.h
@@ -26,15 +26,6 @@
 #define NFC_CONTORLLER_ID (1)
 #endif
 
-#define BTE_APPL_MAX_USERIAL_DEV_NAME (256)
-
-#ifdef BT_TRACE_VERBOSE
-#undef BT_TRACE_VERBOSE
-#endif
-#define BT_TRACE_VERBOSE TRUE
-
-#define TRACE_TASK_INCLUDED TRUE
-
 #define GKI_BUF1_MAX 0
 // 2 is in use
 #define GKI_BUF3_MAX 30
@@ -51,38 +42,11 @@
 #define GKI_BUF0_SIZE 268
 #define GKI_BUF0_MAX 40
 
-#define NCI_BUF_POOL_ID GKI_POOL_ID_0
 #define GKI_NUM_FIXED_BUF_POOLS 4
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern uint8_t* scru_dump_hex(uint8_t* p, char* p_title, uint32_t len,
-                              uint32_t trace_layer, uint32_t trace_type);
-extern void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...);
 extern void DispNci(uint8_t* p, uint16_t len, bool is_recv);
 
-extern void downloadFirmwarePatchFile(uint32_t brcm_hw_id);
-
 void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
                                       bool is_recv);
 #define DISP_NCI ProtoDispAdapterDisplayNciPacket
-#define LOGMSG_TAG_NAME "BrcmNfcNfa"
-
-#ifndef _TIMEB
-#define _TIMEB
-struct _timeb {
-  long time;
-  short millitm;
-  short timezone;
-  short dstflag;
-};
-void _ftime(struct _timeb*);
-
-#endif
-
-#ifdef __cplusplus
-};
-#endif
 #endif
diff --git a/src/include/config.h b/src/include/config.h
deleted file mode 100644
index 23c80fb..0000000
--- a/src/include/config.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 1999-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int GetStrValue(const char* name, char* p_value, unsigned long len);
-int GetNumValue(const char* name, void* p_value, unsigned long len);
-
-#ifdef __cplusplus
-};
-#endif
-
-#define NAME_POLLING_TECH_MASK "POLLING_TECH_MASK"
-#define NAME_REGISTER_VIRTUAL_SE "REGISTER_VIRTUAL_SE"
-#define NAME_APPL_TRACE_LEVEL "APPL_TRACE_LEVEL"
-#define NAME_USE_RAW_NCI_TRACE "USE_RAW_NCI_TRACE"
-#define NAME_LOGCAT_FILTER "LOGCAT_FILTER"
-#define NAME_LPTD_CFG "LPTD_CFG"
-#define NAME_SCREEN_OFF_POWER_STATE "SCREEN_OFF_POWER_STATE"
-#define NAME_PREINIT_DSP_CFG "PREINIT_DSP_CFG"
-#define NAME_DTA_START_CFG "DTA_START_CFG"
-#define NAME_TRANSPORT_DRIVER "TRANSPORT_DRIVER"
-#define NAME_POWER_CONTROL_DRIVER "POWER_CONTROL_DRIVER"
-#define NAME_PROTOCOL_TRACE_LEVEL "PROTOCOL_TRACE_LEVEL"
-#define NAME_UART_PORT "UART_PORT"
-#define NAME_UART_BAUD "UART_BAUD"
-#define NAME_UART_PARITY "UART_PARITY"
-#define NAME_UART_STOPBITS "UART_STOPBITS"
-#define NAME_UART_DATABITS "UART_DATABITS"
-#define NAME_CLIENT_ADDRESS "BCMI2CNFC_ADDRESS"
-#define NAME_NFA_DM_START_UP_CFG "NFA_DM_START_UP_CFG"
-#define NAME_NFA_DM_CFG "NFA_DM_CFG"
-#define NAME_NFA_DM_LP_CFG "NFA_DM_LP_CFG"
-#define NAME_LOW_SPEED_TRANSPORT "LOW_SPEED_TRANSPORT"
-#define NAME_NFC_WAKE_DELAY "NFC_WAKE_DELAY"
-#define NAME_NFC_WRITE_DELAY "NFC_WRITE_DELAY"
-#define NAME_PERF_MEASURE_FREQ "REPORT_PERFORMANCE_MEASURE"
-#define NAME_READ_MULTI_PACKETS "READ_MULTIPLE_PACKETS"
-#define NAME_POWER_ON_DELAY "POWER_ON_DELAY"
-#define NAME_PRE_POWER_OFF_DELAY "PRE_POWER_OFF_DELAY"
-#define NAME_POST_POWER_OFF_DELAY "POST_POWER_OFF_DELAY"
-#define NAME_APPL_DTA_MODE "APPL_DTA_MODE"
-#define NAME_CE3_PRE_POWER_OFF_DELAY "CE3_PRE_POWER_OFF_DELAY"
-#define NAME_NFA_STORAGE "NFA_STORAGE"
-#define NAME_NFA_DM_START_UP_VSC_CFG "NFA_DM_START_UP_VSC_CFG"
-#define NAME_NFA_DTA_START_UP_VSC_CFG "NFA_DTA_START_UP_VSC_CFG"
-#define NAME_UICC_LISTEN_TECH_MASK "UICC_LISTEN_TECH_MASK"
-#define NAME_UICC_LISTEN_TECH_EX_MASK "UICC_LISTEN_TECH_EXCLUDE_MASK"
-#define NAME_SNOOZE_MODE_CFG "SNOOZE_MODE_CFG"
-#define NAME_NFA_DM_DISC_DURATION_POLL "NFA_DM_DISC_DURATION_POLL"
-#define NAME_SPD_DEBUG "SPD_DEBUG"
-#define NAME_SPD_MAXRETRYCOUNT "SPD_MAX_RETRY_COUNT"
-#define NAME_SPI_NEGOTIATION "SPI_NEGOTIATION"
-#define NAME_AID_FOR_EMPTY_SELECT "AID_FOR_EMPTY_SELECT"
-#define NAME_PRESERVE_STORAGE "PRESERVE_STORAGE"
-#define NAME_NFA_MAX_EE_SUPPORTED "NFA_MAX_EE_SUPPORTED"
-#define NAME_NFCC_ENABLE_TIMEOUT "NFCC_ENABLE_TIMEOUT"
-#define NAME_NFA_DM_PRE_DISCOVERY_CFG "NFA_DM_PRE_DISCOVERY_CFG"
-#define NAME_POLL_FREQUENCY "POLL_FREQUENCY"
-#define NAME_XTAL_HARDWARE_ID "XTAL_HARDWARE_ID"
-#define NAME_XTAL_FREQUENCY "XTAL_FREQUENCY"
-#define NAME_XTAL_FREQ_INDEX "XTAL_FREQ_INDEX"
-#define NAME_XTAL_PARAMS_CFG "XTAL_PARAMS_CFG"
-#define NAME_EXCLUSIVE_SE_ACCESS "EXCLUSIVE_SE_ACCESS"
-#define NAME_DBG_NO_UICC_IDLE_TIMEOUT_TOGGLING \
-  "DBG_NO_UICC_IDLE_TIMEOUT_TOGGLING"
-#define NAME_PRESENCE_CHECK_ALGORITHM "PRESENCE_CHECK_ALGORITHM"
-#define NAME_ALLOW_NO_NVM "ALLOW_NO_NVM"
-#define NAME_DEVICE_HOST_WHITE_LIST "DEVICE_HOST_WHITE_LIST"
-#define NAME_POWER_OFF_MODE "POWER_OFF_MODE"
-#define NAME_GLOBAL_RESET "DO_GLOBAL_RESET"
-#define NAME_NCI_HAL_MODULE "NCI_HAL_MODULE"
-#define NAME_NFA_POLL_BAIL_OUT_MODE "NFA_POLL_BAIL_OUT_MODE"
-#define NAME_NFA_PROPRIETARY_CFG "NFA_PROPRIETARY_CFG"
-#define NAME_NFA_AID_BLOCK_ROUTE "NFA_AID_BLOCK_ROUTE"
-
-#define LPTD_PARAM_LEN (40)
-
-// default configuration
-#define default_transport "/dev/bcm2079x"
-#define default_storage_location "/data/nfc"
-
-struct tUART_CONFIG {
-  int m_iBaudrate;  // 115200
-  int m_iDatabits;  // 8
-  int m_iParity;    // 0 - none, 1 = odd, 2 = even
-  int m_iStopbits;
-};
-
-extern struct tUART_CONFIG uartConfig;
-#define MAX_CHIPID_LEN (16)
-void readOptionalConfig(const char* option);
-
-/* Snooze mode configuration structure */
-typedef struct {
-  unsigned char snooze_mode;         /* Snooze Mode */
-  unsigned char idle_threshold_dh;   /* Idle Threshold Host */
-  unsigned char idle_threshold_nfcc; /* Idle Threshold NFCC   */
-  unsigned char
-      nfc_wake_active_mode; /* NFC_LP_ACTIVE_LOW or NFC_LP_ACTIVE_HIGH */
-  unsigned char
-      dh_wake_active_mode; /* NFC_LP_ACTIVE_LOW or NFC_LP_ACTIVE_HIGH */
-} tSNOOZE_MODE_CONFIG;
-#endif
diff --git a/src/hal/include/gki_hal_target.h b/src/include/gki_hal_target.h
similarity index 71%
rename from src/hal/include/gki_hal_target.h
rename to src/include/gki_hal_target.h
index 4b065c7..9ae1bfe 100644
--- a/src/hal/include/gki_hal_target.h
+++ b/src/include/gki_hal_target.h
@@ -215,51 +215,4 @@
 #define GKI_SEND_MSG_FROM_ISR FALSE
 #endif
 
-#define GKI_TRACE_0(m)
-#define GKI_TRACE_1(m, p1)
-#define GKI_TRACE_2(m, p1, p2)
-#define GKI_TRACE_3(m, p1, p2, p3)
-#define GKI_TRACE_4(m, p1, p2, p3, p4)
-#define GKI_TRACE_5(m, p1, p2, p3, p4, p5)
-#define GKI_TRACE_6(m, p1, p2, p3, p4, p5, p6)
-
-#define GKI_TRACE_ERROR_0(m)                                                   \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m)
-#define GKI_TRACE_ERROR_1(m, p1)                                               \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1)
-#define GKI_TRACE_ERROR_2(m, p1, p2)                                           \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2)
-#define GKI_TRACE_ERROR_3(m, p1, p2, p3)                                       \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3)
-#define GKI_TRACE_ERROR_4(m, p1, p2, p3, p4)                                   \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4)
-#define GKI_TRACE_ERROR_5(m, p1, p2, p3, p4, p5)                               \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4, p5)
-#define GKI_TRACE_ERROR_6(m, p1, p2, p3, p4, p5, p6)                           \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4, p5, p6)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* GKI_TARGET_H */
diff --git a/src/include/gki_target.h b/src/include/gki_target.h
index 6413124..dfca10b 100644
--- a/src/include/gki_target.h
+++ b/src/include/gki_target.h
@@ -24,14 +24,6 @@
 
 #include "data_types.h"
 
-/* Operating System Selection */
-#ifndef BTE_SIM_APP
-#define _GKI_ARM
-#define _GKI_STANDALONE
-#else
-#define _BT_WIN32
-#endif
-
 /******************************************************************************
 **
 ** Task configuration
@@ -176,7 +168,7 @@
 
 /* The size of the buffers in pool 3. */
 #ifndef GKI_BUF3_SIZE
-#define GKI_BUF3_SIZE 2500
+#define GKI_BUF3_SIZE (0xFFB0)
 #endif
 
 /* The number of buffers in buffer pool 3. */
@@ -361,51 +353,4 @@
 #define GKI_BUF8_MAX 30
 #endif
 
-#define GKI_TRACE_0(m)
-#define GKI_TRACE_1(m, p1)
-#define GKI_TRACE_2(m, p1, p2)
-#define GKI_TRACE_3(m, p1, p2, p3)
-#define GKI_TRACE_4(m, p1, p2, p3, p4)
-#define GKI_TRACE_5(m, p1, p2, p3, p4, p5)
-#define GKI_TRACE_6(m, p1, p2, p3, p4, p5, p6)
-
-#define GKI_TRACE_ERROR_0(m)                                                   \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m)
-#define GKI_TRACE_ERROR_1(m, p1)                                               \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1)
-#define GKI_TRACE_ERROR_2(m, p1, p2)                                           \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2)
-#define GKI_TRACE_ERROR_3(m, p1, p2, p3)                                       \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3)
-#define GKI_TRACE_ERROR_4(m, p1, p2, p3, p4)                                   \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4)
-#define GKI_TRACE_ERROR_5(m, p1, p2, p3, p4, p5)                               \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4, p5)
-#define GKI_TRACE_ERROR_6(m, p1, p2, p3, p4, p5, p6)                           \
-  LogMsg(                                                                      \
-      TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR, \
-      m, p1, p2, p3, p4, p5, p6)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* GKI_TARGET_H */
diff --git a/src/hal/include/nci_defs.h b/src/include/nci_defs.h
similarity index 77%
rename from src/hal/include/nci_defs.h
rename to src/include/nci_defs.h
index 1428e50..3cbe41b 100644
--- a/src/hal/include/nci_defs.h
+++ b/src/include/nci_defs.h
@@ -27,25 +27,17 @@
 
 #include <stdint.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define NCI_BRCM_CO_ID 0x2E
-
 /* Define the message header size for all NCI Commands and Notifications.
 */
 #define NCI_MSG_HDR_SIZE 3  /* per NCI spec */
 #define NCI_DATA_HDR_SIZE 3 /* per NCI spec */
 #define NCI_MAX_PAYLOAD_SIZE 0xFE
-#define NCI_MAX_CTRL_SIZE 0xFF /* max control message size */
 #define NCI_CTRL_INIT_SIZE 32  /* initial NFCC control payload size */
 #define NCI_MAX_VSC_SIZE 0xFF
 #define APPL_DTA_MODE FALSE
 /* NCI header (3) + callback function pointer(8; use 8 to be safe) + HCIT (1
  * byte) */
 #define NCI_VSC_MSG_HDR_SIZE 12
-#define NCI_TL_SIZE 2
 
 /* Max frame size (256) - Prologue (1) - Epilogue (2) in ISO-DEP, CID and NAD
  * are not used*/
@@ -66,12 +58,6 @@
 #define NCI_MT_CMD 1 /* (NCI_MT_CMD << NCI_MT_SHIFT) = 0x20 */
 #define NCI_MT_RSP 2 /* (NCI_MT_RSP << NCI_MT_SHIFT) = 0x40 */
 #define NCI_MT_NTF 3 /* (NCI_MT_NTF << NCI_MT_SHIFT) = 0x60 */
-#define NCI_MT_CFG 4 /* (NCI_MT_CFG << NCI_MT_SHIFT) = 0x80 */
-
-#define NCI_MTS_CMD 0x20
-#define NCI_MTS_RSP 0x40
-#define NCI_MTS_NTF 0x60
-#define NCI_MTS_CFG 0x80
 
 #define NCI_NTF_BIT 0x80 /* the tNFC_VS_EVT is a notification */
 #define NCI_RSP_BIT 0x40 /* the tNFC_VS_EVT is a response     */
@@ -79,18 +65,13 @@
 /* for internal use only; not from specification */
 /* the following 2 flags are used in layer_specific for fragmentation/reassembly
  * of data packets */
-#define NCI_LS_DATA 0x00
-#define NCI_LS_DATA_PBF 0x01
 
 /* PBF: Packet Boundary Flag (byte 0) */
 #define NCI_PBF_MASK 0x10
 #define NCI_PBF_SHIFT 4
-#define NCI_PBF_NO_OR_LAST 0x00 /* not fragmented or last fragment */
-#define NCI_PBF_ST_CONT 0x10    /* start or continuing fragment */
 
 /* GID: Group Identifier (byte 0) */
 #define NCI_GID_MASK 0x0F
-#define NCI_GID_SHIFT 0
 #define NCI_GID_CORE 0x00      /* 0000b NCI Core group */
 #define NCI_GID_RF_MANAGE 0x01 /* 0001b RF Management group */
 #define NCI_GID_EE_MANAGE 0x02 /* 0010b NFCEE Management group */
@@ -115,26 +96,18 @@
 #define NCI_MSG_BLD_HDR0(p, mt, gid) \
   *(p)++ = (uint8_t)(((mt) << NCI_MT_SHIFT) | (gid));
 
-#define NCI_MSG_PBLD_HDR0(p, mt, pbf, gid) \
-  *(p)++ = (uint8_t)(((mt) << NCI_MT_SHIFT) | ((pbf) << NCI_PBF_SHIFT) | (gid));
-
 /* builds byte1 of NCI Command and Notification packet */
 #define NCI_MSG_BLD_HDR1(p, oid) *(p)++ = (uint8_t)(((oid) << NCI_OID_SHIFT));
 
 /* parse byte0 of NCI packet */
-#define NCI_MSG_PRS_HDR0(p, mt, pbf, gid)     \
-  mt = (*(p)&NCI_MT_MASK) >> NCI_MT_SHIFT;    \
-  pbf = (*(p)&NCI_PBF_MASK) >> NCI_PBF_SHIFT; \
-  gid = *(p)++ & NCI_GID_MASK;
-
-/* parse MT and PBF bits of NCI packet */
-#define NCI_MSG_PRS_MT_PBF(p, mt, pbf)     \
-  mt = (*(p)&NCI_MT_MASK) >> NCI_MT_SHIFT; \
-  pbf = (*(p)&NCI_PBF_MASK) >> NCI_PBF_SHIFT;
+#define NCI_MSG_PRS_HDR0(p, mt, pbf, gid)       \
+  mt = (*(p)&NCI_MT_MASK) >> NCI_MT_SHIFT;      \
+  (pbf) = (*(p)&NCI_PBF_MASK) >> NCI_PBF_SHIFT; \
+  (gid) = *(p)++ & NCI_GID_MASK;
 
 /* parse byte1 of NCI Cmd/Ntf */
 #define NCI_MSG_PRS_HDR1(p, oid) \
-  oid = (*(p)&NCI_OID_MASK);     \
+  (oid) = (*(p)&NCI_OID_MASK);   \
   (p)++;
 
 /* NCI Data Format:
@@ -145,12 +118,6 @@
  * is predefined  */
 #define NCI_CID_MASK 0x0F
 
-/* builds 3-byte message header of NCI Data packet */
-#define NCI_DATA_BLD_HDR(p, cid, len) \
-  *(p)++ = (uint8_t)(cid);            \
-  *(p)++ = 0;                         \
-  *(p)++ = (uint8_t)(len);
-
 #define NCI_DATA_PBLD_HDR(p, pbf, cid, len)             \
   *(p)++ = (uint8_t)(((pbf) << NCI_PBF_SHIFT) | (cid)); \
   *(p)++ = 0;                                           \
@@ -159,14 +126,13 @@
 #define NCI_DATA_PRS_HDR(p, pbf, cid, len)      \
   (pbf) = (*(p)&NCI_PBF_MASK) >> NCI_PBF_SHIFT; \
   (cid) = (*(p)&NCI_CID_MASK);                  \
-  p++;                                          \
-  p++;                                          \
+  (p)++;                                        \
+  (p)++;                                        \
   (len) = *(p)++;
 
 /* Logical target ID 0x01-0xFE */
 
 /* CORE_RESET_NTF reset trigger type*/
-#define NCI2_0_RESET_TRIGGER_TYPE_ERROR 0x00
 #define NCI2_0_RESET_TRIGGER_TYPE_POWERED_ON 0x01
 #define NCI2_0_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED 0x02
 
@@ -183,6 +149,7 @@
 #define NCI_STATUS_UNKNOWN_OID 0x08
 #define NCI_STATUS_INVALID_PARAM 0x09
 #define NCI_STATUS_MSG_SIZE_TOO_BIG 0x0A
+#define NCI_STATUS_NOT_SUPPORTED 0x0B
 /* discovery */
 #define NCI_STATUS_ALREADY_STARTED 0xA0
 #define NCI_STATUS_ACTIVATION_FAILED 0xA1
@@ -197,8 +164,6 @@
 #define NCI_STATUS_EE_PROTOCOL_ERR 0xC2
 #define NCI_STATUS_EE_TIMEOUT 0xC3
 
-typedef uint8_t tNCI_STATUS;
-
 /* RF Technologies */
 #define NCI_RF_TECHNOLOGY_A 0x00
 #define NCI_RF_TECHNOLOGY_B 0x01
@@ -250,7 +215,8 @@
  **********************************************/
 #define NCI_MSG_NFCEE_DISCOVER 0
 #define NCI_MSG_NFCEE_MODE_SET 1
-
+#define NCI_MSG_NFCEE_STATUS 2
+#define NCI_MSG_NFCEE_POWER_LINK_CTRL 3
 /**********************************************
  * NCI Proprietary  Group       - F
  **********************************************/
@@ -259,73 +225,41 @@
  * NCI Core Group Params
  **********************************************/
 #define NCI_CORE_PARAM_SIZE_RESET 0x01
-#define NCI_CORE_PARAM_SIZE_RESET_RSP 0x03
-#define NCI_CORE_PARAM_SIZE_RESET_NTF 0x02
+
+/**********************************************
+ * NCI Feature Bit
+ **********************************************/
+#define NCI_FEAT_HCI_NETWORK 0x00000008
 
 #define NCI_CORE_PARAM_SIZE_INIT(X) (((X) == NCI_VERSION_2_0) ? (0x02) : (0x00))
 #define NCI2_0_CORE_INIT_CMD_BYTE_0 0x00
 #define NCI2_0_CORE_INIT_CMD_BYTE_1 0x00
-#define NCI_CORE_PARAM_SIZE_INIT_RSP 0x11
-#define NCI_CORE_INIT_RSP_OFFSET_NUM_INTF 0x05
 
 /* Status (1 octet) and number of params */
-#define NCI_CORE_PARAM_SIZE_SET_CONFIG_RSP 0x02
 #define NCI_CORE_PARAM_SIZE_SET_POWER_SUB_STATE 0x01
 
-/* octet 0 */
-#define NCI_FEAT_DISCOVERY_FREG 0x00000001
-#define NCI_FEAT_DISCOVERY_CFGM 0x00000006
-/* octet 1 */
-#define NCI_FEAT_TECHNOLOGY_ROUTING 0x00000200
-#define NCI_FEAT_PROTOCOL_ROUTING 0x00000400
-#define NCI_FEAT_AID_ROUTING 0x00000800
-/* octet 2 */
-#define NCI_FEAT_BATTERY_OFF_MD 0x00010000
-#define NCI_FEAT_SWITCH_OFF_MD 0x00020000
-
-/* supported Interfaces */
-#define NCI_SUP_INTF_FRAME 0x0001
-#define NCI_SUP_INTF_ISO_DEP 0x0002
-#define NCI_SUP_INTF_NFC_DEP 0x0004
-
 #define NCI_CORE_PARAM_SIZE_CON_CREATE 0x02 /* handle, num_tlv, (tlv) */
 /* status, size, credits, conn_id */
-#define NCI_CORE_PARAM_SIZE_CON_CREATE_RSP 0x04
-#define NCI_CON_CREATE_TAG_EE_INTF 0x00 /* old */
 #define NCI_CON_CREATE_TAG_RF_DISC_ID 0x00
 #define NCI_CON_CREATE_TAG_NFCEE_VAL 0x01
 
 #define NCI_CORE_PARAM_SIZE_CON_CLOSE 0x01     /* Conn ID (1 octet) */
-#define NCI_CORE_PARAM_SIZE_CON_CLOSE_RSP 0x01 /* Status (1 octet) */
 
-/* RF Field Status (1 octet) */
-#define NCI_CORE_PARAM_SIZE_RF_FIELD_NTF 0x01
-
-/* Keep the NCI configuration (if possible) and perform NCI initialization. */
-#define NCI_RESET_TYPE_KEEP_CFG 0x00
 /* Reset the NCI configuration, and perform NCI initialization. */
 #define NCI_RESET_TYPE_RESET_CFG 0x01
 
-/* NCI Configuration has been kept  */
-#define NCI_RESET_STATUS_KEPT_CFG 0x00
-/* NCI Configuration has been reset */
-#define NCI_RESET_STATUS_RESET_CFG 0x01
-
 /* No operating field generated by remote device  */
 #define NCI_RF_STS_NO_REMOTE 0x00
 /* Operating field generated by remote device  */
 #define NCI_RF_STS_REMOTE 0x01
 
-#define NCI_PARAM_SIZE_DISCOVER_NFCEE 0x01 /* Discovery Action (1 octet) */
-/* Status (1 octet)Number of NFCEEs (1 octet) */
-#define NCI_PARAM_SIZE_DISCOVER_NFCEE_RSP 0x02
+/* Discovery Action (1 octet) */
+#define NCI_PARAM_SIZE_DISCOVER_NFCEE(X) \
+  (((X) == NCI_VERSION_2_0) ? 0X00 : 0X01)
 
 #define NCI_DISCOVER_ACTION_DISABLE 0
 #define NCI_DISCOVER_ACTION_ENABLE 1
 
-#define NCI_EE_DISCOVER_REQ_TYPE_LISTEN 0x01
-#define NCI_EE_DISCOVER_REQ_TYPE_POLL 0x02
-
 #define NCI_RF_PARAM_ID_TECH_N_MODE 0x00 /* RF Technology and Mode   */
 #define NCI_RF_PARAM_ID_TX_BIT_RATE 0x01 /* Transmit Bit Rate        */
 #define NCI_RF_PARAM_ID_RX_BIT_RATE 0x02 /* Receive Bit Rate         */
@@ -338,15 +272,21 @@
 #define NCI_NFCEE_INTERFACE_T3T 0x02
 #define NCI_NFCEE_INTERFACE_TRANSPARENT 0x03
 #define NCI_NFCEE_INTERFACE_PROPRIETARY 0x80
+/****************************************************
+ * NCI NFCEE INterface specific status Codes
+ ****************************************************/
+#define NCI_NFCEE_STS_UNRECOVERABLE_ERROR 0x00
+#define NCI_NFCEE_STS_INTF_ACTIVATION_FAILED 0xC0
+#define NCI_NFCEE_STS_TRANSMISSION_ERROR 0xC1
+#define NCI_NFCEE_STS_PROTOCOL_ERROR 0xC2
+#define NCI_NFCEE_STS_TIMEOUT_ERROR 0xC3
 
 #define NCI_NFCEE_STS_CONN_ACTIVE 0x00
 #define NCI_NFCEE_STS_CONN_INACTIVE 0x01
 #define NCI_NFCEE_STS_REMOVED 0x02
-#define NCI_NUM_NFCEE_STS 3
 
 /* Logical Target ID (1 octet)NFCEE Mode (1 octet) */
 #define NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET 0x02
-#define NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET_RSP 0x01 /* Status (1 octet) */
 
 /* Deactivate the connected NFCEE */
 #define NCI_NFCEE_MD_DEACTIVATE 0x00
@@ -372,11 +312,15 @@
 /* DH Request Failed due to error */
 #define NCI_DEACTIVATE_REASON_DH_REQ_FAILED 4
 
+/* The NFCEE status in NFCEE Status Notification */
+typedef uint8_t tNCI_EE_NTF_STATUS;
+
+/* NFCEE Power and Link Configuration */
+typedef uint8_t tNCI_NFCEE_PL_CONFIG;
+
 /**********************************************
 * NCI Interface Mode
 **********************************************/
-#define NCI_INTERFACE_MODE_POLL 1
-#define NCI_INTERFACE_MODE_LISTEN 2
 #define NCI_INTERFACE_MODE_POLL_N_LISTEN 3
 
 /**********************************************
@@ -394,15 +338,9 @@
 /**********************************************
  * NCI RF Management / DISCOVERY Group Params
  **********************************************/
-#define NCI_DISCOVER_PARAM_SIZE_RSP 0x01
 
 #define NCI_DISCOVER_PARAM_SIZE_SELECT 0x03     /* ID, protocol, interface */
-#define NCI_DISCOVER_PARAM_SIZE_SELECT_RSP 0x01 /* Status (1 octet) */
-#define NCI_DISCOVER_PARAM_SIZE_STOP 0x00       /*  */
-#define NCI_DISCOVER_PARAM_SIZE_STOP_RSP 0x01   /* Status (1 octet) */
 #define NCI_DISCOVER_PARAM_SIZE_DEACT 0x01      /* type */
-#define NCI_DISCOVER_PARAM_SIZE_DEACT_RSP 0x01  /* Status (1 octet) */
-#define NCI_DISCOVER_PARAM_SIZE_DEACT_NTF 0x01  /* type */
 
 /**********************************************
  * Supported Protocols
@@ -432,7 +370,6 @@
 #define NCI_DISCOVERY_TYPE_LISTEN_ACTIVE 0x83
 #define NCI_DISCOVERY_TYPE_LISTEN_F_ACTIVE 0x85
 #define NCI_DISCOVERY_TYPE_LISTEN_ISO15693 0x86
-#define NCI_DISCOVERY_TYPE_MAX NCI_DISCOVERY_TYPE_LISTEN_ISO15693
 
 typedef uint8_t tNCI_DISCOVERY_TYPE;
 
@@ -442,28 +379,32 @@
 #define NCI_EE_TRIG_APP_INIT 0x10
 
 #define NCI_EE_ACT_TAG_AID 0xC0   /* AID                 */
-#define NCI_EE_ACT_TAG_PROTO 0xC1 /* RF protocol         */
-#define NCI_EE_ACT_TAG_TECH 0xC2  /* RF technology       */
 #define NCI_EE_ACT_TAG_DATA 0xC3  /* hex data for app    */
-#define NCI_EE_ACT_TAG_DEBUG 0xC4 /* debug trace         */
 
+/* NFCEE ID (1 octet) PL config (1 octet) */
+#define NCI_CORE_PARAM_SIZE_NFCEE_PL_CTRL 0x02
+/* Status (1 octet) */
 /* Technology based routing  */
 #define NCI_ROUTE_TAG_TECH 0x00
 /* Protocol based routing  */
 #define NCI_ROUTE_TAG_PROTO 0x01
 #define NCI_ROUTE_TAG_AID 0x02 /* AID routing */
+#define NCI_ROUTE_TAG_SYSCODE 0x03 /* SystemCode routing */
 
 #define NCI_ROUTE_PWR_STATE_ON 0x01 /* The device is on */
 /* The device is switched off */
 #define NCI_ROUTE_PWR_STATE_SWITCH_OFF 0x02
 /* The device's battery is removed */
 #define NCI_ROUTE_PWR_STATE_BATT_OFF 0x04
-/* The device is in screen off Unlock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK 0x08
-/* The device is in screen on lock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK 0x10
-/* The device is in screen off lock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK 0x20
+/* The device is screen off Unlock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x08 : 0x80)
+/* The device is screen on lock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x10 : 0x40)
+/* The device is screen off lock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x20 : 0x00)
 
 /* Hardware / Registration Identification  */
 #define NCI_NFCEE_TAG_HW_ID 0x00
@@ -546,25 +487,8 @@
 #define NCI_PARAM_ID_ATR_RSP_CONFIG 0x62
 
 #define NCI_PARAM_ID_RF_FIELD_INFO 0x80
-#define NCI_PARAM_ID_RF_NFCEE_ACTION 0x81
 #define NCI_PARAM_ID_NFC_DEP_OP 0x82
 
-/* NCI_PARAM_ID_HOST_LISTEN_MASK (byte1 for DH, byte2 for UICC) */
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_A_PASSIVE & 0x0F)) */
-#define NCI_LISTEN_MASK_A 0x01
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_B_PASSIVE & 0x0F)) */
-#define NCI_LISTEN_MASK_B 0x02
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_F_PASSIVE & 0x0F)) */
-#define NCI_LISTEN_MASK_F 0x04
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_A_ACTIVE & 0x0F))  */
-#define NCI_LISTEN_MASK_A_ACTIVE 0x08
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_B_PRIME & 0x0F))   */
-#define NCI_LISTEN_MASK_B_PRIME 0x10
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_F_ACTIVE & 0x0F))  */
-#define NCI_LISTEN_MASK_F_ACTIVE 0x20
-/* (0x01 << (NCI_DISCOVERY_TYPE_LISTEN_ISO15693 & 0x0F))  */
-#define NCI_LISTEN_MASK_ISO15693 0x40
-
 /* Type A Parameters */
 #define NCI_PARAM_PLATFORM_T1T 0x0C
 #define NCI_PARAM_SEL_INFO_ISODEP 0x20
@@ -576,8 +500,6 @@
 
 #define NCI_PARAM_LEN_CON_DISCOVERY_PARAM 1
 
-#define NCI_PARAM_LEN_PA_FSDI 1
-
 #define NCI_PARAM_LEN_PF_RC 1
 
 #define NCI_PARAM_LEN_LA_BIT_FRAME_SDD 1
@@ -596,8 +518,6 @@
 #define NCI_PARAM_LEN_LF_CON_ADV_FEAT 1
 
 #define NCI_PARAM_LEN_LF_T3T_RD_ALLOWED 1  // Listen F NCI2.0 Parameter
-#define NCI_PARAM_LEN_LF_T3T_ID_MAX 16     // LF T3T indentifier Max Value 16
-#define NFA_CE_LISTEN_INFO_LF_MAX 16       // LF T3T indentifier Max Value 16
 
 #define NCI_PARAM_LEN_FWI 1
 #define NCI_PARAM_LEN_WT 1
@@ -608,11 +528,8 @@
 #define NCI_LISTEN_PROTOCOL_ISO_DEP 0x01
 #define NCI_LISTEN_PROTOCOL_NFC_DEP 0x02
 
-#define NCI_DISCOVER_PARAM_SIZE_TEST_RF 0x06
-
 /* LF_T3T_FLAGS2 listen bits all-disabled definition */
 #define NCI_LF_T3T_FLAGS2_ALL_DISABLED 0x0000
-#define NCI_LF_T3T_FLAGS2_ID1_ENABLED 0x0001
 
 /* The DH-NFCEE listen is considered as a enable NFCEE */
 #define NCI_LISTEN_DH_NFCEE_ENABLE_MASK 0x00
@@ -622,8 +539,9 @@
 #define NCI_POLLING_DH_DISABLE_MASK 0x00
 /* The DH polling is considered as a enable NFCEE */
 #define NCI_POLLING_DH_ENABLE_MASK 0x01
+/* SCBR support check with Core Init resp OCT1 byte */
+#define NCI_SCBR_MASK 0x10
 
-#define NCI_ROUTE_QUAL_MASK 0x70
 /* AID matching is allowed when the SELECT AID is longer */
 #define NCI_ROUTE_QUAL_LONG_SELECT 0x10
 /* AID matching is allowed when the SELECT AID is shorter */
@@ -631,28 +549,6 @@
 /* AID is blocked in unsupported power mode */
 #define NCI_ROUTE_QUAL_BLOCK_ROUTE 0x40
 
-typedef struct {
-  uint16_t addr;
-  uint8_t len;
-  uint8_t* data;
-} NCIP_T1T_SETMEM_CMD_t;
-
-typedef struct { uint8_t status; } NCIP_T1T_SETMEM_RSP_t;
-
-typedef struct { uint16_t addr; } NCIP_T1T_GETMEM_CMD_t;
-
-typedef struct {
-  uint8_t status;
-  uint8_t* data;
-} NCIP_T1T_GETMEM_RSP_t;
-
-typedef struct {
-  uint8_t hr0;
-  uint8_t hr1;
-} NCIP_T1T_SETHR_CMD_t;
-
-typedef struct { uint8_t status; } NCIP_T1T_SETHR_RSP_t;
-
 #ifndef NCI_GET_CMD_BUF
 #if (HCI_USE_VARIABLE_SIZE_CMD_BUF == FALSE)
 /* Allocate fixed-size buffer from HCI_CMD_POOL (default case) */
@@ -698,8 +594,6 @@
 } tNCI_RF_PB_PARAMS;
 
 #define NCI_MAX_SENSF_RES_LEN 18
-#define NCI_SENSF_RES_OFFSET_PAD0 8
-#define NCI_SENSF_RES_OFFSET_RD 16
 #define NCI_NFCID2_LEN 8
 #define NCI_T3T_PMM_LEN 8
 #define NCI_SYSTEMCODE_LEN 2
@@ -719,16 +613,6 @@
                                      Interface  */
 } tNCI_RF_LF_PARAMS;
 
-typedef struct {
-  tNCI_DISCOVERY_TYPE mode;
-  union {
-    tNCI_RF_PA_PARAMS pa;
-    tNCI_RF_PB_PARAMS pb;
-    tNCI_RF_PF_PARAMS pf;
-    tNCI_RF_LF_PARAMS lf;
-  } param; /* Discovery Type specific parameters */
-} tNCI_RF_TECH_PARAMS;
-
 #ifndef NCI_MAX_ATS_LEN
 #define NCI_MAX_ATS_LEN 60
 #endif
@@ -743,7 +627,6 @@
 #define NCI_ATS_TC_MASK 0x40
 #define NCI_ATS_TB_MASK 0x20
 #define NCI_ATS_TA_MASK 0x10
-#define NCI_ATS_FSCI_MASK 0x0F
 typedef struct {
   uint8_t ats_res_len;              /* Length of ATS RES */
   uint8_t ats_res[NCI_MAX_ATS_LEN]; /* ATS RES defined in [DIGPROT] */
@@ -785,20 +668,6 @@
 } tNCI_INTF_LB_ISO_DEP;
 
 typedef struct {
-  tNCI_INTF_TYPE type; /* Interface Type  1 Byte  See Table 67 */
-  union {
-    tNCI_INTF_LA_ISO_DEP la_iso;
-    tNCI_INTF_PA_ISO_DEP pa_iso;
-    tNCI_INTF_LB_ISO_DEP lb_iso;
-    tNCI_INTF_PB_ISO_DEP pb_iso;
-    tNCI_INTF_LA_NFC_DEP la_nfc;
-    tNCI_INTF_PA_NFC_DEP pa_nfc;
-    tNCI_INTF_LF_NFC_DEP lf_nfc;
-    tNCI_INTF_PF_NFC_DEP pf_nfc;
-  } intf_param; /* Activation Parameters   0 - n Bytes */
-} tNCI_INTF_PARAMS;
-
-typedef struct {
   uint8_t atr_res_len;                      /* Length of ATR_RES            */
   uint8_t atr_res[NCI_MAX_ATS_LEN];         /* ATR_RES (Byte 3 - Byte 17+n) */
   uint8_t max_payload_size;                 /* 64, 128, 192 or 254          */
@@ -807,8 +676,5 @@
   uint8_t waiting_time;                     /* WT -> Response Waiting Time
                                                RWT = (256 x 16/fC) x 2WT    */
 } tNCI_RF_ACM_P_PARAMS;
-#ifdef __cplusplus
-}
-#endif
 
 #endif /* NFC_NCI_DEFS_H */
diff --git a/src/include/nfc_brcm_defs.h b/src/include/nfc_brcm_defs.h
new file mode 100644
index 0000000..16a3e20
--- /dev/null
+++ b/src/include/nfc_brcm_defs.h
@@ -0,0 +1,91 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2012-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  This file contains the Broadcom-specific defintions that are shared
+ *  between HAL, nfc stack, adaptation layer and applications.
+ *
+ ******************************************************************************/
+
+#ifndef NFC_BRCM_DEFS_H
+#define NFC_BRCM_DEFS_H
+
+/**********************************************
+ * NCI Message Proprietary  Group       - F
+ **********************************************/
+#define NCI_MSG_GET_BUILD_INFO 0x04
+#define NCI_MSG_HCI_NETWK 0x05
+#define NCI_MSG_POWER_LEVEL 0x08
+#define NCI_MSG_UICC_READER_ACTION 0x0A
+/* reset HCI network/close all pipes (S,D) register */
+#define NCI_MSG_GET_NV_DEVICE 0x24
+#define NCI_MSG_LPTD 0x25
+#define NCI_MSG_EEPROM_RW 0x29
+#define NCI_MSG_GET_PATCH_VERSION 0x2D
+#define NCI_MSG_SECURE_PATCH_DOWNLOAD 0x2E
+
+/* Secure Patch Download definitions (patch type definitions) */
+#define NCI_SPD_TYPE_HEADER 0x00
+
+/**********************************************
+ * NCI Interface Types
+ **********************************************/
+#define NCI_INTERFACE_VS_MIFARE 0x80
+#define NCI_INTERFACE_VS_T2T_CE 0x82 /* for Card Emulation side */
+
+/**********************************************
+ * NCI Proprietary Parameter IDs
+ **********************************************/
+#define NCI_PARAM_ID_HOST_LISTEN_MASK 0xA2
+#define NCI_PARAM_ID_TAGSNIFF_CFG 0xB9
+#define NCI_PARAM_ID_ACT_ORDER 0xC5
+
+#define NFC_SNOOZE_MODE_UART 0x01    /* Snooze mode for UART    */
+
+#define NFC_SNOOZE_ACTIVE_LOW 0x00  /* high to low voltage is asserting */
+
+/**********************************************
+ * HCI definitions
+ **********************************************/
+#define NFC_HAL_HCI_SESSION_ID_LEN 8
+#define NFC_HAL_HCI_SYNC_ID_LEN 2
+
+/* Card emulation RF Gate A definitions */
+#define NFC_HAL_HCI_CE_RF_A_UID_REG_LEN 10
+#define NFC_HAL_HCI_CE_RF_A_ATQA_RSP_CODE_LEN 2
+#define NFC_HAL_HCI_CE_RF_A_MAX_HIST_DATA_LEN 15
+#define NFC_HAL_HCI_CE_RF_A_MAX_DATA_RATE_LEN 3
+
+/* Card emulation RF Gate B definitions */
+#define NFC_HAL_HCI_CE_RF_B_PUPI_LEN 4
+#define NFC_HAL_HCI_CE_RF_B_ATQB_LEN 4
+#define NFC_HAL_HCI_CE_RF_B_HIGHER_LAYER_RSP_LEN 61
+#define NFC_HAL_HCI_CE_RF_B_MAX_DATA_RATE_LEN 3
+
+/* Card emulation RF Gate BP definitions */
+#define NFC_HAL_HCI_CE_RF_BP_MAX_PAT_IN_LEN 8
+#define NFC_HAL_HCI_CE_RF_BP_DATA_OUT_LEN 40
+
+/* Reader RF Gate A definitions */
+#define NFC_HAL_HCI_RD_RF_B_HIGHER_LAYER_DATA_LEN 61
+
+/* DH HCI Network command definitions */
+#define NFC_HAL_HCI_DH_MAX_DYN_PIPES 20
+
+#endif /* NFC_BRCM_DEFS_H */
diff --git a/src/include/nfc_config.h b/src/include/nfc_config.h
new file mode 100644
index 0000000..c3687d9
--- /dev/null
+++ b/src/include/nfc_config.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include <config.h>
+
+/* Configs from libnfc-nci.conf */
+#define NAME_NFC_DEBUG_ENABLED "NFC_DEBUG_ENABLED"
+#define NAME_NFA_STORAGE "NFA_STORAGE"
+#define NAME_PRESERVE_STORAGE "PRESERVE_STORAGE"
+#define NAME_POLLING_TECH_MASK "POLLING_TECH_MASK"
+#define NAME_P2P_LISTEN_TECH_MASK "P2P_LISTEN_TECH_MASK"
+#define NAME_UICC_LISTEN_TECH_MASK "UICC_LISTEN_TECH_MASK"
+#define NAME_NFA_DM_CFG "NFA_DM_CFG"
+#define NAME_SCREEN_OFF_POWER_STATE "SCREEN_OFF_POWER_STATE"
+#define NAME_NFA_MAX_EE_SUPPORTED "NFA_MAX_EE_SUPPORTED"
+#define NAME_NFA_DM_DISC_DURATION_POLL "NFA_DM_DISC_DURATION_POLL"
+#define NAME_POLL_FREQUENCY "POLL_FREQUENCY"
+#define NAME_NFA_AID_BLOCK_ROUTE "NFA_AID_BLOCK_ROUTE"
+#define NAME_AID_FOR_EMPTY_SELECT "AID_FOR_EMPTY_SELECT"
+#define NAME_AID_MATCHING_MODE "AID_MATCHING_MODE"
+#define NAME_OFFHOST_AID_ROUTE_PWR_STATE "OFFHOST_AID_ROUTE_PWR_STATE"
+
+/* Configs from vendor interface */
+#define NAME_NFA_POLL_BAIL_OUT_MODE "NFA_POLL_BAIL_OUT_MODE"
+#define NAME_PRESENCE_CHECK_ALGORITHM "PRESENCE_CHECK_ALGORITHM"
+#define NAME_NFA_PROPRIETARY_CFG "NFA_PROPRIETARY_CFG"
+#define NAME_DEFAULT_OFFHOST_ROUTE "DEFAULT_OFFHOST_ROUTE"
+#define NAME_DEFAULT_NFCF_ROUTE "DEFAULT_NFCF_ROUTE"
+#define NAME_DEFAULT_SYS_CODE "DEFAULT_SYS_CODE"
+#define NAME_DEFAULT_SYS_CODE_ROUTE "DEFAULT_SYS_CODE_ROUTE"
+#define NAME_DEFAULT_SYS_CODE_PWR_STATE "DEFAULT_SYS_CODE_PWR_STATE"
+#define NAME_DEFAULT_ROUTE "DEFAULT_ROUTE"
+#define NAME_OFF_HOST_ESE_PIPE_ID "OFF_HOST_ESE_PIPE_ID"
+#define NAME_OFF_HOST_SIM_PIPE_ID "OFF_HOST_SIM_PIPE_ID"
+#define NAME_ISO_DEP_MAX_TRANSCEIVE "ISO_DEP_MAX_TRANSCEIVE"
+#define NAME_DEVICE_HOST_WHITE_LIST "DEVICE_HOST_WHITE_LIST"
+
+class NfcConfig {
+ public:
+  static bool hasKey(const std::string& key);
+  static std::string getString(const std::string& key);
+  static std::string getString(const std::string& key,
+                               std::string default_value);
+  static unsigned getUnsigned(const std::string& key);
+  static unsigned getUnsigned(const std::string& key, unsigned default_value);
+  static std::vector<uint8_t> getBytes(const std::string& key);
+  static void clear();
+
+ private:
+  void loadConfig();
+  static NfcConfig& getInstance();
+  NfcConfig();
+
+  ConfigFile config_;
+};
diff --git a/src/include/nfc_hal_api.h b/src/include/nfc_hal_api.h
new file mode 100644
index 0000000..205c6f7
--- /dev/null
+++ b/src/include/nfc_hal_api.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2012-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  NFC Hardware Abstraction Layer API
+ *
+ ******************************************************************************/
+#ifndef NFC_HAL_API_H
+#define NFC_HAL_API_H
+#include <hardware/nfc.h>
+#include "data_types.h"
+#include "nfc_hal_target.h"
+
+typedef uint8_t tHAL_NFC_STATUS;
+typedef void(tHAL_NFC_STATUS_CBACK)(tHAL_NFC_STATUS status);
+typedef void(tHAL_NFC_CBACK)(uint8_t event, tHAL_NFC_STATUS status);
+typedef void(tHAL_NFC_DATA_CBACK)(uint16_t data_len, uint8_t* p_data);
+
+/*******************************************************************************
+** tHAL_NFC_ENTRY HAL entry-point lookup table
+*******************************************************************************/
+
+typedef void(tHAL_API_INITIALIZE)(void);
+typedef void(tHAL_API_TERMINATE)(void);
+typedef void(tHAL_API_OPEN)(tHAL_NFC_CBACK* p_hal_cback,
+                            tHAL_NFC_DATA_CBACK* p_data_cback);
+typedef void(tHAL_API_CLOSE)(void);
+typedef void(tHAL_API_CORE_INITIALIZED)(uint16_t data_len,
+                                        uint8_t* p_core_init_rsp_params);
+typedef void(tHAL_API_WRITE)(uint16_t data_len, uint8_t* p_data);
+typedef bool(tHAL_API_PREDISCOVER)(void);
+typedef void(tHAL_API_CONTROL_GRANTED)(void);
+typedef void(tHAL_API_POWER_CYCLE)(void);
+typedef uint8_t(tHAL_API_GET_MAX_NFCEE)(void);
+
+typedef struct {
+  tHAL_API_INITIALIZE* initialize;
+  tHAL_API_TERMINATE* terminate;
+  tHAL_API_OPEN* open;
+  tHAL_API_CLOSE* close;
+  tHAL_API_CORE_INITIALIZED* core_initialized;
+  tHAL_API_WRITE* write;
+  tHAL_API_PREDISCOVER* prediscover;
+  tHAL_API_CONTROL_GRANTED* control_granted;
+  tHAL_API_POWER_CYCLE* power_cycle;
+  tHAL_API_GET_MAX_NFCEE* get_max_ee;
+
+} tHAL_NFC_ENTRY;
+
+/*******************************************************************************
+** HAL API Function Prototypes
+*******************************************************************************/
+
+#endif /* NFC_HAL_API_H  */
diff --git a/src/include/nfc_hal_int.h b/src/include/nfc_hal_int.h
new file mode 100644
index 0000000..b33a38b
--- /dev/null
+++ b/src/include/nfc_hal_int.h
@@ -0,0 +1,279 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2009-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  this file contains the NCI transport internal definitions and functions.
+ *
+ ******************************************************************************/
+
+#ifndef NFC_HAL_INT_H
+#define NFC_HAL_INT_H
+
+#include "gki.h"
+#include "nci_defs.h"
+#include "nfc_brcm_defs.h"
+#include "nfc_hal_api.h"
+#include "nfc_hal_int_api.h"
+#include "nfc_hal_target.h"
+
+using android::base::StringPrintf;
+
+/* NFC HAL Task Timer events */
+#ifndef NFC_HAL_QUICK_TIMER_EVT_MASK
+#define NFC_HAL_QUICK_TIMER_EVT_MASK (TIMER_0_EVT_MASK)
+#endif
+
+#ifndef NFC_HAL_QUICK_TIMER_ID
+#define NFC_HAL_QUICK_TIMER_ID (TIMER_0)
+#endif
+
+typedef uint8_t tNFC_HAL_WAIT_RSP;
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+
+#endif
+
+/* NFC HAL transport configuration */
+typedef struct {
+  bool shared_transport; /* TRUE if using shared HCI/NCI transport */
+  uint8_t userial_baud;
+  uint8_t userial_fc;
+} tNFC_HAL_TRANS_CFG;
+
+#ifdef TESTER
+/* For Insight, ncit_cfg is runtime-configurable */
+#define NFC_HAL_TRANS_CFG_QUALIFIER
+#else
+/* For all other platforms, ncit_cfg is constant */
+#define NFC_HAL_TRANS_CFG_QUALIFIER const
+#endif
+extern NFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg;
+
+/****************************************************************************
+** Internal constants and definitions
+****************************************************************************/
+
+typedef uint8_t tNFC_HAL_NCI_RAS;
+
+typedef uint8_t tNFC_HAL_POWER_MODE;
+
+#define NFC_HAL_SAVED_HDR_SIZE (2)
+#define NFC_HAL_SAVED_CMD_SIZE (2)
+
+#ifndef NFC_HAL_DEBUG
+#define NFC_HAL_DEBUG TRUE
+#endif
+
+#if (NFC_HAL_DEBUG == TRUE)
+extern bool nfc_debug_enabled;
+extern const char* const nfc_hal_init_state_str[];
+#define NFC_HAL_SET_INIT_STATE(state)                                        \
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(                          \
+      "init state: %d->%d(%s)", nfc_hal_cb.dev_cb.initializing_state, state, \
+      nfc_hal_init_state_str[state]);                                        \
+  nfc_hal_cb.dev_cb.initializing_state = state;
+#else
+#define NFC_HAL_SET_INIT_STATE(state) \
+  nfc_hal_cb.dev_cb.initializing_state = state;
+#endif
+
+typedef uint8_t tNFC_HAL_INIT_STATE;
+
+typedef uint8_t tNFC_HAL_DM_CONFIG;
+
+/* callback function prototype */
+typedef struct {
+  uint16_t opcode;
+  uint16_t param_len;
+  uint8_t* p_param_buf;
+} tNFC_HAL_BTVSC_CPLT;
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+
+/* data type for NFC_HAL_HCI_RSP_NV_READ_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  uint8_t block;
+  uint16_t size;
+  tHAL_NFC_STATUS status;
+} tNFC_HAL_HCI_RSP_NV_READ_EVT;
+
+/* data type for NFC_HAL_HCI_RSP_NV_WRITE_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  tHAL_NFC_STATUS status;
+} tNFC_HAL_HCI_RSP_NV_WRITE_EVT;
+
+/* union of all event data types */
+typedef union {
+  NFC_HDR hdr;
+  /* Internal events */
+  tNFC_HAL_HCI_RSP_NV_READ_EVT nv_read;
+  tNFC_HAL_HCI_RSP_NV_WRITE_EVT nv_write;
+} tNFC_HAL_HCI_EVENT_DATA;
+
+#endif
+/*****************************************************************************
+** Control block for NFC HAL
+*****************************************************************************/
+
+/* Information about current patch in NVM */
+typedef struct {
+  uint16_t project_id; /* Current project_id of patch in nvm       */
+  uint16_t ver_major;  /* Current major version of patch in nvm    */
+  uint16_t ver_minor;  /* Current minor version of patch in nvm    */
+  uint16_t fpm_size;   /* Current size of FPM patch in nvm         */
+  uint16_t lpm_size;   /* Current size of LPM patch in nvm         */
+  uint8_t flags;       /* See NFC_HAL_NVM_FLAGS_* flag definitions */
+  uint8_t nvm_type;    /* Current NVM Type - UICC/EEPROM           */
+  uint8_t chip_ver[NFC_HAL_PRM_MAX_CHIP_VER_LEN]; /* patch chip version       */
+} tNFC_HAL_NVM;
+
+/* Patch for I2C fix */
+typedef struct {
+  uint8_t* p_patch;      /* patch for i2c fix                */
+  uint32_t prei2c_delay; /* the dealy after preI2C patch */
+  uint16_t len;          /* i2c patch length                 */
+} tNFC_HAL_PRM_I2C_FIX_CB;
+
+/* Control block for NCI transport */
+typedef struct {
+  uint8_t nci_ctrl_size; /* Max size for NCI messages */
+  uint8_t rcv_state;     /* current rx state */
+  uint16_t rcv_len; /* bytes remaining to be received in current rx state     */
+  NFC_HDR* p_rcv_msg;  /* buffer to receive NCI message */
+  NFC_HDR* p_frag_msg; /* fragmented NCI message; waiting for last fragment */
+  NFC_HDR*
+      p_pend_cmd; /* pending NCI message; waiting for NFCC state to be free */
+  tNFC_HAL_NCI_RAS nci_ras; /* nci reassembly error status */
+  TIMER_LIST_ENT
+  nci_wait_rsp_timer; /* Timer for waiting for nci command response */
+  tNFC_HAL_WAIT_RSP nci_wait_rsp; /* nci wait response flag */
+  uint8_t
+      last_hdr[NFC_HAL_SAVED_HDR_SIZE]; /* part of last NCI command header */
+  uint8_t
+      last_cmd[NFC_HAL_SAVED_CMD_SIZE]; /* part of last NCI command payload */
+  void* p_vsc_cback; /* the callback function for last VSC command */
+} tNFC_HAL_NCIT_CB;
+
+/* Control block for device initialization */
+typedef struct {
+  tNFC_HAL_INIT_STATE initializing_state; /* state of initializing NFCC */
+
+  uint32_t brcm_hw_id; /* BRCM NFCC HW ID                          */
+  tNFC_HAL_DM_CONFIG next_dm_config; /* next config in post initialization */
+  uint8_t next_startup_vsc; /* next start-up VSC offset in post init    */
+
+  tNFC_HAL_POWER_MODE power_mode; /* NFCC power mode                          */
+  uint8_t snooze_mode;            /* current snooze mode                      */
+  uint8_t new_snooze_mode;        /* next snooze mode after receiving cmpl    */
+  uint8_t nfc_wake_active_mode;   /* NFC_HAL_LP_ACTIVE_LOW/HIGH               */
+  TIMER_LIST_ENT lp_timer;        /* timer for low power mode                 */
+
+  tHAL_NFC_STATUS_CBACK*
+      p_prop_cback; /* callback to notify complete of proprietary update */
+} tNFC_HAL_DEV_CB;
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+
+/* data members for NFC_HAL-HCI */
+typedef struct {
+  TIMER_LIST_ENT
+  hci_timer; /* Timer to avoid indefinitely waiting for response */
+  uint8_t*
+      p_hci_netwk_info_buf; /* Buffer for reading HCI Network information */
+  uint8_t* p_hci_netwk_dh_info_buf; /* Buffer for reading HCI Network DH
+                                       information */
+  uint8_t hci_netwk_config_block;  /* Rsp awaiting for hci network configuration
+                                      block */
+  bool b_wait_hcp_conn_create_rsp; /* Waiting for hcp connection create response
+                                      */
+  bool clear_all_pipes_to_uicc1;   /* UICC1 was restarted for patch download */
+  bool update_session_id; /* Next response from NFCC is to Get Session id cmd */
+  bool hci_fw_workaround; /* HAL HCI Workaround need */
+  bool hci_fw_validate_netwk_cmd; /* Flag to indicate if hci network ntf to
+                                     validate */
+  uint8_t hcp_conn_id;            /* NCI Connection id for HCP */
+  uint8_t dh_session_id[1];       /* Byte 0 of DH Session ID */
+} tNFC_HAL_HCI_CB;
+
+#endif
+
+typedef uint8_t tNFC_HAL_FLAGS;
+
+typedef struct {
+  tHAL_NFC_CBACK* p_stack_cback;     /* Callback for HAL event notification  */
+  tHAL_NFC_DATA_CBACK* p_data_cback; /* Callback for data event notification  */
+
+  TIMER_LIST_Q quick_timer_queue; /* timer list queue                 */
+  TIMER_LIST_ENT timer;           /* timer for NCI transport task     */
+
+  tNFC_HAL_NCIT_CB ncit_cb; /* NCI transport */
+  tNFC_HAL_DEV_CB dev_cb;   /* device initialization */
+  tNFC_HAL_NVM nvm_cb;      /* Information about current patch in NVM */
+
+  /* Patchram control block */
+  tNFC_HAL_PRM_CB prm;
+  tNFC_HAL_PRM_I2C_FIX_CB prm_i2c;
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+  /* data members for NFC_HAL-HCI */
+  tNFC_HAL_HCI_CB hci_cb;
+#endif
+
+  uint8_t pre_discover_done; /* TRUE, when the prediscover config is complete */
+  tNFC_HAL_FLAGS hal_flags;
+  uint8_t pre_set_mem_idx;
+
+  uint8_t max_rf_credits; /* NFC Max RF data credits */
+  uint8_t max_ee;         /* NFC Max number of NFCEE supported by NFCC */
+} tNFC_HAL_CB;
+
+/* Global NCI data */
+extern tNFC_HAL_CB nfc_hal_cb;
+
+extern uint8_t* p_nfc_hal_pre_discover_cfg;
+
+/****************************************************************************
+** Internal nfc functions
+****************************************************************************/
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+/* nfc_hal_hci.c */
+void nfc_hal_hci_enable(void);
+void nfc_hal_hci_evt_hdlr(tNFC_HAL_HCI_EVENT_DATA* p_evt_data);
+
+void nfc_hal_hci_handle_build_info(uint8_t chipverlen, uint8_t* p_chipverstr);
+#else
+#define nfc_hal_hci_enable() NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
+#define nfc_hal_hci_handle_build_info(p, a)
+#define nfc_hal_hci_evt_hdlr(p) ;
+#endif
+
+/* Define default NCI protocol trace function (if protocol tracing is enabled)
+ */
+#if (NFC_HAL_TRACE_PROTOCOL == TRUE)
+#if !defined(DISP_NCI)
+#define DISP_NCI (DispNci)
+void DispNci(uint8_t* p, uint16_t len, bool is_recv);
+#endif /* DISP_NCI */
+
+#endif /* NFC_HAL_TRACE_PROTOCOL */
+
+#endif /* NFC_HAL_INT_H */
diff --git a/src/include/nfc_hal_int_api.h b/src/include/nfc_hal_int_api.h
new file mode 100644
index 0000000..58b51d3
--- /dev/null
+++ b/src/include/nfc_hal_int_api.h
@@ -0,0 +1,77 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2009-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  Internal NFC HAL API functions.
+ *
+ ******************************************************************************/
+#ifndef NFC_HAL_INT_API_H
+#define NFC_HAL_INT_API_H
+
+/****************************************************************************
+** Device Configuration definitions
+****************************************************************************/
+
+/* Broadcom specific device initialization before sending NCI reset */
+
+typedef struct {
+  uint32_t brcm_hw_id;
+  uint16_t xtal_freq;
+  uint8_t xtal_index;
+} tNFC_HAL_DEV_INIT_XTAL_CFG;
+
+#define NFC_HAL_DEV_INIT_MAX_XTAL_CFG 5
+
+/*****************************************************************************
+**  Patch RAM Constants
+*****************************************************************************/
+
+/* patch format type */
+typedef uint8_t tNFC_HAL_PRM_FORMAT;
+
+/*****************************************************************************
+**  Patch RAM Callback for event notificaton
+*****************************************************************************/
+
+typedef uint8_t tNFC_HAL_NCI_EVT; /* MT + Opcode */
+
+/*******************************************************************************
+**
+** Function         HAL_NfcPrmSetSpdNciCmdPayloadSize
+**
+** Description      Set Host-to-NFCC NCI message size for secure patch download
+**
+**                  This API must be called before calling
+**                  HAL_NfcPrmDownloadStart. If the API is not called, then PRM
+**                  will use the default message size.
+**
+**                  Typically, this API is only called for platforms that have
+**                  message-size limitations in the transport/driver.
+**
+**                  Valid message size range:
+**                  NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE to 255.
+**
+** Returns          HAL_NFC_STATUS_OK if successful
+**                  HAL_NFC_STATUS_FAILED otherwise
+**
+**
+*******************************************************************************/
+tHAL_NFC_STATUS HAL_NfcPrmSetSpdNciCmdPayloadSize(uint8_t max_payload_size);
+
+#endif /* NFC_HAL_INT_API_H */
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_brcm.c b/src/include/nfc_hal_nv_ci.h
similarity index 63%
rename from halimpl/bcm2079x/hal/hal/nfc_hal_brcm.c
rename to src/include/nfc_hal_nv_ci.h
index 076596f..a9ec13d 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_brcm.c
+++ b/src/include/nfc_hal_nv_ci.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2010-2014 Broadcom Corporation
+ *  Copyright (C) 2003-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -18,11 +18,22 @@
 
 /******************************************************************************
  *
- *  This file contains function of the NFC unit to receive/process NFC VS
- *  commands.
+ *  This is the interface file for non valtile memory call-in functions.
  *
  ******************************************************************************/
-#include <string.h>
-#include "gki.h"
-#include "nfc_hal_int.h"
-#include "userial.h"
+#ifndef NFC_HAL_NV_CI_H
+#define NFC_HAL_NV_CI_H
+
+#include "nfc_hal_target.h"
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+
+#include "nfc_hal_nv_co.h"
+
+/*****************************************************************************
+**  Function Declarations
+*****************************************************************************/
+
+#endif /* NFC_HAL_HCI_INCLUDED */
+
+#endif /* NFC_HAL_NV_CI_H */
diff --git a/src/include/nfc_hal_nv_co.h b/src/include/nfc_hal_nv_co.h
new file mode 100644
index 0000000..7fffb65
--- /dev/null
+++ b/src/include/nfc_hal_nv_co.h
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ *  This is the interface file for storing nv data
+ *
+ ******************************************************************************/
+#ifndef NFC_HAL_NV_CO_H
+#define NFC_HAL_NV_CO_H
+
+#include "nfc_hal_target.h"
+
+#if (NFC_HAL_HCI_INCLUDED == TRUE)
+
+#include <time.h>
+
+/*****************************************************************************
+**  Constants and Data Types
+*****************************************************************************/
+
+/**************************
+**  Common Definitions
+***************************/
+
+typedef uint8_t tNFC_HAL_NV_CO_STATUS;
+
+#define DH_NV_BLOCK 0x01
+#define HC_F3_NV_BLOCK 0x02
+#define HC_F4_NV_BLOCK 0x03
+#define HC_F2_NV_BLOCK 0x04
+#define HC_F5_NV_BLOCK 0x05
+
+/*****************************************************************************
+**  Function Declarations
+*****************************************************************************/
+/**************************
+**  Common Functions
+***************************/
+
+#endif /* NFC_HAL_HCI_INCLUDED */
+#endif /* NFC_HAL_NV_CO_H */
diff --git a/src/hal/int/nfc_hal_post_reset.h b/src/include/nfc_hal_post_reset.h
similarity index 87%
rename from src/hal/int/nfc_hal_post_reset.h
rename to src/include/nfc_hal_post_reset.h
index 7ce3953..cc703a1 100644
--- a/src/hal/int/nfc_hal_post_reset.h
+++ b/src/include/nfc_hal_post_reset.h
@@ -28,7 +28,6 @@
 ** Application control block definitions
 ******************************************************************************/
 #define NFA_APP_PATCHFILE_MAX_PATH 255
-#define NFA_APP_MAX_NUM_REINIT 5
 
 typedef struct {
   uint8_t prm_file[NFA_APP_PATCHFILE_MAX_PATH + 1]; /* Filename of patchram */
@@ -61,13 +60,4 @@
 } tNFC_POST_RESET_CB;
 extern tNFC_POST_RESET_CB nfc_post_reset_cb;
 
-/*
-** Post NCI reset handler
-**
-** This function is called to start device pre-initialization after
-** NCI CORE-RESET. When pre-initialization is completed,
-** HAL_NfcPreInitDone() must be called to proceed with stack start up.
-*/
-void nfc_hal_post_reset_init(uint32_t brcm_hw_id, uint8_t nvm_type);
-
 #endif /* NFC_HAL_POST_RESET_H */
diff --git a/src/include/nfc_hal_target.h b/src/include/nfc_hal_target.h
new file mode 100644
index 0000000..38b2fb3
--- /dev/null
+++ b/src/include/nfc_hal_target.h
@@ -0,0 +1,163 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2012-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef NFC_HAL_TARGET_H
+#define NFC_HAL_TARGET_H
+
+#include "data_types.h"
+#include "gki.h"
+
+/****************************************************************************
+** NCI related configuration
+****************************************************************************/
+
+/* Initial Max Control Packet Payload Size (until receiving payload size in
+ * INIT_CORE_RSP) */
+#ifndef NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE
+#define NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE 0xFF
+#endif
+
+/* Number of bytes to reserve in front of NCI messages (e.g. for transport
+ * header) */
+#ifndef NFC_HAL_NCI_MSG_OFFSET_SIZE
+#define NFC_HAL_NCI_MSG_OFFSET_SIZE 1
+#endif
+
+/* NFC-WAKE */
+#ifndef NFC_HAL_LP_NFC_WAKE_GPIO
+#define NFC_HAL_LP_NFC_WAKE_GPIO UPIO_GENERAL3
+#endif
+
+/* NFCC snooze mode idle timeout before deassert NFC_WAKE in ms */
+#ifndef NFC_HAL_LP_IDLE_TIMEOUT
+#define NFC_HAL_LP_IDLE_TIMEOUT 100
+#endif
+
+/* NFC snooze mode */
+#ifndef NFC_HAL_LP_SNOOZE_MODE
+#define NFC_HAL_LP_SNOOZE_MODE NFC_HAL_LP_SNOOZE_MODE_UART
+#endif
+
+/* Idle Threshold Host in 100ms unit */
+#ifndef NFC_HAL_LP_IDLE_THRESHOLD_HOST
+#define NFC_HAL_LP_IDLE_THRESHOLD_HOST 0
+#endif
+
+/* Idle Threshold HC in 100ms unit */
+#ifndef NFC_HAL_LP_IDLE_THRESHOLD_HC
+#define NFC_HAL_LP_IDLE_THRESHOLD_HC 0
+#endif
+
+/* Default NFCC power-up baud rate */
+#ifndef NFC_HAL_DEFAULT_BAUD
+#define NFC_HAL_DEFAULT_BAUD USERIAL_BAUD_115200
+#endif
+
+/* time (in ms) between power off and on NFCC */
+#ifndef NFC_HAL_POWER_CYCLE_DELAY
+#define NFC_HAL_POWER_CYCLE_DELAY 100
+#endif
+
+/* time (in ms) between power off and on NFCC */
+#ifndef NFC_HAL_NFCC_ENABLE_TIMEOUT
+#define NFC_HAL_NFCC_ENABLE_TIMEOUT 1000
+#endif
+
+#ifndef NFC_HAL_PRM_DEBUG
+#define NFC_HAL_PRM_DEBUG TRUE
+#endif
+
+/* max patch data length (Can be overridden by platform for ACL HCI command
+ * size) */
+#ifndef NFC_HAL_PRM_HCD_CMD_MAXLEN
+#define NFC_HAL_PRM_HCD_CMD_MAXLEN 250
+#endif
+
+/* Require PreI2C patch by default */
+#ifndef NFC_HAL_PRE_I2C_PATCH_INCLUDED
+#define NFC_HAL_PRE_I2C_PATCH_INCLUDED TRUE
+#endif
+
+/* over-riden for platforms that have transport packet limitations */
+#ifndef NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE
+#define NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE (32)
+#endif
+
+/* amount of time to wait for authenticating/committing patch to NVM */
+#ifndef NFC_HAL_PRM_COMMIT_DELAY
+#define NFC_HAL_PRM_COMMIT_DELAY (30000)
+#endif
+
+/* amount of time to wait after downloading preI2C patch before downloading
+ * LPM/FPM patch */
+#ifndef NFC_HAL_PRM_POST_I2C_FIX_DELAY
+#define NFC_HAL_PRM_POST_I2C_FIX_DELAY (200)
+#endif
+
+/* NFCC will respond to more than one technology during listen discovery  */
+#ifndef NFC_HAL_DM_MULTI_TECH_RESP
+#define NFC_HAL_DM_MULTI_TECH_RESP TRUE
+#endif
+
+/* Data rate for 15693 command/response, it must be same as
+ * RW_I93_FLAG_DATA_RATE in nfc_target.h */
+#define NFC_HAL_I93_FLAG_DATA_RATE_HIGH 0x02
+
+#ifndef NFC_HAL_I93_FLAG_DATA_RATE
+#define NFC_HAL_I93_FLAG_DATA_RATE NFC_HAL_I93_FLAG_DATA_RATE_HIGH
+#endif
+
+/* NFC HAL HCI */
+#ifndef NFC_HAL_HCI_INCLUDED
+#define NFC_HAL_HCI_INCLUDED TRUE
+#endif
+
+/* Quick Timer */
+#ifndef QUICK_TIMER_TICKS_PER_SEC
+#define QUICK_TIMER_TICKS_PER_SEC 100 /* 10ms timer */
+#endif
+
+#ifndef NFC_HAL_SHARED_TRANSPORT_ENABLED
+#define NFC_HAL_SHARED_TRANSPORT_ENABLED FALSE
+#endif
+
+/* Enable verbose tracing by default */
+#ifndef NFC_HAL_TRACE_VERBOSE
+#define NFC_HAL_TRACE_VERBOSE TRUE
+#endif
+
+#ifndef NFC_HAL_INITIAL_TRACE_LEVEL
+#define NFC_HAL_INITIAL_TRACE_LEVEL 5
+#endif
+
+/* Map NFC serial port to USERIAL_PORT_6 by default */
+#ifndef USERIAL_NFC_PORT
+#define USERIAL_NFC_PORT (USERIAL_PORT_6)
+#endif
+
+/* Restore NFCC baud rate to default on shutdown if baud rate was updated */
+#ifndef NFC_HAL_RESTORE_BAUD_ON_SHUTDOWN
+#define NFC_HAL_RESTORE_BAUD_ON_SHUTDOWN TRUE
+#endif
+
+/* Enable protocol tracing by default */
+#ifndef NFC_HAL_TRACE_PROTOCOL
+#define NFC_HAL_TRACE_PROTOCOL TRUE
+#endif
+
+#endif /* GKI_TARGET_H */
diff --git a/src/include/nfc_target.h b/src/include/nfc_target.h
index fd56462..3de5a84 100644
--- a/src/include/nfc_target.h
+++ b/src/include/nfc_target.h
@@ -29,9 +29,6 @@
 #include "gki_target.h"
 
 #include "bt_types.h" /* This must be defined AFTER buildcfg.h */
-#ifndef LMP_TEST
-#include "bt_trace.h"
-#endif
 
 #ifndef USERIAL_DEBUG
 #define USERIAL_DEBUG FALSE
@@ -158,13 +155,11 @@
 ******************************************************************************/
 #define NCI_VERSION_UNKNOWN 0x00
 #define NCI_VERSION_1_0 0x10
-#define NCI_VERSION_1_1 0x11
 #define NCI_VERSION_2_0 0x20
 #ifndef NCI_VERSION
 #define NCI_VERSION NCI_VERSION_2_0
 #endif
 #define NCI_CORE_RESET_RSP_LEN(X) (((X) == NCI_VERSION_2_0) ? (0x01) : (0x03))
-#define NCI_VERSION_0_F 0x0F
 
 /* TRUE I2C patch is needed */
 #ifndef NFC_I2C_PATCH_INCLUDED
@@ -652,10 +647,10 @@
 **  as the NFC stack.
 *****************************************************************************/
 #ifndef HAL_WRITE
-#define HAL_WRITE(p)                                            \
-  {                                                             \
-    nfc_cb.p_hal->write(p->len, (uint8_t*)(p + 1) + p->offset); \
-    GKI_freebuf(p);                                             \
+#define HAL_WRITE(p)                                                  \
+  {                                                                   \
+    nfc_cb.p_hal->write((p)->len, (uint8_t*)((p) + 1) + (p)->offset); \
+    GKI_freebuf(p);                                                   \
   }
 
 #ifdef NFC_HAL_SHARED_GKI
diff --git a/src/include/nfc_types.h b/src/include/nfc_types.h
new file mode 100644
index 0000000..a889902
--- /dev/null
+++ b/src/include/nfc_types.h
@@ -0,0 +1,160 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2012-2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#ifndef NFC_TYPES_H
+#define NFC_TYPES_H
+
+/****************************************************************************
+** NFC_HDR header definition for NFC messages
+*****************************************************************************/
+typedef struct {
+  uint16_t event;
+  uint16_t len;
+  uint16_t offset;
+  uint16_t layer_specific;
+} NFC_HDR;
+#define NFC_HDR_SIZE (sizeof(NFC_HDR))
+
+/* Mask for NFC_HDR event field */
+#define NFC_EVT_MASK 0xFF00
+
+/****************************************************************************
+** NFC_HAL_TASK  definitions
+*****************************************************************************/
+
+/* NCI message for hci persistency data     */
+#define NFC_HAL_EVT_HCI 0x0400
+
+/* NCI message for sending to host stack    */
+#define NFC_EVT_TO_NFC_NCI 0x4000
+
+/*****************************************************************************
+** Macros to get and put bytes to and from a stream (Little Endian format).
+*****************************************************************************/
+
+#define UINT32_TO_STREAM(p, u32)     \
+  {                                  \
+    *(p)++ = (uint8_t)(u32);         \
+    *(p)++ = (uint8_t)((u32) >> 8);  \
+    *(p)++ = (uint8_t)((u32) >> 16); \
+    *(p)++ = (uint8_t)((u32) >> 24); \
+  }
+#define UINT16_TO_STREAM(p, u16)    \
+  {                                 \
+    *(p)++ = (uint8_t)(u16);        \
+    *(p)++ = (uint8_t)((u16) >> 8); \
+  }
+#define UINT8_TO_STREAM(p, u8) \
+  { *(p)++ = (uint8_t)(u8); }
+#define INT8_TO_STREAM(p, u8) \
+  { *(p)++ = (int8_t)(u8); }
+#define ARRAY8_TO_STREAM(p, a)                                    \
+  {                                                               \
+    int ijk;                                                      \
+    for (ijk = 0; ijk < 8; ijk++) *(p)++ = (uint8_t)(a)[7 - ijk]; \
+  }
+#define ARRAY_TO_STREAM(p, a, len)                                \
+  {                                                               \
+    int ijk;                                                      \
+    for (ijk = 0; ijk < (len); ijk++) *(p)++ = (uint8_t)(a)[ijk]; \
+  }
+#define STREAM_TO_UINT8(u8, p) \
+  {                            \
+    (u8) = (uint8_t)(*(p));    \
+    (p) += 1;                  \
+  }
+#define STREAM_TO_UINT16(u16, p)                                  \
+  {                                                               \
+    (u16) = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); \
+    (p) += 2;                                                     \
+  }
+#define STREAM_TO_UINT32(u32, p)                                      \
+  {                                                                   \
+    (u32) = (((uint32_t)(*(p))) + ((((uint32_t)(*((p) + 1)))) << 8) + \
+             ((((uint32_t)(*((p) + 2)))) << 16) +                     \
+             ((((uint32_t)(*((p) + 3)))) << 24));                     \
+    (p) += 4;                                                         \
+  }
+#define STREAM_TO_ARRAY8(a, p)                     \
+  {                                                \
+    int ijk;                                       \
+    uint8_t* _pa = (uint8_t*)(a) + 7;              \
+    for (ijk = 0; ijk < 8; ijk++) *_pa-- = *(p)++; \
+  }
+#define STREAM_TO_ARRAY(a, p, len)                                   \
+  {                                                                  \
+    int ijk;                                                         \
+    for (ijk = 0; ijk < (len); ijk++) ((uint8_t*)(a))[ijk] = *(p)++; \
+  }
+
+/*****************************************************************************
+** Macros to get and put bytes to and from a stream (Big Endian format)
+*****************************************************************************/
+
+#define UINT32_TO_BE_STREAM(p, u32)  \
+  {                                  \
+    *(p)++ = (uint8_t)((u32) >> 24); \
+    *(p)++ = (uint8_t)((u32) >> 16); \
+    *(p)++ = (uint8_t)((u32) >> 8);  \
+    *(p)++ = (uint8_t)(u32);         \
+  }
+#define UINT24_TO_BE_STREAM(p, u24)  \
+  {                                  \
+    *(p)++ = (uint8_t)((u24) >> 16); \
+    *(p)++ = (uint8_t)((u24) >> 8);  \
+    *(p)++ = (uint8_t)(u24);         \
+  }
+#define UINT16_TO_BE_STREAM(p, u16) \
+  {                                 \
+    *(p)++ = (uint8_t)((u16) >> 8); \
+    *(p)++ = (uint8_t)(u16);        \
+  }
+#define UINT8_TO_BE_STREAM(p, u8) \
+  { *(p)++ = (uint8_t)(u8); }
+#define ARRAY_TO_BE_STREAM(p, a, len)                             \
+  {                                                               \
+    int ijk;                                                      \
+    for (ijk = 0; ijk < (len); ijk++) *(p)++ = (uint8_t)(a)[ijk]; \
+  }
+
+#define BE_STREAM_TO_UINT8(u8, p) \
+  {                               \
+    (u8) = (uint8_t)(*(p));       \
+    (p) += 1;                     \
+  }
+#define BE_STREAM_TO_UINT16(u16, p)                                       \
+  {                                                                       \
+    (u16) = (uint16_t)(((uint16_t)(*(p)) << 8) + (uint16_t)(*((p) + 1))); \
+    (p) += 2;                                                             \
+  }
+#define BE_STREAM_TO_UINT32(u32, p)                                      \
+  {                                                                      \
+    (u32) = ((uint32_t)(*((p) + 3)) + ((uint32_t)(*((p) + 2)) << 8) +    \
+             ((uint32_t)(*((p) + 1)) << 16) + ((uint32_t)(*(p)) << 24)); \
+    (p) += 4;                                                            \
+  }
+
+/*****************************************************************************
+** Macros to get and put bytes to and from a field (Big Endian format).
+** These are the same as to stream, except the pointer is not incremented.
+*****************************************************************************/
+
+#define UINT8_TO_BE_FIELD(p, u8) \
+  { *(uint8_t*)(p) = (uint8_t)(u8); }
+
+#endif /* NFC_TYPES_H */
diff --git a/src/include/trace_api.h b/src/include/trace_api.h
index 9c38a62..47eb0aa 100644
--- a/src/include/trace_api.h
+++ b/src/include/trace_api.h
@@ -28,10 +28,6 @@
 #include "bt_types.h"
 #include "nfc_hal_api.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Trace API Function External Declarations */
 extern void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx);
 extern void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx);
@@ -40,10 +36,6 @@
                          uint8_t command_to_respond);
 
 extern void DispLLCP(NFC_HDR* p_buf, bool is_rx);
-extern void DispHcp(uint8_t* p, uint16_t len, bool is_recv, bool is_first_seg);
-
-#ifdef __cplusplus
-}
-#endif
+extern void DispHcp(uint8_t* p, uint16_t len, bool is_recv);
 
 #endif /* TRACE_API_H */
diff --git a/src/nfa/ce/nfa_ce_act.c b/src/nfa/ce/nfa_ce_act.cc
similarity index 89%
rename from src/nfa/ce/nfa_ce_act.c
rename to src/nfa/ce/nfa_ce_act.cc
index 6e1166b..ad39aed 100644
--- a/src/nfa/ce/nfa_ce_act.c
+++ b/src/nfa/ce/nfa_ce_act.cc
@@ -22,16 +22,23 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "ce_api.h"
 #include "ndef_utils.h"
 #include "nfa_ce_int.h"
-#include "nfa_dm_int.h"
 #include "nfa_mem_co.h"
-#include "nfa_sys_int.h"
+
 #if (NFC_NFCEE_INCLUDED == TRUE)
 #include "nfa_ee_int.h"
 #endif
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*****************************************************************************
 * Protocol-specific event handlers
 *****************************************************************************/
@@ -49,8 +56,19 @@
   tNFA_CE_CB* p_cb = &nfa_ce_cb;
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG1("nfa_ce_handle_t3t_evt: event 0x%x", event);
-
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ce_handle_t3t_evt: event 0x%x", event);
+  /* For the felica on host for nfcFcallback */
+  for (uint8_t idx = 0; idx < NFA_CE_LISTEN_INFO_IDX_INVALID; idx++) {
+    if ((p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
+        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_FELICA) &&
+        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+      p_cb->idx_cur_active = idx;
+      p_cb->p_active_conn_cback =
+          p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
+      break;
+    }
+  }
   switch (event) {
     case CE_T3T_NDEF_UPDATE_START_EVT:
       /* Notify app using callback associated with the active ndef */
@@ -58,7 +76,7 @@
         conn_evt.status = NFA_STATUS_OK;
         (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_START_EVT, &conn_evt);
       } else {
-        NFA_TRACE_ERROR0(
+        LOG(ERROR) << StringPrintf(
             "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_START_EVT, but no active "
             "NDEF");
       }
@@ -72,7 +90,7 @@
         conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data;
         (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt);
       } else {
-        NFA_TRACE_ERROR0(
+        LOG(ERROR) << StringPrintf(
             "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_CPLT_EVT, but no active "
             "NDEF");
       }
@@ -86,6 +104,21 @@
         conn_evt.data.len = p_ce_data->raw_frame.p_data->len;
         (*p_cb->p_active_conn_cback)(NFA_DATA_EVT, &conn_evt);
       } else {
+        /* If we have not notified the app of activation, do so now */
+        if (p_cb->listen_info[p_cb->idx_cur_active].flags &
+            NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND) {
+          p_cb->listen_info[p_cb->idx_cur_active].flags &=
+              ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+
+          conn_evt.ce_activated.handle =
+              NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
+          memcpy(&(conn_evt.ce_activated.activate_ntf),
+                 &p_cb->activation_params, sizeof(tNFC_ACTIVATE_DEVT));
+          conn_evt.ce_activated.status = NFA_STATUS_OK;
+
+          (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
+        }
+        /* Notify app of t3t raw data */
         conn_evt.ce_data.status = p_ce_data->raw_frame.status;
         conn_evt.ce_data.handle =
             (NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active));
@@ -98,7 +131,8 @@
       break;
 
     default:
-      NFA_TRACE_DEBUG1("nfa_ce_handle_t3t_evt unhandled event=0x%02x", event);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_ce_handle_t3t_evt unhandled event=0x%02x", event);
       break;
   }
 }
@@ -116,7 +150,8 @@
   tNFA_CE_CB* p_cb = &nfa_ce_cb;
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG1("nfa_ce_handle_t4t_evt: event 0x%x", event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ce_handle_t4t_evt: event 0x%x", event);
 
   /* AID for NDEF selected. we had notified the app of activation. */
   p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_NDEF;
@@ -154,7 +189,8 @@
 
     default:
       /* CE_T4T_RAW_FRAME_EVT is not used in NFA CE */
-      NFA_TRACE_DEBUG1("nfa_ce_handle_t4t_evt unhandled event=0x%02x", event);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_ce_handle_t4t_evt unhandled event=0x%02x", event);
       break;
   }
 }
@@ -174,7 +210,8 @@
   uint8_t listen_info_idx;
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG1("nfa_ce_handle_t4t_aid_evt: event 0x%x", event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ce_handle_t4t_aid_evt: event 0x%x", event);
 
   /* Get listen_info for this aid callback */
   for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID;
@@ -219,10 +256,10 @@
       conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len;
       (*p_cb->p_active_conn_cback)(NFA_CE_DATA_EVT, &conn_evt);
     } else {
-      NFA_TRACE_ERROR1(
+      LOG(ERROR) << StringPrintf(
           "nfa_ce_handle_t4t_aid_evt: unable to find listen_info for aid hdl "
           "%i",
-          p_ce_data->raw_frame.aid_handle)
+          p_ce_data->raw_frame.aid_handle);
     }
 
     GKI_freebuf(p_ce_data->raw_frame.p_data);
@@ -244,11 +281,12 @@
 *******************************************************************************/
 void nfa_ce_discovery_cback(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data) {
   tNFA_CE_MSG ce_msg;
-  NFA_TRACE_DEBUG1("nfa_ce_discovery_cback(): event:0x%02X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
 
   switch (event) {
     case NFA_DM_RF_DISC_START_EVT:
-      NFA_TRACE_DEBUG1("nfa_ce_handle_disc_start (status=0x%x)", p_data->start);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_ce_handle_disc_start (status=0x%x)", p_data->start);
       break;
 
     case NFA_DM_RF_DISC_ACTIVATED_EVT:
@@ -268,7 +306,7 @@
       break;
 
     default:
-      NFA_TRACE_ERROR0("Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       break;
   }
 }
@@ -494,8 +532,9 @@
             p_cb->listen_info[listen_info_idx].tech_proto_mask = listen_mask;
           }
         } else {
-          NFA_TRACE_ERROR1("UICC[0x%x] is not activated",
-                           p_cb->listen_info[listen_info_idx].ee_handle);
+          LOG(ERROR) << StringPrintf(
+              "UICC[0x%x] is not activated",
+              p_cb->listen_info[listen_info_idx].ee_handle);
         }
       }
 #endif
@@ -554,7 +593,8 @@
   tNFA_CE_CB* p_cb = &nfa_ce_cb;
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG1("NFA_CE: removing listen_info entry %i", listen_info_idx);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFA_CE: removing listen_info entry %i", listen_info_idx);
 
   /* Notify app that listening has stopped  if requested (for API deregister) */
   /* For LISTEN_START failures, app has already notified of NFA_LISTEN_START_EVT
@@ -671,7 +711,7 @@
       if (nfa_ce_cb.p_scratch_buf != NULL) {
         nfa_ce_cb.scratch_buf_size = nfa_ce_cb.ndef_max_size;
       } else {
-        NFA_TRACE_ERROR1(
+        LOG(ERROR) << StringPrintf(
             "Unable to allocate scratch buffer for writable NDEF message (%i "
             "bytes)",
             nfa_ce_cb.ndef_max_size);
@@ -705,7 +745,7 @@
     return (NFA_STATUS_OK);
   }
 
-  NFA_TRACE_DEBUG0("Setting NDEF contents");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Setting NDEF contents");
 
   readonly = (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
               NFC_CE_LISTEN_INFO_READONLY_NDEF)
@@ -739,7 +779,7 @@
     CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
     CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL);
 
-    NFA_TRACE_ERROR1("Unable to set contents (error %02x)", status);
+    LOG(ERROR) << StringPrintf("Unable to set contents (error %02x)", status);
   }
 
   return (status);
@@ -770,8 +810,13 @@
   uint8_t i;
   bool t4t_activate_pending = false;
 
-  NFA_TRACE_DEBUG1("nfa_ce_activate_ntf () protocol=%d",
-                   p_ce_msg->activate_ntf.p_activation_params->protocol);
+  bool t3t_activate_pending = false;
+  bool t3t_offhost_entry_found = false;
+  uint8_t t3t_activate_idx = 0;
+  uint8_t t3t_offhost_idx = 0;
+
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol);
 
   /* Tag is in listen active state */
   p_cb->flags |= NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP;
@@ -801,8 +846,10 @@
                       p_cb->activation_params.rf_tech_param.param.lf.nfcid2,
                       NCI_RF_F_UID_LEN) == 0)
               /* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) {
-            /* Found listen_info corresponding to this activation */
-            break;
+            p_cb->listen_info[listen_info_idx].flags |=
+                NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+            t3t_activate_pending = true;
+            t3t_activate_idx = listen_info_idx;
           }
         }
 
@@ -811,12 +858,24 @@
              NFA_CE_LISTEN_INFO_UICC) &&
             (p_cb->listen_info[listen_info_idx].tech_mask &
              NFA_TECHNOLOGY_MASK_F)) {
-          break;
+          t3t_offhost_entry_found = true;
+          t3t_offhost_idx = listen_info_idx;
         }
       }
     }
 
     p_ce_cback = nfa_ce_handle_t3t_evt;
+    /* If listening for PROTO_T3T on DH and eSE/UICC, then notify CE module
+     * now and wait for reader/writer to SELECT a target */
+    if (t3t_activate_pending && t3t_offhost_entry_found) {
+      CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code,
+                             p_ce_cback);
+      return true;
+    } else if (t3t_activate_pending) {
+      listen_info_idx = t3t_activate_idx;
+    } else if (t3t_offhost_entry_found) {
+      listen_info_idx = t3t_offhost_idx;
+    }
   } else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) {
     p_ce_cback = nfa_ce_handle_t4t_evt;
 
@@ -881,7 +940,7 @@
       ((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) &&
        !(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
          NFA_CE_LISTEN_INFO_IN_USE))) {
-    NFA_TRACE_DEBUG1(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "No listen_info found for this activation. listen_info_idx=%d",
         listen_info_idx);
     return true;
@@ -889,6 +948,8 @@
 
   p_cb->listen_info[listen_info_idx].flags &=
       ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
+  p_cb->listen_info[listen_info_idx].flags &=
+      ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
 
   /* Get CONN_CBACK for this activation */
   p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback;
@@ -943,7 +1004,7 @@
   tNFA_CONN_EVT_DATA conn_evt;
   uint8_t i;
 
-  NFA_TRACE_DEBUG1("nfa_ce_deactivate_ntf () deact_type=%d", deact_type);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("deact_type=%d", deact_type);
 
   /* Check if deactivating to SLEEP mode */
   if ((deact_type == NFC_DEACTIVATE_TYPE_SLEEP) ||
@@ -998,14 +1059,18 @@
         }
       } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) &&
                  (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) {
-        if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
-          conn_evt.deactivated.type = deact_type;
-          (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
-        } else {
-          conn_evt.ce_deactivated.handle =
-              NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
-          conn_evt.ce_deactivated.type = deact_type;
-          (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+        /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */
+        if (!(p_cb->listen_info[i].flags &
+              NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+          if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
+            conn_evt.deactivated.type = deact_type;
+            (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
+          } else {
+            conn_evt.ce_deactivated.handle =
+                NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
+            conn_evt.ce_deactivated.type = deact_type;
+            (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+          }
         }
       }
     }
@@ -1042,7 +1107,7 @@
   tNFA_CE_CB* p_cb = &nfa_ce_cb;
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("Disabling local NDEF tag");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Disabling local NDEF tag");
 
   /* If local NDEF tag is in use, then disable it */
   if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags &
@@ -1092,9 +1157,9 @@
     return true;
   }
 
-  NFA_TRACE_DEBUG5(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "Configuring local NDEF tag: protocol_mask=%01x cur_size=%i, "
-      "max_size=%i, readonly=%i",
+      "max_size=%i, readonly=%i uid_len=%i",
       p_ce_msg->local_tag.protocol_mask, p_ce_msg->local_tag.ndef_cur_size,
       p_ce_msg->local_tag.ndef_max_size, p_ce_msg->local_tag.read_only,
       p_ce_msg->local_tag.uid_len);
@@ -1145,7 +1210,8 @@
       (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) {
     /* Ok to set contents now */
     if (nfa_ce_set_content() != NFA_STATUS_OK) {
-      NFA_TRACE_ERROR0("nfa_ce_api_cfg_local_tag: could not set contents");
+      LOG(ERROR) << StringPrintf(
+          "nfa_ce_api_cfg_local_tag: could not set contents");
       nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT,
                                      &conn_evt);
       return true;
@@ -1175,8 +1241,9 @@
   uint8_t i;
   uint8_t listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID;
 
-  NFA_TRACE_DEBUG1("Registering UICC/Felica/Type-4 tag listener. Type=%i",
-                   p_ce_msg->reg_listen.listen_type);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Registering UICC/Felica/Type-4 tag listener. Type=%i",
+                      p_ce_msg->reg_listen.listen_type);
 
   /* Look for available entry in listen_info table */
   /* - If registering UICC listen, make sure there isn't another entry for the
@@ -1187,8 +1254,8 @@
         (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
         (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) &&
         (p_cb->listen_info[i].ee_handle == p_ce_msg->reg_listen.ee_handle)) {
-      NFA_TRACE_ERROR1("UICC (0x%x) listening already specified",
-                       p_ce_msg->reg_listen.ee_handle);
+      LOG(ERROR) << StringPrintf("UICC (0x%x) listening already specified",
+                                 p_ce_msg->reg_listen.ee_handle);
       conn_evt.status = NFA_STATUS_FAILED;
       nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT,
                                      &conn_evt);
@@ -1203,8 +1270,8 @@
 
   /* Add new entry to listen_info table */
   if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) {
-    NFA_TRACE_ERROR1("Maximum listen callbacks exceeded (%i)",
-                     NFA_CE_LISTEN_INFO_MAX);
+    LOG(ERROR) << StringPrintf("Maximum listen callbacks exceeded (%i)",
+                               NFA_CE_LISTEN_INFO_MAX);
 
     if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) {
       conn_evt.status = NFA_STATUS_FAILED;
@@ -1218,7 +1285,8 @@
     }
     return true;
   } else {
-    NFA_TRACE_DEBUG1("NFA_CE: adding listen_info entry %i", listen_info_idx);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NFA_CE: adding listen_info entry %i", listen_info_idx);
 
     /* Store common parameters */
     /* Mark entry as 'in-use', and NFA_CE_LISTEN_INFO_START_NTF_PND */
@@ -1243,7 +1311,7 @@
             nfa_ce_handle_t4t_aid_evt);
         if (p_cb->listen_info[listen_info_idx].t4t_aid_handle ==
             CE_T4T_AID_HANDLE_INVALID) {
-          NFA_TRACE_ERROR0("Unable to register AID");
+          LOG(ERROR) << StringPrintf("Unable to register AID");
           p_cb->listen_info[listen_info_idx].flags = 0;
 
           /* Notify application */
@@ -1294,7 +1362,7 @@
   /* Start listening */
   conn_evt.status = nfa_ce_start_listening();
   if (conn_evt.status != NFA_STATUS_OK) {
-    NFA_TRACE_ERROR0(
+    LOG(ERROR) << StringPrintf(
         "nfa_ce_api_reg_listen: unable to register new listen params with DM");
     p_cb->listen_info[listen_info_idx].flags = 0;
   }
@@ -1305,8 +1373,9 @@
         NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt);
   } else {
     conn_evt.ce_registered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx;
-    NFA_TRACE_DEBUG1("nfa_ce_api_reg_listen: registered handle 0x%04X",
-                     conn_evt.ce_registered.handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("nfa_ce_api_reg_listen: registered handle 0x%04X",
+                        conn_evt.ce_registered.handle);
     (*p_cb->listen_info[listen_info_idx].p_conn_cback)(NFA_CE_REGISTERED_EVT,
                                                        &conn_evt);
   }
@@ -1365,8 +1434,7 @@
     }
 
     if (listen_info_idx == NFA_CE_LISTEN_INFO_MAX) {
-      NFA_TRACE_ERROR0(
-          "nfa_ce_api_dereg_listen (): cannot find listen_info for UICC");
+      LOG(ERROR) << StringPrintf("cannot find listen_info for UICC");
       conn_evt.status = NFA_STATUS_INVALID_PARAM;
       nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT,
                                      &conn_evt);
@@ -1403,8 +1471,8 @@
         nfa_ce_remove_listen_info_entry(listen_info_idx, true);
       }
     } else {
-      NFA_TRACE_ERROR0(
-          "nfa_ce_api_dereg_listen (): cannot find listen_info for "
+      LOG(ERROR) << StringPrintf(
+          "cannot find listen_info for "
           "Felica/T4tAID");
       conn_evt.status = NFA_STATUS_INVALID_PARAM;
       nfa_dm_conn_cback_event_notify(NFA_CE_DEREGISTERED_EVT, &conn_evt);
diff --git a/src/nfa/ce/nfa_ce_api.c b/src/nfa/ce/nfa_ce_api.cc
similarity index 92%
rename from src/nfa/ce/nfa_ce_api.c
rename to src/nfa/ce/nfa_ce_api.cc
index 836f0c3..ed8d8ba 100644
--- a/src/nfa/ce/nfa_ce_api.c
+++ b/src/nfa/ce/nfa_ce_api.cc
@@ -22,10 +22,16 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_api.h"
 #include "nfa_ce_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -47,7 +53,7 @@
   /* Validate handle */
   if ((listen_info != NFA_CE_LISTEN_INFO_UICC) &&
       ((handle & NFA_HANDLE_GROUP_MASK) != NFA_HANDLE_GROUP_CE)) {
-    NFA_TRACE_ERROR0("nfa_ce_api_reregister_listen: Invalid handle");
+    LOG(ERROR) << StringPrintf("nfa_ce_api_reregister_listen: Invalid handle");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -61,7 +67,7 @@
 
     return (NFA_STATUS_OK);
   } else {
-    NFA_TRACE_ERROR0("nfa_ce_api_reregister_listen: Out of buffers");
+    LOG(ERROR) << StringPrintf("nfa_ce_api_reregister_listen: Out of buffers");
     return (NFA_STATUS_FAILED);
   }
 }
@@ -119,25 +125,26 @@
 {
   tNFA_CE_MSG* p_msg;
 
-  NFA_TRACE_API0("NFA_CeConfigureLocalTag ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (protocol_mask) {
     /* If any protocols are specified, then NDEF buffer pointer must be non-NULL
      */
     if (p_ndef_data == NULL) {
-      NFA_TRACE_ERROR0("NFA_CeConfigureLocalTag: NULL ndef data pointer");
+      LOG(ERROR) << StringPrintf(
+          "NFA_CeConfigureLocalTag: NULL ndef data pointer");
       return (NFA_STATUS_INVALID_PARAM);
     }
 
     if ((protocol_mask & NFA_PROTOCOL_MASK_T1T) ||
         (protocol_mask & NFA_PROTOCOL_MASK_T2T)) {
-      NFA_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "NFA_CeConfigureLocalTag: Cannot emulate Type 1 / Type 2 tag");
       return (NFA_STATUS_INVALID_PARAM);
     }
 
     if (uid_len) {
-      NFA_TRACE_ERROR1(
+      LOG(ERROR) << StringPrintf(
           "NFA_CeConfigureLocalTag: Cannot Set UID for Protocol_mask: 0x%x",
           protocol_mask);
       return (NFA_STATUS_INVALID_PARAM);
@@ -195,8 +202,8 @@
 #if (NFC_NFCEE_INCLUDED == TRUE)
   tNFA_CE_MSG* p_msg;
 
-  NFA_TRACE_API1("NFA_CeConfigureUiccListenTech () ee_handle = 0x%x",
-                 ee_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("ee_handle = 0x%x", ee_handle);
 
   /* If tech_mask is zero, then app is disabling listening for specified uicc */
   if (tech_mask == 0) {
@@ -218,8 +225,8 @@
     return (NFA_STATUS_OK);
   }
 #else
-  NFA_TRACE_ERROR0(
-      "NFA_CeConfigureUiccListenTech () NFCEE related functions are not "
+  LOG(ERROR) << StringPrintf(
+      "NFCEE related functions are not "
       "enabled!");
 #endif
   return (NFA_STATUS_FAILED);
@@ -249,7 +256,7 @@
                                                tNFA_CONN_CBACK* p_conn_cback) {
   tNFA_CE_MSG* p_msg;
 
-  NFA_TRACE_API0("NFA_CeRegisterFelicaSystemCodeOnDH ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Validate parameters */
   if (p_conn_cback == NULL) return (NFA_STATUS_INVALID_PARAM);
@@ -294,8 +301,7 @@
 **
 *******************************************************************************/
 tNFA_STATUS NFA_CeDeregisterFelicaSystemCodeOnDH(tNFA_HANDLE handle) {
-  NFA_TRACE_API1("NFA_CeDeregisterFelicaSystemCodeOnDH (): handle:0x%X",
-                 handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
   return (nfa_ce_api_deregister_listen(handle, NFA_CE_LISTEN_INFO_FELICA));
 }
 
@@ -325,7 +331,7 @@
                                   tNFA_CONN_CBACK* p_conn_cback) {
   tNFA_CE_MSG* p_msg;
 
-  NFA_TRACE_API0("NFA_CeRegisterAidOnDH ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Validate parameters */
   if (p_conn_cback == NULL) return (NFA_STATUS_INVALID_PARAM);
@@ -368,7 +374,7 @@
 **
 *******************************************************************************/
 tNFA_STATUS NFA_CeDeregisterAidOnDH(tNFA_HANDLE handle) {
-  NFA_TRACE_API1("NFA_CeDeregisterAidOnDH (): handle:0x%X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
   return (nfa_ce_api_deregister_listen(handle, NFA_CE_LISTEN_INFO_T4T_AID));
 }
 
@@ -403,9 +409,10 @@
   tNFA_TECHNOLOGY_MASK use_mask =
       (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B);
 
-  NFA_TRACE_API1("NFA_CeSetIsoDepListenTech (): 0x%x", tech_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("0x%x", tech_mask);
   if (((tech_mask & use_mask) == 0) || ((tech_mask & ~use_mask) != 0)) {
-    NFA_TRACE_ERROR0("NFA_CeSetIsoDepListenTech: Invalid technology mask");
+    LOG(ERROR) << StringPrintf(
+        "NFA_CeSetIsoDepListenTech: Invalid technology mask");
     return (NFA_STATUS_INVALID_PARAM);
   }
 
diff --git a/src/nfa/ce/nfa_ce_main.c b/src/nfa/ce/nfa_ce_main.cc
similarity index 89%
rename from src/nfa/ce/nfa_ce_main.c
rename to src/nfa/ce/nfa_ce_main.cc
index 922d82e..d082969 100644
--- a/src/nfa/ce/nfa_ce_main.c
+++ b/src/nfa/ce/nfa_ce_main.cc
@@ -21,12 +21,17 @@
  *  This is the main implementation file for the NFA_CE
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_ce_api.h"
 #include "nfa_ce_int.h"
-#include "nfa_dm_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* NFA_CE control block */
 tNFA_CE_CB nfa_ce_cb;
@@ -56,9 +61,7 @@
 /*****************************************************************************
 ** Local function prototypes
 *****************************************************************************/
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* nfa_ce_evt_2_str(uint16_t event);
-#endif
+static std::string nfa_ce_evt_2_str(uint16_t event);
 
 /*******************************************************************************
 **
@@ -70,7 +73,7 @@
 **
 *******************************************************************************/
 void nfa_ce_init(void) {
-  NFA_TRACE_DEBUG0("nfa_ce_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize control block */
   memset(&nfa_ce_cb, 0, sizeof(tNFA_CE_CB));
@@ -133,8 +136,8 @@
   tNFA_CE_CB* p_cb = &nfa_ce_cb;
   uint8_t listen_info_idx;
 
-  NFA_TRACE_DEBUG1("nfa_ce_proc_nfcc_power_mode (): nfcc_power_mode=%d",
-                   nfcc_power_mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
 
   /* if NFCC power mode is change to full power */
   if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
@@ -170,14 +173,9 @@
   uint16_t act_idx;
   bool freebuf = true;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_EVENT3("nfa_ce_handle_event event: %s (0x%02x), flags: %08x",
-                   nfa_ce_evt_2_str(p_msg->event), p_msg->event,
-                   nfa_ce_cb.flags);
-#else
-  NFA_TRACE_EVENT2("nfa_ce_handle_event event: 0x%x, flags: %08x", p_msg->event,
-                   nfa_ce_cb.flags);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_ce_handle_event event: %s (0x%02x), flags: %08x",
+      nfa_ce_evt_2_str(p_msg->event).c_str(), p_msg->event, nfa_ce_cb.flags);
 
   /* Get NFA_RW sub-event */
   act_idx = (p_msg->event & 0x00FF);
@@ -193,7 +191,6 @@
   return freebuf;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_ce_evt_2_str
@@ -201,28 +198,21 @@
 ** Description      convert nfc evt to string
 **
 *******************************************************************************/
-static char* nfa_ce_evt_2_str(uint16_t event) {
+static std::string nfa_ce_evt_2_str(uint16_t event) {
   switch (event) {
     case NFA_CE_API_CFG_LOCAL_TAG_EVT:
       return "NFA_CE_API_CFG_LOCAL_TAG_EVT";
-
     case NFA_CE_API_REG_LISTEN_EVT:
       return "NFA_CE_API_REG_LISTEN_EVT";
-
     case NFA_CE_API_DEREG_LISTEN_EVT:
       return "NFA_CE_API_DEREG_LISTEN_EVT";
-
     case NFA_CE_API_CFG_ISODEP_TECH_EVT:
       return "NFA_CE_API_CFG_ISODEP_TECH_EVT";
-
     case NFA_CE_ACTIVATE_NTF_EVT:
       return "NFA_CE_ACTIVATE_NTF_EVT";
-
     case NFA_CE_DEACTIVATE_NTF_EVT:
       return "NFA_CE_DEACTIVATE_NTF_EVT";
-
     default:
       return "Unknown";
   }
 }
-#endif /* BT_TRACE_VERBOSE */
diff --git a/src/nfa/dm/nfa_dm_act.c b/src/nfa/dm/nfa_dm_act.cc
similarity index 91%
rename from src/nfa/dm/nfa_dm_act.c
rename to src/nfa/dm/nfa_dm_act.cc
index e3964c8..59d55a6 100644
--- a/src/nfa/dm/nfa_dm_act.c
+++ b/src/nfa/dm/nfa_dm_act.cc
@@ -23,26 +23,30 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nci_hmsgs.h"
 #include "nfa_api.h"
 #include "nfa_ce_int.h"
-#include "nfa_dm_int.h"
 #include "nfa_p2p_int.h"
 #include "nfa_rw_api.h"
 #include "nfa_rw_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
 
 #if (NFC_NFCEE_INCLUDED == TRUE)
 #include "nfa_ee_int.h"
-#include "nfa_hci_int.h"
+
 #endif
 
 #if (NFA_SNEP_INCLUDED == TRUE)
 #include "nfa_snep_int.h"
 #endif
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /* This is the timeout value to guarantee disable is performed within reasonable
  * amount of time */
 #ifndef NFA_DM_DISABLE_TIMEOUT_VAL
@@ -89,9 +93,8 @@
 static void nfa_dm_nfcc_power_mode_proc_complete_cback(void) {
   tNFA_DM_PWR_MODE_CHANGE power_mode_change;
 
-  NFA_TRACE_DEBUG1(
-      "nfa_dm_nfcc_power_mode_proc_complete_cback () nfcc_pwr_mode = 0x%x",
-      nfa_dm_cb.nfcc_pwr_mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfcc_pwr_mode = 0x%x", nfa_dm_cb.nfcc_pwr_mode);
 
   /* if NFCC power state is change to full power */
   if (nfa_dm_cb.nfcc_pwr_mode != NFA_DM_PWR_MODE_OFF_SLEEP) {
@@ -105,8 +108,9 @@
 
   power_mode_change.status = NFA_STATUS_OK;
   power_mode_change.power_mode = nfa_dm_cb.nfcc_pwr_mode;
-  (*nfa_dm_cb.p_dm_cback)(NFA_DM_PWR_MODE_CHANGE_EVT,
-                          (tNFA_DM_CBACK_DATA*)&power_mode_change);
+  tNFA_DM_CBACK_DATA nfa_dm_cback_data;
+  nfa_dm_cback_data.power_mode = power_mode_change;
+  (*nfa_dm_cb.p_dm_cback)(NFA_DM_PWR_MODE_CHANGE_EVT, &nfa_dm_cback_data);
 }
 /*******************************************************************************
 **
@@ -204,15 +208,15 @@
 **
 *******************************************************************************/
 void nfa_dm_proc_nfcc_power_mode(uint8_t nfcc_power_mode) {
-  NFA_TRACE_DEBUG1("nfa_dm_proc_nfcc_power_mode (): nfcc_power_mode=%d",
-                   nfcc_power_mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
 
   /* if NFCC power mode is change to full power */
   if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
     memset(&nfa_dm_cb.params, 0x00, sizeof(tNFA_DM_PARAMS));
-    NFA_TRACE_DEBUG2("setcfg_pending_mask=0x%x, setcfg_pending_num=%d",
-                     nfa_dm_cb.setcfg_pending_mask,
-                     nfa_dm_cb.setcfg_pending_num);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "setcfg_pending_mask=0x%x, setcfg_pending_num=%d",
+        nfa_dm_cb.setcfg_pending_mask, nfa_dm_cb.setcfg_pending_num);
     nfa_dm_cb.setcfg_pending_mask = 0;
     nfa_dm_cb.setcfg_pending_num = 0;
 
@@ -257,17 +261,12 @@
 static void nfa_dm_nfc_response_cback(tNFC_RESPONSE_EVT event,
                                       tNFC_RESPONSE* p_data) {
   tNFA_DM_CBACK_DATA dm_cback_data;
-  tNFA_GET_CONFIG* p_nfa_get_confg;
   tNFA_CONN_EVT_DATA conn_evt;
   uint8_t dm_cback_evt;
   uint8_t max_ee = 0;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG2("nfa_dm_nfc_response_cback () %s(0x%x)",
-                   nfa_dm_nfc_revt_2_str(event), event);
-#else
-  NFA_TRACE_DEBUG1("nfa_dm_nfc_response_cback () event=0x%x", event);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s(0x%x)", nfa_dm_nfc_revt_2_str(event).c_str(), event);
 
   switch (event) {
     case NFC_ENABLE_REVT: /* 0  Enable event */
@@ -315,28 +314,19 @@
       } else {
         /* This should not occur (means we got a SET_CONFIG_NTF that's
          * unaccounted for */
-        NFA_TRACE_ERROR0("NFA received unexpected NFC_SET_CONFIG_REVT");
+        LOG(ERROR) << StringPrintf(
+            "NFA received unexpected NFC_SET_CONFIG_REVT");
       }
       break;
 
     case NFC_GET_CONFIG_REVT: /* 3  Get Config Response */
       if (p_data->get_config.status == NFC_STATUS_OK) {
-        p_nfa_get_confg = (tNFA_GET_CONFIG*)GKI_getbuf(
-            (uint16_t)(sizeof(tNFA_GET_CONFIG) + p_data->get_config.tlv_size));
-        if (p_nfa_get_confg != NULL) {
-          p_nfa_get_confg->status = NFA_STATUS_OK;
-          p_nfa_get_confg->tlv_size = p_data->get_config.tlv_size;
-          memcpy(p_nfa_get_confg->param_tlvs, p_data->get_config.p_param_tlvs,
-                 p_data->get_config.tlv_size);
-          (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT,
-                                  (tNFA_DM_CBACK_DATA*)p_nfa_get_confg);
-
-          GKI_freebuf(p_nfa_get_confg);
-          return;
-        } else {
-          NFA_TRACE_DEBUG0(
-              "nfa_dm_nfc_response_cback unable to allocate buffer");
-        }
+        tNFA_GET_CONFIG* p_nfa_get_confg = &dm_cback_data.get_config;
+        p_nfa_get_confg->status = NFA_STATUS_OK;
+        p_nfa_get_confg->tlv_size = p_data->get_config.tlv_size;
+        p_nfa_get_confg->param_tlvs = p_data->get_config.p_param_tlvs;
+        (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT, &dm_cback_data);
+        return;
       }
 
       /* Return result of getconfig to the app */
@@ -349,6 +339,7 @@
     case NFC_NFCEE_INFO_REVT:     /* NFCEE Discover Notification */
     case NFC_EE_ACTION_REVT:      /* EE Action notification */
     case NFC_NFCEE_MODE_SET_REVT: /* NFCEE Mode Set response */
+    case NFC_NFCEE_STATUS_REVT:   /* NFCEE Status notification*/
     case NFC_SET_ROUTING_REVT:    /* Configure Routing response */
       nfa_ee_proc_evt(event, p_data);
       break;
@@ -401,7 +392,8 @@
 
     case NFC_NFCC_TIMEOUT_REVT:
     case NFC_NFCC_TRANSPORT_ERR_REVT:
-      NFA_TRACE_DEBUG1("flags:0x%08x", nfa_dm_cb.flags);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("flags:0x%08x", nfa_dm_cb.flags);
       dm_cback_evt = (event == NFC_NFCC_TIMEOUT_REVT)
                          ? NFA_DM_NFCC_TIMEOUT_EVT
                          : NFA_DM_NFCC_TRANSPORT_ERR_EVT;
@@ -438,7 +430,7 @@
 *******************************************************************************/
 bool nfa_dm_enable(tNFA_DM_MSG* p_data) {
   tNFA_DM_CBACK_DATA dm_cback_data;
-  NFA_TRACE_DEBUG0("nfa_dm_enable ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if NFA is already enabled */
   if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_DM_IS_ACTIVE)) {
@@ -455,7 +447,7 @@
     /* Enable NFC stack */
     NFC_Enable(nfa_dm_nfc_response_cback);
   } else {
-    NFA_TRACE_ERROR0("nfa_dm_enable: ERROR ALREADY ENABLED.");
+    LOG(ERROR) << StringPrintf("nfa_dm_enable: ERROR ALREADY ENABLED.");
     dm_cback_data.status = NFA_STATUS_ALREADY_STARTED;
     (*(p_data->enable.p_dm_cback))(NFA_DM_ENABLE_EVT, &dm_cback_data);
   }
@@ -473,9 +465,8 @@
 **
 *******************************************************************************/
 bool nfa_dm_disable(tNFA_DM_MSG* p_data) {
-  tNFC_DEACT_TYPE deactivate_type = NFA_DEACTIVATE_TYPE_IDLE;
-
-  NFA_TRACE_DEBUG1("nfa_dm_disable (): graceful:%d", p_data->disable.graceful);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("graceful:%d", p_data->disable.graceful);
 
   if (p_data->disable.graceful) {
     /* if RF discovery is enabled */
@@ -489,8 +480,10 @@
         }
       } else {
         nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING;
-        nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD,
-                               (tNFA_DM_RF_DISC_DATA*)&deactivate_type);
+        tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+        nfa_dm_rf_disc_data.deactivate_type = NFA_DEACTIVATE_TYPE_IDLE;
+
+        nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
         if ((nfa_dm_cb.disc_cb.disc_flags &
              (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF)) == 0) {
           /* not waiting to deactivate, clear the flag now */
@@ -522,11 +515,11 @@
 **
 *******************************************************************************/
 void nfa_dm_disable_complete(void) {
-  NFA_TRACE_DEBUG0("nfa_dm_disable_complete ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((nfa_dm_cb.flags & NFA_DM_FLAGS_DM_DISABLING_NFC) == 0) {
-    NFA_TRACE_DEBUG0(
-        "nfa_dm_disable_complete (): proceeding with nfc core shutdown.");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("proceeding with nfc core shutdown.");
 
     nfa_dm_cb.flags |= NFA_DM_FLAGS_DM_DISABLING_NFC;
 
@@ -602,12 +595,12 @@
   tNFC_STATUS status;
   tNFA_DM_CBACK_DATA dm_cback_data;
 
-  NFA_TRACE_DEBUG0(" nfa_dm_set_power_sub_state ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.power_state = p_data->set_power_state.screen_state;
   if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) {
-    NFA_TRACE_DEBUG0(
-        "nfa_dm_set_power_sub_state () : NFA_DM_RFST_LISTEN_ACTIVE");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NFA_DM_RFST_LISTEN_ACTIVE");
     /* NFCC will give semantic error for power sub state command in Rf listen
      * active state */
     status = NFC_STATUS_SEMANTIC_ERROR;
@@ -655,7 +648,7 @@
 void nfa_dm_rel_excl_rf_control_and_notify(void) {
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG0("nfa_dm_rel_excl_rf_control_and_notify ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Exclusive RF control stopped. Notify app */
   nfa_dm_cb.flags &= ~NFA_DM_FLAGS_EXCL_RF_ACTIVE;
@@ -683,7 +676,7 @@
 bool nfa_dm_act_request_excl_rf_ctrl(tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_request_excl_rf_ctrl ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (!nfa_dm_cb.p_excl_conn_cback) {
     if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE) {
@@ -704,7 +697,7 @@
                                 &p_data->req_excl_rf_ctrl.listen_cfg,
                                 nfa_dm_excl_disc_cback);
   } else {
-    NFA_TRACE_ERROR0("Exclusive rf control already requested");
+    LOG(ERROR) << StringPrintf("Exclusive rf control already requested");
 
     conn_evt.status = NFA_STATUS_FAILED;
     (*p_data->req_excl_rf_ctrl.p_conn_cback)(
@@ -723,8 +716,9 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_release_excl_rf_ctrl(tNFA_DM_MSG* p_data) {
-  NFA_TRACE_DEBUG0("nfa_dm_act_release_excl_rf_ctrl ()");
+bool nfa_dm_act_release_excl_rf_ctrl(__attribute__((unused))
+                                     tNFA_DM_MSG* p_data) {
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* nfa_dm_rel_excl_rf_control_and_notify() is called when discovery state goes
    * IDLE */
@@ -757,7 +751,7 @@
   tNFA_CONN_EVT_DATA conn_evt;
   tNFA_DEACTIVATE_TYPE deact_type;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_deactivate ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Always allow deactivate to IDLE */
   /* Do not allow deactivate to SLEEP for T1T,NFCDEP, ISO15693 */
@@ -806,7 +800,7 @@
     }
   }
 
-  NFA_TRACE_ERROR0("nfa_dm_act_deactivate (): invalid protocol, mode or state");
+  LOG(ERROR) << StringPrintf("invalid protocol, mode or state");
 
   /* Notify error to application */
   conn_evt.status = NFA_STATUS_FAILED;
@@ -825,7 +819,7 @@
 **
 *******************************************************************************/
 bool nfa_dm_act_power_off_sleep(tNFA_DM_MSG* p_data) {
-  NFA_TRACE_DEBUG0("nfa_dm_act_power_off_sleep ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   NFC_SetPowerOffSleep((bool)(p_data->hdr.layer_specific));
 
@@ -844,7 +838,7 @@
 bool nfa_dm_act_reg_vsc(tNFA_DM_MSG* p_data) {
   if (NFC_RegVSCback(p_data->reg_vsc.is_register, p_data->reg_vsc.p_cback) !=
       NFC_STATUS_OK) {
-    NFA_TRACE_ERROR0("NFC_RegVSCback failed");
+    LOG(ERROR) << StringPrintf("NFC_RegVSCback failed");
   }
   return true;
 }
@@ -910,7 +904,7 @@
   tNFA_TECHNOLOGY_MASK poll_tech_mask;
   tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
 
-  NFA_TRACE_DEBUG0("nfa_dm_start_polling ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   poll_tech_mask = nfa_dm_cb.poll_mask;
 
@@ -978,7 +972,7 @@
 bool nfa_dm_act_enable_polling(tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_enable_polling ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED)) &&
       (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE))) {
@@ -992,7 +986,7 @@
       return true;
     }
   } else {
-    NFA_TRACE_ERROR0("nfa_dm_act_enable_polling (): already started");
+    LOG(ERROR) << StringPrintf("already started");
   }
 
   /* send NFA_POLL_ENABLED_EVT with NFA_STATUS_FAILED */
@@ -1012,7 +1006,7 @@
 **
 *******************************************************************************/
 static bool nfa_dm_deactivate_polling(void) {
-  NFA_TRACE_DEBUG0("nfa_dm_deactivate_polling ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES) ||
       (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)) {
@@ -1040,10 +1034,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_disable_polling(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_disable_polling(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_disable_polling ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID) {
     nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POLLING_ENABLED;
@@ -1074,10 +1068,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_enable_listening(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_enable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_enable_listening ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.flags &= ~NFA_DM_FLAGS_LISTEN_DISABLED;
   evt_data.status = NFA_STATUS_OK;
@@ -1095,10 +1089,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_disable_listening(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_disable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_disable_listening ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.flags |= NFA_DM_FLAGS_LISTEN_DISABLED;
   evt_data.status = NFA_STATUS_OK;
@@ -1116,10 +1110,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_pause_p2p(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_pause_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_pause_p2p ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.flags |= NFA_DM_FLAGS_P2P_PAUSED;
   evt_data.status = NFA_STATUS_OK;
@@ -1137,10 +1131,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_resume_p2p(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_resume_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_resume_p2p ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.flags &= ~NFA_DM_FLAGS_P2P_PAUSED;
   evt_data.status = NFA_STATUS_OK;
@@ -1161,7 +1155,7 @@
 bool nfa_dm_act_send_raw_frame(tNFA_DM_MSG* p_data) {
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_send_raw_frame ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* If NFC link is activated */
   if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) ||
@@ -1209,8 +1203,8 @@
 **
 *******************************************************************************/
 bool nfa_dm_set_p2p_listen_tech(tNFA_DM_MSG* p_data) {
-  NFA_TRACE_DEBUG1("nfa_dm_set_p2p_listen_tech ()  tech_mask = %d",
-                   p_data->set_p2p_listen_tech.tech_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tech_mask = %d", p_data->set_p2p_listen_tech.tech_mask);
 
   nfa_p2p_update_listen_tech(p_data->set_p2p_listen_tech.tech_mask);
   nfa_dm_conn_cback_event_notify(NFA_SET_P2P_LISTEN_TECH_EVT, NULL);
@@ -1227,10 +1221,11 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_start_rf_discovery(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_start_rf_discovery(__attribute__((unused))
+                                   tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_start_rf_discovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) {
     evt_data.status = NFA_STATUS_OK;
@@ -1256,10 +1251,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_stop_rf_discovery(tNFA_DM_MSG* p_data) {
+bool nfa_dm_act_stop_rf_discovery(__attribute__((unused)) tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_stop_rf_discovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) ||
       (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)) {
@@ -1322,7 +1317,7 @@
 **
 *******************************************************************************/
 bool nfa_dm_act_select(tNFA_DM_MSG* p_data) {
-  NFA_TRACE_DEBUG0("nfa_dm_act_select ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_rf_discover_select(p_data->select.rf_disc_id, p_data->select.protocol,
                             p_data->select.rf_interface);
@@ -1341,7 +1336,7 @@
 bool nfa_dm_act_update_rf_params(tNFA_DM_MSG* p_data) {
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG0("nfa_dm_act_update_rf_params ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (NFC_UpdateRFCommParams(&p_data->update_rf_params.params) !=
       NFC_STATUS_OK) {
@@ -1361,11 +1356,10 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_dm_act_disable_timeout(tNFA_DM_MSG* p_data) {
-  tNFA_DM_API_DISABLE disable;
-
-  disable.graceful = false;
-  nfa_dm_disable((tNFA_DM_MSG*)&disable);
+bool nfa_dm_act_disable_timeout(__attribute__((unused)) tNFA_DM_MSG* p_data) {
+  tNFA_DM_MSG nfa_dm_msg;
+  nfa_dm_msg.disable.graceful = false;
+  nfa_dm_disable(&nfa_dm_msg);
   return true;
 }
 
@@ -1379,7 +1373,7 @@
 **
 *******************************************************************************/
 void nfa_dm_act_conn_cback_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data) {
-  NFA_TRACE_DEBUG1("nfa_dm_act_conn_cback_notify (): event:0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event);
 
   /* Notify event using appropriate CONN_CBACK */
   nfa_dm_conn_cback_event_notify(event, p_data);
@@ -1413,12 +1407,12 @@
 ** Returns          None
 **
 *******************************************************************************/
-static void nfa_dm_act_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                                  tNFC_CONN* p_data) {
+static void nfa_dm_act_data_cback(__attribute__((unused)) uint8_t conn_id,
+                                  tNFC_CONN_EVT event, tNFC_CONN* p_data) {
   NFC_HDR* p_msg;
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG1("nfa_dm_act_data_cback (): event = 0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
 
   if (event == NFC_DATA_CEVT) {
     p_msg = (NFC_HDR*)p_data->data.p_data;
@@ -1432,8 +1426,8 @@
 
       GKI_freebuf(p_msg);
     } else {
-      NFA_TRACE_ERROR0(
-          "nfa_dm_act_data_cback (): received NFC_DATA_CEVT with NULL data "
+      LOG(ERROR) << StringPrintf(
+          "received NFC_DATA_CEVT with NULL data "
           "pointer");
     }
   } else if (event == NFC_DEACTIVATE_CEVT) {
@@ -1454,7 +1448,7 @@
                                    tNFC_DISCOVER* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG1("nfa_dm_excl_disc_cback (): event:0x%02X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
 
   switch (event) {
     case NFA_DM_RF_DISC_START_EVT:
@@ -1539,7 +1533,7 @@
       break;
 
     default:
-      NFA_TRACE_ERROR0("Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       break;
   }
 }
@@ -1557,7 +1551,7 @@
                                    tNFC_DISCOVER* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG1("nfa_dm_poll_disc_cback (): event:0x%02X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
 
   switch (event) {
     case NFA_DM_RF_DISC_START_EVT:
@@ -1597,7 +1591,7 @@
                 nfa_dm_cb.p_activate_ntf = NULL;
               }
             } else {
-              NFA_TRACE_DEBUG0("P2P is paused");
+              DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P is paused");
               nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL);
             }
           }
@@ -1709,7 +1703,7 @@
   tNFC_RF_TECH_PARAMS* p_tech_params;
   uint8_t *p_nfcid = NULL, nfcid_len;
 
-  NFA_TRACE_DEBUG1("nfa_dm_notify_activation_status (): status:0x%X", status);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("status:0x%X", status);
 
   if (!nfa_dm_cb.p_activate_ntf) {
     /* this is for NFA P2P listen */
@@ -1815,7 +1809,6 @@
   nfa_dm_cb.p_activate_ntf = NULL;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_dm_nfc_revt_2_str
@@ -1823,62 +1816,45 @@
 ** Description      convert nfc revt to string
 **
 *******************************************************************************/
-char* nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event) {
+std::string nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event) {
   switch (event) {
     case NFC_ENABLE_REVT:
       return "NFC_ENABLE_REVT";
-
     case NFC_DISABLE_REVT:
       return "NFC_DISABLE_REVT";
-
     case NFC_SET_CONFIG_REVT:
       return "NFC_SET_CONFIG_REVT";
-
     case NFC_GET_CONFIG_REVT:
       return "NFC_GET_CONFIG_REVT";
-
     case NFC_NFCEE_DISCOVER_REVT:
       return "NFC_NFCEE_DISCOVER_REVT";
-
     case NFC_NFCEE_INFO_REVT:
       return "NFC_NFCEE_INFO_REVT";
-
     case NFC_NFCEE_MODE_SET_REVT:
       return "NFC_NFCEE_MODE_SET_REVT";
-
     case NFC_RF_FIELD_REVT:
       return "NFC_RF_FIELD_REVT";
-
     case NFC_EE_ACTION_REVT:
       return "NFC_EE_ACTION_REVT";
-
     case NFC_EE_DISCOVER_REQ_REVT:
       return "NFC_EE_DISCOVER_REQ_REVT";
-
     case NFC_SET_ROUTING_REVT:
       return "NFC_SET_ROUTING_REVT";
-
     case NFC_GET_ROUTING_REVT:
       return "NFC_GET_ROUTING_REVT";
-
     case NFC_GEN_ERROR_REVT:
       return "NFC_GEN_ERROR_REVT";
-
     case NFC_NFCC_RESTART_REVT:
       return "NFC_NFCC_RESTART_REVT";
-
     case NFC_NFCC_TIMEOUT_REVT:
       return "NFC_NFCC_TIMEOUT_REVT";
-
     case NFC_NFCC_TRANSPORT_ERR_REVT:
       return "NFC_NFCC_TRANSPORT_ERR_REVT";
-
     case NFC_NFCC_POWER_OFF_REVT:
       return "NFC_NFCC_POWER_OFF_REVT";
-
+    case NFC_NFCEE_STATUS_REVT:
+      return "NFC_NFCEE_STATUS_REVT";
     default:
       return "unknown revt";
-      break;
   }
 }
-#endif /* BT_VERBOSE */
diff --git a/src/nfa/dm/nfa_dm_api.c b/src/nfa/dm/nfa_dm_api.cc
similarity index 92%
rename from src/nfa/dm/nfa_dm_api.c
rename to src/nfa/dm/nfa_dm_api.cc
index 6d62375..197174a 100644
--- a/src/nfa/dm/nfa_dm_api.c
+++ b/src/nfa/dm/nfa_dm_api.cc
@@ -21,15 +21,19 @@
  *  NFA interface for device management
  *
  ******************************************************************************/
-#include <log/log.h>
 #include <string.h>
 
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <log/log.h>
+
 #include "ndef_utils.h"
 #include "nfa_api.h"
 #include "nfa_ce_int.h"
-#include "nfa_dm_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  Constants
@@ -53,7 +57,7 @@
 **
 *******************************************************************************/
 void NFA_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) {
-  NFA_TRACE_API0("NFA_Init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   nfa_sys_init();
   nfa_dm_init();
   nfa_p2p_init();
@@ -95,11 +99,11 @@
                        tNFA_CONN_CBACK* p_conn_cback) {
   tNFA_DM_API_ENABLE* p_msg;
 
-  NFA_TRACE_API0("NFA_Enable ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Validate parameters */
   if ((!p_dm_cback) || (!p_conn_cback)) {
-    NFA_TRACE_ERROR0("NFA_Enable (): error null callback");
+    LOG(ERROR) << StringPrintf("error null callback");
     return (NFA_STATUS_FAILED);
   }
 
@@ -140,7 +144,8 @@
 tNFA_STATUS NFA_Disable(bool graceful) {
   tNFA_DM_API_DISABLE* p_msg;
 
-  NFA_TRACE_API1("NFA_Disable (graceful=%i)", graceful);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFA_Disable (graceful=%i)", graceful);
 
   p_msg = (tNFA_DM_API_DISABLE*)GKI_getbuf(sizeof(tNFA_DM_API_DISABLE));
   if (p_msg != NULL) {
@@ -154,6 +159,19 @@
 
   return (NFA_STATUS_FAILED);
 }
+
+/*******************************************************************************
+**
+** Function         NFA_GetNCIVersion
+**
+** Description      Returns the NCI version of the NFCC to upper layer
+**
+**
+** Returns          NCI version NCI2.0 / NCI1.0
+**
+*******************************************************************************/
+uint8_t NFA_GetNCIVersion() { return NFC_GetNCIVersion(); }
+
 /*******************************************************************************
 **
 ** Function         NFA_SetPowerSubStateForScreenState
@@ -166,7 +184,8 @@
 **
 *******************************************************************************/
 tNFA_STATUS NFA_SetPowerSubStateForScreenState(uint8_t screenState) {
-  NFA_TRACE_API2("%s: state:0x%X", __func__, screenState);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: state:0x%X", __func__, screenState);
 
   uint8_t nci_scren_state = 0xFF;
   uint16_t buf_size = sizeof(tNFA_DM_API_SET_POWER_SUB_STATE);
@@ -190,7 +209,8 @@
         break;
 
       default:
-        NFA_TRACE_API1("%s, unknown screen state", __func__);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("%s, unknown screen state", __func__);
         break;
     }
 
@@ -222,7 +242,7 @@
 tNFA_STATUS NFA_SetConfig(tNFA_PMID param_id, uint8_t length, uint8_t* p_data) {
   tNFA_DM_API_SET_CONFIG* p_msg;
 
-  NFA_TRACE_API1("NFA_SetConfig (): param_id:0x%X", param_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("param_id:0x%X", param_id);
 
   p_msg = (tNFA_DM_API_SET_CONFIG*)GKI_getbuf(
       (uint16_t)(sizeof(tNFA_DM_API_SET_CONFIG) + length));
@@ -259,7 +279,7 @@
 tNFA_STATUS NFA_GetConfig(uint8_t num_ids, tNFA_PMID* p_param_ids) {
   tNFA_DM_API_GET_CONFIG* p_msg;
 
-  NFA_TRACE_API1("NFA_GetConfig (): num_ids: %i", num_ids);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("num_ids: %i", num_ids);
 
   p_msg = (tNFA_DM_API_GET_CONFIG*)GKI_getbuf(
       (uint16_t)(sizeof(tNFA_DM_API_GET_CONFIG) + num_ids));
@@ -321,10 +341,10 @@
                                           tNFA_NDEF_CBACK* p_ndef_cback) {
   tNFA_DM_API_REQ_EXCL_RF_CTRL* p_msg;
 
-  NFA_TRACE_API1("NFA_RequestExclusiveRfControl () poll_mask=0x%x", poll_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("poll_mask=0x%x", poll_mask);
 
   if (!p_conn_cback) {
-    NFA_TRACE_ERROR0("NFA_RequestExclusiveRfControl (): error null callback");
+    LOG(ERROR) << StringPrintf("error null callback");
     return (NFA_STATUS_FAILED);
   }
 
@@ -363,11 +383,11 @@
 tNFA_STATUS NFA_ReleaseExclusiveRfControl(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_ReleaseExclusiveRfControl ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (!nfa_dm_cb.p_excl_conn_cback) {
-    NFA_TRACE_ERROR0(
-        "NFA_ReleaseExclusiveRfControl (): Exclusive rf control is not in "
+    LOG(ERROR) << StringPrintf(
+        "Exclusive rf control is not in "
         "progress");
     return (NFA_STATUS_FAILED);
   }
@@ -420,7 +440,7 @@
 tNFA_STATUS NFA_EnablePolling(tNFA_TECHNOLOGY_MASK poll_mask) {
   tNFA_DM_API_ENABLE_POLL* p_msg;
 
-  NFA_TRACE_API1("NFA_EnablePolling () 0x%X", poll_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("0x%X", poll_mask);
 
   p_msg = (tNFA_DM_API_ENABLE_POLL*)GKI_getbuf(sizeof(tNFA_DM_API_ENABLE_POLL));
   if (p_msg != NULL) {
@@ -454,7 +474,7 @@
 tNFA_STATUS NFA_DisablePolling(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_DisablePolling ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -494,7 +514,7 @@
 tNFA_STATUS NFA_EnableListening(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_EnableListening ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -528,7 +548,7 @@
 tNFA_STATUS NFA_DisableListening(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_DisableListening ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -565,7 +585,7 @@
 tNFA_STATUS NFA_PauseP2p(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_PauseP2p ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -598,7 +618,7 @@
 tNFA_STATUS NFA_ResumeP2p(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_ResumeP2p ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -635,7 +655,7 @@
 tNFA_STATUS NFA_SetP2pListenTech(tNFA_TECHNOLOGY_MASK tech_mask) {
   tNFA_DM_API_SET_P2P_LISTEN_TECH* p_msg;
 
-  NFA_TRACE_API1("NFA_P2pSetListenTech (): tech_mask:0x%X", tech_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("tech_mask:0x%X", tech_mask);
 
   p_msg = (tNFA_DM_API_SET_P2P_LISTEN_TECH*)GKI_getbuf(
       sizeof(tNFA_DM_API_SET_P2P_LISTEN_TECH));
@@ -668,7 +688,7 @@
 tNFA_STATUS NFA_StartRfDiscovery(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_StartRfDiscovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -698,7 +718,7 @@
 tNFA_STATUS NFA_StopRfDiscovery(void) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API0("NFA_StopRfDiscovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
   if (p_msg != NULL) {
@@ -737,7 +757,7 @@
 tNFA_STATUS NFA_SetRfDiscoveryDuration(uint16_t discovery_period_ms) {
   tNFA_DM_API_SET_RF_DISC_DUR* p_msg;
 
-  NFA_TRACE_API0("NFA_SetRfDiscoveryDuration ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Post the API message */
   p_msg = (tNFA_DM_API_SET_RF_DISC_DUR*)GKI_getbuf(sizeof(NFC_HDR));
@@ -777,15 +797,15 @@
                        tNFA_INTF_TYPE rf_interface) {
   tNFA_DM_API_SELECT* p_msg;
 
-  NFA_TRACE_API3(
-      "NFA_Select (): rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
-      rf_disc_id, protocol, rf_interface);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
+                      rf_disc_id, protocol, rf_interface);
 
   if (((rf_interface == NFA_INTERFACE_ISO_DEP) &&
        (protocol != NFA_PROTOCOL_ISO_DEP)) ||
       ((rf_interface == NFA_INTERFACE_NFC_DEP) &&
        (protocol != NFA_PROTOCOL_NFC_DEP))) {
-    NFA_TRACE_ERROR0("NFA_Select (): RF interface is not matched protocol");
+    LOG(ERROR) << StringPrintf("RF interface is not matched protocol");
     return (NFA_STATUS_INVALID_PARAM);
   }
 
@@ -822,7 +842,7 @@
 tNFA_STATUS NFA_UpdateRFCommParams(tNFA_RF_COMM_PARAMS* p_params) {
   tNFA_DM_API_UPDATE_RF_PARAMS* p_msg;
 
-  NFA_TRACE_API0("NFA_UpdateRFCommParams ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_DM_API_UPDATE_RF_PARAMS*)GKI_getbuf(
       (uint16_t)(sizeof(tNFA_DM_API_UPDATE_RF_PARAMS)));
@@ -872,7 +892,7 @@
 extern tNFA_STATUS NFA_Deactivate(bool sleep_mode) {
   tNFA_DM_API_DEACTIVATE* p_msg;
 
-  NFA_TRACE_API1("NFA_Deactivate (): sleep_mode:%i", sleep_mode);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("sleep_mode:%i", sleep_mode);
 
   p_msg = (tNFA_DM_API_DEACTIVATE*)GKI_getbuf(
       (uint16_t)(sizeof(tNFA_DM_API_DEACTIVATE)));
@@ -913,7 +933,7 @@
   uint16_t size;
   uint8_t* p;
 
-  NFA_TRACE_API1("NFA_SendRawFrame () data_len:%d", data_len);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("data_len:%d", data_len);
 
   /* Validate parameters */
   if ((data_len == 0) || (p_raw_data == NULL))
@@ -977,14 +997,14 @@
                                         tNFA_NDEF_CBACK* p_ndef_cback) {
   tNFA_DM_API_REG_NDEF_HDLR* p_msg;
 
-  NFA_TRACE_API2(
-      "NFA_RegisterNDefTypeHandler (): handle whole ndef message: %i, "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle whole ndef message: %i, "
       "tnf=0x%02x",
       handle_whole_message, tnf);
 
   /* Check for NULL callback */
   if (!p_ndef_cback) {
-    NFA_TRACE_ERROR0("NFA_RegisterNDefTypeHandler (): error - null callback");
+    LOG(ERROR) << StringPrintf("error - null callback");
     return (NFA_STATUS_INVALID_PARAM);
   }
 
@@ -1037,14 +1057,14 @@
                                               tNFA_NDEF_CBACK* p_ndef_cback) {
   tNFA_DM_API_REG_NDEF_HDLR* p_msg;
 
-  NFA_TRACE_API2(
-      "NFA_RegisterNDefUriHandler (): handle whole ndef message: %i, "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle whole ndef message: %i, "
       "uri_id=0x%02x",
       handle_whole_message, uri_id);
 
   /* Check for NULL callback */
   if (!p_ndef_cback) {
-    NFA_TRACE_ERROR0("NFA_RegisterNDefUriHandler (): error - null callback");
+    LOG(ERROR) << StringPrintf("error - null callback");
     return (NFA_STATUS_INVALID_PARAM);
   }
 
@@ -1091,8 +1111,8 @@
 extern tNFA_STATUS NFA_DeregisterNDefTypeHandler(tNFA_HANDLE ndef_type_handle) {
   tNFA_DM_API_DEREG_NDEF_HDLR* p_msg;
 
-  NFA_TRACE_API1("NFA_DeregisterNDefHandler (): handle 0x%08x",
-                 ndef_type_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle 0x%08x", ndef_type_handle);
 
   p_msg = (tNFA_DM_API_DEREG_NDEF_HDLR*)GKI_getbuf(
       (uint16_t)(sizeof(tNFA_DM_API_DEREG_NDEF_HDLR)));
@@ -1126,11 +1146,10 @@
 tNFA_STATUS NFA_PowerOffSleepMode(bool start_stop) {
   NFC_HDR* p_msg;
 
-  NFA_TRACE_API1("NFA_PowerOffSleepState () start_stop=%d", start_stop);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("start_stop=%d", start_stop);
 
   if (nfa_dm_cb.flags & NFA_DM_FLAGS_SETTING_PWR_MODE) {
-    NFA_TRACE_ERROR0(
-        "NFA_PowerOffSleepState (): NFA DM is busy to update power mode");
+    LOG(ERROR) << StringPrintf("NFA DM is busy to update power mode");
     return (NFA_STATUS_FAILED);
   } else {
     nfa_dm_cb.flags |= NFA_DM_FLAGS_SETTING_PWR_MODE;
@@ -1164,10 +1183,11 @@
 tNFC_STATUS NFA_RegVSCback(bool is_register, tNFA_VSC_CBACK* p_cback) {
   tNFA_DM_API_REG_VSC* p_msg;
 
-  NFA_TRACE_API1("NFA_RegVSCback() is_register=%d", is_register);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("is_register=%d", is_register);
 
   if (p_cback == NULL) {
-    NFA_TRACE_ERROR0("NFA_RegVSCback() requires a valid callback function");
+    LOG(ERROR) << StringPrintf("requires a valid callback function");
     return (NFA_STATUS_FAILED);
   }
 
@@ -1207,7 +1227,7 @@
   tNFA_DM_API_SEND_VSC* p_msg;
   uint16_t size = sizeof(tNFA_DM_API_SEND_VSC) + cmd_params_len;
 
-  NFA_TRACE_API1("NFA_SendVsCommand() oid=0x%x", oid);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("oid=0x%x", oid);
 
   p_msg = (tNFA_DM_API_SEND_VSC*)GKI_getbuf(size);
   if (p_msg != NULL) {
@@ -1277,21 +1297,6 @@
 
 /*******************************************************************************
 **
-** Function         NFA_SetTraceLevel
-**
-** Description      This function sets the trace level for NFA.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t NFA_SetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) nfa_sys_set_trace_level(new_level);
-
-  return (nfa_sys_cb.trace_level);
-}
-/*******************************************************************************
-**
 ** Function:        NFA_EnableDtamode
 **
 ** Description:     Enable DTA Mode
@@ -1300,7 +1305,8 @@
 **
 *******************************************************************************/
 void NFA_EnableDtamode(tNFA_eDtaModes eDtaMode) {
-  NFA_TRACE_API2("%s: 0x%x ", __func__, eDtaMode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: 0x%x ", __func__, eDtaMode);
   appl_dta_mode_flag = 0x01;
   nfa_dm_cb.eDtaMode = eDtaMode;
 }
diff --git a/src/nfa/dm/nfa_dm_cfg.c b/src/nfa/dm/nfa_dm_cfg.cc
similarity index 84%
rename from src/nfa/dm/nfa_dm_cfg.c
rename to src/nfa/dm/nfa_dm_cfg.cc
index 9e51a6a..ceef2ff 100644
--- a/src/nfa/dm/nfa_dm_cfg.c
+++ b/src/nfa/dm/nfa_dm_cfg.cc
@@ -42,12 +42,6 @@
 
 uint8_t* p_nfa_dm_ce_cfg = (uint8_t*)nfa_dm_ce_cfg;
 
-/* the SetConfig for optional general NFC stack functions */
-const uint8_t nfa_dm_gen_cfg[] = {
-    3, /* total length */
-    /* Instruct NFCC to report RF field generated by remote device (or not) */
-    NFC_PMID_RF_FIELD_INFO, 1, 0x01};
-
 uint8_t* p_nfa_dm_gen_cfg = NULL;
 
 /* the RF Discovery Frequency for each technology */
@@ -68,18 +62,11 @@
 
 uint8_t nfa_ee_max_ee_cfg = NFA_EE_MAX_EE_SUPPORTED;
 
-const tNCI_DISCOVER_MAPS nfa_dm_interface_mapping[NFA_DM_NUM_INTERFACE_MAP] = {
-    /* Protocols that use Frame Interface do not need to be included in the
-       interface mapping */
-    {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
-     NCI_INTERFACE_ISO_DEP},
-    {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
-     NCI_INTERFACE_NFC_DEP}};
 /* set to NULL to use the default mapping set by stack */
 tNCI_DISCOVER_MAPS* p_nfa_dm_interface_mapping = NULL;
 uint8_t nfa_dm_num_dm_interface_mapping = 0;
 
-const tNFA_DM_CFG nfa_dm_cfg = {
+tNFA_DM_CFG nfa_dm_cfg = {
     /* Automatic NDEF detection (when not in exclusive RF mode) */
     NFA_DM_AUTO_DETECT_NDEF,
     /* Automatic NDEF read (when not in exclusive RF mode) */
@@ -95,7 +82,7 @@
 
 const uint8_t nfa_hci_whitelist[] = {0x02, 0x03, 0x04};
 
-const tNFA_HCI_CFG nfa_hci_cfg = {
+tNFA_HCI_CFG nfa_hci_cfg = {
     /* Max HCI Network IDLE time to wait for EE DISC REQ Ntf(s) */
     NFA_HCI_NETWK_INIT_IDLE_TIMEOUT,
     /* Maximum HCP Response time to any HCP Command */
@@ -108,7 +95,7 @@
 tNFA_HCI_CFG* p_nfa_hci_cfg = (tNFA_HCI_CFG*)&nfa_hci_cfg;
 
 bool nfa_poll_bail_out_mode = false;
-const tNFA_PROPRIETARY_CFG nfa_proprietary_cfg = {
+tNFA_PROPRIETARY_CFG nfa_proprietary_cfg = {
     0x80, /* NCI_PROTOCOL_18092_ACTIVE */
     0x81, /* NCI_PROTOCOL_B_PRIME */
     0x82, /* NCI_PROTOCOL_DUAL */
diff --git a/src/nfa/dm/nfa_dm_discover.c b/src/nfa/dm/nfa_dm_discover.cc
similarity index 88%
rename from src/nfa/dm/nfa_dm_discover.c
rename to src/nfa/dm/nfa_dm_discover.cc
index e28af09..62332cb 100644
--- a/src/nfa/dm/nfa_dm_discover.c
+++ b/src/nfa/dm/nfa_dm_discover.cc
@@ -21,13 +21,16 @@
  *  function.
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nci_hmsgs.h"
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
 #include "nfa_p2p_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
 #if (NFC_NFCEE_INCLUDED == TRUE)
 #include "nfa_ee_api.h"
 #include "nfa_ee_int.h"
@@ -35,10 +38,14 @@
 #include "nfa_rw_int.h"
 
 #include "nfc_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*
 **  static functions
 */
-
 static uint8_t nfa_dm_get_rf_discover_config(
     tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
     tNFC_DISCOVER_PARAMS disc_params[], uint8_t max_params);
@@ -57,10 +64,8 @@
 static void nfa_dm_disc_kovio_timeout_cback(TIMER_LIST_ENT* p_tle);
 static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* nfa_dm_disc_state_2_str(uint8_t state);
-static char* nfa_dm_disc_event_2_str(uint8_t event);
-#endif
+static std::string nfa_dm_disc_state_2_str(uint8_t state);
+static std::string nfa_dm_disc_event_2_str(uint8_t event);
 
 typedef struct nfa_dm_p2p_prio_logic {
   bool isodep_detected;      /* flag to check if ISO-DEP is detected */
@@ -89,9 +94,8 @@
   uint8_t num_params = 0;
 
   if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED) {
-    NFA_TRACE_DEBUG1(
-        "nfa_dm_get_rf_discover_config () listen disabled, rm listen from 0x%x",
-        dm_disc_mask);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("listen disabled, rm listen from 0x%x", dm_disc_mask);
     dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
   }
   if (nfa_dm_is_p2p_paused()) {
@@ -274,9 +278,8 @@
   uint8_t platform = 0;
   uint8_t sens_info = 0;
 
-  NFA_TRACE_DEBUG1(
-      "nfa_dm_set_rf_listen_mode_config () tech_proto_mask = 0x%08X",
-      tech_proto_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tech_proto_mask = 0x%08X", tech_proto_mask);
 
   /*
   ** T1T listen     LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C
@@ -390,7 +393,7 @@
 static void nfa_dm_set_total_duration(void) {
   uint8_t params[10], *p;
 
-  NFA_TRACE_DEBUG0("nfa_dm_set_total_duration ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p = params;
 
@@ -419,7 +422,7 @@
   tNFA_LISTEN_CFG* p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config;
   uint8_t params[250], *p, xx;
 
-  NFA_TRACE_DEBUG0("nfa_dm_set_rf_listen_mode_raw_config ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /*
   ** Discovery Configuration Parameters for Listen A
@@ -599,8 +602,8 @@
 
   *p_disc_mask = disc_mask;
 
-  NFA_TRACE_DEBUG1("nfa_dm_set_rf_listen_mode_raw_config () disc_mask = 0x%x",
-                   disc_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("disc_mask = 0x%x", disc_mask);
 }
 
 /*******************************************************************************
@@ -694,8 +697,8 @@
     }
   }
 
-  NFA_TRACE_DEBUG3(
-      "nfa_dm_disc_get_disc_mask (): tech_n_mode:0x%X, protocol:0x%X, "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "tech_n_mode:0x%X, protocol:0x%X, "
       "disc_mask:0x%X",
       tech_n_mode, protocol, disc_mask);
   return (disc_mask);
@@ -714,7 +717,7 @@
                                         tNFC_DISCOVER* p_data) {
   tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT;
 
-  NFA_TRACE_DEBUG1("nfa_dm_disc_discovery_cback (): event:0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event);
 
   switch (event) {
     case NFC_START_DEVT:
@@ -741,11 +744,13 @@
         dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP;
       break;
     default:
-      NFA_TRACE_ERROR0("Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       return;
   }
 
-  nfa_dm_disc_sm_execute(dm_disc_event, (tNFA_DM_RF_DISC_DATA*)p_data);
+  tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+  nfa_dm_rf_disc_data.nfc_discover = *p_data;
+  nfa_dm_disc_sm_execute(dm_disc_event, &nfa_dm_rf_disc_data);
 }
 
 /*******************************************************************************
@@ -813,8 +818,8 @@
 static tNFC_STATUS nfa_dm_disc_force_to_idle(void) {
   tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
 
-  NFA_TRACE_DEBUG1("nfa_dm_disc_force_to_idle() disc_flags = 0x%x",
-                   nfa_dm_cb.disc_cb.disc_flags);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags);
 
   /* do not execute more than one */
   if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) {
@@ -836,8 +841,9 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_dm_disc_deact_ntf_timeout_cback(TIMER_LIST_ENT* p_tle) {
-  NFA_TRACE_ERROR0("nfa_dm_disc_deact_ntf_timeout_cback()");
+static void nfa_dm_disc_deact_ntf_timeout_cback(__attribute__((unused))
+                                                TIMER_LIST_ENT* p_tle) {
+  LOG(ERROR) << __func__;
 
   nfa_dm_disc_force_to_idle();
 }
@@ -901,7 +907,7 @@
   uint8_t config_params[10], *p;
   uint8_t num_params, xx;
 
-  NFA_TRACE_DEBUG0("nfa_dm_start_rf_discover ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   /* Make sure that RF discovery was enabled, or some app has exclusive control
    */
   if ((!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)) &&
@@ -1029,7 +1035,7 @@
         nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask =
             poll_mask | listen_mask;
 
-        NFA_TRACE_DEBUG2(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x", xx,
             nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask);
 
@@ -1041,31 +1047,34 @@
     if (dm_disc_mask & NFA_DM_DISC_MASK_NFC_DEP) {
       nfa_p2p_set_config(dm_disc_mask);
     }
-    if (dm_disc_mask &
-        (NFA_DM_DISC_MASK_PF_NFC_DEP | NFA_DM_DISC_MASK_PF_T3T)) {
-      /* According to the NFC Forum Activity spec, controllers must:
-       * 1) Poll with RC=0 and SC=FFFF to find NFC-DEP targets
-       * 2) Poll with RC=1 and SC=FFFF to find T3T targets
-       * Many controllers don't do this yet, and seem to be activating
-       * NFC-DEP by default.
-       *
-       * We can at least fix the scenario where we're not interested
-       * in NFC-DEP, by setting RC=1 in that case. Otherwise, keep
-       * the default of RC=0. */
-      p = config_params;
-      UINT8_TO_STREAM(p, NFC_PMID_PF_RC);
-      UINT8_TO_STREAM(p, NCI_PARAM_LEN_PF_RC);
-      if ((dm_disc_mask & NFA_DM_DISC_MASK_PF_NFC_DEP) &&
-          !nfa_dm_is_p2p_paused()) {
-        UINT8_TO_STREAM(p, 0x00);  // RC=0
-      } else {
-        UINT8_TO_STREAM(p, 0x01);  // RC=1
+    if (NFC_GetNCIVersion() == NCI_VERSION_1_0) {
+      if (dm_disc_mask &
+          (NFA_DM_DISC_MASK_PF_NFC_DEP | NFA_DM_DISC_MASK_PF_T3T)) {
+        /* According to the NFC Forum Activity spec, controllers must:
+         * 1) Poll with RC=0 and SC=FFFF to find NFC-DEP targets
+         * 2) Poll with RC=1 and SC=FFFF to find T3T targets
+         * Many controllers don't do this yet, and seem to be activating
+         * NFC-DEP by default.
+         *
+         * We can at least fix the scenario where we're not interested
+         * in NFC-DEP, by setting RC=1 in that case. Otherwise, keep
+         * the default of RC=0. */
+        p = config_params;
+        UINT8_TO_STREAM(p, NFC_PMID_PF_RC);
+        UINT8_TO_STREAM(p, NCI_PARAM_LEN_PF_RC);
+        if ((dm_disc_mask & NFA_DM_DISC_MASK_PF_NFC_DEP) &&
+            !nfa_dm_is_p2p_paused()) {
+          UINT8_TO_STREAM(p, 0x00);  // RC=0
+        } else {
+          UINT8_TO_STREAM(p, 0x01);  // RC=1
+        }
+        nfa_dm_check_set_config(p - config_params, config_params, false);
       }
-      nfa_dm_check_set_config(p - config_params, config_params, false);
     }
   }
 
-  NFA_TRACE_DEBUG1("dm_disc_mask = 0x%x", dm_disc_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("dm_disc_mask = 0x%x", dm_disc_mask);
 
   /* Get Discovery Technology parameters */
   num_params = nfa_dm_get_rf_discover_config(dm_disc_mask, disc_params,
@@ -1151,7 +1160,8 @@
          p_data->activate.rf_tech_param.param.pk.uid_len) ||
         (memcmp(p_data->activate.rf_tech_param.param.pk.uid,
                 nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len))) {
-      NFA_TRACE_DEBUG0("new Kovio tag is detected");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("new Kovio tag is detected");
 
       /* notify presence check failure for previous tag, if presence check is
        * pending */
@@ -1205,9 +1215,8 @@
 
   tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask;
 
-  NFA_TRACE_DEBUG2(
-      "nfa_dm_disc_notify_activation (): tech_n_mode:0x%X, proto:0x%X",
-      tech_n_mode, protocol);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tech_n_mode:0x%X, proto:0x%X", tech_n_mode, protocol);
 
   if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) {
     nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode;
@@ -1244,9 +1253,10 @@
         nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_UNKNOWN;
         nfa_dm_cb.disc_cb.activated_handle = xx;
 
-        NFA_TRACE_DEBUG2("activated_rf_interface:0x%x, activated_handle: 0x%x",
-                         nfa_dm_cb.disc_cb.activated_rf_interface,
-                         nfa_dm_cb.disc_cb.activated_handle);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "activated_rf_interface:0x%x, activated_handle: 0x%x",
+            nfa_dm_cb.disc_cb.activated_rf_interface,
+            nfa_dm_cb.disc_cb.activated_handle);
 
         if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
           (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
@@ -1321,7 +1331,8 @@
        tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE ||
        tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)) {
     if (appl_dta_mode_flag == 1 && tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) {
-      NFA_TRACE_DEBUG0("DTA Mode Enabled : NFC-A Passive Listen Mode");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("DTA Mode Enabled : NFC-A Passive Listen Mode");
     }
   }
 
@@ -1332,9 +1343,10 @@
     nfa_dm_cb.disc_cb.activated_protocol = protocol;
     nfa_dm_cb.disc_cb.activated_handle = xx;
 
-    NFA_TRACE_DEBUG2("activated_protocol:0x%x, activated_handle: 0x%x",
-                     nfa_dm_cb.disc_cb.activated_protocol,
-                     nfa_dm_cb.disc_cb.activated_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("activated_protocol:0x%x, activated_handle: 0x%x",
+                        nfa_dm_cb.disc_cb.activated_protocol,
+                        nfa_dm_cb.disc_cb.activated_handle);
 
     if (protocol == NFC_PROTOCOL_KOVIO) {
       /* check whether it's new or repeated activation */
@@ -1372,11 +1384,11 @@
   tNFA_CONN_EVT_DATA evt_data;
   tNFC_DISCOVER disc_data;
 
-  NFA_TRACE_DEBUG1("nfa_dm_disc_notify_deactivation (): activated_handle=%d",
-                   nfa_dm_cb.disc_cb.activated_handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "activated_handle=%d", nfa_dm_cb.disc_cb.activated_handle);
 
   if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
-    NFA_TRACE_DEBUG0("nfa_dm_disc_notify_deactivation (): for sleep wakeup");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("for sleep wakeup");
     return;
   }
 
@@ -1552,9 +1564,10 @@
       /* Perform pending deactivate command and on response notfiy deactivation
        */
       nfa_dm_cb.disc_cb.deact_notify_pending = true;
-      nfa_dm_disc_sm_execute(
-          NFA_DM_RF_DEACTIVATE_CMD,
-          (tNFA_DM_RF_DISC_DATA*)&nfa_dm_cb.disc_cb.pending_deact_type);
+      tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+      nfa_dm_rf_disc_data.deactivate_type =
+          nfa_dm_cb.disc_cb.pending_deact_type;
+      nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
     }
   }
 }
@@ -1568,10 +1581,9 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_dm_disc_kovio_timeout_cback(TIMER_LIST_ENT* p_tle) {
-  tNFC_DEACTIVATE_DEVT deact;
-
-  NFA_TRACE_DEBUG0("nfa_dm_disc_kovio_timeout_cback()");
+static void nfa_dm_disc_kovio_timeout_cback(__attribute__((unused))
+                                            TIMER_LIST_ENT* p_tle) {
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* notify presence check failure, if presence check is pending */
   nfa_dm_disc_report_kovio_presence_check(NFC_STATUS_FAILED);
@@ -1583,11 +1595,13 @@
                         NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
   } else {
     /* notify upper layer deactivated event */
+    tNFC_DEACTIVATE_DEVT deact;
     deact.status = NFC_STATUS_OK;
     deact.type = NFC_DEACTIVATE_TYPE_DISCOVERY;
     deact.is_ntf = true;
-    nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
-                                    (tNFC_DISCOVER*)&deact);
+    tNFC_DISCOVER nfc_discover;
+    nfc_discover.deactivate = deact;
+    nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF, &nfc_discover);
   }
 }
 
@@ -1603,7 +1617,7 @@
 tNFC_STATUS nfa_dm_disc_start_kovio_presence_check(void) {
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-  NFA_TRACE_DEBUG0("nfa_dm_disc_start_kovio_presence_check ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) &&
       (nfa_dm_cb.disc_cb.kovio_tle.in_use)) {
@@ -1642,7 +1656,7 @@
 **
 *******************************************************************************/
 static void nfa_dm_disc_report_kovio_presence_check(tNFC_STATUS status) {
-  NFA_TRACE_DEBUG0("nfa_dm_disc_report_kovio_presence_check ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) {
     nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
@@ -1652,9 +1666,10 @@
 
     if (nfa_dm_cb.disc_cb.deact_pending) {
       nfa_dm_cb.disc_cb.deact_pending = false;
-      nfa_dm_disc_sm_execute(
-          NFA_DM_RF_DEACTIVATE_CMD,
-          (tNFA_DM_RF_DISC_DATA*)&nfa_dm_cb.disc_cb.pending_deact_type);
+      tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+      nfa_dm_rf_disc_data.deactivate_type =
+          nfa_dm_cb.disc_cb.pending_deact_type;
+      nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
     }
   }
 }
@@ -1668,9 +1683,9 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_dm_disc_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                                   tNFC_CONN* p_data) {
-  NFA_TRACE_DEBUG0("nfa_dm_disc_data_cback ()");
+static void nfa_dm_disc_data_cback(__attribute__((unused)) uint8_t conn_id,
+                                   tNFC_CONN_EVT event, tNFC_CONN* p_data) {
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* if selection failed */
   if (event == NFC_ERROR_CEVT) {
@@ -1693,18 +1708,12 @@
   tNFA_CONN_EVT_DATA evt_data;
   tNFA_DM_RF_DISC_STATE old_state = nfa_dm_cb.disc_cb.disc_state;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG5(
-      "nfa_dm_disc_new_state (): old_state: %s (%d), new_state: %s (%d) "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "old_state: %s (%d), new_state: %s (%d) "
       "disc_flags: 0x%x",
-      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state),
-      nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_state_2_str(new_state),
+      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
+      nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_state_2_str(new_state).c_str(),
       new_state, nfa_dm_cb.disc_cb.disc_flags);
-#else
-  NFA_TRACE_DEBUG3(
-      "nfa_dm_disc_new_state(): old_state: %d, new_state: %d disc_flags: 0x%x",
-      nfa_dm_cb.disc_cb.disc_state, new_state, nfa_dm_cb.disc_cb.disc_flags);
-#endif
 
   nfa_dm_cb.disc_cb.disc_state = new_state;
 
@@ -1776,7 +1785,7 @@
 
             if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
               (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))(
-                  NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*)p_data);
+                  NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
           }
         } else {
           /* notify event to each module which is waiting for start */
@@ -1792,7 +1801,7 @@
 
               if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
                 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))(
-                    NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*)p_data);
+                    NFA_DM_RF_DISC_START_EVT, &p_data->nfc_discover);
             }
           }
         }
@@ -1865,7 +1874,7 @@
       break;
 
     default:
-      NFA_TRACE_ERROR0("nfa_dm_disc_sm_idle (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -1909,7 +1918,8 @@
       break;
     case NFA_DM_RF_INTF_ACTIVATED_NTF:
       if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
-        NFA_TRACE_DEBUG0("RF Activated while waiting for deactivation RSP");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("RF Activated while waiting for deactivation RSP");
         /* it's race condition. DH has to wait for deactivation NTF */
         nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF;
       } else {
@@ -1926,8 +1936,9 @@
 
         if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
             NFA_STATUS_FAILED) {
-          NFA_TRACE_DEBUG0(
-              "Not matched, restart discovery after receiving deactivate ntf");
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "Not matched, restart discovery after receiving "
+              "deactivate ntf");
 
           /* after receiving deactivate event, restart discovery */
           nfa_dm_cb.disc_cb.disc_flags |=
@@ -1958,8 +1969,7 @@
     case NFA_DM_CORE_INTF_ERROR_NTF:
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_discovery (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2015,7 +2025,7 @@
 
       if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
           NFA_STATUS_FAILED) {
-        NFA_TRACE_DEBUG0(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Not matched, restart discovery after receiving deactivate ntf");
 
         /* after receiving deactivate event, restart discovery */
@@ -2023,8 +2033,7 @@
       }
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_w4_all_discoveries (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2085,7 +2094,7 @@
          * if deactivation is pending then deactivate  */
         nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
       } else if (status == NFA_STATUS_FAILED) {
-        NFA_TRACE_DEBUG0(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Not matched, restart discovery after receiving deactivate ntf");
 
         /* after receiving deactivate event, restart discovery */
@@ -2124,8 +2133,7 @@
       }
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 
@@ -2153,7 +2161,6 @@
       (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
   bool sleep_wakeup_event = false;
   bool sleep_wakeup_event_processed = false;
-  tNFC_DEACTIVATE_DEVT deact;
 
   switch (event) {
     case NFA_DM_RF_DEACTIVATE_CMD:
@@ -2191,11 +2198,14 @@
       if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) {
         /* it's race condition. received deactivate NTF before receiving RSP */
 
+        tNFC_DEACTIVATE_DEVT deact;
         deact.status = NFC_STATUS_OK;
         deact.type = NFC_DEACTIVATE_TYPE_IDLE;
         deact.is_ntf = true;
+        tNFC_DISCOVER nfc_discover;
+        nfc_discover.deactivate = deact;
         nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
-                                        (tNFC_DISCOVER*)&deact);
+                                        &nfc_discover);
 
         /* NFCC is in IDLE state */
         nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
@@ -2210,7 +2220,8 @@
       if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
         /* it's race condition. received deactivate NTF before receiving RSP */
         /* notify deactivation after receiving deactivate RSP */
-        NFA_TRACE_DEBUG0("Rx deactivate NTF while waiting for deactivate RSP");
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "Rx deactivate NTF while waiting for deactivate RSP");
         break;
       }
       if (p_data->nfc_discover.deactivate.reason !=
@@ -2218,55 +2229,54 @@
         sleep_wakeup_event = true;
         nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
                                         &(p_data->nfc_discover));
+      }
+      if ((p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) ||
+          (p_data->nfc_discover.deactivate.type ==
+           NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
+        if (p_data->nfc_discover.deactivate.reason !=
+            NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
+          /* count for number of times deactivate cmd sent */
+          nfa_dm_cb.deactivate_cmd_retry_count = 0;
         }
-        if ((p_data->nfc_discover.deactivate.type ==
-             NFC_DEACTIVATE_TYPE_SLEEP) ||
-            (p_data->nfc_discover.deactivate.type ==
-             NFC_DEACTIVATE_TYPE_SLEEP_AF)) {
-          if (p_data->nfc_discover.deactivate.reason !=
-              NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
-            /* count for number of times deactivate cmd sent */
-            nfa_dm_cb.deactivate_cmd_retry_count = 0;
-          }
-          nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
-          if (old_sleep_wakeup_flag) {
-            sleep_wakeup_event_processed = true;
-            /* process pending deactivate request */
-            if (nfa_dm_cb.disc_cb.deact_pending) {
-              /* notify RW module that sleep wakeup is finished */
-              /* if deactivation is pending then deactivate  */
-              nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
+        nfa_dm_disc_new_state(NFA_DM_RFST_W4_HOST_SELECT);
+        if (old_sleep_wakeup_flag) {
+          sleep_wakeup_event_processed = true;
+          /* process pending deactivate request */
+          if (nfa_dm_cb.disc_cb.deact_pending) {
+            /* notify RW module that sleep wakeup is finished */
+            /* if deactivation is pending then deactivate  */
+            nfa_dm_disc_end_sleep_wakeup(NFC_STATUS_OK);
 
-              /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will
-               * not call this function */
-              nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true);
-            } else {
-              /* Successfully went to sleep mode for sleep wakeup */
-              /* Now wake up the tag to complete the operation */
-              NFC_DiscoverySelect(nfa_dm_cb.disc_cb.activated_rf_disc_id,
-                                  nfa_dm_cb.disc_cb.activated_protocol,
-                                  nfa_dm_cb.disc_cb.activated_rf_interface);
-            }
+            /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will
+             * not call this function */
+            nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true);
+          } else {
+            /* Successfully went to sleep mode for sleep wakeup */
+            /* Now wake up the tag to complete the operation */
+            NFC_DiscoverySelect(nfa_dm_cb.disc_cb.activated_rf_disc_id,
+                                nfa_dm_cb.disc_cb.activated_protocol,
+                                nfa_dm_cb.disc_cb.activated_rf_interface);
           }
-          if (p_data->nfc_discover.deactivate.reason ==
-              NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
-            /* in case deactivation is not sucessfull, NFCC shall send
-               RF_DEACTIVATE_NTF with DH Req failed due to error.
-               MW shall send deactivation cmd again for 3 three times. if
-               deactivation is not successfull 3 times also,
-               then MW shall send deacivate cmd with deactivate type is
-               discovery */
-            if (nfa_dm_cb.deactivate_cmd_retry_count == 3) {
-              if ((!old_sleep_wakeup_flag) ||
-                  (!nfa_dm_cb.disc_cb.deact_pending)) {
-                nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
-              }
-              nfa_dm_cb.deactivate_cmd_retry_count = 0;
-            } else {
-              nfa_dm_cb.deactivate_cmd_retry_count++;
-              nfa_dm_send_deactivate_cmd(p_data->nfc_discover.deactivate.type);
+        }
+        if (p_data->nfc_discover.deactivate.reason ==
+            NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
+          /* in case deactivation is not sucessfull, NFCC shall send
+             RF_DEACTIVATE_NTF with DH Req failed due to error.
+             MW shall send deactivation cmd again for 3 three times. if
+             deactivation is not successfull 3 times also,
+             then MW shall send deacivate cmd with deactivate type is
+             discovery */
+          if (nfa_dm_cb.deactivate_cmd_retry_count == 3) {
+            if ((!old_sleep_wakeup_flag) ||
+                (!nfa_dm_cb.disc_cb.deact_pending)) {
+              nfa_dm_send_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
             }
+            nfa_dm_cb.deactivate_cmd_retry_count = 0;
+          } else {
+            nfa_dm_cb.deactivate_cmd_retry_count++;
+            nfa_dm_send_deactivate_cmd(p_data->nfc_discover.deactivate.type);
           }
+        }
       } else if (p_data->nfc_discover.deactivate.type ==
                  NFC_DEACTIVATE_TYPE_IDLE) {
         nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
@@ -2289,8 +2299,7 @@
       break;
 
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_poll_active (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 
@@ -2328,8 +2337,10 @@
         deact.status = NFC_STATUS_OK;
         deact.type = NFC_DEACTIVATE_TYPE_IDLE;
         deact.is_ntf = true;
+        tNFC_DISCOVER nfc_discover;
+        nfc_discover.deactivate = deact;
         nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
-                                        (tNFC_DISCOVER*)&deact);
+                                        &nfc_discover);
 
         /* NFCC is in IDLE state */
         nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
@@ -2344,7 +2355,8 @@
       if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) {
         /* it's race condition. received deactivate NTF before receiving RSP */
         /* notify deactivation after receiving deactivate RSP */
-        NFA_TRACE_DEBUG0("Rx deactivate NTF while waiting for deactivate RSP");
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "Rx deactivate NTF while waiting for deactivate RSP");
       } else {
         nfa_dm_disc_notify_deactivation(NFA_DM_RF_DEACTIVATE_NTF,
                                         &(p_data->nfc_discover));
@@ -2372,8 +2384,7 @@
     case NFA_DM_CORE_INTF_ERROR_NTF:
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_listen_active (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2431,7 +2442,7 @@
                  NFA_DEACTIVATE_TYPE_DISCOVERY) {
         nfa_dm_disc_new_state(NFA_DM_RFST_DISCOVERY);
       } else {
-        NFA_TRACE_ERROR0("Unexpected deactivation type");
+        LOG(ERROR) << StringPrintf("Unexpected deactivation type");
         nfa_dm_disc_new_state(NFA_DM_RFST_IDLE);
         nfa_dm_start_rf_discover();
       }
@@ -2440,7 +2451,7 @@
       nfa_dm_disc_new_state(NFA_DM_RFST_LISTEN_ACTIVE);
       if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
           NFA_STATUS_FAILED) {
-        NFA_TRACE_DEBUG0(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Not matched, restart discovery after receiving deactivate ntf");
 
         /* after receiving deactivate event, restart discovery */
@@ -2448,8 +2459,7 @@
       }
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_listen_sleep (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2471,13 +2481,13 @@
       nfa_dm_disc_notify_activation(&(p_data->nfc_discover));
       if (nfa_dm_disc_notify_activation(&(p_data->nfc_discover)) ==
           NFA_STATUS_FAILED) {
-        NFA_TRACE_DEBUG0("Not matched, unexpected activation");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Not matched, unexpected activation");
       }
       break;
 
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_lp_listen (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2500,8 +2510,7 @@
                                       &(p_data->nfc_discover));
       break;
     default:
-      NFA_TRACE_ERROR0(
-          "nfa_dm_disc_sm_lp_active (): Unexpected discovery event");
+      LOG(ERROR) << StringPrintf("Unexpected discovery event");
       break;
   }
 }
@@ -2517,18 +2526,12 @@
 *******************************************************************************/
 void nfa_dm_disc_sm_execute(tNFA_DM_RF_DISC_SM_EVENT event,
                             tNFA_DM_RF_DISC_DATA* p_data) {
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG5(
-      "nfa_dm_disc_sm_execute (): state: %s (%d), event: %s(%d) disc_flags: "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "state: %s (%d), event: %s(%d) disc_flags: "
       "0x%x",
-      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state),
-      nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_event_2_str(event), event,
-      nfa_dm_cb.disc_cb.disc_flags);
-#else
-  NFA_TRACE_DEBUG3(
-      "nfa_dm_disc_sm_execute(): state: %d, event:%d disc_flags: 0x%x",
-      nfa_dm_cb.disc_cb.disc_state, event, nfa_dm_cb.disc_cb.disc_flags);
-#endif
+      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
+      nfa_dm_cb.disc_cb.disc_state, nfa_dm_disc_event_2_str(event).c_str(),
+      event, nfa_dm_cb.disc_cb.disc_flags);
 
   switch (nfa_dm_cb.disc_cb.disc_state) {
     /*  RF Discovery State - Idle */
@@ -2576,15 +2579,10 @@
       nfa_dm_disc_sm_lp_active(event, p_data);
       break;
   }
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG3(
-      "nfa_dm_disc_sm_execute (): new state: %s (%d), disc_flags: 0x%x",
-      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state),
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "new state: %s (%d), disc_flags: 0x%x",
+      nfa_dm_disc_state_2_str(nfa_dm_cb.disc_cb.disc_state).c_str(),
       nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
-#else
-  NFA_TRACE_DEBUG2("nfa_dm_disc_sm_execute(): new state: %d,  disc_flags: 0x%x",
-                   nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
-#endif
 }
 
 /*******************************************************************************
@@ -2601,7 +2599,7 @@
                                    tNFA_DISCOVER_CBACK* p_disc_cback) {
   uint8_t xx;
 
-  NFA_TRACE_DEBUG1("nfa_dm_add_rf_discover () disc_mask=0x%x", disc_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("disc_mask=0x%x", disc_mask);
 
   for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) {
     if (!nfa_dm_cb.disc_cb.entry[xx].in_use) {
@@ -2631,7 +2629,7 @@
                                  tNFA_DISCOVER_CBACK* p_disc_cback) {
   tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
 
-  NFA_TRACE_DEBUG0("nfa_dm_start_excl_discovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) {
     poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
@@ -2692,7 +2690,7 @@
 **
 *******************************************************************************/
 void nfa_dm_stop_excl_discovery(void) {
-  NFA_TRACE_DEBUG0("nfa_dm_stop_excl_discovery ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_cb.disc_cb.excl_disc_entry.in_use = false;
   nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL;
@@ -2708,12 +2706,12 @@
 **
 *******************************************************************************/
 void nfa_dm_delete_rf_discover(tNFA_HANDLE handle) {
-  NFA_TRACE_DEBUG1("nfa_dm_delete_rf_discover () handle=0x%x", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle=0x%x", handle);
 
   if (handle < NFA_DM_DISC_NUM_ENTRIES) {
     nfa_dm_cb.disc_cb.entry[handle].in_use = false;
   } else {
-    NFA_TRACE_ERROR0("Invalid discovery handle");
+    LOG(ERROR) << StringPrintf("Invalid discovery handle");
   }
 }
 
@@ -2731,9 +2729,9 @@
   tNFA_DM_DISC_SELECT_PARAMS select_params;
   tNFA_CONN_EVT_DATA conn_evt;
 
-  NFA_TRACE_DEBUG3(
-      "nfa_dm_disc_select () rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
-      rf_disc_id, protocol, rf_interface);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
+                      rf_disc_id, protocol, rf_interface);
 
   if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) {
     /* state is OK: notify the status when the response is received from NFCC */
@@ -2742,8 +2740,9 @@
     select_params.rf_interface = rf_interface;
 
     nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY;
-    nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_SELECT_CMD,
-                           (tNFA_DM_RF_DISC_DATA*)&select_params);
+    tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+    nfa_dm_rf_disc_data.select = select_params;
+    nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_SELECT_CMD, &nfa_dm_rf_disc_data);
   } else {
     /* Wrong state: notify failed status right away */
     conn_evt.status = NFA_STATUS_FAILED;
@@ -2761,8 +2760,8 @@
 **
 *******************************************************************************/
 tNFA_STATUS nfa_dm_rf_deactivate(tNFA_DEACTIVATE_TYPE deactivate_type) {
-  NFA_TRACE_DEBUG1("nfa_dm_rf_deactivate () deactivate_type:0x%X",
-                   deactivate_type);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("deactivate_type:0x%X", deactivate_type);
 
   if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP) {
     if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
@@ -2781,7 +2780,8 @@
         return NFA_STATUS_OK;
       } else {
         /* it could be race condition. */
-        NFA_TRACE_DEBUG0("nfa_dm_rf_deactivate (): already in discovery state");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("already in discovery state");
         return NFA_STATUS_FAILED;
       }
     } else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE) {
@@ -2789,20 +2789,21 @@
         nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle);
         nfa_dm_disc_kovio_timeout_cback(&nfa_dm_cb.disc_cb.kovio_tle);
       }
-      nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD,
-                             (tNFA_DM_RF_DISC_DATA*)&deactivate_type);
+      tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+      nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
+      nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
       return NFA_STATUS_OK;
     } else {
       return NFA_STATUS_FAILED;
     }
   } else {
-    nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD,
-                           (tNFA_DM_RF_DISC_DATA*)&deactivate_type);
+    tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data;
+    nfa_dm_rf_disc_data.deactivate_type = deactivate_type;
+    nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data);
     return NFA_STATUS_OK;
   }
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_dm_disc_state_2_str
@@ -2810,7 +2811,7 @@
 ** Description      convert nfc discovery state to string
 **
 *******************************************************************************/
-static char* nfa_dm_disc_state_2_str(uint8_t state) {
+static std::string nfa_dm_disc_state_2_str(uint8_t state) {
   switch (state) {
     case NFA_DM_RFST_IDLE:
       return "IDLE";
@@ -2849,44 +2850,34 @@
 ** Description      convert nfc discovery RSP/NTF to string
 **
 *******************************************************************************/
-static char* nfa_dm_disc_event_2_str(uint8_t event) {
+static std::string nfa_dm_disc_event_2_str(uint8_t event) {
   switch (event) {
     case NFA_DM_RF_DISCOVER_CMD:
       return "DISCOVER_CMD";
-
     case NFA_DM_RF_DISCOVER_RSP:
       return "DISCOVER_RSP";
-
     case NFA_DM_RF_DISCOVER_NTF:
       return "DISCOVER_NTF";
-
     case NFA_DM_RF_DISCOVER_SELECT_CMD:
       return "SELECT_CMD";
-
     case NFA_DM_RF_DISCOVER_SELECT_RSP:
       return "SELECT_RSP";
-
     case NFA_DM_RF_INTF_ACTIVATED_NTF:
       return "ACTIVATED_NTF";
-
     case NFA_DM_RF_DEACTIVATE_CMD:
       return "DEACTIVATE_CMD";
-
     case NFA_DM_RF_DEACTIVATE_RSP:
       return "DEACTIVATE_RSP";
-
     case NFA_DM_RF_DEACTIVATE_NTF:
       return "DEACTIVATE_NTF";
-
     case NFA_DM_LP_LISTEN_CMD:
       return "NFA_DM_LP_LISTEN_CMD";
-
     case NFA_DM_CORE_INTF_ERROR_NTF:
       return "INTF_ERROR_NTF";
+    default:
+      return "Unknown";
   }
-  return "Unknown";
 }
-#endif /* BT_TRACE_VERBOSE */
 
 /*******************************************************************************
 **
@@ -2900,13 +2891,14 @@
 *******************************************************************************/
 bool nfa_dm_p2p_prio_logic(uint8_t event, uint8_t* p, uint8_t event_type) {
   if (!nfa_poll_bail_out_mode) {
-    NFA_TRACE_DEBUG0("p2p priority is running under bail out mode ONLY.");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("p2p priority is running under bail out mode ONLY.");
     return true;
   }
 
   if ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) &&
       (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED)) {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "returning from nfa_dm_p2p_prio_logic  Disable p2p_prio_logic");
     return true;
   }
@@ -2917,7 +2909,7 @@
   if (event == NCI_MSG_RF_DISCOVER &&
       p2p_prio_logic_data.timer_expired == true &&
       event_type == NFA_DM_P2P_PRIO_RSP) {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "nfa_dm_p2p_prio_logic starting a timer for next rf intf activated "
         "ntf");
     nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
@@ -2930,7 +2922,7 @@
 
   if (event == NCI_MSG_RF_INTF_ACTIVATED &&
       p2p_prio_logic_data.timer_expired == true) {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "nfa_dm_p2p_prio_logic stopping a timer for next rf intf activated "
         "ntf");
     nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
@@ -2942,7 +2934,7 @@
     uint8_t protocol = 0xFF;
     uint8_t tech_mode = 0xFF;
 
-    NFA_TRACE_DEBUG0("P2P_Prio_Logic");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Prio_Logic");
 
     if (event == NCI_MSG_RF_INTF_ACTIVATED) {
       rf_disc_id = *p++;
@@ -2950,10 +2942,11 @@
       protocol = *p++;
       tech_mode = *p++;
     }
-    NFA_TRACE_DEBUG1("nfa_dm_p2p_prio_logic event_type = 0x%x", event_type);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("nfa_dm_p2p_prio_logic event_type = 0x%x", event_type);
 
     if (event == NCI_MSG_RF_INTF_ACTIVATED && tech_mode >= 0x80) {
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "nfa_dm_p2p_prio_logic listen mode activated reset all the "
           "nfa_dm_p2p_prio_logic variables ");
       nfa_dm_p2p_prio_logic_cleanup();
@@ -2965,7 +2958,8 @@
       nfa_dm_p2p_prio_logic_cleanup();
       p2p_prio_logic_data.isodep_detected = true;
       p2p_prio_logic_data.first_tech_mode = tech_mode;
-      NFA_TRACE_DEBUG0("ISO-DEP Detected First Time  Resume the Polling Loop");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "ISO-DEP Detected First Time  Resume the Polling Loop");
       nci_snd_deactivate_cmd(NFA_DEACTIVATE_TYPE_DISCOVERY);
       return false;
     }
@@ -2976,7 +2970,7 @@
              p2p_prio_logic_data.first_tech_mode != tech_mode) {
       p2p_prio_logic_data.isodep_detected = true;
       p2p_prio_logic_data.timer_expired = false;
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "ISO-DEP Detected Second Time Other Techmode  Resume the Polling "
           "Loop");
       nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
@@ -2988,7 +2982,7 @@
              protocol == NCI_PROTOCOL_ISO_DEP &&
              p2p_prio_logic_data.isodep_detected == true &&
              p2p_prio_logic_data.timer_expired == true) {
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "ISO-DEP Detected TimerExpired, Final Notifying the Event");
       nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
       nfa_dm_p2p_prio_logic_cleanup();
@@ -2998,20 +2992,20 @@
              protocol == NCI_PROTOCOL_ISO_DEP &&
              p2p_prio_logic_data.isodep_detected == true &&
              p2p_prio_logic_data.first_tech_mode == tech_mode) {
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "ISO-DEP Detected Same Techmode, Final Notifying the Event");
       nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
-      NFA_TRACE_DEBUG0("P2P_Stop_Timer");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
       nfa_dm_p2p_prio_logic_cleanup();
     }
 
     else if (event == NCI_MSG_RF_INTF_ACTIVATED &&
              protocol != NCI_PROTOCOL_ISO_DEP &&
              p2p_prio_logic_data.isodep_detected == true) {
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "ISO-DEP Not Detected  Giving Priority for other Technology");
       nfc_stop_quick_timer(&p2p_prio_logic_data.timer_list);
-      NFA_TRACE_DEBUG0("P2P_Stop_Timer");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Stop_Timer");
       nfa_dm_p2p_prio_logic_cleanup();
     }
 
@@ -3019,7 +3013,8 @@
              p2p_prio_logic_data.isodep_detected == true &&
              p2p_prio_logic_data.timer_expired == false &&
              event_type == NFA_DM_P2P_PRIO_RSP) {
-      NFA_TRACE_DEBUG0("NFA_DM_RF_DEACTIVATE_RSP");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_DM_RF_DEACTIVATE_RSP");
       return false;
     }
 
@@ -3027,19 +3022,20 @@
              p2p_prio_logic_data.isodep_detected == true &&
              p2p_prio_logic_data.timer_expired == false &&
              event_type == NFA_DM_P2P_PRIO_NTF) {
-      NFA_TRACE_DEBUG0("NFA_DM_RF_DEACTIVATE_NTF");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_DM_RF_DEACTIVATE_NTF");
 
       nfc_start_quick_timer(&p2p_prio_logic_data.timer_list,
                             NFC_TTYPE_P2P_PRIO_RESPONSE,
                             ((uint32_t)160 * QUICK_TIMER_TICKS_PER_SEC) / 1000);
 
-      NFA_TRACE_DEBUG0("P2P_Start_Timer");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P_Start_Timer");
 
       return false;
     }
   }
 
-  NFA_TRACE_DEBUG0("returning TRUE");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("returning TRUE");
   return true;
 }
 
@@ -3053,12 +3049,14 @@
 **
 *******************************************************************************/
 void nfa_dm_p2p_timer_event() {
-  NFA_TRACE_DEBUG0("P2P_Timer_timeout NFC-DEP Not Discovered!!");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("P2P_Timer_timeout NFC-DEP Not Discovered!!");
 
   p2p_prio_logic_data.timer_expired = true;
 
   if (p2p_prio_logic_data.isodep_detected == true) {
-    NFA_TRACE_DEBUG0("Deactivate and Restart RF discovery");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Deactivate and Restart RF discovery");
     nci_snd_deactivate_cmd(NFC_DEACTIVATE_TYPE_IDLE);
   }
 }
@@ -3089,7 +3087,8 @@
   NFC_HDR* p_msg;
   uint8_t* p;
 
-  NFA_TRACE_DEBUG0("nfa_dm_send_tag_deselect_cmd");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_dm_send_tag_deselect_cmd");
   p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (p_msg) {
diff --git a/src/nfa/dm/nfa_dm_main.c b/src/nfa/dm/nfa_dm_main.cc
similarity index 94%
rename from src/nfa/dm/nfa_dm_main.c
rename to src/nfa/dm/nfa_dm_main.cc
index dbc51ba..f73d9c0 100644
--- a/src/nfa/dm/nfa_dm_main.c
+++ b/src/nfa/dm/nfa_dm_main.cc
@@ -21,12 +21,17 @@
  *  This is the main implementation file for the NFA device manager.
  *
  ******************************************************************************/
+#include <string>
 
-#include <string.h>
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 ** Constants and types
@@ -35,9 +40,7 @@
                                             nfa_dm_sys_disable,
                                             nfa_dm_proc_nfcc_power_mode};
 
-tNFA_DM_CB nfa_dm_cb = {
-    0,
-};
+tNFA_DM_CB nfa_dm_cb = {};
 
 #define NFA_DM_NUM_ACTIONS (NFA_DM_MAX_EVT & 0x00ff)
 
@@ -80,9 +83,7 @@
 /*****************************************************************************
 ** Local function prototypes
 *****************************************************************************/
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* nfa_dm_evt_2_str(uint16_t event);
-#endif
+static std::string nfa_dm_evt_2_str(uint16_t event);
 /*******************************************************************************
 **
 ** Function         nfa_dm_init
@@ -93,7 +94,7 @@
 **
 *******************************************************************************/
 void nfa_dm_init(void) {
-  NFA_TRACE_DEBUG0("nfa_dm_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   memset(&nfa_dm_cb, 0, sizeof(tNFA_DM_CB));
   nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;
   nfa_dm_cb.disc_cb.disc_duration = NFA_DM_DISC_DURATION_POLL;
@@ -117,12 +118,8 @@
   bool freebuf = true;
   uint16_t event = p_msg->event & 0x00ff;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_EVENT2("nfa_dm_evt_hdlr event: %s (0x%02x)",
-                   nfa_dm_evt_2_str(event), event);
-#else
-  NFA_TRACE_EVENT1("nfa_dm_evt_hdlr event: 0x%x", event);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "event: %s (0x%02x)", nfa_dm_evt_2_str(event).c_str(), event);
 
   /* execute action functions */
   if (event < NFA_DM_NUM_ACTIONS) {
@@ -153,9 +150,9 @@
       nfa_dm_disable_complete();
     } else {
       /* probably waiting to be disabled */
-      NFA_TRACE_WARNING2("DM disc_state state = %d disc_flags:0x%x",
-                         nfa_dm_cb.disc_cb.disc_state,
-                         nfa_dm_cb.disc_cb.disc_flags);
+      LOG(WARNING) << StringPrintf("DM disc_state state = %d disc_flags:0x%x",
+                                   nfa_dm_cb.disc_cb.disc_state,
+                                   nfa_dm_cb.disc_cb.disc_flags);
     }
 
   } else {
@@ -192,7 +189,8 @@
 **
 *******************************************************************************/
 bool nfa_dm_is_active(void) {
-  NFA_TRACE_DEBUG1("nfa_dm_is_active () flags:0x%x", nfa_dm_cb.flags);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("flags:0x%x", nfa_dm_cb.flags);
   if ((nfa_dm_cb.flags & NFA_DM_FLAGS_DM_IS_ACTIVE) &&
       ((nfa_dm_cb.flags &
         (NFA_DM_FLAGS_ENABLE_EVT_PEND | NFA_DM_FLAGS_NFCC_IS_RESTORING |
@@ -219,12 +217,12 @@
   tNFC_STATUS nfc_status;
   uint32_t cur_bit;
 
-  NFA_TRACE_DEBUG0("nfa_dm_check_set_config ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* We only allow 32 pending SET_CONFIGs */
   if (nfa_dm_cb.setcfg_pending_num >= NFA_DM_SETCONFIG_PENDING_MAX) {
-    NFA_TRACE_ERROR0(
-        "nfa_dm_check_set_config () error: pending number of SET_CONFIG "
+    LOG(ERROR) << StringPrintf(
+        "error: pending number of SET_CONFIG "
         "exceeded");
     return NFA_STATUS_FAILED;
   }
@@ -446,7 +444,6 @@
   }
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_dm_nfc_revt_2_str
@@ -454,84 +451,59 @@
 ** Description      convert nfc revt to string
 **
 *******************************************************************************/
-static char* nfa_dm_evt_2_str(uint16_t event) {
+static std::string nfa_dm_evt_2_str(uint16_t event) {
   switch (NFA_SYS_EVT_START(NFA_ID_DM) | event) {
     case NFA_DM_API_ENABLE_EVT:
       return "NFA_DM_API_ENABLE_EVT";
-
     case NFA_DM_API_DISABLE_EVT:
       return "NFA_DM_API_DISABLE_EVT";
-
     case NFA_DM_API_SET_CONFIG_EVT:
       return "NFA_DM_API_SET_CONFIG_EVT";
-
     case NFA_DM_API_GET_CONFIG_EVT:
       return "NFA_DM_API_GET_CONFIG_EVT";
-
     case NFA_DM_API_REQUEST_EXCL_RF_CTRL_EVT:
       return "NFA_DM_API_REQUEST_EXCL_RF_CTRL_EVT";
-
     case NFA_DM_API_RELEASE_EXCL_RF_CTRL_EVT:
       return "NFA_DM_API_RELEASE_EXCL_RF_CTRL_EVT";
-
     case NFA_DM_API_ENABLE_POLLING_EVT:
       return "NFA_DM_API_ENABLE_POLLING_EVT";
-
     case NFA_DM_API_DISABLE_POLLING_EVT:
       return "NFA_DM_API_DISABLE_POLLING_EVT";
-
     case NFA_DM_API_ENABLE_LISTENING_EVT:
       return "NFA_DM_API_ENABLE_LISTENING_EVT";
-
     case NFA_DM_API_DISABLE_LISTENING_EVT:
       return "NFA_DM_API_DISABLE_LISTENING_EVT";
-
     case NFA_DM_API_PAUSE_P2P_EVT:
       return "NFA_DM_API_PAUSE_P2P_EVT";
-
     case NFA_DM_API_RESUME_P2P_EVT:
       return "NFA_DM_API_RESUME_P2P_EVT";
-
     case NFA_DM_API_RAW_FRAME_EVT:
       return "NFA_DM_API_RAW_FRAME_EVT";
-
     case NFA_DM_API_SET_P2P_LISTEN_TECH_EVT:
       return "NFA_DM_API_SET_P2P_LISTEN_TECH_EVT";
-
     case NFA_DM_API_START_RF_DISCOVERY_EVT:
       return "NFA_DM_API_START_RF_DISCOVERY_EVT";
-
     case NFA_DM_API_STOP_RF_DISCOVERY_EVT:
       return "NFA_DM_API_STOP_RF_DISCOVERY_EVT";
-
     case NFA_DM_API_SET_RF_DISC_DURATION_EVT:
       return "NFA_DM_API_SET_RF_DISC_DURATION_EVT";
-
     case NFA_DM_API_SELECT_EVT:
       return "NFA_DM_API_SELECT_EVT";
-
     case NFA_DM_API_UPDATE_RF_PARAMS_EVT:
       return "NFA_DM_API_UPDATE_RF_PARAMS_EVT";
-
     case NFA_DM_API_DEACTIVATE_EVT:
       return "NFA_DM_API_DEACTIVATE_EVT";
-
     case NFA_DM_API_POWER_OFF_SLEEP_EVT:
       return "NFA_DM_API_POWER_OFF_SLEEP_EVT";
-
     case NFA_DM_API_REG_NDEF_HDLR_EVT:
       return "NFA_DM_API_REG_NDEF_HDLR_EVT";
-
     case NFA_DM_API_DEREG_NDEF_HDLR_EVT:
       return "NFA_DM_API_DEREG_NDEF_HDLR_EVT";
-
     case NFA_DM_TIMEOUT_DISABLE_EVT:
       return "NFA_DM_TIMEOUT_DISABLE_EVT";
-
     case NFA_DM_API_SET_POWER_SUB_STATE_EVT:
       return "NFA_DM_API_SET_POWER_SUB_STATE_EVT";
   }
 
   return "Unknown or Vendor Specific";
 }
-#endif /* BT_TRACE_VERBOSE */
diff --git a/src/nfa/dm/nfa_dm_ndef.c b/src/nfa/dm/nfa_dm_ndef.cc
similarity index 89%
rename from src/nfa/dm/nfa_dm_ndef.c
rename to src/nfa/dm/nfa_dm_ndef.cc
index bbccebf..0e07d95 100644
--- a/src/nfa/dm/nfa_dm_ndef.c
+++ b/src/nfa/dm/nfa_dm_ndef.cc
@@ -22,12 +22,17 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "ndef_utils.h"
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 * URI Well-known-type prefixes
@@ -136,13 +141,14 @@
   if (p_reg_info->tnf == NFA_TNF_DEFAULT) {
     /* check if default handler is already registered */
     if (p_cb->p_ndef_handler[NFA_NDEF_DEFAULT_HANDLER_IDX]) {
-      NFA_TRACE_WARNING0("Default NDEF handler being changed.");
+      LOG(WARNING) << StringPrintf("Default NDEF handler being changed.");
 
       /* Free old registration info */
       nfa_dm_ndef_dereg_hdlr_by_handle(
           (tNFA_HANDLE)NFA_NDEF_DEFAULT_HANDLER_IDX);
     }
-    NFA_TRACE_DEBUG0("Default NDEF handler successfully registered.");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Default NDEF handler successfully registered.");
     hdlr_idx = NFA_NDEF_DEFAULT_HANDLER_IDX;
   }
   /* Get available entry in ndef_handler table, and check if requested type is
@@ -171,21 +177,24 @@
     ndef_register.ndef_type_handle = p_reg_info->ndef_type_handle;
     ndef_register.status = NFA_STATUS_OK;
 
-    NFA_TRACE_DEBUG1("NDEF handler successfully registered. Handle=0x%08x",
-                     p_reg_info->ndef_type_handle);
-    (*(p_reg_info->p_ndef_cback))(NFA_NDEF_REGISTER_EVT,
-                                  (tNFA_NDEF_EVT_DATA*)&ndef_register);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NDEF handler successfully registered. Handle=0x%08x",
+                        p_reg_info->ndef_type_handle);
+    tNFA_NDEF_EVT_DATA nfa_ndef_evt_data;
+    nfa_ndef_evt_data.ndef_reg = ndef_register;
+    (*(p_reg_info->p_ndef_cback))(NFA_NDEF_REGISTER_EVT, &nfa_ndef_evt_data);
 
     /* indicate that we will free message buffer when type_handler is
      * deregistered */
     return false;
   } else {
     /* Error */
-    NFA_TRACE_ERROR0("NDEF handler failed to register.");
+    LOG(ERROR) << StringPrintf("NDEF handler failed to register.");
     ndef_register.ndef_type_handle = NFA_HANDLE_INVALID;
     ndef_register.status = NFA_STATUS_FAILED;
-    (*(p_reg_info->p_ndef_cback))(NFA_NDEF_REGISTER_EVT,
-                                  (tNFA_NDEF_EVT_DATA*)&ndef_register);
+    tNFA_NDEF_EVT_DATA nfa_ndef_evt_data;
+    nfa_ndef_evt_data.ndef_reg = ndef_register;
+    (*(p_reg_info->p_ndef_cback))(NFA_NDEF_REGISTER_EVT, &nfa_ndef_evt_data);
 
     return true;
   }
@@ -209,8 +218,8 @@
        NFA_HANDLE_GROUP_NDEF_HANDLER) ||
       ((p_dereginfo->ndef_type_handle & NFA_HANDLE_MASK) >=
        NFA_NDEF_MAX_HANDLERS)) {
-    NFA_TRACE_ERROR1("Invalid handle for NDEF type handler: 0x%08x",
-                     p_dereginfo->ndef_type_handle);
+    LOG(ERROR) << StringPrintf("Invalid handle for NDEF type handler: 0x%08x",
+                               p_dereginfo->ndef_type_handle);
   } else {
     nfa_dm_ndef_dereg_hdlr_by_handle(p_dereginfo->ndef_type_handle);
   }
@@ -363,8 +372,8 @@
   uint8_t rec_count = 0;
   bool record_handled, entire_message_handled;
 
-  NFA_TRACE_DEBUG3("nfa_dm_ndef_handle_message status=%i, msgbuf=%08x, len=%i",
-                   status, p_msg_buf, len);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_dm_ndef_handle_message status=%i, len=%i", status, len);
 
   if (status != NFA_STATUS_OK) {
     /* If problem reading NDEF message, then exit (no action required) */
@@ -380,8 +389,9 @@
     ndef_data.ndef_type_handle = 0;
     ndef_data.p_data = p_msg_buf;
     ndef_data.len = len;
-    (*p_cb->p_excl_ndef_cback)(NFA_NDEF_DATA_EVT,
-                               (tNFA_NDEF_EVT_DATA*)&ndef_data);
+    tNFA_NDEF_EVT_DATA nfa_ndef_evt_data;
+    nfa_ndef_evt_data.ndef_data = ndef_data;
+    (*p_cb->p_excl_ndef_cback)(NFA_NDEF_DATA_EVT, &nfa_ndef_evt_data);
     return;
   }
 
@@ -389,13 +399,14 @@
   if (len == 0) {
     p_handler = p_cb->p_ndef_handler[NFA_NDEF_DEFAULT_HANDLER_IDX];
     if (p_handler != NULL) {
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "Notifying default handler of zero-length NDEF message...");
       ndef_data.ndef_type_handle = p_handler->ndef_type_handle;
       ndef_data.p_data = NULL; /* Start of record */
       ndef_data.len = 0;
-      (*p_handler->p_ndef_cback)(NFA_NDEF_DATA_EVT,
-                                 (tNFA_NDEF_EVT_DATA*)&ndef_data);
+      tNFA_NDEF_EVT_DATA nfa_ndef_evt_data;
+      nfa_ndef_evt_data.ndef_data = ndef_data;
+      (*p_handler->p_ndef_cback)(NFA_NDEF_DATA_EVT, &nfa_ndef_evt_data);
     }
     return;
   }
@@ -403,8 +414,8 @@
   /* Validate the NDEF message */
   ndef_status = NDEF_MsgValidate(p_msg_buf, len, true);
   if (ndef_status != NDEF_OK) {
-    NFA_TRACE_ERROR1("Received invalid NDEF message. NDEF status=0x%x",
-                     ndef_status);
+    LOG(ERROR) << StringPrintf(
+        "Received invalid NDEF message. NDEF status=0x%x", ndef_status);
     return;
   }
 
@@ -439,7 +450,8 @@
       /* Not a registered NDEF type. Use default handler */
       p_handler = p_cb->p_ndef_handler[NFA_NDEF_DEFAULT_HANDLER_IDX];
       if (p_handler != NULL) {
-        NFA_TRACE_DEBUG0("No handler found. Using default handler...");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("No handler found. Using default handler...");
       }
     }
 
@@ -454,8 +466,8 @@
       }
 
       /* Get pointer to record payload */
-      NFA_TRACE_DEBUG1("Calling ndef type handler (%x)",
-                       p_handler->ndef_type_handle);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "Calling ndef type handler (%x)", p_handler->ndef_type_handle);
 
       ndef_data.ndef_type_handle = p_handler->ndef_type_handle;
       ndef_data.p_data = p_rec; /* Start of record */
@@ -506,8 +518,9 @@
       }
 
       /* Notify NDEF type handler */
-      (*p_handler->p_ndef_cback)(NFA_NDEF_DATA_EVT,
-                                 (tNFA_NDEF_EVT_DATA*)&ndef_data);
+      tNFA_NDEF_EVT_DATA nfa_ndef_evt_data;
+      nfa_ndef_evt_data.ndef_data = ndef_data;
+      (*p_handler->p_ndef_cback)(NFA_NDEF_DATA_EVT, &nfa_ndef_evt_data);
 
       /* Indicate that at lease one handler has received this record */
       record_handled = true;
@@ -521,7 +534,7 @@
      * if no default handler was register) */
     if ((!record_handled) && (!entire_message_handled)) {
       /* Unregistered NDEF record type; no default handler */
-      NFA_TRACE_WARNING1("Unhandled NDEF record (#%i)", rec_count);
+      LOG(WARNING) << StringPrintf("Unhandled NDEF record (#%i)", rec_count);
     }
 
     rec_count++;
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.cc
similarity index 70%
rename from src/nfa/ee/nfa_ee_act.c
rename to src/nfa/ee/nfa_ee_act.cc
index 3ae939d..ab1eefc 100644
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.cc
@@ -22,12 +22,18 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
 #include "nfa_ee_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+#include "nfa_hci_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* the de-bounce timer:
  * The NFA-EE API functions are called to set the routing and VS configuration.
@@ -76,6 +82,18 @@
   *pp += len;
 }
 
+static void add_route_sys_code_tlv(uint8_t** p_buff, uint8_t* p_sys_code_cfg,
+                                   uint8_t sys_code_rt_loc,
+                                   uint8_t sys_code_pwr_cfg) {
+  *(*p_buff)++ = NFC_ROUTE_TAG_SYSCODE | nfa_ee_cb.route_block_control;
+  *(*p_buff)++ = NFA_EE_SYSTEM_CODE_LEN + 2;
+  *(*p_buff)++ = sys_code_rt_loc;
+  *(*p_buff)++ = sys_code_pwr_cfg;
+  /* copy the system code */
+  memcpy(*p_buff, p_sys_code_cfg, NFA_EE_SYSTEM_CODE_LEN);
+  *p_buff += NFA_EE_SYSTEM_CODE_LEN;
+}
+
 const uint8_t nfa_ee_proto_mask_list[NFA_EE_NUM_PROTO] = {
     NFA_PROTOCOL_MASK_T1T, NFA_PROTOCOL_MASK_T2T, NFA_PROTOCOL_MASK_T3T,
     NFA_PROTOCOL_MASK_ISO_DEP, NFA_PROTOCOL_MASK_NFC_DEP};
@@ -97,7 +115,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_ee_trace_aid(char* p_str, uint8_t id, uint8_t aid_len,
+static void nfa_ee_trace_aid(std::string p_str, uint8_t id, uint8_t aid_len,
                              uint8_t* p) {
   int len = aid_len;
   int xx, yy = 0;
@@ -105,14 +123,16 @@
 
   buff[0] = 0;
   if (aid_len > NFA_MAX_AID_LEN) {
-    NFA_TRACE_ERROR2("aid_len: %d exceeds max(%d)", aid_len, NFA_MAX_AID_LEN);
+    LOG(ERROR) << StringPrintf("aid_len: %d exceeds max(%d)", aid_len,
+                               NFA_MAX_AID_LEN);
     len = NFA_MAX_AID_LEN;
   }
   for (xx = 0; xx < len; xx++) {
     yy += sprintf(&buff[yy], "%02x ", *p);
     p++;
   }
-  NFA_TRACE_DEBUG4("%s id:0x%x len=%d aid:%s", p_str, id, aid_len, buff);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s id:0x%x len=%d aid:%s", p_str.c_str(), id, aid_len, buff);
 }
 
 /*******************************************************************************
@@ -139,8 +159,17 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->tech_screen_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->tech_screen_off & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->tech_screen_off_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
-      /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (techonogy) */
+      /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (technology) */
       p_cb->size_mask += 5;
     }
   }
@@ -154,13 +183,23 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->proto_battery_off & nfa_ee_proto_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->proto_screen_lock & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->proto_screen_off & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->proto_screen_off_lock & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
       /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (protocol) */
       p_cb->size_mask += 5;
     }
   }
-  NFA_TRACE_DEBUG2("nfa_ee_update_route_size nfcee_id:0x%x size_mask:%d",
-                   p_cb->nfcee_id, p_cb->size_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_update_route_size nfcee_id:0x%x size_mask:%d",
+                      p_cb->nfcee_id, p_cb->size_mask);
 }
 
 /*******************************************************************************
@@ -194,8 +233,35 @@
       start_offset += p_cb->aid_len[xx];
     }
   }
-  NFA_TRACE_DEBUG2("nfa_ee_update_route_aid_size nfcee_id:0x%x size_aid:%d",
-                   p_cb->nfcee_id, p_cb->size_aid);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_update_route_aid_size nfcee_id:0x%x size_aid:%d",
+                      p_cb->nfcee_id, p_cb->size_aid);
+}
+
+/*******************************************************************************
+**
+** Function         nfa_ee_update_route_sys_code_size
+**
+** Description      Update the size required for system code routing
+**                  of the given NFCEE ID.
+**
+** Returns          void
+**
+*******************************************************************************/
+static void nfa_ee_update_route_sys_code_size(tNFA_EE_ECB* p_cb) {
+  p_cb->size_sys_code = 0;
+  if (p_cb->sys_code_cfg_entries) {
+    for (uint8_t xx = 0; xx < p_cb->sys_code_cfg_entries; xx++) {
+      if (p_cb->sys_code_rt_loc_vs_info[xx] & NFA_EE_AE_ROUTE) {
+        /* 4 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) */
+        p_cb->size_sys_code += 4;
+        p_cb->size_sys_code += NFA_EE_SYSTEM_CODE_LEN;
+      }
+    }
+  }
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_ee_update_route_sys_code_size nfcee_id:0x%x size_sys_code:%d",
+      p_cb->nfcee_id, p_cb->size_sys_code);
 }
 
 /*******************************************************************************
@@ -215,14 +281,17 @@
   p_cb = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
   lmrt_size += p_cb->size_mask;
   lmrt_size += p_cb->size_aid;
+  lmrt_size += p_cb->size_sys_code;
   p_cb = &nfa_ee_cb.ecb[nfa_ee_cb.cur_ee - 1];
   for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb--) {
     if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE) {
       lmrt_size += p_cb->size_mask;
       lmrt_size += p_cb->size_aid;
+      lmrt_size += p_cb->size_sys_code;
     }
   }
-  NFA_TRACE_DEBUG1("nfa_ee_total_lmrt_size size:%d", lmrt_size);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_total_lmrt_size size:%d", lmrt_size);
   return lmrt_size;
 }
 
@@ -240,6 +309,15 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->tech_screen_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->tech_screen_off & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->tech_screen_off_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
       add_route_tech_proto_tlv(&pp, NFC_ROUTE_TAG_TECH, p_cb->nfcee_id,
                                power_cfg, nfa_ee_tech_list[xx]);
@@ -277,8 +355,15 @@
 
         /* Enable screen on lock power state for ISO-DEP protocol to
            enable HCE screen lock */
-        if (NFC_GetNCIVersion() == NCI_VERSION_2_0)
-          power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK;
+        if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+            (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+          if (p_cb->proto_screen_lock & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+          if (p_cb->proto_screen_off & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+          if (p_cb->proto_screen_off_lock & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+        }
       } else {
         proto_tag = NFC_ROUTE_TAG_PROTO;
       }
@@ -297,7 +382,8 @@
                              NCI_ROUTE_PWR_STATE_ON, NFC_PROTOCOL_NFC_DEP);
 
     num_tlv++;
-    NFA_TRACE_DEBUG1("%s - NFC DEP added for DH!!!", __func__);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s - NFC DEP added for DH!!!", __func__);
   }
   /* update the num_tlv and current offset */
   uint8_t entry_size = (uint8_t)(pp - p);
@@ -323,16 +409,18 @@
         num_tlv++;
         uint8_t* pa = &p_cb->aid_cfg[start_offset];
 
-        NFA_TRACE_DEBUG2("%s -  p_cb->aid_info%x", __func__,
-                         p_cb->aid_info[xx]);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "%s -  p_cb->aid_info%x", __func__, p_cb->aid_info[xx]);
         if (p_cb->aid_info[xx] & NCI_ROUTE_QUAL_LONG_SELECT) {
-          NFA_TRACE_DEBUG2("%s - %x", __func__,
-                           p_cb->aid_info[xx] & NCI_ROUTE_QUAL_LONG_SELECT);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("%s - %x", __func__,
+                              p_cb->aid_info[xx] & NCI_ROUTE_QUAL_LONG_SELECT);
           route_qual |= NCI_ROUTE_QUAL_LONG_SELECT;
         }
         if (p_cb->aid_info[xx] & NCI_ROUTE_QUAL_SHORT_SELECT) {
-          NFA_TRACE_DEBUG2("%s - %x", __func__,
-                           p_cb->aid_info[xx] & NCI_ROUTE_QUAL_SHORT_SELECT);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("%s - %x", __func__,
+                              p_cb->aid_info[xx] & NCI_ROUTE_QUAL_SHORT_SELECT);
           route_qual |= NCI_ROUTE_QUAL_SHORT_SELECT;
         }
 
@@ -360,7 +448,61 @@
       }
     }
   } else {
-    NFA_TRACE_DEBUG1("%s - No AID entries available", __func__);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s - No AID entries available", __func__);
+  }
+}
+
+static void nfa_ee_add_sys_code_route_to_ecb(tNFA_EE_ECB* p_cb, uint8_t* pp,
+                                             uint8_t* p, uint8_t* p_buff,
+                                             int* p_cur_offset,
+                                             int* p_max_len) {
+  uint8_t num_tlv = *p_buff;
+
+  /* add the SC routing */
+  if (p_cb->sys_code_cfg_entries) {
+    int start_offset = 0;
+    for (int xx = 0; xx < p_cb->sys_code_cfg_entries; xx++) {
+      /* remember the beginning of this SC routing entry, just in case we
+       * need to put it in next command */
+      uint8_t* p_start = pp;
+      /* add one SC entry */
+      if (p_cb->sys_code_rt_loc_vs_info[xx] & NFA_EE_AE_ROUTE) {
+        uint8_t* p_sys_code_cfg = &p_cb->sys_code_cfg[start_offset];
+        if (nfa_ee_is_active(p_cb->sys_code_rt_loc[xx] | NFA_HANDLE_GROUP_EE)) {
+          add_route_sys_code_tlv(&pp, p_sys_code_cfg, p_cb->sys_code_rt_loc[xx],
+                                 p_cb->sys_code_pwr_cfg[xx]);
+          p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
+          num_tlv++;
+        } else {
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("%s -  ignoring route loc%x", __func__,
+                              p_cb->sys_code_rt_loc[xx]);
+        }
+      }
+      start_offset += NFA_EE_SYSTEM_CODE_LEN;
+      uint8_t new_size = (uint8_t)(pp - p_start);
+      nfa_ee_check_set_routing(new_size, p_max_len, p_buff, p_cur_offset);
+      if (*p_buff == 0 && (num_tlv > 0x00)) {
+        /* just sent routing command, update local */
+        *p_buff = 1;
+        num_tlv = *p_buff;
+        *p_cur_offset = new_size;
+        pp = p_buff + 1;
+        p = pp;
+        memcpy(p, p_start, new_size);
+        pp += new_size;
+      } else {
+        /* add the new entry */
+        *p_buff = num_tlv;
+        *p_cur_offset += new_size;
+      }
+    }
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "nfa_ee_route_add_one_ecb_by_route_order --num_tlv:- %d", num_tlv);
+  } else {
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s - No SC entries available", __func__);
   }
 }
 
@@ -375,11 +517,10 @@
 *******************************************************************************/
 static void nfa_ee_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                               tNFC_CONN* p_data) {
-  NFC_HDR* p_msg;
   tNFA_EE_NCI_CONN cbk;
 
-  NFA_TRACE_DEBUG2("nfa_ee_conn_cback: conn_id: %d, event=0x%02x", conn_id,
-                   event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_ee_conn_cback: conn_id: %d, event=0x%02x", conn_id, event);
 
   cbk.hdr.event = NFA_EE_NCI_CONN_EVT;
   if (event == NFC_DATA_CEVT) {
@@ -389,9 +530,10 @@
   cbk.conn_id = conn_id;
   cbk.event = event;
   cbk.p_data = p_data;
-  p_msg = (NFC_HDR*)&cbk;
+  tNFA_EE_MSG nfa_ee_msg;
+  nfa_ee_msg.conn = cbk;
 
-  nfa_ee_evt_hdlr(p_msg);
+  nfa_ee_evt_hdlr(&nfa_ee_msg.hdr);
 }
 
 /*******************************************************************************
@@ -416,6 +558,45 @@
 
 /*******************************************************************************
 **
+** Function         nfa_ee_find_total_sys_code_len
+**
+** Description      Find the total len in sys_code_cfg from start_entry to the
+**                  last in the given ecb.
+**
+** Returns          void
+**
+*******************************************************************************/
+int nfa_ee_find_total_sys_code_len(tNFA_EE_ECB* p_cb, int start_entry) {
+  int len = 0;
+  if (p_cb->sys_code_cfg_entries > start_entry) {
+    for (int xx = start_entry; xx < p_cb->sys_code_cfg_entries; xx++) {
+      len += NFA_EE_SYSTEM_CODE_LEN;
+    }
+  }
+  return len;
+}
+
+/*******************************************************************************
+**
+** Function         nfa_all_ee_find_total_sys_code_len
+**
+** Description      Find the total len in sys_code_cfg from start_entry to the
+**                  last for all EE and DH.
+**
+** Returns          total length
+**
+*******************************************************************************/
+int nfa_all_ee_find_total_sys_code_len() {
+  int total_len = 0;
+  for (int32_t xx = 0; xx < NFA_EE_NUM_ECBS; xx++) {
+    tNFA_EE_ECB* p_cb = &nfa_ee_cb.ecb[xx];
+    total_len += nfa_ee_find_total_sys_code_len(p_cb, 0);
+  }
+  return total_len;
+}
+
+/*******************************************************************************
+**
 ** Function         nfa_ee_find_aid_offset
 **
 ** Description      Given the AID, find the associated tNFA_EE_ECB and the
@@ -431,7 +612,7 @@
 
   p_ecb = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
   aid_len_offset = 1; /* skip the tag */
-  for (yy = 0; yy < nfa_ee_cb.cur_ee; yy++, p_ecb++) {
+  for (yy = 0; yy <= nfa_ee_cb.cur_ee; yy++) {
     if (p_ecb->aid_entries) {
       offset = 0;
       for (xx = 0; xx < p_ecb->aid_entries; xx++) {
@@ -458,6 +639,49 @@
 }
 
 /*******************************************************************************
+ **
+ ** Function         nfa_ee_find_sys_code_offset
+ **
+ ** Description      Given the System Code, find the associated tNFA_EE_ECB and
+ *the
+ **                  offset in sys_code_cfg[]. *p_entry is the index.
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+tNFA_EE_ECB* nfa_ee_find_sys_code_offset(uint16_t sys_code, int* p_offset,
+                                         int* p_entry) {
+  tNFA_EE_ECB* p_ret = NULL;
+
+  for (uint8_t xx = 0; xx < NFA_EE_NUM_ECBS; xx++) {
+    tNFA_EE_ECB* p_ecb = &nfa_ee_cb.ecb[xx];
+    uint8_t mask = nfa_ee_ecb_to_mask(p_ecb);
+    if ((nfa_ee_cb.ee_cfged & mask) == 0 || p_ecb->sys_code_cfg_entries == 0) {
+      continue; /*try next ecb*/
+    }
+    if (p_ecb->sys_code_cfg_entries) {
+      uint8_t offset = 0;
+      for (uint8_t yy = 0; yy < p_ecb->sys_code_cfg_entries; yy++) {
+        if ((memcmp(&p_ecb->sys_code_cfg[offset], &sys_code,
+                    NFA_EE_SYSTEM_CODE_LEN) == 0)) {
+          p_ret = p_ecb;
+          if (p_offset) *p_offset = offset;
+          if (p_entry) *p_entry = yy;
+          break;
+        }
+        offset += NFA_EE_SYSTEM_CODE_LEN;
+      }
+
+      if (p_ret) {
+        /* found the entry already */
+        return p_ret;
+      }
+    }
+  }
+  return p_ret;
+}
+
+/*******************************************************************************
 **
 ** Function         nfa_ee_report_event
 **
@@ -510,11 +734,11 @@
   tNFA_EE_CBACK* p_cback = p_data->ee_discover.p_cback;
   tNFA_EE_CBACK_DATA evt_data = {0};
 
-  NFA_TRACE_DEBUG1("nfa_ee_api_discover() in_use:%d",
-                   nfa_ee_cb.discv_timer.in_use);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("in_use:%d", nfa_ee_cb.discv_timer.in_use);
   if (nfa_ee_cb.discv_timer.in_use) {
     nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
-    NFC_NfceeDiscover(false);
+    if (NFA_GetNCIVersion() != NCI_VERSION_2_0) NFC_NfceeDiscover(false);
   }
   if (nfa_ee_cb.p_ee_disc_cback == NULL &&
       NFC_NfceeDiscover(true) == NFC_STATUS_OK) {
@@ -582,7 +806,7 @@
   int index = p_data->deregister.index;
   tNFA_EE_CBACK_DATA evt_data = {0};
 
-  NFA_TRACE_DEBUG0("nfa_ee_api_deregister");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("nfa_ee_api_deregister");
   p_cback = nfa_ee_cb.p_ee_cback[index];
   nfa_ee_cb.p_ee_cback[index] = NULL;
   if (p_cback) (*p_cback)(NFA_EE_DEREGISTER_EVT, &evt_data);
@@ -599,10 +823,19 @@
 *******************************************************************************/
 void nfa_ee_api_mode_set(tNFA_EE_MSG* p_data) {
   tNFA_EE_ECB* p_cb = p_data->cfg_hdr.p_cb;
-
-  NFA_TRACE_DEBUG2("nfa_ee_api_mode_set() handle:0x%02x mode:%d",
-                   p_cb->nfcee_id, p_data->mode_set.mode);
-  NFC_NfceeModeSet(p_cb->nfcee_id, p_data->mode_set.mode);
+  tNFA_EE_MODE_SET mode_set;
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle:0x%02x mode:%d", p_cb->nfcee_id, p_data->mode_set.mode);
+  mode_set.status = NFC_NfceeModeSet(p_cb->nfcee_id, p_data->mode_set.mode);
+  if (mode_set.status != NFC_STATUS_OK) {
+    /* the api is rejected at NFC layer, report the failure status right away */
+    mode_set.ee_handle = (tNFA_HANDLE)p_cb->nfcee_id | NFA_HANDLE_GROUP_EE;
+    mode_set.ee_status = p_data->mode_set.mode;
+    tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+    nfa_ee_cback_data.mode_set = mode_set;
+    nfa_ee_report_event(NULL, NFA_EE_MODE_SET_EVT, &nfa_ee_cback_data);
+    return;
+  }
   /* set the NFA_EE_STATUS_PENDING bit to indicate the status is not exactly
    * active */
   if (p_data->mode_set.mode == NFC_MODE_ACTIVATE)
@@ -635,31 +868,46 @@
   tNFA_TECHNOLOGY_MASK old_tech_switch_on = p_cb->tech_switch_on;
   tNFA_TECHNOLOGY_MASK old_tech_switch_off = p_cb->tech_switch_off;
   tNFA_TECHNOLOGY_MASK old_tech_battery_off = p_cb->tech_battery_off;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_lock = p_cb->tech_screen_lock;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_off = p_cb->tech_screen_off;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_off_lock = p_cb->tech_screen_off_lock;
   uint8_t old_size_mask = p_cb->size_mask;
 
   if ((p_cb->tech_switch_on == p_data->set_tech.technologies_switch_on) &&
       (p_cb->tech_switch_off == p_data->set_tech.technologies_switch_off) &&
-      (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off)) {
+      (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off) &&
+      (p_cb->tech_screen_lock == p_data->set_tech.technologies_screen_lock) &&
+      (p_cb->tech_screen_off == p_data->set_tech.technologies_screen_off) &&
+      (p_cb->tech_screen_off_lock ==
+       p_data->set_tech.technologies_screen_off_lock)) {
     /* nothing to change */
     evt_data.status = NFA_STATUS_OK;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_TECH_CFG_EVT, &evt_data);
     return;
   }
 
-  p_cb->tech_switch_on = p_data->set_tech.technologies_switch_on;
-  p_cb->tech_switch_off = p_data->set_tech.technologies_switch_off;
-  p_cb->tech_battery_off = p_data->set_tech.technologies_battery_off;
+  p_cb->tech_switch_on |= p_data->set_tech.technologies_switch_on;
+  p_cb->tech_switch_off |= p_data->set_tech.technologies_switch_off;
+  p_cb->tech_battery_off |= p_data->set_tech.technologies_battery_off;
+  p_cb->tech_screen_lock |= p_data->set_tech.technologies_screen_lock;
+  p_cb->tech_screen_off |= p_data->set_tech.technologies_screen_off;
+  p_cb->tech_screen_off_lock |= p_data->set_tech.technologies_screen_off_lock;
   nfa_ee_update_route_size(p_cb);
   if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
-    NFA_TRACE_ERROR0("nfa_ee_api_set_tech_cfg Exceed LMRT size");
+    LOG(ERROR) << StringPrintf("nfa_ee_api_set_tech_cfg Exceed LMRT size");
     evt_data.status = NFA_STATUS_BUFFER_FULL;
     p_cb->tech_switch_on = old_tech_switch_on;
     p_cb->tech_switch_off = old_tech_switch_off;
     p_cb->tech_battery_off = old_tech_battery_off;
+    p_cb->tech_screen_lock = old_tech_screen_lock;
+    p_cb->tech_screen_off = old_tech_screen_off;
+    p_cb->tech_screen_off_lock = old_tech_screen_off_lock;
     p_cb->size_mask = old_size_mask;
   } else {
     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_TECH;
-    if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off) {
+    if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off |
+        p_cb->tech_screen_lock | p_cb->tech_screen_off |
+        p_cb->tech_screen_off_lock) {
       /* if any technology in any power mode is configured, mark this entry as
        * configured */
       nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
@@ -686,32 +934,46 @@
   tNFA_PROTOCOL_MASK old_proto_switch_on = p_cb->proto_switch_on;
   tNFA_PROTOCOL_MASK old_proto_switch_off = p_cb->proto_switch_off;
   tNFA_PROTOCOL_MASK old_proto_battery_off = p_cb->proto_battery_off;
+  tNFA_PROTOCOL_MASK old_proto_screen_lock = p_cb->proto_screen_lock;
+  tNFA_PROTOCOL_MASK old_proto_screen_off = p_cb->proto_screen_off;
+  tNFA_PROTOCOL_MASK old_proto_screen_off_lock = p_cb->proto_screen_off_lock;
   uint8_t old_size_mask = p_cb->size_mask;
 
   if ((p_cb->proto_switch_on == p_data->set_proto.protocols_switch_on) &&
       (p_cb->proto_switch_off == p_data->set_proto.protocols_switch_off) &&
-      (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off)) {
+      (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off) &&
+      (p_cb->proto_screen_lock == p_data->set_proto.protocols_screen_lock) &&
+      (p_cb->proto_screen_off == p_data->set_proto.protocols_screen_off) &&
+      (p_cb->proto_screen_off_lock ==
+       p_data->set_proto.protocols_screen_off_lock)) {
     /* nothing to change */
     evt_data.status = NFA_STATUS_OK;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_PROTO_CFG_EVT, &evt_data);
     return;
   }
 
-  p_cb->proto_switch_on = p_data->set_proto.protocols_switch_on;
-  p_cb->proto_switch_off = p_data->set_proto.protocols_switch_off;
-  p_cb->proto_battery_off = p_data->set_proto.protocols_battery_off;
+  p_cb->proto_switch_on |= p_data->set_proto.protocols_switch_on;
+  p_cb->proto_switch_off |= p_data->set_proto.protocols_switch_off;
+  p_cb->proto_battery_off |= p_data->set_proto.protocols_battery_off;
+  p_cb->proto_screen_lock |= p_data->set_proto.protocols_screen_lock;
+  p_cb->proto_screen_off |= p_data->set_proto.protocols_screen_off;
+  p_cb->proto_screen_off_lock |= p_data->set_proto.protocols_screen_off_lock;
   nfa_ee_update_route_size(p_cb);
   if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
-    NFA_TRACE_ERROR0("nfa_ee_api_set_proto_cfg Exceed LMRT size");
+    LOG(ERROR) << StringPrintf("nfa_ee_api_set_proto_cfg Exceed LMRT size");
     evt_data.status = NFA_STATUS_BUFFER_FULL;
     p_cb->proto_switch_on = old_proto_switch_on;
     p_cb->proto_switch_off = old_proto_switch_off;
     p_cb->proto_battery_off = old_proto_battery_off;
+    p_cb->proto_screen_lock = old_proto_screen_lock;
+    p_cb->proto_screen_off = old_proto_screen_off;
+    p_cb->proto_screen_off_lock = old_proto_screen_off_lock;
     p_cb->size_mask = old_size_mask;
   } else {
     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_PROTO;
     if (p_cb->proto_switch_on | p_cb->proto_switch_off |
-        p_cb->proto_battery_off) {
+        p_cb->proto_battery_off | p_cb->proto_screen_lock |
+        p_cb->proto_screen_off | p_cb->proto_screen_off_lock) {
       /* if any protocol in any power mode is configured, mark this entry as
        * configured */
       nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
@@ -747,21 +1009,21 @@
   p_chk_cb =
       nfa_ee_find_aid_offset(p_add->aid_len, p_add->p_aid, &offset, &entry);
   if (p_chk_cb) {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "nfa_ee_api_add_aid The AID entry is already in the database");
     if (p_chk_cb == p_cb) {
       p_cb->aid_rt_info[entry] |= NFA_EE_AE_ROUTE;
       p_cb->aid_info[entry] = p_add->aidInfo;
       new_size = nfa_ee_total_lmrt_size();
       if (new_size > NFC_GetLmrtSize()) {
-        NFA_TRACE_ERROR1("Exceed LMRT size:%d (add ROUTE)", new_size);
+        LOG(ERROR) << StringPrintf("Exceed LMRT size:%d (add ROUTE)", new_size);
         evt_data.status = NFA_STATUS_BUFFER_FULL;
         p_cb->aid_rt_info[entry] &= ~NFA_EE_AE_ROUTE;
       } else {
         p_cb->aid_pwr_cfg[entry] = p_add->power_state;
       }
     } else {
-      NFA_TRACE_ERROR1(
+      LOG(ERROR) << StringPrintf(
           "The AID entry is already in the database for different NFCEE "
           "ID:0x%02x",
           p_chk_cb->nfcee_id);
@@ -775,7 +1037,7 @@
     len_needed = p_add->aid_len + 2; /* tag/len */
 
     if ((len_needed + len) > NFA_EE_MAX_AID_CFG_LEN) {
-      NFA_TRACE_ERROR3(
+      LOG(ERROR) << StringPrintf(
           "Exceed capacity: (len_needed:%d + len:%d) > "
           "NFA_EE_MAX_AID_CFG_LEN:%d",
           len_needed, len, NFA_EE_MAX_AID_CFG_LEN);
@@ -784,7 +1046,7 @@
       /* 4 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) */
       new_size = nfa_ee_total_lmrt_size() + 4 + p_add->aid_len;
       if (new_size > NFC_GetLmrtSize()) {
-        NFA_TRACE_ERROR1("Exceed LMRT size:%d", new_size);
+        LOG(ERROR) << StringPrintf("Exceed LMRT size:%d", new_size);
         evt_data.status = NFA_STATUS_BUFFER_FULL;
       } else {
         /* add AID */
@@ -801,8 +1063,8 @@
         p_cb->aid_len[p_cb->aid_entries++] = (uint8_t)(p - p_start);
       }
     } else {
-      NFA_TRACE_ERROR1("Exceed NFA_EE_MAX_AID_ENTRIES:%d",
-                       NFA_EE_MAX_AID_ENTRIES);
+      LOG(ERROR) << StringPrintf("Exceed NFA_EE_MAX_AID_ENTRIES:%d",
+                                 NFA_EE_MAX_AID_ENTRIES);
       evt_data.status = NFA_STATUS_BUFFER_FULL;
     }
   }
@@ -814,8 +1076,8 @@
     nfa_ee_update_route_aid_size(p_cb);
     nfa_ee_start_timer();
   }
-  NFA_TRACE_DEBUG2("status:%d ee_cfged:0x%02x ", evt_data.status,
-                   nfa_ee_cb.ee_cfged);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "status:%d ee_cfged:0x%02x ", evt_data.status, nfa_ee_cb.ee_cfged);
   /* report the status of this operation */
   nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_ADD_AID_EVT, &evt_data);
 }
@@ -843,8 +1105,8 @@
   p_cb = nfa_ee_find_aid_offset(p_data->rm_aid.aid_len, p_data->rm_aid.p_aid,
                                 &offset, &entry);
   if (p_cb && p_cb->aid_entries) {
-    NFA_TRACE_DEBUG2("aid_rt_info[%d]: 0x%02x", entry,
-                     p_cb->aid_rt_info[entry]);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "aid_rt_info[%d]: 0x%02x", entry, p_cb->aid_rt_info[entry]);
     /* mark routing and VS changed */
     if (p_cb->aid_rt_info[entry] & NFA_EE_AE_ROUTE)
       p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_AID;
@@ -859,8 +1121,8 @@
       rest_len = nfa_ee_find_total_aid_len(p_cb, entry + 1);
 
       len = p_cb->aid_len[entry];
-      NFA_TRACE_DEBUG2("nfa_ee_api_remove_aid len:%d, rest_len:%d", len,
-                       rest_len);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_ee_api_remove_aid len:%d, rest_len:%d", len, rest_len);
       GKI_shiftup(&p_cb->aid_cfg[offset], &p_cb->aid_cfg[offset + len],
                   rest_len);
       rest_len = p_cb->aid_entries - entry;
@@ -878,7 +1140,7 @@
     /* report NFA_EE_REMOVE_AID_EVT to the callback associated the NFCEE */
     p_cback = p_cb->p_ee_cback;
   } else {
-    NFA_TRACE_ERROR0(
+    LOG(ERROR) << StringPrintf(
         "nfa_ee_api_remove_aid The AID entry is not in the database");
     evt_data.status = NFA_STATUS_INVALID_PARAM;
   }
@@ -886,6 +1148,180 @@
 }
 
 /*******************************************************************************
+ **
+ ** Function         nfa_ee_api_add_sys_code
+ **
+ ** Description      Adds System Code routing configuration from user. When the
+ **                  timer expires, the configuration collected in control block
+ **                  is sent to NFCC
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+void nfa_ee_api_add_sys_code(tNFA_EE_MSG* p_data) {
+  tNFA_EE_CBACK_DATA evt_data = {0};
+  tNFA_EE_API_ADD_SYSCODE* p_add = &p_data->add_syscode;
+  tNFA_EE_ECB* p_cb = p_data->cfg_hdr.p_cb;
+
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s id:0x%x SC:0x%X ", __func__, p_add->nfcee_id, p_add->syscode);
+
+  int offset = 0, entry = 0;
+  tNFA_EE_ECB* p_chk_cb =
+      nfa_ee_find_sys_code_offset(p_add->syscode, &offset, &entry);
+
+  if (p_chk_cb) {
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "%s: The SC entry already registered "
+        "for this NFCEE id:0x%02x",
+        __func__, p_add->nfcee_id);
+
+    if (p_chk_cb == p_cb) {
+      p_cb->sys_code_rt_loc_vs_info[entry] |= NFA_EE_AE_ROUTE;
+      uint16_t new_size = nfa_ee_total_lmrt_size();
+      if (new_size > NFC_GetLmrtSize()) {
+        LOG(ERROR) << StringPrintf("Exceeded LMRT size:%d (add SYSCODE)",
+                                   new_size);
+        evt_data.status = NFA_STATUS_BUFFER_FULL;
+        p_cb->sys_code_rt_loc_vs_info[entry] &= ~NFA_EE_AE_ROUTE;
+      } else {
+        p_cb->sys_code_pwr_cfg[entry] = p_add->power_state;
+      }
+    } else {
+      LOG(ERROR) << StringPrintf(
+          "%s: SystemCode entry already registered for different "
+          "NFCEE id:0x%02x",
+          __func__, p_chk_cb->nfcee_id);
+      evt_data.status = NFA_STATUS_REJECTED;
+    }
+  } else {
+    /* Find the total length so far in sys_code_cfg */
+    int total_sc_len = nfa_all_ee_find_total_sys_code_len();
+    /* make sure the control block has enough room to hold this entry */
+    if ((NFA_EE_SYSTEM_CODE_LEN + total_sc_len) >
+        NFA_EE_MAX_SYSTEM_CODE_CFG_LEN) {
+      LOG(ERROR) << StringPrintf(
+          "Exceeded capacity: (NFA_EE_SYSTEM_CODE_LEN:%d + total_sc_len:%d) > "
+          "NFA_EE_MAX_SYSTEM_CODE_CFG_LEN:%d",
+          NFA_EE_SYSTEM_CODE_LEN, total_sc_len, NFA_EE_MAX_SYSTEM_CODE_CFG_LEN);
+      evt_data.status = NFA_STATUS_BUFFER_FULL;
+    } else if (p_cb->sys_code_cfg_entries < NFA_EE_MAX_SYSTEM_CODE_ENTRIES) {
+      /* 6 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 2(system code)*/
+      uint16_t new_size =
+          nfa_ee_total_lmrt_size() + NFA_EE_SYSTEM_CODE_TLV_SIZE;
+      if (new_size > NFC_GetLmrtSize()) {
+        LOG(ERROR) << StringPrintf("Exceeded LMRT size:%d", new_size);
+        evt_data.status = NFA_STATUS_BUFFER_FULL;
+      } else {
+        /* add SC entry*/
+        uint32_t p_cb_sc_len = nfa_ee_find_total_sys_code_len(p_cb, 0);
+        p_cb->sys_code_pwr_cfg[p_cb->sys_code_cfg_entries] = p_add->power_state;
+        p_cb->sys_code_rt_loc[p_cb->sys_code_cfg_entries] = p_add->nfcee_id;
+        p_cb->sys_code_rt_loc_vs_info[p_cb->sys_code_cfg_entries] =
+            NFA_EE_AE_ROUTE;
+
+        uint8_t* p = p_cb->sys_code_cfg + p_cb_sc_len;
+        memcpy(p, &p_add->syscode, NFA_EE_SYSTEM_CODE_LEN);
+        p += NFA_EE_SYSTEM_CODE_LEN;
+
+        p_cb->sys_code_cfg_entries++;
+      }
+    } else {
+      LOG(ERROR) << StringPrintf("Exceeded NFA_EE_MAX_SYSTEM_CODE_ENTRIES:%d",
+                                 NFA_EE_MAX_SYSTEM_CODE_ENTRIES);
+      evt_data.status = NFA_STATUS_BUFFER_FULL;
+    }
+  }
+
+  if (evt_data.status == NFA_STATUS_OK) {
+    /* mark SC changed */
+    p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_SYSCODE;
+    nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
+    nfa_ee_update_route_sys_code_size(p_cb);
+    nfa_ee_start_timer();
+  }
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: status:%d ee_cfged:0x%02x ", __func__,
+                      evt_data.status, nfa_ee_cb.ee_cfged);
+
+  /* report the status of this operation */
+  nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_ADD_SYSCODE_EVT, &evt_data);
+}
+
+/*******************************************************************************
+**
+** Function         nfa_ee_api_remove_sys_code
+**
+** Description      process remove an System Code routing configuration from
+**                  user start a 1 second timer. When the timer expires,
+**                  the configuration collected in control block is sent to NFCC
+**
+** Returns          void
+**
+*******************************************************************************/
+void nfa_ee_api_remove_sys_code(tNFA_EE_MSG* p_data) {
+  tNFA_EE_CBACK_DATA evt_data = {0};
+  tNFA_EE_API_REMOVE_SYSCODE* p_remove = &p_data->rm_syscode;
+
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s SC:0x%x", __func__, p_remove->syscode);
+
+  int offset = 0, entry = 0;
+  tNFA_EE_ECB* p_cb =
+      nfa_ee_find_sys_code_offset(p_data->rm_syscode.syscode, &offset, &entry);
+
+  if (p_cb && p_cb->sys_code_cfg_entries) {
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("sys_code_rt_loc_vs_info[%d]: 0x%02x", entry,
+                        p_cb->sys_code_rt_loc_vs_info[entry]);
+    /* mark routing and VS changed */
+    if (p_cb->sys_code_rt_loc_vs_info[entry] & NFA_EE_AE_ROUTE)
+      p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_SYSCODE;
+
+    if (p_cb->sys_code_rt_loc_vs_info[entry] & NFA_EE_AE_VS)
+      p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
+
+    /* remove the system code */
+    if ((entry + 1) < p_cb->sys_code_cfg_entries) {
+      /* not the last entry, move the SC entries in control block */
+      /* Find the total len from the next entry to the last one */
+      int total_len = nfa_ee_find_total_sys_code_len(p_cb, entry + 1);
+
+      int rm_len = NFA_EE_SYSTEM_CODE_LEN;
+
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("nfa_ee_api_remove_sys_code: rm_len:%d, total_len:%d",
+                          rm_len, total_len);
+
+      GKI_shiftup(&p_cb->sys_code_cfg[offset],
+                  &p_cb->sys_code_cfg[offset + rm_len], total_len);
+
+      total_len = p_cb->sys_code_cfg_entries - entry;
+
+      GKI_shiftup(&p_cb->sys_code_pwr_cfg[entry],
+                  &p_cb->sys_code_pwr_cfg[entry + 1], total_len);
+
+      GKI_shiftup(&p_cb->sys_code_rt_loc_vs_info[entry],
+                  &p_cb->sys_code_rt_loc_vs_info[entry + 1], total_len);
+
+      GKI_shiftup(&p_cb->sys_code_rt_loc[entry],
+                  &p_cb->sys_code_rt_loc[entry + 1], total_len);
+    }
+    /* else the last entry, just reduce the aid_entries by 1 */
+    p_cb->sys_code_cfg_entries--;
+    nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
+    nfa_ee_update_route_sys_code_size(p_cb);
+    nfa_ee_start_timer();
+  } else {
+    LOG(ERROR) << StringPrintf(
+        "nfa_ee_api_remove_sys_code: The SC entry is not in the database");
+    evt_data.status = NFA_STATUS_INVALID_PARAM;
+  }
+  /* report the status of this operation */
+  nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_REMOVE_SYSCODE_EVT, &evt_data);
+}
+
+/*******************************************************************************
 **
 ** Function         nfa_ee_api_lmrt_size
 **
@@ -894,13 +1330,14 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfa_ee_api_lmrt_size(tNFA_EE_MSG* p_data) {
+void nfa_ee_api_lmrt_size(__attribute__((unused)) tNFA_EE_MSG* p_data) {
   tNFA_EE_CBACK_DATA evt_data = {0};
   uint16_t total_size = NFC_GetLmrtSize();
 
   evt_data.size = total_size - nfa_ee_total_lmrt_size();
-  NFA_TRACE_DEBUG2("nfa_ee_api_lmrt_size total size:%d remaining size:%d",
-                   total_size, evt_data.size);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_api_lmrt_size total size:%d remaining size:%d",
+                      total_size, evt_data.size);
 
   nfa_ee_report_event(NULL, NFA_EE_REMAINING_SIZE_EVT, &evt_data);
 }
@@ -918,7 +1355,7 @@
   tNFA_EE_CBACK_DATA evt_data;
 
   if (nfa_ee_cb.ee_wait_evt & NFA_EE_WAIT_UPDATE_ALL) {
-    NFA_TRACE_ERROR2(
+    LOG(ERROR) << StringPrintf(
         "nfa_ee_api_update_now still waiting for update complete "
         "ee_wait_evt:0x%x wait_rsp:%d",
         nfa_ee_cb.ee_wait_evt, nfa_ee_cb.wait_rsp);
@@ -996,12 +1433,16 @@
       memcpy(p, p_data->send_data.p_data, p_pkt->len);
       NFC_SendData(p_cb->conn_id, p_pkt);
     } else {
+      tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+      nfa_ee_cback_data.status = status;
       nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_NO_MEM_ERR_EVT,
-                          (tNFA_EE_CBACK_DATA*)&status);
+                          &nfa_ee_cback_data);
     }
   } else {
+    tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+    nfa_ee_cback_data.status = status;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_NO_CB_ERR_EVT,
-                        (tNFA_EE_CBACK_DATA*)&status);
+                        &nfa_ee_cback_data);
   }
 }
 
@@ -1039,8 +1480,8 @@
   tNFA_EE_CBACK* p_cback;
   tNFA_EE_CBACK_DATA evt_data = {0};
 
-  NFA_TRACE_DEBUG3(
-      "nfa_ee_report_disc_done() em_state:%d num_ee_expecting:%d "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "em_state:%d num_ee_expecting:%d "
       "notify_enable_done:%d",
       nfa_ee_cb.em_state, nfa_ee_cb.num_ee_expecting, notify_enable_done);
   if (nfa_ee_cb.num_ee_expecting == 0) {
@@ -1066,6 +1507,9 @@
       NFA_EeGetInfo(&evt_data.ee_discover.num_ee, evt_data.ee_discover.ee_info);
       nfa_ee_report_event(p_cback, NFA_EE_DISCOVER_EVT, &evt_data);
     }
+    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) &&
+        nfa_ee_cb.p_enable_cback)
+      (*nfa_ee_cb.p_enable_cback)(NFA_EE_RECOVERY_REDISCOVERED);
   }
 }
 
@@ -1119,9 +1563,9 @@
     }
   }
 
-  NFA_TRACE_DEBUG3(
-      "nfa_ee_remove_pending() cur_ee:%d, num_removed:%d first_removed:%d",
-      nfa_ee_cb.cur_ee, num_removed, first_removed);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("cur_ee:%d, num_removed:%d first_removed:%d",
+                      nfa_ee_cb.cur_ee, num_removed, first_removed);
   if (num_removed && (first_removed != (nfa_ee_cb.cur_ee - num_removed))) {
     /* if the removes ECB entried are not at the end, move the entries up */
     p_cb_end = &nfa_ee_cb.ecb[nfa_ee_cb.cur_ee - 1];
@@ -1158,8 +1602,9 @@
   uint8_t num_nfcee = p_evt->num_nfcee;
   bool notify_enable_done = false;
 
-  NFA_TRACE_DEBUG3("nfa_ee_nci_disc_rsp() em_state:%d cur_ee:%d, num_nfcee:%d",
-                   nfa_ee_cb.em_state, nfa_ee_cb.cur_ee, num_nfcee);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("em_state:%d cur_ee:%d, num_nfcee:%d", nfa_ee_cb.em_state,
+                      nfa_ee_cb.cur_ee, num_nfcee);
   switch (nfa_ee_cb.em_state) {
     case NFA_EE_EM_STATE_INIT:
       nfa_ee_cb.cur_ee = 0;
@@ -1206,14 +1651,15 @@
   if (p_evt->status == NFC_STATUS_OK) {
     nfa_ee_cb.num_ee_expecting = p_evt->num_nfcee;
     if (nfa_ee_cb.num_ee_expecting > NFA_EE_MAX_EE_SUPPORTED) {
-      NFA_TRACE_ERROR2("NFA-EE num_ee_expecting:%d > max:%d",
-                       nfa_ee_cb.num_ee_expecting, NFA_EE_MAX_EE_SUPPORTED);
+      LOG(ERROR) << StringPrintf("NFA-EE num_ee_expecting:%d > max:%d",
+                                 nfa_ee_cb.num_ee_expecting,
+                                 NFA_EE_MAX_EE_SUPPORTED);
     }
   }
   nfa_ee_report_disc_done(notify_enable_done);
-  NFA_TRACE_DEBUG3(
-      "nfa_ee_nci_disc_rsp() em_state:%d cur_ee:%d num_ee_expecting:%d",
-      nfa_ee_cb.em_state, nfa_ee_cb.cur_ee, nfa_ee_cb.num_ee_expecting);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "em_state:%d cur_ee:%d num_ee_expecting:%d", nfa_ee_cb.em_state,
+      nfa_ee_cb.cur_ee, nfa_ee_cb.num_ee_expecting);
 }
 
 /*******************************************************************************
@@ -1234,8 +1680,8 @@
   tNFA_EE_INFO* p_info;
   tNFA_EE_EM_STATE new_em_state = NFA_EE_EM_STATE_MAX;
 
-  NFA_TRACE_DEBUG4(
-      "nfa_ee_nci_disc_ntf() em_state:%d ee_flags:0x%x cur_ee:%d "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "em_state:%d ee_flags:0x%x cur_ee:%d "
       "num_ee_expecting:%d",
       nfa_ee_cb.em_state, nfa_ee_cb.ee_flags, nfa_ee_cb.cur_ee,
       nfa_ee_cb.num_ee_expecting);
@@ -1244,7 +1690,7 @@
     if ((nfa_ee_cb.num_ee_expecting == 0) &&
         (nfa_ee_cb.p_ee_disc_cback != NULL)) {
       /* Discovery triggered by API function */
-      NFC_NfceeDiscover(false);
+      if (NFA_GetNCIVersion() != NCI_VERSION_2_0) NFC_NfceeDiscover(false);
     }
   }
   switch (nfa_ee_cb.em_state) {
@@ -1275,8 +1721,9 @@
         nfa_ee_cb.cur_ee++;
         notify_new_ee = true;
       } else {
-        NFA_TRACE_DEBUG3("cur_ee:%d ecb_flags=0x%02x  ee_status=0x%x",
-                         nfa_ee_cb.cur_ee, p_cb->ecb_flags, p_cb->ee_status);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("cur_ee:%d ecb_flags=0x%02x  ee_status=0x%x",
+                            nfa_ee_cb.cur_ee, p_cb->ecb_flags, p_cb->ee_status);
       }
       break;
 
@@ -1300,7 +1747,8 @@
       }
       break;
   }
-  NFA_TRACE_DEBUG1("nfa_ee_nci_disc_ntf cur_ee:%d", nfa_ee_cb.cur_ee);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_nci_disc_ntf cur_ee:%d", nfa_ee_cb.cur_ee);
 
   if (p_cb) {
     p_cb->nfcee_id = p_ee->nfcee_id;
@@ -1309,7 +1757,8 @@
     memcpy(p_cb->ee_interface, p_ee->ee_interface, p_ee->num_interface);
     p_cb->num_tlvs = p_ee->num_tlvs;
     memcpy(p_cb->ee_tlv, p_ee->ee_tlv, p_ee->num_tlvs * sizeof(tNFA_EE_TLV));
-
+    if (NFA_GetNCIVersion() == NCI_VERSION_2_0)
+      p_cb->ee_power_supply_status = p_ee->nfcee_power_ctrl;
     if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_RESTORING) {
       /* NCI spec says: An NFCEE_DISCOVER_NTF that contains a Protocol type of
        * "HCI Access"
@@ -1337,13 +1786,16 @@
         memcpy(p_info->ee_interface, p_cb->ee_interface, p_cb->num_interface);
         memcpy(p_info->ee_tlv, p_cb->ee_tlv,
                p_cb->num_tlvs * sizeof(tNFA_EE_TLV));
+        if (NFA_GetNCIVersion() == NCI_VERSION_2_0)
+          p_info->ee_power_supply_status = p_cb->ee_power_supply_status;
         nfa_ee_report_event(NULL, NFA_EE_NEW_EE_EVT, &evt_data);
       }
     } else
       nfa_ee_report_disc_done(notify_enable_done);
 
     if (p_cb->ecb_flags & NFA_EE_ECB_FLAGS_ORDER) {
-      NFA_TRACE_DEBUG0("NFA_EE_ECB_FLAGS_ORDER");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_EE_ECB_FLAGS_ORDER");
       p_cb->ecb_flags &= ~NFA_EE_ECB_FLAGS_ORDER;
       nfa_ee_report_discover_req_evt();
     }
@@ -1359,7 +1811,30 @@
     if (nfa_ee_cb.discv_timer.in_use) {
       nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
       p_data->hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
-      nfa_ee_evt_hdlr((NFC_HDR*)p_data);
+      nfa_ee_evt_hdlr(&p_data->hdr);
+    }
+  }
+}
+
+/*******************************************************************************
+**
+** Function         nfa_ee_nci_nfcee_status_ntf
+**
+** Description      Process the callback for NFCEE status notification
+**
+** Returns          void
+**
+*******************************************************************************/
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data) {
+  if (p_data != NULL) {
+    tNFC_NFCEE_STATUS_REVT* p_ee_data = p_data->nfcee_status_ntf.p_data;
+    if ((NFA_GetNCIVersion() == NCI_VERSION_2_0) &&
+        (p_ee_data->nfcee_status == NFC_NFCEE_STATUS_UNRECOVERABLE_ERROR)) {
+      tNFA_EE_ECB* p_cb = nfa_ee_find_ecb(p_ee_data->nfcee_id);
+      if (p_cb && nfa_ee_cb.p_enable_cback) {
+        (*nfa_ee_cb.p_enable_cback)(NFA_EE_RECOVERY_INIT);
+        NFC_NfceeDiscover(true);
+      }
     }
   }
 }
@@ -1392,7 +1867,7 @@
     }
   }
 
-  NFA_TRACE_DEBUG2(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_ee_check_restore_complete nfa_ee_cb.ee_cfg_sts:0x%02x "
       "proc_complete:%d",
       nfa_ee_cb.ee_cfg_sts, proc_complete);
@@ -1440,7 +1915,7 @@
     p_evt_data->num_ee++;
     p_info++;
 
-    NFA_TRACE_DEBUG6(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "[%d] ee_handle:0x%x, listen protocol A:%d, B:%d, F:%d, BP:%d",
         p_evt_data->num_ee, p_cb->nfcee_id, p_cb->la_protocol,
         p_cb->lb_protocol, p_cb->lf_protocol, p_cb->lbp_protocol);
@@ -1459,20 +1934,19 @@
 **
 *******************************************************************************/
 static void nfa_ee_report_discover_req_evt(void) {
-  tNFA_EE_DISCOVER_REQ evt_data;
-
   if (nfa_ee_cb.p_enable_cback)
     (*nfa_ee_cb.p_enable_cback)(NFA_EE_DISC_STS_REQ);
 
   /* if this is restoring NFCC */
   if (!nfa_dm_is_active()) {
-    NFA_TRACE_DEBUG0("nfa_ee_report_discover_req_evt DM is not active");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("nfa_ee_report_discover_req_evt DM is not active");
     return;
   }
 
-  nfa_ee_build_discover_req_evt(&evt_data);
-  nfa_ee_report_event(NULL, NFA_EE_DISCOVER_REQ_EVT,
-                      (tNFA_EE_CBACK_DATA*)&evt_data);
+  tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+  nfa_ee_build_discover_req_evt(&nfa_ee_cback_data.discover_req);
+  nfa_ee_report_event(NULL, NFA_EE_DISCOVER_REQ_EVT, &nfa_ee_cback_data);
 }
 
 /*******************************************************************************
@@ -1489,19 +1963,22 @@
   tNFA_EE_MODE_SET mode_set;
   tNFC_NFCEE_MODE_SET_REVT* p_rsp = p_data->mode_set_rsp.p_data;
 
-  NFA_TRACE_DEBUG2("nfa_ee_nci_mode_set_rsp() handle:0x%02x mode:%d",
-                   p_rsp->nfcee_id, p_rsp->mode);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s handle:0x%02x mode:%d", __func__, p_rsp->nfcee_id, p_rsp->mode);
   p_cb = nfa_ee_find_ecb(p_rsp->nfcee_id);
   if (p_cb == NULL) {
-    NFA_TRACE_ERROR1(
-        "nfa_ee_nci_mode_set_rsp() Can not find cb for handle:0x%02x",
-        p_rsp->nfcee_id);
+    LOG(ERROR) << StringPrintf("%s Can not find cb for handle:0x%02x", __func__,
+                               p_rsp->nfcee_id);
     return;
   }
 
-  /* update routing table and vs on mode change */
-  nfa_ee_start_timer();
-
+  /* Do not update routing table in EE_RECOVERY state */
+  if (nfa_hci_cb.hci_state != NFA_HCI_STATE_EE_RECOVERY) {
+    /* Start routing table update debounce timer */
+    nfa_ee_start_timer();
+  }
+  LOG(ERROR) << StringPrintf("%s p_rsp->status:0x%02x", __func__,
+                             p_rsp->status);
   if (p_rsp->status == NFA_STATUS_OK) {
     if (p_rsp->mode == NFA_EE_MD_ACTIVATE) {
       p_cb->ee_status = NFC_NFCEE_STATUS_ACTIVE;
@@ -1514,7 +1991,8 @@
          * configuration */
         nfa_ee_cb.ee_cfged &= ~nfa_ee_ecb_to_mask(p_cb);
         nfa_ee_cb.ee_cfg_sts |= NFA_EE_STS_CHANGED_ROUTING;
-        NFA_TRACE_DEBUG0("deactivating/still configured. Force update");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("deactivating/still configured. Force update");
       }
       p_cb->tech_switch_on = p_cb->tech_switch_off = p_cb->tech_battery_off = 0;
       p_cb->proto_switch_on = p_cb->proto_switch_off = p_cb->proto_battery_off =
@@ -1522,10 +2000,12 @@
       p_cb->aid_entries = 0;
       p_cb->ee_status = NFC_NFCEE_STATUS_INACTIVE;
     }
+  } else if (p_rsp->mode == NFA_EE_MD_ACTIVATE) {
+    p_cb->ee_status = NFC_NFCEE_STATUS_REMOVED;
   }
-  NFA_TRACE_DEBUG4("status:%d ecb_flags  :0x%02x ee_cfged:0x%02x ee_status:%d",
-                   p_rsp->status, p_cb->ecb_flags, nfa_ee_cb.ee_cfged,
-                   p_cb->ee_status);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "status:%d ecb_flags  :0x%02x ee_cfged:0x%02x ee_status:%d",
+      p_rsp->status, p_cb->ecb_flags, nfa_ee_cb.ee_cfged, p_cb->ee_status);
   if (p_cb->ecb_flags & NFA_EE_ECB_FLAGS_RESTORE) {
     if (p_cb->conn_st == NFA_EE_CONN_ST_CONN) {
       /* NFA_HCI module handles restoring configurations for HCI access */
@@ -1542,8 +2022,10 @@
     mode_set.ee_handle = (tNFA_HANDLE)p_rsp->nfcee_id | NFA_HANDLE_GROUP_EE;
     mode_set.ee_status = p_cb->ee_status;
 
+    tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+    nfa_ee_cback_data.mode_set = mode_set;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_MODE_SET_EVT,
-                        (tNFA_EE_CBACK_DATA*)&mode_set);
+                        &nfa_ee_cback_data);
 
     if ((p_cb->ee_status == NFC_NFCEE_STATUS_INACTIVE) ||
         (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE)) {
@@ -1551,6 +2033,8 @@
       nfa_ee_report_discover_req_evt();
     }
   }
+  if (nfa_ee_cb.p_enable_cback)
+    (*nfa_ee_cb.p_enable_cback)(NFA_EE_MODE_SET_COMPLETE);
 }
 
 /*******************************************************************************
@@ -1565,8 +2049,9 @@
 void nfa_ee_report_update_evt(void) {
   tNFA_EE_CBACK_DATA evt_data;
 
-  NFA_TRACE_DEBUG2("nfa_ee_report_update_evt ee_wait_evt:0x%x wait_rsp:%d",
-                   nfa_ee_cb.ee_wait_evt, nfa_ee_cb.wait_rsp);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_report_update_evt ee_wait_evt:0x%x wait_rsp:%d",
+                      nfa_ee_cb.ee_wait_evt, nfa_ee_cb.wait_rsp);
   if (nfa_ee_cb.wait_rsp == 0) {
     nfa_ee_cb.ee_wait_evt &= ~NFA_EE_WAIT_UPDATE_RSP;
 
@@ -1591,8 +2076,9 @@
 void nfa_ee_nci_wait_rsp(tNFA_EE_MSG* p_data) {
   tNFA_EE_NCI_WAIT_RSP* p_rsp = &p_data->wait_rsp;
 
-  NFA_TRACE_DEBUG2("nfa_ee_nci_wait_rsp() ee_wait_evt:0x%x wait_rsp:%d",
-                   nfa_ee_cb.ee_wait_evt, nfa_ee_cb.wait_rsp);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("ee_wait_evt:0x%x wait_rsp:%d", nfa_ee_cb.ee_wait_evt,
+                      nfa_ee_cb.wait_rsp);
   if (nfa_ee_cb.wait_rsp) {
     if (p_rsp->opcode == NCI_MSG_RF_SET_ROUTING) nfa_ee_cb.wait_rsp--;
   }
@@ -1698,7 +2184,9 @@
   evt_data.trigger = p_cbk->act_data.trigger;
   memcpy(&(evt_data.param), &(p_cbk->act_data.param),
          sizeof(tNFA_EE_ACTION_PARAM));
-  nfa_ee_report_event(NULL, NFA_EE_ACTION_EVT, (tNFA_EE_CBACK_DATA*)&evt_data);
+  tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+  nfa_ee_cback_data.action = evt_data;
+  nfa_ee_report_event(NULL, NFA_EE_ACTION_EVT, &nfa_ee_cback_data);
 }
 
 /*******************************************************************************
@@ -1717,23 +2205,23 @@
   uint8_t report_ntf = 0;
   uint8_t xx;
 
-  NFA_TRACE_DEBUG2("nfa_ee_nci_disc_req_ntf () num_info: %d cur_ee:%d",
-                   p_cbk->num_info, nfa_ee_cb.cur_ee);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "num_info: %d cur_ee:%d", p_cbk->num_info, nfa_ee_cb.cur_ee);
 
   for (xx = 0; xx < p_cbk->num_info; xx++) {
     ee_handle = NFA_HANDLE_GROUP_EE | p_cbk->info[xx].nfcee_id;
 
     p_cb = nfa_ee_find_ecb(p_cbk->info[xx].nfcee_id);
     if (!p_cb) {
-      NFA_TRACE_DEBUG1("Cannot find cb for NFCEE: 0x%x",
-                       p_cbk->info[xx].nfcee_id);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "Cannot find cb for NFCEE: 0x%x", p_cbk->info[xx].nfcee_id);
       p_cb = nfa_ee_find_ecb(NFA_EE_INVALID);
       if (p_cb) {
         p_cb->nfcee_id = p_cbk->info[xx].nfcee_id;
         p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ORDER;
       } else {
-        NFA_TRACE_ERROR1("Cannot allocate cb for NFCEE: 0x%x",
-                         p_cbk->info[xx].nfcee_id);
+        LOG(ERROR) << StringPrintf("Cannot allocate cb for NFCEE: 0x%x",
+                                   p_cbk->info[xx].nfcee_id);
         continue;
       }
     } else {
@@ -1752,7 +2240,7 @@
                  NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) {
         p_cb->lbp_protocol = p_cbk->info[xx].protocol;
       }
-      NFA_TRACE_DEBUG6(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "nfcee_id=0x%x ee_status=0x%x ecb_flags=0x%x la_protocol=0x%x "
           "la_protocol=0x%x la_protocol=0x%x",
           p_cb->nfcee_id, p_cb->ee_status, p_cb->ecb_flags, p_cb->la_protocol,
@@ -1792,6 +2280,8 @@
   if ((NFA_HANDLE_GROUP_MASK & nfcee_id) == NFA_HANDLE_GROUP_EE)
     nfcee_id &= NFA_HANDLE_MASK;
 
+  if (nfcee_id == NFC_DH_ID) return true;
+
   /* compose output */
   for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
     if ((tNFA_HANDLE)p_cb->nfcee_id == nfcee_id) {
@@ -1822,7 +2312,7 @@
       NFA_TECHNOLOGY_MASK_A, NFA_TECHNOLOGY_MASK_B, NFA_TECHNOLOGY_MASK_F,
       NFA_TECHNOLOGY_MASK_B_PRIME};
 
-  NFA_TRACE_DEBUG1("nfa_ee_get_tech_route(): %d", power_state);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%d", power_state);
 
   for (xx = 0; xx < NFA_EE_MAX_TECH_ROUTE; xx++) {
     p_handles[xx] = NFC_DH_ID;
@@ -1846,8 +2336,9 @@
       }
     }
   }
-  NFA_TRACE_DEBUG4("0x%x, 0x%x, 0x%x, 0x%x", p_handles[0], p_handles[1],
-                   p_handles[2], p_handles[3]);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("0x%x, 0x%x, 0x%x, 0x%x", p_handles[0], p_handles[1],
+                      p_handles[2], p_handles[3]);
 }
 
 /*******************************************************************************
@@ -1866,7 +2357,6 @@
   uint8_t max_tlv = (uint8_t)((*p_max_len > NFA_EE_ROUT_MAX_TLV_SIZE)
                                   ? NFA_EE_ROUT_MAX_TLV_SIZE
                                   : *p_max_len);
-  tNFA_STATUS status = NFA_STATUS_OK;
 
   if (new_size + *p_cur_offset > max_tlv) {
     if (NFC_SetRouting(true, *p, *p_cur_offset, p + 1) == NFA_STATUS_OK) {
@@ -1886,184 +2376,6 @@
 
 /*******************************************************************************
 **
-** Function         nfa_ee_route_add_one_ecb
-**
-** Description      Add the routing entries for one NFCEE/DH
-**
-** Returns          NFA_STATUS_OK, if ok to continue
-**
-*******************************************************************************/
-tNFA_STATUS nfa_ee_route_add_one_ecb(tNFA_EE_ECB* p_cb, int* p_max_len,
-                                     bool more, uint8_t* ps,
-                                     int* p_cur_offset) {
-  uint8_t *p, *pa;
-  uint16_t tlv_size;
-  uint8_t num_tlv, len;
-  int xx;
-  int start_offset;
-  uint8_t power_cfg = 0;
-  uint8_t* pp = ps + *p_cur_offset;
-  uint8_t entry_size;
-  uint8_t max_tlv;
-  uint8_t* p_start;
-  uint8_t new_size;
-  tNFA_STATUS status = NFA_STATUS_OK;
-
-  nfa_ee_check_set_routing(p_cb->size_mask, p_max_len, ps, p_cur_offset);
-  max_tlv = (uint8_t)((*p_max_len > NFA_EE_ROUT_MAX_TLV_SIZE)
-                          ? NFA_EE_ROUT_MAX_TLV_SIZE
-                          : *p_max_len);
-  /* use the first byte of the buffer (ps) to keep the num_tlv */
-  num_tlv = *ps;
-  NFA_TRACE_DEBUG5(
-      "nfa_ee_route_add_one_ecb max_len:%d, max_tlv:%d, cur_offset:%d, "
-      "more:%d, num_tlv:%d",
-      *p_max_len, max_tlv, *p_cur_offset, more, num_tlv);
-  pp = ps + 1 + *p_cur_offset;
-  p = pp;
-  tlv_size = (uint8_t)*p_cur_offset;
-  /* add the Technology based routing */
-  for (xx = 0; xx < NFA_EE_NUM_TECH; xx++) {
-    power_cfg = 0;
-    if (p_cb->tech_switch_on & nfa_ee_tech_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_ON;
-    if (p_cb->tech_switch_off & nfa_ee_tech_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
-    if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
-    if (power_cfg) {
-      *pp++ = NFC_ROUTE_TAG_TECH;
-      *pp++ = 3;
-      *pp++ = p_cb->nfcee_id;
-      *pp++ = power_cfg;
-      *pp++ = nfa_ee_tech_list[xx];
-      num_tlv++;
-      if (power_cfg != NCI_ROUTE_PWR_STATE_ON)
-        nfa_ee_cb.ee_cfged |= NFA_EE_CFGED_OFF_ROUTING;
-    }
-  }
-
-  /* add the Protocol based routing */
-  for (xx = 0; xx < NFA_EE_NUM_PROTO; xx++) {
-    power_cfg = 0;
-    if (p_cb->proto_switch_on & nfa_ee_proto_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_ON;
-    if (p_cb->proto_switch_off & nfa_ee_proto_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
-    if (p_cb->proto_battery_off & nfa_ee_proto_mask_list[xx])
-      power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
-    if (power_cfg) {
-      *pp++ = NFC_ROUTE_TAG_PROTO;
-      *pp++ = 3;
-      *pp++ = p_cb->nfcee_id;
-      *pp++ = power_cfg;
-      *pp++ = nfa_ee_proto_list[xx];
-      num_tlv++;
-      if (power_cfg != NCI_ROUTE_PWR_STATE_ON)
-        nfa_ee_cb.ee_cfged |= NFA_EE_CFGED_OFF_ROUTING;
-    }
-  }
-
-  /* add NFC-DEP routing to HOST */
-  if (p_cb->nfcee_id == NFC_DH_ID) {
-    *pp++ = NFC_ROUTE_TAG_PROTO;
-    *pp++ = 3;
-    *pp++ = NFC_DH_ID;
-    *pp++ = NCI_ROUTE_PWR_STATE_ON;
-    *pp++ = NFC_PROTOCOL_NFC_DEP;
-    num_tlv++;
-  }
-
-  /* update the num_tlv and current offset */
-  entry_size = (uint8_t)(pp - p);
-  *p_cur_offset += entry_size;
-  *ps = num_tlv;
-  /* add the AID routing */
-  if (p_cb->aid_entries) {
-    start_offset = 0;
-    for (xx = 0; xx < p_cb->aid_entries; xx++) {
-      /* rememebr the beginning of this AID routing entry, just in case we need
-       * to put it in next command */
-      p_start = pp;
-      /* add one AID entry */
-      if (p_cb->aid_rt_info[xx] & NFA_EE_AE_ROUTE) {
-        num_tlv++;
-        pa = &p_cb->aid_cfg[start_offset];
-        pa++;        /* EMV tag */
-        len = *pa++; /* aid_len */
-        *pp++ = NFC_ROUTE_TAG_AID;
-        *pp++ = len + 2;
-        *pp++ = p_cb->nfcee_id;
-        *pp++ = p_cb->aid_pwr_cfg[xx];
-        /* copy the AID */
-        memcpy(pp, pa, len);
-        pp += len;
-      }
-      start_offset += p_cb->aid_len[xx];
-      new_size = (uint8_t)(pp - p_start);
-      nfa_ee_check_set_routing(new_size, p_max_len, ps, p_cur_offset);
-      if (*ps == 0) {
-        /* just sent routing command, update local */
-        *ps = 1;
-        num_tlv = *ps;
-        *p_cur_offset = new_size;
-        pp = ps + 1;
-        p = pp;
-        tlv_size = (uint8_t)*p_cur_offset;
-        max_tlv = (uint8_t)((*p_max_len > NFA_EE_ROUT_MAX_TLV_SIZE)
-                                ? NFA_EE_ROUT_MAX_TLV_SIZE
-                                : *p_max_len);
-        memcpy(p, p_start, new_size);
-        pp += new_size;
-      } else {
-        /* add the new entry */
-        *ps = num_tlv;
-        *p_cur_offset += new_size;
-      }
-    }
-  }
-
-  tlv_size = nfa_ee_total_lmrt_size();
-  if (tlv_size) {
-    nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
-  }
-  if (p_cb->ecb_flags & NFA_EE_ECB_FLAGS_ROUTING) {
-    nfa_ee_cb.ee_cfg_sts |= NFA_EE_STS_CHANGED_ROUTING;
-  }
-  NFA_TRACE_DEBUG2("ee_cfg_sts:0x%02x lmrt_size:%d", nfa_ee_cb.ee_cfg_sts,
-                   tlv_size);
-
-  if (more == false) {
-    /* last entry. update routing table now */
-    if (nfa_ee_cb.ee_cfg_sts & NFA_EE_STS_CHANGED_ROUTING) {
-      if (tlv_size) {
-        nfa_ee_cb.ee_cfg_sts |= NFA_EE_STS_PREV_ROUTING;
-      } else {
-        nfa_ee_cb.ee_cfg_sts &= ~NFA_EE_STS_PREV_ROUTING;
-      }
-      NFA_TRACE_DEBUG2(
-          "nfa_ee_route_add_one_ecb: set routing num_tlv:%d tlv_size:%d",
-          num_tlv, tlv_size);
-      if (NFC_SetRouting(more, num_tlv, (uint8_t)(*p_cur_offset), ps + 1) ==
-          NFA_STATUS_OK) {
-        nfa_ee_cb.wait_rsp++;
-      }
-    } else if (nfa_ee_cb.ee_cfg_sts & NFA_EE_STS_PREV_ROUTING) {
-      if (tlv_size == 0) {
-        nfa_ee_cb.ee_cfg_sts &= ~NFA_EE_STS_PREV_ROUTING;
-        /* indicated routing is configured to NFCC */
-        nfa_ee_cb.ee_cfg_sts |= NFA_EE_STS_CHANGED_ROUTING;
-        if (NFC_SetRouting(more, 0, 0, ps + 1) == NFA_STATUS_OK) {
-          nfa_ee_cb.wait_rsp++;
-        }
-      }
-    }
-  }
-
-  return status;
-}
-/*******************************************************************************
-**
 ** Function         nfa_ee_route_add_one_ecb_order
 **
 ** Description      Add the routing entries for NFCEE/DH in order defined
@@ -2078,7 +2390,7 @@
 
   /* use the first byte of the buffer (ps) to keep the num_tlv */
   uint8_t num_tlv = *ps;
-  NFA_TRACE_DEBUG6(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "%s - max_len:%d, cur_offset:%d, more:%d, num_tlv:%d,rout_type:- %d",
       __func__, *p_max_len, *p_cur_offset, more, num_tlv, rout_type);
   uint8_t* pp = ps + 1 + *p_cur_offset;
@@ -2096,8 +2408,13 @@
     case NCI_ROUTE_ORDER_AID: {
       nfa_ee_add_aid_route_to_ecb(p_cb, pp, p, ps, p_cur_offset, p_max_len);
     } break;
+    case NCI_ROUTE_ORDER_SYS_CODE: {
+      nfa_ee_add_sys_code_route_to_ecb(p_cb, pp, p, ps, p_cur_offset,
+                                       p_max_len);
+    } break;
     default: {
-      NFA_TRACE_DEBUG2("%s -  Route type - NA:- %d", __func__, rout_type);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s -  Route type - NA:- %d", __func__, rout_type);
     }
   }
 
@@ -2111,8 +2428,8 @@
   if (p_cb->ecb_flags & NFA_EE_ECB_FLAGS_ROUTING) {
     nfa_ee_cb.ee_cfg_sts |= NFA_EE_STS_CHANGED_ROUTING;
   }
-  NFA_TRACE_DEBUG2("ee_cfg_sts:0x%02x lmrt_size:%d", nfa_ee_cb.ee_cfg_sts,
-                   tlv_size);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "ee_cfg_sts:0x%02x lmrt_size:%d", nfa_ee_cb.ee_cfg_sts, tlv_size);
 
   if (more == false) {
     /* last entry. update routing table now */
@@ -2122,8 +2439,9 @@
       } else {
         nfa_ee_cb.ee_cfg_sts &= ~NFA_EE_STS_PREV_ROUTING;
       }
-      NFA_TRACE_DEBUG3("%s : set routing num_tlv:%d tlv_size:%d", __func__,
-                       num_tlv, tlv_size);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s : set routing num_tlv:%d tlv_size:%d", __func__,
+                          num_tlv, tlv_size);
       if (NFC_SetRouting(more, num_tlv, (uint8_t)(*p_cur_offset), ps + 1) ==
           NFA_STATUS_OK) {
         nfa_ee_cb.wait_rsp++;
@@ -2177,8 +2495,9 @@
   tNFA_EE_ECB* p_cb;
   uint8_t mask;
 
-  NFA_TRACE_DEBUG2("nfa_ee_need_recfg() ee_cfged: 0x%02x ee_cfg_sts: 0x%02x",
-                   nfa_ee_cb.ee_cfged, nfa_ee_cb.ee_cfg_sts);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("ee_cfged: 0x%02x ee_cfg_sts: 0x%02x", nfa_ee_cb.ee_cfged,
+                      nfa_ee_cb.ee_cfg_sts);
   /* if no routing/vs is configured, do not need to send the info to NFCC */
   if (nfa_ee_cb.ee_cfged || nfa_ee_cb.ee_cfg_sts) {
     if (nfa_ee_cb.ee_cfg_sts & NFA_EE_STS_CHANGED) {
@@ -2187,8 +2506,8 @@
       p_cb = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
       mask = 1 << NFA_EE_CB_4_DH;
       for (xx = 0; xx <= nfa_ee_cb.cur_ee; xx++) {
-        NFA_TRACE_DEBUG3("%d: ecb_flags  : 0x%02x, mask: 0x%02x", xx,
-                         p_cb->ecb_flags, mask);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "%d: ecb_flags  : 0x%02x, mask: 0x%02x", xx, p_cb->ecb_flags, mask);
         if ((p_cb->ecb_flags) && (nfa_ee_cb.ee_cfged & mask)) {
           needed = true;
           break;
@@ -2213,10 +2532,10 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfa_ee_rout_timeout(tNFA_EE_MSG* p_data) {
+void nfa_ee_rout_timeout(__attribute__((unused)) tNFA_EE_MSG* p_data) {
   uint8_t ee_cfged = nfa_ee_cb.ee_cfged;
 
-  NFA_TRACE_DEBUG0("nfa_ee_rout_timeout()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   if (nfa_ee_need_recfg()) {
     /* discovery is not started */
     nfa_ee_update_rout();
@@ -2243,8 +2562,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfa_ee_discv_timeout(tNFA_EE_MSG* p_data) {
-  NFC_NfceeDiscover(false);
+void nfa_ee_discv_timeout(__attribute__((unused)) tNFA_EE_MSG* p_data) {
+  if (NFA_GetNCIVersion() != NCI_VERSION_2_0) NFC_NfceeDiscover(false);
   if (nfa_ee_cb.p_enable_cback)
     (*nfa_ee_cb.p_enable_cback)(NFA_EE_DISC_STS_OFF);
 }
@@ -2259,7 +2578,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfa_ee_lmrt_to_nfcc(tNFA_EE_MSG* p_data) {
+void nfa_ee_lmrt_to_nfcc(__attribute__((unused)) tNFA_EE_MSG* p_data) {
   int xx;
   tNFA_EE_ECB* p_cb;
   uint8_t* p = NULL;
@@ -2274,9 +2593,10 @@
   /* update routing table: DH and the activated NFCEEs */
   p = (uint8_t*)GKI_getbuf(NFA_EE_ROUT_BUF_SIZE);
   if (p == NULL) {
-    NFA_TRACE_ERROR0("nfa_ee_lmrt_to_nfcc() no buffer to send routing info.");
-    nfa_ee_report_event(NULL, NFA_EE_NO_MEM_ERR_EVT,
-                        (tNFA_EE_CBACK_DATA*)&status);
+    LOG(ERROR) << StringPrintf("no buffer to send routing info.");
+    tNFA_EE_CBACK_DATA nfa_ee_cback_data;
+    nfa_ee_cback_data.status = status;
+    nfa_ee_report_event(NULL, NFA_EE_NO_MEM_ERR_EVT, &nfa_ee_cback_data);
     return;
   }
 
@@ -2286,7 +2606,8 @@
     if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE) {
       if (last_active == NFA_EE_INVALID) {
         last_active = p_cb->nfcee_id;
-        NFA_TRACE_DEBUG1("last_active: 0x%x", last_active);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("last_active: 0x%x", last_active);
       }
     }
   }
@@ -2304,16 +2625,19 @@
   for (int rt = NCI_ROUTE_ORDER_AID; rt <= NCI_ROUTE_ORDER_TECHNOLOGY; rt++) {
     /* add the routing entries for NFCEEs */
     p_cb = &nfa_ee_cb.ecb[0];
+
     for (xx = 0; (xx < nfa_ee_cb.cur_ee) && check; xx++, p_cb++) {
       if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE) {
-        NFA_TRACE_DEBUG1("%s --add the routing for NFCEEs!!", __func__);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("%s --add the routing for NFCEEs!!", __func__);
         nfa_ee_route_add_one_ecb_by_route_order(p_cb, rt, &max_len, more, p,
                                                 &cur_offset);
       }
     }
     if (rt == NCI_ROUTE_ORDER_TECHNOLOGY) more = false;
     /* add the routing entries for DH */
-    NFA_TRACE_DEBUG1("%s --add the routing for DH!!", __func__);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s --add the routing for DH!!", __func__);
     nfa_ee_route_add_one_ecb_by_route_order(&nfa_ee_cb.ecb[NFA_EE_CB_4_DH], rt,
                                             &max_len, more, p, &cur_offset);
   }
@@ -2335,14 +2659,14 @@
   int xx;
   tNFA_EE_ECB* p_cb;
   uint8_t mask;
-  NFC_HDR msg;
+  tNFA_EE_MSG nfa_ee_msg;
 
-  NFA_TRACE_DEBUG1("nfa_ee_update_rout ee_cfg_sts:0x%02x",
-                   nfa_ee_cb.ee_cfg_sts);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_ee_update_rout ee_cfg_sts:0x%02x", nfa_ee_cb.ee_cfg_sts);
 
   /* use action function to send routing and VS configuration to NFCC */
-  msg.event = NFA_EE_CFG_TO_NFCC_EVT;
-  nfa_ee_evt_hdlr(&msg);
+  nfa_ee_msg.hdr.event = NFA_EE_CFG_TO_NFCC_EVT;
+  nfa_ee_evt_hdlr(&nfa_ee_msg.hdr);
 
   /* all configuration is updated to NFCC, clear the status mask */
   nfa_ee_cb.ee_cfg_sts &= NFA_EE_STS_PREV;
@@ -2353,11 +2677,13 @@
     mask = (1 << xx);
     if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off |
         p_cb->proto_switch_on | p_cb->proto_switch_off |
-        p_cb->proto_battery_off | p_cb->aid_entries) {
+        p_cb->proto_battery_off | p_cb->aid_entries |
+        p_cb->sys_code_cfg_entries) {
       /* this entry has routing configuration. mark it configured */
       nfa_ee_cb.ee_cfged |= mask;
     }
   }
-  NFA_TRACE_DEBUG2("nfa_ee_update_rout ee_cfg_sts:0x%02x ee_cfged:0x%02x",
-                   nfa_ee_cb.ee_cfg_sts, nfa_ee_cb.ee_cfged);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_ee_update_rout ee_cfg_sts:0x%02x ee_cfged:0x%02x",
+                      nfa_ee_cb.ee_cfg_sts, nfa_ee_cb.ee_cfged);
 }
diff --git a/src/nfa/ee/nfa_ee_api.c b/src/nfa/ee/nfa_ee_api.cc
similarity index 73%
rename from src/nfa/ee/nfa_ee_api.c
rename to src/nfa/ee/nfa_ee_api.cc
index a1290b7..af99a7d 100644
--- a/src/nfa/ee/nfa_ee_api.c
+++ b/src/nfa/ee/nfa_ee_api.cc
@@ -21,11 +21,17 @@
  *  NFA interface to NFCEE - API functions
  *
  ******************************************************************************/
-#include "nfa_ee_api.h"
-#include <string.h>
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
+#include "nfa_ee_api.h"
 #include "nfa_ee_int.h"
-#include "nfa_sys_int.h"
+#include "nfc_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  APIs
@@ -49,13 +55,14 @@
   tNFA_EE_API_DISCOVER* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
 
-  NFA_TRACE_API0("NFA_EeDiscover()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_ee_cb.em_state != NFA_EE_EM_STATE_INIT_DONE) {
-    NFA_TRACE_ERROR1("NFA_EeDiscover bad em state: %d", nfa_ee_cb.em_state);
+    LOG(ERROR) << StringPrintf("NFA_EeDiscover bad em state: %d",
+                               nfa_ee_cb.em_state);
     status = NFA_STATUS_FAILED;
   } else if ((nfa_ee_cb.p_ee_disc_cback != NULL) || (p_cback == NULL)) {
-    NFA_TRACE_ERROR0("NFA_EeDiscover() in progress or NULL callback function");
+    LOG(ERROR) << StringPrintf("in progress or NULL callback function");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_DISCOVER*)GKI_getbuf(sizeof(tNFA_EE_API_DISCOVER));
@@ -91,24 +98,27 @@
   uint8_t max_ret;
   uint8_t num_ret = 0;
 
-  NFA_TRACE_DEBUG2("NFA_EeGetInfo em_state:%d cur_ee:%d", nfa_ee_cb.em_state,
-                   nfa_ee_cb.cur_ee);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFA_EeGetInfo em_state:%d cur_ee:%d", nfa_ee_cb.em_state,
+                      nfa_ee_cb.cur_ee);
   /* validate parameters */
   if (p_info == NULL || p_num_nfcee == NULL) {
-    NFA_TRACE_ERROR0("NFA_EeGetInfo bad parameter");
+    LOG(ERROR) << StringPrintf("NFA_EeGetInfo bad parameter");
     return (NFA_STATUS_INVALID_PARAM);
   }
   max_ret = *p_num_nfcee;
   *p_num_nfcee = 0;
   if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT) {
-    NFA_TRACE_ERROR1("NFA_EeGetInfo bad em state: %d", nfa_ee_cb.em_state);
+    LOG(ERROR) << StringPrintf("NFA_EeGetInfo bad em state: %d",
+                               nfa_ee_cb.em_state);
     return (NFA_STATUS_FAILED);
   }
 
   /* compose output */
   for (xx = 0; (xx < ret) && (num_ret < max_ret); xx++, p_cb++) {
-    NFA_TRACE_DEBUG4("xx:%d max_ret:%d, num_ret:%d ee_status:0x%x", xx, max_ret,
-                     num_ret, p_cb->ee_status);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("xx:%d max_ret:%d, num_ret:%d ee_status:0x%x", xx,
+                        max_ret, num_ret, p_cb->ee_status);
     if ((p_cb->ee_status & NFA_EE_STATUS_INT_MASK) ||
         (p_cb->ee_status == NFA_EE_STATUS_REMOVED)) {
       continue;
@@ -119,10 +129,11 @@
     p_info->num_tlvs = p_cb->num_tlvs;
     memcpy(p_info->ee_interface, p_cb->ee_interface, p_cb->num_interface);
     memcpy(p_info->ee_tlv, p_cb->ee_tlv, p_cb->num_tlvs * sizeof(tNFA_EE_TLV));
+    p_info->ee_power_supply_status = p_cb->ee_power_supply_status;
     p_info++;
     num_ret++;
   }
-  NFA_TRACE_DEBUG1("num_ret:%d", num_ret);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("num_ret:%d", num_ret);
   *p_num_nfcee = num_ret;
   return (NFA_STATUS_OK);
 }
@@ -143,10 +154,10 @@
   tNFA_EE_API_REGISTER* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
 
-  NFA_TRACE_API0("NFA_EeRegister()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (p_cback == NULL) {
-    NFA_TRACE_ERROR0("NFA_EeRegister(): with NULL callback function");
+    LOG(ERROR) << StringPrintf("with NULL callback function");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_REGISTER*)GKI_getbuf(sizeof(tNFA_EE_API_REGISTER));
@@ -188,7 +199,8 @@
     }
   }
 
-  NFA_TRACE_API2("NFA_EeDeregister() %d, status:%d", index, status);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%d, status:%d", index, status);
   if ((status != NFA_STATUS_INVALID_PARAM) &&
       (p_msg = (tNFA_EE_API_DEREGISTER*)GKI_getbuf(
            sizeof(tNFA_EE_API_DEREGISTER))) != NULL) {
@@ -232,11 +244,11 @@
       break;
     }
   }
-  NFA_TRACE_API2("NFA_EeModeSet(): handle:<0x%x>, mode:0x%02X", ee_handle,
-                 mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle:<0x%x>, mode:0x%02X", ee_handle, mode);
 
   if (p_found == NULL) {
-    NFA_TRACE_ERROR1("NFA_EeModeSet() invalid NFCEE:0x%04x", ee_handle);
+    LOG(ERROR) << StringPrintf("invalid NFCEE:0x%04x", ee_handle);
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_MODE_SET*)GKI_getbuf(sizeof(tNFA_EE_API_MODE_SET));
@@ -279,21 +291,25 @@
 tNFA_STATUS NFA_EeSetDefaultTechRouting(
     tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
     tNFA_TECHNOLOGY_MASK technologies_switch_off,
-    tNFA_TECHNOLOGY_MASK technologies_battery_off) {
+    tNFA_TECHNOLOGY_MASK technologies_battery_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off_lock) {
   tNFA_EE_API_SET_TECH_CFG* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API4(
-      "NFA_EeSetDefaultTechRouting(): "
-      "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x>",
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      ""
+      "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
       ee_handle, technologies_switch_on, technologies_switch_off,
-      technologies_battery_off);
+      technologies_battery_off, technologies_screen_lock,
+      technologies_screen_off, technologies_screen_off_lock);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if (p_cb == NULL) {
-    NFA_TRACE_ERROR0("Bad ee_handle");
+    LOG(ERROR) << StringPrintf("Bad ee_handle");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg =
@@ -305,6 +321,9 @@
       p_msg->technologies_switch_on = technologies_switch_on;
       p_msg->technologies_switch_off = technologies_switch_off;
       p_msg->technologies_battery_off = technologies_battery_off;
+      p_msg->technologies_screen_lock = technologies_screen_lock;
+      p_msg->technologies_screen_off = technologies_screen_off;
+      p_msg->technologies_screen_off_lock = technologies_screen_off_lock;
 
       nfa_sys_sendmsg(p_msg);
 
@@ -339,21 +358,24 @@
 tNFA_STATUS NFA_EeSetDefaultProtoRouting(
     tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
     tNFA_PROTOCOL_MASK protocols_switch_off,
-    tNFA_PROTOCOL_MASK protocols_battery_off) {
+    tNFA_PROTOCOL_MASK protocols_battery_off,
+    tNFA_PROTOCOL_MASK protocols_screen_lock,
+    tNFA_PROTOCOL_MASK protocols_screen_off,
+    tNFA_PROTOCOL_MASK protocols_screen_off_lock) {
   tNFA_EE_API_SET_PROTO_CFG* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API4(
-      "NFA_EeSetDefaultProtoRouting(): "
-      "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x>",
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
       ee_handle, protocols_switch_on, protocols_switch_off,
-      protocols_battery_off);
+      protocols_battery_off, protocols_screen_lock, protocols_screen_off,
+      protocols_screen_off_lock);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if (p_cb == NULL) {
-    NFA_TRACE_ERROR0("Bad ee_handle");
+    LOG(ERROR) << StringPrintf("Bad ee_handle");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_SET_PROTO_CFG*)GKI_getbuf(
@@ -365,6 +387,9 @@
       p_msg->protocols_switch_on = protocols_switch_on;
       p_msg->protocols_switch_off = protocols_switch_off;
       p_msg->protocols_battery_off = protocols_battery_off;
+      p_msg->protocols_screen_lock = protocols_screen_lock;
+      p_msg->protocols_screen_off = protocols_screen_off;
+      p_msg->protocols_screen_off_lock = protocols_screen_off_lock;
 
       nfa_sys_sendmsg(p_msg);
 
@@ -404,18 +429,19 @@
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API1("NFA_EeAddAidRouting(): handle:<0x%x>", ee_handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:<0x%x>", ee_handle);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   /* validate parameters - make sure the AID is in valid length range */
   if ((p_cb == NULL) || (aid_len == 0) || (p_aid == NULL) ||
       (aid_len < NFA_MIN_AID_LEN) || (aid_len > NFA_MAX_AID_LEN)) {
-    NFA_TRACE_ERROR1("Bad ee_handle or AID (len=%d)", aid_len);
+    LOG(ERROR) << StringPrintf("Bad ee_handle or AID (len=%d)", aid_len);
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_ADD_AID*)GKI_getbuf(size);
     if (p_msg != NULL) {
-      NFA_TRACE_DEBUG2("aid:<%02x%02x>", p_aid[0], p_aid[1]);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("aid:<%02x%02x>", p_aid[0], p_aid[1]);
       p_msg->hdr.event = NFA_EE_API_ADD_AID_EVT;
       p_msg->nfcee_id = nfcee_id;
       p_msg->p_cb = p_cb;
@@ -460,9 +486,9 @@
   tNFA_STATUS status = NFA_STATUS_FAILED;
   uint16_t size = sizeof(tNFA_EE_API_REMOVE_AID) + aid_len;
 
-  NFA_TRACE_API0("NFA_EeRemoveAidRouting()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   if ((aid_len == 0) || (p_aid == NULL) || (aid_len > NFA_MAX_AID_LEN)) {
-    NFA_TRACE_ERROR0("Bad AID");
+    LOG(ERROR) << StringPrintf("Bad AID");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_REMOVE_AID*)GKI_getbuf(size);
@@ -483,6 +509,103 @@
 
 /*******************************************************************************
 **
+** Function         NFA_EeAddSystemCodeRouting
+**
+** Description      This function is called to add an system code entry in the
+**                  listen mode routing table in NFCC. The status of this
+**                  operation is reported as the NFA_EE_ADD_SYSCODE_EVT.
+**
+** Note:            If RF discovery is started,
+**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
+**                  happen before calling this function
+**
+** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
+**                  function to change the listen mode routing is called.
+**
+** Returns          NFA_STATUS_OK if successfully initiated
+**                  NFA_STATUS_FAILED otherwise
+**                  NFA_STATUS_INVALID_PARAM If bad parameter
+**
+*******************************************************************************/
+tNFA_STATUS NFA_EeAddSystemCodeRouting(uint16_t systemcode,
+                                       tNFA_HANDLE ee_handle,
+                                       tNFA_EE_PWR_STATE power_state) {
+  tNFA_STATUS status = NFA_STATUS_FAILED;
+  uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFA_EeAddSystemCodeRouting(): handle:<0x%x>", ee_handle);
+  tNFA_EE_ECB* p_cb = nfa_ee_find_ecb(nfcee_id);
+
+  if (p_cb == NULL || systemcode == 0) {
+    LOG(ERROR) << StringPrintf("Bad ee_handle or System Code");
+    status = NFA_STATUS_INVALID_PARAM;
+  } else if ((NFA_GetNCIVersion() != NCI_VERSION_2_0) &&
+             (nfc_cb.isScbrSupported == false)) {
+    LOG(ERROR) << StringPrintf("Invalid NCI Version/SCBR not supported");
+    status = NFA_STATUS_NOT_SUPPORTED;
+  } else {
+    tNFA_EE_API_ADD_SYSCODE* p_msg =
+        (tNFA_EE_API_ADD_SYSCODE*)GKI_getbuf(sizeof(tNFA_EE_API_ADD_SYSCODE));
+    if (p_msg != NULL) {
+      p_msg->hdr.event = NFA_EE_API_ADD_SYSCODE_EVT;
+      p_msg->power_state = power_state;
+      p_msg->nfcee_id = nfcee_id;
+      p_msg->p_cb = p_cb;
+      // adjust endianness of syscode
+      p_msg->syscode = (systemcode & 0x00FF) << 8 | (systemcode & 0xFF00) >> 8;
+      nfa_sys_sendmsg(p_msg);
+      status = NFA_STATUS_OK;
+    }
+  }
+  return status;
+}
+
+/*******************************************************************************
+**
+** Function         NFA_EeRemoveSystemCodeRouting
+**
+** Description      This function is called to remove the given System Code
+**                  based entry from the listen mode routing table. The status
+**                  of this operation is reported as the
+**                  NFA_EE_REMOVE_SYSCODE_EVT.
+**
+** Note:            If RF discovery is started,
+**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
+**                  happen before calling this function
+**
+** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
+**                  function to change the listen mode routing is called.
+**
+** Returns          NFA_STATUS_OK if successfully initiated
+**                  NFA_STATUS_FAILED otherwise
+**                  NFA_STATUS_INVALID_PARAM If bad parameter
+**
+*******************************************************************************/
+tNFA_STATUS NFA_EeRemoveSystemCodeRouting(uint16_t systemcode) {
+  tNFA_STATUS status = NFA_STATUS_FAILED;
+
+  if (systemcode == 0) {
+    LOG(ERROR) << "Bad ee_handle or System Code";
+    status = NFA_STATUS_INVALID_PARAM;
+  } else if ((NFA_GetNCIVersion() != NCI_VERSION_2_0) &&
+             (nfc_cb.isScbrSupported == false)) {
+    LOG(ERROR) << "Invalid NCI Version/SCBR Not supported";
+    status = NFA_STATUS_NOT_SUPPORTED;
+  } else {
+    tNFA_EE_API_REMOVE_SYSCODE* p_msg = (tNFA_EE_API_REMOVE_SYSCODE*)GKI_getbuf(
+        sizeof(tNFA_EE_API_REMOVE_SYSCODE));
+    if (p_msg != NULL) {
+      p_msg->hdr.event = NFA_EE_API_REMOVE_SYSCODE_EVT;
+      p_msg->syscode = (systemcode & 0x00FF) << 8 | (systemcode & 0xFF00) >> 8;
+      nfa_sys_sendmsg(p_msg);
+      status = NFA_STATUS_OK;
+    }
+  }
+  return status;
+}
+
+/*******************************************************************************
+**
 ** Function         NFA_EeGetLmrtRemainingSize
 **
 ** Description      This function is called to get remaining size of the
@@ -497,7 +620,7 @@
   tNFA_EE_API_LMRT_SIZE* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
 
-  NFA_TRACE_API0("NFA_EeGetLmrtRemainingSize()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   p_msg = (tNFA_EE_API_LMRT_SIZE*)GKI_getbuf(sizeof(tNFA_EE_API_LMRT_SIZE));
   if (p_msg != NULL) {
     p_msg->event = NFA_EE_API_LMRT_SIZE_EVT;
@@ -528,9 +651,9 @@
   NFC_HDR* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
 
-  NFA_TRACE_API0("NFA_EeUpdateNow()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   if (nfa_ee_cb.ee_wait_evt & NFA_EE_WAIT_UPDATE_ALL) {
-    NFA_TRACE_ERROR0("update in progress");
+    LOG(ERROR) << StringPrintf("update in progress");
     status = NFA_STATUS_SEMANTIC_ERROR;
   } else {
     p_msg = (NFC_HDR*)GKI_getbuf(NFC_HDR_SIZE);
@@ -567,12 +690,12 @@
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API2("NFA_EeConnect(): handle:<0x%x> ee_interface:0x%x", ee_handle,
-                 ee_interface);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle:<0x%x> ee_interface:0x%x", ee_handle, ee_interface);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if ((p_cb == NULL) || (p_cback == NULL)) {
-    NFA_TRACE_ERROR0("Bad ee_handle or NULL callback function");
+    LOG(ERROR) << StringPrintf("Bad ee_handle or NULL callback function");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_CONNECT*)GKI_getbuf(sizeof(tNFA_EE_API_CONNECT));
@@ -613,13 +736,13 @@
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API1("NFA_EeSendData(): handle:<0x%x>", ee_handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:<0x%x>", ee_handle);
 
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN) ||
       (p_data == NULL)) {
-    NFA_TRACE_ERROR0("Bad ee_handle or NULL data");
+    LOG(ERROR) << StringPrintf("Bad ee_handle or NULL data");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_SEND_DATA*)GKI_getbuf(
@@ -660,11 +783,11 @@
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
-  NFA_TRACE_API1("NFA_EeDisconnect(): handle:<0x%x>", ee_handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:<0x%x>", ee_handle);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN)) {
-    NFA_TRACE_ERROR0("NFA_EeDisconnect() Bad ee_handle");
+    LOG(ERROR) << StringPrintf("Bad ee_handle");
     status = NFA_STATUS_INVALID_PARAM;
   } else {
     p_msg = (tNFA_EE_API_DISCONNECT*)GKI_getbuf(sizeof(tNFA_EE_API_DISCONNECT));
diff --git a/src/nfa/ee/nfa_ee_main.c b/src/nfa/ee/nfa_ee_main.cc
similarity index 82%
rename from src/nfa/ee/nfa_ee_main.c
rename to src/nfa/ee/nfa_ee_main.cc
index b3e957d..259bcba 100644
--- a/src/nfa/ee/nfa_ee_main.c
+++ b/src/nfa/ee/nfa_ee_main.cc
@@ -21,15 +21,19 @@
  *  This is the main implementation file for the NFA EE.
  *
  ******************************************************************************/
-#include <string.h>
-#include "config.h"
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
 #include "nfa_ee_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+#include "nfc_config.h"
 
-extern void nfa_ee_vs_cback(tNFC_VS_EVT event, NFC_HDR* p_data);
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*****************************************************************************
 **  Global Variables
 *****************************************************************************/
@@ -48,30 +52,33 @@
 
 const tNFA_EE_SM_ACT nfa_ee_actions[] = {
     /* NFA-EE action function/ internal events */
-    nfa_ee_api_discover,      /* NFA_EE_API_DISCOVER_EVT      */
-    nfa_ee_api_register,      /* NFA_EE_API_REGISTER_EVT      */
-    nfa_ee_api_deregister,    /* NFA_EE_API_DEREGISTER_EVT    */
-    nfa_ee_api_mode_set,      /* NFA_EE_API_MODE_SET_EVT      */
-    nfa_ee_api_set_tech_cfg,  /* NFA_EE_API_SET_TECH_CFG_EVT  */
-    nfa_ee_api_set_proto_cfg, /* NFA_EE_API_SET_PROTO_CFG_EVT */
-    nfa_ee_api_add_aid,       /* NFA_EE_API_ADD_AID_EVT       */
-    nfa_ee_api_remove_aid,    /* NFA_EE_API_REMOVE_AID_EVT    */
-    nfa_ee_api_lmrt_size,     /* NFA_EE_API_LMRT_SIZE_EVT     */
-    nfa_ee_api_update_now,    /* NFA_EE_API_UPDATE_NOW_EVT    */
-    nfa_ee_api_connect,       /* NFA_EE_API_CONNECT_EVT       */
-    nfa_ee_api_send_data,     /* NFA_EE_API_SEND_DATA_EVT     */
-    nfa_ee_api_disconnect,    /* NFA_EE_API_DISCONNECT_EVT    */
-    nfa_ee_nci_disc_rsp,      /* NFA_EE_NCI_DISC_RSP_EVT      */
-    nfa_ee_nci_disc_ntf,      /* NFA_EE_NCI_DISC_NTF_EVT      */
-    nfa_ee_nci_mode_set_rsp,  /* NFA_EE_NCI_MODE_SET_RSP_EVT  */
-    nfa_ee_nci_conn,          /* NFA_EE_NCI_CONN_EVT          */
-    nfa_ee_nci_conn,          /* NFA_EE_NCI_DATA_EVT          */
-    nfa_ee_nci_action_ntf,    /* NFA_EE_NCI_ACTION_NTF_EVT    */
-    nfa_ee_nci_disc_req_ntf,  /* NFA_EE_NCI_DISC_REQ_NTF_EVT  */
-    nfa_ee_nci_wait_rsp,      /* NFA_EE_NCI_WAIT_RSP_EVT      */
-    nfa_ee_rout_timeout,      /* NFA_EE_ROUT_TIMEOUT_EVT      */
-    nfa_ee_discv_timeout,     /* NFA_EE_DISCV_TIMEOUT_EVT     */
-    nfa_ee_lmrt_to_nfcc       /* NFA_EE_CFG_TO_NFCC_EVT       */
+    nfa_ee_api_discover,        /* NFA_EE_API_DISCOVER_EVT      */
+    nfa_ee_api_register,        /* NFA_EE_API_REGISTER_EVT      */
+    nfa_ee_api_deregister,      /* NFA_EE_API_DEREGISTER_EVT    */
+    nfa_ee_api_mode_set,        /* NFA_EE_API_MODE_SET_EVT      */
+    nfa_ee_api_set_tech_cfg,    /* NFA_EE_API_SET_TECH_CFG_EVT  */
+    nfa_ee_api_set_proto_cfg,   /* NFA_EE_API_SET_PROTO_CFG_EVT */
+    nfa_ee_api_add_aid,         /* NFA_EE_API_ADD_AID_EVT       */
+    nfa_ee_api_remove_aid,      /* NFA_EE_API_REMOVE_AID_EVT    */
+    nfa_ee_api_add_sys_code,    /* NFA_EE_API_ADD_SYSCODE_EVT   */
+    nfa_ee_api_remove_sys_code, /* NFA_EE_API_REMOVE_SYSCODE_EVT*/
+    nfa_ee_api_lmrt_size,       /* NFA_EE_API_LMRT_SIZE_EVT     */
+    nfa_ee_api_update_now,      /* NFA_EE_API_UPDATE_NOW_EVT    */
+    nfa_ee_api_connect,         /* NFA_EE_API_CONNECT_EVT       */
+    nfa_ee_api_send_data,       /* NFA_EE_API_SEND_DATA_EVT     */
+    nfa_ee_api_disconnect,      /* NFA_EE_API_DISCONNECT_EVT    */
+    nfa_ee_nci_disc_rsp,        /* NFA_EE_NCI_DISC_RSP_EVT      */
+    nfa_ee_nci_disc_ntf,        /* NFA_EE_NCI_DISC_NTF_EVT      */
+    nfa_ee_nci_mode_set_rsp,    /* NFA_EE_NCI_MODE_SET_RSP_EVT  */
+    nfa_ee_nci_conn,            /* NFA_EE_NCI_CONN_EVT          */
+    nfa_ee_nci_conn,            /* NFA_EE_NCI_DATA_EVT          */
+    nfa_ee_nci_action_ntf,      /* NFA_EE_NCI_ACTION_NTF_EVT    */
+    nfa_ee_nci_disc_req_ntf,    /* NFA_EE_NCI_DISC_REQ_NTF_EVT  */
+    nfa_ee_nci_wait_rsp,        /* NFA_EE_NCI_WAIT_RSP_EVT      */
+    nfa_ee_rout_timeout,        /* NFA_EE_ROUT_TIMEOUT_EVT      */
+    nfa_ee_discv_timeout,       /* NFA_EE_DISCV_TIMEOUT_EVT     */
+    nfa_ee_lmrt_to_nfcc,        /* NFA_EE_CFG_TO_NFCC_EVT       */
+    nfa_ee_nci_nfcee_status_ntf /*NFA_EE_NCI_NFCEE_STATUS_NTF_EVT*/
 };
 
 /*******************************************************************************
@@ -87,7 +94,7 @@
 void nfa_ee_init(void) {
   int xx;
 
-  NFA_TRACE_DEBUG0("nfa_ee_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize control block */
   memset(&nfa_ee_cb, 0, sizeof(tNFA_EE_CB));
@@ -113,17 +120,16 @@
 **
 *******************************************************************************/
 void nfa_ee_sys_enable(void) {
-  unsigned long retlen = 0;
-
-  NFA_TRACE_DEBUG1("%s", __func__);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s", __func__);
 
   nfa_ee_cb.route_block_control = 0x00;
 
-  if (GetNumValue(NAME_NFA_AID_BLOCK_ROUTE, (void*)&retlen, sizeof(retlen))) {
+  if (NfcConfig::hasKey(NAME_NFA_AID_BLOCK_ROUTE)) {
+    unsigned retlen = NfcConfig::getUnsigned(NAME_NFA_AID_BLOCK_ROUTE);
     if ((retlen == 0x01) && (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
       nfa_ee_cb.route_block_control = NCI_ROUTE_QUAL_BLOCK_ROUTE;
-      NFA_TRACE_DEBUG1("nfa_ee_cb.route_block_control=0x%x",
-                       nfa_ee_cb.route_block_control);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_ee_cb.route_block_control=0x%x", nfa_ee_cb.route_block_control);
     }
   }
 
@@ -153,8 +159,8 @@
   tNFC_NFCEE_MODE_SET_REVT rsp;
   tNFA_EE_NCI_MODE_SET ee_msg;
 
-  NFA_TRACE_DEBUG4(
-      "nfa_ee_restore_one_ecb () nfcee_id:0x%x, ecb_flags:0x%x ee_status:0x%x "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfcee_id:0x%x, ecb_flags:0x%x ee_status:0x%x "
       "ee_old_status: 0x%x",
       p_cb->nfcee_id, p_cb->ecb_flags, p_cb->ee_status, p_cb->ee_old_status);
   if ((p_cb->nfcee_id != NFA_EE_INVALID) &&
@@ -193,7 +199,9 @@
       rsp.nfcee_id = p_cb->nfcee_id;
       rsp.status = NFA_STATUS_OK;
       ee_msg.p_data = &rsp;
-      nfa_ee_nci_mode_set_rsp((tNFA_EE_MSG*)&ee_msg);
+      tNFA_EE_MSG nfa_ee_msg;
+      nfa_ee_msg.mode_set_rsp = ee_msg;
+      nfa_ee_nci_mode_set_rsp(&nfa_ee_msg);
     }
   }
 }
@@ -212,8 +220,8 @@
   tNFA_EE_ECB* p_cb;
   bool proc_complete = true;
 
-  NFA_TRACE_DEBUG1("nfa_ee_proc_nfcc_power_mode (): nfcc_power_mode=%d",
-                   nfcc_power_mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
   /* if NFCC power state is change to full power */
   if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
     if (nfa_ee_max_ee_cfg) {
@@ -273,7 +281,7 @@
   tNFA_EE_ECB* p_cb;
   tNFA_EE_MSG data;
 
-  NFA_TRACE_DEBUG0("nfa_ee_proc_hci_info_cback ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   /* if NFCC power state is change to full power */
   nfa_ee_cb.ee_flags &= ~NFA_EE_FLAG_WAIT_HCI;
 
@@ -295,7 +303,7 @@
       if (nfa_ee_cb.discv_timer.in_use) {
         nfa_sys_stop_timer(&nfa_ee_cb.discv_timer);
         data.hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
-        nfa_ee_evt_hdlr((NFC_HDR*)&data);
+        nfa_ee_evt_hdlr(&data.hdr);
       }
     }
   }
@@ -314,7 +322,6 @@
 void nfa_ee_proc_evt(tNFC_RESPONSE_EVT event, void* p_data) {
   tNFA_EE_INT_EVT int_event = 0;
   tNFA_EE_NCI_WAIT_RSP cbk;
-  NFC_HDR* p_hdr;
 
   switch (event) {
     case NFC_NFCEE_DISCOVER_REVT: /* 4  NFCEE Discover response */
@@ -341,16 +348,21 @@
       int_event = NFA_EE_NCI_WAIT_RSP_EVT;
       cbk.opcode = NCI_MSG_RF_SET_ROUTING;
       break;
+
+    case NFC_NFCEE_STATUS_REVT:
+      int_event = NFA_EE_NCI_NFCEE_STATUS_NTF_EVT;
+      break;
   }
 
-  NFA_TRACE_DEBUG2("nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event,
-                   int_event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event, int_event);
   if (int_event) {
-    p_hdr = (NFC_HDR*)&cbk;
     cbk.hdr.event = int_event;
     cbk.p_data = p_data;
+    tNFA_EE_MSG nfa_ee_msg;
+    nfa_ee_msg.wait_rsp = cbk;
 
-    nfa_ee_evt_hdlr(p_hdr);
+    nfa_ee_evt_hdlr(&nfa_ee_msg.hdr);
   }
 }
 
@@ -386,7 +398,7 @@
 tNFA_EE_ECB* nfa_ee_find_ecb(uint8_t nfcee_id) {
   uint32_t xx;
   tNFA_EE_ECB *p_ret = NULL, *p_cb;
-  NFA_TRACE_DEBUG0("nfa_ee_find_ecb ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfcee_id == NFC_DH_ID) {
     p_ret = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
@@ -415,7 +427,7 @@
 tNFA_EE_ECB* nfa_ee_find_ecb_by_conn_id(uint8_t conn_id) {
   uint32_t xx;
   tNFA_EE_ECB *p_ret = NULL, *p_cb;
-  NFA_TRACE_DEBUG0("nfa_ee_find_ecb_by_conn_id ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cb = nfa_ee_cb.ecb;
   for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) {
@@ -443,7 +455,7 @@
   tNFA_EE_ECB* p_cb;
   tNFA_EE_MSG msg;
 
-  NFA_TRACE_DEBUG0("nfa_ee_sys_disable ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
   /* report NFA_EE_DEREGISTER_EVT to all registered to EE */
@@ -517,7 +529,6 @@
   nfa_ee_cb.p_enable_cback = p_cback;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_ee_sm_st_2_str
@@ -525,23 +536,18 @@
 ** Description      convert nfa-ee state to string
 **
 *******************************************************************************/
-static char* nfa_ee_sm_st_2_str(uint8_t state) {
+static std::string nfa_ee_sm_st_2_str(uint8_t state) {
   switch (state) {
     case NFA_EE_EM_STATE_INIT:
       return "INIT";
-
     case NFA_EE_EM_STATE_INIT_DONE:
       return "INIT_DONE";
-
     case NFA_EE_EM_STATE_RESTORING:
       return "RESTORING";
-
     case NFA_EE_EM_STATE_DISABLING:
       return "DISABLING";
-
     case NFA_EE_EM_STATE_DISABLED:
       return "DISABLED";
-
     default:
       return "Unknown";
   }
@@ -554,7 +560,7 @@
 ** Description      convert nfa-ee evt to string
 **
 *******************************************************************************/
-static char* nfa_ee_sm_evt_2_str(uint16_t event) {
+static std::string nfa_ee_sm_evt_2_str(uint16_t event) {
   switch (event) {
     case NFA_EE_API_DISCOVER_EVT:
       return "API_DISCOVER";
@@ -572,6 +578,10 @@
       return "API_ADD_AID";
     case NFA_EE_API_REMOVE_AID_EVT:
       return "API_REMOVE_AID";
+    case NFA_EE_API_ADD_SYSCODE_EVT:
+      return "NFA_EE_API_ADD_SYSCODE_EVT";
+    case NFA_EE_API_REMOVE_SYSCODE_EVT:
+      return "NFA_EE_API_REMOVE_SYSCODE_EVT";
     case NFA_EE_API_LMRT_SIZE_EVT:
       return "API_LMRT_SIZE";
     case NFA_EE_API_UPDATE_NOW_EVT:
@@ -608,7 +618,6 @@
       return "Unknown";
   }
 }
-#endif /* BT_TRACE_VERBOSE */
 
 /*******************************************************************************
 **
@@ -621,19 +630,12 @@
 **
 *******************************************************************************/
 bool nfa_ee_evt_hdlr(NFC_HDR* p_msg) {
-  tNFA_EE_MSG* p_evt_data = (tNFA_EE_MSG*)p_msg;
-  uint16_t event = p_msg->event & 0x00ff;
   bool act = false;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG4("nfa_ee_evt_hdlr (): Event %s(0x%02x), State: %s(%d)",
-                   nfa_ee_sm_evt_2_str(p_evt_data->hdr.event),
-                   p_evt_data->hdr.event,
-                   nfa_ee_sm_st_2_str(nfa_ee_cb.em_state), nfa_ee_cb.em_state);
-#else
-  NFA_TRACE_DEBUG2("nfa_ee_evt_hdlr (): Event 0x%02x, State: %d",
-                   p_evt_data->hdr.event, nfa_ee_cb.em_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Event %s(0x%02x), State: %s(%d)",
+      nfa_ee_sm_evt_2_str(p_msg->event).c_str(), p_msg->event,
+      nfa_ee_sm_st_2_str(nfa_ee_cb.em_state).c_str(), nfa_ee_cb.em_state);
 
   switch (nfa_ee_cb.em_state) {
     case NFA_EE_EM_STATE_INIT_DONE:
@@ -649,13 +651,16 @@
       if (p_msg->event == NFA_EE_NCI_CONN_EVT) act = true;
       break;
   }
+
+  tNFA_EE_MSG* p_evt_data = (tNFA_EE_MSG*)p_msg;
   if (act) {
+    uint16_t event = p_msg->event & 0x00ff;
     if (event < NFA_EE_NUM_ACTIONS) {
       (*nfa_ee_actions[event])(p_evt_data);
     }
   } else {
-    /* if the data event is not handled by action function, free the data packet
-     */
+    /* If the event is not handled, free the data packet. */
+    /* FIXME: Is it really always tNFA_EE_NCI_CONN? */
     if (p_msg->event == NFA_EE_NCI_DATA_EVT)
       GKI_freebuf(p_evt_data->conn.p_data);
   }
diff --git a/src/nfa/hci/nfa_hci_act.c b/src/nfa/hci/nfa_hci_act.cc
similarity index 95%
rename from src/nfa/hci/nfa_hci_act.c
rename to src/nfa/hci/nfa_hci_act.cc
index d68cddf..1e50670 100644
--- a/src/nfa/hci/nfa_hci_act.c
+++ b/src/nfa/hci/nfa_hci_act.cc
@@ -22,16 +22,18 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
 #include "nfa_hci_api.h"
 #include "nfa_hci_defs.h"
 #include "nfa_hci_int.h"
-#include "nfa_mem_co.h"
-#include "nfa_nv_co.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
-#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* Static local functions       */
 static void nfa_hci_api_register(tNFA_HCI_EVENT_DATA* p_evt_data);
@@ -57,10 +59,8 @@
                                                  uint16_t data_len,
                                                  tNFA_HCI_DYN_PIPE* p_pipe);
 static void nfa_hci_handle_generic_gate_cmd(uint8_t* p_data, uint8_t data_len,
-                                            tNFA_HCI_DYN_GATE* p_gate,
                                             tNFA_HCI_DYN_PIPE* p_pipe);
 static void nfa_hci_handle_generic_gate_rsp(uint8_t* p_data, uint8_t data_len,
-                                            tNFA_HCI_DYN_GATE* p_gate,
                                             tNFA_HCI_DYN_PIPE* p_pipe);
 static void nfa_hci_handle_generic_gate_evt(uint8_t* p_data, uint16_t data_len,
                                             tNFA_HCI_DYN_GATE* p_gate,
@@ -208,8 +208,7 @@
         break;
 
       default:
-        NFA_TRACE_ERROR1("nfa_hci_check_api_requests ()  Unknown event: 0x%04x",
-                         p_msg->event);
+        LOG(ERROR) << StringPrintf("Unknown event: 0x%04x", p_msg->event);
         break;
     }
 
@@ -239,8 +238,8 @@
     if ((nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) &&
         !strncmp(p_app_name, &nfa_hci_cb.cfg.reg_app_names[xx][0],
                  strlen(p_app_name))) {
-      NFA_TRACE_EVENT2("nfa_hci_api_register (%s)  Reusing: %u", p_app_name,
-                       xx);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_hci_api_register (%s)  Reusing: %u", p_app_name, xx);
       break;
     }
   }
@@ -265,14 +264,15 @@
         strncpy(&nfa_hci_cb.cfg.reg_app_names[xx][0], p_app_name,
                 NFA_MAX_HCI_APP_NAME_LEN);
         nfa_hci_cb.nv_write_needed = true;
-        NFA_TRACE_EVENT2("nfa_hci_api_register (%s)  Allocated: %u", p_app_name,
-                         xx);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "nfa_hci_api_register (%s)  Allocated: %u", p_app_name, xx);
         break;
       }
     }
 
     if (xx == NFA_HCI_MAX_APP_CB) {
-      NFA_TRACE_ERROR1("nfa_hci_api_register (%s)  NO ENTRIES", p_app_name);
+      LOG(ERROR) << StringPrintf("nfa_hci_api_register (%s)  NO ENTRIES",
+                                 p_app_name);
 
       evt_data.hci_register.status = NFA_STATUS_FAILED;
       p_evt_data->app_info.p_cback(NFA_HCI_REGISTER_EVT, &evt_data);
@@ -317,15 +317,16 @@
           !strncmp(p_evt_data->app_info.app_name,
                    &nfa_hci_cb.cfg.reg_app_names[xx][0],
                    strlen(p_evt_data->app_info.app_name))) {
-        NFA_TRACE_EVENT2("nfa_hci_api_deregister (%s) inx: %u",
-                         p_evt_data->app_info.app_name, xx);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("nfa_hci_api_deregister (%s) inx: %u",
+                            p_evt_data->app_info.app_name, xx);
         break;
       }
     }
 
     if (xx == NFA_HCI_MAX_APP_CB) {
-      NFA_TRACE_WARNING1("nfa_hci_api_deregister () Unknown app: %s",
-                         p_evt_data->app_info.app_name);
+      LOG(WARNING) << StringPrintf("Unknown app: %s",
+                                   p_evt_data->app_info.app_name);
       return;
     }
     nfa_hci_cb.app_in_use = (tNFA_HANDLE)(xx | NFA_HANDLE_GROUP_HCI);
@@ -477,9 +478,8 @@
     } else if (p_gate->gate_owner != app_handle) {
       /* Some other app owns the gate */
       p_gate = NULL;
-      NFA_TRACE_ERROR1(
-          "nfa_hci_api_alloc_gate (): The Gate (0X%02x) already taken!",
-          p_evt_data->gate_info.gate);
+      LOG(ERROR) << StringPrintf("The Gate (0X%02x) already taken!",
+                                 p_evt_data->gate_info.gate);
     }
   }
 
@@ -601,7 +601,7 @@
   if ((p_gate == NULL) ||
       (p_gate->gate_owner != p_evt_data->create_pipe.hci_handle)) {
     report_failed = true;
-    NFA_TRACE_ERROR2(
+    LOG(ERROR) << StringPrintf(
         "nfa_hci_api_create_pipe Cannot create pipe! APP: 0x%02x does not own "
         "the gate:0x%x",
         p_evt_data->create_pipe.hci_handle,
@@ -611,7 +611,7 @@
                  p_evt_data->create_pipe.dest_host,
                  p_evt_data->create_pipe.dest_gate)) {
     report_failed = true;
-    NFA_TRACE_ERROR0(
+    LOG(ERROR) << StringPrintf(
         "nfa_hci_api_create_pipe : Cannot create multiple pipe between the "
         "same two gates!");
   }
@@ -708,8 +708,9 @@
       }
 
       if (p_pipe->pipe_state == NFA_HCI_PIPE_CLOSED) {
-        NFA_TRACE_WARNING1("nfa_hci_api_get_reg_value pipe:%d not open",
-                           p_evt_data->get_registry.pipe);
+        LOG(WARNING) << StringPrintf(
+            "nfa_hci_api_get_reg_value pipe:%d not open",
+            p_evt_data->get_registry.pipe);
       } else {
         status = nfa_hciu_send_get_param_cmd(p_evt_data->get_registry.pipe,
                                              p_evt_data->get_registry.reg_inx);
@@ -756,8 +757,9 @@
       }
 
       if (p_pipe->pipe_state == NFA_HCI_PIPE_CLOSED) {
-        NFA_TRACE_WARNING1("nfa_hci_api_set_reg_value pipe:%d not open",
-                           p_evt_data->set_registry.pipe);
+        LOG(WARNING) << StringPrintf(
+            "nfa_hci_api_set_reg_value pipe:%d not open",
+            p_evt_data->set_registry.pipe);
       } else {
         status = nfa_hciu_send_set_param_cmd(
             p_evt_data->set_registry.pipe, p_evt_data->set_registry.reg_inx,
@@ -878,18 +880,18 @@
                                    p_evt_data->send_cmd.data);
         if (status == NFA_STATUS_OK) return true;
       } else {
-        NFA_TRACE_WARNING1("nfa_hci_api_send_cmd pipe:%d not open",
-                           p_pipe->pipe_id);
+        LOG(WARNING) << StringPrintf("nfa_hci_api_send_cmd pipe:%d not open",
+                                     p_pipe->pipe_id);
       }
     } else {
-      NFA_TRACE_WARNING1(
+      LOG(WARNING) << StringPrintf(
           "nfa_hci_api_send_cmd pipe:%d Owned by different application or "
           "Destination host is not active",
           p_pipe->pipe_id);
     }
   } else {
-    NFA_TRACE_WARNING1("nfa_hci_api_send_cmd pipe:%d not found",
-                       p_evt_data->send_cmd.pipe);
+    LOG(WARNING) << StringPrintf("nfa_hci_api_send_cmd pipe:%d not found",
+                                 p_evt_data->send_cmd.pipe);
   }
 
   evt_data.cmd_sent.status = status;
@@ -928,18 +930,18 @@
                                    p_evt_data->send_rsp.data);
         if (status == NFA_STATUS_OK) return;
       } else {
-        NFA_TRACE_WARNING1("nfa_hci_api_send_rsp pipe:%d not open",
-                           p_pipe->pipe_id);
+        LOG(WARNING) << StringPrintf("nfa_hci_api_send_rsp pipe:%d not open",
+                                     p_pipe->pipe_id);
       }
     } else {
-      NFA_TRACE_WARNING1(
+      LOG(WARNING) << StringPrintf(
           "nfa_hci_api_send_rsp pipe:%d Owned by different application or "
           "Destination host is not active",
           p_pipe->pipe_id);
     }
   } else {
-    NFA_TRACE_WARNING1("nfa_hci_api_send_rsp pipe:%d not found",
-                       p_evt_data->send_rsp.pipe);
+    LOG(WARNING) << StringPrintf("nfa_hci_api_send_rsp pipe:%d not found",
+                                 p_evt_data->send_rsp.pipe);
   }
 
   evt_data.rsp_sent.status = status;
@@ -1011,18 +1013,18 @@
           }
         }
       } else {
-        NFA_TRACE_WARNING1("nfa_hci_api_send_event pipe:%d not open",
-                           p_pipe->pipe_id);
+        LOG(WARNING) << StringPrintf("nfa_hci_api_send_event pipe:%d not open",
+                                     p_pipe->pipe_id);
       }
     } else {
-      NFA_TRACE_WARNING1(
+      LOG(WARNING) << StringPrintf(
           "nfa_hci_api_send_event pipe:%d Owned by different application or "
           "Destination host is not active",
           p_pipe->pipe_id);
     }
   } else {
-    NFA_TRACE_WARNING1("nfa_hci_api_send_event pipe:%d not found",
-                       p_evt_data->send_evt.pipe);
+    LOG(WARNING) << StringPrintf("nfa_hci_api_send_event pipe:%d not found",
+                                 p_evt_data->send_evt.pipe);
   }
 
   evt_data.evt_sent.status = status;
@@ -1318,19 +1320,11 @@
   uint8_t host_id = 0;
   uint32_t os_tick;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hci_handle_admin_gate_rsp - LastCmdSent: %s  App: 0x%04x  Gate: "
       "0x%02x  Pipe: 0x%02x",
-      nfa_hciu_instr_2_str(nfa_hci_cb.cmd_sent), nfa_hci_cb.app_in_use,
+      nfa_hciu_instr_2_str(nfa_hci_cb.cmd_sent).c_str(), nfa_hci_cb.app_in_use,
       nfa_hci_cb.local_gate_in_use, nfa_hci_cb.pipe_in_use);
-#else
-  NFA_TRACE_DEBUG4(
-      "nfa_hci_handle_admin_gate_rsp LastCmdSent: %u  App: 0x%04x  Gate: "
-      "0x%02x  Pipe: 0x%02x",
-      nfa_hci_cb.cmd_sent, nfa_hci_cb.app_in_use, nfa_hci_cb.local_gate_in_use,
-      nfa_hci_cb.pipe_in_use);
-#endif
 
   /* If starting up, handle events here */
   if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) ||
@@ -1343,7 +1337,8 @@
     }
 
     if (nfa_hci_cb.inst != NFA_HCI_ANY_OK) {
-      NFA_TRACE_ERROR0("nfa_hci_handle_admin_gate_rsp - Initialization failed");
+      LOG(ERROR) << StringPrintf(
+          "nfa_hci_handle_admin_gate_rsp - Initialization failed");
       nfa_hci_startup_complete(NFA_STATUS_FAILED);
       return;
     }
@@ -1359,6 +1354,11 @@
           if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_STARTUP) ||
               (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE))
             nfa_hci_dh_startup_complete();
+          if (NFA_GetNCIVersion() == NCI_VERSION_2_0) {
+            nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
+            NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
+            nfa_hci_enable_one_nfcee();
+          }
         }
         break;
 
@@ -1514,7 +1514,7 @@
 
           /* Sanity check */
           if (source_gate != nfa_hci_cb.local_gate_in_use) {
-            NFA_TRACE_WARNING2(
+            LOG(WARNING) << StringPrintf(
                 "nfa_hci_handle_admin_gate_rsp sent create pipe with gate: %u "
                 "got back: %u",
                 nfa_hci_cb.local_gate_in_use, source_gate);
@@ -1600,17 +1600,17 @@
 ** Returns          none
 **
 *******************************************************************************/
-void nfa_hci_handle_admin_gate_evt(uint8_t* p_data) {
+void nfa_hci_handle_admin_gate_evt() {
   tNFA_HCI_EVT_DATA evt_data;
   tNFA_HCI_API_GET_HOST_LIST* p_msg;
 
   if (nfa_hci_cb.inst != NFA_HCI_EVT_HOT_PLUG) {
-    NFA_TRACE_ERROR0(
+    LOG(ERROR) << StringPrintf(
         "nfa_hci_handle_admin_gate_evt - Unknown event on ADMIN Pipe");
     return;
   }
 
-  NFA_TRACE_DEBUG0(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hci_handle_admin_gate_evt - HOT PLUG EVT event on ADMIN Pipe");
   nfa_hci_cb.num_hot_plug_evts++;
 
@@ -1675,7 +1675,8 @@
 
   if (p_pipe == NULL) {
     /* Invalid pipe ID */
-    NFA_TRACE_ERROR1("nfa_hci_handle_dyn_pipe_pkt - Unknown pipe %d", pipe_id);
+    LOG(ERROR) << StringPrintf("nfa_hci_handle_dyn_pipe_pkt - Unknown pipe %d",
+                               pipe_id);
     if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
       nfa_hciu_send_msg(pipe_id, NFA_HCI_RESPONSE_TYPE, NFA_HCI_ANY_E_NOK, 0,
                         NULL);
@@ -1691,7 +1692,7 @@
   } else {
     p_gate = nfa_hciu_find_gate_by_gid(p_pipe->local_gate);
     if (p_gate == NULL) {
-      NFA_TRACE_ERROR1(
+      LOG(ERROR) << StringPrintf(
           "nfa_hci_handle_dyn_pipe_pkt - Pipe's gate %d is corrupt",
           p_pipe->local_gate);
       if (nfa_hci_cb.type == NFA_HCI_COMMAND_TYPE)
@@ -1703,13 +1704,11 @@
     /* Check if data packet is a command, response or event */
     switch (nfa_hci_cb.type) {
       case NFA_HCI_COMMAND_TYPE:
-        nfa_hci_handle_generic_gate_cmd(p_data, (uint8_t)data_len, p_gate,
-                                        p_pipe);
+        nfa_hci_handle_generic_gate_cmd(p_data, (uint8_t)data_len, p_pipe);
         break;
 
       case NFA_HCI_RESPONSE_TYPE:
-        nfa_hci_handle_generic_gate_rsp(p_data, (uint8_t)data_len, p_gate,
-                                        p_pipe);
+        nfa_hci_handle_generic_gate_rsp(p_data, (uint8_t)data_len, p_pipe);
         break;
 
       case NFA_HCI_EVENT_TYPE:
@@ -1826,7 +1825,6 @@
 **
 *******************************************************************************/
 static void nfa_hci_handle_generic_gate_cmd(uint8_t* p_data, uint8_t data_len,
-                                            tNFA_HCI_DYN_GATE* p_gate,
                                             tNFA_HCI_DYN_PIPE* p_pipe) {
   tNFA_HCI_EVT_DATA evt_data;
   tNFA_HANDLE app_handle = nfa_hciu_get_pipe_owner(p_pipe->pipe_id);
@@ -1896,7 +1894,6 @@
 **
 *******************************************************************************/
 static void nfa_hci_handle_generic_gate_rsp(uint8_t* p_data, uint8_t data_len,
-                                            tNFA_HCI_DYN_GATE* p_gate,
                                             tNFA_HCI_DYN_PIPE* p_pipe) {
   tNFA_HCI_EVT_DATA evt_data;
   tNFA_STATUS status = NFA_STATUS_OK;
diff --git a/src/nfa/hci/nfa_hci_api.c b/src/nfa/hci/nfa_hci_api.cc
similarity index 75%
rename from src/nfa/hci/nfa_hci_api.c
rename to src/nfa/hci/nfa_hci_api.cc
index c40ed3e..ce66f89 100644
--- a/src/nfa/hci/nfa_hci_api.c
+++ b/src/nfa/hci/nfa_hci_api.cc
@@ -21,13 +21,16 @@
  *  NFA interface to HCI
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_hci_api.h"
-#include <string.h>
 #include "nfa_hci_defs.h"
 #include "nfa_hci_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -52,18 +55,20 @@
   uint8_t app_name_len;
 
   if (p_app_name == NULL) {
-    NFA_TRACE_API0("NFA_HciRegister (): Invalid Application name");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Application name");
     return (NFA_STATUS_FAILED);
   }
 
   if (p_cback == NULL) {
-    NFA_TRACE_API0(
-        "NFA_HciRegister (): Application should provide callback function to "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Application should provide callback function to "
         "register!");
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API1("NFA_HciRegister (): Application Name: %s", p_app_name);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Application Name: %s", p_app_name);
 
   app_name_len = (uint8_t)strlen(p_app_name);
 
@@ -107,12 +112,13 @@
   tNFA_HCI_API_GET_APP_GATE_PIPE* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciGetGateAndPipeList (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API1("NFA_HciGetGateAndPipeList (): hci_handle:0x%04x", hci_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x", hci_handle);
 
   /* Register the application with HCI */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -150,11 +156,12 @@
   uint8_t app_name_len;
 
   if (p_app_name == NULL) {
-    NFA_TRACE_API0("NFA_HciDeregister (): Invalid Application");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Invalid Application");
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API1("NFA_HciDeregister (): Application Name: %s", p_app_name);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Application Name: %s", p_app_name);
   app_name_len = (uint8_t)strlen(p_app_name);
 
   if (app_name_len > NFA_MAX_HCI_APP_NAME_LEN) return (NFA_STATUS_FAILED);
@@ -168,8 +175,7 @@
   }
 
   if (xx == NFA_HCI_MAX_APP_CB) {
-    NFA_TRACE_ERROR1("NFA_HciDeregister (): Application Name: %s  NOT FOUND",
-                     p_app_name);
+    LOG(ERROR) << StringPrintf("Application Name: %s  NOT FOUND", p_app_name);
     return (NFA_STATUS_FAILED);
   }
 
@@ -210,20 +216,21 @@
   tNFA_HCI_API_ALLOC_GATE* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciAllocGate (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((gate) && ((gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) ||
                  (gate > NFA_HCI_LAST_PROP_GATE) ||
                  (gate == NFA_HCI_CONNECTIVITY_GATE))) {
-    NFA_TRACE_API1("NFA_HciAllocGate (): Cannot allocate gate:0x%02x", gate);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Cannot allocate gate:0x%02x", gate);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciAllocGate (): hci_handle:0x%04x, Gate:0x%02x",
-                 hci_handle, gate);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, Gate:0x%02x", hci_handle, gate);
 
   /* Request HCI to allocate gate to the application */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -256,20 +263,20 @@
   tNFA_HCI_API_DEALLOC_GATE* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciDeallocGate (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((gate < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) ||
       (gate > NFA_HCI_LAST_PROP_GATE) || (gate == NFA_HCI_CONNECTIVITY_GATE)) {
-    NFA_TRACE_API1("NFA_HciDeallocGate (): Cannot deallocate the gate:0x%02x",
-                   gate);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Cannot deallocate the gate:0x%02x", gate);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciDeallocGate (): hci_handle:0x%04x, gate:0x%02X",
-                 hci_handle, gate);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, gate:0x%02X", hci_handle, gate);
 
   /* Request HCI to deallocate the gate that was previously allocated to the
    * application */
@@ -303,12 +310,13 @@
   tNFA_HCI_API_GET_HOST_LIST* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciGetHostList (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API1("NFA_HciGetHostList (): hci_handle:0x%04x", hci_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x", hci_handle);
 
   /* Request HCI to get list of host in the hci network */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -349,21 +357,21 @@
   tNFA_HCI_API_CREATE_PIPE_EVT* p_msg;
   uint8_t xx;
 
-  NFA_TRACE_API4(
-      "NFA_HciCreatePipe (): hci_handle:0x%04x, source gate:0x%02X, "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "hci_handle:0x%04x, source gate:0x%02X, "
       "destination host:0x%02X , destination gate:0x%02X",
       hci_handle, source_gate_id, dest_host, dest_gate);
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciCreatePipe (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((source_gate_id < NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE) ||
       (source_gate_id > NFA_HCI_LAST_PROP_GATE)) {
-    NFA_TRACE_API1("NFA_HciCreatePipe (): Invalid local Gate:0x%02x",
-                   source_gate_id);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid local Gate:0x%02x", source_gate_id);
     return (NFA_STATUS_FAILED);
   }
 
@@ -371,8 +379,8 @@
        (dest_gate != NFA_HCI_LOOP_BACK_GATE) &&
        (dest_gate != NFA_HCI_IDENTITY_MANAGEMENT_GATE)) ||
       (dest_gate > NFA_HCI_LAST_PROP_GATE)) {
-    NFA_TRACE_API1("NFA_HciCreatePipe (): Invalid Destination Gate:0x%02x",
-                   dest_gate);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Destination Gate:0x%02x", dest_gate);
     return (NFA_STATUS_FAILED);
   }
 
@@ -380,7 +388,8 @@
     if (nfa_hci_cb.inactive_host[xx] == dest_host) break;
 
   if (xx != NFA_HCI_MAX_HOST_IN_NETWORK) {
-    NFA_TRACE_API1("NFA_HciCreatePipe (): Host not active:0x%02x", dest_host);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Host not active:0x%02x", dest_host);
     return (NFA_STATUS_FAILED);
   }
 
@@ -418,18 +427,20 @@
   tNFA_HCI_API_OPEN_PIPE_EVT* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciOpenPipe (): Invalid hci_handle:0x%04x", hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) ||
       (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) {
-    NFA_TRACE_API1("NFA_HciOpenPipe (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciOpenPipe (): hci_handle:0x%04x, pipe:0x%02X",
-                 hci_handle, pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe);
 
   /* Request HCI to open a pipe if it is in closed state */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -467,18 +478,19 @@
   tNFA_HCI_API_GET_REGISTRY* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciGetRegistry (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciGetRegistry (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciGetRegistry (): hci_handle:0x%04x  Pipe: 0x%02x",
-                 hci_handle, pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x  Pipe: 0x%02x", hci_handle, pipe);
 
   /* Request HCI to get list of gates supported by the specified host */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -498,66 +510,6 @@
 
 /*******************************************************************************
 **
-** Function         NFA_HciSetRegistry
-**
-** Description      This function requests a peer host to set the desired
-**                  registry field value for the gate that the pipe is on.
-**
-**                  When the peer host responds,the app is notified with
-**                  NFA_HCI_SET_REG_RSP_EVT or
-**                  if an error occurs in sending the command the app will be
-**                  notified by NFA_HCI_CMD_SENT_EVT
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_HciSetRegistry(tNFA_HANDLE hci_handle, uint8_t pipe,
-                                      uint8_t reg_inx, uint8_t data_size,
-                                      uint8_t* p_data) {
-  tNFA_HCI_API_SET_REGISTRY* p_msg;
-
-  if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciSetRegistry (): Invalid hci_handle:0x%04x",
-                   hci_handle);
-    return (NFA_STATUS_FAILED);
-  }
-
-  if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciSetRegistry (): Invalid Pipe:0x%02x", pipe);
-    return (NFA_STATUS_FAILED);
-  }
-
-  if ((data_size == 0) || (p_data == NULL) ||
-      (data_size > NFA_MAX_HCI_CMD_LEN)) {
-    NFA_TRACE_API1("NFA_HciSetRegistry (): Invalid data size:0x%02x",
-                   data_size);
-    return (NFA_STATUS_FAILED);
-  }
-
-  NFA_TRACE_API2("NFA_HciSetRegistry (): hci_handle:0x%04x  Pipe: 0x%02x",
-                 hci_handle, pipe);
-
-  /* Request HCI to get list of gates supported by the specified host */
-  if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
-      ((p_msg = (tNFA_HCI_API_SET_REGISTRY*)GKI_getbuf(
-            sizeof(tNFA_HCI_API_SET_REGISTRY))) != NULL)) {
-    p_msg->hdr.event = NFA_HCI_API_SET_REGISTRY_EVT;
-    p_msg->hci_handle = hci_handle;
-    p_msg->pipe = pipe;
-    p_msg->reg_inx = reg_inx;
-    p_msg->size = data_size;
-
-    memcpy(p_msg->data, p_data, data_size);
-    nfa_sys_sendmsg(p_msg);
-    return (NFA_STATUS_OK);
-  }
-
-  return (NFA_STATUS_FAILED);
-}
-
-/*******************************************************************************
-**
 ** Function         NFA_HciSendCommand
 **
 ** Description      This function is called to send a command on a pipe created
@@ -577,24 +529,26 @@
   tNFA_HCI_API_SEND_CMD_EVT* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciSendCommand (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciSendCommand (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
   if ((cmd_size && (p_data == NULL)) || (cmd_size > NFA_MAX_HCI_CMD_LEN)) {
-    NFA_TRACE_API1("NFA_HciSendCommand (): Invalid cmd size:0x%02x", cmd_size);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid cmd size:0x%02x", cmd_size);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API3(
-      "NFA_HciSendCommand (): hci_handle:0x%04x, pipe:0x%02x  Code: 0x%02x",
-      hci_handle, pipe, cmd_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02x  Code: 0x%02x",
+                      hci_handle, pipe, cmd_code);
 
   /* Request HCI to post event data on a particular pipe */
   if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
@@ -617,64 +571,6 @@
 
 /*******************************************************************************
 **
-** Function         NFA_HciSendResponse
-**
-** Description      This function is called to send a response on a pipe created
-**                  by the application.
-**                  The app will be notified by NFA_HCI_RSP_SENT_EVT if an error
-**                  occurs.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_HciSendResponse(tNFA_HANDLE hci_handle, uint8_t pipe,
-                                       uint8_t response, uint8_t data_size,
-                                       uint8_t* p_data) {
-  tNFA_HCI_API_SEND_RSP_EVT* p_msg;
-
-  if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciSendResponse (): Invalid hci_handle:0x%04x",
-                   hci_handle);
-    return (NFA_STATUS_FAILED);
-  }
-
-  if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciSendResponse (): Invalid Pipe:0x%02x", pipe);
-    return (NFA_STATUS_FAILED);
-  }
-
-  if ((data_size && (p_data == NULL)) || (data_size > NFA_MAX_HCI_RSP_LEN)) {
-    NFA_TRACE_API1("NFA_HciSendResponse (): Invalid data size:0x%02x",
-                   data_size);
-    return (NFA_STATUS_FAILED);
-  }
-
-  NFA_TRACE_API3(
-      "NFA_HciSendResponse (): hci_handle:0x%04x  Pipe: 0x%02x  Response: "
-      "0x%02x",
-      hci_handle, pipe, response);
-
-  /* Request HCI to get list of gates supported by the specified host */
-  if ((nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&
-      ((p_msg = (tNFA_HCI_API_SEND_RSP_EVT*)GKI_getbuf(
-            sizeof(tNFA_HCI_API_SEND_RSP_EVT))) != NULL)) {
-    p_msg->hdr.event = NFA_HCI_API_SEND_RSP_EVT;
-    p_msg->hci_handle = hci_handle;
-    p_msg->response = response;
-    p_msg->size = data_size;
-
-    if (data_size) memcpy(p_msg->data, p_data, data_size);
-
-    nfa_sys_sendmsg(p_msg);
-    return (NFA_STATUS_OK);
-  }
-
-  return (NFA_STATUS_FAILED);
-}
-
-/*******************************************************************************
-**
 ** Function         NFA_HciSendEvent
 **
 ** Description      This function is called to send any event on a pipe created
@@ -710,29 +606,31 @@
                              uint8_t* p_rsp_buf, uint16_t rsp_timeout) {
   tNFA_HCI_API_SEND_EVENT_EVT* p_msg;
 
-  NFA_TRACE_API3(
-      "NFA_HciSendEvent(): hci_handle:0x%04x, pipe:0x%02x  Code: 0x%02x",
-      hci_handle, pipe, evt_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02x  Code: 0x%02x",
+                      hci_handle, pipe, evt_code);
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciSendEvent (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if (pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciSendEvent (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
   if (evt_size && (p_data == NULL)) {
-    NFA_TRACE_API1("NFA_HciSendEvent (): Invalid Event size:0x%02x", evt_size);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Event size:0x%02x", evt_size);
     return (NFA_STATUS_FAILED);
   }
 
   if (rsp_size && (p_rsp_buf == NULL)) {
-    NFA_TRACE_API1(
-        "NFA_HciSendEvent (): No Event buffer, but invalid event buffer size "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "No Event buffer, but invalid event buffer size "
         ":%u",
         rsp_size);
     return (NFA_STATUS_FAILED);
@@ -775,18 +673,19 @@
 tNFA_STATUS NFA_HciClosePipe(tNFA_HANDLE hci_handle, uint8_t pipe) {
   tNFA_HCI_API_CLOSE_PIPE_EVT* p_msg;
 
-  NFA_TRACE_API2("NFA_HciClosePipe (): hci_handle:0x%04x, pipe:0x%02X",
-                 hci_handle, pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe);
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciClosePipe (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) ||
       (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) {
-    NFA_TRACE_API1("NFA_HciClosePipe (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
@@ -825,19 +724,20 @@
   tNFA_HCI_API_DELETE_PIPE_EVT* p_msg;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciDeletePipe (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
   if ((pipe < NFA_HCI_FIRST_DYNAMIC_PIPE) ||
       (pipe > NFA_HCI_LAST_DYNAMIC_PIPE)) {
-    NFA_TRACE_API1("NFA_HciDeletePipe (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciDeletePipe (): hci_handle:0x%04x, pipe:0x%02X",
-                 hci_handle, pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe);
 
   /* Request HCI to delete a pipe created by the application identified by hci
    * handle */
@@ -874,8 +774,8 @@
   uint8_t xx;
 
   if ((NFA_HANDLE_GROUP_MASK & hci_handle) != NFA_HANDLE_GROUP_HCI) {
-    NFA_TRACE_API1("NFA_HciAddStaticPipe (): Invalid hci_handle:0x%04x",
-                   hci_handle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid hci_handle:0x%04x", hci_handle);
     return (NFA_STATUS_FAILED);
   }
 
@@ -883,22 +783,25 @@
     if (nfa_hci_cb.inactive_host[xx] == host) break;
 
   if (xx != NFA_HCI_MAX_HOST_IN_NETWORK) {
-    NFA_TRACE_API1("NFA_HciAddStaticPipe (): Host not active:0x%02x", host);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Host not active:0x%02x", host);
     return (NFA_STATUS_FAILED);
   }
 
   if (gate <= NFA_HCI_LAST_HOST_SPECIFIC_GATE) {
-    NFA_TRACE_API1("NFA_HciAddStaticPipe (): Invalid Gate:0x%02x", gate);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Gate:0x%02x", gate);
     return (NFA_STATUS_FAILED);
   }
 
   if (pipe <= NFA_HCI_LAST_DYNAMIC_PIPE) {
-    NFA_TRACE_API1("NFA_HciAddStaticPipe (): Invalid Pipe:0x%02x", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Invalid Pipe:0x%02x", pipe);
     return (NFA_STATUS_FAILED);
   }
 
-  NFA_TRACE_API2("NFA_HciAddStaticPipe (): hci_handle:0x%04x, pipe:0x%02X",
-                 hci_handle, pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hci_handle:0x%04x, pipe:0x%02X", hci_handle, pipe);
 
   /* Request HCI to delete a pipe created by the application identified by hci
    * handle */
@@ -934,29 +837,34 @@
 
   switch (action) {
     case NFA_HCI_DEBUG_DISPLAY_CB:
-      NFA_TRACE_API0("NFA_HciDebug  Host List:");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_HciDebug  Host List:");
       for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) {
         if (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) {
-          NFA_TRACE_API2("              Host Inx:  %u   Name: %s", xx,
-                         &nfa_hci_cb.cfg.reg_app_names[xx][0]);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("              Host Inx:  %u   Name: %s", xx,
+                              &nfa_hci_cb.cfg.reg_app_names[xx][0]);
         }
       }
 
-      NFA_TRACE_API0("NFA_HciDebug  Gate List:");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_HciDebug  Gate List:");
       for (xx = 0; xx < NFA_HCI_MAX_GATE_CB; xx++, pg++) {
         if (pg->gate_id != 0) {
-          NFA_TRACE_API4(
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
               "              Gate Inx: %x  ID: 0x%02x  Owner: 0x%04x  "
               "PipeInxMask: 0x%08x",
               xx, pg->gate_id, pg->gate_owner, pg->pipe_inx_mask);
         }
       }
 
-      NFA_TRACE_API0("NFA_HciDebug  Pipe List:");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_HciDebug  Pipe List:");
       for (xx = 0; xx < NFA_HCI_MAX_PIPE_CB; xx++, pp++) {
         if (pp->pipe_id != 0) {
-          NFA_TRACE_API6(
-              "              Pipe Inx: %x  ID: 0x%02x  State: %u  LocalGate: "
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "              Pipe Inx: %x  ID: 0x%02x  State: %u  "
+              "LocalGate: "
               "0x%02x  Dest Gate: 0x%02x  Host: 0x%02x",
               xx, pp->pipe_id, pp->pipe_state, pp->local_gate, pp->dest_gate,
               pp->dest_host);
@@ -980,13 +888,15 @@
       break;
 
     case NFA_HCI_DEBUG_ENABLE_LOOPBACK:
-      NFA_TRACE_API0("NFA_HciDebug  HCI_LOOPBACK_DEBUG = TRUE");
-      HCI_LOOPBACK_DEBUG = true;
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_HciDebug  HCI_LOOPBACK_DEBUG = TRUE");
+      HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_ON;
       break;
 
     case NFA_HCI_DEBUG_DISABLE_LOOPBACK:
-      NFA_TRACE_API0("NFA_HciDebug  HCI_LOOPBACK_DEBUG = FALSE");
-      HCI_LOOPBACK_DEBUG = false;
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFA_HciDebug  HCI_LOOPBACK_DEBUG = FALSE");
+      HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_OFF;
       break;
   }
 }
diff --git a/src/nfa/hci/nfa_hci_ci.c b/src/nfa/hci/nfa_hci_ci.cc
similarity index 95%
rename from src/nfa/hci/nfa_hci_ci.c
rename to src/nfa/hci/nfa_hci_ci.cc
index a68b6f0..2f29745 100644
--- a/src/nfa/hci/nfa_hci_ci.c
+++ b/src/nfa/hci/nfa_hci_ci.cc
@@ -25,7 +25,6 @@
 #include "nfa_hci_api.h"
 #include "nfa_hci_int.h"
 #include "nfa_nv_co.h"
-#include "nfa_sys.h"
 
 /*******************************************************************************
 **
@@ -70,7 +69,8 @@
   p_msg = (tNFA_HCI_EVENT_DATA*)GKI_getbuf(sizeof(tNFA_HCI_EVENT_DATA));
   if (p_msg != NULL) {
     p_msg->nv_write.hdr.event = NFA_HCI_RSP_NV_WRITE_EVT;
-    p_msg->nv_write.status = 0;
+    p_msg->nv_write.status =
+        (status == NFA_NV_CO_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
     nfa_sys_sendmsg(p_msg);
   }
 }
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.cc
similarity index 82%
rename from src/nfa/hci/nfa_hci_main.c
rename to src/nfa/hci/nfa_hci_main.cc
index 28067e8..91aa89d 100644
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.cc
@@ -22,19 +22,23 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
 #include "nfa_ee_api.h"
 #include "nfa_ee_int.h"
 #include "nfa_hci_api.h"
 #include "nfa_hci_defs.h"
 #include "nfa_hci_int.h"
-#include "nfa_mem_co.h"
 #include "nfa_nv_co.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
 #include "trace_api.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*****************************************************************************
 **  Global Variables
 *****************************************************************************/
@@ -58,7 +62,7 @@
 
 static void nfa_hci_sys_enable(void);
 static void nfa_hci_sys_disable(void);
-static void nfa_hci_rsp_timeout(tNFA_HCI_EVENT_DATA* p_evt_data);
+static void nfa_hci_rsp_timeout(void);
 static void nfa_hci_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                                tNFC_CONN* p_data);
 static void nfa_hci_set_receive_buf(uint8_t pipe);
@@ -82,10 +86,7 @@
 **
 *******************************************************************************/
 void nfa_hci_ee_info_cback(tNFA_EE_DISC_STS status) {
-  uint8_t num_nfcee = 3;
-  tNFA_EE_INFO ee_info[3];
-
-  NFA_TRACE_DEBUG1("nfa_hci_ee_info_cback (): %d", status);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%d", status);
 
   switch (status) {
     case NFA_EE_DISC_STS_ON:
@@ -104,9 +105,6 @@
     case NFA_EE_DISC_STS_OFF:
       if (nfa_hci_cb.ee_disable_disc) break;
       nfa_hci_cb.ee_disable_disc = true;
-      /* Discovery operation is complete, retrieve discovery result */
-      NFA_EeGetInfo(&num_nfcee, ee_info);
-      nfa_hci_cb.num_nfcee = num_nfcee;
 
       if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
           (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
@@ -144,7 +142,8 @@
             (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
           /* Received DISC REQ Ntf while waiting for other Host in the network
            * to bootup after DH host bootup is complete */
-          if (nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1)) {
+          if ((nfa_hci_cb.num_ee_dis_req_ntf == (nfa_hci_cb.num_nfcee - 1)) &&
+              NFC_GetNCIVersion() != NCI_VERSION_2_0) {
             /* Received expected number of EE DISC REQ Ntf(s) */
             nfa_sys_stop_timer(&nfa_hci_cb.timer);
             nfa_hci_cb.w4_hci_netwk_init = false;
@@ -161,6 +160,22 @@
         }
       }
       break;
+    case NFA_EE_RECOVERY_REDISCOVERED:
+    case NFA_EE_MODE_SET_COMPLETE:
+      /*received mode set Ntf */
+      if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
+          (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE) ||
+          (nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY)) {
+        /* Discovery operation is complete, retrieve discovery result */
+        NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
+        nfa_hci_enable_one_nfcee();
+      }
+      break;
+    case NFA_EE_RECOVERY_INIT:
+      /*NFCEE recovery in progress*/
+      nfa_ee_cb.isDiscoveryStopped = nfa_dm_act_stop_rf_discovery(NULL);
+      nfa_hci_cb.hci_state = NFA_HCI_STATE_EE_RECOVERY;
+      break;
   }
 }
 
@@ -174,13 +189,13 @@
 **
 *******************************************************************************/
 void nfa_hci_init(void) {
-  NFA_TRACE_DEBUG0("nfa_hci_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize control block */
   memset(&nfa_hci_cb, 0, sizeof(tNFA_HCI_CB));
 
   nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
-
+  nfa_hci_cb.num_nfcee = NFA_HCI_MAX_HOST_IN_NETWORK;
   /* register message handler on NFA SYS */
   nfa_sys_register(NFA_ID_HCI, &nfa_hci_sys_reg);
 }
@@ -223,8 +238,9 @@
                       &nfa_hci_cb.cfg.reg_app_names[yy][0],
                       strlen(nfa_hci_cb.cfg.reg_app_names[xx])))) {
           /* Two app cannot have the same name , NVRAM is corrupted */
-          NFA_TRACE_EVENT2("nfa_hci_is_valid_cfg (%s)  Reusing: %u",
-                           &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("nfa_hci_is_valid_cfg (%s)  Reusing: %u",
+                              &nfa_hci_cb.cfg.reg_app_names[xx][0], xx);
           return false;
         }
       }
@@ -250,25 +266,33 @@
         if ((nfa_hci_cb.cfg.dyn_gates[yy].gate_id != 0) &&
             (nfa_hci_cb.cfg.dyn_gates[xx].gate_id ==
              nfa_hci_cb.cfg.dyn_gates[yy].gate_id)) {
-          NFA_TRACE_EVENT1("nfa_hci_is_valid_cfg  Reusing: %u",
-                           nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("nfa_hci_is_valid_cfg  Reusing: %u",
+                              nfa_hci_cb.cfg.dyn_gates[xx].gate_id);
           return false;
         }
       }
       if ((nfa_hci_cb.cfg.dyn_gates[xx].gate_owner & (~NFA_HANDLE_GROUP_HCI)) >=
           NFA_HCI_MAX_APP_CB) {
-        NFA_TRACE_EVENT1("nfa_hci_is_valid_cfg  Invalid Gate owner: %u",
-                         nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("nfa_hci_is_valid_cfg  Invalid Gate owner: %u",
+                            nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
         return false;
       }
-      if (nfa_hci_cb.cfg.dyn_gates[xx].gate_id != NFA_HCI_CONNECTIVITY_GATE) {
+      if (!((nfa_hci_cb.cfg.dyn_gates[xx].gate_id ==
+             NFA_HCI_CONNECTIVITY_GATE) ||
+            ((nfa_hci_cb.cfg.dyn_gates[xx].gate_id >=
+              NFA_HCI_PROP_GATE_FIRST) ||
+             (nfa_hci_cb.cfg.dyn_gates[xx].gate_id <=
+              NFA_HCI_PROP_GATE_LAST)))) {
         /* The gate owner should be one of the registered application */
         for (zz = 0; zz < app_count; zz++) {
           if (nfa_hci_cb.cfg.dyn_gates[xx].gate_owner == reg_app[zz]) break;
         }
         if (zz == app_count) {
-          NFA_TRACE_EVENT1("nfa_hci_is_valid_cfg  Invalid Gate owner: %u",
-                           nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("nfa_hci_is_valid_cfg  Invalid Gate owner: %u",
+                              nfa_hci_cb.cfg.dyn_gates[xx].gate_owner);
           return false;
         }
       }
@@ -333,8 +357,9 @@
         if ((nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id != 0) &&
             (nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id ==
              nfa_hci_cb.cfg.dyn_pipes[yy].pipe_id)) {
-          NFA_TRACE_EVENT1("nfa_hci_is_valid_cfg  Reusing: %u",
-                           nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("nfa_hci_is_valid_cfg  Reusing: %u",
+                              nfa_hci_cb.cfg.dyn_pipes[xx].pipe_id);
           return false;
         }
       }
@@ -343,8 +368,9 @@
         if (nfa_hci_cb.cfg.dyn_pipes[xx].local_gate == valid_gate[zz]) break;
       }
       if (zz == gate_count) {
-        NFA_TRACE_EVENT1("nfa_hci_is_valid_cfg  Invalid Gate: %u",
-                         nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("nfa_hci_is_valid_cfg  Invalid Gate: %u",
+                            nfa_hci_cb.cfg.dyn_pipes[xx].local_gate);
         return false;
       }
     }
@@ -405,8 +431,8 @@
 **
 *******************************************************************************/
 void nfa_hci_proc_nfcc_power_mode(uint8_t nfcc_power_mode) {
-  NFA_TRACE_DEBUG1("nfa_hci_proc_nfcc_power_mode () nfcc_power_mode=%d",
-                   nfcc_power_mode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode);
 
   /* if NFCC power mode is change to full power */
   if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) {
@@ -423,7 +449,7 @@
       nfa_hci_cb.num_ee_dis_req_ntf = 0;
       nfa_hci_cb.num_hot_plug_evts = 0;
     } else {
-      NFA_TRACE_ERROR0("nfa_hci_proc_nfcc_power_mode (): Cannot restore now");
+      LOG(ERROR) << StringPrintf("Cannot restore now");
       nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_HCI);
     }
   } else {
@@ -485,7 +511,7 @@
 void nfa_hci_startup_complete(tNFA_STATUS status) {
   tNFA_HCI_EVT_DATA evt_data;
 
-  NFA_TRACE_EVENT1("nfa_hci_startup_complete (): Status: %u", status);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Status: %u", status);
 
   nfa_sys_stop_timer(&nfa_hci_cb.timer);
 
@@ -509,6 +535,43 @@
 
 /*******************************************************************************
 **
+** Function         nfa_hci_enable_one_nfcee
+**
+** Description      Enable NFCEE Hosts which are discovered.
+**
+** Returns          None
+**
+*******************************************************************************/
+void nfa_hci_enable_one_nfcee(void) {
+  uint8_t xx;
+  uint8_t nfceeid = 0;
+
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%d", nfa_hci_cb.num_nfcee);
+
+  for (xx = 0; xx < nfa_hci_cb.num_nfcee; xx++) {
+    nfceeid = nfa_hci_cb.ee_info[xx].ee_handle & ~NFA_HANDLE_GROUP_EE;
+    if (nfa_hci_cb.ee_info[xx].ee_status == NFA_EE_STATUS_INACTIVE) {
+      NFC_NfceeModeSet(nfceeid, NFC_MODE_ACTIVATE);
+      return;
+    }
+  }
+
+  if (xx == nfa_hci_cb.num_nfcee) {
+    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
+        (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
+      nfa_hciu_send_get_param_cmd(NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
+    } else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) {
+      nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
+      if (nfa_ee_cb.isDiscoveryStopped == true) {
+        nfa_dm_act_start_rf_discovery(NULL);
+        nfa_ee_cb.isDiscoveryStopped = false;
+      }
+    }
+  }
+}
+
+/*******************************************************************************
+**
 ** Function         nfa_hci_startup
 **
 ** Description      Perform HCI startup
@@ -518,13 +581,11 @@
 *******************************************************************************/
 void nfa_hci_startup(void) {
   tNFA_STATUS status = NFA_STATUS_FAILED;
-  tNFA_EE_INFO ee_info[2];
-  uint8_t num_nfcee = 2;
   uint8_t target_handle;
   uint8_t count = 0;
   bool found = false;
 
-  if (HCI_LOOPBACK_DEBUG) {
+  if (HCI_LOOPBACK_DEBUG == NFA_HCI_DEBUG_ON) {
     /* First step in initialization is to open the admin pipe */
     nfa_hciu_send_open_pipe_cmd(NFA_HCI_ADMIN_PIPE);
     return;
@@ -533,38 +594,42 @@
   /* We can only start up if NV Ram is read and EE discovery is complete */
   if (nfa_hci_cb.nv_read_cmplt && nfa_hci_cb.ee_disc_cmplt &&
       (nfa_hci_cb.conn_id == 0)) {
-    NFA_EeGetInfo(&num_nfcee, ee_info);
+    if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
+      NFC_SetStaticHciCback(nfa_hci_conn_cback);
+    } else {
+      NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
 
-    while ((count < num_nfcee) && (!found)) {
-      target_handle = (uint8_t)ee_info[count].ee_handle;
+      while ((count < nfa_hci_cb.num_nfcee) && (!found)) {
+        target_handle = (uint8_t)nfa_hci_cb.ee_info[count].ee_handle;
 
-      if (ee_info[count].ee_interface[0] == NFA_EE_INTERFACE_HCI_ACCESS) {
-        found = true;
+        if (nfa_hci_cb.ee_info[count].ee_interface[0] ==
+            NFA_EE_INTERFACE_HCI_ACCESS) {
+          found = true;
 
-        if (ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE) {
-          NFC_NfceeModeSet(target_handle, NFC_MODE_ACTIVATE);
+          if (nfa_hci_cb.ee_info[count].ee_status == NFA_EE_STATUS_INACTIVE) {
+            NFC_NfceeModeSet(target_handle, NFC_MODE_ACTIVATE);
+          }
+          if ((status = NFC_ConnCreate(NCI_DEST_TYPE_NFCEE, target_handle,
+                                       NFA_EE_INTERFACE_HCI_ACCESS,
+                                       nfa_hci_conn_cback)) == NFA_STATUS_OK)
+            nfa_sys_start_timer(&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT,
+                                NFA_HCI_CON_CREATE_TIMEOUT_VAL);
+          else {
+            nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
+            LOG(ERROR) << StringPrintf(
+                "nfa_hci_startup - Failed to Create Logical connection. HCI "
+                "Initialization/Restore failed");
+            nfa_hci_startup_complete(NFA_STATUS_FAILED);
+          }
         }
-        status =
-            NFC_ConnCreate(NCI_DEST_TYPE_NFCEE, target_handle,
-                           NFA_EE_INTERFACE_HCI_ACCESS, nfa_hci_conn_cback);
-        if (status == NFA_STATUS_OK)
-          nfa_sys_start_timer(&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT,
-                              NFA_HCI_CON_CREATE_TIMEOUT_VAL);
-        else {
-          nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
-          NFA_TRACE_ERROR0(
-              "nfa_hci_startup - Failed to Create Logical connection. HCI "
-              "Initialization/Restore failed");
-          nfa_hci_startup_complete(NFA_STATUS_FAILED);
-        }
+        count++;
       }
-      count++;
-    }
-    if (!found) {
-      NFA_TRACE_ERROR0(
-          "nfa_hci_startup - HCI ACCESS Interface not discovered. HCI "
-          "Initialization/Restore failed");
-      nfa_hci_startup_complete(NFA_STATUS_FAILED);
+      if (!found) {
+        LOG(ERROR) << StringPrintf(
+            "nfa_hci_startup - HCI ACCESS Interface not discovered. HCI "
+            "Initialization/Restore failed");
+        nfa_hci_startup_complete(NFA_STATUS_FAILED);
+      }
     }
   }
 }
@@ -579,7 +644,7 @@
 **
 *******************************************************************************/
 static void nfa_hci_sys_enable(void) {
-  NFA_TRACE_DEBUG0("nfa_hci_sys_enable ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   nfa_ee_reg_cback_enable_done(&nfa_hci_ee_info_cback);
 
   nfa_nv_co_read((uint8_t*)&nfa_hci_cb.cfg, sizeof(nfa_hci_cb.cfg),
@@ -605,8 +670,10 @@
   if (nfa_hci_cb.conn_id) {
     if (nfa_sys_is_graceful_disable()) {
       /* Tell all applications stack is down */
-      nfa_hciu_send_to_all_apps(NFA_HCI_EXIT_EVT, &evt_data);
-      NFC_ConnClose(nfa_hci_cb.conn_id);
+      if (NFC_GetNCIVersion() == NCI_VERSION_1_0) {
+        nfa_hciu_send_to_all_apps(NFA_HCI_EXIT_EVT, &evt_data);
+        NFC_ConnClose(nfa_hci_cb.conn_id);
+      }
       return;
     }
     nfa_hci_cb.conn_id = 0;
@@ -633,10 +700,9 @@
   uint8_t chaining_bit;
   uint8_t pipe;
   uint16_t pkt_len;
-#if (BT_TRACE_VERBOSE == TRUE)
   char buff[100];
-#endif
-
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "%s State: %u  Cmd: %u", __func__, nfa_hci_cb.hci_state, event);
   if (event == NFC_CONN_CREATE_CEVT) {
     nfa_hci_cb.conn_id = conn_id;
     nfa_hci_cb.buff_size = p_data->conn_create.buff_size;
@@ -676,9 +742,7 @@
   p = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
   pkt_len = p_pkt->len;
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispHcp(p, pkt_len, true, (bool)!nfa_hci_cb.assembling);
-#endif
+  DispHcp(p, pkt_len, true);
 
   chaining_bit = ((*p) >> 0x07) & 0x01;
   pipe = (*p++) & 0x7F;
@@ -708,8 +772,8 @@
     if (nfa_hci_cb.assembly_failed) {
       /* If Reassembly failed because of insufficient buffer, just drop the new
        * segmented packets */
-      NFA_TRACE_ERROR1(
-          "nfa_hci_conn_cback (): Insufficient buffer to Reassemble HCP "
+      LOG(ERROR) << StringPrintf(
+          "Insufficient buffer to Reassemble HCP "
           "packet! Dropping :%u bytes",
           pkt_len);
     } else {
@@ -725,19 +789,12 @@
     }
   }
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_EVENT5(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hci_conn_cback Recvd data pipe:%d  %s  chain:%d  assmbl:%d  len:%d",
-      (uint8_t)pipe, nfa_hciu_get_type_inst_names(pipe, nfa_hci_cb.type,
-                                                  nfa_hci_cb.inst, buff),
+      (uint8_t)pipe,
+      nfa_hciu_get_type_inst_names(pipe, nfa_hci_cb.type, nfa_hci_cb.inst,
+                                   buff),
       (uint8_t)chaining_bit, (uint8_t)nfa_hci_cb.assembling, p_pkt->len);
-#else
-  NFA_TRACE_EVENT6(
-      "nfa_hci_conn_cback Recvd data pipe:%d  Type: %u  Inst: %u  chain:%d "
-      "reassm:%d len:%d",
-      pipe, nfa_hci_cb.type, nfa_hci_cb.inst, chaining_bit,
-      nfa_hci_cb.assembling, p_pkt->len);
-#endif
 
   /* If still reassembling fragments, just return */
   if (nfa_hci_cb.assembling) {
@@ -763,7 +820,7 @@
       } else if (nfa_hci_cb.type == NFA_HCI_RESPONSE_TYPE) {
         nfa_hci_handle_admin_gate_rsp(p, (uint8_t)pkt_len);
       } else if (nfa_hci_cb.type == NFA_HCI_EVENT_TYPE) {
-        nfa_hci_handle_admin_gate_evt(p);
+        nfa_hci_handle_admin_gate_evt();
       }
       break;
 
@@ -839,20 +896,21 @@
 ** Returns          None
 **
 *******************************************************************************/
-void nfa_hci_rsp_timeout(tNFA_HCI_EVENT_DATA* p_evt_data) {
+void nfa_hci_rsp_timeout() {
   tNFA_HCI_EVT evt = 0;
   tNFA_HCI_EVT_DATA evt_data;
   uint8_t delete_pipe;
 
-  NFA_TRACE_EVENT2("nfa_hci_rsp_timeout () State: %u  Cmd: %u",
-                   nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "State: %u  Cmd: %u", nfa_hci_cb.hci_state, nfa_hci_cb.cmd_sent);
 
   evt_data.status = NFA_STATUS_FAILED;
 
   switch (nfa_hci_cb.hci_state) {
     case NFA_HCI_STATE_STARTUP:
     case NFA_HCI_STATE_RESTORE:
-      NFA_TRACE_ERROR0("nfa_hci_rsp_timeout - Initialization failed!");
+      LOG(ERROR) << StringPrintf(
+          "nfa_hci_rsp_timeout - Initialization failed!");
       nfa_hci_startup_complete(NFA_STATUS_TIMEOUT);
       break;
 
@@ -996,8 +1054,8 @@
       break;
     case NFA_HCI_STATE_DISABLED:
     default:
-      NFA_TRACE_DEBUG0(
-          "nfa_hci_rsp_timeout () Timeout in DISABLED/ Invalid state");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Timeout in DISABLED/ Invalid state");
       break;
   }
   if (evt != 0) nfa_hciu_send_to_app(evt, &evt_data, nfa_hci_cb.app_in_use);
@@ -1042,8 +1100,8 @@
     nfa_hci_cb.msg_len = nfa_hci_cb.max_msg_len;
     /* Set Reassembly failed */
     nfa_hci_cb.assembly_failed = true;
-    NFA_TRACE_ERROR1(
-        "nfa_hci_assemble_msg (): Insufficient buffer to Reassemble HCP "
+    LOG(ERROR) << StringPrintf(
+        "Insufficient buffer to Reassemble HCP "
         "packet! Dropping :%u bytes",
         ((nfa_hci_cb.msg_len + data_len) - nfa_hci_cb.max_msg_len));
   } else {
@@ -1062,23 +1120,18 @@
 **
 *******************************************************************************/
 static bool nfa_hci_evt_hdlr(NFC_HDR* p_msg) {
-  tNFA_HCI_EVENT_DATA* p_evt_data = (tNFA_HCI_EVENT_DATA*)p_msg;
-
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_EVENT4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hci_evt_hdlr state: %s (%d) event: %s (0x%04x)",
-      nfa_hciu_get_state_name(nfa_hci_cb.hci_state), nfa_hci_cb.hci_state,
-      nfa_hciu_get_event_name(p_evt_data->hdr.event), p_evt_data->hdr.event);
-#else
-  NFA_TRACE_EVENT2("nfa_hci_evt_hdlr state: %d event: 0x%04x",
-                   nfa_hci_cb.hci_state, p_evt_data->hdr.event);
-#endif
+      nfa_hciu_get_state_name(nfa_hci_cb.hci_state).c_str(),
+      nfa_hci_cb.hci_state, nfa_hciu_get_event_name(p_msg->event).c_str(),
+      p_msg->event);
 
   /* If this is an API request, queue it up */
   if ((p_msg->event >= NFA_HCI_FIRST_API_EVENT) &&
       (p_msg->event <= NFA_HCI_LAST_API_EVENT)) {
     GKI_enqueue(&nfa_hci_cb.hci_api_q, p_msg);
   } else {
+    tNFA_HCI_EVENT_DATA* p_evt_data = (tNFA_HCI_EVENT_DATA*)p_msg;
     switch (p_msg->event) {
       case NFA_HCI_RSP_NV_READ_EVT:
         nfa_hci_handle_nv_read(p_evt_data->nv_read.block,
@@ -1090,15 +1143,15 @@
         break;
 
       case NFA_HCI_RSP_TIMEOUT_EVT:
-        nfa_hci_rsp_timeout((tNFA_HCI_EVENT_DATA*)p_msg);
+        nfa_hci_rsp_timeout();
         break;
 
       case NFA_HCI_CHECK_QUEUE_EVT:
-        if (HCI_LOOPBACK_DEBUG) {
+        if (HCI_LOOPBACK_DEBUG == NFA_HCI_DEBUG_ON) {
           if (p_msg->len != 0) {
-            tNFC_DATA_CEVT xx;
-            xx.p_data = p_msg;
-            nfa_hci_conn_cback(0, NFC_DATA_CEVT, (tNFC_CONN*)&xx);
+            tNFC_CONN nfc_conn;
+            nfc_conn.data.p_data = p_msg;
+            nfa_hci_conn_cback(0, NFC_DATA_CEVT, &nfc_conn);
             return false;
           }
         }
diff --git a/src/nfa/hci/nfa_hci_utils.c b/src/nfa/hci/nfa_hci_utils.cc
similarity index 86%
rename from src/nfa/hci/nfa_hci_utils.c
rename to src/nfa/hci/nfa_hci_utils.cc
index 895f09e..d6d3720 100644
--- a/src/nfa/hci/nfa_hci_utils.c
+++ b/src/nfa/hci/nfa_hci_utils.cc
@@ -21,21 +21,24 @@
  *  This file contains the utility functions for the NFA HCI.
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
 #include "nfa_hci_api.h"
 #include "nfa_hci_defs.h"
 #include "nfa_hci_int.h"
-#include "nfa_mem_co.h"
-#include "nfa_nv_co.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
 #include "trace_api.h"
 
-static void handle_debug_loopback(NFC_HDR* p_buf, uint8_t pipe, uint8_t type,
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
+static void handle_debug_loopback(NFC_HDR* p_buf, uint8_t type,
                                   uint8_t instruction);
-bool HCI_LOOPBACK_DEBUG = false;
+uint8_t HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_OFF;
 
 /*******************************************************************************
 **
@@ -250,7 +253,7 @@
       if (nfa_hciu_find_gate_by_gid(gate_id) == NULL) break;
     }
     if (gate_id > NFA_HCI_LAST_PROP_GATE) {
-      NFA_TRACE_ERROR2(
+      LOG(ERROR) << StringPrintf(
           "nfa_hci_alloc_gate - no free Gate ID: %u  App Handle: 0x%04x",
           gate_id, app_handle);
       return (NULL);
@@ -266,8 +269,8 @@
       pg->gate_owner = app_handle;
       pg->pipe_inx_mask = 0;
 
-      NFA_TRACE_DEBUG2("nfa_hciu_alloc_gate id:%d  app_handle: 0x%04x", gate_id,
-                       app_handle);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "nfa_hciu_alloc_gate id:%d  app_handle: 0x%04x", gate_id, app_handle);
 
       nfa_hci_cb.nv_write_needed = true;
       return (pg);
@@ -275,7 +278,7 @@
   }
 
   /* If here, no free gate control block */
-  NFA_TRACE_ERROR2(
+  LOG(ERROR) << StringPrintf(
       "nfa_hci_alloc_gate - no CB  Gate ID: %u  App Handle: 0x%04x", gate_id,
       app_handle);
   return (NULL);
@@ -301,16 +304,11 @@
   tNFA_STATUS status = NFA_STATUS_OK;
   uint16_t max_seg_hcp_pkt_size = nfa_hci_cb.buff_size - NCI_DATA_HDR_SIZE;
 
-#if (BT_TRACE_VERBOSE == TRUE)
   char buff[100];
 
-  NFA_TRACE_DEBUG3(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hciu_send_msg pipe_id:%d   %s  len:%d", pipe_id,
       nfa_hciu_get_type_inst_names(pipe_id, type, instruction, buff), msg_len);
-#else
-  NFA_TRACE_DEBUG4("nfa_hciu_send_msg pipe_id:%d   Type: %u  Inst: %u  len: %d",
-                   pipe_id, type, instruction, msg_len);
-#endif
 
   if (instruction == NFA_HCI_ANY_GET_PARAMETER)
     nfa_hci_cb.param_in_use = *p_msg;
@@ -352,17 +350,14 @@
         if (msg_len > 0) p_msg += data_len;
       }
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-      DispHcp(((uint8_t*)(p_buf + 1) + p_buf->offset), p_buf->len, false,
-              (bool)((p_buf->len - data_len) == 2));
-#endif
+      DispHcp(((uint8_t*)(p_buf + 1) + p_buf->offset), p_buf->len, false);
 
-      if (HCI_LOOPBACK_DEBUG)
-        handle_debug_loopback(p_buf, pipe_id, type, instruction);
+      if (HCI_LOOPBACK_DEBUG == NFA_HCI_DEBUG_ON)
+        handle_debug_loopback(p_buf, type, instruction);
       else
         status = NFC_SendData(nfa_hci_cb.conn_id, p_buf);
     } else {
-      NFA_TRACE_ERROR0("nfa_hciu_send_data_packet no buffers");
+      LOG(ERROR) << StringPrintf("nfa_hciu_send_data_packet no buffers");
       status = NFA_STATUS_NO_BUFFERS;
       break;
     }
@@ -404,7 +399,7 @@
     }
   }
 
-  NFA_TRACE_DEBUG1("nfa_hciu_get_allocated_gate_list () returns: %u", count);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("returns: %u", count);
 
   return (count);
 }
@@ -434,7 +429,8 @@
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
        xx++, pp++) {
     if (pp->pipe_id == 0) {
-      NFA_TRACE_DEBUG2("nfa_hciu_alloc_pipe:%d, index:%d", pipe_id, xx);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("nfa_hciu_alloc_pipe:%d, index:%d", pipe_id, xx);
       pp->pipe_id = pipe_id;
 
       nfa_hci_cb.nv_write_needed = true;
@@ -442,7 +438,8 @@
     }
   }
 
-  NFA_TRACE_DEBUG1("nfa_hciu_alloc_pipe:%d, NO free entries !!", pipe_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_hciu_alloc_pipe:%d, NO free entries !!", pipe_id);
   return (NULL);
 }
 
@@ -459,9 +456,9 @@
   tNFA_HCI_DYN_GATE* p_gate = nfa_hciu_find_gate_by_gid(gate_id);
 
   if (p_gate != NULL) {
-    NFA_TRACE_DEBUG3(
-        "nfa_hciu_release_gate () ID: %d  owner: 0x%04x  pipe_inx_mask: 0x%04x",
-        gate_id, p_gate->gate_owner, p_gate->pipe_inx_mask);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("ID: %d  owner: 0x%04x  pipe_inx_mask: 0x%04x", gate_id,
+                        p_gate->gate_owner, p_gate->pipe_inx_mask);
 
     p_gate->gate_id = 0;
     p_gate->gate_owner = 0;
@@ -469,7 +466,7 @@
 
     nfa_hci_cb.nv_write_needed = true;
   } else {
-    NFA_TRACE_WARNING1("nfa_hciu_release_gate () ID: %d  NOT FOUND", gate_id);
+    LOG(WARNING) << StringPrintf("ID: %d  NOT FOUND", gate_id);
   }
 }
 
@@ -506,7 +503,7 @@
       pipe_index = (uint8_t)(p_pipe - nfa_hci_cb.cfg.dyn_pipes);
       p_gate->pipe_inx_mask |= (uint32_t)(1 << pipe_index);
 
-      NFA_TRACE_DEBUG4(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "nfa_hciu_add_pipe_to_gate  Gate ID: 0x%02x  Pipe ID: 0x%02x  "
           "pipe_index: %u  App Handle: 0x%08x",
           local_gate, pipe_id, pipe_index, p_gate->gate_owner);
@@ -514,7 +511,8 @@
     }
   }
 
-  NFA_TRACE_DEBUG1("nfa_hciu_add_pipe_to_gate: 0x%02x  NOT FOUND", local_gate);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_hciu_add_pipe_to_gate: 0x%02x  NOT FOUND", local_gate);
 
   return (NFA_HCI_ADM_E_NO_PIPES_AVAILABLE);
 }
@@ -536,7 +534,7 @@
   tNFA_HCI_DYN_PIPE* p_pipe;
   uint8_t pipe_index;
 
-  NFA_TRACE_EVENT4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hciu_add_pipe_to_static_gate (%u)  Pipe: 0x%02x  Dest Host: 0x%02x  "
       "Dest Gate: 0x%02x)",
       local_gate, pipe_id, dest_host, dest_gate);
@@ -576,8 +574,8 @@
   tNFA_HCI_DYN_PIPE* pp;
   int xx;
 
-  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_by_owner () app_handle:0x%x",
-                   app_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("app_handle:0x%x", app_handle);
 
   /* Loop through all pipes looking for the owner */
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
@@ -611,8 +609,8 @@
   tNFA_HCI_DYN_PIPE* pp;
   int xx;
 
-  NFA_TRACE_DEBUG3(
-      "nfa_hciu_check_pipe_between_gates () Local gate: 0x%02X, Host[0x%02X] "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Local gate: 0x%02X, Host[0x%02X] "
       "gate: 0x%02X",
       local_gate, dest_host, dest_gate);
 
@@ -645,8 +643,8 @@
   tNFA_HCI_DYN_PIPE* pp;
   int xx;
 
-  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_by_owner () app_handle:0x%x",
-                   app_handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("app_handle:0x%x", app_handle);
 
   /* Loop through all pipes looking for the owner */
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
@@ -676,7 +674,7 @@
   tNFA_HCI_DYN_PIPE* pp;
   int xx;
 
-  NFA_TRACE_DEBUG1("nfa_hciu_find_pipe_on_gate () Gate:0x%x", gate_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Gate:0x%x", gate_id);
 
   /* Loop through all pipes looking for the owner */
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
@@ -766,7 +764,7 @@
   tNFA_HCI_DYN_PIPE* pp;
   int xx;
 
-  NFA_TRACE_DEBUG1("nfa_hciu_find_active_pipe_on_gate () Gate:0x%x", gate_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Gate:0x%x", gate_id);
 
   /* Loop through all pipes looking for the owner */
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
@@ -799,13 +797,15 @@
   tNFA_HCI_DYN_PIPE* p_pipe;
   uint8_t pipe_index;
 
-  NFA_TRACE_EVENT1("nfa_hciu_release_pipe: %u", pipe_id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_hciu_release_pipe: %u", pipe_id);
 
   p_pipe = nfa_hciu_find_pipe_by_pid(pipe_id);
   if (p_pipe == NULL) return (NFA_HCI_ANY_E_NOK);
 
   if (pipe_id > NFA_HCI_LAST_DYNAMIC_PIPE) {
-    NFA_TRACE_DEBUG1("ignore pipe: %d", pipe_id);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("ignore pipe: %d", pipe_id);
     return (NFA_HCI_ANY_E_NOK);
   }
 
@@ -847,7 +847,8 @@
   int xx;
   tNFA_HCI_EVT_DATA evt_data;
 
-  NFA_TRACE_EVENT1("nfa_hciu_remove_all_pipes_from_host (0x%02x)", host);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_hciu_remove_all_pipes_from_host (0x%02x)", host);
 
   /* Remove all pipes from the specified host connected to all generic gates */
   for (xx = 0, pp = nfa_hci_cb.cfg.dyn_pipes; xx < NFA_HCI_MAX_PIPE_CB;
@@ -887,7 +888,7 @@
   data[1] = dest_host;
   data[2] = dest_gate;
 
-  NFA_TRACE_DEBUG3(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "nfa_hciu_send_create_pipe_cmd source_gate:%d, dest_host:%d, "
       "dest_gate:%d",
       source_gate, dest_host, dest_gate);
@@ -910,10 +911,11 @@
 tNFA_STATUS nfa_hciu_send_delete_pipe_cmd(uint8_t pipe) {
   tNFA_STATUS status;
 
-  NFA_TRACE_DEBUG1("nfa_hciu_send_delete_pipe_cmd: %d", pipe);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_hciu_send_delete_pipe_cmd: %d", pipe);
 
   if (pipe > NFA_HCI_LAST_DYNAMIC_PIPE) {
-    NFA_TRACE_DEBUG1("ignore pipe: %d", pipe);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ignore pipe: %d", pipe);
     return (NFA_HCI_ANY_E_NOK);
   }
   nfa_hci_cb.pipe_in_use = pipe;
@@ -940,7 +942,8 @@
   tNFA_STATUS status;
   uint16_t id_ref_data = 0x0102;
 
-  NFA_TRACE_DEBUG0("nfa_hciu_send_clear_all_pipe_cmd");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_hciu_send_clear_all_pipe_cmd");
 
   status =
       nfa_hciu_send_msg(NFA_HCI_ADMIN_PIPE, NFA_HCI_COMMAND_TYPE,
@@ -1057,7 +1060,7 @@
   }
 
   if (app_handle != NFA_HANDLE_INVALID) {
-    NFA_TRACE_WARNING2(
+    LOG(WARNING) << StringPrintf(
         "nfa_hciu_send_to_app no callback,  event: 0x%04x  app_handle: 0x%04x",
         event, app_handle);
   }
@@ -1103,7 +1106,6 @@
   }
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_hciu_get_response_name
@@ -1115,34 +1117,34 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_get_response_name(uint8_t rsp_code) {
+static std::string nfa_hciu_get_response_name(uint8_t rsp_code) {
   switch (rsp_code) {
     case NFA_HCI_ANY_OK:
-      return ("ANY_OK");
+      return "ANY_OK";
     case NFA_HCI_ANY_E_NOT_CONNECTED:
-      return ("ANY_E_NOT_CONNECTED");
+      return "ANY_E_NOT_CONNECTED";
     case NFA_HCI_ANY_E_CMD_PAR_UNKNOWN:
-      return ("ANY_E_CMD_PAR_UNKNOWN");
+      return "ANY_E_CMD_PAR_UNKNOWN";
     case NFA_HCI_ANY_E_NOK:
-      return ("ANY_E_NOK");
+      return "ANY_E_NOK";
     case NFA_HCI_ADM_E_NO_PIPES_AVAILABLE:
-      return ("ADM_E_NO_PIPES_AVAILABLE");
+      return "ADM_E_NO_PIPES_AVAILABLE";
     case NFA_HCI_ANY_E_REG_PAR_UNKNOWN:
-      return ("ANY_E_REG_PAR_UNKNOWN");
+      return "ANY_E_REG_PAR_UNKNOWN";
     case NFA_HCI_ANY_E_PIPE_NOT_OPENED:
-      return ("ANY_E_PIPE_NOT_OPENED");
+      return "ANY_E_PIPE_NOT_OPENED";
     case NFA_HCI_ANY_E_CMD_NOT_SUPPORTED:
-      return ("ANY_E_CMD_NOT_SUPPORTED");
+      return "ANY_E_CMD_NOT_SUPPORTED";
     case NFA_HCI_ANY_E_INHIBITED:
-      return ("ANY_E_INHIBITED");
+      return "ANY_E_INHIBITED";
     case NFA_HCI_ANY_E_TIMEOUT:
-      return ("ANY_E_TIMEOUT");
+      return "ANY_E_TIMEOUT";
     case NFA_HCI_ANY_E_REG_ACCESS_DENIED:
-      return ("ANY_E_REG_ACCESS_DENIED");
+      return "ANY_E_REG_ACCESS_DENIED";
     case NFA_HCI_ANY_E_PIPE_ACCESS_DENIED:
-      return ("ANY_E_PIPE_ACCESS_DENIED");
+      return "ANY_E_PIPE_ACCESS_DENIED";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
 
@@ -1155,16 +1157,16 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_type_2_str(uint8_t type) {
+static std::string nfa_hciu_type_2_str(uint8_t type) {
   switch (type) {
     case NFA_HCI_COMMAND_TYPE:
-      return ("COMMAND");
+      return "COMMAND";
     case NFA_HCI_EVENT_TYPE:
-      return ("EVENT");
+      return "EVENT";
     case NFA_HCI_RESPONSE_TYPE:
-      return ("RESPONSE");
+      return "RESPONSE";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
 
@@ -1177,30 +1179,30 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_instr_2_str(uint8_t instruction) {
+std::string nfa_hciu_instr_2_str(uint8_t instruction) {
   switch (instruction) {
     case NFA_HCI_ANY_SET_PARAMETER:
-      return ("ANY_SET_PARAMETER");
+      return "ANY_SET_PARAMETER";
     case NFA_HCI_ANY_GET_PARAMETER:
-      return ("ANY_GET_PARAMETER");
+      return "ANY_GET_PARAMETER";
     case NFA_HCI_ANY_OPEN_PIPE:
-      return ("ANY_OPEN_PIPE");
+      return "ANY_OPEN_PIPE";
     case NFA_HCI_ANY_CLOSE_PIPE:
-      return ("ANY_CLOSE_PIPE");
+      return "ANY_CLOSE_PIPE";
     case NFA_HCI_ADM_CREATE_PIPE:
-      return ("ADM_CREATE_PIPE");
+      return "ADM_CREATE_PIPE";
     case NFA_HCI_ADM_DELETE_PIPE:
-      return ("ADM_DELETE_PIPE");
+      return "ADM_DELETE_PIPE";
     case NFA_HCI_ADM_NOTIFY_PIPE_CREATED:
-      return ("ADM_NOTIFY_PIPE_CREATED");
+      return "ADM_NOTIFY_PIPE_CREATED";
     case NFA_HCI_ADM_NOTIFY_PIPE_DELETED:
-      return ("ADM_NOTIFY_PIPE_DELETED");
+      return "ADM_NOTIFY_PIPE_DELETED";
     case NFA_HCI_ADM_CLEAR_ALL_PIPE:
-      return ("ADM_CLEAR_ALL_PIPE");
+      return "ADM_CLEAR_ALL_PIPE";
     case NFA_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED:
-      return ("ADM_NOTIFY_ALL_PIPE_CLEARED");
+      return "ADM_NOTIFY_ALL_PIPE_CLEARED";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
 
@@ -1213,49 +1215,48 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_get_event_name(uint16_t event) {
+std::string nfa_hciu_get_event_name(uint16_t event) {
   switch (event) {
     case NFA_HCI_API_REGISTER_APP_EVT:
-      return ("API_REGISTER");
+      return "API_REGISTER";
     case NFA_HCI_API_DEREGISTER_APP_EVT:
-      return ("API_DEREGISTER");
+      return "API_DEREGISTER";
     case NFA_HCI_API_GET_APP_GATE_PIPE_EVT:
-      return ("API_GET_GATE_LIST");
+      return "API_GET_GATE_LIST";
     case NFA_HCI_API_ALLOC_GATE_EVT:
-      return ("API_ALLOC_GATE");
+      return "API_ALLOC_GATE";
     case NFA_HCI_API_DEALLOC_GATE_EVT:
-      return ("API_DEALLOC_GATE");
+      return "API_DEALLOC_GATE";
     case NFA_HCI_API_GET_HOST_LIST_EVT:
-      return ("API_GET_HOST_LIST");
+      return "API_GET_HOST_LIST";
     case NFA_HCI_API_GET_REGISTRY_EVT:
-      return ("API_GET_REG_VALUE");
+      return "API_GET_REG_VALUE";
     case NFA_HCI_API_SET_REGISTRY_EVT:
-      return ("API_SET_REG_VALUE");
+      return "API_SET_REG_VALUE";
     case NFA_HCI_API_CREATE_PIPE_EVT:
-      return ("API_CREATE_PIPE");
+      return "API_CREATE_PIPE";
     case NFA_HCI_API_OPEN_PIPE_EVT:
-      return ("API_OPEN_PIPE");
+      return "API_OPEN_PIPE";
     case NFA_HCI_API_CLOSE_PIPE_EVT:
-      return ("API_CLOSE_PIPE");
+      return "API_CLOSE_PIPE";
     case NFA_HCI_API_DELETE_PIPE_EVT:
-      return ("API_DELETE_PIPE");
+      return "API_DELETE_PIPE";
     case NFA_HCI_API_SEND_CMD_EVT:
-      return ("API_SEND_COMMAND_EVT");
+      return "API_SEND_COMMAND_EVT";
     case NFA_HCI_API_SEND_RSP_EVT:
-      return ("API_SEND_RESPONSE_EVT");
+      return "API_SEND_RESPONSE_EVT";
     case NFA_HCI_API_SEND_EVENT_EVT:
-      return ("API_SEND_EVENT_EVT");
+      return "API_SEND_EVENT_EVT";
     case NFA_HCI_RSP_NV_READ_EVT:
-      return ("NV_READ_EVT");
+      return "NV_READ_EVT";
     case NFA_HCI_RSP_NV_WRITE_EVT:
-      return ("NV_WRITE_EVT");
+      return "NV_WRITE_EVT";
     case NFA_HCI_RSP_TIMEOUT_EVT:
-      return ("RESPONSE_TIMEOUT_EVT");
+      return "RESPONSE_TIMEOUT_EVT";
     case NFA_HCI_CHECK_QUEUE_EVT:
-      return ("CHECK_QUEUE");
-
+      return "CHECK_QUEUE";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
 
@@ -1268,29 +1269,28 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_get_state_name(uint8_t state) {
+std::string nfa_hciu_get_state_name(uint8_t state) {
   switch (state) {
     case NFA_HCI_STATE_DISABLED:
-      return ("DISABLED");
+      return "DISABLED";
     case NFA_HCI_STATE_STARTUP:
-      return ("STARTUP");
+      return "STARTUP";
     case NFA_HCI_STATE_WAIT_NETWK_ENABLE:
-      return ("WAIT_NETWK_ENABLE");
+      return "WAIT_NETWK_ENABLE";
     case NFA_HCI_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case NFA_HCI_STATE_WAIT_RSP:
-      return ("WAIT_RSP");
+      return "WAIT_RSP";
     case NFA_HCI_STATE_REMOVE_GATE:
-      return ("REMOVE_GATE");
+      return "REMOVE_GATE";
     case NFA_HCI_STATE_APP_DEREGISTER:
-      return ("APP_DEREGISTER");
+      return "APP_DEREGISTER";
     case NFA_HCI_STATE_RESTORE:
-      return ("RESTORE");
+      return "RESTORE";
     case NFA_HCI_STATE_RESTORE_NETWK_ENABLE:
-      return ("WAIT_NETWK_ENABLE_AFTER_RESTORE");
-
+      return "WAIT_NETWK_ENABLE_AFTER_RESTORE";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
 
@@ -1307,26 +1307,27 @@
                                    char* p_buff) {
   int xx;
 
-  xx = sprintf(p_buff, "Type: %s [0x%02x] ", nfa_hciu_type_2_str(type), type);
+  xx = sprintf(p_buff, "Type: %s [0x%02x] ", nfa_hciu_type_2_str(type).c_str(),
+               type);
 
   switch (type) {
     case NFA_HCI_COMMAND_TYPE:
-      sprintf(&p_buff[xx], "Inst: %s [0x%02x] ", nfa_hciu_instr_2_str(inst),
-              inst);
+      sprintf(&p_buff[xx], "Inst: %s [0x%02x] ",
+              nfa_hciu_instr_2_str(inst).c_str(), inst);
       break;
     case NFA_HCI_EVENT_TYPE:
-      sprintf(&p_buff[xx], "Evt: %s [0x%02x] ", nfa_hciu_evt_2_str(pipe, inst),
-              inst);
+      sprintf(&p_buff[xx], "Evt: %s [0x%02x] ",
+              nfa_hciu_evt_2_str(pipe, inst).c_str(), inst);
       break;
     case NFA_HCI_RESPONSE_TYPE:
       sprintf(&p_buff[xx], "Resp: %s [0x%02x] ",
-              nfa_hciu_get_response_name(inst), inst);
+              nfa_hciu_get_response_name(inst).c_str(), inst);
       break;
     default:
       sprintf(&p_buff[xx], "Inst: %u ", inst);
       break;
   }
-  return (p_buff);
+  return p_buff;
 }
 
 /*******************************************************************************
@@ -1338,40 +1339,36 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* nfa_hciu_evt_2_str(uint8_t pipe_id, uint8_t evt) {
-  tNFA_HCI_DYN_PIPE* p_pipe;
-
-  if ((pipe_id != NFA_HCI_ADMIN_PIPE) &&
-      (pipe_id != NFA_HCI_LINK_MANAGEMENT_PIPE) &&
-      ((p_pipe = nfa_hciu_find_pipe_by_pid(pipe_id)) != NULL)) {
-    if (p_pipe->local_gate == NFA_HCI_CONNECTIVITY_GATE) {
-      switch (evt) {
-        case NFA_HCI_EVT_CONNECTIVITY:
-          return ("EVT_CONNECTIVITY");
-        case NFA_HCI_EVT_TRANSACTION:
-          return ("EVT_TRANSACTION");
-        case NFA_HCI_EVT_OPERATION_ENDED:
-          return ("EVT_OPERATION_ENDED");
-        default:
-          return ("UNKNOWN");
-      }
+std::string nfa_hciu_evt_2_str(uint8_t pipe_id, uint8_t evt) {
+  tNFA_HCI_DYN_PIPE* p_pipe = nfa_hciu_find_pipe_by_pid(pipe_id);
+  if (pipe_id != NFA_HCI_ADMIN_PIPE &&
+      pipe_id != NFA_HCI_LINK_MANAGEMENT_PIPE && p_pipe != NULL &&
+      p_pipe->local_gate == NFA_HCI_CONNECTIVITY_GATE) {
+    switch (evt) {
+      case NFA_HCI_EVT_CONNECTIVITY:
+        return "EVT_CONNECTIVITY";
+      case NFA_HCI_EVT_TRANSACTION:
+        return "EVT_TRANSACTION";
+      case NFA_HCI_EVT_OPERATION_ENDED:
+        return "EVT_OPERATION_ENDED";
+      default:
+        return "UNKNOWN";
     }
   }
 
   switch (evt) {
     case NFA_HCI_EVT_HCI_END_OF_OPERATION:
-      return ("EVT_END_OF_OPERATION");
+      return "EVT_END_OF_OPERATION";
     case NFA_HCI_EVT_POST_DATA:
-      return ("EVT_POST_DATA");
+      return "EVT_POST_DATA";
     case NFA_HCI_EVT_HOT_PLUG:
-      return ("EVT_HOT_PLUG");
+      return "EVT_HOT_PLUG";
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
-#endif
 
-static void handle_debug_loopback(NFC_HDR* p_buf, uint8_t pipe, uint8_t type,
+static void handle_debug_loopback(NFC_HDR* p_buf, uint8_t type,
                                   uint8_t instruction) {
   uint8_t* p = (uint8_t*)(p_buf + 1) + p_buf->offset;
   static uint8_t next_pipe = 0x10;
diff --git a/src/nfa/include/nfa_api.h b/src/nfa/include/nfa_api.h
index 3467fdb..1b0f18c 100644
--- a/src/nfa/include/nfa_api.h
+++ b/src/nfa/include/nfa_api.h
@@ -41,64 +41,27 @@
 #define NFA_MAX_AID_LEN NFC_MAX_AID_LEN
 #define NFA_MIN_AID_LEN 5 /* per NCI specification */
 
-/* NFA API return status codes */
 /* Command succeeded    */
 #define NFA_STATUS_OK NCI_STATUS_OK
 /* Command is rejected. */
 #define NFA_STATUS_REJECTED NCI_STATUS_REJECTED
-/* Message is corrupted */
-#define NFA_STATUS_MSG_CORRUPTED NCI_STATUS_MESSAGE_CORRUPTED
 /* buffer full          */
 #define NFA_STATUS_BUFFER_FULL NCI_STATUS_BUFFER_FULL
 /* failed               */
 #define NFA_STATUS_FAILED NCI_STATUS_FAILED
-/* not initialized      */
-#define NFA_STATUS_NOT_INITIALIZED NCI_STATUS_NOT_INITIALIZED
-/* Syntax error         */
-#define NFA_STATUS_SYNTAX_ERROR NCI_STATUS_SYNTAX_ERROR
+/* Optional feature of NCI Spec not supported */
+#define NFA_STATUS_NOT_SUPPORTED NCI_STATUS_NOT_SUPPORTED
 /* Semantic error       */
 #define NFA_STATUS_SEMANTIC_ERROR NCI_STATUS_SEMANTIC_ERROR
 /* Unknown NCI Group ID */
 #define NFA_STATUS_UNKNOWN_GID NCI_STATUS_UNKNOWN_GID
-/* Unknown NCI Opcode   */
-#define NFA_STATUS_UNKNOWN_OID NCI_STATUS_UNKNOWN_OID
 /* Invalid Parameter    */
 #define NFA_STATUS_INVALID_PARAM NCI_STATUS_INVALID_PARAM
-/* Message size too big */
-#define NFA_STATUS_MSG_SIZE_TOO_BIG NCI_STATUS_MSG_SIZE_TOO_BIG
 /* Already started      */
 #define NFA_STATUS_ALREADY_STARTED NCI_STATUS_ALREADY_STARTED
-/* Activation Failed    */
-#define NFA_STATUS_ACTIVATION_FAILED NCI_STATUS_ACTIVATION_FAILED
-/* Tear Down Error      */
-#define NFA_STATUS_TEAR_DOWN NCI_STATUS_TEAR_DOWN
-/* RF transmission error*/
-#define NFA_STATUS_RF_TRANSMISSION_ERR NCI_STATUS_RF_TRANSMISSION_ERR
-/* RF protocol error    */
-#define NFA_STATUS_RF_PROTOCOL_ERR NCI_STATUS_RF_PROTOCOL_ERR
 /* RF Timeout           */
 #define NFA_STATUS_TIMEOUT NCI_STATUS_TIMEOUT
-/* EE Intf activate err */
-#define NFA_STATUS_EE_INTF_ACTIVE_FAIL NCI_STATUS_EE_INTF_ACTIVE_FAIL
-/* EE transmission error*/
-#define NFA_STATUS_EE_TRANSMISSION_ERR NCI_STATUS_EE_TRANSMISSION_ERR
-/* EE protocol error    */
-#define NFA_STATUS_EE_PROTOCOL_ERR NCI_STATUS_EE_PROTOCOL_ERR
-/* EE Timeout           */
-#define NFA_STATUS_EE_TIMEOUT NCI_STATUS_EE_TIMEOUT
 
-/* Command started successfully */
-#define NFA_STATUS_CMD_STARTED NFC_STATUS_CMD_STARTED
-/* NFCC Timeout in responding to an NCI command */
-#define NFA_STATUS_HW_TIMEOUT NFC_STATUS_HW_TIMEOUT
-/* More NFA_CE_GET_ROUTING_REVT to follow */
-#define NFA_STATUS_CONTINUE NFC_STATUS_CONTINUE
-/* API is called to perform illegal function */
-#define NFA_STATUS_REFUSED NFC_STATUS_REFUSED
-/* Wrong format of R-APDU, CC file or NDEF file */
-#define NFA_STATUS_BAD_RESP NFC_STATUS_BAD_RESP
-/* 7816 Status Word is not command complete(0x9000) */
-#define NFA_STATUS_CMD_NOT_CMPLTD NFC_STATUS_CMD_NOT_CMPLTD
 /* Out of GKI buffers */
 #define NFA_STATUS_NO_BUFFERS NFC_STATUS_NO_BUFFERS
 /* Protocol mismatch between API and activated one */
@@ -120,8 +83,6 @@
 /* NFA Handle definitions */
 
 /* The upper byte of NFA_HANDLE signifies the handle group */
-/* Connection handles           */
-#define NFA_HANDLE_GROUP_CONNECTION 0x0100
 /* NDEF Type Handler handles    */
 #define NFA_HANDLE_GROUP_NDEF_HANDLER 0x0200
 /* DH Card Emulation handles    */
@@ -130,12 +91,9 @@
 #define NFA_HANDLE_GROUP_EE 0x0400
 /* P2P handles                  */
 #define NFA_HANDLE_GROUP_P2P 0x0500
-/* SNEP handles                 */
-#define NFA_HANDLE_GROUP_SNEP 0x0700
 /* HCI handles                  */
 #define NFA_HANDLE_GROUP_HCI 0x0800
 /* Local NDEF message handle    */
-#define NFA_HANDLE_GROUP_LOCAL_NDEF 0x0900
 #define NFA_HANDLE_GROUP_MASK 0xFF00
 #define NFA_HANDLE_MASK 0x00FF
 
@@ -157,7 +115,6 @@
 /* NFC Technology F active mode */
 #define NFA_TECHNOLOGY_MASK_F_ACTIVE 0x80
 /* All supported technologies   */
-#define NFA_TECHNOLOGY_MASK_ALL 0xFF
 typedef uint8_t tNFA_TECHNOLOGY_MASK;
 
 /* Definitions for NFC protocol for RW, CE and P2P APIs */
@@ -173,11 +130,7 @@
 #define NFA_PROTOCOL_NFC_DEP NFC_PROTOCOL_NFC_DEP
 /* NFC_PROTOCOL_T5T in NCI2.0 and NFC_PROTOCOL_ISO15693 proprietary in NCI1.0*/
 #define NFA_PROTOCOL_T5T NFC_PROTOCOL_T5T
-#define NFA_PROTOCOL_B_PRIME NFC_PROTOCOL_B_PRIME
-#define NFA_PROTOCOL_KOVIO NFC_PROTOCOL_KOVIO
-#define NFA_PROTOCOL_MIFARE NFC_PROTOCOL_MIFARE
 #define NFA_PROTOCOL_INVALID 0xFF
-#define NFA_MAX_NUM_PROTOCOLS 8
 typedef uint8_t tNFA_NFC_PROTOCOL;
 
 /* Definitions for tNFA_PROTOCOL_MASK */
@@ -210,15 +163,10 @@
 #define NFA_T1T_HR_LEN T1T_HR_LEN
 /* Max UID length of T1/T2  */
 #define NFA_MAX_UID_LEN TAG_MAX_UID_LEN
-/* T1T UID length           */
-#define NFA_T1T_UID_LEN T1T_UID_LEN
 /* UID len for T1T cmds     */
 #define NFA_T1T_CMD_UID_LEN T1T_CMD_UID_LEN
 /* T2T UID length           */
-#define NFA_T2T_UID_LEN T2T_UID_LEN
 
-/* Tag is read only */
-#define NFA_RW_NDEF_FL_READ_ONLY RW_NDEF_FL_READ_ONLY
 /* Tag formated for NDEF */
 #define NFA_RW_NDEF_FL_FORMATED RW_NDEF_FL_FORMATED
 /* NDEF supported by the tag */
@@ -227,12 +175,6 @@
 #define NFA_RW_NDEF_FL_UNKNOWN RW_NDEF_FL_UNKNOWN
 /* Tag supports format operation */
 #define NFA_RW_NDEF_FL_FORMATABLE RW_NDEF_FL_FORMATABLE
-/* Tag can be soft locked */
-#define NFA_RW_NDEF_FL_SOFT_LOCKABLE RW_NDEF_FL_SOFT_LOCKABLE
-/* Tag can be hard locked */
-#define NFA_RW_NDEF_FL_HARD_LOCKABLE RW_NDEF_FL_HARD_LOCKABLE
-/* Tag is one time programmable */
-#define NFA_RW_NDEF_FL_OTP RW_NDEF_FL_OTP
 
 typedef uint8_t tNFA_RW_NDEF_FLAG;
 
@@ -247,7 +189,7 @@
 typedef struct {
   tNFA_STATUS status;    /* NFA_STATUS_OK if successful              */
   uint16_t tlv_size;     /* The length of TLV                        */
-  uint8_t param_tlvs[1]; /* TLV (Parameter ID-Len-Value byte stream) */
+  uint8_t* param_tlvs;   /* TLV (Parameter ID-Len-Value byte stream) */
 } tNFA_GET_CONFIG;
 
 /* Structure to store screen state */
@@ -269,10 +211,6 @@
 #define NFA_SCREEN_STATE_MASK 0x0F
 
 /* CONN_DISCOVER_PARAM */
-#define NFA_LISTEN_DH_NFCEE_ENABLE_MASK NCI_LISTEN_DH_NFCEE_ENABLE_MASK
-#define NFA_LISTEN_DH_NFCEE_DISABLE_MASK NCI_LISTEN_DH_NFCEE_DISABLE_MASK
-#define NFA_POLLING_DH_DISABLE_MASK NCI_POLLING_DH_DISABLE_MASK
-#define NFA_POLLING_DH_ENABLE_MASK NCI_POLLING_DH_ENABLE_MASK
 #define NFA_DM_PWR_MODE_FULL 0x04
 #define NFA_DM_PWR_MODE_OFF_SLEEP 0x00
 
@@ -318,13 +256,8 @@
 typedef enum {
   NFA_DTA_DEFAULT_MODE = 0x00000001,
   NFA_DTA_LLCP_MODE = 0x00000002,
-  NFA_DTA_SNEP_MODE = 0x00000003,
   NFA_DTA_HCEF_MODE = 0x00000004,
   NFA_DTA_CR8 = 0x00000080,
-  NFA_DTA_CR9 = 0x00000090,
-  NFA_DTA_CR10 = 0x000000A0,
-  NFA_DTA_CR11 = 0x000000B0,
-  NFA_DTA_CR12 = 0x000000C0,
 } tNFA_eDtaModes;
 
 /* NFA Connection Callback Events */
@@ -566,21 +499,6 @@
 /* Union of all connection callback structures */
 typedef union {
   tNFA_STATUS status;           /* NFA_POLL_ENABLED_EVT                 */
-                                /* NFA_POLL_DISABLED_EVT                */
-                                /* NFA_CE_UICC_LISTEN_CONFIGURED_EVT    */
-                                /* NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT */
-                                /* NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT */
-                                /* NFA_SELECT_RESULT_EVT                */
-                                /* NFA_DEACTIVATE_FAIL_EVT              */
-                                /* NFA_CE_NDEF_WRITE_START_EVT          */
-                                /* NFA_SELECT_CPLT_EVT                  */
-                                /* NFA_READ_CPLT_EVT                    */
-                                /* NFA_WRITE_CPLT_EVT                   */
-                                /* NFA_PRESENCE_CHECK_EVT               */
-                                /* NFA_FORMAT_CPLT_EVT                  */
-                                /* NFA_SET_TAG_RO_EVT                   */
-                                /* NFA_UPDATE_RF_PARAM_RESULT_EVT       */
-                                /* NFA_RW_INTF_ERROR_EVT                */
   tNFA_DISC_RESULT disc_result; /* NFA_DISC_RESULT_EVT                  */
   tNFA_ACTIVATED activated;     /* NFA_ACTIVATED_EVT                    */
   tNFA_DEACTIVATED deactivated; /* NFA_DEACTIVATED_EVT                  */
@@ -803,9 +721,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -1418,19 +1333,6 @@
                                         tNFA_VSC_CBACK* p_cback);
 
 /*******************************************************************************
-**
-** Function         NFA_SetTraceLevel
-**
-** Description      This function sets the trace level for NFA.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t NFA_SetTraceLevel(uint8_t new_level);
-
-/*******************************************************************************
-**
 ** Function:        NFA_EnableDTA_TypeMode
 **
 ** Description:     Initialize and get global DTA type mode from .conf
@@ -1441,6 +1343,17 @@
 extern void NFA_EnableDtamode(tNFA_eDtaModes eDtaMode);
 
 /*******************************************************************************
+** Function         NFA_GetNCIVersion
+**
+** Description      Called by higher layer to get the current nci
+**                  version of nfc.
+**
+** Returns          NCI version NCI2.0 / NCI1.0
+**
+*******************************************************************************/
+extern uint8_t NFA_GetNCIVersion();
+
+/*******************************************************************************
 ** Function:        NFA_SetPowerSubStateForScreenState
 **
 ** Description:     This function send the current screen state
@@ -1450,8 +1363,4 @@
 *******************************************************************************/
 extern tNFA_STATUS NFA_SetPowerSubStateForScreenState(uint8_t ScreenState);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_API_H */
diff --git a/src/nfa/include/nfa_ce_api.h b/src/nfa/include/nfa_ce_api.h
index 8acff20..55412b3 100644
--- a/src/nfa/include/nfa_ce_api.h
+++ b/src/nfa/include/nfa_ce_api.h
@@ -34,9 +34,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -232,8 +229,4 @@
 *******************************************************************************/
 extern tNFA_STATUS NFA_CeSetIsoDepListenTech(tNFA_TECHNOLOGY_MASK tech_mask);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_CE_API_H */
diff --git a/src/nfa/int/nfa_ce_int.h b/src/nfa/include/nfa_ce_int.h
similarity index 96%
rename from src/nfa/int/nfa_ce_int.h
rename to src/nfa/include/nfa_ce_int.h
index ef41242..d113cd3 100644
--- a/src/nfa/int/nfa_ce_int.h
+++ b/src/nfa/include/nfa_ce_int.h
@@ -34,9 +34,6 @@
 **  Constants and data types
 *****************************************************************************/
 
-/* ce status callback */
-typedef void tNFA_CE_STATUS_CBACK(tNFA_STATUS status);
-
 /* CE events */
 enum {
   /* device manager local device API events */
@@ -45,18 +42,12 @@
   NFA_CE_API_DEREG_LISTEN_EVT,
   NFA_CE_API_CFG_ISODEP_TECH_EVT,
   NFA_CE_ACTIVATE_NTF_EVT,
-  NFA_CE_DEACTIVATE_NTF_EVT,
+  NFA_CE_DEACTIVATE_NTF_EVT
 
-  NFA_CE_MAX_EVT
 };
 
 /* Listen registration types */
-enum {
-  NFA_CE_REG_TYPE_NDEF,
-  NFA_CE_REG_TYPE_ISO_DEP,
-  NFA_CE_REG_TYPE_FELICA,
-  NFA_CE_REG_TYPE_UICC
-};
+enum { NFA_CE_REG_TYPE_ISO_DEP, NFA_CE_REG_TYPE_FELICA, NFA_CE_REG_TYPE_UICC };
 typedef uint8_t tNFA_CE_REG_TYPE;
 
 /* data type for NFA_CE_API_CFG_LOCAL_TAG_EVT */
@@ -137,6 +128,8 @@
 #define NFA_CE_LISTEN_INFO_FELICA 0x00000200
 /* This is a listen_info for UICC                                   */
 #define NFA_CE_LISTEN_INFO_UICC 0x00000400
+/* App has not been notified of ACTIVATE_EVT yet for this HCEF NFCID2 */
+#define NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND 0x00010000
 
 /* Structure for listen look up table */
 typedef struct {
diff --git a/src/nfa/int/nfa_dm_int.h b/src/nfa/include/nfa_dm_int.h
similarity index 98%
rename from src/nfa/int/nfa_dm_int.h
rename to src/nfa/include/nfa_dm_int.h
index a527927..a7f61d8 100644
--- a/src/nfa/int/nfa_dm_int.h
+++ b/src/nfa/include/nfa_dm_int.h
@@ -24,6 +24,7 @@
 #ifndef NFA_DM_INT_H
 #define NFA_DM_INT_H
 
+#include <string>
 #include "nfa_api.h"
 #include "nfa_sys.h"
 #include "nfc_api.h"
@@ -140,7 +141,6 @@
   NFC_HDR hdr;
   uint16_t rf_disc_dur_ms;
 } tNFA_DM_API_SET_RF_DISC_DUR;
-#define NFA_RF_DISC_DURATION_MAX 0xFFFF
 
 /* data type for NFA_DM_API_REG_NDEF_HDLR_EVT */
 #define NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE 0x01
@@ -367,8 +367,6 @@
   NFA_DM_DISC_LRT_NFC_BP
 };
 
-/* SLP_REQ (HLTA) command */
-#define SLP_REQ_CMD 0x5000
 /* NFA_EE_MAX_TECH_ROUTE. only A, B, F, Bprime are supported by UICC now */
 #define NFA_DM_MAX_TECH_ROUTE 4
 
@@ -414,8 +412,6 @@
 /* Default handler entry in ndef_handler table      */
 #define NFA_NDEF_DEFAULT_HANDLER_IDX 0
 
-#define NFA_PARAM_ID_INVALID 0xFF
-
 /* Maximum number of pending SetConfigs */
 #define NFA_DM_SETCONFIG_PENDING_MAX 32
 
@@ -598,7 +594,6 @@
 #define nfa_snep_init(is_dta_mode)
 #endif
 
-void nfa_dta_init(void);
 #if (NFC_NFCEE_INCLUDED == TRUE)
 void nfa_ee_init(void);
 void nfa_hci_init(void);
@@ -631,12 +626,12 @@
 bool nfa_dm_act_power_off_sleep(tNFA_DM_MSG* p_data);
 bool nfa_dm_ndef_reg_hdlr(tNFA_DM_MSG* p_data);
 bool nfa_dm_ndef_dereg_hdlr(tNFA_DM_MSG* p_data);
-bool nfa_dm_tout(tNFA_DM_MSG* p_data);
+
 bool nfa_dm_act_reg_vsc(tNFA_DM_MSG* p_data);
 bool nfa_dm_act_send_vsc(tNFA_DM_MSG* p_data);
 uint16_t nfa_dm_act_get_rf_disc_duration();
 bool nfa_dm_act_disable_timeout(tNFA_DM_MSG* p_data);
-bool nfa_dm_act_nfc_cback_data(tNFA_DM_MSG* p_data);
+
 bool nfa_dm_set_power_sub_state(tNFA_DM_MSG* p_data);
 
 void nfa_dm_proc_nfcc_power_mode(uint8_t nfcc_power_mode);
@@ -680,8 +675,6 @@
   memset(ha, NFC_DH_ID, NFA_DM_MAX_TECH_ROUTE);
 #endif
 
-#if (BT_TRACE_VERBOSE == TRUE)
-char* nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event);
-#endif
+std::string nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event);
 
 #endif /* NFA_DM_INT_H */
diff --git a/src/nfa/int/nfa_dta_int.h b/src/nfa/include/nfa_dta_int.h
similarity index 62%
rename from src/nfa/int/nfa_dta_int.h
rename to src/nfa/include/nfa_dta_int.h
index c050292..c844c07 100644
--- a/src/nfa/int/nfa_dta_int.h
+++ b/src/nfa/include/nfa_dta_int.h
@@ -36,29 +36,9 @@
 /*****************************************************************************
 **  DTA definitions
 *****************************************************************************/
-#define NFA_DTA_PATTERN_NUMBER_INVALID 0xFFFF
-
-#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SAP 0x1200
-#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SN 0x1240
-#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SNL 0x1280
-
-#define NFA_DTA_PATTERN_NUMBER_SNEP_SERVER_ONLY 0x1300
-#define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_SHORT_NDEF 0x1301
-#define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_LONG_NDEF 0x1302
-#define NFA_DTA_PATTERN_NUMBER_SNEP_EXTENDED_GET 0x1303
 
 #define NFA_DTA_DISCOVER_PARAMS_MAX 6
 
-/* Header length for long NDEF text message */
-#define NDEF_WKT_TEXT_HDR_LEN 7
-/* Size of NDEF message for T3T write-tests ([DTA] $5.5.6) */
-#define NFA_DTA_T3T_WRITE_NDEF_SIZE 192
-/* System code to use for T3T Listen mode tests */
-#define NFA_DTA_T3T_LISTEN_SYSTEMCODE 0xBABE
-
-/* Maximum protocol preference rank */
-#define NFA_PROTOCOL_RANK_INVALID 0xFF
-
 #define NFA_DTA_SCRATCH_BUF_SIZE T3T_MSG_BLOCKSIZE
 
 #ifndef NFA_DTA_DEFAULT_CO_OUT_DSAP
@@ -87,12 +67,7 @@
 enum {
   /* device manager local device API events */
   NFA_DTA_API_ENABLE_EVT = NFA_SYS_EVT_START(NFA_ID_DTA),
-  NFA_DTA_API_DISABLE_EVT,
-  NFA_DTA_API_CONFIG_EVT,
   NFA_DTA_API_START_EVT,
-  NFA_DTA_API_STOP_EVT,
-  NFA_DTA_ACTIVATE_EVT,
-  NFA_DTA_DEACTIVATE_EVT,
   NFA_DTA_DATA_CBACK_EVT,
 
   NFA_DTA_MAX_EVT
@@ -136,16 +111,8 @@
   tNFC_CONN data;
 } tNFA_DTA_NFCDEP_DATA;
 
-enum { NFA_DTA_LLCP_CONNECT_CO_ECHO_OUT, NFA_DTA_LLCP_DISCONNECT_CO_ECHO_OUT };
 typedef uint8_t tNFA_DTA_LLCP_EVT;
 
-enum {
-  NFA_DTA_RW_DATA,
-  NFA_DTA_CE_DATA,
-  NFA_DTA_NFCDEP_DATA,
-  NFA_DTA_LLCP_DATA
-};
-
 typedef uint8_t tNFA_DTA_DATA_TYPE;
 
 typedef struct {
@@ -168,39 +135,16 @@
   tNFA_DTA_DATA_CBACK data_cback;
 } tNFA_DTA_MSG;
 
-/* DTA states */
-enum {
-  NFA_DTA_ST_IDLE,
-  NFA_DTA_ST_DISCOVER, /* Polling/Listening */
-  NFA_DTA_ST_ACTIVATED /* Activated, listen mode */
-};
 typedef uint8_t tNFA_DTA_STATE;
 
-/* DTA Substates (while in ACTIVATED state) - substate enumerations are found in
- * protocol-specific files (nfa_dta_XXX.c) */
-#define NFA_DTA_SST_IDLE 0
 typedef uint8_t tNFA_DTA_SUBSTATE;
 
-/* DTA discovery states */
-enum {
-  NFA_DTA_DISC_STATE_IDLE,
-  NFA_DTA_DISC_STATE_DISCOVERY,
-  NFA_DTA_DISC_STATE_POLL_ACTIVE,
-  NFA_DTA_DISC_STATE_W4_ALL_DISCOVERIES,
-  NFA_DTA_DISC_STATE_W4_HOST_SELECT,
-  NFA_DTA_DISC_STATE_LISTEN_ACTIVE,
-  NFA_DTA_DISC_STATE_LISTEN_SLEEP,
-  NFA_DTA_DISC_STATE_MAX
-};
-
 /*****************************************************************************
 * DTA control block definitions
 *****************************************************************************/
 
 /* NDEF buffer definitions */
 enum {
-  NFA_DTA_BUF_READ,  /* Buffer for RW Read requests */
-  NFA_DTA_BUF_WRITE, /* Buffer for RW Write requests */
   NFA_DTA_BUF_MAX
 };
 
@@ -211,27 +155,9 @@
   uint32_t offset; /* current read/write offset */
 } tNFA_DTA_BUF_CB;
 
-/* T4T listen mode test application */
-enum {
-  NFA_DTA_T4T_CE_APP_NONE,     /* Not selected */
-  NFA_DTA_T4T_CE_APP_LOOPBACK, /* loopback test applicaiton */
-  NFA_DTA_T4T_CE_APP_PROP      /* propretary test application */
-};
-
 /* DTA test step command */
 typedef tNFC_STATUS (*tNFA_DTA_CMD_FCN)(void*);
 
-/* dta control block flags */
-#define NFA_DTA_FL_ENABLED 0x00000001 /* DTA is enabled */
-/* Automatically start discovery when NFC is enabled */
-#define NFA_DTA_FL_AUTOSTART 0x00000002
-/* DTA is stopping (NFA_DtaStop called) */
-#define NFA_DTA_FL_STOPPING 0x00000004
-/* DTA is being disabled (NFA_DtaDisable called) */
-#define NFA_DTA_FL_DISABLING 0x00000008
-/* T4T/NFCDEP is deactivating to IDLE (need to DESELECT first) */
-#define NFA_DTA_FL_T4T_DESELECT_DEACT 0x00000010
-
 /* DTA control block */
 typedef struct {
   uint32_t dta_flags; /* dta_flags must be first item in structure (statically
@@ -293,11 +219,6 @@
   uint16_t llcp_co_out_remote_miu; /* MIU of LT-CO-OUT-DEST */
   uint8_t llcp_co_out_remote_rw;   /* RW of LT-CO-OUT-DEST  */
 
-/* establishing outbound on connection-oriented */
-#define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTING 0x01
-/* established outbound on connection-oriented  */
-#define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTED 0x02
-
   uint8_t llcp_flags;      /* internal flags for LLCP echo test */
   uint8_t llcp_sdp_tid_cl; /* SDP transaction ID for outbound connectionless */
   uint8_t
@@ -345,75 +266,6 @@
 /*****************************************************************************
 * DTA internal funciton protoytpes
 *****************************************************************************/
-/* Internal function prototypes */
-void nfa_dta_deactivate(uint8_t deactivate_type);
-void nfa_dta_shutdown(void);
-void nfa_dta_discover_start(void);
-
-/* nfa_sys handler for DTA */
-bool nfa_dta_evt_hdlr(NFC_HDR* p_msg);
-void nfa_dta_sys_disable(void);
-
-/* State machine action functions */
-bool nfa_dta_enable(tNFA_DTA_MSG* p_data);
-bool nfa_dta_disable(tNFA_DTA_MSG* p_data);
-bool nfa_dta_config(tNFA_DTA_MSG* p_data);
-bool nfa_dta_start(tNFA_DTA_MSG* p_data);
-bool nfa_dta_handle_deact(tNFA_DTA_MSG* p_data);
-bool nfa_dta_stop(tNFA_DTA_MSG* p_data);
-bool nfa_dta_run_test(tNFA_DTA_MSG* p_data);
-bool nfa_dta_proc_data(tNFA_DTA_MSG* p_msg_data);
-
-/* Utility functions */
-void nfa_dta_test_set_state(tNFA_DTA_STATE state);
-void nfa_dta_test_set_substate(tNFA_DTA_SUBSTATE substate);
-void nfa_dta_free_ndef_buf(uint8_t ndef_idx);
-uint8_t* nfa_dta_realloc_buf(uint8_t ndef_idx, uint32_t size);
-void nfa_dta_t3t_nfcid_rand(uint8_t nfcid2[NCI_RF_F_UID_LEN]);
-
-/* Test function entry points (in nfa_dta_XXX.c) */
-void nfa_dta_nfcdep_poll_test_start(void);
-void nfa_dta_nfcdep_proc_data(tNFC_CONN_EVT event, tNFC_CONN* p_data);
-void nfa_dta_t1t_poll_test_start(void);
-void nfa_dta_t2t_poll_test_start(void);
-void nfa_dta_t3t_poll_test_start(void);
-void nfa_dta_t4t_poll_test_start(void);
-
-void nfa_dta_nfcdep_listen_test_start(void);
-void nfa_dta_t3t_listen_test_start(void);
-void nfa_dta_t4t_listen_test_start(void);
-
-void nfa_dta_t1t_rw_cback(uint8_t event, tRW_DATA* p_data);
-void nfa_dta_t2t_rw_cback(uint8_t event, tRW_DATA* p_data);
-void nfa_dta_t3t_rw_cback(uint8_t event, tRW_DATA* p_data);
-void nfa_dta_t4t_rw_cback(uint8_t event, tRW_DATA* p_data);
-
-void nfa_dta_t3t_ce_cback(uint8_t event, tCE_DATA* p_data);
-void nfa_dta_t4t_ce_cback(uint8_t event, tCE_DATA* p_data);
-
-void nfa_dta_ce_cback(uint8_t event, tCE_DATA* p_ce_data);
-
-void nfa_dta_t4t_register_apps(void);
-void nfa_dta_t4t_deregister_apps(void);
-
-void nfa_dta_llcp_init(void);
-void nfa_dta_llcp_set_gen_bytes(void);
-void nfa_dta_llcp_clear_gen_bytes(void);
-void nfa_dta_llcp_register_pattern_number_service(void);
-void nfa_dta_llcp_deregister_pattern_number_service(void);
-void nfa_dta_llcp_register_echo(void);
-void nfa_dta_llcp_deregister_echo(void);
-void nfa_dta_llcp_activate_link(void);
-void nfa_dta_llcp_connect_co_echo_out(void);
-void nfa_dta_llcp_disconnect_co_echo_out(void);
-
-void nfa_dta_snep_init(void);
-void nfa_dta_snep_register(void);
-void nfa_dta_snep_deregister(void);
-
-void nfa_dta_emvco_pcd_config_nfcc(bool enable);
-void nfa_dta_emvco_pcd_start(void);
-void nfa_dta_emvco_pcd_cback(uint8_t event, tRW_DATA* p_data);
 
 extern uint8_t* p_nfa_dta_brcm_start_up_cfg;
 extern uint8_t nfa_dta_brcm_start_up_cfg_len;
diff --git a/src/nfa/include/nfa_ee_api.h b/src/nfa/include/nfa_ee_api.h
index f4acbe0..78d0fe7 100644
--- a/src/nfa/include/nfa_ee_api.h
+++ b/src/nfa/include/nfa_ee_api.h
@@ -33,7 +33,6 @@
 *****************************************************************************/
 /* 16 per ISO 7816 specification    */
 #define NFA_MAX_AID_LEN NFC_MAX_AID_LEN
-#define NFA_EE_HANDLE_DH (NFA_HANDLE_GROUP_EE | NFC_DH_ID)
 
 /* NFA EE callback events */
 enum {
@@ -42,9 +41,13 @@
   NFA_EE_DEREGISTER_EVT, /* The status for NFA_EeDeregister () */
   NFA_EE_MODE_SET_EVT, /* The status for activating or deactivating an NFCEE */
   NFA_EE_ADD_AID_EVT,  /* The status for adding an AID to a routing table entry
-                          */
-  NFA_EE_REMOVE_AID_EVT, /* The status for removing an AID from a routing table
-                            */
+                        */
+  NFA_EE_REMOVE_AID_EVT,  /* The status for removing an AID from a routing table
+                           */
+  NFA_EE_ADD_SYSCODE_EVT, /* The status for adding an System Code to a routing
+                             table entry */
+  NFA_EE_REMOVE_SYSCODE_EVT, /* The status for removing an System Code from
+                              routing table */
   NFA_EE_REMAINING_SIZE_EVT, /* The remaining size of the Listen Mode Routing
                                 Table   */
   NFA_EE_SET_TECH_CFG_EVT,   /* The status for setting the routing based on RF
@@ -58,33 +61,16 @@
   NFA_EE_NEW_EE_EVT, /* A new NFCEE is discovered                             */
   NFA_EE_ACTION_EVT, /* An action happened in NFCEE                           */
   NFA_EE_DISCOVER_REQ_EVT, /* NFCEE Discover Request Notification */
-  NFA_EE_ROUT_ERR_EVT,     /* Error - exceed NFCC CE Routing size */
   NFA_EE_NO_MEM_ERR_EVT,   /* Error - out of GKI buffers */
   NFA_EE_NO_CB_ERR_EVT /* Error - Can not find control block or wrong state */
 };
 typedef uint8_t tNFA_EE_EVT;
 
 /* tNFA_NFCEE_INTERFACE values */
-/* APDU Interface       */
-#define NFA_EE_INTERFACE_APDU NFC_NFCEE_INTERFACE_APDU
 /* HCI Access Interface*/
 #define NFA_EE_INTERFACE_HCI_ACCESS NFC_NFCEE_INTERFACE_HCI_ACCESS
-/* T3T Command Interface*/
-#define NFA_EE_INTERFACE_T3T NFC_NFCEE_INTERFACE_T3T
-/* Transparent Interface*/
-#define NFA_EE_INTERFACE_TRANSPARENT NFC_NFCEE_INTERFACE_TRANSPARENT
-/* Proprietary          */
-#define NFA_EE_INTERFACE_PROPRIETARY NFC_NFCEE_INTERFACE_PROPRIETARY
 typedef uint8_t tNFA_EE_INTERFACE;
 
-/* HW/Registration ID   */
-#define NFA_EE_TAG_HW_ID NFC_NFCEE_TAG_HW_ID
-/* ATR Bytes            */
-#define NFA_EE_TAG_ATR_BYTES NFC_NFCEE_TAG_ATR_BYTES
-/* T3T Supplement. Info */
-#define NFA_EE_TAG_T3T_INFO NFC_NFCEE_TAG_T3T_INFO
-/* Broadcom Proprietary */
-#define NFA_EE_TAG_HCI_HOST_ID NFC_NFCEE_TAG_HCI_HOST_ID
 typedef uint8_t tNFA_EE_TAG;
 
 /* for NFA_EeModeSet () */
@@ -98,9 +84,6 @@
 #define NFA_EE_PWR_STATE_SWITCH_OFF 0x02
 /* The device's battery is removed  */
 #define NFA_EE_PWR_STATE_BATT_OFF 0x04
-/* used to remove a particular technology or protocol based routing cfg of a
- * handle from the routing table. */
-#define NFA_EE_PWR_STATE_NONE 0
 typedef uint8_t tNFA_EE_PWR_STATE;
 
 /* NFCEE connected and inactive */
@@ -111,10 +94,6 @@
 #define NFA_EE_STATUS_REMOVED NFC_NFCEE_STATUS_REMOVED
 /* waiting for response from NFCC */
 #define NFA_EE_STATUS_PENDING 0x10
-#define NFA_EE_STATUS_ACTIVATING \
-  (NFA_EE_STATUS_PENDING + NFC_NFCEE_STATUS_ACTIVE)
-#define NFA_EE_STATUS_DEACTIVATING \
-  (NFA_EE_STATUS_PENDING + NFC_NFCEE_STATUS_INACTIVE)
 typedef uint8_t tNFA_EE_STATUS;
 
 /* additional NFCEE Info */
@@ -132,6 +111,7 @@
       ee_interface[NFC_MAX_EE_INTERFACE]; /* NFCEE supported interface */
   uint8_t num_tlvs;                       /* number of TLVs           */
   tNFA_EE_TLV ee_tlv[NFC_MAX_EE_TLVS];    /* the TLV                  */
+  uint8_t ee_power_supply_status;         /* The NFCEE Power supply */
 } tNFA_EE_INFO;
 
 typedef struct {
@@ -147,14 +127,6 @@
       ee_interface; /* NFCEE interface associated with this connection  */
 } tNFA_EE_CONNECT;
 
-/* ISO 7816-4 SELECT command */
-#define NFA_EE_TRGR_SELECT NFC_EE_TRIG_SELECT
-/* RF Protocol changed       */
-#define NFA_EE_TRGR_RF_PROTOCOL NFC_EE_TRIG_RF_PROTOCOL
-/* RF Technology changed     */
-#define NFA_EE_TRGR_RF_TECHNOLOGY NFC_EE_TRIG_RF_TECHNOLOGY
-/* Application initiation    */
-#define NFA_EE_TRGR_APP_INIT NFC_EE_TRIG_APP_INIT
 typedef tNFC_EE_TRIGGER tNFA_EE_TRIGGER;
 
 /* Union of NFCEE action parameter depending on the associated trigger */
@@ -215,6 +187,8 @@
   tNFA_STATUS deregister;
   tNFA_STATUS add_aid;
   tNFA_STATUS remove_aid;
+  tNFA_STATUS add_sc;
+  tNFA_STATUS remove_sc;
   tNFA_STATUS set_tech;
   tNFA_STATUS set_proto;
   uint16_t size;
@@ -231,9 +205,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -335,7 +306,10 @@
 extern tNFA_STATUS NFA_EeSetDefaultTechRouting(
     tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
     tNFA_TECHNOLOGY_MASK technologies_switch_off,
-    tNFA_TECHNOLOGY_MASK technologies_battery_off);
+    tNFA_TECHNOLOGY_MASK technologies_battery_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off_lock);
 
 /*******************************************************************************
 **
@@ -361,7 +335,10 @@
 extern tNFA_STATUS NFA_EeSetDefaultProtoRouting(
     tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
     tNFA_PROTOCOL_MASK protocols_switch_off,
-    tNFA_PROTOCOL_MASK protocols_battery_off);
+    tNFA_PROTOCOL_MASK protocols_battery_off,
+    tNFA_PROTOCOL_MASK technologies_screen_lock,
+    tNFA_PROTOCOL_MASK technologies_screen_off,
+    tNFA_PROTOCOL_MASK technologies_screen_off_lock);
 
 /*******************************************************************************
 **
@@ -412,6 +389,54 @@
 extern tNFA_STATUS NFA_EeRemoveAidRouting(uint8_t aid_len, uint8_t* p_aid);
 
 /*******************************************************************************
+ **
+ ** Function         NFA_EeAddSystemCodeRouting
+ **
+ ** Description      This function is called to add an system code entry in the
+ **                  listen mode routing table in NFCC. The status of this
+ **                  operation is reported as the NFA_EE_ADD_SYSCODE_EVT.
+ **
+ ** Note:            If RF discovery is started,
+ **                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
+ **                  happen before calling this function
+ **
+ ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
+ **                  function to change the listen mode routing is called.
+ **
+ ** Returns          NFA_STATUS_OK if successfully initiated
+ **                  NFA_STATUS_FAILED otherwise
+ **                  NFA_STATUS_INVALID_PARAM If bad parameter
+ **
+ *******************************************************************************/
+extern tNFA_STATUS NFA_EeAddSystemCodeRouting(uint16_t systemcode,
+                                              tNFA_HANDLE ee_handle,
+                                              tNFA_EE_PWR_STATE power_state);
+
+/*******************************************************************************
+**
+** Function         NFA_EeRemoveSystemCodeRouting
+**
+** Description      This function is called to remove the given System Code
+*based entry from
+**                  the listen mode routing table. The status of this operation
+*is reported
+**                  as the NFA_EE_REMOVE_SYSCODE_EVT.
+**
+** Note:            If RF discovery is started,
+**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
+**                  happen before calling this function
+**
+** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
+**                  function to change the listen mode routing is called.
+**
+** Returns          NFA_STATUS_OK if successfully initiated
+**                  NFA_STATUS_FAILED otherwise
+**                  NFA_STATUS_INVALID_PARAM If bad parameter
+**
+*******************************************************************************/
+extern tNFA_STATUS NFA_EeRemoveSystemCodeRouting(uint16_t systemcode);
+
+/*******************************************************************************
 **
 ** Function         NFA_EeGetLmrtRemainingSize
 **
@@ -492,8 +517,4 @@
 *******************************************************************************/
 extern tNFA_STATUS NFA_EeDisconnect(tNFA_HANDLE ee_handle);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_EE_API_H */
diff --git a/src/nfa/int/nfa_ee_int.h b/src/nfa/include/nfa_ee_int.h
similarity index 81%
rename from src/nfa/int/nfa_ee_int.h
rename to src/nfa/include/nfa_ee_int.h
index 28b049d..5c933ab 100644
--- a/src/nfa/int/nfa_ee_int.h
+++ b/src/nfa/include/nfa_ee_int.h
@@ -30,7 +30,6 @@
 /*****************************************************************************
 **  Constants and data types
 *****************************************************************************/
-#define NFA_EE_DEBUG BT_TRACE_VERBOSE
 /* the number of tNFA_EE_ECBs (for NFCEEs and DH) */
 #define NFA_EE_NUM_ECBS (NFA_EE_MAX_EE_SUPPORTED + 1)
 /* The index for DH in nfa_ee_cb.ee_cb[] */
@@ -54,6 +53,8 @@
   NFA_EE_API_SET_PROTO_CFG_EVT,
   NFA_EE_API_ADD_AID_EVT,
   NFA_EE_API_REMOVE_AID_EVT,
+  NFA_EE_API_ADD_SYSCODE_EVT,
+  NFA_EE_API_REMOVE_SYSCODE_EVT,
   NFA_EE_API_LMRT_SIZE_EVT,
   NFA_EE_API_UPDATE_NOW_EVT,
   NFA_EE_API_CONNECT_EVT,
@@ -72,6 +73,7 @@
   NFA_EE_ROUT_TIMEOUT_EVT,
   NFA_EE_DISCV_TIMEOUT_EVT,
   NFA_EE_CFG_TO_NFCC_EVT,
+  NFA_EE_NCI_NFCEE_STATUS_NTF_EVT,
   NFA_EE_MAX_EVT
 
 };
@@ -98,13 +100,17 @@
   NFA_EE_CONN_ST_NONE, /* not connected */
   NFA_EE_CONN_ST_WAIT, /* connection is initiated; waiting for ack */
   NFA_EE_CONN_ST_CONN, /* connected; can send/receive data */
-  NFA_EE_CONN_ST_DISC, /* disconnecting; waiting for ack */
-  NFA_EE_CONN_ST_MAX
+  NFA_EE_CONN_ST_DISC  /* disconnecting; waiting for ack */
 };
 typedef uint8_t tNFA_EE_CONN_ST;
 
 #define NFA_EE_MAX_AID_CFG_LEN (510)
-#define NFA_EE_7816_STATUS_LEN (2)
+
+#define NFA_EE_SYSTEM_CODE_LEN 02
+#define NFA_EE_SYSTEM_CODE_TLV_SIZE 06
+#define NFA_EE_MAX_SYSTEM_CODE_ENTRIES 10
+#define NFA_EE_MAX_SYSTEM_CODE_CFG_LEN \
+  (NFA_EE_MAX_SYSTEM_CODE_ENTRIES * NFA_EE_SYSTEM_CODE_TLV_SIZE)
 
 /* NFA EE control block flags:
  * use to indicate an API function has changed the configuration of the
@@ -116,6 +122,8 @@
 #define NFA_EE_ECB_FLAGS_PROTO 0x04
 /* AID routing changed                */
 #define NFA_EE_ECB_FLAGS_AID 0x08
+/* System Code routing changed        */
+#define NFA_EE_ECB_FLAGS_SYSCODE 0xE0
 /* VS changed                         */
 #define NFA_EE_ECB_FLAGS_VS 0x10
 /* Restore related                    */
@@ -142,12 +150,24 @@
       tech_switch_off; /* default routing - technologies switch_off */
   tNFA_TECHNOLOGY_MASK
       tech_battery_off; /* default routing - technologies battery_off*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_lock; /* default routing - technologies screen_lock*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_off; /* default routing - technologies screen_off*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_off_lock; /* default routing - technologies screen_off_lock*/
   tNFA_PROTOCOL_MASK
       proto_switch_on; /* default routing - protocols switch_on     */
   tNFA_PROTOCOL_MASK
       proto_switch_off; /* default routing - protocols switch_off    */
   tNFA_PROTOCOL_MASK
       proto_battery_off;     /* default routing - protocols battery_off   */
+  tNFA_PROTOCOL_MASK
+      proto_screen_lock; /* default routing - protocols screen_lock    */
+  tNFA_PROTOCOL_MASK
+      proto_screen_off; /* default routing - protocols screen_off  */
+  tNFA_PROTOCOL_MASK
+      proto_screen_off_lock; /* default routing - protocols screen_off_lock  */
   tNFA_EE_CONN_ST conn_st;   /* connection status */
   uint8_t conn_id;           /* connection id */
   tNFA_EE_CBACK* p_ee_cback; /* the callback function */
@@ -174,6 +194,7 @@
   tNFA_EE_TLV ee_tlv[NFC_MAX_EE_TLVS];    /* the TLV */
   uint8_t num_interface;                  /* number of Target interface */
   uint8_t num_tlvs;                       /* number of TLVs */
+  uint8_t ee_power_supply_status;         /* power supply of NFCEE*/
   tNFA_EE_ECB_FLAGS ecb_flags;            /* the flags of this control block */
   tNFA_EE_INTERFACE use_interface; /* NFCEE interface used for the connection */
   tNFA_NFC_PROTOCOL la_protocol;   /* Listen A protocol    */
@@ -183,6 +204,14 @@
   uint8_t size_mask; /* the size for technology and protocol routing */
   uint16_t size_aid; /* the size for aid routing */
   uint8_t aid_info[NFA_EE_MAX_AID_ENTRIES]; /* Aid Info Prefix/Suffix/Exact */
+  /*System Code Based Routing Variables*/
+  uint8_t sys_code_cfg[NFA_EE_MAX_SYSTEM_CODE_ENTRIES * NFA_EE_SYSTEM_CODE_LEN];
+  uint8_t sys_code_pwr_cfg[NFA_EE_MAX_SYSTEM_CODE_ENTRIES];
+  uint8_t sys_code_rt_loc[NFA_EE_MAX_SYSTEM_CODE_ENTRIES];
+  uint8_t sys_code_rt_loc_vs_info[NFA_EE_MAX_SYSTEM_CODE_ENTRIES];
+  /* The number of SC entries in sys_code_cfg buffer*/
+  uint8_t sys_code_cfg_entries;
+  uint16_t size_sys_code; /* The size for system code routing */
 } tNFA_EE_ECB;
 
 /* data type for NFA_EE_API_DISCOVER_EVT */
@@ -219,6 +248,9 @@
   tNFA_TECHNOLOGY_MASK technologies_switch_on;
   tNFA_TECHNOLOGY_MASK technologies_switch_off;
   tNFA_TECHNOLOGY_MASK technologies_battery_off;
+  tNFA_TECHNOLOGY_MASK technologies_screen_lock;
+  tNFA_TECHNOLOGY_MASK technologies_screen_off;
+  tNFA_TECHNOLOGY_MASK technologies_screen_off_lock;
 } tNFA_EE_API_SET_TECH_CFG;
 
 /* data type for NFA_EE_API_SET_PROTO_CFG_EVT */
@@ -229,6 +261,9 @@
   tNFA_PROTOCOL_MASK protocols_switch_on;
   tNFA_PROTOCOL_MASK protocols_switch_off;
   tNFA_PROTOCOL_MASK protocols_battery_off;
+  tNFA_PROTOCOL_MASK protocols_screen_lock;
+  tNFA_PROTOCOL_MASK protocols_screen_off;
+  tNFA_PROTOCOL_MASK protocols_screen_off_lock;
 } tNFA_EE_API_SET_PROTO_CFG;
 
 /* data type for NFA_EE_API_ADD_AID_EVT */
@@ -249,6 +284,21 @@
   uint8_t* p_aid;
 } tNFA_EE_API_REMOVE_AID;
 
+/* data type for NFA_EE_API_ADD_SYSCODE_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  tNFA_EE_ECB* p_cb;
+  uint8_t nfcee_id;
+  uint16_t syscode;
+  tNFA_EE_PWR_STATE power_state;
+} tNFA_EE_API_ADD_SYSCODE;
+
+/* data type for NFA_EE_API_REMOVE_SYSCODE_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  uint16_t syscode;
+} tNFA_EE_API_REMOVE_SYSCODE;
+
 /* data type for NFA_EE_API_LMRT_SIZE_EVT */
 typedef NFC_HDR tNFA_EE_API_LMRT_SIZE;
 
@@ -277,11 +327,6 @@
   uint8_t nfcee_id;
 } tNFA_EE_API_DISCONNECT;
 
-typedef struct {
-  NFC_HDR hdr;
-  tNFC_STATUS status; /* The event status. */
-} tNFA_EE_MSG_STATUS;
-
 /* common data type for internal events with nfa_ee_use_cfg_cb[] as TRUE */
 typedef struct {
   NFC_HDR hdr;
@@ -289,12 +334,6 @@
   uint8_t nfcee_id;
 } tNFA_EE_CFG_HDR;
 
-/* data type for tNFC_RESPONSE_EVT */
-typedef struct {
-  NFC_HDR hdr;
-  void* p_data;
-} tNFA_EE_NCI_RESPONSE;
-
 /* data type for NFA_EE_NCI_DISC_RSP_EVT */
 typedef struct {
   NFC_HDR hdr;
@@ -340,6 +379,12 @@
   tNFC_EE_DISCOVER_REQ_REVT* p_data;
 } tNFA_EE_NCI_DISC_REQ;
 
+/* data type for NFA_EE_NCI_NFCEE_STATUS_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  tNFC_NFCEE_STATUS_REVT* p_data;
+} tNFA_EE_NCI_NFCEE_STATUS_NTF;
+
 /* union of all event data types */
 typedef union {
   NFC_HDR hdr;
@@ -352,6 +397,8 @@
   tNFA_EE_API_SET_PROTO_CFG set_proto;
   tNFA_EE_API_ADD_AID add_aid;
   tNFA_EE_API_REMOVE_AID rm_aid;
+  tNFA_EE_API_ADD_SYSCODE add_syscode;
+  tNFA_EE_API_REMOVE_SYSCODE rm_syscode;
   tNFA_EE_API_LMRT_SIZE lmrt_size;
   tNFA_EE_API_CONNECT connect;
   tNFA_EE_API_SEND_DATA send_data;
@@ -363,6 +410,7 @@
   tNFA_EE_NCI_CONN conn;
   tNFA_EE_NCI_ACTION act;
   tNFA_EE_NCI_DISC_REQ disc_req;
+  tNFA_EE_NCI_NFCEE_STATUS_NTF nfcee_status_ntf;
 } tNFA_EE_MSG;
 
 /* type for State Machine (SM) action functions */
@@ -377,7 +425,6 @@
 
 /* the following status are the definition used in ee_cfg_sts */
 #define NFA_EE_STS_CHANGED_ROUTING 0x01
-#define NFA_EE_STS_CHANGED_VS 0x02
 #define NFA_EE_STS_CHANGED 0x0f
 #define NFA_EE_STS_PREV_ROUTING 0x10
 #define NFA_EE_STS_PREV 0xf0
@@ -406,6 +453,12 @@
 #define NFA_EE_DISC_STS_OFF 0x01
 /* received NFCEE DISCOVER REQ NTF  */
 #define NFA_EE_DISC_STS_REQ 0x02
+/* received NFA_EE_MODE_SET_COMPLETE  */
+#define NFA_EE_MODE_SET_COMPLETE 0x03
+/* initialize EE_RECOVERY             */
+#define NFA_EE_RECOVERY_INIT 0x04
+/* update ee config during EE_RECOVERY */
+#define NFA_EE_RECOVERY_REDISCOVERED 0x05
 typedef uint8_t tNFA_EE_DISC_STS;
 
 typedef void(tNFA_EE_ENABLE_DONE_CBACK)(tNFA_EE_DISC_STS status);
@@ -418,21 +471,21 @@
   tNFA_EE_CBACK* p_ee_cback[NFA_EE_MAX_CBACKS]; /* to report EE events       */
   tNFA_EE_CBACK* p_ee_disc_cback; /* to report EE discovery result    */
   tNFA_EE_ENABLE_DONE_CBACK*
-      p_enable_cback;        /* callback to notify on enable done*/
-  tNFA_EE_EM_STATE em_state; /* NFA-EE state initialized or not  */
-  uint8_t wait_rsp;          /* num of NCI rsp expected (update) */
-  uint8_t num_ee_expecting;  /* number of ee_info still expecting*/
-  uint8_t cur_ee;            /* the number of ee_info in cb      */
-  uint8_t ee_cfged;          /* the bit mask of configured ECBs  */
-  uint8_t ee_cfg_sts;        /* configuration status             */
-  tNFA_EE_WAIT ee_wait_evt;  /* Pending event(s) to be reported  */
-  tNFA_EE_FLAGS ee_flags;    /* flags                            */
+      p_enable_cback;          /* callback to notify on enable done*/
+  tNFA_EE_EM_STATE em_state;   /* NFA-EE state initialized or not  */
+  uint8_t wait_rsp;            /* num of NCI rsp expected (update) */
+  uint8_t num_ee_expecting;    /* number of ee_info still expecting*/
+  uint8_t cur_ee;              /* the number of ee_info in cb      */
+  uint8_t ee_cfged;            /* the bit mask of configured ECBs  */
+  uint8_t ee_cfg_sts;          /* configuration status             */
+  tNFA_EE_WAIT ee_wait_evt;    /* Pending event(s) to be reported  */
+  tNFA_EE_FLAGS ee_flags;      /* flags                            */
   uint8_t route_block_control; /* controls route block feature   */
+  bool isDiscoveryStopped;     /* discovery status                  */
 } tNFA_EE_CB;
 
 /* Order of Routing entries in Routing Table */
 #define NCI_ROUTE_ORDER_AID 0x01        /* AID routing order */
-#define NCI_ROUTE_ORDER_PATTERN 0x02    /* Pattern routing order*/
 #define NCI_ROUTE_ORDER_SYS_CODE 0x03   /* System Code routing order*/
 #define NCI_ROUTE_ORDER_PROTOCOL 0x04   /* Protocol routing order*/
 #define NCI_ROUTE_ORDER_TECHNOLOGY 0x05 /* Technology routing order*/
@@ -473,6 +526,8 @@
 void nfa_ee_api_set_proto_cfg(tNFA_EE_MSG* p_data);
 void nfa_ee_api_add_aid(tNFA_EE_MSG* p_data);
 void nfa_ee_api_remove_aid(tNFA_EE_MSG* p_data);
+void nfa_ee_api_add_sys_code(tNFA_EE_MSG* p_data);
+void nfa_ee_api_remove_sys_code(tNFA_EE_MSG* p_data);
 void nfa_ee_api_lmrt_size(tNFA_EE_MSG* p_data);
 void nfa_ee_api_update_now(tNFA_EE_MSG* p_data);
 void nfa_ee_api_connect(tNFA_EE_MSG* p_data);
@@ -482,6 +537,7 @@
 void nfa_ee_nci_disc_rsp(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_disc_ntf(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_mode_set_rsp(tNFA_EE_MSG* p_data);
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_wait_rsp(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_conn(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_action_ntf(tNFA_EE_MSG* p_data);
@@ -494,7 +550,8 @@
                          tNFA_EE_CBACK_DATA* p_data);
 tNFA_EE_ECB* nfa_ee_find_aid_offset(uint8_t aid_len, uint8_t* p_aid,
                                     int* p_offset, int* p_entry);
-void nfa_ee_remove_labels(void);
+tNFA_EE_ECB* nfa_ee_find_sys_code_offset(uint16_t sys_code, int* p_offset,
+                                         int* p_entry);
 int nfa_ee_find_total_aid_len(tNFA_EE_ECB* p_cb, int start_entry);
 void nfa_ee_start_timer(void);
 void nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK* p_cback);
diff --git a/src/nfa/include/nfa_hci_api.h b/src/nfa/include/nfa_hci_api.h
index 2a40f15..cb4aa0d 100644
--- a/src/nfa/include/nfa_hci_api.h
+++ b/src/nfa/include/nfa_hci_api.h
@@ -94,7 +94,7 @@
 /* Max HCI event length */
 #define NFA_MAX_HCI_RSP_LEN 255
 /* Max HCI event length */
-#define NFA_MAX_HCI_EVENT_LEN 260
+#define NFA_MAX_HCI_EVENT_LEN 300
 /* Max HCI data length */
 #define NFA_MAX_HCI_DATA_LEN 260
 
@@ -291,9 +291,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -468,26 +465,6 @@
 
 /*******************************************************************************
 **
-** Function         NFA_HciSetRegistry
-**
-** Description      This function requests a peer host to set the desired
-**                  registry field value for the gate that the pipe is on.
-**
-**                  When the peer host responds,the app is notified with
-**                  NFA_HCI_SET_REG_RSP_EVT or
-**                  if an error occurs in sending the command the app will be
-**                  notified by NFA_HCI_CMD_SENT_EVT
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_HciSetRegistry(tNFA_HANDLE hci_handle, uint8_t pipe,
-                                      uint8_t reg_inx, uint8_t data_size,
-                                      uint8_t* p_data);
-
-/*******************************************************************************
-**
 ** Function         NFA_HciSendCommand
 **
 ** Description      This function is called to send a command on a pipe created
@@ -507,23 +484,6 @@
 
 /*******************************************************************************
 **
-** Function         NFA_HciSendResponse
-**
-** Description      This function is called to send a response on a pipe created
-**                  by the application.
-**                  The app will be notified by NFA_HCI_RSP_SENT_EVT if an error
-**                  occurs.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_HciSendResponse(tNFA_HANDLE hci_handle, uint8_t pipe,
-                                       uint8_t response, uint8_t data_size,
-                                       uint8_t* p_data);
-
-/*******************************************************************************
-**
 ** Function         NFA_HciSendEvent
 **
 ** Description      This function is called to send any event on a pipe created
@@ -612,8 +572,4 @@
 *******************************************************************************/
 extern void NFA_HciDebug(uint8_t action, uint8_t size, uint8_t* p_data);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_P2P_API_H */
diff --git a/src/nfa/include/nfa_hci_defs.h b/src/nfa/include/nfa_hci_defs.h
index 67d5a33..2737531 100644
--- a/src/nfa/include/nfa_hci_defs.h
+++ b/src/nfa/include/nfa_hci_defs.h
@@ -31,13 +31,16 @@
 #define NFA_HCI_IDENTITY_MANAGEMENT_GATE 0x05
 
 #define NFA_HCI_FIRST_HOST_SPECIFIC_GENERIC_GATE 0x10
-#define NFA_HCI_LAST_HOST_SPECIFIC_GENERIC_GATE 0xEF
 #define NFA_HCI_FIRST_PROP_GATE 0xF0
 #define NFA_HCI_LAST_PROP_GATE 0xFF
 
 /* Generic Gates */
 #define NFA_HCI_CONNECTIVITY_GATE 0x41
 
+/* Proprietary Gates */
+#define NFA_HCI_PROP_GATE_FIRST 0xF0
+#define NFA_HCI_PROP_GATE_LAST 0xFF
+
 /* Static pipes */
 #define NFA_HCI_LINK_MANAGEMENT_PIPE 0x00
 #define NFA_HCI_ADMIN_PIPE 0x01
@@ -48,8 +51,6 @@
 
 /* host_table */
 #define NFA_HCI_HOST_CONTROLLER 0x00
-#define NFA_HCI_DH_HOST 0x01
-#define NFA_HCI_UICC_HOST 0x02
 
 /* Type of instruction */
 #define NFA_HCI_COMMAND_TYPE 0x00
@@ -105,13 +106,9 @@
 
 /* Host controller Admin gate registry identifiers */
 #define NFA_HCI_SESSION_IDENTITY_INDEX 0x01
-#define NFA_HCI_MAX_PIPE_INDEX 0x02
 #define NFA_HCI_WHITELIST_INDEX 0x03
 #define NFA_HCI_HOST_LIST_INDEX 0x04
 
-/* Host controller and DH Link management gate registry identifier */
-#define NFA_HCI_REC_ERROR_INDEX 0x02
-
 /* DH Identity management gate registry identifier */
 #define NFA_HCI_VERSION_SW_INDEX 0x01
 #define NFA_HCI_VERSION_HW_INDEX 0x03
diff --git a/src/nfa/int/nfa_hci_int.h b/src/nfa/include/nfa_hci_int.h
similarity index 94%
rename from src/nfa/int/nfa_hci_int.h
rename to src/nfa/include/nfa_hci_int.h
index ca84f4b..9158a4e 100644
--- a/src/nfa/int/nfa_hci_int.h
+++ b/src/nfa/include/nfa_hci_int.h
@@ -24,11 +24,15 @@
 #ifndef NFA_HCI_INT_H
 #define NFA_HCI_INT_H
 
+#include <string>
+#include "nfa_ee_api.h"
 #include "nfa_hci_api.h"
 #include "nfa_sys.h"
+extern uint8_t HCI_LOOPBACK_DEBUG;
 
-extern bool HCI_LOOPBACK_DEBUG;
-
+/* NFA HCI DEBUG states */
+#define NFA_HCI_DEBUG_ON 0x01
+#define NFA_HCI_DEBUG_OFF 0x00
 /*****************************************************************************
 **  Constants and data types
 *****************************************************************************/
@@ -38,8 +42,6 @@
 #define NFA_HCI_LAST_HOST_SPECIFIC_GATE 0xEF
 
 #define NFA_HCI_SESSION_ID_LEN 8 /* HCI Session ID length */
-/* Maximum pipes that can be created on a generic pipe  */
-#define NFA_MAX_PIPES_IN_GENERIC_GATE 0x0F
 
 /* HCI SW Version number                       */
 #define NFA_HCI_VERSION_SW 0x090000
@@ -71,14 +73,14 @@
  */
 #define NFA_HCI_STATE_RESTORE_NETWK_ENABLE 0x08
 
+#define NFA_HCI_STATE_EE_RECOVERY 0x09
+
 typedef uint8_t tNFA_HCI_STATE;
 
 /* NFA HCI PIPE states */
 #define NFA_HCI_PIPE_CLOSED 0x00 /* Pipe is closed */
 #define NFA_HCI_PIPE_OPENED 0x01 /* Pipe is opened */
 
-#define NFA_HCI_INVALID_INX 0xFF
-
 typedef uint8_t tNFA_HCI_COMMAND;
 typedef uint8_t tNFA_HCI_RESPONSE;
 
@@ -113,8 +115,6 @@
 #define NFA_HCI_FIRST_API_EVENT NFA_HCI_API_REGISTER_APP_EVT
 #define NFA_HCI_LAST_API_EVENT NFA_HCI_API_SEND_EVENT_EVT
 
-typedef uint16_t tNFA_HCI_INT_EVT;
-
 /* Internal event structures.
 **
 ** Note, every internal structure starts with a NFC_HDR and an app handle
@@ -355,15 +355,11 @@
   uint8_t hci_version;     /* HCI Version */
 } tNFA_ID_MGMT_GATE_INFO;
 
-/* Internal flags */
-/* sub system is being disabled */
-#define NFA_HCI_FL_DISABLING 0x01
-#define NFA_HCI_FL_NV_CHANGED 0x02 /* NV Ram changed */
-
 /* NFA HCI control block */
 typedef struct {
-  tNFA_HCI_STATE hci_state;   /* state of the HCI */
-  uint8_t num_nfcee;          /* Number of NFCEE ID Discovered */
+  tNFA_HCI_STATE hci_state; /* state of the HCI */
+  uint8_t num_nfcee;        /* Number of NFCEE ID Discovered */
+  tNFA_EE_INFO ee_info[NFA_HCI_MAX_HOST_IN_NETWORK]; /*NFCEE ID Info*/
   uint8_t num_ee_dis_req_ntf; /* Number of ee discovery request ntf received */
   uint8_t num_hot_plug_evts;  /* Number of Hot plug events received after ee
                                  discovery disable ntf */
@@ -442,6 +438,7 @@
 extern void nfa_hci_startup_complete(tNFA_STATUS status);
 extern void nfa_hci_startup(void);
 extern void nfa_hci_restore_default_config(uint8_t* p_session_id);
+extern void nfa_hci_enable_one_nfcee(void);
 
 /* Action functions in nfa_hci_act.c
 */
@@ -449,7 +446,7 @@
 extern void nfa_hci_check_api_requests(void);
 extern void nfa_hci_handle_admin_gate_cmd(uint8_t* p_data);
 extern void nfa_hci_handle_admin_gate_rsp(uint8_t* p_data, uint8_t data_len);
-extern void nfa_hci_handle_admin_gate_evt(uint8_t* p_data);
+extern void nfa_hci_handle_admin_gate_evt();
 extern void nfa_hci_handle_link_mgm_gate_cmd(uint8_t* p_data);
 extern void nfa_hci_handle_dyn_pipe_pkt(uint8_t pipe, uint8_t* p_data,
                                         uint16_t data_len);
@@ -481,8 +478,6 @@
 extern tNFA_HANDLE nfa_hciu_get_pipe_owner(uint8_t pipe_id);
 extern uint8_t nfa_hciu_count_open_pipes_on_gate(tNFA_HCI_DYN_GATE* p_gate);
 extern uint8_t nfa_hciu_count_pipes_on_gate(tNFA_HCI_DYN_GATE* p_gate);
-extern tNFA_STATUS nfa_hciu_asmbl_dyn_pipe_pkt(uint8_t* p_data,
-                                               uint8_t data_len);
 
 extern tNFA_HCI_RESPONSE nfa_hciu_add_pipe_to_gate(uint8_t pipe,
                                                    uint8_t local_gate,
@@ -519,15 +514,11 @@
                                      uint8_t instruction, uint16_t pkt_len,
                                      uint8_t* p_pkt);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-extern char* nfa_hciu_type_2_str(uint8_t type);
-extern char* nfa_hciu_instr_2_str(uint8_t type);
-extern char* nfa_hciu_get_event_name(uint16_t event);
-extern char* nfa_hciu_get_response_name(uint8_t rsp_code);
-extern char* nfa_hciu_get_state_name(uint8_t state);
+extern std::string nfa_hciu_instr_2_str(uint8_t type);
+extern std::string nfa_hciu_get_event_name(uint16_t event);
+extern std::string nfa_hciu_get_state_name(uint8_t state);
 extern char* nfa_hciu_get_type_inst_names(uint8_t pipe, uint8_t type,
                                           uint8_t inst, char* p_buff);
-extern char* nfa_hciu_evt_2_str(uint8_t pipe_id, uint8_t evt);
-#endif
+extern std::string nfa_hciu_evt_2_str(uint8_t pipe_id, uint8_t evt);
 
 #endif /* NFA_HCI_INT_H */
diff --git a/src/nfa/include/nfa_mem_co.h b/src/nfa/include/nfa_mem_co.h
index decc5f3..e027c16 100644
--- a/src/nfa/include/nfa_mem_co.h
+++ b/src/nfa/include/nfa_mem_co.h
@@ -33,9 +33,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -62,8 +59,4 @@
 *******************************************************************************/
 extern void nfa_mem_co_free(void* p_buf);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_MEM_CO_H */
diff --git a/src/nfa/include/nfa_nv_ci.h b/src/nfa/include/nfa_nv_ci.h
index eb519d6..adcf085 100644
--- a/src/nfa/include/nfa_nv_ci.h
+++ b/src/nfa/include/nfa_nv_ci.h
@@ -30,27 +30,9 @@
 **  Constants and data types
 *****************************************************************************/
 
-/* Read Ready Event */
-typedef struct {
-  NFC_HDR hdr;
-  tNFA_NV_CO_STATUS status;
-  int fd;
-  uint16_t num_read;
-} tNFA_NV_CI_READ_EVT;
-
-/* Write Ready Event */
-typedef struct {
-  NFC_HDR hdr;
-  tNFA_NV_CO_STATUS status;
-  int fd;
-} tNFA_NV_CI_WRITE_EVT;
-
 /*****************************************************************************
 **  Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -95,8 +77,4 @@
 extern void nfa_nv_ci_read(uint16_t num_bytes_read, tNFA_NV_CO_STATUS status,
                            uint8_t block);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* BTA_FS_CI_H */
diff --git a/src/nfa/include/nfa_nv_co.h b/src/nfa/include/nfa_nv_co.h
index e183c3e..0f32e9c 100644
--- a/src/nfa/include/nfa_nv_co.h
+++ b/src/nfa/include/nfa_nv_co.h
@@ -41,22 +41,12 @@
  * status */
 #define NFA_NV_CO_OK 0x00
 #define NFA_NV_CO_FAIL 0x01 /* Used to pass all other errors */
-#define NFA_NV_CO_EACCES 0x02
-#define NFA_NV_CO_ENOTEMPTY 0x03
-#define NFA_NV_CO_EOF 0x04
-#define NFA_NV_CO_EODIR 0x05
-#define NFA_NV_CO_ENOSPACE 0x06 /* Returned in nfa_nv_ci_open if no room */
-#define NFA_NV_CO_EIS_DIR 0x07
-#define NFA_NV_CO_RESUME 0x08 /* used in nfa_nv_ci_open, on resume */
-/* used in nfa_nv_ci_open, on resume (no file to resume) */
-#define NFA_NV_CO_NONE 0x09
 
 typedef uint8_t tNFA_NV_CO_STATUS;
 
 #define DH_NV_BLOCK 0x01
 #define HC_F3_NV_BLOCK 0x02
 #define HC_F4_NV_BLOCK 0x03
-#define HC_DH_NV_BLOCK 0x04
 #define HC_F5_NV_BLOCK 0x05
 
 /*****************************************************************************
diff --git a/src/nfa/include/nfa_p2p_api.h b/src/nfa/include/nfa_p2p_api.h
index ee1be53..bcfc234 100644
--- a/src/nfa/include/nfa_p2p_api.h
+++ b/src/nfa/include/nfa_p2p_api.h
@@ -41,12 +41,8 @@
   0x02 /* no service bound in remote      */
 #define NFA_P2P_DISC_REASON_REMOTE_REJECT \
   0x03 /* remote rejected connection      */
-#define NFA_P2P_DISC_REASON_FRAME_ERROR \
-  0x04 /* sending or receiving FRMR PDU   */
 #define NFA_P2P_DISC_REASON_LLCP_DEACTIVATED \
   0x05 /* LLCP link deactivated           */
-#define NFA_P2P_DISC_REASON_NO_RESOURCE \
-  0x06 /* Out of resource in local device */
 #define NFA_P2P_DISC_REASON_NO_INFORMATION \
   0x80 /* Without information             */
 
@@ -79,16 +75,6 @@
 #define NFA_P2P_ANY_SAP LLCP_INVALID_SAP
 #define NFA_P2P_INVALID_SAP LLCP_INVALID_SAP
 
-/* Recommanded MIU's for connection-oriented */
-#define NFA_P2P_MIU_1 \
-  (NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
-#define NFA_P2P_MIU_2 \
-  (2 * NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
-#define NFA_P2P_MIU_3 \
-  (3 * NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
-#define NFA_P2P_MIU_8 \
-  (8 * NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
-
 #define NFA_P2P_LLINK_TYPE LLCP_LINK_TYPE_LOGICAL_DATA_LINK
 #define NFA_P2P_DLINK_TYPE LLCP_LINK_TYPE_DATA_LINK_CONNECTION
 typedef uint8_t tNFA_P2P_LINK_TYPE;
@@ -188,9 +174,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -559,20 +542,4 @@
                                  uint16_t* p_data_link_timeout,
                                  uint16_t* p_delay_first_pdu_timeout);
 
-/*******************************************************************************
-**
-** Function         NFA_P2pSetTraceLevel
-**
-** Description      This function sets the trace level for P2P.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t NFA_P2pSetTraceLevel(uint8_t new_level);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_P2P_API_H */
diff --git a/src/nfa/int/nfa_p2p_int.h b/src/nfa/include/nfa_p2p_int.h
similarity index 97%
rename from src/nfa/int/nfa_p2p_int.h
rename to src/nfa/include/nfa_p2p_int.h
index cdbe781..0221f36 100644
--- a/src/nfa/int/nfa_p2p_int.h
+++ b/src/nfa/include/nfa_p2p_int.h
@@ -31,15 +31,13 @@
 /*****************************************************************************
 **  Constants and data types
 *****************************************************************************/
-#define NFA_P2P_DEBUG BT_TRACE_VERBOSE
 
 /* NFA P2P LLCP link state */
 enum {
   NFA_P2P_LLCP_STATE_IDLE,
   NFA_P2P_LLCP_STATE_LISTENING,
-  NFA_P2P_LLCP_STATE_ACTIVATED,
+  NFA_P2P_LLCP_STATE_ACTIVATED
 
-  NFA_P2P_LLCP_STATE_MAX
 };
 
 typedef uint8_t tNFA_P2P_LLCP_STATE;
@@ -255,8 +253,6 @@
       total_pending_ui_pdu; /* total number of tx UI PDU not processed by NFA */
   uint8_t
       total_pending_i_pdu; /* total number of tx I PDU not processed by NFA */
-
-  uint8_t trace_level;
 } tNFA_P2P_CB;
 
 /*****************************************************************************
@@ -308,10 +304,6 @@
 bool nfa_p2p_set_llcp_cfg(tNFA_P2P_MSG* p_msg);
 bool nfa_p2p_restart_rf_discovery(tNFA_P2P_MSG* p_msg);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-char* nfa_p2p_evt_code(uint16_t evt_code);
-#endif
-
 #else
 
 #define nfa_p2p_init ()
diff --git a/src/nfa/include/nfa_rw_api.h b/src/nfa/include/nfa_rw_api.h
index f4eaded..ee9bec7 100644
--- a/src/nfa/include/nfa_rw_api.h
+++ b/src/nfa/include/nfa_rw_api.h
@@ -31,12 +31,9 @@
 **  Constants and data types
 *****************************************************************************/
 enum {
-  NFA_RW_PRES_CHK_DEFAULT,    /* The default behavior             */
-  NFA_RW_PRES_CHK_I_BLOCK,    /* Empty I Block                    */
-  NFA_RW_PRES_CHK_RESET,      /* Deactivate to Sleep; Re-activate */
-  NFA_RW_PRES_CHK_RB_CH0,     /* ReadBinary on Channel 0          */
-  NFA_RW_PRES_CHK_RB_CH3,     /* ReadBinary on Channel 3          */
-  NFA_RW_PRES_CHK_ISO_DEP_NAK /* presence check command ISO-DEP
+  NFA_RW_PRES_CHK_DEFAULT,        /* The default behavior             */
+  NFA_RW_PRES_CHK_I_BLOCK,        /* Empty I Block                    */
+  NFA_RW_PRES_CHK_ISO_DEP_NAK = 5 /* presence check command ISO-DEP
                                  NAK as per NCI2.0                */
 };
 typedef uint8_t tNFA_RW_PRES_CHK_OPTION;
@@ -54,9 +51,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -748,8 +742,4 @@
 extern tNFA_STATUS NFA_RwI93GetMultiBlockSecurityStatus(
     uint8_t first_block_number, uint16_t number_blocks);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_RW_API_H */
diff --git a/src/nfa/int/nfa_rw_int.h b/src/nfa/include/nfa_rw_int.h
similarity index 100%
rename from src/nfa/int/nfa_rw_int.h
rename to src/nfa/include/nfa_rw_int.h
diff --git a/src/nfa/include/nfa_snep_api.h b/src/nfa/include/nfa_snep_api.h
index e63f19a..c723824 100644
--- a/src/nfa/include/nfa_snep_api.h
+++ b/src/nfa/include/nfa_snep_api.h
@@ -30,36 +30,15 @@
 /*****************************************************************************
 **  Constants and data types
 *****************************************************************************/
-#define NFA_SNEP_VERSION 0x10 /* SNEP Version 1.0          */
 
-/* send remaining fragments         */
-#define NFA_SNEP_REQ_CODE_CONTINUE 0x00
 /* return an NDEF message           */
 #define NFA_SNEP_REQ_CODE_GET 0x01
 /* accept an NDEF message           */
 #define NFA_SNEP_REQ_CODE_PUT 0x02
 /* do not send remaining fragments  */
-#define NFA_SNEP_REQ_CODE_REJECT 0x7F
 
 #define tNFA_SNEP_REQ_CODE uint8_t
 
-/* continue send remaining fragments    */
-#define NFA_SNEP_RESP_CODE_CONTINUE 0x80
-/* the operation succeeded              */
-#define NFA_SNEP_RESP_CODE_SUCCESS 0x81
-/* resource not found                   */
-#define NFA_SNEP_RESP_CODE_NOT_FOUND 0xC0
-/* resource exceeds data size limit     */
-#define NFA_SNEP_RESP_CODE_EXCESS_DATA 0xC1
-/* malformed request not understood     */
-#define NFA_SNEP_RESP_CODE_BAD_REQ 0xC2
-/* unsupported functionality requested  */
-#define NFA_SNEP_RESP_CODE_NOT_IMPLM 0xE0
-/* unsupported protocol version         */
-#define NFA_SNEP_RESP_CODE_UNSUPP_VER 0xE1
-/* do not send remaining fragments      */
-#define NFA_SNEP_RESP_CODE_REJECT 0xFF
-
 #define tNFA_SNEP_RESP_CODE uint8_t
 
 /* NFA SNEP callback events */
@@ -89,15 +68,8 @@
 /* GET response sent to client          */
 #define NFA_SNEP_GET_RESP_CMPL_EVT 0x0B
 
-/* SNEP default server is started       */
-#define NFA_SNEP_DEFAULT_SERVER_STARTED_EVT 0x0C
-/* SNEP default server is stopped       */
-#define NFA_SNEP_DEFAULT_SERVER_STOPPED_EVT 0x0D
-
 typedef uint8_t tNFA_SNEP_EVT;
 
-#define NFA_SNEP_ANY_SAP LLCP_INVALID_SAP
-
 /* Data for NFA_SNEP_REG_EVT */
 typedef struct {
   tNFA_STATUS status;
@@ -199,291 +171,4 @@
 /* NFA SNEP callback */
 typedef void(tNFA_SNEP_CBACK)(tNFA_SNEP_EVT event, tNFA_SNEP_EVT_DATA* p_data);
 
-/*****************************************************************************
-**  External Function Declarations
-*****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************************************************
-**
-** Function         NFA_SnepStartDefaultServer
-**
-** Description      This function is called to listen to SAP, 0x04 as SNEP
-**                  default server ("urn:nfc:sn:snep") on LLCP.
-**
-**                  NFA_SNEP_DEFAULT_SERVER_STARTED_EVT without data will be
-**                  returned.
-**
-** Note:            If RF discovery is started,
-**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
-**                  happen before calling this function
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepStartDefaultServer(tNFA_SNEP_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepStopDefaultServer
-**
-** Description      This function is called to stop SNEP default server on LLCP.
-**
-**                  NFA_SNEP_DEFAULT_SERVER_STOPPED_EVT without data will be
-**                  returned.
-**
-** Note:            If RF discovery is started,
-**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
-**                  happen before calling this function
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepStopDefaultServer(tNFA_SNEP_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepRegisterServer
-**
-** Description      This function is called to listen to a SAP as SNEP server.
-**
-**                  If server_sap is set to NFA_SNEP_ANY_SAP, then NFA will
-**                  allocate a SAP between LLCP_LOWER_BOUND_SDP_SAP and
-**                  LLCP_UPPER_BOUND_SDP_SAP
-**
-**                  NFC Forum default SNEP server ("urn:nfc:sn:snep") may be
-**                  launched by NFA_SnepStartDefaultServer ().
-**
-**                  NFA_SNEP_REG_EVT will be returned with status, handle and
-**                  service name.
-**
-** Note:            If RF discovery is started,
-**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
-**                  happen before calling this function
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_INVALID_PARAM if p_service_name or p_cback is
-**                  NULL
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepRegisterServer(uint8_t server_sap,
-                                          char* p_service_name,
-                                          tNFA_SNEP_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepRegisterClient
-**
-** Description      This function is called to register SNEP client.
-**                  NFA_SNEP_REG_EVT will be returned with status, handle
-**                  and zero-length service name.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_INVALID_PARAM if p_cback is NULL
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepRegisterClient(tNFA_SNEP_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepDeregister
-**
-** Description      This function is called to stop listening as SNEP server
-**                  or SNEP client. Application shall use reg_handle returned in
-**                  NFA_SNEP_REG_EVT.
-**
-** Note:            If this function is called to de-register a SNEP server and
-**                  RF discovery is started,
-**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
-**                  happen before calling this function
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepDeregister(tNFA_HANDLE reg_handle);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepConnect
-**
-** Description      This function is called by client to create data link
-**                  connection to SNEP server on peer device.
-**
-**                  Client handle and service name of server to connect shall be
-**                  provided. A conn_handle will be returned in
-**                  NFA_SNEP_CONNECTED_EVT, if successfully connected. Otherwise
-**                  NFA_SNEP_DISC_EVT will be returned.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_INVALID_PARAM if p_service_name or p_cback is
-**                  NULL
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepConnect(tNFA_HANDLE client_handle,
-                                   char* p_service_name);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepGet
-**
-** Description      This function is called by client to send GET request.
-**
-**                  Application shall allocate a buffer and put NDEF message
-**                  with desired record type to get from server. NDEF message
-**                  from server will be returned in the same buffer with
-**                  NFA_SNEP_GET_RESP_EVT. The size of buffer will be used as
-**                  "Acceptable Length".
-**
-**                  NFA_SNEP_GET_RESP_EVT or NFA_SNEP_DISC_EVT will be returned
-**                  through registered p_cback. Application may free the buffer
-**                  after receiving these events.
-**
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepGet(tNFA_HANDLE conn_handle, uint32_t buff_length,
-                               uint32_t ndef_length, uint8_t* p_ndef_buff);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepPut
-**
-** Description      This function is called by client to send PUT request.
-**
-**                  Application shall allocate a buffer and put desired NDEF
-**                  message to send to server.
-**
-**                  NFA_SNEP_PUT_RESP_EVT or NFA_SNEP_DISC_EVT will be returned
-**                  through p_cback. Application may free the buffer after
-**                  receiving these events.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_INVALID_PARAM if p_service_name or p_cback is
-**                  NULL
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepPut(tNFA_HANDLE conn_handle, uint32_t ndef_length,
-                               uint8_t* p_ndef_buff);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepGetResponse
-**
-** Description      This function is called by server to send response of GET
-**                  request.
-**
-**                  When server application receives NFA_SNEP_ALLOC_BUFF_EVT,
-**                  it shall allocate a buffer for incoming NDEF message and
-**                  pass the pointer within callback context. This buffer will
-**                  be returned with NFA_SNEP_GET_REQ_EVT after receiving
-**                  complete NDEF message. If buffer is not allocated,
-**                  NFA_SNEP_RESP_CODE_NOT_FOUND (Note:There is no proper
-**                  response code for this case) or NFA_SNEP_RESP_CODE_REJECT
-**                  will be sent to client.
-**
-**                  Server application shall provide conn_handle which is
-**                  received in NFA_SNEP_GET_REQ_EVT.
-**
-**                  Server application shall allocate a buffer and put NDEF
-**                  message if response code is NFA_SNEP_RESP_CODE_SUCCESS.
-**                  Otherwise, ndef_length shall be set to zero.
-**
-**                  NFA_SNEP_GET_RESP_CMPL_EVT or NFA_SNEP_DISC_EVT will be
-**                  returned through registered callback function. Application
-**                  may free the buffer after receiving these events.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepGetResponse(tNFA_HANDLE conn_handle,
-                                       tNFA_SNEP_RESP_CODE resp_code,
-                                       uint32_t ndef_length,
-                                       uint8_t* p_ndef_buff);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepPutResponse
-**
-** Description      This function is called by server to send response of PUT
-**                  request.
-**
-**                  When server application receives NFA_SNEP_ALLOC_BUFF_EVT,
-**                  it shall allocate a buffer for incoming NDEF message and
-**                  pass the pointer within callback context. This buffer will
-**                  be returned with NFA_SNEP_PUT_REQ_EVT after receiving
-**                  complete NDEF message.  If buffer is not allocated,
-**                  NFA_SNEP_RESP_CODE_REJECT will be sent to client or NFA will
-**                  discard request and send NFA_SNEP_RESP_CODE_SUCCESS
-**                  (Note:There is no proper response code for this case).
-**
-**                  Server application shall provide conn_handle which is
-**                  received in NFA_SNEP_PUT_REQ_EVT.
-**
-**                  NFA_SNEP_DISC_EVT will be returned through registered
-**                  callback function when client disconnects data link
-**                  connection.
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepPutResponse(tNFA_HANDLE conn_handle,
-                                       tNFA_SNEP_RESP_CODE resp_code);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepDisconnect
-**
-** Description      This function is called to disconnect data link connection.
-**                  discard any pending data if flush is set to TRUE
-**
-**                  Client application shall provide conn_handle in
-**                  NFA_SNEP_GET_RESP_EVT or NFA_SNEP_PUT_RESP_EVT.
-**
-**                  Server application shall provide conn_handle in
-**                  NFA_SNEP_GET_REQ_EVT or NFA_SNEP_PUT_REQ_EVT.
-**
-**                  NFA_SNEP_DISC_EVT will be returned
-**
-** Returns          NFA_STATUS_OK if successfully initiated
-**                  NFA_STATUS_BAD_HANDLE if handle is not valid
-**                  NFA_STATUS_FAILED otherwise
-**
-*******************************************************************************/
-extern tNFA_STATUS NFA_SnepDisconnect(tNFA_HANDLE conn_handle, bool flush);
-
-/*******************************************************************************
-**
-** Function         NFA_SnepSetTraceLevel
-**
-** Description      This function sets the trace level for SNEP.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t NFA_SnepSetTraceLevel(uint8_t new_level);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_P2P_API_H */
diff --git a/src/nfa/int/nfa_snep_int.h b/src/nfa/include/nfa_snep_int.h
similarity index 80%
rename from src/nfa/int/nfa_snep_int.h
rename to src/nfa/include/nfa_snep_int.h
index d4db0aa..83f6cb5 100644
--- a/src/nfa/int/nfa_snep_int.h
+++ b/src/nfa/include/nfa_snep_int.h
@@ -31,11 +31,7 @@
 /*****************************************************************************
 **  Constants and data types
 *****************************************************************************/
-#define NFA_SNEP_DEFAULT_SERVER_SAP 0x04 /* SNEP default server SAP   */
-#define NFA_SNEP_HEADER_SIZE 6           /* SNEP header size          */
 /* SNEP Acceptable Length size */
-#define NFA_SNEP_ACCEPT_LEN_SIZE 4
-#define NFA_SNEP_CLIENT_TIMEOUT 1000 /* ms, waiting for response  */
 
 /* NFA SNEP events */
 enum {
@@ -49,9 +45,8 @@
   NFA_SNEP_API_PUT_REQ_EVT,
   NFA_SNEP_API_GET_RESP_EVT,
   NFA_SNEP_API_PUT_RESP_EVT,
-  NFA_SNEP_API_DISCONNECT_EVT,
+  NFA_SNEP_API_DISCONNECT_EVT
 
-  NFA_SNEP_LAST_EVT
 };
 
 /* data type for NFA_SNEP_API_START_DEFAULT_SERVER_EVT */
@@ -157,17 +152,10 @@
 
 /* NFA SNEP service control block */
 /* ignore flags while searching   */
-#define NFA_SNEP_FLAG_ANY 0x00
-#define NFA_SNEP_FLAG_SERVER 0x01 /* server */
-#define NFA_SNEP_FLAG_CLIENT 0x02 /* client */
 /* waiting for connection confirm */
-#define NFA_SNEP_FLAG_CONNECTING 0x04
 /* data link connected            */
-#define NFA_SNEP_FLAG_CONNECTED 0x08
 /* Waiting for continue response  */
-#define NFA_SNEP_FLAG_W4_RESP_CONTINUE 0x10
 /* Waiting for continue request   */
-#define NFA_SNEP_FLAG_W4_REQ_CONTINUE 0x20
 
 typedef struct {
   uint8_t local_sap;        /* local SAP of service */
@@ -197,7 +185,6 @@
   tNFA_SNEP_CONN conn[NFA_SNEP_MAX_CONN];
   bool listen_enabled;
   bool is_dta_mode;
-  uint8_t trace_level;
 } tNFA_SNEP_CB;
 
 /*
@@ -236,38 +223,6 @@
 **  nfa_snep_main.c
 */
 void nfa_snep_init(bool is_dta_mode);
-/*
-**  nfa_snep_default.c
-*/
-void nfa_snep_default_init(void);
-bool nfa_snep_start_default_server(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_stop_default_server(tNFA_SNEP_MSG* p_msg);
-/*
-**  nfa_snep_srv.c
-*/
-uint8_t nfa_snep_allocate_cb(void);
-void nfa_snep_deallocate_cb(uint8_t xx);
-void nfa_snep_send_msg(uint8_t opcode, uint8_t dlink);
-
-void nfa_snep_llcp_cback(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_data_ind(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_connect_ind(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_connect_resp(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_disconnect_ind(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_disconnect_resp(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_congest(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_link_status(tLLCP_SAP_CBACK_DATA* p_data);
-void nfa_snep_proc_llcp_tx_complete(tLLCP_SAP_CBACK_DATA* p_data);
-
-bool nfa_snep_reg_server(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_reg_client(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_dereg(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_connect(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_put_resp(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_get_resp(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_put_req(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_get_req(tNFA_SNEP_MSG* p_msg);
-bool nfa_snep_disconnect(tNFA_SNEP_MSG* p_msg);
 
 #endif /* (NFA_SNEP_INCLUDED == TRUE) */
 #endif /* NFA_SNEP_INT_H */
diff --git a/src/nfa/int/nfa_sys.h b/src/nfa/include/nfa_sys.h
similarity index 95%
rename from src/nfa/int/nfa_sys.h
rename to src/nfa/include/nfa_sys.h
index 62472ca..42d8464 100644
--- a/src/nfa/int/nfa_sys.h
+++ b/src/nfa/include/nfa_sys.h
@@ -61,7 +61,6 @@
 /* function type for processing the change of NFCC power mode */
 typedef void(tNFA_SYS_PROC_NFCC_PWR_MODE)(uint8_t nfcc_power_mode);
 
-typedef void(tNFA_SYS_CBACK)(void);
 typedef void(tNFA_SYS_ENABLE_CBACK)(void);
 typedef void(tNFA_SYS_PROC_NFCC_PWR_MODE_CMPL)(void);
 
@@ -78,7 +77,6 @@
   uint16_t mbox_evt;   /* GKI mailbox event */
   uint8_t mbox;        /* GKI mailbox id */
   uint8_t timer;       /* GKI timer id */
-  uint8_t trace_level; /* initial trace level */
 } tNFA_SYS_CFG;
 
 /*****************************************************************************
@@ -96,15 +94,10 @@
 **  Function declarations
 *****************************************************************************/
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 extern void nfa_sys_init(void);
 extern void nfa_sys_event(NFC_HDR* p_msg);
 extern void nfa_sys_timer_update(void);
 extern void nfa_sys_disable_timers(void);
-extern void nfa_sys_set_trace_level(uint8_t level);
 
 extern void nfa_sys_register(uint8_t id, const tNFA_SYS_REG* p_reg);
 extern void nfa_sys_deregister(uint8_t id);
@@ -127,8 +120,4 @@
     tNFA_SYS_PROC_NFCC_PWR_MODE_CMPL* p_cback);
 extern void nfa_sys_cback_notify_nfcc_power_mode_proc_complete(uint8_t id);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_SYS_H */
diff --git a/src/nfa/int/nfa_sys_int.h b/src/nfa/include/nfa_sys_int.h
similarity index 96%
rename from src/nfa/int/nfa_sys_int.h
rename to src/nfa/include/nfa_sys_int.h
index c93b3f4..e040b1b 100644
--- a/src/nfa/int/nfa_sys_int.h
+++ b/src/nfa/include/nfa_sys_int.h
@@ -53,7 +53,6 @@
 
   bool graceful_disable; /* TRUE if NFA_Disable () is called with TRUE */
   bool timers_disabled;  /* TRUE if sys timers disabled */
-  uint8_t trace_level;   /* Trace level */
 } tNFA_SYS_CB;
 
 /*****************************************************************************
@@ -66,6 +65,4 @@
 /* system manager configuration structure */
 extern tNFA_SYS_CFG* p_nfa_sys_cfg;
 
-bool nfa_sys_sm_execute(NFC_HDR* p_msg);
-
 #endif /* NFA_SYS_INT_H */
diff --git a/src/nfa/int/nfa_sys_ptim.h b/src/nfa/include/nfa_sys_ptim.h
similarity index 97%
rename from src/nfa/int/nfa_sys_ptim.h
rename to src/nfa/include/nfa_sys_ptim.h
index 0549f63..1582012 100644
--- a/src/nfa/int/nfa_sys_ptim.h
+++ b/src/nfa/include/nfa_sys_ptim.h
@@ -37,10 +37,6 @@
   uint8_t timer_id;         /* GKI timer id */
 } tPTIM_CB;
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*****************************************************************************
 **  Function Declarations
 *****************************************************************************/
@@ -92,8 +88,4 @@
 *******************************************************************************/
 extern void nfa_sys_ptim_stop_timer(tPTIM_CB* p_cb, TIMER_LIST_ENT* p_tle);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFA_SYS_PTIM_H */
diff --git a/src/nfa/p2p/nfa_p2p_act.c b/src/nfa/p2p/nfa_p2p_act.cc
similarity index 92%
rename from src/nfa/p2p/nfa_p2p_act.c
rename to src/nfa/p2p/nfa_p2p_act.cc
index efac872..0d8c8e4 100644
--- a/src/nfa/p2p/nfa_p2p_act.c
+++ b/src/nfa/p2p/nfa_p2p_act.cc
@@ -21,16 +21,17 @@
  *  This is the implementation file for the NFA P2P.
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 
 #include "llcp_api.h"
-#include "llcp_defs.h"
 #include "nfa_dm_int.h"
 #include "nfa_p2p_api.h"
 #include "nfa_p2p_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
-#include "string.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  Global Variables
@@ -66,7 +67,7 @@
     }
   }
 
-  P2P_TRACE_ERROR0("nfa_p2p_allocate_conn_cb (): No resource");
+  LOG(ERROR) << StringPrintf("No resource");
 
   return LLCP_MAX_DATA_LINK;
 }
@@ -85,7 +86,7 @@
   if (xx < LLCP_MAX_DATA_LINK) {
     nfa_p2p_cb.conn_cb[xx].flags = 0;
   } else {
-    P2P_TRACE_ERROR1("nfa_p2p_deallocate_conn_cb (): Invalid index (%d)", xx);
+    LOG(ERROR) << StringPrintf("Invalid index (%d)", xx);
   }
 }
 
@@ -124,8 +125,9 @@
 **
 *******************************************************************************/
 static void nfa_p2p_llcp_cback(tLLCP_SAP_CBACK_DATA* p_data) {
-  P2P_TRACE_DEBUG2("nfa_p2p_llcp_cback (): event:0x%02X, local_sap:0x%02X",
-                   p_data->hdr.event, p_data->hdr.local_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("event:0x%02X, local_sap:0x%02X", p_data->hdr.event,
+                      p_data->hdr.local_sap);
 
   switch (p_data->hdr.event) {
     case LLCP_SAP_EVT_DATA_IND:
@@ -157,8 +159,7 @@
       break;
 
     default:
-      P2P_TRACE_ERROR1("nfa_p2p_llcp_cback (): Unknown event:0x%02X",
-                       p_data->hdr.event);
+      LOG(ERROR) << StringPrintf("Unknown event:0x%02X", p_data->hdr.event);
       return;
   }
 }
@@ -178,8 +179,8 @@
   uint8_t xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG2("nfa_p2p_sdp_cback (): tid:0x%02X, remote_sap:0x%02X", tid,
-                   remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tid:0x%02X, remote_sap:0x%02X", tid, remote_sap);
 
   /* search for callback function to process */
   for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
@@ -210,7 +211,7 @@
 bool nfa_p2p_start_sdp(char* p_service_name, uint8_t local_sap) {
   int xx;
 
-  P2P_TRACE_DEBUG1("nfa_p2p_start_sdp (): SN:<%s>", p_service_name);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("SN:<%s>", p_service_name);
 
   /* search for empty slot */
   for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
@@ -243,7 +244,7 @@
   uint8_t local_sap, xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_data_ind ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = p_data->data_ind.local_sap;
 
@@ -285,8 +286,8 @@
   tNFA_P2P_EVT_DATA evt_data;
   uint8_t xx;
 
-  P2P_TRACE_DEBUG1("nfa_p2p_proc_llcp_connect_ind () server_sap:0x%x",
-                   p_data->connect_ind.server_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("server_sap:0x%x", p_data->connect_ind.server_sap);
 
   server_sap = p_data->connect_ind.server_sap;
   local_sap = p_data->connect_ind.local_sap;
@@ -312,7 +313,7 @@
       nfa_p2p_cb.sap_cb[server_sap].p_cback(NFA_P2P_CONN_REQ_EVT, &evt_data);
     }
   } else {
-    P2P_TRACE_ERROR0("nfa_p2p_proc_llcp_connect_ind (): Not registered");
+    LOG(ERROR) << StringPrintf("Not registered");
   }
 }
 
@@ -330,7 +331,7 @@
   uint8_t local_sap, xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_connect_resp ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = p_data->connect_resp.local_sap;
 
@@ -371,7 +372,7 @@
   uint8_t local_sap, xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_disconnect_ind ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = p_data->disconnect_ind.local_sap;
 
@@ -399,7 +400,7 @@
 
       nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
 
-      P2P_TRACE_ERROR0("nfa_p2p_proc_llcp_disconnect_ind (): Link deactivated");
+      LOG(ERROR) << StringPrintf("Link deactivated");
     }
   }
 }
@@ -418,7 +419,7 @@
   uint8_t local_sap, xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_proc_llcp_disconnect_resp ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = p_data->disconnect_resp.local_sap;
 
@@ -458,8 +459,7 @@
 
         nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_DISC_EVT, &evt_data);
       } else {
-        P2P_TRACE_ERROR0(
-            "nfa_p2p_proc_llcp_disconnect_resp (): No connection found");
+        LOG(ERROR) << StringPrintf("No connection found");
       }
     } else {
       evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap);
@@ -489,12 +489,12 @@
   evt_data.congest.is_congested = p_data->congest.is_congested;
 
   if (p_data->congest.is_congested) {
-    P2P_TRACE_DEBUG2("nfa_p2p_proc_llcp_congestion () START SAP=(0x%x,0x%x)",
-                     local_sap, remote_sap);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("START SAP=(0x%x,0x%x)", local_sap, remote_sap);
 
   } else {
-    P2P_TRACE_DEBUG2("nfa_p2p_proc_llcp_congestion () END SAP=(0x%x,0x%x)",
-                     local_sap, remote_sap);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("END SAP=(0x%x,0x%x)", local_sap, remote_sap);
   }
 
   if (nfa_p2p_cb.sap_cb[local_sap].p_cback) {
@@ -532,8 +532,7 @@
           nfa_p2p_cb.sap_cb[local_sap].p_cback(NFA_P2P_CONGEST_EVT, &evt_data);
         }
       } else {
-        P2P_TRACE_ERROR0(
-            "nfa_p2p_proc_llcp_congestion (): No connection found");
+        LOG(ERROR) << StringPrintf("No connection found");
       }
     }
   }
@@ -553,8 +552,8 @@
   uint8_t local_sap, xx;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG1("nfa_p2p_proc_llcp_link_status () is_activated:%d",
-                   p_data->link_status.is_activated);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("is_activated:%d", p_data->link_status.is_activated);
 
   local_sap = p_data->link_status.local_sap;
 
@@ -615,7 +614,7 @@
   tNFA_P2P_EVT_DATA evt_data;
   uint8_t server_sap;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_reg_server ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   server_sap = LLCP_RegisterServer(
       p_msg->api_reg_server.server_sap, p_msg->api_reg_server.link_type,
@@ -679,7 +678,7 @@
   tNFA_P2P_EVT_DATA evt_data;
   uint8_t local_sap;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_reg_client ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap =
       LLCP_RegisterClient(p_msg->api_reg_client.link_type, nfa_p2p_llcp_cback);
@@ -723,7 +722,7 @@
 bool nfa_p2p_dereg(tNFA_P2P_MSG* p_msg) {
   uint8_t local_sap, xx;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_dereg ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = (uint8_t)(p_msg->api_dereg.handle & NFA_HANDLE_MASK);
 
@@ -778,7 +777,7 @@
   uint8_t xx;
   tLLCP_CONNECTION_PARAMS params;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_accept_connection ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   xx = (uint8_t)(p_msg->api_accept.conn_handle & NFA_HANDLE_MASK);
   xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
@@ -806,7 +805,7 @@
 bool nfa_p2p_reject_connection(tNFA_P2P_MSG* p_msg) {
   uint8_t xx;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_reject_connection ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   xx = (uint8_t)(p_msg->api_reject.conn_handle & NFA_HANDLE_MASK);
   xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
@@ -836,7 +835,7 @@
   tLLCP_STATUS status;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_disconnect ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   xx = (uint8_t)(p_msg->api_disconnect.conn_handle & NFA_HANDLE_MASK);
 
@@ -868,7 +867,7 @@
       }
     }
   } else {
-    P2P_TRACE_ERROR0("Handle is not for Data link connection");
+    LOG(ERROR) << StringPrintf("Handle is not for Data link connection");
   }
 
   return true;
@@ -890,7 +889,7 @@
   tLLCP_CONNECTION_PARAMS conn_params;
   tLLCP_STATUS status;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_create_data_link_connection ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = (uint8_t)(p_msg->api_connect.client_handle & NFA_HANDLE_MASK);
 
@@ -935,7 +934,7 @@
   tLLCP_STATUS status;
   tNFA_P2P_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_send_ui ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = (uint8_t)(p_msg->api_send_ui.handle & NFA_HANDLE_MASK);
 
@@ -981,7 +980,7 @@
   tLLCP_STATUS status;
   uint8_t xx;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_send_data ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   xx = (uint8_t)(p_msg->api_send_data.conn_handle & NFA_HANDLE_MASK);
   xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
@@ -1028,7 +1027,7 @@
 bool nfa_p2p_set_local_busy(tNFA_P2P_MSG* p_msg) {
   uint8_t xx;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_set_local_busy ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   xx = (uint8_t)(p_msg->api_local_busy.conn_handle & NFA_HANDLE_MASK);
   xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
@@ -1054,7 +1053,7 @@
   tNFA_P2P_EVT_DATA evt_data;
   uint8_t local_sap;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_get_link_info ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   evt_data.link_info.handle = p_msg->api_link_info.handle;
   evt_data.link_info.wks = LLCP_GetRemoteWKS();
@@ -1081,7 +1080,7 @@
   tNFA_P2P_EVT_DATA evt_data;
   uint8_t local_sap;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_get_remote_sap ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   local_sap = (uint8_t)(p_msg->api_remote_sap.handle & NFA_HANDLE_MASK);
 
@@ -1127,8 +1126,8 @@
 ** Returns          TRUE to deallocate buffer
 **
 *******************************************************************************/
-bool nfa_p2p_restart_rf_discovery(tNFA_P2P_MSG* p_msg) {
-  P2P_TRACE_DEBUG0("nfa_p2p_restart_rf_discovery ()");
+bool nfa_p2p_restart_rf_discovery(__attribute__((unused)) tNFA_P2P_MSG* p_msg) {
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE);
 
diff --git a/src/nfa/p2p/nfa_p2p_api.c b/src/nfa/p2p/nfa_p2p_api.cc
similarity index 83%
rename from src/nfa/p2p/nfa_p2p_api.c
rename to src/nfa/p2p/nfa_p2p_api.cc
index c676701..2c0dc0b 100644
--- a/src/nfa/p2p/nfa_p2p_api.c
+++ b/src/nfa/p2p/nfa_p2p_api.cc
@@ -21,14 +21,15 @@
  *  NFA interface to LLCP
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_p2p_api.h"
-#include <string.h>
-#include "llcp_api.h"
-#include "llcp_defs.h"
 #include "nfa_p2p_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  Constants
@@ -65,22 +66,19 @@
                                   tNFA_P2P_CBACK* p_cback) {
   tNFA_P2P_API_REG_SERVER* p_msg;
 
-  P2P_TRACE_API3(
-      "NFA_P2pRegisterServer (): server_sap:0x%02x, link_type:0x%x, SN:<%s>",
-      server_sap, link_type, p_service_name);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("server_sap:0x%02x, link_type:0x%x, SN:<%s>", server_sap,
+                      link_type, p_service_name);
 
   if ((server_sap != NFA_P2P_ANY_SAP) &&
       ((server_sap <= LLCP_SAP_SDP) ||
        (server_sap > LLCP_UPPER_BOUND_SDP_SAP))) {
-    P2P_TRACE_ERROR2(
-        "NFA_P2pRegisterServer (): server_sap must be between %d and %d",
-        LLCP_SAP_SDP + 1, LLCP_UPPER_BOUND_SDP_SAP);
+    LOG(ERROR) << StringPrintf("server_sap must be between %d and %d",
+                               LLCP_SAP_SDP + 1, LLCP_UPPER_BOUND_SDP_SAP);
     return (NFA_STATUS_FAILED);
   } else if (((link_type & NFA_P2P_LLINK_TYPE) == 0x00) &&
              ((link_type & NFA_P2P_DLINK_TYPE) == 0x00)) {
-    P2P_TRACE_ERROR1(
-        "NFA_P2pRegisterServer(): link type (0x%x) must be specified",
-        link_type);
+    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
     return (NFA_STATUS_FAILED);
   }
 
@@ -124,13 +122,11 @@
                                   tNFA_P2P_CBACK* p_cback) {
   tNFA_P2P_API_REG_CLIENT* p_msg;
 
-  P2P_TRACE_API1("NFA_P2pRegisterClient (): link_type:0x%x", link_type);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("link_type:0x%x", link_type);
 
   if (((link_type & NFA_P2P_LLINK_TYPE) == 0x00) &&
       ((link_type & NFA_P2P_DLINK_TYPE) == 0x00)) {
-    P2P_TRACE_ERROR1(
-        "NFA_P2pRegisterClient (): link type (0x%x) must be specified",
-        link_type);
+    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
     return (NFA_STATUS_FAILED);
   }
 
@@ -170,13 +166,12 @@
   tNFA_P2P_API_DEREG* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pDeregister (): handle:0x%02X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%02X", handle);
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR0(
-        "NFA_P2pDeregister (): Handle is invalid or not registered");
+    LOG(ERROR) << StringPrintf("Handle is invalid or not registered");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -211,26 +206,26 @@
   tNFA_P2P_API_ACCEPT_CONN* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API3("NFA_P2pAcceptConn (): handle:0x%02X, MIU:%d, RW:%d", handle,
-                 miu, rw);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle:0x%02X, MIU:%d, RW:%d", handle, miu, rw);
 
   xx = handle & NFA_HANDLE_MASK;
 
   if (!(xx & NFA_P2P_HANDLE_FLAG_CONN)) {
-    P2P_TRACE_ERROR0("NFA_P2pAcceptConn (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   } else {
     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
   }
 
   if ((xx >= LLCP_MAX_DATA_LINK) || (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR0("NFA_P2pAcceptConn (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
   if ((miu < LLCP_DEFAULT_MIU) || (nfa_p2p_cb.local_link_miu < miu)) {
-    P2P_TRACE_ERROR3("NFA_P2pAcceptConn (): MIU(%d) must be between %d and %d",
-                     miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
+    LOG(ERROR) << StringPrintf("MIU(%d) must be between %d and %d", miu,
+                               LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
   } else if ((p_msg = (tNFA_P2P_API_ACCEPT_CONN*)GKI_getbuf(
                   sizeof(tNFA_P2P_API_ACCEPT_CONN))) != NULL) {
     p_msg->hdr.event = NFA_P2P_API_ACCEPT_CONN_EVT;
@@ -264,19 +259,19 @@
   tNFA_P2P_API_REJECT_CONN* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pRejectConn (): handle:0x%02X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%02X", handle);
 
   xx = handle & NFA_HANDLE_MASK;
 
   if (!(xx & NFA_P2P_HANDLE_FLAG_CONN)) {
-    P2P_TRACE_ERROR0("NFA_P2pRejectConn (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   } else {
     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
   }
 
   if ((xx >= LLCP_MAX_DATA_LINK) || (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR0("NFA_P2pRejectConn (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -316,8 +311,8 @@
   tNFA_P2P_API_DISCONNECT* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API2("NFA_P2pDisconnect (): handle:0x%02X, flush=%d", handle,
-                 flush);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle:0x%02X, flush=%d", handle, flush);
 
   xx = handle & NFA_HANDLE_MASK;
 
@@ -325,11 +320,11 @@
     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
 
     if ((xx >= LLCP_MAX_DATA_LINK) || (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-      P2P_TRACE_ERROR0("NFA_P2pDisconnect (): Connection Handle is not valid");
+      LOG(ERROR) << StringPrintf("Connection Handle is not valid");
       return (NFA_STATUS_BAD_HANDLE);
     }
   } else {
-    P2P_TRACE_ERROR0("NFA_P2pDisconnect (): Handle is not valid");
+    LOG(ERROR) << StringPrintf("Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -368,22 +363,22 @@
   tNFA_P2P_API_CONNECT* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API4(
-      "NFA_P2pConnectByName (): client_handle:0x%x, SN:<%s>, MIU:%d, RW:%d",
-      client_handle, p_service_name, miu, rw);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("client_handle:0x%x, SN:<%s>, MIU:%d, RW:%d",
+                      client_handle, p_service_name, miu, rw);
 
   xx = client_handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR0("NFA_P2pConnectByName (): Client Handle is not valid");
+    LOG(ERROR) << StringPrintf("Client Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
   if ((miu < LLCP_DEFAULT_MIU) ||
       (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED) ||
       (nfa_p2p_cb.local_link_miu < miu)) {
-    P2P_TRACE_ERROR3(
-        "NFA_P2pConnectByName (): MIU(%d) must be between %d and %d or LLCP "
+    LOG(ERROR) << StringPrintf(
+        "MIU(%d) must be between %d and %d or LLCP "
         "link is not activated",
         miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
   } else if ((p_msg = (tNFA_P2P_API_CONNECT*)GKI_getbuf(
@@ -425,22 +420,22 @@
   tNFA_P2P_API_CONNECT* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API4(
-      "NFA_P2pConnectBySap (): client_handle:0x%x, DSAP:0x%02X, MIU:%d, RW:%d",
-      client_handle, dsap, miu, rw);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("client_handle:0x%x, DSAP:0x%02X, MIU:%d, RW:%d",
+                      client_handle, dsap, miu, rw);
 
   xx = client_handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR0("NFA_P2pConnectBySap (): Client Handle is not valid");
+    LOG(ERROR) << StringPrintf("Client Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
   if ((miu < LLCP_DEFAULT_MIU) ||
       (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED) ||
       (nfa_p2p_cb.local_link_miu < miu)) {
-    P2P_TRACE_ERROR3(
-        "NFA_P2pConnectBySap (): MIU(%d) must be between %d and %d, or LLCP "
+    LOG(ERROR) << StringPrintf(
+        "MIU(%d) must be between %d and %d, or LLCP "
         "link is not activated",
         miu, LLCP_DEFAULT_MIU, nfa_p2p_cb.local_link_miu);
   } else if ((p_msg = (tNFA_P2P_API_CONNECT*)GKI_getbuf(
@@ -483,26 +478,25 @@
   tNFA_STATUS ret_status = NFA_STATUS_FAILED;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API3("NFA_P2pSendUI (): handle:0x%X, DSAP:0x%02X, length:%d",
-                 handle, dsap, length);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "handle:0x%X, DSAP:0x%02X, length:%d", handle, dsap, length);
 
   GKI_sched_lock();
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR1("NFA_P2pSendUI (): Handle (0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle (0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
   } else if (length > nfa_p2p_cb.remote_link_miu) {
-    P2P_TRACE_ERROR3(
-        "NFA_P2pSendUI (): handle:0x%X, length(%d) must be less than remote "
+    LOG(ERROR) << StringPrintf(
+        "handle:0x%X, length(%d) must be less than remote "
         "link MIU(%d)",
         handle, length, nfa_p2p_cb.remote_link_miu);
     ret_status = NFA_STATUS_BAD_LENGTH;
   } else if (nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED) {
-    P2P_TRACE_WARNING1(
-        "NFA_P2pSendUI (): handle:0x%X, logical data link is already congested",
-        handle);
+    LOG(WARNING) << StringPrintf(
+        "handle:0x%X, logical data link is already congested", handle);
     ret_status = NFA_STATUS_CONGESTED;
   } else if (LLCP_IsLogicalLinkCongested(
                  (uint8_t)xx, nfa_p2p_cb.sap_cb[xx].num_pending_ui_pdu,
@@ -510,8 +504,8 @@
                  nfa_p2p_cb.total_pending_i_pdu)) {
     nfa_p2p_cb.sap_cb[xx].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED;
 
-    P2P_TRACE_WARNING1(
-        "NFA_P2pSendUI(): handle:0x%X, logical data link is congested", handle);
+    LOG(WARNING) << StringPrintf("handle:0x%X, logical data link is congested",
+                                 handle);
     ret_status = NFA_STATUS_CONGESTED;
   } else if ((p_msg = (tNFA_P2P_API_SEND_UI*)GKI_getbuf(
                   sizeof(tNFA_P2P_API_SEND_UI))) != NULL) {
@@ -572,14 +566,14 @@
   tNFA_STATUS ret_status;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pReadUI (): handle:0x%X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
 
   GKI_sched_lock();
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR1("NFA_P2pReadUI (): Handle (0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle (0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
   } else {
     *p_more = LLCP_ReadLogicalLinkData((uint8_t)xx, max_data_len, p_remote_sap,
@@ -607,14 +601,14 @@
   tNFA_STATUS ret_status;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pReadUI (): handle:0x%X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
 
   GKI_sched_lock();
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR1("NFA_P2pFlushUI (): Handle (0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle (0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
     *p_length = 0;
   } else {
@@ -647,7 +641,8 @@
   tNFA_STATUS ret_status = NFA_STATUS_FAILED;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API2("NFA_P2pSendData (): handle:0x%X, length:%d", handle, length);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle:0x%X, length:%d", handle, length);
 
   GKI_sched_lock();
 
@@ -656,21 +651,19 @@
 
   if ((!(handle & NFA_P2P_HANDLE_FLAG_CONN)) || (xx >= LLCP_MAX_DATA_LINK) ||
       (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR1("NFA_P2pSendData (): Handle(0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle(0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
   } else if (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO) {
-    P2P_TRACE_ERROR1(
-        "NFA_P2pSendData (): handle:0x%X, Remote set RW to 0 (flow off)",
-        handle);
+    LOG(ERROR) << StringPrintf("handle:0x%X, Remote set RW to 0 (flow off)",
+                               handle);
     ret_status = NFA_STATUS_FAILED;
   } else if (nfa_p2p_cb.conn_cb[xx].remote_miu < length) {
-    P2P_TRACE_ERROR2(
-        "NFA_P2pSendData (): handle:0x%X, Data more than remote MIU(%d)",
-        handle, nfa_p2p_cb.conn_cb[xx].remote_miu);
+    LOG(ERROR) << StringPrintf("handle:0x%X, Data more than remote MIU(%d)",
+                               handle, nfa_p2p_cb.conn_cb[xx].remote_miu);
     ret_status = NFA_STATUS_BAD_LENGTH;
   } else if (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED) {
-    P2P_TRACE_WARNING1(
-        "NFA_P2pSendData (): handle:0x%X, data link connection is already "
+    LOG(WARNING) << StringPrintf(
+        "handle:0x%X, data link connection is already "
         "congested",
         handle);
     ret_status = NFA_STATUS_CONGESTED;
@@ -681,9 +674,8 @@
                                       nfa_p2p_cb.total_pending_i_pdu)) {
     nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED;
 
-    P2P_TRACE_WARNING1(
-        "NFA_P2pSendData (): handle:0x%X, data link connection is congested",
-        handle);
+    LOG(WARNING) << StringPrintf(
+        "handle:0x%X, data link connection is congested", handle);
     ret_status = NFA_STATUS_CONGESTED;
   } else if ((p_msg = (tNFA_P2P_API_SEND_DATA*)GKI_getbuf(
                   sizeof(tNFA_P2P_API_SEND_DATA))) != NULL) {
@@ -741,7 +733,7 @@
   tNFA_STATUS ret_status;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pReadData (): handle:0x%X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
 
   GKI_sched_lock();
 
@@ -750,7 +742,7 @@
 
   if ((!(handle & NFA_P2P_HANDLE_FLAG_CONN)) || (xx >= LLCP_MAX_DATA_LINK) ||
       (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR1("NFA_P2pReadData (): Handle(0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle(0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
   } else {
     *p_more = LLCP_ReadDataLinkData(nfa_p2p_cb.conn_cb[xx].local_sap,
@@ -779,7 +771,7 @@
   tNFA_STATUS ret_status;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pFlushData (): handle:0x%X", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%X", handle);
 
   GKI_sched_lock();
 
@@ -788,7 +780,7 @@
 
   if ((!(handle & NFA_P2P_HANDLE_FLAG_CONN)) || (xx >= LLCP_MAX_DATA_LINK) ||
       (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR1("NFA_P2pFlushData (): Handle(0x%X) is not valid", handle);
+    LOG(ERROR) << StringPrintf("Handle(0x%X) is not valid", handle);
     ret_status = NFA_STATUS_BAD_HANDLE;
   } else {
     *p_length = LLCP_FlushDataLinkRxData(nfa_p2p_cb.conn_cb[xx].local_sap,
@@ -817,20 +809,20 @@
   tNFA_P2P_API_SET_LOCAL_BUSY* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API2("NFA_P2pSetLocalBusy (): conn_handle:0x%02X, is_busy:%d",
-                 conn_handle, is_busy);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("conn_handle:0x%02X, is_busy:%d", conn_handle, is_busy);
 
   xx = conn_handle & NFA_HANDLE_MASK;
 
   if (!(xx & NFA_P2P_HANDLE_FLAG_CONN)) {
-    P2P_TRACE_ERROR0("NFA_P2pSetLocalBusy (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   } else {
     xx &= ~NFA_P2P_HANDLE_FLAG_CONN;
   }
 
   if ((xx >= LLCP_MAX_DATA_LINK) || (nfa_p2p_cb.conn_cb[xx].flags == 0)) {
-    P2P_TRACE_ERROR0("NFA_P2pSetLocalBusy (): Connection Handle is not valid");
+    LOG(ERROR) << StringPrintf("Connection Handle is not valid");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -866,18 +858,17 @@
   tNFA_P2P_API_GET_LINK_INFO* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API1("NFA_P2pGetLinkInfo (): handle:0x%x", handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle:0x%x", handle);
 
   if (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED) {
-    P2P_TRACE_ERROR0("NFA_P2pGetLinkInfo (): LLCP link is not activated");
+    LOG(ERROR) << StringPrintf("LLCP link is not activated");
     return (NFA_STATUS_FAILED);
   }
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR0(
-        "NFA_P2pGetLinkInfo (): Handle is invalid or not registered");
+    LOG(ERROR) << StringPrintf("Handle is invalid or not registered");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -912,19 +903,18 @@
   tNFA_P2P_API_GET_REMOTE_SAP* p_msg;
   tNFA_HANDLE xx;
 
-  P2P_TRACE_API2("NFA_P2pGetRemoteSap(): handle:0x%x, SN:<%s>", handle,
-                 p_service_name);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("handle:0x%x, SN:<%s>", handle, p_service_name);
 
   if (nfa_p2p_cb.llcp_state != NFA_P2P_LLCP_STATE_ACTIVATED) {
-    P2P_TRACE_ERROR0("NFA_P2pGetRemoteSap(): LLCP link is not activated");
+    LOG(ERROR) << StringPrintf("LLCP link is not activated");
     return (NFA_STATUS_FAILED);
   }
 
   xx = handle & NFA_HANDLE_MASK;
 
   if ((xx >= NFA_P2P_NUM_SAP) || (nfa_p2p_cb.sap_cb[xx].p_cback == NULL)) {
-    P2P_TRACE_ERROR0(
-        "NFA_P2pGetRemoteSap (): Handle is invalid or not registered");
+    LOG(ERROR) << StringPrintf("Handle is invalid or not registered");
     return (NFA_STATUS_BAD_HANDLE);
   }
 
@@ -980,18 +970,19 @@
                                  uint16_t delay_first_pdu_timeout) {
   tNFA_P2P_API_SET_LLCP_CFG* p_msg;
 
-  P2P_TRACE_API4(
-      "NFA_P2pSetLLCPConfig ():link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
-      link_miu, opt, wt, link_timeout);
-  P2P_TRACE_API4(
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
+                      link_miu, opt, wt, link_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "                       inact_timeout(init:%d, target:%d), "
       "symm_delay:%d, data_link_timeout:%d",
       inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
-  P2P_TRACE_API1("                       delay_first_pdu_timeout:%d",
-                 delay_first_pdu_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("                       delay_first_pdu_timeout:%d",
+                      delay_first_pdu_timeout);
 
   if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) {
-    P2P_TRACE_ERROR0("NFA_P2pSetLLCPConfig (): LLCP link is activated");
+    LOG(ERROR) << StringPrintf("LLCP link is activated");
     return (NFA_STATUS_FAILED);
   }
 
@@ -1047,30 +1038,15 @@
                  p_inact_timeout_target, p_symm_delay, p_data_link_timeout,
                  p_delay_first_pdu_timeout);
 
-  P2P_TRACE_API4(
-      "NFA_P2pGetLLCPConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
-      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
-  P2P_TRACE_API4(
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
+                      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "                       inact_timeout(init:%d, target:%d), "
       "symm_delay:%d, data_link_timeout:%d",
       *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay,
       *p_data_link_timeout);
-  P2P_TRACE_API1("                       delay_first_pdu_timeout:%d",
-                 *p_delay_first_pdu_timeout);
-}
-
-/*******************************************************************************
-**
-** Function         NFA_P2pSetTraceLevel
-**
-** Description      This function sets the trace level for P2P.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t NFA_P2pSetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) nfa_p2p_cb.trace_level = new_level;
-
-  return (nfa_p2p_cb.trace_level);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("                       delay_first_pdu_timeout:%d",
+                      *p_delay_first_pdu_timeout);
 }
diff --git a/src/nfa/p2p/nfa_p2p_main.c b/src/nfa/p2p/nfa_p2p_main.cc
similarity index 90%
rename from src/nfa/p2p/nfa_p2p_main.c
rename to src/nfa/p2p/nfa_p2p_main.cc
index 2787634..eb965e7 100644
--- a/src/nfa/p2p/nfa_p2p_main.c
+++ b/src/nfa/p2p/nfa_p2p_main.cc
@@ -21,15 +21,18 @@
  *  This is the main implementation file for the NFA P2P.
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "llcp_api.h"
-#include "llcp_defs.h"
 #include "nfa_dm_int.h"
-#include "nfa_p2p_api.h"
 #include "nfa_p2p_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  Global Variables
@@ -50,9 +53,8 @@
 static void nfa_p2p_update_active_listen(void);
 
 /* debug functions type */
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code);
-#endif
+static std::string nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code);
+static std::string nfa_p2p_evt_code(uint16_t evt_code);
 
 /*****************************************************************************
 **  Constants
@@ -99,7 +101,7 @@
 void nfa_p2p_discovery_cback(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data) {
   tNFA_CONN_EVT_DATA evt_data;
 
-  P2P_TRACE_DEBUG1("nfa_p2p_discovery_cback (): event:0x%02X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event);
 
   switch (event) {
     case NFA_DM_RF_DISC_START_EVT:
@@ -150,7 +152,7 @@
       break;
 
     default:
-      P2P_TRACE_ERROR0("Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       break;
   }
 }
@@ -164,8 +166,9 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_p2p_update_active_listen_timeout_cback(TIMER_LIST_ENT* p_tle) {
-  NFA_TRACE_ERROR0("nfa_p2p_update_active_listen_timeout_cback()");
+static void nfa_p2p_update_active_listen_timeout_cback(__attribute__((unused))
+                                                       TIMER_LIST_ENT* p_tle) {
+  LOG(ERROR) << __func__;
 
   /* restore active listen mode */
   nfa_p2p_update_active_listen();
@@ -185,9 +188,9 @@
   tNFA_DM_DISC_TECH_PROTO_MASK p2p_listen_mask = 0;
   NFC_HDR* p_msg;
 
-  P2P_TRACE_DEBUG1(
-      "nfa_p2p_update_active_listen (): listen_tech_mask_to_restore:0x%x",
-      nfa_p2p_cb.listen_tech_mask_to_restore);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("listen_tech_mask_to_restore:0x%x",
+                      nfa_p2p_cb.listen_tech_mask_to_restore);
 
   /* if active listen mode was removed temporarily */
   if (nfa_p2p_cb.listen_tech_mask_to_restore) {
@@ -243,7 +246,7 @@
       ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) {
     // Configure listen technologies and protocols and register callback to DTA
 
-    P2P_TRACE_DEBUG1(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "%s: DTA mode:Registering nfa_dm_poll_disc_cback to avoid LLCP in P2P",
         __func__);
     nfa_p2p_cb.dm_disc_handle =
@@ -278,8 +281,8 @@
   tNFA_LLCP_ACTIVATED llcp_activated;
   tNFA_LLCP_DEACTIVATED llcp_deactivated;
 
-  P2P_TRACE_DEBUG2("nfa_p2p_llcp_link_cback () event:0x%x, reason:0x%x", event,
-                   reason);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("event:0x%x, reason:0x%x", event, reason);
 
   if (event == LLCP_LINK_ACTIVATION_COMPLETE_EVT) {
     LLCP_GetLinkMIU(&nfa_p2p_cb.local_link_miu, &nfa_p2p_cb.remote_link_miu);
@@ -297,8 +300,9 @@
     llcp_activated.remote_wks = LLCP_GetRemoteWKS();
     llcp_activated.remote_version = LLCP_GetRemoteVersion();
 
-    nfa_dm_act_conn_cback_notify(NFA_LLCP_ACTIVATED_EVT,
-                                 (tNFA_CONN_EVT_DATA*)&llcp_activated);
+    tNFA_CONN_EVT_DATA nfa_conn_evt_data;
+    nfa_conn_evt_data.llcp_activated = llcp_activated;
+    nfa_dm_act_conn_cback_notify(NFA_LLCP_ACTIVATED_EVT, &nfa_conn_evt_data);
 
   } else if (event == LLCP_LINK_ACTIVATION_FAILED_EVT) {
     nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
@@ -324,7 +328,8 @@
         if ((nfa_p2p_cb.listen_tech_mask_to_restore == 0x00) &&
             (nfa_p2p_cb.listen_tech_mask &
              (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F))) {
-          P2P_TRACE_DEBUG0("Retry without active listen mode");
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("Retry without active listen mode");
 
           /* retry without active listen mode */
           nfa_p2p_update_active_listen();
@@ -343,8 +348,9 @@
     }
 
     llcp_deactivated.reason = reason;
-    nfa_dm_act_conn_cback_notify(NFA_LLCP_DEACTIVATED_EVT,
-                                 (tNFA_CONN_EVT_DATA*)&llcp_deactivated);
+    tNFA_CONN_EVT_DATA nfa_conn_evt_data;
+    nfa_conn_evt_data.llcp_deactivated = llcp_deactivated;
+    nfa_dm_act_conn_cback_notify(NFA_LLCP_DEACTIVATED_EVT, &nfa_conn_evt_data);
 
     if (reason != LLCP_LINK_RF_LINK_LOSS_ERR) /* if NFC link is still up */
     {
@@ -361,7 +367,8 @@
         ** target needs to trun off RF in case of receiving invalid
         ** frame from initiator
         */
-        P2P_TRACE_DEBUG0("Got LLCP_LINK_TIMEOUT in active mode on target");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Got LLCP_LINK_TIMEOUT in active mode on target");
         nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
       }
     }
@@ -381,7 +388,7 @@
 void nfa_p2p_activate_llcp(tNFC_DISCOVER* p_data) {
   tLLCP_ACTIVATE_CONFIG config;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_activate_llcp ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) ||
       (p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_F)) {
@@ -449,7 +456,7 @@
 **
 *******************************************************************************/
 void nfa_p2p_deactivate_llcp(void) {
-  P2P_TRACE_DEBUG0("nfa_p2p_deactivate_llcp ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   LLCP_DeactivateLink();
 }
@@ -467,12 +474,11 @@
 void nfa_p2p_init(void) {
   uint8_t xx;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize control block */
   memset(&nfa_p2p_cb, 0, sizeof(tNFA_P2P_CB));
   nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
-  nfa_p2p_cb.trace_level = APPL_INITIAL_TRACE_LEVEL;
 
   for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) {
     nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
@@ -493,7 +499,7 @@
 **
 *******************************************************************************/
 static void nfa_p2p_sys_disable(void) {
-  P2P_TRACE_DEBUG0("nfa_p2p_sys_disable()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfa_sys_stop_timer(&nfa_p2p_cb.active_listen_restore_timer);
 
@@ -515,7 +521,7 @@
   uint8_t wt, gen_bytes_len = LLCP_MAX_GEN_BYTES;
   uint8_t params[LLCP_MAX_GEN_BYTES + 5], *p, length;
 
-  P2P_TRACE_DEBUG0("nfa_p2p_set_config ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   LLCP_GetDiscoveryConfig(&wt, params + 2, &gen_bytes_len);
   if (nfa_dm_is_p2p_paused()) {
@@ -578,8 +584,8 @@
 void nfa_p2p_enable_listening(tNFA_SYS_ID sys_id, bool update_wks) {
   tNFA_DM_DISC_TECH_PROTO_MASK p2p_listen_mask = 0;
 
-  P2P_TRACE_DEBUG2("nfa_p2p_enable_listening () sys_id = %d, update_wks = %d",
-                   sys_id, update_wks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("sys_id = %d, update_wks = %d", sys_id, update_wks);
 
   if (sys_id == NFA_ID_P2P)
     nfa_p2p_cb.is_p2p_listening = true;
@@ -622,7 +628,7 @@
         ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) {
       /* Configure listen technologies and protocols and register callback to
        * NFA DM discovery */
-      P2P_TRACE_DEBUG1(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "%s: DTA mode:Registering nfa_dm_poll_disc_cback to avoid LLCP in "
           "P2P",
           __func__);
@@ -651,8 +657,8 @@
 **
 *******************************************************************************/
 void nfa_p2p_disable_listening(tNFA_SYS_ID sys_id, bool update_wks) {
-  P2P_TRACE_DEBUG2("nfa_p2p_disable_listening ()  sys_id = %d, update_wks = %d",
-                   sys_id, update_wks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("sys_id = %d, update_wks = %d", sys_id, update_wks);
 
   if (sys_id == NFA_ID_P2P)
     nfa_p2p_cb.is_p2p_listening = false;
@@ -686,8 +692,8 @@
 **
 *******************************************************************************/
 void nfa_p2p_update_listen_tech(tNFA_TECHNOLOGY_MASK tech_mask) {
-  P2P_TRACE_DEBUG1("nfa_p2p_update_listen_tech ()  tech_mask = 0x%x",
-                   tech_mask);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tech_mask = 0x%x", tech_mask);
 
   if (nfa_p2p_cb.listen_tech_mask_to_restore) {
     nfa_p2p_cb.listen_tech_mask_to_restore = 0;
@@ -726,30 +732,24 @@
   bool delete_msg = true;
   uint16_t event;
 
-  tNFA_P2P_MSG* p_msg = (tNFA_P2P_MSG*)p_hdr;
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("LLCP State [%s], Event [%s]",
+                      nfa_p2p_llcp_state_code(nfa_p2p_cb.llcp_state).c_str(),
+                      nfa_p2p_evt_code(p_hdr->event).c_str());
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  P2P_TRACE_DEBUG2("nfa_p2p_evt_hdlr (): LLCP State [%s], Event [%s]",
-                   nfa_p2p_llcp_state_code(nfa_p2p_cb.llcp_state),
-                   nfa_p2p_evt_code(p_msg->hdr.event));
-#else
-  P2P_TRACE_DEBUG2("nfa_p2p_evt_hdlr (): State 0x%02x, Event 0x%02x",
-                   nfa_p2p_cb.llcp_state, p_msg->hdr.event);
-#endif
-
-  event = p_msg->hdr.event & 0x00ff;
+  event = p_hdr->event & 0x00ff;
 
   /* execute action functions */
   if (event < NFA_P2P_NUM_ACTIONS) {
+    tNFA_P2P_MSG* p_msg = (tNFA_P2P_MSG*)p_hdr;
     delete_msg = (*nfa_p2p_action[event])(p_msg);
   } else {
-    P2P_TRACE_ERROR0("Unhandled event");
+    LOG(ERROR) << StringPrintf("Unhandled event");
   }
 
   return delete_msg;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_p2p_llcp_state_code
@@ -759,7 +759,7 @@
 ** Returns          string of state
 **
 *******************************************************************************/
-static char* nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code) {
+static std::string nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code) {
   switch (state_code) {
     case NFA_P2P_LLCP_STATE_IDLE:
       return "Link IDLE";
@@ -781,7 +781,7 @@
 ** Returns          string of event
 **
 *******************************************************************************/
-char* nfa_p2p_evt_code(uint16_t evt_code) {
+static std::string nfa_p2p_evt_code(uint16_t evt_code) {
   switch (evt_code) {
     case NFA_P2P_API_REG_SERVER_EVT:
       return "API_REG_SERVER";
@@ -815,4 +815,3 @@
       return "Unknown event";
   }
 }
-#endif /* Debug Functions */
diff --git a/src/nfa/rw/nfa_rw_act.c b/src/nfa/rw/nfa_rw_act.cc
similarity index 93%
rename from src/nfa/rw/nfa_rw_act.c
rename to src/nfa/rw/nfa_rw_act.cc
index 393ce02..7f9dcfa 100644
--- a/src/nfa/rw/nfa_rw_act.c
+++ b/src/nfa/rw/nfa_rw_act.cc
@@ -23,12 +23,18 @@
  ******************************************************************************/
 #include <log/log.h>
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "ndef_utils.h"
 #include "nfa_dm_int.h"
 #include "nfa_mem_co.h"
 #include "nfa_rw_int.h"
-#include "nfa_sys_int.h"
-#include "rw_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 #define NFA_RW_OPTION_INVALID 0xFF
 
@@ -44,7 +50,7 @@
 static void nfa_rw_error_cleanup(uint8_t event);
 static void nfa_rw_presence_check(tNFA_RW_MSG* p_data);
 static void nfa_rw_handle_t2t_evt(tRW_EVENT event, tRW_DATA* p_rw_data);
-static bool nfa_rw_detect_ndef(tNFA_RW_MSG* p_data);
+static bool nfa_rw_detect_ndef(void);
 static void nfa_rw_cback(tRW_EVENT event, tRW_DATA* p_rw_data);
 
 /*******************************************************************************
@@ -84,9 +90,10 @@
            p_rw_data->data.p_data->len);
     nfa_rw_cb.ndef_rd_offset += p_rw_data->data.p_data->len;
   } else {
-    NFA_TRACE_ERROR0("RW_SetActivatedTagType failed.");
+    LOG(ERROR) << StringPrintf("Exceed ndef_cur_size error");
     android_errorWriteLog(0x534e4554, "123583388");
   }
+
   GKI_freebuf(p_rw_data->data.p_data);
   p_rw_data->data.p_data = NULL;
 }
@@ -107,14 +114,10 @@
       (p_rw_data->data.p_data == NULL))
     return;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_DEBUG2("nfa_rw_send_data_to_upper: Len [0x%X] Status [%s]",
-                   p_rw_data->data.p_data->len,
-                   NFC_GetStatusName(p_rw_data->data.status));
-#else
-  NFA_TRACE_DEBUG2("nfa_rw_send_data_to_upper: Len [0x%X] Status [0x%X]",
-                   p_rw_data->data.p_data->len, p_rw_data->data.status);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_rw_send_data_to_upper: Len [0x%X] Status [%s]",
+                      p_rw_data->data.p_data->len,
+                      NFC_GetStatusName(p_rw_data->data.status).c_str());
 
   /* Notify conn cback of NFA_DATA_EVT */
   conn_evt_data.data.status = p_rw_data->data.status;
@@ -162,7 +165,8 @@
 
   if (nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE) {
     if (presence_check_start_delay) {
-      NFA_TRACE_DEBUG0("Starting presence check timer...");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Starting presence check timer...");
       nfa_sys_start_timer(&nfa_rw_cb.tle, NFA_RW_PRESENCE_CHECK_TICK_EVT,
                           presence_check_start_delay);
     } else {
@@ -183,7 +187,8 @@
 *******************************************************************************/
 void nfa_rw_stop_presence_check_timer(void) {
   nfa_sys_stop_timer(&nfa_rw_cb.tle);
-  NFA_TRACE_DEBUG0("Stopped presence check timer (if started)");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Stopped presence check timer (if started)");
 }
 
 /*******************************************************************************
@@ -195,10 +200,10 @@
 ** Returns          Nothing
 **
 *******************************************************************************/
-static void nfa_rw_handle_ndef_detect(tRW_EVENT event, tRW_DATA* p_rw_data) {
+static void nfa_rw_handle_ndef_detect(tRW_DATA* p_rw_data) {
   tNFA_CONN_EVT_DATA conn_evt_data;
 
-  NFA_TRACE_DEBUG3(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "NDEF Detection completed: cur_size=%i, max_size=%i, flags=0x%x",
       p_rw_data->ndef.cur_size, p_rw_data->ndef.max_size,
       p_rw_data->ndef.flags);
@@ -306,7 +311,7 @@
 ** Returns          Nothing
 **
 *******************************************************************************/
-static void nfa_rw_handle_tlv_detect(tRW_EVENT event, tRW_DATA* p_rw_data) {
+static void nfa_rw_handle_tlv_detect(tRW_DATA* p_rw_data) {
   tNFA_CONN_EVT_DATA conn_evt_data;
 
   /* Set TLV detection state */
@@ -326,8 +331,8 @@
 
   /* Check if TLV detection succeeded */
   if (p_rw_data->tlv.status == NFC_STATUS_OK) {
-    NFA_TRACE_DEBUG1("TLV Detection succeeded: num_bytes=%i",
-                     p_rw_data->tlv.num_bytes);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "TLV Detection succeeded: num_bytes=%i", p_rw_data->tlv.num_bytes);
 
     /* Store tlv properties */
     conn_evt_data.tlv_detect.status = NFA_STATUS_OK;
@@ -385,12 +390,12 @@
       (nfa_rw_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A) &&
       (nfa_rw_cb.protocol == NFC_PROTOCOL_T2T) &&
       (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)) {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "nfa_rw_handle_sleep_wakeup_rsp; Attempt to wake up Type 2 tag from "
         "HALT State is complete");
     if (status == NFC_STATUS_OK) {
       /* Type 2 Tag is wakeup from HALT state */
-      NFA_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "nfa_rw_handle_sleep_wakeup_rsp; Handle the NACK rsp received now");
       /* Initialize control block */
       activate_params.protocol = nfa_rw_cb.protocol;
@@ -401,7 +406,7 @@
       if ((RW_SetActivatedTagType(&activate_params, nfa_rw_cback)) !=
           NFC_STATUS_OK) {
         /* Log error (stay in NFA_RW_ST_ACTIVATED state until deactivation) */
-        NFA_TRACE_ERROR0("RW_SetActivatedTagType failed.");
+        LOG(ERROR) << StringPrintf("RW_SetActivatedTagType failed.");
         if (nfa_rw_cb.halt_event == RW_T2T_READ_CPLT_EVT) {
           if (nfa_rw_cb.rw_data.data.p_data)
             GKI_freebuf(nfa_rw_cb.rw_data.data.p_data);
@@ -433,11 +438,12 @@
      * mode) then deactivate the link if sleep wakeup failed */
     if ((nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE) &&
         (status != NFC_STATUS_OK)) {
-      NFA_TRACE_DEBUG0("Sleep wakeup failed. Deactivating...");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Sleep wakeup failed. Deactivating...");
       nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
     }
   } else {
-    NFA_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "nfa_rw_handle_sleep_wakeup_rsp; Legacy presence check performed");
     /* Legacy presence check performed */
     nfa_rw_handle_presence_check_rsp(status);
@@ -477,15 +483,17 @@
        * app of result */
       if (nfa_rw_cb.p_pending_msg->op_req.op == NFA_RW_OP_PRESENCE_CHECK) {
         /* Notify app of presence check status */
+        tNFA_CONN_EVT_DATA nfa_conn_evt_data;
+        nfa_conn_evt_data.status = status;
         nfa_dm_act_conn_cback_notify(NFA_PRESENCE_CHECK_EVT,
-                                     (tNFA_CONN_EVT_DATA*)&status);
+                                     &nfa_conn_evt_data);
         GKI_freebuf(nfa_rw_cb.p_pending_msg);
         nfa_rw_cb.p_pending_msg = NULL;
       }
       /* For all other APIs called during auto-presence check, perform the
          command now (if tag is still present) */
       else if (status == NFC_STATUS_OK) {
-        NFA_TRACE_DEBUG0(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Performing deferred operation after presence check...");
         p_pending_msg = (NFC_HDR*)nfa_rw_cb.p_pending_msg;
         nfa_rw_cb.p_pending_msg = NULL;
@@ -500,21 +508,24 @@
 
     /* Auto-presence check failed. Deactivate */
     if (status != NFC_STATUS_OK) {
-      NFA_TRACE_DEBUG0("Auto presence check failed. Deactivating...");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Auto presence check failed. Deactivating...");
       nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
     }
   }
   /* Handle presence check due to NFA_RwPresenceCheck API call */
   else {
     /* Notify app of presence check status */
-    nfa_dm_act_conn_cback_notify(NFA_PRESENCE_CHECK_EVT,
-                                 (tNFA_CONN_EVT_DATA*)&status);
+    tNFA_CONN_EVT_DATA nfa_conn_evt_data;
+    nfa_conn_evt_data.status = status;
+    nfa_dm_act_conn_cback_notify(NFA_PRESENCE_CHECK_EVT, &nfa_conn_evt_data);
 
     /* If in normal mode (not-exclusive RF mode) then deactivate the link if
      * presence check failed */
     if ((nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE) &&
-        (status != NFC_STATUS_OK)) {
-      NFA_TRACE_DEBUG0("Presence check failed. Deactivating...");
+        (nfa_conn_evt_data.status != NFC_STATUS_OK)) {
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Presence check failed. Deactivating...");
       nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY);
     }
   }
@@ -585,7 +596,7 @@
       break;
 
     case RW_T1T_TLV_DETECT_EVT:
-      nfa_rw_handle_tlv_detect(event, p_rw_data);
+      nfa_rw_handle_tlv_detect(p_rw_data);
       break;
 
     case RW_T1T_NDEF_DETECT_EVT:
@@ -601,7 +612,7 @@
         if (RW_T1tFormatNDef() == NFC_STATUS_OK) break;
       }
 
-      nfa_rw_handle_ndef_detect(event, p_rw_data);
+      nfa_rw_handle_ndef_detect(p_rw_data);
 
       break;
 
@@ -712,8 +723,8 @@
   conn_evt_data.status = p_rw_data->status;
 
   if (p_rw_data->status == NFC_STATUS_REJECTED) {
-    NFA_TRACE_DEBUG0(
-        "nfa_rw_handle_t2t_evt(); Waking the tag first before handling the "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "; Waking the tag first before handling the "
         "response!");
     /* Received NACK. Let DM wakeup the tag first (by putting tag to sleep and
      * then waking it up) */
@@ -753,18 +764,18 @@
           (nfa_rw_cb.skip_dyn_locks == true)) {
         /* NDEF Detection is complete */
         nfa_rw_cb.skip_dyn_locks = false;
-        nfa_rw_handle_ndef_detect(event, p_rw_data);
+        nfa_rw_handle_ndef_detect(p_rw_data);
       } else {
         /* Try to detect NDEF again, this time without reading dynamic lock
          * bytes */
         nfa_rw_cb.skip_dyn_locks = true;
-        nfa_rw_detect_ndef(NULL);
+        nfa_rw_detect_ndef();
       }
       break;
 
     case RW_T2T_TLV_DETECT_EVT: /* Lock control/Mem/Prop tlv detection complete
                                    */
-      nfa_rw_handle_tlv_detect(event, p_rw_data);
+      nfa_rw_handle_tlv_detect(p_rw_data);
       break;
 
     case RW_T2T_NDEF_READ_EVT: /* NDEF read completed     */
@@ -858,7 +869,7 @@
 
   switch (event) {
     case RW_T3T_NDEF_DETECT_EVT: /* NDEF detection complete */
-      nfa_rw_handle_ndef_detect(event, p_rw_data);
+      nfa_rw_handle_ndef_detect(p_rw_data);
       break;
 
     case RW_T3T_UPDATE_CPLT_EVT: /* Write completed */
@@ -966,8 +977,8 @@
       break;
 
     default:
-      NFA_TRACE_DEBUG1("nfa_rw_handle_t3t_evt(); Unhandled RW event 0x%X",
-                       event);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("; Unhandled RW event 0x%X", event);
       break;
   }
 }
@@ -986,7 +997,7 @@
 
   switch (event) {
     case RW_T4T_NDEF_DETECT_EVT: /* Result of NDEF detection procedure */
-      nfa_rw_handle_ndef_detect(event, p_rw_data);
+      nfa_rw_handle_ndef_detect(p_rw_data);
       break;
 
     case RW_T4T_NDEF_FORMAT_CPLT_EVT:
@@ -1099,8 +1110,8 @@
       break;
 
     default:
-      NFA_TRACE_DEBUG1("nfa_rw_handle_t4t_evt(); Unhandled RW event 0x%X",
-                       event);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("; Unhandled RW event 0x%X", event);
       break;
   }
 }
@@ -1120,7 +1131,7 @@
 
   switch (event) {
     case RW_I93_NDEF_DETECT_EVT: /* Result of NDEF detection procedure */
-      nfa_rw_handle_ndef_detect(event, p_rw_data);
+      nfa_rw_handle_ndef_detect(p_rw_data);
       break;
 
     case RW_I93_NDEF_READ_EVT: /* Segment of data received from type 4 tag */
@@ -1373,8 +1384,8 @@
       break;
 
     default:
-      NFA_TRACE_DEBUG1("nfa_rw_handle_i93_evt(); Unhandled RW event 0x%X",
-                       event);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("; Unhandled RW event 0x%X", event);
       break;
   }
 }
@@ -1389,7 +1400,8 @@
 **
 *******************************************************************************/
 static void nfa_rw_cback(tRW_EVENT event, tRW_DATA* p_rw_data) {
-  NFA_TRACE_DEBUG1("nfa_rw_cback: event=0x%02x", event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_rw_cback: event=0x%02x", event);
 
   /* Call appropriate event handler for tag type */
   if (event < RW_T1T_MAX_EVT) {
@@ -1408,7 +1420,7 @@
     /* Handle ISO 15693 tag events */
     nfa_rw_handle_i93_evt(event, p_rw_data);
   } else {
-    NFA_TRACE_ERROR1("nfa_rw_cback: unhandled event=0x%02x", event);
+    LOG(ERROR) << StringPrintf("nfa_rw_cback: unhandled event=0x%02x", event);
   }
 }
 
@@ -1463,7 +1475,8 @@
 
   /* Handle zero length NDEF message */
   if (nfa_rw_cb.ndef_cur_size == 0) {
-    NFA_TRACE_DEBUG0("NDEF message is zero-length");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NDEF message is zero-length");
 
     /* Send zero-lengh NDEF message to ndef callback */
     nfa_dm_ndef_handle_message(NFA_STATUS_OK, NULL, 0);
@@ -1480,8 +1493,9 @@
   nfa_rw_free_ndef_rx_buf();
   nfa_rw_cb.p_ndef_buf = (uint8_t*)nfa_mem_co_alloc(nfa_rw_cb.ndef_cur_size);
   if (nfa_rw_cb.p_ndef_buf == NULL) {
-    NFA_TRACE_ERROR1("Unable to allocate a buffer for reading NDEF (size=%i)",
-                     nfa_rw_cb.ndef_cur_size);
+    LOG(ERROR) << StringPrintf(
+        "Unable to allocate a buffer for reading NDEF (size=%i)",
+        nfa_rw_cb.ndef_cur_size);
 
     /* Command complete - perform cleanup, notify app */
     nfa_rw_command_complete();
@@ -1524,9 +1538,9 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_detect_ndef(tNFA_RW_MSG* p_data) {
+static bool nfa_rw_detect_ndef() {
   tNFA_CONN_EVT_DATA conn_evt_data;
-  NFA_TRACE_DEBUG0("nfa_rw_detect_ndef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   conn_evt_data.ndef_detect.status = nfa_rw_start_ndef_detection();
   if (conn_evt_data.ndef_detect.status != NFC_STATUS_OK) {
@@ -1557,13 +1571,13 @@
   if (nfa_rw_cb.flags & NFA_RW_FL_TAG_IS_READONLY) {
     /* error: ndef tag is read-only */
     status = NFC_STATUS_FAILED;
-    NFA_TRACE_ERROR0("Unable to write NDEF. Tag is read-only")
+    LOG(ERROR) << StringPrintf("Unable to write NDEF. Tag is read-only");
   } else if (nfa_rw_cb.ndef_max_size < nfa_rw_cb.ndef_wr_len) {
     /* error: ndef tag size is too small */
     status = NFC_STATUS_BUFFER_FULL;
-    NFA_TRACE_ERROR2(
+    LOG(ERROR) << StringPrintf(
         "Unable to write NDEF. Tag maxsize=%i, request write size=%i",
-        nfa_rw_cb.ndef_max_size, nfa_rw_cb.ndef_wr_len)
+        nfa_rw_cb.ndef_max_size, nfa_rw_cb.ndef_wr_len);
   } else {
     if (NFC_PROTOCOL_T1T == protocol) {
       /* Type1Tag    - NFC-A */
@@ -1601,11 +1615,11 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_read_ndef(tNFA_RW_MSG* p_data) {
+static bool nfa_rw_read_ndef() {
   tNFA_STATUS status = NFA_STATUS_OK;
   tNFA_CONN_EVT_DATA conn_evt_data;
 
-  NFA_TRACE_DEBUG0("nfa_rw_read_ndef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if ndef detection has been performed yet */
   if (nfa_rw_cb.ndef_st == NFA_RW_NDEF_ST_UNKNOWN) {
@@ -1643,14 +1657,14 @@
   tNDEF_STATUS ndef_status;
   tNFA_STATUS write_status = NFA_STATUS_OK;
   tNFA_CONN_EVT_DATA conn_evt_data;
-  NFA_TRACE_DEBUG0("nfa_rw_write_ndef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Validate NDEF message */
   ndef_status = NDEF_MsgValidate(p_data->op_req.params.write_ndef.p_data,
                                  p_data->op_req.params.write_ndef.len, false);
   if (ndef_status != NDEF_OK) {
-    NFA_TRACE_ERROR1("Invalid NDEF message. NDEF_MsgValidate returned %i",
-                     ndef_status);
+    LOG(ERROR) << StringPrintf(
+        "Invalid NDEF message. NDEF_MsgValidate returned %i", ndef_status);
 
     /* Command complete - perform cleanup, notify app */
     nfa_rw_command_complete();
@@ -1736,48 +1750,14 @@
         option = RW_T4T_CHK_EMPTY_I_BLOCK;
         break;
 
-      case NFA_RW_PRES_CHK_RESET:
-        /* option is initialized to NFA_RW_OPTION_INVALID, which will Deactivate
-         * to Sleep; Re-activate */
-        break;
-
-      case NFA_RW_PRES_CHK_RB_CH0:
-        option = RW_T4T_CHK_READ_BINARY_CH0;
-        break;
-
-      case NFA_RW_PRES_CHK_RB_CH3:
-        option = RW_T4T_CHK_READ_BINARY_CH3;
-        break;
-
       case NFA_RW_PRES_CHK_ISO_DEP_NAK:
         if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
           option = RW_T4T_CHK_ISO_DEP_NAK_PRES_CHK;
         }
         break;
       default:
-        if (nfa_rw_cb.flags & NFA_RW_FL_NDEF_OK) {
-          /* read binary on channel 0 */
-          option = RW_T4T_CHK_READ_BINARY_CH0;
-        } else {
-          /* NDEF DETECT failed.*/
-          if (nfa_dm_is_raw_frame_session()) {
-            /* NFA_SendRawFrame() is called */
-            if (p_nfa_dm_cfg->presence_check_option &
-                NFA_DM_PCO_EMPTY_I_BLOCK) {
-              /* empty I block */
-              option = RW_T4T_CHK_EMPTY_I_BLOCK;
-            } else {
-              /* read binary on channel 3 */
-              option = RW_T4T_CHK_READ_BINARY_CH3;
-            }
-          } else if (!(p_nfa_dm_cfg->presence_check_option &
-                       NFA_DM_PCO_ISO_SLEEP_WAKE) &&
-                     (nfa_rw_cb.intf_type == NFC_INTERFACE_ISO_DEP)) {
-            /* the option indicates to use empty I block && ISODEP interface is
-             * activated */
-            option = RW_T4T_CHK_EMPTY_I_BLOCK;
-          }
-        }
+        /* empty I block */
+        option = RW_T4T_CHK_EMPTY_I_BLOCK;
     }
 
     if (option != NFA_RW_OPTION_INVALID) {
@@ -1825,11 +1805,12 @@
 ** Returns          TRUE (caller frees message buffer)
 **
 *******************************************************************************/
-bool nfa_rw_presence_check_tick(tNFA_RW_MSG* p_data) {
+bool nfa_rw_presence_check_tick(__attribute__((unused)) tNFA_RW_MSG* p_data) {
   /* Store the current operation */
   nfa_rw_cb.cur_op = NFA_RW_OP_PRESENCE_CHECK;
   nfa_rw_cb.flags |= NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY;
-  NFA_TRACE_DEBUG0("Auto-presence check starting...");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Auto-presence check starting...");
 
   /* Perform presence check */
   nfa_rw_presence_check(NULL);
@@ -1846,7 +1827,8 @@
 ** Returns          TRUE (caller frees message buffer)
 **
 *******************************************************************************/
-bool nfa_rw_presence_check_timeout(tNFA_RW_MSG* p_data) {
+bool nfa_rw_presence_check_timeout(__attribute__((unused))
+                                   tNFA_RW_MSG* p_data) {
   nfa_rw_handle_presence_check_rsp(NFC_STATUS_FAILED);
   return true;
 }
@@ -1860,7 +1842,7 @@
 ** Returns          Nothing
 **
 *******************************************************************************/
-static void nfa_rw_format_tag(tNFA_RW_MSG* p_data) {
+static void nfa_rw_format_tag() {
   tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
@@ -1890,8 +1872,8 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_detect_tlv(tNFA_RW_MSG* p_data, uint8_t tlv) {
-  NFA_TRACE_DEBUG0("nfa_rw_detect_tlv");
+static bool nfa_rw_detect_tlv(uint8_t tlv) {
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   switch (nfa_rw_cb.protocol) {
     case NFC_PROTOCOL_T1T:
@@ -1926,7 +1908,7 @@
   tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-  NFA_TRACE_DEBUG0("nfa_rw_config_tag_ro ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (NFC_PROTOCOL_T1T == protocol) {
     /* Type1Tag    - NFC-A */
@@ -1971,7 +1953,7 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_t1t_rid(tNFA_RW_MSG* p_data) {
+static bool nfa_rw_t1t_rid() {
   if (RW_T1tRid() != NFC_STATUS_OK) nfa_rw_error_cleanup(NFA_READ_CPLT_EVT);
 
   return true;
@@ -1986,7 +1968,7 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_t1t_rall(tNFA_RW_MSG* p_data) {
+static bool nfa_rw_t1t_rall() {
   if (RW_T1tReadAll() != NFC_STATUS_OK) nfa_rw_error_cleanup(NFA_READ_CPLT_EVT);
 
   return true;
@@ -2229,7 +2211,7 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-static bool nfa_rw_t3t_get_system_codes(tNFA_RW_MSG* p_data) {
+static bool nfa_rw_t3t_get_system_codes() {
   tNFC_STATUS status;
   tNFA_TAG_PARAMS tag_params;
 
@@ -2386,12 +2368,12 @@
 ** Returns          nothing
 **
 *******************************************************************************/
-static void nfa_rw_raw_mode_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                                       tNFC_CONN* p_data) {
+static void nfa_rw_raw_mode_data_cback(__attribute__((unused)) uint8_t conn_id,
+                                       tNFC_CONN_EVT event, tNFC_CONN* p_data) {
   NFC_HDR* p_msg;
   tNFA_CONN_EVT_DATA evt_data;
 
-  NFA_TRACE_DEBUG1("nfa_rw_raw_mode_data_cback(): event = 0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
 
   if ((event == NFC_DATA_CEVT) &&
       ((p_data->data.status == NFC_STATUS_OK) ||
@@ -2407,9 +2389,8 @@
 
       GKI_freebuf(p_msg);
     } else {
-      NFA_TRACE_ERROR0(
-          "nfa_rw_raw_mode_data_cback (): received NFC_DATA_CEVT with NULL "
-          "data pointer");
+      LOG(ERROR) << StringPrintf(
+          "received NFC_DATA_CEVT with NULL data pointer");
     }
   } else if (event == NFC_DEACTIVATE_CEVT) {
     NFC_SetStaticRfCback(NULL);
@@ -2429,7 +2410,6 @@
   tNFC_ACTIVATE_DEVT* p_activate_params =
       p_data->activate_ntf.p_activate_params;
   tNFA_TAG_PARAMS tag_params;
-  tNFA_RW_OPERATION msg;
   bool activate_notify = true;
   uint8_t* p;
 
@@ -2442,12 +2422,12 @@
       GKI_freebuf(nfa_dm_cb.p_activate_ntf);
       nfa_dm_cb.p_activate_ntf = NULL;
     }
-    NFA_TRACE_DEBUG0(
-        "nfa_rw_activate_ntf () - Type 2 tag wake up from HALT State");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("- Type 2 tag wake up from HALT State");
     return true;
   }
 
-  NFA_TRACE_DEBUG0("nfa_rw_activate_ntf");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Initialize control block */
   nfa_rw_cb.protocol = p_activate_params->protocol;
@@ -2515,7 +2495,7 @@
   if ((RW_SetActivatedTagType(p_activate_params, nfa_rw_cback)) !=
       NFC_STATUS_OK) {
     /* Log error (stay in NFA_RW_ST_ACTIVATED state until deactivation) */
-    NFA_TRACE_ERROR0("RW_SetActivatedTagType failed.");
+    LOG(ERROR) << StringPrintf("RW_SetActivatedTagType failed.");
     return true;
   }
 
@@ -2532,8 +2512,9 @@
       memcpy(tag_params.t1t.hr,
              p_activate_params->intf_param.intf_param.frame.param,
              NFA_T1T_HR_LEN);
-      msg.op = NFA_RW_OP_T1T_RID;
-      nfa_rw_handle_op_req((tNFA_RW_MSG*)&msg);
+      tNFA_RW_MSG msg;
+      msg.op_req.op = NFA_RW_OP_T1T_RID;
+      nfa_rw_handle_op_req(&msg);
       /* Delay notifying upper layer of NFA_ACTIVATED_EVT
          until HR0/HR1 is received */
       activate_notify = false;
@@ -2553,8 +2534,9 @@
       activate_notify = false;
 
       /* Issue command to get Felica system codes */
-      msg.op = NFA_RW_OP_T3T_GET_SYSTEM_CODES;
-      nfa_rw_handle_op_req((tNFA_RW_MSG*)&msg);
+      tNFA_RW_MSG msg;
+      msg.op_req.op = NFA_RW_OP_T3T_GET_SYSTEM_CODES;
+      nfa_rw_handle_op_req(&msg);
     }
   } else if (NFA_PROTOCOL_T5T == nfa_rw_cb.protocol) {
     /* Delay notifying upper layer of NFA_ACTIVATED_EVT to retrieve additional
@@ -2642,7 +2624,7 @@
 ** Returns          TRUE (message buffer to be freed by caller)
 **
 *******************************************************************************/
-bool nfa_rw_deactivate_ntf(tNFA_RW_MSG* p_data) {
+bool nfa_rw_deactivate_ntf(__attribute__((unused)) tNFA_RW_MSG* p_data) {
   /* Clear the activated flag */
   nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATED;
 
@@ -2690,7 +2672,7 @@
 
   /* Check if activated */
   if (!(nfa_rw_cb.flags & NFA_RW_FL_ACTIVATED)) {
-    NFA_TRACE_ERROR0("nfa_rw_handle_op_req: not activated");
+    LOG(ERROR) << StringPrintf("nfa_rw_handle_op_req: not activated");
     return true;
   }
   /* Check if currently busy with another API call */
@@ -2701,7 +2683,7 @@
   else if (nfa_rw_cb.flags & NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY) {
     /* Cache the command (will be handled once auto-presence check is completed)
      */
-    NFA_TRACE_DEBUG1(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "Deferring operation %i until after auto-presence check is completed",
         p_data->op_req.op);
     nfa_rw_cb.p_pending_msg = p_data;
@@ -2709,7 +2691,8 @@
     return false;
   }
 
-  NFA_TRACE_DEBUG1("nfa_rw_handle_op_req: op=0x%02x", p_data->op_req.op);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_rw_handle_op_req: op=0x%02x", p_data->op_req.op);
 
   nfa_rw_cb.flags |= NFA_RW_FL_API_BUSY;
 
@@ -2723,11 +2706,11 @@
   switch (p_data->op_req.op) {
     case NFA_RW_OP_DETECT_NDEF:
       nfa_rw_cb.skip_dyn_locks = false;
-      nfa_rw_detect_ndef(p_data);
+      nfa_rw_detect_ndef();
       break;
 
     case NFA_RW_OP_READ_NDEF:
-      nfa_rw_read_ndef(p_data);
+      nfa_rw_read_ndef();
       break;
 
     case NFA_RW_OP_WRITE_NDEF:
@@ -2752,15 +2735,15 @@
       break;
 
     case NFA_RW_OP_FORMAT_TAG:
-      nfa_rw_format_tag(p_data);
+      nfa_rw_format_tag();
       break;
 
     case NFA_RW_OP_DETECT_LOCK_TLV:
-      nfa_rw_detect_tlv(p_data, TAG_LOCK_CTRL_TLV);
+      nfa_rw_detect_tlv(TAG_LOCK_CTRL_TLV);
       break;
 
     case NFA_RW_OP_DETECT_MEM_TLV:
-      nfa_rw_detect_tlv(p_data, TAG_MEM_CTRL_TLV);
+      nfa_rw_detect_tlv(TAG_MEM_CTRL_TLV);
       break;
 
     case NFA_RW_OP_SET_TAG_RO:
@@ -2769,11 +2752,11 @@
       break;
 
     case NFA_RW_OP_T1T_RID:
-      nfa_rw_t1t_rid(p_data);
+      nfa_rw_t1t_rid();
       break;
 
     case NFA_RW_OP_T1T_RALL:
-      nfa_rw_t1t_rall(p_data);
+      nfa_rw_t1t_rall();
       break;
 
     case NFA_RW_OP_T1T_READ:
@@ -2819,7 +2802,7 @@
       break;
 
     case NFA_RW_OP_T3T_GET_SYSTEM_CODES:
-      nfa_rw_t3t_get_system_codes(p_data);
+      nfa_rw_t3t_get_system_codes();
       break;
 
     /* ISO 15693 tag commands */
@@ -2842,8 +2825,8 @@
       break;
 
     default:
-      NFA_TRACE_ERROR1("nfa_rw_handle_api: unhandled operation: %i",
-                       p_data->op_req.op);
+      LOG(ERROR) << StringPrintf("nfa_rw_handle_api: unhandled operation: %i",
+                                 p_data->op_req.op);
       break;
   }
 
@@ -2865,7 +2848,7 @@
   tNFA_CONN_EVT_DATA conn_evt_data;
   uint8_t event;
 
-  NFA_TRACE_ERROR0("nfa_rw_op_req_while_busy: unable to handle API");
+  LOG(ERROR) << StringPrintf("nfa_rw_op_req_while_busy: unable to handle API");
 
   /* Return appropriate event for requested API, with status=BUSY */
   conn_evt_data.status = NFA_STATUS_BUSY;
diff --git a/src/nfa/rw/nfa_rw_api.c b/src/nfa/rw/nfa_rw_api.cc
similarity index 94%
rename from src/nfa/rw/nfa_rw_api.c
rename to src/nfa/rw/nfa_rw_api.cc
index c21414d..a55962a 100644
--- a/src/nfa/rw/nfa_rw_api.c
+++ b/src/nfa/rw/nfa_rw_api.cc
@@ -22,10 +22,16 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_api.h"
 #include "nfa_rw_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*****************************************************************************
 **  Constants
@@ -61,7 +67,7 @@
 tNFA_STATUS NFA_RwDetectNDef(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwDetectNDef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -106,7 +112,7 @@
 tNFA_STATUS NFA_RwReadNDef(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwReadNDef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -145,7 +151,7 @@
 tNFA_STATUS NFA_RwWriteNDef(uint8_t* p_data, uint32_t len) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API2("NFA_RwWriteNDef (): ndef p_data=%08x, len: %i", p_data, len);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ndef len: %i", len);
 
   /* Validate parameters */
   if (p_data == NULL) return (NFA_STATUS_INVALID_PARAM);
@@ -183,7 +189,7 @@
 tNFA_STATUS NFA_RwPresenceCheck(tNFA_RW_PRES_CHK_OPTION option) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwPresenceCheck");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -216,7 +222,7 @@
 tNFA_STATUS NFA_RwFormatTag(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwFormatTag");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -255,8 +261,8 @@
   if ((protocol != NFC_PROTOCOL_T1T) && (protocol != NFC_PROTOCOL_T2T) &&
       (protocol != NFC_PROTOCOL_T5T) && (protocol != NFC_PROTOCOL_ISO_DEP) &&
       (protocol != NFC_PROTOCOL_T3T)) {
-    NFA_TRACE_API1(
-        "NFA_RwSetTagReadOnly (): Cannot Configure as read only for Protocol: "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Cannot Configure as read only for Protocol: "
         "%d",
         protocol);
     return (NFA_STATUS_REJECTED);
@@ -264,13 +270,14 @@
 
   if ((!b_hard_lock && (protocol == NFC_PROTOCOL_T5T)) ||
       (b_hard_lock && (protocol == NFC_PROTOCOL_ISO_DEP))) {
-    NFA_TRACE_API2("NFA_RwSetTagReadOnly (): Cannot %s for Protocol: %d",
-                   b_hard_lock ? "Hard lock" : "Soft lock", protocol);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Cannot %s for Protocol: %d",
+                        b_hard_lock ? "Hard lock" : "Soft lock", protocol);
     return (NFA_STATUS_REJECTED);
   }
 
-  NFA_TRACE_API1("NFA_RwSetTagReadOnly (): %s",
-                 b_hard_lock ? "Hard lock" : "Soft lock");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s", b_hard_lock ? "Hard lock" : "Soft lock");
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -328,7 +335,7 @@
 tNFA_STATUS NFA_RwLocateTlv(uint8_t tlv_type) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwLocateTlv");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -601,7 +608,8 @@
 tNFA_STATUS NFA_RwT2tRead(uint8_t block_number) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwT2tRead (): Block to read: %d", block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Block to read: %d", block_number);
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -634,7 +642,8 @@
 tNFA_STATUS NFA_RwT2tWrite(uint8_t block_number, uint8_t* p_data) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwT2tWrite (): Block to write: %d", block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Block to write: %d", block_number);
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -670,7 +679,8 @@
 tNFA_STATUS NFA_RwT2tSectorSelect(uint8_t sector_number) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwT2tRead (): sector to select: %d", sector_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("sector to select: %d", sector_number);
 
   p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
   if (p_msg != NULL) {
@@ -706,7 +716,8 @@
   tNFA_RW_OPERATION* p_msg;
   uint8_t* p_block_desc;
 
-  NFA_TRACE_API1("NFA_RwT3tRead (): num_blocks to read: %i", num_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("num_blocks to read: %i", num_blocks);
 
   /* Validate parameters */
   if ((num_blocks == 0) || (t3t_blocks == NULL))
@@ -757,7 +768,8 @@
   tNFA_RW_OPERATION* p_msg;
   uint8_t *p_block_desc, *p_data_area;
 
-  NFA_TRACE_API1("NFA_RwT3tWrite (): num_blocks to write: %i", num_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("num_blocks to write: %i", num_blocks);
 
   /* Validate parameters */
   if ((num_blocks == 0) || (t3t_blocks == NULL) | (p_data == NULL))
@@ -814,8 +826,8 @@
 tNFA_STATUS NFA_RwI93Inventory(bool afi_present, uint8_t afi, uint8_t* p_uid) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API2("NFA_RwI93Inventory (): afi_present:%d, AFI: 0x%02X",
-                 afi_present, afi);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("afi_present:%d, AFI: 0x%02X", afi_present, afi);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -864,7 +876,7 @@
 tNFA_STATUS NFA_RwI93StayQuiet(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwI93StayQuiet ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -904,8 +916,8 @@
 tNFA_STATUS NFA_RwI93ReadSingleBlock(uint8_t block_number) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwI93ReadSingleBlock (): block_number: 0x%02X",
-                 block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("block_number: 0x%02X", block_number);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -946,8 +958,8 @@
 tNFA_STATUS NFA_RwI93WriteSingleBlock(uint8_t block_number, uint8_t* p_data) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwI93WriteSingleBlock (): block_number: 0x%02X",
-                 block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("block_number: 0x%02X", block_number);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -997,7 +1009,8 @@
 tNFA_STATUS NFA_RwI93LockBlock(uint8_t block_number) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwI93LockBlock (): block_number: 0x%02X", block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("block_number: 0x%02X", block_number);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1040,8 +1053,8 @@
                                         uint16_t number_blocks) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API2("NFA_RwI93ReadMultipleBlocks(): %d, %d", first_block_number,
-                 number_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%d, %d", first_block_number, number_blocks);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1086,8 +1099,8 @@
   tNFA_RW_OPERATION* p_msg;
   uint16_t data_length;
 
-  NFA_TRACE_API2("NFA_RwI93WriteMultipleBlocks (): %d, %d", first_block_number,
-                 number_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%d, %d", first_block_number, number_blocks);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1145,8 +1158,8 @@
 tNFA_STATUS NFA_RwI93Select(uint8_t* p_uid) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API3("NFA_RwI93Select (): UID: [%02X%02X%02X...]", *(p_uid),
-                 *(p_uid + 1), *(p_uid + 2));
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "UID: [%02X%02X%02X...]", *(p_uid), *(p_uid + 1), *(p_uid + 2));
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1189,7 +1202,7 @@
 tNFA_STATUS NFA_RwI93ResetToReady(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwI93ResetToReady ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1228,7 +1241,7 @@
 tNFA_STATUS NFA_RwI93WriteAFI(uint8_t afi) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwI93WriteAFI (): AFI: 0x%02X", afi);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("AFI: 0x%02X", afi);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1269,7 +1282,7 @@
 tNFA_STATUS NFA_RwI93LockAFI(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwI93LockAFI ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1308,7 +1321,7 @@
 tNFA_STATUS NFA_RwI93WriteDSFID(uint8_t dsfid) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API1("NFA_RwI93WriteDSFID (): DSFID: 0x%02X", dsfid);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("DSFID: 0x%02X", dsfid);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1349,7 +1362,7 @@
 tNFA_STATUS NFA_RwI93LockDSFID(void) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwI93LockDSFID ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1389,7 +1402,7 @@
 tNFA_STATUS NFA_RwI93GetSysInfo(uint8_t* p_uid) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API0("NFA_RwI93GetSysInfo ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
@@ -1438,8 +1451,8 @@
                                                  uint16_t number_blocks) {
   tNFA_RW_OPERATION* p_msg;
 
-  NFA_TRACE_API2("NFA_RwI93GetMultiBlockSecurityStatus(): %d, %d",
-                 first_block_number, number_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%d, %d", first_block_number, number_blocks);
 
   if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
     return (NFA_STATUS_WRONG_PROTOCOL);
diff --git a/src/nfa/rw/nfa_rw_main.c b/src/nfa/rw/nfa_rw_main.cc
similarity index 89%
rename from src/nfa/rw/nfa_rw_main.c
rename to src/nfa/rw/nfa_rw_main.cc
index e1b594b..a8f83b5 100644
--- a/src/nfa/rw/nfa_rw_main.c
+++ b/src/nfa/rw/nfa_rw_main.cc
@@ -22,11 +22,17 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_dm_int.h"
 #include "nfa_rw_api.h"
 #include "nfa_rw_int.h"
-#include "nfa_sys.h"
-#include "nfa_sys_int.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* NFA_RW control block */
 tNFA_RW_CB nfa_rw_cb;
@@ -49,9 +55,7 @@
 /*****************************************************************************
 ** Local function prototypes
 *****************************************************************************/
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* nfa_rw_evt_2_str(uint16_t event);
-#endif
+static std::string nfa_rw_evt_2_str(uint16_t event);
 
 /*******************************************************************************
 **
@@ -63,7 +67,7 @@
 **
 *******************************************************************************/
 void nfa_rw_init(void) {
-  NFA_TRACE_DEBUG0("nfa_rw_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize control block */
   memset(&nfa_rw_cb, 0, sizeof(tNFA_RW_CB));
@@ -172,27 +176,21 @@
 bool nfa_rw_handle_event(NFC_HDR* p_msg) {
   uint16_t act_idx;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFA_TRACE_EVENT3("nfa_rw_handle_event event: %s (0x%02x), flags: %08x",
-                   nfa_rw_evt_2_str(p_msg->event), p_msg->event,
-                   nfa_rw_cb.flags);
-#else
-  NFA_TRACE_EVENT2("nfa_rw_handle_event event: 0x%x, flags: %08x", p_msg->event,
-                   nfa_rw_cb.flags);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_rw_handle_event event: %s (0x%02x), flags: %08x",
+      nfa_rw_evt_2_str(p_msg->event).c_str(), p_msg->event, nfa_rw_cb.flags);
 
   /* Get NFA_RW sub-event */
   act_idx = (p_msg->event & 0x00FF);
   if (act_idx < (NFA_RW_MAX_EVT & 0xFF)) {
     return (*nfa_rw_action_tbl[act_idx])((tNFA_RW_MSG*)p_msg);
   } else {
-    NFA_TRACE_ERROR1("nfa_rw_handle_event: unhandled event 0x%02X",
-                     p_msg->event);
+    LOG(ERROR) << StringPrintf("nfa_rw_handle_event: unhandled event 0x%02X",
+                               p_msg->event);
     return true;
   }
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfa_rw_evt_2_str
@@ -200,25 +198,19 @@
 ** Description      convert nfa_rw evt to string
 **
 *******************************************************************************/
-static char* nfa_rw_evt_2_str(uint16_t event) {
+static std::string nfa_rw_evt_2_str(uint16_t event) {
   switch (event) {
     case NFA_RW_OP_REQUEST_EVT:
       return "NFA_RW_OP_REQUEST_EVT";
-
     case NFA_RW_ACTIVATE_NTF_EVT:
       return "NFA_RW_ACTIVATE_NTF_EVT";
-
     case NFA_RW_DEACTIVATE_NTF_EVT:
       return "NFA_RW_DEACTIVATE_NTF_EVT";
-
     case NFA_RW_PRESENCE_CHECK_TICK_EVT:
       return "NFA_RW_PRESENCE_CHECK_TICK_EVT";
-
     case NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT:
       return "NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT";
-
     default:
       return "Unknown";
   }
 }
-#endif /* BT_TRACE_VERBOSE */
diff --git a/src/nfa/sys/nfa_sys_cback.c b/src/nfa/sys/nfa_sys_cback.cc
similarity index 90%
rename from src/nfa/sys/nfa_sys_cback.c
rename to src/nfa/sys/nfa_sys_cback.cc
index 0ccd3d8..4ca898c 100644
--- a/src/nfa/sys/nfa_sys_cback.c
+++ b/src/nfa/sys/nfa_sys_cback.cc
@@ -21,9 +21,16 @@
  *  Registration/deregistration functions for inter-module callbacks
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_sys.h"
 #include "nfa_sys_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*******************************************************************************
 **
 ** Function         nfa_sys_cback_reg_enable_complete
@@ -52,9 +59,8 @@
 void nfa_sys_cback_notify_enable_complete(uint8_t id) {
   nfa_sys_cb.enable_cplt_flags |= (0x0001 << id);
 
-  NFA_TRACE_DEBUG2(
-      "nfa_sys_cback_notify_enable_complete () enable_cplt_flags=0x%x, "
-      "enable_cplt_mask=0x%x",
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "enable_cplt_flags=0x%x, enable_cplt_mask=0x%x",
       nfa_sys_cb.enable_cplt_flags, nfa_sys_cb.enable_cplt_mask);
 
   if ((nfa_sys_cb.enable_cplt_flags == nfa_sys_cb.enable_cplt_mask) &&
@@ -93,10 +99,8 @@
 void nfa_sys_cback_notify_nfcc_power_mode_proc_complete(uint8_t id) {
   nfa_sys_cb.proc_nfcc_pwr_mode_cplt_flags |= (0x0001 << id);
 
-  NFA_TRACE_DEBUG2(
-      "nfa_sys_cback_notify_nfcc_power_mode_proc_complete () flags=0x%x, "
-      "mask=0x%x",
-      nfa_sys_cb.proc_nfcc_pwr_mode_cplt_flags,
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "flags=0x%x, mask=0x%x", nfa_sys_cb.proc_nfcc_pwr_mode_cplt_flags,
       nfa_sys_cb.proc_nfcc_pwr_mode_cplt_mask);
 
   /* except SYS */
diff --git a/src/nfa/sys/nfa_sys_cfg.c b/src/nfa/sys/nfa_sys_cfg.cc
similarity index 93%
rename from src/nfa/sys/nfa_sys_cfg.c
rename to src/nfa/sys/nfa_sys_cfg.cc
index 0c6a199..ccf01f2 100644
--- a/src/nfa/sys/nfa_sys_cfg.c
+++ b/src/nfa/sys/nfa_sys_cfg.cc
@@ -25,13 +25,11 @@
 
 #include "gki.h"
 #include "nfa_sys.h"
-#include "nfc_target.h"
 
 const tNFA_SYS_CFG nfa_sys_cfg = {
     NFA_MBOX_EVT_MASK,       /* GKI mailbox event */
     NFA_MBOX_ID,             /* GKI mailbox id */
     NFA_TIMER_ID,            /* GKI timer id */
-    APPL_INITIAL_TRACE_LEVEL /* initial trace level */
 };
 
 tNFA_SYS_CFG* p_nfa_sys_cfg = (tNFA_SYS_CFG*)&nfa_sys_cfg;
diff --git a/src/nfa/sys/nfa_sys_main.c b/src/nfa/sys/nfa_sys_main.cc
similarity index 90%
rename from src/nfa/sys/nfa_sys_main.c
rename to src/nfa/sys/nfa_sys_main.cc
index fafbf15..147d1b0 100644
--- a/src/nfa/sys/nfa_sys_main.c
+++ b/src/nfa/sys/nfa_sys_main.cc
@@ -22,11 +22,17 @@
  *
  ******************************************************************************/
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
-#include "nfa_sys.h"
 #include "nfa_sys_int.h"
-#include "nfa_sys_ptim.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* protocol timer update period, in milliseconds */
 #ifndef NFA_SYS_TIMER_PERIOD
@@ -34,9 +40,8 @@
 #endif
 
 /* system manager control block definition */
-tNFA_SYS_CB nfa_sys_cb = {
-    0,
-}; /* nfa_sys control block. statically initialize 'flags' field to 0 */
+tNFA_SYS_CB nfa_sys_cb = {};
+/* nfa_sys control block. statically initialize 'flags' field to 0 */
 
 /*******************************************************************************
 **
@@ -53,7 +58,6 @@
   nfa_sys_cb.flags |= NFA_SYS_FL_INITIALIZED;
   nfa_sys_ptim_init(&nfa_sys_cb.ptim_cb, NFA_SYS_TIMER_PERIOD,
                     p_nfa_sys_cfg->timer);
-  nfa_sys_cb.trace_level = p_nfa_sys_cfg->trace_level;
 }
 
 /*******************************************************************************
@@ -70,7 +74,8 @@
   uint8_t id;
   bool freebuf = true;
 
-  NFA_TRACE_EVENT1("NFA got event 0x%04X", p_msg->event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFA got event 0x%04X", p_msg->event);
 
   /* get subsystem id from event */
   id = (uint8_t)(p_msg->event >> 8);
@@ -79,7 +84,7 @@
   if ((id < NFA_ID_MAX) && (nfa_sys_cb.is_reg[id])) {
     freebuf = (*nfa_sys_cb.reg[id]->evt_hdlr)(p_msg);
   } else {
-    NFA_TRACE_WARNING1("NFA got unregistered event id %d", id);
+    LOG(WARNING) << StringPrintf("NFA got unregistered event id %d", id);
   }
 
   if (freebuf) {
@@ -125,8 +130,8 @@
       nfa_sys_cb.proc_nfcc_pwr_mode_cplt_mask |= (0x0001 << id);
   }
 
-  NFA_TRACE_DEBUG2("nfa_sys_register () id=%i, enable_cplt_mask=0x%x", id,
-                   nfa_sys_cb.enable_cplt_mask);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "id=%i, enable_cplt_mask=0x%x", id, nfa_sys_cb.enable_cplt_mask);
 }
 
 /*******************************************************************************
@@ -170,7 +175,8 @@
 **
 *******************************************************************************/
 void nfa_sys_deregister(uint8_t id) {
-  NFA_TRACE_DEBUG1("nfa_sys: deregistering subsystem %i", id);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_sys: deregistering subsystem %i", id);
 
   nfa_sys_cb.is_reg[id] = false;
 
@@ -227,7 +233,8 @@
 void nfa_sys_enable_subsystems(void) {
   uint8_t id;
 
-  NFA_TRACE_DEBUG0("nfa_sys: enabling subsystems");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_sys: enabling subsystems");
 
   /* Enable all subsystems except SYS */
   for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) {
@@ -257,7 +264,8 @@
   uint8_t id;
   bool done = true;
 
-  NFA_TRACE_DEBUG1("nfa_sys: disabling subsystems:%d", graceful);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_sys: disabling subsystems:%d", graceful);
   nfa_sys_cb.graceful_disable = graceful;
 
   /* Disable all subsystems above NFA_DM. (NFA_DM and NFA_SYS will be disabled
@@ -294,8 +302,8 @@
 void nfa_sys_notify_nfcc_power_mode(uint8_t nfcc_power_mode) {
   uint8_t id;
 
-  NFA_TRACE_DEBUG1("nfa_sys: notify NFCC power mode(%d) to subsystems",
-                   nfcc_power_mode);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfa_sys: notify NFCC power mode(%d) to subsystems", nfcc_power_mode);
 
   /* Notify NFCC power state to all subsystems except NFA_SYS */
   for (id = NFA_ID_DM; id < NFA_ID_MAX; id++) {
@@ -360,14 +368,3 @@
 **
 *******************************************************************************/
 void nfa_sys_disable_timers(void) { nfa_sys_cb.timers_disabled = true; }
-
-/*******************************************************************************
-**
-** Function         nfa_sys_set_trace_level
-**
-** Description      Set trace level for BTA
-**
-** Returns          void
-**
-*******************************************************************************/
-void nfa_sys_set_trace_level(uint8_t level) { nfa_sys_cb.trace_level = level; }
diff --git a/src/nfa/sys/nfa_sys_ptim.c b/src/nfa/sys/nfa_sys_ptim.cc
similarity index 88%
rename from src/nfa/sys/nfa_sys_ptim.c
rename to src/nfa/sys/nfa_sys_ptim.cc
index 0e42042..3f0d48a 100644
--- a/src/nfa/sys/nfa_sys_ptim.c
+++ b/src/nfa/sys/nfa_sys_ptim.cc
@@ -21,12 +21,15 @@
  *  Protocol timer services (taken from bta ptim)
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 
 #include "nfa_sys_ptim.h"
-#include "gki.h"
 #include "nfa_sys.h"
-#include "nfa_sys_int.h"
-#include "nfc_target.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -86,7 +89,8 @@
          (p_cb->timer_queue.p_first->ticks <= 0)) {
     /* removed expired timer from list */
     p_tle = p_cb->timer_queue.p_first;
-    NFA_TRACE_DEBUG1("nfa_sys_ptim_timer_update expired: %08x", p_tle);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("nfa_sys_ptim_timer_update expired: %p", p_tle);
     GKI_remove_from_timer_list(&p_cb->timer_queue, p_tle);
 
     /* call timer callback */
@@ -104,7 +108,7 @@
 
   /* if timer list is empty stop periodic GKI timer */
   if (p_cb->timer_queue.p_first == NULL) {
-    NFA_TRACE_DEBUG0("ptim timer stop");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ptim timer stop");
     GKI_stop_timer(p_cb->timer_id);
   }
 }
@@ -121,11 +125,12 @@
 *******************************************************************************/
 void nfa_sys_ptim_start_timer(tPTIM_CB* p_cb, TIMER_LIST_ENT* p_tle,
                               uint16_t type, int32_t timeout) {
-  NFA_TRACE_DEBUG1("nfa_sys_ptim_start_timer %08x", p_tle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_sys_ptim_start_timer %p", p_tle);
 
   /* if timer list is currently empty, start periodic GKI timer */
   if (p_cb->timer_queue.p_first == NULL) {
-    NFA_TRACE_DEBUG0("ptim timer start");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ptim timer start");
     p_cb->last_gki_ticks = GKI_get_tick_count();
     GKI_start_timer(p_cb->timer_id, GKI_MS_TO_TICKS(p_cb->period), true);
   }
@@ -148,13 +153,14 @@
 **
 *******************************************************************************/
 void nfa_sys_ptim_stop_timer(tPTIM_CB* p_cb, TIMER_LIST_ENT* p_tle) {
-  NFA_TRACE_DEBUG1("nfa_sys_ptim_stop_timer %08x", p_tle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfa_sys_ptim_stop_timer %p", p_tle);
 
   GKI_remove_from_timer_list(&p_cb->timer_queue, p_tle);
 
   /* if timer list is empty stop periodic GKI timer */
   if (p_cb->timer_queue.p_first == NULL) {
-    NFA_TRACE_DEBUG0("ptim timer stop");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ptim timer stop");
     GKI_stop_timer(p_cb->timer_id);
   }
 }
diff --git a/src/nfc/include/ce_api.h b/src/nfc/include/ce_api.h
index 0432545..1ed0f91 100644
--- a/src/nfc/include/ce_api.h
+++ b/src/nfc/include/ce_api.h
@@ -38,28 +38,18 @@
   CE_T3T_NDEF_UPDATE_START_EVT = CE_T3T_FIRST_EVT,
   CE_T3T_NDEF_UPDATE_CPLT_EVT,
   CE_T3T_UPDATE_EVT,
-  CE_T3T_CHECK_EVT,
   CE_T3T_RAW_FRAME_EVT,
-  CE_T3T_MAX_EVT,
 
   CE_T4T_NDEF_UPDATE_START_EVT = CE_T4T_FIRST_EVT,
   CE_T4T_NDEF_UPDATE_CPLT_EVT,
   CE_T4T_NDEF_UPDATE_ABORT_EVT,
-  CE_T4T_RAW_FRAME_EVT,
-  CE_T4T_MAX_EVT
+  CE_T4T_RAW_FRAME_EVT
 };
 
-#define CE_RAW_FRAME_EVT 0xFF
-
 typedef uint8_t tCE_EVENT;
 
 typedef struct {
   tNFC_STATUS status;
-  NFC_HDR* p_data;
-} tCE_T2T_DATA;
-
-typedef struct {
-  tNFC_STATUS status;
   uint8_t* p_data;
   bool b_updated;
   uint32_t length;
@@ -194,33 +184,6 @@
 
 /*******************************************************************************
 **
-** Function         CE_T4TTestSetCC
-**
-** Description      Set fields in Capability Container File for testing
-**
-** Returns          NFC_STATUS_OK if success
-**
-*******************************************************************************/
-extern tNFC_STATUS CE_T4TTestSetCC(uint16_t cc_len, uint8_t version,
-                                   uint16_t max_le, uint16_t max_lc);
-
-/*******************************************************************************
-**
-** Function         CE_T4TTestSetNDEFCtrlTLV
-**
-** Description      Set fields in NDEF File Control TLV for testing
-**
-** Returns          NFC_STATUS_OK if success
-**
-*******************************************************************************/
-extern tNFC_STATUS CE_T4TTestSetNDEFCtrlTLV(uint8_t type, uint8_t length,
-                                            uint16_t file_id,
-                                            uint16_t max_file_size,
-                                            uint8_t read_access,
-                                            uint8_t write_access);
-
-/*******************************************************************************
-**
 ** Function         CE_SendRawFrame
 **
 ** Description      This function sends a raw frame to the peer device.
@@ -242,18 +205,4 @@
 extern tNFC_STATUS CE_SetActivatedTagType(tNFC_ACTIVATE_DEVT* p_activate_params,
                                           uint16_t t3t_system_code,
                                           tCE_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         CE_SetTraceLevel
-**
-** Description      This function sets the trace level for Card Emulation mode.
-**                  If called with a value of 0xFF,
-**                  it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t CE_SetTraceLevel(uint8_t new_level);
-
 #endif /* CE_API_H */
diff --git a/src/nfc/int/ce_int.h b/src/nfc/include/ce_int.h
similarity index 96%
rename from src/nfc/int/ce_int.h
rename to src/nfc/include/ce_int.h
index 338d61f..1a48a36 100644
--- a/src/nfc/int/ce_int.h
+++ b/src/nfc/include/ce_int.h
@@ -36,9 +36,6 @@
 #define CE_MAX_SUP_PROTO NCI_PROTOCOL_MIFARE
 #endif
 
-/* 2^8=256. CB use uint8_t for BytesPerPage, so max is 7 */
-#define CE_MAX_BYTE_PER_PAGE 7
-
 /* CE Type 3 Tag structures */
 
 /* Type 3 Tag NDEF card-emulation */
@@ -133,8 +130,6 @@
   uint16_t ndef_max; /* max size of p_ndef */
   uint16_t ndef_cur; /* current size of p_ndef */
   tNFC_RF_TECH tech;
-  uint8_t trace_level;
-
 } tCE_CB;
 
 /*
@@ -155,9 +150,6 @@
 /*****************************************************************************
 **  EXTERNAL FUNCTION DECLARATIONS
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /* Global NFC data */
 extern tCE_CB ce_cb;
@@ -173,8 +165,4 @@
 extern tNFC_STATUS ce_select_t4t(void);
 extern void ce_t4t_process_timeout(TIMER_LIST_ENT* p_tle);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* CE_INT_H_ */
diff --git a/src/nfc/include/llcp_api.h b/src/nfc/include/llcp_api.h
index 50b0740..b71fca4 100644
--- a/src/nfc/include/llcp_api.h
+++ b/src/nfc/include/llcp_api.h
@@ -24,6 +24,7 @@
 #ifndef LLCP_API_H
 #define LLCP_API_H
 
+#include <string>
 #include "llcp_defs.h"
 #include "nfc_target.h"
 
@@ -86,8 +87,6 @@
 #define LLCP_LINK_VERSION_FAILED 0x01
 /* Failed to parse received general bytes   */
 #define LLCP_LINK_BAD_GEN_BYTES 0x02
-/* internal error                           */
-#define LLCP_LINK_INTERNAL_ERROR 0x03
 /* Link has been deactivated by local       */
 #define LLCP_LINK_LOCAL_INITIATED 0x04
 /* Link has been deactivated by remote      */
@@ -98,9 +97,6 @@
 #define LLCP_LINK_FRAME_ERROR 0x07
 /* RF link loss without any rx LLC PDU      */
 #define LLCP_LINK_RF_LINK_LOSS_NO_RX_LLC 0x08
-#define LLCP_LINK_RF_TRANSMISSION_ERR NFC_STATUS_RF_TRANSMISSION_ERR
-#define LLCP_LINK_RF_PROTOCOL_ERR NFC_STATUS_RF_PROTOCOL_ERR
-#define LLCP_LINK_RF_TIMEOUT NFC_STATUS_TIMEOUT
 #define LLCP_LINK_RF_LINK_LOSS_ERR NFC_STATUS_LINK_LOSS
 
 typedef void(tLLCP_LINK_CBACK)(uint8_t event, uint8_t reason);
@@ -222,9 +218,6 @@
 /*****************************************************************************
 **  External Function Declarations
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -356,7 +349,7 @@
 **
 *******************************************************************************/
 extern uint8_t LLCP_RegisterServer(uint8_t reg_sap, uint8_t link_type,
-                                   char* p_service_name,
+                                   std::string p_service_name,
                                    tLLCP_APP_CBACK* p_sap_cback);
 
 /*******************************************************************************
@@ -660,18 +653,6 @@
 
 /*******************************************************************************
 **
-** Function         LLCP_SetTraceLevel
-**
-** Description      This function sets the trace level for LLCP.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-
-extern uint8_t LLCP_SetTraceLevel(uint8_t new_level);
-/*******************************************************************************
-**
 ** Function         LLCP_RegisterDtaCback
 **
 ** Description      Register callback function for LLCP DTA testing
@@ -695,8 +676,4 @@
 extern void LLCP_SetTestParams(uint8_t version, uint16_t wks);
 #endif
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* LLCP_API_H */
diff --git a/src/nfc/include/llcp_defs.h b/src/nfc/include/llcp_defs.h
index ba25710..f79c029 100644
--- a/src/nfc/include/llcp_defs.h
+++ b/src/nfc/include/llcp_defs.h
@@ -52,12 +52,9 @@
 #define LLCP_PDU_DM_TYPE 7
 #define LLCP_PDU_FRMR_TYPE 8
 #define LLCP_PDU_SNL_TYPE 9
-#define LLCP_PDU_RESERVED_1010 10
-#define LLCP_PDU_RESERVED_1011 11
 #define LLCP_PDU_I_TYPE 12
 #define LLCP_PDU_RR_TYPE 13
 #define LLCP_PDU_RNR_TYPE 14
-#define LLCP_PDU_RESERVED_1111 15
 
 #define LLCP_PDU_SYMM_SIZE 2
 #define LLCP_PDU_DISC_SIZE 2
@@ -81,16 +78,6 @@
 #define LLCP_FRMR_R_ERROR_FLAG 0x02 /* Receive Sequence Error */
 #define LLCP_FRMR_S_ERROR_FLAG 0x01 /* Send Sequence Error */
 
-#define LLCP_GET_FRMR_W_ERROR_FLAG(u8) (((uint8_t)(u8) >> 7) & 0x01)
-#define LLCP_GET_FRMR_I_ERROR_FLAG(u8) (((uint8_t)(u8) >> 6) & 0x01)
-#define LLCP_GET_FRMR_R_ERROR_FLAG(u8) (((uint8_t)(u8) >> 5) & 0x01)
-#define LLCP_GET_FRMR_S_ERROR_FLAG(u8) (((uint8_t)(u8) >> 4) & 0x01)
-#define LLCP_GET_FRMR_PTYPE(u8) ((uint8_t)(u8)&0x0F)
-#define LLCP_GET_FRMR_VS(u16) (((uint16_t)(u16) >> 12) & 0x000F)
-#define LLCP_GET_FRMR_VR(u16) (((uint16_t)(u16) >> 8) & 0x000F)
-#define LLCP_GET_FRMR_VSA(u16) (((uint16_t)(u16) >> 4) & 0x000F)
-#define LLCP_GET_FRMR_VRA(u16) (((uint16_t)(u16) >> 0) & 0x000F)
-
 /*
 ** LLCP Parameter Descriptions
 */
@@ -122,21 +109,10 @@
 
 /* Well-Known Service Bitmap */
 #define LLCP_WKS_MASK_LM 0x0001  /* Link Management */
-#define LLCP_WKS_MASK_SDP 0x0002 /* Service Discovery "urn:nfc:sn:sdp" */
-#define LLCP_WKS_MASK_IP 0x0004  /* IP over LLCP Binding "urn:nfc:sn:ip" */
-/* OBEX over LLCP Binding "urn:nfc:sn:obex" */
-#define LLCP_WKS_MASK_OBEX 0x0008
-/* Simple NDEP Exchange Protocol "urn:nfc:sn:snep" */
-#define LLCP_WKS_MASK_SNEP 0x0010
 
 /* Well-Known Service Access Points */
 #define LLCP_SAP_LM 0x00  /* Link Management */
 #define LLCP_SAP_SDP 0x01 /* Service Discovery "urn:nfc:sn:sdp" */
-#define LLCP_SAP_IP 0x02  /* IP over LLCP Binding "urn:nfc:sn:ip" */
-/* OBEX over LLCP Binding "urn:nfc:sn:obex" */
-#define LLCP_SAP_OBEX 0x03
-/* Simple NDEP Exchange Protocol "urn:nfc:sn:snep" */
-#define LLCP_SAP_SNEP 0x04
 
 /* Link Timeout, LTO */
 #define LLCP_LTO_TYPE 0x04
@@ -157,7 +133,6 @@
 /* Option, OPT */
 #define LLCP_OPT_TYPE 0x07
 #define LLCP_OPT_LEN 0x01
-#define LLCP_GET_OPT_LSC(u8) ((uint8_t)(u8)&0x03)
 
 /* Service Discovery Request, SDREQ */
 #define LLCP_SDREQ_TYPE 0x08
@@ -182,7 +157,6 @@
 #define LLCP_SEQ_MODULO 16
 
 #define LLCP_NUM_SAPS 64
-#define LLCP_LOWER_BOUND_WK_SAP 0x00
 #define LLCP_UPPER_BOUND_WK_SAP 0x0F
 #define LLCP_LOWER_BOUND_SDP_SAP 0x10
 #define LLCP_UPPER_BOUND_SDP_SAP 0x1F
@@ -192,10 +166,6 @@
 /* Max Payload */
 /* Maximum Payload size, Length Reduction LRi/LRt */
 #define LLCP_NCI_MAX_PAYL_SIZE 254
-/* Data exchange protocol header, 3 bytes */
-#define LLCP_NFC_DEP_HEADER_SIZE 3
-#define LLCP_MAX_PAYLOAD_SIZE \
-  (LLCP_NCI_MAX_PAYL_SIZE - LLCP_NFC_DEP_HEADER_SIZE)
 
 #define LLCP_MAX_GEN_BYTES 48
 
diff --git a/src/nfc/int/llcp_int.h b/src/nfc/include/llcp_int.h
similarity index 97%
rename from src/nfc/int/llcp_int.h
rename to src/nfc/include/llcp_int.h
index fdf1c70..6051ca0 100644
--- a/src/nfc/int/llcp_int.h
+++ b/src/nfc/include/llcp_int.h
@@ -107,8 +107,8 @@
 */
 
 typedef struct {
-  uint8_t link_type;       /* logical link and/or data link                */
-  uint8_t* p_service_name; /* GKI buffer containing service name           */
+  uint8_t link_type;    /* logical link and/or data link                */
+  char* p_service_name; /* GKI buffer containing service name           */
   tLLCP_APP_CBACK* p_app_cback; /* application's callback pointer */
 
   BUFFER_Q ui_xmit_q;      /* UI PDU queue for transmitting                */
@@ -126,8 +126,7 @@
   LLCP_DLC_STATE_W4_LOCAL_RESP,  /* waiting for connection confirm from upper
                                     layer  */
   LLCP_DLC_STATE_CONNECTED,      /* data link connection has been established */
-  LLCP_DLC_STATE_W4_REMOTE_DM, /* waiting for disconnection confirm from peer */
-  LLCP_DLC_STATE_MAX
+  LLCP_DLC_STATE_W4_REMOTE_DM /* waiting for disconnection confirm from peer */
 };
 typedef uint8_t tLLCP_DLC_STATE;
 
@@ -217,8 +216,6 @@
 */
 
 typedef struct {
-  uint8_t trace_level; /* LLCP trace level                             */
-
   tLLCP_SDP_CB sdp_cb; /* SDP control block                            */
   tLLCP_LCB lcb;       /* LLCP link control block                      */
   tLLCP_APP_CB wks_cb[LLCP_MAX_WKS]; /* Application's registration for
@@ -285,10 +282,6 @@
 
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
 ** LLCP global data
 */
@@ -364,8 +357,4 @@
 tLLCP_STATUS llcp_sdp_proc_snl(uint16_t sdu_length, uint8_t* p);
 void llcp_sdp_check_send_snl(void);
 void llcp_sdp_proc_deactivation(void);
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/src/nfc/include/nci_hmsgs.h b/src/nfc/include/nci_hmsgs.h
index d013cde..2ea0c70 100644
--- a/src/nfc/include/nci_hmsgs.h
+++ b/src/nfc/include/nci_hmsgs.h
@@ -24,10 +24,6 @@
 #ifndef NFC_NCI_HMSGS_H
 #define NFC_NCI_HMSGS_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include "nci_defs.h"
 #include "nfc_types.h"
 
@@ -69,10 +65,7 @@
 uint8_t nci_snd_set_routing_cmd(bool more, uint8_t num_tlv, uint8_t tlv_size,
                                 uint8_t* p_param_tlvs);
 uint8_t nci_snd_get_routing_cmd(void);
-#endif
-
-#ifdef __cplusplus
-}
+uint8_t nci_snd_nfcee_power_link_control(uint8_t nfcee_id, uint8_t pl_config);
 #endif
 
 #endif /* NFC_NCI_MSGS_H */
diff --git a/src/nfc/include/ndef_utils.h b/src/nfc/include/ndef_utils.h
index 960185e..a30d40f 100644
--- a/src/nfc/include/ndef_utils.h
+++ b/src/nfc/include/ndef_utils.h
@@ -68,19 +68,6 @@
 };
 typedef uint8_t tNDEF_STATUS;
 
-#define HR_REC_TYPE_LEN 2        /* Handover Request Record Type     */
-#define HS_REC_TYPE_LEN 2        /* Handover Select Record Type      */
-#define HC_REC_TYPE_LEN 2        /* Handover Carrier recrod Type     */
-#define CR_REC_TYPE_LEN 2        /* Collision Resolution Record Type */
-#define AC_REC_TYPE_LEN 2        /* Alternative Carrier Record Type  */
-#define ERR_REC_TYPE_LEN 3       /* Error Record Type                */
-#define BT_OOB_REC_TYPE_LEN 32   /* Bluetooth OOB Data Type          */
-#define WIFI_WSC_REC_TYPE_LEN 23 /* Wifi WSC Data Type               */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Functions to parse a received NDEF Message
 */
 /*******************************************************************************
@@ -280,39 +267,6 @@
 
 /*******************************************************************************
 **
-** Function         NDEF_MsgInsertRec
-**
-** Description      This function inserts a record at a specific index into the
-**                  given NDEF message
-**
-** Returns          OK, or error if the record did not fit
-**                  *p_cur_size is updated
-**
-*******************************************************************************/
-extern tNDEF_STATUS NDEF_MsgInsertRec(uint8_t* p_msg, uint32_t max_size,
-                                      uint32_t* p_cur_size, int32_t index,
-                                      uint8_t tnf, uint8_t* p_type,
-                                      uint8_t type_len, uint8_t* p_id,
-                                      uint8_t id_len, uint8_t* p_payload,
-                                      uint32_t payload_len);
-
-/*******************************************************************************
-**
-** Function         NDEF_MsgAppendRec
-**
-** Description      This function adds NDEF records to the end of an NDEF
-**                  message.
-**
-** Returns          OK, or error if the record did not fit
-**                  *p_cur_size is updated
-**
-*******************************************************************************/
-extern tNDEF_STATUS NDEF_MsgAppendRec(uint8_t* p_msg, uint32_t max_size,
-                                      uint32_t* p_cur_size, uint8_t* p_new_rec,
-                                      uint32_t new_rec_len);
-
-/*******************************************************************************
-**
 ** Function         NDEF_MsgAppendPayload
 **
 ** Description      This function appends extra payload to a specific record in
@@ -403,9 +357,4 @@
 extern tNDEF_STATUS NDEF_MsgCopyAndDechunk(uint8_t* p_src, uint32_t src_len,
                                            uint8_t* p_dest,
                                            uint32_t* p_out_len);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NDEF_UTILS_H */
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 2a35942..c4a654e 100644
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -113,51 +113,22 @@
  * NFC Config Parameter IDs defined by NCI
  **********************************************/
 #define NFC_PMID_TOTAL_DURATION NCI_PARAM_ID_TOTAL_DURATION
-#define NFC_PMID_CON_DEVICES_LIMIT NCI_PARAM_ID_CON_DEVICES_LIMIT
-#define NFC_PMID_PA_BAILOUT NCI_PARAM_ID_PA_BAILOUT
-#define NFC_PMID_CON_DISCOVERY_PARAM NCI_PARAM_ID_CON_DISCOVERY_PARAM
-#define NFC_PMID_PB_AFI NCI_PARAM_ID_PB_AFI
-#define NFC_PMID_PB_BAILOUT NCI_PARAM_ID_PB_BAILOUT
-#define NFC_PMID_PB_ATTRIB_PARAM1 NCI_PARAM_ID_PB_ATTRIB_PARAM1
-#define NFC_PMID_PF_BIT_RATE NCI_PARAM_ID_PF_BIT_RATE
 #define NFC_PMID_PF_RC NCI_PARAM_ID_PF_RC
-#define NFC_PMID_PB_H_INFO NCI_PARAM_ID_PB_H_INFO
-#define NFC_PMID_BITR_NFC_DEP NCI_PARAM_ID_BITR_NFC_DEP
 #define NFC_PMID_ATR_REQ_GEN_BYTES NCI_PARAM_ID_ATR_REQ_GEN_BYTES
-#define NFC_PMID_ATR_REQ_CONFIG NCI_PARAM_ID_ATR_REQ_CONFIG
 #define NFC_PMID_LA_HIST_BY NCI_PARAM_ID_LA_HIST_BY
 #define NFC_PMID_LA_NFCID1 NCI_PARAM_ID_LA_NFCID1
-#define NFC_PMID_PI_BIT_RATE NCI_PARAM_ID_PI_BIT_RATE
 #define NFC_PMID_LA_BIT_FRAME_SDD NCI_PARAM_ID_LA_BIT_FRAME_SDD
 #define NFC_PMID_LA_PLATFORM_CONFIG NCI_PARAM_ID_LA_PLATFORM_CONFIG
 #define NFC_PMID_LA_SEL_INFO NCI_PARAM_ID_LA_SEL_INFO
-#define NFC_PMID_LI_BIT_RATE NCI_PARAM_ID_LI_BIT_RATE
 #define NFC_PMID_LB_SENSB_INFO NCI_PARAM_ID_LB_SENSB_INFO
-#define NFC_PMID_LB_PROTOCOL NCI_PARAM_ID_LB_PROTOCOL
 #define NFC_PMID_LB_H_INFO NCI_PARAM_ID_LB_H_INFO_RSP
 #define NFC_PMID_LB_NFCID0 NCI_PARAM_ID_LB_NFCID0
 #define NFC_PMID_LB_APPDATA NCI_PARAM_ID_LB_APPDATA
 #define NFC_PMID_LB_SFGI NCI_PARAM_ID_LB_SFGI
 #define NFC_PMID_LB_ADC_FO NCI_PARAM_ID_LB_ADC_FO
 #define NFC_PMID_LF_T3T_ID1 NCI_PARAM_ID_LF_T3T_ID1
-#define NFC_PMID_LF_T3T_ID2 NCI_PARAM_ID_LF_T3T_ID2
-#define NFC_PMID_LF_T3T_ID3 NCI_PARAM_ID_LF_T3T_ID3
-#define NFC_PMID_LF_T3T_ID4 NCI_PARAM_ID_LF_T3T_ID4
-#define NFC_PMID_LF_T3T_ID5 NCI_PARAM_ID_LF_T3T_ID5
-#define NFC_PMID_LF_T3T_ID6 NCI_PARAM_ID_LF_T3T_ID6
-#define NFC_PMID_LF_T3T_ID7 NCI_PARAM_ID_LF_T3T_ID7
-#define NFC_PMID_LF_T3T_ID8 NCI_PARAM_ID_LF_T3T_ID8
-#define NFC_PMID_LF_T3T_ID9 NCI_PARAM_ID_LF_T3T_ID9
-#define NFC_PMID_LF_T3T_ID10 NCI_PARAM_ID_LF_T3T_ID10
-#define NFC_PMID_LF_T3T_ID11 NCI_PARAM_ID_LF_T3T_ID11
-#define NFC_PMID_LF_T3T_ID12 NCI_PARAM_ID_LF_T3T_ID12
-#define NFC_PMID_LF_T3T_ID13 NCI_PARAM_ID_LF_T3T_ID13
-#define NFC_PMID_LF_T3T_ID14 NCI_PARAM_ID_LF_T3T_ID14
-#define NFC_PMID_LF_T3T_ID15 NCI_PARAM_ID_LF_T3T_ID15
-#define NFC_PMID_LF_T3T_ID16 NCI_PARAM_ID_LF_T3T_ID16
 #define NFC_PMID_LF_PROTOCOL NCI_PARAM_ID_LF_PROTOCOL
 #define NFC_PMID_LF_T3T_PMM NCI_PARAM_ID_LF_T3T_PMM
-#define NFC_PMID_LF_T3T_MAX NCI_PARAM_ID_LF_T3T_MAX
 #define NFC_PMID_LF_T3T_FLAGS2 NCI_PARAM_ID_LF_T3T_FLAGS2
 #define NFC_PMID_FWI NCI_PARAM_ID_FWI
 #define NFC_PMID_LF_CON_BITR_F NCI_PARAM_ID_LF_CON_BITR_F
@@ -165,17 +136,14 @@
 #define NFC_PMID_ATR_RES_GEN_BYTES NCI_PARAM_ID_ATR_RES_GEN_BYTES
 #define NFC_PMID_ATR_RSP_CONFIG NCI_PARAM_ID_ATR_RSP_CONFIG
 #define NFC_PMID_RF_FIELD_INFO NCI_PARAM_ID_RF_FIELD_INFO
-#define NFC_PMID_NFC_DEP_OP NCI_PARAM_ID_NFC_DEP_OP
-#define NFC_PARAM_ID_RF_EE_ACTION NCI_PARAM_ID_RF_EE_ACTION
-#define NFC_PARAM_ID_ISO_DEP_OP NCI_PARAM_ID_ISO_DEP_OP
 
 /* Technology based routing  */
 #define NFC_ROUTE_TAG_TECH NCI_ROUTE_TAG_TECH
 /* Protocol based routing  */
 #define NFC_ROUTE_TAG_PROTO NCI_ROUTE_TAG_PROTO
 #define NFC_ROUTE_TAG_AID NCI_ROUTE_TAG_AID /* AID routing */
+#define NFC_ROUTE_TAG_SYSCODE NCI_ROUTE_TAG_SYSCODE /* System Code routing*/
 /* tag, len, 2 byte value for technology/protocol based routing */
-#define NFC_ROUTE_TLV_ENTRY_SIZE 4
 
 /* For routing */
 #define NFC_DH_ID NCI_DH_ID /* for DH */
@@ -183,7 +151,6 @@
 /* use a proprietary range */
 #define NFC_TEST_ID NCI_TEST_ID
 
-typedef uint8_t tNFC_PMID;
 #define NFC_TL_SIZE 2
 #define NFC_SAVED_CMD_SIZE 2
 
@@ -223,7 +190,9 @@
   NFC_NFCC_TRANSPORT_ERR_REVT,      /* 16 NCI Tranport error            */
   NFC_NFCC_POWER_OFF_REVT,          /* 17 NFCC turned off               */
   NFC_SET_POWER_SUB_STATE_REVT,     /* 18 Set power sub state response  */
-  NFC_FIRST_VS_REVT                 /* First vendor-specific rsp event  */
+  NFC_NFCEE_PL_CONTROL_REVT,        /* NFCEE Power/Link Ctrl response*/
+  NFC_NFCEE_STATUS_REVT             /* NFCEE Status Notification     */
+                                    /* First vendor-specific rsp event  */
 };
 typedef uint16_t tNFC_RESPONSE_EVT;
 
@@ -284,7 +253,6 @@
 #define NFC_NFCEE_INTERFACE_T3T NCI_NFCEE_INTERFACE_T3T
 #define NFC_NFCEE_INTERFACE_TRANSPARENT NCI_NFCEE_INTERFACE_TRANSPARENT
 #define NFC_NFCEE_INTERFACE_PROPRIETARY NCI_NFCEE_INTERFACE_PROPRIETARY
-typedef uint8_t tNFC_NFCEE_INTERFACE;
 
 #define NFC_NFCEE_TAG_HW_ID NCI_NFCEE_TAG_HW_ID
 #define NFC_NFCEE_TAG_ATR_BYTES NCI_NFCEE_TAG_ATR_BYTES
@@ -298,12 +266,15 @@
   uint8_t info[NFC_MAX_EE_INFO];
 } tNFC_NFCEE_TLV;
 
+/* NFCEE unrecoverable error */
+#define NFC_NFCEE_STATUS_UNRECOVERABLE_ERROR NCI_NFCEE_STS_UNRECOVERABLE_ERROR
 /* NFCEE connected and inactive */
 #define NFC_NFCEE_STATUS_INACTIVE NCI_NFCEE_STS_CONN_INACTIVE
 /* NFCEE connected and active   */
 #define NFC_NFCEE_STATUS_ACTIVE NCI_NFCEE_STS_CONN_ACTIVE
 /* NFCEE removed                */
 #define NFC_NFCEE_STATUS_REMOVED NCI_NFCEE_STS_REMOVED
+
 /* the data type associated with NFC_NFCEE_INFO_REVT */
 typedef struct {
   tNFC_STATUS status;    /* The event status - place holder  */
@@ -313,6 +284,7 @@
   uint8_t ee_interface[NFC_MAX_EE_INTERFACE]; /* NFCEE interface       */
   uint8_t num_tlvs;                       /* number of TLVs                   */
   tNFC_NFCEE_TLV ee_tlv[NFC_MAX_EE_TLVS]; /* The TLVs associated with NFCEE   */
+  bool nfcee_power_ctrl; /* 1, if NFCC has control of NFCEE Power Supply */
 } tNFC_NFCEE_INFO_REVT;
 
 #define NFC_MODE_ACTIVATE NCI_NFCEE_MD_ACTIVATE
@@ -364,25 +336,29 @@
   NFC_HDR* p_data;    /* The received Data                */
 } tNFC_DATA_CEVT;
 
+/* the data type associated with NFC_NFCEE_PL_CONTROL_REVT */
+typedef struct {
+  tNFC_STATUS status;              /* The event status */
+  uint8_t nfcee_id;                /* NFCEE ID */
+  tNCI_NFCEE_PL_CONFIG pl_control; /* Power/Link Control command */
+} tNFC_NFCEE_PL_CONTROL_REVT;
+
+/* the data type associated with NFC_NFCEE_STATUS_REVT */
+typedef struct {
+  tNFC_STATUS status;              /* The event status */
+  uint8_t nfcee_id;                /* NFCEE ID */
+  tNCI_EE_NTF_STATUS nfcee_status; /* NFCEE status */
+} tNFC_NFCEE_STATUS_REVT;
 /* RF Field Status */
-/* No field generated by remote device  */
-#define NFC_RF_STS_NO_REMOTE NCI_RF_STS_NO_REMOTE
-/* field generated by remote device     */
-#define NFC_RF_STS_REMOTE NCI_RF_STS_REMOTE
 typedef uint8_t tNFC_RF_STS;
 
 /* RF Field Technologies */
 #define NFC_RF_TECHNOLOGY_A NCI_RF_TECHNOLOGY_A
 #define NFC_RF_TECHNOLOGY_B NCI_RF_TECHNOLOGY_B
 #define NFC_RF_TECHNOLOGY_F NCI_RF_TECHNOLOGY_F
-#define NFC_RF_TECHNOLOGY_V NCI_RF_TECHNOLOGY_V
 typedef uint8_t tNFC_RF_TECH;
 
-#ifdef __cplusplus
-extern "C" uint8_t NFC_GetNCIVersion();
-#else
 extern uint8_t NFC_GetNCIVersion();
-#endif
 
 /* Supported Protocols */
 #define NFC_PROTOCOL_UNKNOWN NCI_PROTOCOL_UNKNOWN /* Unknown */
@@ -395,7 +371,7 @@
 /* Type5Tag    - NFC-V/ISO15693*/
 #define NFC_PROTOCOL_T5T NFC_PROTOCOL_T5T_(NFC_GetNCIVersion())
 #define NFC_PROTOCOL_T5T_(x) \
-  ((x == NCI_VERSION_2_0) ? NCI_PROTOCOL_T5T : NCI_PROTOCOL_15693)
+  (((x) == NCI_VERSION_2_0) ? NCI_PROTOCOL_T5T : NCI_PROTOCOL_15693)
 /* Type 4A,4B  - NFC-A or NFC-B   */
 #define NFC_PROTOCOL_ISO_DEP NCI_PROTOCOL_ISO_DEP
 /* NFCDEP/LLCP - NFC-A or NFC-F       */
@@ -429,16 +405,10 @@
 
 /* Select Response codes */
 #define NFC_SEL_RES_NFC_FORUM_T2T 0x00
-#define NFC_SEL_RES_MF_CLASSIC 0x08
 
 /* Bit Rates */
-#define NFC_BIT_RATE_106 NCI_BIT_RATE_106   /* 106 kbit/s */
 #define NFC_BIT_RATE_212 NCI_BIT_RATE_212   /* 212 kbit/s */
 #define NFC_BIT_RATE_424 NCI_BIT_RATE_424   /* 424 kbit/s */
-#define NFC_BIT_RATE_848 NCI_BIT_RATE_848   /* 848 Kbit/s */
-#define NFC_BIT_RATE_1696 NCI_BIT_RATE_1696 /* 1696 Kbit/s*/
-#define NFC_BIT_RATE_3392 NCI_BIT_RATE_3392 /* 3392 Kbit/s*/
-#define NFC_BIT_RATE_6784 NCI_BIT_RATE_6784 /* 6784 Kbit/s*/
 typedef uint8_t tNFC_BIT_RATE;
 
 /**********************************************
@@ -447,11 +417,7 @@
 #define NFC_INTERFACE_EE_DIRECT_RF NCI_INTERFACE_EE_DIRECT_RF
 #define NFC_INTERFACE_FRAME NCI_INTERFACE_FRAME
 #define NFC_INTERFACE_ISO_DEP NCI_INTERFACE_ISO_DEP
-#define NFC_INTERFACE_NDEF NCI_INTERFACE_NDEF
 #define NFC_INTERFACE_NFC_DEP NCI_INTERFACE_NFC_DEP
-#define NFC_INTERFACE_LLCP_LOW NCI_INTERFACE_LLCP_LOW
-#define NFC_INTERFACE_LLCP_HIGH NCI_INTERFACE_LLCP_HIGH
-#define NFC_INTERFACE_VS_T2T_CE NCI_INTERFACE_VS_T2T_CE
 #define NFC_INTERFACE_MIFARE NCI_INTERFACE_VS_MIFARE
 typedef tNCI_INTF_TYPE tNFC_INTF_TYPE;
 
@@ -467,10 +433,6 @@
 /**********************************************
  *  Deactivation Reasons
  **********************************************/
-#define NFC_DEACTIVATE_REASON_DH_REQ NCI_DEACTIVATE_REASON_DH_REQ
-#define NFC_DEACTIVATE_REASON_ENDPOINT_REQ NCI_DEACTIVATE_REASON_ENDPOINT_REQ
-#define NFC_DEACTIVATE_REASON_RF_LINK_LOSS NCI_DEACTIVATE_REASON_RF_LINK_LOSS
-#define NFC_DEACTIVATE_REASON_NFCB_BAD_AFI NCI_DEACTIVATE_REASON_NFCB_BAD_AFI
 #define NFC_DEACTIVATE_REASON_DH_REQ_FAILED NCI_DEACTIVATE_REASON_DH_REQ_FAILED
 typedef uint8_t tNFC_DEACT_REASON;
 
@@ -519,7 +481,6 @@
 } tNFC_EE_ACTION_REVT;
 
 #define NFC_EE_DISC_OP_ADD 0
-#define NFC_EE_DISC_OP_REMOVE 1
 typedef uint8_t tNFC_EE_DISC_OP;
 typedef struct {
   tNFC_EE_DISC_OP op;              /* add or remove this entry         */
@@ -550,6 +511,8 @@
   tNFC_NFCEE_DISCOVER_REVT nfcee_discover;
   tNFC_NFCEE_INFO_REVT nfcee_info;
   tNFC_NFCEE_MODE_SET_REVT mode_set;
+  tNFC_NFCEE_PL_CONTROL_REVT pl_control;
+  tNFC_NFCEE_STATUS_REVT nfcee_status;
   tNFC_RF_FIELD_REVT rf_field;
   tNFC_STATUS cfg_routing;
   tNFC_GET_ROUTING_REVT get_routing;
@@ -772,30 +735,6 @@
   tNFC_DEACTIVATE_DEVT deactivate;
 } tNFC_DISCOVER;
 
-/* Min TR0 indicates to tag the min delay before responding after the end of
- * command */
-#define NFC_RF_PARAM_MIN_TR0_DEFAULT 0x00
-#define NFC_RF_PARAM_MIN_TR0_48X 0x01 /* 48 x 16/fc */
-#define NFC_RF_PARAM_MIN_TR0_16X 0x02 /* 16 x 16/fc */
-
-/* Min TR1 indicates to tag the min delay between subcarrier modulation and data
- * transmission */
-#define NFC_RF_PARAM_MIN_TR1_DEFAULT 0x00
-#define NFC_RF_PARAM_MIN_TR1_64X 0x01 /* 64 x 16/fc */
-#define NFC_RF_PARAM_MIN_TR1_16X 0x02 /* 16 x 16/fc */
-
-/* Min TR2 indicates to RW the min delay between EoS of tag and SoS of RW */
-#define NFC_RF_PARAM_MIN_TR2_1792 0x00 /* 1792/fc (10etu + 32/fc) */
-#define NFC_RF_PARAM_MIN_TR2_3328 0x01 /* 3328/fc (10etu + 128/fc) */
-#define NFC_RF_PARAM_MIN_TR2_5376 0x02 /* 5376/fc (10etu + 256/fc) */
-#define NFC_RF_PARAM_MIN_TR2_9472 0x03 /* 9472/fc (10etu + 512/fc) */
-
-#define NFC_RF_PARAM_EOS_REQUIRED 0x00     /* EoS required */
-#define NFC_RF_PARAM_EOS_NOT_REQUIRED 0x01 /* EoS not required */
-
-#define NFC_RF_PARAM_SOS_REQUIRED 0x00     /* SoS required */
-#define NFC_RF_PARAM_SOS_NOT_REQUIRED 0x01 /* SoS not required */
-
 typedef struct {
   bool include_rf_tech_mode; /* TRUE if including RF Tech and Mode update    */
   tNFC_RF_TECH_N_MODE rf_tech_n_mode; /* RF tech and mode */
@@ -817,12 +756,6 @@
 typedef void(tNFC_DISCOVER_CBACK)(tNFC_DISCOVER_EVT event,
                                   tNFC_DISCOVER* p_data);
 
-/* the events reported on tNFC_TEST_CBACK */
-enum {
-  NFC_LOOPBACK_TEVT = NFC_FIRST_TEVT, /* 0  Loopback test             */
-  NFC_RF_CONTROL_TEVT,                /* 1  RF control Test response  */
-  NFC_RF_FIELD_DONE_TEVT              /* 1  RF control Test notificatn*/
-};
 typedef uint16_t tNFC_TEST_EVT;
 
 /* the data type associated with NFC_LOOPBACK_TEVT */
@@ -863,18 +796,12 @@
 #define NFC_ILLEGAL_CONN_ID 0xFF
 /* the static connection ID for RF traffic */
 #define NFC_RF_CONN_ID 0
-
-/*************************************
-**  Status callback function
-**************************************/
-typedef void(tNFC_STATUS_CBACK)(tNFC_STATUS status);
+/* the static connection ID for HCI transport */
+#define NFC_HCI_CONN_ID 1
 
 /*****************************************************************************
 **  EXTERNAL FUNCTION DECLARATIONS
 *****************************************************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*******************************************************************************
 **
@@ -1330,18 +1257,6 @@
 
 /*******************************************************************************
 **
-** Function         NFC_SetTraceLevel
-**
-** Description      This function sets the trace level for NFC.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t NFC_SetTraceLevel(uint8_t new_level);
-
-/*******************************************************************************
-**
 ** Function         NFC_ISODEPNakPresCheck
 **
 ** Description      This function is called to send the ISO DEP nak presence
@@ -1366,7 +1281,45 @@
 extern tNFC_FW_VERSION nfc_ncif_getFWVersion();
 #endif
 
-#if (BT_TRACE_VERBOSE == TRUE)
+/*******************************************************************************
+**
+** Function         NFC_NfceePLConfig
+**
+** Description      This function is called to set the Power and Link Control
+**                  to an NFCEE connected to the NFCC.
+**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
+**                  as NFC_NFCEE_PL_CONTROL_REVT.
+**
+** Parameters       nfcee_id - the NFCEE to activate or de-activate.
+**                 pl_config -
+**                 NFCEE_PL_CONFIG_NFCC_DECIDES -NFCC decides (default)
+**                 NFCEE_PL_CONFIG_PWR_ALWAYS_ON -NFCEE power supply always on
+**                 NFCEE_PL_CONFIG_LNK_ON_WHEN_PWR_ON -
+**                                     communication link is always active
+**                                     when NFCEE is powered on
+**                 NFCEE_PL_CONFIG_PWR_LNK_ALWAYS_ON -
+**                                     power supply and communication
+**                                     link are always on
+** Returns          tNFC_STATUS
+**
+*******************************************************************************/
+extern tNFC_STATUS NFC_NfceePLConfig(uint8_t nfcee_id,
+                                     tNCI_NFCEE_PL_CONFIG pl_config);
+
+/*******************************************************************************
+**
+** Function         NFC_SetStaticHciCback
+**
+** Description      This function to update the data callback function
+**                  to receive the data for the static Hci connection id.
+**
+** Parameters       p_cback - the connection callback function
+**
+** Returns          Nothing
+**
+*******************************************************************************/
+extern void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback);
+
 /*******************************************************************************
 **
 ** Function         NFC_GetStatusName
@@ -1378,11 +1331,6 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-extern char* NFC_GetStatusName(tNFC_STATUS status);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
+extern std::string NFC_GetStatusName(tNFC_STATUS status);
 
 #endif /* NFC_API_H */
diff --git a/src/nfc/int/nfc_int.h b/src/nfc/include/nfc_int.h
similarity index 90%
rename from src/nfc/int/nfc_int.h
rename to src/nfc/include/nfc_int.h
index c3fb85c..71b8564 100644
--- a/src/nfc/int/nfc_int.h
+++ b/src/nfc/include/nfc_int.h
@@ -31,10 +31,6 @@
 #include "nfc_api.h"
 #include "nfc_target.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /****************************************************************************
 ** Internal NFC constants and definitions
 ****************************************************************************/
@@ -50,6 +46,7 @@
 #define NFC_TTYPE_NCI_WAIT_RSP 0
 #define NFC_TTYPE_WAIT_2_DEACTIVATE 1
 #define NFC_WAIT_RSP_RAW_VS 0x02
+#define NFC_TTYPE_WAIT_MODE_SET_NTF 2
 
 #define NFC_TTYPE_LLCP_LINK_MANAGER 100
 #define NFC_TTYPE_LLCP_LINK_INACT 101
@@ -65,8 +62,8 @@
 #define NFC_TTYPE_P2P_PRIO_RESPONSE 110
 /* added for p2p prio logic clenaup */
 #define NFC_TTYPE_P2P_PRIO_LOGIC_CLEANUP 111
-#define NFC_TTYPE_VS_BASE 200
-
+/* time out for mode set notification */
+#define NFC_MODE_SET_NTF_TIMEOUT 2
 /* NFC Task event messages */
 
 enum {
@@ -105,13 +102,13 @@
 #define NFC_FL_DISCOVER_PENDING 0x0040
 /* NFC_FL_CONTROL_REQUESTED on HAL request      */
 #define NFC_FL_HAL_REQUESTED 0x0080
+/* Waiting for NFCEE Mode Set NTF                 */
+#define NFC_FL_WAIT_MODE_SET_NTF 0x0100
 
 #define NFC_PEND_CONN_ID 0xFE
-#define NFC_CONN_ID_INT_MASK 0xF0
 #define NFC_CONN_ID_ID_MASK NCI_CID_MASK
 /* set num_buff to this for no flow control */
 #define NFC_CONN_NO_FC 0xFF
-#define NFC_NCI_CONN_NO_FC 0xFF
 
 #if (NFC_RW_ONLY == FALSE)
 /* only allow the entries that the NFCC can support */
@@ -125,15 +122,15 @@
 
 typedef struct {
   tNFC_CONN_CBACK* p_cback; /* the callback function to receive the data */
-  BUFFER_Q tx_q;        /* transmit queue                                   */
-  BUFFER_Q rx_q;        /* receive queue                                    */
-  uint8_t id;           /* NFCEE ID or RF Discovery ID or NFC_TEST_ID       */
-  uint8_t act_protocol; /* the active protocol on this logical connection   */
+  BUFFER_Q tx_q;         /* transmit queue                                   */
+  BUFFER_Q rx_q;         /* receive queue                                    */
+  uint8_t id;            /* NFCEE ID or RF Discovery ID or NFC_TEST_ID       */
+  uint8_t act_protocol;  /* the active protocol on this logical connection   */
   uint8_t act_interface; /* the active interface on this logical connection   */
-  uint8_t conn_id;      /* the connection id assigned by NFCC for this conn */
-  uint8_t buff_size;    /* the max buffer size for this connection.     .   */
-  uint8_t num_buff;     /* num of buffers left to send on this connection   */
-  uint8_t init_credits; /* initial num of buffer credits                    */
+  uint8_t conn_id;       /* the connection id assigned by NFCC for this conn */
+  uint8_t buff_size;     /* the max buffer size for this connection.     .   */
+  uint8_t num_buff;      /* num of buffers left to send on this connection   */
+  uint8_t init_credits;  /* initial num of buffer credits                    */
 } tNFC_CONN_CB;
 
 /* This data type is for NFC task to send a NCI VS command to NCIT task */
@@ -152,8 +149,6 @@
 /* callback function pointer(8; use 8 to be safe + NFC_SAVED_CMD_SIZE(2) */
 #define NFC_RECEIVE_MSGS_OFFSET (10)
 
-/* NFCC power state change pending callback */
-typedef void(tNFC_PWR_ST_CBACK)(void);
 #define NFC_SAVED_HDR_SIZE (2)
 /* data Reassembly error (in NFC_HDR.layer_specific) */
 #define NFC_RAS_TOO_BIG 0x08
@@ -196,12 +191,11 @@
   /* NFC_TASK timer management */
   TIMER_LIST_Q timer_queue; /* 1-sec timer event queue */
   TIMER_LIST_Q quick_timer_queue;
-
-  TIMER_LIST_ENT deactivate_timer; /* Timer to wait for deactivation */
+  TIMER_LIST_ENT mode_set_ntf_timer; /* Timer to wait for deactivation */
+  TIMER_LIST_ENT deactivate_timer;   /* Timer to wait for deactivation */
 
   tNFC_STATE nfc_state;
   bool reassembly; /* Reassemble fragmented data pkt */
-  uint8_t trace_level;
   uint8_t last_hdr[NFC_SAVED_HDR_SIZE]; /* part of last NCI command header */
   uint8_t last_cmd[NFC_SAVED_CMD_SIZE]; /* part of last NCI command payload */
   void* p_vsc_cback;       /* the callback function for last VSC command */
@@ -220,6 +214,8 @@
 
   uint8_t nci_version; /* NCI version used for NCI communication*/
 
+  bool isScbrSupported; /* indicating if system code based route is supported */
+
   uint8_t hci_packet_size; /* maximum hci payload size*/
 
   uint8_t hci_conn_credits; /* maximum conn credits for static HCI*/
@@ -229,6 +225,8 @@
   uint8_t rawVsCbflag;
   uint8_t deact_reason;
 
+  TIMER_LIST_ENT nci_mode_set_ntf_timer; /*Mode set notification timer*/
+
 } tNFC_CB;
 
 /*****************************************************************************
@@ -243,11 +241,9 @@
 ****************************************************************************/
 
 #define NCI_CALCULATE_ACK(a, v) \
-  { a &= ((1 << v) - 1); }
+  { (a) &= ((1 << (v)) - 1); }
 #define MAX_NUM_VALID_BITS_FOR_ACK 0x07
 
-extern void nfc_init(void);
-
 /* from nfc_utils.c */
 extern tNFC_CONN_CB* nfc_alloc_conn_cb(tNFC_CONN_CBACK* p_cback);
 extern tNFC_CONN_CB* nfc_find_conn_cb_by_conn_id(uint8_t conn_id);
@@ -257,10 +253,10 @@
 extern void nfc_reset_all_conn_cbs(void);
 extern void nfc_data_event(tNFC_CONN_CB* p_cb);
 
-void nfc_ncif_send(NFC_HDR* p_buf, bool is_cmd);
 extern uint8_t nfc_ncif_send_data(tNFC_CONN_CB* p_cb, NFC_HDR* p_data);
 extern void nfc_ncif_cmd_timeout(void);
 extern void nfc_wait_2_deactivate_timeout(void);
+extern void nfc_mode_set_ntf_timeout(void);
 
 extern bool nfc_ncif_process_event(NFC_HDR* p_msg);
 extern void nfc_ncif_check_cmd_queue(NFC_HDR* p_buf);
@@ -302,7 +298,7 @@
 #endif
 
 /* From nfc_task.c */
-extern uint32_t nfc_task(uint32_t param);
+extern uint32_t nfc_task(uint32_t);
 void nfc_task_shutdown_nfcc(void);
 
 /* From nfc_main.c */
@@ -321,9 +317,4 @@
                            uint32_t timeout);
 void nfc_stop_quick_timer(TIMER_LIST_ENT* p_tle);
 void nfc_process_quick_timer_evt(void);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* NFC_INT_H_ */
diff --git a/src/nfc/int/nfc_vs.h b/src/nfc/include/nfc_vs.h
similarity index 71%
rename from src/nfc/int/nfc_vs.h
rename to src/nfc/include/nfc_vs.h
index adc2f25..8cedbdd 100644
--- a/src/nfc/int/nfc_vs.h
+++ b/src/nfc/include/nfc_vs.h
@@ -25,17 +25,4 @@
 #ifndef NFC_VS_H_
 #define NFC_VS_H_
 
-// DTA API for MW Version need to change according to release
-#define NXP_EN_PN547C2 0
-#define NXP_EN_PN65T 0
-#define NXP_EN_PN548C2 0
-#define NXP_EN_PN66T 0
-#define NXP_EN_PN551 0
-#define NXP_EN_PN67T 0
-#define NXP_EN_PN553 1
-#define NXP_EN_PN80T 1
-#define NXP_ANDROID_VER (7U)        /* NXP android version */
-#define NFC_NXP_MW_VERSION_MAJ (4U) /* MW Major Version */
-#define NFC_NXP_MW_VERSION_MIN (9U) /* MW Minor Version */
-
 #endif /* NFC_VS_H_ */
diff --git a/src/nfc/include/rw_api.h b/src/nfc/include/rw_api.h
index c8bb55b..edf7e83 100644
--- a/src/nfc/include/rw_api.h
+++ b/src/nfc/include/rw_api.h
@@ -25,10 +25,11 @@
 
 #ifndef RW_API_H
 #define RW_API_H
+#include "nfc_api.h"
 #include "tags_defs.h"
 
-#define RW_T1T_BLD_ADD(a, k, y) a = ((k & 0xF) << 3) | (y & 0x7);
-#define RW_T1T_BLD_ADDS(a, s) a = ((s & 0xF) << 4);
+#define RW_T1T_BLD_ADD(a, k, y) (a) = (((k) & 0xF) << 3) | ((y) & 0x7);
+#define RW_T1T_BLD_ADDS(a, s) (a) = (((s) & 0xF) << 4);
 
 #define RW_T1T_FIRST_EVT 0x20
 #define RW_T2T_FIRST_EVT 0x40
@@ -148,17 +149,8 @@
 typedef uint8_t tRW_NDEF_FLAG;
 
 /* options for RW_T4tPresenceCheck  */
-#define RW_T4T_CHK_READ_BINARY_CH0 0
-#define RW_T4T_CHK_READ_BINARY_CH1 1
-#define RW_T4T_CHK_READ_BINARY_CH2 2
-#define RW_T4T_CHK_READ_BINARY_CH3 3
-#define RW_T4T_CHK_EMPTY_I_BLOCK 4
+#define RW_T4T_CHK_EMPTY_I_BLOCK 1
 #define RW_T4T_CHK_ISO_DEP_NAK_PRES_CHK 5
-typedef struct {
-  tNFC_STATUS status;
-  uint8_t hr[T1T_HR_LEN];
-  uint8_t uid[T1T_CMD_UID_LEN];
-} tRW_T1T_RID_EVT;
 
 typedef struct {
   tNFC_STATUS status;
@@ -1077,7 +1069,7 @@
 **                  NFC_STATUS_FAILED if other error
 **
 *******************************************************************************/
-extern tNFC_STATUS RW_I93WriteMultipleBlocks(uint8_t first_block_number,
+extern tNFC_STATUS RW_I93WriteMultipleBlocks(uint16_t first_block_number,
                                              uint16_t number_blocks,
                                              uint8_t* p_data);
 
@@ -1339,18 +1331,4 @@
 *******************************************************************************/
 extern tNFC_STATUS RW_SetActivatedTagType(tNFC_ACTIVATE_DEVT* p_activate_params,
                                           tRW_CBACK* p_cback);
-
-/*******************************************************************************
-**
-** Function         RW_SetTraceLevel
-**
-** Description      This function sets the trace level for Reader/Writer mode.
-**                  If called with a value of 0xFF,
-**                  it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-extern uint8_t RW_SetTraceLevel(uint8_t new_level);
-
 #endif /* RW_API_H */
diff --git a/src/nfc/int/rw_int.h b/src/nfc/include/rw_int.h
similarity index 97%
rename from src/nfc/int/rw_int.h
rename to src/nfc/include/rw_int.h
index 38958b2..b6e1dc5 100644
--- a/src/nfc/int/rw_int.h
+++ b/src/nfc/include/rw_int.h
@@ -31,14 +31,6 @@
 #include "tags_int.h"
 
 /* Proprietary definitions for HR0 and HR1 */
-/* HI NIB Tag                                               */
-#define RW_T1T_HR0_HI_NIB 0xF0
-/* Jewel 64 Tag                                             */
-#define RW_T1T_IS_JEWEL64 0x20
-/* Jewel Tag                                                */
-#define RW_T1T_IS_JEWEL 0x00
-/* TOPAZ Tag                                                */
-#define RW_T1T_IS_TOPAZ 0x10
 /* TOPAZ96 Tag                                              */
 #define RW_T1T_IS_TOPAZ96 0x11
 /* TOPAZ512 Tag                                             */
@@ -257,11 +249,6 @@
 #define T2T_NDEF_DETECTED 0x01
 #define T2T_NDEF_READ 0x02
 
-/* Max offset of an NDEF message in a T2 tag */
-#define T2T_MAX_NDEF_OFFSET 128
-#define T2T_MAX_RESERVED_BYTES_IN_TAG 0x64
-#define T2T_MAX_LOCK_BYTES_IN_TAG 0x64
-
 /* Maximum supported Memory control TLVS in the tag         */
 #define RW_T2T_MAX_MEM_TLVS 0x05
 /* Maximum supported Lock control TLVS in the tag           */
@@ -632,6 +619,8 @@
 #define RW_I93_FLAG_RESET_AFI 0x08
 /* use 2 bytes for number of blocks        */
 #define RW_I93_FLAG_16BIT_NUM_BLOCK 0x10
+/* use extended commands */
+#define RW_I93_FLAG_EXT_COMMANDS 0x20
 
 /* searching for type                      */
 #define RW_I93_TLV_DETECT_STATE_TYPE 0x01
@@ -660,6 +649,8 @@
   RW_I93_STM_M24LR04E_R,             /* STM M24LR04E-R                   */
   RW_I93_STM_M24LR16E_R,             /* STM M24LR16E-R                   */
   RW_I93_STM_M24LR64E_R,             /* STM M24LR64E-R                   */
+  RW_I93_STM_ST25DV04K,              /* STM ST25DV04K                    */
+  RW_I93_STM_ST25DVHIK,              /* STM ST25DV 16K OR 64K            */
   RW_I93_UNKNOWN_PRODUCT             /* Unknwon product version          */
 };
 
@@ -713,17 +704,12 @@
 #if (RW_STATS_INCLUDED == TRUE)
   tRW_STATS stats;
 #endif /* RW_STATS_INCLUDED */
-  uint8_t trace_level;
 } tRW_CB;
 
 /*****************************************************************************
 **  EXTERNAL FUNCTION DECLARATIONS
 *****************************************************************************/
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Global NFC data */
 extern tRW_CB rw_cb;
 
@@ -760,7 +746,7 @@
 extern tNFC_STATUS rw_t2t_sector_change(uint8_t sector);
 extern tNFC_STATUS rw_t2t_read(uint16_t block);
 extern tNFC_STATUS rw_t2t_write(uint16_t block, uint8_t* p_write_data);
-extern void rw_t2t_process_timeout(TIMER_LIST_ENT* p_tle);
+extern void rw_t2t_process_timeout();
 extern tNFC_STATUS rw_t2t_select(void);
 void rw_t2t_handle_op_complete(void);
 
@@ -788,8 +774,4 @@
 void rw_main_log_stats(void);
 #endif /* RW_STATS_INCLUDED */
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* RW_INT_H_ */
diff --git a/src/nfc/include/tags_defs.h b/src/nfc/include/tags_defs.h
index 6ac16ed..d7adc60 100644
--- a/src/nfc/include/tags_defs.h
+++ b/src/nfc/include/tags_defs.h
@@ -81,27 +81,17 @@
 /* HRO value to indicate static Tag               */
 #define T1T_STATIC_HR0 0x11
 /* 0x1y, as long as (y!=1)                        */
-#define T1T_DYNAMIC_HR0 0x12
 /* HR0 value is 0x1y, indicates NDEF supported    */
 #define T1T_NDEF_SUPPORTED 0x10
-/* should be ignored                              */
-#define T1T_HR1 0x00
 /* UID block                                      */
 #define T1T_UID_BLOCK 0x00
 /* Reserved block                                 */
 #define T1T_RES_BLOCK 0x0D
 /* Static lock block                              */
 #define T1T_LOCK_BLOCK 0x0E
-/* Manufacturer ID offset                         */
-#define T1T_MID_OFFSET 0x06
-/* Reserved bytes offset                          */
-#define T1T_STATIC_RES_OFFSET 0x68
 /* Static lock offset                             */
 #define T1T_LOCK_0_OFFSET 0x70
-/* Static lock offset                             */
-#define T1T_LOCK_1_OFFSET 0x71
 /* Block F - typically used for dynamic locks     */
-#define T1T_DYNAMIC_LOCK_OFFSET 0x78
 #define T1T_DYNAMIC_LOCK_BYTES 0x08
 
 /* the len of reserved byte in T1T block 0        */
@@ -115,10 +105,6 @@
 /* CC offset */
 /* Offset for NDEF magic number in CC             */
 #define T1T_CC_NMN_OFFSET 0x00
-/* Offset for Version number in CC                */
-#define T1T_CC_VNO_OFFSET 0x01
-/* Offset for Tag memory size in CC               */
-#define T1T_CC_TMS_OFFSET 0x02
 /* Offset for Read/Write access in CC             */
 #define T1T_CC_RWA_OFFSET 0x03
 /* NDEF Magic Number byte number                  */
@@ -135,26 +121,11 @@
 #define T1T_CC_LEGACY_VNO 0x10
 /* Version Number                                 */
 #define T1T_CC_VNO 0x11
-/* TMS static memory - (8 * (n+1)).               */
-#define T1T_CC_TMS_STATIC 0x0E
 /* RWA - Read/write allowed                       */
 #define T1T_CC_RWA_RW 0x00
 /* RWA - Read only                                */
 #define T1T_CC_RWA_RO 0x0F
 
-/* May be used for padding. SHALL ignore this     */
-#define T1T_TAG_NULL 0
-/* Defines details of the lock bytes              */
-#define T1T_TAG_LOCK_CTRL 1
-/* Identifies reserved memory areas               */
-#define T1T_TAG_MEM_CTRL 2
-/* Contains the NDEF message                      */
-#define T1T_TAG_NDEF 3
-/* Tag proprietary information                    */
-#define T1T_TAG_PROPRIETARY 0xFD
-/* Last TLV block in the data area                */
-#define T1T_TAG_TERMINATOR 0xFE
-
 /* Tlv len for LOCK_CTRL/MEM TLV per spec         */
 #define T1T_DEFAULT_TLV_LEN 3
 /* Tlv type identifier len                        */
@@ -177,7 +148,6 @@
 /* Byte 0 in Length field to indicate LNDEF*/
 #define T1T_LONG_NDEF_LEN_FIELD_BYTE0 0xFF
 /* Min. len of NDEF to qualify as LNDEF  */
-#define T1T_LONG_NDEF_MIN_LEN 0x00FF
 
 /* Type 1 Tag Commands (7 bits) */
 /* read id                                      */
@@ -204,43 +174,27 @@
 /* Number of static lock bytes in tag   */
 #define T1T_NUM_STATIC_LOCK_BYTES 2
 /* Bytes locked by one static lock bit  */
-#define T1T_BYTES_LOCKED_BY_STATIC_LOCK_BIT 4
 
 /* Type 2 Tag related definitions */
-#define T2T_STATIC_MEM_STR 0
-#define T2T_DYNAMIC_MEM_STR 1
 #define T2T_STATIC_SIZE 64
-#define T2T_STATIC_BLOCKS 16 /* block 0 to Block 15 */
 #define T2T_BLOCK_SIZE 4
-#define T2T_HEADER_BLOCKS 4
 #define T2T_HEADER_SIZE 16
 #define T2T_SECTOR_SIZE 1024
 #define T2T_BLOCKS_PER_SECTOR 0x100
 
 #define T2T_UID_LEN 4        /* the len of UID used in T2T tag */
-#define T2T_BLOCK0_UID_LEN 3 /* the len of UID in Block 0 of T2T tag */
-#define T2T_BCC0_LEN 1       /* the len of BCC0 of T2T tag */
-#define T2T_BLOCK1_UID_LEN 4 /* the len of UID in Block 1 of T2T tag */
-#define T2T_BCC1_LEN 1       /* the len of BCC0 of T2T tag */
 /* the len of Serial number used in T2T tag */
-#define T2T_SNO_LEN 4
 #define T2T_INTERNAL_BYTES_LEN 2 /* the len of internal used in T2T tag */
-/* the len of static lock used in T2T tag */
-#define T2T_STATIC_LOCK_LEN 2
 /* Static Lock Bytes */
 #define T2T_STATIC_LOCK0 0x0A /* Static Lock 0 offset */
 #define T2T_STATIC_LOCK1 0x0B /* Static Lock 1 offset */
 
-/* the len of CC used in T2T tag                  */
-#define T2T_CC_LEN 4
-
 /* Capability Container definitions */
 #define T2T_CC_BLOCK 0x03     /* Capability container block */
 #define T2T_CC0_NMN_BYTE 0x0C /* NDEF Magic Number byte number */
 #define T2T_CC1_VNO_BYTE 0x0D /* Version Number byte number*/
 #define T2T_CC2_TMS_BYTE 0x0E /* Tag Memory Size byte number */
 #define T2T_CC3_RWA_BYTE 0x0F /* Read Write Access byte number */
-#define T2T_DATA_MEM 0x10     /* Data Memory */
 
 #define T2T_CC0_NMN 0xE1        /* NDEF Magic Number */
 #define T2T_CC1_VNO 0x11        /* Version Number */
@@ -260,15 +214,8 @@
 #define T2T_CMD_WRITE 0xA2   /* write 1 block  (4 bytes)  */
 #define T2T_CMD_SEC_SEL 0xC2 /* Sector select             */
 #define T2T_RSP_ACK 0xA
-#define T2T_RSP_NACK5 0x5
-#define T2T_RSP_NACK1 0x1 /* Nack can be either 1    */
 
 #define T2T_STATUS_OK_1_BIT 0x11
-#define T2T_STATUS_OK_2_BIT 0x12
-#define T2T_STATUS_OK_3_BIT 0x13
-#define T2T_STATUS_OK_4_BIT 0x14
-#define T2T_STATUS_OK_5_BIT 0x15
-#define T2T_STATUS_OK_6_BIT 0x16
 #define T2T_STATUS_OK_7_BIT 0x17
 
 #define T2T_FIRST_DATA_BLOCK 4
@@ -279,16 +226,10 @@
 
 /* Type 2 TLV definitions */
 /* May be used for padding. SHALL ignore this */
-#define T2T_TLV_TYPE_NULL 0
 #define T2T_TLV_TYPE_LOCK_CTRL 1      /* Defines details of the lock bytes */
-#define T2T_TLV_TYPE_MEM_CTRL 2       /* Identifies reserved memory areas */
-#define T2T_TLV_TYPE_NDEF 3           /* Contains the NDEF message */
-#define T2T_TLV_TYPE_PROPRIETARY 0xFD /* Tag proprietary information */
-#define T2T_TLV_TYPE_TERMINATOR 0xFE  /* Last TLV block in the data area */
 
 /* Tag len for LOCK_CTRL TLV per spec */
 #define T2T_TLEN_LOCK_CTRL_TLV 3
-#define T2T_TLEN_MEM_CTRL_TLV 3 /* Tag len for MEM_CTRL TLV per spec */
 
 /* Maximum number of sectors supported */
 #if (APPL_DTA_MODE == TRUE)
@@ -299,8 +240,6 @@
 /* Tlv type identifier len                */
 #define T2T_TLV_TYPE_LEN 1
 
-/* Tlv len for LOCK_CTRL/MEM TLV per spec     */
-#define T2T_DEFAULT_TLV_LEN 3
 /* Length Field size of short NDEF Message    */
 #define T2T_SHORT_NDEF_LEN_FIELD_LEN 1
 /* Length Field size of Long NDEF Message     */
@@ -313,11 +252,7 @@
 /* Lock */
 /* Number of static lock bytes in tag   */
 #define T2T_NUM_STATIC_LOCK_BYTES 2
-/* Bytes locked by one static lock bit  */
-#define T2T_BYTES_LOCKED_BY_STATIC_LOCK_BIT 4
 
-#define T2T_CC2_TMS_MUL 0x06
-#define T2T_CC2_TMS_MULC 0x12
 /*
 **
 **  Type 3 Tag Definitions
@@ -339,10 +274,7 @@
 } tT3T_BLOCK_DESC;
 
 /* Poll RC (request code) definitions */
-#define T3T_POLL_RC_NONE 0 /* No RD requested in SENSF_RES */
 #define T3T_POLL_RC_SC 1   /* System code requested in SENSF_RES */
-/* Avanced protocol features requested in SENSF_RES */
-#define T3T_POLL_RC_COMM 2
 typedef uint8_t tT3T_POLL_RC;
 
 /* Definitions for constructing t3t command messages */
@@ -357,7 +289,6 @@
 #define T3T_MSG_OPC_POLL_CMD 0x00
 #define T3T_MSG_OPC_POLL_RSP 0x01
 #define T3T_MSG_OPC_REQ_SERVICE_CMD 0x02
-#define T3T_MSG_OPC_REQ_SERVICE_RSP 0x03
 #define T3T_MSG_OPC_REQ_RESPONSE_CMD 0x04
 #define T3T_MSG_OPC_REQ_RESPONSE_RSP 0x05
 #define T3T_MSG_OPC_REQ_SYSTEMCODE_CMD 0x0C
@@ -375,22 +306,12 @@
 /* Size of NDEF attribute info block (minus checksum) */
 #define T3T_MSG_NDEF_ATTR_INFO_SIZE 14
 
-/* offset of Manufacturer ID in UPDATE/CHECK messages */
-#define T3T_MSG_OFFSET_IDM 1
-/* offset of Number of Services parameter in UPDATE/CHECK messages */
-#define T3T_MSG_OFFSET_NUM_SERVICES 9
-/* offset of Service Code List parameter in UPDATE/CHECK messages */
-#define T3T_MSG_OFFSET_SERVICE_CODE_LIST 10
 /* len flag for Block List Element */
 #define T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT 0x80
 /* service code list mask */
 #define T3T_MSG_SERVICE_LIST_MASK 0x0F
 #define T3T_MSG_SERVICE_LIST_MAX 16
 
-/* Max Number of Services per UPDATE command */
-#define T3T_MSG_NUM_SERVICES_UPDATE_MAX 12
-/* Max Number of Services per CHECK command */
-#define T3T_MSG_NUM_SERVICES_CHECK_MAX 15
 /* Max Number of Blocks per UPDATE command */
 #define T3T_MSG_NUM_BLOCKS_UPDATE_MAX 13
 /* Max Number of Blocks per CHECK command */
@@ -406,8 +327,6 @@
 /* Common header definition for T3t responses */
 /* Common header: rspcode + NFCID2 + StatusFlag1 + StatusFlag2  */
 #define T3T_MSG_RSP_COMMON_HDR_LEN 11
-/* Common header + NumBlocks */
-#define T3T_MSG_RSP_CHECK_HDR_LEN (T3T_MSG_RSP_COMMON_HDR_LEN + 1)
 /* Offset for Response code */
 #define T3T_MSG_RSP_OFFSET_RSPCODE 0
 /* Offset for Manufacturer ID */
@@ -418,22 +337,13 @@
 #define T3T_MSG_RSP_OFFSET_NUMBLOCKS 11
 /* Offset for Block Data (in CHECK response) */
 #define T3T_MSG_RSP_OFFSET_CHECK_DATA 12
-/* Offset for PMm (in POLL response) */
-#define T3T_MSG_RSP_OFFSET_POLL_PMM 9
-/* Offset for RD (in POLL response) */
-#define T3T_MSG_RSP_OFFSET_POLL_RD 17
-/* Offset for Number of Systems */
-#define T3T_MSG_RSP_OFFSET_NUMSYS 9
 
 #define T3T_MSG_RSP_STATUS_OK 0x00
 #define T3T_MSG_RSP_STATUS_ERROR 0x01
 
 #define T3T_MSG_RSP_STATUS2_ERROR_MEMORY 0x70
-#define T3T_MSG_RSP_STATUS2_ERROR_EXCESSIVE_WRITES 0x71
 #define T3T_MSG_RSP_STATUS2_ERROR_PROCESSING 0xFF
 
-/* Maximum payload lenght for NFC-F messages (including SoD) */
-#define T3T_NFC_F_MAX_PAYLOAD_LEN 0xFE
 
 /* Felica Lite defintions */
 /* Block ID for MC (memory configuration)                       */
@@ -442,9 +352,6 @@
 /* Memory Configuration Block offset: MC_SP (Memory Configuration for scratch
  * pad)   */
 #define T3T_MSG_FELICALITE_MC_OFFSET_MC_SP 0x00
-/* Memory Configuration Block offset: MC_ALL (Memory Configuration for system
- * block) */
-#define T3T_MSG_FELICALITE_MC_OFFSET_MC_ALL 0x02
 /* Memory Configuration Block offset: SYS_OP (System Option) */
 #define T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP 0x03
 /* Memory Configuration Block offset: RF_PRM (Memory Configuration for RF
@@ -463,7 +370,6 @@
 #define T4T_VERSION_1_0 0x10 /* version 1.0 */
 #define T4T_MY_VERSION T4T_VERSION_2_0
 #define T4T_GET_MAJOR_VERSION(x) ((x) >> 4)
-#define T4T_GET_MINOR_VERSION(x) ((x)&0x0F)
 
 #define T4T_CMD_CLASS 0x00
 #define T4T_CMD_INS_SELECT 0xA4
@@ -513,8 +419,6 @@
 #define T4T_FC_WRITE_ACCESS_OFFSET_IN_TLV 0x07
 
 #define T4T_NDEF_FILE_CONTROL_TYPE 0x04 /* NDEF File Control Type */
-/* Proprietary File Control Type */
-#define T4T_PROP_FILE_CONTROL_TYPE 0x05
 
 /* size of T(1),L(1),V(6) for file control */
 #define T4T_FILE_CONTROL_TLV_SIZE 0x08
@@ -548,104 +452,48 @@
 **
 */
 
-/* Request flags 1 to 4 definition */
-#define I93_FLAG_SUB_CARRIER_MASK 0x01 /* Sub_carrier_flag */
 /* A single sub-carrier frequency shall be used by VICC */
 #define I93_FLAG_SUB_CARRIER_SINGLE 0x00
-/* Two sub-carriers shall be used by VICC               */
-#define I93_FLAG_SUB_CARRIER_DOUBLE 0x01
 
-#define I93_FLAG_DATA_RATE_MASK 0x02 /* Data_rate_flag */
-/* Low data rate shall be used  */
-#define I93_FLAG_DATA_RATE_LOW 0x00
 /* High data rate shall be used */
 #define I93_FLAG_DATA_RATE_HIGH 0x02
 
-#define I93_FLAG_INVENTORY_MASK 0x04 /* Inventory_flag */
-/* Flags 5 to 8 meaning is according to table 4 */
-#define I93_FLAG_INVENTORY_UNSET 0x00
 /* Flags 5 to 8 meaning is according to table 5 */
 #define I93_FLAG_INVENTORY_SET 0x04
 
-/* Protocol_Extension_flag */
-#define I93_FLAG_PROT_EXT_MASK 0x08
 /* No protocol format extension                         */
 #define I93_FLAG_PROT_EXT_NO 0x00
 /* Protocol format is extended. Reserved for future use */
 #define I93_FLAG_PROT_EXT_YES 0x08
 
-/* Request flags 5 to 6 definition when inventory flag is not set */
-#define I93_FLAG_SELECT_MASK 0x10 /* Select_flag */
-/* Request shall be executed by any VICC according to the setting of
- * Address_flag */
-#define I93_FLAG_SELECT_UNSET 0x00
-/* Request shall be executed only by VICC in selected state */
-#define I93_FLAG_SELECT_SET 0x10
-/* The Address_flag shall be set to 0 and the UID field shall bot be included in
- * the request */
-
-#define I93_FLAG_ADDRESS_MASK 0x20 /* Address_flag */
-/* Request is not addressed. UID field is not included. It shall be executed by
- * any VICC */
-#define I93_FLAG_ADDRESS_UNSET 0x00
 /* Request is addressed. UID field is included. It shall be executed only by
  * VICC */
 #define I93_FLAG_ADDRESS_SET 0x20
 /* whose UID matches the UID specified in the request */
 
-/* Request flags 5 to 6 definition when inventory flag is set */
-#define I93_FLAG_AFI_MASK 0x10 /* AFI_flag */
-/* AFI field is not present */
-#define I93_FLAG_AFI_NOT_PRESENT 0x00
 /* AFI field is present     */
 #define I93_FLAG_AFI_PRESENT 0x10
 
-#define I93_FLAG_SLOT_MASK 0x20 /* Nb_slots_flag */
-#define I93_FLAG_SLOT_16 0x00   /* 16 slots */
 #define I93_FLAG_SLOT_ONE 0x20  /* 1 slot   */
 
-/* Request flags 6 to 8 definition when inventory flag is set or not set */
-
-#define I93_FLAG_OPTION_MASK 0x40 /* Option_flag */
-/* Meaning is defined by the command description. */
-#define I93_FLAG_OPTION_UNSET 0x00
 /* It shall be set to 0 if not otherwise defined by command */
 /* Meaning is defined by the command description. */
 #define I93_FLAG_OPTION_SET 0x40
 
-/* Response flags */
-#define I93_FLAG_ERROR_MASK 0x01 /* Error_flag */
-/* No error                                           */
-#define I93_FLAG_ERORR_NOT_DETECTED 0x00
 /* Error detected, Error code is in the "Error" field */
 #define I93_FLAG_ERROR_DETECTED 0x01
 
 /* Response error code */
-/* The command is not supported, i.e. the request code is not recognized */
-#define I93_ERROR_CODE_NOT_SUPPORTED 0x01
-/* The command is not recognized, for example: a format error occured    */
-#define I93_ERROR_CODE_NOT_RECOGNIZED 0x02
 /* The command option is not supported                                   */
 #define I93_ERROR_CODE_OPTION_NOT_SUPPORTED 0x03
-/* Error with no information given or a specific error code is not supported */
-#define I93_ERROR_CODE_NO_INFO 0x0F
-/* The specific block is not available (doesn't exist)                   */
-#define I93_ERROR_CODE_BLOCK_NOT_AVAILABLE 0x10
-/* The specific block is already locked and thus cannot be locked again  */
-#define I93_ERROR_CODE_BLOCK_ALREADY_LOCKED 0x11
-/* The specific block is locked and its content cannot be changed        */
-#define I93_ERROR_CODE_BLOCK_LOCKED 0x12
 /* The specific block is was not successfully programmed                 */
 #define I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE 0x13
 /* The specific block is was not successfully locked                     */
-#define I93_ERROR_CODE_BLOCK_FAIL_TO_LOCK 0x14
 
 /* UID length in bytes                  */
 #define I93_UID_BYTE_LEN 8
 /* Data Storage Format is not supported */
 #define I93_DFS_UNSUPPORTED 0x00
-/* Block is not locked                  */
-#define I93_BLOCK_UNLOCKED 0x00
 /* Block is locked                      */
 #define I93_BLOCK_LOCKED 0x01
 
@@ -655,10 +503,15 @@
 
 /* ISO 15693 Optional commands */
 #define I93_CMD_READ_SINGLE_BLOCK 0x20  /* Read single block     */
+#define I93_CMD_EXT_READ_SINGLE_BLOCK 0x30 /* Extended Read single block */
 #define I93_CMD_WRITE_SINGLE_BLOCK 0x21 /* Write single block    */
+#define I93_CMD_EXT_WRITE_SINGLE_BLOCK 0x31 /* Extended Write single block */
 #define I93_CMD_LOCK_BLOCK 0x22         /* Lock block            */
+#define I93_CMD_EXT_LOCK_BLOCK 0x32     /* Extended Lock block            */
 #define I93_CMD_READ_MULTI_BLOCK 0x23   /* Read multiple blocks  */
+#define I93_CMD_EXT_READ_MULTI_BLOCK 0x33 /* Extended Read multiple blocks  */
 #define I93_CMD_WRITE_MULTI_BLOCK 0x24  /* Write multiple blocks */
+#define I93_CMD_EXT_WRITE_MULTI_BLOCK 0x34 /* Write multiple blocks */
 #define I93_CMD_SELECT 0x25             /* Select                */
 #define I93_CMD_RESET_TO_READY 0x26     /* Reset to ready        */
 #define I93_CMD_WRITE_AFI 0x27          /* Wreite AFI            */
@@ -667,8 +520,12 @@
 #define I93_CMD_LOCK_DSFID 0x2A         /* Lock DSFID            */
 /* Get system information             */
 #define I93_CMD_GET_SYS_INFO 0x2B
+/* Get extended system information    */
+#define I93_CMD_EXT_GET_SYS_INFO 0x3B
 /* Get multiple block security status */
 #define I93_CMD_GET_MULTI_BLK_SEC 0x2C
+/* Get extended multiple block security status */
+#define I93_CMD_EXT_GET_MULTI_BLK_SEC 0x3C
 
 /* Information flags definition */
 /* DSFID is supported and DSFID field is present */
@@ -677,18 +534,19 @@
 #define I93_INFO_FLAG_AFI 0x02
 /* VICC memory size field is present             */
 #define I93_INFO_FLAG_MEM_SIZE 0x04
+/* 16bit num of blocks info length */
+#define I93_INFO_16BIT_NUM_BLOCK_LEN 0x02
 /* IC reference field is present                 */
 #define I93_INFO_FLAG_IC_REF 0x08
+/* Memory coded in 2 bytes address               */
+#define I93_INFO_FLAG_MOI 0x10
 
 /* Max block size in bytes */
 #define I93_MAX_BLOCK_LENGH 32
-/* Max number of blocks    */
-#define I93_MAX_NUM_BLOCK 256
 
 /* ICODE Capability Container(CC) definition */
-#define I93_ICODE_CC_MAGIC_NUMER 0xE1    /* magic number in CC[0]  */
-#define I93_ICODE_CC_MAJOR_VER_MASK 0xC0 /* major version in CC[1] */
-#define I93_ICODE_CC_MINOR_VER_MASK 0x30 /* minor version in CC[1] */
+#define I93_ICODE_CC_MAGIC_NUMER_E1 0xE1 /* magic number in CC[0]  */
+#define I93_ICODE_CC_MAGIC_NUMER_E2 0xE2 /* magic number in CC[0]  */
 /* read access condition in CC[1]        */
 #define I93_ICODE_CC_READ_ACCESS_MASK 0x0C
 /* read access granted without security  */
@@ -776,6 +634,13 @@
 /* IC Reference for M24LR64E-R: 01011110(b), blockSize: 4, numberBlocks: 0x800
  */
 #define I93_IC_REF_STM_M24LR64E_R 0x5E
+/* IC Reference for ST25DV04K: 00100100(b), blockSize: 4, numberBlocks: 0x80
+ */
+#define I93_IC_REF_STM_ST25DV04K 0x24
+/* IC Reference for ST25DVHIK: 00100110(b), blockSize: 4, numberBlocks: 0x800
+ * or 0x200
+ */
+#define I93_IC_REF_STM_ST25DVHIK 0x26
 
 #define I93_STM_BLOCKS_PER_SECTOR 32
 #define I93_STM_MAX_BLOCKS_PER_READ 32
diff --git a/src/nfc/int/tags_int.h b/src/nfc/include/tags_int.h
similarity index 96%
rename from src/nfc/int/tags_int.h
rename to src/nfc/include/tags_int.h
index edaecdf..b7fc8d3 100644
--- a/src/nfc/int/tags_int.h
+++ b/src/nfc/include/tags_int.h
@@ -82,13 +82,8 @@
 extern const tT2T_CMD_RSP_INFO* t2t_cmd_to_rsp_info(uint8_t opcode);
 extern uint8_t t2t_info_to_evt(const tT2T_CMD_RSP_INFO* p_info);
 
-#if (BT_TRACE_PROTOCOL == TRUE)
 extern const char* t1t_info_to_str(const tT1T_CMD_RSP_INFO* p_info);
 extern const char* t2t_info_to_str(const tT2T_CMD_RSP_INFO* p_info);
-#else
-#define t1t_info_to_str(x) ""
-#define t2t_info_to_str(x) ""
-#endif
 extern int tags_pow(int x, int y);
 extern unsigned int tags_log2(register unsigned int x);
 
diff --git a/src/nfc/llcp/llcp_api.c b/src/nfc/llcp/llcp_api.cc
similarity index 82%
rename from src/nfc/llcp/llcp_api.c
rename to src/nfc/llcp/llcp_api.cc
index 9d87ec0..289af2a 100644
--- a/src/nfc/llcp/llcp_api.c
+++ b/src/nfc/llcp/llcp_api.cc
@@ -22,13 +22,16 @@
  *
  ******************************************************************************/
 
-#include "llcp_api.h"
-#include <string.h>
-#include "bt_types.h"
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "gki.h"
-#include "llcp_defs.h"
+#include "llcp_api.h"
 #include "llcp_int.h"
-#include "nfc_target.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 #if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
 
@@ -47,8 +50,8 @@
 **
 *******************************************************************************/
 void LLCP_SetTestParams(uint8_t version, uint16_t wks) {
-  LLCP_TRACE_API2("LLCP_SetTestParams () version:0x%02X, wks:0x%04X", version,
-                  wks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("version:0x%02X, wks:0x%04X", version, wks);
 
   if (version != 0xFF) llcp_test_params.version = version;
 
@@ -67,7 +70,7 @@
 **
 *******************************************************************************/
 void LLCP_RegisterDtaCback(tLLCP_DTA_CBACK* p_dta_cback) {
-  LLCP_TRACE_API1("%s", __func__);
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   llcp_cb.p_dta_cback = p_dta_cback;
 }
@@ -95,25 +98,25 @@
                     uint16_t inact_timeout_target, uint16_t symm_delay,
                     uint16_t data_link_timeout,
                     uint16_t delay_first_pdu_timeout) {
-  LLCP_TRACE_API4(
-      "LLCP_SetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
-      link_miu, opt, wt, link_timeout);
-  LLCP_TRACE_API4(
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
+                      link_miu, opt, wt, link_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "                 inact_timeout (init:%d,target:%d), symm_delay:%d, "
       "data_link_timeout:%d",
       inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
-  LLCP_TRACE_API1("                 delay_first_pdu_timeout:%d",
-                  delay_first_pdu_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "                 delay_first_pdu_timeout:%d", delay_first_pdu_timeout);
 
   if (link_miu < LLCP_DEFAULT_MIU) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SetConfig (): link_miu shall not be smaller than "
+    LOG(ERROR) << StringPrintf(
+        "link_miu shall not be smaller than "
         "LLCP_DEFAULT_MIU (%d)",
         LLCP_DEFAULT_MIU);
     link_miu = LLCP_DEFAULT_MIU;
   } else if (link_miu > LLCP_MAX_MIU) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MAX_MIU "
+    LOG(ERROR) << StringPrintf(
+        "link_miu shall not be bigger than LLCP_MAX_MIU "
         "(%d)",
         LLCP_MAX_MIU);
     link_miu = LLCP_MAX_MIU;
@@ -121,9 +124,8 @@
 
   /* if Link MIU is bigger than GKI buffer */
   if (link_miu > LLCP_MIU) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MIU (%d)",
-        LLCP_MIU);
+    LOG(ERROR) << StringPrintf(
+        "link_miu shall not be bigger than LLCP_MIU (%zu)", LLCP_MIU);
     llcp_cb.lcb.local_link_miu = LLCP_MIU;
   } else
     llcp_cb.lcb.local_link_miu = link_miu;
@@ -132,14 +134,14 @@
   llcp_cb.lcb.local_wt = wt;
 
   if (link_timeout < LLCP_LTO_UNIT) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SetConfig (): link_timeout shall not be smaller than "
+    LOG(ERROR) << StringPrintf(
+        "link_timeout shall not be smaller than "
         "LLCP_LTO_UNIT (%d ms)",
         LLCP_LTO_UNIT);
     llcp_cb.lcb.local_lto = LLCP_DEFAULT_LTO_IN_MS;
   } else if (link_timeout > LLCP_MAX_LTO_IN_MS) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SetConfig (): link_timeout shall not be bigger than "
+    LOG(ERROR) << StringPrintf(
+        "link_timeout shall not be bigger than "
         "LLCP_MAX_LTO_IN_MS (%d ms)",
         LLCP_MAX_LTO_IN_MS);
     llcp_cb.lcb.local_lto = LLCP_MAX_LTO_IN_MS;
@@ -186,16 +188,15 @@
   *p_data_link_timeout = llcp_cb.lcb.data_link_timeout;
   *p_delay_first_pdu_timeout = llcp_cb.lcb.delay_first_pdu_timeout;
 
-  LLCP_TRACE_API4(
-      "LLCP_GetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
-      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
-  LLCP_TRACE_API4(
-      "                 inact_timeout (init:%d, target:%d), symm_delay:%d, "
-      "data_link_timeout:%d",
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
+                      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "inact_timeout (init:%d, target:%d), symm_delay:%d, data_link_timeout:%d",
       *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay,
       *p_data_link_timeout);
-  LLCP_TRACE_API1("                 delay_first_pdu_timeout:%d",
-                  *p_delay_first_pdu_timeout);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("delay_first_pdu_timeout:%d", *p_delay_first_pdu_timeout);
 }
 
 /*******************************************************************************
@@ -227,11 +228,11 @@
                              uint8_t* p_gen_bytes_len) {
   uint8_t* p = p_gen_bytes;
 
-  LLCP_TRACE_API0("LLCP_GetDiscoveryConfig ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (*p_gen_bytes_len < LLCP_MIN_GEN_BYTES) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_GetDiscoveryConfig (): GenBytes length shall not be smaller than "
+    LOG(ERROR) << StringPrintf(
+        "GenBytes length shall not be smaller than "
         "LLCP_MIN_GEN_BYTES (%d)",
         LLCP_MIN_GEN_BYTES);
     *p_gen_bytes_len = 0;
@@ -302,8 +303,8 @@
 *******************************************************************************/
 tLLCP_STATUS LLCP_ActivateLink(tLLCP_ACTIVATE_CONFIG config,
                                tLLCP_LINK_CBACK* p_link_cback) {
-  LLCP_TRACE_API1("LLCP_ActivateLink () link_state = %d",
-                  llcp_cb.lcb.link_state);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_state = %d", llcp_cb.lcb.link_state);
 
   if ((llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED) &&
       (p_link_cback)) {
@@ -327,8 +328,8 @@
 **
 *******************************************************************************/
 tLLCP_STATUS LLCP_DeactivateLink(void) {
-  LLCP_TRACE_API1("LLCP_DeactivateLink () link_state = %d",
-                  llcp_cb.lcb.link_state);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_state = %d", llcp_cb.lcb.link_state);
 
   if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED) {
     llcp_link_deactivate(LLCP_LINK_LOCAL_INITIATED);
@@ -357,7 +358,7 @@
 **
 *******************************************************************************/
 uint8_t LLCP_RegisterServer(uint8_t reg_sap, uint8_t link_type,
-                            char* p_service_name,
+                            std::string p_service_name,
                             tLLCP_APP_CBACK* p_app_cback) {
   uint8_t sap;
   uint16_t length;
@@ -365,18 +366,16 @@
       0,
   };
 
-  LLCP_TRACE_API3(
-      "LLCP_RegisterServer (): SAP:0x%x, link_type:0x%x, ServiceName:<%s>",
-      reg_sap, link_type, ((p_service_name == NULL) ? "" : p_service_name));
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "SAP:0x%x, link_type:0x%x, ServiceName:<%s>", reg_sap, link_type,
+      ((p_service_name.empty()) ? "" : p_service_name.c_str()));
 
   if (!p_app_cback) {
-    LLCP_TRACE_ERROR0("LLCP_RegisterServer (): Callback must be provided");
+    LOG(ERROR) << StringPrintf("Callback must be provided");
     return LLCP_INVALID_SAP;
   } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
              ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_RegisterServer (): link type (0x%x) must be specified",
-        link_type);
+    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
     return LLCP_INVALID_SAP;
   }
 
@@ -391,63 +390,55 @@
     }
 
     if (reg_sap == LLCP_INVALID_SAP) {
-      LLCP_TRACE_ERROR0("LLCP_RegisterServer (): out of resource");
+      LOG(ERROR) << StringPrintf("out of resource");
       return LLCP_INVALID_SAP;
     }
   } else if (reg_sap == LLCP_SAP_LM) {
-    LLCP_TRACE_ERROR1("LLCP_RegisterServer (): SAP (0x%x) is for link manager",
-                      reg_sap);
+    LOG(ERROR) << StringPrintf("SAP (0x%x) is for link manager", reg_sap);
     return LLCP_INVALID_SAP;
   } else if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP) {
     if (reg_sap >= LLCP_MAX_WKS) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
+      LOG(ERROR) << StringPrintf("out of resource for SAP (0x%x)", reg_sap);
       return LLCP_INVALID_SAP;
     } else if (llcp_cb.wks_cb[reg_sap].p_app_cback) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
+      LOG(ERROR) << StringPrintf("SAP (0x%x) is already registered", reg_sap);
       return LLCP_INVALID_SAP;
     } else {
       p_app_cb = &llcp_cb.wks_cb[reg_sap];
     }
   } else if (reg_sap <= LLCP_UPPER_BOUND_SDP_SAP) {
     if (reg_sap - LLCP_LOWER_BOUND_SDP_SAP >= LLCP_MAX_SERVER) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
+      LOG(ERROR) << StringPrintf("out of resource for SAP (0x%x)", reg_sap);
       return LLCP_INVALID_SAP;
     } else if (llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP]
                    .p_app_cback) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
+      LOG(ERROR) << StringPrintf("SAP (0x%x) is already registered", reg_sap);
       return LLCP_INVALID_SAP;
     } else {
       p_app_cb = &llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP];
     }
   } else if (reg_sap >= LLCP_LOWER_BOUND_LOCAL_SAP) {
-    LLCP_TRACE_ERROR2(
-        "LLCP_RegisterServer (): SAP (0x%x) must be less than 0x%x", reg_sap,
-        LLCP_LOWER_BOUND_LOCAL_SAP);
+    LOG(ERROR) << StringPrintf("SAP (0x%x) must be less than 0x%x", reg_sap,
+                               LLCP_LOWER_BOUND_LOCAL_SAP);
     return LLCP_INVALID_SAP;
   }
 
   memset(p_app_cb, 0x00, sizeof(tLLCP_APP_CB));
 
-  if (p_service_name) {
-    length = (uint8_t)strlen(p_service_name);
+  if (!p_service_name.empty()) {
+    length = p_service_name.length();
     if (length > LLCP_MAX_SN_LEN) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_RegisterServer (): Service Name (%d bytes) is too long",
-          length);
+      LOG(ERROR) << StringPrintf("Service Name (%d bytes) is too long", length);
       return LLCP_INVALID_SAP;
     }
 
-    p_app_cb->p_service_name = (uint8_t*)GKI_getbuf((uint16_t)(length + 1));
+    p_app_cb->p_service_name = (char*)GKI_getbuf((uint16_t)(length + 1));
     if (p_app_cb->p_service_name == NULL) {
-      LLCP_TRACE_ERROR0("LLCP_RegisterServer (): Out of resource");
+      LOG(ERROR) << StringPrintf("Out of resource");
       return LLCP_INVALID_SAP;
     }
 
-    strncpy((char*)p_app_cb->p_service_name, (char*)p_service_name, length + 1);
+    strncpy(p_app_cb->p_service_name, p_service_name.c_str(), length + 1);
     p_app_cb->p_service_name[length] = 0;
   } else
     p_app_cb->p_service_name = NULL;
@@ -459,7 +450,8 @@
     llcp_cb.lcb.wks |= (1 << reg_sap);
   }
 
-  LLCP_TRACE_DEBUG1("LLCP_RegisterServer (): Registered SAP = 0x%02X", reg_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Registered SAP = 0x%02X", reg_sap);
 
   if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
     llcp_cb.num_logical_data_link++;
@@ -487,16 +479,15 @@
   uint8_t sap;
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_API1("LLCP_RegisterClient (): link_type = 0x%x", link_type);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("link_type = 0x%x", link_type);
 
   if (!p_app_cback) {
-    LLCP_TRACE_ERROR0("LLCP_RegisterClient (): Callback must be provided");
+    LOG(ERROR) << StringPrintf("Callback must be provided");
     return LLCP_INVALID_SAP;
   } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
              ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_RegisterClient (): link type (0x%x) must be specified",
-        link_type);
+    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
     return LLCP_INVALID_SAP;
   }
 
@@ -511,7 +502,7 @@
   }
 
   if (reg_sap == LLCP_INVALID_SAP) {
-    LLCP_TRACE_ERROR0("LLCP_RegisterClient (): out of resource");
+    LOG(ERROR) << StringPrintf("out of resource");
     return LLCP_INVALID_SAP;
   }
 
@@ -519,7 +510,8 @@
   p_app_cb->p_service_name = NULL;
   p_app_cb->link_type = link_type;
 
-  LLCP_TRACE_DEBUG1("LLCP_RegisterClient (): Registered SAP = 0x%02X", reg_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Registered SAP = 0x%02X", reg_sap);
 
   if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
     llcp_cb.num_logical_data_link++;
@@ -543,13 +535,12 @@
   uint8_t idx;
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_API1("LLCP_Deregister () SAP:0x%x", local_sap);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("SAP:0x%x", local_sap);
 
   p_app_cb = llcp_util_get_app_cb(local_sap);
 
   if ((!p_app_cb) || (p_app_cb->p_app_cback == NULL)) {
-    LLCP_TRACE_ERROR1("LLCP_Deregister (): SAP (0x%x) is not registered",
-                      local_sap);
+    LOG(ERROR) << StringPrintf("SAP (0x%x) is not registered", local_sap);
     return LLCP_STATUS_FAIL;
   }
 
@@ -606,9 +597,9 @@
                                  uint8_t total_pending_i_pdu) {
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_API4(
-      "LLCP_IsLogicalLinkCongested () Local SAP:0x%x, pending = (%d, %d, %d)",
-      local_sap, num_pending_ui_pdu, total_pending_ui_pdu, total_pending_i_pdu);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Local SAP:0x%x, pending = (%d, %d, %d)", local_sap, num_pending_ui_pdu,
+      total_pending_ui_pdu, total_pending_i_pdu);
 
   p_app_cb = llcp_util_get_app_cb(local_sap);
 
@@ -648,34 +639,34 @@
   tLLCP_STATUS status = LLCP_STATUS_FAIL;
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_API2("LLCP_SendUI () SSAP=0x%x, DSAP=0x%x", ssap, dsap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("SSAP=0x%x, DSAP=0x%x", ssap, dsap);
 
   p_app_cb = llcp_util_get_app_cb(ssap);
 
   if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
-    LLCP_TRACE_ERROR1("LLCP_SendUI (): SSAP (0x%x) is not registered", ssap);
+    LOG(ERROR) << StringPrintf("SSAP (0x%x) is not registered", ssap);
   } else if ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_SendUI (): Logical link on SSAP (0x%x) is not enabled", ssap);
+    LOG(ERROR) << StringPrintf("Logical link on SSAP (0x%x) is not enabled",
+                               ssap);
   } else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
-    LLCP_TRACE_ERROR0("LLCP_SendUI (): LLCP link is not activated");
+    LOG(ERROR) << StringPrintf("LLCP link is not activated");
   } else if ((llcp_cb.lcb.peer_opt == LLCP_LSC_UNKNOWN) ||
              (llcp_cb.lcb.peer_opt & LLCP_LSC_1)) {
     if (p_buf->len <= llcp_cb.lcb.peer_miu) {
       if (p_buf->offset >= LLCP_MIN_OFFSET) {
         status = llcp_util_send_ui(ssap, dsap, p_app_cb, p_buf);
       } else {
-        LLCP_TRACE_ERROR2("LLCP_SendUI (): offset (%d) must be %d at least",
-                          p_buf->offset, LLCP_MIN_OFFSET);
+        LOG(ERROR) << StringPrintf("offset (%d) must be %d at least",
+                                   p_buf->offset, LLCP_MIN_OFFSET);
       }
     } else {
-      LLCP_TRACE_ERROR0(
-          "LLCP_SendUI (): Data length shall not be bigger than peer's link "
+      LOG(ERROR) << StringPrintf(
+          "Data length shall not be bigger than peer's link "
           "MIU");
     }
   } else {
-    LLCP_TRACE_ERROR0(
-        "LLCP_SendUI (): Peer doesn't support connectionless link");
+    LOG(ERROR) << StringPrintf("Peer doesn't support connectionless link");
   }
 
   if (status == LLCP_STATUS_FAIL) {
@@ -708,7 +699,7 @@
   uint8_t* p_ui_pdu;
   uint16_t pdu_hdr, ui_pdu_length;
 
-  LLCP_TRACE_API1("LLCP_ReadLogicalLinkData () Local SAP:0x%x", local_sap);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Local SAP:0x%x", local_sap);
 
   *p_data_len = 0;
 
@@ -771,8 +762,7 @@
       return false;
     }
   } else {
-    LLCP_TRACE_ERROR1("LLCP_ReadLogicalLinkData (): Unregistered SAP:0x%x",
-                      local_sap);
+    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", local_sap);
 
     return false;
   }
@@ -795,7 +785,7 @@
   uint8_t* p_ui_pdu;
   uint16_t ui_pdu_length;
 
-  LLCP_TRACE_API1("LLCP_FlushLogicalLinkRxData () Local SAP:0x%x", local_sap);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Local SAP:0x%x", local_sap);
 
   p_app_cb = llcp_util_get_app_cb(local_sap);
 
@@ -828,8 +818,7 @@
     /* number of received UI PDU is decreased so check rx congestion status */
     llcp_util_check_rx_congested_status();
   } else {
-    LLCP_TRACE_ERROR1("LLCP_FlushLogicalLinkRxData (): Unregistered SAP:0x%x",
-                      local_sap);
+    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", local_sap);
   }
 
   return (flushed_length);
@@ -854,12 +843,12 @@
   tLLCP_APP_CB* p_app_cb;
   tLLCP_CONNECTION_PARAMS params;
 
-  LLCP_TRACE_API2("LLCP_ConnectReq () reg_sap=0x%x, DSAP=0x%x", reg_sap, dsap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("reg_sap=0x%x, DSAP=0x%x", reg_sap, dsap);
 
   if ((llcp_cb.lcb.peer_opt != LLCP_LSC_UNKNOWN) &&
       ((llcp_cb.lcb.peer_opt & LLCP_LSC_2) == 0)) {
-    LLCP_TRACE_ERROR0(
-        "LLCP_ConnectReq (): Peer doesn't support connection-oriented link");
+    LOG(ERROR) << StringPrintf("Peer doesn't support connection-oriented link");
     return LLCP_STATUS_FAIL;
   }
 
@@ -874,29 +863,27 @@
 
   /* if application is registered */
   if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
-    LLCP_TRACE_ERROR1("LLCP_ConnectReq (): SSAP (0x%x) is not registered",
-                      reg_sap);
+    LOG(ERROR) << StringPrintf("SSAP (0x%x) is not registered", reg_sap);
     return LLCP_STATUS_FAIL;
   }
 
   if (dsap == LLCP_SAP_LM) {
-    LLCP_TRACE_ERROR1(
-        "LLCP_ConnectReq (): DSAP (0x%x) must not be link manager SAP", dsap);
+    LOG(ERROR) << StringPrintf("DSAP (0x%x) must not be link manager SAP",
+                               dsap);
     return LLCP_STATUS_FAIL;
   }
 
   if (dsap == LLCP_SAP_SDP) {
     if (strlen(p_params->sn) > LLCP_MAX_SN_LEN) {
-      LLCP_TRACE_ERROR1(
-          "LLCP_ConnectReq (): Service Name (%d bytes) is too long",
-          strlen(p_params->sn));
+      LOG(ERROR) << StringPrintf("Service Name (%zu bytes) is too long",
+                                 strlen(p_params->sn));
       return LLCP_STATUS_FAIL;
     }
   }
 
   if ((p_params) && (p_params->miu > llcp_cb.lcb.local_link_miu)) {
-    LLCP_TRACE_ERROR0(
-        "LLCP_ConnectReq (): Data link MIU shall not be bigger than local link "
+    LOG(ERROR) << StringPrintf(
+        "Data link MIU shall not be bigger than local link "
         "MIU");
     return LLCP_STATUS_FAIL;
   }
@@ -909,8 +896,8 @@
     ** link connection if there is multiple pending connection request on
     ** the same local SAP.
     */
-    LLCP_TRACE_ERROR0(
-        "LLCP_ConnectReq (): There is pending connect request on this reg_sap");
+    LOG(ERROR) << StringPrintf(
+        "There is pending connect request on this reg_sap");
     return LLCP_STATUS_FAIL;
   }
 
@@ -920,7 +907,7 @@
     status =
         llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REQ, p_params);
     if (status != LLCP_STATUS_SUCCESS) {
-      LLCP_TRACE_ERROR0("LLCP_ConnectReq (): Error in state machine");
+      LOG(ERROR) << StringPrintf("Error in state machine");
       llcp_util_deallocate_data_link(p_dlcb);
       return LLCP_STATUS_FAIL;
     }
@@ -948,8 +935,8 @@
   tLLCP_DLCB* p_dlcb;
   tLLCP_CONNECTION_PARAMS params;
 
-  LLCP_TRACE_API2("LLCP_ConnectCfm () Local SAP:0x%x, Remote SAP:0x%x)",
-                  local_sap, remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Local SAP:0x%x, Remote SAP:0x%x)", local_sap, remote_sap);
 
   if (!p_params) {
     params.miu = LLCP_DEFAULT_MIU;
@@ -958,8 +945,8 @@
     p_params = &params;
   }
   if (p_params->miu > llcp_cb.lcb.local_link_miu) {
-    LLCP_TRACE_ERROR0(
-        "LLCP_ConnectCfm (): Data link MIU shall not be bigger than local link "
+    LOG(ERROR) << StringPrintf(
+        "Data link MIU shall not be bigger than local link "
         "MIU");
     return LLCP_STATUS_FAIL;
   }
@@ -970,7 +957,7 @@
     status =
         llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_CFM, p_params);
   } else {
-    LLCP_TRACE_ERROR0("LLCP_ConnectCfm (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
     status = LLCP_STATUS_FAIL;
   }
 
@@ -998,9 +985,9 @@
   tLLCP_STATUS status;
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API3(
-      "LLCP_ConnectReject () Local SAP:0x%x, Remote SAP:0x%x, reason:0x%x",
-      local_sap, remote_sap, reason);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x, reason:0x%x", local_sap,
+                      remote_sap, reason);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1009,7 +996,7 @@
         llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REJECT, &reason);
     llcp_util_deallocate_data_link(p_dlcb);
   } else {
-    LLCP_TRACE_ERROR0("LLCP_ConnectReject (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
     status = LLCP_STATUS_FAIL;
   }
 
@@ -1032,8 +1019,8 @@
                               uint8_t total_pending_i_pdu) {
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API5(
-      "LLCP_IsDataLinkCongested () Local SAP:0x%x, Remote SAP:0x%x, pending = "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Local SAP:0x%x, Remote SAP:0x%x, pending = "
       "(%d, %d, %d)",
       local_sap, remote_sap, num_pending_i_pdu, total_pending_ui_pdu,
       total_pending_i_pdu);
@@ -1073,8 +1060,8 @@
   tLLCP_STATUS status = LLCP_STATUS_FAIL;
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API2("LLCP_SendData () Local SAP:0x%x, Remote SAP:0x%x", local_sap,
-                  remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1083,17 +1070,17 @@
       if (p_buf->offset >= LLCP_MIN_OFFSET) {
         status = llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DATA_REQ, p_buf);
       } else {
-        LLCP_TRACE_ERROR2("LLCP_SendData (): offset (%d) must be %d at least",
-                          p_buf->offset, LLCP_MIN_OFFSET);
+        LOG(ERROR) << StringPrintf("offset (%d) must be %d at least",
+                                   p_buf->offset, LLCP_MIN_OFFSET);
       }
     } else {
-      LLCP_TRACE_ERROR2(
-          "LLCP_SendData (): Information (%d bytes) cannot be more than peer "
+      LOG(ERROR) << StringPrintf(
+          "Information (%d bytes) cannot be more than peer "
           "MIU (%d bytes)",
           p_buf->len, p_dlcb->remote_miu);
     }
   } else {
-    LLCP_TRACE_ERROR0("LLCP_SendData (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
   }
 
   if (status == LLCP_STATUS_FAIL) {
@@ -1126,8 +1113,8 @@
   uint8_t* p_i_pdu;
   uint16_t i_pdu_length;
 
-  LLCP_TRACE_API2("LLCP_ReadDataLinkData () Local SAP:0x%x, Remote SAP:0x%x",
-                  local_sap, remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1194,7 +1181,7 @@
       return false;
     }
   } else {
-    LLCP_TRACE_ERROR0("LLCP_ReadDataLinkData (): No data link connection");
+    LOG(ERROR) << StringPrintf("No data link connection");
 
     return false;
   }
@@ -1217,8 +1204,8 @@
   uint8_t* p_i_pdu;
   uint16_t i_pdu_length;
 
-  LLCP_TRACE_API2("LLCP_FlushDataLinkRxData () Local SAP:0x%x, Remote SAP:0x%x",
-                  local_sap, remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1258,7 +1245,7 @@
     /* number of received I PDU is decreased so check rx congestion status */
     llcp_util_check_rx_congested_status();
   } else {
-    LLCP_TRACE_ERROR0("LLCP_FlushDataLinkRxData (): No data link connection");
+    LOG(ERROR) << StringPrintf("No data link connection");
   }
 
   return (flushed_length);
@@ -1279,9 +1266,9 @@
   tLLCP_STATUS status;
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API3(
-      "LLCP_DisconnectReq () Local SAP:0x%x, Remote SAP:0x%x, flush=%d",
-      local_sap, remote_sap, flush);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x, flush=%d", local_sap,
+                      remote_sap, flush);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1289,7 +1276,7 @@
     status =
         llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DISCONNECT_REQ, &flush);
   } else {
-    LLCP_TRACE_ERROR0("LLCP_DisconnectReq (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
     status = LLCP_STATUS_FAIL;
   }
 
@@ -1312,8 +1299,8 @@
   tLLCP_STATUS status;
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API2("LLCP_SetTxCompleteNtf () Local SAP:0x%x, Remote SAP:0x%x",
-                  local_sap, remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1322,7 +1309,7 @@
     p_dlcb->flags |= LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE;
     status = LLCP_STATUS_SUCCESS;
   } else {
-    LLCP_TRACE_ERROR0("LLCP_SetTxCompleteNtf (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
     status = LLCP_STATUS_FAIL;
   }
 
@@ -1344,8 +1331,8 @@
   tLLCP_STATUS status;
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_API2("LLCP_SetLocalBusyStatus () Local SAP:0x%x, is_busy=%d",
-                  local_sap, is_busy);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Local SAP:0x%x, is_busy=%d", local_sap, is_busy);
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
 
@@ -1364,7 +1351,7 @@
     }
     status = LLCP_STATUS_SUCCESS;
   } else {
-    LLCP_TRACE_ERROR0("LLCP_SetLocalBusyStatus (): No data link");
+    LOG(ERROR) << StringPrintf("No data link");
     status = LLCP_STATUS_FAIL;
   }
 
@@ -1382,10 +1369,10 @@
 **
 *******************************************************************************/
 uint16_t LLCP_GetRemoteWKS(void) {
-  LLCP_TRACE_API1("LLCP_GetRemoteWKS () WKS:0x%04x",
-                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
-                      ? llcp_cb.lcb.peer_wks
-                      : 0);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "WKS:0x%04x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
+                        ? llcp_cb.lcb.peer_wks
+                        : 0);
 
   if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
     return (llcp_cb.lcb.peer_wks);
@@ -1404,8 +1391,8 @@
 **
 *******************************************************************************/
 uint8_t LLCP_GetRemoteLSC(void) {
-  LLCP_TRACE_API1("LLCP_GetRemoteLSC () LSC:0x%x",
-                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "LSC:0x%x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
                       ? llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2)
                       : 0);
 
@@ -1426,10 +1413,10 @@
 **
 *******************************************************************************/
 uint8_t LLCP_GetRemoteVersion(void) {
-  LLCP_TRACE_API1("LLCP_GetRemoteVersion () Version: 0x%x",
-                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
-                      ? llcp_cb.lcb.peer_version
-                      : 0);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Version: 0x%x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
+                           ? llcp_cb.lcb.peer_version
+                           : 0);
 
   if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
     return (llcp_cb.lcb.peer_version);
@@ -1448,7 +1435,7 @@
 **
 *******************************************************************************/
 void LLCP_GetLinkMIU(uint16_t* p_local_link_miu, uint16_t* p_remote_link_miu) {
-  LLCP_TRACE_API0("LLCP_GetLinkMIU ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) {
     *p_local_link_miu = llcp_cb.lcb.local_link_miu;
@@ -1458,9 +1445,9 @@
     *p_remote_link_miu = 0;
   }
 
-  LLCP_TRACE_DEBUG2(
-      "LLCP_GetLinkMIU (): local_link_miu = %d, remote_link_miu = %d",
-      *p_local_link_miu, *p_remote_link_miu);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("local_link_miu = %d, remote_link_miu = %d",
+                      *p_local_link_miu, *p_remote_link_miu);
 }
 
 /*******************************************************************************
@@ -1479,22 +1466,22 @@
   tLLCP_STATUS status;
   uint8_t i;
 
-  LLCP_TRACE_API1("LLCP_DiscoverService () Service Name:%s", p_name);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Service Name:%s", p_name);
 
   if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
-    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Link is not activated");
+    LOG(ERROR) << StringPrintf("Link is not activated");
     return LLCP_STATUS_FAIL;
   }
 
   if (!p_cback) {
-    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Callback must be provided.");
+    LOG(ERROR) << StringPrintf("Callback must be provided.");
     return LLCP_STATUS_FAIL;
   }
 
   /* if peer version is less than V1.1 then SNL is not supported */
   if ((llcp_cb.lcb.agreed_major_version == 0x01) &&
       (llcp_cb.lcb.agreed_minor_version < 0x01)) {
-    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Peer doesn't support SNL");
+    LOG(ERROR) << StringPrintf("Peer doesn't support SNL");
     return LLCP_STATUS_FAIL;
   }
 
@@ -1515,7 +1502,7 @@
     }
   }
 
-  LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Out of resource");
+  LOG(ERROR) << StringPrintf("Out of resource");
 
   return LLCP_STATUS_FAIL;
 }
diff --git a/src/nfc/llcp/llcp_dlc.c b/src/nfc/llcp/llcp_dlc.cc
similarity index 84%
rename from src/nfc/llcp/llcp_dlc.c
rename to src/nfc/llcp/llcp_dlc.cc
index c17c419..22fd548 100644
--- a/src/nfc/llcp/llcp_dlc.c
+++ b/src/nfc/llcp/llcp_dlc.cc
@@ -22,14 +22,18 @@
  *
  ******************************************************************************/
 
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 #include <log/log.h>
-#include <string.h>
 #include "bt_types.h"
 #include "gki.h"
 #include "llcp_defs.h"
 #include "llcp_int.h"
 #include "nfc_int.h"
-#include "nfc_target.h"
+
+using android::base::StringPrintf;
 
 static tLLCP_STATUS llcp_dlsm_idle(tLLCP_DLCB* p_dlcb, tLLCP_DLC_EVENT event,
                                    void* p_data);
@@ -42,13 +46,12 @@
 static tLLCP_STATUS llcp_dlsm_connected(tLLCP_DLCB* p_dlcb,
                                         tLLCP_DLC_EVENT event, void* p_data);
 static tLLCP_STATUS llcp_dlsm_w4_remote_dm(tLLCP_DLCB* p_dlcb,
-                                           tLLCP_DLC_EVENT event, void* p_data);
-extern unsigned char appl_dta_mode_flag;
+                                           tLLCP_DLC_EVENT event);
+static std::string llcp_dlsm_get_state_name(tLLCP_DLC_STATE state);
+static std::string llcp_dlsm_get_event_name(tLLCP_DLC_EVENT event);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* llcp_dlsm_get_state_name(tLLCP_DLC_STATE state);
-static char* llcp_dlsm_get_event_name(tLLCP_DLC_EVENT event);
-#endif
+extern bool nfc_debug_enabled;
+extern unsigned char appl_dta_mode_flag;
 
 /*******************************************************************************
 **
@@ -64,14 +67,10 @@
                                void* p_data) {
   tLLCP_STATUS status;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  LLCP_TRACE_EVENT3("DLC (0x%02X) - state: %s, evt: %s", p_dlcb->local_sap,
-                    llcp_dlsm_get_state_name(p_dlcb->state),
-                    llcp_dlsm_get_event_name(event));
-#else
-  LLCP_TRACE_EVENT3("DLC (0x%02X) - state: %d, evt: %d", p_dlcb->local_sap,
-                    p_dlcb->state, event);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("DLC (0x%02X) - state: %s, evt: %s", p_dlcb->local_sap,
+                      llcp_dlsm_get_state_name(p_dlcb->state).c_str(),
+                      llcp_dlsm_get_event_name(event).c_str());
 
   switch (p_dlcb->state) {
     case LLCP_DLC_STATE_IDLE:
@@ -91,7 +90,7 @@
       break;
 
     case LLCP_DLC_STATE_W4_REMOTE_DM:
-      status = llcp_dlsm_w4_remote_dm(p_dlcb, event, p_data);
+      status = llcp_dlsm_w4_remote_dm(p_dlcb, event);
       break;
 
     default:
@@ -145,8 +144,8 @@
       p_params = (tLLCP_CONNECTION_PARAMS*)p_data;
 
       if (p_params->miu > llcp_cb.lcb.peer_miu) {
-        LLCP_TRACE_WARNING0(
-            "llcp_dlsm_idle (): Peer sent data link MIU bigger than peer's "
+        LOG(WARNING) << StringPrintf(
+            "Peer sent data link MIU bigger than peer's "
             "link MIU");
         p_params->miu = llcp_cb.lcb.peer_miu;
       }
@@ -162,8 +161,8 @@
       p_dlcb->remote_miu = p_params->miu;
       p_dlcb->remote_rw = p_params->rw;
 
-      LLCP_TRACE_DEBUG2("llcp_dlsm_idle (): Remote MIU:%d, RW:%d",
-                        p_dlcb->remote_miu, p_dlcb->remote_rw);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "Remote MIU:%d, RW:%d", p_dlcb->remote_miu, p_dlcb->remote_rw);
 
       /* wait for response from upper layer */
       p_dlcb->state = LLCP_DLC_STATE_W4_LOCAL_RESP;
@@ -178,7 +177,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR0("llcp_dlsm_idle (): Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       status = LLCP_STATUS_FAIL;
       break;
   }
@@ -213,8 +212,8 @@
 
       /* data link MIU must be up to link MIU */
       if (p_params->miu > llcp_cb.lcb.peer_miu) {
-        LLCP_TRACE_WARNING0(
-            "llcp_dlsm_w4_remote_resp (): Peer sent data link MIU bigger than "
+        LOG(WARNING) << StringPrintf(
+            "Peer sent data link MIU bigger than "
             "peer's link MIU");
         p_params->miu = llcp_cb.lcb.peer_miu;
       }
@@ -222,8 +221,8 @@
       p_dlcb->remote_miu = p_params->miu;
       p_dlcb->remote_rw = p_params->rw;
 
-      LLCP_TRACE_DEBUG2("llcp_dlsm_w4_remote_resp (): Remote MIU:%d, RW:%d",
-                        p_dlcb->remote_miu, p_dlcb->remote_rw);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "Remote MIU:%d, RW:%d", p_dlcb->remote_miu, p_dlcb->remote_rw);
 
       p_dlcb->state = LLCP_DLC_STATE_CONNECTED;
       llcp_util_adjust_dl_rx_congestion();
@@ -272,7 +271,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR0("llcp_dlsm_w4_remote_resp (): Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       status = LLCP_STATUS_FAIL;
       break;
   }
@@ -360,7 +359,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR0("llcp_dlsm_w4_local_resp (): Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       status = LLCP_STATUS_FAIL;
       break;
   }
@@ -445,8 +444,8 @@
             (p_dlcb->i_xmit_q.count >=
              p_dlcb->remote_rw)) /*if enough data to send next round */
         {
-          LLCP_TRACE_DEBUG3(
-              "llcp_dlsm_connected (): Data link (SSAP:DSAP=0x%X:0x%X) "
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "Data link (SSAP:DSAP=0x%X:0x%X) "
               "congested: xmit_q.count=%d",
               p_dlcb->local_sap, p_dlcb->remote_sap, p_dlcb->i_xmit_q.count);
 
@@ -456,8 +455,7 @@
           status = LLCP_STATUS_CONGESTED;
         }
       } else {
-        LLCP_TRACE_ERROR0(
-            "llcp_dlsm_connected (): Remote RW is zero: discard data");
+        LOG(ERROR) << StringPrintf("Remote RW is zero: discard data");
         /* buffer will be freed when returned to API function */
         status = LLCP_STATUS_FAIL;
       }
@@ -489,7 +487,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR0("llcp_dlsm_connected (): Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       status = LLCP_STATUS_FAIL;
       break;
   }
@@ -508,8 +506,7 @@
 **
 *******************************************************************************/
 static tLLCP_STATUS llcp_dlsm_w4_remote_dm(tLLCP_DLCB* p_dlcb,
-                                           tLLCP_DLC_EVENT event,
-                                           void* p_data) {
+                                           tLLCP_DLC_EVENT event) {
   tLLCP_STATUS status = LLCP_STATUS_SUCCESS;
   tLLCP_SAP_CBACK_DATA data;
 
@@ -551,7 +548,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR0("llcp_dlsm_w4_remote_dm (): Unexpected event");
+      LOG(ERROR) << StringPrintf("Unexpected event");
       status = LLCP_STATUS_FAIL;
       break;
   }
@@ -599,8 +596,8 @@
 *******************************************************************************/
 void llcp_dlc_flush_q(tLLCP_DLCB* p_dlcb) {
   if (p_dlcb) {
-    LLCP_TRACE_DEBUG1("llcp_dlc_flush_q (): local SAP:0x%02X",
-                      p_dlcb->local_sap);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("local SAP:0x%02X", p_dlcb->local_sap);
 
     /* Release any held buffers */
     while (p_dlcb->i_xmit_q.p_first) {
@@ -611,7 +608,7 @@
     /* discard any received I PDU on data link  including in AGF */
     LLCP_FlushDataLinkRxData(p_dlcb->local_sap, p_dlcb->remote_sap);
   } else {
-    LLCP_TRACE_ERROR0("llcp_dlc_flush_q (): p_dlcb is NULL");
+    LOG(ERROR) << StringPrintf("p_dlcb is NULL");
   }
 }
 
@@ -632,21 +629,20 @@
 
   tLLCP_CONNECTION_PARAMS params;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_connect_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_app_cb = llcp_util_get_app_cb(dsap);
 
   if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL) ||
       ((p_app_cb->link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0)) {
-    LLCP_TRACE_ERROR1("llcp_dlc_proc_connect_pdu (): Unregistered SAP:0x%x",
-                      dsap);
+    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", dsap);
     llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_NO_SERVICE);
     return;
   }
 
   /* parse CONNECT PDU and get connection parameters */
   if (llcp_util_parse_connect(p_data, length, &params) != LLCP_STATUS_SUCCESS) {
-    LLCP_TRACE_ERROR0("llcp_dlc_proc_connect_pdu (): Bad format CONNECT");
+    LOG(ERROR) << StringPrintf("Bad format CONNECT");
     /* fix to pass TC_CTO_TAR_BI_02_x (x=5) test case
      * As per the LLCP test specification v1.2.00 by receiving erroneous SNL PDU
      * i'e with improper length and service name "urn:nfc:sn:dta-co-echo-in",
@@ -654,7 +650,8 @@
 
     if (appl_dta_mode_flag == 1 &&
         p_data[1] == strlen((const char*)&p_data[2])) {
-      LLCP_TRACE_DEBUG1("%s: Strings are not equal", __func__);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("%s: Strings are not equal", __func__);
       llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_NO_SERVICE);
     } else {
       llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_NO_SERVICE);
@@ -680,15 +677,13 @@
     }
 
     if (dsap == LLCP_SAP_SDP) {
-      LLCP_TRACE_ERROR0(
-          "llcp_dlc_proc_connect_pdu (): SDP doesn't accept connection");
+      LOG(ERROR) << StringPrintf("SDP doesn't accept connection");
 
       llcp_util_send_dm(ssap, LLCP_SAP_SDP,
                         LLCP_SAP_DM_REASON_PERM_REJECT_THIS);
       return;
     } else if (dsap == 0) {
-      LLCP_TRACE_ERROR1("llcp_dlc_proc_connect_pdu (): Unregistered Service:%s",
-                        params.sn);
+      LOG(ERROR) << StringPrintf("Unregistered Service:%s", params.sn);
 
       llcp_util_send_dm(ssap, LLCP_SAP_SDP, LLCP_SAP_DM_REASON_NO_SERVICE);
       return;
@@ -698,8 +693,8 @@
 
       if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL) ||
           ((p_app_cb->link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0)) {
-        LLCP_TRACE_ERROR1(
-            "llcp_dlc_proc_connect_pdu (): SAP(0x%x) doesn't support "
+        LOG(ERROR) << StringPrintf(
+            "SAP(0x%x) doesn't support "
             "connection-oriented",
             dsap);
         llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_NO_SERVICE);
@@ -711,8 +706,7 @@
   /* check if any data link */
   p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, ssap);
   if (p_dlcb) {
-    LLCP_TRACE_ERROR0(
-        "llcp_dlc_proc_connect_pdu (): Data link is aleady established");
+    LOG(ERROR) << StringPrintf("Data link is aleady established");
     llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_TEMP_REJECT_THIS);
   } else {
     /* allocate data link connection control block and notify upper layer
@@ -723,12 +717,11 @@
       status =
           llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_CONNECT_IND, &params);
       if (status != LLCP_STATUS_SUCCESS) {
-        LLCP_TRACE_ERROR0(
-            "llcp_dlc_proc_connect_pdu (): Error in state machine");
+        LOG(ERROR) << StringPrintf("Error in state machine");
         llcp_util_deallocate_data_link(p_dlcb);
       }
     } else {
-      LLCP_TRACE_ERROR0("llcp_dlc_proc_connect_pdu (): Out of resource");
+      LOG(ERROR) << StringPrintf("Out of resource");
       llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_TEMP_REJECT_ANY);
     }
   }
@@ -743,17 +736,17 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void llcp_dlc_proc_disc_pdu(uint8_t dsap, uint8_t ssap, uint16_t length,
-                                   uint8_t* p_data) {
+static void llcp_dlc_proc_disc_pdu(uint8_t dsap, uint8_t ssap,
+                                   uint16_t length) {
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_disc_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, ssap);
   if (p_dlcb) {
     if (length > 0) {
-      LLCP_TRACE_ERROR1(
-          "llcp_dlc_proc_disc_pdu (): Received extra data (%d bytes) in DISC "
+      LOG(ERROR) << StringPrintf(
+          "Received extra data (%d bytes) in DISC "
           "PDU",
           length);
 
@@ -765,9 +758,7 @@
       llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_DISCONNECT_IND, NULL);
     }
   } else {
-    LLCP_TRACE_ERROR2(
-        "llcp_dlc_proc_disc_pdu (): No data link for SAP (0x%x,0x%x)", dsap,
-        ssap);
+    LOG(ERROR) << StringPrintf("No data link for SAP (0x%x,0x%x)", dsap, ssap);
   }
 }
 
@@ -786,7 +777,7 @@
   tLLCP_CONNECTION_PARAMS params;
   tLLCP_STATUS status;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_cc_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* find a DLCB waiting for CC on this local SAP */
   p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, LLCP_INVALID_SAP);
@@ -800,7 +791,7 @@
       status =
           llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_CONNECT_CFM, &params);
       if (status != LLCP_STATUS_SUCCESS) {
-        LLCP_TRACE_ERROR0("llcp_dlc_proc_cc_pdu (): Error in state machine");
+        LOG(ERROR) << StringPrintf("Error in state machine");
         llcp_util_deallocate_data_link(p_dlcb);
       }
     } else {
@@ -810,9 +801,7 @@
       llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_FRAME_ERROR, NULL);
     }
   } else {
-    LLCP_TRACE_ERROR2(
-        "llcp_dlc_proc_cc_pdu (): No data link for SAP (0x%x,0x%x)", dsap,
-        ssap);
+    LOG(ERROR) << StringPrintf("No data link for SAP (0x%x,0x%x)", dsap, ssap);
   }
 }
 
@@ -829,10 +818,10 @@
                                  uint8_t* p_data) {
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_dm_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (length != LLCP_PDU_DM_SIZE - LLCP_PDU_HEADER_SIZE) {
-    LLCP_TRACE_ERROR0("llcp_dlc_proc_dm_pdu (): Received invalid DM PDU");
+    LOG(ERROR) << StringPrintf("Received invalid DM PDU");
   } else {
     if (*p_data == LLCP_SAP_DM_REASON_RESP_DISC) {
       /* local device initiated disconnecting */
@@ -847,9 +836,8 @@
       llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_DISCONNECT_RESP,
                         p_data); /* passing reason */
     } else {
-      LLCP_TRACE_ERROR2(
-          "llcp_dlc_proc_dm_pdu (): No data link for SAP (0x%x,0x%x)", dsap,
-          ssap);
+      LOG(ERROR) << StringPrintf("No data link for SAP (0x%x,0x%x)", dsap,
+                                 ssap);
     }
   }
 }
@@ -871,7 +859,7 @@
   bool appended;
   NFC_HDR* p_last_buf;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_i_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, ssap);
 
@@ -885,7 +873,7 @@
 
     if (i_pdu_length < LLCP_PDU_HEADER_SIZE + LLCP_SEQUENCE_SIZE) {
       android_errorWriteLog(0x534e4554, "116722267");
-      LLCP_TRACE_ERROR1("Insufficient I PDU length %d", i_pdu_length);
+      LOG(ERROR) << StringPrintf("Insufficient I PDU length %d", i_pdu_length);
       if (p_msg) {
         GKI_freebuf(p_msg);
       }
@@ -895,8 +883,8 @@
     info_len = i_pdu_length - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE;
 
     if (info_len > p_dlcb->local_miu) {
-      LLCP_TRACE_ERROR2(
-          "llcp_dlc_proc_i_pdu (): exceeding local MIU (%d bytes): got %d "
+      LOG(ERROR) << StringPrintf(
+          "exceeding local MIU (%d bytes): got %d "
           "bytes SDU",
           p_dlcb->local_miu, info_len);
 
@@ -909,26 +897,24 @@
     send_seq = LLCP_GET_NS(*p);
     rcv_seq = LLCP_GET_NR(*p);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-    LLCP_TRACE_DEBUG6(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "LLCP RX I PDU - N(S,R):(%d,%d) V(S,SA,R,RA):(%d,%d,%d,%d)", send_seq,
         rcv_seq, p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq, p_dlcb->next_rx_seq,
         p_dlcb->sent_ack_seq);
-#endif
 
     /* if send sequence number, N(S) is not expected one, V(R) */
     if (p_dlcb->next_rx_seq != send_seq) {
-      LLCP_TRACE_ERROR2("llcp_dlc_proc_i_pdu (): Bad N(S) got:%d, expected:%d",
-                        send_seq, p_dlcb->next_rx_seq);
+      LOG(ERROR) << StringPrintf("Bad N(S) got:%d, expected:%d", send_seq,
+                                 p_dlcb->next_rx_seq);
 
       error_flags |= LLCP_FRMR_S_ERROR_FLAG;
     } else {
       /* if peer device sends more than our receiving window size */
       if ((uint8_t)(send_seq - p_dlcb->sent_ack_seq) % LLCP_SEQ_MODULO >=
           p_dlcb->local_rw) {
-        LLCP_TRACE_ERROR3(
-            "llcp_dlc_proc_i_pdu (): Bad N(S):%d >= V(RA):%d + RW(L):%d",
-            send_seq, p_dlcb->sent_ack_seq, p_dlcb->local_rw);
+        LOG(ERROR) << StringPrintf("Bad N(S):%d >= V(RA):%d + RW(L):%d",
+                                   send_seq, p_dlcb->sent_ack_seq,
+                                   p_dlcb->local_rw);
 
         error_flags |= LLCP_FRMR_S_ERROR_FLAG;
       }
@@ -940,9 +926,9 @@
         (uint8_t)(p_dlcb->next_tx_seq - p_dlcb->rcvd_ack_seq) %
             LLCP_SEQ_MODULO) {
       error_flags |= LLCP_FRMR_R_ERROR_FLAG;
-      LLCP_TRACE_ERROR3(
-          "llcp_dlc_proc_i_pdu (): Bad N(R):%d valid range [V(SA):%d, V(S):%d]",
-          rcv_seq, p_dlcb->rcvd_ack_seq, p_dlcb->next_tx_seq);
+      LOG(ERROR) << StringPrintf("Bad N(R):%d valid range [V(SA):%d, V(S):%d]",
+                                 rcv_seq, p_dlcb->rcvd_ack_seq,
+                                 p_dlcb->next_tx_seq);
     }
 
     /* if any error is found */
@@ -1018,7 +1004,7 @@
             p_msg->len = LLCP_PDU_AGF_LEN_SIZE + info_len;
             p_msg->layer_specific = 0;
           } else {
-            LLCP_TRACE_ERROR0("llcp_dlc_proc_i_pdu (): out of buffer");
+            LOG(ERROR) << StringPrintf("out of buffer");
           }
         }
 
@@ -1042,8 +1028,8 @@
 
       if ((!p_dlcb->is_rx_congested) &&
           (p_dlcb->num_rx_i_pdu >= p_dlcb->rx_congest_threshold)) {
-        LLCP_TRACE_DEBUG2(
-            "llcp_dlc_proc_i_pdu (): congested num_rx_i_pdu=%d, "
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "congested num_rx_i_pdu=%d, "
             "rx_congest_threshold=%d",
             p_dlcb->num_rx_i_pdu, p_dlcb->rx_congest_threshold);
 
@@ -1053,8 +1039,7 @@
       }
     }
   } else {
-    LLCP_TRACE_ERROR2(
-        "llcp_dlc_proc_i_pdu (): No data link for SAP (0x%x,0x%x)", dsap, ssap);
+    LOG(ERROR) << StringPrintf("No data link for SAP (0x%x,0x%x)", dsap, ssap);
     llcp_util_send_dm(ssap, dsap, LLCP_SAP_DM_REASON_NO_ACTIVE_CONNECTION);
   }
 
@@ -1080,7 +1065,7 @@
   tLLCP_SAP_CBACK_DATA cback_data;
   bool old_remote_busy;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_proc_rr_rnr_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, ssap);
   if (p_dlcb != NULL) {
@@ -1102,8 +1087,8 @@
         (uint8_t)(p_dlcb->next_tx_seq - p_dlcb->rcvd_ack_seq) %
             LLCP_SEQ_MODULO) {
       error_flags |= LLCP_FRMR_R_ERROR_FLAG;
-      LLCP_TRACE_ERROR3(
-          "llcp_dlc_proc_rr_rnr_pdu (): Bad N(R):%d valid range [V(SA):%d, "
+      LOG(ERROR) << StringPrintf(
+          "Bad N(R):%d valid range [V(SA):%d, "
           "V(S):%d]",
           rcv_seq, p_dlcb->rcvd_ack_seq, p_dlcb->next_tx_seq);
     }
@@ -1114,18 +1099,17 @@
     } else {
       p_dlcb->rcvd_ack_seq = rcv_seq;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-      LLCP_TRACE_DEBUG5("LLCP RX - N(S,R):(NA,%d) V(S,SA,R,RA):(%d,%d,%d,%d)",
-                        rcv_seq, p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq,
-                        p_dlcb->next_rx_seq, p_dlcb->sent_ack_seq);
-#endif
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("LLCP RX - N(S,R):(NA,%d) V(S,SA,R,RA):(%d,%d,%d,%d)",
+                          rcv_seq, p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq,
+                          p_dlcb->next_rx_seq, p_dlcb->sent_ack_seq);
       old_remote_busy = p_dlcb->remote_busy;
       if (ptype == LLCP_PDU_RNR_TYPE) {
         p_dlcb->remote_busy = true;
         /* if upper layer hasn't get congestion started notification */
         if ((!old_remote_busy) && (!p_dlcb->is_tx_congested)) {
-          LLCP_TRACE_WARNING3(
-              "llcp_dlc_proc_rr_rnr_pdu (): Data link (SSAP:DSAP=0x%X:0x%X) "
+          LOG(WARNING) << StringPrintf(
+              "Data link (SSAP:DSAP=0x%X:0x%X) "
               "congestion start: i_xmit_q.count=%d",
               p_dlcb->local_sap, p_dlcb->remote_sap, p_dlcb->i_xmit_q.count);
 
@@ -1142,8 +1126,8 @@
         /* if upper layer hasn't get congestion ended notification and data link
          * is not congested */
         if ((old_remote_busy) && (!p_dlcb->is_tx_congested)) {
-          LLCP_TRACE_WARNING3(
-              "llcp_dlc_proc_rr_rnr_pdu (): Data link (SSAP:DSAP=0x%X:0x%X) "
+          LOG(WARNING) << StringPrintf(
+              "Data link (SSAP:DSAP=0x%X:0x%X) "
               "congestion end: i_xmit_q.count=%d",
               p_dlcb->local_sap, p_dlcb->remote_sap, p_dlcb->i_xmit_q.count);
 
@@ -1169,9 +1153,7 @@
       }
     }
   } else {
-    LLCP_TRACE_ERROR2(
-        "llcp_dlc_proc_rr_rnr_pdu (): No data link for SAP (0x%x,0x%x)", dsap,
-        ssap);
+    LOG(ERROR) << StringPrintf("No data link for SAP (0x%x,0x%x)", dsap, ssap);
   }
 }
 
@@ -1188,13 +1170,11 @@
                           uint16_t length, uint8_t* p_data) {
   tLLCP_DLCB* p_dlcb;
 
-  LLCP_TRACE_DEBUG3("llcp_dlc_proc_rx_pdu (): DSAP:0x%x, PTYPE:0x%x, SSAP:0x%x",
-                    dsap, ptype, ssap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("DSAP:0x%x, PTYPE:0x%x, SSAP:0x%x", dsap, ptype, ssap);
 
   if (dsap == LLCP_SAP_LM) {
-    LLCP_TRACE_ERROR2(
-        "llcp_dlc_proc_rx_pdu (): Invalid SAP:0x%x for PTYPE:0x%x", dsap,
-        ptype);
+    LOG(ERROR) << StringPrintf("Invalid SAP:0x%x for PTYPE:0x%x", dsap, ptype);
     return;
   }
 
@@ -1204,7 +1184,7 @@
       break;
 
     case LLCP_PDU_DISC_TYPE:
-      llcp_dlc_proc_disc_pdu(dsap, ssap, length, p_data);
+      llcp_dlc_proc_disc_pdu(dsap, ssap, length);
       break;
 
     case LLCP_PDU_CC_TYPE:
@@ -1228,8 +1208,7 @@
       break;
 
     default:
-      LLCP_TRACE_ERROR1("llcp_dlc_proc_rx_pdu (): Unexpected PDU type (0x%x)",
-                        ptype);
+      LOG(ERROR) << StringPrintf("Unexpected PDU type (0x%x)", ptype);
 
       p_dlcb = llcp_dlc_find_dlcb_by_sap(dsap, ssap);
       if (p_dlcb) {
@@ -1253,7 +1232,7 @@
   uint8_t idx;
   bool flush = true;
 
-  LLCP_TRACE_DEBUG0("llcp_dlc_check_to_send_rr_rnr ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /*
   ** DLC doesn't send RR PDU for each received I PDU because multiple I PDUs
@@ -1297,9 +1276,9 @@
       p_dlcb->remote_rw) {
     return true;
   } else {
-    LLCP_TRACE_DEBUG3(
-        "llcp_dlc_is_rw_open ():Flow Off, V(S):%d, V(SA):%d, RW(R):%d",
-        p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq, p_dlcb->remote_rw);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Flow Off, V(S):%d, V(SA):%d, RW(R):%d", p_dlcb->next_tx_seq,
+        p_dlcb->rcvd_ack_seq, p_dlcb->remote_rw);
     return false;
   }
 }
@@ -1318,9 +1297,7 @@
   bool flush = true;
   tLLCP_SAP_CBACK_DATA data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
   uint8_t send_seq = p_dlcb->next_tx_seq;
-#endif
 
   /* if there is data to send and remote device can receive it */
   if ((p_dlcb->i_xmit_q.count) && (!p_dlcb->remote_busy) &&
@@ -1335,16 +1312,13 @@
 
       p_dlcb->next_tx_seq = (p_dlcb->next_tx_seq + 1) % LLCP_SEQ_MODULO;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-      LLCP_TRACE_DEBUG6("LLCP TX - N(S,R):(%d,%d) V(S,SA,R,RA):(%d,%d,%d,%d)",
-                        send_seq, p_dlcb->next_rx_seq, p_dlcb->next_tx_seq,
-                        p_dlcb->rcvd_ack_seq, p_dlcb->next_rx_seq,
-                        p_dlcb->sent_ack_seq);
-#endif
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "LLCP TX - N(S,R):(%d,%d) V(S,SA,R,RA):(%d,%d,%d,%d)", send_seq,
+          p_dlcb->next_rx_seq, p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq,
+          p_dlcb->next_rx_seq, p_dlcb->sent_ack_seq);
     } else {
-      LLCP_TRACE_ERROR2(
-          "LLCP - llcp_dlc_get_next_pdu (): offset (%d) must be %d at least",
-          p_msg->offset, LLCP_MIN_OFFSET);
+      LOG(ERROR) << StringPrintf("offset (%d) must be %d at least",
+                                 p_msg->offset, LLCP_MIN_OFFSET);
       GKI_freebuf(p_msg);
       p_msg = NULL;
     }
@@ -1397,7 +1371,6 @@
   return 0;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         llcp_dlsm_get_state_name
@@ -1407,20 +1380,20 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* llcp_dlsm_get_state_name(tLLCP_DLC_STATE state) {
+static std::string llcp_dlsm_get_state_name(tLLCP_DLC_STATE state) {
   switch (state) {
     case LLCP_DLC_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case LLCP_DLC_STATE_W4_REMOTE_RESP:
-      return ("W4_REMOTE_RESP");
+      return "W4_REMOTE_RESP";
     case LLCP_DLC_STATE_W4_LOCAL_RESP:
-      return ("W4_LOCAL_RESP");
+      return "W4_LOCAL_RESP";
     case LLCP_DLC_STATE_CONNECTED:
-      return ("CONNECTED");
+      return "CONNECTED";
     case LLCP_DLC_STATE_W4_REMOTE_DM:
-      return ("W4_REMOTE_DM");
+      return "W4_REMOTE_DM";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
 
@@ -1433,41 +1406,35 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* llcp_dlsm_get_event_name(tLLCP_DLC_EVENT event) {
+static std::string llcp_dlsm_get_event_name(tLLCP_DLC_EVENT event) {
   switch (event) {
     case LLCP_DLC_EVENT_API_CONNECT_REQ:
-      return ("API_CONNECT_REQ");
+      return "API_CONNECT_REQ";
     case LLCP_DLC_EVENT_API_CONNECT_CFM:
-      return ("API_CONNECT_CFM");
+      return "API_CONNECT_CFM";
     case LLCP_DLC_EVENT_API_CONNECT_REJECT:
-      return ("API_CONNECT_REJECT");
+      return "API_CONNECT_REJECT";
     case LLCP_DLC_EVENT_PEER_CONNECT_IND:
-      return ("PEER_CONNECT_IND");
+      return "PEER_CONNECT_IND";
     case LLCP_DLC_EVENT_PEER_CONNECT_CFM:
-      return ("PEER_CONNECT_CFM");
-
+      return "PEER_CONNECT_CFM";
     case LLCP_DLC_EVENT_API_DATA_REQ:
-      return ("API_DATA_REQ");
+      return "API_DATA_REQ";
     case LLCP_DLC_EVENT_PEER_DATA_IND:
-      return ("PEER_DATA_IND");
-
+      return "PEER_DATA_IND";
     case LLCP_DLC_EVENT_API_DISCONNECT_REQ:
-      return ("API_DISCONNECT_REQ");
+      return "API_DISCONNECT_REQ";
     case LLCP_DLC_EVENT_PEER_DISCONNECT_IND:
-      return ("PEER_DISCONNECT_IND");
+      return "PEER_DISCONNECT_IND";
     case LLCP_DLC_EVENT_PEER_DISCONNECT_RESP:
-      return ("PEER_DISCONNECT_RESP");
-
+      return "PEER_DISCONNECT_RESP";
     case LLCP_DLC_EVENT_FRAME_ERROR:
-      return ("FRAME_ERROR");
+      return "FRAME_ERROR";
     case LLCP_DLC_EVENT_LINK_ERROR:
-      return ("LINK_ERROR");
-
+      return "LINK_ERROR";
     case LLCP_DLC_EVENT_TIMEOUT:
-      return ("TIMEOUT");
-
+      return "TIMEOUT";
     default:
-      return ("???? UNKNOWN EVENT");
+      return "???? UNKNOWN EVENT";
   }
 }
-#endif /* (BT_TRACE_VERBOSE == TRUE) */
diff --git a/src/nfc/llcp/llcp_link.c b/src/nfc/llcp/llcp_link.cc
similarity index 92%
rename from src/nfc/llcp/llcp_link.c
rename to src/nfc/llcp/llcp_link.cc
index 78d3b51..f144d45 100644
--- a/src/nfc/llcp/llcp_link.c
+++ b/src/nfc/llcp/llcp_link.cc
@@ -22,17 +22,21 @@
  *
  ******************************************************************************/
 
-#include <log/log.h>
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <log/log.h>
 #include "bt_types.h"
 #include "gki.h"
 #include "llcp_defs.h"
 #include "llcp_int.h"
 #include "nfa_dm_int.h"
 #include "nfc_int.h"
-#include "nfc_target.h"
 #include "trace_api.h"
 
+using android::base::StringPrintf;
+
 const uint16_t llcp_link_rwt
     [15] = /* RWT = (302us)*2**WT; 302us = 256*16/fc; fc = 13.56MHz */
     {
@@ -78,12 +82,11 @@
 extern tLLCP_TEST_PARAMS llcp_test_params;
 #endif
 
+extern bool nfc_debug_enabled;
 extern unsigned char appl_dta_mode_flag;
 
 /* debug functions type */
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* llcp_pdu_type(uint8_t ptype);
-#endif
+static std::string llcp_pdu_type(uint8_t ptype);
 
 /*******************************************************************************
 **
@@ -97,8 +100,8 @@
 static void llcp_link_start_inactivity_timer(void) {
   if ((llcp_cb.lcb.inact_timer.in_use == false) &&
       (llcp_cb.lcb.inact_timeout > 0)) {
-    LLCP_TRACE_DEBUG1("Start inactivity_timer: %d ms",
-                      llcp_cb.lcb.inact_timeout);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Start inactivity_timer: %d ms", llcp_cb.lcb.inact_timeout);
 
     nfc_start_quick_timer(&llcp_cb.lcb.inact_timer, NFC_TTYPE_LLCP_LINK_INACT,
                           ((uint32_t)llcp_cb.lcb.inact_timeout) *
@@ -117,7 +120,7 @@
 *******************************************************************************/
 static void llcp_link_stop_inactivity_timer(void) {
   if (llcp_cb.lcb.inact_timer.in_use) {
-    LLCP_TRACE_DEBUG0("Stop inactivity_timer");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Stop inactivity_timer");
 
     nfc_stop_quick_timer(&llcp_cb.lcb.inact_timer);
   }
@@ -170,23 +173,23 @@
 **
 *******************************************************************************/
 tLLCP_STATUS llcp_link_activate(tLLCP_ACTIVATE_CONFIG* p_config) {
-  LLCP_TRACE_DEBUG0("llcp_link_activate ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* At this point, MAC link activation procedure has been successfully
    * completed */
 
   /* The Length Reduction values LRi and LRt MUST be 11b. (254bytes) */
   if (p_config->max_payload_size != LLCP_NCI_MAX_PAYL_SIZE) {
-    LLCP_TRACE_WARNING2(
-        "llcp_link_activate (): max payload size (%d) must be %d bytes",
-        p_config->max_payload_size, LLCP_NCI_MAX_PAYL_SIZE);
+    LOG(WARNING) << StringPrintf("max payload size (%d) must be %d bytes",
+                                 p_config->max_payload_size,
+                                 LLCP_NCI_MAX_PAYL_SIZE);
   }
 
   /* Processing the parametes that have been received with the MAC link
    * activation */
   if (llcp_link_parse_gen_bytes(p_config->gen_bytes_len,
                                 p_config->p_gen_bytes) == false) {
-    LLCP_TRACE_ERROR0("llcp_link_activate (): Failed to parse general bytes");
+    LOG(ERROR) << StringPrintf("Failed to parse general bytes");
     /* For LLCP DTA test, In case of bad magic bytes normal p2p communication is
      * expected,but in case of wrong magic bytes in ATR_REQ, LLC layer will be
      * disconnected but P2P connection is expected to be in connected state
@@ -225,8 +228,8 @@
   */
   if ((p_config->is_initiator) &&
       (llcp_link_rwt[p_config->waiting_time] > llcp_cb.lcb.peer_lto)) {
-    LLCP_TRACE_WARNING3(
-        "llcp_link_activate (): WT (%d, %dms) must be less than or equal to "
+    LOG(WARNING) << StringPrintf(
+        "WT (%d, %dms) must be less than or equal to "
         "LTO (%dms)",
         p_config->waiting_time, llcp_link_rwt[p_config->waiting_time],
         llcp_cb.lcb.peer_lto);
@@ -240,7 +243,7 @@
   }
   /* LLCP version number agreement */
   if (llcp_link_version_agreement() == false) {
-    LLCP_TRACE_ERROR0("llcp_link_activate (): Failed to agree version");
+    LOG(ERROR) << StringPrintf("Failed to agree version");
     (*llcp_cb.lcb.p_link_cback)(LLCP_LINK_ACTIVATION_FAILED_EVT,
                                 LLCP_LINK_VERSION_FAILED);
 
@@ -270,7 +273,7 @@
   ** symmetry procedure.
   */
   if (llcp_cb.lcb.is_initiator) {
-    LLCP_TRACE_DEBUG0("llcp_link_activate (): Connected as Initiator");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Connected as Initiator");
 
     llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_init;
     llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_LOCAL_XMIT_NEXT;
@@ -285,7 +288,7 @@
       llcp_link_send_SYMM();
     }
   } else {
-    LLCP_TRACE_DEBUG0("llcp_link_activate (): Connected as Target");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Connected as Target");
     llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_target;
     llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT;
 
@@ -353,8 +356,8 @@
     if ((llcp_cb.lcb.symm_delay > 0) &&
         (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)) {
       /* upper layer doesn't have anything to send */
-      LLCP_TRACE_DEBUG0(
-          "llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of "
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "LEVT_TIMEOUT in state of "
           "LLCP_LINK_SYMM_LOCAL_XMIT_NEXT");
       llcp_link_send_SYMM();
 
@@ -366,8 +369,8 @@
         llcp_link_start_inactivity_timer();
       }
     } else {
-      LLCP_TRACE_ERROR0(
-          "llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of "
+      LOG(ERROR) << StringPrintf(
+          "LEVT_TIMEOUT in state of "
           "LLCP_LINK_SYMM_REMOTE_XMIT_NEXT");
       llcp_link_deactivate(LLCP_LINK_TIMEOUT);
     }
@@ -392,7 +395,7 @@
   tLLCP_DLCB* p_dlcb;
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_DEBUG1("llcp_link_deactivate () reason = 0x%x", reason);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("reason = 0x%x", reason);
 
   /* Release any held buffers in signaling PDU queue */
   while (llcp_cb.lcb.sig_xmit_q.p_first)
@@ -449,8 +452,8 @@
     llcp_util_send_disc(LLCP_SAP_LM, LLCP_SAP_LM);
 
     /* Wait until DISC is sent to peer */
-    LLCP_TRACE_DEBUG0(
-        "llcp_link_deactivate (): Wait until DISC is sent to peer");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Wait until DISC is sent to peer");
 
     llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATING;
 
@@ -528,8 +531,8 @@
   peer_minor_version = LLCP_GET_MINOR_VERSION(llcp_cb.lcb.peer_version);
 
   if (peer_major_version < LLCP_MIN_MAJOR_VERSION) {
-    LLCP_TRACE_ERROR1(
-        "llcp_link_version_agreement(): unsupported peer version number. Peer "
+    LOG(ERROR) << StringPrintf(
+        "unsupported peer version number. Peer "
         "Major Version:%d",
         peer_major_version);
     return false;
@@ -551,7 +554,7 @@
       llcp_cb.lcb.agreed_minor_version = LLCP_VERSION_MINOR;
     }
 
-    LLCP_TRACE_DEBUG6(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "local version:%d.%d, remote version:%d.%d, agreed version:%d.%d",
         LLCP_VERSION_MAJOR, LLCP_VERSION_MINOR, peer_major_version,
         peer_minor_version, llcp_cb.lcb.agreed_major_version,
@@ -615,7 +618,7 @@
     /* overall buffer usage is high */
     llcp_cb.overall_tx_congested = true;
 
-    LLCP_TRACE_WARNING2(
+    LOG(WARNING) << StringPrintf(
         "overall tx congestion start: total_tx_ui_pdu=%d, total_tx_i_pdu=%d",
         llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu);
 
@@ -635,7 +638,7 @@
         if (!p_app_cb->is_ui_tx_congested) {
           p_app_cb->is_ui_tx_congested = true;
 
-          LLCP_TRACE_WARNING2(
+          LOG(WARNING) << StringPrintf(
               "Logical link (SAP=0x%X) congestion start: count=%d", sap,
               p_app_cb->ui_xmit_q.count);
 
@@ -654,7 +657,7 @@
           (llcp_cb.dlcb[idx].is_tx_congested == false)) {
         llcp_cb.dlcb[idx].is_tx_congested = true;
 
-        LLCP_TRACE_WARNING3(
+        LOG(WARNING) << StringPrintf(
             "Data link (SSAP:DSAP=0x%X:0x%X) congestion start: count=%d",
             llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap,
             llcp_cb.dlcb[idx].i_xmit_q.count);
@@ -690,7 +693,7 @@
       /* overall congestion is cleared */
       llcp_cb.overall_tx_congested = false;
 
-      LLCP_TRACE_WARNING2(
+      LOG(WARNING) << StringPrintf(
           "overall tx congestion end: total_tx_ui_pdu=%d, total_tx_i_pdu=%d",
           llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu);
     } else {
@@ -726,8 +729,9 @@
           /* if it was congested but now tx queue count is below threshold */
           p_app_cb->is_ui_tx_congested = false;
 
-          LLCP_TRACE_DEBUG2("Logical link (SAP=0x%X) congestion end: count=%d",
-                            sap, p_app_cb->ui_xmit_q.count);
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "Logical link (SAP=0x%X) congestion end: count=%d", sap,
+              p_app_cb->ui_xmit_q.count);
 
           data.congest.local_sap = sap;
           p_app_cb->p_app_cback(&data);
@@ -771,7 +775,7 @@
       llcp_cb.dlcb[idx].is_tx_congested = false;
 
       if (llcp_cb.dlcb[idx].remote_busy == false) {
-        LLCP_TRACE_DEBUG3(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Data link (SSAP:DSAP=0x%X:0x%X) congestion end: count=%d",
             llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap,
             llcp_cb.dlcb[idx].i_xmit_q.count);
@@ -876,8 +880,8 @@
   if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT ||
       (appl_dta_mode_flag &&
        llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING)) {
-    LLCP_TRACE_DEBUG0(
-        "llcp_link_check_send_data () in state of "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "in state of "
         "LLCP_LINK_SYMM_LOCAL_XMIT_NEXT");
 
     p_pdu = llcp_link_build_next_pdu(NULL);
@@ -974,9 +978,8 @@
   /* if application is registered and expecting UI PDU on logical data link */
   if ((p_app_cb) && (p_app_cb->p_app_cback) &&
       (p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)) {
-    LLCP_TRACE_DEBUG2(
-        "llcp_link_proc_ui_pdu () Local SAP:0x%x, Remote SAP:0x%x", local_sap,
-        remote_sap);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
 
     /* if this is not from AGF PDU */
     if (p_msg) {
@@ -1039,7 +1042,7 @@
           p_msg->len = LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
           p_msg->layer_specific = 0;
         } else {
-          LLCP_TRACE_ERROR0("llcp_link_proc_ui_pdu (): out of buffer");
+          LOG(ERROR) << StringPrintf("out of buffer");
         }
       }
 
@@ -1051,8 +1054,8 @@
     }
 
     if (p_app_cb->ui_rx_q.count > llcp_cb.ll_rx_congest_start) {
-      LLCP_TRACE_WARNING2(
-          "llcp_link_proc_ui_pdu (): SAP:0x%x, rx link is congested (%d), "
+      LOG(WARNING) << StringPrintf(
+          "SAP:0x%x, rx link is congested (%d), "
           "discard oldest UI PDU",
           local_sap, p_app_cb->ui_rx_q.count);
 
@@ -1068,8 +1071,7 @@
       (*p_app_cb->p_app_cback)(&data);
     }
   } else {
-    LLCP_TRACE_ERROR1("llcp_link_proc_ui_pdu (): Unregistered SAP:0x%x",
-                      local_sap);
+    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", local_sap);
 
     if (p_msg) {
       GKI_freebuf(p_msg);
@@ -1106,8 +1108,7 @@
     if (agf_length > LLCP_PDU_AGF_LEN_SIZE) {
       BE_STREAM_TO_UINT16(pdu_length, p);
       if (pdu_length < LLCP_PDU_HEADER_SIZE) {
-        LLCP_TRACE_ERROR0(
-            "llcp_link_proc_agf_pdu (): Received invalid encapsulated PDU");
+        LOG(ERROR) << StringPrintf("Received invalid encapsulated PDU");
         break;
       }
       agf_length -= LLCP_PDU_AGF_LEN_SIZE;
@@ -1126,7 +1127,7 @@
 
   if (agf_length != 0 || pdu_num < 2) {
     android_errorWriteLog(0x534e4554, "116791157");
-    LLCP_TRACE_ERROR0("llcp_link_proc_agf_pdu (): Received invalid AGF PDU");
+    LOG(ERROR) << StringPrintf("Received invalid AGF PDU");
     GKI_freebuf(p_agf);
     return;
   }
@@ -1151,12 +1152,10 @@
     ptype = (uint8_t)(LLCP_GET_PTYPE(pdu_hdr));
     ssap = LLCP_GET_SSAP(pdu_hdr);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-    LLCP_TRACE_DEBUG4(
-        "llcp_link_proc_agf_pdu (): Rx DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Rx DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x "
         "in AGF",
-        dsap, llcp_pdu_type(ptype), ptype, ssap);
-#endif
+        dsap, llcp_pdu_type(ptype).c_str(), ptype, ssap);
 
     if ((ptype == LLCP_PDU_DISC_TYPE) && (dsap == LLCP_SAP_LM) &&
         (ssap == LLCP_SAP_LM)) {
@@ -1164,14 +1163,11 @@
       llcp_link_deactivate(LLCP_LINK_REMOTE_INITIATED);
       return;
     } else if (ptype == LLCP_PDU_AGF_TYPE) {
-      LLCP_TRACE_ERROR0(
-          "llcp_link_proc_agf_pdu (): AGF PDU shall not be in AGF");
+      LOG(ERROR) << StringPrintf("AGF PDU shall not be in AGF");
     } else if (ptype == LLCP_PDU_SYMM_TYPE) {
-      LLCP_TRACE_ERROR0(
-          "llcp_link_proc_agf_pdu (): SYMM PDU exchange shall not be in AGF");
+      LOG(ERROR) << StringPrintf("SYMM PDU exchange shall not be in AGF");
     } else if (ptype == LLCP_PDU_PAX_TYPE) {
-      LLCP_TRACE_ERROR0(
-          "llcp_link_proc_agf_pdu (): PAX PDU exchange shall not be used");
+      LOG(ERROR) << StringPrintf("PAX PDU exchange shall not be used");
     } else if (ptype == LLCP_PDU_SNL_TYPE) {
       llcp_sdp_proc_snl((uint16_t)(pdu_length - LLCP_PDU_HEADER_SIZE), p_info);
     } else if ((ptype == LLCP_PDU_UI_TYPE) &&
@@ -1209,8 +1205,7 @@
 
   switch (ptype) {
     case LLCP_PDU_PAX_TYPE:
-      LLCP_TRACE_ERROR0(
-          "llcp_link_proc_rx_pdu (); PAX PDU exchange shall not be used");
+      LOG(ERROR) << StringPrintf("; PAX PDU exchange shall not be used");
       break;
 
     case LLCP_PDU_DISC_TYPE:
@@ -1289,7 +1284,8 @@
         llcp_link_process_link_timeout();
     } else {
       if (p_msg->len < LLCP_PDU_HEADER_SIZE) {
-        LLCP_TRACE_ERROR1("Received too small PDU: got %d bytes", p_msg->len);
+        LOG(ERROR) << StringPrintf("Received too small PDU: got %d bytes",
+                                   p_msg->len);
         frame_error = true;
       } else {
         p = (uint8_t*)(p_msg + 1) + p_msg->offset;
@@ -1306,7 +1302,8 @@
             info_length =
                 p_msg->len - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE;
           } else {
-            LLCP_TRACE_ERROR0("Received I/RR/RNR PDU without sequence");
+            LOG(ERROR) << StringPrintf(
+                "Received I/RR/RNR PDU without sequence");
             frame_error = true;
           }
         } else {
@@ -1315,22 +1312,21 @@
 
         /* check if length of information is bigger than link MIU */
         if ((!frame_error) && (info_length > llcp_cb.lcb.local_link_miu)) {
-          LLCP_TRACE_ERROR2("Received exceeding MIU (%d): got %d bytes SDU",
-                            llcp_cb.lcb.local_link_miu, info_length);
+          LOG(ERROR) << StringPrintf(
+              "Received exceeding MIU (%d): got %d bytes SDU",
+              llcp_cb.lcb.local_link_miu, info_length);
 
           frame_error = true;
         } else {
-#if (BT_TRACE_VERBOSE == TRUE)
-          LLCP_TRACE_DEBUG4(
-              "llcp_link_proc_rx_data (): DSAP:0x%x, PTYPE:%s (0x%x), "
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "DSAP:0x%x, PTYPE:%s (0x%x), "
               "SSAP:0x%x",
-              dsap, llcp_pdu_type(ptype), ptype, ssap);
-#endif
+              dsap, llcp_pdu_type(ptype).c_str(), ptype, ssap);
 
           if (ptype == LLCP_PDU_SYMM_TYPE) {
             if (info_length > 0) {
-              LLCP_TRACE_ERROR1("Received extra data (%d bytes) in SYMM PDU",
-                                info_length);
+              LOG(ERROR) << StringPrintf(
+                  "Received extra data (%d bytes) in SYMM PDU", info_length);
               frame_error = true;
             }
           } else {
@@ -1349,7 +1345,7 @@
       llcp_link_check_send_data();
     }
   } else {
-    LLCP_TRACE_ERROR0("Received PDU in state of SYMM_MUST_XMIT_NEXT");
+    LOG(ERROR) << StringPrintf("Received PDU in state of SYMM_MUST_XMIT_NEXT");
   }
 
   if (free_buffer) GKI_freebuf(p_msg);
@@ -1485,7 +1481,7 @@
   uint8_t *p, ptype;
   uint16_t next_pdu_length, pdu_hdr;
 
-  LLCP_TRACE_DEBUG0("llcp_link_build_next_pdu ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* add any pending SNL PDU into sig_xmit_q for transmitting */
   llcp_sdp_check_send_snl();
@@ -1536,7 +1532,7 @@
           GKI_freebuf(p_msg);
           p_msg = p_agf;
         } else {
-          LLCP_TRACE_ERROR0("llcp_link_build_next_pdu (): Out of buffer");
+          LOG(ERROR) << StringPrintf("Out of buffer");
           return p_msg;
         }
       } else {
@@ -1583,9 +1579,7 @@
 **
 *******************************************************************************/
 static void llcp_link_send_to_lower(NFC_HDR* p_pdu) {
-#if (BT_TRACE_PROTOCOL == TRUE)
   DispLLCP(p_pdu, false);
-#endif
 
   llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT;
 
@@ -1601,12 +1595,10 @@
 ** Returns          void
 **
 *******************************************************************************/
-void llcp_link_connection_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                                tNFC_CONN* p_data) {
+void llcp_link_connection_cback(__attribute__((unused)) uint8_t conn_id,
+                                tNFC_CONN_EVT event, tNFC_CONN* p_data) {
   if (event == NFC_DATA_CEVT) {
-#if (BT_TRACE_PROTOCOL == TRUE)
     DispLLCP((NFC_HDR*)p_data->data.p_data, true);
-#endif
     if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED) {
       /* respoding SYMM while LLCP is deactivated but RF link is not deactivated
        * yet */
@@ -1656,7 +1648,6 @@
   */
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         llcp_pdu_type
@@ -1666,7 +1657,7 @@
 ** Returns          string of PDU type
 **
 *******************************************************************************/
-static char* llcp_pdu_type(uint8_t ptype) {
+static std::string llcp_pdu_type(uint8_t ptype) {
   switch (ptype) {
     case LLCP_PDU_SYMM_TYPE:
       return "SYMM";
@@ -1694,10 +1685,7 @@
       return "RR";
     case LLCP_PDU_RNR_TYPE:
       return "RNR";
-
     default:
       return "RESERVED";
   }
 }
-
-#endif
diff --git a/src/nfc/llcp/llcp_main.c b/src/nfc/llcp/llcp_main.cc
similarity index 83%
rename from src/nfc/llcp/llcp_main.c
rename to src/nfc/llcp/llcp_main.cc
index 577777c..1185e01 100644
--- a/src/nfc/llcp/llcp_main.c
+++ b/src/nfc/llcp/llcp_main.cc
@@ -23,13 +23,19 @@
  ******************************************************************************/
 
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "bt_types.h"
 #include "gki.h"
 #include "llcp_api.h"
-#include "llcp_defs.h"
 #include "llcp_int.h"
 #include "nfc_int.h"
-#include "nfc_target.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 tLLCP_CB llcp_cb;
 
@@ -48,9 +54,7 @@
 
   memset(&llcp_cb, 0, sizeof(tLLCP_CB));
 
-  llcp_cb.trace_level = LLCP_INITIAL_TRACE_LEVEL;
-
-  LLCP_TRACE_DEBUG0("LLCP - llcp_init ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   llcp_cb.lcb.local_link_miu =
       (LLCP_MIU <= LLCP_MAX_MIU ? LLCP_MIU : LLCP_MAX_MIU);
@@ -82,7 +86,7 @@
   llcp_cb.max_num_ll_rx_buff =
       (uint8_t)((llcp_cb.num_rx_buff * LLCP_LL_RX_BUFF_LIMIT) / 100);
 
-  LLCP_TRACE_DEBUG4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "num_rx_buff = %d, rx_congest_start = %d, rx_congest_end = %d, "
       "max_num_ll_rx_buff = %d",
       llcp_cb.num_rx_buff, llcp_cb.overall_rx_congest_start,
@@ -95,8 +99,9 @@
   llcp_cb.max_num_ll_tx_buff =
       (uint8_t)((llcp_cb.max_num_tx_buff * LLCP_LL_TX_BUFF_LIMIT) / 100);
 
-  LLCP_TRACE_DEBUG2("max_num_tx_buff = %d, max_num_ll_tx_buff = %d",
-                    llcp_cb.max_num_tx_buff, llcp_cb.max_num_ll_tx_buff);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("max_num_tx_buff = %d, max_num_ll_tx_buff = %d",
+                      llcp_cb.max_num_tx_buff, llcp_cb.max_num_ll_tx_buff);
 
   llcp_cb.ll_tx_uncongest_ntf_start_sap = LLCP_SAP_SDP + 1;
 
@@ -117,7 +122,7 @@
   uint8_t sap;
   tLLCP_APP_CB* p_app_cb;
 
-  LLCP_TRACE_DEBUG0("LLCP - llcp_cleanup ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   for (sap = LLCP_SAP_SDP; sap < LLCP_NUM_SAPS; sap++) {
     p_app_cb = llcp_util_get_app_cb(sap);
@@ -143,7 +148,8 @@
 void llcp_process_timeout(TIMER_LIST_ENT* p_tle) {
   uint8_t reason;
 
-  LLCP_TRACE_DEBUG1("llcp_process_timeout: event=%d", p_tle->event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("llcp_process_timeout: event=%d", p_tle->event);
 
   switch (p_tle->event) {
     case NFC_TTYPE_LLCP_LINK_MANAGER:
@@ -170,19 +176,3 @@
       break;
   }
 }
-
-/*******************************************************************************
-**
-** Function         LLCP_SetTraceLevel
-**
-** Description      This function sets the trace level for LLCP.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t LLCP_SetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) llcp_cb.trace_level = new_level;
-
-  return (llcp_cb.trace_level);
-}
diff --git a/src/nfc/llcp/llcp_sdp.c b/src/nfc/llcp/llcp_sdp.cc
similarity index 89%
rename from src/nfc/llcp/llcp_sdp.c
rename to src/nfc/llcp/llcp_sdp.cc
index 2c40263..affa4ff 100644
--- a/src/nfc/llcp/llcp_sdp.c
+++ b/src/nfc/llcp/llcp_sdp.cc
@@ -23,13 +23,19 @@
  ******************************************************************************/
 
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "bt_types.h"
 #include "gki.h"
 #include "llcp_api.h"
-#include "llcp_defs.h"
 #include "llcp_int.h"
 #include "nfa_dm_int.h"
-#include "nfc_target.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -41,7 +47,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void llcp_sdp_proc_data(tLLCP_SAP_CBACK_DATA* p_data) {
+void llcp_sdp_proc_data(__attribute__((unused)) tLLCP_SAP_CBACK_DATA* p_data) {
   /*
   ** Do nothing
   ** llcp_sdp_proc_SNL () is called by link layer
@@ -63,7 +69,7 @@
   uint8_t* p;
 
   if (llcp_cb.sdp_cb.p_snl) {
-    LLCP_TRACE_DEBUG0("SDP: llcp_sdp_check_send_snl ()");
+    DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
     llcp_cb.sdp_cb.p_snl->len += LLCP_PDU_HEADER_SIZE;
     llcp_cb.sdp_cb.p_snl->offset -= LLCP_PDU_HEADER_SIZE;
@@ -124,8 +130,8 @@
   uint16_t name_len;
   uint16_t available_bytes;
 
-  LLCP_TRACE_DEBUG2("llcp_sdp_send_sdreq (): tid=0x%x, ServiceName=%s", tid,
-                    p_name);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tid=0x%x, ServiceName=%s", tid, p_name);
 
   /* if there is no pending SNL */
   if (!llcp_cb.sdp_cb.p_snl) {
@@ -219,7 +225,8 @@
   tLLCP_STATUS status;
   uint16_t available_bytes;
 
-  LLCP_TRACE_DEBUG2("llcp_sdp_send_sdres (): tid=0x%x, SAP=0x%x", tid, sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tid=0x%x, SAP=0x%x", tid, sap);
 
   /* if there is no pending SNL */
   if (!llcp_cb.sdp_cb.p_snl) {
@@ -318,7 +325,8 @@
 static void llcp_sdp_return_sap(uint8_t tid, uint8_t sap) {
   uint8_t i;
 
-  LLCP_TRACE_DEBUG2("llcp_sdp_return_sap (): tid=0x%x, SAP=0x%x", tid, sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("tid=0x%x, SAP=0x%x", tid, sap);
 
   for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++) {
     if ((llcp_cb.sdp_cb.transac[i].p_cback) &&
@@ -344,7 +352,7 @@
 void llcp_sdp_proc_deactivation(void) {
   uint8_t i;
 
-  LLCP_TRACE_DEBUG0("llcp_sdp_proc_deactivation ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++) {
     if (llcp_cb.sdp_cb.transac[i].p_cback) {
@@ -377,13 +385,13 @@
 tLLCP_STATUS llcp_sdp_proc_snl(uint16_t sdu_length, uint8_t* p) {
   uint8_t type, length, tid, sap, *p_value;
 
-  LLCP_TRACE_DEBUG0("llcp_sdp_proc_snl ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((llcp_cb.lcb.agreed_major_version < LLCP_MIN_SNL_MAJOR_VERSION) ||
       ((llcp_cb.lcb.agreed_major_version == LLCP_MIN_SNL_MAJOR_VERSION) &&
        (llcp_cb.lcb.agreed_minor_version < LLCP_MIN_SNL_MINOR_VERSION))) {
-    LLCP_TRACE_DEBUG0(
-        "llcp_sdp_proc_snl(): version number less than 1.1, SNL not "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "version number less than 1.1, SNL not "
         "supported.");
     return LLCP_STATUS_FAIL;
   }
@@ -406,10 +414,11 @@
            * SNL PDU i'e with improper service name "urn:nfc:sn:dta-co-echo-in",
            * the IUT should not send any PDU except SYMM PDU */
           if (appl_dta_mode_flag == 1 && sap == 0x00) {
-            LLCP_TRACE_DEBUG2("%s: In dta mode sap == 0x00 p_value = %s",
-                              __func__, p_value);
+            DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+                "%s: In dta mode sap == 0x00 p_value = %s", __func__, p_value);
             if ((length - 1) == strlen((const char*)p_value)) {
-              LLCP_TRACE_DEBUG1("%s: Strings are not equal", __func__);
+              DLOG_IF(INFO, nfc_debug_enabled)
+                  << StringPrintf("%s: Strings are not equal", __func__);
               llcp_sdp_send_sdres(tid, sap);
             }
           } else {
@@ -419,14 +428,14 @@
           /*For P2P in LLCP mode TC_CTO_TAR_BI_03_x(x=3) fix*/
           if (appl_dta_mode_flag == 1 &&
               ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_LLCP_MODE)) {
-            LLCP_TRACE_ERROR1("%s: Calling llcp_sdp_send_sdres", __func__);
+            LOG(ERROR) << StringPrintf("%s: Calling llcp_sdp_send_sdres",
+                                       __func__);
             tid = 0x01;
             sap = 0x00;
             llcp_sdp_send_sdres(tid, sap);
           }
-          LLCP_TRACE_ERROR1(
-              "llcp_sdp_proc_snl (): bad length (%d) in LLCP_SDREQ_TYPE",
-              length);
+          LOG(ERROR) << StringPrintf("bad length (%d) in LLCP_SDREQ_TYPE",
+                                     length);
         }
         break;
 
@@ -439,15 +448,13 @@
           BE_STREAM_TO_UINT8(sap, p_value);
           llcp_sdp_return_sap(tid, sap);
         } else {
-          LLCP_TRACE_ERROR1(
-              "llcp_sdp_proc_snl (): bad length (%d) in LLCP_SDRES_TYPE",
-              length);
+          LOG(ERROR) << StringPrintf("bad length (%d) in LLCP_SDRES_TYPE",
+                                     length);
         }
         break;
 
       default:
-        LLCP_TRACE_WARNING1(
-            "llcp_sdp_proc_snl (): Unknown type (0x%x) is ignored", type);
+        LOG(WARNING) << StringPrintf("Unknown type (0x%x) is ignored", type);
         break;
     }
 
@@ -461,7 +468,7 @@
   }
 
   if (sdu_length) {
-    LLCP_TRACE_ERROR0("llcp_sdp_proc_snl (): Bad format of SNL");
+    LOG(ERROR) << StringPrintf("Bad format of SNL");
     return LLCP_STATUS_FAIL;
   } else {
     return LLCP_STATUS_SUCCESS;
diff --git a/src/nfc/llcp/llcp_util.c b/src/nfc/llcp/llcp_util.cc
similarity index 86%
rename from src/nfc/llcp/llcp_util.c
rename to src/nfc/llcp/llcp_util.cc
index 3b984e3..7c5d851 100644
--- a/src/nfc/llcp/llcp_util.c
+++ b/src/nfc/llcp/llcp_util.cc
@@ -22,16 +22,21 @@
  *
  ******************************************************************************/
 
-#include <log/log.h>
 #include <string.h>
 
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <log/log.h>
+
 #include "bt_types.h"
 #include "gki.h"
 #include "llcp_defs.h"
 #include "llcp_int.h"
 #include "nfc_int.h"
-#include "nfc_target.h"
-#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -50,7 +55,7 @@
     BE_STREAM_TO_UINT8(param_len, p);
     if (length < param_len + 2) {
       android_errorWriteLog(0x534e4554, "114238578");
-      LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+      LOG(ERROR) << StringPrintf("Bad TLV's");
       return false;
     }
     length -= param_len + 2;
@@ -59,60 +64,63 @@
       case LLCP_VERSION_TYPE:
         if (param_len != LLCP_VERSION_LEN) {
           android_errorWriteLog(0x534e4554, "114238578");
-          LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return false;
         }
         BE_STREAM_TO_UINT8(llcp_cb.lcb.peer_version, p);
-        LLCP_TRACE_DEBUG1("Peer Version - 0x%02X", llcp_cb.lcb.peer_version);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Peer Version - 0x%02X", llcp_cb.lcb.peer_version);
         break;
 
       case LLCP_MIUX_TYPE:
         if (param_len != LLCP_MIUX_LEN) {
           android_errorWriteLog(0x534e4554, "114238578");
-          LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return false;
         }
         BE_STREAM_TO_UINT16(llcp_cb.lcb.peer_miu, p);
         llcp_cb.lcb.peer_miu &= LLCP_MIUX_MASK;
         llcp_cb.lcb.peer_miu += LLCP_DEFAULT_MIU;
-        LLCP_TRACE_DEBUG1("Peer MIU - %d bytes", llcp_cb.lcb.peer_miu);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Peer MIU - %d bytes", llcp_cb.lcb.peer_miu);
         break;
 
       case LLCP_WKS_TYPE:
         if (param_len != LLCP_WKS_LEN) {
           android_errorWriteLog(0x534e4554, "114238578");
-          LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return false;
         }
         BE_STREAM_TO_UINT16(llcp_cb.lcb.peer_wks, p);
-        LLCP_TRACE_DEBUG1("Peer WKS - 0x%04X", llcp_cb.lcb.peer_wks);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Peer WKS - 0x%04X", llcp_cb.lcb.peer_wks);
         break;
 
       case LLCP_LTO_TYPE:
         if (param_len != LLCP_LTO_LEN) {
           android_errorWriteLog(0x534e4554, "114238578");
-          LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return false;
         }
         BE_STREAM_TO_UINT8(llcp_cb.lcb.peer_lto, p);
         llcp_cb.lcb.peer_lto *= LLCP_LTO_UNIT; /* 10ms unit */
-        LLCP_TRACE_DEBUG1("Peer LTO - %d ms", llcp_cb.lcb.peer_lto);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Peer LTO - %d ms", llcp_cb.lcb.peer_lto);
         break;
 
       case LLCP_OPT_TYPE:
         if (param_len != LLCP_OPT_LEN) {
           android_errorWriteLog(0x534e4554, "114238578");
-          LLCP_TRACE_ERROR0("llcp_util_parse_link_params (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return false;
         }
         BE_STREAM_TO_UINT8(llcp_cb.lcb.peer_opt, p);
-        LLCP_TRACE_DEBUG1("Peer OPT - 0x%02X", llcp_cb.lcb.peer_opt);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Peer OPT - 0x%02X", llcp_cb.lcb.peer_opt);
         break;
 
       default:
-        LLCP_TRACE_ERROR1(
-            "llcp_util_parse_link_params (): Unexpected type 0x%x", param_type);
-        BE_STREAM_TO_UINT8(param_len, p);
+        LOG(ERROR) << StringPrintf("Unexpected type 0x%x", param_type);
         p += param_len;
         break;
     }
@@ -155,7 +163,7 @@
     llcp_cb.ll_tx_congest_end = 0;
   }
 
-  LLCP_TRACE_DEBUG4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "num_logical_data_link=%d, ll_tx_congest_start=%d, ll_tx_congest_end=%d, "
       "ll_rx_congest_start=%d",
       llcp_cb.num_logical_data_link, llcp_cb.ll_tx_congest_start,
@@ -193,9 +201,9 @@
           llcp_cb.dlcb[idx].rx_congest_threshold = LLCP_DL_MIN_RX_CONGEST;
         }
 
-        LLCP_TRACE_DEBUG3("DLC[%d], local_rw=%d, rx_congest_threshold=%d", idx,
-                          llcp_cb.dlcb[idx].local_rw,
-                          llcp_cb.dlcb[idx].rx_congest_threshold);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "DLC[%d], local_rw=%d, rx_congest_threshold=%d", idx,
+            llcp_cb.dlcb[idx].local_rw, llcp_cb.dlcb[idx].rx_congest_threshold);
       }
     }
   }
@@ -217,8 +225,8 @@
     /* check if rx congestion clear */
     if (llcp_cb.total_rx_ui_pdu + llcp_cb.total_rx_i_pdu <=
         llcp_cb.overall_rx_congest_end) {
-      LLCP_TRACE_DEBUG3(
-          "llcp_util_check_rx_congested_status (): rx link is uncongested, "
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "rx link is uncongested, "
           "%d+%d <= %d",
           llcp_cb.total_rx_ui_pdu, llcp_cb.total_rx_i_pdu,
           llcp_cb.overall_rx_congest_end);
@@ -237,8 +245,8 @@
     /* check if rx link is congested */
     if (llcp_cb.total_rx_ui_pdu + llcp_cb.total_rx_i_pdu >=
         llcp_cb.overall_rx_congest_start) {
-      LLCP_TRACE_WARNING3(
-          "llcp_util_check_rx_congested_status (): rx link is congested, %d+%d "
+      LOG(WARNING) << StringPrintf(
+          "rx link is congested, %d+%d "
           ">= %d",
           llcp_cb.total_rx_ui_pdu, llcp_cb.total_rx_i_pdu,
           llcp_cb.overall_rx_congest_start);
@@ -290,8 +298,9 @@
     /* or notify uncongestion later */
     p_app_cb->is_ui_tx_congested = true;
 
-    LLCP_TRACE_WARNING2("Logical link (SAP=0x%X) congested: ui_xmit_q.count=%d",
-                        ssap, p_app_cb->ui_xmit_q.count);
+    LOG(WARNING) << StringPrintf(
+        "Logical link (SAP=0x%X) congested: ui_xmit_q.count=%d", ssap,
+        p_app_cb->ui_xmit_q.count);
 
     status = LLCP_STATUS_CONGESTED;
   }
@@ -339,9 +348,8 @@
   tLLCP_DLCB* p_dlcb = NULL;
   int idx;
 
-  LLCP_TRACE_DEBUG2(
-      "llcp_util_allocate_data_link (): reg_sap = 0x%x, remote_sap = 0x%x",
-      reg_sap, remote_sap);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("reg_sap = 0x%x, remote_sap = 0x%x", reg_sap, remote_sap);
 
   for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++) {
     if (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_IDLE) {
@@ -353,7 +361,7 @@
   }
 
   if (!p_dlcb) {
-    LLCP_TRACE_ERROR0("llcp_util_allocate_data_link (): Out of DLCB");
+    LOG(ERROR) << StringPrintf("Out of DLCB");
   } else {
     p_dlcb->p_app_cb = llcp_util_get_app_cb(reg_sap);
     p_dlcb->local_sap = reg_sap;
@@ -363,8 +371,8 @@
     /* this is for inactivity timer and congestion control. */
     llcp_cb.num_data_link_connection++;
 
-    LLCP_TRACE_DEBUG3(
-        "llcp_util_allocate_data_link (): local_sap = 0x%x, remote_sap = 0x%x, "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "local_sap = 0x%x, remote_sap = 0x%x, "
         "num_data_link_connection = %d",
         p_dlcb->local_sap, p_dlcb->remote_sap,
         llcp_cb.num_data_link_connection);
@@ -383,8 +391,8 @@
 ******************************************************************************/
 void llcp_util_deallocate_data_link(tLLCP_DLCB* p_dlcb) {
   if (p_dlcb) {
-    LLCP_TRACE_DEBUG1("llcp_util_deallocate_data_link (): local_sap = 0x%x",
-                      p_dlcb->local_sap);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("local_sap = 0x%x", p_dlcb->local_sap);
 
     if (p_dlcb->state != LLCP_DLC_STATE_IDLE) {
       nfc_stop_quick_timer(&p_dlcb->timer);
@@ -396,9 +404,8 @@
         llcp_cb.num_data_link_connection--;
       }
 
-      LLCP_TRACE_DEBUG1(
-          "llcp_util_deallocate_data_link (): num_data_link_connection = %d",
-          llcp_cb.num_data_link_connection);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "num_data_link_connection = %d", llcp_cb.num_data_link_connection);
     }
   }
 }
@@ -492,7 +499,7 @@
     /* check remaining lengh */
     if (length < param_len + 2) {
       android_errorWriteLog(0x534e4554, "111660010");
-      LLCP_TRACE_ERROR0("llcp_util_parse_connect (): Bad TLV's");
+      LOG(ERROR) << StringPrintf("Bad TLV's");
       return LLCP_STATUS_FAIL;
     }
     length -= param_len + 2;
@@ -501,28 +508,28 @@
       case LLCP_MIUX_TYPE:
         if (param_len != LLCP_MIUX_LEN) {
           android_errorWriteLog(0x534e4554, "111660010");
-          LLCP_TRACE_ERROR0("llcp_util_parse_connect (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return LLCP_STATUS_FAIL;
         }
         BE_STREAM_TO_UINT16(p_params->miu, p);
         p_params->miu &= LLCP_MIUX_MASK;
         p_params->miu += LLCP_DEFAULT_MIU;
 
-        LLCP_TRACE_DEBUG1("llcp_util_parse_connect (): LLCP_MIUX_TYPE:%d",
-                          p_params->miu);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("LLCP_MIUX_TYPE:%d", p_params->miu);
         break;
 
       case LLCP_RW_TYPE:
         if (param_len != LLCP_RW_LEN) {
           android_errorWriteLog(0x534e4554, "111660010");
-          LLCP_TRACE_ERROR0("llcp_util_parse_connect (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return LLCP_STATUS_FAIL;
         }
         BE_STREAM_TO_UINT8(p_params->rw, p);
         p_params->rw &= 0x0F;
 
-        LLCP_TRACE_DEBUG1("llcp_util_parse_connect (): LLCP_RW_TYPE:%d",
-                          p_params->rw);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("LLCP_RW_TYPE:%d", p_params->rw);
         break;
 
       case LLCP_SN_TYPE:
@@ -538,14 +545,12 @@
         }
         p += param_len;
 
-        LLCP_TRACE_DEBUG1("llcp_util_parse_connect (): LLCP_SN_TYPE:<%s>",
-                          p_params->sn);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("LLCP_SN_TYPE:<%s>", p_params->sn);
         break;
 
       default:
-        LLCP_TRACE_ERROR1("llcp_util_parse_connect (): Unexpected type 0x%x",
-                          param_type);
-        BE_STREAM_TO_UINT8(param_len, p);
+        LOG(ERROR) << StringPrintf("Unexpected type 0x%x", param_type);
         p += param_len;
         break;
     }
@@ -630,7 +635,7 @@
     BE_STREAM_TO_UINT8(param_len, p);
     if (length < param_len + 2) {
       android_errorWriteLog(0x534e4554, "114237888");
-      LLCP_TRACE_ERROR0("llcp_util_parse_cc (): Bad TLV's");
+      LOG(ERROR) << StringPrintf("Bad TLV's");
       return LLCP_STATUS_FAIL;
     }
     length -= param_len + 2;
@@ -639,32 +644,32 @@
       case LLCP_MIUX_TYPE:
         if (param_len != LLCP_MIUX_LEN) {
           android_errorWriteLog(0x534e4554, "114237888");
-          LLCP_TRACE_ERROR0("llcp_util_parse_cc (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return LLCP_STATUS_FAIL;
         }
         BE_STREAM_TO_UINT16((*p_miu), p);
         (*p_miu) &= LLCP_MIUX_MASK;
         (*p_miu) += LLCP_DEFAULT_MIU;
 
-        LLCP_TRACE_DEBUG1("llcp_util_parse_cc (): LLCP_MIUX_TYPE:%d", *p_miu);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("LLCP_MIUX_TYPE:%d", *p_miu);
         break;
 
       case LLCP_RW_TYPE:
         if (param_len != LLCP_RW_LEN) {
           android_errorWriteLog(0x534e4554, "114237888");
-          LLCP_TRACE_ERROR0("llcp_util_parse_cc (): Bad TLV's");
+          LOG(ERROR) << StringPrintf("Bad TLV's");
           return LLCP_STATUS_FAIL;
         }
         BE_STREAM_TO_UINT8((*p_rw), p);
         (*p_rw) &= 0x0F;
 
-        LLCP_TRACE_DEBUG1("llcp_util_parse_cc (): LLCP_RW_TYPE:%d", *p_rw);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("LLCP_RW_TYPE:%d", *p_rw);
         break;
 
       default:
-        LLCP_TRACE_ERROR1("llcp_util_parse_cc (): Unexpected type 0x%x",
-                          param_type);
-        BE_STREAM_TO_UINT8(param_len, p);
+        LOG(ERROR) << StringPrintf("Unexpected type 0x%x", param_type);
         p += param_len;
         break;
     }
@@ -769,7 +774,7 @@
 
     return LLCP_STATUS_SUCCESS;
   } else {
-    LLCP_TRACE_ERROR0("llcp_util_send_frmr (): Out of resource");
+    LOG(ERROR) << StringPrintf("Out of resource");
     return LLCP_STATUS_FAIL;
   }
 }
@@ -808,8 +813,8 @@
 
   if ((p_dlcb->local_busy) || (p_dlcb->is_rx_congested) ||
       (llcp_cb.overall_rx_congested)) {
-    LLCP_TRACE_DEBUG3(
-        "llcp_util_send_rr_rnr (): "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        ""
         "local_busy=%d,is_rx_congested=%d,overall_rx_congested=%d",
         p_dlcb->local_busy, p_dlcb->is_rx_congested,
         llcp_cb.overall_rx_congested);
@@ -842,16 +847,14 @@
 
     UINT8_TO_BE_STREAM(p, rcv_seq);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-    LLCP_TRACE_DEBUG5("LLCP TX - N(S,R):(NA,%d) V(S,SA,R,RA):(%d,%d,%d,%d)",
-                      p_dlcb->next_rx_seq, p_dlcb->next_tx_seq,
-                      p_dlcb->rcvd_ack_seq, p_dlcb->next_rx_seq,
-                      p_dlcb->sent_ack_seq);
-#endif
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "LLCP TX - N(S,R):(NA,%d) V(S,SA,R,RA):(%d,%d,%d,%d)",
+        p_dlcb->next_rx_seq, p_dlcb->next_tx_seq, p_dlcb->rcvd_ack_seq,
+        p_dlcb->next_rx_seq, p_dlcb->sent_ack_seq);
     GKI_enqueue(&llcp_cb.lcb.sig_xmit_q, p_msg);
     llcp_link_check_send_data();
   } else {
-    LLCP_TRACE_ERROR0("llcp_util_send_rr_rnr (): Out of resource");
+    LOG(ERROR) << StringPrintf("Out of resource");
   }
 }
 
diff --git a/src/nfc/nci/nci_hmsgs.c b/src/nfc/nci/nci_hmsgs.cc
similarity index 93%
rename from src/nfc/nci/nci_hmsgs.c
rename to src/nfc/nci/nci_hmsgs.cc
index aa4aa94..245b06a 100644
--- a/src/nfc/nci/nci_hmsgs.c
+++ b/src/nfc/nci/nci_hmsgs.cc
@@ -260,20 +260,22 @@
   NFC_HDR* p;
   uint8_t* pp;
 
-  p = NCI_GET_CMD_BUF(NCI_PARAM_SIZE_DISCOVER_NFCEE);
+  p = NCI_GET_CMD_BUF(NCI_PARAM_SIZE_DISCOVER_NFCEE(NFC_GetNCIVersion()));
   if (p == NULL) return (NCI_STATUS_FAILED);
 
   p->event = BT_EVT_TO_NFC_NCI;
-  p->len = NCI_MSG_HDR_SIZE + NCI_PARAM_SIZE_DISCOVER_NFCEE;
+  p->len =
+      NCI_MSG_HDR_SIZE + NCI_PARAM_SIZE_DISCOVER_NFCEE(NFC_GetNCIVersion());
   p->offset = NCI_MSG_OFFSET_SIZE;
   p->layer_specific = 0;
   pp = (uint8_t*)(p + 1) + p->offset;
 
   NCI_MSG_BLD_HDR0(pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
   NCI_MSG_BLD_HDR1(pp, NCI_MSG_NFCEE_DISCOVER);
-  UINT8_TO_STREAM(pp, NCI_PARAM_SIZE_DISCOVER_NFCEE);
-  UINT8_TO_STREAM(pp, discover_action);
-
+  UINT8_TO_STREAM(pp, NCI_PARAM_SIZE_DISCOVER_NFCEE(NFC_GetNCIVersion()));
+  if (NFC_GetNCIVersion() != NCI_VERSION_2_0) {
+    UINT8_TO_STREAM(pp, discover_action);
+  }
   nfc_ncif_send_cmd(p);
   return (NCI_STATUS_OK);
 }
@@ -579,6 +581,37 @@
   return (NCI_STATUS_OK);
 }
 
+/*******************************************************************************
+**
+** Function         nci_snd_nfcee_power_link_control
+**
+** Description      compose and send NFCEE Management NFCEE Power and Link
+**                  Control command to command queue
+**
+** Returns          status
+**
+*******************************************************************************/
+uint8_t nci_snd_nfcee_power_link_control(uint8_t nfcee_id, uint8_t pl_config) {
+  uint8_t* pp;
+  NFC_HDR* p = NCI_GET_CMD_BUF(NCI_CORE_PARAM_SIZE_NFCEE_PL_CTRL);
+  if (p == NULL) return NCI_STATUS_FAILED;
+
+  p->event = NFC_EVT_TO_NFC_NCI;
+  p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_NFCEE_PL_CTRL;
+  p->offset = NCI_MSG_OFFSET_SIZE;
+  p->layer_specific = 0;
+  pp = (uint8_t*)(p + 1) + p->offset;
+
+  NCI_MSG_BLD_HDR0(pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
+  NCI_MSG_BLD_HDR1(pp, NCI_MSG_NFCEE_POWER_LINK_CTRL);
+  UINT8_TO_STREAM(pp, NCI_CORE_PARAM_SIZE_NFCEE_PL_CTRL);
+  UINT8_TO_STREAM(pp, nfcee_id);
+  UINT8_TO_STREAM(pp, pl_config);
+
+  nfc_ncif_send_cmd(p);
+  return NCI_STATUS_OK;
+}
+
 #if (NFC_NFCEE_INCLUDED == TRUE)
 #if (NFC_RW_ONLY == FALSE)
 /*******************************************************************************
diff --git a/src/nfc/nci/nci_hrcv.c b/src/nfc/nci/nci_hrcv.cc
similarity index 77%
rename from src/nfc/nci/nci_hrcv.c
rename to src/nfc/nci/nci_hrcv.cc
index 07757de..e42d04c 100644
--- a/src/nfc/nci/nci_hrcv.c
+++ b/src/nfc/nci/nci_hrcv.cc
@@ -23,15 +23,23 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "gki.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
+#include "gki.h"
 #include "nci_defs.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
 #include "nfc_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*******************************************************************************
 **
 ** Function         nci_proc_core_rsp
@@ -51,7 +59,8 @@
   p = (uint8_t*)(p_msg + 1) + p_msg->offset;
   pp = p + 1;
   NCI_MSG_PRS_HDR1(pp, op_code);
-  NFC_TRACE_DEBUG1("nci_proc_core_rsp opcode:0x%x", op_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nci_proc_core_rsp opcode:0x%x", op_code);
   len = *pp++;
 
   /* process the message based on the opcode and message type */
@@ -84,7 +93,7 @@
       nfc_ncif_event_status(NFC_SET_POWER_SUB_STATE_REVT, *pp);
       break;
     default:
-      NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
       break;
   }
 
@@ -109,7 +118,8 @@
   p = (uint8_t*)(p_msg + 1) + p_msg->offset;
   pp = p + 1;
   NCI_MSG_PRS_HDR1(pp, op_code);
-  NFC_TRACE_DEBUG1("nci_proc_core_ntf opcode:0x%x", op_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nci_proc_core_ntf opcode:0x%x", op_code);
   len = *pp++;
 
   /* process the message based on the opcode and message type */
@@ -135,7 +145,7 @@
       break;
 
     default:
-      NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
       break;
   }
 }
@@ -206,7 +216,7 @@
       nfc_ncif_proc_isodep_nak_presence_check_status(*pp, false);
       break;
     default:
-      NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
       break;
   }
 }
@@ -280,7 +290,7 @@
       nfc_ncif_proc_isodep_nak_presence_check_status(*pp, true);
       break;
     default:
-      NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
       break;
   }
 }
@@ -301,10 +311,7 @@
   uint8_t* p;
   uint8_t *pp, len, op_code;
   tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback;
-  tNFC_NFCEE_DISCOVER_REVT nfcee_discover;
-  tNFC_NFCEE_INFO_REVT nfcee_info;
-  tNFC_NFCEE_MODE_SET_REVT mode_set;
-  tNFC_RESPONSE* p_evt = (tNFC_RESPONSE*)&nfcee_info;
+  tNFC_RESPONSE nfc_response;
   tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
   uint8_t* p_old = nfc_cb.last_cmd;
 
@@ -312,36 +319,47 @@
   p = (uint8_t*)(p_msg + 1) + p_msg->offset;
   pp = p + 1;
   NCI_MSG_PRS_HDR1(pp, op_code);
-  NFC_TRACE_DEBUG1("nci_proc_ee_management_rsp opcode:0x%x", op_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nci_proc_ee_management_rsp opcode:0x%x", op_code);
   len = *pp++;
 
   switch (op_code) {
     case NCI_MSG_NFCEE_DISCOVER:
-      p_evt = (tNFC_RESPONSE*)&nfcee_discover;
-      nfcee_discover.status = *pp++;
-      nfcee_discover.num_nfcee = *pp++;
+      nfc_response.nfcee_discover.status = *pp++;
+      nfc_response.nfcee_discover.num_nfcee = *pp++;
 
-      if (nfcee_discover.status != NFC_STATUS_OK) nfcee_discover.num_nfcee = 0;
+      if (nfc_response.nfcee_discover.status != NFC_STATUS_OK)
+        nfc_response.nfcee_discover.num_nfcee = 0;
 
       event = NFC_NFCEE_DISCOVER_REVT;
       break;
 
     case NCI_MSG_NFCEE_MODE_SET:
-      p_evt = (tNFC_RESPONSE*)&mode_set;
-      mode_set.status = *pp;
-      mode_set.nfcee_id = 0;
-      event = NFC_NFCEE_MODE_SET_REVT;
-      mode_set.nfcee_id = *p_old++;
-      mode_set.mode = *p_old++;
+      nfc_response.mode_set.status = *pp;
+      nfc_response.mode_set.nfcee_id = *p_old++;
+      nfc_response.mode_set.mode = *p_old++;
+      if (nfc_cb.nci_version != NCI_VERSION_2_0 || *pp != NCI_STATUS_OK) {
+        nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF;
+        event = NFC_NFCEE_MODE_SET_REVT;
+      } else {
+        /* else response reports OK status on notification */
+        return;
+      }
       break;
 
+    case NCI_MSG_NFCEE_POWER_LINK_CTRL:
+      nfc_response.pl_control.status = *pp;
+      nfc_response.pl_control.nfcee_id = *p_old++;
+      nfc_response.pl_control.pl_control = *p_old++;
+      event = NFC_NFCEE_PL_CONTROL_REVT;
+      break;
     default:
       p_cback = NULL;
-      NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+      LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
       break;
   }
 
-  if (p_cback) (*p_cback)(event, p_evt);
+  if (p_cback) (*p_cback)(event, &nfc_response);
 }
 
 /*******************************************************************************
@@ -357,63 +375,75 @@
   uint8_t* p;
   uint8_t *pp, len, op_code;
   tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback;
-  tNFC_NFCEE_INFO_REVT nfcee_info;
-  tNFC_RESPONSE* p_evt = (tNFC_RESPONSE*)&nfcee_info;
+  tNFC_RESPONSE nfc_response;
   tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
+  uint8_t* p_old = nfc_cb.last_cmd;
   uint8_t xx;
   uint8_t yy;
-  uint8_t ee_status;
   tNFC_NFCEE_TLV* p_tlv;
-
   /* find the start of the NCI message and parse the NCI header */
   p = (uint8_t*)(p_msg + 1) + p_msg->offset;
   pp = p + 1;
   NCI_MSG_PRS_HDR1(pp, op_code);
-  NFC_TRACE_DEBUG1("nci_proc_ee_management_ntf opcode:0x%x", op_code);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nci_proc_ee_management_ntf opcode:0x%x", op_code);
   len = *pp++;
 
   if (op_code == NCI_MSG_NFCEE_DISCOVER) {
-    nfcee_info.nfcee_id = *pp++;
-    ee_status = *pp++;
+    nfc_response.nfcee_info.nfcee_id = *pp++;
 
-    nfcee_info.ee_status = ee_status;
+    nfc_response.nfcee_info.ee_status = *pp++;
     yy = *pp;
-    nfcee_info.num_interface = *pp++;
+    nfc_response.nfcee_info.num_interface = *pp++;
     p = pp;
 
-    if (nfcee_info.num_interface > NFC_MAX_EE_INTERFACE)
-      nfcee_info.num_interface = NFC_MAX_EE_INTERFACE;
+    if (nfc_response.nfcee_info.num_interface > NFC_MAX_EE_INTERFACE)
+      nfc_response.nfcee_info.num_interface = NFC_MAX_EE_INTERFACE;
 
-    for (xx = 0; xx < nfcee_info.num_interface; xx++) {
-      nfcee_info.ee_interface[xx] = *pp++;
+    for (xx = 0; xx < nfc_response.nfcee_info.num_interface; xx++) {
+      nfc_response.nfcee_info.ee_interface[xx] = *pp++;
     }
 
     pp = p + yy;
-    nfcee_info.num_tlvs = *pp++;
-    NFC_TRACE_DEBUG4("nfcee_id: 0x%x num_interface:0x%x/0x%x, num_tlvs:0x%x",
-                     nfcee_info.nfcee_id, nfcee_info.num_interface, yy,
-                     nfcee_info.num_tlvs);
+    nfc_response.nfcee_info.num_tlvs = *pp++;
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "nfcee_id: 0x%x num_interface:0x%x/0x%x, num_tlvs:0x%x",
+        nfc_response.nfcee_info.nfcee_id, nfc_response.nfcee_info.num_interface,
+        yy, nfc_response.nfcee_info.num_tlvs);
 
-    if (nfcee_info.num_tlvs > NFC_MAX_EE_TLVS)
-      nfcee_info.num_tlvs = NFC_MAX_EE_TLVS;
+    if (nfc_response.nfcee_info.num_tlvs > NFC_MAX_EE_TLVS)
+      nfc_response.nfcee_info.num_tlvs = NFC_MAX_EE_TLVS;
 
-    p_tlv = &nfcee_info.ee_tlv[0];
+    p_tlv = &nfc_response.nfcee_info.ee_tlv[0];
 
-    for (xx = 0; xx < nfcee_info.num_tlvs; xx++, p_tlv++) {
+    for (xx = 0; xx < nfc_response.nfcee_info.num_tlvs; xx++, p_tlv++) {
       p_tlv->tag = *pp++;
       p_tlv->len = yy = *pp++;
-      NFC_TRACE_DEBUG2("tag:0x%x, len:0x%x", p_tlv->tag, p_tlv->len);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("tag:0x%x, len:0x%x", p_tlv->tag, p_tlv->len);
       if (p_tlv->len > NFC_MAX_EE_INFO) p_tlv->len = NFC_MAX_EE_INFO;
       p = pp;
       STREAM_TO_ARRAY(p_tlv->info, pp, p_tlv->len);
       pp = p += yy;
     }
+  } else if (op_code == NCI_MSG_NFCEE_MODE_SET) {
+    nfc_response.mode_set.status = *pp;
+    nfc_response.mode_set.nfcee_id = *p_old++;
+    nfc_response.mode_set.mode = *p_old++;
+    event = NFC_NFCEE_MODE_SET_REVT;
+    nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF;
+    nfc_stop_timer(&nfc_cb.nci_mode_set_ntf_timer);
+  } else if (op_code == NCI_MSG_NFCEE_STATUS) {
+    event = NFC_NFCEE_STATUS_REVT;
+    nfc_response.nfcee_status.status = NCI_STATUS_OK;
+    nfc_response.nfcee_status.nfcee_id = *pp++;
+    nfc_response.nfcee_status.nfcee_status = *pp;
   } else {
     p_cback = NULL;
-    NFC_TRACE_ERROR1("unknown opcode:0x%x", op_code);
+    LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code);
   }
 
-  if (p_cback) (*p_cback)(event, p_evt);
+  if (p_cback) (*p_cback)(event, &nfc_response);
 }
 
 #endif
diff --git a/src/nfc/ndef/ndef_utils.c b/src/nfc/ndef/ndef_utils.cc
similarity index 89%
rename from src/nfc/ndef/ndef_utils.c
rename to src/nfc/ndef/ndef_utils.cc
index 01663f0..993efd8 100644
--- a/src/nfc/ndef/ndef_utils.c
+++ b/src/nfc/ndef/ndef_utils.cc
@@ -39,9 +39,9 @@
 **
 *******************************************************************************/
 static void shiftdown(uint8_t* p_mem, uint32_t len, uint32_t shift_amount) {
-  register uint8_t* ps = p_mem + len - 1;
-  register uint8_t* pd = ps + shift_amount;
-  register uint32_t xx;
+  uint8_t* ps = p_mem + len - 1;
+  uint8_t* pd = ps + shift_amount;
+  uint32_t xx;
 
   for (xx = 0; xx < len; xx++) *pd-- = *ps--;
 }
@@ -54,9 +54,9 @@
 **
 *******************************************************************************/
 static void shiftup(uint8_t* p_dest, uint8_t* p_src, uint32_t len) {
-  register uint8_t* ps = p_src;
-  register uint8_t* pd = p_dest;
-  register uint32_t xx;
+  uint8_t* ps = p_src;
+  uint8_t* pd = p_dest;
+  uint32_t xx;
 
   for (xx = 0; xx < len; xx++) *pd++ = *ps++;
 }
@@ -883,143 +883,6 @@
 
 /*******************************************************************************
 **
-** Function         NDEF_MsgInsertRec
-**
-** Description      This function inserts a record at a specific index into the
-**                  given NDEF message
-**
-** Returns          OK, or error if the record did not fit
-**                  *p_cur_size is updated
-**
-*******************************************************************************/
-extern tNDEF_STATUS NDEF_MsgInsertRec(uint8_t* p_msg, uint32_t max_size,
-                                      uint32_t* p_cur_size, int32_t index,
-                                      uint8_t tnf, uint8_t* p_type,
-                                      uint8_t type_len, uint8_t* p_id,
-                                      uint8_t id_len, uint8_t* p_payload,
-                                      uint32_t payload_len) {
-  uint8_t* p_rec;
-  uint32_t recSize;
-  int32_t plen = (payload_len < 256) ? 1 : 4;
-  int32_t ilen = (id_len == 0) ? 0 : 1;
-
-  /* First, make sure the record will fit. we need at least 2 bytes for header
-   * and type length */
-  recSize = payload_len + 2 + type_len + plen + ilen + id_len;
-
-  if ((*p_cur_size + recSize) > max_size) return (NDEF_MSG_INSUFFICIENT_MEM);
-
-  /* See where the new record goes. If at the end, call the 'AddRec' function */
-  if ((index >= NDEF_MsgGetNumRecs(p_msg)) ||
-      ((p_rec = NDEF_MsgGetRecByIndex(p_msg, index)) == NULL)) {
-    return NDEF_MsgAddRec(p_msg, max_size, p_cur_size, tnf, p_type, type_len,
-                          p_id, id_len, p_payload, payload_len);
-  }
-
-  /* If we are inserting at the beginning, remove the MB bit from the current
-   * first */
-  if (index == 0) *p_msg &= ~NDEF_MB_MASK;
-
-  /* Make space for the new record */
-  shiftdown(p_rec, (uint32_t)(*p_cur_size - (p_rec - p_msg)), recSize);
-
-  /* If adding at the beginning, set begin bit */
-  if (index == 0)
-    *p_rec = tnf | NDEF_MB_MASK;
-  else
-    *p_rec = tnf;
-
-  if (plen == 1) *p_rec |= NDEF_SR_MASK;
-
-  if (ilen != 0) *p_rec |= NDEF_IL_MASK;
-
-  p_rec++;
-
-  /* The next byte is the type field length */
-  *p_rec++ = type_len;
-
-  /* Payload length - can be 1 or 4 bytes */
-  if (plen == 1)
-    *p_rec++ = (uint8_t)payload_len;
-  else
-    UINT32_TO_BE_STREAM(p_rec, payload_len);
-
-  /* ID field Length (optional) */
-  if (ilen != 0) *p_rec++ = id_len;
-
-  /* Next comes the type */
-  if (type_len) {
-    if (p_type) memcpy(p_rec, p_type, type_len);
-
-    p_rec += type_len;
-  }
-
-  /* Next comes the ID */
-  if (ilen != 0) {
-    if (p_id) memcpy(p_rec, p_id, id_len);
-
-    p_rec += id_len;
-  }
-
-  /* And lastly the payload. If NULL, the app just wants to reserve memory */
-  if (p_payload) memcpy(p_rec, p_payload, payload_len);
-
-  *p_cur_size += recSize;
-
-  return (NDEF_OK);
-}
-
-/*******************************************************************************
-**
-** Function         NDEF_MsgAppendRec
-**
-** Description      This function adds NDEF records to the end of an NDEF
-**                  message.
-**
-** Returns          OK, or error if the record did not fit
-**                  *p_cur_size is updated
-**
-*******************************************************************************/
-extern tNDEF_STATUS NDEF_MsgAppendRec(uint8_t* p_msg, uint32_t max_size,
-                                      uint32_t* p_cur_size, uint8_t* p_new_rec,
-                                      uint32_t new_rec_len) {
-  uint8_t* p_rec;
-  tNDEF_STATUS status;
-
-  /* First, validate new records */
-  status = NDEF_MsgValidate(p_new_rec, new_rec_len, false);
-  if (status != NDEF_OK) return (status);
-
-  /* First, make sure the record will fit */
-  if ((*p_cur_size + new_rec_len) > max_size)
-    return (NDEF_MSG_INSUFFICIENT_MEM);
-
-  /* Find where to copy new record */
-  if (*p_cur_size == 0)
-    p_rec = p_msg;
-  else {
-    /* Find the previous last and clear his 'Message End' bit */
-    uint8_t* pLast = NDEF_MsgGetLastRecInMsg(p_msg);
-
-    if (!pLast) return (NDEF_MSG_NO_MSG_END);
-
-    *pLast &= ~NDEF_ME_MASK;
-    p_rec = p_msg + *p_cur_size;
-
-    /* clear 'Message Begin' bit of new record */
-    *p_new_rec &= ~NDEF_MB_MASK;
-  }
-
-  /* append new records */
-  memcpy(p_rec, p_new_rec, new_rec_len);
-
-  *p_cur_size += new_rec_len;
-
-  return (NDEF_OK);
-}
-
-/*******************************************************************************
-**
 ** Function         NDEF_MsgAppendPayload
 **
 ** Description      This function appends extra payload to a specific record in
diff --git a/src/nfc/nfc/nfc_ee.c b/src/nfc/nfc/nfc_ee.cc
similarity index 63%
rename from src/nfc/nfc/nfc_ee.c
rename to src/nfc/nfc/nfc_ee.cc
index c2c4115..728cd55 100644
--- a/src/nfc/nfc/nfc_ee.c
+++ b/src/nfc/nfc/nfc_ee.cc
@@ -22,14 +22,19 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "gki.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "gki.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
 #include "nfc_int.h"
 
+using android::base::StringPrintf;
+
 /*******************************************************************************
 **
 ** Function         NFC_NfceeDiscover
@@ -67,12 +72,29 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_NfceeModeSet(uint8_t nfcee_id, tNFC_NFCEE_MODE mode) {
-  if (mode >= NCI_NUM_NFCEE_MODE) {
-    NFC_TRACE_ERROR1("NFC_NfceeModeSet bad mode:%d", mode);
+  tNFC_STATUS status = NCI_STATUS_OK;
+  if (mode >= NCI_NUM_NFCEE_MODE || nfcee_id == NCI_DH_ID) {
+    LOG(ERROR) << StringPrintf("%s invalid parameter:%d", __func__, mode);
     return NFC_STATUS_FAILED;
   }
-
-  return nci_snd_nfcee_mode_set(nfcee_id, mode);
+  if (nfc_cb.nci_version != NCI_VERSION_2_0)
+    status = nci_snd_nfcee_mode_set(nfcee_id, mode);
+  else {
+    if (nfc_cb.flags & NFC_FL_WAIT_MODE_SET_NTF)
+      status = NFC_STATUS_REFUSED;
+    else {
+      status = nci_snd_nfcee_mode_set(nfcee_id, mode);
+      if (status == NCI_STATUS_OK) {
+        /* Mode set command is successfully queued or sent.
+         * do not allow another Mode Set command until NTF is received */
+        nfc_cb.flags |= NFC_FL_WAIT_MODE_SET_NTF;
+        nfc_start_timer(&nfc_cb.nci_mode_set_ntf_timer,
+                        (uint16_t)(NFC_TTYPE_WAIT_MODE_SET_NTF),
+                        NFC_MODE_SET_NTF_TIMEOUT);
+      }
+    }
+  }
+  return status;
 }
 
 /*******************************************************************************
@@ -105,3 +127,30 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_GetRouting(void) { return nci_snd_get_routing_cmd(); }
+
+/*******************************************************************************
+**
+** Function         NFC_NfceePLConfig
+**
+** Description      This function is called to set the Power and Link Control to
+**                  an NFCEE connected to the NFCC.
+**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
+**                  as NFC_NFCEE_PL_CONTROL_REVT.
+**
+** Parameters       nfcee_id - the NFCEE to activate or de-activate.
+**                  pl_config -
+**                   NFCEE_PL_CONFIG_NFCC_DECIDES  NFCC decides (default)
+**                   NFCEE_PL_CONFIG_PWR_ALWAYS_ON  NFCEE power supply is
+**                                                          always on
+**                   NFCEE_PL_CONFIG_LNK_ON_WHEN_PWR_ON  communication link is
+**                                       always active when NFCEE is powered on
+**                   NFCEE_PL_CONFIG_PWR_LNK_ALWAYS_ON  power supply and
+**                                       communication link are always on
+**
+** Returns          tNFC_STATUS
+**
+*******************************************************************************/
+tNFC_STATUS NFC_NfceePLConfig(uint8_t nfcee_id,
+                              tNCI_NFCEE_PL_CONFIG pl_config) {
+  return nci_snd_nfcee_power_link_control(nfcee_id, pl_config);
+}
diff --git a/src/nfc/nfc/nfc_main.c b/src/nfc/nfc/nfc_main.cc
similarity index 88%
rename from src/nfc/nfc/nfc_main.c
rename to src/nfc/nfc/nfc_main.cc
index 9eb147d..77c0485 100644
--- a/src/nfc/nfc/nfc_main.c
+++ b/src/nfc/nfc/nfc_main.cc
@@ -24,20 +24,22 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "gki.h"
+
+#include <android-base/stringprintf.h>
+#include <android/hardware/nfc/1.1/types.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
 #include "ce_int.h"
+#include "gki.h"
 #include "nci_hmsgs.h"
-#include "nfc_api.h"
-#include "nfc_hal_api.h"
 #include "nfc_int.h"
 #include "rw_int.h"
 
 #if (NFC_RW_ONLY == FALSE)
-#include "ce_api.h"
-#include "ce_int.h"
+
 #include "llcp_int.h"
 
 /* NFC mandates support for at least one logical connection;
@@ -52,6 +54,13 @@
 #define NFC_SET_MAX_CONN_DEFAULT()
 
 #endif /* NFC_RW_ONLY */
+
+using android::base::StringPrintf;
+using android::hardware::nfc::V1_1::NfcEvent;
+
+extern bool nfc_debug_enabled;
+extern void delete_stack_non_volatile_store(bool forceDelete);
+
 /****************************************************************************
 ** Declarations
 ****************************************************************************/
@@ -76,7 +85,6 @@
 #endif
 };
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         nfc_state_name
@@ -88,28 +96,28 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* nfc_state_name(uint8_t state) {
+static std::string nfc_state_name(uint8_t state) {
   switch (state) {
     case NFC_STATE_NONE:
-      return ("NONE");
+      return "NONE";
     case NFC_STATE_W4_HAL_OPEN:
-      return ("W4_HAL_OPEN");
+      return "W4_HAL_OPEN";
     case NFC_STATE_CORE_INIT:
-      return ("CORE_INIT");
+      return "CORE_INIT";
     case NFC_STATE_W4_POST_INIT_CPLT:
-      return ("W4_POST_INIT_CPLT");
+      return "W4_POST_INIT_CPLT";
     case NFC_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case NFC_STATE_OPEN:
-      return ("OPEN");
+      return "OPEN";
     case NFC_STATE_CLOSING:
-      return ("CLOSING");
+      return "CLOSING";
     case NFC_STATE_W4_HAL_CLOSE:
-      return ("W4_HAL_CLOSE");
+      return "W4_HAL_CLOSE";
     case NFC_STATE_NFCC_POWER_OFF_SLEEP:
-      return ("NFCC_POWER_OFF_SLEEP");
+      return "NFCC_POWER_OFF_SLEEP";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
 
@@ -124,34 +132,28 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* nfc_hal_event_name(uint8_t event) {
+static std::string nfc_hal_event_name(uint8_t event) {
   switch (event) {
     case HAL_NFC_OPEN_CPLT_EVT:
-      return ("HAL_NFC_OPEN_CPLT_EVT");
-
+      return "HAL_NFC_OPEN_CPLT_EVT";
     case HAL_NFC_CLOSE_CPLT_EVT:
-      return ("HAL_NFC_CLOSE_CPLT_EVT");
-
+      return "HAL_NFC_CLOSE_CPLT_EVT";
     case HAL_NFC_POST_INIT_CPLT_EVT:
-      return ("HAL_NFC_POST_INIT_CPLT_EVT");
-
+      return "HAL_NFC_POST_INIT_CPLT_EVT";
     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
-      return ("HAL_NFC_PRE_DISCOVER_CPLT_EVT");
-
+      return "HAL_NFC_PRE_DISCOVER_CPLT_EVT";
     case HAL_NFC_REQUEST_CONTROL_EVT:
-      return ("HAL_NFC_REQUEST_CONTROL_EVT");
-
+      return "HAL_NFC_REQUEST_CONTROL_EVT";
     case HAL_NFC_RELEASE_CONTROL_EVT:
-      return ("HAL_NFC_RELEASE_CONTROL_EVT");
-
+      return "HAL_NFC_RELEASE_CONTROL_EVT";
     case HAL_NFC_ERROR_EVT:
-      return ("HAL_NFC_ERROR_EVT");
-
+      return "HAL_NFC_ERROR_EVT";
+    case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
+      return "HCI_NETWORK_RESET";
     default:
-      return ("???? UNKNOWN EVENT");
+      return "???? UNKNOWN EVENT";
   }
 }
-#endif /* BT_TRACE_VERBOSE == TRUE */
 
 /*******************************************************************************
 **
@@ -236,8 +238,21 @@
     p_cb->init_credits = p_cb->num_buff = 0;
     nfc_set_conn_id(p_cb, NFC_RF_CONN_ID);
     if (nfc_cb.nci_version == NCI_VERSION_2_0) {
-      evt_data.enable.hci_packet_size = *p++;
-      evt_data.enable.hci_conn_credits = *p++;
+      if (evt_data.enable.nci_features & NCI_FEAT_HCI_NETWORK) {
+        p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
+        nfc_set_conn_id(p_cb, NFC_HCI_CONN_ID);
+        p_cb->id = NFC_HCI_CONN_ID;
+        STREAM_TO_UINT8(p_cb->buff_size, p);
+        STREAM_TO_UINT8(p_cb->num_buff, p);
+        p_cb->init_credits = p_cb->num_buff;
+        evt_data.enable.hci_packet_size = p_cb->buff_size;
+        evt_data.enable.hci_conn_credits = p_cb->init_credits;
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "hci num_buf=%d buf_size=%d", p_cb->num_buff, p_cb->buff_size);
+      } else {
+        /*HCI n/w not enabled skip data buff size and data credit HCI conn */
+        p += 2;
+      }
       STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p);
       STREAM_TO_UINT8(num_interfaces, p);
 #if (NFC_RW_ONLY == FALSE)
@@ -308,13 +323,10 @@
 **
 *******************************************************************************/
 void nfc_set_state(tNFC_STATE nfc_state) {
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFC_TRACE_DEBUG4("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state,
-                   nfc_state_name(nfc_cb.nfc_state), nfc_state,
-                   nfc_state_name(nfc_state));
-#else
-  NFC_TRACE_DEBUG2("nfc_set_state %d->%d", nfc_cb.nfc_state, nfc_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state,
+                      nfc_state_name(nfc_cb.nfc_state).c_str(), nfc_state,
+                      nfc_state_name(nfc_state).c_str());
   nfc_cb.nfc_state = nfc_state;
 }
 
@@ -364,7 +376,8 @@
 void nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) {
   uint8_t* ps;
 
-  NFC_TRACE_DEBUG1("nfc_main_handle_hal_evt(): HAL event=0x%x", p_msg->hal_evt);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("HAL event=0x%x", p_msg->hal_evt);
 
   switch (p_msg->hal_evt) {
     case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */
@@ -474,14 +487,17 @@
           }
           break;
 
+        case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
+          delete_stack_non_volatile_store(true);
+          break;
+
         default:
           break;
       }
       break;
 
     default:
-      NFC_TRACE_ERROR1("nfc_main_handle_hal_evt (): unhandled event (0x%x).",
-                       p_msg->hal_evt);
+      LOG(ERROR) << StringPrintf("unhandled event (0x%x).", p_msg->hal_evt);
       break;
   }
 }
@@ -498,7 +514,7 @@
 void nfc_main_flush_cmd_queue(void) {
   NFC_HDR* p_msg;
 
-  NFC_TRACE_DEBUG0("nfc_main_flush_cmd_queue ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* initialize command window */
   nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
@@ -535,7 +551,7 @@
     p_msg->status = status;
     GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
   } else {
-    NFC_TRACE_ERROR0("nfc_main_post_hal_evt (): No buffer");
+    LOG(ERROR) << StringPrintf("No buffer");
   }
 }
 
@@ -549,12 +565,9 @@
 **
 *******************************************************************************/
 static void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) {
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFC_TRACE_DEBUG3("nfc_main_hal_cback event: %s(0x%x), status=%d",
-                   nfc_hal_event_name(event), event, status);
-#else
-  NFC_TRACE_DEBUG2("nfc_main_hal_cback event: 0x%x, status=%d", event, status);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_main_hal_cback event: %s(0x%x), status=%d",
+                      nfc_hal_event_name(event).c_str(), event, status);
 
   switch (event) {
     case HAL_NFC_OPEN_CPLT_EVT:
@@ -578,11 +591,13 @@
     case HAL_NFC_REQUEST_CONTROL_EVT:
     case HAL_NFC_RELEASE_CONTROL_EVT:
     case HAL_NFC_ERROR_EVT:
+    case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
       nfc_main_post_hal_evt(event, status);
       break;
 
     default:
-      NFC_TRACE_DEBUG1("nfc_main_hal_cback unhandled event %x", event);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("nfc_main_hal_cback unhandled event %x", event);
       break;
   }
 }
@@ -617,7 +632,7 @@
 
       GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
     } else {
-      NFC_TRACE_ERROR0("nfc_main_hal_data_cback (): No buffer");
+      LOG(ERROR) << StringPrintf("No buffer");
     }
   }
 }
@@ -646,7 +661,7 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) {
-  NFC_TRACE_API0("NFC_Enable ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Validate callback */
   if (!p_cback) {
@@ -677,7 +692,8 @@
 **
 *******************************************************************************/
 void NFC_Disable(void) {
-  NFC_TRACE_API1("NFC_Disable (): nfc_state = %d", nfc_cb.nfc_state);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_state = %d", nfc_cb.nfc_state);
 
   if ((nfc_cb.nfc_state == NFC_STATE_NONE) ||
       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
@@ -720,7 +736,6 @@
   nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT;
   nfc_cb.p_disc_maps = nfc_interface_mapping;
   nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP;
-  nfc_cb.trace_level = NFC_INITIAL_TRACE_LEVEL;
   nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE;
   nfc_cb.reassembly = true;
   nfc_cb.nci_version = NCI_VERSION_UNKNOWN;
@@ -809,8 +824,8 @@
 
   nfc_cb.p_discv_cback = p_cback;
   num_intf = 0;
-  NFC_TRACE_DEBUG1("nci_interfaces supported by NFCC: 0x%x",
-                   nfc_cb.nci_interfaces);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nci_interfaces supported by NFCC: 0x%x", nfc_cb.nci_interfaces);
 
   for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) {
     memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS));
@@ -823,20 +838,22 @@
         if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type)
           is_supported = true;
       }
-      NFC_TRACE_DEBUG3("[%d]: vs intf_type:0x%x is_supported:%d", xx,
-                       p_maps[xx].intf_type, is_supported);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("[%d]: vs intf_type:0x%x is_supported:%d", xx,
+                          p_maps[xx].intf_type, is_supported);
     } else {
       intf_mask = (1 << (p_maps[xx].intf_type));
       if (intf_mask & nfc_cb.nci_interfaces) {
         is_supported = true;
       }
-      NFC_TRACE_DEBUG4("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d", xx,
-                       p_maps[xx].intf_type, intf_mask, is_supported);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d",
+                          xx, p_maps[xx].intf_type, intf_mask, is_supported);
     }
     if (is_supported)
       memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS));
     else {
-      NFC_TRACE_WARNING1(
+      LOG(WARNING) << StringPrintf(
           "NFC_DiscoveryMap interface=0x%x is not supported by NFCC",
           p_maps[xx].intf_type);
     }
@@ -868,9 +885,9 @@
   int params_size;
   tNFC_STATUS status = NFC_STATUS_NO_BUFFERS;
 
-  NFC_TRACE_API0("NFC_DiscoveryStart");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   if (nfc_cb.p_disc_pending) {
-    NFC_TRACE_ERROR0("There's pending NFC_DiscoveryStart");
+    LOG(ERROR) << StringPrintf("There's pending NFC_DiscoveryStart");
     status = NFC_STATUS_BUSY;
   } else {
     nfc_cb.p_discv_cback = p_cback;
@@ -888,7 +905,8 @@
     }
   }
 
-  NFC_TRACE_API1("NFC_DiscoveryStart status: 0x%x", status);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("NFC_DiscoveryStart status: 0x%x", status);
   return status;
 }
 
@@ -1106,13 +1124,9 @@
   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
   tNFC_STATUS status = NFC_STATUS_OK;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  NFC_TRACE_API3("NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state,
-                 nfc_state_name(nfc_cb.nfc_state), deactivate_type);
-#else
-  NFC_TRACE_API2("NFC_Deactivate %d deactivate_type:%d", nfc_cb.nfc_state,
-                 deactivate_type);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state,
+      nfc_state_name(nfc_cb.nfc_state).c_str(), deactivate_type);
 
   if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
     /* the HAL pre-discover is still active - clear the pending flag */
@@ -1128,8 +1142,9 @@
 
   if (nfc_cb.nfc_state == NFC_STATE_OPEN) {
     nfc_set_state(NFC_STATE_CLOSING);
-    NFC_TRACE_DEBUG3("act_protocol %d credits:%d/%d", p_cb->act_protocol,
-                     p_cb->init_credits, p_cb->num_buff);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("act_protocol %d credits:%d/%d", p_cb->act_protocol,
+                        p_cb->init_credits, p_cb->num_buff);
     if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) &&
         (p_cb->init_credits != p_cb->num_buff)) {
       nfc_cb.flags |= NFC_FL_DEACTIVATING;
@@ -1229,7 +1244,7 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_SetPowerOffSleep(bool enable) {
-  NFC_TRACE_API1("NFC_SetPowerOffSleep () enable = %d", enable);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("enable = %d", enable);
 
   if ((enable == false) &&
       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
@@ -1248,8 +1263,7 @@
     return NFC_STATUS_OK;
   }
 
-  NFC_TRACE_ERROR1("NFC_SetPowerOffSleep () invalid state = %d",
-                   nfc_cb.nfc_state);
+  LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state);
   return NFC_STATUS_FAILED;
 }
 
@@ -1263,7 +1277,7 @@
 **
 *******************************************************************************/
 tNFC_STATUS NFC_PowerCycleNFCC(void) {
-  NFC_TRACE_API0("NFC_PowerCycleNFCC ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (nfc_cb.nfc_state == NFC_STATE_IDLE) {
     /* power cycle NFCC */
@@ -1273,31 +1287,12 @@
     return NFC_STATUS_OK;
   }
 
-  NFC_TRACE_ERROR1("NFC_PowerCycleNFCC () invalid state = %d",
-                   nfc_cb.nfc_state);
+  LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state);
   return NFC_STATUS_FAILED;
 }
 
 /*******************************************************************************
 **
-** Function         NFC_SetTraceLevel
-**
-** Description      This function sets the trace level for NFC.  If called with
-**                  a value of 0xFF, it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t NFC_SetTraceLevel(uint8_t new_level) {
-  NFC_TRACE_API1("NFC_SetTraceLevel () new_level = %d", new_level);
-
-  if (new_level != 0xFF) nfc_cb.trace_level = new_level;
-
-  return (nfc_cb.trace_level);
-}
-
-/*******************************************************************************
-**
 ** Function         NFC_GetNCIVersion
 **
 ** Description      Called by higher layer to get the current nci
@@ -1326,7 +1321,37 @@
   return nci_snd_iso_dep_nak_presence_check_cmd();
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
+/*******************************************************************************
+**
+** Function         NFC_SetStaticHciCback
+**
+** Description      This function is called to update the data callback function
+**                  to receive the data for the static Hci connection id.
+**
+** Parameters       p_cback - the connection callback function
+**
+** Returns          Nothing
+**
+*******************************************************************************/
+void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback) {
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE);
+  tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
+  tNFC_CONN evt_data;
+
+  p_cb->p_cback = p_cback;
+  if (p_cback && p_cb->buff_size && p_cb->num_buff) {
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE);
+    evt_data.conn_create.status = NFC_STATUS_OK;
+    evt_data.conn_create.dest_type = NCI_DEST_TYPE_NFCEE;
+    evt_data.conn_create.id = p_cb->id;
+    evt_data.conn_create.buff_size = p_cb->buff_size;
+    evt_data.conn_create.num_buffs = p_cb->num_buff;
+    (*p_cback)(NFC_HCI_CONN_ID, NFC_CONN_CREATE_CEVT, &evt_data);
+  }
+}
+
 /*******************************************************************************
 **
 ** Function         NFC_GetStatusName
@@ -1338,7 +1363,7 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-char* NFC_GetStatusName(tNFC_STATUS status) {
+std::string NFC_GetStatusName(tNFC_STATUS status) {
   switch (status) {
     case NFC_STATUS_OK:
       return "OK";
@@ -1414,4 +1439,3 @@
       return "UNKNOWN";
   }
 }
-#endif
diff --git a/src/nfc/nfc/nfc_ncif.cc b/src/nfc/nfc/nfc_ncif.cc
index 8e0048a..6d6607d 100644
--- a/src/nfc/nfc/nfc_ncif.cc
+++ b/src/nfc/nfc/nfc_ncif.cc
@@ -23,10 +23,10 @@
  *  (callback). On the transmit side, it manages the command transmission.
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
 #include <log/log.h>
 #include <metricslogger/metrics_logger.h>
-#include <stdlib.h>
-#include <string.h>
 
 #include "nfc_target.h"
 
@@ -34,10 +34,12 @@
 #include "nci_defs.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
-#include "nfc_hal_api.h"
 #include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
+
+using android::base::StringPrintf;
+
 #if (NFC_RW_ONLY == FALSE)
 static const uint8_t nfc_mpl_code_to_size[] = {64, 128, 192, 254};
 
@@ -50,6 +52,8 @@
 #define NFC_LB_ATTRIB_REQ_FIXED_BYTES 8
 
 extern unsigned char appl_dta_mode_flag;
+extern bool nfc_debug_enabled;
+
 /*******************************************************************************
 **
 ** Function         nfc_ncif_update_window
@@ -63,7 +67,7 @@
   /* Sanity check - see if we were expecting a update_window */
   if (nfc_cb.nci_cmd_window == NCI_MAX_CMD_WINDOW) {
     if (nfc_cb.nfc_state != NFC_STATE_W4_HAL_CLOSE) {
-      NFC_TRACE_ERROR0("nfc_ncif_update_window: Unexpected call");
+      LOG(ERROR) << StringPrintf("nfc_ncif_update_window: Unexpected call");
     }
     return;
   }
@@ -88,7 +92,7 @@
 **
 *******************************************************************************/
 void nfc_ncif_cmd_timeout(void) {
-  NFC_TRACE_ERROR0("nfc_ncif_cmd_timeout");
+  LOG(ERROR) << StringPrintf("nfc_ncif_cmd_timeout");
 
   /* report an error */
   nfc_ncif_event_status(NFC_GEN_ERROR_REVT, NFC_STATUS_HW_TIMEOUT);
@@ -113,7 +117,7 @@
 **
 *******************************************************************************/
 void nfc_wait_2_deactivate_timeout(void) {
-  NFC_TRACE_ERROR0("nfc_wait_2_deactivate_timeout");
+  LOG(ERROR) << StringPrintf("nfc_wait_2_deactivate_timeout");
   nfc_cb.flags &= ~NFC_FL_DEACTIVATING;
   nci_snd_deactivate_cmd((uint8_t)nfc_cb.deactivate_timer.param);
 }
@@ -139,8 +143,9 @@
   uint8_t hdr0 = p_cb->conn_id;
   bool fragmented = false;
 
-  NFC_TRACE_DEBUG3("nfc_ncif_send_data :%d, num_buff:%d qc:%d", p_cb->conn_id,
-                   p_cb->num_buff, p_cb->tx_q.count);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_ncif_send_data :%d, num_buff:%d qc:%d",
+                      p_cb->conn_id, p_cb->num_buff, p_cb->tx_q.count);
   if (p_cb->id == NFC_RF_CONN_ID) {
     if (nfc_cb.nfc_state != NFC_STATE_OPEN) {
       if (nfc_cb.nfc_state == NFC_STATE_CLOSING) {
@@ -149,7 +154,7 @@
           if (p_cb->init_credits == p_cb->num_buff) {
             /* all the credits are back */
             nfc_cb.flags &= ~NFC_FL_DEACTIVATING;
-            NFC_TRACE_DEBUG2(
+            DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
                 "deactivating NFC-DEP init_credits:%d, num_buff:%d",
                 p_cb->init_credits, p_cb->num_buff);
             nfc_stop_timer(&nfc_cb.deactivate_timer);
@@ -369,13 +374,14 @@
   nfcsnoop_capture(p_msg, true);
   switch (mt) {
     case NCI_MT_DATA:
-      NFC_TRACE_DEBUG0("NFC received data");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("NFC received data");
       nfc_ncif_proc_data(p_msg);
       free = false;
       break;
 
     case NCI_MT_RSP:
-      NFC_TRACE_DEBUG1("NFC received rsp gid:%d", gid);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFC received rsp gid:%d", gid);
       oid = ((*pp) & NCI_OID_MASK);
       p_old = nfc_cb.last_hdr;
       NCI_MSG_PRS_HDR0(p_old, old_mt, pbf, old_gid);
@@ -383,7 +389,7 @@
       /* make sure this is the RSP we are waiting for before updating the
        * command window */
       if ((old_gid != gid) || (old_oid != oid)) {
-        NFC_TRACE_ERROR2(
+        LOG(ERROR) << StringPrintf(
             "nfc_ncif_process_event unexpected rsp: gid:0x%x, oid:0x%x", gid,
             oid);
         return true;
@@ -407,7 +413,7 @@
           nci_proc_prop_rsp(p_msg);
           break;
         default:
-          NFC_TRACE_ERROR1("NFC: Unknown gid:%d", gid);
+          LOG(ERROR) << StringPrintf("NFC: Unknown gid:%d", gid);
           break;
       }
 
@@ -415,7 +421,8 @@
       break;
 
     case NCI_MT_NTF:
-      NFC_TRACE_DEBUG1("NFC received ntf gid:%d", gid);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFC received ntf gid:%d", gid);
       switch (gid) {
         case NCI_GID_CORE: /* 0000b NCI Core group */
           nci_proc_core_ntf(p_msg);
@@ -434,13 +441,14 @@
           nci_proc_prop_ntf(p_msg);
           break;
         default:
-          NFC_TRACE_ERROR1("NFC: Unknown gid:%d", gid);
+          LOG(ERROR) << StringPrintf("NFC: Unknown gid:%d", gid);
           break;
       }
       break;
 
     default:
-      NFC_TRACE_DEBUG2("NFC received unknown mt:0x%x, gid:%d", mt, gid);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFC received unknown mt:0x%x, gid:%d", mt, gid);
   }
 
   return (free);
@@ -477,7 +485,7 @@
   if (nfc_cb.p_resp_cback) {
     evt_data.set_config.num_param_id = 0;
     if (len == 0) {
-      NFC_TRACE_ERROR0("Insufficient RSP length");
+      LOG(ERROR) << StringPrintf("Insufficient RSP length");
       evt_data.set_config.status = NFC_STATUS_SYNTAX_ERROR;
       (*nfc_cb.p_resp_cback)(NFC_SET_CONFIG_REVT, &evt_data);
       return;
@@ -487,15 +495,15 @@
       evt_data.set_config.num_param_id = *p++;
       if (evt_data.set_config.num_param_id > NFC_MAX_NUM_IDS) {
         android_errorWriteLog(0x534e4554, "114047681");
-        NFC_TRACE_ERROR1("OOB write num_param_id %d",
-                         evt_data.set_config.num_param_id);
+        LOG(ERROR) << StringPrintf("OOB write num_param_id %d",
+                                   evt_data.set_config.num_param_id);
         evt_data.set_config.num_param_id = 0;
       } else if (evt_data.set_config.num_param_id <= len - 2) {
         STREAM_TO_ARRAY(evt_data.set_config.param_ids, p,
                         evt_data.set_config.num_param_id);
       } else {
-        NFC_TRACE_ERROR2("Insufficient RSP length %d,num_param_id %d", len,
-                         evt_data.set_config.num_param_id);
+        LOG(ERROR) << StringPrintf("Insufficient RSP length %d,num_param_id %d",
+                                   len, evt_data.set_config.num_param_id);
         evt_data.set_config.num_param_id = 0;
       }
     }
@@ -533,10 +541,11 @@
 **
 *******************************************************************************/
 void nfc_ncif_error_status(uint8_t conn_id, uint8_t status) {
-  tNFC_CONN_CB* p_cb;
-  p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
+  tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
   if (p_cb && p_cb->p_cback) {
-    (*p_cb->p_cback)(conn_id, NFC_ERROR_CEVT, (tNFC_CONN*)&status);
+    tNFC_CONN nfc_conn;
+    nfc_conn.status = status;
+    (*p_cb->p_cback)(conn_id, NFC_ERROR_CEVT, &nfc_conn);
   }
   if (status == NFC_STATUS_TIMEOUT)
     android::metricslogger::LogCounter("nfc_rf_timeout_error", 1);
@@ -585,7 +594,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfc_ncif_proc_credits(uint8_t* p, uint16_t plen) {
+void nfc_ncif_proc_credits(uint8_t* p, __attribute__((unused)) uint16_t plen) {
   uint8_t num, xx;
   tNFC_CONN_CB* p_cb;
 
@@ -600,8 +609,8 @@
           /* if this happens in activated state, it's very likely that our NFCC
            * has issues */
           /* However, credit may be returned after deactivation */
-          NFC_TRACE_ERROR2("num_buff:0x%x, init_credits:0x%x", p_cb->num_buff,
-                           p_cb->init_credits);
+          LOG(ERROR) << StringPrintf("num_buff:0x%x, init_credits:0x%x",
+                                     p_cb->num_buff, p_cb->init_credits);
         }
         p_cb->num_buff = p_cb->init_credits;
       }
@@ -720,8 +729,8 @@
   } else if (NCI_DISCOVERY_TYPE_POLL_KOVIO == p_param->mode) {
     p_param->param.pk.uid_len = len;
     if (p_param->param.pk.uid_len > NFC_KOVIO_MAX_LEN) {
-      NFC_TRACE_ERROR2("Kovio UID len:0x%x exceeds max(0x%x)",
-                       p_param->param.pk.uid_len, NFC_KOVIO_MAX_LEN);
+      LOG(ERROR) << StringPrintf("Kovio UID len:0x%x exceeds max(0x%x)",
+                                 p_param->param.pk.uid_len, NFC_KOVIO_MAX_LEN);
       p_param->param.pk.uid_len = NFC_KOVIO_MAX_LEN;
     }
     STREAM_TO_ARRAY(p_param->param.pk.uid, p, p_param->param.pk.uid_len);
@@ -782,7 +791,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfc_ncif_proc_discover_ntf(uint8_t* p, uint16_t plen) {
+void nfc_ncif_proc_discover_ntf(uint8_t* p,
+                                __attribute__((unused)) uint16_t plen) {
   tNFC_DISCOVER evt_data;
 
   if (nfc_cb.p_discv_cback) {
@@ -863,8 +873,8 @@
   evt_data.activate.rx_bitrate = *p++;
   mode = evt_data.activate.rf_tech_param.mode;
   len_act = *p++;
-  NFC_TRACE_DEBUG3("nfc_ncif_proc_activate:%d %d, mode:0x%02x", len, len_act,
-                   mode);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "nfc_ncif_proc_activate:%d %d, mode:0x%02x", len, len_act, mode);
   /* just in case the interface reports activation parameters not defined in the
    * NCI spec */
   p_intf->intf_param.frame.param_len = len_act;
@@ -1052,17 +1062,15 @@
 *******************************************************************************/
 void nfc_ncif_proc_deactivate(uint8_t status, uint8_t deact_type, bool is_ntf) {
   tNFC_DISCOVER evt_data;
-  tNFC_DEACTIVATE_DEVT* p_deact;
   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
   void* p_data;
 
   nfc_set_state(NFC_STATE_IDLE);
-  p_deact = &evt_data.deactivate;
-  p_deact->status = status;
-  p_deact->type = deact_type;
-  p_deact->is_ntf = is_ntf;
+  evt_data.deactivate.status = status;
+  evt_data.deactivate.type = deact_type;
+  evt_data.deactivate.is_ntf = is_ntf;
   if (NFC_GetNCIVersion() == NCI_VERSION_2_0) {
-    p_deact->reason = nfc_cb.deact_reason;
+    evt_data.deactivate.reason = nfc_cb.deact_reason;
   }
 
   while ((p_data = GKI_dequeue(&p_cb->rx_q)) != NULL) {
@@ -1073,8 +1081,11 @@
     GKI_freebuf(p_data);
   }
 
-  if (p_cb->p_cback)
-    (*p_cb->p_cback)(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, (tNFC_CONN*)p_deact);
+  if (p_cb->p_cback) {
+    tNFC_CONN nfc_conn;
+    nfc_conn.deactivate = evt_data.deactivate;
+    (*p_cb->p_cback)(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, &nfc_conn);
+  }
 
   if (nfc_cb.p_discv_cback) {
     (*nfc_cb.p_discv_cback)(NFC_DEACTIVATE_DEVT, &evt_data);
@@ -1145,7 +1156,9 @@
         }
         break;
     }
-    (*p_cback)(NFC_EE_ACTION_REVT, (tNFC_RESPONSE*)&evt_data);
+    tNFC_RESPONSE nfc_response;
+    nfc_response.ee_action = evt_data;
+    (*p_cback)(NFC_EE_ACTION_REVT, &nfc_response);
   }
 }
 
@@ -1164,7 +1177,8 @@
   tNFC_EE_DISCOVER_INFO* p_info;
   uint8_t u8;
 
-  NFC_TRACE_DEBUG2("nfc_ncif_proc_ee_discover_req %d len:%d", *p, plen);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_ncif_proc_ee_discover_req %d len:%d", *p, plen);
   if (p_cback) {
     u8 = *p;
     ee_disc_req.status = NFC_STATUS_OK;
@@ -1175,7 +1189,8 @@
       p_info->op = *p++;                  /* T */
       if (*p != NFC_EE_DISCOVER_INFO_LEN) /* L */
       {
-        NFC_TRACE_DEBUG1("bad entry len:%d", *p);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("bad entry len:%d", *p);
         return;
       }
       p++;
@@ -1187,7 +1202,9 @@
       plen -= NFC_EE_DISCOVER_ENTRY_LEN;
       p_info++;
     }
-    (*p_cback)(NFC_EE_DISCOVER_REQ_REVT, (tNFC_RESPONSE*)&ee_disc_req);
+    tNFC_RESPONSE nfc_response;
+    nfc_response.ee_discover_req = ee_disc_req;
+    (*p_cback)(NFC_EE_DISCOVER_REQ_REVT, &nfc_response);
   }
 }
 
@@ -1200,7 +1217,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfc_ncif_proc_get_routing(uint8_t* p, uint8_t len) {
+void nfc_ncif_proc_get_routing(uint8_t* p,
+                               __attribute__((unused)) uint8_t len) {
   tNFC_GET_ROUTING_REVT evt_data;
   uint8_t more, num_entries, xx, yy, *pn, tl;
   tNFC_STATUS status = NFC_STATUS_CONTINUE;
@@ -1221,13 +1239,15 @@
         evt_data.tlv_size += tl;
         if (evt_data.tlv_size > NFC_MAX_EE_TLV_SIZE) {
           android_errorWriteLog(0x534e4554, "117554809");
-          NFC_TRACE_ERROR1("%s Invalid data format", __func__);
+          LOG(ERROR) << __func__ << "Invalid data format";
           return;
         }
         STREAM_TO_ARRAY(pn, p, tl);
         pn += tl;
       }
-      (*nfc_cb.p_resp_cback)(NFC_GET_ROUTING_REVT, (tNFC_RESPONSE*)&evt_data);
+      tNFC_RESPONSE nfc_response;
+      nfc_response.get_routing = evt_data;
+      (*nfc_cb.p_resp_cback)(NFC_GET_ROUTING_REVT, &nfc_response);
     }
   }
 }
@@ -1243,7 +1263,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-void nfc_ncif_proc_conn_create_rsp(uint8_t* p, uint16_t plen,
+void nfc_ncif_proc_conn_create_rsp(uint8_t* p,
+                                   __attribute__((unused)) uint16_t plen,
                                    uint8_t dest_type) {
   tNFC_CONN_CB* p_cb;
   tNFC_STATUS status;
@@ -1313,22 +1334,25 @@
   uint8_t status = *p++;
   uint8_t wait_for_ntf = FALSE;
   if (is_ntf) {
-    NFC_TRACE_ERROR1("reset notification!!:0x%x ", status);
+    LOG(ERROR) << StringPrintf("reset notification!!:0x%x ", status);
     /* clean up, if the state is OPEN
      * FW does not report reset ntf right now */
     if (status == NCI2_0_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED ||
         status == NCI2_0_RESET_TRIGGER_TYPE_POWERED_ON) {
-      NFC_TRACE_DEBUG2("CORE_RESET_NTF Received status nfc_state : 0x%x : 0x%x",
-                       status, nfc_cb.nfc_state);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "CORE_RESET_NTF Received status nfc_state : 0x%x : 0x%x", status,
+          nfc_cb.nfc_state);
       nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer);
       p++;
       STREAM_TO_UINT8(nfc_cb.nci_version, p);
-      NFC_TRACE_DEBUG1(" CORE_RESET_NTF nci_version%x", nfc_cb.nci_version);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf(" CORE_RESET_NTF nci_version%x", nfc_cb.nci_version);
       status = NCI_STATUS_OK;
     } else {
       /* CORE_RESET_NTF received error case , trigger recovery*/
-      NFC_TRACE_DEBUG2("CORE_RESET_NTF Received status nfc_state : 0x%x : 0x%x",
-                       status, nfc_cb.nfc_state);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "CORE_RESET_NTF Received status nfc_state : 0x%x : 0x%x", status,
+          nfc_cb.nfc_state);
       nfc_ncif_cmd_timeout();
       status = NCI_STATUS_FAILED;
     }
@@ -1338,7 +1362,8 @@
       nfc_reset_all_conn_cbs();
     }
   } else {
-    NFC_TRACE_DEBUG1("CORE_RESET_RSP len :0x%x ", *p_len);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("CORE_RESET_RSP len :0x%x ", *p_len);
     if ((*p_len) == NCI_CORE_RESET_RSP_LEN(NCI_VERSION_2_0)) {
       wait_for_ntf = TRUE;
     } else if ((*p_len) == NCI_CORE_RESET_RSP_LEN(NCI_VERSION_1_0)) {
@@ -1364,7 +1389,7 @@
         nci_snd_core_init(NCI_VERSION_2_0);
     }
   } else {
-    NFC_TRACE_ERROR0("Failed to reset NFCC");
+    LOG(ERROR) << StringPrintf("Failed to reset NFCC");
     nfc_enabled(status, NULL);
   }
 }
@@ -1391,12 +1416,16 @@
       nci_snd_core_reset(NCI_RESET_TYPE_RESET_CFG);
     } else {
       p_cb->id = NFC_RF_CONN_ID;
+      // check scbr bit as per NCI 2.0 spec
+      nfc_cb.isScbrSupported = p[5] & NCI_SCBR_MASK;
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("scbr support: 0x%x", nfc_cb.isScbrSupported);
       p_cb->act_protocol = NCI_PROTOCOL_UNKNOWN;
 
       nfc_set_state(NFC_STATE_W4_POST_INIT_CPLT);
 
       nfc_cb.p_nci_init_rsp = p_msg;
-      nfc_cb.p_hal->core_initialized(p_msg->len - p_msg->offset, p);
+      nfc_cb.p_hal->core_initialized(p_msg->len, p);
     }
   } else {
     if (nfc_cb.nci_version == NCI_VERSION_UNKNOWN) {
@@ -1512,7 +1541,8 @@
             if ((data_cevt.status != NFC_STATUS_OK) &&
                 ((data_cevt.status >= T2T_STATUS_OK_1_BIT) &&
                  (data_cevt.status <= T2T_STATUS_OK_7_BIT))) {
-              NFC_TRACE_DEBUG1("%s: T2T tag data xchange", __func__);
+              DLOG_IF(INFO, nfc_debug_enabled)
+                  << StringPrintf("%s: T2T tag data xchange", __func__);
               data_cevt.status = NFC_STATUS_OK;
             }
           }
@@ -1524,7 +1554,9 @@
           data_cevt.status = *(p + p_evt->offset + p_evt->len);
         }
       }
-      (*p_cb->p_cback)(p_cb->conn_id, NFC_DATA_CEVT, (tNFC_CONN*)&data_cevt);
+      tNFC_CONN nfc_conn;
+      nfc_conn.data = data_cevt;
+      (*p_cb->p_cback)(p_cb->conn_id, NFC_DATA_CEVT, &nfc_conn);
       p_evt = NULL;
     }
   }
@@ -1552,14 +1584,19 @@
   uint16_t len;
 
   pp = (uint8_t*)(p_msg + 1) + p_msg->offset;
-  NFC_TRACE_DEBUG3("nfc_ncif_proc_data 0x%02x%02x%02x", pp[0], pp[1], pp[2]);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_ncif_proc_data 0x%02x%02x%02x", pp[0], pp[1], pp[2]);
   NCI_DATA_PRS_HDR(pp, pbf, cid, len);
   p_cb = nfc_find_conn_cb_by_conn_id(cid);
   if (p_cb && (p_msg->len >= NCI_DATA_HDR_SIZE)) {
-    NFC_TRACE_DEBUG1("nfc_ncif_proc_data len:%d", len);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("nfc_ncif_proc_data len:%d", len);
 
     p_msg->layer_specific = 0;
-    if (pbf) p_msg->layer_specific = NFC_RAS_FRAGMENTED;
+    if (pbf) {
+      NFC_SetReassemblyFlag(true);
+      p_msg->layer_specific = NFC_RAS_FRAGMENTED;
+    }
     p_last = (NFC_HDR*)GKI_getlast(&p_cb->rx_q);
     if (p_last && (p_last->layer_specific & NFC_RAS_FRAGMENTED)) {
       /* last data buffer is not last fragment, append this new packet to the
@@ -1602,7 +1639,8 @@
         p_last->len += len;
         /* do not need to update pbf and len in NCI header.
          * They are stripped off at NFC_DATA_CEVT and len may exceed 255 */
-        NFC_TRACE_DEBUG1("nfc_ncif_proc_data len:%d", p_last->len);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("nfc_ncif_proc_data len:%d", p_last->len);
         p_last->layer_specific = p_msg->layer_specific;
         GKI_freebuf(p_msg);
 #ifdef DISP_NCI
@@ -1647,7 +1685,8 @@
 *******************************************************************************/
 bool nfc_ncif_proc_proprietary_rsp(uint8_t mt, uint8_t gid, uint8_t oid) {
   bool stat = FALSE;
-  NFC_TRACE_DEBUG4("%s: mt=%u, gid=%u, oid=%u", __func__, mt, gid, oid);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: mt=%u, gid=%u, oid=%u", __func__, mt, gid, oid);
 
   switch (mt) {
     case NCI_MT_DATA:
@@ -1679,6 +1718,27 @@
       stat = TRUE;
       break;
   }
-  NFC_TRACE_DEBUG2("%s: exit status=%u", __func__, stat);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("%s: exit status=%u", __func__, stat);
   return stat;
 }
+
+/*******************************************************************************
+** Function         nfc_mode_set_ntf_timeout
+**
+** Description      This function is invoked on mode set ntf timeout
+**
+** Returns          void
+**
+*******************************************************************************/
+void nfc_mode_set_ntf_timeout() {
+  LOG(ERROR) << StringPrintf("%s", __func__);
+  tNFC_RESPONSE nfc_response;
+  nfc_response.mode_set.status = NCI_STATUS_FAILED;
+  nfc_response.mode_set.nfcee_id = *nfc_cb.last_cmd;
+  nfc_response.mode_set.mode = NCI_NFCEE_MD_DEACTIVATE;
+
+  tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback;
+  tNFC_RESPONSE_EVT event = NFC_NFCEE_MODE_SET_REVT;
+  if (p_cback) (*p_cback)(event, &nfc_response);
+}
diff --git a/src/nfc/nfc/nfc_task.c b/src/nfc/nfc/nfc_task.cc
similarity index 91%
rename from src/nfc/nfc/nfc_task.c
rename to src/nfc/nfc/nfc_task.cc
index 3cd9c7a..bf0a7a7 100644
--- a/src/nfc/nfc/nfc_task.c
+++ b/src/nfc/nfc/nfc_task.cc
@@ -22,14 +22,16 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "gki.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
 #include "ce_int.h"
+#include "gki.h"
 #include "nci_hmsgs.h"
-#include "nfc_api.h"
-#include "nfc_hal_api.h"
 #include "nfc_int.h"
 #include "rw_int.h"
 #if (NFC_RW_ONLY == FALSE)
@@ -39,7 +41,10 @@
 #endif
 
 #include "nfa_dm_int.h"
-#include "nfa_sys.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /*******************************************************************************
 **
@@ -118,11 +123,14 @@
       case NFC_TTYPE_WAIT_2_DEACTIVATE:
         nfc_wait_2_deactivate_timeout();
         break;
-
+      case NFC_TTYPE_WAIT_MODE_SET_NTF:
+        nfc_mode_set_ntf_timeout();
+        break;
       default:
-        NFC_TRACE_DEBUG2("nfc_process_timer_evt: timer:0x%x event (0x%04x)",
-                         p_tle, p_tle->event);
-        NFC_TRACE_DEBUG1(
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("nfc_process_timer_evt: timer:0x%p event (0x%04x)",
+                            p_tle, p_tle->event);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "nfc_process_timer_evt: unhandled timer event (0x%04x)",
             p_tle->event);
     }
@@ -245,7 +253,7 @@
         rw_t1t_process_timeout(p_tle);
         break;
       case NFC_TTYPE_RW_T2T_RESPONSE:
-        rw_t2t_process_timeout(p_tle);
+        rw_t2t_process_timeout();
         break;
       case NFC_TTYPE_RW_T3T_RESPONSE:
         rw_t3t_process_timeout(p_tle);
@@ -268,7 +276,7 @@
         break;
 #endif
       default:
-        NFC_TRACE_DEBUG1(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "nfc_process_quick_timer_evt: unhandled timer event (0x%04x)",
             p_tle->event);
         break;
@@ -329,16 +337,15 @@
 ** Returns          nothing
 **
 *******************************************************************************/
-uint32_t nfc_task(uint32_t param) {
+uint32_t nfc_task(__attribute__((unused)) uint32_t arg) {
   uint16_t event;
   NFC_HDR* p_msg;
   bool free_buf;
 
   /* Initialize the nfc control block */
   memset(&nfc_cb, 0, sizeof(tNFC_CB));
-  nfc_cb.trace_level = NFC_INITIAL_TRACE_LEVEL;
 
-  NFC_TRACE_DEBUG0("NFC_TASK started.");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("NFC_TASK started.");
 
   /* main loop */
   while (true) {
@@ -348,7 +355,8 @@
     }
     /* Handle NFC_TASK_EVT_TRANSPORT_READY from NFC HAL */
     if (event & NFC_TASK_EVT_TRANSPORT_READY) {
-      NFC_TRACE_DEBUG0("NFC_TASK got NFC_TASK_EVT_TRANSPORT_READY.");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NFC_TASK got NFC_TASK_EVT_TRANSPORT_READY.");
 
       /* Reset the NFC controller. */
       nfc_set_state(NFC_STATE_CORE_INIT);
@@ -383,8 +391,8 @@
             break;
 
           default:
-            NFC_TRACE_DEBUG1("nfc_task: unhandle mbox message, event=%04x",
-                             p_msg->event);
+            DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+                "nfc_task: unhandle mbox message, event=%04x", p_msg->event);
             break;
         }
 
@@ -415,7 +423,7 @@
     }
   }
 
-  NFC_TRACE_DEBUG0("nfc_task terminated");
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("nfc_task terminated");
 
   GKI_exit_task(GKI_get_taskid());
   return 0;
diff --git a/src/nfc/nfc/nfc_test.c b/src/nfc/nfc/nfc_test.cc
similarity index 100%
rename from src/nfc/nfc/nfc_test.c
rename to src/nfc/nfc/nfc_test.cc
diff --git a/src/nfc/nfc/nfc_utils.c b/src/nfc/nfc/nfc_utils.cc
similarity index 93%
rename from src/nfc/nfc/nfc_utils.c
rename to src/nfc/nfc/nfc_utils.cc
index 290af0f..93fa7c6 100644
--- a/src/nfc/nfc/nfc_utils.c
+++ b/src/nfc/nfc/nfc_utils.cc
@@ -23,12 +23,17 @@
  *  (callback). On the transmit side, it manages the command transmission.
  *
  ******************************************************************************/
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "bt_types.h"
 #include "nfc_api.h"
-#include "nfc_target.h"
-
 #include "nfc_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /*******************************************************************************
 **
 ** Function         nfc_alloc_conn_cb
@@ -74,7 +79,8 @@
   p_cb->conn_id = conn_id;
   handle = (uint8_t)(p_cb - nfc_cb.conn_cb + 1);
   nfc_cb.conn_id[conn_id] = handle;
-  NFC_TRACE_DEBUG2("nfc_set_conn_id conn_id:%d, handle:%d", conn_id, handle);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("nfc_set_conn_id conn_id:%d, handle:%d", conn_id, handle);
 }
 
 /*******************************************************************************
@@ -178,9 +184,12 @@
   deact.is_ntf = TRUE;
   for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++, p_conn_cb++) {
     if (p_conn_cb->conn_id != NFC_ILLEGAL_CONN_ID) {
-      if (p_conn_cb->p_cback)
+      if (p_conn_cb->p_cback) {
+        tNFC_CONN nfc_conn;
+        nfc_conn.deactivate = deact;
         (*p_conn_cb->p_cback)(p_conn_cb->conn_id, NFC_DEACTIVATE_CEVT,
-                              (tNFC_CONN*)&deact);
+                              &nfc_conn);
+      }
       nfc_free_conn_cb(p_conn_cb);
     }
   }
diff --git a/src/nfc/nfc/nfc_vs.c b/src/nfc/nfc/nfc_vs.cc
similarity index 93%
rename from src/nfc/nfc/nfc_vs.c
rename to src/nfc/nfc/nfc_vs.cc
index 5e2548a..c23daf7 100644
--- a/src/nfc/nfc/nfc_vs.c
+++ b/src/nfc/nfc/nfc_vs.cc
@@ -24,11 +24,17 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "gki.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "gki.h"
 #include "nfc_int.h"
 
+using android::base::StringPrintf;
+
 /****************************************************************************
 ** Declarations
 ****************************************************************************/
@@ -87,7 +93,8 @@
 tNFC_STATUS NFC_SendRawVsCommand(NFC_HDR* p_data, tNFC_VS_CBACK* p_cback) {
   /* Validate parameters */
   if (p_data == NULL || (p_data->len > NCI_MAX_VSC_SIZE)) {
-    NFC_TRACE_ERROR1("buffer offset must be >= %d", NCI_VSC_MSG_HDR_SIZE);
+    LOG(ERROR) << StringPrintf("buffer offset must be >= %d",
+                               NCI_VSC_MSG_HDR_SIZE);
     if (p_data) GKI_freebuf(p_data);
     return NFC_STATUS_INVALID_PARAM;
   }
@@ -132,7 +139,8 @@
   /* Validate parameters */
   if ((p_data == NULL) || (p_data->offset < NCI_VSC_MSG_HDR_SIZE) ||
       (p_data->len > NCI_MAX_VSC_SIZE)) {
-    NFC_TRACE_ERROR1("buffer offset must be >= %d", NCI_VSC_MSG_HDR_SIZE);
+    LOG(ERROR) << StringPrintf("buffer offset must be >= %d",
+                               NCI_VSC_MSG_HDR_SIZE);
     if (p_data) GKI_freebuf(p_data);
     return NFC_STATUS_INVALID_PARAM;
   }
diff --git a/src/nfc/tags/ce_main.c b/src/nfc/tags/ce_main.cc
similarity index 80%
rename from src/nfc/tags/ce_main.c
rename to src/nfc/tags/ce_main.cc
index cf207cb..46e6955 100644
--- a/src/nfc/tags/ce_main.c
+++ b/src/nfc/tags/ce_main.cc
@@ -24,14 +24,19 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
 #include "ce_api.h"
 #include "ce_int.h"
-#include "gki.h"
-#include "nci_hmsgs.h"
-#include "nfc_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 tCE_CB ce_cb;
 
@@ -39,7 +44,6 @@
 *******************************************************************************/
 void ce_init(void) {
   memset(&ce_cb, 0, sizeof(tCE_CB));
-  ce_cb.trace_level = NFC_INITIAL_TRACE_LEVEL;
 
   /* Initialize tag-specific fields of ce control block */
   ce_t3t_init();
@@ -67,7 +71,8 @@
       p = (uint8_t*)(p_data + 1) + p_data->offset;
       memcpy(p, p_raw_data, data_len);
       p_data->len = data_len;
-      CE_TRACE_EVENT1("CE SENT raw frame (0x%x)", data_len);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("CE SENT raw frame (0x%x)", data_len);
       status = NFC_SendData(NFC_RF_CONN_ID, p_data);
     }
   }
@@ -89,7 +94,8 @@
   tNFC_STATUS status = NFC_STATUS_FAILED;
   tNFC_PROTOCOL protocol = p_activate_params->protocol;
 
-  CE_TRACE_API1("CE_SetActivatedTagType protocol:%d", protocol);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("CE_SetActivatedTagType protocol:%d", protocol);
 
   switch (protocol) {
     case NFC_PROTOCOL_T1T:
@@ -110,7 +116,7 @@
       break;
 
     default:
-      CE_TRACE_ERROR0("CE_SetActivatedTagType Invalid protocol");
+      LOG(ERROR) << StringPrintf("CE_SetActivatedTagType Invalid protocol");
       return NFC_STATUS_FAILED;
   }
 
@@ -120,20 +126,3 @@
   }
   return status;
 }
-
-/*******************************************************************************
-**
-** Function         CE_SetTraceLevel
-**
-** Description      This function sets the trace level for Card Emulation mode.
-**                  If called with a value of 0xFF,
-**                  it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t CE_SetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) ce_cb.trace_level = new_level;
-
-  return (ce_cb.trace_level);
-}
diff --git a/src/nfc/tags/ce_t3t.c b/src/nfc/tags/ce_t3t.cc
similarity index 88%
rename from src/nfc/tags/ce_t3t.c
rename to src/nfc/tags/ce_t3t.cc
index cd1ae00..461b9ed 100644
--- a/src/nfc/tags/ce_t3t.c
+++ b/src/nfc/tags/ce_t3t.cc
@@ -23,16 +23,20 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "nfc_target.h"
-#include "trace_api.h"
 
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
+#include "nfc_target.h"
+
+#include "bt_types.h"
 #include "ce_api.h"
 #include "ce_int.h"
-#include "gki.h"
-#include "nfc_api.h"
-#include "nfc_int.h"
-#include "tags_int.h"
+#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 enum {
   CE_T3T_COMMAND_INVALID,
@@ -90,12 +94,8 @@
   UINT8_TO_STREAM(p, (p_msg->len + 1));
   p_msg->len += 1; /* Increment len to include SoD */
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispT3TagMessage(p_msg, false);
-#endif
-
   if (NFC_SendData(NFC_RF_CONN_ID, p_msg) != NFC_STATUS_OK) {
-    CE_TRACE_ERROR0("ce_t3t_send_to_lower (): NFC_SendData () failed");
+    LOG(ERROR) << StringPrintf("failed");
   }
 }
 
@@ -182,7 +182,8 @@
     p_rsp_msg->len = (uint16_t)(p_dst - p_rsp_start);
     ce_t3t_send_to_lower(p_rsp_msg);
   } else {
-    CE_TRACE_ERROR0("CE: Unable to allocat buffer for response message");
+    LOG(ERROR) << StringPrintf(
+        "CE: Unable to allocat buffer for response message");
   }
 }
 
@@ -206,7 +207,6 @@
   tCE_T3T_NDEF_INFO ndef_info;
   tNFC_STATUS nfc_status = NFC_STATUS_OK;
   uint8_t update_flags = 0;
-  tCE_UPDATE_INFO update_info;
 
   /* If in idle state, notify app that update is starting */
   if (p_cb->state == CE_T3T_STATE_IDLE) {
@@ -230,7 +230,7 @@
     /* Reject UPDATE command if service code=T3T_MSG_NDEF_SC_RO */
     if (service_code == T3T_MSG_NDEF_SC_RO) {
       /* Error: invalid block number to update */
-      CE_TRACE_ERROR0("CE: UPDATE request using read-only service");
+      LOG(ERROR) << StringPrintf("CE: UPDATE request using read-only service");
       nfc_status = NFC_STATUS_FAILED;
       break;
     }
@@ -238,18 +238,19 @@
     /* Check for NDEF */
     if (service_code == T3T_MSG_NDEF_SC_RW) {
       if (p_cb->cur_cmd.num_blocks > p_cb->ndef_info.nbw) {
-        CE_TRACE_ERROR2(
+        LOG(ERROR) << StringPrintf(
             "CE: Requested too many blocks to update (requested: %i, max: %i)",
             p_cb->cur_cmd.num_blocks, p_cb->ndef_info.nbw);
         nfc_status = NFC_STATUS_FAILED;
         break;
       } else if (p_cb->ndef_info.rwflag == T3T_MSG_NDEF_RWFLAG_RO) {
-        CE_TRACE_ERROR0("CE: error: write-request to read-only NDEF message.");
+        LOG(ERROR) << StringPrintf(
+            "CE: error: write-request to read-only NDEF message.");
         nfc_status = NFC_STATUS_FAILED;
         break;
       } else if (block_number == 0) {
-        CE_TRACE_DEBUG2("CE: Update sc 0x%04x block %i.", service_code,
-                        block_number);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "CE: Update sc 0x%04x block %i.", service_code, block_number);
 
         /* Special caes: NDEF block0 is the ndef attribute block */
         p_temp = p_block_data;
@@ -271,7 +272,8 @@
 
         /* Compare calcuated checksum with received checksum */
         if (checksum != checksum_rx) {
-          CE_TRACE_ERROR0("CE: Checksum failed for NDEF attribute block.");
+          LOG(ERROR) << StringPrintf(
+              "CE: Checksum failed for NDEF attribute block.");
           nfc_status = NFC_STATUS_FAILED;
         } else {
           /* Update NDEF attribute block (only allowed to update current length
@@ -289,13 +291,13 @@
           }
         }
       } else {
-        CE_TRACE_DEBUG2("CE: Udpate sc 0x%04x block %i.", service_code,
-                        block_number);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "CE: Udpate sc 0x%04x block %i.", service_code, block_number);
 
         /* Verify that block_number is within NDEF memory */
         if (block_number > p_cb->ndef_info.nmaxb) {
           /* Error: invalid block number to update */
-          CE_TRACE_ERROR2(
+          LOG(ERROR) << StringPrintf(
               "CE: Requested invalid NDEF block number to update %i (max is "
               "%i).",
               block_number, p_cb->ndef_info.nmaxb);
@@ -314,8 +316,8 @@
       }
     } else {
       /* Error: invalid service code */
-      CE_TRACE_ERROR1("CE: Requested invalid service code: 0x%04x.",
-                      service_code);
+      LOG(ERROR) << StringPrintf("CE: Requested invalid service code: 0x%04x.",
+                                 service_code);
       nfc_status = NFC_STATUS_FAILED;
       break;
     }
@@ -344,11 +346,12 @@
 
   if (update_flags & CE_T3T_UPDATE_FL_NDEF_UPDATE_CPLT) {
     /* NDEF attribute got updated with WriteF=FALSE */
-    update_info.status = nfc_status;
-    update_info.p_data = p_cb->ndef_info.p_scratch_buf;
-    update_info.length = p_cb->ndef_info.scratch_ln;
+    tCE_DATA ce_data;
+    ce_data.update_info.status = nfc_status;
+    ce_data.update_info.p_data = p_cb->ndef_info.p_scratch_buf;
+    ce_data.update_info.length = p_cb->ndef_info.scratch_ln;
     p_cb->state = CE_T3T_STATE_IDLE;
-    p_ce_cb->p_cback(CE_T3T_NDEF_UPDATE_CPLT_EVT, (tCE_DATA*)&update_info);
+    p_ce_cb->p_cback(CE_T3T_NDEF_UPDATE_CPLT_EVT, &ce_data);
   }
 
   GKI_freebuf(p_cmd_msg);
@@ -412,7 +415,7 @@
         /* Verify Nbr (NDEF only) */
         if (p_cb->cur_cmd.num_blocks > p_cb->ndef_info.nbr) {
           /* Error: invalid number of blocks to check */
-          CE_TRACE_ERROR2(
+          LOG(ERROR) << StringPrintf(
               "CE: Requested too many blocks to check (requested: %i, max: %i)",
               p_cb->cur_cmd.num_blocks, p_cb->ndef_info.nbr);
 
@@ -456,8 +459,8 @@
             /* Invalid block number */
             p_dst = p_status;
 
-            CE_TRACE_ERROR1("CE: Requested block number to check %i.",
-                            block_number);
+            LOG(ERROR) << StringPrintf(
+                "CE: Requested block number to check %i.", block_number);
 
             /* Error: invalid number of blocks to check */
             UINT8_TO_STREAM(p_dst, T3T_MSG_RSP_STATUS_ERROR);
@@ -483,8 +486,8 @@
         }
       } else {
         /* Error: invalid service code */
-        CE_TRACE_ERROR1("CE: Requested invalid service code: 0x%04x.",
-                        service_code);
+        LOG(ERROR) << StringPrintf(
+            "CE: Requested invalid service code: 0x%04x.", service_code);
 
         p_dst = p_status;
         UINT8_TO_STREAM(p_dst, T3T_MSG_RSP_STATUS_ERROR);
@@ -496,7 +499,8 @@
     p_rsp_msg->len = (uint16_t)(p_dst - p_rsp_start);
     ce_t3t_send_to_lower(p_rsp_msg);
   } else {
-    CE_TRACE_ERROR0("CE: Unable to allocat buffer for response message");
+    LOG(ERROR) << StringPrintf(
+        "CE: Unable to allocat buffer for response message");
   }
 
   GKI_freebuf(p_cmd_msg);
@@ -583,7 +587,7 @@
       case T3T_MSG_OPC_REQ_SERVICE_CMD:
       default:
         /* Unhandled command */
-        CE_TRACE_ERROR1("Unhandled CE opcode: %02x", cmd_id);
+        LOG(ERROR) << StringPrintf("Unhandled CE opcode: %02x", cmd_id);
         send_response = false;
         break;
     }
@@ -595,7 +599,8 @@
       GKI_freebuf(p_rsp_msg);
     }
   } else {
-    CE_TRACE_ERROR0("CE: Unable to allocat buffer for response message");
+    LOG(ERROR) << StringPrintf(
+        "CE: Unable to allocat buffer for response message");
   }
   GKI_freebuf(p_cmd_msg);
 }
@@ -609,7 +614,7 @@
 ** Returns          none
 **
 *******************************************************************************/
-void ce_t3t_data_cback(uint8_t conn_id, tNFC_DATA_CEVT* p_data) {
+void ce_t3t_data_cback(tNFC_DATA_CEVT* p_data) {
   tCE_CB* p_ce_cb = &ce_cb;
   tCE_T3T_MEM* p_cb = &p_ce_cb->mem.t3t;
   NFC_HDR* p_msg = p_data->p_data;
@@ -624,10 +629,6 @@
   uint8_t sod;
   uint8_t cmd_type;
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispT3TagMessage(p_msg, true);
-#endif
-
   /* If activate system code is not NDEF, or if no local NDEF contents was set,
    * then pass data up to the app */
   if ((p_cb->system_code != T3T_SYSTEM_CODE_NDEF) ||
@@ -640,8 +641,8 @@
 
   /* Verify that message contains at least Sod and cmd_id */
   if (p_msg->len < 2) {
-    CE_TRACE_ERROR1("CE: received invalid T3t message (invalid length: %i)",
-                    p_msg->len);
+    LOG(ERROR) << StringPrintf(
+        "CE: received invalid T3t message (invalid length: %i)", p_msg->len);
   } else {
     /* Get and validate command opcode */
     STREAM_TO_UINT8(sod, p);
@@ -650,7 +651,7 @@
     /* Valid command and message length */
     cmd_type = ce_t3t_is_valid_opcode(cmd_id);
     if (cmd_type == CE_T3T_COMMAND_INVALID) {
-      CE_TRACE_ERROR1(
+      LOG(ERROR) << StringPrintf(
           "CE: received invalid T3t message (invalid command: 0x%02X)", cmd_id);
     } else if (cmd_type == CE_T3T_COMMAND_FELICA) {
       ce_t3t_handle_non_nfc_forum_cmd(p_ce_cb, cmd_id, p_msg);
@@ -658,8 +659,9 @@
     } else {
       /* Verify that message contains at least NFCID2 and NUM services */
       if (p_msg->len < T3T_MSG_CMD_COMMON_HDR_LEN) {
-        CE_TRACE_ERROR1("CE: received invalid T3t message (invalid length: %i)",
-                        p_msg->len);
+        LOG(ERROR) << StringPrintf(
+            "CE: received invalid T3t message (invalid length: %i)",
+            p_msg->len);
       } else {
         /* Handle NFC_FORUM command (UPDATE or CHECK) */
         STREAM_TO_ARRAY(cmd_nfcid2, p, NCI_RF_F_UID_LEN);
@@ -670,17 +672,18 @@
             T3T_MSG_CMD_COMMON_HDR_LEN + 2 * p_cb->cur_cmd.num_services + 1;
 
         if (p_cb->state == CE_T3T_STATE_NOT_ACTIVATED) {
-          CE_TRACE_ERROR2(
+          LOG(ERROR) << StringPrintf(
               "CE: received command 0x%02X while in bad state (%i))", cmd_id,
               p_cb->state);
         } else if (memcmp(cmd_nfcid2, p_cb->local_nfcid2, NCI_RF_F_UID_LEN) !=
                    0) {
-          CE_TRACE_ERROR0("CE: received invalid T3t message (invalid NFCID2)");
+          LOG(ERROR) << StringPrintf(
+              "CE: received invalid T3t message (invalid NFCID2)");
           p_nfcid2 = cmd_nfcid2; /* respond with ERROR using the NFCID2 from the
                                     command message */
         } else if (p_msg->len < block_list_start_offset) {
           /* Does not have minimum (including number_of_blocks field) */
-          CE_TRACE_ERROR0("CE: incomplete message");
+          LOG(ERROR) << StringPrintf("CE: incomplete message");
         } else {
           /* Parse service code list */
           for (i = 0; i < p_cb->cur_cmd.num_services; i++) {
@@ -696,7 +699,7 @@
             /* Each entry is at lease 2 bytes long */
             if (remaining < 2) {
               /* Unexpected end of message (while reading block-list) */
-              CE_TRACE_ERROR0(
+              LOG(ERROR) << StringPrintf(
                   "CE: received invalid T3t message (unexpected end of "
                   "block-list)");
               block_list_ok = false;
@@ -710,7 +713,7 @@
             if ((bl0 & T3T_MSG_SERVICE_LIST_MASK) >=
                 p_cb->cur_cmd.num_services) {
               /* Invalid service code */
-              CE_TRACE_ERROR1(
+              LOG(ERROR) << StringPrintf(
                   "CE: received invalid T3t message (invalid service index: "
                   "%i)",
                   (bl0 & T3T_MSG_SERVICE_LIST_MASK));
@@ -719,7 +722,7 @@
             } else if ((!(bl0 & T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT)) &&
                        (remaining < 3)) {
               /* Unexpected end of message (while reading 3-byte entry) */
-              CE_TRACE_ERROR0(
+              LOG(ERROR) << StringPrintf(
                   "CE: received invalid T3t message (unexpected end of "
                   "block-list)");
               block_list_ok = false;
@@ -739,9 +742,9 @@
               /* This is a CHECK command. Sanity check: there shouldn't be any
                * more data remaining after reading block list */
               if (remaining) {
-                CE_TRACE_ERROR1(
-                    "CE: unexpected data after after CHECK command (#i bytes)",
-                    remaining);
+                LOG(ERROR) << StringPrintf(
+                    "CE: unexpected data after after CHECK command (%u bytes)",
+                    (unsigned int)remaining);
               }
               ce_t3t_handle_check_cmd(p_ce_cb, p_msg);
               msg_processed = true;
@@ -749,7 +752,7 @@
               /* This is an UPDATE command. See if message contains all the
                * expected block data */
               if (remaining < p_cb->cur_cmd.num_blocks * T3T_MSG_BLOCKSIZE) {
-                CE_TRACE_ERROR0("CE: unexpected end of block-data");
+                LOG(ERROR) << StringPrintf("CE: unexpected end of block-data");
               } else {
                 ce_t3t_handle_update_cmd(p_ce_cb, p_msg);
                 msg_processed = true;
@@ -782,7 +785,8 @@
                        tNFC_CONN* p_data) {
   tCE_T3T_MEM* p_cb = &ce_cb.mem.t3t;
 
-  CE_TRACE_DEBUG2("ce_t3t_conn_cback: conn_id=%i, evt=%i", conn_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("ce_t3t_conn_cback: conn_id=%i, evt=%i", conn_id, event);
 
   switch (event) {
     case NFC_CONN_CREATE_CEVT:
@@ -794,7 +798,7 @@
 
     case NFC_DATA_CEVT:
       if (p_data->data.status == NFC_STATUS_OK) {
-        ce_t3t_data_cback(conn_id, &p_data->data);
+        ce_t3t_data_cback(&p_data->data);
       }
       break;
 
@@ -821,7 +825,7 @@
                           uint8_t nfcid2[NCI_RF_F_UID_LEN]) {
   tCE_T3T_MEM* p_cb = &ce_cb.mem.t3t;
 
-  CE_TRACE_DEBUG0("ce_select_t3t ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cb->state = CE_T3T_STATE_IDLE;
   p_cb->system_code = system_code;
@@ -845,13 +849,14 @@
                                   uint8_t* p_scratch_buf) {
   tCE_T3T_MEM* p_cb = &ce_cb.mem.t3t;
 
-  CE_TRACE_API3("CE_T3tSetContent: ro=%i, size_max=%i, size_current=%i",
-                read_only, size_max, size_current);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("CE_T3tSetContent: ro=%i, size_max=%i, size_current=%i",
+                      read_only, size_max, size_current);
 
   /* Verify scratch buffer was provided if NDEF message is read/write */
   if ((!read_only) && (!p_scratch_buf)) {
-    CE_TRACE_ERROR0(
-        "CE_T3tSetLocalNDEFMsg (): p_scratch_buf cannot be NULL if not "
+    LOG(ERROR) << StringPrintf(
+        "p_scratch_buf cannot be NULL if not "
         "read-only");
     return NFC_STATUS_FAILED;
   }
@@ -897,12 +902,13 @@
 tNFC_STATUS CE_T3tSetLocalNDefParams(uint8_t nbr, uint8_t nbw) {
   tCE_T3T_MEM* p_cb = &ce_cb.mem.t3t;
 
-  CE_TRACE_API2("CE_T3tSetLocalNDefParams: nbr=%i, nbw=%i", nbr, nbw);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("CE_T3tSetLocalNDefParams: nbr=%i, nbw=%i", nbr, nbw);
 
   /* Validate */
   if ((nbr > T3T_MSG_NUM_BLOCKS_CHECK_MAX) ||
       (nbw > T3T_MSG_NUM_BLOCKS_UPDATE_MAX) || (nbr < 1) || (nbw < 1)) {
-    CE_TRACE_ERROR0("CE_T3tSetLocalNDefParams: invalid params");
+    LOG(ERROR) << StringPrintf("CE_T3tSetLocalNDefParams: invalid params");
     return NFC_STATUS_FAILED;
   }
 
@@ -928,13 +934,15 @@
   NFC_HDR* p_rsp_msg;
   uint8_t *p_dst, *p_rsp_start;
 
-  CE_TRACE_API3("CE_T3tCheckRsp: status1=0x%02X, status2=0x%02X, num_blocks=%i",
-                status1, status2, num_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "CE_T3tCheckRsp: status1=0x%02X, status2=0x%02X, num_blocks=%i", status1,
+      status2, num_blocks);
 
   /* Validate num_blocks */
   if (num_blocks > T3T_MSG_NUM_BLOCKS_CHECK_MAX) {
-    CE_TRACE_ERROR2("CE_T3tCheckRsp num_blocks (%i) exceeds maximum (%i)",
-                    num_blocks, T3T_MSG_NUM_BLOCKS_CHECK_MAX);
+    LOG(ERROR) << StringPrintf(
+        "CE_T3tCheckRsp num_blocks (%i) exceeds maximum (%i)", num_blocks,
+        T3T_MSG_NUM_BLOCKS_CHECK_MAX);
     return (NFC_STATUS_FAILED);
   }
 
@@ -960,7 +968,8 @@
     p_rsp_msg->len = (uint16_t)(p_dst - p_rsp_start);
     ce_t3t_send_to_lower(p_rsp_msg);
   } else {
-    CE_TRACE_ERROR0("CE: Unable to allocate buffer for response message");
+    LOG(ERROR) << StringPrintf(
+        "CE: Unable to allocate buffer for response message");
   }
 
   return (retval);
@@ -979,8 +988,8 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tCE_CB* p_ce_cb = &ce_cb;
 
-  CE_TRACE_API2("CE_T3tUpdateRsp: status1=0x%02X, status2=0x%02X", status1,
-                status2);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "CE_T3tUpdateRsp: status1=0x%02X, status2=0x%02X", status1, status2);
   ce_t3t_send_rsp(p_ce_cb, NULL, T3T_MSG_OPC_UPDATE_RSP, status1, status2);
 
   return (retval);
diff --git a/src/nfc/tags/ce_t4t.c b/src/nfc/tags/ce_t4t.cc
similarity index 77%
rename from src/nfc/tags/ce_t4t.c
rename to src/nfc/tags/ce_t4t.cc
index f204c8a..9b859e2 100644
--- a/src/nfc/tags/ce_t4t.c
+++ b/src/nfc/tags/ce_t4t.cc
@@ -24,16 +24,22 @@
  ******************************************************************************/
 #include <log/log.h>
 #include <string.h>
-#include "bt_types.h"
-#include "nfc_target.h"
-#include "trace_api.h"
 
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
+#include "nfc_target.h"
+
+#include "bt_types.h"
 #include "ce_api.h"
 #include "ce_int.h"
-#include "gki.h"
-#include "nfc_api.h"
 #include "nfc_int.h"
 #include "tags_int.h"
+#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 #if (CE_TEST_INCLUDED == TRUE) /* test only */
 bool mapping_aid_test_enabled = false;
@@ -51,12 +57,8 @@
 **
 *******************************************************************************/
 static bool ce_t4t_send_to_lower(NFC_HDR* p_r_apdu) {
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispCET4Tags(p_r_apdu, false);
-#endif
-
   if (NFC_SendData(NFC_RF_CONN_ID, p_r_apdu) != NFC_STATUS_OK) {
-    CE_TRACE_ERROR0("ce_t4t_send_to_lower (): NFC_SendData () failed");
+    LOG(ERROR) << StringPrintf("failed");
     return false;
   }
   return true;
@@ -75,12 +77,12 @@
   NFC_HDR* p_r_apdu;
   uint8_t* p;
 
-  CE_TRACE_DEBUG1("ce_t4t_send_status (): Status:0x%04X", status);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Status:0x%04X", status);
 
   p_r_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_CE_POOL_ID);
 
   if (!p_r_apdu) {
-    CE_TRACE_ERROR0("ce_t4t_send_status (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -109,10 +111,10 @@
 static bool ce_t4t_select_file(uint16_t file_id) {
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
 
-  CE_TRACE_DEBUG1("ce_t4t_select_file (): FileID:0x%04X", file_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("FileID:0x%04X", file_id);
 
   if (file_id == T4T_CC_FILE_ID) {
-    CE_TRACE_DEBUG0("ce_t4t_select_file (): Select CC file");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Select CC file");
 
     p_t4t->status |= CE_T4T_STATUS_CC_FILE_SELECTED;
     p_t4t->status &= ~(CE_T4T_STATUS_NDEF_SELECTED);
@@ -121,8 +123,8 @@
   }
 
   if (file_id == CE_T4T_MANDATORY_NDEF_FILE_ID) {
-    CE_TRACE_DEBUG3(
-        "ce_t4t_select_file (): NLEN:0x%04X, MaxFileSize:0x%04X, "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "NLEN:0x%04X, MaxFileSize:0x%04X, "
         "WriteAccess:%s",
         p_t4t->nlen, p_t4t->max_file_size,
         (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY ? "RW" : "RO"));
@@ -132,8 +134,7 @@
 
     return true;
   } else {
-    CE_TRACE_ERROR1("ce_t4t_select_file (): Cannot find file ID (0x%04X)",
-                    file_id);
+    LOG(ERROR) << StringPrintf("Cannot find file ID (0x%04X)", file_id);
 
     p_t4t->status &= ~(CE_T4T_STATUS_CC_FILE_SELECTED);
     p_t4t->status &= ~(CE_T4T_STATUS_NDEF_SELECTED);
@@ -156,8 +157,8 @@
   uint8_t *p_src = NULL, *p_dst;
   NFC_HDR* p_r_apdu;
 
-  CE_TRACE_DEBUG3(
-      "ce_t4t_read_binary (): Offset:0x%04X, Length:0x%04X, selected status = "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Offset:0x%04X, Length:0x%04X, selected status = "
       "0x%02X",
       offset, length, p_t4t->status);
 
@@ -174,7 +175,7 @@
     p_r_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_CE_POOL_ID);
 
     if (!p_r_apdu) {
-      CE_TRACE_ERROR0("ce_t4t_read_binary (): Cannot allocate buffer");
+      LOG(ERROR) << StringPrintf("Cannot allocate buffer");
       return false;
     }
 
@@ -217,7 +218,7 @@
     }
     return true;
   } else {
-    CE_TRACE_ERROR0("ce_t4t_read_binary (): No selected file");
+    LOG(ERROR) << StringPrintf("No selected file");
 
     if (!ce_t4t_send_status(T4T_RSP_CMD_NOT_ALLOWED)) {
       return false;
@@ -243,8 +244,8 @@
   uint16_t starting_offset;
   tCE_DATA ce_data;
 
-  CE_TRACE_DEBUG3(
-      "ce_t4t_update_binary (): Offset:0x%04X, Length:0x%04X, selected status "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "Offset:0x%04X, Length:0x%04X, selected status "
       "= 0x%02X",
       offset, length, p_t4t->status);
 
@@ -278,8 +279,8 @@
       ce_data.update_info.p_data = p_t4t->p_scratch_buf;
 
       (*ce_cb.p_cback)(CE_T4T_NDEF_UPDATE_CPLT_EVT, &ce_data);
-      CE_TRACE_DEBUG0(
-          "ce_t4t_update_binary (): Sent CE_T4T_NDEF_UPDATE_CPLT_EVT");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Sent CE_T4T_NDEF_UPDATE_CPLT_EVT");
     }
 
     p_t4t->status &= ~(CE_T4T_STATUS_NDEF_FILE_UPDATING);
@@ -318,7 +319,7 @@
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
   uint8_t* p;
 
-  CE_TRACE_DEBUG1("ce_t4t_set_version_in_cc (): version = 0x%02X", version);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("version = 0x%02X", version);
 
   p = p_t4t->cc_file + T4T_VERSION_OFFSET_IN_CC;
 
@@ -338,7 +339,7 @@
   uint8_t data_len;
   uint16_t file_id, status_words;
 
-  CE_TRACE_DEBUG0("ce_t4t_process_select_file_cmd ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd++; /* skip P2 */
 
@@ -383,7 +384,7 @@
   tCE_DATA ce_data;
   uint8_t xx;
 
-  CE_TRACE_DEBUG0("ce_t4t_process_select_app_cmd ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd++; /* skip P2 */
 
@@ -392,7 +393,7 @@
 
   /*CLS+INS+P1+P2+Lc+Data*/
   if (data_len > (p_c_apdu->len - T4T_CMD_MAX_HDR_SIZE)) {
-    CE_TRACE_ERROR0("Wrong length in ce_t4t_process_select_app_cmd");
+    LOG(ERROR) << StringPrintf("Wrong length in ce_t4t_process_select_app_cmd");
     android_errorWriteLog(0x534e4554, "115635871");
     ce_t4t_send_status(T4T_RSP_WRONG_LENGTH);
     GKI_freebuf(p_c_apdu);
@@ -433,8 +434,8 @@
     ce_cb.mem.t4t.status &= ~(CE_T4T_STATUS_WILDCARD_AID_SELECTED);
     ce_cb.mem.t4t.status |= CE_T4T_STATUS_REG_AID_SELECTED;
 
-    CE_TRACE_DEBUG4(
-        "ce_t4t_process_select_app_cmd (): Registered AID[%02X%02X%02X%02X...] "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Registered AID[%02X%02X%02X%02X...] "
         "is selected",
         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[0],
         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[1],
@@ -462,8 +463,7 @@
       ce_t4t_set_version_in_cc(T4T_VERSION_2_0);
       status_words = T4T_RSP_CMD_CMPLTED;
     } else {
-      CE_TRACE_DEBUG0(
-          "ce_t4t_process_select_app_cmd (): Not found matched AID");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Not found matched AID");
       status_words = T4T_RSP_NOT_FOUND;
     }
   } else if (ce_cb.mem.t4t.p_wildcard_aid_cback) {
@@ -478,12 +478,12 @@
     ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE;
     p_c_apdu = NULL;
 
-    CE_TRACE_DEBUG0(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "CET4T: Forward raw frame (SELECT APP) to wildcard AID handler");
     (*(ce_cb.mem.t4t.p_wildcard_aid_cback))(CE_T4T_RAW_FRAME_EVT, &ce_data);
   } else {
-    CE_TRACE_DEBUG0(
-        "ce_t4t_process_select_app_cmd (): Not found matched AID or not "
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Not found matched AID or not "
         "listening T4T NDEF");
     status_words = T4T_RSP_NOT_FOUND;
   }
@@ -497,7 +497,7 @@
       ce_cb.mem.t4t.status &= ~(CE_T4T_STATUS_WILDCARD_AID_SELECTED);
       ce_cb.mem.t4t.status |= CE_T4T_STATUS_T4T_APP_SELECTED;
 
-      CE_TRACE_DEBUG0("ce_t4t_process_select_app_cmd (): T4T CE App selected");
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("T4T CE App selected");
     }
 
     ce_t4t_send_status(status_words);
@@ -521,7 +521,7 @@
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
   tCE_DATA ce_data;
 
-  CE_TRACE_DEBUG1("ce_t4t_process_timeout () event=%d", p_tle->event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event=%d", p_tle->event);
 
   if (p_tle->event == NFC_TTYPE_CE_T4T_UPDATE) {
     if (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING) {
@@ -533,7 +533,7 @@
       p_t4t->status &= ~(CE_T4T_STATUS_NDEF_FILE_UPDATING);
     }
   } else {
-    CE_TRACE_ERROR1("ce_t4t_process_timeout () unknown event=%d", p_tle->event);
+    LOG(ERROR) << StringPrintf("unknown event=%d", p_tle->event);
   }
 }
 
@@ -564,16 +564,12 @@
 
   p_c_apdu = (NFC_HDR*)p_data->data.p_data;
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispCET4Tags(p_c_apdu, true);
-#endif
-
-  CE_TRACE_DEBUG1("ce_t4t_data_cback (): conn_id = 0x%02X", conn_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("conn_id = 0x%02X", conn_id);
 
   p_cmd = (uint8_t*)(p_c_apdu + 1) + p_c_apdu->offset;
 
   if (p_c_apdu->len == 0) {
-    CE_TRACE_ERROR0("Wrong length in ce_t4t_data_cback");
+    LOG(ERROR) << StringPrintf("Wrong length in ce_t4t_data_cback");
     android_errorWriteLog(0x534e4554, "115635871");
     ce_t4t_send_status(T4T_RSP_WRONG_LENGTH);
     if (p_c_apdu) GKI_freebuf(p_c_apdu);
@@ -607,7 +603,7 @@
           ce_t4t_process_select_app_cmd(p_cmd, p_c_apdu);
           return;
         } else {
-          CE_TRACE_ERROR0("Wrong length in select app cmd");
+          LOG(ERROR) << StringPrintf("Wrong length in select app cmd");
           android_errorWriteLog(0x534e4554, "115635871");
           ce_t4t_send_status(T4T_RSP_NOT_FOUND);
           if (p_c_apdu) GKI_freebuf(p_c_apdu);
@@ -619,7 +615,8 @@
 
   /* if registered AID is selected */
   if (ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED) {
-    CE_TRACE_DEBUG0("CET4T: Forward raw frame to registered AID");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("CET4T: Forward raw frame to registered AID");
 
     /* forward raw frame to upper layer */
     if (ce_cb.mem.t4t.selected_aid_idx < CE_T4T_MAX_REG_AID) {
@@ -635,7 +632,8 @@
       ce_t4t_send_status(T4T_RSP_NOT_FOUND);
     }
   } else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_WILDCARD_AID_SELECTED) {
-    CE_TRACE_DEBUG0("CET4T: Forward raw frame to wildcard AID handler");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("CET4T: Forward raw frame to wildcard AID handler");
 
     /* forward raw frame to upper layer */
     ce_data.raw_frame.status = p_data->data.status;
@@ -650,7 +648,7 @@
       if (select_type == T4T_CMD_P1_SELECT_BY_FILE_ID) {
         ce_t4t_process_select_file_cmd(p_cmd);
       } else {
-        CE_TRACE_ERROR1("CET4T: Bad P1 byte (0x%02X)", select_type);
+        LOG(ERROR) << StringPrintf("CET4T: Bad P1 byte (0x%02X)", select_type);
         ce_t4t_send_status(T4T_RSP_WRONG_PARAMS);
       }
     } else if (instruct == T4T_CMD_INS_READ_BINARY) {
@@ -673,19 +671,20 @@
             if (offset < max_file_size) {
               length = (uint8_t)(max_file_size - offset);
 
-              CE_TRACE_DEBUG2(
+              DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
                   "CET4T: length is reduced to %d by max_file_size (%d)",
                   length, max_file_size);
             } else {
-              CE_TRACE_ERROR2(
+              LOG(ERROR) << StringPrintf(
                   "CET4T: offset (%d) must be less than max_file_size (%d)",
                   offset, max_file_size);
               length = 0;
             }
           }
         } else {
-          CE_TRACE_ERROR2("CET4T: length (%d) must be less than MLe (%d)",
-                          length, CE_T4T_MAX_LE);
+          LOG(ERROR) << StringPrintf(
+              "CET4T: length (%d) must be less than MLe (%zu)", length,
+              CE_T4T_MAX_LE);
           length = 0;
         }
 
@@ -694,12 +693,12 @@
         else
           ce_t4t_send_status(T4T_RSP_WRONG_PARAMS);
       } else {
-        CE_TRACE_ERROR0("CET4T: File has not been selected");
+        LOG(ERROR) << StringPrintf("CET4T: File has not been selected");
         ce_t4t_send_status(T4T_RSP_CMD_NOT_ALLOWED);
       }
     } else if (instruct == T4T_CMD_INS_UPDATE_BINARY) {
       if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY) {
-        CE_TRACE_ERROR0("CET4T: No access right");
+        LOG(ERROR) << StringPrintf("CET4T: No access right");
         ce_t4t_send_status(T4T_RSP_CMD_NOT_ALLOWED);
       } else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED) {
         BE_STREAM_TO_UINT16(offset, p_cmd); /* Offset */
@@ -708,15 +707,16 @@
         /* check if valid parameters */
         if ((uint32_t)length <= CE_T4T_MAX_LC) {
           if (length + offset > ce_cb.mem.t4t.max_file_size) {
-            CE_TRACE_ERROR3(
+            LOG(ERROR) << StringPrintf(
                 "CET4T: length (%d) + offset (%d) must be less than "
                 "max_file_size (%d)",
                 length, offset, ce_cb.mem.t4t.max_file_size);
             length = 0;
           }
         } else {
-          CE_TRACE_ERROR2("CET4T: length (%d) must be less than MLc (%d)",
-                          length, CE_T4T_MAX_LC);
+          LOG(ERROR) << StringPrintf(
+              "CET4T: length (%d) must be less than MLc (%zu)", length,
+              CE_T4T_MAX_LC);
           length = 0;
         }
 
@@ -725,15 +725,16 @@
         else
           ce_t4t_send_status(T4T_RSP_WRONG_PARAMS);
       } else {
-        CE_TRACE_ERROR0("CET4T: NDEF File has not been selected");
+        LOG(ERROR) << StringPrintf("CET4T: NDEF File has not been selected");
         ce_t4t_send_status(T4T_RSP_CMD_NOT_ALLOWED);
       }
     } else {
-      CE_TRACE_ERROR1("CET4T: Unsupported Instruction byte (0x%02X)", instruct);
+      LOG(ERROR) << StringPrintf("CET4T: Unsupported Instruction byte (0x%02X)",
+                                 instruct);
       ce_t4t_send_status(T4T_RSP_INSTR_NOT_SUPPORTED);
     }
   } else {
-    CE_TRACE_ERROR0("CET4T: Application has not been selected");
+    LOG(ERROR) << StringPrintf("CET4T: Application has not been selected");
     ce_t4t_send_status(T4T_RSP_CMD_NOT_ALLOWED);
   }
 
@@ -752,7 +753,7 @@
 tNFC_STATUS ce_select_t4t(void) {
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
 
-  CE_TRACE_DEBUG0("ce_select_t4t ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   nfc_stop_quick_timer(&p_t4t->timer);
 
@@ -791,20 +792,20 @@
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
   uint8_t* p;
 
-  CE_TRACE_API3(
-      "CE_T4tSetLocalNDEFMsg () read_only=%d, ndef_msg_max=%d, ndef_msg_len=%d",
-      read_only, ndef_msg_max, ndef_msg_len);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("read_only=%d, ndef_msg_max=%d, ndef_msg_len=%d",
+                      read_only, ndef_msg_max, ndef_msg_len);
 
   if (!p_ndef_msg) {
     p_t4t->p_ndef_msg = NULL;
 
-    CE_TRACE_DEBUG0("CE_T4tSetLocalNDEFMsg (): T4T is disabled");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("T4T is disabled");
     return NFC_STATUS_OK;
   }
 
   if ((!read_only) && (!p_scratch_buf)) {
-    CE_TRACE_ERROR0(
-        "CE_T4tSetLocalNDEFMsg (): p_scratch_buf cannot be NULL if not "
+    LOG(ERROR) << StringPrintf(
+        "p_scratch_buf cannot be NULL if not "
         "read-only");
     return NFC_STATUS_FAILED;
   }
@@ -873,43 +874,43 @@
 
   /* Handle registering callback for wildcard AID (all AIDs) */
   if (aid_len == 0) {
-    CE_TRACE_API0(
-        "CE_T4tRegisterAID (): registering callback for wildcard AID ");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("registering callback for wildcard AID ");
 
     /* Check if a wildcard callback is already registered (only one is allowed)
      */
     if (p_t4t->p_wildcard_aid_cback != NULL) {
-      CE_TRACE_ERROR0(
-          "CE_T4tRegisterAID (): only one wildcard AID can be registered at "
+      LOG(ERROR) << StringPrintf(
+          "only one wildcard AID can be registered at "
           "time.");
       return CE_T4T_AID_HANDLE_INVALID;
     }
 
-    CE_TRACE_DEBUG1(
-        "CE_T4tRegisterAID (): handle 0x%02x registered (for wildcard AID)",
-        CE_T4T_WILDCARD_AID_HANDLE);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("handle 0x%02x registered (for wildcard AID)",
+                        CE_T4T_WILDCARD_AID_HANDLE);
     p_t4t->p_wildcard_aid_cback = p_cback;
     return CE_T4T_WILDCARD_AID_HANDLE;
   }
 
-  CE_TRACE_API5("CE_T4tRegisterAID () AID [%02X%02X%02X%02X...], %d bytes",
-                *p_aid, *(p_aid + 1), *(p_aid + 2), *(p_aid + 3), aid_len);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("AID [%02X%02X%02X%02X...], %d bytes", *p_aid,
+                      *(p_aid + 1), *(p_aid + 2), *(p_aid + 3), aid_len);
 
   if (aid_len > NFC_MAX_AID_LEN) {
-    CE_TRACE_ERROR1("CE_T4tRegisterAID (): AID is up to %d bytes",
-                    NFC_MAX_AID_LEN);
+    LOG(ERROR) << StringPrintf("AID is up to %d bytes", NFC_MAX_AID_LEN);
     return CE_T4T_AID_HANDLE_INVALID;
   }
 
   if (p_cback == NULL) {
-    CE_TRACE_ERROR0("CE_T4tRegisterAID (): callback must be provided");
+    LOG(ERROR) << StringPrintf("callback must be provided");
     return CE_T4T_AID_HANDLE_INVALID;
   }
 
   for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++) {
     if ((p_t4t->reg_aid[xx].aid_len == aid_len) &&
         (!(memcmp(p_t4t->reg_aid[xx].aid, p_aid, aid_len)))) {
-      CE_TRACE_ERROR0("CE_T4tRegisterAID (): already registered");
+      LOG(ERROR) << StringPrintf("already registered");
       return CE_T4T_AID_HANDLE_INVALID;
     }
   }
@@ -924,10 +925,11 @@
   }
 
   if (xx >= CE_T4T_MAX_REG_AID) {
-    CE_TRACE_ERROR0("CE_T4tRegisterAID (): No resource");
+    LOG(ERROR) << StringPrintf("No resource");
     return CE_T4T_AID_HANDLE_INVALID;
   } else {
-    CE_TRACE_DEBUG1("CE_T4tRegisterAID (): handle 0x%02x registered", xx);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("handle 0x%02x registered", xx);
   }
 
   return (xx);
@@ -945,14 +947,14 @@
 extern void CE_T4tDeregisterAID(tCE_T4T_AID_HANDLE aid_handle) {
   tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
 
-  CE_TRACE_API1("CE_T4tDeregisterAID () handle 0x%02x", aid_handle);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("handle 0x%02x", aid_handle);
 
   /* Check if deregistering wildcard AID */
   if (aid_handle == CE_T4T_WILDCARD_AID_HANDLE) {
     if (p_t4t->p_wildcard_aid_cback != NULL) {
       p_t4t->p_wildcard_aid_cback = NULL;
     } else {
-      CE_TRACE_ERROR0("CE_T4tDeregisterAID (): Invalid handle");
+      LOG(ERROR) << StringPrintf("Invalid handle");
     }
     return;
   }
@@ -960,129 +962,9 @@
   /* Deregister AID */
   if ((aid_handle >= CE_T4T_MAX_REG_AID) ||
       (p_t4t->reg_aid[aid_handle].aid_len == 0)) {
-    CE_TRACE_ERROR0("CE_T4tDeregisterAID (): Invalid handle");
+    LOG(ERROR) << StringPrintf("Invalid handle");
   } else {
     p_t4t->reg_aid[aid_handle].aid_len = 0;
     p_t4t->reg_aid[aid_handle].p_cback = NULL;
   }
 }
-
-/*******************************************************************************
-**
-** Function         CE_T4TTestSetCC
-**
-** Description      Set fields in Capability Container File for testing
-**
-** Returns          NFC_STATUS_OK if success
-**
-*******************************************************************************/
-tNFC_STATUS CE_T4TTestSetCC(uint16_t cc_len, uint8_t version, uint16_t max_le,
-                            uint16_t max_lc) {
-#if (CE_TEST_INCLUDED == TRUE)
-  tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
-  uint8_t* p;
-
-  CE_TRACE_DEBUG4(
-      "CE_T4TTestSetCC (): CCLen:0x%04X, Ver:0x%02X, MaxLe:0x%04X, "
-      "MaxLc:0x%04X",
-      cc_len, version, max_le, max_lc);
-
-  /* CC file */
-  p = p_t4t->cc_file;
-
-  if (cc_len != 0xFFFF) {
-    UINT16_TO_BE_STREAM(p, cc_len);
-  } else
-    p += 2;
-
-  if (version != 0xFF) {
-    mapping_aid_test_enabled = true;
-    if (version == T4T_VERSION_1_0)
-      ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x00;
-    else if (version == T4T_VERSION_2_0)
-      ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x01;
-    else /* Undefined version */
-      ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0xFF;
-
-    UINT8_TO_BE_STREAM(p, version);
-  } else {
-    mapping_aid_test_enabled = false;
-    p += 1;
-  }
-
-  if (max_le != 0xFFFF) {
-    UINT16_TO_BE_STREAM(p, max_le);
-  } else
-    p += 2;
-
-  if (max_lc != 0xFFFF) {
-    UINT16_TO_BE_STREAM(p, max_lc);
-  } else
-    p += 2;
-
-  return NFC_STATUS_OK;
-#else
-  return NFC_STATUS_FAILED;
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         CE_T4TTestSetNDEFCtrlTLV
-**
-** Description      Set fields in NDEF File Control TLV for testing
-**
-** Returns          NFC_STATUS_OK if success
-**
-*******************************************************************************/
-tNFC_STATUS CE_T4TTestSetNDEFCtrlTLV(uint8_t type, uint8_t length,
-                                     uint16_t file_id, uint16_t max_file_size,
-                                     uint8_t read_access,
-                                     uint8_t write_access) {
-#if (CE_TEST_INCLUDED == TRUE)
-  tCE_T4T_MEM* p_t4t = &ce_cb.mem.t4t;
-  uint8_t* p;
-
-  CE_TRACE_DEBUG6(
-      "CE_T4TTestSetNDEFCtrlTLV (): type:0x%02X, len:0x%02X, FileID:0x%04X, "
-      "MaxFile:0x%04X, RdAcc:0x%02X, WrAcc:0x%02X",
-      type, length, file_id, max_file_size, read_access, write_access);
-
-  /* NDEF File control TLV */
-  p = p_t4t->cc_file + T4T_FC_TLV_OFFSET_IN_CC;
-
-  if (type != 0xFF) {
-    UINT8_TO_BE_STREAM(p, type);
-  } else
-    p += 1;
-
-  if (length != 0xFF) {
-    UINT8_TO_BE_STREAM(p, length);
-  } else
-    p += 1;
-
-  if (file_id != 0xFFFF) {
-    UINT16_TO_BE_STREAM(p, file_id);
-  } else
-    p += 2;
-
-  if (max_file_size != 0xFFFF) {
-    UINT16_TO_BE_STREAM(p, max_file_size);
-  } else
-    p += 2;
-
-  if (read_access != 0xFF) {
-    UINT8_TO_BE_STREAM(p, read_access);
-  } else
-    p += 1;
-
-  if (write_access != 0xFF) {
-    UINT8_TO_BE_STREAM(p, write_access);
-  } else
-    p += 1;
-
-  return NFC_STATUS_OK;
-#else
-  return NFC_STATUS_FAILED;
-#endif
-}
diff --git a/src/nfc/tags/rw_i93.c b/src/nfc/tags/rw_i93.cc
similarity index 83%
rename from src/nfc/tags/rw_i93.c
rename to src/nfc/tags/rw_i93.cc
index 6c6f4bd..a8e095c 100644
--- a/src/nfc/tags/rw_i93.c
+++ b/src/nfc/tags/rw_i93.cc
@@ -24,14 +24,22 @@
  ******************************************************************************/
 #include <log/log.h>
 #include <string.h>
-#include "bt_types.h"
-#include "nfc_target.h"
-#include "trace_api.h"
 
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
+#include "nfc_target.h"
+
+#include "bt_types.h"
 #include "nfc_api.h"
 #include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
+#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* Response timeout     */
 #define RW_I93_TOUT_RESP 1000
@@ -81,16 +89,15 @@
   RW_I93_SUBSTATE_WAIT_LOCK_CC    /* lock block of CC                     */
 };
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* rw_i93_get_state_name(uint8_t state);
-static char* rw_i93_get_sub_state_name(uint8_t sub_state);
-static char* rw_i93_get_tag_name(uint8_t product_version);
-#endif
+static std::string rw_i93_get_state_name(uint8_t state);
+static std::string rw_i93_get_sub_state_name(uint8_t sub_state);
+static std::string rw_i93_get_tag_name(uint8_t product_version);
 
 static void rw_i93_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                               tNFC_CONN* p_data);
 void rw_i93_handle_error(tNFC_STATUS status);
 tNFC_STATUS rw_i93_send_cmd_get_sys_info(uint8_t* p_uid, uint8_t extra_flag);
+tNFC_STATUS rw_i93_send_cmd_get_ext_sys_info(uint8_t* p_uid);
 
 /*******************************************************************************
 **
@@ -108,7 +115,7 @@
     return;
   }
 
-  RW_TRACE_DEBUG0("rw_i93_get_product_version ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   memcpy(p_i93->uid, p_uid, I93_UID_BYTE_LEN);
 
@@ -144,6 +151,10 @@
       p_i93->product_version = RW_I93_STM_M24LR16E_R;
     else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR64E_R)
       p_i93->product_version = RW_I93_STM_M24LR64E_R;
+    else if (p_i93->ic_reference == I93_IC_REF_STM_ST25DVHIK)
+      p_i93->product_version = RW_I93_STM_ST25DVHIK;
+    else if (p_i93->ic_reference == I93_IC_REF_STM_ST25DV04K)
+      p_i93->product_version = RW_I93_STM_ST25DV04K;
     else {
       switch (p_i93->ic_reference & I93_IC_REF_STM_MASK) {
         case I93_IC_REF_STM_LRI1K:
@@ -170,12 +181,9 @@
     p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
   }
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG1("product_version = <%s>",
-                  rw_i93_get_tag_name(p_i93->product_version));
-#else
-  RW_TRACE_DEBUG1("product_version = %d", p_i93->product_version);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("product_version = <%s>",
+                      rw_i93_get_tag_name(p_i93->product_version).c_str());
 
   switch (p_i93->product_version) {
     case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
@@ -193,6 +201,90 @@
 
 /*******************************************************************************
 **
+** Function         rw_i93_process_ext_sys_info
+**
+** Description      Store extended system information of tag
+**
+** Returns          FALSE if retrying with protocol extension flag
+**
+*******************************************************************************/
+bool rw_i93_process_ext_sys_info(uint8_t* p_data, uint16_t length) {
+  uint8_t* p = p_data;
+  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
+  uint8_t uid[I93_UID_BYTE_LEN], *p_uid;
+
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
+
+  if (length < (I93_UID_BYTE_LEN + 1)) {
+    android_errorWriteLog(0x534e4554, "122316913");
+    return false;
+  }
+
+  STREAM_TO_UINT8(p_i93->info_flags, p);
+  length--;
+
+  p_uid = uid;
+  STREAM_TO_ARRAY8(p_uid, p);
+  length -= I93_UID_BYTE_LEN;
+
+  if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
+    if (length < 1) {
+      android_errorWriteLog(0x534e4554, "122316913");
+      return false;
+    }
+    STREAM_TO_UINT8(p_i93->dsfid, p);
+    length--;
+  }
+  if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
+    if (length < 1) {
+      android_errorWriteLog(0x534e4554, "122316913");
+      return false;
+    }
+    STREAM_TO_UINT8(p_i93->afi, p);
+    length--;
+  }
+  if (p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE) {
+    if (length < 3) {
+      android_errorWriteLog(0x534e4554, "122316913");
+      return false;
+    }
+    STREAM_TO_UINT16(p_i93->num_block, p);
+    length -= I93_INFO_16BIT_NUM_BLOCK_LEN;
+
+    /* it is one less than actual number of bytes */
+    p_i93->num_block += 1;
+
+    STREAM_TO_UINT8(p_i93->block_size, p);
+    length--;
+    /* it is one less than actual number of blocks */
+    p_i93->block_size = (p_i93->block_size & 0x1F) + 1;
+  }
+  if (p_i93->info_flags & I93_INFO_FLAG_IC_REF) {
+    if (length < 1) {
+      android_errorWriteLog(0x534e4554, "122316913");
+      return false;
+    }
+    STREAM_TO_UINT8(p_i93->ic_reference, p);
+    length--;
+
+    /* clear existing UID to set product version */
+    p_i93->uid[0] = 0x00;
+
+    /* store UID and get product version */
+    rw_i93_get_product_version(p_uid);
+
+    if (p_i93->uid[0] == I93_UID_FIRST_BYTE) {
+      if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
+        /* STM supports more than 2040 bytes */
+        p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
+      }
+    }
+  }
+  return true;
+}
+
+/*******************************************************************************
+**
 ** Function         rw_i93_process_sys_info
 **
 ** Description      Store system information of tag
@@ -205,7 +297,7 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   uint8_t uid[I93_UID_BYTE_LEN], *p_uid;
 
-  RW_TRACE_DEBUG0("rw_i93_process_sys_info ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (length < (I93_UID_BYTE_LEN + 1)) {
     android_errorWriteLog(0x534e4554, "121259048");
@@ -301,12 +393,20 @@
               return false;
             }
           }
-          return true;
         } else if ((p_i93->product_version == RW_I93_STM_LRI2K) &&
                    (p_i93->ic_reference == 0x21)) {
           /* workaround of byte order in memory size information */
           p_i93->num_block = 64;
           p_i93->block_size = 4;
+        } else if (!(p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE)) {
+          if (!(p_i93->intl_flags & RW_I93_FLAG_EXT_COMMANDS)) {
+            if (rw_i93_send_cmd_get_ext_sys_info(NULL) == NFC_STATUS_OK) {
+              /* STM supports more than 2040 bytes */
+              p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
+
+              return false;
+            }
+          }
         }
       }
     }
@@ -328,7 +428,7 @@
 bool rw_i93_check_sys_info_prot_ext(uint8_t error_code) {
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
 
-  RW_TRACE_DEBUG0("rw_i93_check_sys_info_prot_ext ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) &&
       (p_i93->sent_cmd == I93_CMD_GET_SYS_INFO) &&
@@ -351,7 +451,7 @@
 **
 *******************************************************************************/
 void rw_i93_send_to_upper(NFC_HDR* p_resp) {
-  uint8_t *p = (uint8_t *)(p_resp + 1) + p_resp->offset, *p_uid;
+  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
   uint16_t length = p_resp->len;
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
@@ -359,7 +459,7 @@
   uint8_t flags;
   NFC_HDR* p_buff;
 
-  RW_TRACE_DEBUG0("rw_i93_send_to_upper ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   STREAM_TO_UINT8(flags, p);
   length--;
@@ -399,8 +499,11 @@
       break;
 
     case I93_CMD_READ_SINGLE_BLOCK:
+    case I93_CMD_EXT_READ_SINGLE_BLOCK:
     case I93_CMD_READ_MULTI_BLOCK:
+    case I93_CMD_EXT_READ_MULTI_BLOCK:
     case I93_CMD_GET_MULTI_BLK_SEC:
+    case I93_CMD_EXT_GET_MULTI_BLK_SEC:
 
       /* forward tag data or security status */
       p_buff = (NFC_HDR*)GKI_getbuf((uint16_t)(length + NFC_HDR_SIZE));
@@ -426,8 +529,11 @@
       break;
 
     case I93_CMD_WRITE_SINGLE_BLOCK:
+    case I93_CMD_EXT_WRITE_SINGLE_BLOCK:
     case I93_CMD_LOCK_BLOCK:
+    case I93_CMD_EXT_LOCK_BLOCK:
     case I93_CMD_WRITE_MULTI_BLOCK:
+    case I93_CMD_EXT_WRITE_MULTI_BLOCK:
     case I93_CMD_SELECT:
     case I93_CMD_RESET_TO_READY:
     case I93_CMD_WRITE_AFI:
@@ -464,6 +570,28 @@
       }
       break;
 
+    case I93_CMD_EXT_GET_SYS_INFO:
+
+      if (rw_i93_process_ext_sys_info(p, length)) {
+        rw_data.i93_sys_info.status = NFC_STATUS_OK;
+        rw_data.i93_sys_info.info_flags = p_i93->info_flags;
+        rw_data.i93_sys_info.dsfid = p_i93->dsfid;
+        rw_data.i93_sys_info.afi = p_i93->afi;
+        rw_data.i93_sys_info.num_block = p_i93->num_block;
+        rw_data.i93_sys_info.block_size = p_i93->block_size;
+        rw_data.i93_sys_info.IC_reference = p_i93->ic_reference;
+
+        memcpy(rw_data.i93_sys_info.uid, p_i93->uid, I93_UID_BYTE_LEN);
+
+        event = RW_I93_SYS_INFO_EVT;
+      } else {
+        /* retrying with protocol extension flag or with extended sys info
+         * command */
+        p_i93->state = RW_I93_STATE_BUSY;
+        return;
+      }
+      break;
+
     default:
       break;
   }
@@ -472,7 +600,7 @@
   if (event != RW_I93_MAX_EVT) {
     (*(rw_cb.p_cback))(event, &rw_data);
   } else {
-    RW_TRACE_ERROR0("rw_i93_send_to_upper (): Invalid response");
+    LOG(ERROR) << StringPrintf("Invalid response");
   }
 }
 
@@ -486,10 +614,6 @@
 **
 *******************************************************************************/
 bool rw_i93_send_to_lower(NFC_HDR* p_msg) {
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispRWI93Tag(p_msg, false, 0x00);
-#endif
-
   /* store command for retransmitting */
   if (rw_cb.tcb.i93.p_retry_cmd) {
     GKI_freebuf(rw_cb.tcb.i93.p_retry_cmd);
@@ -504,7 +628,7 @@
   }
 
   if (NFC_SendData(NFC_RF_CONN_ID, p_msg) != NFC_STATUS_OK) {
-    RW_TRACE_ERROR0("rw_i93_send_to_lower (): NFC_SendData () failed");
+    LOG(ERROR) << StringPrintf("failed");
     return false;
   }
 
@@ -528,13 +652,13 @@
   NFC_HDR* p_cmd;
   uint8_t *p, flags;
 
-  RW_TRACE_DEBUG2("rw_i93_send_cmd_inventory () including_afi:%d, AFI:0x%02X",
-                  including_afi, afi);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("including_afi:%d, AFI:0x%02X", including_afi, afi);
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_inventory (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -589,12 +713,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_stay_quiet ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_stay_quiet (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -639,13 +763,12 @@
   NFC_HDR* p_cmd;
   uint8_t *p, flags;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_read_single_block ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_read_single_block (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -665,12 +788,17 @@
   UINT8_TO_STREAM(p, flags);
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_READ_SINGLE_BLOCK);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT8_TO_STREAM(p, I93_CMD_EXT_READ_SINGLE_BLOCK);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_READ_SINGLE_BLOCK);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
 
-  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
+      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
     UINT16_TO_STREAM(p, block_number); /* Block number */
     p_cmd->len++;
   } else {
@@ -678,7 +806,10 @@
   }
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_SINGLE_BLOCK;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_READ_SINGLE_BLOCK;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_SINGLE_BLOCK;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -699,13 +830,12 @@
   NFC_HDR* p_cmd;
   uint8_t *p, flags;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_write_single_block ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_write_single_block (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -732,12 +862,17 @@
   UINT8_TO_STREAM(p, flags);
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_WRITE_SINGLE_BLOCK);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT8_TO_STREAM(p, I93_CMD_EXT_WRITE_SINGLE_BLOCK);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_WRITE_SINGLE_BLOCK);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
 
-  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
+      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
     UINT16_TO_STREAM(p, block_number); /* Block number */
     p_cmd->len++;
   } else {
@@ -748,7 +883,10 @@
   ARRAY_TO_STREAM(p, p_data, rw_cb.tcb.i93.block_size);
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_SINGLE_BLOCK;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_WRITE_SINGLE_BLOCK;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_SINGLE_BLOCK;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -771,12 +909,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_block ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_lock_block (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -798,14 +936,27 @@
   }
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_LOCK_BLOCK);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT8_TO_STREAM(p, I93_CMD_EXT_LOCK_BLOCK);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_LOCK_BLOCK);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
-  UINT8_TO_STREAM(p, block_number);       /* Block number */
+
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT16_TO_STREAM(p, block_number); /* Block number */
+    p_cmd->len++;
+  } else {
+    UINT8_TO_STREAM(p, block_number); /* Block number */
+  }
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_BLOCK;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_LOCK_BLOCK;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_BLOCK;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -826,13 +977,12 @@
   NFC_HDR* p_cmd;
   uint8_t *p, flags;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_read_multi_blocks ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_read_multi_blocks (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -844,29 +994,44 @@
   flags =
       (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
 
-  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
     flags |= I93_FLAG_PROT_EXT_YES;
+  }
 
   UINT8_TO_STREAM(p, flags);
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_READ_MULTI_BLOCK);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT8_TO_STREAM(p, I93_CMD_EXT_READ_MULTI_BLOCK);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_READ_MULTI_BLOCK);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
 
-  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
+      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
     UINT16_TO_STREAM(p, first_block_number); /* First block number */
     p_cmd->len++;
   } else {
     UINT8_TO_STREAM(p, first_block_number); /* First block number */
   }
 
-  UINT8_TO_STREAM(
-      p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT16_TO_STREAM(
+        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
+    p_cmd->len++;
+  } else {
+    UINT8_TO_STREAM(
+        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
+  }
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_MULTI_BLOCK;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_READ_MULTI_BLOCK;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_MULTI_BLOCK;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -882,19 +1047,18 @@
 ** Returns          tNFC_STATUS
 **
 *******************************************************************************/
-tNFC_STATUS rw_i93_send_cmd_write_multi_blocks(uint8_t first_block_number,
+tNFC_STATUS rw_i93_send_cmd_write_multi_blocks(uint16_t first_block_number,
                                                uint16_t number_blocks,
                                                uint8_t* p_data) {
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_write_multi_blocks ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_write_multi_blocks (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -907,11 +1071,25 @@
                       RW_I93_FLAG_DATA_RATE));
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_WRITE_MULTI_BLOCK);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    INT8_TO_STREAM(p, I93_CMD_EXT_WRITE_MULTI_BLOCK);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_WRITE_MULTI_BLOCK);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
-  UINT8_TO_STREAM(p, first_block_number); /* First block number */
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT16_TO_STREAM(p, first_block_number); /* Block number */
+    UINT16_TO_STREAM(
+        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
+    p_cmd->len += 2;
+  } else {
+    UINT8_TO_STREAM(p, first_block_number); /* Block number */
+    UINT8_TO_STREAM(
+        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
+  }
+
   UINT8_TO_STREAM(
       p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
 
@@ -919,7 +1097,10 @@
   ARRAY_TO_STREAM(p, p_data, number_blocks * rw_cb.tcb.i93.block_size);
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_MULTI_BLOCK;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_WRITE_MULTI_BLOCK;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_MULTI_BLOCK;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -939,12 +1120,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_select ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_select (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -983,13 +1164,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_reset_to_ready ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_reset_to_ready (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1028,12 +1208,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_write_afi ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_write_afi (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1073,12 +1253,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_afi ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_lock_afi (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1117,12 +1297,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_write_dsfid ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_write_dsfid (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1162,12 +1342,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_dsfid ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_lock_dsfid (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1195,6 +1375,59 @@
 
 /*******************************************************************************
 **
+** Function         rw_i93_send_cmd_get_ext_sys_info
+**
+** Description      Send Get Extended System Information Request to VICC
+**
+** Returns          tNFC_STATUS
+**
+*******************************************************************************/
+tNFC_STATUS rw_i93_send_cmd_get_ext_sys_info(uint8_t* p_uid) {
+  NFC_HDR* p_cmd;
+  uint8_t* p;
+
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
+
+  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
+
+  if (!p_cmd) {
+    DLOG_IF(INFO, nfc_debug_enabled) << __func__ << "Cannot allocate buffer";
+    return NFC_STATUS_NO_BUFFERS;
+  }
+
+  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
+  p_cmd->len = 11;
+  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
+
+  /* Flags */
+  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
+                      RW_I93_FLAG_DATA_RATE));
+
+  /* Command Code */
+  UINT8_TO_STREAM(p, I93_CMD_EXT_GET_SYS_INFO);
+
+  /* Parameters request field */
+  UINT8_TO_STREAM(p,
+                  (I93_INFO_FLAG_MOI | I93_INFO_FLAG_DSFID | I93_INFO_FLAG_AFI |
+                   I93_INFO_FLAG_MEM_SIZE | I93_INFO_FLAG_IC_REF));
+
+  /* Parameters */
+  if (p_uid) {
+    ARRAY8_TO_STREAM(p, p_uid); /* UID */
+  } else {
+    ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
+  }
+
+  if (rw_i93_send_to_lower(p_cmd)) {
+    rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_GET_SYS_INFO;
+    return NFC_STATUS_OK;
+  } else {
+    return NFC_STATUS_FAILED;
+  }
+}
+
+/*******************************************************************************
+**
 ** Function         rw_i93_send_cmd_get_sys_info
 **
 ** Description      Send Get System Information Request to VICC
@@ -1206,12 +1439,12 @@
   NFC_HDR* p_cmd;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_get_sys_info ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0("rw_i93_send_cmd_get_sys_info (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1255,13 +1488,12 @@
   NFC_HDR* p_cmd;
   uint8_t *p, flags;
 
-  RW_TRACE_DEBUG0("rw_i93_send_cmd_get_multi_block_sec ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_cmd) {
-    RW_TRACE_ERROR0(
-        "rw_i93_send_cmd_get_multi_block_sec (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return NFC_STATUS_NO_BUFFERS;
   }
 
@@ -1279,12 +1511,17 @@
   UINT8_TO_STREAM(p, flags);
 
   /* Command Code */
-  UINT8_TO_STREAM(p, I93_CMD_GET_MULTI_BLK_SEC);
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
+    UINT8_TO_STREAM(p, I93_CMD_EXT_GET_MULTI_BLK_SEC);
+  } else {
+    UINT8_TO_STREAM(p, I93_CMD_GET_MULTI_BLK_SEC);
+  }
 
   /* Parameters */
   ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
 
-  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
+  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
+      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
     UINT16_TO_STREAM(p, first_block_number); /* First block number */
     UINT16_TO_STREAM(
         p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
@@ -1296,7 +1533,10 @@
   }
 
   if (rw_i93_send_to_lower(p_cmd)) {
-    rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_MULTI_BLK_SEC;
+    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_GET_MULTI_BLK_SEC;
+    else
+      rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_MULTI_BLK_SEC;
     return NFC_STATUS_OK;
   } else {
     return NFC_STATUS_FAILED;
@@ -1318,7 +1558,7 @@
   uint16_t first_block;
   uint16_t num_block;
 
-  RW_TRACE_DEBUG0("rw_i93_get_next_blocks ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   first_block = offset / p_i93->block_size;
 
@@ -1372,11 +1612,12 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   uint16_t num_blocks;
 
-  RW_TRACE_DEBUG0("rw_i93_get_next_block_sec ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (p_i93->num_block <= p_i93->rw_offset) {
-    RW_TRACE_ERROR2("rw_offset(0x%x) must be less than num_block(0x%x)",
-                    p_i93->rw_offset, p_i93->num_block);
+    LOG(ERROR) << StringPrintf(
+        "rw_offset(0x%x) must be less than num_block(0x%x)", p_i93->rw_offset,
+        p_i93->num_block);
     return NFC_STATUS_FAILED;
   }
 
@@ -1385,6 +1626,8 @@
   if (num_blocks > RW_I93_GET_MULTI_BLOCK_SEC_SIZE)
     num_blocks = RW_I93_GET_MULTI_BLOCK_SEC_SIZE;
 
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << __func__ << std::hex << rw_cb.tcb.i93.intl_flags;
   return rw_i93_send_cmd_get_multi_block_sec(p_i93->rw_offset, num_blocks);
 }
 
@@ -1405,20 +1648,16 @@
 **
 *******************************************************************************/
 void rw_i93_sm_detect_ndef(NFC_HDR* p_resp) {
-  uint8_t *p = (uint8_t *)(p_resp + 1) + p_resp->offset, *p_uid;
+  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
   uint8_t flags, u8 = 0, cc[4];
   uint16_t length = p_resp->len, xx, block, first_block, last_block, num_blocks;
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_i93_sm_detect_ndef () sub_state:%s (0x%x)",
-                  rw_i93_get_sub_state_name(p_i93->sub_state),
-                  p_i93->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_i93_sm_detect_ndef () sub_state:0x%x", p_i93->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (0x%x)",
+      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
 
   if (length == 0) {
     android_errorWriteLog(0x534e4554, "121260197");
@@ -1434,7 +1673,8 @@
       /* This STM tag supports more than 2040 bytes */
       p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
     } else {
-      RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Got error flags (0x%02x)", flags);
       rw_i93_handle_error(NFC_STATUS_FAILED);
     }
     return;
@@ -1454,7 +1694,8 @@
 
       if (u8 != I93_DFS_UNSUPPORTED) {
         /* if Data Storage Format is unknown */
-        RW_TRACE_DEBUG1("Got unknown DSFID (0x%02x)", u8);
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Got unknown DSFID (0x%02x)", u8);
         rw_i93_handle_error(NFC_STATUS_FAILED);
       } else {
         /* get system information to get memory size */
@@ -1478,7 +1719,8 @@
       }
 
       if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
-        RW_TRACE_DEBUG0("Unable to get tag memory size");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Unable to get tag memory size");
         rw_i93_handle_error(status);
       } else {
         /* read CC in the first block */
@@ -1514,16 +1756,14 @@
       **       : Bit 2:More than 2040 bytes are supported [STM]
       */
 
-      RW_TRACE_DEBUG4(
-          "rw_i93_sm_detect_ndef (): cc: 0x%02X 0x%02X 0x%02X 0x%02X", cc[0],
-          cc[1], cc[2], cc[3]);
-      RW_TRACE_DEBUG2(
-          "rw_i93_sm_detect_ndef (): Total blocks:0x%04X, Block size:0x%02X",
-          p_i93->num_block, p_i93->block_size);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "cc: 0x%02X 0x%02X 0x%02X 0x%02X", cc[0], cc[1], cc[2], cc[3]);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Total blocks:0x%04X, Block size:0x%02X",
+                          p_i93->num_block, p_i93->block_size);
 
-      if ((cc[0] == I93_ICODE_CC_MAGIC_NUMER) &&
-          ((cc[3] & I93_STM_CC_OVERFLOW_MASK) ||
-           (cc[2] * 8) == (p_i93->num_block * p_i93->block_size))) {
+      if ((cc[0] == I93_ICODE_CC_MAGIC_NUMER_E1) ||
+          (cc[0] == I93_ICODE_CC_MAGIC_NUMER_E2)) {
         if ((cc[1] & I93_ICODE_CC_READ_ACCESS_MASK) ==
             I93_ICODE_CC_READ_ACCESS_GRANTED) {
           if ((cc[1] & I93_ICODE_CC_WRITE_ACCESS_MASK) !=
@@ -1535,6 +1775,9 @@
             /* tag supports read multi blocks command */
             p_i93->intl_flags |= RW_I93_FLAG_READ_MULTI_BLOCK;
           }
+          if (cc[0] == I93_ICODE_CC_MAGIC_NUMER_E2) {
+            p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
+          }
           status = NFC_STATUS_OK;
         }
       }
@@ -1578,7 +1821,8 @@
             p_i93->tlv_type = I93_ICODE_TLV_TYPE_TERM;
             break;
           } else {
-            RW_TRACE_DEBUG1("Invalid type: 0x%02x", *(p + xx));
+            DLOG_IF(INFO, nfc_debug_enabled)
+                << StringPrintf("Invalid type: 0x%02x", *(p + xx));
             rw_i93_handle_error(NFC_STATUS_FAILED);
             return;
           }
@@ -1773,9 +2017,9 @@
       p_i93->state = RW_I93_STATE_IDLE;
       p_i93->sent_cmd = 0;
 
-      RW_TRACE_DEBUG3("NDEF cur_size(%d),max_size (%d), flags (0x%x)",
-                      rw_data.ndef.cur_size, rw_data.ndef.max_size,
-                      rw_data.ndef.flags);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "NDEF cur_size(%d),max_size (%d), flags (0x%x)",
+          rw_data.ndef.cur_size, rw_data.ndef.max_size, rw_data.ndef.flags);
 
       (*(rw_cb.p_cback))(RW_I93_NDEF_DETECT_EVT, &rw_data);
       break;
@@ -1801,7 +2045,7 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
 
-  RW_TRACE_DEBUG0("rw_i93_sm_read_ndef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (length == 0) {
     android_errorWriteLog(0x534e4554, "122035770");
@@ -1813,7 +2057,8 @@
   length--;
 
   if (flags & I93_FLAG_ERROR_DETECTED) {
-    RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("Got error flags (0x%02x)", flags);
     rw_i93_handle_error(NFC_STATUS_FAILED);
     return;
   }
@@ -1859,13 +2104,15 @@
     p_i93->state = RW_I93_STATE_IDLE;
     p_i93->sent_cmd = 0;
 
-    RW_TRACE_DEBUG2("NDEF read complete read (%d)/total (%d)", p_resp->len,
-                    p_i93->ndef_length);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NDEF read complete read (%d)/total (%d)", p_resp->len,
+                        p_i93->ndef_length);
 
     (*(rw_cb.p_cback))(RW_I93_NDEF_READ_CPLT_EVT, &rw_data);
   } else {
-    RW_TRACE_DEBUG2("NDEF read segment read (%d)/total (%d)", p_resp->len,
-                    p_i93->ndef_length);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("NDEF read segment read (%d)/total (%d)", p_resp->len,
+                        p_i93->ndef_length);
 
     if (p_resp->len > 0) {
       (*(rw_cb.p_cback))(RW_I93_NDEF_READ_EVT, &rw_data);
@@ -1900,13 +2147,9 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_i93_sm_update_ndef () sub_state:%s (0x%x)",
-                  rw_i93_get_sub_state_name(p_i93->sub_state),
-                  p_i93->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_i93_sm_update_ndef () sub_state:0x%x", p_i93->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (0x%x)",
+      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
 
   if (length == 0 || p_i93->block_size > I93_MAX_BLOCK_LENGH) {
     android_errorWriteLog(0x534e4554, "122320256");
@@ -1925,7 +2168,8 @@
         (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
       /* ignore error */
     } else {
-      RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Got error flags (0x%02x)", flags);
       rw_i93_handle_error(NFC_STATUS_FAILED);
       return;
     }
@@ -2136,9 +2380,9 @@
           }
         }
       } else {
-        RW_TRACE_DEBUG3("NDEF update complete, %d bytes, (%d-%d)",
-                        p_i93->ndef_length, p_i93->ndef_tlv_start_offset,
-                        p_i93->ndef_tlv_last_offset);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "NDEF update complete, %d bytes, (%d-%d)", p_i93->ndef_length,
+            p_i93->ndef_tlv_start_offset, p_i93->ndef_tlv_last_offset);
 
         p_i93->state = RW_I93_STATE_IDLE;
         p_i93->sent_cmd = 0;
@@ -2169,20 +2413,16 @@
 **
 *******************************************************************************/
 void rw_i93_sm_format(NFC_HDR* p_resp) {
-  uint8_t *p = (uint8_t *)(p_resp + 1) + p_resp->offset, *p_uid;
+  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
   uint8_t flags;
   uint16_t length = p_resp->len, xx, block_number;
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_i93_sm_format () sub_state:%s (0x%x)",
-                  rw_i93_get_sub_state_name(p_i93->sub_state),
-                  p_i93->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_i93_sm_format () sub_state:0x%x", p_i93->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (0x%x)",
+      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
 
   STREAM_TO_UINT8(flags, p);
   length--;
@@ -2200,7 +2440,8 @@
       p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
       return;
     } else {
-      RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Got error flags (0x%02x)", flags);
       rw_i93_handle_error(NFC_STATUS_FAILED);
       return;
     }
@@ -2246,7 +2487,8 @@
       }
 
       if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
-        RW_TRACE_DEBUG0("Unable to get tag memory size");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Unable to get tag memory size");
         rw_i93_handle_error(status);
       } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) {
         if (rw_i93_send_cmd_write_dsfid(I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) {
@@ -2392,7 +2634,7 @@
       p_i93->p_update_data = (uint8_t*)GKI_getbuf(RW_I93_FORMAT_DATA_LEN);
 
       if (!p_i93->p_update_data) {
-        RW_TRACE_ERROR0("rw_i93_sm_format (): Cannot allocate buffer");
+        LOG(ERROR) << StringPrintf("Cannot allocate buffer");
         rw_i93_handle_error(NFC_STATUS_FAILED);
         break;
       }
@@ -2400,7 +2642,7 @@
       p = p_i93->p_update_data;
 
       /* Capability Container */
-      *(p++) = I93_ICODE_CC_MAGIC_NUMER; /* magic number */
+      *(p++) = I93_ICODE_CC_MAGIC_NUMER_E1; /* magic number */
       *(p++) = 0x40;                     /* version 1.0, read/write */
 
       /* if memory size is less than 2048 bytes */
@@ -2508,14 +2750,9 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_i93_sm_set_read_only () sub_state:%s (0x%x)",
-                  rw_i93_get_sub_state_name(p_i93->sub_state),
-                  p_i93->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_i93_sm_set_read_only () sub_state:0x%x",
-                  p_i93->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (0x%x)",
+      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
 
   STREAM_TO_UINT8(flags, p);
   length--;
@@ -2528,7 +2765,8 @@
         (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
       /* ignore error */
     } else {
-      RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("Got error flags (0x%02x)", flags);
       rw_i93_handle_error(NFC_STATUS_FAILED);
       return;
     }
@@ -2621,8 +2859,8 @@
   tRW_DATA rw_data;
   tRW_EVENT event;
 
-  RW_TRACE_DEBUG2("rw_i93_handle_error (): status:0x%02X, state:0x%X", status,
-                  p_i93->state);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("status:0x%02X, state:0x%X", status, p_i93->state);
 
   nfc_stop_quick_timer(&p_i93->timer);
 
@@ -2709,15 +2947,14 @@
 void rw_i93_process_timeout(TIMER_LIST_ENT* p_tle) {
   NFC_HDR* p_buf;
 
-  RW_TRACE_DEBUG1("rw_i93_process_timeout () event=%d", p_tle->event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event=%d", p_tle->event);
 
   if (p_tle->event == NFC_TTYPE_RW_I93_RESPONSE) {
     if ((rw_cb.tcb.i93.retry_count < RW_MAX_RETRIES) &&
         (rw_cb.tcb.i93.p_retry_cmd) &&
         (rw_cb.tcb.i93.sent_cmd != I93_CMD_STAY_QUIET)) {
       rw_cb.tcb.i93.retry_count++;
-      RW_TRACE_ERROR1("rw_i93_process_timeout (): retry_count = %d",
-                      rw_cb.tcb.i93.retry_count);
+      LOG(ERROR) << StringPrintf("retry_count = %d", rw_cb.tcb.i93.retry_count);
 
       p_buf = rw_cb.tcb.i93.p_retry_cmd;
       rw_cb.tcb.i93.p_retry_cmd = NULL;
@@ -2735,7 +2972,7 @@
     }
     rw_i93_handle_error(NFC_STATUS_TIMEOUT);
   } else {
-    RW_TRACE_ERROR1("rw_i93_process_timeout () unknown event=%d", p_tle->event);
+    LOG(ERROR) << StringPrintf("unknown event=%d", p_tle->event);
   }
 }
 
@@ -2748,17 +2985,15 @@
 ** Returns          none
 **
 *******************************************************************************/
-static void rw_i93_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                              tNFC_CONN* p_data) {
+static void rw_i93_data_cback(__attribute__((unused)) uint8_t conn_id,
+                              tNFC_CONN_EVT event, tNFC_CONN* p_data) {
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   NFC_HDR* p_resp;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
   uint8_t begin_state = p_i93->state;
-#endif
 
-  RW_TRACE_DEBUG1("rw_i93_data_cback () event = 0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
 
   if ((event == NFC_DEACTIVATE_CEVT) || (event == NFC_ERROR_CEVT) ||
       ((event == NFC_DATA_CEVT) && (p_data->status != NFC_STATUS_OK))) {
@@ -2768,8 +3003,7 @@
       if ((p_i93->retry_count < RW_MAX_RETRIES) && (p_i93->p_retry_cmd)) {
         p_i93->retry_count++;
 
-        RW_TRACE_ERROR1("rw_i93_data_cback (): retry_count = %d",
-                        p_i93->retry_count);
+        LOG(ERROR) << StringPrintf("retry_count = %d", p_i93->retry_count);
 
         p_resp = p_i93->p_retry_cmd;
         p_i93->p_retry_cmd = NULL;
@@ -2814,16 +3048,9 @@
     p_i93->retry_count = 0;
   }
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispRWI93Tag(p_resp, true, p_i93->sent_cmd);
-#endif
-
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("RW I93 state: <%s (%d)>",
-                  rw_i93_get_state_name(p_i93->state), p_i93->state);
-#else
-  RW_TRACE_DEBUG1("RW I93 state: %d", p_i93->state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "RW I93 state: <%s (%d)>", rw_i93_get_state_name(p_i93->state).c_str(),
+      p_i93->state);
 
   switch (p_i93->state) {
     case RW_I93_STATE_IDLE:
@@ -2881,18 +3108,17 @@
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_i93_data_cback (): invalid state=%d", p_i93->state);
+      LOG(ERROR) << StringPrintf("invalid state=%d", p_i93->state);
       GKI_freebuf(p_resp);
       break;
   }
 
-#if (BT_TRACE_VERBOSE == TRUE)
   if (begin_state != p_i93->state) {
-    RW_TRACE_DEBUG2("RW I93 state changed:<%s> -> <%s>",
-                    rw_i93_get_state_name(begin_state),
-                    rw_i93_get_state_name(p_i93->state));
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW I93 state changed:<%s> -> <%s>",
+                        rw_i93_get_state_name(begin_state).c_str(),
+                        rw_i93_get_state_name(p_i93->state).c_str());
   }
-#endif
 }
 
 /*******************************************************************************
@@ -2908,7 +3134,7 @@
   tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
   uint8_t uid[I93_UID_BYTE_LEN], *p;
 
-  RW_TRACE_DEBUG0("rw_i93_select ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   NFC_SetStaticRfCback(rw_i93_data_cback);
 
@@ -2941,13 +3167,12 @@
 tNFC_STATUS RW_I93Inventory(bool including_afi, uint8_t afi, uint8_t* p_uid) {
   tNFC_STATUS status;
 
-  RW_TRACE_API2("RW_I93Inventory (), including_afi:%d, AFI:0x%02X",
-                including_afi, afi);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf(", including_afi:%d, AFI:0x%02X", including_afi, afi);
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93Inventory ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -2977,12 +3202,11 @@
 tNFC_STATUS RW_I93StayQuiet(void) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93StayQuiet ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93StayQuiet ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3011,12 +3235,12 @@
 tNFC_STATUS RW_I93ReadSingleBlock(uint16_t block_number) {
   tNFC_STATUS status;
 
-  RW_TRACE_API1("RW_I93ReadSingleBlock () block_number:0x%02X", block_number);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("block_number:0x%02X", block_number);
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93ReadSingleBlock ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3047,17 +3271,16 @@
 tNFC_STATUS RW_I93WriteSingleBlock(uint16_t block_number, uint8_t* p_data) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93WriteSingleBlock ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93WriteSingleBlock ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
   if (rw_cb.tcb.i93.block_size == 0) {
-    RW_TRACE_ERROR0("RW_I93WriteSingleBlock ():Block size is unknown");
+    LOG(ERROR) << StringPrintf("Block size is unknown");
     return NFC_STATUS_FAILED;
   }
 
@@ -3086,12 +3309,11 @@
 tNFC_STATUS RW_I93LockBlock(uint8_t block_number) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93LockBlock ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93LockBlock ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3121,12 +3343,11 @@
                                      uint16_t number_blocks) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93ReadMultipleBlocks ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93ReadMultipleBlocks ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3152,21 +3373,20 @@
 **                  NFC_STATUS_FAILED if other error
 **
 *******************************************************************************/
-tNFC_STATUS RW_I93WriteMultipleBlocks(uint8_t first_block_number,
+tNFC_STATUS RW_I93WriteMultipleBlocks(uint16_t first_block_number,
                                       uint16_t number_blocks, uint8_t* p_data) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93WriteMultipleBlocks ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93WriteMultipleBlocks ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
   if (rw_cb.tcb.i93.block_size == 0) {
-    RW_TRACE_ERROR0("RW_I93WriteSingleBlock ():Block size is unknown");
+    LOG(ERROR) << StringPrintf("Block size is unknown");
     return NFC_STATUS_FAILED;
   }
 
@@ -3201,11 +3421,11 @@
 tNFC_STATUS RW_I93Select(uint8_t* p_uid) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93Select ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1("RW_I93Select ():Unable to start command at state (0x%X)",
-                    rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3215,7 +3435,7 @@
       rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
     }
   } else {
-    RW_TRACE_ERROR0("RW_I93Select ():UID shall be provided");
+    LOG(ERROR) << StringPrintf("UID shall be provided");
     status = NFC_STATUS_FAILED;
   }
 
@@ -3239,12 +3459,11 @@
 tNFC_STATUS RW_I93ResetToReady(void) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93ResetToReady ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93ResetToReady ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3273,11 +3492,11 @@
 tNFC_STATUS RW_I93WriteAFI(uint8_t afi) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93WriteAFI ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1("RW_I93WriteAFI ():Unable to start command at state (0x%X)",
-                    rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3306,11 +3525,11 @@
 tNFC_STATUS RW_I93LockAFI(void) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93LockAFI ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1("RW_I93LockAFI ():Unable to start command at state (0x%X)",
-                    rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3339,12 +3558,11 @@
 tNFC_STATUS RW_I93WriteDSFID(uint8_t dsfid) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93WriteDSFID ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93WriteDSFID ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3373,12 +3591,11 @@
 tNFC_STATUS RW_I93LockDSFID(void) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93LockDSFID ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93LockDSFID ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3407,12 +3624,11 @@
 tNFC_STATUS RW_I93GetSysInfo(uint8_t* p_uid) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93GetSysInfo ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93GetSysInfo ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
   }
 
@@ -3448,11 +3664,11 @@
                                               uint16_t number_blocks) {
   tNFC_STATUS status;
 
-  RW_TRACE_API0("RW_I93GetMultiBlockSecurityStatus ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93GetMultiBlockSecurityStatus ():Unable to start command at state "
+    LOG(ERROR) << StringPrintf(
+        "Unable to start command at state "
         "(0x%X)",
         rw_cb.tcb.i93.state);
     return NFC_STATUS_BUSY;
@@ -3483,12 +3699,11 @@
   tNFC_STATUS status;
   tRW_I93_RW_SUBSTATE sub_state;
 
-  RW_TRACE_API0("RW_I93DetectNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93DetectNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -3538,11 +3753,11 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_I93ReadNDef(void) {
-  RW_TRACE_API0("RW_I93ReadNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1("RW_I93ReadNDef ():Unable to start command at state (0x%X)",
-                    rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -3557,7 +3772,7 @@
       return NFC_STATUS_FAILED;
     }
   } else {
-    RW_TRACE_ERROR0("RW_I93ReadNDef ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
 
@@ -3584,23 +3799,22 @@
 tNFC_STATUS RW_I93UpdateNDef(uint16_t length, uint8_t* p_data) {
   uint16_t block_number;
 
-  RW_TRACE_API1("RW_I93UpdateNDef () length:%d", length);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("length:%d", length);
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93UpdateNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_FAILED;
   }
 
   if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
     if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
-      RW_TRACE_ERROR0("RW_I93UpdateNDef ():NDEF is read-only");
+      LOG(ERROR) << StringPrintf("NDEF is read-only");
       return NFC_STATUS_FAILED;
     }
     if (rw_cb.tcb.i93.max_ndef_length < length) {
-      RW_TRACE_ERROR2(
-          "RW_I93UpdateNDef ():data (%d bytes) is more than max NDEF length "
+      LOG(ERROR) << StringPrintf(
+          "data (%d bytes) is more than max NDEF length "
           "(%d)",
           length, rw_cb.tcb.i93.max_ndef_length);
       return NFC_STATUS_FAILED;
@@ -3623,7 +3837,7 @@
       return NFC_STATUS_FAILED;
     }
   } else {
-    RW_TRACE_ERROR0("RW_I93ReadNDef ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
 
@@ -3646,12 +3860,11 @@
   tNFC_STATUS status;
   tRW_I93_RW_SUBSTATE sub_state;
 
-  RW_TRACE_API0("RW_I93FormatNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93FormatNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -3694,18 +3907,17 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_I93SetTagReadOnly(void) {
-  RW_TRACE_API0("RW_I93SetTagReadOnly ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_I93SetTagReadOnly ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.i93.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.i93.state);
     return NFC_STATUS_FAILED;
   }
 
   if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
     if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
-      RW_TRACE_ERROR0("RW_I93SetTagReadOnly ():NDEF is already read-only");
+      LOG(ERROR) << StringPrintf("NDEF is already read-only");
       return NFC_STATUS_FAILED;
     }
 
@@ -3717,7 +3929,7 @@
       return NFC_STATUS_FAILED;
     }
   } else {
-    RW_TRACE_ERROR0("RW_I93SetTagReadOnly ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
 
@@ -3743,7 +3955,7 @@
   tNFC_STATUS status;
   tRW_DATA evt_data;
 
-  RW_TRACE_API0("RW_I93PresenceCheck ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (!rw_cb.p_cback) {
     return NFC_STATUS_FAILED;
@@ -3768,7 +3980,6 @@
   return (status);
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         rw_i93_get_state_name
@@ -3780,30 +3991,28 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_i93_get_state_name(uint8_t state) {
+static std::string rw_i93_get_state_name(uint8_t state) {
   switch (state) {
     case RW_I93_STATE_NOT_ACTIVATED:
-      return ("NOT_ACTIVATED");
+      return "NOT_ACTIVATED";
     case RW_I93_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case RW_I93_STATE_BUSY:
-      return ("BUSY");
-
+      return "BUSY";
     case RW_I93_STATE_DETECT_NDEF:
-      return ("NDEF_DETECTION");
+      return "NDEF_DETECTION";
     case RW_I93_STATE_READ_NDEF:
-      return ("READ_NDEF");
+      return "READ_NDEF";
     case RW_I93_STATE_UPDATE_NDEF:
-      return ("UPDATE_NDEF");
+      return "UPDATE_NDEF";
     case RW_I93_STATE_FORMAT:
-      return ("FORMAT");
+      return "FORMAT";
     case RW_I93_STATE_SET_READ_ONLY:
-      return ("SET_READ_ONLY");
-
+      return "SET_READ_ONLY";
     case RW_I93_STATE_PRESENCE_CHECK:
-      return ("PRESENCE_CHECK");
+      return "PRESENCE_CHECK";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
 
@@ -3818,38 +4027,38 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_i93_get_sub_state_name(uint8_t sub_state) {
+static std::string rw_i93_get_sub_state_name(uint8_t sub_state) {
   switch (sub_state) {
     case RW_I93_SUBSTATE_WAIT_UID:
-      return ("WAIT_UID");
+      return "WAIT_UID";
     case RW_I93_SUBSTATE_WAIT_SYS_INFO:
-      return ("WAIT_SYS_INFO");
+      return "WAIT_SYS_INFO";
     case RW_I93_SUBSTATE_WAIT_CC:
-      return ("WAIT_CC");
+      return "WAIT_CC";
     case RW_I93_SUBSTATE_SEARCH_NDEF_TLV:
-      return ("SEARCH_NDEF_TLV");
+      return "SEARCH_NDEF_TLV";
     case RW_I93_SUBSTATE_CHECK_LOCK_STATUS:
-      return ("CHECK_LOCK_STATUS");
+      return "CHECK_LOCK_STATUS";
     case RW_I93_SUBSTATE_RESET_LEN:
-      return ("RESET_LEN");
+      return "RESET_LEN";
     case RW_I93_SUBSTATE_WRITE_NDEF:
-      return ("WRITE_NDEF");
+      return "WRITE_NDEF";
     case RW_I93_SUBSTATE_UPDATE_LEN:
-      return ("UPDATE_LEN");
+      return "UPDATE_LEN";
     case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI:
-      return ("WAIT_RESET_DSFID_AFI");
+      return "WAIT_RESET_DSFID_AFI";
     case RW_I93_SUBSTATE_CHECK_READ_ONLY:
-      return ("CHECK_READ_ONLY");
+      return "CHECK_READ_ONLY";
     case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV:
-      return ("WRITE_CC_NDEF_TLV");
+      return "WRITE_CC_NDEF_TLV";
     case RW_I93_SUBSTATE_WAIT_UPDATE_CC:
-      return ("WAIT_UPDATE_CC");
+      return "WAIT_UPDATE_CC";
     case RW_I93_SUBSTATE_LOCK_NDEF_TLV:
-      return ("LOCK_NDEF_TLV");
+      return "LOCK_NDEF_TLV";
     case RW_I93_SUBSTATE_WAIT_LOCK_CC:
-      return ("WAIT_LOCK_CC");
+      return "WAIT_LOCK_CC";
     default:
-      return ("???? UNKNOWN SUBSTATE");
+      return "???? UNKNOWN SUBSTATE";
   }
 }
 
@@ -3864,42 +4073,44 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_i93_get_tag_name(uint8_t product_version) {
+static std::string rw_i93_get_tag_name(uint8_t product_version) {
   switch (product_version) {
     case RW_I93_ICODE_SLI:
-      return ("SLI/SLIX");
+      return "SLI/SLIX";
     case RW_I93_ICODE_SLI_S:
-      return ("SLI-S/SLIX-S");
+      return "SLI-S/SLIX-S";
     case RW_I93_ICODE_SLI_L:
-      return ("SLI-L/SLIX-L");
+      return "SLI-L/SLIX-L";
     case RW_I93_TAG_IT_HF_I_PLUS_INLAY:
-      return ("Tag-it HF-I Plus Inlay");
+      return "Tag-it HF-I Plus Inlay";
     case RW_I93_TAG_IT_HF_I_PLUS_CHIP:
-      return ("Tag-it HF-I Plus Chip");
+      return "Tag-it HF-I Plus Chip";
     case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
-      return ("Tag-it HF-I Standard Chip/Inlyas");
+      return "Tag-it HF-I Standard Chip/Inlyas";
     case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY:
-      return ("Tag-it HF-I Pro Chip/Inlays");
+      return "Tag-it HF-I Pro Chip/Inlays";
     case RW_I93_STM_LRI1K:
-      return ("LRi1K");
+      return "LRi1K";
     case RW_I93_STM_LRI2K:
-      return ("LRi2K");
+      return "LRi2K";
     case RW_I93_STM_LRIS2K:
-      return ("LRiS2K");
+      return "LRiS2K";
     case RW_I93_STM_LRIS64K:
-      return ("LRiS64K");
+      return "LRiS64K";
     case RW_I93_STM_M24LR64_R:
-      return ("M24LR64");
+      return "M24LR64";
     case RW_I93_STM_M24LR04E_R:
-      return ("M24LR04E");
+      return "M24LR04E";
     case RW_I93_STM_M24LR16E_R:
-      return ("M24LR16E");
+      return "M24LR16E";
     case RW_I93_STM_M24LR64E_R:
-      return ("M24LR64E");
+      return "M24LR64E";
+    case RW_I93_STM_ST25DV04K:
+      return "ST25DV04";
+    case RW_I93_STM_ST25DVHIK:
+      return "ST25DV";
     case RW_I93_UNKNOWN_PRODUCT:
     default:
-      return ("UNKNOWN");
+      return "UNKNOWN";
   }
 }
-
-#endif
diff --git a/src/nfc/tags/rw_main.c b/src/nfc/tags/rw_main.cc
similarity index 86%
rename from src/nfc/tags/rw_main.c
rename to src/nfc/tags/rw_main.cc
index 9ff1d14..34dadae 100644
--- a/src/nfc/tags/rw_main.c
+++ b/src/nfc/tags/rw_main.cc
@@ -24,20 +24,28 @@
  *
 ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
 #include "rw_api.h"
 #include "rw_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 tRW_CB rw_cb;
+
 /*******************************************************************************
 *******************************************************************************/
 void rw_init(void) {
   memset(&rw_cb, 0, sizeof(tRW_CB));
-  rw_cb.trace_level = NFC_INITIAL_TRACE_LEVEL;
 }
 
 #if (RW_STATS_INCLUDED == TRUE)
@@ -137,14 +145,16 @@
   ticks = GKI_get_tick_count() - rw_cb.stats.start_tick;
   elapsed_ms = GKI_TICKS_TO_MS(ticks);
 
-  RW_TRACE_DEBUG5(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "NFC tx stats: cmds:%i, retries:%i, aborted: %i, tx_errs: %i, bytes "
       "sent:%i",
       rw_cb.stats.num_ops, rw_cb.stats.num_retries, rw_cb.stats.num_fail,
       rw_cb.stats.num_trans_err, rw_cb.stats.bytes_sent);
-  RW_TRACE_DEBUG2("    rx stats: rx-crc errors %i, bytes received: %i",
-                  rw_cb.stats.num_crc, rw_cb.stats.bytes_received);
-  RW_TRACE_DEBUG1("    time activated %i ms", elapsed_ms);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("    rx stats: rx-crc errors %i, bytes received: %i",
+                      rw_cb.stats.num_crc, rw_cb.stats.bytes_received);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("    time activated %i ms", elapsed_ms);
 }
 #endif /* RW_STATS_INCLUDED */
 
@@ -171,7 +181,8 @@
       memcpy(p, p_raw_data, data_len);
       p_data->len = data_len;
 
-      RW_TRACE_EVENT1("RW SENT raw frame (0x%x)", data_len);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("RW SENT raw frame (0x%x)", data_len);
       status = NFC_SendData(NFC_RF_CONN_ID, p_data);
     }
   }
@@ -192,13 +203,14 @@
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
   /* check for null cback here / remove checks from rw_t?t */
-  RW_TRACE_DEBUG3("RW_SetActivatedTagType protocol:%d, technology:%d, SAK:%d",
-                  p_activate_params->protocol,
-                  p_activate_params->rf_tech_param.mode,
-                  p_activate_params->rf_tech_param.param.pa.sel_rsp);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "RW_SetActivatedTagType protocol:%d, technology:%d, SAK:%d",
+      p_activate_params->protocol, p_activate_params->rf_tech_param.mode,
+      p_activate_params->rf_tech_param.param.pa.sel_rsp);
 
   if (p_cback == NULL) {
-    RW_TRACE_ERROR0("RW_SetActivatedTagType called with NULL callback");
+    LOG(ERROR) << StringPrintf(
+        "RW_SetActivatedTagType called with NULL callback");
     return (NFC_STATUS_FAILED);
   }
 
@@ -247,26 +259,9 @@
   }
   /* TODO set up callback for proprietary protocol */
   else {
-    RW_TRACE_ERROR0("RW_SetActivatedTagType Invalid protocol");
+    LOG(ERROR) << StringPrintf("RW_SetActivatedTagType Invalid protocol");
   }
 
   if (status != NFC_STATUS_OK) rw_cb.p_cback = NULL;
   return status;
 }
-
-/*******************************************************************************
-**
-** Function         RW_SetTraceLevel
-**
-** Description      This function sets the trace level for Reader/Writer mode.
-**                  If called with a value of 0xFF,
-**                  it simply returns the current trace level.
-**
-** Returns          The new or current trace level
-**
-*******************************************************************************/
-uint8_t RW_SetTraceLevel(uint8_t new_level) {
-  if (new_level != 0xFF) rw_cb.trace_level = new_level;
-
-  return (rw_cb.trace_level);
-}
diff --git a/src/nfc/tags/rw_t1t.c b/src/nfc/tags/rw_t1t.cc
similarity index 83%
rename from src/nfc/tags/rw_t1t.c
rename to src/nfc/tags/rw_t1t.cc
index 2c7e02d..b7e8aa8 100644
--- a/src/nfc/tags/rw_t1t.c
+++ b/src/nfc/tags/rw_t1t.cc
@@ -22,7 +22,11 @@
  *  mode.
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
 #include "gki.h"
@@ -32,7 +36,11 @@
 #include "rw_api.h"
 #include "rw_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 extern unsigned char appl_dta_mode_flag;
+
 /* Local Functions */
 static tRW_EVENT rw_t1t_handle_rid_rsp(NFC_HDR* p_pkt);
 static void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
@@ -40,11 +48,7 @@
 static void rw_t1t_process_frame_error(void);
 static void rw_t1t_process_error(void);
 static void rw_t1t_handle_presence_check_rsp(tNFC_STATUS status);
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* rw_t1t_get_state_name(uint8_t state);
-static char* rw_t1t_get_sub_state_name(uint8_t sub_state);
-static char* rw_t1t_get_event_name(uint8_t event);
-#endif
+static std::string rw_t1t_get_state_name(uint8_t state);
 
 /*******************************************************************************
 **
@@ -55,7 +59,8 @@
 ** Returns          none
 **
 *******************************************************************************/
-static void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
+static void rw_t1t_data_cback(__attribute__((unused)) uint8_t conn_id,
+                              __attribute__((unused)) tNFC_CONN_EVT event,
                               tNFC_CONN* p_data) {
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
   tRW_EVENT rw_event = RW_RAW_FRAME_EVT;
@@ -65,21 +70,16 @@
   uint8_t* p;
   tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
       (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
-#if (BT_TRACE_VERBOSE == TRUE)
   uint8_t begin_state = p_t1t->state;
-#endif
 
   p_pkt = (NFC_HDR*)(p_data->data.p_data);
   if (p_pkt == NULL) return;
   /* Assume the data is just the response byte sequence */
   p = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t1t_data_cback (): state:%s (%d)",
-                  rw_t1t_get_state_name(p_t1t->state), p_t1t->state);
-#else
-  RW_TRACE_DEBUG1("rw_t1t_data_cback (): state=%d", p_t1t->state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "state:%s (%d)", rw_t1t_get_state_name(p_t1t->state).c_str(),
+      p_t1t->state);
 
   evt_data.status = NFC_STATUS_OK;
 
@@ -97,7 +97,7 @@
          (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
          (p_t1t->prev_cmd_rsp_info.addr == *p))) {
       /* Response to previous command retransmission */
-      RW_TRACE_ERROR2(
+      LOG(ERROR) << StringPrintf(
           "T1T Response to previous command in Idle state. command=0x%02x, "
           "Remaining max retx rsp:0x%02x ",
           p_t1t->prev_cmd_rsp_info.op_code,
@@ -107,7 +107,7 @@
     } else {
       /* Raw frame event */
       evt_data.data.p_data = p_pkt;
-      (*rw_cb.p_cback)(RW_T1T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data);
+      (*rw_cb.p_cback)(RW_T1T_RAW_FRAME_EVT, &evt_data);
     }
     return;
   }
@@ -134,7 +134,7 @@
         ((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) ||
          (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
          (p_t1t->prev_cmd_rsp_info.addr == *p))) {
-      RW_TRACE_ERROR2(
+      LOG(ERROR) << StringPrintf(
           "T1T Response to previous command. command=0x%02x, Remaining max "
           "retx rsp:0x%02x",
           p_t1t->prev_cmd_rsp_info.op_code,
@@ -144,14 +144,9 @@
       /* Stop timer as some response to current command is received */
       nfc_stop_quick_timer(&p_t1t->timer);
 /* Retrasmit the last sent command if retry-count < max retry */
-#if (BT_TRACE_VERBOSE == TRUE)
-      RW_TRACE_ERROR2("T1T Frame error. state=%s command (opcode) = 0x%02x",
-                      rw_t1t_get_state_name(p_t1t->state),
-                      p_cmd_rsp_info->opcode);
-#else
-      RW_TRACE_ERROR2("T1T Frame error. state=0x%02x command = 0x%02x ",
-                      p_t1t->state, p_cmd_rsp_info->opcode);
-#endif
+      LOG(ERROR) << StringPrintf(
+          "T1T Frame error. state=%s command (opcode) = 0x%02x",
+          rw_t1t_get_state_name(p_t1t->state).c_str(), p_cmd_rsp_info->opcode);
       rw_t1t_process_frame_error();
     }
     GKI_freebuf(p_pkt);
@@ -161,8 +156,9 @@
   /* Stop timer as response to current command is received */
   nfc_stop_quick_timer(&p_t1t->timer);
 
-  RW_TRACE_EVENT2("RW RECV [%s]:0x%x RSP", t1t_info_to_str(p_cmd_rsp_info),
-                  p_cmd_rsp_info->opcode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW RECV [%s]:0x%x RSP", t1t_info_to_str(p_cmd_rsp_info),
+                      p_cmd_rsp_info->opcode);
 
   /* If we did not receive response to all retransmitted previous command,
    * dont expect that as response have come for the current command itself.
@@ -203,17 +199,16 @@
       evt_data.data.p_data = p_pkt;
     }
     rw_t1t_handle_op_complete();
-    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
+    (*rw_cb.p_cback)(rw_event, &evt_data);
   } else
     GKI_freebuf(p_pkt);
 
-#if (BT_TRACE_VERBOSE == TRUE)
   if (begin_state != p_t1t->state) {
-    RW_TRACE_DEBUG2("RW T1T state changed:<%s> -> <%s>",
-                    rw_t1t_get_state_name(begin_state),
-                    rw_t1t_get_state_name(p_t1t->state));
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW T1T state changed:<%s> -> <%s>",
+                        rw_t1t_get_state_name(begin_state).c_str(),
+                        rw_t1t_get_state_name(p_t1t->state).c_str());
   }
-#endif
 }
 
 /*******************************************************************************
@@ -228,13 +223,13 @@
 void rw_t1t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                        tNFC_CONN* p_data) {
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
-  tRW_READ_DATA evt_data;
 
-  RW_TRACE_DEBUG2("rw_t1t_conn_cback: conn_id=%i, evt=0x%x", conn_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "rw_t1t_conn_cback: conn_id=%i, evt=0x%x", conn_id, event);
   /* Only handle static conn_id */
   if (conn_id != NFC_RF_CONN_ID) {
-    RW_TRACE_WARNING1("rw_t1t_conn_cback - Not static connection id: =%i",
-                      conn_id);
+    LOG(WARNING) << StringPrintf(
+        "rw_t1t_conn_cback - Not static connection id: =%i", conn_id);
     return;
   }
 
@@ -282,6 +277,7 @@
         rw_main_update_trans_error_stats();
 #endif /* RW_STATS_INCLUDED */
 
+        tRW_READ_DATA evt_data;
         if (event == NFC_ERROR_CEVT)
           evt_data.status = (tNFC_STATUS)(*(uint8_t*)p_data);
         else if (p_data)
@@ -290,7 +286,9 @@
           evt_data.status = NFC_STATUS_FAILED;
 
         evt_data.p_data = NULL;
-        (*rw_cb.p_cback)(RW_T1T_INTF_ERROR_EVT, (tRW_DATA*)&evt_data);
+        tRW_DATA rw_data;
+        rw_data.data = evt_data;
+        (*rw_cb.p_cback)(RW_T1T_INTF_ERROR_EVT, &rw_data);
         break;
       }
       nfc_stop_quick_timer(&p_t1t->timer);
@@ -355,8 +353,9 @@
       rw_main_update_tx_stats(p_data->len, false);
 #endif /* RW_STATS_INCLUDED */
 
-      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
-                      p_cmd_rsp_info->opcode);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
+          p_cmd_rsp_info->opcode);
       status = NFC_SendData(NFC_RF_CONN_ID, p_data);
       if (status == NFC_STATUS_OK) {
         nfc_start_quick_timer(
@@ -419,8 +418,9 @@
       rw_main_update_tx_stats(p_data->len, false);
 #endif /* RW_STATS_INCLUDED */
 
-      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
-                      p_cmd_rsp_info->opcode);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
+          p_cmd_rsp_info->opcode);
 
       status = NFC_SendData(NFC_RF_CONN_ID, p_data);
       if (status == NFC_STATUS_OK) {
@@ -465,13 +465,11 @@
   /* Extract HR and UID from response */
   STREAM_TO_ARRAY(p_t1t->hr, p_rid_rsp, T1T_HR_LEN);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("hr0:0x%x, hr1:0x%x", p_t1t->hr[0], p_t1t->hr[1]);
-  RW_TRACE_DEBUG4("rw_t1t_handle_rid_rsp (): UID0-3=%02x%02x%02x%02x",
-                  p_rid_rsp[0], p_rid_rsp[1], p_rid_rsp[2], p_rid_rsp[3]);
-#else
-  RW_TRACE_DEBUG0("rw_t1t_handle_rid_rsp ()");
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("hr0:0x%x, hr1:0x%x", p_t1t->hr[0], p_t1t->hr[1]);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("UID0-3=%02x%02x%02x%02x", p_rid_rsp[0], p_rid_rsp[1],
+                      p_rid_rsp[2], p_rid_rsp[3]);
 
   /* Fetch UID0-3 from RID response message */
   STREAM_TO_ARRAY(p_t1t->mem, p_rid_rsp, T1T_CMD_UID_LEN);
@@ -501,7 +499,7 @@
   if (p_t1t->p_cur_cmd_buf == NULL) {
     p_t1t->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_t1t->p_cur_cmd_buf == NULL) {
-      RW_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "rw_t1t_select: unable to allocate buffer for retransmission");
       return status;
     }
@@ -526,17 +524,12 @@
 ** Returns          none
 **
 *******************************************************************************/
-void rw_t1t_process_timeout(TIMER_LIST_ENT* p_tle) {
+void rw_t1t_process_timeout(__attribute__((unused)) TIMER_LIST_ENT* p_tle) {
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_ERROR2("T1T timeout. state=%s command (opcode)=0x%02x ",
-                  rw_t1t_get_state_name(p_t1t->state),
-                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
-#else
-  RW_TRACE_ERROR2("T1T timeout. state=0x%02x command=0x%02x ", p_t1t->state,
-                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
-#endif
+  LOG(ERROR) << StringPrintf("T1T timeout. state=%s command (opcode)=0x%02x ",
+                             rw_t1t_get_state_name(p_t1t->state).c_str(),
+                             (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
 
   if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
     /* Tag has moved from range */
@@ -575,30 +568,28 @@
 **
 *******************************************************************************/
 static void rw_t1t_process_error(void) {
-  tRW_READ_DATA evt_data;
   tRW_EVENT rw_event;
   NFC_HDR* p_cmd_buf;
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
   tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
       (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
-  tRW_DETECT_NDEF_DATA ndef_data;
 
-  RW_TRACE_DEBUG1("rw_t1t_process_error () State: %u", p_t1t->state);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("State: %u", p_t1t->state);
 
   /* Retry sending command if retry-count < max */
   if (rw_cb.cur_retry < RW_MAX_RETRIES) {
     /* retry sending the command */
     rw_cb.cur_retry++;
 
-    RW_TRACE_DEBUG2("T1T retransmission attempt %i of %i", rw_cb.cur_retry,
-                    RW_MAX_RETRIES);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "T1T retransmission attempt %i of %i", rw_cb.cur_retry, RW_MAX_RETRIES);
 
     /* allocate a new buffer for message */
     p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_cmd_buf != NULL) {
-      memcpy(p_cmd_buf, p_t1t->p_cur_cmd_buf,
-             sizeof(NFC_HDR) + p_t1t->p_cur_cmd_buf->offset +
-                 p_t1t->p_cur_cmd_buf->len);
+      memcpy(p_cmd_buf, p_t1t->p_cur_cmd_buf, sizeof(NFC_HDR) +
+                                                  p_t1t->p_cur_cmd_buf->offset +
+                                                  p_t1t->p_cur_cmd_buf->len);
 
 #if (RW_STATS_INCLUDED == TRUE)
       /* Update stats */
@@ -617,8 +608,8 @@
   } else {
     /* we might get response later to all or some of the retrasnmission
      * of the current command, update previous command response information */
-    RW_TRACE_DEBUG1("T1T maximum retransmission attempts reached (%i)",
-                    RW_MAX_RETRIES);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "T1T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES);
     p_t1t->prev_cmd_rsp_info.addr = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
                                      (p_cmd_rsp_info->opcode != T1T_CMD_RID))
                                         ? p_t1t->addr
@@ -636,17 +627,23 @@
   rw_event = rw_t1t_info_to_event(p_cmd_rsp_info);
   if (p_t1t->state != RW_T1T_STATE_NOT_ACTIVATED) rw_t1t_handle_op_complete();
 
-  evt_data.status = NFC_STATUS_TIMEOUT;
   if (rw_event == RW_T2T_NDEF_DETECT_EVT) {
-    ndef_data.status = evt_data.status;
+    tRW_DETECT_NDEF_DATA ndef_data;
+    ndef_data.status = NFC_STATUS_TIMEOUT;
     ndef_data.protocol = NFC_PROTOCOL_T1T;
     ndef_data.flags = RW_NDEF_FL_UNKNOWN;
     ndef_data.max_size = 0;
     ndef_data.cur_size = 0;
-    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&ndef_data);
+    tRW_DATA rw_data;
+    rw_data.ndef = ndef_data;
+    (*rw_cb.p_cback)(rw_event, &rw_data);
   } else {
+    tRW_READ_DATA evt_data;
+    evt_data.status = NFC_STATUS_TIMEOUT;
     evt_data.p_data = NULL;
-    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*rw_cb.p_cback)(rw_event, &rw_data);
   }
 }
 
@@ -660,13 +657,13 @@
 **
 *****************************************************************************/
 void rw_t1t_handle_presence_check_rsp(tNFC_STATUS status) {
-  tRW_READ_DATA evt_data;
+  tRW_DATA rw_data;
 
   /* Notify, Tag is present or not */
-  evt_data.status = status;
+  rw_data.data.status = status;
   rw_t1t_handle_op_complete();
 
-  (*(rw_cb.p_cback))(RW_T1T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
+  (*(rw_cb.p_cback))(RW_T1T_PRESENCE_CHECK_EVT, &rw_data);
 }
 
 /*****************************************************************************
@@ -713,7 +710,7 @@
   tRW_DATA evt_data;
   tRW_CB* p_rw_cb = &rw_cb;
 
-  RW_TRACE_API0("RW_T1tPresenceCheck");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* If RW_SelectTagType was not called (no conn_callback) return failure */
   if (!p_rw_cb->p_cback) {
@@ -756,10 +753,10 @@
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-  RW_TRACE_API0("RW_T1tRid");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tRid - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tRid - Busy - State: %u", p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
@@ -785,10 +782,11 @@
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
-  RW_TRACE_API0("RW_T1tReadAll");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tReadAll - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tReadAll - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
@@ -816,7 +814,7 @@
   uint8_t addr;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tRead - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tRead - Busy - State: %u", p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
@@ -845,22 +843,23 @@
   uint8_t addr;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tWriteErase - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tWriteErase - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
   if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
       (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
-    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
+    LOG(ERROR) << StringPrintf("RW_T1tWriteErase - Tag is in Read only state");
     return (NFC_STATUS_REFUSED);
   }
   if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
-    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
-                    byte);
+    LOG(ERROR) << StringPrintf("RW_T1tWriteErase - Invalid Block/byte: %u / %u",
+                               block, byte);
     return (NFC_STATUS_REFUSED);
   }
   if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
-    RW_TRACE_WARNING1("RW_T1tWriteErase - Cannot write to Locked block: %u",
-                      block);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tWriteErase - Cannot write to Locked block: %u", block);
     return (NFC_STATUS_REFUSED);
   }
   /* send WRITE-E command */
@@ -892,22 +891,23 @@
   uint8_t addr;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tWriteNoErase - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
   if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
       (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
-    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
+    LOG(ERROR) << StringPrintf("RW_T1tWriteErase - Tag is in Read only state");
     return (NFC_STATUS_REFUSED);
   }
   if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
-    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
-                    byte);
+    LOG(ERROR) << StringPrintf("RW_T1tWriteErase - Invalid Block/byte: %u / %u",
+                               block, byte);
     return (NFC_STATUS_REFUSED);
   }
   if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
-    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Cannot write to Locked block: %u",
-                      block);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tWriteNoErase - Cannot write to Locked block: %u", block);
     return (NFC_STATUS_REFUSED);
   }
   /* send WRITE-NE command */
@@ -938,11 +938,12 @@
   uint8_t adds;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tReadSeg - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tReadSeg - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
   if (segment >= T1T_MAX_SEGMENTS) {
-    RW_TRACE_ERROR1("RW_T1tReadSeg - Invalid Segment: %u", segment);
+    LOG(ERROR) << StringPrintf("RW_T1tReadSeg - Invalid Segment: %u", segment);
     return (NFC_STATUS_REFUSED);
   }
   if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0) {
@@ -970,7 +971,8 @@
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tRead8 - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tRead8 - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
@@ -1000,19 +1002,20 @@
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tWriteErase8 - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
   if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
       (block != T1T_CC_BLOCK)) {
-    RW_TRACE_ERROR0("RW_T1tWriteErase8 - Tag is in Read only state");
+    LOG(ERROR) << StringPrintf("RW_T1tWriteErase8 - Tag is in Read only state");
     return (NFC_STATUS_REFUSED);
   }
 
   if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
-    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Cannot write to Locked block: %u",
-                      block);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tWriteErase8 - Cannot write to Locked block: %u", block);
     return (NFC_STATUS_REFUSED);
   }
 
@@ -1046,19 +1049,21 @@
   tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tWriteNoErase8 - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
   if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
       (block != T1T_CC_BLOCK)) {
-    RW_TRACE_ERROR0("RW_T1tWriteNoErase8 - Tag is in Read only state");
+    LOG(ERROR) << StringPrintf(
+        "RW_T1tWriteNoErase8 - Tag is in Read only state");
     return (NFC_STATUS_REFUSED);
   }
 
   if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
-    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Cannot write to Locked block: %u",
-                      block);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tWriteNoErase8 - Cannot write to Locked block: %u", block);
     return (NFC_STATUS_REFUSED);
   }
 
@@ -1077,7 +1082,6 @@
   return status;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         rw_t1t_get_state_name
@@ -1089,31 +1093,29 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_t1t_get_state_name(uint8_t state) {
+static std::string rw_t1t_get_state_name(uint8_t state) {
   switch (state) {
     case RW_T1T_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case RW_T1T_STATE_NOT_ACTIVATED:
-      return ("NOT_ACTIVATED");
+      return "NOT_ACTIVATED";
     case RW_T1T_STATE_READ:
-      return ("APP_READ");
+      return "APP_READ";
     case RW_T1T_STATE_WRITE:
-      return ("APP_WRITE");
+      return "APP_WRITE";
     case RW_T1T_STATE_TLV_DETECT:
-      return ("TLV_DETECTION");
+      return "TLV_DETECTION";
     case RW_T1T_STATE_READ_NDEF:
-      return ("READING_NDEF");
+      return "READING_NDEF";
     case RW_T1T_STATE_WRITE_NDEF:
-      return ("WRITING_NDEF");
+      return "WRITING_NDEF";
     case RW_T1T_STATE_SET_TAG_RO:
-      return ("SET_TAG_RO");
+      return "SET_TAG_RO";
     case RW_T1T_STATE_CHECK_PRESENCE:
-      return ("CHECK_PRESENCE");
+      return "CHECK_PRESENCE";
     case RW_T1T_STATE_FORMAT_TAG:
-      return ("FORMAT_TAG");
+      return "FORMAT_TAG";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
-
-#endif /* (BT_TRACE_VERBOSE == TRUE) */
diff --git a/src/nfc/tags/rw_t1t_ndef.c b/src/nfc/tags/rw_t1t_ndef.cc
similarity index 95%
rename from src/nfc/tags/rw_t1t_ndef.c
rename to src/nfc/tags/rw_t1t_ndef.cc
index 915dade..9568327 100644
--- a/src/nfc/tags/rw_t1t_ndef.c
+++ b/src/nfc/tags/rw_t1t_ndef.cc
@@ -22,16 +22,22 @@
  *  Reader/Writer mode.
  *
  ******************************************************************************/
-#include <string.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
-#include "gki.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
-#include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 #if (RW_NDEF_INCLUDED == TRUE)
 
 /* Local Functions */
@@ -577,7 +583,6 @@
   tRW_DETECT_NDEF_DATA ndef_data;
   tRW_DETECT_TLV_DATA tlv_data;
   uint8_t count;
-  tRW_READ_DATA evt_data;
 
   *p_notify = false;
   /* Handle the response based on the current state */
@@ -589,10 +594,11 @@
     case RW_T1T_STATE_READ_NDEF:
       status = rw_t1t_handle_ndef_rall_rsp();
       if (status != NFC_STATUS_CONTINUE) {
-        evt_data.status = status;
-        evt_data.p_data = NULL;
+        tRW_DATA rw_data;
+        rw_data.data.status = status;
+        rw_data.data.p_data = NULL;
         rw_t1t_handle_op_complete();
-        (*rw_cb.p_cback)(RW_T1T_NDEF_READ_EVT, (tRW_DATA*)&evt_data);
+        (*rw_cb.p_cback)(RW_T1T_NDEF_READ_EVT, &rw_data);
       }
       break;
 
@@ -608,7 +614,9 @@
               tlv_data.num_bytes = p_t1t->num_lockbytes;
               tlv_data.status = status;
               rw_t1t_handle_op_complete();
-              (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, (tRW_DATA*)&tlv_data);
+              tRW_DATA rw_data;
+              rw_data.tlv = tlv_data;
+              (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, &rw_data);
             } else if (p_t1t->tlv_detect == TAG_NDEF_TLV) {
               ndef_data.protocol = NFC_PROTOCOL_T1T;
               ndef_data.flags = rw_t1t_get_ndef_flags();
@@ -628,7 +636,9 @@
               }
               ndef_data.status = status;
               rw_t1t_handle_op_complete();
-              (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, (tRW_DATA*)&ndef_data);
+              tRW_DATA rw_data;
+              rw_data.ndef = ndef_data;
+              (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, &rw_data);
             }
           }
           break;
@@ -646,7 +656,9 @@
             }
             rw_t1t_handle_op_complete();
             /* Send response to upper layer */
-            (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, (tRW_DATA*)&tlv_data);
+            tRW_DATA rw_data;
+            rw_data.tlv = tlv_data;
+            (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, &rw_data);
           } else if (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) {
             tlv_data.status = rw_t1t_handle_tlv_detect_rsp(p_t1t->mem);
             tlv_data.protocol = NFC_PROTOCOL_T1T;
@@ -656,7 +668,9 @@
               rw_t1t_handle_op_complete();
 
               /* Send Negative response to upper layer */
-              (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, (tRW_DATA*)&tlv_data);
+              tRW_DATA rw_data;
+              rw_data.tlv = tlv_data;
+              (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, &rw_data);
             } else {
               rw_t1t_extract_lock_bytes(p_data);
               status = rw_t1t_read_locks();
@@ -665,7 +679,9 @@
                 tlv_data.status = status;
                 rw_t1t_handle_op_complete();
 
-                (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, (tRW_DATA*)&tlv_data);
+                tRW_DATA rw_data;
+                rw_data.tlv = tlv_data;
+                (*rw_cb.p_cback)(RW_T1T_TLV_DETECT_EVT, &rw_data);
               }
             }
           } else if (p_t1t->tlv_detect == TAG_NDEF_TLV) {
@@ -688,7 +704,9 @@
                 /* Send Negative response to upper layer */
                 rw_t1t_handle_op_complete();
 
-                (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, (tRW_DATA*)&ndef_data);
+                tRW_DATA rw_data;
+                rw_data.ndef = ndef_data;
+                (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, &rw_data);
               } else {
                 ndef_data.flags |= RW_NDEF_FL_FORMATED;
                 rw_t1t_extract_lock_bytes(p_data);
@@ -709,8 +727,9 @@
                   ndef_data.status = status;
                   rw_t1t_handle_op_complete();
 
-                  (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT,
-                                   (tRW_DATA*)&ndef_data);
+                  tRW_DATA rw_data;
+                  rw_data.ndef = ndef_data;
+                  (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, &rw_data);
                 }
               }
             } else {
@@ -728,7 +747,9 @@
               }
               rw_t1t_handle_op_complete();
 
-              (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, (tRW_DATA*)&ndef_data);
+              tRW_DATA rw_data;
+              rw_data.ndef = ndef_data;
+              (*rw_cb.p_cback)(RW_T1T_NDEF_DETECT_EVT, &rw_data);
             }
           }
           break;
@@ -798,7 +819,7 @@
   p_data +=
       T1T_UID_LEN + T1T_RES_BYTE_LEN; /* skip Block 0, UID and Reserved byte */
 
-  RW_TRACE_DEBUG0("rw_t1t_handle_rall_rsp ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   rw_t1t_update_tag_state();
   rw_t1t_update_attributes();
@@ -1023,7 +1044,7 @@
                       p_t1t->lockbyte[p_t1t->num_lockbytes].b_lock_read = false;
                       p_t1t->num_lockbytes++;
                     } else
-                      RW_TRACE_ERROR1(
+                      LOG(ERROR) << StringPrintf(
                           "T1T Buffer overflow error. Max supported lock "
                           "bytes=0x%02X",
                           RW_T1T_MAX_LOCK_BYTES);
@@ -1032,7 +1053,7 @@
                   p_t1t->num_lock_tlvs++;
                   rw_t1t_update_attributes();
                 } else
-                  RW_TRACE_ERROR1(
+                  LOG(ERROR) << StringPrintf(
                       "T1T Buffer overflow error. Max supported lock "
                       "tlvs=0x%02X",
                       RW_T1T_MAX_LOCK_TLVS);
@@ -1053,7 +1074,7 @@
               tlv_value[2 - bytes_count] = p_readbytes[offset];
               if (bytes_count == 0) {
                 if (p_t1t->num_mem_tlvs >= RW_T1T_MAX_MEM_TLVS) {
-                  RW_TRACE_ERROR0(
+                  LOG(ERROR) << StringPrintf(
                       "rw_t1t_handle_tlv_detect_rsp - Maximum buffer allocated "
                       "for Memory tlv has reached");
                   failed = true;
@@ -1171,8 +1192,9 @@
         }
       }
     } else {
-      RW_TRACE_ERROR1("RW_T1tReadNDef - Invalid NDEF len: %u or NDEF corrupted",
-                      p_t1t->ndef_msg_len);
+      LOG(ERROR) << StringPrintf(
+          "RW_T1tReadNDef - Invalid NDEF len: %u or NDEF corrupted",
+          p_t1t->ndef_msg_len);
       status = NFC_STATUS_FAILED;
     }
   } else {
@@ -2125,13 +2147,14 @@
   uint8_t* p;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tFormatNDef - Tag not initialized/ Busy! State: %u",
-                      p_t1t->state);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tFormatNDef - Tag not initialized/ Busy! State: %u",
+        p_t1t->state);
     return (NFC_STATUS_FAILED);
   }
 
   if ((p_t1t->hr[0] & 0xF0) != T1T_NDEF_SUPPORTED) {
-    RW_TRACE_WARNING1(
+    LOG(WARNING) << StringPrintf(
         "RW_T1tFormatNDef - Cannot format tag as NDEF not supported. HR0: %u",
         p_t1t->hr[0]);
     return (NFC_STATUS_REJECTED);
@@ -2139,8 +2162,9 @@
 
   p_ret = t1t_tag_init_data(p_t1t->hr[0]);
   if (p_ret == NULL) {
-    RW_TRACE_WARNING2("RW_T1tFormatNDef - Invalid HR - HR0: %u, HR1: %u",
-                      p_t1t->hr[0], p_t1t->hr[1]);
+    LOG(WARNING) << StringPrintf(
+        "RW_T1tFormatNDef - Invalid HR - HR0: %u, HR1: %u", p_t1t->hr[0],
+        p_t1t->hr[1]);
     return (NFC_STATUS_REJECTED);
   }
 
@@ -2220,14 +2244,16 @@
   uint8_t adds;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tLocateTlv - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tLocateTlv - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_FAILED);
   }
   p_t1t->tlv_detect = tlv_type;
 
   if ((p_t1t->tlv_detect == TAG_NDEF_TLV) &&
       (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED)) {
-    RW_TRACE_ERROR0("RW_T1tLocateTlv - Error: NDEF not supported by the tag");
+    LOG(ERROR) << StringPrintf(
+        "RW_T1tLocateTlv - Error: NDEF not supported by the tag");
     return (NFC_STATUS_REFUSED);
   }
 
@@ -2305,18 +2331,20 @@
       t1t_cmd_to_rsp_info(T1T_CMD_RSEG);
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tReadNDef - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tReadNDef - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_FAILED);
   }
 
   /* Check HR0 if NDEF supported by the tag */
   if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED) {
-    RW_TRACE_ERROR0("RW_T1tReadNDef - Error: NDEF not supported by the tag");
+    LOG(ERROR) << StringPrintf(
+        "RW_T1tReadNDef - Error: NDEF not supported by the tag");
     return (NFC_STATUS_REFUSED);
   }
 
   if (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED_NDEF) {
-    RW_TRACE_WARNING1(
+    LOG(WARNING) << StringPrintf(
         "RW_T1tReadNDef - NDEF Message length is zero, NDEF Length : %u ",
         p_t1t->ndef_msg_len);
     return (NFC_STATUS_NOT_INITIALIZED);
@@ -2324,14 +2352,14 @@
 
   if ((p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_WRITE) &&
       (p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_ONLY)) {
-    RW_TRACE_ERROR0(
+    LOG(ERROR) << StringPrintf(
         "RW_T1tReadNDef - Error: NDEF detection not performed yet/ Tag is in "
         "Initialized state");
     return (NFC_STATUS_FAILED);
   }
 
   if (buf_len < p_t1t->ndef_msg_len) {
-    RW_TRACE_WARNING2(
+    LOG(WARNING) << StringPrintf(
         "RW_T1tReadNDef - buffer size: %u  less than NDEF msg sise: %u",
         buf_len, p_t1t->ndef_msg_len);
     return (NFC_STATUS_FAILED);
@@ -2394,24 +2422,26 @@
   uint16_t init_ndef_msg_offset;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tWriteNDef - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tWriteNDef - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_FAILED);
   }
 
   /* Check HR0 if NDEF supported by the tag */
   if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED) {
-    RW_TRACE_ERROR0("RW_T1tWriteNDef - Error: NDEF not supported by the tag");
+    LOG(ERROR) << StringPrintf(
+        "RW_T1tWriteNDef - Error: NDEF not supported by the tag");
     return (NFC_STATUS_REFUSED);
   }
 
   if ((p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_WRITE) &&
       (p_t1t->tag_attribute != RW_T1_TAG_ATTRB_INITIALIZED_NDEF)) {
-    RW_TRACE_ERROR0("RW_T1tWriteNDef - Tag cannot update NDEF");
+    LOG(ERROR) << StringPrintf("RW_T1tWriteNDef - Tag cannot update NDEF");
     return (NFC_STATUS_REFUSED);
   }
 
   if (msg_len > p_t1t->max_ndef_msg_len) {
-    RW_TRACE_ERROR1(
+    LOG(ERROR) << StringPrintf(
         "RW_T1tWriteNDef - Cannot write NDEF of size greater than %u bytes",
         p_t1t->max_ndef_msg_len);
     return (NFC_STATUS_REFUSED);
@@ -2499,7 +2529,8 @@
   uint8_t num_locks;
 
   if (p_t1t->state != RW_T1T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T1tSetTagReadOnly - Busy - State: %u", p_t1t->state);
+    LOG(WARNING) << StringPrintf("RW_T1tSetTagReadOnly - Busy - State: %u",
+                                 p_t1t->state);
     return (NFC_STATUS_BUSY);
   }
 
@@ -2530,47 +2561,4 @@
   return status;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
-/*******************************************************************************
-**
-** Function         rw_t1t_get_sub_state_name
-**
-** Description      This function returns the sub_state name.
-**
-** NOTE             conditionally compiled to save memory.
-**
-** Returns          pointer to the name
-**
-*******************************************************************************/
-static char* rw_t1t_get_sub_state_name(uint8_t sub_state) {
-  switch (sub_state) {
-    case RW_T1T_SUBSTATE_NONE:
-      return ("NONE");
-    case RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE:
-      return ("EXTRACT_TLV_VALUE");
-    case RW_T1T_SUBSTATE_WAIT_READ_LOCKS:
-      return ("READING_LOCKS");
-    case RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK:
-      return ("READ_NDEF_FINAL_BLOCK");
-    case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF:
-      return ("INVALIDATING_NDEF");
-    case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE:
-      return ("WRITE_NDEF_TLV_MESSAGE");
-    case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED:
-      return ("WAITING_RSP_FOR_LAST_NDEF_WRITE");
-    case RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF:
-      return ("VALIDATING_NDEF");
-    case RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO:
-      return ("SET_RWA_RO");
-    case RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS:
-      return ("SET_STATIC_LOCK_BITS");
-    case RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS:
-      return ("SET_DYNAMIC_LOCK_BITS");
-
-    default:
-      return ("???? UNKNOWN SUBSTATE");
-  }
-}
-#endif /* (BT_TRACE_VERBOSE == TRUE) */
-
 #endif /* (RW_NDEF_INCLUDED == TRUE) */
diff --git a/src/nfc/tags/rw_t2t.c b/src/nfc/tags/rw_t2t.cc
similarity index 83%
rename from src/nfc/tags/rw_t2t.c
rename to src/nfc/tags/rw_t2t.cc
index c215340..a05c942 100644
--- a/src/nfc/tags/rw_t2t.c
+++ b/src/nfc/tags/rw_t2t.cc
@@ -22,10 +22,14 @@
  *  mode.
  *
  ******************************************************************************/
-#include <string.h>
-#include "bt_types.h"
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
 #include "nfc_target.h"
 
+#include "bt_types.h"
 #include "gki.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
@@ -33,6 +37,10 @@
 #include "rw_api.h"
 #include "rw_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 /* Static local functions */
 static void rw_t2t_proc_data(uint8_t conn_id, tNFC_DATA_CEVT* p_data);
 static tNFC_STATUS rw_t2t_send_cmd(uint8_t opcode, uint8_t* p_dat);
@@ -41,10 +49,8 @@
 static void rw_t2t_handle_presence_check_rsp(tNFC_STATUS status);
 static void rw_t2t_resume_op(void);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* rw_t2t_get_state_name(uint8_t state);
-static char* rw_t2t_get_substate_name(uint8_t substate);
-#endif
+static std::string rw_t2t_get_state_name(uint8_t state);
+static std::string rw_t2t_get_substate_name(uint8_t substate);
 
 /*******************************************************************************
 **
@@ -62,27 +68,21 @@
   bool b_notify = true;
   bool b_release = true;
   uint8_t* p;
-  tRW_READ_DATA evt_data = {
-      0,
-  };
+  tRW_READ_DATA evt_data = {};
   tT2T_CMD_RSP_INFO* p_cmd_rsp_info =
       (tT2T_CMD_RSP_INFO*)rw_cb.tcb.t2t.p_cmd_rsp_info;
   tRW_DETECT_NDEF_DATA ndef_data;
-#if (BT_TRACE_VERBOSE == TRUE)
   uint8_t begin_state = p_t2t->state;
-#endif
 
   if ((p_t2t->state == RW_T2T_STATE_IDLE) || (p_cmd_rsp_info == NULL)) {
-#if (BT_TRACE_VERBOSE == TRUE)
-    RW_TRACE_DEBUG2("RW T2T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len,
-                    NFC_GetStatusName(p_data->status));
-#else
-    RW_TRACE_DEBUG2("RW T2T Raw Frame: Len [0x%X] Status [0x%X]", p_pkt->len,
-                    p_data->status);
-#endif
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW T2T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len,
+                        NFC_GetStatusName(p_data->status).c_str());
     evt_data.status = p_data->status;
     evt_data.p_data = p_pkt;
-    (*rw_cb.p_cback)(RW_T2T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*rw_cb.p_cback)(RW_T2T_RAW_FRAME_EVT, &rw_data);
     return;
   }
 #if (RW_STATS_INCLUDED == TRUE)
@@ -92,20 +92,16 @@
   /* Stop timer as response is received */
   nfc_stop_quick_timer(&p_t2t->t2_timer);
 
-  RW_TRACE_EVENT2("RW RECV [%s]:0x%x RSP", t2t_info_to_str(p_cmd_rsp_info),
-                  p_cmd_rsp_info->opcode);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW RECV [%s]:0x%x RSP", t2t_info_to_str(p_cmd_rsp_info),
+                      p_cmd_rsp_info->opcode);
 
   if (((p_pkt->len != p_cmd_rsp_info->rsp_len) &&
        (p_pkt->len != p_cmd_rsp_info->nack_rsp_len) &&
        (p_t2t->substate != RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR)) ||
       (p_t2t->state == RW_T2T_STATE_HALT)) {
-#if (BT_TRACE_VERBOSE == TRUE)
-    RW_TRACE_ERROR1("T2T Frame error. state=%s ",
-                    rw_t2t_get_state_name(p_t2t->state));
-#else
-    RW_TRACE_ERROR1("T2T Frame error. state=0x%02X command=0x%02X ",
-                    p_t2t->state);
-#endif
+    LOG(ERROR) << StringPrintf("T2T Frame error. state=%s ",
+                               rw_t2t_get_state_name(p_t2t->state).c_str());
     if (p_t2t->state != RW_T2T_STATE_HALT) {
       /* Retrasmit the last sent command if retry-count < max retry */
       rw_t2t_process_frame_error();
@@ -119,7 +115,7 @@
   /* Assume the data is just the response byte sequence */
   p = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
 
-  RW_TRACE_EVENT4(
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "rw_t2t_proc_data State: %u  conn_id: %u  len: %u  data[0]: 0x%02x",
       p_t2t->state, conn_id, p_pkt->len, *p);
 
@@ -133,7 +129,7 @@
       else
         evt_data.status = NFC_STATUS_FAILED;
     } else {
-      RW_TRACE_EVENT1(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "rw_t2t_proc_data - Received NACK response(0x%x) to SEC-SELCT CMD",
           (*p & 0x0f));
       evt_data.status = NFC_STATUS_REJECTED;
@@ -147,8 +143,8 @@
     evt_data.p_data = p_pkt;
     if (p_t2t->state == RW_T2T_STATE_READ) b_release = false;
 
-    RW_TRACE_EVENT1("rw_t2t_proc_data - Received NACK response(0x%x)",
-                    (*p & 0x0f));
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "rw_t2t_proc_data - Received NACK response(0x%x)", (*p & 0x0f));
 
     if (!p_t2t->check_tag_halt) {
       /* Just received first NACK. Retry just one time to find if tag went in to
@@ -210,23 +206,26 @@
       ndef_data.cur_size = 0;
       /* Move back to idle state */
       rw_t2t_handle_op_complete();
-      (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&ndef_data);
+      tRW_DATA rw_data;
+      rw_data.ndef = ndef_data;
+      (*rw_cb.p_cback)(rw_event, &rw_data);
     } else {
       /* Move back to idle state */
       rw_t2t_handle_op_complete();
-      (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
+      tRW_DATA rw_data;
+      rw_data.data = evt_data;
+      (*rw_cb.p_cback)(rw_event, &rw_data);
     }
   }
 
   if (b_release) GKI_freebuf(p_pkt);
 
-#if (BT_TRACE_VERBOSE == TRUE)
   if (begin_state != p_t2t->state) {
-    RW_TRACE_DEBUG2("RW T2T state changed:<%s> -> <%s>",
-                    rw_t2t_get_state_name(begin_state),
-                    rw_t2t_get_state_name(p_t2t->state));
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW T2T state changed:<%s> -> <%s>",
+                        rw_t2t_get_state_name(begin_state).c_str(),
+                        rw_t2t_get_state_name(p_t2t->state).c_str());
   }
-#endif
 }
 
 /*******************************************************************************
@@ -243,7 +242,8 @@
   tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
   tRW_READ_DATA evt_data;
 
-  RW_TRACE_DEBUG2("rw_t2t_conn_cback: conn_id=%i, evt=%i", conn_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("rw_t2t_conn_cback: conn_id=%i, evt=%i", conn_id, event);
   /* Only handle static conn_id */
   if (conn_id != NFC_RF_CONN_ID) {
     return;
@@ -306,7 +306,9 @@
           evt_data.status = NFC_STATUS_FAILED;
 
         evt_data.p_data = NULL;
-        (*rw_cb.p_cback)(RW_T2T_INTF_ERROR_EVT, (tRW_DATA*)&evt_data);
+        tRW_DATA rw_data;
+        rw_data.data = evt_data;
+        (*rw_cb.p_cback)(RW_T2T_INTF_ERROR_EVT, &rw_data);
         break;
       }
       nfc_stop_quick_timer(&p_t2t->t2_timer);
@@ -375,8 +377,9 @@
       /* Update stats */
       rw_main_update_tx_stats(p_data->len, false);
 #endif
-      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t2t_info_to_str(p_cmd_rsp_info),
-                      p_cmd_rsp_info->opcode);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "RW SENT [%s]:0x%x CMD", t2t_info_to_str(p_cmd_rsp_info),
+          p_cmd_rsp_info->opcode);
 
       status = NFC_SendData(NFC_RF_CONN_ID, p_data);
       if (status == NFC_STATUS_OK) {
@@ -384,15 +387,10 @@
             &p_t2t->t2_timer, NFC_TTYPE_RW_T2T_RESPONSE,
             (RW_T2T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
       } else {
-#if (BT_TRACE_VERBOSE == TRUE)
-        RW_TRACE_ERROR2("T2T NFC Send data failed. state=%s substate=%s ",
-                        rw_t2t_get_state_name(p_t2t->state),
-                        rw_t2t_get_substate_name(p_t2t->substate));
-#else
-        RW_TRACE_ERROR2(
-            "T2T NFC Send data failed. state=0x%02X substate=0x%02X ",
-            p_t2t->state, p_t2t->substate);
-#endif
+        LOG(ERROR) << StringPrintf(
+            "T2T NFC Send data failed. state=%s substate=%s ",
+            rw_t2t_get_state_name(p_t2t->state).c_str(),
+            rw_t2t_get_substate_name(p_t2t->substate).c_str());
       }
     } else {
       status = NFC_STATUS_NO_BUFFERS;
@@ -410,7 +408,7 @@
 ** Returns          none
 **
 *******************************************************************************/
-void rw_t2t_process_timeout(TIMER_LIST_ENT* p_tle) {
+void rw_t2t_process_timeout() {
   tRW_READ_DATA evt_data;
   tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
 
@@ -433,18 +431,16 @@
       rw_t2t_handle_op_complete();
       evt_data.status = NFC_STATUS_OK;
       evt_data.p_data = NULL;
-      (*rw_cb.p_cback)(RW_T2T_SELECT_CPLT_EVT, (tRW_DATA*)&evt_data);
+      tRW_DATA rw_data;
+      rw_data.data = evt_data;
+      (*rw_cb.p_cback)(RW_T2T_SELECT_CPLT_EVT, &rw_data);
     } else {
       /* Resume operation from where we stopped before sector change */
       rw_t2t_resume_op();
     }
   } else if (p_t2t->state != RW_T2T_STATE_IDLE) {
-#if (BT_TRACE_VERBOSE == TRUE)
-    RW_TRACE_ERROR1("T2T timeout. state=%s ",
-                    rw_t2t_get_state_name(p_t2t->state));
-#else
-    RW_TRACE_ERROR1("T2T timeout. state=0x%02X ", p_t2t->state);
-#endif
+    LOG(ERROR) << StringPrintf("T2T timeout. state=%s ",
+                               rw_t2t_get_state_name(p_t2t->state).c_str());
     /* Handle timeout error as no response to the command sent */
     rw_t2t_process_error();
   }
@@ -488,22 +484,22 @@
       (tT2T_CMD_RSP_INFO*)rw_cb.tcb.t2t.p_cmd_rsp_info;
   tRW_DETECT_NDEF_DATA ndef_data;
 
-  RW_TRACE_DEBUG1("rw_t2t_process_error () State: %u", p_t2t->state);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("State: %u", p_t2t->state);
 
   /* Retry sending command if retry-count < max */
   if ((!p_t2t->check_tag_halt) && (rw_cb.cur_retry < RW_MAX_RETRIES)) {
     /* retry sending the command */
     rw_cb.cur_retry++;
 
-    RW_TRACE_DEBUG2("T2T retransmission attempt %i of %i", rw_cb.cur_retry,
-                    RW_MAX_RETRIES);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "T2T retransmission attempt %i of %i", rw_cb.cur_retry, RW_MAX_RETRIES);
 
     /* allocate a new buffer for message */
     p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_cmd_buf != NULL) {
-      memcpy(p_cmd_buf, p_t2t->p_cur_cmd_buf,
-             sizeof(NFC_HDR) + p_t2t->p_cur_cmd_buf->offset +
-                 p_t2t->p_cur_cmd_buf->len);
+      memcpy(p_cmd_buf, p_t2t->p_cur_cmd_buf, sizeof(NFC_HDR) +
+                                                  p_t2t->p_cur_cmd_buf->offset +
+                                                  p_t2t->p_cur_cmd_buf->len);
 #if (RW_STATS_INCLUDED == TRUE)
       /* Update stats */
       rw_main_update_tx_stats(p_cmd_buf->len, true);
@@ -519,10 +515,11 @@
     }
   } else {
     if (p_t2t->check_tag_halt) {
-      RW_TRACE_DEBUG0("T2T Went to HALT State!");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("T2T Went to HALT State!");
     } else {
-      RW_TRACE_DEBUG1("T2T maximum retransmission attempts reached (%i)",
-                      RW_MAX_RETRIES);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "T2T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES);
     }
   }
   rw_event = rw_t2t_info_to_event(p_cmd_rsp_info);
@@ -548,14 +545,18 @@
     /* If not Halt move to idle state */
     rw_t2t_handle_op_complete();
 
-    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&ndef_data);
+    tRW_DATA rw_data;
+    rw_data.ndef = ndef_data;
+    (*rw_cb.p_cback)(rw_event, &rw_data);
   } else {
     evt_data.p_data = NULL;
     /* If activated and not Halt move to idle state */
     if (p_t2t->state != RW_T2T_STATE_NOT_ACTIVATED) rw_t2t_handle_op_complete();
 
     p_t2t->substate = RW_T2T_SUBSTATE_NONE;
-    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*rw_cb.p_cback)(rw_event, &rw_data);
   }
 }
 
@@ -569,13 +570,13 @@
 **
 *****************************************************************************/
 void rw_t2t_handle_presence_check_rsp(tNFC_STATUS status) {
-  tRW_READ_DATA evt_data;
+  tRW_DATA rw_data;
 
   /* Notify, Tag is present or not */
-  evt_data.status = status;
+  rw_data.data.status = status;
   rw_t2t_handle_op_complete();
 
-  (*rw_cb.p_cback)(RW_T2T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
+  (*rw_cb.p_cback)(RW_T2T_PRESENCE_CHECK_EVT, &rw_data);
 }
 
 /*******************************************************************************
@@ -607,9 +608,9 @@
   /* allocate a new buffer for message */
   p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
   if (p_cmd_buf != NULL) {
-    memcpy(p_cmd_buf, p_t2t->p_sec_cmd_buf,
-           sizeof(NFC_HDR) + p_t2t->p_sec_cmd_buf->offset +
-               p_t2t->p_sec_cmd_buf->len);
+    memcpy(p_cmd_buf, p_t2t->p_sec_cmd_buf, sizeof(NFC_HDR) +
+                                                p_t2t->p_sec_cmd_buf->offset +
+                                                p_t2t->p_sec_cmd_buf->len);
     memcpy(p_t2t->p_cur_cmd_buf, p_t2t->p_sec_cmd_buf,
            sizeof(NFC_HDR) + p_t2t->p_sec_cmd_buf->offset +
                p_t2t->p_sec_cmd_buf->len);
@@ -629,7 +630,9 @@
       evt_data.status = NFC_STATUS_FAILED;
       event = rw_t2t_info_to_event(p_cmd_rsp_info);
       rw_t2t_handle_op_complete();
-      (*rw_cb.p_cback)(event, (tRW_DATA*)&evt_data);
+      tRW_DATA rw_data;
+      rw_data.data = evt_data;
+      (*rw_cb.p_cback)(event, &rw_data);
     }
   }
 }
@@ -652,7 +655,7 @@
 
   p_data = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
   if (p_data == NULL) {
-    RW_TRACE_ERROR0("rw_t2t_sector_change - No buffer");
+    LOG(ERROR) << StringPrintf("rw_t2t_sector_change - No buffer");
     return (NFC_STATUS_NO_BUFFERS);
   }
 
@@ -672,12 +675,13 @@
     p_t2t->p_cmd_rsp_info = NULL;
     p_t2t->substate = RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR;
 
-    RW_TRACE_EVENT0("rw_t2t_sector_change Sent Second Command");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("rw_t2t_sector_change Sent Second Command");
     nfc_start_quick_timer(
         &p_t2t->t2_timer, NFC_TTYPE_RW_T2T_RESPONSE,
         (RW_T2T_SEC_SEL_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
   } else {
-    RW_TRACE_ERROR1(
+    LOG(ERROR) << StringPrintf(
         "rw_t2t_sector_change Send failed at rw_t2t_send_cmd, error: %u",
         status);
   }
@@ -735,7 +739,8 @@
   status = rw_t2t_send_cmd(T2T_CMD_READ, (uint8_t*)read_cmd);
   if (status == NFC_STATUS_OK) {
     p_t2t->block_read = block;
-    RW_TRACE_EVENT1("rw_t2t_read Sent Command for Block: %u", block);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("rw_t2t_read Sent Command for Block: %u", block);
   }
 
   return status;
@@ -792,7 +797,8 @@
   /* Send Write command as sector change is not needed */
   status = rw_t2t_send_cmd(T2T_CMD_WRITE, write_cmd);
   if (status == NFC_STATUS_OK) {
-    RW_TRACE_EVENT1("rw_t2t_write Sent Command for Block: %u", block);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("rw_t2t_write Sent Command for Block: %u", block);
   }
 
   return status;
@@ -817,7 +823,7 @@
   if (p_t2t->p_cur_cmd_buf == NULL) {
     p_t2t->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_t2t->p_cur_cmd_buf == NULL) {
-      RW_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "rw_t2t_select: unable to allocate buffer for retransmission");
       return (NFC_STATUS_FAILED);
     }
@@ -826,7 +832,7 @@
   if (p_t2t->p_sec_cmd_buf == NULL) {
     p_t2t->p_sec_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_t2t->p_sec_cmd_buf == NULL) {
-      RW_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "rw_t2t_select: unable to allocate buffer used during sector change");
       return (NFC_STATUS_FAILED);
     }
@@ -883,7 +889,7 @@
   tRW_CB* p_rw_cb = &rw_cb;
   uint8_t sector_blk = 0; /* block 0 of current sector */
 
-  RW_TRACE_API0("RW_T2tPresenceCheck");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* If RW_SelectTagType was not called (no conn_callback) return failure */
   if (!p_rw_cb->p_cback) {
@@ -925,15 +931,16 @@
   tNFC_STATUS status;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
   status = rw_t2t_read(block);
   if (status == NFC_STATUS_OK) {
     p_t2t->state = RW_T2T_STATE_READ;
-    RW_TRACE_EVENT0("RW_T2tRead Sent Read command");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW_T2tRead Sent Read command");
   }
 
   return status;
@@ -957,8 +964,8 @@
   tNFC_STATUS status;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -969,7 +976,8 @@
       p_t2t->b_read_hdr = false;
     else if (block < (T2T_FIRST_DATA_BLOCK + T2T_READ_BLOCKS))
       p_t2t->b_read_data = false;
-    RW_TRACE_EVENT0("RW_T2tWrite Sent Write command");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW_T2tWrite Sent Write command");
   }
 
   return status;
@@ -999,13 +1007,13 @@
   uint8_t sector_byte2[1];
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
   if (sector >= T2T_MAX_SECTOR) {
-    RW_TRACE_ERROR2(
+    LOG(ERROR) << StringPrintf(
         "RW_T2tSectorSelect - Invalid sector: %u, T2 Max supported sector "
         "value: %u",
         sector, T2T_MAX_SECTOR - 1);
@@ -1020,13 +1028,13 @@
     p_t2t->select_sector = sector;
     p_t2t->substate = RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT;
 
-    RW_TRACE_EVENT0("RW_T2tSectorSelect Sent Sector select first command");
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW_T2tSectorSelect Sent Sector select first command");
   }
 
   return status;
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         rw_t2t_get_state_name
@@ -1035,33 +1043,33 @@
 **
 ** NOTE             conditionally compiled to save memory.
 **
-** Returns          pointer to the name
+** Returns          string
 **
 *******************************************************************************/
-static char* rw_t2t_get_state_name(uint8_t state) {
+static std::string rw_t2t_get_state_name(uint8_t state) {
   switch (state) {
     case RW_T2T_STATE_NOT_ACTIVATED:
-      return ("NOT_ACTIVATED");
+      return "NOT_ACTIVATED";
     case RW_T2T_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case RW_T2T_STATE_READ:
-      return ("APP_READ");
+      return "APP_READ";
     case RW_T2T_STATE_WRITE:
-      return ("APP_WRITE");
+      return "APP_WRITE";
     case RW_T2T_STATE_SELECT_SECTOR:
-      return ("SECTOR_SELECT");
+      return "SECTOR_SELECT";
     case RW_T2T_STATE_DETECT_TLV:
-      return ("TLV_DETECT");
+      return "TLV_DETECT";
     case RW_T2T_STATE_READ_NDEF:
-      return ("READ_NDEF");
+      return "READ_NDEF";
     case RW_T2T_STATE_WRITE_NDEF:
-      return ("WRITE_NDEF");
+      return "WRITE_NDEF";
     case RW_T2T_STATE_SET_TAG_RO:
-      return ("SET_TAG_RO");
+      return "SET_TAG_RO";
     case RW_T2T_STATE_CHECK_PRESENCE:
-      return ("CHECK_PRESENCE");
+      return "CHECK_PRESENCE";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
 
@@ -1076,51 +1084,49 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_t2t_get_substate_name(uint8_t substate) {
+static std::string rw_t2t_get_substate_name(uint8_t substate) {
   switch (substate) {
     case RW_T2T_SUBSTATE_NONE:
-      return ("RW_T2T_SUBSTATE_NONE");
+      return "RW_T2T_SUBSTATE_NONE";
     case RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT:
-      return ("RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT");
+      return "RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT";
     case RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR:
-      return ("RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR");
+      return "RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR";
     case RW_T2T_SUBSTATE_WAIT_READ_CC:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_CC");
+      return "RW_T2T_SUBSTATE_WAIT_READ_CC";
     case RW_T2T_SUBSTATE_WAIT_TLV_DETECT:
-      return ("RW_T2T_SUBSTATE_WAIT_TLV_DETECT");
+      return "RW_T2T_SUBSTATE_WAIT_TLV_DETECT";
     case RW_T2T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN:
-      return ("RW_T2T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN");
+      return "RW_T2T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN";
     case RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN0:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN0");
+      return "RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN0";
     case RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN1:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN1");
+      return "RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN1";
     case RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE");
+      return "RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE";
     case RW_T2T_SUBSTATE_WAIT_READ_LOCKS:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_LOCKS");
+      return "RW_T2T_SUBSTATE_WAIT_READ_LOCKS";
     case RW_T2T_SUBSTATE_WAIT_READ_NDEF_FIRST_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_NDEF_FIRST_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_READ_NDEF_FIRST_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_READ_NDEF_LAST_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_NDEF_LAST_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_READ_NDEF_LAST_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_READ_TERM_TLV_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_TERM_TLV_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_READ_TERM_TLV_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_READ_NDEF_NEXT_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_NDEF_NEXT_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_READ_NDEF_NEXT_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_NEXT_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_NEXT_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_NEXT_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LAST_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LAST_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LAST_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_READ_NDEF_LEN_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_READ_NDEF_LEN_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_READ_NDEF_LEN_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_NEXT_BLOCK:
-      return ("RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_NEXT_BLOCK");
+      return "RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_NEXT_BLOCK";
     case RW_T2T_SUBSTATE_WAIT_WRITE_TERM_TLV_CMPLT:
-      return ("RW_T2T_SUBSTATE_WAIT_WRITE_TERM_TLV_CMPLT");
+      return "RW_T2T_SUBSTATE_WAIT_WRITE_TERM_TLV_CMPLT";
     default:
-      return ("???? UNKNOWN SUBSTATE");
+      return "???? UNKNOWN SUBSTATE";
   }
 }
-
-#endif /* (BT_TRACE_VERBOSE == TRUE) */
diff --git a/src/nfc/tags/rw_t2t_ndef.c b/src/nfc/tags/rw_t2t_ndef.cc
similarity index 97%
rename from src/nfc/tags/rw_t2t_ndef.c
rename to src/nfc/tags/rw_t2t_ndef.cc
index def45bb..c18c685 100644
--- a/src/nfc/tags/rw_t2t_ndef.c
+++ b/src/nfc/tags/rw_t2t_ndef.cc
@@ -22,17 +22,23 @@
  *  Reader/Writer mode.
  *
  ******************************************************************************/
-#include <log/log.h>
 #include <string.h>
+
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <log/log.h>
+
 #include "nfc_target.h"
 
-#include "gki.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
-#include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
 
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
+
 #if (RW_NDEF_INCLUDED == TRUE)
 
 /* Local static functions */
@@ -108,7 +114,7 @@
           if (p_t2t->tag_hdr[T2T_CC0_NMN_BYTE] == T2T_CC0_NMN) {
             rw_t2t_handle_cc_read_rsp();
           } else {
-            RW_TRACE_WARNING3(
+            LOG(WARNING) << StringPrintf(
                 "NDEF Detection failed!, CC[0]: 0x%02x, CC[1]: 0x%02x, CC[3]: "
                 "0x%02x",
                 p_t2t->tag_hdr[T2T_CC0_NMN_BYTE],
@@ -238,15 +244,11 @@
 *******************************************************************************/
 static void rw_t2t_ntf_tlv_detect_complete(tNFC_STATUS status) {
   tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
-  tRW_DETECT_NDEF_DATA ndef_data = {
-      0,
-  };
-  tRW_DETECT_TLV_DATA tlv_data;
-  tRW_T2T_DETECT evt_data;
   uint8_t xx;
 
   if (p_t2t->tlv_detect == TAG_NDEF_TLV) {
     /* Notify upper layer the result of NDEF detect op */
+    tRW_DETECT_NDEF_DATA ndef_data = {};
     ndef_data.status = status;
     ndef_data.protocol = NFC_PROTOCOL_T2T;
     ndef_data.flags = rw_t2t_get_ndef_flags();
@@ -270,14 +272,19 @@
     }
 
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_NDEF_DETECT_EVT, (tRW_DATA*)&ndef_data);
+    tRW_DATA rw_data;
+    rw_data.ndef = ndef_data;
+    (*rw_cb.p_cback)(RW_T2T_NDEF_DETECT_EVT, &rw_data);
   } else if (p_t2t->tlv_detect == TAG_PROPRIETARY_TLV) {
+    tRW_T2T_DETECT evt_data;
     evt_data.msg_len = p_t2t->prop_msg_len;
     evt_data.status = status;
     rw_t2t_handle_op_complete();
+    /* FIXME: Unsafe cast */
     (*rw_cb.p_cback)(RW_T2T_TLV_DETECT_EVT, (tRW_DATA*)&evt_data);
   } else {
     /* Notify upper layer the result of Lock/Mem TLV detect op */
+    tRW_DETECT_TLV_DATA tlv_data;
     tlv_data.protocol = NFC_PROTOCOL_T2T;
     if (p_t2t->tlv_detect == TAG_LOCK_CTRL_TLV) {
       tlv_data.num_bytes = p_t2t->num_lockbytes;
@@ -289,7 +296,9 @@
     }
     tlv_data.status = status;
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_TLV_DETECT_EVT, (tRW_DATA*)&tlv_data);
+    tRW_DATA rw_data;
+    rw_data.tlv = tlv_data;
+    (*rw_cb.p_cback)(RW_T2T_TLV_DETECT_EVT, &rw_data);
   }
 }
 
@@ -588,7 +597,7 @@
             if (p_t2t->bytes_count > 0) {
               p_t2t->bytes_count--;
             } else {
-              RW_TRACE_ERROR0("Underflow p_t2t->bytes_count!");
+              LOG(ERROR) << StringPrintf("Underflow p_t2t->bytes_count!");
               android_errorWriteLog(0x534e4554, "120506143");
             }
             if ((tlvtype == TAG_LOCK_CTRL_TLV) || (tlvtype == TAG_NDEF_TLV)) {
@@ -641,14 +650,14 @@
             if (p_t2t->bytes_count > 0) {
               p_t2t->bytes_count--;
             } else {
-              RW_TRACE_ERROR0("bytes_count underflow!");
+              LOG(ERROR) << StringPrintf("bytes_count underflow!");
               android_errorWriteLog(0x534e4554, "120506143");
             }
             if ((tlvtype == TAG_MEM_CTRL_TLV) || (tlvtype == TAG_NDEF_TLV)) {
               p_t2t->tlv_value[2 - p_t2t->bytes_count] = p_data[offset];
               if (p_t2t->bytes_count == 0) {
                 if (p_t2t->num_mem_tlvs >= RW_T2T_MAX_MEM_TLVS) {
-                  RW_TRACE_ERROR0(
+                  LOG(ERROR) << StringPrintf(
                       "rw_t2t_handle_tlv_detect_rsp - Maximum buffer allocated "
                       "for Memory tlv has reached");
                   failed = true;
@@ -678,7 +687,7 @@
             if (p_t2t->bytes_count > 0) {
               p_t2t->bytes_count--;
             } else {
-              RW_TRACE_ERROR0("bytes_count underflow!");
+              LOG(ERROR) << StringPrintf("bytes_count underflow!");
               android_errorWriteLog(0x534e4554, "120506143");
             }
             if (tlvtype == TAG_PROPRIETARY_TLV) {
@@ -1500,7 +1509,9 @@
     evt_data.status = failed ? NFC_STATUS_FAILED : NFC_STATUS_OK;
     evt_data.p_data = NULL;
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_NDEF_READ_EVT, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*rw_cb.p_cback)(RW_T2T_NDEF_READ_EVT, &rw_data);
   }
 }
 
@@ -1666,7 +1677,9 @@
       p_t2t->ndef_msg_len = p_t2t->new_ndef_msg_len;
     }
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_NDEF_WRITE_EVT, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*rw_cb.p_cback)(RW_T2T_NDEF_WRITE_EVT, &rw_data);
   }
 }
 
@@ -1711,7 +1724,6 @@
   tNFC_STATUS status = NFC_STATUS_FAILED;
   bool b_notify = false;
   uint8_t write_block[T2T_BLOCK_SIZE];
-  tRW_DATA evt;
   bool b_pending = false;
   uint8_t read_lock = 0;
   uint8_t num_locks = 0;
@@ -1795,9 +1807,10 @@
 
   if (status != NFC_STATUS_OK || b_notify) {
     /* Notify upper layer the result of Configuring Tag as Read only */
+    tRW_DATA evt;
     evt.status = status;
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_SET_TAG_RO_EVT, (tRW_DATA*)&evt);
+    (*rw_cb.p_cback)(RW_T2T_SET_TAG_RO_EVT, &evt);
   }
 }
 
@@ -1811,7 +1824,6 @@
 **
 *******************************************************************************/
 static void rw_t2t_handle_format_tag_rsp(uint8_t* p_data) {
-  tRW_DATA evt;
   uint8_t* p;
   tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
   tNFC_STATUS status = NFC_STATUS_FAILED;
@@ -1913,9 +1925,10 @@
 
   if (status != NFC_STATUS_OK || b_notify) {
     /* Notify upper layer the result of Format op */
+    tRW_DATA evt;
     evt.status = status;
     rw_t2t_handle_op_complete();
-    (*rw_cb.p_cback)(RW_T2T_FORMAT_CPLT_EVT, (tRW_DATA*)&evt);
+    (*rw_cb.p_cback)(RW_T2T_FORMAT_CPLT_EVT, &evt);
   }
 }
 
@@ -2565,7 +2578,7 @@
 
   p_ret = t2t_tag_init_data(p_t2t->tag_hdr[0], false, 0);
   if (p_ret == NULL) {
-    RW_TRACE_WARNING1(
+    LOG(WARNING) << StringPrintf(
         "rw_t2t_format_tag - Unknown Manufacturer ID: %u, Cannot Format the "
         "tag!",
         p_t2t->tag_hdr[0]);
@@ -2575,7 +2588,7 @@
   if (p_t2t->tag_hdr[T2T_CC2_TMS_BYTE] != 0) {
     /* If OTP tag has valid NDEF Message, cannot format the tag */
     if ((p_t2t->ndef_msg_len > 0) && (p_ret->b_otp)) {
-      RW_TRACE_WARNING0(
+      LOG(WARNING) << StringPrintf(
           "rw_t2t_format_tag - Cannot Format a OTP tag with NDEF Message!");
       return (NFC_STATUS_FAILED);
     }
@@ -2586,7 +2599,8 @@
          (p_t2t->tag_hdr[T2T_CC1_VNO_BYTE] != T2T_CC1_LEGACY_VNO) &&
          (p_t2t->tag_hdr[T2T_CC1_VNO_BYTE] != T2T_CC1_VNO) &&
          (p_t2t->tag_hdr[T2T_CC1_VNO_BYTE] != T2T_CC1_NEW_VNO))) {
-      RW_TRACE_WARNING0("rw_t2t_format_tag - Tag not blank to Format!");
+      LOG(WARNING) << StringPrintf(
+          "rw_t2t_format_tag - Tag not blank to Format!");
       return (NFC_STATUS_FAILED);
     } else {
       tms = p_t2t->tag_hdr[T2T_CC2_TMS_BYTE];
@@ -2637,7 +2651,7 @@
 
   /* If CC block is read and cc3 is soft locked, reject the command */
   if ((p_t2t->tag_hdr[T2T_CC3_RWA_BYTE] & T2T_CC3_RWA_RO) == T2T_CC3_RWA_RO) {
-    RW_TRACE_ERROR1(
+    LOG(ERROR) << StringPrintf(
         "rw_t2t_soft_lock_tag: Error: Type 2 tag is in Read only state, CC3: "
         "%u",
         p_t2t->tag_hdr[T2T_CC3_RWA_BYTE]);
@@ -2652,7 +2666,7 @@
 
     if ((p_t2t->tag_hdr[T2T_CC2_TMS_BYTE] != T2T_CC2_TMS_STATIC) &&
         (p_t2t->num_lockbytes == 0)) {
-      RW_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "rw_t2t_soft_lock_tag: Error: Lock TLV not detected! Cannot hard "
           "lock the tag");
       return (NFC_STATUS_FAILED);
@@ -2700,8 +2714,9 @@
   tNFC_STATUS status = NFC_STATUS_FAILED;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_WARNING1("RW_T2tFormatNDef - Tag not initialized/ Busy! State: %u",
-                      p_t2t->state);
+    LOG(WARNING) << StringPrintf(
+        "RW_T2tFormatNDef - Tag not initialized/ Busy! State: %u",
+        p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2744,21 +2759,22 @@
   uint16_t block;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_BUSY);
   }
 
   if ((tlv_type != TAG_LOCK_CTRL_TLV) && (tlv_type != TAG_MEM_CTRL_TLV) &&
       (tlv_type != TAG_NDEF_TLV) && (tlv_type != TAG_PROPRIETARY_TLV)) {
-    RW_TRACE_API1("RW_T2tLocateTlv - Cannot search TLV: 0x%02x", tlv_type);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "RW_T2tLocateTlv - Cannot search TLV: 0x%02x", tlv_type);
     return (NFC_STATUS_FAILED);
   }
 
   if ((tlv_type == TAG_LOCK_CTRL_TLV) && (p_t2t->b_read_hdr) &&
       (p_t2t->tag_hdr[T2T_CC2_TMS_BYTE] == T2T_CC2_TMS_STATIC)) {
     p_t2t->b_read_hdr = false;
-    RW_TRACE_API1(
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
         "RW_T2tLocateTlv - No Lock tlv in static structure tag, CC[0]: 0x%02x",
         p_t2t->tag_hdr[T2T_CC2_TMS_BYTE]);
     return (NFC_STATUS_FAILED);
@@ -2767,7 +2783,7 @@
   if ((tlv_type == TAG_NDEF_TLV) && (p_t2t->b_read_hdr) &&
       (p_t2t->tag_hdr[T2T_CC0_NMN_BYTE] != T2T_CC0_NMN)) {
     p_t2t->b_read_hdr = false;
-    RW_TRACE_WARNING3(
+    LOG(WARNING) << StringPrintf(
         "RW_T2tLocateTlv - Invalid NDEF Magic Number!, CC[0]: 0x%02x, CC[1]: "
         "0x%02x, CC[3]: 0x%02x",
         p_t2t->tag_hdr[T2T_CC0_NMN_BYTE], p_t2t->tag_hdr[T2T_CC1_VNO_BYTE],
@@ -2868,26 +2884,27 @@
   uint16_t block;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
   if (p_t2t->ndef_status == T2T_NDEF_NOT_DETECTED) {
-    RW_TRACE_ERROR0("RW_T2tReadNDef - Error: NDEF detection not performed yet");
+    LOG(ERROR) << StringPrintf(
+        "RW_T2tReadNDef - Error: NDEF detection not performed yet");
     return (NFC_STATUS_FAILED);
   }
 
   if (buf_len < p_t2t->ndef_msg_len) {
-    RW_TRACE_WARNING2(
+    LOG(WARNING) << StringPrintf(
         "RW_T2tReadNDef - buffer size: %u  less than NDEF msg sise: %u",
         buf_len, p_t2t->ndef_msg_len);
     return (NFC_STATUS_FAILED);
   }
 
   if (!p_t2t->ndef_msg_len) {
-    RW_TRACE_WARNING1("RW_T2tReadNDef - NDEF Message length is zero ",
-                      p_t2t->ndef_msg_len);
+    LOG(WARNING) << StringPrintf(
+        "RW_T2tReadNDef - NDEF Message length is zero");
     return (NFC_STATUS_NOT_INITIALIZED);
   }
 
@@ -2945,25 +2962,27 @@
   tNFC_STATUS status = NFC_STATUS_OK;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: Type 2 tag not activated or Busy - State: %u",
-                    p_t2t->state);
+    LOG(ERROR) << StringPrintf(
+        "Error: Type 2 tag not activated or Busy - State: %u", p_t2t->state);
     return (NFC_STATUS_FAILED);
   }
 
   if (p_t2t->ndef_status == T2T_NDEF_NOT_DETECTED) {
-    RW_TRACE_ERROR0("RW_T2tWriteNDef - Error: NDEF detection not performed!");
+    LOG(ERROR) << StringPrintf(
+        "RW_T2tWriteNDef - Error: NDEF detection not performed!");
     return (NFC_STATUS_FAILED);
   }
 
   if (p_t2t->tag_hdr[T2T_CC3_RWA_BYTE] != T2T_CC3_RWA_RW) {
-    RW_TRACE_ERROR1("RW_T2tWriteNDef - Write access not granted - CC3: %u",
-                    p_t2t->tag_hdr[T2T_CC3_RWA_BYTE]);
+    LOG(ERROR) << StringPrintf(
+        "RW_T2tWriteNDef - Write access not granted - CC3: %u",
+        p_t2t->tag_hdr[T2T_CC3_RWA_BYTE]);
     return (NFC_STATUS_REFUSED);
   }
 
   /* Check if there is enough memory on the tag */
   if (msg_len > p_t2t->max_ndef_msg_len) {
-    RW_TRACE_ERROR1(
+    LOG(ERROR) << StringPrintf(
         "RW_T2tWriteNDef - Cannot write NDEF of size greater than %u bytes",
         p_t2t->max_ndef_msg_len);
     return (NFC_STATUS_FAILED);
@@ -2974,7 +2993,7 @@
   if ((p_t2t->ndef_msg_len > 0) &&
       ((p_ret = t2t_tag_init_data(p_t2t->tag_hdr[0], false, 0)) != NULL) &&
       (p_ret->b_otp)) {
-    RW_TRACE_WARNING0(
+    LOG(WARNING) << StringPrintf(
         "RW_T2tWriteNDef - Cannot Overwrite NDEF Message on a OTP tag!");
     return (NFC_STATUS_FAILED);
   }
@@ -3021,7 +3040,7 @@
   tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
 
   if (p_t2t->state != RW_T2T_STATE_IDLE) {
-    RW_TRACE_ERROR1(
+    LOG(ERROR) << StringPrintf(
         "RW_T2tSetTagReadOnly: Error: Type 2 tag not activated or Busy - "
         "State: %u",
         p_t2t->state);
diff --git a/src/nfc/tags/rw_t3t.c b/src/nfc/tags/rw_t3t.cc
similarity index 90%
rename from src/nfc/tags/rw_t3t.c
rename to src/nfc/tags/rw_t3t.cc
index c5df1b7..ea88fc9 100644
--- a/src/nfc/tags/rw_t3t.c
+++ b/src/nfc/tags/rw_t3t.cc
@@ -22,20 +22,25 @@
  *  mode.
  *
  ******************************************************************************/
-#include <log/log.h>
 #include <string.h>
 
-#include "bt_types.h"
-#include "nfc_target.h"
-#include "trace_api.h"
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+#include <log/log.h>
 
-#include "gki.h"
+#include "nfc_target.h"
+
+#include "bt_types.h"
 #include "nci_hmsgs.h"
 #include "nfc_api.h"
 #include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
-#include "tags_int.h"
+#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* Definitions for constructing t3t command messages */
 #define RW_T3T_FL_PADDING 0x01 /* Padding needed for last NDEF block */
@@ -62,7 +67,7 @@
 #define RW_T3T_MIN_TIMEOUT_TICKS 10
 
 /* Macro to extract major version from NDEF version byte */
-#define T3T_GET_MAJOR_VERSION(ver) (ver >> 4)
+#define T3T_GET_MAJOR_VERSION(ver) ((ver) >> 4)
 
 /* Enumeration of API commands */
 enum {
@@ -123,14 +128,12 @@
                                   block-write to complete */
 };
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* rw_t3t_cmd_str(uint8_t cmd_id);
-static char* rw_t3t_state_str(uint8_t state_id);
-#endif
+static std::string rw_t3t_cmd_str(uint8_t cmd_id);
+static std::string rw_t3t_state_str(uint8_t state_id);
 
 /* Local static functions */
 static void rw_t3t_update_ndef_flag(uint8_t* p_flag);
-static tNFC_STATUS rw_t3t_unselect(uint8_t peer_nfcid2[]);
+static tNFC_STATUS rw_t3t_unselect();
 static NFC_HDR* rw_t3t_get_cmd_buf(void);
 static tNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg);
 static void rw_t3t_handle_get_system_codes_cplt(void);
@@ -140,17 +143,11 @@
                                           uint8_t* p_sensf_res_buf);
 static void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb,
                                                uint8_t nci_status,
-                                               uint8_t num_responses,
-                                               uint8_t sensf_res_buf_size,
-                                               uint8_t* p_sensf_res_buf);
+                                               uint8_t num_responses);
 static void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
-                                       uint8_t num_responses,
-                                       uint8_t sensf_res_buf_size,
-                                       uint8_t* p_sensf_res_buf);
+                                       uint8_t num_responses);
 static void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
-                                       uint8_t num_responses,
-                                       uint8_t sensf_res_buf_size,
-                                       uint8_t* p_sensf_res_buf);
+                                       uint8_t num_responses);
 
 /* Default NDEF attribute information block (used when formatting Felica-Lite
  * tags) */
@@ -258,15 +255,16 @@
       /* retry sending the command */
       rw_cb.cur_retry++;
 
-      RW_TRACE_DEBUG2("T3T retransmission attempt %i of %i", rw_cb.cur_retry,
-                      RW_MAX_RETRIES);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("T3T retransmission attempt %i of %i",
+                          rw_cb.cur_retry, RW_MAX_RETRIES);
 
       /* allocate a new buffer for message */
       p_cmd_buf = rw_t3t_get_cmd_buf();
       if (p_cmd_buf != NULL) {
-        memcpy(p_cmd_buf, p_cb->p_cur_cmd_buf,
-               sizeof(NFC_HDR) + p_cb->p_cur_cmd_buf->offset +
-                   p_cb->p_cur_cmd_buf->len);
+        memcpy(p_cmd_buf, p_cb->p_cur_cmd_buf, sizeof(NFC_HDR) +
+                                                   p_cb->p_cur_cmd_buf->offset +
+                                                   p_cb->p_cur_cmd_buf->len);
 
         if (rw_t3t_send_to_lower(p_cmd_buf) == NFC_STATUS_OK) {
           /* Start timer for waiting for response */
@@ -279,8 +277,8 @@
         }
       }
     } else {
-      RW_TRACE_DEBUG1("T3T maximum retransmission attempts reached (%i)",
-                      RW_MAX_RETRIES);
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+          "T3T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES);
     }
 
 #if (RW_STATS_INCLUDED == TRUE)
@@ -348,7 +346,7 @@
     p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP;
     evt_data.status = nci_status;
     p_cb->rw_state = RW_T3T_STATE_IDLE;
-    (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
+    (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
   } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) {
     /* Handle POLL ntf in response to get system codes */
     p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP;
@@ -357,18 +355,15 @@
   } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) {
     /* Handle POLL ntf in response to get system codes */
     p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP;
-    rw_t3t_handle_fmt_poll_rsp(p_cb, nci_status, num_responses,
-                               sensf_res_buf_size, p_sensf_res_buf);
+    rw_t3t_handle_fmt_poll_rsp(p_cb, nci_status, num_responses);
   } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) {
     /* Handle POLL ntf in response to get system codes */
     p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP;
-    rw_t3t_handle_sro_poll_rsp(p_cb, nci_status, num_responses,
-                               sensf_res_buf_size, p_sensf_res_buf);
+    rw_t3t_handle_sro_poll_rsp(p_cb, nci_status, num_responses);
   } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) {
     /* Handle POLL ntf in response to ndef detection */
     p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP;
-    rw_t3t_handle_ndef_detect_poll_rsp(p_cb, nci_status, num_responses,
-                                       sensf_res_buf_size, p_sensf_res_buf);
+    rw_t3t_handle_ndef_detect_poll_rsp(p_cb, nci_status, num_responses);
   } else {
     /* Handle POLL ntf in response to RW_T3tPoll */
     evt_data.t3t_poll.status = nci_status;
@@ -402,10 +397,11 @@
   evt_data.t3t_sc.num_system_codes = p_cb->num_system_codes;
   evt_data.t3t_sc.p_system_codes = p_cb->system_codes;
 
-  RW_TRACE_DEBUG1("rw_t3t_handle_get_system_codes_cplt, number of systems: %i",
-                  evt_data.t3t_sc.num_system_codes);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "number of systems: %i", evt_data.t3t_sc.num_system_codes);
   for (i = 0; i < evt_data.t3t_sc.num_system_codes; i++) {
-    RW_TRACE_DEBUG2("   system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]);
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]);
   }
 
   p_cb->rw_state = RW_T3T_STATE_IDLE;
@@ -480,19 +476,14 @@
   /* Check which timer timed out */
   if (p_tle == &p_cb->timer) {
 /* UPDATE/CHECK response timeout */
-#if (BT_TRACE_VERBOSE == TRUE)
-    RW_TRACE_ERROR3("T3T timeout. state=%s cur_cmd=0x%02X (%s)",
-                    rw_t3t_state_str(rw_cb.tcb.t3t.rw_state),
-                    rw_cb.tcb.t3t.cur_cmd,
-                    rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd));
-#else
-    RW_TRACE_ERROR2("T3T timeout. state=0x%02X cur_cmd=0x%02X",
-                    rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd);
-#endif
+LOG(ERROR) << StringPrintf("T3T timeout. state=%s cur_cmd=0x%02X (%s)",
+                           rw_t3t_state_str(rw_cb.tcb.t3t.rw_state).c_str(),
+                           rw_cb.tcb.t3t.cur_cmd,
+                           rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd).c_str());
 
-    rw_t3t_process_error(NFC_STATUS_TIMEOUT);
+rw_t3t_process_error(NFC_STATUS_TIMEOUT);
   } else {
-    RW_TRACE_ERROR0("T3T POLL timeout.");
+    LOG(ERROR) << StringPrintf("T3T POLL timeout.");
 
     /* POLL response timeout */
     if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) {
@@ -500,7 +491,7 @@
       p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP;
       evt_data.status = NFC_STATUS_FAILED;
       p_cb->rw_state = RW_T3T_STATE_IDLE;
-      (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
+      (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
     } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) {
       /* POLL timeout for getting system codes */
       p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP;
@@ -508,22 +499,22 @@
     } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) {
       /* POLL timeout for formatting Felica Lite */
       p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP;
-      RW_TRACE_ERROR0("Felica-Lite tag not detected");
+      LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
       rw_t3t_format_cplt(NFC_STATUS_FAILED);
     } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) {
       /* POLL timeout for configuring Felica Lite read only */
       p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP;
-      RW_TRACE_ERROR0("Felica-Lite tag not detected");
+      LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
       rw_t3t_set_readonly_cplt(NFC_STATUS_FAILED);
     } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) {
       /* POLL timeout for ndef detection */
       p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP;
-      rw_t3t_handle_ndef_detect_poll_rsp(p_cb, NFC_STATUS_TIMEOUT, 0, 0, NULL);
+      rw_t3t_handle_ndef_detect_poll_rsp(p_cb, NFC_STATUS_TIMEOUT, 0);
     } else {
       /* Timeout waiting for response for RW_T3tPoll */
       evt_data.t3t_poll.status = NFC_STATUS_FAILED;
       p_cb->rw_state = RW_T3T_STATE_IDLE;
-      (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, (tRW_DATA*)&evt_data);
+      (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, &evt_data);
     }
   }
 }
@@ -538,14 +529,10 @@
 **
 *******************************************************************************/
 void rw_t3t_process_frame_error(void) {
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_ERROR3("T3T frame error. state=%s cur_cmd=0x%02X (%s)",
-                  rw_t3t_state_str(rw_cb.tcb.t3t.rw_state),
-                  rw_cb.tcb.t3t.cur_cmd, rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd));
-#else
-  RW_TRACE_ERROR2("T3T frame error. state=0x%02X cur_cmd=0x%02X",
-                  rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd);
-#endif
+  LOG(ERROR) << StringPrintf("T3T frame error. state=%s cur_cmd=0x%02X (%s)",
+                             rw_t3t_state_str(rw_cb.tcb.t3t.rw_state).c_str(),
+                             rw_cb.tcb.t3t.cur_cmd,
+                             rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd).c_str());
 
 #if (RW_STATS_INCLUDED == TRUE)
   /* Update stats */
@@ -580,10 +567,6 @@
   UINT8_TO_STREAM(p, (p_msg->len + 1));
   p_msg->len += 1; /* Increment len to include SoD */
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispT3TagMessage(p_msg, false);
-#endif
-
   return (NFC_SendData(NFC_RF_CONN_ID, p_msg));
 }
 
@@ -642,8 +625,9 @@
     p_cb->rw_state = RW_T3T_STATE_IDLE;
   }
 
-  RW_TRACE_DEBUG3("rw_t3t_send_cmd: cur_tout: %d, timeout_ticks: %d ret:%d",
-                  p_cb->cur_tout, timeout_ticks, retval);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("cur_tout: %d, timeout_ticks: %d ret:%d", p_cb->cur_tout,
+                      timeout_ticks, retval);
   return (retval);
 }
 
@@ -927,9 +911,8 @@
       p_cb->ndef_rx_readlen = ((uint32_t)p_cb->ndef_attrib.nbr * 16);
     }
 
-    RW_TRACE_DEBUG3(
-        "rw_t3t_send_next_ndef_check_cmd: bytes_remaining: %i, "
-        "cur_blocks_to_read: %i, is_final: %i",
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "bytes_remaining: %i, cur_blocks_to_read: %i, is_final: %i",
         ndef_bytes_remaining, cur_blocks_to_read,
         (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT));
 
@@ -1186,7 +1169,7 @@
     return rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf,
                            rw_t3t_check_timeout(1));
   } else {
-    RW_TRACE_ERROR0("Unable to allocate buffer to read MC block");
+    LOG(ERROR) << StringPrintf("Unable to allocate buffer to read MC block");
     return (NFC_STATUS_NO_BUFFERS);
   }
 }
@@ -1253,9 +1236,9 @@
 
   /* Check if response code is CHECK resp (for reading NDEF attribute block) */
   if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
-    RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                    T3T_MSG_OPC_CHECK_RSP,
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+    LOG(ERROR) << StringPrintf(
+        "Response error: expecting rsp_code %02X, but got %02X",
+        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
     evt_data.status = NFC_STATUS_FAILED;
   }
   /* Validate status code and NFCID2 response from tag */
@@ -1287,7 +1270,7 @@
           NFC_STATUS_FAILED; /* only ok or failed passed to the app. can be
                                 boolean*/
 
-      RW_TRACE_ERROR0("RW_T3tDetectNDEF checksum failed");
+      LOG(ERROR) << StringPrintf("RW_T3tDetectNDEF checksum failed");
     } else {
       p_cb->ndef_attrib.status = NFC_STATUS_OK;
 
@@ -1298,7 +1281,7 @@
           T3T_GET_MAJOR_VERSION(p_cb->ndef_attrib.version)) {
         /* Remote tag's MajorVer is newer than our's. Reject NDEF as per T3TOP
          * RQ_T3T_NDA_024 */
-        RW_TRACE_ERROR2(
+        LOG(ERROR) << StringPrintf(
             "RW_T3tDetectNDEF: incompatible NDEF version. Local=0x%02x, "
             "Remote=0x%02x",
             T3T_MSG_NDEF_VERSION, p_cb->ndef_attrib.version);
@@ -1332,8 +1315,9 @@
         BE_STREAM_TO_UINT16(p_cb->ndef_attrib.ln, p); /* Ln: lo-word */
         p_cb->ndef_attrib.ln += (temp << 16);
 
-        RW_TRACE_DEBUG1("Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version);
-        RW_TRACE_DEBUG6(
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+            "Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version);
+        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
             "Detected NDEF Attributes: Nbr=%i, Nbw=%i, Nmaxb=%i, WriteF=%i, "
             "RWFlag=%i, Ln=%i",
             p_cb->ndef_attrib.nbr, p_cb->ndef_attrib.nbw,
@@ -1352,12 +1336,15 @@
     }
   }
 
-  RW_TRACE_DEBUG1("RW_T3tDetectNDEF response: %i", evt_data.status);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW_T3tDetectNDEF response: %i", evt_data.status);
 
   p_cb->rw_state = RW_T3T_STATE_IDLE;
   rw_t3t_update_ndef_flag(&evt_data.flags);
   /* Notify app of NDEF detection result */
-  (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, (tRW_DATA*)&evt_data);
+  tRW_DATA rw_data;
+  rw_data.ndef = evt_data;
+  (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, &rw_data);
 
   GKI_freebuf(p_msg_rsp);
 }
@@ -1385,9 +1372,9 @@
     nfc_status = NFC_STATUS_FAILED;
     GKI_freebuf(p_msg_rsp);
   } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
-    RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                    T3T_MSG_OPC_CHECK_RSP,
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+    LOG(ERROR) << StringPrintf(
+        "Response error: expecting rsp_code %02X, but got %02X",
+        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
     nfc_status = NFC_STATUS_FAILED;
     GKI_freebuf(p_msg_rsp);
   } else if (p_msg_rsp->len >= T3T_MSG_RSP_OFFSET_CHECK_DATA) {
@@ -1397,7 +1384,9 @@
     p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA;
     evt_data.status = NFC_STATUS_OK;
     evt_data.p_data = p_msg_rsp;
-    (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&evt_data);
+    tRW_DATA rw_data;
+    rw_data.data = evt_data;
+    (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, &rw_data);
   } else {
     android_errorWriteLog(0x534e4554, "120503926");
     nfc_status = NFC_STATUS_FAILED;
@@ -1406,7 +1395,9 @@
 
   p_cb->rw_state = RW_T3T_STATE_IDLE;
 
-  (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&nfc_status);
+  tRW_DATA rw_data;
+  rw_data.status = nfc_status;
+  (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, &rw_data);
 }
 
 /*****************************************************************************
@@ -1430,9 +1421,9 @@
   {
     evt_data.status = NFC_STATUS_FAILED;
   } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) {
-    RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                    T3T_MSG_OPC_UPDATE_RSP,
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+    LOG(ERROR) << StringPrintf(
+        "Response error: expecting rsp_code %02X, but got %02X",
+        T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
     evt_data.status = NFC_STATUS_FAILED;
   } else {
     /* Copy incoming data into buffer */
@@ -1441,7 +1432,9 @@
 
   p_cb->rw_state = RW_T3T_STATE_IDLE;
 
-  (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data);
+  tRW_DATA rw_data;
+  rw_data.data = evt_data;
+  (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, &rw_data);
 
   GKI_freebuf(p_msg_rsp);
 }
@@ -1460,13 +1453,9 @@
   tRW_READ_DATA evt_data;
   NFC_HDR* p_pkt = p_data->p_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len,
-                  NFC_GetStatusName(p_data->status));
-#else
-  RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [0x%X]", p_pkt->len,
-                  p_data->status);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len,
+                      NFC_GetStatusName(p_data->status).c_str());
 
   /* Copy incoming data into buffer */
   evt_data.status = p_data->status;
@@ -1474,7 +1463,9 @@
 
   p_cb->rw_state = RW_T3T_STATE_IDLE;
 
-  (*(rw_cb.p_cback))(RW_T3T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data);
+  tRW_DATA rw_data;
+  rw_data.data = evt_data;
+  (*(rw_cb.p_cback))(RW_T3T_RAW_FRAME_EVT, &rw_data);
 }
 
 /*****************************************************************************
@@ -1489,8 +1480,6 @@
 void rw_t3t_act_handle_check_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
   bool check_complete = true;
   tNFC_STATUS nfc_status = NFC_STATUS_OK;
-  tRW_READ_DATA read_data;
-  tRW_DATA evt_data;
   uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
   uint8_t rsp_num_bytes_rx;
 
@@ -1502,15 +1491,16 @@
       || (p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] !=
           ((p_cb->ndef_rx_readlen + 15) >> 4))) /* verify length of response */
   {
-    RW_TRACE_ERROR2("Response error: bad status, nfcid2, or invalid len: %i %i",
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS],
-                    ((p_cb->ndef_rx_readlen + 15) >> 4));
+    LOG(ERROR) << StringPrintf(
+        "Response error: bad status, nfcid2, or invalid len: %i %i",
+        p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS],
+        ((p_cb->ndef_rx_readlen + 15) >> 4));
     nfc_status = NFC_STATUS_FAILED;
     GKI_freebuf(p_msg_rsp);
   } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
-    RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                    T3T_MSG_OPC_CHECK_RSP,
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+    LOG(ERROR) << StringPrintf(
+        "Response error: expecting rsp_code %02X, but got %02X",
+        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
     nfc_status = NFC_STATUS_FAILED;
     GKI_freebuf(p_msg_rsp);
   } else if (p_msg_rsp->len >= T3T_MSG_RSP_OFFSET_CHECK_DATA &&
@@ -1519,7 +1509,6 @@
     /* Number of bytes received, according to header */
     rsp_num_bytes_rx = p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] * 16;
     p_cb->ndef_rx_offset += p_cb->ndef_rx_readlen;
-    read_data.status = NFC_STATUS_OK;
     p_msg_rsp->offset +=
         T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header (point to block
                                           data) */
@@ -1528,7 +1517,7 @@
     /* Verify that the bytes received is really the amount indicated in the
      * check-response header */
     if (rsp_num_bytes_rx > p_msg_rsp->len) {
-      RW_TRACE_ERROR2(
+      LOG(ERROR) << StringPrintf(
           "Response error: CHECK rsp header indicates %i bytes, but only "
           "received %i bytes",
           rsp_num_bytes_rx, p_msg_rsp->len);
@@ -1543,8 +1532,10 @@
       }
 
       p_msg_rsp->len = rsp_num_bytes_rx;
-      read_data.p_data = p_msg_rsp;
-      (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&read_data);
+      tRW_DATA rw_data;
+      rw_data.data.status = NFC_STATUS_OK;
+      rw_data.data.p_data = p_msg_rsp;
+      (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, &rw_data);
 
       /* Send CHECK cmd for next NDEF segment, if needed */
       if (!(p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)) {
@@ -1560,15 +1551,16 @@
     android_errorWriteLog(0x534e4554, "120502559");
     GKI_freebuf(p_msg_rsp);
     nfc_status = NFC_STATUS_FAILED;
-    RW_TRACE_ERROR0("Underflow in p_msg_rsp->len!");
+    LOG(ERROR) << StringPrintf("Underflow in p_msg_rsp->len!");
   }
 
   /* Notify app of RW_T3T_CHECK_CPLT_EVT if entire NDEF has been read, or if
    * failure */
   if (check_complete) {
     p_cb->rw_state = RW_T3T_STATE_IDLE;
+    tRW_DATA evt_data;
     evt_data.status = nfc_status;
-    (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&evt_data);
+    (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, &evt_data);
   }
 }
 
@@ -1584,7 +1576,6 @@
 void rw_t3t_act_handle_update_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
   bool update_complete = true;
   tNFC_STATUS nfc_status = NFC_STATUS_OK;
-  tRW_DATA evt_data;
   uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
 
   /* Check nfcid2 and status of response */
@@ -1597,9 +1588,9 @@
   }
   /* Validate response opcode */
   else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) {
-    RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                    T3T_MSG_OPC_UPDATE_RSP,
-                    p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+    LOG(ERROR) << StringPrintf(
+        "Response error: expecting rsp_code %02X, but got %02X",
+        T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
     nfc_status = NFC_STATUS_FAILED;
   }
   /* If this is response to final UPDATE, then update NDEF local size */
@@ -1630,8 +1621,9 @@
   /* If update is completed, then notify app */
   if (update_complete) {
     p_cb->rw_state = RW_T3T_STATE_IDLE;
+    tRW_DATA evt_data;
     evt_data.status = nfc_status;
-    (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data);
+    (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, &evt_data);
   }
 
   GKI_freebuf(p_msg_rsp);
@@ -1662,11 +1654,12 @@
     p = &p_sensf_res_buf[RW_T3T_SENSF_RES_RD_OFFSET];
     BE_STREAM_TO_UINT16(sc, p);
 
-    RW_TRACE_DEBUG1("FeliCa detected (RD, system code %04X)", sc);
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("FeliCa detected (RD, system code %04X)", sc);
     if (p_cb->num_system_codes < T3T_MAX_SYSTEM_CODES) {
       p_cb->system_codes[p_cb->num_system_codes++] = sc;
     } else {
-      RW_TRACE_ERROR0("Exceed T3T_MAX_SYSTEM_CODES!");
+      LOG(ERROR) << StringPrintf("Exceed T3T_MAX_SYSTEM_CODES!");
       android_errorWriteLog(0x534e4554, "120499324");
     }
   }
@@ -1685,9 +1678,7 @@
 *****************************************************************************/
 static void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb,
                                                uint8_t nci_status,
-                                               uint8_t num_responses,
-                                               uint8_t sensf_res_buf_size,
-                                               uint8_t* p_sensf_res_buf) {
+                                               uint8_t num_responses) {
   NFC_HDR* p_cmd_buf;
   uint8_t *p, *p_cmd_start;
   tRW_DATA evt_data;
@@ -1809,9 +1800,7 @@
 **
 *****************************************************************************/
 static void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
-                                       uint8_t num_responses,
-                                       uint8_t sensf_res_buf_size,
-                                       uint8_t* p_sensf_res_buf) {
+                                       uint8_t num_responses) {
   tRW_DATA evt_data;
 
   evt_data.status = NFC_STATUS_OK;
@@ -1820,14 +1809,15 @@
   if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) {
     /* Tag responded for Felica-Lite poll */
     /* Get MemoryControl block */
-    RW_TRACE_DEBUG0("Felica-Lite tag detected...getting Memory Control block.");
+    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+        "Felica-Lite tag detected...getting Memory Control block.");
 
     p_cb->rw_substate = RW_T3T_FMT_SST_CHECK_MC_BLK;
 
     /* Send command to check Memory Configuration block */
     evt_data.status = rw_t3t_check_mc_block(p_cb);
   } else {
-    RW_TRACE_ERROR0("Felica-Lite tag not detected");
+    LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
     evt_data.status = NFC_STATUS_FAILED;
   }
 
@@ -1857,9 +1847,9 @@
   if (p_cb->rw_substate == RW_T3T_FMT_SST_CHECK_MC_BLK) {
     /* Validate response opcode */
     if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
-      RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                      T3T_MSG_OPC_CHECK_RSP,
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+      LOG(ERROR) << StringPrintf(
+          "Response error: expecting rsp_code %02X, but got %02X",
+          T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
       evt_data.status = NFC_STATUS_FAILED;
     }
     /* Validate status code and NFCID2 response from tag */
@@ -1912,9 +1902,9 @@
         (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))
 
     {
-      RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X",
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
+      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
       evt_data.status = NFC_STATUS_FAILED;
     } else {
       /* SYS_OP=1: ndef already enabled. Just need to update attribute
@@ -1934,9 +1924,9 @@
         (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))
 
     {
-      RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X",
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
+      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
       evt_data.status = NFC_STATUS_FAILED;
     }
 
@@ -1956,9 +1946,7 @@
 **
 *****************************************************************************/
 static void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
-                                       uint8_t num_responses,
-                                       uint8_t sensf_res_buf_size,
-                                       uint8_t* p_sensf_res_buf) {
+                                       uint8_t num_responses) {
   tRW_DATA evt_data;
   uint8_t rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE];
   uint8_t* p;
@@ -1973,7 +1961,7 @@
     /* Tag responded for Felica-Lite poll */
     if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) {
       /* First update attribute information block */
-      RW_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "Felica-Lite tag detected...update NDef attribution block.");
 
       p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB;
@@ -2015,7 +2003,7 @@
           rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_ndef_attrib_info);
     } else if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) {
       /* NDEF is already read only, Read and update MemoryControl block */
-      RW_TRACE_DEBUG0(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "Felica-Lite tag detected...getting Memory Control block.");
       p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK;
 
@@ -2023,7 +2011,7 @@
       evt_data.status = rw_t3t_check_mc_block(p_cb);
     }
   } else {
-    RW_TRACE_ERROR0("Felica-Lite tag not detected");
+    LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
     evt_data.status = NFC_STATUS_FAILED;
   }
 
@@ -2055,9 +2043,9 @@
         (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))
 
     {
-      RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X",
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
+      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
       evt_data.status = NFC_STATUS_FAILED;
     } else {
       p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RO;
@@ -2074,9 +2062,9 @@
     /* Check tags's response for reading MemoryControl block, Validate response
      * opcode */
     if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
-      RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X",
-                      T3T_MSG_OPC_CHECK_RSP,
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
+      LOG(ERROR) << StringPrintf(
+          "Response error: expecting rsp_code %02X, but got %02X",
+          T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
       evt_data.status = NFC_STATUS_FAILED;
     }
     /* Validate status code and NFCID2 response from tag */
@@ -2120,9 +2108,9 @@
         (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))
 
     {
-      RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X",
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
-                      p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
+      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
+                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
       evt_data.status = NFC_STATUS_FAILED;
     } else {
       rw_t3t_set_readonly_cplt(evt_data.status);
@@ -2146,7 +2134,8 @@
 ** Returns          none
 **
 *******************************************************************************/
-void rw_t3t_data_cback(uint8_t conn_id, tNFC_DATA_CEVT* p_data) {
+void rw_t3t_data_cback(__attribute__((unused)) uint8_t conn_id,
+                       tNFC_DATA_CEVT* p_data) {
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
   NFC_HDR* p_msg = p_data->p_data;
   bool free_msg = false; /* if TRUE, free msg buffer before returning */
@@ -2170,8 +2159,8 @@
   }
   /* Sanity check: verify msg len is big enough to contain t3t header */
   else if (p_msg->len < T3T_MSG_RSP_COMMON_HDR_LEN) {
-    RW_TRACE_ERROR1("T3T: invalid Type3 Tag Message (invalid len: %i)",
-                    p_msg->len);
+    LOG(ERROR) << StringPrintf(
+        "T3T: invalid Type3 Tag Message (invalid len: %i)", p_msg->len);
     free_msg = true;
 
     rw_t3t_process_frame_error();
@@ -2180,17 +2169,13 @@
     p = (uint8_t*)(p_msg + 1) + p_msg->offset;
     sod = p[0];
     if (p[sod] != NCI_STATUS_OK) {
-      RW_TRACE_ERROR1("T3T: rf frame error (crc status=%i)", p[sod]);
+      LOG(ERROR) << StringPrintf("T3T: rf frame error (crc status=%i)", p[sod]);
       GKI_freebuf(p_msg);
 
       rw_t3t_process_frame_error();
       return;
     }
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-    DispT3TagMessage(p_msg, true);
-#endif
-
     /* Skip over SoD */
     p_msg->offset++;
     p_msg->len--;
@@ -2253,7 +2238,8 @@
 void rw_t3t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                        tNFC_CONN* p_data) {
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
-  RW_TRACE_DEBUG2("rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event);
 
   /* Only handle NFC_RF_CONN_ID conn_id */
   if (conn_id != NFC_RF_CONN_ID) {
@@ -2262,7 +2248,7 @@
 
   switch (event) {
     case NFC_DEACTIVATE_CEVT:
-      rw_t3t_unselect(NULL);
+      rw_t3t_unselect();
       break;
 
     case NFC_DATA_CEVT: /* check for status in tNFC_CONN */
@@ -2331,7 +2317,7 @@
                           uint8_t mrti_check, uint8_t mrti_update) {
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API0("rw_t3t_select");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   memcpy(p_cb->peer_nfcid2, peer_nfcid2,
          NCI_NFCID2_LEN); /* Store tag's NFCID2 */
@@ -2347,7 +2333,7 @@
   if (p_cb->p_cur_cmd_buf == NULL) {
     p_cb->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
     if (p_cb->p_cur_cmd_buf == NULL) {
-      RW_TRACE_ERROR0(
+      LOG(ERROR) << StringPrintf(
           "rw_t3t_select: unable to allocate buffer for retransmission");
       p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED;
       return (NFC_STATUS_FAILED);
@@ -2368,7 +2354,7 @@
 ** Returns          NFC_STATUS_OK
 **
 *******************************************************************************/
-static tNFC_STATUS rw_t3t_unselect(uint8_t peer_nfcid2[]) {
+static tNFC_STATUS rw_t3t_unselect() {
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
 #if (RW_STATS_INCLUDED == TRUE)
@@ -2413,7 +2399,6 @@
   }
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         rw_t3t_cmd_str
@@ -2423,29 +2408,22 @@
 ** Returns          command string
 **
 *******************************************************************************/
-static char* rw_t3t_cmd_str(uint8_t cmd_id) {
+static std::string rw_t3t_cmd_str(uint8_t cmd_id) {
   switch (cmd_id) {
     case RW_T3T_CMD_DETECT_NDEF:
       return "RW_T3T_CMD_DETECT_NDEF";
-
     case RW_T3T_CMD_CHECK_NDEF:
       return "RW_T3T_CMD_CHECK_NDEF";
-
     case RW_T3T_CMD_UPDATE_NDEF:
       return "RW_T3T_CMD_UPDATE_NDEF";
-
     case RW_T3T_CMD_CHECK:
       return "RW_T3T_CMD_CHECK";
-
     case RW_T3T_CMD_UPDATE:
       return "RW_T3T_CMD_UPDATE";
-
     case RW_T3T_CMD_SEND_RAW_FRAME:
       return "RW_T3T_CMD_SEND_RAW_FRAME";
-
     case RW_T3T_CMD_GET_SYSTEM_CODES:
       return "RW_T3T_CMD_GET_SYSTEM_CODES";
-
     default:
       return "Unknown";
   }
@@ -2460,22 +2438,18 @@
 ** Returns          command string
 **
 *******************************************************************************/
-static char* rw_t3t_state_str(uint8_t state_id) {
+static std::string rw_t3t_state_str(uint8_t state_id) {
   switch (state_id) {
     case RW_T3T_STATE_NOT_ACTIVATED:
       return "RW_T3T_STATE_NOT_ACTIVATED";
-
     case RW_T3T_STATE_IDLE:
       return "RW_T3T_STATE_IDLE";
-
     case RW_T3T_STATE_COMMAND_PENDING:
       return "RW_T3T_STATE_COMMAND_PENDING";
-
     default:
       return "Unknown";
   }
 }
-#endif
 
 /*****************************************************************************
 **  Type3 Tag API Functions
@@ -2503,12 +2477,12 @@
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
   tNFC_STATUS retval = NFC_STATUS_OK;
 
-  RW_TRACE_API0("RW_T3tDetectNDef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2556,20 +2530,20 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API0("RW_T3tCheckNDef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   } else if (p_cb->ndef_attrib.status !=
              NFC_STATUS_OK) /* NDEF detection not performed yet? */
   {
-    RW_TRACE_ERROR0("Error: NDEF detection not performed yet");
+    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
     return (NFC_STATUS_NOT_INITIALIZED);
   } else if (p_cb->ndef_attrib.ln == 0) {
-    RW_TRACE_ERROR0("Type 3 tag contains empty NDEF message");
+    LOG(ERROR) << StringPrintf("Type 3 tag contains empty NDEF message");
     return (NFC_STATUS_FAILED);
   }
 
@@ -2611,17 +2585,18 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API1("RW_T3tUpdateNDef (len=%i)", len);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW_T3tUpdateNDef (len=%i)", len);
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   } else if (p_cb->ndef_attrib.status !=
              NFC_STATUS_OK) /* NDEF detection not performed yet? */
   {
-    RW_TRACE_ERROR0("Error: NDEF detection not performed yet");
+    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
     return (NFC_STATUS_NOT_INITIALIZED);
   } else if (len > (((uint32_t)p_cb->ndef_attrib.nmaxb) *
                     16)) /* Len exceed's tag's NDEF memory? */
@@ -2670,12 +2645,13 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API1("RW_T3tCheck (num_blocks = %i)", num_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW_T3tCheck (num_blocks = %i)", num_blocks);
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2710,12 +2686,13 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API1("RW_T3tUpdate (num_blocks = %i)", num_blocks);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW_T3tUpdate (num_blocks = %i)", num_blocks);
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2746,7 +2723,7 @@
   tRW_DATA evt_data;
   tRW_CB* p_rw_cb = &rw_cb;
 
-  RW_TRACE_API0("RW_T3tPresenceCheck");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* If RW_SelectTagType was not called (no conn_callback) return failure */
   if (!(p_rw_cb->p_cback)) {
@@ -2761,7 +2738,8 @@
   else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_COMMAND_PENDING) {
     /* If already performing presence check, return error */
     if (p_rw_cb->tcb.t3t.flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) {
-      RW_TRACE_DEBUG0("RW_T3tPresenceCheck already in progress");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("RW_T3tPresenceCheck already in progress");
       retval = NFC_STATUS_FAILED;
     }
     /* If busy with any other command, assume that the tag is present */
@@ -2780,7 +2758,7 @@
       /* start timer for waiting for responses */
       rw_t3t_start_poll_timer(&p_rw_cb->tcb.t3t);
     } else {
-      RW_TRACE_DEBUG1(
+      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
           "RW_T3tPresenceCheck error sending NCI_RF_T3T_POLLING cmd (status = "
           "0x%0x)",
           retval);
@@ -2807,12 +2785,12 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API0("RW_T3tPoll");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2851,12 +2829,13 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API1("RW_T3tSendRawFrame (len = %i)", len);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("RW_T3tSendRawFrame (len = %i)", len);
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
@@ -2887,12 +2866,12 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API0("RW_T3tGetSystemCodes");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   } else {
     retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0);
@@ -2932,12 +2911,12 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
 
-  RW_TRACE_API0("RW_T3tFormatNDef");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   } else {
     /* Poll tag, to see if Felica-Lite system is supported */
@@ -2978,19 +2957,20 @@
   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
   tRW_DATA evt_data;
 
-  RW_TRACE_API1("RW_T3tSetReadOnly (): b_hard_lock=%d", b_hard_lock);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("b_hard_lock=%d", b_hard_lock);
 
   /* Check if we are in valid state to handle this API */
   if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
-    RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)",
-                    p_cb->rw_state);
+    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
+                               p_cb->rw_state);
     return (NFC_STATUS_FAILED);
   }
 
   if (p_cb->ndef_attrib.status !=
       NFC_STATUS_OK) /* NDEF detection not performed yet? */
   {
-    RW_TRACE_ERROR0("Error: NDEF detection not performed yet");
+    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
     return (NFC_STATUS_NOT_INITIALIZED);
   }
 
diff --git a/src/nfc/tags/rw_t4t.c b/src/nfc/tags/rw_t4t.cc
similarity index 84%
rename from src/nfc/tags/rw_t4t.c
rename to src/nfc/tags/rw_t4t.cc
index e7b3c96..fd0bbdf 100644
--- a/src/nfc/tags/rw_t4t.c
+++ b/src/nfc/tags/rw_t4t.cc
@@ -23,16 +23,22 @@
  *
  ******************************************************************************/
 #include <string.h>
-#include "bt_types.h"
-#include "nfc_target.h"
-#include "trace_api.h"
 
-#include "gki.h"
+#include <android-base/stringprintf.h>
+#include <base/logging.h>
+
+#include "nfc_target.h"
+
+#include "bt_types.h"
 #include "nfc_api.h"
 #include "nfc_int.h"
 #include "rw_api.h"
 #include "rw_int.h"
-#include "tags_int.h"
+#include "trace_api.h"
+
+using android::base::StringPrintf;
+
+extern bool nfc_debug_enabled;
 
 /* main state */
 /* T4T is not activated                 */
@@ -82,10 +88,8 @@
 #define RW_T4T_SUBSTATE_WAIT_WRITE_CC 0x0F
 #define RW_T4T_SUBSTATE_WAIT_WRITE_NDEF 0x10
 
-#if (BT_TRACE_VERBOSE == TRUE)
-static char* rw_t4t_get_state_name(uint8_t state);
-static char* rw_t4t_get_sub_state_name(uint8_t sub_state);
-#endif
+static std::string rw_t4t_get_state_name(uint8_t state);
+static std::string rw_t4t_get_sub_state_name(uint8_t sub_state);
 
 static bool rw_t4t_send_to_lower(NFC_HDR* p_c_apdu);
 static bool rw_t4t_select_file(uint16_t file_id);
@@ -124,12 +128,8 @@
 **
 *******************************************************************************/
 static bool rw_t4t_send_to_lower(NFC_HDR* p_c_apdu) {
-#if (BT_TRACE_PROTOCOL == TRUE)
-  DispRWT4Tags(p_c_apdu, false);
-#endif
-
   if (NFC_SendData(NFC_RF_CONN_ID, p_c_apdu) != NFC_STATUS_OK) {
-    RW_TRACE_ERROR0("rw_t4t_send_to_lower (): NFC_SendData () failed");
+    LOG(ERROR) << StringPrintf("failed");
     return false;
   }
 
@@ -155,7 +155,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_get_hw_version (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -192,7 +192,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_get_sw_version (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -272,7 +272,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_get_uid_details (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -311,7 +311,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_create_app (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -361,7 +361,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_select_app (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -406,7 +406,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_create_ccfile (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -456,7 +456,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_create_ndef (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -509,7 +509,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_write_cc (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -560,7 +560,7 @@
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_write_ndef (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -604,12 +604,12 @@
   NFC_HDR* p_c_apdu;
   uint8_t* p;
 
-  RW_TRACE_DEBUG1("rw_t4t_select_file (): File ID:0x%04X", file_id);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("File ID:0x%04X", file_id);
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_select_file (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -655,13 +655,13 @@
   NFC_HDR* p_c_apdu;
   uint8_t* p;
 
-  RW_TRACE_DEBUG3("rw_t4t_read_file () offset:%d, length:%d, is_continue:%d, ",
-                  offset, length, is_continue);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "offset:%d, length:%d, is_continue:%d, ", offset, length, is_continue);
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_read_file (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -709,12 +709,12 @@
   NFC_HDR* p_c_apdu;
   uint8_t* p;
 
-  RW_TRACE_DEBUG1("rw_t4t_update_nlen () NLEN:%d", ndef_len);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("NLEN:%d", ndef_len);
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_update_nlen (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -751,13 +751,13 @@
   uint8_t* p;
   uint16_t length;
 
-  RW_TRACE_DEBUG2("rw_t4t_update_file () rw_offset:%d, rw_length:%d",
-                  p_t4t->rw_offset, p_t4t->rw_length);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "rw_offset:%d, rw_length:%d", p_t4t->rw_offset, p_t4t->rw_length);
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_write_file (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -807,13 +807,13 @@
   NFC_HDR* p_c_apdu;
   uint8_t* p;
 
-  RW_TRACE_DEBUG0(
-      "rw_t4t_update_cc_to_readonly (): Remove Write access from CC");
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("Remove Write access from CC");
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_update_cc_to_readonly (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -861,12 +861,12 @@
   NFC_HDR* p_c_apdu;
   uint8_t* p;
 
-  RW_TRACE_DEBUG1("rw_t4t_select_application () version:0x%X", version);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("version:0x%X", version);
 
   p_c_apdu = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
 
   if (!p_c_apdu) {
-    RW_TRACE_ERROR0("rw_t4t_select_application (): Cannot allocate buffer");
+    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
     return false;
   }
 
@@ -918,32 +918,31 @@
 static bool rw_t4t_validate_cc_file(void) {
   tRW_T4T_CB* p_t4t = &rw_cb.tcb.t4t;
 
-  RW_TRACE_DEBUG0("rw_t4t_validate_cc_file ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (p_t4t->cc_file.cclen < T4T_CC_FILE_MIN_LEN) {
-    RW_TRACE_ERROR1("rw_t4t_validate_cc_file (): CCLEN (%d) is too short",
-                    p_t4t->cc_file.cclen);
+    LOG(ERROR) << StringPrintf("CCLEN (%d) is too short", p_t4t->cc_file.cclen);
     return false;
   }
 
   if (T4T_GET_MAJOR_VERSION(p_t4t->cc_file.version) !=
       T4T_GET_MAJOR_VERSION(p_t4t->version)) {
-    RW_TRACE_ERROR2(
-        "rw_t4t_validate_cc_file (): Peer version (0x%02X) is matched to ours "
+    LOG(ERROR) << StringPrintf(
+        "Peer version (0x%02X) is matched to ours "
         "(0x%02X)",
         p_t4t->cc_file.version, p_t4t->version);
     return false;
   }
 
   if (p_t4t->cc_file.max_le < 0x000F) {
-    RW_TRACE_ERROR1("rw_t4t_validate_cc_file (): MaxLe (%d) is too small",
-                    p_t4t->cc_file.max_le);
+    LOG(ERROR) << StringPrintf("MaxLe (%d) is too small",
+                               p_t4t->cc_file.max_le);
     return false;
   }
 
   if (p_t4t->cc_file.max_lc < 0x0001) {
-    RW_TRACE_ERROR1("rw_t4t_validate_cc_file (): MaxLc (%d) is too small",
-                    p_t4t->cc_file.max_lc);
+    LOG(ERROR) << StringPrintf("MaxLc (%d) is too small",
+                               p_t4t->cc_file.max_lc);
     return false;
   }
 
@@ -955,31 +954,28 @@
       (p_t4t->cc_file.ndef_fc.file_id == 0x3F00) ||
       (p_t4t->cc_file.ndef_fc.file_id == 0x3FFF) ||
       (p_t4t->cc_file.ndef_fc.file_id == 0xFFFF)) {
-    RW_TRACE_ERROR1("rw_t4t_validate_cc_file (): File ID (0x%04X) is invalid",
-                    p_t4t->cc_file.ndef_fc.file_id);
+    LOG(ERROR) << StringPrintf("File ID (0x%04X) is invalid",
+                               p_t4t->cc_file.ndef_fc.file_id);
     return false;
   }
 
   if ((p_t4t->cc_file.ndef_fc.max_file_size < 0x0005) ||
       (p_t4t->cc_file.ndef_fc.max_file_size == 0xFFFF)) {
-    RW_TRACE_ERROR1(
-        "rw_t4t_validate_cc_file (): max_file_size (%d) is reserved",
-        p_t4t->cc_file.ndef_fc.max_file_size);
+    LOG(ERROR) << StringPrintf("max_file_size (%d) is reserved",
+                               p_t4t->cc_file.ndef_fc.max_file_size);
     return false;
   }
 
   if (p_t4t->cc_file.ndef_fc.read_access != T4T_FC_READ_ACCESS) {
-    RW_TRACE_ERROR1(
-        "rw_t4t_validate_cc_file (): Read Access (0x%02X) is invalid",
-        p_t4t->cc_file.ndef_fc.read_access);
+    LOG(ERROR) << StringPrintf("Read Access (0x%02X) is invalid",
+                               p_t4t->cc_file.ndef_fc.read_access);
     return false;
   }
 
   if ((p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS) &&
       (p_t4t->cc_file.ndef_fc.write_access < T4T_FC_WRITE_ACCESS_PROP_START)) {
-    RW_TRACE_ERROR1(
-        "rw_t4t_validate_cc_file (): Write Access (0x%02X) is invalid",
-        p_t4t->cc_file.ndef_fc.write_access);
+    LOG(ERROR) << StringPrintf("Write Access (0x%02X) is invalid",
+                               p_t4t->cc_file.ndef_fc.write_access);
     return false;
   }
 
@@ -1000,8 +996,8 @@
   tRW_DATA rw_data;
   tRW_EVENT event;
 
-  RW_TRACE_DEBUG4(
-      "rw_t4t_handle_error (): status:0x%02X, sw1:0x%02X, sw2:0x%02X, "
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "status:0x%02X, sw1:0x%02X, sw2:0x%02X, "
       "state:0x%X",
       status, sw1, sw2, p_t4t->state);
 
@@ -1067,17 +1063,13 @@
 *******************************************************************************/
 static void rw_t4t_sm_ndef_format(NFC_HDR* p_r_apdu) {
   tRW_T4T_CB* p_t4t = &rw_cb.tcb.t4t;
-  uint8_t *p, type, length;
-  uint16_t status_words, nlen;
+  uint8_t* p;
+  uint16_t status_words;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t4t_sm_ndef_format (): sub_state:%s (%d)",
-                  rw_t4t_get_sub_state_name(p_t4t->sub_state),
-                  p_t4t->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_t4t_sm_ndef_format (): sub_state=%d", p_t4t->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (%d)", rw_t4t_get_sub_state_name(p_t4t->sub_state).c_str(),
+      p_t4t->sub_state);
 
   /* get status words */
   p = (uint8_t*)(p_r_apdu + 1) + p_r_apdu->offset;
@@ -1227,15 +1219,14 @@
 
           (*(rw_cb.p_cback))(RW_T4T_NDEF_FORMAT_CPLT_EVT, &rw_data);
 
-          RW_TRACE_DEBUG0(
-              "rw_t4t_ndef_format (): Sent RW_T4T_NDEF_FORMAT_CPLT_EVT");
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("Sent RW_T4T_NDEF_FORMAT_CPLT_EVT");
         }
       }
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_t4t_sm_ndef_format (): unknown sub_state=%d",
-                      p_t4t->sub_state);
+      LOG(ERROR) << StringPrintf("unknown sub_state=%d", p_t4t->sub_state);
       rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
       break;
   }
@@ -1256,13 +1247,9 @@
   uint16_t status_words, nlen;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t4t_sm_detect_ndef (): sub_state:%s (%d)",
-                  rw_t4t_get_sub_state_name(p_t4t->sub_state),
-                  p_t4t->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_t4t_sm_detect_ndef (): sub_state=%d", p_t4t->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (%d)", rw_t4t_get_sub_state_name(p_t4t->sub_state).c_str(),
+      p_t4t->sub_state);
 
   /* get status words */
   p = (uint8_t*)(p_r_apdu + 1) + p_r_apdu->offset;
@@ -1275,8 +1262,8 @@
         (p_t4t->version == T4T_VERSION_2_0)) {
       p_t4t->version = T4T_VERSION_1_0;
 
-      RW_TRACE_DEBUG1("rw_t4t_sm_detect_ndef (): retry with version=0x%02X",
-                      p_t4t->version);
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("retry with version=0x%02X", p_t4t->version);
 
       if (!rw_t4t_select_application(T4T_VERSION_1_0)) {
         rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
@@ -1331,22 +1318,26 @@
           BE_STREAM_TO_UINT8(p_t4t->cc_file.ndef_fc.read_access, p);
           BE_STREAM_TO_UINT8(p_t4t->cc_file.ndef_fc.write_access, p);
 
-#if (BT_TRACE_VERBOSE == TRUE)
-          RW_TRACE_DEBUG0("Capability Container (CC) file");
-          RW_TRACE_DEBUG1("  CCLEN:  0x%04X", p_t4t->cc_file.cclen);
-          RW_TRACE_DEBUG1("  Version:0x%02X", p_t4t->cc_file.version);
-          RW_TRACE_DEBUG1("  MaxLe:  0x%04X", p_t4t->cc_file.max_le);
-          RW_TRACE_DEBUG1("  MaxLc:  0x%04X", p_t4t->cc_file.max_lc);
-          RW_TRACE_DEBUG0("  NDEF File Control TLV");
-          RW_TRACE_DEBUG1("    FileID:      0x%04X",
-                          p_t4t->cc_file.ndef_fc.file_id);
-          RW_TRACE_DEBUG1("    MaxFileSize: 0x%04X",
-                          p_t4t->cc_file.ndef_fc.max_file_size);
-          RW_TRACE_DEBUG1("    ReadAccess:  0x%02X",
-                          p_t4t->cc_file.ndef_fc.read_access);
-          RW_TRACE_DEBUG1("    WriteAccess: 0x%02X",
-                          p_t4t->cc_file.ndef_fc.write_access);
-#endif
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("Capability Container (CC) file");
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("  CCLEN:  0x%04X", p_t4t->cc_file.cclen);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("  Version:0x%02X", p_t4t->cc_file.version);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("  MaxLe:  0x%04X", p_t4t->cc_file.max_le);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("  MaxLc:  0x%04X", p_t4t->cc_file.max_lc);
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("  NDEF File Control TLV");
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "    FileID:      0x%04X", p_t4t->cc_file.ndef_fc.file_id);
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "    MaxFileSize: 0x%04X", p_t4t->cc_file.ndef_fc.max_file_size);
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "    ReadAccess:  0x%02X", p_t4t->cc_file.ndef_fc.read_access);
+          DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+              "    WriteAccess: 0x%02X", p_t4t->cc_file.ndef_fc.write_access);
 
           if (rw_t4t_validate_cc_file()) {
             if (!rw_t4t_select_file(p_t4t->cc_file.ndef_fc.file_id)) {
@@ -1431,13 +1422,13 @@
 
             (*(rw_cb.p_cback))(RW_T4T_NDEF_DETECT_EVT, &rw_data);
 
-            RW_TRACE_DEBUG0(
-                "rw_t4t_sm_detect_ndef (): Sent RW_T4T_NDEF_DETECT_EVT");
+            DLOG_IF(INFO, nfc_debug_enabled)
+                << StringPrintf("Sent RW_T4T_NDEF_DETECT_EVT");
           }
         } else {
           /* NLEN should be less than max file size */
-          RW_TRACE_ERROR2(
-              "rw_t4t_sm_detect_ndef (): NLEN (%d) + 2 must be <= max file "
+          LOG(ERROR) << StringPrintf(
+              "NLEN (%d) + 2 must be <= max file "
               "size (%d)",
               nlen, p_t4t->cc_file.ndef_fc.max_file_size);
 
@@ -1446,9 +1437,9 @@
         }
       } else {
         /* response payload size should be T4T_FILE_LENGTH_SIZE */
-        RW_TRACE_ERROR2(
-            "rw_t4t_sm_detect_ndef (): Length (%d) of R-APDU must be %d",
-            p_r_apdu->len, T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE);
+        LOG(ERROR) << StringPrintf(
+            "Length (%d) of R-APDU must be %d", p_r_apdu->len,
+            T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE);
 
         p_t4t->ndef_status &= ~(RW_T4T_NDEF_STATUS_NDEF_DETECTED);
         rw_t4t_handle_error(NFC_STATUS_BAD_RESP, 0, 0);
@@ -1456,8 +1447,7 @@
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_t4t_sm_detect_ndef (): unknown sub_state=%d",
-                      p_t4t->sub_state);
+      LOG(ERROR) << StringPrintf("unknown sub_state=%d", p_t4t->sub_state);
       rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
       break;
   }
@@ -1478,13 +1468,9 @@
   uint16_t status_words;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t4t_sm_read_ndef (): sub_state:%s (%d)",
-                  rw_t4t_get_sub_state_name(p_t4t->sub_state),
-                  p_t4t->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_t4t_sm_read_ndef (): sub_state=%d", p_t4t->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (%d)", rw_t4t_get_sub_state_name(p_t4t->sub_state).c_str(),
+      p_t4t->sub_state);
 
   /* get status words */
   p = (uint8_t*)(p_r_apdu + 1) + p_r_apdu->offset;
@@ -1523,8 +1509,8 @@
 
             (*(rw_cb.p_cback))(RW_T4T_NDEF_READ_CPLT_EVT, &rw_data);
 
-            RW_TRACE_DEBUG0(
-                "rw_t4t_sm_read_ndef (): Sent RW_T4T_NDEF_READ_CPLT_EVT");
+            DLOG_IF(INFO, nfc_debug_enabled)
+                << StringPrintf("Sent RW_T4T_NDEF_READ_CPLT_EVT");
           }
 
           p_r_apdu = NULL;
@@ -1533,8 +1519,8 @@
           p_t4t->state = RW_T4T_STATE_IDLE;
         }
       } else {
-        RW_TRACE_ERROR2(
-            "rw_t4t_sm_read_ndef (): invalid payload length (%d), rw_length "
+        LOG(ERROR) << StringPrintf(
+            "invalid payload length (%d), rw_length "
             "(%d)",
             p_r_apdu->len, p_t4t->rw_length);
         rw_t4t_handle_error(NFC_STATUS_BAD_RESP, 0, 0);
@@ -1542,8 +1528,7 @@
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_t4t_sm_read_ndef (): unknown sub_state = %d",
-                      p_t4t->sub_state);
+      LOG(ERROR) << StringPrintf("unknown sub_state = %d", p_t4t->sub_state);
       rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
       break;
   }
@@ -1566,13 +1551,9 @@
   uint16_t status_words;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t4t_sm_update_ndef (): sub_state:%s (%d)",
-                  rw_t4t_get_sub_state_name(p_t4t->sub_state),
-                  p_t4t->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_t4t_sm_update_ndef (): sub_state=%d", p_t4t->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (%d)", rw_t4t_get_sub_state_name(p_t4t->sub_state).c_str(),
+      p_t4t->sub_state);
 
   /* Get status words */
   p = (uint8_t*)(p_r_apdu + 1) + p_r_apdu->offset;
@@ -1604,8 +1585,8 @@
           rw_data.status = NFC_STATUS_OK;
 
           (*(rw_cb.p_cback))(RW_T4T_NDEF_UPDATE_CPLT_EVT, &rw_data);
-          RW_TRACE_DEBUG0(
-              "rw_t4t_sm_update_ndef (): Sent RW_T4T_NDEF_UPDATE_CPLT_EVT");
+          DLOG_IF(INFO, nfc_debug_enabled)
+              << StringPrintf("Sent RW_T4T_NDEF_UPDATE_CPLT_EVT");
         }
       }
       break;
@@ -1631,8 +1612,7 @@
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_t4t_sm_update_ndef (): unknown sub_state = %d",
-                      p_t4t->sub_state);
+      LOG(ERROR) << StringPrintf("unknown sub_state = %d", p_t4t->sub_state);
       rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
       break;
   }
@@ -1653,13 +1633,9 @@
   uint16_t status_words;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("rw_t4t_sm_set_readonly (): sub_state:%s (%d)",
-                  rw_t4t_get_sub_state_name(p_t4t->sub_state),
-                  p_t4t->sub_state);
-#else
-  RW_TRACE_DEBUG1("rw_t4t_sm_set_readonly (): sub_state=%d", p_t4t->sub_state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "sub_state:%s (%d)", rw_t4t_get_sub_state_name(p_t4t->sub_state).c_str(),
+      p_t4t->sub_state);
 
   /* Get status words */
   p = (uint8_t*)(p_r_apdu + 1) + p_r_apdu->offset;
@@ -1702,14 +1678,14 @@
       if (rw_cb.p_cback) {
         rw_data.status = NFC_STATUS_OK;
 
-        RW_TRACE_DEBUG0("rw_t4t_sm_set_readonly (): Sent RW_T4T_SET_TO_RO_EVT");
+        DLOG_IF(INFO, nfc_debug_enabled)
+            << StringPrintf("Sent RW_T4T_SET_TO_RO_EVT");
         (*(rw_cb.p_cback))(RW_T4T_SET_TO_RO_EVT, &rw_data);
       }
       break;
 
     default:
-      RW_TRACE_ERROR1("rw_t4t_sm_set_readonly (): unknown sub_state = %d",
-                      p_t4t->sub_state);
+      LOG(ERROR) << StringPrintf("unknown sub_state = %d", p_t4t->sub_state);
       rw_t4t_handle_error(NFC_STATUS_FAILED, 0, 0);
       break;
   }
@@ -1725,12 +1701,12 @@
 **
 *******************************************************************************/
 void rw_t4t_process_timeout(TIMER_LIST_ENT* p_tle) {
-  RW_TRACE_DEBUG1("rw_t4t_process_timeout () event=%d", p_tle->event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event=%d", p_tle->event);
 
   if (p_tle->event == NFC_TTYPE_RW_T4T_RESPONSE) {
     rw_t4t_handle_error(NFC_STATUS_TIMEOUT, 0, 0);
   } else {
-    RW_TRACE_ERROR1("rw_t4t_process_timeout () unknown event=%d", p_tle->event);
+    LOG(ERROR) << StringPrintf("unknown event=%d", p_tle->event);
   }
 }
 
@@ -1746,7 +1722,8 @@
 void rw_t4t_handle_isodep_nak_rsp(uint8_t status, bool is_ntf) {
   tRW_DATA rw_data;
   tRW_T4T_CB* p_t4t = &rw_cb.tcb.t4t;
-  RW_TRACE_DEBUG1("rw_t4t_handle_isodep_nak_rsp %d", status);
+  DLOG_IF(INFO, nfc_debug_enabled)
+      << StringPrintf("rw_t4t_handle_isodep_nak_rsp %d", status);
   if (is_ntf || (status != NFC_STATUS_OK)) {
     rw_data.status = status;
     nfc_stop_quick_timer(&p_t4t->timer);
@@ -1764,17 +1741,15 @@
 ** Returns          none
 **
 *******************************************************************************/
-static void rw_t4t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
-                              tNFC_CONN* p_data) {
+static void rw_t4t_data_cback(__attribute__((unused)) uint8_t conn_id,
+                              tNFC_CONN_EVT event, tNFC_CONN* p_data) {
   tRW_T4T_CB* p_t4t = &rw_cb.tcb.t4t;
   NFC_HDR* p_r_apdu;
   tRW_DATA rw_data;
 
-#if (BT_TRACE_VERBOSE == TRUE)
   uint8_t begin_state = p_t4t->state;
-#endif
 
-  RW_TRACE_DEBUG1("rw_t4t_data_cback () event = 0x%X", event);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
   nfc_stop_quick_timer(&p_t4t->timer);
 
   switch (event) {
@@ -1810,33 +1785,22 @@
       return;
   }
 
-#if (BT_TRACE_PROTOCOL == TRUE)
-  if (p_t4t->state != RW_T4T_STATE_IDLE) DispRWT4Tags(p_r_apdu, true);
-#endif
-
-#if (BT_TRACE_VERBOSE == TRUE)
-  RW_TRACE_DEBUG2("RW T4T state: <%s (%d)>",
-                  rw_t4t_get_state_name(p_t4t->state), p_t4t->state);
-#else
-  RW_TRACE_DEBUG1("RW T4T state: %d", p_t4t->state);
-#endif
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
+      "RW T4T state: <%s (%d)>", rw_t4t_get_state_name(p_t4t->state).c_str(),
+      p_t4t->state);
 
   switch (p_t4t->state) {
     case RW_T4T_STATE_IDLE:
 /* Unexpected R-APDU, it should be raw frame response */
 /* forward to upper layer without parsing */
-#if (BT_TRACE_VERBOSE == TRUE)
-      RW_TRACE_DEBUG2("RW T4T Raw Frame: Len [0x%X] Status [%s]", p_r_apdu->len,
-                      NFC_GetStatusName(p_data->data.status));
-#else
-      RW_TRACE_DEBUG2("RW T4T Raw Frame: Len [0x%X] Status [0x%X]",
-                      p_r_apdu->len, p_data->data.status);
-#endif
-      if (rw_cb.p_cback) {
-        rw_data.raw_frame.status = p_data->data.status;
-        rw_data.raw_frame.p_data = p_r_apdu;
-        (*(rw_cb.p_cback))(RW_T4T_RAW_FRAME_EVT, &rw_data);
-        p_r_apdu = NULL;
+DLOG_IF(INFO, nfc_debug_enabled)
+    << StringPrintf("RW T4T Raw Frame: Len [0x%X] Status [%s]", p_r_apdu->len,
+                    NFC_GetStatusName(p_data->data.status).c_str());
+if (rw_cb.p_cback) {
+  rw_data.raw_frame.status = p_data->data.status;
+  rw_data.raw_frame.p_data = p_r_apdu;
+  (*(rw_cb.p_cback))(RW_T4T_RAW_FRAME_EVT, &rw_data);
+  p_r_apdu = NULL;
       } else {
         GKI_freebuf(p_r_apdu);
       }
@@ -1869,18 +1833,17 @@
       GKI_freebuf(p_r_apdu);
       break;
     default:
-      RW_TRACE_ERROR1("rw_t4t_data_cback (): invalid state=%d", p_t4t->state);
+      LOG(ERROR) << StringPrintf("invalid state=%d", p_t4t->state);
       GKI_freebuf(p_r_apdu);
       break;
   }
 
-#if (BT_TRACE_VERBOSE == TRUE)
   if (begin_state != p_t4t->state) {
-    RW_TRACE_DEBUG2("RW T4T state changed:<%s> -> <%s>",
-                    rw_t4t_get_state_name(begin_state),
-                    rw_t4t_get_state_name(p_t4t->state));
+    DLOG_IF(INFO, nfc_debug_enabled)
+        << StringPrintf("RW T4T state changed:<%s> -> <%s>",
+                        rw_t4t_get_state_name(begin_state).c_str(),
+                        rw_t4t_get_state_name(p_t4t->state).c_str());
   }
-#endif
 }
 
 /*******************************************************************************
@@ -1893,12 +1856,11 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_T4tFormatNDef(void) {
-  RW_TRACE_API0("RW_T4tFormatNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_T4tFormatNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.t4t.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.t4t.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -1926,7 +1888,7 @@
 tNFC_STATUS rw_t4t_select(void) {
   tRW_T4T_CB* p_t4t = &rw_cb.tcb.t4t;
 
-  RW_TRACE_DEBUG0("rw_t4t_select ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   NFC_SetStaticRfCback(rw_t4t_data_cback);
 
@@ -1956,12 +1918,11 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_T4tDetectNDef(void) {
-  RW_TRACE_API0("RW_T4tDetectNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_T4tDetectNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.t4t.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.t4t.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -2002,11 +1963,11 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_T4tReadNDef(void) {
-  RW_TRACE_API0("RW_T4tReadNDef ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) {
-    RW_TRACE_ERROR1("RW_T4tReadNDef ():Unable to start command at state (0x%X)",
-                    rw_cb.tcb.t4t.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.t4t.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -2023,7 +1984,7 @@
 
     return NFC_STATUS_OK;
   } else {
-    RW_TRACE_ERROR0("RW_T4tReadNDef ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
 }
@@ -2046,12 +2007,11 @@
 **
 *******************************************************************************/
 tNFC_STATUS RW_T4tUpdateNDef(uint16_t length, uint8_t* p_data) {
-  RW_TRACE_API1("RW_T4tUpdateNDef () length:%d", length);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("length:%d", length);
 
   if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_T4tUpdateNDef ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.t4t.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.t4t.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -2059,14 +2019,14 @@
   if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) {
     /* if read-only */
     if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY) {
-      RW_TRACE_ERROR0("RW_T4tUpdateNDef ():NDEF is read-only");
+      LOG(ERROR) << StringPrintf("NDEF is read-only");
       return NFC_STATUS_FAILED;
     }
 
     if (rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size <
         length + T4T_FILE_LENGTH_SIZE) {
-      RW_TRACE_ERROR2(
-          "RW_T4tUpdateNDef ():data (%d bytes) plus NLEN is more than max file "
+      LOG(ERROR) << StringPrintf(
+          "data (%d bytes) plus NLEN is more than max file "
           "size (%d)",
           length, rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size);
       return NFC_STATUS_FAILED;
@@ -2089,7 +2049,7 @@
 
     return NFC_STATUS_OK;
   } else {
-    RW_TRACE_ERROR0("RW_T4tUpdateNDef ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
 }
@@ -2118,7 +2078,7 @@
   bool status;
   NFC_HDR* p_data;
 
-  RW_TRACE_API1("RW_T4tPresenceCheck () %d", option);
+  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%d", option);
 
   /* If RW_SelectTagType was not called (no conn_callback) return failure */
   if (!rw_cb.p_cback) {
@@ -2147,12 +2107,6 @@
       }
     } else if (option == RW_T4T_CHK_ISO_DEP_NAK_PRES_CHK) {
       if (NFC_ISODEPNakPresCheck() == NFC_STATUS_OK) status = true;
-    } else {
-      /* use read binary on the given channel */
-      rw_cb.tcb.t4t.channel = 0;
-      if (option <= RW_T4T_CHK_READ_BINARY_CH3) rw_cb.tcb.t4t.channel = option;
-      status = rw_t4t_read_file(0, 1, false);
-      rw_cb.tcb.t4t.channel = 0;
     }
 
     if (status == true) {
@@ -2182,12 +2136,11 @@
   tNFC_STATUS retval = NFC_STATUS_OK;
   tRW_DATA evt_data;
 
-  RW_TRACE_API0("RW_T4tSetNDefReadOnly ()");
+  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
 
   if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) {
-    RW_TRACE_ERROR1(
-        "RW_T4tSetNDefReadOnly ():Unable to start command at state (0x%X)",
-        rw_cb.tcb.t4t.state);
+    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
+                               rw_cb.tcb.t4t.state);
     return NFC_STATUS_FAILED;
   }
 
@@ -2195,7 +2148,8 @@
   if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) {
     /* if read-only */
     if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY) {
-      RW_TRACE_API0("RW_T4tSetNDefReadOnly (): NDEF is already read-only");
+      DLOG_IF(INFO, nfc_debug_enabled)
+          << StringPrintf("NDEF is already read-only");
 
       evt_data.status = NFC_STATUS_OK;
       (*rw_cb.p_cback)(RW_T4T_SET_TO_RO_EVT, &evt_data);
@@ -2212,13 +2166,12 @@
 
     return NFC_STATUS_OK;
   } else {
-    RW_TRACE_ERROR0("RW_T4tSetNDefReadOnly ():No NDEF detected");
+    LOG(ERROR) << StringPrintf("No NDEF detected");
     return NFC_STATUS_FAILED;
   }
   return (retval);
 }
 
-#if (BT_TRACE_VERBOSE == TRUE)
 /*******************************************************************************
 **
 ** Function         rw_t4t_get_state_name
@@ -2230,25 +2183,24 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_t4t_get_state_name(uint8_t state) {
+static std::string rw_t4t_get_state_name(uint8_t state) {
   switch (state) {
     case RW_T4T_STATE_NOT_ACTIVATED:
-      return ("NOT_ACTIVATED");
+      return "NOT_ACTIVATED";
     case RW_T4T_STATE_IDLE:
-      return ("IDLE");
+      return "IDLE";
     case RW_T4T_STATE_DETECT_NDEF:
-      return ("NDEF_DETECTION");
+      return "NDEF_DETECTION";
     case RW_T4T_STATE_READ_NDEF:
-      return ("READ_NDEF");
+      return "READ_NDEF";
     case RW_T4T_STATE_UPDATE_NDEF:
-      return ("UPDATE_NDEF");
+      return "UPDATE_NDEF";
     case RW_T4T_STATE_PRESENCE_CHECK:
-      return ("PRESENCE_CHECK");
+      return "PRESENCE_CHECK";
     case RW_T4T_STATE_SET_READ_ONLY:
-      return ("SET_READ_ONLY");
-
+      return "SET_READ_ONLY";
     default:
-      return ("???? UNKNOWN STATE");
+      return "???? UNKNOWN STATE";
   }
 }
 
@@ -2263,43 +2215,41 @@
 ** Returns          pointer to the name
 **
 *******************************************************************************/
-static char* rw_t4t_get_sub_state_name(uint8_t sub_state) {
+static std::string rw_t4t_get_sub_state_name(uint8_t sub_state) {
   switch (sub_state) {
     case RW_T4T_SUBSTATE_WAIT_SELECT_APP:
-      return ("WAIT_SELECT_APP");
+      return "WAIT_SELECT_APP";
     case RW_T4T_SUBSTATE_WAIT_SELECT_CC:
-      return ("WAIT_SELECT_CC");
+      return "WAIT_SELECT_CC";
     case RW_T4T_SUBSTATE_WAIT_CC_FILE:
-      return ("WAIT_CC_FILE");
+      return "WAIT_CC_FILE";
     case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE:
-      return ("WAIT_SELECT_NDEF_FILE");
+      return "WAIT_SELECT_NDEF_FILE";
     case RW_T4T_SUBSTATE_WAIT_READ_NLEN:
-      return ("WAIT_READ_NLEN");
-
+      return "WAIT_READ_NLEN";
     case RW_T4T_SUBSTATE_WAIT_READ_RESP:
-      return ("WAIT_READ_RESP");
+      return "WAIT_READ_RESP";
     case RW_T4T_SUBSTATE_WAIT_UPDATE_RESP:
-      return ("WAIT_UPDATE_RESP");
+      return "WAIT_UPDATE_RESP";
     case RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN:
-      return ("WAIT_UPDATE_NLEN");
+      return "WAIT_UPDATE_NLEN";
     case RW_T4T_SUBSTATE_WAIT_GET_HW_VERSION:
-      return ("WAIT_GET_HW_VERSION");
+      return "WAIT_GET_HW_VERSION";
     case RW_T4T_SUBSTATE_WAIT_GET_SW_VERSION:
-      return ("WAIT_GET_SW_VERSION");
+      return "WAIT_GET_SW_VERSION";
     case RW_T4T_SUBSTATE_WAIT_GET_UID:
-      return ("WAIT_GET_UID");
+      return "WAIT_GET_UID";
     case RW_T4T_SUBSTATE_WAIT_CREATE_APP:
-      return ("WAIT_CREATE_APP");
+      return "WAIT_CREATE_APP";
     case RW_T4T_SUBSTATE_WAIT_CREATE_CC:
-      return ("WAIT_CREATE_CC");
+      return "WAIT_CREATE_CC";
     case RW_T4T_SUBSTATE_WAIT_CREATE_NDEF:
-      return ("WAIT_CREATE_NDEF");
+      return "WAIT_CREATE_NDEF";
     case RW_T4T_SUBSTATE_WAIT_WRITE_CC:
-      return ("WAIT_WRITE_CC");
+      return "WAIT_WRITE_CC";
     case RW_T4T_SUBSTATE_WAIT_WRITE_NDEF:
-      return ("WAIT_WRITE_NDEF");
+      return "WAIT_WRITE_NDEF";
     default:
-      return ("???? UNKNOWN SUBSTATE");
+      return "???? UNKNOWN SUBSTATE";
   }
 }
-#endif
diff --git a/src/nfc/tags/tags_int.c b/src/nfc/tags/tags_int.cc
similarity index 98%
rename from src/nfc/tags/tags_int.c
rename to src/nfc/tags/tags_int.cc
index b99d63d..71d9c42 100644
--- a/src/nfc/tags/tags_int.c
+++ b/src/nfc/tags/tags_int.cc
@@ -25,10 +25,8 @@
 #include "bt_types.h"
 #include "nfc_target.h"
 
-#include "nfc_api.h"
 #include "rw_api.h"
 #include "rw_int.h"
-#include "tags_int.h"
 
 #define T1T_MAX_NUM_OPCODES 9
 #define T1T_STATIC_OPCODES 5
@@ -88,14 +86,12 @@
 const uint8_t t4t_v20_ndef_tag_aid[T4T_V20_NDEF_TAG_AID_LEN] = {
     0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
 
-#if (BT_TRACE_PROTOCOL == TRUE)
 const char* const t1t_cmd_str[] = {
     "T1T_RID",  "T1T_RALL",  "T1T_READ",     "T1T_WRITE_E",  "T1T_WRITE_NE",
     "T1T_RSEG", "T1T_READ8", "T1T_WRITE_E8", "T1T_WRITE_NE8"};
 
 const char* const t2t_cmd_str[] = {"T2T_CMD_READ", "T2T_CMD_WRITE",
                                    "T2T_CMD_SEC_SEL"};
-#endif
 
 static unsigned int tags_ones32(register unsigned int x);
 
@@ -225,7 +221,6 @@
   return ((uint8_t)(p_info - t2t_cmd_rsp_infos) + RW_T2T_FIRST_EVT);
 }
 
-#if (BT_TRACE_PROTOCOL == TRUE)
 /*******************************************************************************
 **
 ** Function         t1t_info_to_str
@@ -261,7 +256,6 @@
   else
     return "";
 }
-#endif
 
 /*******************************************************************************
 **
diff --git a/src/nfca_version.c b/src/nfca_version.c
deleted file mode 100644
index 6c83d7d..0000000
--- a/src/nfca_version.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "bt_types.h"
-
-const uint8_t nfca_version_string[] = "NFCDROID-AOSP_M_00.01";
-
-/*
-// The following string should be manually updated to contain the
-// label of the NFA version being used (see stack-info.txt).
-//
-// NOTE: IF additional branches are used add a "+" at the end of the string
-*/
-const uint8_t nfa_version_string[] = "NFA_PI_1.03.66+";
diff --git a/src/static-lib-adapt/ProtoDispBluetoothHci.c b/src/static-lib-adapt/ProtoDispBluetoothHci.c
deleted file mode 100644
index 363f59d..0000000
--- a/src/static-lib-adapt/ProtoDispBluetoothHci.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2011-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#include "ProtoDispBluetoothHci.h"
-#include <cutils/log.h>
-#include "_OverrideLog.h"
-#include "nfc_target.h"
-
-extern uint8_t* HCIDisp1(char* p_descr, uint8_t* p_data);
-extern uint32_t ScrProtocolTraceFlag;
-#define HCI_GEN_TRACE \
-  (TRACE_CTRL_GENERAL | TRACE_LAYER_HCI | TRACE_ORG_PROTO_DISP | hci_trace_type)
-static uint8_t hci_trace_type = 0;
-static char* modes_str[] = {"No sleep mode",
-                            "UART",
-                            "UART with messaging",
-                            "USB",
-                            "H4IBSS",
-                            "USB with host wake",
-                            "SDIO",
-                            "UART CS-N",
-                            "SPI",
-                            "H5",
-                            "H4DS",
-                            "",
-                            "UART with BREAK"};
-static uint8_t* p_end_hci = NULL;
-static uint8_t* HCIDisp1Ext(char* p_descr, uint8_t* p_data, char* p_ext);
-static void disp_sleepmode(uint8_t* p);
-static void disp_sleepmode_evt(uint8_t* p);
-
-///////////////////////////////////////////
-///////////////////////////////////////////
-
-uint8_t* HCIDisp1Ext(char* p_descr, uint8_t* p_data, char* p_ext) {
-  if (p_data == p_end_hci) return p_data;
-
-  char buff[200];
-
-  sprintf(buff, "%40s : %u (0x%02x): %s", p_descr, *p_data, *p_data, p_ext);
-
-  ScrLog(HCI_GEN_TRACE, "%s", buff);
-  return (p_data + 1);
-}
-
-/*******************************************************************************
-**
-** Function         disp_sleepmode
-**
-** Description      Displays VSC sleep mode
-**
-** Returns          none.
-**
-*******************************************************************************/
-void disp_sleepmode(uint8_t* p) {
-  hci_trace_type = TRACE_TYPE_CMD_TX;
-  ScrLog(HCI_GEN_TRACE, "--");
-  int len = p[2];
-  ScrLog(HCI_GEN_TRACE,
-         "SEND Command to HCI.  Name: Set_Sleepmode_Param   (Hex Code: 0xfc27  "
-         "Param Len: %d)",
-         len);
-  p += 3;
-  p_end_hci = p + len;
-  p = HCIDisp1Ext("Sleep_Mode", p, (*p <= 12) ? modes_str[*p] : "");
-  p = HCIDisp1("Idle_Threshold_Host", p);
-  p = HCIDisp1("Idle_Threshold_HC", p);
-  p = HCIDisp1Ext("BT_WAKE_Active_Mode", p,
-                  (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : ""));
-  p = HCIDisp1Ext("HOST_WAKE_Active_Mode", p,
-                  (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : ""));
-  p = HCIDisp1("Allow_Host_Sleep_During_SCO", p);
-  p = HCIDisp1("Combine_Sleep_Mode_And_LPM", p);
-  p = HCIDisp1("Enable_Tristate_Control_Of_UART_Tx_Line", p);
-  p = HCIDisp1Ext("Active_Connection_Handling_On_Suspend", p,
-                  (*p == 0)
-                      ? "Maintain connections; sleep when timed activity allows"
-                      : ((*p == 1) ? "Sleep until resume is detected" : ""));
-  p = HCIDisp1("Resume_Timeout", p);
-  p = HCIDisp1("Enable_BREAK_To_Host", p);
-  p = HCIDisp1("Pulsed_HOST_WAKE", p);
-
-  ScrLog(HCI_GEN_TRACE, "--");
-}
-
-/*******************************************************************************
-**
-** Function         disp_sleepmode_evt
-**
-** Description      Displays HCI comand complete event for VSC sleep mode.
-**
-** Returns          none.
-**
-*******************************************************************************/
-void disp_sleepmode_evt(uint8_t* p) {
-  uint8_t len = p[1], status = p[5];
-
-  hci_trace_type = TRACE_TYPE_EVT_RX;
-  ScrLog(HCI_GEN_TRACE, "--");
-  ScrLog(HCI_GEN_TRACE,
-         "RCVD Event from HCI. Name: HCI_Command_Complete  (Hex Code: 0x0e  "
-         "Param Len: %d)",
-         len);
-
-  p = HCIDisp1("Num HCI Cmd Packets", p + 2);
-  ScrLog(HCI_GEN_TRACE, "%40s : 0xfc27  (Set_Sleepmode_Param)", "Cmd Code");
-  ScrLog(HCI_GEN_TRACE, "%40s : %d (0x%02x) %s", "Status", status, status,
-         (status == 0) ? "Success" : "");
-  ScrLog(HCI_GEN_TRACE, "--");
-}
-
-/*******************************************************************************
-**
-** Function         ProtoDispBluetoothHciCmd
-**
-** Description      Display a HCI command string
-**
-** Returns:
-**                  Nothing
-**
-*******************************************************************************/
-void ProtoDispBluetoothHciCmd(NFC_HDR* p_buf) {
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return;
-  uint8_t* p = (uint8_t*)(p_buf + 1) + p_buf->offset;
-  if (*(p) == 0x27 && *(p + 1) == 0xfc)  // opcode sleep mode
-  {
-    disp_sleepmode(p);
-  }
-}
-
-/*******************************************************************************
-**
-** Function         ProtoDispBluetoothHciEvt
-**
-** Description      display a NCI event
-**
-** Returns:
-**                  Nothing
-**
-*******************************************************************************/
-void ProtoDispBluetoothHciEvt(NFC_HDR* pBuffer) {
-  if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return;
-
-  uint8_t* p = (uint8_t*)(pBuffer + 1) + pBuffer->offset;
-  if (*p == 0x0e)  // command complete
-  {
-    if (*(p + 1) == 4)  // length
-    {
-      if (*(p + 3) == 0x27 && *(p + 4) == 0xfc)  // opcode 0x27fc (sleep mode)
-      {
-        disp_sleepmode_evt(p);
-      }
-    }
-  }
-}
diff --git a/src/udrv/include/upio.h b/src/udrv/include/upio.h
deleted file mode 100644
index 56ff81b..0000000
--- a/src/udrv/include/upio.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2001-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-#ifndef UPIO_H
-#define UPIO_H
-
-/* Enumeration of UPIO features                                         */
-/* Not all features enumerated here are supported by the hardware.      */
-/* Use UPIO_Feature() to determine support of a particular feature.     */
-enum {
-  /* LEDs */
-  UPIO_FEAT_LED1,
-  UPIO_FEAT_LED2,
-  UPIO_FEAT_LED3,
-  UPIO_FEAT_LED4,
-  UPIO_FEAT_LED5,
-  UPIO_FEAT_LED6,
-  UPIO_FEAT_LED7,
-  UPIO_FEAT_LED8,
-
-  /* Switches */
-  UPIO_FEAT_SWITCH1,
-  UPIO_FEAT_SWITCH2,
-  UPIO_FEAT_SWITCH3,
-  UPIO_FEAT_SWITCH4,
-  UPIO_FEAT_SWITCH5,
-  UPIO_FEAT_SWITCH6,
-  UPIO_FEAT_SWITCH7,
-  UPIO_FEAT_SWITCH8,
-  UPIO_FEAT_SWITCH9,
-  UPIO_FEAT_SWITCH10,
-  UPIO_FEAT_SWITCH11,
-  UPIO_FEAT_SWITCH12,
-  UPIO_FEAT_SWITCH13,
-  UPIO_FEAT_SWITCH14,
-  UPIO_FEAT_SWITCH15,
-  UPIO_FEAT_SWITCH16,
-
-  /* Jumpers */
-  UPIO_FEAT_JUMPER1,
-  UPIO_FEAT_JUMPER2,
-  UPIO_FEAT_JUMPER3,
-  UPIO_FEAT_JUMPER4,
-  UPIO_FEAT_JUMPER5,
-  UPIO_FEAT_JUMPER6,
-  UPIO_FEAT_JUMPER7,
-  UPIO_FEAT_JUMPER8,
-
-  /* Push buttons */
-  UPIO_FEAT_BUTTON1,
-  UPIO_FEAT_BUTTON2,
-  UPIO_FEAT_BUTTON3,
-  UPIO_FEAT_BUTTON4,
-  UPIO_FEAT_BUTTON5,
-  UPIO_FEAT_BUTTON6,
-  UPIO_FEAT_BUTTON7,
-  UPIO_FEAT_BUTTON8,
-
-  /* General purpose */
-  UPIO_FEAT_GENERAL1,
-  UPIO_FEAT_GENERAL2,
-  UPIO_FEAT_GENERAL3,
-  UPIO_FEAT_GENERAL4,
-  UPIO_FEAT_GENERAL5,
-  UPIO_FEAT_GENERAL6,
-  UPIO_FEAT_GENERAL7,
-  UPIO_FEAT_GENERAL8,
-  UPIO_FEAT_GENERAL9,
-  UPIO_FEAT_GENERAL10,
-  UPIO_FEAT_GENERAL11,
-  UPIO_FEAT_GENERAL12,
-  UPIO_FEAT_GENERAL13,
-  UPIO_FEAT_GENERAL14,
-  UPIO_FEAT_GENERAL15,
-  UPIO_FEAT_GENERAL16,
-  UPIO_FEAT_GENERAL17,
-  UPIO_FEAT_GENERAL18,
-  UPIO_FEAT_GENERAL19,
-  UPIO_FEAT_GENERAL20,
-  UPIO_FEAT_GENERAL21,
-  UPIO_FEAT_GENERAL22,
-  UPIO_FEAT_GENERAL23,
-  UPIO_FEAT_GENERAL24,
-  UPIO_FEAT_GENERAL25,
-  UPIO_FEAT_GENERAL26,
-  UPIO_FEAT_GENERAL27,
-  UPIO_FEAT_GENERAL28,
-  UPIO_FEAT_GENERAL29,
-  UPIO_FEAT_GENERAL30,
-  UPIO_FEAT_GENERAL31,
-  UPIO_FEAT_GENERAL32,
-
-  UPIO_FEAT_IN_HIGH, /* Support for input with interrupt on high signal level.
-                        */
-  UPIO_FEAT_IN_LOW,  /* Support for input with interrupt on low signal level. */
-  UPIO_FEAT_IN_RISE, /* Support for input with interrupt on rising edge. */
-  UPIO_FEAT_IN_FALL  /* Support for input with interrupt on falling. */
-
-};
-typedef uint8_t tUPIO_FEATURE;
-
-/* Enumeration of UPIO configurations */
-enum { UPIO_OUT, UPIO_IN, UPIO_IN_EDGE, UPIO_IN_LEVEL, UPIO_NONE };
-typedef uint8_t tUPIO_CONFIG;
-
-/* Enumeration of UPIO types */
-enum {
-  UPIO_LED,     /* LED */
-  UPIO_SWITCH,  /* Switch */
-  UPIO_JUMPER,  /* Jumper */
-  UPIO_BUTTON,  /* Push-button switch */
-  UPIO_GENERAL, /* General purpose I/O */
-
-  UPIO_NUMBER_OF_TYPES
-};
-typedef uint8_t tUPIO_TYPE;
-
-/* Enumeration of UPIO states */
-enum { UPIO_OFF, UPIO_ON, UPIO_TOGGLE };
-typedef uint8_t tUPIO_STATE;
-
-enum { UPIO_SW_BANK2, UPIO_SW_BANK3 };
-typedef uint8_t tUPIO_SW_BANK;
-
-/* Jumper masks */
-#define UPIO_JUMPER1 0x00000001
-#define UPIO_JUMPER2 0x00000002
-#define UPIO_JUMPER3 0x00000004
-#define UPIO_JUMPER4 0x00000008
-#define UPIO_JUMPER5 0x00000010
-#define UPIO_JUMPER6 0x00000020
-#define UPIO_JUMPER7 0x00000040
-#define UPIO_JUMPER8 0x00000080
-
-/* General purpose i/o masks */
-#define UPIO_GENERAL1 0x00000001
-#define UPIO_GENERAL2 0x00000002
-#define UPIO_GENERAL3 0x00000004
-#define UPIO_GENERAL4 0x00000008
-#define UPIO_GENERAL5 0x00000010
-#define UPIO_GENERAL6 0x00000020
-#define UPIO_GENERAL7 0x00000040
-#define UPIO_GENERAL8 0x00000080
-#define UPIO_GENERAL9 0x00000100
-#define UPIO_GENERAL10 0x00000200
-#define UPIO_GENERAL11 0x00000400
-#define UPIO_GENERAL12 0x00000800
-#define UPIO_GENERAL13 0x00001000
-#define UPIO_GENERAL14 0x00002000
-#define UPIO_GENERAL15 0x00004000
-#define UPIO_GENERAL16 0x00008000
-#define UPIO_GENERAL17 0x00010000
-#define UPIO_GENERAL18 0x00020000
-#define UPIO_GENERAL19 0x00040000
-#define UPIO_GENERAL20 0x00080000
-#define UPIO_GENERAL21 0x00100000
-#define UPIO_GENERAL22 0x00200000
-#define UPIO_GENERAL23 0x00400000
-#define UPIO_GENERAL24 0x00800000
-#define UPIO_GENERAL25 0x01000000
-#define UPIO_GENERAL26 0x02000000
-#define UPIO_GENERAL27 0x04000000
-#define UPIO_GENERAL28 0x08000000
-#define UPIO_GENERAL29 0x10000000
-#define UPIO_GENERAL30 0x20000000
-#define UPIO_GENERAL31 0x40000000
-#define UPIO_GENERAL32 0x80000000
-
-typedef uint32_t tUPIO;
-
-/* LED masks */
-#define UPIO_LED1 0x00000001
-#define UPIO_LED2 0x00000002
-#define UPIO_LED3 0x00000004
-#define UPIO_LED4 0x00000008
-#define UPIO_LED5 0x00000010
-#define UPIO_LED6 0x00000020
-#define UPIO_LED7 0x00000040
-#define UPIO_LED8 0x00000080
-
-#define UPIO_LED_ALL                                                       \
-  (UPIO_LED1 | UPIO_LED2 | UPIO_LED3 | UPIO_LED4 | UPIO_LED5 | UPIO_LED6 | \
-   UPIO_LED7 | UPIO_LED8)
-
-/* Switch masks */
-#define UPIO_SWITCH1 0x00000001
-#define UPIO_SWITCH2 0x00000002
-#define UPIO_SWITCH3 0x00000004
-#define UPIO_SWITCH4 0x00000008
-#define UPIO_SWITCH5 0x00000010
-#define UPIO_SWITCH6 0x00000020
-#define UPIO_SWITCH7 0x00000040
-#define UPIO_SWITCH8 0x00000080
-#define UPIO_SWITCH9 0x00000100
-#define UPIO_SWITCH10 0x00000200
-#define UPIO_SWITCH11 0x00000400
-#define UPIO_SWITCH12 0x00000800
-#define UPIO_SWITCH13 0x00001000
-#define UPIO_SWITCH14 0x00002000
-#define UPIO_SWITCH15 0x00004000
-#define UPIO_SWITCH16 0x00008000
-
-/* Push button masks */
-#define UPIO_BUTTON1 0x00000001
-#define UPIO_BUTTON2 0x00000002
-#define UPIO_BUTTON3 0x00000004
-#define UPIO_BUTTON4 0x00000008
-#define UPIO_BUTTON5 0x00000010
-#define UPIO_BUTTON6 0x00000020
-#define UPIO_BUTTON7 0x00000040
-#define UPIO_BUTTON8 0x00000080
-
-typedef void(tUPIO_CBACK)(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE state);
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* API functions for UPIO driver */
-
-/*****************************************************************************
-**
-** Function         UPIO_Init
-**
-** Description
-**      Initialize the GPIO service.
-**      This function is typically called once upon system startup.
-**
-** Returns          nothing
-**
-*****************************************************************************/
-void UPIO_Init(void* p_cfg);
-
-/*****************************************************************************
-**
-** Function         UPIO_Set
-**
-** Description
-**      This function sets one or more GPIO devices to the given state.
-**      Multiple GPIOs of the same type can be masked together to set more
-**      than one GPIO. This function can only be used on types UPIO_LED and
-**      UPIO_GENERAL.
-**
-** Input Parameters:
-**      type    The type of device.
-**      pio     Indicates the particular GPIOs.
-**      state   The desired state.
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      None.
-**
-*****************************************************************************/
-void UPIO_Set(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE state);
-
-/*****************************************************************************
-**
-** Function         UPIO_Read
-**
-** Description
-**      Read the state of a GPIO. This function can be used for any type of
-**      device. Parameter pio can only indicate a single GPIO; multiple GPIOs
-**      cannot be masked together.
-**
-** Input Parameters:
-**      Type:	The type of device.
-**      pio:    Indicates the particular GUPIO.
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      State of GPIO (UPIO_ON or UPIO_OFF).
-**
-*****************************************************************************/
-tUPIO_STATE UPIO_Read(tUPIO_TYPE type, tUPIO pio);
-
-/*****************************************************************************
-**
-** Function         UPIO_Config
-**
-** Description      - Configure GPIOs of type UPIO_GENERAL as inputs or outputs
-**                  - Configure GPIOs to be polled or interrupt driven
-**
-**                  Currently only support polled GPIOs.
-**
-** Input Parameters:
-**      type    The type of device.
-**      pio     Indicates the particular GPIOs.
-**      config
-**      cback
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      None.
-**
-*****************************************************************************/
-void UPIO_Config(tUPIO_TYPE type, tUPIO pio, tUPIO_CONFIG config,
-                 tUPIO_CBACK* cback);
-
-/*****************************************************************************
-**
-** Function         UPIO_Feature
-**
-** Description
-**      Checks whether a feature of the pio API is supported
-**
-** Input Parameter:
-**      feature     The feature to check
-**
-** Output Parameter:
-**      None.
-**
-** Returns:
-**      TRUE if feature is supported, FALSE if it is not.
-**
-*****************************************************************************/
-bool UPIO_Feature(tUPIO_FEATURE feature);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ifdef UPIO_H */
diff --git a/utils/Android.bp b/utils/Android.bp
new file mode 100644
index 0000000..04053a4
--- /dev/null
+++ b/utils/Android.bp
@@ -0,0 +1,50 @@
+cc_defaults {
+    name: "nfc_utils_defaults",
+    include_dirs: [
+        "system/nfc",
+    ],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    target: {
+        linux_glibc: {
+            cflags: ["-D_GNU_SOURCE"],
+        },
+        darwin: {
+            enabled: false,
+        },
+    },
+}
+
+cc_library_static {
+    name: "libnfcutils",
+    defaults: ["nfc_utils_defaults"],
+    export_include_dirs: ["include"],
+    host_supported: true,
+    srcs: [
+        "config.cc",
+        "ringbuffer.cc",
+    ],
+    shared_libs: [
+        "libbase",
+    ],
+}
+
+cc_test {
+    name: "nfc_test_utils",
+    defaults: ["nfc_utils_defaults"],
+    test_suites: ["device-tests"],
+    host_supported: true,
+    srcs: [
+        "test/config_test.cc",
+        "test/ringbuffer_test.cc",
+    ],
+    static_libs: [
+        "libnfcutils",
+        "libgmock",
+    ],
+    shared_libs: [
+        "libbase",
+    ],
+}
diff --git a/utils/config.cc b/utils/config.cc
new file mode 100644
index 0000000..8850c95
--- /dev/null
+++ b/utils/config.cc
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "config.h"
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+using namespace ::std;
+using namespace ::android::base;
+
+namespace {
+
+bool parseBytesString(std::string in, std::vector<uint8_t>& out) {
+  vector<string> values = Split(in, ":");
+  if (values.size() == 0) return false;
+  for (string value : values) {
+    if (value.length() != 2) return false;
+    uint8_t tmp = 0;
+    string hexified = "0x";
+    hexified.append(value);
+    if (!ParseUint(hexified.c_str(), &tmp)) return false;
+    out.push_back(tmp);
+  }
+  return true;
+}
+
+}  // namespace
+
+ConfigValue::ConfigValue() {}
+
+ConfigValue::ConfigValue(std::string value) {
+  // Don't allow empty strings
+  CHECK(!(value.empty()));
+  type_ = STRING;
+  value_string_ = value;
+}
+
+ConfigValue::ConfigValue(unsigned value) {
+  type_ = UNSIGNED;
+  value_unsigned_ = value;
+}
+
+ConfigValue::ConfigValue(std::vector<uint8_t> value) {
+  CHECK(!(value.empty()));
+  type_ = BYTES;
+  value_bytes_ = value;
+}
+
+ConfigValue::Type ConfigValue::getType() const { return type_; }
+
+std::string ConfigValue::getString() const {
+  CHECK(type_ == STRING);
+  return value_string_;
+};
+
+unsigned ConfigValue::getUnsigned() const {
+  CHECK(type_ == UNSIGNED);
+  return value_unsigned_;
+};
+
+std::vector<uint8_t> ConfigValue::getBytes() const {
+  CHECK(type_ == BYTES);
+  return value_bytes_;
+};
+
+bool ConfigValue::parseFromString(std::string in) {
+  if (in.length() > 1 && in[0] == '"' && in[in.length() - 1] == '"') {
+    CHECK(in.length() > 2);  // Don't allow empty strings
+    type_ = STRING;
+    value_string_ = in.substr(1, in.length() - 2);
+    return true;
+  }
+
+  if (in.length() > 1 && in[0] == '{' && in[in.length() - 1] == '}') {
+    CHECK(in.length() >= 4);  // Needs at least one byte
+    type_ = BYTES;
+    return parseBytesString(in.substr(1, in.length() - 2), value_bytes_);
+  }
+
+  unsigned tmp = 0;
+  if (ParseUint(in.c_str(), &tmp)) {
+    type_ = UNSIGNED;
+    value_unsigned_ = tmp;
+    return true;
+  }
+
+  return false;
+}
+
+void ConfigFile::addConfig(const std::string& key, ConfigValue& value) {
+  CHECK(!hasKey(key));
+  values_.emplace(key, value);
+}
+
+void ConfigFile::parseFromFile(const std::string& file_name) {
+  string config;
+  bool config_read = ReadFileToString(file_name, &config);
+  CHECK(config_read);
+  LOG(INFO) << "ConfigFile - Parsing file '" << file_name << "'";
+  parseFromString(config);
+}
+
+void ConfigFile::parseFromString(const std::string& config) {
+  stringstream ss(config);
+  string line;
+  while (getline(ss, line)) {
+    line = Trim(line);
+    if (line.empty()) continue;
+    if (line.at(0) == '#') continue;
+    if (line.at(0) == 0) continue;
+
+    auto search = line.find('=');
+    CHECK(search != string::npos);
+
+    string key(Trim(line.substr(0, search)));
+    string value_string(Trim(line.substr(search + 1, string::npos)));
+
+    ConfigValue value;
+    bool value_parsed = value.parseFromString(value_string);
+    CHECK(value_parsed);
+    addConfig(key, value);
+
+    LOG(INFO) << "ConfigFile - [" << key << "] = " << value_string;
+  }
+}
+
+bool ConfigFile::hasKey(const std::string& key) {
+  return values_.count(key) != 0;
+}
+
+ConfigValue& ConfigFile::getValue(const std::string& key) {
+  auto search = values_.find(key);
+  CHECK(search != values_.end());
+  return search->second;
+}
+
+std::string ConfigFile::getString(const std::string& key) {
+  return getValue(key).getString();
+}
+
+unsigned ConfigFile::getUnsigned(const std::string& key) {
+  return getValue(key).getUnsigned();
+}
+
+std::vector<uint8_t> ConfigFile::getBytes(const std::string& key) {
+  return getValue(key).getBytes();
+}
+
+bool ConfigFile::isEmpty() { return values_.empty(); }
+void ConfigFile::clear() { values_.clear(); }
diff --git a/utils/include/config.h b/utils/include/config.h
new file mode 100644
index 0000000..bb3e0dc
--- /dev/null
+++ b/utils/include/config.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+
+class ConfigValue {
+ public:
+  enum Type { UNSIGNED, STRING, BYTES };
+
+  ConfigValue();
+  ConfigValue(std::string);
+  ConfigValue(unsigned);
+  ConfigValue(std::vector<uint8_t>);
+  Type getType() const;
+  std::string getString() const;
+  unsigned getUnsigned() const;
+  std::vector<uint8_t> getBytes() const;
+
+  bool parseFromString(std::string in);
+
+ private:
+  Type type_;
+  std::string value_string_;
+  unsigned value_unsigned_;
+  std::vector<uint8_t> value_bytes_;
+};
+
+class ConfigFile {
+ public:
+  void parseFromFile(const std::string& file_name);
+  void parseFromString(const std::string& config);
+  void addConfig(const std::string& config, ConfigValue& value);
+
+  bool hasKey(const std::string& key);
+  std::string getString(const std::string& key);
+  unsigned getUnsigned(const std::string& key);
+  std::vector<uint8_t> getBytes(const std::string& key);
+
+  bool isEmpty();
+  void clear();
+
+ private:
+  ConfigValue& getValue(const std::string& key);
+
+  std::map<std::string, ConfigValue> values_;
+};
diff --git a/src/include/ringbuffer.h b/utils/include/ringbuffer.h
similarity index 100%
rename from src/include/ringbuffer.h
rename to utils/include/ringbuffer.h
diff --git a/src/adaptation/ringbuffer.cc b/utils/ringbuffer.cc
similarity index 100%
rename from src/adaptation/ringbuffer.cc
rename to utils/ringbuffer.cc
diff --git a/utils/test/config_test.cc b/utils/test/config_test.cc
new file mode 100644
index 0000000..b2fde71
--- /dev/null
+++ b/utils/test/config_test.cc
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <gtest/gtest.h>
+
+#include <config.h>
+
+namespace {
+const char SIMPLE_CONFIG_FILE[] = "/data/local/tmp/test_config.conf";
+const char SIMPLE_CONFIG[] =
+    "# Simple config file test\n\
+STRING_VALUE=\"Hello World!\"\n\
+#COMMENTED_OUT_VALUE=1\n\
+NUM_VALUE=42\n\
+BYTES_VALUE={0A:0b:0C:fF:00}\n";
+
+const char INVALID_CONFIG1[] =
+    "# This is an invalid config\n\
+# Config values must contain an = sign\n\
+TEST:1";
+
+const char INVALID_CONFIG2[] =
+    "# This is an invalid config\n\
+# Byte arrays must contain at least one value\n\
+TEST={}";
+
+const char INVALID_CONFIG3[] =
+    "# This is an invalid config\n\
+# String values cannot be empty\n\
+TEST=\"\"";
+
+const char INVALID_CONFIG4[] =
+    "# This is an invalid config\n\
+# Multiple config entries with the same key\n\
+TEST=1\n\
+TEST=2";
+
+const char INVALID_CONFIG5[] =
+    "# This is an invalid config\n\
+# Byte value width incorrect\n\
+BYTES_VALUE={0A:0b:0C:1:00}\n";
+}  // namespace
+
+class ConfigTestFromFile : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    FILE* fp = fopen(SIMPLE_CONFIG_FILE, "wt");
+    fwrite(SIMPLE_CONFIG, 1, sizeof(SIMPLE_CONFIG), fp);
+    fclose(fp);
+  }
+};
+
+TEST(ConfigTestFromString, test_simple_config) {
+  ConfigFile config;
+  config.parseFromString(SIMPLE_CONFIG);
+  EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE"));
+  EXPECT_FALSE(config.hasKey("COMMENTED_OUT_VALUE"));
+  EXPECT_TRUE(config.hasKey("NUM_VALUE"));
+  EXPECT_TRUE(config.hasKey("STRING_VALUE"));
+  EXPECT_TRUE(config.hasKey("BYTES_VALUE"));
+}
+
+TEST(ConfigTestFromString, test_simple_values) {
+  ConfigFile config;
+  config.parseFromString(SIMPLE_CONFIG);
+  EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
+  EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!");
+  auto bytes = config.getBytes("BYTES_VALUE");
+  EXPECT_EQ(bytes.size(), 5u);
+  EXPECT_EQ(bytes[0], 10);
+  EXPECT_EQ(bytes[1], 11);
+  EXPECT_EQ(bytes[2], 12);
+  EXPECT_EQ(bytes[3], 255);
+  EXPECT_EQ(bytes[4], 0);
+}
+
+TEST(ConfigTestFromString, test_invalid_configs) {
+  ConfigFile config1;
+  EXPECT_DEATH(config1.parseFromString(INVALID_CONFIG1), "");
+  ConfigFile config2;
+  EXPECT_DEATH(config2.parseFromString(INVALID_CONFIG2), "");
+  ConfigFile config3;
+  EXPECT_DEATH(config3.parseFromString(INVALID_CONFIG3), "");
+  ConfigFile config4;
+  EXPECT_DEATH(config4.parseFromString(INVALID_CONFIG4), "");
+  ConfigFile config5;
+  EXPECT_DEATH(config5.parseFromString(INVALID_CONFIG5), "");
+}
+
+TEST(ConfigTestFromString, test_clear) {
+  ConfigFile config;
+  EXPECT_FALSE(config.hasKey("NUM_VALUE"));
+  config.parseFromString(SIMPLE_CONFIG);
+  EXPECT_TRUE(config.hasKey("NUM_VALUE"));
+  EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
+  config.clear();
+  EXPECT_FALSE(config.hasKey("NUM_VALUE"));
+  EXPECT_DEATH(config.getUnsigned("NUM_VALUE"), "");
+}
+
+TEST(ConfigTestFromString, test_isEmpty) {
+  ConfigFile config;
+  EXPECT_TRUE(config.isEmpty());
+  config.parseFromString(SIMPLE_CONFIG);
+  EXPECT_FALSE(config.isEmpty());
+  config.clear();
+  EXPECT_TRUE(config.isEmpty());
+}
+
+TEST_F(ConfigTestFromFile, test_file_based_config) {
+  ConfigFile config;
+  config.parseFromFile(SIMPLE_CONFIG_FILE);
+  EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE"));
+  EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
+  EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!");
+  auto bytes = config.getBytes("BYTES_VALUE");
+  EXPECT_EQ(bytes.size(), 5u);
+  EXPECT_EQ(bytes[0], 10);
+  EXPECT_EQ(bytes[1], 11);
+  EXPECT_EQ(bytes[2], 12);
+  EXPECT_EQ(bytes[3], 255);
+  EXPECT_EQ(bytes[4], 0);
+}
diff --git a/utils/test/ringbuffer_test.cc b/utils/test/ringbuffer_test.cc
new file mode 100644
index 0000000..bebf8a2
--- /dev/null
+++ b/utils/test/ringbuffer_test.cc
@@ -0,0 +1,138 @@
+#include <gtest/gtest.h>
+
+#include <ringbuffer.h>
+
+TEST(RingbufferTest, test_new_simple) {
+  ringbuffer_t* rb = ringbuffer_init(4096);
+  ASSERT_TRUE(rb != NULL);
+  EXPECT_EQ((size_t)4096, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)0, ringbuffer_size(rb));
+  ringbuffer_free(rb);
+}
+
+TEST(RingbufferTest, test_insert_basic) {
+  ringbuffer_t* rb = ringbuffer_init(16);
+
+  uint8_t buffer[10] = {0x01, 0x02, 0x03, 0x04, 0x05,
+                        0x06, 0x07, 0x08, 0x09, 0x0A};
+  ringbuffer_insert(rb, buffer, 10);
+  EXPECT_EQ((size_t)10, ringbuffer_size(rb));
+  EXPECT_EQ((size_t)6, ringbuffer_available(rb));
+
+  uint8_t peek[10] = {0};
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 10);
+  EXPECT_EQ((size_t)10, ringbuffer_size(rb));  // Ensure size doesn't change
+  EXPECT_EQ((size_t)6, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)10, peeked);
+  ASSERT_TRUE(0 == memcmp(buffer, peek, peeked));
+
+  ringbuffer_free(rb);
+}
+
+TEST(RingbufferTest, test_insert_full) {
+  ringbuffer_t* rb = ringbuffer_init(5);
+
+  uint8_t aa[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
+  uint8_t bb[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
+  uint8_t peek[5] = {0};
+
+  size_t added = ringbuffer_insert(rb, aa, 7);
+  EXPECT_EQ((size_t)5, added);
+  EXPECT_EQ((size_t)0, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)5, ringbuffer_size(rb));
+
+  added = ringbuffer_insert(rb, bb, 5);
+  EXPECT_EQ((size_t)0, added);
+  EXPECT_EQ((size_t)0, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)5, ringbuffer_size(rb));
+
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 5);
+  EXPECT_EQ((size_t)5, peeked);
+  EXPECT_EQ((size_t)0, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)5, ringbuffer_size(rb));
+
+  ASSERT_TRUE(0 == memcmp(aa, peek, peeked));
+
+  ringbuffer_free(rb);
+}
+
+TEST(RingbufferTest, test_multi_insert_delete) {
+  ringbuffer_t* rb = ringbuffer_init(16);
+  EXPECT_EQ((size_t)16, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)0, ringbuffer_size(rb));
+
+  // Insert some bytes
+
+  uint8_t aa[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
+  size_t added = ringbuffer_insert(rb, aa, sizeof(aa));
+  EXPECT_EQ((size_t)8, added);
+  EXPECT_EQ((size_t)8, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)8, ringbuffer_size(rb));
+
+  uint8_t bb[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
+  ringbuffer_insert(rb, bb, sizeof(bb));
+  EXPECT_EQ((size_t)3, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)13, ringbuffer_size(rb));
+
+  uint8_t content[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+                       0xAA, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
+  uint8_t peek[16] = {0};
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 16);
+  EXPECT_EQ((size_t)13, peeked);
+  ASSERT_TRUE(0 == memcmp(content, peek, peeked));
+
+  // Delete some bytes
+
+  ringbuffer_delete(rb, sizeof(aa));
+  EXPECT_EQ((size_t)11, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)5, ringbuffer_size(rb));
+
+  // Add some more to wrap buffer
+
+  uint8_t cc[] = {0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};
+  ringbuffer_insert(rb, cc, sizeof(cc));
+  EXPECT_EQ((size_t)2, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)14, ringbuffer_size(rb));
+
+  uint8_t content2[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC};
+  peeked = ringbuffer_peek(rb, 0, peek, 7);
+  EXPECT_EQ((size_t)7, peeked);
+  ASSERT_TRUE(0 == memcmp(content2, peek, peeked));
+
+  // Pop buffer
+
+  memset(peek, 0, 16);
+  size_t popped = ringbuffer_pop(rb, peek, 7);
+  EXPECT_EQ((size_t)7, popped);
+  EXPECT_EQ((size_t)9, ringbuffer_available(rb));
+  ASSERT_TRUE(0 == memcmp(content2, peek, peeked));
+
+  // Add more again to check head motion
+
+  uint8_t dd[] = {0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD};
+  added = ringbuffer_insert(rb, dd, sizeof(dd));
+  EXPECT_EQ((size_t)8, added);
+  EXPECT_EQ((size_t)1, ringbuffer_available(rb));
+
+  // Delete everything
+
+  ringbuffer_delete(rb, 16);
+  EXPECT_EQ((size_t)16, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)0, ringbuffer_size(rb));
+
+  // Add small token
+
+  uint8_t ae[] = {0xAE, 0xAE, 0xAE};
+  added = ringbuffer_insert(rb, ae, sizeof(ae));
+  EXPECT_EQ((size_t)13, ringbuffer_available(rb));
+
+  // Get everything
+
+  popped = ringbuffer_pop(rb, peek, 16);
+  EXPECT_EQ(added, popped);
+  EXPECT_EQ((size_t)16, ringbuffer_available(rb));
+  EXPECT_EQ((size_t)0, ringbuffer_size(rb));
+  ASSERT_TRUE(0 == memcmp(ae, peek, popped));
+
+  ringbuffer_free(rb);
+}
