Merge "NFC: Merge branch 'caf/caf/nxpnfc-project/br_android_ncihalx_o' into nfc.lnx.3.1"
diff --git a/README.md b/README.md
index 5dbc62f..8491caa 100644
--- a/README.md
+++ b/README.md
@@ -42,3 +42,7 @@
 | android-o-preview2                     |  8.0.C_O (PN553/PN557) |  NFC_NCIHALx_AR1800.8.0.C_O_OpnSrc |
 | android-o-preview2                     |  8.0.13_O (PN553/PN557) |  NFC_NCIHALx_AR18C0.8.0.13_O_OpnSrc |
 | android-8.0.0_r4               |  8.1.0_O (PN553) |  NFC_NCIHALx_AR00C0.8.1.0_O_OpnSrc |
+| android-8.0.0_r4               |  8.2.0_O (PN557) |  NFC_NCIHALx_AR18C0.8.2.0_O_OpnSrc |
+| android-8.0.0_r4               |  8.2.3_O (PN557) |  NFC_NCIHALx_AR18C0.8.2.3_O_OpnSrc |
+| android-8.0.0_r4               |  8.3.0_O (PN548C2/PN551/PN553) |  NFC_NCIHALx_AR0054.8.3.0_O_OpnSrc |
+| android-8.0.0_r4               |  8.3.0_O (PN548C2/PN551) | NFC_NCIHALx_AR003C.8.3.0_O_OpnSrc  |
diff --git a/halimpl/pn54x/common/phNfcCommon.h b/halimpl/pn54x/common/phNfcCommon.h
index 4ba1bbf..f03896d 100644
--- a/halimpl/pn54x/common/phNfcCommon.h
+++ b/halimpl/pn54x/common/phNfcCommon.h
@@ -33,7 +33,7 @@
 #include <phNfcCompId.h>
 
 /* HAL Version number (Updated as per release) */
-#define NXP_MW_VERSION_MAJ (0x01)
+#define NXP_MW_VERSION_MAJ (0x03)
 #define NXP_MW_VERSION_MIN (0x00)
 
 #define GET_EEPROM_DATA (1U)
diff --git a/halimpl/pn54x/configs/NxpNfcCapability.cpp b/halimpl/pn54x/configs/NxpNfcCapability.cpp
index 5a89486..a4d0e14 100644
--- a/halimpl/pn54x/configs/NxpNfcCapability.cpp
+++ b/halimpl/pn54x/configs/NxpNfcCapability.cpp
@@ -45,11 +45,13 @@
 
             case 0x40 : //PN553 A0
             case 0x41 : //PN553 B0
+                        //NQ310
                 chipType = pn553;
                 break;
 
             case 0x50 : //PN553 A0 + P73
-            case 0x51 : //PN553 B0 + P73
+            case 0x51 : //PN553 B0 + P73 , NQ440
+                        //NQ330
                 chipType = pn80T;
                 break;
 
@@ -58,16 +60,17 @@
                 break;
 
             case 0xA8 :
+            case 0x08 :
                 chipType = pn67T;
                 break;
 
             case 0x28 :
-            case 0x48 :
+            case 0x48 : //NQ210
                 chipType = pn548C2;
                 break;
 
             case 0x18 :
-            case 0x58 :
+            case 0x58 : //NQ220
                 chipType = pn66T;
                 break;
 
@@ -80,6 +83,7 @@
             chipType = pn80T;
         }
     }
+    ALOGD ("%s NxpNci > Product : %s",__func__,product[chipType]);
     return chipType;
 }
 
diff --git a/halimpl/pn54x/configs/NxpNfcCapability.h b/halimpl/pn54x/configs/NxpNfcCapability.h
index 538a9c8..e6c3beb 100644
--- a/halimpl/pn54x/configs/NxpNfcCapability.h
+++ b/halimpl/pn54x/configs/NxpNfcCapability.h
@@ -56,6 +56,10 @@
     static capability* instance;
     const uint16_t offsetHwVersion = 24;
     const uint16_t offsetFwVersion = 25;
+    /*product[] will be used to print product version and
+    should be kept in accordance with tNFC_chipType*/
+    const char* product[11] = {"UNKNOWN","PN547C2","PN65T","PN548C2","PN66T",
+    "PN551","PN67T","PN553","PN80T","PN557","PN81T"};
     capability();
 public:
     static tNFC_chipType chipType;
diff --git a/halimpl/pn54x/hal/phNxpNciHal.c b/halimpl/pn54x/hal/phNxpNciHal.c
index 6fcad93..f8d0103 100644
--- a/halimpl/pn54x/hal/phNxpNciHal.c
+++ b/halimpl/pn54x/hal/phNxpNciHal.c
@@ -547,6 +547,7 @@
         } while (init_retry_cnt < 0x03);
       }
     }
+    pthread_attr_destroy(&attr);
   }
   CONCURRENCY_UNLOCK();
   init_retry_cnt = 0;
@@ -876,12 +877,12 @@
   }
 
   /* 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;
   }
+  memcpy(nxpncihal_ctrl.p_cmd_data, p_data, data_len);
 #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 &&
@@ -1180,7 +1181,23 @@
       ALOGE("%s: error deleting file %s", __func__, config_eseinfo_path);
   }
 }
+/*******************************************************************************
+ **
+ ** Function:        phNxpNciHal_lastResetNtfReason()
+ **
+ ** Description:     Returns and clears last reset notification reason.
+ **                      Intended to be called only once during recovery.
+ **
+ ** Returns:         reasonCode
+ **
+ ********************************************************************************/
+uint8_t phNxpNciHal_lastResetNtfReason(void) {
+  uint8_t reasonCode = nxpncihal_ctrl.nci_info.lastResetNtfReason;
 
+  nxpncihal_ctrl.nci_info.lastResetNtfReason = 0;
+
+  return reasonCode;
+}
 /******************************************************************************
  * Function         phNxpNciHal_core_initialized
  *
@@ -1210,6 +1227,8 @@
   static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
   static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01, 0x00};
   static uint8_t cmd_init_nci2_0[] = {0x20,0x01,0x02,0x00,0x00};
+  static uint8_t cmd_get_cfg_dbg_info[] = {0x20, 0x03, 0x4, 0xA0, 0x1B, 0xA0, 0x27};
+
   config_success = true;
   long bufflen = 260;
   long retlen = 0;
@@ -1355,7 +1374,8 @@
 #endif
 
 
-  if((nfcFL.chipType != pn547C2) && nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP) {
+  if((nfcFL.chipType != pn547C2) && (nfcFL.chipType != pn557) &&
+      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP) {
       if (isNxpConfigModified() || (fw_dwnld_flag == 0x01)) {
           uint8_t value;
           retlen = 0;
@@ -1450,6 +1470,11 @@
     }
   }
 #endif
+  if(phNxpNciHal_lastResetNtfReason() == FW_DBG_REASON_AVAILABLE){
+
+    phNxpNciHal_send_ext_cmd(sizeof(cmd_get_cfg_dbg_info), cmd_get_cfg_dbg_info);
+    NXPLOG_NCIHAL_D("NFCC txed reset ntf with reason code 0xA3");
+  }
   setConfigAlways = false;
   isfound = GetNxpNumValue(NAME_NXP_SET_CONFIG_ALWAYS, &num, sizeof(num));
   if (isfound > 0) {
@@ -1907,7 +1932,7 @@
 
   config_access = false;
   if (!((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4))) {
-      if(nfcFL.nfcNxpEse == true) {
+      if(nfcFL.nfcNxpEse == true && nfcFL.eseFL._ESE_ETSI12_PROP_INIT) {
           status = phNxpNciHal_check_eSE_Session_Identity();
           if (status != NFCSTATUS_SUCCESS) {
               NXPLOG_NCIHAL_E("Session id/ SWP intf reset Failed");
@@ -2955,6 +2980,15 @@
             }
         }
       break;
+    case HAL_NFC_IOCTL_REL_DWP_WAIT:
+        if(nfcFL.nfcNxpEse) {
+            status = phTmlNfc_rel_dwpOnOff_wait(gpphTmlNfc_Context->pDevHandle);
+            NXPLOG_NCIHAL_D("HAL_NFC_IOCTL_REL_DWP_ON_OFF_WAIT retval = %d\n", status);
+            if (NFCSTATUS_SUCCESS == status) {
+                ret = 0;
+            }
+        }
+      break;
 
     case HAL_NFC_IOCTL_SET_BOOT_MODE:
       if (NULL != p_data) {
@@ -3146,8 +3180,9 @@
 
 if(nfcFL.chipType == pn553) {
     static uint8_t set_clock_cmd[] = {0x20, 0x02, 0x05, 0x01, 0xA0, 0x03, 0x01, 0x08};
+    uint8_t setClkCmdLen = sizeof(set_clock_cmd);
     unsigned long  clockSource, frequency;
-    uint32_t pllSetRetryCount = 3, dpllSetRetryCount = 3;
+    uint32_t pllSetRetryCount = 3, dpllSetRetryCount = 3,setClockCmdWriteRetryCnt = 0;
     uint8_t *pCmd4PllSetting;
     uint8_t *pCmd4DpllSetting;
     uint32_t pllCmdLen, dpllCmdLen;
@@ -3251,6 +3286,12 @@
     switch(clockSource)
     {
         case CLK_SRC_PLL:
+            set_clock_cmd[setClkCmdLen -1] = 0x00;
+            while(status != NFCSTATUS_SUCCESS && setClockCmdWriteRetryCnt++ < MAX_RETRY_COUNT)
+            status = phNxpNciHal_send_ext_cmd(setClkCmdLen, set_clock_cmd);
+
+            status = NFCSTATUS_FAILED;
+
             while(status != NFCSTATUS_SUCCESS && pllSetRetryCount -- > 0)
                 status = phNxpNciHal_send_ext_cmd(pllCmdLen, pCmd4PllSetting);
 
@@ -3262,7 +3303,7 @@
             break;
 
         case CLK_SRC_XTAL:
-            status = phNxpNciHal_send_ext_cmd(sizeof(set_clock_cmd), set_clock_cmd);
+            status = phNxpNciHal_send_ext_cmd(setClkCmdLen, set_clock_cmd);
             if (status != NFCSTATUS_SUCCESS)
             {
                 NXPLOG_NCIHAL_E("XTAL clock setting failed !!");
diff --git a/halimpl/pn54x/hal/phNxpNciHal.h b/halimpl/pn54x/hal/phNxpNciHal.h
index 3839631..8870dcc 100644
--- a/halimpl/pn54x/hal/phNxpNciHal.h
+++ b/halimpl/pn54x/hal/phNxpNciHal.h
@@ -80,6 +80,9 @@
 #define FW_MOBILE_ROM_VERSION_PN547C2 0x08
 #define FW_MOBILE_ROM_VERSION_PN557 0x12
 
+#define FW_DBG_REASON_AVAILABLE     (0xA3)
+
+
 /* NCI Data */
 #define NCI_MT_CMD  0x20
 #define NCI_MT_RSP  0x40
@@ -105,6 +108,7 @@
 typedef struct phNxpNciInfo {
   uint8_t   nci_version;
   bool_t    wait_for_ntf;
+  uint8_t   lastResetNtfReason;
 }phNxpNciInfo_t;
 /* NCI Control structure */
 typedef struct phNxpNciHal_Control {
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.c b/halimpl/pn54x/hal/phNxpNciHal_ext.c
index 805fe9b..3f35693 100644
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.c
+++ b/halimpl/pn54x/hal/phNxpNciHal_ext.c
@@ -344,6 +344,10 @@
              nxpncihal_ctrl.is_wait_for_ce_ntf) {
     NXPLOG_NCIHAL_D("CORE_INIT_RSP 2 received !");
   }
+  /*Retreive reset ntf reason code irrespective of NCI 1.0 or 2.0*/
+  if (p_ntf[0] == 0x60 && p_ntf[1] == 0x00 ){
+    nxpncihal_ctrl.nci_info.lastResetNtfReason = p_ntf[3];
+  }
 }
 /*Handle NFCC2.0 in NCI1.0 Boot sequence*/
 if (((nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT) &&
@@ -365,69 +369,8 @@
         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]);
-        NXPLOG_NCIHAL_D("NxpNci> Model id: %x", p_ntf[len - 3] >> 4);
         fw_maj_ver = p_ntf[len - 1];
         rom_version = p_ntf[len - 2];
-        /* Before FW version: 10.01.12, products are PN548c2(for model id = 0) and
-         * PN66T(for model id = 1)*/
-        if (p_ntf[len - 2] == 0x10) {
-            if ((p_ntf[len - 1] < 0x01) |
-                    ((p_ntf[len - 1] == 0x01) &&
-                            (p_ntf[len] <= 0x11)))  // for FW < 10.01.12
-            {
-                NXPLOG_NCIHAL_D("NxpNci> Model ID: %x", p_ntf[len - 3] >> 4);
-                if (0x01 == (p_ntf[len - 3] >> 4)) {
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN66T");
-                } else {
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN548C2");
-                }
-            } else if ((p_ntf[len - 1] == 0x01) &&
-                    (p_ntf[len] >= 0x12))  // for FW >= 10.01.12
-            {
-                NXPLOG_NCIHAL_D("NxpNci> Model ID: %x", p_ntf[len - 3] >> 4);
-                /* From FW version: 10.01.12, product names based on Hardware Version
-                 * number */
-                switch (p_ntf[len - 3]) {
-                case 0x08:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN546");
-                    break;
-                case 0x18:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN66T");
-                    break;
-                case 0x28:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN548C2");
-                    break;
-                case 0x38:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN66U");
-                    break;
-                case 0x48:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: NQ210");
-                    break;
-                case 0x58:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: NQ220");
-                    break;
-                case 0x68:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: NPC300");
-                    break;
-                case 0x78:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: NPC320");
-                    break;
-                case 0x88:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN7150");
-                    break;
-                case 0x98:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: PN548C3");
-                    break;
-                default:
-                    NXPLOG_NCIHAL_D("NxpNci> Product: Invalid");
-                    break;
-                }
-            }
-        } else {
-            /* Do Nothing */
-        }
     }
 }
 
