__u16   scan_rsp_len;
        __u8    scan_rsp_data[HCI_MAX_AD_LENGTH];
        __s8    tx_power;
+       __u32   min_interval;
+       __u32   max_interval;
        bdaddr_t        random_addr;
        bool            rpa_expired;
        struct delayed_work     rpa_expired_cb;
 int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags,
                         u16 adv_data_len, u8 *adv_data,
                         u16 scan_rsp_len, u8 *scan_rsp_data,
-                        u16 timeout, u16 duration);
+                        u16 timeout, u16 duration, s8 tx_power,
+                        u32 min_interval, u32 max_interval);
 int hci_set_adv_instance_data(struct hci_dev *hdev, u8 instance,
                         u16 adv_data_len, u8 *adv_data,
                         u16 scan_rsp_len, u8 *scan_rsp_data);
 
 int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags,
                         u16 adv_data_len, u8 *adv_data,
                         u16 scan_rsp_len, u8 *scan_rsp_data,
-                        u16 timeout, u16 duration)
+                        u16 timeout, u16 duration, s8 tx_power,
+                        u32 min_interval, u32 max_interval)
 {
        struct adv_info *adv_instance;
 
        adv_instance->flags = flags;
        adv_instance->adv_data_len = adv_data_len;
        adv_instance->scan_rsp_len = scan_rsp_len;
+       adv_instance->min_interval = min_interval;
+       adv_instance->max_interval = max_interval;
+       adv_instance->tx_power = tx_power;
 
        if (adv_data_len)
                memcpy(adv_instance->adv_data, adv_data, adv_data_len);
        else
                adv_instance->duration = duration;
 
-       adv_instance->tx_power = HCI_TX_POWER_INVALID;
-
        INIT_DELAYED_WORK(&adv_instance->rpa_expired_cb,
                          adv_instance_rpa_expired);
 
 
 void __hci_req_enable_advertising(struct hci_request *req)
 {
        struct hci_dev *hdev = req->hdev;
+       struct adv_info *adv_instance;
        struct hci_cp_le_set_adv_param cp;
        u8 own_addr_type, enable = 0x01;
        bool connectable;
        u32 flags;
 
        flags = get_adv_instance_flags(hdev, hdev->cur_adv_instance);
+       adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
 
        /* If the "connectable" instance flag was not set, then choose between
         * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
 
        memset(&cp, 0, sizeof(cp));
 
-       if (connectable) {
-               cp.type = LE_ADV_IND;
-
+       if (adv_instance) {
+               adv_min_interval = adv_instance->min_interval;
+               adv_max_interval = adv_instance->max_interval;
+       } else {
                adv_min_interval = hdev->le_adv_min_interval;
                adv_max_interval = hdev->le_adv_max_interval;
+       }
+
+       if (connectable) {
+               cp.type = LE_ADV_IND;
        } else {
                if (adv_cur_instance_is_scannable(hdev))
                        cp.type = LE_ADV_SCAN_IND;
                    hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) {
                        adv_min_interval = DISCOV_LE_FAST_ADV_INT_MIN;
                        adv_max_interval = DISCOV_LE_FAST_ADV_INT_MAX;
-               } else {
-                       adv_min_interval = hdev->le_adv_min_interval;
-                       adv_max_interval = hdev->le_adv_max_interval;
                }
        }
 
 
        memset(&cp, 0, sizeof(cp));
 
-       /* In ext adv set param interval is 3 octets */
-       hci_cpu_to_le24(hdev->le_adv_min_interval, cp.min_interval);
-       hci_cpu_to_le24(hdev->le_adv_max_interval, cp.max_interval);
+       if (adv_instance) {
+               hci_cpu_to_le24(adv_instance->min_interval, cp.min_interval);
+               hci_cpu_to_le24(adv_instance->max_interval, cp.max_interval);
+               cp.tx_power = adv_instance->tx_power;
+       } else {
+               hci_cpu_to_le24(hdev->le_adv_min_interval, cp.min_interval);
+               hci_cpu_to_le24(hdev->le_adv_max_interval, cp.max_interval);
+               cp.tx_power = HCI_ADV_TX_POWER_NO_PREFERENCE;
+       }
 
        secondary_adv = (flags & MGMT_ADV_FLAG_SEC_MASK);
 
 
        cp.own_addr_type = own_addr_type;
        cp.channel_map = hdev->le_adv_channel_map;
-       cp.tx_power = 127;
        cp.handle = instance;
 
        if (flags & MGMT_ADV_FLAG_SEC_2M) {
 
                                   cp->adv_data_len, cp->data,
                                   cp->scan_rsp_len,
                                   cp->data + cp->adv_data_len,
-                                  timeout, duration);
+                                  timeout, duration,
+                                  HCI_ADV_TX_POWER_NO_PREFERENCE,
+                                  hdev->le_adv_min_interval,
+                                  hdev->le_adv_max_interval);
        if (err < 0) {
                err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
                                      MGMT_STATUS_FAILED);
 
        /* Create advertising instance with no advertising or response data */
        err = hci_add_adv_instance(hdev, cp->instance, flags,
-                                  0, NULL, 0, NULL, timeout, duration);
+                                  0, NULL, 0, NULL, timeout, duration,
+                                  tx_power, min_interval, max_interval);
 
        if (err < 0) {
                err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS,