From 235759bcea085563a3fa196503f62a7cfac7b370 Mon Sep 17 00:00:00 2001
From: Prerepa Viswanadham <dham@google.com>
Date: Thu, 7 Aug 2014 11:38:06 -0700
Subject: [PATCH] Use run time parameters to control LE features

Use values read from controller to enable and control LE features such as
multi advertising, RPA offload, maximum irk size etc

bug 15393216

Change-Id: I193e2b9a0dc61b86f667e986803571440e390160
---
 system/bta/dm/bta_dm_act.c                    | 261 +++++++++------
 system/bta/dm/bta_dm_api.c                    | 122 +++----
 system/bta/dm/bta_dm_int.h                    |  13 +-
 system/bta/dm/bta_dm_main.c                   |   2 +-
 system/bta/gatt/bta_gatts_act.c               |   2 +-
 system/bta/include/bta_api.h                  |  31 +-
 .../btif/include/btif_gatt_multi_adv_util.h   |   8 +-
 system/btif/src/btif_core.c                   |   4 +
 system/btif/src/btif_gatt_client.c            |  73 +++--
 system/btif/src/btif_gatt_multi_adv_util.c    | 174 +++++-----
 system/include/bt_target.h                    |  11 +-
 system/main/bte_init.c                        |   2 +-
 system/stack/btm/btm_acl.c                    |   2 -
 system/stack/btm/btm_ble.c                    |  21 +-
 system/stack/btm/btm_ble_addr.c               |  20 +-
 system/stack/btm/btm_ble_adv_filter.c         | 129 +++++---
 system/stack/btm/btm_ble_batchscan.c          |  91 ++----
 system/stack/btm/btm_ble_bgconn.c             |  14 +-
 system/stack/btm/btm_ble_gap.c                |  99 +++---
 system/stack/btm/btm_ble_int.h                |  12 +-
 system/stack/btm/btm_ble_multi_adv.c          | 301 +++++++++--------
 system/stack/btm/btm_devctl.c                 |   3 -
 system/stack/btu/btu_hcif.c                   |   2 +-
 system/stack/include/btm_ble_api.h            |  36 ++-
 system/stack/include/gap_api.h                |   3 -
 system/stack/l2cap/l2c_ble.c                  |  26 +-
 system/stack/smp/aes.c                        |   2 +-
 system/vnd/ble/bta_vendor.c                   | 305 ------------------
 system/vnd/ble/vendor_ble.c                   | 150 +++++++--
 system/vnd/include/bta_vendor_api.h           |  59 ----
 system/vnd/include/vendor_ble.h               |  21 +-
 31 files changed, 954 insertions(+), 1045 deletions(-)
 delete mode 100644 system/vnd/ble/bta_vendor.c
 delete mode 100644 system/vnd/include/bta_vendor_api.h

diff --git a/system/bta/dm/bta_dm_act.c b/system/bta/dm/bta_dm_act.c
index 26520581812..a1a49f3fcf6 100644
--- a/system/bta/dm/bta_dm_act.c
+++ b/system/bta/dm/bta_dm_act.c
@@ -3173,7 +3173,7 @@ static void bta_dm_local_name_cback(UINT8 *p_name)
     if(bta_dm_cb.p_sec_cback)
         bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
 
-#if ( BLE_INCLUDED == TRUE)
+#if BLE_VND_INCLUDED == TRUE
     BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
 #endif
 }
@@ -5126,7 +5126,7 @@ void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
 {
     if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
                                  p_data->ble_update_conn_params.min_int,
-                                 p_data-> ble_update_conn_params.max_int,
+                                 p_data->ble_update_conn_params.max_int,
                                  p_data->ble_update_conn_params.latency,
                                  p_data->ble_update_conn_params.timeout))
     {
@@ -5149,7 +5149,6 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
     BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
 }
 #endif
-
 /*******************************************************************************
 **
 ** Function         bta_dm_ble_observe
@@ -5161,7 +5160,6 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
 {
-
     tBTM_STATUS status;
     if (p_data->ble_observe.start)
     {
@@ -5273,10 +5271,23 @@ void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_enb.p_params,
-        p_data->ble_multi_adv_enb.p_cback,p_data->ble_multi_adv_enb.p_ref);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
+    {
+        btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
+                                            p_data->ble_multi_adv_enb.p_params,
+                                            p_data->ble_multi_adv_enb.p_cback,
+                                            p_data->ble_multi_adv_enb.p_ref);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+        bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
+                                    p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
+    }
 }
 /*******************************************************************************
 **
@@ -5289,10 +5300,22 @@ void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
-        (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
+        && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
+                         (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
+                                   p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
+    }
 }
 /*******************************************************************************
 **
@@ -5306,10 +5329,25 @@ void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,p_data->ble_multi_adv_data.is_scan_rsp,
-        p_data->ble_multi_adv_data.data_mask,(tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
+        && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
+                        p_data->ble_multi_adv_data.is_scan_rsp,
+                        p_data->ble_multi_adv_data.data_mask,
+                        (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
+                                   p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
+    }
+
 }
 /*******************************************************************************
 **
@@ -5322,9 +5360,21 @@ void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
+        && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
+                                   p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
+    }
 }
 
 /*******************************************************************************
@@ -5338,21 +5388,25 @@ void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
-                            p_data->ble_set_storage.batch_scan_trunc_max,
-                            p_data->ble_set_storage.batch_scan_notify_threshold,
-                            p_data->ble_set_storage.p_setup_cback,
-                            p_data->ble_set_storage.p_thres_cback,
-                            p_data->ble_set_storage.p_read_rep_cback,
-                            p_data->ble_set_storage.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
+                                             p_data->ble_set_storage.batch_scan_trunc_max,
+                                             p_data->ble_set_storage.batch_scan_notify_threshold,
+                                             p_data->ble_set_storage.p_setup_cback,
+                                             p_data->ble_set_storage.p_thres_cback,
+                                             p_data->ble_set_storage.p_read_rep_cback,
+                                             p_data->ble_set_storage.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5366,20 +5420,24 @@ void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
 
-    btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
-                           p_data->ble_enable_scan.scan_int,p_data->ble_enable_scan.scan_window,
-                           p_data->ble_enable_scan.addr_type,
-                           p_data->ble_enable_scan.discard_rule,
-                           p_data->ble_enable_scan.ref_value);
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
+                                            p_data->ble_enable_scan.scan_int,
+                                            p_data->ble_enable_scan.scan_window,
+                                            p_data->ble_enable_scan.discard_rule,
+                                            p_data->ble_enable_scan.addr_type,
+                                            p_data->ble_enable_scan.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
-                                btm_status);
-
-#endif
+                             btm_status);
 }
 
 /*******************************************************************************
@@ -5394,15 +5452,19 @@ void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
 void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
 {
     UNUSED(p_data);
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5416,16 +5478,20 @@ void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
-                                        p_data->ble_read_reports.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
+                                            p_data->ble_read_reports.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5439,8 +5505,21 @@ void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
 {
-    BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
-                           p_data->ble_track_advert.ref_value);
+    tBTM_STATUS btm_status = 0;
+    BD_ADDR bda;
+    memset(&bda, 0 , sizeof(BD_ADDR));
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
+                                            p_data->ble_track_advert.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       p_data->ble_track_advert.p_track_adv_cback(0, 0, bda, 0, p_data->ble_track_advert.ref_value);
 }
 
 /*******************************************************************************
@@ -5527,51 +5606,6 @@ static void bta_ble_status_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_REF_VALUE re
        bta_dm_cb.p_scan_filt_status_cback(action, ref_value, st);
 }
 
-/*******************************************************************************
-**
-** Function         bta_ble_enable_scan_cmpl
-**
-** Description      ADV payload filtering enable / disable complete callback
-**
-**
-** Returns          None
-**
-*******************************************************************************/
-static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
-                                        tBTM_BLE_RX_TIME_MS rx_time,
-                                        tBTM_BLE_IDLE_TIME_MS idle_time,
-                                        tBTM_BLE_ENERGY_USED  energy_used,
-                                        tBTM_STATUS status)
-{
-    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-    tBTA_DM_CONTRL_STATE ctrl_state = 0;
-
-    if (BTA_SUCCESS == st)
-       ctrl_state = bta_dm_pm_obtain_controller_state();
-
-    if (bta_dm_cb.p_energy_info_cback)
-        bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
-}
-
-/*******************************************************************************
-**
-** Function         bta_dm_ble_get_energy_info
-**
-** Description      This function obtains the energy info
-**
-** Parameters:
-**
-*******************************************************************************/
-void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
-{
-    tBTM_STATUS btm_status = 0;
-
-    bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
-    btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
-    if (BTM_CMD_STARTED != btm_status)
-        bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
-}
-
 /*******************************************************************************
 **
 ** Function         bta_dm_cfg_filter_cond
@@ -5684,6 +5718,51 @@ void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
 }
 #endif
 
+/*******************************************************************************
+**
+** Function         bta_ble_enable_scan_cmpl
+**
+** Description      ADV payload filtering enable / disable complete callback
+**
+**
+** Returns          None
+**
+*******************************************************************************/
+static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
+                                        tBTM_BLE_RX_TIME_MS rx_time,
+                                        tBTM_BLE_IDLE_TIME_MS idle_time,
+                                        tBTM_BLE_ENERGY_USED  energy_used,
+                                        tBTM_STATUS status)
+{
+    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+    tBTA_DM_CONTRL_STATE ctrl_state = 0;
+
+    if (BTA_SUCCESS == st)
+       ctrl_state = bta_dm_pm_obtain_controller_state();
+
+    if (bta_dm_cb.p_energy_info_cback)
+        bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_get_energy_info
+**
+** Description      This function obtains the energy info
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+
+    bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
+    btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
+    if (BTM_CMD_STARTED != btm_status)
+        bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
+}
+
 #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
 #define BTA_DM_GATT_CLOSE_DELAY_TOUT    1000
diff --git a/system/bta/dm/bta_dm_api.c b/system/bta/dm/bta_dm_api.c
index d8fb93448b6..2e4d9669fe6 100644
--- a/system/bta/dm/bta_dm_api.c
+++ b/system/bta/dm/bta_dm_api.c
@@ -32,6 +32,7 @@
 #include "btm_int.h"
 #include <string.h>
 #include "utl.h"
