Merge "Add liblog dependency to libbt-vendor."
diff --git a/bta/av/bta_av_main.cc b/bta/av/bta_av_main.cc
index c8adbe9..ac5ccab 100644
--- a/bta/av/bta_av_main.cc
+++ b/bta/av/bta_av_main.cc
@@ -456,14 +456,14 @@
                         BTA_ID_AV);
 #endif
 
-        /* Both Audio Source and Audio Sink support AVRCP 1.6 for the
-         * major roles (i.e. Audio Source -> TG 1.6 and vice versa). For
+        /* Both Audio Source and Audio Sink support AVRCP 1.4 for the
+         * major roles (i.e. Audio Source -> TG 1.4 and vice versa). For
          * Audio Sink role we support additional TG 1.3 to support
          * absolute volume. Here we only do TG registration.
          */
         uint16_t profile_version = AVRC_REV_1_0;
         if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) {
-          profile_version = AVRC_REV_1_6;
+          profile_version = AVRC_REV_1_4;
         } else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) {
           // Initialize AVRCP1.4 to provide Absolute Volume control.
           profile_version = AVRC_REV_1_4;
diff --git a/btif/src/btif_ble_advertiser.cc b/btif/src/btif_ble_advertiser.cc
index f274de2..395bc1d 100644
--- a/btif/src/btif_ble_advertiser.cc
+++ b/btif/src/btif_ble_advertiser.cc
@@ -59,6 +59,29 @@
   return OwnedArrayWrapper<T>(o);
 }
 
+void parseParams(tBTM_BLE_ADV_PARAMS* p_params,
+                 const AdvertiseParameters& params) {
+  p_params->advertising_event_properties = params.advertising_event_properties;
+  p_params->adv_int_min = params.min_interval;
+  p_params->adv_int_max = params.max_interval;
+  p_params->channel_map = params.channel_map;
+  p_params->adv_filter_policy = 0;
+  p_params->tx_power = params.tx_power;
+  p_params->primary_advertising_phy = params.primary_advertising_phy;
+  p_params->secondary_advertising_phy = params.secondary_advertising_phy;
+  p_params->scan_request_notification_enable =
+      params.scan_request_notification_enable;
+}
+
+void parsePeriodicParams(tBLE_PERIODIC_ADV_PARAMS* p_periodic_params,
+                         PeriodicAdvertisingParameters periodic_params) {
+  p_periodic_params->enable = periodic_params.enable;
+  p_periodic_params->min_interval = periodic_params.min_interval;
+  p_periodic_params->max_interval = periodic_params.max_interval;
+  p_periodic_params->periodic_advertising_properties =
+      periodic_params.periodic_advertising_properties;
+}
+
 class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
   ~BleAdvertiserInterfaceImpl(){};
 
@@ -84,36 +107,18 @@
              base::Unretained(BleAdvertisingManager::Get()), advertiser_id));
   }
 
