Merge "Remove dynamic configuration of active listen modes." into jb-mr2-dev
diff --git a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
index c29eb64..d834b57 100644
--- a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
+++ b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
@@ -303,8 +303,7 @@
     ALOGD ("%s: enter", __FUNCTION__);
     int retval = EACCES;
 
-    HAL_NfcPreDiscover ();
-    retval = 0;
+    retval = HAL_NfcPreDiscover () ? 1 : 0;
     ALOGD ("%s: exit %d", __FUNCTION__, retval);
     return retval;
 }
diff --git a/halimpl/bcm2079x/adaptation/patchram.cpp b/halimpl/bcm2079x/adaptation/patchram.cpp
index 343eab2..a9083d7 100644
--- a/halimpl/bcm2079x/adaptation/patchram.cpp
+++ b/halimpl/bcm2079x/adaptation/patchram.cpp
@@ -44,10 +44,13 @@
 static UINT8 sConfig [CONFIG_MAX_LEN];
 static StartupConfig sStartupConfig;
 static StartupConfig sLptdConfig;
+static StartupConfig sPreDiscoveryConfig;
 extern UINT8 *p_nfc_hal_dm_start_up_cfg; //defined in the HAL
 static UINT8 nfa_dm_start_up_vsc_cfg[CONFIG_MAX_LEN];
 extern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg; //defined in the HAL
 extern UINT8 *p_nfc_hal_dm_lptd_cfg; //defined in the HAL
+extern UINT8 *p_nfc_hal_pre_discover_cfg; //defined in the HAL
+
 extern tSNOOZE_MODE_CONFIG gSnoozeModeCfg;
 extern tNFC_HAL_CFG *p_nfc_hal_cfg;
 static void mayDisableSecureElement (StartupConfig& config);
@@ -309,6 +312,7 @@
     p_nfc_hal_cfg->nfc_hal_prm_nvm_required = TRUE; //don't download firmware if controller cannot detect EERPOM
     sStartupConfig.initialize ();
     sLptdConfig.initialize ();
+    sPreDiscoveryConfig.initialize();
 
 
     actualLen = GetStrValue (NAME_NFA_DM_START_UP_CFG, (char*)sConfig, sizeof(sConfig));
@@ -354,6 +358,13 @@
 
     mayDisableSecureElement (sStartupConfig);
     p_nfc_hal_dm_start_up_cfg = const_cast<UINT8*> (sStartupConfig.getInternalBuffer ());
+
+    actualLen = GetStrValue(NAME_NFA_DM_PRE_DISCOVERY_CFG, (char*)sConfig, sizeof(sConfig));
+    if (actualLen)
+    {
+        sPreDiscoveryConfig.append (sConfig, actualLen);
+        p_nfc_hal_pre_discover_cfg = const_cast<UINT8*> (sPreDiscoveryConfig.getInternalBuffer ());
+    }
 }
 
 /*******************************************************************************
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
index 742f542..2cd95b2 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
@@ -233,6 +233,24 @@
 {
     BOOLEAN status = FALSE;
 
+    NFC_HDR *p_msg;
+
+    HAL_TRACE_API0 ("HAL_NfcPreDiscover ()");
+    if (nfc_hal_cb.pre_discover_done == FALSE)
+    {
+        nfc_hal_cb.pre_discover_done    = TRUE;
+        if (p_nfc_hal_pre_discover_cfg && *p_nfc_hal_pre_discover_cfg)
+        {
+            status                          = TRUE;
+            /* Send message to NFC_HAL_TASK */
+            if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
+            {
+                p_msg->event  = NFC_HAL_EVT_PRE_DISCOVER;
+                GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
+            }
+        }
+    }
+
     HAL_TRACE_API1 ("HAL_NfcPreDiscover status:%d", status);
     return status;
 }
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c
index 2b4aba6..4b0f034 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c
@@ -998,6 +998,8 @@
 
     nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback;
 
+    nfc_hal_cb.pre_discover_done        = FALSE;
+
     nfc_post_reset_cb.spd_nvm_detection_cur_count = 0;
     nfc_post_reset_cb.spd_skip_on_power_cycle     = FALSE;
 
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c
index 68ee089..76208c4 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c
@@ -82,6 +82,23 @@
 
 UINT8 *p_nfc_hal_dm_start_up_vsc_cfg = NULL;
 