+#include "vendor_ble.h"
 
 /*****************************************************************************
 **  Constants
@@ -1260,8 +1261,6 @@ void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param)
     }
 }
 
-#if BLE_INCLUDED == TRUE
-
 /*******************************************************************************
 **
 ** Function         BTA_DmAddBleKey
@@ -1807,7 +1806,7 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s
                     tBTA_TRANSPORT transport)
 {
     tBTA_DM_API_DISCOVER    *p_msg;
-    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + 
+    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
                                 sizeof(tBT_UUID) * p_services->num_uuid) :
                                 sizeof(tBTA_DM_API_DISCOVER);
 
@@ -1984,7 +1983,6 @@ void BTA_DmBleEnableRemotePrivacy(BD_ADDR bd_addr, BOOLEAN privacy_enable)
 void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 {
 #if BLE_INCLUDED == TRUE
-#if BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
     tBTA_DM_API_LOCAL_PRIVACY *p_msg;
 
     if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL)
@@ -1996,12 +1994,10 @@ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 
         bta_sys_sendmsg(p_msg);
     }
-#endif
 #else
-    UNUSED(privacy_enable);
+    UNUSED (privacy_enable);
 #endif
 }
-#endif
 
 #if BLE_INCLUDED == TRUE
 /*******************************************************************************
@@ -2018,7 +2014,7 @@ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
                                 tBTA_BLE_MULTI_ADV_CBACK *p_cback,
                                 void *p_ref)
 {
@@ -2041,10 +2037,7 @@ tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
         p_msg->p_ref        = p_ref;
 
         bta_sys_sendmsg(p_msg);
-
-        return BTA_SUCCESS;
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2060,29 +2053,22 @@ tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
+void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
 {
     tBTA_DM_API_BLE_MULTI_ADV_PARAM    *p_msg;
     UINT16      len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM);
 
     APPL_TRACE_API ("BTA_BleUpdateAdvInstParam");
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
-    {
-        if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
-        {
-             memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
+     {
+          memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
+          p_msg->inst_id        = inst_id;
+          p_msg->p_params =  (void *)(p_msg + 1);
+          memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
 
-             p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
-             p_msg->inst_id        = inst_id;
-             p_msg->p_params =  (void *)(p_msg + 1);
-             memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
-
-             bta_sys_sendmsg(p_msg);
-
-             return BTA_SUCCESS;
-        }
+          bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2102,7 +2088,7 @@ tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_par
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
                             tBTA_BLE_AD_MASK data_mask,
                             tBTA_BLE_ADV_DATA *p_data)
 {
@@ -2111,24 +2097,17 @@ tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
 
     APPL_TRACE_API ("BTA_BleCfgAdvInstData");
 
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
-    {
     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL)
     {
-            memset(p_msg, 0, len);
-
-            p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
-            p_msg->inst_id      = inst_id;
-            p_msg->is_scan_rsp  = is_scan_rsp;
-            p_msg->data_mask     = data_mask;
-            p_msg->p_data        = p_data;
+          memset(p_msg, 0, len);
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
+          p_msg->inst_id      = inst_id;
+          p_msg->is_scan_rsp  = is_scan_rsp;
+          p_msg->data_mask     = data_mask;
+          p_msg->p_data        = p_data;
 
-            bta_sys_sendmsg(p_msg);
-
-            return BTA_SUCCESS;
-        }
+          bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2142,25 +2121,19 @@ tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleDisableAdvInstance (UINT8  inst_id)
+void BTA_BleDisableAdvInstance (UINT8  inst_id)
 {
     tBTA_DM_API_BLE_MULTI_ADV_DISABLE    *p_msg;
 
     APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id);
-
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
+    if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
+          GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
     {
-        if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
-            GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
-        {
-            memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
-            p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
-            p_msg->inst_id      = inst_id;
-            bta_sys_sendmsg(p_msg);
-            return BTA_SUCCESS;
-        }
+         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
+         p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
+         p_msg->inst_id      = inst_id;
+         bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2543,4 +2516,43 @@ BTA_API extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration,
         bta_sys_sendmsg(p_msg);
     }
 }
+
+/*******************************************************************************
+**
+** Function         BTA_VendorInit
+**
+** Description      This function initializes vendor specific
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorInit (void)
+{
+    APPL_TRACE_API("BTA_VendorInit");
+}
+
+/*******************************************************************************
+**
+** Function         BTA_VendorCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorCleanup (void)
+{
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+    btm_ble_adv_filter_cleanup();
+    btm_ble_vendor_cleanup();
+#endif
+
+   BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+   if(cmn_ble_vsc_cb.adv_inst_max > 0)
+      btm_ble_multi_adv_cleanup();
+}
+
 #endif
diff --git a/system/bta/dm/bta_dm_int.h b/system/bta/dm/bta_dm_int.h
index a16ebabcca2..311ac5fd2c5 100644
--- a/system/bta/dm/bta_dm_int.h
+++ b/system/bta/dm/bta_dm_int.h
@@ -100,11 +100,9 @@ enum
     BTA_DM_API_BLE_SCAN_PARAM_EVT,
     BTA_DM_API_BLE_OBSERVE_EVT,
     BTA_DM_API_UPDATE_CONN_PARAM_EVT,
-
 #if BLE_PRIVACY_SPT == TRUE
     BTA_DM_API_LOCAL_PRIVACY_EVT,
 #endif
-
     BTA_DM_API_BLE_ADV_PARAM_EVT,
     BTA_DM_API_BLE_SET_ADV_CONFIG_EVT,
     BTA_DM_API_BLE_SET_SCAN_RSP_EVT,
@@ -564,7 +562,7 @@ typedef struct
 typedef struct
 {
     BT_HDR                      hdr;
-    void                        *p_cback;
+    tBTA_BLE_MULTI_ADV_CBACK    *p_cback;
     void                        *p_ref;
     tBTA_BLE_ADV_PARAMS         *p_params;
 }tBTA_DM_API_BLE_MULTI_ADV_ENB;
@@ -922,13 +920,12 @@ typedef struct
     tBTA_DM_SEC_CBACK           *p_sec_cback;
 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     tBTA_BLE_SCAN_SETUP_CBACK   *p_setup_cback;
-#endif
     tBTA_DM_BLE_PF_CFG_CBACK     *p_scan_filt_cfg_cback;
     tBTA_DM_BLE_PF_STATUS_CBACK  *p_scan_filt_status_cback;
     tBTA_DM_BLE_PF_PARAM_CBACK   *p_scan_filt_param_cback;
-#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
-    tBTA_BLE_ENERGY_INFO_CBACK   *p_energy_info_cback;
+    tBTA_BLE_MULTI_ADV_CBACK     *p_multi_adv_cback;
 #endif
+    tBTA_BLE_ENERGY_INFO_CBACK   *p_energy_info_cback;
     TIMER_LIST_ENT              signal_strength_timer;
     tBTA_SIG_STRENGTH_MASK      signal_strength_mask;
     UINT16                      state;
@@ -1186,9 +1183,7 @@ extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data);
-#if BLE_PRIVACY_SPT == TRUE
 extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
-#endif
 extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data);
@@ -1245,9 +1240,7 @@ extern void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data);
 extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data);
 extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr);
 
-#if BLE_PRIVACY_SPT == TRUE
 extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
-#endif
 
 extern void bta_dm_pm_active(BD_ADDR peer_addr);
 
diff --git a/system/bta/dm/bta_dm_main.c b/system/bta/dm/bta_dm_main.c
index 35835c7c751..92bc8128519 100644
--- a/system/bta/dm/bta_dm_main.c
+++ b/system/bta/dm/bta_dm_main.c
@@ -118,8 +118,8 @@ const tBTA_DM_ACTION bta_dm_action[] =
     bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */
     bta_dm_ble_read_scan_reports,  /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */
     bta_dm_ble_track_advertiser,   /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
-    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 #endif
+    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 
 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
     bta_dm_update_eir_uuid,     /*  BTA_DM_API_UPDATE_EIR_UUID_EVT      */
diff --git a/system/bta/gatt/bta_gatts_act.c b/system/bta/gatt/bta_gatts_act.c
index 8f927fde520..20faa6238a3 100644
--- a/system/bta/gatt/bta_gatts_act.c
+++ b/system/bta/gatt/bta_gatts_act.c
@@ -230,7 +230,7 @@ void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
             p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
             memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
             cb_data.reg_oper.server_if      =
-            p_cb->rcb[first_unuse].gatt_if  = 
+            p_cb->rcb[first_unuse].gatt_if  =
             GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
             if ( !p_cb->rcb[first_unuse].gatt_if)
             {
diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h
index d205e9f844d..b9403e9dc79 100644
--- a/system/bta/include/bta_api.h
+++ b/system/bta/include/bta_api.h
@@ -944,7 +944,6 @@ typedef union
 /* Security callback */
 typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
 
-#define BTA_BLE_MULTI_ADV_MAX BTM_BLE_MULTI_ADV_MAX
 #define BTA_BLE_MULTI_ADV_ILLEGAL 0
 
 /* multi adv callback event */
@@ -2373,7 +2372,7 @@ BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start);
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+BTA_API extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
                                 tBTA_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref);
 
 /*******************************************************************************
@@ -2388,7 +2387,7 @@ BTA_API extern tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_para
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id,
+BTA_API extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id,
                                 tBTA_BLE_ADV_PARAMS *p_params);
 
 /*******************************************************************************
@@ -2403,7 +2402,7 @@ BTA_API extern tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id,
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+BTA_API extern void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
                                 tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data);
 
 /*******************************************************************************
@@ -2417,7 +2416,7 @@ BTA_API extern tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleDisableAdvInstance(UINT8 inst_id);
+BTA_API extern void BTA_BleDisableAdvInstance(UINT8 inst_id);
 
 /*******************************************************************************
 **
@@ -2606,6 +2605,28 @@ BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
 *******************************************************************************/
 BTA_API extern void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback);
 
+/*******************************************************************************
+**
+** Function         BTA_BrcmInit
+**
+** Description      This function initializes Broadcom specific VS handler in BTA
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorInit  (void);
+
+/*******************************************************************************
+**
+** Function         BTA_BrcmCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorCleanup (void);
+
 #endif
 
 #ifdef __cplusplus
diff --git a/system/btif/include/btif_gatt_multi_adv_util.h b/system/btif/include/btif_gatt_multi_adv_util.h
index 2fef4499f31..a67893c6e31 100644
--- a/system/btif/include/btif_gatt_multi_adv_util.h
+++ b/system/btif/include/btif_gatt_multi_adv_util.h
@@ -25,6 +25,7 @@
 
 #define CLNT_IF_IDX 0
 #define INST_ID_IDX 1
+#define INST_ID_IDX_MAX INST_ID_IDX + 1
 #define INVALID_ADV_INST -1
 #define STD_ADV_INSTID 0
 #define ADV_FLAGS 0x02
@@ -59,9 +60,10 @@ typedef struct
 
 typedef struct
 {
-    INT8 clntif_map[BTM_BLE_MULTI_ADV_MAX][INST_ID_IDX+1];
+     INT8 *clntif_map;
     // Includes the stored data for standard LE instance
-    btgatt_multi_adv_inst_cb inst_cb[BTM_BLE_MULTI_ADV_MAX+1];
+    btgatt_multi_adv_inst_cb *inst_cb;
+
 } btgatt_multi_adv_common_data;
 
 extern btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb();
@@ -70,7 +72,7 @@ extern void btif_gattc_destroy_multi_adv_cb();
 extern int btif_multi_adv_add_instid_map(int client_if, int inst_id,
         BOOLEAN gen_temp_instid);
 extern int btif_multi_adv_instid_for_clientif(int client_if);
-extern int btif_gattc_obtain_idx_for_datacb(int value, int arrindex);
+extern int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index);
 extern void btif_gattc_clear_clientif(int client_if);
 extern void btif_gattc_cleanup_inst_cb(int inst_id);
 extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb);
diff --git a/system/btif/src/btif_core.c b/system/btif/src/btif_core.c
index bd2f4ecbe24..4f7e90836ec 100644
--- a/system/btif/src/btif_core.c
+++ b/system/btif/src/btif_core.c
@@ -678,6 +678,10 @@ bt_status_t btif_disable_bluetooth(void)
 
     btif_config_flush();
 
+#if (BLE_INCLUDED == TRUE)
+     BTA_VendorCleanup();
+#endif
+
     if (status != BTA_SUCCESS)
     {
         BTIF_TRACE_ERROR("disable bt failed (%d)", status);
diff --git a/system/btif/src/btif_gatt_client.c b/system/btif/src/btif_gatt_client.c
index d549ce38987..ef53c145071 100644
--- a/system/btif/src/btif_gatt_client.c
+++ b/system/btif/src/btif_gatt_client.c
@@ -349,7 +349,7 @@ static void btif_gattc_add_remote_bdaddr (BD_ADDR p_bda, uint8_t addr_type)
         p_dev_cb->remote_dev[i].in_use = TRUE;
         BTIF_TRACE_DEBUG("%s device overwrite idx=%d", __FUNCTION__, i  );
         p_dev_cb->next_storage_idx++;
-        if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
+        if (p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
                p_dev_cb->next_storage_idx = 0;
     }
 }
@@ -377,13 +377,13 @@ static void btif_gattc_update_properties ( btif_gattc_cb_t *p_btif_cb )
     p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-    if(p_eir_remote_name == NULL)
+    if (p_eir_remote_name == NULL)
     {
         p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
     }
 
-    if(p_eir_remote_name)
+    if (p_eir_remote_name)
     {
         memcpy(bdname.name, p_eir_remote_name, remote_name_len);
         bdname.name[remote_name_len]='\0';
@@ -559,7 +559,7 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
             p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-            if(p_eir_remote_name == NULL)
+            if (p_eir_remote_name == NULL)
             {
                 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
@@ -624,8 +624,8 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
         case BTA_GATTC_MULT_ADV_ENB_EVT:
         {
             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
-            btif_multi_adv_add_instid_map(p_btif_cb->client_if,
-                p_btif_cb->inst_id,false);
+            if (0xFF != p_btif_cb->inst_id)
+                btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false);
             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb
                     , p_btif_cb->client_if
                     , p_btif_cb->status
@@ -722,7 +722,7 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
             uint8_t *p_rep_data = NULL;
 
-            if(p_data->read_reports.data_len > 0)
+            if (p_data->read_reports.data_len > 0)
             {
                 p_rep_data = GKI_getbuf(p_data->read_reports.data_len);
                 memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len);
@@ -795,19 +795,19 @@ static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_i
     tBTA_GATTC_EVT upevt;
     uint8_t client_if = 0;
 
-    if(NULL == p_ref)
+    if (NULL == p_ref)
     {
-        BTIF_TRACE_ERROR("%s Invalid p_ref received",__FUNCTION__);
-        return;
+        BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__);
+    }
+    else
+    {
+        client_if = *(UINT8 *) p_ref;
     }
 
-    client_if = *(UINT8 *) p_ref;
     BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status,
                        client_if);
-
     btif_cb.status = call_status;
     btif_cb.client_if = client_if;
-    // Store the inst_id obtained from stack layer now
     btif_cb.inst_id = inst_id;
 
     switch(event)
@@ -926,7 +926,7 @@ static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 rep
     btif_scan_track_cb.read_reports.data_len = data_len;
     btif_scan_track_cb.read_reports.num_records = num_records;
 
-    if(data_len > 0)
+    if (data_len > 0)
     {
         btif_scan_track_cb.read_reports.p_rep_data = GKI_getbuf(data_len);
         memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len);
@@ -936,7 +936,7 @@ static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 rep
     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT,
         (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
 
-    if(data_len > 0)
+    if (data_len > 0)
         GKI_freebuf(btif_scan_track_cb.read_reports.p_rep_data);
 }
 
@@ -1336,7 +1336,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP:
         {
             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
-            if(1 == p_adv_filt_cb->adv_filt_param.dely_mode)
+            if (1 == p_adv_filt_cb->adv_filt_param.dely_mode)
                BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
             BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
                 &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
@@ -1473,10 +1473,10 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         {
             btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
             int cbindex = CLNT_IF_IDX;
-            if(cbindex >= 0 && NULL != p_adv_data)
+            if (cbindex >= 0 && NULL != p_adv_data)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
-                if(!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
+                if (!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
                     return;
 
                 if (!p_adv_data->set_scan_rsp)
@@ -1496,21 +1496,30 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         case BTIF_GATTC_ADV_INSTANCE_ENABLE:
         {
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
-            int arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST,
-                                                        true);
-            int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
-            if(cbindex >= 0 && arrindex >= 0)
+
+            int cbindex = -1, arrindex = -1;
+
+            arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true);
+            if (arrindex >= 0)
+                cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+
+            if (cbindex >= 0 && arrindex >= 0)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param,
                        &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS));
-
+                BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__,
+                            p_multi_adv_data_cb->clntif_map[arrindex + arrindex]);
                 BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param),
                     bta_gattc_multi_adv_cback,
-                    &(p_multi_adv_data_cb->clntif_map[arrindex][CLNT_IF_IDX]));
+                    &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex]));
             }
             else
+            {
+                /* let the error propagate up from BTA layer */
                 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__);