diff --git a/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h b/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h
index 0b4f22c..e937810 100644
--- a/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h
+++ b/halimpl/pn54x/inc/phNxpNciHal_SelfTest.h
@@ -67,6 +67,35 @@
                                                   Tolerance 2*/
 } phAntenna_St_Resp_t; /* Instance of Transaction structure */
 
+/* NCI Commands */
+#define NCI_CORE_RESET_NCI20_RSP   {0x40, 0x00, 0x01, 0x00}
+#define NCI_CORE_RESET_NCI20_NTF   {0x60, 0x00, 0x09, 0x02, 0x00, 0x20, 0x04, 0x04, 0x51, 0x12, 0x01, 0x03}
+#define NCI_CORE_INIT_NCI20_CMD    {0x20, 0x01, 0x02, 0x00, 0x00}
+#define NCI_CORE_INIT_NCI20_RSP    {0x40, 0x01, 0x1E, 0x00}
+#define NCI_CORE_INIT_NCI10_CMD    {0x20, 0x01, 0x00}
+#define NCI20_CORE_RESET_RSP_LEN   0x01
+#define NCI10_CORE_RESET_RSP_LEN   0x03
+#define NCI_CORE_RESET_STATUS_OK   0x00
+#define NCI_MSG_TYPE_MASK          0xF0
+
+/* Proprietary Commands */
+#define SYSTEM_SET_POWERMGT_CMD        {0x2F, 0x00, 0x01, 0x00}
+#define SYSTEM_SET_POWERMGT_CMD_1      {0x2F, 0x00, 0x01, 0x01}
+#define SYSTEM_SET_POWERMGT_RSP        {0x4F, 0x00, 0x01, 0x00}
+#define SYSTEM_PROPRIETARY_ACT_CMD     {0x2F, 0x02, 0x00}
+#define SYSTEM_PROPRIETARY_ACT_RSP     {0x4F, 0x02, 0x05, 0x00}
+#define SYSTEM_TEST_ANTENNA_CMD_1      {0x2F, 0x3D, 0x05, 0x20, 0x01, 0x00, 0x00, 0x00}
+#define SYSTEM_TEST_ANTENNA_RSP_1      {0x4F, 0x3D, 0x05, 0x00}
+#define SYSTEM_TEST_ANTENNA_CMD_2      {0x2F, 0x3D, 0x02, 0x20, 0x01}
+#define SYSTEM_TEST_ANTENNA_CMD_3      {0x2F, 0x3D, 0x02, 0x20, 0x00}
+#define SYSTEM_TEST_ANTENNA_CMD_4      {0x2F, 0x3D, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00}
+#define SYSTEM_TEST_ANTENNA_CMD_5      {0x2F, 0x3D, 0x02, 0x01, 0x80}
+#define SYSTEM_TEST_ANTENNA_RSP_2      {0x4F, 0x3D, 05}
+#define SYSTEM_TEST_ANTENNA_CMD_6      {0x2F, 0x3D, 0x04, 0x08, 0x8C, 0x60, 0x03}
+#define SYSTEM_TEST_ANTENNA_CMD_7      {0x2F, 0x3D, 0x04, 0x02, 0xC8, 0x60, 0x03}
+#define SYSTEM_TEST_ANTENNA_CMD_8      {0x2F, 0x3D, 0x04, 0x02, 0xCD, 0x60, 0x03}
+#define SYSTEM_TEST_ANTENNA_CMD_9      {0x2F, 0x3D, 0x04, 0x04, 0x20, 0x08, 0x20}
+
 /*******************************************************************************
  **
  ** Function         phNxpNciHal_TestMode_open
diff --git a/halimpl/pn54x/libnfc-nxp-PN553_example.conf b/halimpl/pn54x/libnfc-nxp-PN553_example.conf
index 1fdedf5..75466f4 100644
--- a/halimpl/pn54x/libnfc-nxp-PN553_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN553_example.conf
@@ -454,6 +454,12 @@
 NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
 
 ###############################################################################
+#Enable NXP NCI runtime parser library
+#Enable 0x01
+#Disable 0x00
+NXP_NCI_PARSER_LIBRARY=0x00
+
+###############################################################################
 #This config will enable different level of Rf transaction debugs based on the
 #following values provided. Decoded information will be printed in adb logcat
 #Debug Mode         Levels
@@ -466,10 +472,11 @@
 #NXP_CORE_PROP_SYSTEM_DEBUG=0x00
 
 ###############################################################################
-# Restrict routing to first matched rule only.
-# Blacklist enable   0x01
-# Blacklist disable  0x00
-NXP_PROP_BLACKLIST_ROUTING=0x00
+# 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
 
 ###############################################################################
 # Timeout value in milliseconds to send response for Felica command received
diff --git a/halimpl/pn54x/libnfc-nxp-PN557_example.conf b/halimpl/pn54x/libnfc-nxp-PN557_example.conf
index db3b79d..b8d925b 100644
--- a/halimpl/pn54x/libnfc-nxp-PN557_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN557_example.conf
@@ -441,10 +441,22 @@
 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
+#Enable NXP NCI runtime parser library
+#Enable 0x01
+#Disable 0x00
+NXP_NCI_PARSER_LIBRARY=0x00
+
+###############################################################################
+#This config will enable different level of Rf transaction debugs based on the
+#following values provided. Decoded information will be printed in adb logcat
+#Debug Mode         Levels
+#Disable Debug      0x00
+#L1 Debug           0x01
+#L2 Debug           0x02
+#L1 & L2 Debug      0x03
+#L1 & L2 & RSSI     0x04
+#L1 & L2 & Felica   0x05
+#NXP_CORE_PROP_SYSTEM_DEBUG=0x00
 
 ###############################################################################
 # Timeout value in milliseconds to send response for Felica command received
diff --git a/halimpl/pn54x/libnfc-nxp-PN65T_example.conf b/halimpl/pn54x/libnfc-nxp-PN65T_example.conf
index 3a9a807..e50eac8 100644
--- a/halimpl/pn54x/libnfc-nxp-PN65T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN65T_example.conf
@@ -311,3 +311,7 @@
 NXP_ENABLE_ADD_AID=0x01
 
 ###############################################################################
+# HAL library path for selftest
+NXP_HAL_PATH="/system/lib64/hw/nfc_nci.pn54x.so"
+
+###############################################################################
\ No newline at end of file
diff --git a/halimpl/pn54x/libnfc-nxp-PN66T_example.conf b/halimpl/pn54x/libnfc-nxp-PN66T_example.conf
index 1af8100..469646f 100644
--- a/halimpl/pn54x/libnfc-nxp-PN66T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN66T_example.conf
@@ -421,3 +421,7 @@
 NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
 
 ###############################################################################
+# HAL library path for selftest
+NXP_HAL_PATH="/system/lib64/hw/nfc_nci.pn54x.so"
+
+###############################################################################
diff --git a/halimpl/pn54x/libnfc-nxp-PN67T_example.conf b/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
index 25f7a5f..b8ce7dd 100644
--- a/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
@@ -432,3 +432,7 @@
 NXP_PROP_BLACKLIST_ROUTING=0x00
 
 ###############################################################################
+# HAL library path for selftest
+NXP_HAL_PATH="/system/lib64/hw/nfc_nci.pn54x.so"
+
+###############################################################################
diff --git a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf b/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
index 31d6ddc..1934ca2 100644
--- a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
@@ -529,16 +529,17 @@
 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
+# 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
 
 ###############################################################################
 # Send DWP interface reset command as part of SE open
 # Disable           0x00
 # Enable            0x01
-NXP_DWP_INTF_RESET_ENABLE=0x01
+NXP_DWP_INTF_RESET_ENABLE=0x00
 
 ###############################################################################
 # Timeout value in milliseconds for JCOP OS download to complete
@@ -550,6 +551,10 @@
 
 ###############################################################################
 # Maximum WTX requests entertained by MW
-NXP_WM_MAX_WTX_COUNT=9000
+NXP_WM_MAX_WTX_COUNT=50
 
-###############################################################################
\ No newline at end of file
+###############################################################################
+# HAL library path for selftest
+NXP_HAL_PATH="/vendor/lib64/hw/nfc_nci.pn54x.so"
+
+###############################################################################
diff --git a/halimpl/pn54x/libnfc-nxp-PN81T_example.conf b/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
index 66948fd..d0f3aef 100644
--- a/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
@@ -352,12 +352,31 @@
 NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
 
 ###############################################################################
+#Enable NXP NCI runtime parser library
+#Enable 0x01
+#Disable 0x00
+NXP_NCI_PARSER_LIBRARY=0x00
+
+###############################################################################
+#This config will enable different level of Rf transaction debugs based on the
+#following values provided. Decoded information will be printed in adb logcat
+#Debug Mode         Levels
+#Disable Debug      0x00
+#L1 Debug           0x01
+#L2 Debug           0x02
+#L1 & L2 Debug      0x03
+#L1 & L2 & RSSI     0x04
+#L1 & L2 & Felica   0x05
+#NXP_CORE_PROP_SYSTEM_DEBUG=0x00
+
+###############################################################################
 # 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
@@ -381,16 +400,10 @@
 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
+NXP_DWP_INTF_RESET_ENABLE=0x00
 
 ###############################################################################
 # Timeout value in milliseconds for JCOP OS download to complete
@@ -401,3 +414,11 @@
 NXP_HCEF_CMD_RSP_TIMEOUT_VALUE=5000
 
 ###############################################################################
+# Maximum WTX requests entertained by MW
+NXP_WM_MAX_WTX_COUNT=50
+
+###############################################################################
+# HAL library path for selftest
+NXP_HAL_PATH="/vendor/lib64/hw/nfc_nci.pn54x.so"
+
+###############################################################################
diff --git a/halimpl/pn54x/libnfc-nxp_RF-PN80T_example.conf b/halimpl/pn54x/libnfc-nxp_RF-PN80T_example.conf
index 3f4e061..d9e6199 100644
--- a/halimpl/pn54x/libnfc-nxp_RF-PN80T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp_RF-PN80T_example.conf
@@ -50,7 +50,7 @@
 # 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,
+NXP_CORE_CONF_EXTN={20, 02, 32, 0C,
     A0, EC, 01, 01,
     A0, ED, 01, 01,
     A0, 5E, 01, 01,
@@ -60,7 +60,9 @@
     A0, D4, 01, 01,
     A0, 37, 01, 35,
     A0, D8, 01, 02,
-    A0, D5, 01, 0A
+    A0, D5, 01, 0A,
+    A0, B2, 01, 1E,
+    A0, 9F, 02, 08, 08
    }
 #       A0, F2, 01, 01,
 #       A0, 40, 01, 01,
diff --git a/halimpl/pn54x/libnfc-nxp_RF-PN81T_example.conf b/halimpl/pn54x/libnfc-nxp_RF-PN81T_example.conf
index cb74752..6c31e03 100644
--- a/halimpl/pn54x/libnfc-nxp_RF-PN81T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp_RF-PN81T_example.conf
@@ -50,7 +50,7 @@
 # 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,
+NXP_CORE_CONF_EXTN={20, 02, 32, 0C,
     A0, EC, 01, 01,
     A0, ED, 01, 01,
     A0, 5E, 01, 01,
@@ -60,7 +60,9 @@
     A0, D4, 01, 01,
     A0, 37, 01, 35,
     A0, D8, 01, 02,
-    A0, D5, 01, 0A
+    A0, D5, 01, 0A,
+    A0, B2, 01, 1E,
+    A0, 9F, 02, 08, 08
    }
 #       A0, F2, 01, 01,
 #       A0, 40, 01, 01,
diff --git a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c b/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
index b475412..c45bb23 100644
--- a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
+++ b/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
@@ -30,8 +30,12 @@
 #define HAL_WRITE_MAX_RETRY (10)
 #define CORE_INIT_NCI2_0 false
 
-#define NXP_NFCC_RESET_RSP_LEN (0x10U) //for PN553 (0x10U) else (0x11U)
-
+#define NXP_NFCC_RESET_RSP_LEN   (0x10U) //for PN553 and PN557 (0x10U) else (0x11U)
+#define NFCC_EXP_NTF_LEN_NULL    0x00
+#define NFCC_EXP_NTF_DATA_NULL   0x00
+#define NFCC_CMD_NCI20_LEN       0x05
+#define NFCC_CMD_NCI10_LEN       0x03
+#define NFCC_EXP_RES_DATA_BYTE2 ((nfcFL.chipType == pn547C2) ? 0x17 : 0x19)
 /******************* Structures and definitions *******************************/
 
 typedef uint8_t (*st_validator_t)(nci_data_t* exp,
@@ -48,6 +52,12 @@
 
 } nci_test_data_t;
 
+typedef struct selftest_hdlr{
+    bool wait_for_ntf;
+    uint8_t nci_version;
+    phTmlNfc_TransactInfo_t mTransInfo;
+}selftest_hdlr_t;
+selftest_hdlr_t mSelfTestHdlr;
 /******************* Global variables *****************************************/
 
 static int thread_running = 0;
@@ -62,6 +72,13 @@
 
 /* Driver parameters */
 phLibNfc_sConfig_t gDrvCfg;
