} __packed;
 #define MGMT_UNBLOCK_DEVICE_SIZE       MGMT_ADDR_INFO_SIZE
 
+#define MGMT_OP_SET_DEVICE_ID          0x0028
+struct mgmt_cp_set_device_id {
+       __le16  source;
+       __le16  vendor;
+       __le16  product;
+       __le16  version;
+} __packed;
+#define MGMT_SET_DEVICE_ID_SIZE                8
+
 #define MGMT_EV_CMD_COMPLETE           0x0001
 struct mgmt_ev_cmd_complete {
        __le16  opcode;
 
        MGMT_OP_CONFIRM_NAME,
        MGMT_OP_BLOCK_DEVICE,
        MGMT_OP_UNBLOCK_DEVICE,
+       MGMT_OP_SET_DEVICE_ID,
 };
 
 static const u16 mgmt_events[] = {
        return err;
 }
 
+static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
+                        u16 len)
+{
+       struct mgmt_cp_set_device_id *cp = data;
+       int err;
+
+       BT_DBG("%s", hdev->name);
+
+       hci_dev_lock(hdev);
+
+       hdev->devid_source = __le16_to_cpu(cp->source);
+       hdev->devid_vendor = __le16_to_cpu(cp->vendor);
+       hdev->devid_product = __le16_to_cpu(cp->product);
+       hdev->devid_version = __le16_to_cpu(cp->version);
+
+       err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, NULL, 0);
+
+       update_eir(hdev);
+
+       hci_dev_unlock(hdev);
+
+       return err;
+}
+
 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
                                void *data, u16 len)
 {
        { confirm_name,           false, MGMT_CONFIRM_NAME_SIZE },
        { block_device,           false, MGMT_BLOCK_DEVICE_SIZE },
        { unblock_device,         false, MGMT_UNBLOCK_DEVICE_SIZE },
+       { set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
 };