+                BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL);
+            }
             break;
         }
 
@@ -1519,7 +1528,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
             int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
-            if(inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
+            if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param,
@@ -1537,13 +1546,13 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
             btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
             int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX);
             int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if);
-            if(inst_id < 0 || cbindex < 0)
+            if (inst_id < 0 || cbindex < 0)
             {
                BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_SETADV_INST_DATA", __FUNCTION__);
                return;
             }
 
-            if(!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
+            if (!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
                 return;
 
             btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
@@ -1557,7 +1566,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         {
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
-            if(inst_id >=0)
+            if (inst_id >=0)
                 BTA_BleDisableAdvInstance((UINT8)inst_id);
             else
                 BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__);
@@ -1971,7 +1980,7 @@ static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
     BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type);
 
     /* If data is passed, both mask and data have to be the same length */
-    if(data_len != mask_len && NULL != p_data && NULL != p_mask)
+    if (data_len != mask_len && NULL != p_data && NULL != p_mask)
         return BT_STATUS_PARM_INVALID;
 
     btif_filt_cb.client_if = client_if;
@@ -1980,8 +1989,8 @@ static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
     btif_filt_cb.filt_type = filt_type;
     btif_filt_cb.conn_id = company_id;
     btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
-    if(bd_addr)
-      bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
+    if (bd_addr)
+        bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
 
     btif_filt_cb.addr_type = addr_type;
     btif_filt_cb.has_mask = (p_uuid_mask != NULL);
@@ -2022,7 +2031,7 @@ static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable)
 
     btgatt_adv_filter_cb_t btif_filt_cb;
     btif_filt_cb.client_if = client_if;
-    if(true == enable)
+    if (true == enable)
         action = 1;
     btif_filt_cb.action = action;
     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE,
diff --git a/system/btif/src/btif_gatt_multi_adv_util.c b/system/btif/src/btif_gatt_multi_adv_util.c
index e40ccf6ae19..8f1ca9b4d37 100644
--- a/system/btif/src/btif_gatt_multi_adv_util.c
+++ b/system/btif/src/btif_gatt_multi_adv_util.c
@@ -46,8 +46,34 @@ static btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
 
 btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
 {
-    if(p_multi_adv_com_data_cb == NULL)
-       p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+    if(0 == BTM_BleMaxMultiAdvInstanceCount())
+    {
+        BTIF_TRACE_WARNING("%s - No instances found", __FUNCTION__);
+        return NULL;
+    }
+
+    BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, BTM_BleMaxMultiAdvInstanceCount());
+    if (NULL == p_multi_adv_com_data_cb)
+    {
+        BTIF_TRACE_DEBUG("Initializing in %s", __FUNCTION__);
+        p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+           memset(p_multi_adv_com_data_cb, 0, sizeof(btgatt_multi_adv_common_data));
+
+           /* Storing both client_if and inst_id details */
+           p_multi_adv_com_data_cb->clntif_map =
+                  GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+           memset(p_multi_adv_com_data_cb->clntif_map, 0 ,
+                  ( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+
+           p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() + 1 )
+                                              * sizeof(btgatt_multi_adv_inst_cb));
+           memset(p_multi_adv_com_data_cb->inst_cb, 0 ,
+                 ( BTM_BleMaxMultiAdvInstanceCount() + 1) * sizeof(btgatt_multi_adv_inst_cb));
+        }
+    }
+
     return p_multi_adv_com_data_cb;
 }
 
@@ -56,17 +82,15 @@ void btif_gattc_init_multi_adv_cb(void)
     int i;
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
-    if(multi_adv_enable_count == 0)
+    if (0 == multi_adv_enable_count)
     {
-        memset(p_multi_adv_data_cb,0,sizeof(btgatt_multi_adv_common_data));
-
-        for (i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+        for (i=0; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
         {
-           p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
-           p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
+           p_multi_adv_data_cb->clntif_map[i + i] = INVALID_ADV_INST;
+           p_multi_adv_data_cb->clntif_map[i + (i + 1)] = INVALID_ADV_INST;
         }
     }
     multi_adv_enable_count++;
@@ -74,119 +98,125 @@ void btif_gattc_init_multi_adv_cb(void)
 
 void btif_gattc_destroy_multi_adv_cb()
 {
-    if(multi_adv_enable_count > 0)
+    if (multi_adv_enable_count > 0)
         multi_adv_enable_count --;
-    if(multi_adv_enable_count == 0)
+
+    if (0 == multi_adv_enable_count)
     {
-        GKI_freebuf(p_multi_adv_com_data_cb);
-        p_multi_adv_com_data_cb = NULL;
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+            GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
+            GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
+            GKI_freebuf(p_multi_adv_com_data_cb);
+            p_multi_adv_com_data_cb = NULL;
+        }
     }
 }
 
 int btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
 {
-    int i=0;
+    int i=1;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
        {
-          if(!gen_temp_instid)
+          if (!gen_temp_instid)
           {
              // Write the final inst_id value obtained from stack layer
-             p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
+             p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
              BTIF_TRACE_DEBUG("%s -Index: %d, Found client_if: %d", __FUNCTION__,
-                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
              break;
           }
           else
           {
               //Store the passed in inst_id value
-             if(inst_id != INVALID_ADV_INST)
-                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
+             if (inst_id != INVALID_ADV_INST)
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
              else
-                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+
              BTIF_TRACE_DEBUG("%s - Index:%d,Found client_if: %d", __FUNCTION__,
-                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
              break;
           }
        }
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
         return i;
 
     // If client ID if is not found, then write both values
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-        if(INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+        if (INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i + i])
         {
-             p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = client_if;
-             if(inst_id != INVALID_ADV_INST)
-                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
-             else
-                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
-             BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
+            p_multi_adv_data_cb->clntif_map[i + i] = client_if;
+            if (inst_id != INVALID_ADV_INST)
+               p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+            else
+                p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+            BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
                             __FUNCTION__,i,
-                            p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX],
-                            p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX]);
-             break;
+                            p_multi_adv_data_cb->clntif_map[i + i],
+                            p_multi_adv_data_cb->clntif_map[i + (i + 1)]);
+            break;
         }
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
         return i;
     return INVALID_ADV_INST;
 }
 
 int btif_multi_adv_instid_for_clientif(int client_if)
 {
-    int i=0, ret = INVALID_ADV_INST;
+    int i=1, ret = INVALID_ADV_INST;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
     // Retrieve the existing inst_id for the client_if value
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
-          ret = p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX];
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+       {
+           BTIF_TRACE_DEBUG("%s - Client if found", __FUNCTION__, client_if);
+           ret = p_multi_adv_data_cb->clntif_map[i + (i + 1)];
+       }
     }
 
-    if(ret != INVALID_ADV_INST)
-        return ret;
-
-    return INVALID_ADV_INST;
+    return ret;
 }
 
-
-int btif_gattc_obtain_idx_for_datacb(int value, int arrindex)
+int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index)
 {
-    int i=0;
+    int i=1;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
     // Retrieve the array index for the inst_id value
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(value == p_multi_adv_data_cb->clntif_map[i][arrindex])
+       if (value == p_multi_adv_data_cb->clntif_map[i + (i + clnt_inst_index)])
            break;
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
     {
-        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i+1);
-        return (i + 1);
+        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i);
+        return i;
     }
 
     BTIF_TRACE_DEBUG("%s Invalid instance",__FUNCTION__);
@@ -211,21 +241,21 @@ void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
     p_multi_adv_inst->appearance = appearance;
     p_multi_adv_inst->manufacturer_len = manufacturer_len;
 
-    if(manufacturer_len > 0)
+    if (manufacturer_len > 0)
     {
         p_multi_adv_inst->p_manufacturer_data = GKI_getbuf(manufacturer_len);
         memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
     }
 
     p_multi_adv_inst->service_data_len = service_data_len;
-    if(service_data_len > 0)
+    if (service_data_len > 0)
     {
         p_multi_adv_inst->p_service_data = GKI_getbuf(service_data_len);
         memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
     }
 
     p_multi_adv_inst->service_uuid_len = service_uuid_len;
-    if(service_uuid_len > 0)
+    if (service_uuid_len > 0)
     {
         p_multi_adv_inst->p_service_uuid = GKI_getbuf(service_uuid_len);
         memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
@@ -236,7 +266,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
 {
     int i=0;
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
-    if(NULL == p_multi_adv_data_cb || cbindex < 0)
+    if (NULL == p_multi_adv_data_cb || cbindex < 0)
        return false;
 
     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
@@ -265,7 +295,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
                                         p_adv_data->max_interval;
     }
     else
-    if(true == bInstData)
+    if (true == bInstData)
     {
         if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
             p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
@@ -295,7 +325,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
     {
          p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu =
                             GKI_getbuf(sizeof(tBTA_BLE_MANU));
-         if(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
+         if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
          {
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val =
                             GKI_getbuf(p_adv_data->manufacturer_len);
@@ -423,16 +453,16 @@ void btif_gattc_clear_clientif(int client_if)
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
     // Clear both the inst_id and client_if values
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=0; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
        {
-          p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
-          p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
+          p_multi_adv_data_cb->clntif_map[i + (i + 1)] = INVALID_ADV_INST;
+          p_multi_adv_data_cb->clntif_map[i + i] = INVALID_ADV_INST;
           BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i, client_if);
           break;
        }
@@ -443,23 +473,23 @@ void btif_gattc_cleanup_inst_cb(int inst_id)
 {
     int cbindex = 0;
     // Check for invalid instance id
-    if (inst_id < 0 || inst_id > BTM_BLE_MULTI_ADV_MAX)
+    if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
         return;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
-    if(inst_id > 0)
+    if (inst_id > 0)
     {
         cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
         if (cbindex < 0)
             return;
     }
     else
-    if(STD_ADV_INSTID == inst_id)
-      cbindex = STD_ADV_INSTID;
+    if (STD_ADV_INSTID == inst_id)
+       cbindex = STD_ADV_INSTID;
 
     BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
     btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
@@ -533,7 +563,7 @@ void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
         GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
     }
 
-    if(p_multi_inst_cb->data.p_sol_service_128b != NULL)
+    if (p_multi_inst_cb->data.p_sol_service_128b != NULL)
         GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
 }
 
diff --git a/system/include/bt_target.h b/system/include/bt_target.h
index b92e7ce80da..4be917ed45b 100644
--- a/system/include/bt_target.h
+++ b/system/include/bt_target.h
@@ -1308,18 +1308,9 @@ and USER_HW_DISABLE_API macros */
 #define BLE_PRIVACY_SPT         TRUE
 #endif
 
-#ifndef BLE_MULTI_ADV_INCLUDED
-#define BLE_MULTI_ADV_INCLUDED  TRUE
-#endif
-
 #ifndef BLE_VND_INCLUDED
-#define BLE_VND_INCLUDED        TRUE
+#define BLE_VND_INCLUDED        FALSE
 #endif
-
-#ifndef BLE_BATCH_SCAN_INCLUDED
-#define BLE_BATCH_SCAN_INCLUDED  TRUE
-#endif
-
 /******************************************************************************
 **
 ** ATT/GATT Protocol/Profile Settings
diff --git a/system/main/bte_init.c b/system/main/bte_init.c
index b1892817ac6..3e3c1adad75 100644
--- a/system/main/bte_init.c
+++ b/system/main/bte_init.c
@@ -18,7 +18,7 @@
 
 /******************************************************************************
  *
- *  This module contains the routines that initialize the stack components. 
+ *  This module contains the routines that initialize the stack components.
  *  It must be called before the BTU task is started.
  *
  ******************************************************************************/
diff --git a/system/stack/btm/btm_acl.c b/system/stack/btm/btm_acl.c
index e7fda01333a..3b1062235da 100644
--- a/system/stack/btm/btm_acl.c
+++ b/system/stack/btm/btm_acl.c
@@ -294,7 +294,6 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
             p->transport = transport;
             if (transport == BT_TRANSPORT_LE)
             {
-#if ( BLE_PRIVACY_SPT == TRUE )
                 /*allow central device to use random address for now by skipping the role check */
                 if (btm_cb.ble_ctr_cb.privacy /* && p->link_role == HCI_ROLE_SLAVE */)
                 {
@@ -302,7 +301,6 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
                     memcpy(p->conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
                 }
                 else
-#endif
                 {
                     p->conn_addr_type = BLE_ADDR_PUBLIC;
                     BTM_GetLocalDeviceAddr(p->conn_addr);
diff --git a/system/stack/btm/btm_ble.c b/system/stack/btm/btm_ble.c
index 0036d92391e..9ba0584d068 100644
--- a/system/stack/btm/btm_ble.c
+++ b/system/stack/btm/btm_ble.c
@@ -38,9 +38,7 @@
 #include "gap_api.h"
 #include "bt_utils.h"
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 #if SMP_INCLUDED == TRUE
 extern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature);
@@ -48,7 +46,6 @@ extern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable);
 extern BOOLEAN smp_proc_ltk_request(BD_ADDR bda);
 #endif
 extern void gatt_notify_enc_cmpl(BD_ADDR bd_addr);
-
 /*******************************************************************************/
 /* External Function to be called by other modules                             */
 /*******************************************************************************/
@@ -1619,9 +1616,8 @@ void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role,
     if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched)
         memcpy(p_dev_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-    btm_ble_vendor_disable_irk_list();
-#endif
+    if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+        btm_ble_vendor_disable_irk_list();
 #endif
 
     if (role == HCI_ROLE_SLAVE)
@@ -1658,12 +1654,13 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len)
     if (status == 0)
     {
 #if (BLE_PRIVACY_SPT == TRUE )
-#if (BLE_VND_INCLUDED == TRUE)
-        match = btm_public_addr_to_random_pseudo (bda, &bda_type);
-#endif
-        /* Possibly receiving connection complete with a resolvable random address
-           for a device that has been paired */
-        if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            match = btm_public_addr_to_random_pseudo (bda, &bda_type);
+
+        /* possiblly receive connection complete with resolvable random on
+           slave role while the device has been paired */
+        if (!match && role == HCI_ROLE_SLAVE && BTM_BLE_IS_RESOLVE_BDA(bda))
         {
             btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data);
         }
diff --git a/system/stack/btm/btm_ble_addr.c b/system/stack/btm/btm_ble_addr.c
index 1f5654a7519..e560ee7f495 100644
--- a/system/stack/btm/btm_ble_addr.c
+++ b/system/stack/btm/btm_ble_addr.c
@@ -34,9 +34,7 @@
 #include "btm_ble_int.h"
 #include "smp_api.h"
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 /*******************************************************************************
 **
@@ -348,7 +346,7 @@ void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_
                 /* atch found or went through the list */
                 break;
             }
-	        p_mgnt_cb->index ++;
+            p_mgnt_cb->index ++;
         }
     }
     else
