Added proprietary configuration

Change-Id: I5f7c51e980e57e610d78f34f8b2f9647e5504f80
diff --git a/st21nfc/hal_st21nfc.cc b/st21nfc/hal_st21nfc.cc
index d08ac1b..3bd7bc6 100644
--- a/st21nfc/hal_st21nfc.cc
+++ b/st21nfc/hal_st21nfc.cc
@@ -43,7 +43,7 @@
   nfc_stack_callback_t* p_cback_unwrap;
 } st21nfc_dev_t;
 
-const char* halVersion = "ST21NFC HAL1.1 Version 3.1.11";
+const char* halVersion = "ST21NFC HAL1.1 Version 3.1.12";
 
 uint8_t cmd_set_nfc_mode_enable[] = {0x2f, 0x02, 0x02, 0x02, 0x01};
 uint8_t hal_is_closed = 1;
@@ -65,6 +65,8 @@
 
 extern int hal_wrapper_close(int call_cb, int nfc_mode);
 
+extern void hal_wrapper_send_prop_config();
+
 /* Make sure to always post nfc_stack_callback_t in a separate thread.
 This prevents a possible deadlock in upper layer on some sequences.
 We need to synchronize finely for the callback called for hal close,
@@ -335,8 +337,9 @@
 
   (void)pthread_mutex_lock(&hal_mtx);
   hal_dta_state = *p_core_init_rsp_params;
-  async_callback_post(HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_OK);
-  (void)pthread_mutex_unlock(&hal_mtx);
+
+  hal_wrapper_send_prop_config();
+  (void) pthread_mutex_unlock(&hal_mtx);
 
   return 0;  // return != 0 to signal ready immediate
 }
diff --git a/st21nfc/hal_wrapper.cc b/st21nfc/hal_wrapper.cc
index b526244..099d99b 100644
--- a/st21nfc/hal_wrapper.cc
+++ b/st21nfc/hal_wrapper.cc
@@ -43,6 +43,7 @@
   HAL_WRAPPER_STATE_OPEN,
   HAL_WRAPPER_STATE_OPEN_CPLT,
   HAL_WRAPPER_STATE_NFC_ENABLE_ON,
+  HAL_WRAPPER_STATE_PROP_CONFIG,
   HAL_WRAPPER_STATE_READY,
   HAL_WRAPPER_STATE_CLOSING
 } hal_wrapper_state_e;
@@ -103,6 +104,18 @@
   return 1;
 }
 
+void hal_wrapper_send_prop_config(){
+    uint8_t coreSetConfig[] = {0x20, 0x02, 0x07, 0x02, 0xa1, 0x01, 0x19, 0xa2, 0x01, 0x14};
+
+    //Send prop config and merge mode
+    STLOG_HAL_V("%s - Sending CORE_SET_CONFIG(LPS+Merge)", __func__);
+    if (!HalSendDownstream(mHalHandle, coreSetConfig, sizeof(coreSetConfig))) {
+      STLOG_HAL_E("NFC-NCI HAL: %s  SendDownstream failed", __func__);
+    }
+
+    mHalWrapperState = HAL_WRAPPER_STATE_PROP_CONFIG;
+}
+
 void halWrapperDataCallback(uint16_t data_len, uint8_t* p_data) {
   uint8_t propNfcModeSetCmdOn[] = {0x2f, 0x02, 0x02, 0x02, 0x01};
   uint8_t coreInitCmd[] = {0x20, 0x01, 0x02, 0x00, 0x00};
@@ -142,6 +155,7 @@
         mHalWrapperDataCallback(data_len, p_data);
       }
       break;
+
     case HAL_WRAPPER_STATE_NFC_ENABLE_ON:  // 3
       // PROP_NFC_MODE_SET_RSP
       if ((p_data[0] == 0x4f) && (p_data[1] == 0x02)) {
@@ -167,11 +181,39 @@
           p_data[13] = 0x01;
           mHciCreditLent = true;
         }
+
         mHalWrapperState = HAL_WRAPPER_STATE_READY;
         mHalWrapperDataCallback(data_len, p_data);
       }
       break;
-    case HAL_WRAPPER_STATE_READY:
+
+    case HAL_WRAPPER_STATE_PROP_CONFIG: //4
+      if ((p_data[0] == 0x40) && (p_data[1] == 0x02)) {
+        STLOG_HAL_V(
+                "%s - Received config RSP, deliver CORE_INIT_RSP to upper layer",
+                __func__);
+
+        mHalWrapperCallback(HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_OK);
+        mHalWrapperState = HAL_WRAPPER_STATE_READY;
+      } else if (mHciCreditLent && (p_data[0] == 0x60) && (p_data[1] == 0x06)) {
+        if (p_data[4] == 0x01) {  // HCI connection
+          mHciCreditLent = false;
+          STLOG_HAL_D("%s - credit returned", __func__);
+          if (p_data[5] == 0x01) {
+            // no need to send this.
+            break;
+          } else {
+            if (p_data[5] != 0x00 && p_data[5] != 0xFF) {
+              // send with 1 less
+              p_data[5]--;
+            }
+          }
+        }
+        mHalWrapperDataCallback(data_len, p_data);
+      }
+      break;
+
+    case HAL_WRAPPER_STATE_READY://5
       if (!((p_data[0] == 0x60) && (p_data[3] == 0xa0))) {
         if (mHciCreditLent && (p_data[0] == 0x60) && (p_data[1] == 0x06)) {
           if (p_data[4] == 0x01) {  // HCI connection
@@ -193,7 +235,8 @@
         STLOG_HAL_V("%s - Core reset notification - Nfc mode ", __func__);
       }
       break;
-    case HAL_WRAPPER_STATE_CLOSING:
+
+    case HAL_WRAPPER_STATE_CLOSING://6
       if ((p_data[0] == 0x4f) && (p_data[1] == 0x02)) {
         // intercept this expected message, don t forward.
         mHalWrapperState = HAL_WRAPPER_STATE_CLOSED;