^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) BlueZ - Bluetooth protocol stack for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Copyright (C) 2014 Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "smp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "hci_debugfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define DEFINE_QUIRK_ATTRIBUTE(__name, __quirk) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static ssize_t __name ## _read(struct file *file, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) char __user *user_buf, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) size_t count, loff_t *ppos) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct hci_dev *hdev = file->private_data; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) char buf[3]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) buf[0] = test_bit(__quirk, &hdev->quirks) ? 'Y' : 'N'; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) buf[1] = '\n'; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) buf[2] = '\0'; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) return simple_read_from_buffer(user_buf, count, ppos, buf, 2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static ssize_t __name ## _write(struct file *file, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) const char __user *user_buf, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) size_t count, loff_t *ppos) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct hci_dev *hdev = file->private_data; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) bool enable; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int err; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (test_bit(HCI_UP, &hdev->flags)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return -EBUSY; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) err = kstrtobool_from_user(user_buf, count, &enable); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if (err) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return err; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (enable == test_bit(__quirk, &hdev->quirks)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return -EALREADY; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) change_bit(__quirk, &hdev->quirks); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) return count; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static const struct file_operations __name ## _fops = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .open = simple_open, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .read = __name ## _read, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .write = __name ## _write, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .llseek = default_llseek, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define DEFINE_INFO_ATTRIBUTE(__name, __field) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) static int __name ## _show(struct seq_file *f, void *ptr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct hci_dev *hdev = f->private; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) hci_dev_lock(hdev); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) seq_printf(f, "%s\n", hdev->__field ? : ""); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) hci_dev_unlock(hdev); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) DEFINE_SHOW_ATTRIBUTE(__name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static int features_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) u8 p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) seq_printf(f, "%2u: %8ph\n", p, hdev->features[p]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (lmp_le_capable(hdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) seq_printf(f, "LE: %8ph\n", hdev->le_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) DEFINE_SHOW_ATTRIBUTE(features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static int device_id_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) seq_printf(f, "%4.4x:%4.4x:%4.4x:%4.4x\n", hdev->devid_source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) hdev->devid_vendor, hdev->devid_product, hdev->devid_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) DEFINE_SHOW_ATTRIBUTE(device_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static int device_list_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct hci_conn_params *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct bdaddr_list *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) list_for_each_entry(b, &hdev->whitelist, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) list_for_each_entry(p, &hdev->le_conn_params, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) p->auto_connect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) DEFINE_SHOW_ATTRIBUTE(device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static int blacklist_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) struct bdaddr_list *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) list_for_each_entry(b, &hdev->blacklist, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) DEFINE_SHOW_ATTRIBUTE(blacklist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static int blocked_keys_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct blocked_key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) list_for_each_entry_rcu(key, &hdev->blocked_keys, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) seq_printf(f, "%u %*phN\n", key->type, 16, key->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) DEFINE_SHOW_ATTRIBUTE(blocked_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) static int uuids_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct bt_uuid *uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) list_for_each_entry(uuid, &hdev->uuids, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u8 i, val[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /* The Bluetooth UUID values are stored in big endian,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * but with reversed byte order. So convert them into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * the right order for the %pUb modifier.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) val[i] = uuid->uuid[15 - i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) seq_printf(f, "%pUb\n", val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) DEFINE_SHOW_ATTRIBUTE(uuids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static int remote_oob_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct oob_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) list_for_each_entry(data, &hdev->remote_oob_data, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) seq_printf(f, "%pMR (type %u) %u %*phN %*phN %*phN %*phN\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) &data->bdaddr, data->bdaddr_type, data->present,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 16, data->hash192, 16, data->rand192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 16, data->hash256, 16, data->rand256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) DEFINE_SHOW_ATTRIBUTE(remote_oob);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) static int conn_info_min_age_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (val == 0 || val > hdev->conn_info_max_age)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) hdev->conn_info_min_age = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static int conn_info_min_age_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) *val = hdev->conn_info_min_age;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) conn_info_min_age_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static int conn_info_max_age_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (val == 0 || val < hdev->conn_info_min_age)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) hdev->conn_info_max_age = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static int conn_info_max_age_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) *val = hdev->conn_info_max_age;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) conn_info_max_age_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static ssize_t use_debug_keys_read(struct file *file, char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) buf[0] = hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS) ? 'Y': 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) buf[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) buf[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) static const struct file_operations use_debug_keys_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .read = use_debug_keys_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) .llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) buf[0] = hci_dev_test_flag(hdev, HCI_SC_ONLY) ? 'Y': 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) buf[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) buf[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static const struct file_operations sc_only_mode_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .read = sc_only_mode_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) DEFINE_INFO_ATTRIBUTE(hardware_info, hw_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) DEFINE_INFO_ATTRIBUTE(firmware_info, fw_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) void hci_debugfs_create_common(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) debugfs_create_file("features", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) &features_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) &hdev->manufacturer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) debugfs_create_u8("hardware_error", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) &hdev->hw_error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) debugfs_create_file("device_id", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) &device_id_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) &device_list_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) &blacklist_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) debugfs_create_file("blocked_keys", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) &blocked_keys_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) debugfs_create_file("remote_oob", 0400, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) &remote_oob_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) &conn_info_min_age_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) &conn_info_max_age_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) if (lmp_ssp_capable(hdev) || lmp_le_capable(hdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) debugfs_create_file("use_debug_keys", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) hdev, &use_debug_keys_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if (lmp_sc_capable(hdev) || lmp_le_capable(hdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) hdev, &sc_only_mode_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (hdev->hw_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) debugfs_create_file("hardware_info", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) hdev, &hardware_info_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (hdev->fw_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) debugfs_create_file("firmware_info", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) hdev, &firmware_info_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static int inquiry_cache_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct discovery_state *cache = &hdev->discovery;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) struct inquiry_entry *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) list_for_each_entry(e, &cache->all, all) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) struct inquiry_data *data = &e->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) &data->bdaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) data->pscan_rep_mode, data->pscan_period_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) data->pscan_mode, data->dev_class[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) data->dev_class[1], data->dev_class[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) __le16_to_cpu(data->clock_offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) data->rssi, data->ssp_mode, e->timestamp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) DEFINE_SHOW_ATTRIBUTE(inquiry_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static int link_keys_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct link_key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) list_for_each_entry_rcu(key, &hdev->link_keys, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) HCI_LINK_KEY_SIZE, key->val, key->pin_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) DEFINE_SHOW_ATTRIBUTE(link_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) static int dev_class_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) hdev->dev_class[1], hdev->dev_class[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) DEFINE_SHOW_ATTRIBUTE(dev_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) static int voice_setting_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) *val = hdev->voice_setting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) NULL, "0x%4.4llx\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) static ssize_t ssp_debug_mode_read(struct file *file, char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) buf[0] = hdev->ssp_debug_mode ? 'Y': 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) buf[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) buf[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) static const struct file_operations ssp_debug_mode_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .read = ssp_debug_mode_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) static int auto_accept_delay_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) hdev->auto_accept_delay = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) static int min_encrypt_key_size_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (val < 1 || val > 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) hdev->min_enc_key_size = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static int min_encrypt_key_size_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) *val = hdev->min_enc_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) DEFINE_SIMPLE_ATTRIBUTE(min_encrypt_key_size_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) min_encrypt_key_size_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) min_encrypt_key_size_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) static int auto_accept_delay_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) *val = hdev->auto_accept_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) auto_accept_delay_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) static int idle_timeout_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (val != 0 && (val < 500 || val > 3600000))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) hdev->idle_timeout = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) static int idle_timeout_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) *val = hdev->idle_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) idle_timeout_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) static int sniff_min_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) hdev->sniff_min_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) static int sniff_min_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) *val = hdev->sniff_min_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) sniff_min_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) static int sniff_max_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) hdev->sniff_max_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) static int sniff_max_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) *val = hdev->sniff_max_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) sniff_max_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) void hci_debugfs_create_bredr(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) &inquiry_cache_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) debugfs_create_file("link_keys", 0400, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) &link_keys_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) debugfs_create_file("dev_class", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) &dev_class_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) debugfs_create_file("voice_setting", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) &voice_setting_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (lmp_ssp_capable(hdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) debugfs_create_file("ssp_debug_mode", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) hdev, &ssp_debug_mode_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) debugfs_create_file("min_encrypt_key_size", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) hdev, &min_encrypt_key_size_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) hdev, &auto_accept_delay_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (lmp_sniff_capable(hdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) hdev, &idle_timeout_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) hdev, &sniff_min_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) hdev, &sniff_max_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) static int identity_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) bdaddr_t addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) u8 addr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) hci_copy_identity_address(hdev, &addr, &addr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 16, hdev->irk, &hdev->rpa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) DEFINE_SHOW_ATTRIBUTE(identity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) static int rpa_timeout_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) /* Require the RPA timeout to be at least 30 seconds and at most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * 24 hours.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (val < 30 || val > (60 * 60 * 24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) hdev->rpa_timeout = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) static int rpa_timeout_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) *val = hdev->rpa_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) rpa_timeout_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) static int random_address_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) seq_printf(f, "%pMR\n", &hdev->random_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) DEFINE_SHOW_ATTRIBUTE(random_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static int static_address_show(struct seq_file *f, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) seq_printf(f, "%pMR\n", &hdev->static_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) DEFINE_SHOW_ATTRIBUTE(static_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) static ssize_t force_static_address_read(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ? 'Y': 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) buf[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) buf[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) static ssize_t force_static_address_write(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) const char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) bool enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) if (test_bit(HCI_UP, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) err = kstrtobool_from_user(user_buf, count, &enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) if (enable == hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) return -EALREADY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) hci_dev_change_flag(hdev, HCI_FORCE_STATIC_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) static const struct file_operations force_static_address_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) .open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) .read = force_static_address_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) .write = force_static_address_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) .llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) static int white_list_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) struct bdaddr_list *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) list_for_each_entry(b, &hdev->le_white_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) DEFINE_SHOW_ATTRIBUTE(white_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) static int resolv_list_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) struct bdaddr_list *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) list_for_each_entry(b, &hdev->le_resolv_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) DEFINE_SHOW_ATTRIBUTE(resolv_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) struct smp_irk *irk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) &irk->bdaddr, irk->addr_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 16, irk->val, &irk->rpa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) DEFINE_SHOW_ATTRIBUTE(identity_resolving_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) static int long_term_keys_show(struct seq_file *f, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) struct hci_dev *hdev = f->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) struct smp_ltk *ltk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) list_for_each_entry_rcu(ltk, &hdev->long_term_keys, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) <k->bdaddr, ltk->bdaddr_type, ltk->authenticated,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) __le64_to_cpu(ltk->rand), 16, ltk->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) DEFINE_SHOW_ATTRIBUTE(long_term_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) static int conn_min_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) hdev->le_conn_min_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) static int conn_min_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) *val = hdev->le_conn_min_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) conn_min_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) static int conn_max_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) hdev->le_conn_max_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static int conn_max_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) *val = hdev->le_conn_max_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) conn_max_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) static int conn_latency_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (val > 0x01f3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) hdev->le_conn_latency = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) static int conn_latency_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) *val = hdev->le_conn_latency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops, conn_latency_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) conn_latency_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) static int supervision_timeout_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) if (val < 0x000a || val > 0x0c80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) hdev->le_supv_timeout = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) static int supervision_timeout_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) *val = hdev->le_supv_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) supervision_timeout_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) static int adv_channel_map_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if (val < 0x01 || val > 0x07)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) hdev->le_adv_channel_map = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) static int adv_channel_map_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) *val = hdev->le_adv_channel_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) adv_channel_map_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) static int adv_min_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) hdev->le_adv_min_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) static int adv_min_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) *val = hdev->le_adv_min_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) adv_min_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) static int adv_max_interval_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) hdev->le_adv_max_interval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) static int adv_max_interval_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) *val = hdev->le_adv_max_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) adv_max_interval_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) static int min_key_size_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) if (val > hdev->le_max_key_size || val < SMP_MIN_ENC_KEY_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) hdev->le_min_key_size = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) static int min_key_size_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) *val = hdev->le_min_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) DEFINE_SIMPLE_ATTRIBUTE(min_key_size_fops, min_key_size_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) min_key_size_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) static int max_key_size_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) if (val > SMP_MAX_ENC_KEY_SIZE || val < hdev->le_min_key_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) hdev->le_max_key_size = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) static int max_key_size_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) *val = hdev->le_max_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) DEFINE_SIMPLE_ATTRIBUTE(max_key_size_fops, max_key_size_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) max_key_size_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) static int auth_payload_timeout_set(void *data, u64 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) if (val < 0x0001 || val > 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) hdev->auth_payload_timeout = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) static int auth_payload_timeout_get(void *data, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) struct hci_dev *hdev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) *val = hdev->auth_payload_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) DEFINE_SIMPLE_ATTRIBUTE(auth_payload_timeout_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) auth_payload_timeout_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) auth_payload_timeout_set, "%llu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) static ssize_t force_no_mitm_read(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) char buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_NO_MITM) ? 'Y' : 'N';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) buf[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) buf[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) static ssize_t force_no_mitm_write(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) const char __user *user_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) struct hci_dev *hdev = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) char buf[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) size_t buf_size = min(count, (sizeof(buf) - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) bool enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (copy_from_user(buf, user_buf, buf_size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) buf[buf_size] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (strtobool(buf, &enable))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) if (enable == hci_dev_test_flag(hdev, HCI_FORCE_NO_MITM))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return -EALREADY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) hci_dev_change_flag(hdev, HCI_FORCE_NO_MITM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) static const struct file_operations force_no_mitm_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) .open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) .read = force_no_mitm_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) .write = force_no_mitm_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) .llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) DEFINE_QUIRK_ATTRIBUTE(quirk_strict_duplicate_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) HCI_QUIRK_STRICT_DUPLICATE_FILTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) DEFINE_QUIRK_ATTRIBUTE(quirk_simultaneous_discovery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) void hci_debugfs_create_le(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) debugfs_create_file("identity", 0400, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) &identity_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) debugfs_create_file("rpa_timeout", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) &rpa_timeout_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) debugfs_create_file("random_address", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) &random_address_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) debugfs_create_file("static_address", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) &static_address_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) /* For controllers with a public address, provide a debug
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) * option to force the usage of the configured static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) * address. By default the public address is used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (bacmp(&hdev->bdaddr, BDADDR_ANY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) debugfs_create_file("force_static_address", 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) &force_static_address_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) &hdev->le_white_list_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) &white_list_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) debugfs_create_u8("resolv_list_size", 0444, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) &hdev->le_resolv_list_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) debugfs_create_file("resolv_list", 0444, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) &resolv_list_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) debugfs_create_file("identity_resolving_keys", 0400, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) hdev, &identity_resolving_keys_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) debugfs_create_file("long_term_keys", 0400, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) &long_term_keys_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) &conn_min_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) &conn_max_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) debugfs_create_file("conn_latency", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) &conn_latency_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) debugfs_create_file("supervision_timeout", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) &supervision_timeout_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) &adv_channel_map_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) debugfs_create_file("adv_min_interval", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) &adv_min_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) debugfs_create_file("adv_max_interval", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) &adv_max_interval_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) debugfs_create_u16("discov_interleaved_timeout", 0644, hdev->debugfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) &hdev->discov_interleaved_timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) debugfs_create_file("min_key_size", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) &min_key_size_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) debugfs_create_file("max_key_size", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) &max_key_size_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) debugfs_create_file("auth_payload_timeout", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) &auth_payload_timeout_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) debugfs_create_file("force_no_mitm", 0644, hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) &force_no_mitm_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) debugfs_create_file("quirk_strict_duplicate_filter", 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) &quirk_strict_duplicate_filter_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) debugfs_create_file("quirk_simultaneous_discovery", 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) hdev->debugfs, hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) &quirk_simultaneous_discovery_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) void hci_debugfs_create_conn(struct hci_conn *conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) struct hci_dev *hdev = conn->hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) char name[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) if (IS_ERR_OR_NULL(hdev->debugfs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) snprintf(name, sizeof(name), "%u", conn->handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) conn->debugfs = debugfs_create_dir(name, hdev->debugfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) }