@@ -382,8 +380,6 @@ tBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr)
         return BLE_ADDR_PUBLIC;
 }
 
-#if BLE_PRIVACY_SPT == TRUE
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 /*******************************************************************************
 **
 ** Function         btm_find_dev_by_public_static_addr
@@ -395,7 +391,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
 {
     UINT8               i;
     tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
-
+#if BLE_PRIVACY_SPT == TRUE
     for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
     {
         if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
@@ -409,6 +405,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
             }
         }
     }
+#endif
     return NULL;
 }
 
@@ -422,6 +419,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
 *******************************************************************************/
 BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_public_static_addr(bd_addr);
 
     BTM_TRACE_EVENT ("btm_public_addr_to_random_pseudo");
@@ -443,7 +441,7 @@ BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 
         return TRUE;
     }
-
+#endif
     return FALSE;
 }
 
@@ -457,6 +455,7 @@ BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 *******************************************************************************/
 BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (random_pseudo);
 
     if (p_dev_rec != NULL)
@@ -471,7 +470,7 @@ BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_
             return TRUE;
         }
     }
-
+#endif
     return FALSE;
 }
 
@@ -485,6 +484,7 @@ BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_
 *******************************************************************************/
 void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_sec_rec = btm_find_dev_by_public_static_addr(static_bda);
     tACL_CONN           *p_acl = btm_bda_to_acl (p_sec_rec->bd_addr, BT_TRANSPORT_LE);
     UINT8               rra_dummy = FALSE;
@@ -520,10 +520,8 @@ void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
     {
         BTM_TRACE_ERROR("No matching known device in record");
     }
-
+#endif
 }
-#endif /* CS support */
-#endif  /* privacy support */
 #endif
 
 
diff --git a/system/stack/btm/btm_ble_adv_filter.c b/system/stack/btm/btm_ble_adv_filter.c
index e11c924603b..4efaf8bed06 100644
--- a/system/stack/btm/btm_ble_adv_filter.c
+++ b/system/stack/btm/btm_ble_adv_filter.c
@@ -20,7 +20,6 @@
 #include "bt_target.h"
 
 #if (BLE_INCLUDED == TRUE)
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
@@ -59,6 +58,33 @@ static UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
 #define BTM_BLE_ADV_FILT_CB_EVT_MASK       0xF0
 #define BTM_BLE_ADV_FILT_SUBCODE_MASK      0x0F
 
+/*******************************************************************************
+**
+** Function         btm_ble_obtain_vsc_details
+**
+** Description      This function obtains the VSC details
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_obtain_vsc_details()
+{
+    tBTM_STATUS st = BTM_SUCCESS;
+
+#if BLE_VND_INCLUDED == TRUE
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    if (0 == cmn_ble_vsc_cb.max_filter)
+    {
+        st = BTM_MODE_UNSUPPORTED;
+        return st;
+    }
+#else
+    cmn_ble_vsc_cb.max_filter = BTM_BLE_MAX_FILTER_COUNTER;
+#endif
+    return st;
+}
 
 /*******************************************************************************
 **
@@ -241,7 +267,7 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
     STREAM_TO_UINT8(action, p);
 
     /* Ignore the event, if it is not the same one expected */
-    if(3 == evt_len)
+    if (3 == evt_len)
     {
         if(ocf != op_subcode)
         {
@@ -329,10 +355,10 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
 tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
 
     if (p_le_bda == NULL)
-        return &btm_ble_adv_filt_cb.addr_filter_count[0];
+        return &btm_ble_adv_filt_cb.p_addr_filter_count[0];
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -357,7 +383,7 @@ tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
 tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -382,11 +408,11 @@ tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
 BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
     BOOLEAN             found = FALSE;
 
     if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr)
-        memset(&btm_ble_adv_filt_cb.addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
+        memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -516,7 +542,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
           len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
     tBTM_STATUS st = BTM_ILLEGAL_VALUE;
 
-    if(NULL!= p_data && 0 == p_data->manu_data.data_len && 0 == p_data->srvc_data.data_len)
+    if (NULL!= p_data && 0 == p_data->manu_data.data_len && 0 == p_data->srvc_data.data_len)
         return st;
 
     memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX
@@ -546,7 +572,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
             if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
                 p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
 
-            if(p_srvc_data->data_len > 0)
+            if (p_srvc_data->data_len > 0)
             {
                 ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
                 len += (p_srvc_data->data_len);
@@ -565,7 +591,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
 
            UINT16_TO_STREAM(p, p_manu_data->company_id);
 
-           if(p_manu_data->data_len > 0)
+           if (p_manu_data->data_len > 0)
                 ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
            len += (p_manu_data->data_len + 2);
 
@@ -579,7 +605,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
                p += 2;
            }
 
-           if(p_manu_data->data_len > 0)
+           if (p_manu_data->data_len > 0)
               ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
            len += (p_manu_data->data_len + 2);
 
@@ -620,7 +646,7 @@ UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
     tBTM_BLE_PF_COUNT   *p_addr_filter = NULL;
     UINT8               *p_counter = NULL;
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    btm_ble_obtain_vsc_details();
 
     if (cond_type > BTM_BLE_PF_TYPE_ALL)
     {
@@ -655,18 +681,11 @@ UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
         else if (cond_type != BTM_BLE_PF_TYPE_ALL)
         {
             p_counter = p_addr_filter->pf_counter;
-            if(num_available > 0)
-               p_counter[cond_type] += 1;
-
-            /* update corresponding feature mask */
             if (num_available > 0)
-                p_addr_filter->feat_mask |= (BTM_BLE_PF_BIT_TO_MASK(cond_type));
-            else
-                p_addr_filter->feat_mask &= ~(BTM_BLE_PF_BIT_TO_MASK(cond_type));
+                p_counter[cond_type] += 1;
 
-            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d, feat_mask = %d",
-                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available,
-                p_addr_filter->feat_mask);
+            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d",
+                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available);
             return p_counter[cond_type];
         }
     }
@@ -918,8 +937,8 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
     p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
 
     if (NULL == p_bda_filter ||
-        /* not a generic filter, and feature selection is empty */
-        (p_target != NULL && p_bda_filter && 0 == p_bda_filter->feat_mask))
+        /* not a generic filter */
+        (p_target != NULL && p_bda_filter))
     {
         BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!");
         return st;
@@ -982,9 +1001,6 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
                                 btm_ble_scan_pf_cmpl_cback))
             != BTM_NO_RESOURCES)
     {
-        if (p_bda_filter)
-            p_bda_filter->feat_mask = BTM_BLE_PF_SELECT_NONE;
-
         if (p_target)
             memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
         else
@@ -1020,17 +1036,13 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
     tBTM_BLE_PF_COUNT *p_bda_filter = NULL;
     UINT8 len =0;
 
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+        return st;
+
     p = param;
     memset(param, 0, 20);
     BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup");
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
-        return st;
-    }
-
     if (BTM_BLE_SCAN_COND_ADD == action)
     {
         p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
@@ -1040,7 +1052,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
            return st;
         }
 
-        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_bda_filter->feat_mask);
+        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln);
         /* select feature based on control block settings */
         UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
         UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
@@ -1059,7 +1071,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
         /* set delivery mode */
         UINT8_TO_STREAM(p, p_filt_params->dely_mode);
 
-        if(0x01 == p_filt_params->dely_mode)
+        if (0x01 == p_filt_params->dely_mode)
         {
             /* set onfound timeout */
             UINT16_TO_STREAM(p, p_filt_params->found_timeout);
@@ -1085,7 +1097,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
                                  ref_value, NULL, p_cmpl_cback);
     }
     else
-    if(BTM_BLE_SCAN_COND_DELETE == action)
+    if (BTM_BLE_SCAN_COND_DELETE == action)
     {
         /* select feature based on control block settings */
         UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
@@ -1105,7 +1117,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
                                  ref_value, NULL, p_cmpl_cback);
     }
     else
-    if(BTM_BLE_SCAN_COND_CLEAR == action)
+    if (BTM_BLE_SCAN_COND_CLEAR == action)
     {
         /* Deallocate all filters here */
         btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
@@ -1149,12 +1161,8 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_WRONG_MODE;
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
-        return st;
-    }
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+       return st;
 
     p = param;
     memset(param, 0, 20);
@@ -1205,12 +1213,8 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
     BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action,
                         cond_type, filt_index);
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
         return st;
-    }
 
     switch (cond_type)
     {
@@ -1279,9 +1283,34 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
 void btm_ble_adv_filter_init(void)
 {
     memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+       return;
+
+    if (cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filt_cb.p_addr_filter_count =
+            (tBTM_BLE_PF_COUNT*) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter);
+    }
+
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return;
 }
 
-#endif
+/*******************************************************************************
+**
+** Function         btm_ble_adv_filter_cleanup
+**
+** Description      This function de-initializes the adv filter control block
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_cleanup(void)
+{
+    if (btm_ble_adv_filt_cb.p_addr_filter_count)
+        GKI_freebuf (btm_ble_adv_filt_cb.p_addr_filter_count);
+}
+
 #endif
diff --git a/system/stack/btm/btm_ble_batchscan.c b/system/stack/btm/btm_ble_batchscan.c
index b38e015e15d..8947e1dff9d 100644
--- a/system/stack/btm/btm_ble_batchscan.c
+++ b/system/stack/btm/btm_ble_batchscan.c
@@ -27,7 +27,7 @@
 #include "btm_int.h"
 #include "hcimsgs.h"
 
-#if (BLE_INCLUDED == TRUE && BLE_BATCH_SCAN_INCLUDED == TRUE)
+#if (BLE_INCLUDED == TRUE)
 
 tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
 tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
@@ -352,52 +352,28 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
     {
         case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE:
         {
-            if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
-            else
-            if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
-            {
-                BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-            }
-
-            if (BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
-            else
-            if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-            {
-                 BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after disabled");
+             if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+                 ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
+             else
+             if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+             {
+                 BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
                  ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-            }
-            BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
-                status, ble_batchscan_cb.cur_state, cb_evt);
+             }
 
-            /* Clear the queues here */
-            if(BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-            {
-                for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
-                {
-                    ble_batchscan_cb.main_rep_q.rep_mode[index] = 0;
-                    if (NULL != ble_batchscan_cb.main_rep_q.p_data[index])
-                        GKI_freebuf(ble_batchscan_cb.main_rep_q.p_data[index]);
-                    ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
-                    ble_batchscan_cb.main_rep_q.ref_value[index] = 0;
-                    ble_batchscan_cb.main_rep_q.num_records[index] = 0;
-                }
-
-                for (index = 0; index < BTM_BLE_BATCH_SCAN_MAX; index++)
-                {
-                    ble_batchscan_cb.op_q.sub_code[index] = 0;
-                    ble_batchscan_cb.op_q.ref_value[index] = 0;
-                    ble_batchscan_cb.op_q.cur_state[index] = 0;
-                }
-                ble_batchscan_cb.op_q.pending_idx = 0;
-                ble_batchscan_cb.op_q.next_idx = 0;
-            }
-
-            if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+             if (BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
+             else
+             if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+             {
+                BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after disabled");
+                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+             }
+             BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
+                                status, ble_batchscan_cb.cur_state, cb_evt);
+             if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
                 ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
-            break;
+             break;
         }
 
         case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM:
