/* HCI ID Numbering */
 static DEFINE_IDA(hci_index_ida);
 
-static int hci_scan_req(struct hci_request *req, unsigned long opt)
-{
-       __u8 scan = opt;
-
-       BT_DBG("%s %x", req->hdev->name, scan);
-
-       /* Inquiry and Page scans */
-       hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
-       return 0;
-}
-
-static int hci_auth_req(struct hci_request *req, unsigned long opt)
-{
-       __u8 auth = opt;
-
-       BT_DBG("%s %x", req->hdev->name, auth);
-
-       /* Authentication */
-       hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
-       return 0;
-}
-
-static int hci_encrypt_req(struct hci_request *req, unsigned long opt)
-{
-       __u8 encrypt = opt;
-
-       BT_DBG("%s %x", req->hdev->name, encrypt);
-
-       /* Encryption */
-       hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
-       return 0;
-}
-
-static int hci_linkpol_req(struct hci_request *req, unsigned long opt)
-{
-       __le16 policy = cpu_to_le16(opt);
-
-       BT_DBG("%s %x", req->hdev->name, policy);
-
-       /* Default link policy */
-       hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
-       return 0;
-}
-
 /* Get HCI device by index.
  * Device is held on return. */
 struct hci_dev *hci_dev_get(int index)
 {
        struct hci_dev *hdev;
        struct hci_dev_req dr;
+       __le16 policy;
        int err = 0;
 
        if (copy_from_user(&dr, arg, sizeof(dr)))
 
        switch (cmd) {
        case HCISETAUTH:
-               err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
-                                  HCI_INIT_TIMEOUT, NULL);
+               err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_AUTH_ENABLE,
+                                           1, &dr.dev_opt, HCI_CMD_TIMEOUT);
                break;
 
        case HCISETENCRYPT:
 
                if (!test_bit(HCI_AUTH, &hdev->flags)) {
                        /* Auth must be enabled first */
-                       err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
-                                          HCI_INIT_TIMEOUT, NULL);
+                       err = __hci_cmd_sync_status(hdev,
+                                                   HCI_OP_WRITE_AUTH_ENABLE,
+                                                   1, &dr.dev_opt,
+                                                   HCI_CMD_TIMEOUT);
                        if (err)
                                break;
                }
 
-               err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
-                                  HCI_INIT_TIMEOUT, NULL);
+               err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_ENCRYPT_MODE,
+                                           1, &dr.dev_opt,
+                                           HCI_CMD_TIMEOUT);
                break;
 
        case HCISETSCAN:
-               err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
-                                  HCI_INIT_TIMEOUT, NULL);
+               err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_SCAN_ENABLE,
+                                           1, &dr.dev_opt,
+                                           HCI_CMD_TIMEOUT);
 
                /* Ensure that the connectable and discoverable states
                 * get correctly modified as this was a non-mgmt change.
                break;
 
        case HCISETLINKPOL:
-               err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
-                                  HCI_INIT_TIMEOUT, NULL);
+               policy = cpu_to_le16(dr.dev_opt);
+
+               err = __hci_cmd_sync_status(hdev, HCI_OP_WRITE_DEF_LINK_POLICY,
+                                           2, &policy,
+                                           HCI_CMD_TIMEOUT);
                break;
 
        case HCISETLINKMODE:
 
 }
 EXPORT_SYMBOL(__hci_cmd_sync_status);
 
+int hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
+                       const void *param, u32 timeout)
+{
+       int err;
+
+       hci_req_sync_lock(hdev);
+       err = __hci_cmd_sync_status(hdev, opcode, plen, param, timeout);
+       hci_req_sync_unlock(hdev);
+
+       return err;
+}
+EXPORT_SYMBOL(hci_cmd_sync_status);
+
 static void hci_cmd_sync_work(struct work_struct *work)
 {
        struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work);