+const static uint8_t nfcc_core_reset_nci20_rsp[] = NCI_CORE_RESET_NCI20_RSP;
+const static uint8_t nfcc_core_reset_nci20_ntf[] = NCI_CORE_RESET_NCI20_NTF;
+const static uint8_t nfcc_core_init_nci20_cmd[] = NCI_CORE_INIT_NCI20_CMD;
+const static uint8_t nfcc_core_init_nci20_rsp[] = NCI_CORE_INIT_NCI20_RSP;
+const static uint8_t nfcc_core_init_nci10_cmd[] = NCI_CORE_INIT_NCI10_CMD;
+uint8_t nfcc_power_mgt_cmd[] = SYSTEM_SET_POWERMGT_CMD;
+uint8_t nfcc_power_mgt_rsp[] = SYSTEM_SET_POWERMGT_RSP;
 
 NFCSTATUS gtxldo_status = NFCSTATUS_FAILED;
 NFCSTATUS gagc_value_status = NFCSTATUS_FAILED;
@@ -87,17 +104,15 @@
                                  uint8_t tech, uint8_t bitrate,
                                  uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
 
+static NFCSTATUS phNxpNciHal_initialize_chipType();
+
 /* 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, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -105,21 +120,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-    || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
-      0x4, {0x40, 0x01, 0x19, 0x00}              /* exp_rsp */
-#else
-      0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
+      0x4, {0x40, 0x01, 0x19, 0x00}
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -158,11 +162,7 @@
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -170,21 +170,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-    || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
       0x4, {0x40, 0x01, 0x19, 0x00}                          /* exp_rsp */
-#else
-      0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -216,16 +205,12 @@
      st_validator_testSWP1_vltg},
 };
 