@@ -413,7 +389,7 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         {
             BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt);
             if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
-                ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+               ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
             break;
         }
 
@@ -647,8 +623,8 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_
          BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
     {
          status = btm_ble_enable_disable_batchscan(TRUE);
-         if (BTM_CMD_STARTED != status)
-             return status;
+        if (BTM_CMD_STARTED != status)
+            return status;
          ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
          btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
                                     BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
@@ -657,8 +633,8 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_
     status = btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max,
                                         batch_scan_notify_threshold);
     if (BTM_CMD_STARTED != status)
-        return status;
-     /* The user needs to be provided scan config storage event */
+       return status;
+            /* The user needs to be provided scan config storage event */
      btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state,
                                    BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value);
 
@@ -717,11 +693,11 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
             || BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
             BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
         {
-        status = btm_ble_enable_disable_batchscan(TRUE);
-        if (BTM_CMD_STARTED != status)
-            return status;
-        btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
-                                   BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+            status = btm_ble_enable_disable_batchscan(TRUE);
+            if (BTM_CMD_STARTED != status)
+               return status;
+            btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+                                       BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
         }
 
         ble_batchscan_cb.scan_mode = scan_mode;
@@ -820,17 +796,16 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
     /*  Check if the requested scan mode has already been setup by the user */
     read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_ACTI;
     if (0 == read_scan_mode)
-       read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
+        read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
 
     if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode ||
         BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)
         && (BTM_BLE_SCAN_ENABLED_STATE == ble_batchscan_cb.cur_state ||
             BTM_BLE_SCAN_ENABLE_CALLED == ble_batchscan_cb.cur_state))
     {
-        status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value);
-        if (BTM_SUCCESS == status)
+        status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
+        if (BTM_CMD_STARTED == status)
         {
-            status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
             if (BTM_CMD_STARTED != status)
                 btm_ble_batchscan_deq_rep_data(scan_mode, &ref_value,
                                                &num_records, &p_data, &data_len);
diff --git a/system/stack/btm/btm_ble_bgconn.c b/system/stack/btm/btm_ble_bgconn.c
index 30c487748f7..f6e22970c5a 100644
--- a/system/stack/btm/btm_ble_bgconn.c
+++ b/system/stack/btm/btm_ble_bgconn.c
@@ -30,9 +30,7 @@
 #include "l2c_int.h"
 #include "hcimsgs.h"
 #include "bt_utils.h"
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 #ifndef BTM_BLE_SCAN_PARAM_TOUT
 #define BTM_BLE_SCAN_PARAM_TOUT      50    /* 50 seconds */
@@ -86,11 +84,9 @@ BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
         {
             if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
             {
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
                 /* add device into IRK list */
                 btm_ble_vendor_irk_list_load_dev(p_dev_rec);
-#endif
 #endif
                 started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
             }
@@ -426,10 +422,9 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start)
             btsnd_hcic_ble_create_conn_cancel();
             btm_ble_set_conn_st (BLE_CONN_CANCEL);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-            btm_ble_vendor_disable_irk_list();
-#endif
+            if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+                btm_ble_vendor_disable_irk_list();
 #endif
         }
         else
@@ -513,9 +508,8 @@ BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK   *p_select_c
         p_cb->p_select_cback = NULL;
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-        btm_ble_vendor_disable_irk_list();
-#endif
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            btm_ble_vendor_disable_irk_list();
 #endif
 
         /* stop scanning */
diff --git a/system/stack/btm/btm_ble_gap.c b/system/stack/btm/btm_ble_gap.c
index 51a34c00135..83444e7d8e6 100644
--- a/system/stack/btm/btm_ble_gap.c
+++ b/system/stack/btm/btm_ble_gap.c
@@ -34,10 +34,11 @@
 #if (GAP_INCLUDED == TRUE)
 #include "gap_api.h"
 #endif
-#if (BLE_INCLUDED == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
+
+#if BLE_INCLUDED == TRUE
+
 #include "vendor_ble.h"
-#endif
+
 #include "gattdefs.h"
 #include "gatt_int.h"
 
@@ -330,11 +331,9 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
                                             btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
                                             BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
             /* enable IRK list */
             btm_ble_vendor_irk_list_known_dev (TRUE);
-#endif
 #endif
             status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
         }
@@ -435,22 +434,17 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
 {
 #if BLE_VND_INCLUDED == TRUE
     UINT8  status = 0xFF, *p;
-    UINT8  rpa_offloading, max_irk_list_sz, filtering_support, max_filter;
-    UINT16 scan_result_storage;
-    tBTM_BLE_VENDOR_CB  *p_vcb = &btm_ble_vendor_cb;
-    max_irk_list_sz = 0;
 
     BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
 
     /* Check status of command complete event */
-    if((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF)
-        &&(p_vcs_cplt_params->param_len > 0 ))
+    if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
     {
         p = p_vcs_cplt_params->p_param_buf;
         STREAM_TO_UINT8  (status, p);
     }
 
-    if(status == HCI_SUCCESS)
+    if (status == HCI_SUCCESS)
     {
         STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
         STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
@@ -461,13 +455,25 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
         STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.energy_support, p);
     }
 
-    p_vcb->irk_avail_size = max_irk_list_sz;
+    BTM_TRACE_DEBUG("btm_ble_vnd_cap_vsc_cmpl_cback: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d",
+         status, btm_ble_vendor_cb.irk_avail_size, btm_cb.cmn_ble_vsc_cb.adv_inst_max,
+         btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support);
+
+    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+        btm_ble_multi_adv_init();
+
+    if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filter_init();
+        btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
+    }
+
+    if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+        btm_ble_batchscan_init();
 
     if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
         p_ctrl_le_feature_rd_cmpl_cback(status);
 
-    BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback: status=%d, max_irk_size=%d",
-         status, btm_ble_vendor_cb.irk_avail_size);
 #else
     UNUSED(p_vcs_cplt_params);
 #endif
@@ -488,7 +494,7 @@ BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
 {
     BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
 
-    if(NULL != p_cmn_vsc_cb)
+    if (NULL != p_cmn_vsc_cb)
     {
         *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
     }
@@ -510,8 +516,6 @@ BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK
 #if BLE_VND_INCLUDED == TRUE
     BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
 
-    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
-
     p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
     if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
                                     0,
@@ -553,7 +557,6 @@ void BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK   *p_scan_req_cback)
 #endif
 }
 
-#if BLE_PRIVACY_SPT == TRUE
 /*******************************************************************************
 **
 ** Function         BTM_BleConfigPrivacy
@@ -585,10 +588,27 @@ void BTM_BleConfigPrivacy(BOOLEAN enable)
         {
             p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
         }
-        btm_ble_multi_adv_enb_privacy(p_cb->privacy);
+
+        if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+            btm_ble_multi_adv_enb_privacy(p_cb->privacy);
     }
 }
 
+/*******************************************************************************
+**
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount()
+{
+    return btm_cb.cmn_ble_vsc_cb.adv_inst_max;
+}
+
+#if BLE_PRIVACY_SPT == TRUE
 /*******************************************************************************
 **
 ** Function         btm_ble_resolve_random_addr_on_adv
@@ -818,7 +838,6 @@ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
     {
         evt_type = BTM_BLE_CONNECT_EVT;
 
-#if BLE_PRIVACY_SPT == TRUE
         /* may need to reset random address if privacy is enabled */
         if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
             !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
@@ -826,7 +845,6 @@ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
             /* need to generate RRA and update random addresss in controller */
             btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
         }
-#endif
     }
 
     return evt_type;
@@ -1692,10 +1710,9 @@ tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
         btm_update_scanner_filter_policy(SP_ADV_ALL);
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
         /* enable IRK list */
-        btm_ble_vendor_irk_list_known_dev (TRUE);
-#endif
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            btm_ble_vendor_irk_list_known_dev (TRUE);
 #endif
         status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
     }
@@ -2410,12 +2427,10 @@ void btm_ble_process_adv_pkt (UINT8 *p_data)
 #endif
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
     /* map address to security record */
     btm_public_addr_to_random_pseudo(bda, &addr_type);
     BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
                      bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
-#endif
 #endif
 
         /* Only process the results if the inquiry is still active */
@@ -2937,14 +2952,15 @@ void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
         case BTU_TTYPE_BLE_RANDOM_ADDR:
             if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
             {
-                if ((void *)(p_tle->param) == NULL)
-                /* refresh the random addr */
-                btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+                if (NULL == (void *)(p_tle->param))
+                {
+                    /* refresh the random addr */
+                    btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+                }
                 else
                 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-                  btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
-#endif
+                    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+                       btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
                 }
             }
             break;
@@ -3016,8 +3032,9 @@ void btm_ble_write_adv_enable_complete(UINT8 * p)
         p_cb->adv_mode = !p_cb->adv_mode;
     }
 
-#if (BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE)
-    if (p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
+#if (BLE_PRIVACY_SPT == TRUE)
+    if ((p_cb->adv_mode == BTM_BLE_ADV_DISABLE) &&
+        (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE))
         btm_ble_vendor_disable_irk_list();
 #endif
 }
@@ -3055,7 +3072,7 @@ void btm_ble_init (void)
     BTM_TRACE_EVENT ("btm_ble_init ");
 
     memset(p_cb, 0, sizeof(tBTM_BLE_CB));
-    memset(&btm_cb.cmn_ble_vsc_cb, 0 , sizeof(tBTM_BLE_VSC_CB));
+    memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
     p_cb->cur_states       = 0;
 
     p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
@@ -3070,15 +3087,9 @@ void btm_ble_init (void)
     p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
 
     p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    btm_ble_multi_adv_init();
-#endif
-
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
-    btm_ble_batchscan_init();
-#endif
 
-#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+#if BLE_VND_INCLUDED == FALSE
+    btm_ble_vendor_init(BTM_CS_IRK_LIST_MAX);
     btm_ble_adv_filter_init();
 #endif
 }
diff --git a/system/stack/btm/btm_ble_int.h b/system/stack/btm/btm_ble_int.h
index 822f09d7b53..b8e33a261e1 100644
--- a/system/stack/btm/btm_ble_int.h
+++ b/system/stack/btm/btm_ble_int.h
@@ -292,9 +292,7 @@ typedef struct
     tBTM_LE_RANDOM_CB   addr_mgnt_cb;
 
     BOOLEAN          enabled;
-#if BLE_PRIVACY_SPT == TRUE
-        BOOLEAN          privacy;               /* privacy enabled or disabled */
-#endif
+    BOOLEAN          privacy;               /* local privacy enabled or disabled */
     tBTM_BLE_WL_OP  wl_op_q[BTM_BLE_MAX_BG_CONN_DEV_NUM];
 
 #ifdef BTM_BLE_PC_ADV_TEST_MODE
@@ -359,6 +357,7 @@ extern BOOLEAN btm_ble_get_enc_key_type(BD_ADDR bd_addr, UINT8 *p_key_types);
 
 extern void btm_ble_test_command_complete(UINT8 *p);
 extern void btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback);
+
 extern void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys, BOOLEAN pass_to_application);
 extern void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size);
 extern UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr);
@@ -395,21 +394,22 @@ extern void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p);
 
 extern void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst);
 extern void btm_ble_multi_adv_init(void);
-extern void btm_ble_batchscan_init(void);
+extern void* btm_ble_multi_adv_get_ref(UINT8 inst_id);
+extern void btm_ble_multi_adv_cleanup(void);
 extern void btm_ble_multi_adv_reenable(UINT8 inst_id);
 extern void btm_ble_multi_adv_enb_privacy(BOOLEAN enable);
 extern char btm_ble_map_adv_tx_power(int tx_power_index);
+extern void btm_ble_batchscan_init(void);
 extern void btm_ble_adv_filter_init(void);
+extern void btm_ble_adv_filter_cleanup(void);
 extern BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request);
 extern BOOLEAN btm_ble_clear_topology_mask(tBTM_BLE_STATE_MASK request_state);
 extern BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 /* BLE address mapping with CS feature */
 extern BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type);
 extern BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type);
 extern void btm_ble_refresh_rra(BD_ADDR pseudo_bda, BD_ADDR rra);
-#endif
 
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
 BT_API extern void btm_ble_set_no_disc_if_pair_fail (BOOLEAN disble_disc);
diff --git a/system/stack/btm/btm_ble_multi_adv.c b/system/stack/btm/btm_ble_multi_adv.c
index 6c0a8a7b4a6..359367ec639 100644
--- a/system/stack/btm/btm_ble_multi_adv.c
+++ b/system/stack/btm/btm_ble_multi_adv.c
@@ -20,7 +20,6 @@
 #include "bt_target.h"
 
 #if (BLE_INCLUDED == TRUE)
-#if BLE_MULTI_ADV_INCLUDED == TRUE
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
@@ -35,25 +34,8 @@
 #define BTM_BLE_MULTI_ADV_WRITE_DATA_LEN                (BTM_BLE_AD_DATA_LEN + 3)
 #define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN           8
 
-#ifndef BTM_BLE_MULTI_ADV_INST_MAX
-#define BTM_BLE_MULTI_ADV_INST_MAX                      5
-#endif
-
 tBTM_BLE_MULTI_ADV_CB  btm_multi_adv_cb;