+/* the SetConfig at HAL_NfcPreDiscover. This is done once after HAL_NfcOpen */
+UINT8 nfc_hal_pre_discover_cfg[] = {
+    /* TLV len */   0x0A,
+    /* B0 */        NCI_PARAM_ID_SWPCFG,
+    /* B1 */        0x08,
+    /* B2 */        0x01,
+    /* B3 */        0x08,
+    /* B4 */        0x00,
+    /* B5 */        0x04,
+    /* B6 */        0x80,
+    /* B7 */        0xC3,
+    /* B8 */        0xC9,
+    /* B9 */        0x01
+};
+
+UINT8 *p_nfc_hal_pre_discover_cfg = NULL;
+
 /* LPTD parameters (LowPowerTagDetection)
  * This is typical values for 20791B2
  * The timing and threshold parameters used for a customer handset/hardware may vary
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c b/halimpl/bcm2079x/hal/hal/nfc_hal_main.c
index a3fb215..7a7284a 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_main.c
@@ -53,7 +53,6 @@
 static void nfc_hal_main_handle_terminate (void);
 static void nfc_hal_main_timeout_cback (void *p_tle);
 
-
 #if (NFC_HAL_DEBUG == TRUE)
 const char * const nfc_hal_init_state_str[] =
 {
@@ -132,6 +131,41 @@
 
 /*******************************************************************************
 **
+** Function         nfa_hal_pre_discover_done_cback
+**
+** Description      Pre-discovery CFG is sent.
+**
+** Returns          nothing
+**
+*******************************************************************************/
+void nfa_hal_pre_discover_done_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
+{
+    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
+    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
+    nfc_hal_cb.p_stack_cback (HAL_NFC_PRE_DISCOVER_CPLT_EVT, HAL_NFC_STATUS_OK);
+}
+
+/*******************************************************************************
+**
+** Function         nfa_hal_send_pre_discover_cfg
+**
+** Description      sending Pre-discovery CFG
+**
+** Returns          nothing
+**
+*******************************************************************************/
+void nfa_hal_send_pre_discover_cfg (void)
+{
+    if (nfc_hal_dm_set_config (p_nfc_hal_pre_discover_cfg [0],
+                               &p_nfc_hal_pre_discover_cfg[1],
+                                nfa_hal_pre_discover_done_cback) != HAL_NFC_STATUS_OK)
+    {
+        nfa_hal_pre_discover_done_cback(0, 0, NULL);
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         nfc_hal_main_send_error
 **
 ** Description      send an Error event to NFC stack
@@ -628,6 +662,10 @@
                     nfc_hal_hci_evt_hdlr ((tNFC_HAL_HCI_EVENT_DATA *) p_msg);
                     break;
 
+                case NFC_HAL_EVT_PRE_DISCOVER:
+                    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE);
+                    nfa_hal_send_pre_discover_cfg ();
+                    break;
 
                 case NFC_HAL_EVT_CONTROL_GRANTED:
                     nfc_hal_dm_send_pend_cmd ();
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cpp
index a589528..adcb41c 100755
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cpp
@@ -452,7 +452,7 @@
 
     if (mHalDeviceContext)
     {
-        mHalDeviceContext->pre_discover (mHalDeviceContext);
+        retval = mHalDeviceContext->pre_discover (mHalDeviceContext);
     }
     return retval;
 }
diff --git a/src/hal/int/nfc_hal_int.h b/src/hal/int/nfc_hal_int.h
index 96e9095..cf821f3 100644
--- a/src/hal/int/nfc_hal_int.h
+++ b/src/hal/int/nfc_hal_int.h
@@ -420,6 +420,7 @@
     /* data members for NFC_HAL-HCI */
     tNFC_HAL_HCI_CB         hci_cb;
 
+    UINT8                   pre_discover_done;  /* TRUE, when the prediscover config is complete */
 
     UINT8                   max_rf_credits;     /* NFC Max RF data credits */
     UINT8                   trace_level;        /* NFC HAL trace level */
@@ -432,7 +433,7 @@
 #define nfc_hal_cb (*nfc_hal_cb_ptr)
 extern tNFC_HAL_CB *nfc_hal_cb_ptr;
 #endif
-
+extern UINT8 *p_nfc_hal_pre_discover_cfg;
 /****************************************************************************
 ** Internal nfc functions
 ****************************************************************************/
@@ -468,6 +469,7 @@
 void nfc_hal_dm_shutting_down_nfcc (void);
 BOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event);
 void nfc_hal_dm_send_pend_cmd (void);
+tHAL_NFC_STATUS nfc_hal_dm_set_config (UINT8 tlv_size, UINT8 *p_param_tlvs, tNFC_HAL_NCI_CBACK *p_cback);
 
 /* nfc_hal_prm.c */
 void nfc_hal_prm_spd_reset_ntf (UINT8 reset_reason, UINT8 reset_type);