-static nci_test_data_t prbs_test_data[] = {
+static nci_test_data_t prbs_test_data[10] = {
     {{
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -233,54 +218,26 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-    || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
       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[] = {
+static nci_test_data_t rf_field_on_test_data[10] = {
     {{
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -288,92 +245,24 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-     || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
       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[] = {
+static nci_test_data_t rf_field_off_test_data[10] = {
     {{
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -381,81 +270,17 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-     || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
       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[] = {
@@ -463,11 +288,7 @@
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -491,16 +312,12 @@
      st_validator_null},
 };
 /* Antenna self test data*/
-static nci_test_data_t antenna_self_test_data[] = {
+static nci_test_data_t antenna_self_test_data[10] = {
     {{
       0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       0x06, {0x40, 0x00, 0x03, 0x00, NXP_NFCC_RESET_RSP_LEN, 0x00} /* exp_rsp */
-#else
-      0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -508,21 +325,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if ((NFC_NXP_CHIP_TYPE != PN547C2) && (CORE_INIT_NCI2_0))
-      0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
       0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-     || (NFC_NXP_CHIP_TYPE == PN557))
-      0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#elif(NFC_NXP_CHIP_TYPE == PN548C2)
       0x4, {0x40, 0x01, 0x19, 0x00}                          /* exp_rsp */
-#else
-      0x4, {0x40, 0x01, 0x17, 0x00} /* exp_rsp */
-#endif
      },
      {
       0x00, {0x00} /* ext_ntf */
@@ -539,85 +345,8 @@
       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},
-#if (NXP_HW_ANTENNA_LOOP4_SELF_TEST == true)
-    {{
-      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},
-#endif
-    {{
-      0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
-     },
-     {
-      0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
-     },
-     {
-      0x00, {0x00} /* ext_ntf */
-     },
-     st_validator_testEquals, /* validator */
-     st_validator_null}};
+     st_validator_null}
+};
 
 /************** Self test functions ***************************************/
 
@@ -638,9 +367,17 @@
 *******************************************************************************/
 static uint8_t st_validator_null(nci_data_t* exp,
                                  phTmlNfc_TransactInfo_t* act) {
-  UNUSED(exp);
-  UNUSED(act);
-  return 1;
+  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;
 }
 
 /*******************************************************************************
@@ -932,6 +669,7 @@
   if (NULL == exp || NULL == act) {
     return result;
   }
+
   if (exp->len <= act->wLength &&
       (memcmp(exp->p_data, act->pBuff, exp->len) == 0)) {
     result = 1;
@@ -967,7 +705,6 @@
 *******************************************************************************/
 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 {
@@ -976,7 +713,6 @@
 
   p_cb_data->status = pInfo->wStatus;
   SEM_POST(p_cb_data);
-
   return;
 }
 
@@ -990,8 +726,14 @@
 **
 *******************************************************************************/
 static void hal_read_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
-  phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
   NFCSTATUS status;
+  phNxpNciHal_Sem_t* p_cb_data = NULL;
+
+  if((pInfo == NULL) || (pContext == NULL)){
+    NXPLOG_NCIHAL_E("Invalid params..! exiting...");
+    return;
+  }
+  p_cb_data = (phNxpNciHal_Sem_t*)pContext;
   if (hal_write_timer_fired == 1) {
     NXPLOG_NCIHAL_D("hal_read_cb - response timeout occurred");
 
@@ -999,51 +741,71 @@
     p_cb_data->status = NFCSTATUS_RESPONSE_TIMEOUT;
     status = phTmlNfc_ReadAbort();
   } else {
-    NFCSTATUS status = phOsalNfc_Timer_Stop(timeoutTimerId);
 
+    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;
+    if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
+      NXPLOG_NCIHAL_D("hal_read_cb successful status = 0x%x", pInfo->wStatus);
+      if(pInfo->pBuff[0] == NCI_MT_RSP && ((pInfo->pBuff[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)){
+        if(pInfo->pBuff[2] == NCI20_CORE_RESET_RSP_LEN && pInfo->pBuff[3] == NCI_CORE_RESET_STATUS_OK){
+          NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI2.0");
+          mSelfTestHdlr.wait_for_ntf = TRUE;
+        }
+        else if(pInfo->pBuff[2] == NCI10_CORE_RESET_RSP_LEN && pInfo->pBuff[3] == NCI_CORE_RESET_STATUS_OK){
+          NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI1.0");
+          mSelfTestHdlr.wait_for_ntf = FALSE;
+          mSelfTestHdlr.nci_version = pInfo->pBuff[4];
+        }
+      }else if (pInfo->pBuff[0] == NCI_MT_NTF && ((pInfo->pBuff[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)){
+        mSelfTestHdlr.mTransInfo.wStatus = pInfo->wStatus;
+        mSelfTestHdlr.mTransInfo.wLength = pInfo->wLength;
+        memcpy(mSelfTestHdlr.mTransInfo.pBuff, pInfo->pBuff, pInfo->wLength);
+        mSelfTestHdlr.nci_version = pInfo->pBuff[5];
+        mSelfTestHdlr.wait_for_ntf = FALSE;
+      }else if(pInfo->pBuff[0] == NCI_MT_RSP && ((pInfo->pBuff[1] & NCI_OID_MASK) == NCI_MSG_CORE_INIT)){
+        mSelfTestHdlr.wait_for_ntf = FALSE;
+        if(mSelfTestHdlr.nci_version == NCI_VERSION_2_0){
+          NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI2.0 received !");
+        }
+        else{
+          mSelfTestHdlr.mTransInfo.wStatus = pInfo->wStatus;
+          mSelfTestHdlr.mTransInfo.wLength = pInfo->wLength;
+          memcpy(mSelfTestHdlr.mTransInfo.pBuff, pInfo->pBuff, pInfo->wLength);
+          NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI1.0 received !");
         }
       }
+      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;
+    }
 
-      /* Compare the actual response with expected response.*/
-      else if (test_data->rsp_validator(&(test_data->exp_rsp), pInfo) == 1) {
+    nci_test_data_t* test_data = (nci_test_data_t*)p_cb_data->pContext;
+    if ((pInfo->pBuff[0] & NCI_MSG_TYPE_MASK) == NCI_MT_NTF) {
+      /* 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;
       }
-      test_data->exp_rsp.len = 0;
+    }
+
+    /* Compare the actual response with expected response.*/
+    else if((pInfo->pBuff[0] & NCI_MSG_TYPE_MASK) == NCI_MT_RSP){
+      if (test_data->rsp_validator(&(test_data->exp_rsp), pInfo) == 1) {
+        p_cb_data->status = NFCSTATUS_SUCCESS;
+      } else {
+        p_cb_data->status = NFCSTATUS_FAILED;
+      }
     }
   }
 
   SEM_POST(p_cb_data);
-
   return;
 }
 
@@ -1073,7 +835,6 @@
     if (thread_running == 0) {
       break;
     }
-
     switch (msg.eMsgType) {
       case PH_LIBNFC_DEFERREDCALL_MSG: {
         phLibNfc_DeferredCall_t* deferCall =
@@ -1082,7 +843,6 @@
         REENTRANCE_LOCK();
         deferCall->pCallback(deferCall->pParameter);
         REENTRANCE_UNLOCK();
-
         break;
       }
     }
@@ -1111,7 +871,6 @@
   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");
@@ -1162,7 +921,6 @@
 
 clean_and_return:
   phNxpNciHal_cleanup_cb_data(&cb_data);
-
   return status;
 }
 
@@ -1182,7 +940,6 @@
 
   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");
@@ -1218,7 +975,6 @@
 
 clean_and_return:
   phNxpNciHal_cleanup_cb_data(&cb_data);
-
   return status;
 }
 
@@ -1286,11 +1042,15 @@
   phOsalNfc_Config_t tOsalConfig;
   phTmlNfc_Config_t tTmlConfig;
   uint8_t* nfc_dev_node = NULL;
-  const uint16_t max_len =
-      260; /* device node name is max of 255 bytes + 5 bytes (/dev/) */
+  const uint16_t max_len = 260; /* device node name is max of 255 bytes + 5 bytes (/dev/) */
   NFCSTATUS status = NFCSTATUS_SUCCESS;
   uint16_t read_len = 255;
   int8_t ret_val = 0x00;
+  mSelfTestHdlr.mTransInfo.pBuff  = (uint8_t *)malloc(max_len * sizeof(uint8_t));
+  if(mSelfTestHdlr.mTransInfo.pBuff == NULL){
+      NXPLOG_NCIHAL_E("Error ! memory not allocated.");
+      return NFCSTATUS_FAILED;
+  }
   /* initialize trace level */
   phNxpLog_InitializeLogLevel();
 
@@ -1336,7 +1096,6 @@
       nfc_dev_node = NULL;
     }
   }
-
   pthread_attr_t attr;
   pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
@@ -1351,6 +1110,11 @@
 
   timeoutTimerId = phOsalNfc_Timer_Create();
 
+  if(phNxpNciHal_initialize_chipType() != NFCSTATUS_SUCCESS){
+    NXPLOG_NCIHAL_E("Chip initialization failed");
+    goto clean_and_return;
+  }
+
   if (timeoutTimerId == 0xFFFF) {
     NXPLOG_NCIHAL_E("phOsalNfc_Timer_Create failed");
   } else {
@@ -1372,6 +1136,101 @@
 
 /*******************************************************************************
  **
+ ** Function         phNxpNciHal_initialize_chipType
+ **
+ ** Description      This function Initializes the NFCC chip type and
+ **                  Feature list flags
+ **
+ ** Returns          None.
+ **
+ ******************************************************************************/
+NFCSTATUS phNxpNciHal_initialize_chipType()
+{
+    nci_test_data_t* pCoreResetCmd = &swp1_test_data[0];
+    nci_test_data_t* pCoreInitCmd = &swp1_test_data[1];
+    NFCSTATUS status = NFCSTATUS_SUCCESS;
+    NXPLOG_NCIHAL_D("phNxpNciHal_initialize_chipType() : entry");
+
+    //CORE RESET COMMAND
+    if(!phNxpNciHal_writeLocked(pCoreResetCmd)){
+      if(phNxpNciHal_readLocked(pCoreResetCmd) != NFCSTATUS_SUCCESS){
+        NXPLOG_NCIHAL_D("Response not received for CORE RESET command");
+      }
+
+      if(mSelfTestHdlr.wait_for_ntf){
+        pCoreResetCmd->exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+        memcpy(pCoreResetCmd->exp_rsp.p_data, nfcc_core_reset_nci20_rsp,pCoreResetCmd->exp_rsp.len);
+        pCoreResetCmd->exp_ntf.len = (sizeof(nfcc_core_reset_nci20_ntf) / sizeof(nfcc_core_reset_nci20_ntf[0]));
+        memcpy(pCoreResetCmd->exp_ntf.p_data, nfcc_core_reset_nci20_ntf, pCoreResetCmd->exp_ntf.len);
+        if(phNxpNciHal_readLocked(pCoreResetCmd) != NFCSTATUS_SUCCESS){
+          NXPLOG_NCIHAL_D("NCI 2.0 Notification is not received");
+          status = NFCSTATUS_FAILED;
+        }else{
+          phNxpNciHal_configFeatureList(mSelfTestHdlr.mTransInfo.pBuff,mSelfTestHdlr.mTransInfo.wLength);
+        }
+      }
+    }else{
+      NXPLOG_NCIHAL_E("CORE RESET Write failed");
+      return NFCSTATUS_FAILED;
+    }
+
+    //CORE INIT COMMAND
+    if(mSelfTestHdlr.nci_version == NCI_VERSION_2_0){
+      pCoreInitCmd->cmd.len = NFCC_CMD_NCI20_LEN;
+      memcpy(pCoreInitCmd->cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+      pCoreInitCmd->exp_rsp.len = sizeof(nfcc_core_init_nci20_rsp);
+      memcpy(pCoreInitCmd->exp_rsp.p_data, nfcc_core_init_nci20_rsp,pCoreInitCmd->exp_rsp.len);
+      status = phNxpNciHal_writeLocked(pCoreInitCmd);
+    }
+    else{
+      pCoreInitCmd->cmd.len = NFCC_CMD_NCI10_LEN;
+      memcpy(pCoreInitCmd->cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+      status = phNxpNciHal_writeLocked(pCoreInitCmd);
+    }
+    if(!status){
+      if(phNxpNciHal_readLocked(pCoreInitCmd)  != NFCSTATUS_SUCCESS){
+        NXPLOG_NCIHAL_D("Response not received for CORE INIT command");
+        status = NFCSTATUS_FAILED;
+      }else{
+        if(mSelfTestHdlr.nci_version != NCI_VERSION_2_0){
+          phNxpNciHal_configFeatureList(mSelfTestHdlr.mTransInfo.pBuff,mSelfTestHdlr.mTransInfo.wLength);
+        }
+      }
+    }else
+        status = NFCSTATUS_FAILED;
+    if(!status && (nfcFL.chipType == pn557) && (mSelfTestHdlr.nci_version != NCI_VERSION_2_0)){
+      NXPLOG_NCIHAL_E("Chip is in NCI1.0 mode reset the chip to 2.0 mode");
+      if(!phNxpNciHal_writeLocked(pCoreResetCmd)){
+        if(phNxpNciHal_readLocked(pCoreResetCmd) != NFCSTATUS_SUCCESS){
+          NXPLOG_NCIHAL_D("Response not received for CORE RESET command");
+          status = NFCSTATUS_FAILED;
+        }
+        if(mSelfTestHdlr.wait_for_ntf){
+          if(phNxpNciHal_readLocked(pCoreResetCmd) != NFCSTATUS_SUCCESS){
+            NXPLOG_NCIHAL_D("NCI 2.0 Notification is not received");
+            status = NFCSTATUS_FAILED;
+          }
+        }
+      }else
+        status = NFCSTATUS_FAILED;
+      pCoreInitCmd->cmd.len = NFCC_CMD_NCI20_LEN;
+      memcpy(pCoreInitCmd->cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+      pCoreInitCmd->exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+      memcpy(pCoreInitCmd->exp_rsp.p_data, nfcc_core_reset_nci20_rsp,pCoreInitCmd->exp_rsp.len);
+      if(!phNxpNciHal_writeLocked(pCoreInitCmd)){
+        if(phNxpNciHal_readLocked(pCoreInitCmd) != NFCSTATUS_SUCCESS){
+          NXPLOG_NCIHAL_D("Response not received for CORE RESET command");
+          status = NFCSTATUS_FAILED;
+        }
+      }
+      else
+        status = NFCSTATUS_FAILED;
+    }
+    NXPLOG_NCIHAL_D("phNxpNciHal_initialize_chipType() : exit chipType = 0x%02X",nfcFL.chipType);
+    return status;
+}
+/*******************************************************************************
+ **
  ** Function         phNxpNciHal_TestMode_close
  **
  ** Description      This function close the NFCC interface and free all
@@ -1404,6 +1263,8 @@
     status = phOsalNfc_Timer_Delete(timeoutTimerId);
   }
 
+  free(mSelfTestHdlr.mTransInfo.pBuff);
+  mSelfTestHdlr.mTransInfo.pBuff = NULL;
   CONCURRENCY_UNLOCK();
 
   phNxpNciHal_cleanup_monitor();
@@ -1431,8 +1292,22 @@
   NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - start\n");
 
   if (swp_line == 0x01) {
+    swp1_test_data[0].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+    swp1_test_data[1].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+    if(nfcFL.chipType == pn557){
+      swp1_test_data[0].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+      memcpy(swp1_test_data[0].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,swp1_test_data[0].exp_rsp.len);
+      swp1_test_data[0].exp_ntf.len = (sizeof(nfcc_core_reset_nci20_ntf) / sizeof(nfcc_core_reset_nci20_ntf[0]));
+      memcpy(swp1_test_data[0].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, swp1_test_data[0].exp_ntf.len);
+      swp1_test_data[1].cmd.len = NFCC_CMD_NCI20_LEN;
+      memcpy(swp1_test_data[1].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+      swp1_test_data[1].exp_rsp.len = sizeof(nfcc_core_init_nci20_rsp);
+      memcpy(swp1_test_data[1].exp_rsp.p_data, nfcc_core_init_nci20_rsp, swp1_test_data[1].exp_rsp.len);
+    }else{
+      swp1_test_data[1].cmd.len = NFCC_CMD_NCI10_LEN;
+      memcpy(swp1_test_data[1].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+    }
     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) {
@@ -1440,6 +1315,21 @@
       }
     }
   } else if (swp_line == 0x02) {
+     swp2_test_data[0].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+     swp2_test_data[1].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+     if(nfcFL.chipType == pn557){
+       swp2_test_data[0].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+       memcpy(swp2_test_data[0].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,swp2_test_data[0].exp_rsp.len);
+       swp2_test_data[0].exp_ntf.len = (sizeof(nfcc_core_reset_nci20_ntf) / sizeof(nfcc_core_reset_nci20_ntf[0]));
+       memcpy(swp2_test_data[0].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, swp2_test_data[0].exp_ntf.len);
+       swp2_test_data[1].cmd.len = NFCC_CMD_NCI20_LEN;
+       memcpy(swp2_test_data[1].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+       swp2_test_data[1].exp_rsp.len = sizeof(nfcc_core_init_nci20_rsp);
+       memcpy(swp2_test_data[1].exp_rsp.p_data, nfcc_core_init_nci20_rsp, swp2_test_data[1].exp_rsp.len);
+     }else{
+       swp2_test_data[1].cmd.len = NFCC_CMD_NCI10_LEN;
+       memcpy(swp2_test_data[1].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+     }
     len = (sizeof(swp2_test_data) / sizeof(swp2_test_data[0]));
 
     for (cnt = 0; cnt < len; cnt++) {
@@ -1488,10 +1378,10 @@
   uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
 
   if(nfcFL.chipType != pn547C2) {
-      prbs_cmd_data.cmd.len = 0x09;
+    prbs_cmd_data.cmd.len = 0x09;
   }
   else {
-      prbs_cmd_data.cmd.len = 0x07;
+    prbs_cmd_data.cmd.len = 0x07;
   }
 
   memcpy(prbs_cmd_data.exp_rsp.p_data, &rsp_cmd_info[0], sizeof(rsp_cmd_info));
@@ -1508,12 +1398,12 @@
 //    [NCI] -> [0x2F 0x30 0x04 0x00 0x00 0x01 0xFF]
 
   if(nfcFL.chipType != pn547C2) {
-      status =
+    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(0,0,tech, bitrate, prbs_cmd_data.cmd.p_data,
+    status = phNxpNciHal_getPrbsCmd(0,0,tech, bitrate, prbs_cmd_data.cmd.p_data,
               prbs_cmd_data.cmd.len);
   }
 
@@ -1523,8 +1413,37 @@
 
     goto clean_and_return;
   }
-
-  len = (sizeof(prbs_test_data) / sizeof(prbs_test_data[0]));
+  prbs_test_data[len].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+  if(nfcFL.chipType == pn557){
+    prbs_test_data[len].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+    memcpy(prbs_test_data[len].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,prbs_test_data[len].exp_rsp.len);
+    prbs_test_data[len].exp_ntf.len = (sizeof(nfcc_core_reset_nci20_ntf) / sizeof(nfcc_core_reset_nci20_ntf[len]));
+    memcpy(prbs_test_data[len].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, prbs_test_data[len].exp_ntf.len);
+  }
+  len++;//val 1
+  prbs_test_data[len].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+  if(nfcFL.chipType == pn557){
+    prbs_test_data[len].cmd.len = NFCC_CMD_NCI20_LEN;
+    memcpy(prbs_test_data[len].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+    prbs_test_data[len].exp_rsp.len = sizeof(nfcc_core_init_nci20_rsp);
+    memcpy(prbs_test_data[len].exp_rsp.p_data, nfcc_core_init_nci20_rsp, prbs_test_data[len].exp_rsp.len);
+  }else{
+    prbs_test_data[len].cmd.len = NFCC_CMD_NCI10_LEN;
+    memcpy(prbs_test_data[len].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+  }
+  len++;//val 2
+  if(nfcFL.chipType == pn547C2)
+  {
+    prbs_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd);
+    memcpy(prbs_test_data[len].cmd.p_data, nfcc_power_mgt_cmd, prbs_test_data[len].cmd.len);
+    prbs_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+    memcpy(prbs_test_data[2].exp_rsp.p_data, nfcc_power_mgt_rsp, prbs_test_data[len].cmd.len);
+    prbs_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+    prbs_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+    prbs_test_data[len].rsp_validator = st_validator_testEquals;
+    prbs_test_data[len].ntf_validator = st_validator_null;
+    len++;//val 3
+  }
 
   for (cnt = 0; cnt < len; cnt++) {
     status = phNxpNciHal_performTest(&(prbs_test_data[cnt]));
@@ -1609,28 +1528,27 @@
   prbs_cmd[0] = 0x2F;
   prbs_cmd[1] = 0x30;
   if(nfcFL.chipType != 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;
+    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;
+    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;
   }
-
   switch (tech) {
     case NFC_RF_TECHNOLOGY_A:
       NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_A");
@@ -1695,11 +1613,85 @@
   NFCSTATUS status = NFCSTATUS_SUCCESS;
   int len = 0;
   int cnt = 0;
-
+  uint8_t nfcc_act_cmd[] = SYSTEM_PROPRIETARY_ACT_CMD;
+  uint8_t nfcc_act_exp_rsp[] = SYSTEM_PROPRIETARY_ACT_RSP;
+  uint8_t nfcc_antena_cmd1[] = SYSTEM_TEST_ANTENNA_CMD_1;
+  uint8_t nfcc_antena_cmd2[] = SYSTEM_TEST_ANTENNA_CMD_2;
+  uint8_t nfcc_antena_rsp1[] = SYSTEM_TEST_ANTENNA_RSP_1;
+  uint8_t nfcc_power_mgt_cmd_1[] = SYSTEM_SET_POWERMGT_CMD_1;
+  uint8_t nfcc_antena_cmd3[] = SYSTEM_TEST_ANTENNA_CMD_3;
+  uint8_t nfcc_antena_cmd4[] = SYSTEM_TEST_ANTENNA_CMD_4;
   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]));
+    rf_field_on_test_data[len].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+    if(nfcFL.chipType == pn557)   {
+      rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+      memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,rf_field_on_test_data[len].exp_rsp.len);
+      rf_field_on_test_data[len].exp_ntf.len = sizeof(nfcc_core_reset_nci20_ntf);
+      memcpy(rf_field_on_test_data[len].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, rf_field_on_test_data[len].exp_ntf.len);
+    }
+    len++;// len val 1
+    rf_field_on_test_data[len].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+    if(nfcFL.chipType == pn557){
+      rf_field_on_test_data[len].cmd.len = NFCC_CMD_NCI20_LEN;
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+      rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_core_init_nci20_rsp);
+      memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_core_init_nci20_rsp, rf_field_on_test_data[len].exp_rsp.len);
+    }else{
+      rf_field_on_test_data[len].cmd.len = NFCC_CMD_NCI10_LEN;
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+    }
+    len++; //len val 2
+    if(nfcFL.chipType != pn547C2)
+    {
+      rf_field_on_test_data[len].cmd.len = sizeof(nfcc_act_cmd);
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_act_cmd, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_act_exp_rsp);
+      memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_act_exp_rsp, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_on_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_on_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_on_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 3
+
+      rf_field_on_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd);
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_power_mgt_cmd, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+      memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_on_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_on_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_on_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 4
+    }
+    if(nfcFL.chipType != pn547C2){
+      rf_field_on_test_data[len].cmd.len = sizeof(nfcc_antena_cmd2);
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_antena_cmd2, rf_field_on_test_data[len].cmd.len);
+    }
+    else{
+      rf_field_on_test_data[len].cmd.len = sizeof(nfcc_antena_cmd1);
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_antena_cmd1, rf_field_on_test_data[len].cmd.len);
+    }
+    rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp1);
+    memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_antena_rsp1, rf_field_on_test_data[len].cmd.len);
+    rf_field_on_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+    rf_field_on_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+    rf_field_on_test_data[len].rsp_validator = st_validator_testEquals;
+    rf_field_on_test_data[len].ntf_validator = st_validator_null;
+    len++; //len val 5
+    if(nfcFL.chipType != pn547C2)
+    {
+      rf_field_on_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd_1);
+      memcpy(rf_field_on_test_data[len].cmd.p_data, nfcc_power_mgt_cmd_1, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+      memcpy(rf_field_on_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, rf_field_on_test_data[len].cmd.len);
+      rf_field_on_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_on_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_on_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_on_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 6
+    }
 
     for (cnt = 0; cnt < len; cnt++) {
       status = phNxpNciHal_performTest(&(rf_field_on_test_data[cnt]));
@@ -1708,7 +1700,72 @@
       }
     }
   } else if (on == 0x00) {
-    len = (sizeof(rf_field_off_test_data) / sizeof(rf_field_off_test_data[0]));
+    rf_field_off_test_data[len].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+    if(nfcFL.chipType == pn557)   {
+      rf_field_off_test_data[len].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+      memcpy(rf_field_off_test_data[len].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,rf_field_off_test_data[len].exp_rsp.len);
+      rf_field_off_test_data[len].exp_ntf.len = sizeof(nfcc_core_reset_nci20_ntf);
+      memcpy(rf_field_off_test_data[len].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, rf_field_off_test_data[len].exp_ntf.len);
+    }
+    len++;//len val 1
+    rf_field_off_test_data[len].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+    if(nfcFL.chipType == pn557){
+      rf_field_off_test_data[len].cmd.len = NFCC_CMD_NCI20_LEN;
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+    }else{
+      rf_field_off_test_data[len].cmd.len = NFCC_CMD_NCI10_LEN;
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+    }
+    len++;//len val 2
+    if(nfcFL.chipType != pn547C2)
+    {
+      rf_field_off_test_data[len].cmd.len = sizeof(nfcc_act_cmd);
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_act_cmd, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_rsp.len = sizeof(nfcc_act_exp_rsp);
+      memcpy(rf_field_off_test_data[len].exp_rsp.p_data, nfcc_act_exp_rsp, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_off_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_off_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_off_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 3
+
+      rf_field_off_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd);
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_power_mgt_cmd, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+      memcpy(rf_field_off_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_off_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_off_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_off_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 4
+    }
+    if(nfcFL.chipType != pn547C2){
+      rf_field_off_test_data[len].cmd.len = sizeof(nfcc_antena_cmd3);
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_antena_cmd3, rf_field_off_test_data[len].cmd.len);
+    }
+    else{
+      rf_field_off_test_data[len].cmd.len = sizeof(nfcc_antena_cmd4);
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_antena_cmd4, rf_field_off_test_data[len].cmd.len);
+    }
+    rf_field_off_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp1);
+    memcpy(rf_field_off_test_data[len].exp_rsp.p_data, nfcc_antena_rsp1, rf_field_off_test_data[len].cmd.len);
+    rf_field_off_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+    rf_field_off_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+    rf_field_off_test_data[len].rsp_validator = st_validator_testEquals;
+    rf_field_off_test_data[len].ntf_validator = st_validator_null;
+    len++; //len val 5
+    if(nfcFL.chipType != pn547C2)
+    {
+      rf_field_off_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd);
+      memcpy(rf_field_off_test_data[len].cmd.p_data, nfcc_power_mgt_cmd, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+      memcpy(rf_field_off_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, rf_field_off_test_data[len].cmd.len);
+      rf_field_off_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+      rf_field_off_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+      rf_field_off_test_data[len].rsp_validator = st_validator_testEquals;
+      rf_field_off_test_data[len].ntf_validator = st_validator_null;
+      len++; //len val 6
+    }
 
     for (cnt = 0; cnt < len; cnt++) {
       status = phNxpNciHal_performTest(&(rf_field_off_test_data[cnt]));
@@ -1762,6 +1819,13 @@
 
   NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - start\n");
 
+  download_pin_test_data1[0].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+  if(nfcFL.chipType == pn557)   {
+    download_pin_test_data1[0].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+    memcpy(download_pin_test_data1[0].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,download_pin_test_data1[0].exp_rsp.len);
+    download_pin_test_data1[0].exp_ntf.len = sizeof(nfcc_core_reset_nci20_ntf);
+    memcpy(download_pin_test_data1[0].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, download_pin_test_data1[0].exp_ntf.len);
+  }
   len = (sizeof(download_pin_test_data1) / sizeof(download_pin_test_data1[0]));
 
   for (cnt = 0; cnt < len; cnt++) {
@@ -1818,10 +1882,101 @@
   NFCSTATUS antenna_st_status = NFCSTATUS_FAILED;
   int len = 0;
   int cnt = 0;
+  uint8_t nfcc_antena_cmd5[] = SYSTEM_TEST_ANTENNA_CMD_5;
+  uint8_t nfcc_antena_rsp2[] = SYSTEM_TEST_ANTENNA_RSP_2;
+  uint8_t nfcc_antena_cmd6[] = SYSTEM_TEST_ANTENNA_CMD_6; /* AGC with NFCLD measurement cmd */
+  uint8_t nfcc_antena_cmd7[] = SYSTEM_TEST_ANTENNA_CMD_7;
+  uint8_t nfcc_antena_cmd8[] = SYSTEM_TEST_ANTENNA_CMD_8;
+  uint8_t nfcc_antena_cmd9[] = SYSTEM_TEST_ANTENNA_CMD_9;
+  uint8_t nfcc_power_mgt_cmd_1[] = SYSTEM_SET_POWERMGT_CMD_1;
 
   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]));
+  antenna_self_test_data[len].exp_rsp.p_data[4] = nfcFL.platformFL._NFCC_RESET_RSP_LEN;
+  if(nfcFL.chipType == pn557){
+    antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_core_reset_nci20_rsp);
+    memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_core_reset_nci20_rsp,antenna_self_test_data[len].exp_rsp.len);
+    antenna_self_test_data[len].exp_ntf.len = sizeof(nfcc_core_reset_nci20_ntf);
+    memcpy(antenna_self_test_data[len].exp_ntf.p_data, nfcc_core_reset_nci20_ntf, antenna_self_test_data[len].exp_ntf.len);
+  }
+  len++;//len val 1
+  antenna_self_test_data[len].exp_rsp.p_data[2] = NFCC_EXP_RES_DATA_BYTE2;
+  if(nfcFL.chipType == pn557){
+    antenna_self_test_data[len].cmd.len = NFCC_CMD_NCI20_LEN;
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_core_init_nci20_cmd, NFCC_CMD_NCI20_LEN);
+  }else{
+    antenna_self_test_data[len].cmd.len = NFCC_CMD_NCI10_LEN;
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_core_init_nci10_cmd, NFCC_CMD_NCI10_LEN);
+  }
+  len+=2;//len val 3, By default, structure will be filled till array 3
+
+  if(nfcFL.chipType != pn547C2)
+  {
+    antenna_self_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd);
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_power_mgt_cmd, antenna_self_test_data[len].cmd.len);
+    antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+    memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, antenna_self_test_data[len].cmd.len);
+    antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+    antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+    antenna_self_test_data[len].rsp_validator = st_validator_testEquals;
+    antenna_self_test_data[len].ntf_validator = st_validator_null;
+    len++; //len val 4
+  }
+  antenna_self_test_data[len].cmd.len = sizeof(nfcc_antena_cmd5);
+  memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_antena_cmd5, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp2);
+  memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_antena_rsp2, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+  antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+  antenna_self_test_data[len].rsp_validator = st_validator_testAntenna_Txldo;
+  antenna_self_test_data[len].ntf_validator = st_validator_null;
+  len++; //len val 5
+  if(nfcFL.chipType != pn547C2){
+    antenna_self_test_data[len].cmd.len = sizeof(nfcc_antena_cmd7);
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_antena_cmd7, antenna_self_test_data[len].cmd.len);
+  }
+  else{
+    antenna_self_test_data[len].cmd.len = sizeof(nfcc_antena_cmd8);
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_antena_cmd8, antenna_self_test_data[len].cmd.len);
+  }
+  antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp2);
+  memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_antena_rsp2, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+  antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+  antenna_self_test_data[len].rsp_validator = st_validator_testAntenna_AgcVal;
+  antenna_self_test_data[len].ntf_validator = st_validator_null;
+  len++;//len val 6
+  antenna_self_test_data[len].cmd.len = sizeof(nfcc_antena_cmd9);
+  memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_antena_cmd9, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp2);
+  memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_antena_rsp2, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+  antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+  antenna_self_test_data[len].rsp_validator = st_validator_testAntenna_AgcVal_FixedNfcLd;
+  antenna_self_test_data[len].ntf_validator = st_validator_null;
+  len++;//len val 7
+
+  if(nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST){
+    antenna_self_test_data[len].cmd.len = sizeof(nfcc_antena_cmd6);
+    memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_antena_cmd6, antenna_self_test_data[len].cmd.len);
+    antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_antena_rsp2);
+    memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_antena_rsp2, antenna_self_test_data[len].cmd.len);
+    antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+    antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+    antenna_self_test_data[len].rsp_validator = st_validator_testAntenna_AgcVal_FixedNfcLd;
+    antenna_self_test_data[len].ntf_validator = st_validator_null;
+    len++;//len val 8
+  }
+
+  antenna_self_test_data[len].cmd.len = sizeof(nfcc_power_mgt_cmd_1);
+  memcpy(antenna_self_test_data[len].cmd.p_data, nfcc_power_mgt_cmd_1, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_rsp.len = sizeof(nfcc_power_mgt_rsp);
+  memcpy(antenna_self_test_data[len].exp_rsp.p_data, nfcc_power_mgt_rsp, antenna_self_test_data[len].cmd.len);
+  antenna_self_test_data[len].exp_ntf.len = NFCC_EXP_NTF_LEN_NULL;
+  antenna_self_test_data[len].exp_ntf.p_data[0] = NFCC_EXP_NTF_DATA_NULL;
+  antenna_self_test_data[len].rsp_validator = st_validator_testEquals;
+  antenna_self_test_data[len].ntf_validator = st_validator_null;
+  len++;//len val 9
 
   for (cnt = 0; cnt < len; cnt++) {
     status = phNxpNciHal_performTest(&(antenna_self_test_data[cnt]));
diff --git a/halimpl/pn54x/tml/phTmlNfc_i2c.c b/halimpl/pn54x/tml/phTmlNfc_i2c.c
index 55d0c0e..1a6abdf 100644
--- a/halimpl/pn54x/tml/phTmlNfc_i2c.c
+++ b/halimpl/pn54x/tml/phTmlNfc_i2c.c
@@ -578,3 +578,38 @@
 ** Returns           Current mode download/NCI
 *******************************************************************************/
 bool_t getDownloadFlag(void) { return bFwDnldFlag; }
+
+/*******************************************************************************
+**
+** Function         phTmlNfc_rel_dwpOnOff_wait
+**
+** Description
+**
+** Parameters       pDevHandle     - valid device handle
+**
+** Returns          success or failure
+**
+*******************************************************************************/
+NFCSTATUS phTmlNfc_rel_dwpOnOff_wait(void *pDevHandle)
+{
+    int ret = -1;
+    NFCSTATUS status = NFCSTATUS_SUCCESS;
+    NXPLOG_TML_D("phTmlNfc_rel_dwpOnOff_wait(), enter ");
+
+    if (NULL == pDevHandle)
+    {
+        return NFCSTATUS_FAILED;
+    }
+
+    ret = ioctl((intptr_t)pDevHandle, P544_REL_DWPONOFF_WAIT);
+    if (ret < 0)
+    {
+        if (ret == -EBUSY)
+            status = NFCSTATUS_BUSY;
+        else
+            status = NFCSTATUS_FAILED;
+    }
+    NXPLOG_TML_D("phTmlNfc_rel_dwpOnOff_wait(), exit  ret %d, status %d", ret, status);
+    return status;
+
+}
diff --git a/halimpl/pn54x/tml/phTmlNfc_i2c.h b/halimpl/pn54x/tml/phTmlNfc_i2c.h
index 23441f5..8903bc6 100644
--- a/halimpl/pn54x/tml/phTmlNfc_i2c.h
+++ b/halimpl/pn54x/tml/phTmlNfc_i2c.h
@@ -50,6 +50,7 @@
 NFCSTATUS phTmlNfc_get_ese_access(void* pDevHandle, long timeout);
 NFCSTATUS phTmlNfc_i2c_set_Jcop_dwnld_state(void* pDevHandle, long level);
 NFCSTATUS phTmlNfc_rel_svdd_wait(void* pDevHandle);
+NFCSTATUS phTmlNfc_rel_dwpOnOff_wait(void* pDevHandle);
 /*
  * SPI Request NFCC to enable p61 power, only in param
  * Only for SPI
@@ -93,3 +94,7 @@
  *
 */
 #define PN544_SET_DWNLD_STATUS _IOW(PN544_MAGIC, 0x09, long)
+/*
+ * NFC will call the ioctlto release the dwp on/off protection
+ */
+ #define P544_REL_DWPONOFF_WAIT  _IOW(PN544_MAGIC, 0x0A, long)
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cpp
index 273684d..25d94b7 100644
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cpp
@@ -200,9 +200,6 @@
   if (GetStrValue(NAME_NFA_DM_CFG, (char*)nfa_dm_cfg, sizeof(nfa_dm_cfg)))
     p_nfa_dm_cfg = (tNFA_DM_CFG*)((void*)&nfa_dm_cfg[0]);
 
-  nfa_ee_max_ee_cfg = NFA_EE_MAX_EE_SUPPORTED;
-  ALOGD("%s: 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,
diff --git a/src/gki/common/gki_buffer.c b/src/gki/common/gki_buffer.c
index 09f49e0..a99c352 100644
--- a/src/gki/common/gki_buffer.c
+++ b/src/gki/common/gki_buffer.c
@@ -651,9 +651,15 @@
 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 ((uint32_t)p_hdr & 1){
+#if (GKI_BUFFER_DEBUG ==  true)
+    LOGD("GKI_get_buf_size() Found odd address p_hdr = 0x%x !!!!!",p_hdr);
+#endif
+    return (0);
+  }
 
   if (p_hdr->q_id < GKI_NUM_TOTAL_BUF_POOLS) {
     return (gki_cb.com.freeq[p_hdr->q_id].size);
@@ -677,7 +683,12 @@
   uint32_t* magic;
   magic = (uint32_t*)((uint8_t*)p_buf + GKI_get_buf_size(p_buf));
 
-  if ((uint32_t)magic & 1) return (true);
+  if ((uint32_t)magic & 1){
+#if (GKI_BUFFER_DEBUG == true)
+    LOGD("gki_chk_buf_damage() buffer corrupted !!!!! magic = 0x%x !!!!!",magic);
+#endif
+    return (true);
+  }
 
   if (*magic == MAGIC_NO) return (false);
 
diff --git a/src/gki/common/gki_time.c b/src/gki/common/gki_time.c
index f941354..85d68c2 100644
--- a/src/gki/common/gki_time.c
+++ b/src/gki/common/gki_time.c
@@ -186,6 +186,11 @@
   int32_t reload;
   int32_t orig_ticks;
   uint8_t task_id = GKI_get_taskid();
+
+  /*if task_id doesnt found in the array, use default task id 14*/
+  if(task_id == 255) {
+    task_id = 14;
+  }
   bool bad_timer = false;
 
   if (ticks <= 0) ticks = 1;
@@ -285,6 +290,10 @@
 void GKI_stop_timer(uint8_t tnum) {
   uint8_t task_id = GKI_get_taskid();
 
+    /*if task_id doesnt found in the array, use default task id 14*/
+  if(task_id == 255) {
+    task_id = 14;
+  }
   GKI_disable();
 
   switch (tnum) {
diff --git a/src/include/gki_target.h b/src/include/gki_target.h
index 1740ebd..23017fe 100644
--- a/src/include/gki_target.h
+++ b/src/include/gki_target.h
@@ -118,7 +118,7 @@
 
 /* The number of GKI tasks in the software system. */
 #ifndef GKI_MAX_TASKS
-#define GKI_MAX_TASKS 14
+#define GKI_MAX_TASKS 15
 #endif
 
 /******************************************************************************
diff --git a/src/nfa/ce/nfa_ce_act.c b/src/nfa/ce/nfa_ce_act.c
index 8b9c563..7735e33 100644
--- a/src/nfa/ce/nfa_ce_act.c
+++ b/src/nfa/ce/nfa_ce_act.c
@@ -1211,7 +1211,8 @@
                ) &&
           (i == p_cb->idx_cur_active)) {
         conn_evt.deactivated.type = deact_type;
-        (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
+      if (p_cb->p_active_conn_cback)
+          (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
       } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) &&
                  (p_cb->listen_info[i].protocol_mask &
                   NFA_PROTOCOL_MASK_ISO_DEP)) {
@@ -1220,12 +1221,14 @@
               NFA_CE_LISTEN_INFO_T4T_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);
+            if (p_cb->p_active_conn_cback)
+                (*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);
+            if (p_cb->p_active_conn_cback)
+                (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
           }
         }
       } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) &&
@@ -1237,12 +1240,14 @@
 #endif
           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);
+            if (p_cb->p_active_conn_cback)
+                (*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);
+            if (p_cb->p_active_conn_cback)
+                (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
           }
 #if (NXP_EXTNS == TRUE)
         }
diff --git a/src/nfa/dm/nfa_dm_act.c b/src/nfa/dm/nfa_dm_act.c
index f49cd30..34ff680 100644
--- a/src/nfa/dm/nfa_dm_act.c
+++ b/src/nfa/dm/nfa_dm_act.c
@@ -422,9 +422,6 @@
     case NFC_NFCEE_MODE_SET_REVT: /* NFCEE Mode Set response */
 #if (NXP_EXTNS == TRUE)
     case NFC_NFCEE_PWR_LNK_CTRL_REVT:
-        if(!nfcFL.eseFL._WIRED_MODE_STANDBY) {
-            break;
-        }
     case NFC_NFCEE_MODE_SET_INFO:
 #endif
     case NFC_NFCEE_STATUS_REVT:
diff --git a/src/nfa/dm/nfa_dm_api.c b/src/nfa/dm/nfa_dm_api.c
index e7ab5e9..5fd8993 100644
--- a/src/nfa/dm/nfa_dm_api.c
+++ b/src/nfa/dm/nfa_dm_api.c
@@ -102,7 +102,6 @@
 #else
   NFC_Init(p_hal_entry_tbl);
 #endif
-  nfa_ee_max_ee_cfg == nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED;
 }
 
 /*******************************************************************************
@@ -1042,14 +1041,20 @@
   NFA_TRACE_API1("NFA_SendRawFrame () data_len:%d", data_len);
 
 /* Validate parameters */
-  if ((nfcFL.nfccFL._NXP_NFCC_EMPTY_DATA_PACKET &&
-          (((data_len == 0) || (p_raw_data == NULL)) &&
-                  (!(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE &&
-                          nfa_dm_cb.disc_cb.activated_protocol ==
-                                  NFA_PROTOCOL_T3T)))) ||
-          ((data_len == 0) || (p_raw_data == NULL))) {
+  if (nfcFL.nfccFL._NXP_NFCC_EMPTY_DATA_PACKET) {
+      if(((data_len == 0) || (p_raw_data == NULL)) &&
+              (!(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE &&
+                      nfa_dm_cb.disc_cb.activated_protocol ==
+                              NFA_PROTOCOL_T3T))){
+          return (NFA_STATUS_INVALID_PARAM);
+      } else {
+          //Do Nothing.
+      }
+  }else if((data_len == 0) || (p_raw_data == NULL)) {
       return (NFA_STATUS_INVALID_PARAM);
   }
+
+
   size = NFC_HDR_SIZE + NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + data_len;
   p_msg = (NFC_HDR*)GKI_getbuf(size);
   if (p_msg != NULL) {
diff --git a/src/nfa/dm/nfa_dm_cfg.c b/src/nfa/dm/nfa_dm_cfg.c
index 2101855..a6ae8db 100644
--- a/src/nfa/dm/nfa_dm_cfg.c
+++ b/src/nfa/dm/nfa_dm_cfg.c
@@ -59,7 +59,6 @@
     (tNFA_DM_DISC_FREQ_CFG*)&nfa_dm_rf_disc_freq_cfg;
 
 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 */
@@ -113,7 +112,7 @@
 #else
     0x83, /* NCI_PROTOCOL_15693 */
 #endif
-#if (NXP_EXTNS == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+#if (NXP_EXTNS == TRUE)
     0x81,
 #else
     0x8A, /* NCI_PROTOCOL_KOVIO */
@@ -123,7 +122,7 @@
 #else
     0xFF, /* NCI_PROTOCOL_MIFARE */
 #endif
-#if (NXP_EXTNS == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+#if (NXP_EXTNS == TRUE)
     0x70,
 #else
     0x77, /* NCI_DISCOVERY_TYPE_POLL_KOVIO */
diff --git a/src/nfa/dm/nfa_dm_discover.c b/src/nfa/dm/nfa_dm_discover.c
index 13593eb..b2d4030 100644
--- a/src/nfa/dm/nfa_dm_discover.c
+++ b/src/nfa/dm/nfa_dm_discover.c
@@ -101,7 +101,7 @@
 
 static void nfa_dm_send_tag_deselect_cmd(tNFA_NFC_PROTOCOL protocol);
 #define TAG_DESELECT_CMD 0xC2
-uint8_t T2T_SLP_REQ[] ={0x05,0x00};
+uint8_t T2T_SLP_REQ[] ={0x50,0x00};
 
 int getListenTechValue(int listenTechMask);
 #define P2P_RESUME_POLL_TIMEOUT 16 /*mili second timeout value*/
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.c
index 2b46d69..6ebe4f6 100644
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.c
@@ -804,6 +804,102 @@
 
 /*******************************************************************************
 **
+** Function         nfa_ee_get_num_nfcee_configured
+**
+** Description      Get the number of NFCEE configured
+**
+** Returns          void
+**
+*******************************************************************************/
+tNFA_STATUS nfa_ee_get_num_nfcee_configured(tNFA_VSC_CBACK* p_cback)
+{
+  tNFA_STATUS status = NFA_STATUS_OK;
+  uint8_t p_data[255];
+  uint8_t* p = p_data, *parm_len, *num_param;
+  memset(p_data, 0, sizeof(p_data));
+  NCI_MSG_BLD_HDR0(p, NCI_MT_CMD, NCI_GID_CORE);
+  NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_GET_CONFIG);
+  parm_len = p++;
+  num_param = p++;
+  UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
+  UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP1);
+  (*num_param)++;
+  UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
+  UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP2);
+  (*num_param)++;
+
+  if(nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC) {
+    UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
+    UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP1A);
+    (*num_param)++;
+  }
+
+  *parm_len = (p - num_param);
+  if (*num_param != 0x00) {
+    status = NFA_SendNxpNciCommand(p - p_data, p_data, p_cback);
+  } else {
+      status = NFA_STATUS_FAILED;
+  }
+  NFA_TRACE_DEBUG1("nfa_ee_get_num_nfcee_configured %x", *num_param);
+
+  return status;
+}
+
+/*******************************************************************************
+**
+** Function         nfa_hci_read_num_nfcee_config_cb
+**
+** Description      Callback function to handle the response of num of NFCEE
+*                   configured.
+**
+** Returns          None
+**
+*********************************************************************************/
+ void nfa_ee_read_num_nfcee_config_cb(uint8_t event, uint16_t param_len,
+                                             uint8_t* p_param) {
+    uint8_t num_param_id = 0x00, xx;
+    uint8_t configured_num_nfcee = 0x00;
+    uint8_t NFA_PARAM_ID_INDEX = 0x04;
+    uint8_t param_id1 = 0x00;
+    uint8_t param_id2 = 0x00;
+    uint8_t status = 0x00;
+
+    if (param_len == 0x00 || p_param == NULL ||
+        p_param[NFA_PARAM_ID_INDEX - 1] != NFA_STATUS_OK) {
+      return;
+    }
+    if(NFA_GetNCIVersion() != NCI_VERSION_2_0) { //HCI_NETWORK_ACCESS
+        configured_num_nfcee = 1;
+    }
+    p_param += NFA_PARAM_ID_INDEX;
+    STREAM_TO_UINT8(num_param_id, p_param);
+
+    while (num_param_id > 0x00) {
+      STREAM_TO_UINT8(param_id1, p_param);
+      STREAM_TO_UINT8(param_id2, p_param);
+      p_param++;
+      STREAM_TO_UINT8(status, p_param);
+      if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
+          param_id2 == NXP_NFC_PARAM_ID_SWP1 && status != 0x00)
+        configured_num_nfcee++;
+      else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
+               param_id2 == NXP_NFC_PARAM_ID_SWP2 && status != 0x00)
+        configured_num_nfcee++;
+      else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
+               param_id2 == NXP_NFC_PARAM_ID_SWP1A && status != 0x00)
+        configured_num_nfcee++;
+      else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
+               param_id2 == NXP_NFC_PARAM_ID_NDEF_NFCEE && status != 0x00)
+        configured_num_nfcee++;
+      num_param_id--;
+    }
+    if(configured_num_nfcee)
+        nfa_ee_max_ee_cfg = configured_num_nfcee;
+    NFA_TRACE_DEBUG1("nfa_ee_read_num_nfcee_config_cb %x", configured_num_nfcee);
+}
+
+/******************************************************************************
+**
 ** Function         nfa_ee_api_discover
 **
 ** Description      process discover command from user
@@ -827,6 +923,7 @@
         return;
     }
   }
+  nfa_ee_get_num_nfcee_configured(nfa_ee_read_num_nfcee_config_cb);
   if (nfa_ee_cb.p_ee_disc_cback == NULL &&
       NFC_NfceeDiscover(true) == NFC_STATUS_OK) {
     nfa_ee_cb.p_ee_disc_cback = p_cback;
@@ -1800,7 +1897,8 @@
   if (p_cb->conn_st == NFA_EE_CONN_ST_NONE) {
     for (xx = 0; xx < p_cb->num_interface; xx++) {
       if (p_data->connect.ee_interface == p_cb->ee_interface[xx]) {
-        p_cb->p_ee_cback = p_data->connect.p_cback;
+          nfa_ee_get_num_nfcee_configured(nfa_ee_read_num_nfcee_config_cb);
+          p_cb->p_ee_cback = p_data->connect.p_cback;
         p_cb->conn_st = NFA_EE_CONN_ST_WAIT;
         p_cb->use_interface = p_data->connect.ee_interface;
         evt_data.connect.status =
@@ -2059,7 +2157,6 @@
             p_cb->nfcee_id = NFA_EE_INVALID;
           }
         }
-        nfa_ee_cb.cur_ee = num_nfcee;
       }
       break;
 
@@ -2249,9 +2346,11 @@
     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_TRACE_DEBUG0("ee_disc_timeout");
       nfa_ee_evt_hdlr((NFC_HDR*)p_data);
     }
   }
+  NFA_TRACE_DEBUG0("after nfa_ee_nci_disc_ntf");
 #if (NXP_EXTNS == TRUE)
   if (p_cb) {
     if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) &&
@@ -2264,6 +2363,7 @@
     }
   }
 #endif
+  NFA_TRACE_DEBUG0("nfa_ee_nci_disc_ntf last");
 }
 
 /*******************************************************************************
@@ -2277,11 +2377,12 @@
 *******************************************************************************/
 void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data) {
   tNFC_NFCEE_STATUS_REVT* p_ee = p_data->nfcee_status_ntf.p_data;
+
   NFA_TRACE_DEBUG3(
       "nfa_ee_nci_nfcee_status_ntf() em_state:%d, nfcee_id:%d nfcee_status:%d",
-      nfa_ee_cb.em_state, p_ee->nfcee_id, p_ee->status);
+      nfa_ee_cb.em_state, p_ee->nfcee_id, p_ee->nfcee_status);
   tNFA_EE_ECB* p_cb = nfa_ee_find_ecb(p_ee->nfcee_id);