-
-static void btm_ble_multi_adv_gen_rpa_cmpl_1(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_2(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_3(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p);
-
-typedef void (*tBTM_MULTI_ADV_RPA_CMPL)(tBTM_RAND_ENC *p);
-const tBTM_MULTI_ADV_RPA_CMPL btm_ble_multi_adv_rpa_cmpl [] =
-{
-    btm_ble_multi_adv_gen_rpa_cmpl_1,
-    btm_ble_multi_adv_gen_rpa_cmpl_2,
-    btm_ble_multi_adv_gen_rpa_cmpl_3,
-    btm_ble_multi_adv_gen_rpa_cmpl_4
-};
+tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q;
 
 #define BTM_BLE_MULTI_ADV_CB_EVT_MASK   0xF0
 #define BTM_BLE_MULTI_ADV_SUBCODE_MASK  0x0F
@@ -72,11 +54,11 @@ void btm_ble_multi_adv_enq_op_q(UINT8 opcode, UINT8 inst_id, UINT8 cb_evt)
 {
     tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
 
-    p_op_q->inst_id[p_op_q->next_idx] = inst_id;
+    p_op_q->p_inst_id[p_op_q->next_idx] = inst_id;
 
-    p_op_q->sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
+    p_op_q->p_sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
 
-    p_op_q->next_idx = (p_op_q->next_idx + 1) % BTM_BLE_MULTI_ADV_MAX;
+    p_op_q->next_idx = (p_op_q->next_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
 }
 
 /*******************************************************************************
@@ -93,11 +75,11 @@ void btm_ble_multi_adv_deq_op_q(UINT8 *p_opcode, UINT8 *p_inst_id, UINT8 *p_cb_e
 {
     tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
 
-    *p_inst_id = p_op_q->inst_id[p_op_q->pending_idx] & 0x7F;
-    *p_cb_evt = (p_op_q->sub_code[p_op_q->pending_idx] >> 4);
-    *p_opcode = (p_op_q->sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
+    *p_inst_id = p_op_q->p_inst_id[p_op_q->pending_idx] & 0x7F;
+    *p_cb_evt = (p_op_q->p_sub_code[p_op_q->pending_idx] >> 4);
+    *p_opcode = (p_op_q->p_sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
 
-    p_op_q->pending_idx = (p_op_q->pending_idx + 1) % BTM_BLE_MULTI_ADV_MAX;
+    p_op_q->pending_idx = (p_op_q->pending_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
 }
 
 /*******************************************************************************
@@ -138,7 +120,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         return;
     }
 
-    p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
+    p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     switch (subcode)
     {
@@ -146,7 +128,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status);
         if (status != HCI_SUCCESS)
         {
-            btm_multi_adv_cb.adv_inst[inst_id-1].inst_id = 0;
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
         }
         break;
 
@@ -377,11 +359,35 @@ tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADD
 ** Returns          none.
 **
 *******************************************************************************/
-void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p_inst )
+void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p)
 {
 #if (SMP_INCLUDED == TRUE)
     tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tSMP_ENC    output;
+    UINT8 index = 0;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+     /* Retrieve the index of adv instance from stored Q */
+    if (btm_multi_adv_idx_q.front == -1)
+    {
+        BTM_TRACE_ERROR(" %s can't locate advertise instance", __FUNCTION__);
+        return;
+    }
+    else
+    {
+        index = btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.front];
+        if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear)
+        {
+            btm_multi_adv_idx_q.front = -1;
+            btm_multi_adv_idx_q.rear = -1;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.front = btm_multi_adv_idx_q.front +1 % BTM_BLE_MULTI_ADV_MAX;
+        }
+    }
+
+    p_inst = &(btm_multi_adv_cb.p_adv_inst[index]);
 
     BTM_TRACE_EVENT ("btm_ble_multi_adv_gen_rpa_cmpl inst_id = %d", p_inst->inst_id);
     if (p)
@@ -404,7 +410,7 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p
             p_inst->rpa[4] = output.param_buf[1];
             p_inst->rpa[3] = output.param_buf[2];
 
-            if (p_inst->inst_id != 0)
+            if (p_inst->inst_id != 0 && (p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()))
             {
                 /* set it to controller */
                 btm_ble_multi_adv_write_rpa(p_inst, p_inst->rpa);
@@ -414,65 +420,6 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p
 #endif
 }
 
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl1
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_1(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[0]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl2
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_2(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[1]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl3
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_3(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[2]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl4
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[3]);
-}
 /*******************************************************************************
 **
 ** Function         btm_ble_multi_adv_configure_rpa
@@ -486,7 +433,25 @@ static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p)
 *******************************************************************************/
 void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
 {
-    btm_gen_resolvable_private_addr((void *)p_inst->p_rpa_cback);
+    if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear +1 % BTM_BLE_MULTI_ADV_MAX)
+    {
+        BTM_TRACE_ERROR("outstanding rand generation exceeded max allowed ");
+        return;
+    }
+    else
+    {
+        if (btm_multi_adv_idx_q.front == -1)
+        {
+            btm_multi_adv_idx_q.front = 0;
+            btm_multi_adv_idx_q.rear = 0;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.rear = btm_multi_adv_idx_q.rear +1 % BTM_BLE_MULTI_ADV_MAX;
+        }
+        btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.rear] = p_inst->index;
+    }
+    btm_gen_resolvable_private_addr((void *)btm_ble_multi_adv_gen_rpa_cmpl);
 }
 
 /*******************************************************************************
@@ -502,7 +467,7 @@ void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
 *******************************************************************************/
 void btm_ble_multi_adv_reenable(UINT8 inst_id)
 {
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     if (p_inst->inst_id != 0)
     {
@@ -531,9 +496,9 @@ void btm_ble_multi_adv_reenable(UINT8 inst_id)
 void btm_ble_multi_adv_enb_privacy(BOOLEAN enable)
 {
     UINT8 i;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[0];
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++, p_inst++)
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
     {
         if (enable)
             btm_ble_multi_adv_configure_rpa (p_inst);
@@ -562,21 +527,23 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 {
     UINT8 i;
     tBTM_STATUS rt = BTM_NO_RESOURCES;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[0];
-    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
 
     BTM_TRACE_EVENT("BTM_BleEnableAdvInstance called");
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-    if (0 == cmn_ble_vsc_cb.adv_inst_max)
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
     {
         BTM_TRACE_ERROR("Controller does not support Multi ADV");
         return BTM_ERR_PROCESSING;
     }
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++, p_inst++)
+    if (NULL == p_inst)
+    {
+        BTM_TRACE_ERROR("Invalid instance in BTM_BleEnableAdvInstance");
+        return BTM_ERR_PROCESSING;
+    }
+
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
     {
         if (p_inst->inst_id == 0)
         {
@@ -584,21 +551,28 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 
             /* configure adv parameter */
             if (p_params)
-                btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+                rt = btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+            else
+                rt = BTM_CMD_STARTED;
 
             /* enable adv */
             BTM_TRACE_EVENT("btm_ble_enable_multi_adv being called with inst_id:%d",
                 p_inst->inst_id);
-            if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, BTM_BLE_MULTI_ADV_ENB_EVT))
-                == BTM_CMD_STARTED)
+
+            if (BTM_CMD_STARTED == rt)
             {
-                p_inst->p_cback = p_cback;
-                p_inst->p_ref   = p_ref;
+                if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id,
+                          BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED)
+                {
+                    p_inst->p_cback = p_cback;
+                    p_inst->p_ref   = p_ref;
+                }
             }
-            else
+
+            if (BTM_CMD_STARTED != rt)
             {
                 p_inst->inst_id = 0;
-                BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed, no resources");
+                BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed");
             }
             break;
         }
@@ -622,20 +596,17 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params)
 {
     tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
-    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     BTM_TRACE_EVENT("BTM_BleUpdateAdvInstParam called with inst_id:%d", inst_id);
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-    if (0 == cmn_ble_vsc_cb.adv_inst_max)
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
     {
         BTM_TRACE_ERROR("Controller does not support Multi ADV");
         return BTM_ERR_PROCESSING;
     }
 
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX &&
+    if (inst_id <  BTM_BleMaxMultiAdvInstanceCount() &&
         inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD &&
         p_params != NULL)
     {
@@ -647,9 +618,8 @@ tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_par
         else
             btm_ble_enable_multi_adv(FALSE, inst_id, 0);
 
-        btm_ble_multi_adv_set_params(p_inst, p_params, 0);
-
-        rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
+        if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0))
+            rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
     }
     return rt;
 }
@@ -688,6 +658,7 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
         return BTM_ERR_PROCESSING;
     }
 
+
     BTM_TRACE_EVENT("BTM_BleCfgAdvInstData called with inst_id:%d", inst_id);
     if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD)
         return BTM_ILLEGAL_VALUE;
@@ -737,14 +708,15 @@ tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id)
          return BTM_ERR_PROCESSING;
      }
 
-     if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+     if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+         inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
      {
          if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT))
             == BTM_CMD_STARTED)
          {
-            btu_stop_timer(&btm_multi_adv_cb.adv_inst[inst_id-1].raddr_timer_ent);
-            btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.adv_inst[inst_id-1]);
-            btm_multi_adv_cb.adv_inst[inst_id-1].inst_id = 0;
+            btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id-1]);
+            btu_stop_timer(&btm_multi_adv_cb.p_adv_inst[inst_id-1].raddr_timer_ent);
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
          }
      }
     return rt;
@@ -768,13 +740,14 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
     len--;
 
     BTM_TRACE_EVENT("btm_ble_multi_adv_vse_cback called with event:%d", sub_event);
-    if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len>=4))
+    if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4))
     {
         STREAM_TO_UINT8(adv_inst, p);
         STREAM_TO_UINT8(reason, p);
         STREAM_TO_UINT16(conn_handle, p);
 
-        if (adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
+        if (adv_inst < BTM_BleMaxMultiAdvInstanceCount() &&
+            adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
         {
             BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called");
             btm_ble_multi_adv_reenable(adv_inst);
@@ -785,7 +758,6 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
             if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
             {
                 btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
-
             }
         }
 
@@ -798,22 +770,89 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
 **
 ** Description      This function initialize the multi adv control block.
 **
-** Parameters
+** Parameters       None
 **
-** Returns          status
+** Returns          void
 **
 *******************************************************************************/
-void btm_ble_multi_adv_init(void)
+void btm_ble_multi_adv_init()
 {
-    UINT8 i;
-
+    UINT8 i = 0;
     memset(&btm_multi_adv_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    memset (&btm_multi_adv_idx_q,0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q));
+    btm_multi_adv_idx_q.front = -1;
+    btm_multi_adv_idx_q.rear = -1;
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++)
-        btm_multi_adv_cb.adv_inst[i].p_rpa_cback = btm_ble_multi_adv_rpa_cmpl[i];
+    if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0)
+    {
+        btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                                 (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                               (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_sub_code = GKI_getbuf( sizeof(UINT8) *
+                                                      (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_sub_code, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_inst_id = GKI_getbuf( sizeof(UINT8) *
+                                          (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_inst_id, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+    }
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.adv_inst_max ; i ++)
+        btm_multi_adv_cb.p_adv_inst[i].index = i;
 
     BTM_RegisterForVSEvents(btm_ble_multi_adv_vse_cback, TRUE);
 }
-#endif
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_cleanup
+**
+** Description      This function cleans up multi adv control block.
+**
+** Parameters
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_cleanup(void)
+{
+    if (btm_multi_adv_cb.p_adv_inst)
+        GKI_freebuf(btm_multi_adv_cb.p_adv_inst);
+
+    if (btm_multi_adv_cb.op_q.p_sub_code)
+         GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code);
+
+    if (btm_multi_adv_cb.op_q.p_inst_id)
+        GKI_freebuf(btm_multi_adv_cb.op_q.p_inst_id);
+
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_get_ref
+**
+** Description      This function obtains the reference pointer for the instance ID provided
+**
+** Parameters       inst_id - Instance ID
+**
+** Returns          void*
+**
+*******************************************************************************/
+void* btm_ble_multi_adv_get_ref(UINT8 inst_id)
+{
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+    if (inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+        if (NULL != p_inst)
+            return p_inst->p_ref;
+    }
+
+    return NULL;
+}
 #endif
 
diff --git a/system/stack/btm/btm_devctl.c b/system/stack/btm/btm_devctl.c
index 69618b1059c..910a8925c3f 100644
--- a/system/stack/btm/btm_devctl.c
+++ b/system/stack/btm/btm_devctl.c
@@ -671,9 +671,6 @@ void btm_reset_complete (void)
      btm_cb.ble_ctr_cb.p_select_cback = NULL;
      memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM));
      gatt_reset_bgdev_list();
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-     btm_ble_multi_adv_init();
-#endif
 #endif
     }
 }
diff --git a/system/stack/btu/btu_hcif.c b/system/stack/btu/btu_hcif.c
index 23204a789c8..9a294166edd 100644
--- a/system/stack/btu/btu_hcif.c
+++ b/system/stack/btu/btu_hcif.c
@@ -1125,9 +1125,9 @@ static void btu_hcif_hdl_command_complete (UINT16 opcode, UINT8 *p, UINT16 evt_l
 
         case HCI_BLE_RAND:
         case HCI_BLE_ENCRYPT:
-
             btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback);
             break;
+
         case HCI_BLE_READ_BUFFER_SIZE:
             btm_read_ble_buf_size_complete(p, evt_len);
             break;
diff --git a/system/stack/include/btm_ble_api.h b/system/stack/include/btm_ble_api.h
index 91bb42e1823..13965e68015 100644
--- a/system/stack/include/btm_ble_api.h
+++ b/system/stack/include/btm_ble_api.h
@@ -413,7 +413,8 @@ typedef struct
 }tBTM_BLE_ADV_DATA;
 
 #ifndef BTM_BLE_MULTI_ADV_MAX
-#define BTM_BLE_MULTI_ADV_MAX   4
+#define BTM_BLE_MULTI_ADV_MAX   10 /* controller returned adv_inst_max should be less
+                                      than this number */
 #endif
 
 #define BTM_BLE_MULTI_ADV_INVALID   0
@@ -438,8 +439,8 @@ typedef struct
 
 typedef struct
 {
-    UINT8   sub_code[BTM_BLE_MULTI_ADV_MAX];
-    UINT8   inst_id[BTM_BLE_MULTI_ADV_MAX];
+    UINT8   *p_sub_code; /* dynamic array to store sub code */
+    UINT8   *p_inst_id;  /* dynamic array to store instance id */
     UINT8   pending_idx;
     UINT8   next_idx;
 }tBTM_BLE_MULTI_ADV_OPQ;
@@ -453,14 +454,21 @@ typedef struct
     UINT8                       adv_evt;
     BD_ADDR                     rpa;
     TIMER_LIST_ENT              raddr_timer_ent;
-    void                        *p_rpa_cback;
     tBTM_BLE_MULTI_ADV_CBACK    *p_cback;
     void                        *p_ref;
+    UINT8                       index;
 }tBTM_BLE_MULTI_ADV_INST;
 
 typedef struct
 {
-    tBTM_BLE_MULTI_ADV_INST adv_inst[BTM_BLE_MULTI_ADV_MAX];
+    UINT8 inst_index_queue[BTM_BLE_MULTI_ADV_MAX];
+    int front;
+    int rear;
+}tBTM_BLE_MULTI_ADV_INST_IDX_Q;
+
+typedef struct
+{
+    tBTM_BLE_MULTI_ADV_INST *p_adv_inst; /* dynamic array to store adv instance */
     tBTM_BLE_MULTI_ADV_OPQ  op_q;
 }tBTM_BLE_MULTI_ADV_CB;
 
