From 290e79926ecb20c2e75d221fa651f8d1e7a663af Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 14 Oct 2021 17:25:04 -0700 Subject: [PATCH] vhci: Add functions to interface with debugfs This adds functions that can be used to set debugfs options. Signed-off-by: Anuj Jain Signed-off-by: Ayush Garg --- emulator/btdev.c | 23 ++++++++++++++++++-- emulator/btdev.h | 3 +++ emulator/vhci.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ emulator/vhci.h | 5 +++++ 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 0c0ebde..f281873 100755 --- 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 f7cba14..412bfd1 100755 --- 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 97fbcb8..f8560e0 100755 --- a/emulator/vhci.c +++ b/emulator/vhci.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #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,63 @@ struct btdev *vhci_get_btdev(struct vhci *vhci) return vhci->btdev; } + +static int vhci_debugfs_write(struct vhci *vhci, char *option, void *data, + size_t len) +{ + char path[64]; + int fd, err; + size_t n; + + if (!vhci) + return -EINVAL; + + memset(path, 0, sizeof(path)); + sprintf(path, DEBUGFS_PATH "/hci%d/%s", vhci->index, option); + + fd = open(path, O_RDWR); + if (fd < 0) + return -errno; + + n = write(fd, data, len); + if (n == len) + err = 0; + else + err = -errno; + + close(fd); + + return err; +} + +int vhci_set_force_suspend(struct vhci *vhci, bool enable) +{ + char val; + + val = (enable) ? 'Y' : 'N'; + + return vhci_debugfs_write(vhci, "force_suspend", &val, sizeof(val)); +} + +int vhci_set_force_wakeup(struct vhci *vhci, bool enable) +{ + char val; + + val = (enable) ? 'Y' : 'N'; + + return vhci_debugfs_write(vhci, "force_wakeup", &val, sizeof(val)); +} + +int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode) +{ + return vhci_debugfs_write(vhci, "msft_opcode", &opcode, sizeof(opcode)); +} + +int vhci_set_aosp_capable(struct vhci *vhci, bool enable) +{ + char val; + + val = (enable) ? 'Y' : 'N'; + + return vhci_debugfs_write(vhci, "aosp_capable", &val, sizeof(val)); +} diff --git a/emulator/vhci.h b/emulator/vhci.h index 0554121..a601d39 100755 --- 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.7.4