-  if(p_ee->status == NFC_NFCEE_STS_UNRECOVERABLE_ERROR) {
+  if(p_ee->nfcee_status == NFC_NFCEE_STS_UNRECOVERABLE_ERROR) {
     if(p_cb != NULL) {
         if (nfa_ee_cb.p_enable_cback)
                     (*nfa_ee_cb.p_enable_cback) (NFA_EE_RECOVERY);
diff --git a/src/nfa/ee/nfa_ee_main.c b/src/nfa/ee/nfa_ee_main.c
index da58a54..adcd6b2 100644
--- a/src/nfa/ee/nfa_ee_main.c
+++ b/src/nfa/ee/nfa_ee_main.c
@@ -163,7 +163,7 @@
                        nfa_ee_cb.route_block_control);
     }
   }
-
+  nfa_ee_get_num_nfcee_configured(nfa_ee_read_num_nfcee_config_cb);
   if (nfa_ee_max_ee_cfg) {
     /* collect NFCEE information */
     NFC_NfceeDiscover(true);
diff --git a/src/nfa/hci/nfa_hci_act.c b/src/nfa/hci/nfa_hci_act.c
index 6718a1d..8dc672a 100644
--- a/src/nfa/hci/nfa_hci_act.c
+++ b/src/nfa/hci/nfa_hci_act.c
@@ -2524,131 +2524,35 @@
 **
 ** Function         nfa_hci_get_num_nfcee_configured
 **
-** Description      Read the number of NFCEE configured by the user.
+** Description      Read number of NFCEE config.
 **
-** Returns          if success NFA_STATUS_OK or NFA_STATUS_FAILED
-**
-*********************************************************************************/
-static tNFA_STATUS nfa_hci_get_num_nfcee_configured() {
-  tNFA_STATUS status = NFA_STATUS_OK;
-  uint8_t p_data[NFA_MAX_HCI_CMD_LEN];
-  uint8_t* p = p_data, *parm_len, *num_param;
-
-  memset(p_data, 0, sizeof(p_data));
-  NCI_MSG_BLD_HDR0(p, NCI_MT_CMD, NCI_GID_CORE);
-  NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_GET_CONFIG);
-  parm_len = p++;
-  num_param = p++;
-  UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
-  UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP1);
-  (*num_param)++;
-  UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
-  UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP2);
-  (*num_param)++;
-
-  if ((nfcFL.chipType == pn551) || (nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) {
-      UINT8_TO_STREAM(p, NXP_NFC_SET_CONFIG_PARAM_EXT);
-      UINT8_TO_STREAM(p, NXP_NFC_PARAM_ID_SWP1A);
-      (*num_param)++;
-  }
-
-  *parm_len = (p - num_param);
-  if (*num_param != 0x00) {
-    status = nfa_hciu_send_raw_cmd(p - p_data, p_data,
-                                   nfa_hci_read_num_nfcee_config_cb);
-  }
-  NFA_TRACE_DEBUG1("nfa_hci_get_num_nfcee_configured %x", *num_param);
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function         nfa_hci_read_num_nfcee_config_cb
-**
-** Description      Callback function to handle the response of num of NFCEE
-*configured cmd.
 **
 ** Returns          None
 **
 *********************************************************************************/
-static void nfa_hci_read_num_nfcee_config_cb(uint8_t event, uint16_t param_len,
-                                             uint8_t* p_param) {
+static tNFA_STATUS nfa_hci_get_num_nfcee_configured() {
   uint8_t num_param_id = 0x00, xx;
-  uint8_t configured_num_nfcee = 0x00;
-  uint8_t NFA_PARAM_ID_INDEX = 0x04;
-  uint8_t param_id1 = 0x00;
-  uint8_t param_id2 = 0x00;
-  uint8_t status = 0x00;
-
+  tNFA_STATUS status = NFA_STATUS_OK;
   nfa_sys_stop_timer(&nfa_hci_cb.timer);
   nfa_hci_cb.num_nfcee = NFA_HCI_MAX_HOST_IN_NETWORK;
   NFA_AllEeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.hci_ee_info);
-
   for (xx = 0; xx < nfa_hci_cb.num_nfcee; xx++) {
-    if(nfa_hci_cb.hci_ee_info[xx].ee_interface[0] ==
-            NCI_NFCEE_INTERFACE_HCI_ACCESS)
-    {
-      /*If NFCEE_HCI_NETWORK ID exists*/
-      configured_num_nfcee = 1;
-      break;
+    if ((((nfa_hci_cb.hci_ee_info[xx].ee_interface[0] !=
+        NCI_NFCEE_INTERFACE_HCI_ACCESS) &&
+        nfa_hci_cb.hci_ee_info[xx].ee_status == NFA_EE_STATUS_ACTIVE)) &&
+        (nfa_hci_cb.hci_ee_info[xx].ee_handle != 0x410)) {
+      nfa_hci_cb.nfcee_cfg.host_cb[num_param_id++] =
+          nfa_hci_cb.hci_ee_info[xx].ee_handle;
     }
   }
-
-  if (param_len == 0x00 || p_param == NULL ||
-      p_param[NFA_PARAM_ID_INDEX - 1] != NFA_STATUS_OK) {
-    for (xx = 0; xx < nfa_hci_cb.num_nfcee; xx++) {
-      if ((((nfa_hci_cb.hci_ee_info[xx].ee_interface[0] !=
-           NCI_NFCEE_INTERFACE_HCI_ACCESS) &&
-	          nfa_hci_cb.hci_ee_info[xx].ee_status == NFA_EE_STATUS_ACTIVE))  &&
-          (nfa_hci_cb.hci_ee_info[xx].ee_handle != 0x410)) {
-        nfa_hci_cb.nfcee_cfg.host_cb[num_param_id++] =
-            nfa_hci_cb.hci_ee_info[xx].ee_handle;
-      }
-    }
-    nfa_hci_handle_nfcee_config_evt(NFA_HCI_READ_SESSIONID);
-    return;
-  }
-  p_param += NFA_PARAM_ID_INDEX;
-  STREAM_TO_UINT8(num_param_id, p_param);
-
-  while (num_param_id > 0x00) {
-    STREAM_TO_UINT8(param_id1, p_param);
-    STREAM_TO_UINT8(param_id2, p_param);
-    p_param++;
-    STREAM_TO_UINT8(status, p_param);
-    if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
-        param_id2 == NXP_NFC_PARAM_ID_SWP1 && status != 0x00)
-      configured_num_nfcee++;
-    else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
-             param_id2 == NXP_NFC_PARAM_ID_SWP2 && status != 0x00)
-      configured_num_nfcee++;
-    else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
-             param_id2 == NXP_NFC_PARAM_ID_SWP1A && status != 0x00)
-      configured_num_nfcee++;
-    else if (param_id1 == NXP_NFC_SET_CONFIG_PARAM_EXT &&
-             param_id2 == NXP_NFC_PARAM_ID_NDEF_NFCEE && status != 0x00)
-      configured_num_nfcee++;
-    num_param_id--;
-  }
-  NFA_TRACE_DEBUG1("nfa_hci_read_num_nfcee_config_cb %x", configured_num_nfcee);
-  NFA_TRACE_DEBUG1("nfa_hci_read_num_nfcee_config_cb %x", nfa_hci_cb.num_nfcee);
-  if (configured_num_nfcee > nfa_hci_cb.num_nfcee)
+  NFA_TRACE_DEBUG1("nfa_hci_read_num_nfcee_config_cb  nfa_ee_max_ee_cfg%x", nfa_ee_max_ee_cfg);
+  NFA_TRACE_DEBUG1("nfa_hci_read_num_nfcee_config_cb nfa_hci_cb.num_nfcee%x", nfa_hci_cb.num_nfcee);
+  if (nfa_ee_max_ee_cfg > nfa_hci_cb.num_nfcee) {
     nfa_sys_start_timer(&nfa_hci_cb.timer, NFA_HCI_NFCEE_DISCOVER_TIMEOUT_EVT,
                         nfa_hci_cb.max_nfcee_disc_timeout);
-  else {
-    num_param_id = 0x00;
-    for (xx = 0; xx < nfa_hci_cb.num_nfcee; xx++) {
-      if ((((nfa_hci_cb.hci_ee_info[xx].ee_interface[0] !=
-          NCI_NFCEE_INTERFACE_HCI_ACCESS) &&
-          nfa_hci_cb.hci_ee_info[xx].ee_status == NFA_EE_STATUS_ACTIVE)) &&
-          (nfa_hci_cb.hci_ee_info[xx].ee_handle != 0x410)) {
-        nfa_hci_cb.nfcee_cfg.host_cb[num_param_id++] =
-            nfa_hci_cb.hci_ee_info[xx].ee_handle;
-      }
-    }
-    nfa_hci_handle_nfcee_config_evt(NFA_HCI_READ_SESSIONID);
+    status = NFA_STATUS_BUSY;
   }
+  return status;
 }
 
 /*******************************************************************************
@@ -2776,7 +2680,7 @@
 ** Function         nfa_hci_handle_nfcee_config_evt
 **
 ** Description      In case of NFCEE CONFIG EVT , the following sequence of
-*commands are sent.
+** commands are sent.
 **                  This function also handles the CLEAR_ALL_PIPE_NTF from
 *respective host.
 **                      a.Get the number of secelement configured and
@@ -2805,16 +2709,12 @@
         nfa_hci_cb.hci_state = NFA_HCI_STATE_NFCEE_ENABLE;
         nfa_hci_cb.nfcee_cfg.config_nfcee_state =
             NFA_HCI_GET_NUM_NFCEE_CONFIGURED;
-        if (nfa_hci_get_num_nfcee_configured() != NFA_STATUS_OK) {
+        if (nfa_hci_get_num_nfcee_configured() != NFA_STATUS_BUSY) {
           tNFA_HCI_API_CONFIGURE_EVT* p_msg;
           /* Send read session event to continue with other initialization*/
