diff options
Diffstat (limited to 'net/bluetooth/hci_sysfs.c')
-rw-r--r-- | net/bluetooth/hci_sysfs.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 5fce3d6d07b4..3c838a65a75a 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | static struct class *bt_class; | 12 | static struct class *bt_class; |
13 | 13 | ||
14 | struct dentry *bt_debugfs = NULL; | 14 | struct dentry *bt_debugfs; |
15 | EXPORT_SYMBOL_GPL(bt_debugfs); | 15 | EXPORT_SYMBOL_GPL(bt_debugfs); |
16 | 16 | ||
17 | static inline char *link_typetostr(int type) | 17 | static inline char *link_typetostr(int type) |
@@ -51,8 +51,8 @@ static ssize_t show_link_features(struct device *dev, struct device_attribute *a | |||
51 | conn->features[6], conn->features[7]); | 51 | conn->features[6], conn->features[7]); |
52 | } | 52 | } |
53 | 53 | ||
54 | #define LINK_ATTR(_name,_mode,_show,_store) \ | 54 | #define LINK_ATTR(_name, _mode, _show, _store) \ |
55 | struct device_attribute link_attr_##_name = __ATTR(_name,_mode,_show,_store) | 55 | struct device_attribute link_attr_##_name = __ATTR(_name, _mode, _show, _store) |
56 | 56 | ||
57 | static LINK_ATTR(type, S_IRUGO, show_link_type, NULL); | 57 | static LINK_ATTR(type, S_IRUGO, show_link_type, NULL); |
58 | static LINK_ATTR(address, S_IRUGO, show_link_address, NULL); | 58 | static LINK_ATTR(address, S_IRUGO, show_link_address, NULL); |
@@ -461,6 +461,56 @@ static const struct file_operations blacklist_fops = { | |||
461 | .llseek = seq_lseek, | 461 | .llseek = seq_lseek, |
462 | .release = single_release, | 462 | .release = single_release, |
463 | }; | 463 | }; |
464 | |||
465 | static void print_bt_uuid(struct seq_file *f, u8 *uuid) | ||
466 | { | ||
467 | u32 data0, data4; | ||
468 | u16 data1, data2, data3, data5; | ||
469 | |||
470 | memcpy(&data0, &uuid[0], 4); | ||
471 | memcpy(&data1, &uuid[4], 2); | ||
472 | memcpy(&data2, &uuid[6], 2); | ||
473 | memcpy(&data3, &uuid[8], 2); | ||
474 | memcpy(&data4, &uuid[10], 4); | ||
475 | memcpy(&data5, &uuid[14], 2); | ||
476 | |||
477 | seq_printf(f, "%.8x-%.4x-%.4x-%.4x-%.8x%.4x\n", | ||
478 | ntohl(data0), ntohs(data1), ntohs(data2), | ||
479 | ntohs(data3), ntohl(data4), ntohs(data5)); | ||
480 | } | ||
481 | |||
482 | static int uuids_show(struct seq_file *f, void *p) | ||
483 | { | ||
484 | struct hci_dev *hdev = f->private; | ||
485 | struct list_head *l; | ||
486 | |||
487 | hci_dev_lock_bh(hdev); | ||
488 | |||
489 | list_for_each(l, &hdev->uuids) { | ||
490 | struct bt_uuid *uuid; | ||
491 | |||
492 | uuid = list_entry(l, struct bt_uuid, list); | ||
493 | |||
494 | print_bt_uuid(f, uuid->uuid); | ||
495 | } | ||
496 | |||
497 | hci_dev_unlock_bh(hdev); | ||
498 | |||
499 | return 0; | ||
500 | } | ||
501 | |||
502 | static int uuids_open(struct inode *inode, struct file *file) | ||
503 | { | ||
504 | return single_open(file, uuids_show, inode->i_private); | ||
505 | } | ||
506 | |||
507 | static const struct file_operations uuids_fops = { | ||
508 | .open = uuids_open, | ||
509 | .read = seq_read, | ||
510 | .llseek = seq_lseek, | ||
511 | .release = single_release, | ||
512 | }; | ||
513 | |||
464 | int hci_register_sysfs(struct hci_dev *hdev) | 514 | int hci_register_sysfs(struct hci_dev *hdev) |
465 | { | 515 | { |
466 | struct device *dev = &hdev->dev; | 516 | struct device *dev = &hdev->dev; |
@@ -493,6 +543,8 @@ int hci_register_sysfs(struct hci_dev *hdev) | |||
493 | debugfs_create_file("blacklist", 0444, hdev->debugfs, | 543 | debugfs_create_file("blacklist", 0444, hdev->debugfs, |
494 | hdev, &blacklist_fops); | 544 | hdev, &blacklist_fops); |
495 | 545 | ||
546 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); | ||
547 | |||
496 | return 0; | 548 | return 0; |
497 | } | 549 | } |
498 | 550 | ||