-  void SetParametersCb(StatusCallback cb, uint8_t status) {
-    LOG(INFO) << __func__ << " status: " << +status;
-    do_in_jni_thread(Bind(cb, status));
-  }
+  void SetParameters(uint8_t advertiser_id, AdvertiseParameters params,
+                     ParametersCallback cb) override {
+    VLOG(1) << __func__;
 
-  void SetParameters(uint8_t advertiser_id,
-                     uint16_t advertising_event_properties,
-                     uint32_t min_interval, uint32_t max_interval, int chnl_map,
-                     int tx_power, uint8_t primary_advertising_phy,
-                     uint8_t secondary_advertising_phy,
-                     uint8_t scan_request_notification_enable,
-                     StatusCallback cb) {
-    tBTM_BLE_ADV_PARAMS* params = new tBTM_BLE_ADV_PARAMS;
+    tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
+    parseParams(p_params, params);
 
-    params->advertising_event_properties = advertising_event_properties;
-    params->adv_int_min = min_interval;
-    params->adv_int_max = max_interval;
-    params->channel_map = chnl_map;
-    params->adv_filter_policy = 0;
-    params->tx_power = tx_power;
-    params->primary_advertising_phy = primary_advertising_phy;
-    params->secondary_advertising_phy = secondary_advertising_phy;
-    params->scan_request_notification_enable = scan_request_notification_enable;
-
-    do_in_bta_thread(FROM_HERE,
-                     Bind(&BleAdvertisingManager::SetParameters,
-                          base::Unretained(BleAdvertisingManager::Get()),
-                          advertiser_id, base::Owned(params),
-                          Bind(&BleAdvertiserInterfaceImpl::SetParametersCb,
-                               base::Unretained(this), cb)));
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetParameters,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             base::Owned(p_params), jni_thread_wrapper(FROM_HERE, cb)));
   }
 
   void SetData(int advertiser_id, bool set_scan_rsp, vector<uint8_t> data,
@@ -146,17 +151,7 @@
     VLOG(1) << __func__;
 
     tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
-    p_params->advertising_event_properties =
-        params.advertising_event_properties;
-    p_params->adv_int_min = params.min_interval;
-    p_params->adv_int_max = params.max_interval;
-    p_params->channel_map = params.channel_map;
-    p_params->adv_filter_policy = 0;
-    p_params->tx_power = params.tx_power;
-    p_params->primary_advertising_phy = params.primary_advertising_phy;
-    p_params->secondary_advertising_phy = params.secondary_advertising_phy;
-    p_params->scan_request_notification_enable =
-        params.scan_request_notification_enable;
+    parseParams(p_params, params);
 
     do_in_bta_thread(
         FROM_HERE,
@@ -167,33 +162,20 @@
              timeout_s, jni_thread_wrapper(FROM_HERE, timeout_cb)));
   }
 
-  void StartAdvertisingSet(IdStatusCallback cb, AdvertiseParameters params,
+  void StartAdvertisingSet(IdTxPowerStatusCallback cb,
+                           AdvertiseParameters params,
                            std::vector<uint8_t> advertise_data,
                            std::vector<uint8_t> scan_response_data,
                            PeriodicAdvertisingParameters periodic_params,
                            std::vector<uint8_t> periodic_data, int timeout_s,
-                           IdStatusCallback timeout_cb) {
+                           IdStatusCallback timeout_cb) override {
     VLOG(1) << __func__;
 
     tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
-    p_params->advertising_event_properties =
-        params.advertising_event_properties;
-    p_params->adv_int_min = params.min_interval;
-    p_params->adv_int_max = params.max_interval;
-    p_params->channel_map = params.channel_map;
-    p_params->adv_filter_policy = 0;
-    p_params->tx_power = params.tx_power;
-    p_params->primary_advertising_phy = params.primary_advertising_phy;
-    p_params->secondary_advertising_phy = params.secondary_advertising_phy;
-    p_params->scan_request_notification_enable =
-        params.scan_request_notification_enable;
+    parseParams(p_params, params);
 
     tBLE_PERIODIC_ADV_PARAMS* p_periodic_params = new tBLE_PERIODIC_ADV_PARAMS;
-    p_periodic_params->enable = periodic_params.enable;
-    p_periodic_params->min_interval = periodic_params.min_interval;
-    p_periodic_params->max_interval = periodic_params.max_interval;
-    p_periodic_params->periodic_advertising_properties =
-        periodic_params.periodic_advertising_properties;
+    parsePeriodicParams(p_periodic_params, periodic_params);
 
     do_in_bta_thread(
         FROM_HERE,
@@ -203,7 +185,46 @@
              std::move(advertise_data), std::move(scan_response_data),
              base::Owned(p_periodic_params), std::move(periodic_data),
              timeout_s, jni_thread_wrapper(FROM_HERE, timeout_cb)));
-  };
+  }
+
+  void SetPeriodicAdvertisingParameters(
+      int advertiser_id, PeriodicAdvertisingParameters periodic_params,
+      StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
+
+    tBLE_PERIODIC_ADV_PARAMS* p_periodic_params = new tBLE_PERIODIC_ADV_PARAMS;
+    parsePeriodicParams(p_periodic_params, periodic_params);
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingParameters,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             base::Owned(p_periodic_params),
+             jni_thread_wrapper(FROM_HERE, cb)));
+  }
+
+  void SetPeriodicAdvertisingData(int advertiser_id, std::vector<uint8_t> data,
+                                  StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingData,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
+  }
+
+  void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
+                                    StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id
+            << " ,enable: " << enable;
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingEnable,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             enable, jni_thread_wrapper(FROM_HERE, cb)));
+  }
 };
 
 BleAdvertiserInterface* btLeAdvertiserInstance = nullptr;