-          if ((p_msg = (tNFA_HCI_API_CONFIGURE_EVT*)GKI_getbuf(
-                   sizeof(tNFA_HCI_API_CONFIGURE_EVT))) != NULL) {
-            p_msg->hdr.event = NFA_HCI_API_CONFIGURE_EVT;
-            p_msg->config_nfcee_event = NFA_HCI_READ_SESSIONID;
-            nfa_sys_sendmsg(p_msg);
-          } else
-            event = NFA_HCI_NFCEE_CONFIG_COMPLETE;
+          /*Read the session ID of the host discovered */
+          nfa_hci_cb.nfcee_cfg.config_nfcee_state = NFA_HCI_READ_SESSIONID;
+          nfa_hci_poll_all_nfcee_session_id();
         }
       } else {
         event = NFA_HCI_NFCEE_CONFIG_COMPLETE;
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.c
index dfffe80..08def65 100644
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.c
@@ -243,18 +243,28 @@
           NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
           nfa_hci_enable_one_nfcee();
         }
-        else if(nfa_hci_cb.hci_state == NFA_HCI_STATE_NFCEE_ENABLE)
+        else if((nfa_hci_cb.hci_state == NFA_HCI_STATE_NFCEE_ENABLE) &&
+          (nfa_hci_cb.nfcee_cfg.config_nfcee_state == NFA_HCI_INIT_NFCEE_CONFIG))
         {
             nfa_hci_api_config_nfcee(nfa_hci_cb.current_nfcee);
         }
       break;
     case NFA_EE_RECOVERY:
         /*NFCEE recovery in progress*/
