~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/bluetooth/hci_debugfs.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php