diff --git a/service/test/low_energy_advertiser_unittest.cc b/service/test/low_energy_advertiser_unittest.cc
index eb2211c..d7b0632 100644
--- a/service/test/low_energy_advertiser_unittest.cc
+++ b/service/test/low_energy_advertiser_unittest.cc
@@ -47,31 +47,27 @@
 
   MOCK_METHOD1(RegisterAdvertiser, void(IdStatusCallback));
   MOCK_METHOD1(Unregister, void(uint8_t));
-  MOCK_METHOD10(SetParameters,
-                void(uint8_t advertiser_id,
-                     uint16_t advertising_event_properties,
-                     uint32_t min_interval, uint32_t max_interval, int chnl_map,
-                     int tx_power, uint8_t primary_advertising_phy,
-                     uint8_t secondary_advertising_phy,
-                     uint8_t scan_request_notification_enable,
-                     StatusCallback cb));
-  MOCK_METHOD4(SetData, void(int advertiser_id, bool set_scan_rsp,
-                             std::vector<uint8_t> data, StatusCallback cb));
+  MOCK_METHOD3(SetParameters,
+               void(uint8_t, AdvertiseParameters, ParametersCallback));
+  MOCK_METHOD4(SetData, void(int, bool, std::vector<uint8_t>, StatusCallback));
   MOCK_METHOD5(Enable,
-               void(uint8_t advertiser_id, bool enable, StatusCallback cb,
-                    int timeout_s, StatusCallback timeout_cb));
+               void(uint8_t, bool, StatusCallback, int, StatusCallback));
   MOCK_METHOD7(StartAdvertising,
                void(uint8_t advertiser_id, StatusCallback cb,
                     AdvertiseParameters, std::vector<uint8_t>,
                     std::vector<uint8_t>, int, StatusCallback));
-
   MOCK_METHOD8(StartAdvertisingSet,
-               void(IdStatusCallback cb, AdvertiseParameters params,
+               void(IdTxPowerStatusCallback cb, AdvertiseParameters params,
                     std::vector<uint8_t> advertise_data,
                     std::vector<uint8_t> scan_response_data,
                     PeriodicAdvertisingParameters periodic_params,
                     std::vector<uint8_t> periodic_data, int timeout_s,
                     IdStatusCallback timeout_cb));
+  MOCK_METHOD3(SetPeriodicAdvertisingParameters,
+               void(int, PeriodicAdvertisingParameters, StatusCallback));
+  MOCK_METHOD3(SetPeriodicAdvertisingData,
+               void(int, std::vector<uint8_t>, StatusCallback));
+  MOCK_METHOD3(SetPeriodicAdvertisingEnable, void(int, bool, StatusCallback));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockAdvertiserHandler);
diff --git a/stack/btm/ble_advertiser_hci_interface.cc b/stack/btm/ble_advertiser_hci_interface.cc
index c527278..886770e 100644
--- a/stack/btm/ble_advertiser_hci_interface.cc
+++ b/stack/btm/ble_advertiser_hci_interface.cc
@@ -72,6 +72,23 @@
   command_complete.Run(status);
 }
 
