u8 *randomizer);
 int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
 
-int hci_update_ad(struct hci_dev *hdev);
-
 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
 
 int hci_recv_frame(struct sk_buff *skb);
 #define hci_req_lock(d)                mutex_lock(&d->req_lock)
 #define hci_req_unlock(d)      mutex_unlock(&d->req_lock)
 
+void hci_update_ad(struct hci_request *req);
+
 void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
                                        u16 latency, u16 to_multiplier);
 void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
 
        if (hdev->commands[5] & 0x10)
                hci_setup_link_policy(req);
 
-       if (lmp_le_capable(hdev))
+       if (lmp_le_capable(hdev)) {
                hci_set_le_support(req);
+               hci_update_ad(req);
+       }
 }
 
 static int __hci_init(struct hci_dev *hdev)
        return ad_len;
 }
 
-int hci_update_ad(struct hci_dev *hdev)
+void hci_update_ad(struct hci_request *req)
 {
+       struct hci_dev *hdev = req->hdev;
        struct hci_cp_le_set_adv_data cp;
        u8 len;
-       int err;
-
-       hci_dev_lock(hdev);
 
-       if (!lmp_le_capable(hdev)) {
-               err = -EINVAL;
-               goto unlock;
-       }
+       if (!lmp_le_capable(hdev))
+               return;
 
        memset(&cp, 0, sizeof(cp));
 
        len = create_ad(hdev, cp.data);
 
        if (hdev->adv_data_len == len &&
-           memcmp(cp.data, hdev->adv_data, len) == 0) {
-               err = 0;
-               goto unlock;
-       }
+           memcmp(cp.data, hdev->adv_data, len) == 0)
+               return;
 
        memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
        hdev->adv_data_len = len;
 
        cp.length = len;
-       err = hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
 
-unlock:
-       hci_dev_unlock(hdev);
-
-       return err;
+       hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
 }
 
 /* ---- HCI ioctl helpers ---- */
                hci_dev_hold(hdev);
                set_bit(HCI_UP, &hdev->flags);
                hci_notify(hdev, HCI_DEV_UP);
-               hci_update_ad(hdev);
                if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
                    mgmt_valid_hdev(hdev)) {
                        hci_dev_lock(hdev);
 
                memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
 
        hci_dev_unlock(hdev);
-
-       if (!status && !test_bit(HCI_INIT, &hdev->flags))
-               hci_update_ad(hdev);
 }
 
 static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
 
        BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
 
-       if (!rp->status) {
+       if (!rp->status)
                hdev->adv_tx_power = rp->tx_power;
-               if (!test_bit(HCI_INIT, &hdev->flags))
-                       hci_update_ad(hdev);
-       }
 }
 
 static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
                        clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
        }
 
-       hci_dev_unlock(hdev);
+       if (!test_bit(HCI_INIT, &hdev->flags)) {
+               struct hci_request req;
 
-       if (!test_bit(HCI_INIT, &hdev->flags))
-               hci_update_ad(hdev);
+               hci_req_init(&req, hdev);
+               hci_update_ad(&req);
+               hci_req_run(&req, NULL);
+       }
+
+       hci_dev_unlock(hdev);
 }
 
 static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)