-        if (!((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
+        if(nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) {
+            NFA_TRACE_DEBUG1("nfa_hci_ee_info_cback (): %d nfa_hci_cb.hci_state already in EE Recovery", nfa_hci_cb.hci_state);
+        }
+        else if (!((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
             (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE))) {
           if (NFA_DM_RFST_DISCOVERY == nfa_dm_cb.disc_cb.disc_state)
             nfa_hci_cb.nfcee_cfg.discovery_stopped = nfa_dm_act_stop_rf_discovery(NULL);
+          tNFA_HCI_EVT_DATA evt_data;
+          evt_data.ee_recovery.status = NFA_HCI_EE_RECOVERY_STARTED;
+          nfa_hciu_send_to_all_apps(NFA_HCI_EE_RECOVERY_EVT, &evt_data);
+          nfa_hci_release_transcieve();
           if(NFC_NfceeDiscover(true) == NFC_STATUS_FAILED){
+              evt_data.ee_recovery.status = NFA_HCI_EE_RECOVERY_COMPLETED;
+              nfa_hciu_send_to_all_apps(NFA_HCI_EE_RECOVERY_EVT, &evt_data);
             if(nfa_hci_cb.nfcee_cfg.discovery_stopped == true) {
               nfa_dm_act_start_rf_discovery(NULL);
               nfa_hci_cb.nfcee_cfg.discovery_stopped = false;
@@ -773,10 +783,12 @@
           nfa_hci_cb.nfcee_cfg.discovery_stopped = false;
           nfa_dm_act_start_rf_discovery(NULL);
         }
+        tNFA_HCI_EVT_DATA evt_data;
+        evt_data.ee_recovery.status = NFA_HCI_EE_RECOVERY_COMPLETED;
+        nfa_hciu_send_to_all_apps(NFA_HCI_EE_RECOVERY_EVT, &evt_data);
     }
   }
 }
-
 /*******************************************************************************
 **
 ** Function         nfa_hci_startup
@@ -794,8 +806,6 @@
   uint8_t count = 0;
   bool found = false;
 
-  nfa_ee_max_ee_cfg = nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED;
-
   if (HCI_LOOPBACK_DEBUG) {
       /* First step in initialization is to open the admin pipe */
       nfa_hciu_send_open_pipe_cmd(NFA_HCI_ADMIN_PIPE);
@@ -911,6 +921,8 @@
 *******************************************************************************/
 static void nfa_hci_sys_disable(void) {
   tNFA_HCI_EVT_DATA evt_data;
+  tNFC_CONN_EVT event;
+  tNFC_CONN cData;
 
   nfa_sys_stop_timer(&nfa_hci_cb.timer);
 
@@ -921,6 +933,16 @@
         nfa_hciu_send_to_all_apps(NFA_HCI_EXIT_EVT, &evt_data);
         NFC_ConnClose(nfa_hci_cb.conn_id);
       }
+      else
+      {
+        /* HCI module deregister should be triggered to sto the nfa_sys_main timer,
+        so faking a connection close event */
+        NFA_TRACE_ERROR0("Fake NFC_CONN_CLOSE_CEVT triggered");
+        cData.data.status = NFA_STATUS_OK;
+        cData.data.p_data = NULL;
+        event = NFC_CONN_CLOSE_CEVT;
+        nfa_hci_conn_cback(nfa_hci_cb.conn_id, event, &cData);
+      }
       return;
     }
     nfa_hci_cb.conn_id = 0;
diff --git a/src/nfa/include/nfa_api.h b/src/nfa/include/nfa_api.h
index e2f23f2..6c4b272 100644
--- a/src/nfa/include/nfa_api.h
+++ b/src/nfa/include/nfa_api.h
@@ -294,7 +294,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[74]; /* TLV (Parameter ID-Len-Value byte stream) */
 } tNFA_GET_CONFIG;
 
 #if (NXP_EXTNS == TRUE)
diff --git a/src/nfa/include/nfa_hci_api.h b/src/nfa/include/nfa_hci_api.h
index c7ec22b..f909b5b 100644
--- a/src/nfa/include/nfa_hci_api.h
+++ b/src/nfa/include/nfa_hci_api.h
@@ -110,6 +110,7 @@
 #define NFA_HCI_HOST_TYPE_LIST_READ_EVT 0x17
 #define NFA_HCI_CONFIG_DONE_EVT \
   0x18 /* Configure NFCEE                              */
+#define NFA_HCI_EE_RECOVERY_EVT 0x19
 #endif
 typedef uint8_t tNFA_HCI_EVT;
 
@@ -138,6 +139,10 @@
 #define NFA_HCI_PIPE_CLOSED 0x00 /* Pipe is closed */
 #define NFA_HCI_PIPE_OPENED 0x01 /* Pipe is opened */
 
+ /* HCI Recovery status*/
+ #define NFA_HCI_EE_RECOVERY_STARTED 0x01
+ #define NFA_HCI_EE_RECOVERY_COMPLETED 0x02
+
 typedef uint8_t tNFA_HCI_PIPE_STATE;
 /* Dynamic pipe control block */
 typedef struct {
@@ -312,6 +317,11 @@
   tNFA_STATUS status; /* Status for ETSI12 config for NFCEE*/
 } tNFA_HCI_CONFIG_RSP_RCVD;
 #endif
+typedef struct {
+  tNFA_STATUS status;     /* Status of command on Admin pipe */
+  uint8_t host;
+} tNFA_HCI_EE_RECOVERY_EVT;
+/* Data for tNFA_HCI_CONFIG_RSP_RCVD */
 /* Union of all hci callback structures */
 typedef union {
   tNFA_HCI_REGISTER hci_register;          /* NFA_HCI_REGISTER_EVT           */
@@ -342,6 +352,7 @@
 #if (NXP_EXTNS == TRUE)
   tNFA_HCI_ADMIN_RSP_RCVD admin_rsp_rcvd;   /* NFA_HCI_ADMIN_RSP_RCVD         */
   tNFA_HCI_CONFIG_RSP_RCVD config_rsp_rcvd; /* NFA_HCI_CONFIG_RSP_RCVD       */
+  tNFA_HCI_EE_RECOVERY_EVT ee_recovery;
 #endif
 } tNFA_HCI_EVT_DATA;
 
diff --git a/src/nfa/int/nfa_ee_int.h b/src/nfa/int/nfa_ee_int.h
index 547dd7a..967a75f 100644
--- a/src/nfa/int/nfa_ee_int.h
+++ b/src/nfa/int/nfa_ee_int.h
@@ -719,6 +719,9 @@
 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);