+void parameters_response_parser(BleAdvertiserHciInterface::parameters_cb cb,
+                                uint8_t* ret_params, uint16_t ret_params_len) {
+  uint8_t status;
+  int8_t tx_power;
+
+  uint8_t* pp = ret_params;
+  STREAM_TO_UINT8(status, pp);
+  STREAM_TO_INT8(tx_power, pp);
+
+  cb.Run(status, tx_power);
+}
+
+void known_tx_pwr(BleAdvertiserHciInterface::parameters_cb cb, int8_t tx_power,
+                  uint8_t status) {
+  cb.Run(status, tx_power);
+}
+
 class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
   void SendAdvCmd(const tracked_objects::Location& posted_from,
                   uint8_t param_len, uint8_t* param_buf,
@@ -100,7 +117,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
     uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN];
     memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN);
@@ -119,7 +136,7 @@
     } else {
       LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                  << properties;
-      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
+      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0);
       return;
     }
 
@@ -132,8 +149,9 @@
     UINT8_TO_STREAM(pp, handle);
     INT8_TO_STREAM(pp, tx_power);
 
-    SendAdvCmd(FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
-               command_complete);
+    SendAdvCmd(
+        FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
+        base::Bind(&known_tx_pwr, std::move(command_complete), tx_power));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
@@ -224,14 +242,9 @@
   bool QuirkAdvertiserZeroHandle() override {
     // Android BT HCI Requirements version 0.96 and below specify that handle 0
     // is equal to standard HCI interface, and should be accessed using non-VSC
-    // commands. Broadcom controllers are strict about this requirement, so
-    // don't use 0 handle.
-    if (BTM_IS_BRCM_CONTROLLER()) {
-      LOG(INFO) << "QuirkAdvertiserZeroHandle in use";
-      return true;
-    }
-
-    return false;
+    // commands.
+    LOG(INFO) << "QuirkAdvertiserZeroHandle in use";
+    return true;
   }
 
   void RemoveAdvertisingSet(uint8_t handle,
@@ -302,7 +315,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
 
     uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS];
@@ -320,7 +333,7 @@
     } else {
       LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                  << properties;
-      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
+      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0);
       return;
     }
 
@@ -330,8 +343,10 @@
     UINT8_TO_STREAM(pp, channel_map);
     UINT8_TO_STREAM(pp, filter_policy);
 
-    SendAdvCmd(FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param,
-               HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete);
+    SendAdvCmd(
+        FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param,
+        HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS,
+        base::Bind(&known_tx_pwr, std::move(command_complete), (int8_t)0));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
@@ -446,7 +461,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
     const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25;
     uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN];
@@ -469,8 +484,10 @@
     UINT8_TO_STREAM(pp, advertising_sid);
     UINT8_TO_STREAM(pp, scan_request_notify_enable);
 