diff --git a/src/include/config.h b/src/include/config.h
index 0c27f60..7ecb4f8 100755
--- a/src/include/config.h
+++ b/src/include/config.h
@@ -78,6 +78,7 @@
 #define NAME_PRESERVE_STORAGE           "PRESERVE_STORAGE"
 #define NAME_NFA_MAX_EE_SUPPORTED       "NFA_MAX_EE_SUPPORTED"
 #define NAME_NFCC_ENABLE_TIMEOUT        "NFCC_ENABLE_TIMEOUT"
+#define NAME_NFA_DM_PRE_DISCOVERY_CFG   "NFA_DM_PRE_DISCOVERY_CFG"
 
 #define                     LPTD_PARAM_LEN (40)
 
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.c
index 78400ed..aa16911 100644
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.c
@@ -81,7 +81,6 @@
     NFC_PROTOCOL_NFC_DEP
 };
 
-static void nfa_ee_check_restore_complete(void);
 static void nfa_ee_report_discover_req_evt(void);
 static void nfa_ee_build_discover_req_evt (tNFA_EE_DISCOVER_REQ *p_evt_data);
 /*******************************************************************************
@@ -741,7 +740,7 @@
 ** Returns          TRUE, if all NFA_EE_STATUS_PENDING bits are removed
 **
 *******************************************************************************/
-static BOOLEAN nfa_ee_restore_ntf_done(void)
+BOOLEAN nfa_ee_restore_ntf_done(void)
 {
     tNFA_EE_ECB     *p_cb;
     BOOLEAN         is_done = TRUE;
@@ -1069,7 +1068,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void nfa_ee_check_restore_complete(void)
+void nfa_ee_check_restore_complete(void)
 {
     UINT32  xx;
     tNFA_EE_ECB     *p_cb;
diff --git a/src/nfa/ee/nfa_ee_main.c b/src/nfa/ee/nfa_ee_main.c
index 8af4290..6ec22e7 100644
--- a/src/nfa/ee/nfa_ee_main.c
+++ b/src/nfa/ee/nfa_ee_main.c
@@ -268,6 +268,7 @@
 {
     UINT32          xx;
     tNFA_EE_ECB     *p_cb;
+    tNFA_EE_MSG     data;
 
     NFA_TRACE_DEBUG0 ("nfa_ee_proc_hci_info_cback ()");
     /* if NFCC power state is change to full power */
@@ -285,6 +286,20 @@
             nfa_ee_restore_one_ecb (p_cb);
         }
     }
+
+    if (nfa_ee_restore_ntf_done())
+    {
+        nfa_ee_check_restore_complete();
+        if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT_DONE)
+        {
+            if (nfa_ee_cb.discv_timer.in_use)
+            {
+                nfa_sys_stop_timer (&nfa_ee_cb.discv_timer);
+                data.hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
+                nfa_ee_evt_hdlr((BT_HDR *)&data);
+            }
+        }
+    }
 }
 
 /*******************************************************************************
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.c
index 76d7f38..1423c15 100644
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.c
@@ -98,7 +98,6 @@
     case NFA_EE_DISC_STS_ON:
         /* NFCEE Discovery is in progress */
         nfa_hci_cb.ee_disc_cmplt      = TRUE;
-        nfa_hci_cb.ee_disable_disc    = FALSE;
         nfa_hci_cb.num_ee_dis_req_ntf = 0;
         nfa_hci_cb.num_hot_plug_evts  = 0;
         nfa_hci_cb.conn_id            = 0;
@@ -106,6 +105,8 @@
         break;
 
     case NFA_EE_DISC_STS_OFF:
+        if (nfa_hci_cb.ee_disable_disc)
+            break;
         nfa_hci_cb.ee_disable_disc  = TRUE;
         /* Discovery operation is complete, retrieve discovery result */
         NFA_EeGetInfo (&num_nfcee, ee_info);
@@ -481,6 +482,8 @@
     else if (  (nfa_hci_cb.num_nfcee > 1)
              &&(nfa_hci_cb.num_ee_dis_req_ntf != (nfa_hci_cb.num_nfcee - 1))  )
     {
+        if (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE)
+            nfa_hci_cb.ee_disable_disc  = TRUE;
         /* Received HOT PLUG EVT, we will also wait for EE DISC REQ Ntf(s) */
         nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, p_nfa_hci_cfg->hci_netwk_enable_timeout);
     }
diff --git a/src/nfa/int/nfa_ee_int.h b/src/nfa/int/nfa_ee_int.h
index 5093bce..89211c1 100644
--- a/src/nfa/int/nfa_ee_int.h
+++ b/src/nfa/int/nfa_ee_int.h
@@ -460,6 +460,8 @@
 
 extern void nfa_ee_proc_hci_info_cback (void);
 void nfa_ee_check_disable (void);
+BOOLEAN nfa_ee_restore_ntf_done(void);
+void nfa_ee_check_restore_complete(void);
 
 
 #endif /* NFA_P2P_INT_H */