+tNFA_STATUS nfa_ee_get_num_nfcee_configured(tNFA_VSC_CBACK* p_cback);
+ void nfa_ee_read_num_nfcee_config_cb(uint8_t event, uint16_t param_len,
+         uint8_t* p_param);
 #if (NXP_EXTNS == TRUE)
 extern void nfa_hci_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                                tNFC_CONN* p_data);
diff --git a/src/nfa/rw/nfa_rw_act.c b/src/nfa/rw/nfa_rw_act.c
index 2f34910..afad221 100644
--- a/src/nfa/rw/nfa_rw_act.c
+++ b/src/nfa/rw/nfa_rw_act.c
@@ -2618,10 +2618,12 @@
            NFA_T1T_HR_LEN);
     memcpy(tag_params.t1t.uid, p_activate_params->rf_tech_param.param.pa.nfcid1,
            p_activate_params->rf_tech_param.param.pa.nfcid1_len);
+    if(NFC_GetNCIVersion() == NCI_VERSION_1_0) {
     msg.op = NFA_RW_OP_T1T_RID;
     nfa_rw_handle_op_req((void*)&msg);
     activate_notify = false; /* Delay notifying upper layer of NFA_ACTIVATED_EVT
                                 until HR0/HR1 is received */
+   }
   } else if (NFC_PROTOCOL_T2T == nfa_rw_cb.protocol) {
     /* Retrieve UID fields from activation notification */
     memcpy(tag_params.t2t.uid, p_activate_params->rf_tech_param.param.pa.nfcid1,
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 40935a8..92eeeaa 100644
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -106,19 +106,19 @@
 // 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_EN_PN548C2 1
+#define NXP_EN_PN66T 1
+#define NXP_EN_PN551 1
+#define NXP_EN_PN67T 1
+#define NXP_EN_PN553 0
+#define NXP_EN_PN80T 0
 #define NXP_EN_PN553_MR1 0
 #define NXP_EN_PN81A     0
 #define NXP_EN_PN553_MR2 0
 #define NXP_EN_PN557     0
 #define NXP_EN_PN81T     0
 #define NXP_ANDROID_VER (8U)        /* NXP android version */
-#define NFC_NXP_MW_VERSION_MAJ (0x01) /* MW Major Version */
+#define NFC_NXP_MW_VERSION_MAJ (0x03) /* MW Major Version */
 #define NFC_NXP_MW_VERSION_MIN (0x00) /* MW Minor Version */
 #endif
 /* 0xE0 ~0xFF are proprietary status codes */
@@ -982,10 +982,6 @@
 #define NFC_RF_PARAM_SOS_REQUIRED 0x00     /* SoS required */
 #define NFC_RF_PARAM_SOS_NOT_REQUIRED 0x01 /* SoS not required */
 
-#if (NXP_EXTNS == TRUE)
-#define NFA_EE_MAX_EE_SUPPORTED_DEFAULT 0x04
-#endif
-
 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 */
@@ -1536,17 +1532,6 @@
 *******************************************************************************/
 extern uint8_t NFC_SetTraceLevel(uint8_t new_level);
 
-/*******************************************************************************
-**
-** Function         NFC_GetChipType
-**
-** Description      Gets the chipType
-**
-** Returns          ChipType
-**
-*******************************************************************************/
-tNFC_chipType NFC_GetChipType();
-
 #if (BT_TRACE_VERBOSE == true)
 /*******************************************************************************
 **
@@ -1763,6 +1748,18 @@
 
 /*******************************************************************************
 **
+** Function         NFC_RelForceDwpOnOffWait
+**
+** Description      This function release wait for DWP On/Off
+**                  of P73. Status would be updated to pdata
+**
+** Returns          0 if api call success, else -1
+**
+*******************************************************************************/
+int32_t NFC_RelForceDwpOnOffWait (void *pdata);
+
+/*******************************************************************************
+**
 ** Function         NFC_Queue_Is_empty
 **
 ** Description      This function to get NFCEE connection ID queue information
@@ -1841,4 +1838,5 @@
 **
 *******************************************************************************/
 extern tNFC_STATUS NFC_ISODEPNakPresCheck ();
+
 #endif /* NFC_API_H */
diff --git a/src/nfc/nfc/nfc_main.c b/src/nfc/nfc/nfc_main.c
index 0d05a13..3acdaab 100644
--- a/src/nfc/nfc/nfc_main.c
+++ b/src/nfc/nfc/nfc_main.c
@@ -49,9 +49,9 @@
 #include "ce_int.h"
 #include "llcp_int.h"
 
-#if(NXP_EXTNS == TRUE)
-static phNxpNci_getCfg_info_t* mGetCfg_info_main = NULL;
-extern void nfa_dm_init_cfgs (phNxpNci_getCfg_info_t* mGetCfg_info_main);
+#if (NXP_EXTNS == TRUE)
+extern void nfa_dm_init_cfgs(phNxpNci_getCfg_info_t* mGetCfg_info_main);
+extern nfa_ee_max_ee_cfg;
 #endif
 
 /* NFC mandates support for at least one logical connection;
@@ -682,6 +682,8 @@
         } else {
           nfc_main_post_hal_evt(event, status);
         }
+        nfa_ee_max_ee_cfg = nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED;
+        NFC_TRACE_DEBUG1("NFA_EE_MAX_EE_SUPPORTED to use %d", nfa_ee_max_ee_cfg);
       }
       break;
 
@@ -818,6 +820,11 @@
 void NFC_Disable(void) {
   NFC_TRACE_API1("NFC_Disable (): nfc_state = %d", nfc_cb.nfc_state);
 
+#if (NXP_EXTNS == TRUE)
+  if(nfcFL.eseFL._ESE_DUAL_MODE_PRIO_SCHEME == nfcFL.eseFL._ESE_WIRED_MODE_RESUME)
+    nfc_stop_timer(&nfc_cb.rf_filed_event_timeout_timer);
+#endif
+
   if ((nfc_cb.nfc_state == NFC_STATE_NONE) ||
       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
     nfc_set_state(NFC_STATE_NONE);
@@ -835,19 +842,6 @@
     nfc_cb.p_hal->ioctl(HAL_NFC_IOCTL_SET_BOOT_MODE, (void*)&inpOutData);
   }
 #endif
-
-  if(nfcFL.nfcNxpEse) {
-      tNFC_STATUS setPidStatus = NFC_STATUS_OK;
-      nfc_nci_IoctlInOutData_t inpOutData;
-      inpOutData.inp.data.nfcServicePid = 0;
-      setPidStatus = nfc_cb.p_hal->ioctl(HAL_NFC_IOCTL_SET_NFC_SERVICE_PID,(void*)&inpOutData);
-      if (setPidStatus == NFC_STATUS_OK) {
-          NFC_TRACE_API0("nfc service set pid done");
-      } else {
-          NFC_TRACE_API0("nfc service set pid failed");
-      }
-  }
-
   /* Close transport and clean up */
   nfc_task_shutdown_nfcc();
 
@@ -1803,7 +1797,20 @@
   *(tNFC_STATUS*)pdata = inpOutData.out.data.status;
   return status;
 }
-
+/*******************************************************************************
+**
+** Function         NFC_RelForceDwpOnOffWait
+**
+** Description      This function release wait for DWP On/Off
+**                  of P73. Status would be updated to pdata
+**
+** Returns          0 if api call success, else -1
+**
+*******************************************************************************/
+int32_t NFC_RelForceDwpOnOffWait (void *pdata)
+{
+    return (nfc_cb.p_hal->ioctl(HAL_NFC_IOCTL_REL_DWP_WAIT, pdata));
+}
 #endif
 
 #if (NXP_EXTNS == TRUE)
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 0ef276b..1e183df 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -766,7 +766,6 @@
   if ((nfc_cb.nxpCbflag == true) &&
       (nfc_ncif_proc_proprietary_rsp(mt, gid, oid) == true)) {
     nci_proc_prop_nxp_rsp(p_msg);
-    nfc_cb.nxpCbflag = false;
     return (free);
   }
 #endif
@@ -2336,7 +2335,7 @@
             ((NFC_STATE_CORE_INIT == nfc_cb.nfc_state) &&
                     (MW_RCVRY_FW_DNLD_ALLOWED == false))) ||
             ((!nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD) &&
-                    (nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD)))
+                    (NFC_STATE_CORE_INIT == nfc_cb.nfc_state)))
     {
       nfc_cb.p_hal->ioctl(HAL_NFC_IOCTL_CHECK_FLASH_REQ, &inpOutData);
       fw_update_inf = *(tNFC_FWUpdate_Info_t*)&inpOutData.out.data.fwUpdateInf;
@@ -2659,21 +2658,16 @@
               }
           }
         }
-        if((NFC_GetNCIVersion() == NCI_VERSION_2_0)&&(p_cb->act_protocol == NCI_PROTOCOL_15693))
+#if (NXP_EXTNS == TRUE)
+        if(p_cb->act_protocol == NCI_PROTOCOL_15693)
         {
           p_evt->len--;
           p = (uint8_t*)(p_evt + 1);
           data_cevt.status = *(p + p_evt->offset + p_evt->len);
         }
-      }
-#if(NXP_EXTNS == TRUE)
-        if(p_cb->act_protocol == NCI_PROTOCOL_15693)
-        {
-            p_evt->len--;
-            p = (uint8_t *) (p_evt + 1);
-            data_cevt.status = *(p + p_evt->offset + p_evt->len);
-        }
 #endif
+      }
+
       (*p_cb->p_cback)(p_cb->conn_id, NFC_DATA_CEVT, (void*)&data_cevt);
       p_evt = NULL;
     }
diff --git a/src/nfc/nfc/nfc_task.c b/src/nfc/nfc/nfc_task.c
index e445bc8..012c20d 100644
--- a/src/nfc/nfc/nfc_task.c
+++ b/src/nfc/nfc/nfc_task.c
@@ -129,7 +129,13 @@
   while ((nfc_cb.timer_queue.p_first) && (!nfc_cb.timer_queue.p_first->ticks)) {
     p_tle = nfc_cb.timer_queue.p_first;
     GKI_remove_from_timer_list(&nfc_cb.timer_queue, p_tle);
-
+#if(NXP_EXTNS == TRUE)
+    /*Ignore expired timer when NFC off is in progress*/
+    if(nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE ||
+       nfc_cb.nfc_state == NFC_STATE_NONE){
+        return;
+    }
+#endif
     switch (p_tle->event) {
       case NFC_TTYPE_NCI_WAIT_RSP:
         nfc_ncif_cmd_timeout();
@@ -360,12 +366,6 @@
 void nfc_task_shutdown_nfcc(void) {
   NFC_HDR* p_msg;
 
-#if (NXP_EXTNS == TRUE)
- if(nfcFL.eseFL._ESE_DUAL_MODE_PRIO_SCHEME == nfcFL.eseFL._ESE_WIRED_MODE_RESUME) {
-     nfc_stop_timer(&nfc_cb.rf_filed_event_timeout_timer);
- }
-#endif
-
   /* Free any messages still in the mbox */
   while ((p_msg = (NFC_HDR*)GKI_read_mbox(NFC_MBOX_ID)) != NULL) {
     GKI_freebuf(p_msg);