-    SendAdvCmd(FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
-               HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete);
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
+        HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN,
+        base::Bind(parameters_response_parser, std::move(command_complete)));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
diff --git a/stack/btm/ble_advertiser_hci_interface.h b/stack/btm/ble_advertiser_hci_interface.h
index 5a9fd4f..7797ce8 100644
--- a/stack/btm/ble_advertiser_hci_interface.h
+++ b/stack/btm/ble_advertiser_hci_interface.h
@@ -29,6 +29,8 @@
 class BleAdvertiserHciInterface {
  public:
   using status_cb = base::Callback<void(uint8_t /* status */)>;
+  using parameters_cb =
+      base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
 
   static void Initialize();
   static BleAdvertiserHciInterface* Get();
@@ -57,7 +59,7 @@
                              uint8_t secondary_max_skip, uint8_t secondary_phy,
                              uint8_t advertising_sid,
                              uint8_t scan_request_notify_enable,
-                             status_cb command_complete) = 0;
+                             parameters_cb command_complete) = 0;
   virtual void SetAdvertisingData(uint8_t handle, uint8_t operation,
                                   uint8_t fragment_preference,
                                   uint8_t data_length, uint8_t* data,
diff --git a/stack/btm/btm_ble_multi_adv.cc b/stack/btm/btm_ble_multi_adv.cc
index a733861..f659025 100644
--- a/stack/btm/btm_ble_multi_adv.cc
+++ b/stack/btm/btm_ble_multi_adv.cc
@@ -34,6 +34,8 @@
 using base::Bind;
 using RegisterCb =
     base::Callback<void(uint8_t /* inst_id */, uint8_t /* status */)>;
+using IdTxPowerStatusCb = base::Callback<void(
+    uint8_t /* inst_id */, int8_t /* tx_power */, uint8_t /* status */)>;
 extern void btm_gen_resolvable_private_addr(
     base::Callback<void(uint8_t[8])> cb);
 extern fixed_queue_t* btu_general_alarm_queue;
@@ -113,7 +115,7 @@
 struct CreatorParams {
   uint8_t inst_id;
   BleAdvertisingManagerImpl* self;
-  RegisterCb cb;
+  IdTxPowerStatusCb cb;
   tBTM_BLE_ADV_PARAMS params;
   std::vector<uint8_t> advertise_data;
   std::vector<uint8_t> scan_response_data;
@@ -271,13 +273,15 @@
     // asynchronous flow
     // clang-format off
     c->self->SetParameters(c->inst_id, &c->params, Bind(
-      [](c_type c, uint8_t status) {
+      [](c_type c, uint8_t status, int8_t tx_power) {
         if (status != 0) {
           LOG(ERROR) << "setting parameters failed, status: " << +status;
           c->cb.Run(status);
           return;
         }
 
+        c->self->adv_inst[c->inst_id].tx_power = tx_power;
+
         BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address;
         c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind(
           [](c_type c, uint8_t status) {
@@ -312,7 +316,7 @@
     // clang-format on
   }
 
-  void StartAdvertisingSet(RegisterCb cb, tBTM_BLE_ADV_PARAMS* params,
+  void StartAdvertisingSet(IdTxPowerStatusCb cb, tBTM_BLE_ADV_PARAMS* params,
                            std::vector<uint8_t> advertise_data,
                            std::vector<uint8_t> scan_response_data,
                            tBLE_PERIODIC_ADV_PARAMS* periodic_params,
@@ -339,23 +343,22 @@
       [](c_type c, uint8_t advertiser_id, uint8_t status) {
         if (status != 0) {
           LOG(ERROR) << "registering advertiser failed, status: " << +status;
-          c->cb.Run(0, status);
+          c->cb.Run(0, 0, status);
           return;
         }
 
         c->inst_id = advertiser_id;
 
         c->self->SetParameters(c->inst_id, &c->params, Bind(
-          [](c_type c, uint8_t status) {
+          [](c_type c, uint8_t status, int8_t tx_power) {
             if (status != 0) {
               c->self->Unregister(c->inst_id);
               LOG(ERROR) << "setting parameters failed, status: " << +status;
-              c->cb.Run(0, status);
+              c->cb.Run(0, 0, status);
               return;
             }
 
-            //TODO(jpawlowski): obtain real tx_power from set parameters
-            // response, to put into adv data
+            c->self->adv_inst[c->inst_id].tx_power = tx_power;
 
             BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address;
             c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind(
@@ -363,7 +366,7 @@
                 if (status != 0) {
                   c->self->Unregister(c->inst_id);
                   LOG(ERROR) << "setting random address failed, status: " << +status;
-                  c->cb.Run(0, status);
+                  c->cb.Run(0, 0, status);
                   return;
                 }
 
@@ -372,7 +375,7 @@
                     if (status != 0) {
                       c->self->Unregister(c->inst_id);
                       LOG(ERROR) << "setting advertise data failed, status: " << +status;
-                      c->cb.Run(0, status);
+                      c->cb.Run(0, 0, status);
                       return;
                     }
 
@@ -381,7 +384,7 @@
                         if (status != 0) {
                           c->self->Unregister(c->inst_id);
                           LOG(ERROR) << "setting scan response data failed, status: " << +status;
-                          c->cb.Run(0, status);
+                          c->cb.Run(0, 0, status);
                           return;
                         }
 
@@ -407,7 +410,7 @@
         if (status != 0) {
           c->self->Unregister(c->inst_id);
           LOG(ERROR) << "setting periodic parameters failed, status: " << +status;
-          c->cb.Run(0, status);
+          c->cb.Run(0, 0, status);
           return;
         }
 
@@ -416,7 +419,7 @@
             if (status != 0) {
               c->self->Unregister(c->inst_id);
               LOG(ERROR) << "setting periodic parameters failed, status: " << +status;
-              c->cb.Run(0, status);
+              c->cb.Run(0, 0, status);
               return;
             }
 
@@ -425,7 +428,7 @@
                 if (status != 0) {
                   c->self->Unregister(c->inst_id);
                   LOG(ERROR) << "enabling periodic advertising failed, status: " << +status;
-                  c->cb.Run(0, status);
+                  c->cb.Run(0, 0, status);
                   return;
                 }
 
@@ -447,10 +450,11 @@
           if (status != 0) {
             c->self->Unregister(c->inst_id);
             LOG(ERROR) << "enabling advertiser failed, status: " << +status;
-            c->cb.Run(0, status);
+            c->cb.Run(0, 0, status);
             return;
           }
-          c->cb.Run(c->inst_id, status);
+          int8_t tx_power = c->self->adv_inst[c->inst_id].tx_power;
+          c->cb.Run(c->inst_id, tx_power, status);
         },
         base::Passed(&c));
 
@@ -460,6 +464,7 @@
 
   void EnableWithTimerCb(uint8_t inst_id, MultiAdvCb enable_cb, int timeout_s,
                          MultiAdvCb timeout_cb, uint8_t status) {
+    VLOG(1) << __func__ << " inst_id: " << +inst_id;
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
 
     // Run the regular enable callback
@@ -487,7 +492,7 @@
     }
 
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
-    VLOG(1) << __func__ << "enable: " << enable;
+    VLOG(1) << __func__ << " enable: " << enable << ", timeout: " << +timeout_s;
     if (!p_inst->in_use) {
       LOG(ERROR) << "Invalid or no active instance";
       cb.Run(BTM_BLE_MULTI_ADV_FAILURE);
@@ -513,7 +518,7 @@
   }
 
   void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params,
-                     MultiAdvCb cb) override {
+                     ParametersCb cb) override {
     VLOG(1) << __func__ << " inst_id: " << +inst_id;
     if (inst_id >= inst_count) {
       LOG(ERROR) << "bad instance id " << +inst_id;
@@ -523,7 +528,7 @@
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
     if (!p_inst->in_use) {
       LOG(ERROR) << "adv instance not in use" << +inst_id;
-      cb.Run(BTM_BLE_MULTI_ADV_FAILURE);
+      cb.Run(BTM_BLE_MULTI_ADV_FAILURE, 0);
       return;
     }
 
diff --git a/stack/include/ble_advertiser.h b/stack/include/ble_advertiser.h
index 3cfae45..30fe6e6 100644
--- a/stack/include/ble_advertiser.h
+++ b/stack/include/ble_advertiser.h
@@ -28,6 +28,8 @@
 #define ADVERTISE_FAILED_TOO_MANY_ADVERTISERS 0x02
 
 using MultiAdvCb = base::Callback<void(uint8_t /* status */)>;
+using ParametersCb =
+    base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
 
 // methods we must have defined
 void btm_ble_update_dmt_flag_bits(uint8_t* flag_value,
@@ -93,7 +95,9 @@
    * enabled.
    */
   virtual void StartAdvertisingSet(
-      base::Callback<void(uint8_t /* inst_id */, uint8_t /* status */)> cb,
+      base::Callback<void(uint8_t /* inst_id */, int8_t /* tx_power */,
+                          uint8_t /* status */)>
+          cb,
       tBTM_BLE_ADV_PARAMS* params, std::vector<uint8_t> advertise_data,
       std::vector<uint8_t> scan_response_data,
       tBLE_PERIODIC_ADV_PARAMS* periodic_params,
@@ -116,7 +120,7 @@
   /* This function update a Multi-ADV instance with the specififed adv
    * parameters. */
   virtual void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params,
-                             MultiAdvCb cb) = 0;
+                             ParametersCb cb) = 0;
 
   /* This function configure a Multi-ADV instance with the specified adv data or
    * scan response data.*/
diff --git a/stack/test/ble_advertiser_test.cc b/stack/test/ble_advertiser_test.cc
index 4977704..8a6a3a7 100644
--- a/stack/test/ble_advertiser_test.cc
+++ b/stack/test/ble_advertiser_test.cc
@@ -30,6 +30,7 @@
 using ::testing::IsEmpty;
 using ::testing::SaveArg;
 using status_cb = BleAdvertiserHciInterface::status_cb;
+using parameters_cb = BleAdvertiserHciInterface::parameters_cb;
 
 const int num_adv_instances = 16;
 
@@ -97,7 +98,7 @@
                void(uint8_t, uint16_t, uint32_t, uint32_t, uint8_t, uint8_t,
                     BD_ADDR, uint8_t, BD_ADDR));
   MOCK_METHOD8(SetParameters2, void(uint8_t, int8_t, uint8_t, uint8_t, uint8_t,
-                                    uint8_t, uint8_t, status_cb));
+                                    uint8_t, uint8_t, parameters_cb));
 
   void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                      uint32_t adv_int_max, uint8_t channel_map,
@@ -107,7 +108,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb cmd_complete) override {
+                     parameters_cb cmd_complete) override {
     SetParameters1(handle, properties, adv_int_min, adv_int_max, channel_map,
                    own_address_type, own_address, peer_address_type,
                    peer_address);
@@ -160,7 +161,9 @@
     reg_status = status;
   }
 
-  void SetParametersCb(uint8_t status) { set_params_status = status; }
+  void SetParametersCb(uint8_t status, int8_t tx_power) {
+    set_params_status = status;
+  }
   void SetDataCb(uint8_t status) { set_data_status = status; }
   void EnableCb(uint8_t status) { enable_status = status; }
   void StartAdvertisingCb(uint8_t status) { start_advertising_status = status; }
@@ -199,7 +202,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
       .Times(1);
@@ -213,7 +216,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // we are a truly gracious fake controller, let the command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -261,7 +264,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   params.advertising_event_properties =
       BleAdvertisingManager::advertising_prop_legacy_connectable;
@@ -278,7 +281,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // let the set parameters command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -311,7 +314,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   params.advertising_event_properties =
       BleAdvertisingManager::advertising_prop_legacy_non_connectable;
@@ -329,7 +332,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // let the set parameters command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, -15);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -391,7 +394,7 @@
   std::vector<uint8_t> scan_resp;
   tBTM_BLE_ADV_PARAMS params;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   status_cb set_address_cb;
   status_cb set_data_cb;
   status_cb set_scan_resp_data_cb;
@@ -420,7 +423,7 @@
       &params, adv_data, scan_resp, 0, base::Callback<void(uint8_t)>());
 
   // we are a truly gracious fake controller, let the commands succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   set_address_cb.Run(0);
   set_data_cb.Run(0);
   set_scan_resp_data_cb.Run(0);
@@ -451,7 +454,7 @@
   std::vector<uint8_t> scan_resp;
   tBTM_BLE_ADV_PARAMS params;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
       .Times(1);
   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
@@ -468,7 +471,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // set params failed
-  set_params_cb.Run(0x01);
+  set_params_cb.Run(0x01, 0);
 
   // Expect the whole flow to fail right away
   EXPECT_EQ(BTM_BLE_MULTI_ADV_FAILURE, start_advertising_status);