@@ -690,11 +698,14 @@ typedef struct
 
 #define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
 
+#ifndef BTM_CS_IRK_LIST_MAX
+#define BTM_CS_IRK_LIST_MAX 0x20
+#endif
+
 typedef struct
 {
     BOOLEAN    in_use;
     BD_ADDR    bd_addr;
-    UINT16     feat_mask;      /* per BD_ADDR feature mask */
     UINT8      pf_counter[BTM_BLE_PF_TYPE_MAX]; /* number of filter indexed by tBTM_BLE_PF_COND_TYPE */
 }tBTM_BLE_PF_COUNT;
 
@@ -702,7 +713,7 @@ typedef struct
 {
     BOOLEAN             enable;
     UINT8               op_type;
-    tBTM_BLE_PF_COUNT   addr_filter_count[BTM_BLE_MAX_FILTER_COUNTER]; /* per BDA filter indexed by tBTM_BLE_PF_COND_TYPE */
+    tBTM_BLE_PF_COUNT   *p_addr_filter_count; /* per BDA filter array */
     tBLE_BD_ADDR        cur_filter_target;
     tBTM_BLE_PF_STATUS_CBACK *p_filt_stat_cback;
     tBTM_BLE_ADV_FILTER_ADV_OPQ  op_q;
@@ -1399,7 +1410,16 @@ BTM_API extern void BTM_BleConfigPrivacy(BOOLEAN enable);
 *******************************************************************************/
 BTM_API extern BOOLEAN BTM_BleLocalPrivacyEnabled();
 
-
+/*******************************************************************************
+**
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances  supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount();
 
 /*******************************************************************************
 **
diff --git a/system/stack/include/gap_api.h b/system/stack/include/gap_api.h
index 645323d2c2e..a210f69ef91 100644
--- a/system/stack/include/gap_api.h
+++ b/system/stack/include/gap_api.h
@@ -225,9 +225,6 @@ typedef union
 typedef void (tGAP_BLE_DEV_NAME_CBACK)(BOOLEAN status, BD_ADDR addr, UINT16 length, char *p_name);
 
 typedef void (tGAP_BLE_RECONN_ADDR_CBACK)(BOOLEAN status, BD_ADDR addr, BD_ADDR reconn_bda);
-#if BLE_PRIVACY_SPT == TRUE
-typedef void (tGAP_BLE_PRIVACY_CBACK)(BOOLEAN status, BD_ADDR addr, BOOLEAN privacy_enabled);
-#endif
 
 /*****************************************************************************
 **  External Function Declarations
diff --git a/system/stack/l2cap/l2c_ble.c b/system/stack/l2cap/l2c_ble.c
index 0b77b7884f0..c1bb989e3cc 100644
--- a/system/stack/l2cap/l2c_ble.c
+++ b/system/stack/l2cap/l2c_ble.c
@@ -35,15 +35,7 @@
 #define L2CA_GET_UPD_ST(x)          ((x) & UPD_ST_MASK)
 #define L2CA_SET_UPD_ST(x, y)      x = (((x) & ~UPD_ST_MASK) | (y))
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#else
-#if BLE_PRIVACY_SPT == TRUE
-extern BOOLEAN btm_ble_get_acl_remote_addr(tBTM_SEC_DEV_REC *p_dev_rec, BD_ADDR conn_addr,
-                                    tBLE_ADDR_TYPE *p_addr_type);
-#endif
-#endif
-
 /*******************************************************************************
 **
 **  Function        L2CA_CancelBleConnectReq
@@ -647,17 +639,13 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
         L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation");
         return FALSE;
     }
-#if BLE_PRIVACY_SPT == TRUE
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-    extern tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
-    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
-        BTM_BleEnableIRKFeature(TRUE);
-
-    btm_random_pseudo_to_public(init_addr, &init_addr_type);
-#else
-    btm_ble_get_acl_remote_addr(p_dev_rec, init_addr, &init_addr_type);
-#endif
-#endif
+    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec) &&
+        (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE ))
+    {
+        btm_ble_vendor_enable_irk_feature(TRUE);
+        btm_random_pseudo_to_public(init_addr, &init_addr_type);
+    }
+
     if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int      */
                                         scan_win, /* UINT16 scan_win      */
                                         FALSE,                   /* UINT8 white_list     */
diff --git a/system/stack/smp/aes.c b/system/stack/smp/aes.c
index d3d8ff61041..d2e86cd7c0e 100644
--- a/system/stack/smp/aes.c
+++ b/system/stack/smp/aes.c
@@ -510,7 +510,7 @@ return_type aes_set_key( const unsigned char key[], length_type keylen, aes_cont
         keylen = 24;
         break;
     case 32:
-    /*    case 256:           length in bits (256 = 8*32) */ 
+    /*    case 256:           length in bits (256 = 8*32) */
         keylen = 32;
         break;
     default:
diff --git a/system/vnd/ble/bta_vendor.c b/system/vnd/ble/bta_vendor.c
deleted file mode 100644
index 3201c0b79b3..00000000000
--- a/system/vnd/ble/bta_vendor.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/*****************************************************************************
-**
-**  Name:           bta_vendor.c
-**
-**  Description:    This is the implementation VENDOR custom Ble APIs
-**
-*****************************************************************************/
-
-#include "bta_api.h"
-#include "bta_vendor_api.h"
-#include "bta_sys_int.h"
-#include "bta_dm_int.h"
-#include "vendor_api.h"
-#include "vendor_ble.h"
-#include <string.h>
-
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
-
-static tBTA_DM_SCAN_PF_CBACK *bta_vendor_ble_scan_pf_cmpl_cback = NULL;
-
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_cmpl
-**
-** Description      ADV payload filtering operation complete callback
-**
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-static void bta_vendor_ble_scan_pf_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_PF_COND_TYPE cfg_cond, tBTM_STATUS status)
-{
-    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-
-    if (bta_vendor_ble_scan_pf_cmpl_cback)
-        ((tBTA_DM_SCAN_PF_CBACK *) bta_vendor_ble_scan_pf_cmpl_cback)(action, cfg_cond, st);
-
-}
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_enable
-**
-** Description      This function processes events for enabling adv payload filtering
-**                  feature
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_ble_scan_pf_enable(tBTA_SYS_VS_BLE_SCAN_PF_ENABLE *p_data)
-{
-    tBTM_STATUS st;
-    tBTA_STATUS status;
-
-    if ((st = BTM_BleEnableFilterCondition(p_data->enable,
-                                     p_data->p_target,
-                                     (tBTM_BLE_PF_CMPL_CBACK *)p_data->p_cmpl_cback))
-            == BTM_CMD_STARTED)
-    {
-        bta_vendor_ble_scan_pf_cmpl_cback = (tBTA_DM_SCAN_PF_CBACK *)p_data->p_cmpl_cback;
-    }
-    else
-    {
-        status = (st == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-        if (p_data->p_cmpl_cback)
-            ((tBTA_DM_SCAN_PF_CBACK *) p_data->p_cmpl_cback)(BTA_DM_BLE_PF_CONFIG_EVT, 0, status);
-    }
-
-    return TRUE;
-}
-
-
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_condition
-**
-** Description      This function processes events for configuring the ADV filtering
-**                  condition
-**
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_ble_scan_pf_condition(tBTA_SYS_VS_BLE_SCAN_PF_COND *p_data)
-{
-    tBTM_STATUS st;
-    tBTA_STATUS status;
-
-    if ((st = BTM_BleCfgFilterCondition(p_data->action,
-                              p_data->cond_type,
-                                        (tBTM_BLE_PF_COND_PARAM *)p_data->p_cond,
-                                        bta_vendor_ble_scan_pf_cmpl))
-            == BTM_CMD_STARTED)
-    {
-        bta_vendor_ble_scan_pf_cmpl_cback = (tBTA_DM_SCAN_PF_CBACK *)p_data->p_cmpl_cback;
-    }
-    else
-    {
-        status = (st == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-        if (p_data->p_cmpl_cback)
-            ((tBTA_DM_SCAN_PF_CBACK *) p_data->p_cmpl_cback)(BTA_DM_BLE_PF_CONFIG_EVT, p_data->cond_type, status);
-    }
-    return TRUE;
-}
-#endif
-/*******************************************************************************
-**
-** Function         bta_vendor_evt_hdlr
-**
-** Description      This function processes events for Broadcom specific features.
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_evt_hdlr(UINT16 event, void *p)
-{
-    BOOLEAN   st = TRUE;
-
-    APPL_TRACE_EVENT("bta_vendor_evt_hdlr :0x%04x", event);
-
-    switch (event)
-    {
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    case BTA_VS_BLE_SCAN_PF_ENABLE_EVT:
-        st = bta_vendor_ble_scan_pf_enable((tBTA_SYS_VS_BLE_SCAN_PF_ENABLE *)p);
-        break;
-
-    case BTA_VS_BLE_SCAN_PF_COND_EVT:
-        bta_vendor_ble_scan_pf_condition((tBTA_SYS_VS_BLE_SCAN_PF_COND*)p);
-        break;
-#endif
-
-    default:
-        APPL_TRACE_EVENT("Unknown BTA VS event: %d", event);
-        st = FALSE;
-        break;
-    }
-
-    return st;
-}
-
-
-
-/*******************************************************************************
-**
-** Function         BTA_DmBleCfgFilterCondition
-**
-** Description      This function is called to configure the adv data payload filter
-**                  condition.
-**
-** Parameters       action: to read/write/clear
-**                  cond_type: filter condition type.
-**                  p_cond: filter condition paramter
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
-                                 tBTA_DM_BLE_PF_COND_TYPE cond_type,
-                                 tBTA_DM_BLE_PF_COND_PARAM *p_cond,
-                                 tBTA_DM_SCAN_PF_CBACK *p_cmpl_cback)
-{
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    tBTA_DM_API_CFG_FILTER_COND *p_msg;
-    UINT16  len = sizeof(tBTA_DM_API_CFG_FILTER_COND) + sizeof(tBTA_DM_BLE_PF_COND_PARAM) + \
-                BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + sizeof(tBTA_DM_BLE_PF_COND_MASK);
-
-    UINT8 *p;
-
-    if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL)
-    {
-        memset (p_msg, 0, len);
-
-        p_msg->hdr.event        = BTA_DM_API_CFG_FILTER_COND_EVT;
-        p_msg->action           = action;
-        p_msg->cond_type        = cond_type;
-        p_msg->p_cmpl_cback     = (void *) p_cmpl_cback;
-
-        if (p_cond)
-        {
-            p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1);
-            memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
-
-            p = (UINT8 *)(p_msg->p_cond_param + 1);
-
-            if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN ||cond_type == BTA_DM_BLE_PF_MANU_DATA)
-            {
-                p_msg->p_cond_param->manu_data.p_pattern = p;
-                p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
-                memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern, p_cond->manu_data.data_len);
-                p += p_cond->manu_data.data_len;
-
-                if (cond_type == BTA_DM_BLE_PF_MANU_DATA)
-                {
-                    p_msg->p_cond_param->manu_data.company_id_mask = p_cond->manu_data.company_id_mask;
-                    if ( p_cond->manu_data.p_pattern_mask != NULL)
-                    {
-                        p_msg->p_cond_param->manu_data.p_pattern_mask = p;
-                        memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask, p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
-                    }
-                }
-            }
-            else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME)
-            {
-                p_msg->p_cond_param->local_name.p_data = p;
-                memcpy(p_msg->p_cond_param->local_name.p_data, p_cond->local_name.p_data, p_cond->local_name.data_len);
-
-            }
-            else if ((cond_type == BTM_BLE_PF_SRVC_UUID || cond_type == BTM_BLE_PF_SRVC_SOL_UUID))
-            {
-                if (p_cond->srvc_uuid.p_target_addr != NULL)
-                {
-                    p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p);
-                    p_msg->p_cond_param->srvc_uuid.p_target_addr->type = p_cond->srvc_uuid.p_target_addr->type;
-                    memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda, p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
-                    p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1);
-                }
-                if (p_cond->srvc_uuid.p_uuid_mask)
-                {
-                    p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p;
-                    memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask, p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK));
-                }
-            }
-        }
-
-        bta_sys_sendmsg(p_msg);
-    }
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         BTA_DmBleEnableFilterCondition
-**
-** Description      This function is called to enable the adv data payload filter
-**                  condition.
-**
-** Parameters       p_target: enabble the filter condition on a target device; if NULL
-**                            enable the generic scan condition.
-**                  enable: enable or disable the filter condition
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_DmBleEnableFilterCondition(BOOLEAN enable, tBLE_BD_ADDR *p_target, tBTA_DM_SCAN_PF_CBACK *p_cmpl_cback)
-{
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg;
-    UINT16  len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR);
-
-    if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL)
-    {
-        memset (p_msg, 0, len);
-
-        p_msg->hdr.event        = BTA_DM_API_ENABLE_SCAN_FILTER_EVT;
-        p_msg->enable       = enable;
-        p_msg->p_cmpl_cback     = (void *) p_cmpl_cback;
-
-        if (p_target)
-        {
-            p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1);
-            memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR));
-        }
-
-        bta_sys_sendmsg(p_msg);
-    }
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         BTA_BrcmInit
-**
-** Description      This function initializes Broadcom specific
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_BrcmInit (void)
-{
-    APPL_TRACE_API("BTA_BrcmInit");
-    bta_sys_cb.p_vs_evt_hdlr = bta_vendor_evt_hdlr;
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    btm_ble_vendor_init();
-#endif
-}
-
-
diff --git a/system/vnd/ble/vendor_ble.c b/system/vnd/ble/vendor_ble.c
index e00d5e24ccf..ca3dd25a209 100644
--- a/system/vnd/ble/vendor_ble.c
+++ b/system/vnd/ble/vendor_ble.c
@@ -26,7 +26,7 @@
 #include <string.h>
 #include "bt_target.h"
 
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+#if (BLE_INCLUDED == TRUE)
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
@@ -41,14 +41,10 @@ tBTM_BLE_VENDOR_CB  btm_ble_vendor_cb;
 
 static const BD_ADDR     na_bda= {0};
 
-
 /*******************************************************************************
 **         Resolve Address Using IRK List functions
 *******************************************************************************/
 
-#if BLE_PRIVACY_SPT == TRUE
-/* Forward declaration */
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
 
 /*******************************************************************************
 **
@@ -64,6 +60,7 @@ tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
 *******************************************************************************/
 void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
 
     memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN);
@@ -71,8 +68,8 @@ void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT
     p_q->irk_q_action[p_q->q_next] = to_add;
 
     p_q->q_next ++;
-    p_q->q_next %= BTM_CS_IRK_LIST_MAX;
-
+    p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;;
+#endif
     return ;
 }
 /*******************************************************************************
@@ -89,6 +86,7 @@ void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
     UINT8   i;
 
@@ -99,8 +97,9 @@ BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
             return TRUE;
 
         i ++;
-        i %= BTM_CS_IRK_LIST_MAX;
+        i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
     }
+#endif
     return FALSE;
 }
 /*******************************************************************************
@@ -117,6 +116,7 @@ BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
 
     if (p_q->q_next != p_q->q_pending)
@@ -125,11 +125,11 @@ BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
         memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN);
 
         p_q->q_pending ++;
-        p_q->q_pending %= BTM_CS_IRK_LIST_MAX;
+        p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
 
         return TRUE;
     }
-
+#endif
     return FALSE;
 
 }
@@ -144,16 +144,18 @@ BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
 *******************************************************************************/
 tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0)
         {
             return p_irk_entry ;
         }
     }
