From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This adds functions that can be used to set debugfs options. --- emulator/btdev.c | 23 +++++++++- emulator/btdev.h | 3 ++ emulator/vhci.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++ emulator/vhci.h | 5 +++ 4 files changed, 137 insertions(+), 2 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 0c0ebde40..f28187362 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -46,8 +46,6 @@ #define ISO_HANDLE 257 #define SCO_HANDLE 257 -#define DEBUGFS_PATH "/sys/kernel/debug/bluetooth" - struct hook { btdev_hook_func handler; void *user_data; @@ -141,6 +139,7 @@ struct btdev { uint8_t le_states[8]; const struct btdev_cmd *cmds; uint16_t msft_opcode; + bool aosp_capable; uint16_t default_link_policy; uint8_t event_mask[8]; @@ -6677,3 +6676,23 @@ bool btdev_del_hook(struct btdev *btdev, enum btdev_hook_type type, return false; } + +int btdev_set_msft_opcode(struct btdev *btdev, uint16_t opcode) +{ + if (!btdev) + return -EINVAL; + + btdev->msft_opcode = opcode; + + return 0; +} + +int btdev_set_aosp_capable(struct btdev *btdev, bool enable) +{ + if (!btdev) + return -EINVAL; + + btdev->aosp_capable = enable; + + return 0; +} diff --git a/emulator/btdev.h b/emulator/btdev.h index f7cba149a..412bfd158 100644 --- a/emulator/btdev.h +++ b/emulator/btdev.h @@ -93,3 +93,6 @@ int btdev_add_hook(struct btdev *btdev, enum btdev_hook_type type, bool btdev_del_hook(struct btdev *btdev, enum btdev_hook_type type, uint16_t opcode); + +int btdev_set_msft_opcode(struct btdev *btdev, uint16_t opcode); +int btdev_set_aosp_capable(struct btdev *btdev, bool enable); diff --git a/emulator/vhci.c b/emulator/vhci.c index 97fbcb8c4..e016a1ac5 100644 --- a/emulator/vhci.c +++ b/emulator/vhci.c @@ -20,6 +20,8 @@ #include <stdlib.h> #include <string.h> #include <sys/uio.h> +#include <fcntl.h> +#include <unistd.h> #include "lib/bluetooth.h" #include "lib/hci.h" @@ -29,8 +31,11 @@ #include "btdev.h" #include "vhci.h" +#define DEBUGFS_PATH "/sys/kernel/debug/bluetooth" + struct vhci { enum btdev_type type; + uint16_t index; struct io *io; struct btdev *btdev; }; @@ -140,6 +145,7 @@ struct vhci *vhci_open(uint8_t type) memset(vhci, 0, sizeof(*vhci)); vhci->type = type; + vhci->index = rsp.index; vhci->io = io_new(fd); io_set_close_on_destroy(vhci->io, true); @@ -175,3 +181,105 @@ struct btdev *vhci_get_btdev(struct vhci *vhci) return vhci->btdev; } + +static int vhci_debugfs_open(struct vhci *vhci, char *option) +{ + char path[64]; + + if (!vhci) + return -EINVAL; + + memset(path, 0, sizeof(path)); + sprintf(path, DEBUGFS_PATH "/hci%d/%s", vhci->index, option); + + return open(path, O_RDWR); +} + +int vhci_set_force_suspend(struct vhci *vhci, bool enable) +{ + int fd, err; + char val; + + fd = vhci_debugfs_open(vhci, "force_suspend"); + if (fd < 0) + return -errno; + + val = (enable) ? 'Y' : 'N'; + + err = write(fd, &val, sizeof(val)); + if (err < 0) { + err = -errno; + goto done; + } + +done: + close(fd); + return err; +} + +int vhci_set_force_wakeup(struct vhci *vhci, bool enable) +{ + int fd, err; + char val; + + fd = vhci_debugfs_open(vhci, "force_wakeup"); + if (fd < 0) + return -errno; + + val = (enable) ? 'Y' : 'N'; + + err = write(fd, &val, sizeof(val)); + if (err < 0) { + err = -errno; + goto done; + } + +done: + close(fd); + return err; +} + +int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode) +{ + int fd, err; + + fd = vhci_debugfs_open(vhci, "msft_opcode"); + if (fd < 0) + return -errno; + + err = write(fd, &opcode, sizeof(opcode)); + if (err < 0) { + err = -errno; + goto done; + } + + btdev_set_msft_opcode(vhci->btdev, opcode); + +done: + close(fd); + return err; +} + +int vhci_set_aosp_capable(struct vhci *vhci, bool enable) +{ + int fd, err; + char val; + + fd = vhci_debugfs_open(vhci, "aosp_capable"); + if (fd < 0) + return -errno; + + val = (enable) ? 'Y' : 'N'; + + err = write(fd, &val, sizeof(val)); + if (err < 0) { + err = -errno; + goto done; + } + + btdev_set_aosp_capable(vhci->btdev, enable); + +done: + close(fd); + return err; +} diff --git a/emulator/vhci.h b/emulator/vhci.h index 0554121e8..a601d3934 100644 --- a/emulator/vhci.h +++ b/emulator/vhci.h @@ -22,3 +22,8 @@ struct vhci *vhci_open(uint8_t type); void vhci_close(struct vhci *vhci); struct btdev *vhci_get_btdev(struct vhci *vhci); + +int vhci_set_force_suspend(struct vhci *vhci, bool enable); +int vhci_set_force_wakeup(struct vhci *vhci, bool enable); +int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode); +int vhci_set_aosp_capable(struct vhci *vhci, bool enable); -- 2.31.1