+#endif
     return NULL;
 }
 /*******************************************************************************
@@ -167,16 +169,18 @@ tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
 *******************************************************************************/
 tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0)
         {
             return p_irk_entry ;
         }
     }
+#endif
     return NULL;
 }
 /*******************************************************************************
@@ -190,10 +194,11 @@ tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psued
 *******************************************************************************/
 UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (!p_irk_entry->in_use)
         {
@@ -206,6 +211,7 @@ UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
             return i;
         }
     }
+#endif
     return BTM_CS_IRK_LIST_INVALID;
 }
 
@@ -220,6 +226,7 @@ UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
 *******************************************************************************/
 void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY   *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda);
     UINT8       i;
 
@@ -248,6 +255,7 @@ void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOL
             BTM_TRACE_ERROR("No IRK exist in list, can not remove");
         }
     }
+#endif
     return ;
 }
 /*******************************************************************************
@@ -277,13 +285,18 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 
     op_subcode   = *p ++;
     BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode);
-    if (evt_len < 2 )
+    if (evt_len < 1)
     {
-        BTM_TRACE_ERROR("can not interpret IRK  VSC cmpl callback");
+        BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback");
         return;
     }
 
-
+    if (BTM_BLE_META_IRK_ENABLE == op_subcode)
+    {
+        BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode);
+        return;
+    }
+    else
     if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST)
     {
         if (status == HCI_SUCCESS)
@@ -293,7 +306,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 
             BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size);
 
-            for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++)
+            for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++)
                 memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY));
         }
     }
@@ -349,10 +362,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
             p += (1 + 16 + 1); /* skip index, IRK value, address type */
             STREAM_TO_BDADDR(target_bda, p);
             STREAM_TO_BDADDR(rra, p);
-
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
             btm_ble_refresh_rra(target_bda, rra);
-#endif
         }
     }
 
@@ -371,6 +381,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 *******************************************************************************/
 tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st;
     tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
@@ -393,7 +404,8 @@ tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
     }
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 /*******************************************************************************
 **
@@ -408,6 +420,7 @@ tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st;
 
@@ -422,7 +435,8 @@ tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
                                     btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 /*******************************************************************************
 **
@@ -437,6 +451,7 @@ tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
 *******************************************************************************/
 tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_UNKNOWN_ADDR;
     tBTM_BLE_IRK_ENTRY *p_entry = btm_ble_vendor_find_irk_entry(target_bda);
@@ -456,7 +471,8 @@ tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
                                     btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 
 
@@ -474,6 +490,7 @@ tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
 *******************************************************************************/
 void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8               i;
     UINT8               count = 0;
     tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
@@ -489,8 +506,8 @@ void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
     }
 
     if ((count > 0 && enable) || !enable)
-        BTM_BleEnableIRKFeature(enable);
-
+        btm_ble_vendor_enable_irk_feature(enable);
+#endif
     return ;
 }
 /*******************************************************************************
@@ -506,6 +523,7 @@ void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[40], *p;
     tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
     BOOLEAN         rt = FALSE;
@@ -553,6 +571,8 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
         BTM_TRACE_DEBUG("Device not a RPA enabled device");
     }
     return rt;
+#endif
+    return FALSE;
 }
 /*******************************************************************************
 **
@@ -567,6 +587,7 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_VENDOR_CB  *p_cs_cb = &btm_ble_vendor_cb;
     tBTM_BLE_IRK_ENTRY *p_irk_entry;
 
@@ -581,7 +602,8 @@ void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
     }
 
     if (p_cs_cb->irk_list_size == 0)
-        BTM_BleEnableIRKFeature(FALSE);
+        btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
 }
 /*******************************************************************************
 **
@@ -596,13 +618,14 @@ void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 void btm_ble_vendor_disable_irk_list(void)
 {
-    BTM_BleEnableIRKFeature(FALSE);
-
+#if BLE_PRIVACY_SPT == TRUE
+    btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
 }
 
 /*******************************************************************************
 **
-** Function         BTM_BleEnableIRKFeature
+** Function         btm_ble_vendor_enable_irk_feature
 **
 ** Description      This function is called to enable or disable the RRA
 **                  offloading feature.
@@ -612,8 +635,9 @@ void btm_ble_vendor_disable_irk_list(void)
 ** Returns          BTM_SUCCESS if successful
 **
 *******************************************************************************/
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable)
+tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_WRONG_MODE;
     tBTM_BLE_PF_COUNT *p_bda_filter;
@@ -629,9 +653,75 @@ tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable)
                                param, btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 
 #endif
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_init
+**
+** Description      Initialize customer specific feature information in host stack
+**
+** Parameters  Max IRK list size
+**                   Max filter supported
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_init(UINT8 max_irk_list_sz)
+{
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+
+#if BLE_PRIVACY_SPT == TRUE
+    if (max_irk_list_sz > 0)
+    {
+        btm_ble_vendor_cb.irk_list =  (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY)
+                                                                        * max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q =  (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) *
+                                                                     max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) *
+                                                                                 max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz);
+    }
+
+    btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz;
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return;
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_cleanup
+**
+** Description      Cleanup VSC specific dynamic memory
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_cleanup(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    if (btm_ble_vendor_cb.irk_list)
+        GKI_freebuf(btm_ble_vendor_cb.irk_list);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q)
+       GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_action)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action);
 #endif
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+}
+
 
 
diff --git a/system/vnd/include/bta_vendor_api.h b/system/vnd/include/bta_vendor_api.h
deleted file mode 100644
index 9ff5d30d0f8..00000000000
--- a/system/vnd/include/bta_vendor_api.h
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/*****************************************************************************
-**
-**  Name:           bta_vendor_api.h
-**
-**  Description:       VENDOR custom Ble API Bluetooth application definitions
-**
-*****************************************************************************/
-#ifndef BTA_VENDOR_API_H
-#define BTA_VENDOR_API_H
-
-#include "bta_api.h"
-#include "bta_sys.h"
-#include "vendor_api.h"
-
-
-
-
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
-
-/*******************************************************************************
-**
-** Function         BTA_BrcmInit
-**
-** Description      This function initializes Broadcom specific VS handler in BTA
-**
-** Returns          void
-**
-*******************************************************************************/
-BTA_API extern void BTA_BrcmInit (void);
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
-
diff --git a/system/vnd/include/vendor_ble.h b/system/vnd/include/vendor_ble.h
index bd4aa330700..6207c8426a9 100644
--- a/system/vnd/include/vendor_ble.h
+++ b/system/vnd/include/vendor_ble.h
@@ -61,10 +61,7 @@
 #define BTM_BLE_PF_SRVC_DATA_PATTERN_BIT    BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA_PATTERN)
 typedef UINT8 tBTM_BLE_PF_SEL_MASK;
 
-
-#ifndef BTM_CS_IRK_LIST_MAX
-#define BTM_CS_IRK_LIST_MAX     0x20
-#endif
+#define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
 
 #define BTM_CS_IRK_LIST_INVALID     0xff
 
@@ -79,9 +76,9 @@ typedef struct
 
 typedef struct
 {
-    BD_ADDR         irk_q[BTM_CS_IRK_LIST_MAX];
-    BD_ADDR         irk_q_random_pseudo[BTM_CS_IRK_LIST_MAX];
-    UINT8           irk_q_action[BTM_CS_IRK_LIST_MAX];
+    BD_ADDR         *irk_q;
+    BD_ADDR         *irk_q_random_pseudo;
+    UINT8           *irk_q_action;
     UINT8           q_next;
     UINT8           q_pending;
 } tBTM_BLE_IRK_Q;
@@ -92,14 +89,13 @@ typedef struct
     BOOLEAN             enable;
 
     UINT8               op_type;
-    tBTM_BLE_PF_COUNT   addr_filter_count[BTM_BLE_MAX_FILTER_COUNTER]; /* per BDA filter indexed by tBTM_BLE_PF_COND_TYPE */
     tBLE_BD_ADDR        cur_filter_target;
 
     UINT8               irk_list_size;
     UINT8               irk_avail_size;
-    tBTM_BLE_IRK_ENTRY  irk_list[BTM_CS_IRK_LIST_MAX];
+    tBTM_BLE_IRK_ENTRY  *irk_list;
     tBTM_BLE_IRK_Q      irk_pend_q;
-
+    UINT8                max_filter_supported;
     tBTM_BLE_PF_CMPL_CBACK *p_scan_pf_cback;
 }tBTM_BLE_VENDOR_CB;
 
@@ -122,8 +118,11 @@ extern BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec);
 extern void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec);
 extern tBTM_STATUS btm_ble_enable_vendor_feature (BOOLEAN enable, UINT32 feature_bit);
 
-extern void btm_ble_vendor_init(void);
+extern void btm_ble_vendor_init(UINT8 max_irk_list_sz);
+extern void btm_ble_vendor_cleanup(void);
 extern BOOLEAN btm_ble_vendor_write_device_wl_attribute (tBLE_ADDR_TYPE addr_type, BD_ADDR bd_addr, UINT8 attribute);
+extern tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable);
+
 #ifdef __cplusplus
 }
 #endif
-- 
GitLab