Merge remote-tracking branch 'agust/next' into merge
[pandora-kernel.git] / net / bluetooth / hci_sysfs.c
1 /* Bluetooth HCI driver model support. */
2
3 #include <linux/kernel.h>
4 #include <linux/slab.h>
5 #include <linux/init.h>
6 #include <linux/debugfs.h>
7 #include <linux/seq_file.h>
8 #include <linux/module.h>
9
10 #include <net/bluetooth/bluetooth.h>
11 #include <net/bluetooth/hci_core.h>
12
13 static struct class *bt_class;
14
15 struct dentry *bt_debugfs;
16 EXPORT_SYMBOL_GPL(bt_debugfs);
17
18 static inline char *link_typetostr(int type)
19 {
20         switch (type) {
21         case ACL_LINK:
22                 return "ACL";
23         case SCO_LINK:
24                 return "SCO";
25         case ESCO_LINK:
26                 return "eSCO";
27         case LE_LINK:
28                 return "LE";
29         default:
30                 return "UNKNOWN";
31         }
32 }
33
34 static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf)
35 {
36         struct hci_conn *conn = dev_get_drvdata(dev);
37         return sprintf(buf, "%s\n", link_typetostr(conn->type));
38 }
39
40 static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf)
41 {
42         struct hci_conn *conn = dev_get_drvdata(dev);
43         return sprintf(buf, "%s\n", batostr(&conn->dst));
44 }
45
46 static ssize_t show_link_features(struct device *dev, struct device_attribute *attr, char *buf)
47 {
48         struct hci_conn *conn = dev_get_drvdata(dev);
49
50         return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
51                                 conn->features[0], conn->features[1],
52                                 conn->features[2], conn->features[3],
53                                 conn->features[4], conn->features[5],
54                                 conn->features[6], conn->features[7]);
55 }
56
57 #define LINK_ATTR(_name, _mode, _show, _store) \
58 struct device_attribute link_attr_##_name = __ATTR(_name, _mode, _show, _store)
59
60 static LINK_ATTR(type, S_IRUGO, show_link_type, NULL);
61 static LINK_ATTR(address, S_IRUGO, show_link_address, NULL);
62 static LINK_ATTR(features, S_IRUGO, show_link_features, NULL);
63
64 static struct attribute *bt_link_attrs[] = {
65         &link_attr_type.attr,
66         &link_attr_address.attr,
67         &link_attr_features.attr,
68         NULL
69 };
70
71 static struct attribute_group bt_link_group = {
72         .attrs = bt_link_attrs,
73 };
74
75 static const struct attribute_group *bt_link_groups[] = {
76         &bt_link_group,
77         NULL
78 };
79
80 static void bt_link_release(struct device *dev)
81 {
82         void *data = dev_get_drvdata(dev);
83         kfree(data);
84 }
85
86 static struct device_type bt_link = {
87         .name    = "link",
88         .groups  = bt_link_groups,
89         .release = bt_link_release,
90 };
91
92 static void add_conn(struct work_struct *work)
93 {
94         struct hci_conn *conn = container_of(work, struct hci_conn, work_add);
95         struct hci_dev *hdev = conn->hdev;
96
97         dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);
98
99         dev_set_drvdata(&conn->dev, conn);
100
101         if (device_add(&conn->dev) < 0) {
102                 BT_ERR("Failed to register connection device");
103                 return;
104         }
105
106         hci_dev_hold(hdev);
107 }
108
109 /*
110  * The rfcomm tty device will possibly retain even when conn
111  * is down, and sysfs doesn't support move zombie device,
112  * so we should move the device before conn device is destroyed.
113  */
114 static int __match_tty(struct device *dev, void *data)
115 {
116         return !strncmp(dev_name(dev), "rfcomm", 6);
117 }
118
119 static void del_conn(struct work_struct *work)
120 {
121         struct hci_conn *conn = container_of(work, struct hci_conn, work_del);
122         struct hci_dev *hdev = conn->hdev;
123
124         if (!device_is_registered(&conn->dev))
125                 return;
126
127         while (1) {
128                 struct device *dev;
129
130                 dev = device_find_child(&conn->dev, NULL, __match_tty);
131                 if (!dev)
132                         break;
133                 device_move(dev, NULL, DPM_ORDER_DEV_LAST);
134                 put_device(dev);
135         }
136
137         device_del(&conn->dev);
138         put_device(&conn->dev);
139
140         hci_dev_put(hdev);
141 }
142
143 void hci_conn_init_sysfs(struct hci_conn *conn)
144 {
145         struct hci_dev *hdev = conn->hdev;
146
147         BT_DBG("conn %p", conn);
148
149         conn->dev.type = &bt_link;
150         conn->dev.class = bt_class;
151         conn->dev.parent = &hdev->dev;
152
153         device_initialize(&conn->dev);
154
155         INIT_WORK(&conn->work_add, add_conn);
156         INIT_WORK(&conn->work_del, del_conn);
157 }
158
159 void hci_conn_add_sysfs(struct hci_conn *conn)
160 {
161         BT_DBG("conn %p", conn);
162
163         queue_work(conn->hdev->workqueue, &conn->work_add);
164 }
165
166 void hci_conn_del_sysfs(struct hci_conn *conn)
167 {
168         BT_DBG("conn %p", conn);
169
170         queue_work(conn->hdev->workqueue, &conn->work_del);
171 }
172
173 static inline char *host_bustostr(int bus)
174 {
175         switch (bus) {
176         case HCI_VIRTUAL:
177                 return "VIRTUAL";
178         case HCI_USB:
179                 return "USB";
180         case HCI_PCCARD:
181                 return "PCCARD";
182         case HCI_UART:
183                 return "UART";
184         case HCI_RS232:
185                 return "RS232";
186         case HCI_PCI:
187                 return "PCI";
188         case HCI_SDIO:
189                 return "SDIO";
190         default:
191                 return "UNKNOWN";
192         }
193 }
194
195 static inline char *host_typetostr(int type)
196 {
197         switch (type) {
198         case HCI_BREDR:
199                 return "BR/EDR";
200         case HCI_AMP:
201                 return "AMP";
202         default:
203                 return "UNKNOWN";
204         }
205 }
206
207 static ssize_t show_bus(struct device *dev, struct device_attribute *attr, char *buf)
208 {
209         struct hci_dev *hdev = dev_get_drvdata(dev);
210         return sprintf(buf, "%s\n", host_bustostr(hdev->bus));
211 }
212
213 static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf)
214 {
215         struct hci_dev *hdev = dev_get_drvdata(dev);
216         return sprintf(buf, "%s\n", host_typetostr(hdev->dev_type));
217 }
218
219 static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
220 {
221         struct hci_dev *hdev = dev_get_drvdata(dev);
222         char name[HCI_MAX_NAME_LENGTH + 1];
223         int i;
224
225         for (i = 0; i < HCI_MAX_NAME_LENGTH; i++)
226                 name[i] = hdev->dev_name[i];
227
228         name[HCI_MAX_NAME_LENGTH] = '\0';
229         return sprintf(buf, "%s\n", name);
230 }
231
232 static ssize_t show_class(struct device *dev, struct device_attribute *attr, char *buf)
233 {
234         struct hci_dev *hdev = dev_get_drvdata(dev);
235         return sprintf(buf, "0x%.2x%.2x%.2x\n",
236                         hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
237 }
238
239 static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf)
240 {
241         struct hci_dev *hdev = dev_get_drvdata(dev);
242         return sprintf(buf, "%s\n", batostr(&hdev->bdaddr));
243 }
244
245 static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf)
246 {
247         struct hci_dev *hdev = dev_get_drvdata(dev);
248
249         return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
250                                 hdev->features[0], hdev->features[1],
251                                 hdev->features[2], hdev->features[3],
252                                 hdev->features[4], hdev->features[5],
253                                 hdev->features[6], hdev->features[7]);
254 }
255
256 static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf)
257 {
258         struct hci_dev *hdev = dev_get_drvdata(dev);
259         return sprintf(buf, "%d\n", hdev->manufacturer);
260 }
261
262 static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf)
263 {
264         struct hci_dev *hdev = dev_get_drvdata(dev);
265         return sprintf(buf, "%d\n", hdev->hci_ver);
266 }
267
268 static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf)
269 {
270         struct hci_dev *hdev = dev_get_drvdata(dev);
271         return sprintf(buf, "%d\n", hdev->hci_rev);
272 }
273
274 static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *attr, char *buf)
275 {
276         struct hci_dev *hdev = dev_get_drvdata(dev);
277         return sprintf(buf, "%d\n", hdev->idle_timeout);
278 }
279
280 static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
281 {
282         struct hci_dev *hdev = dev_get_drvdata(dev);
283         unsigned int val;
284         int rv;
285
286         rv = kstrtouint(buf, 0, &val);
287         if (rv < 0)
288                 return rv;
289
290         if (val != 0 && (val < 500 || val > 3600000))
291                 return -EINVAL;
292
293         hdev->idle_timeout = val;
294
295         return count;
296 }
297
298 static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf)
299 {
300         struct hci_dev *hdev = dev_get_drvdata(dev);
301         return sprintf(buf, "%d\n", hdev->sniff_max_interval);
302 }
303
304 static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
305 {
306         struct hci_dev *hdev = dev_get_drvdata(dev);
307         u16 val;
308         int rv;
309
310         rv = kstrtou16(buf, 0, &val);
311         if (rv < 0)
312                 return rv;
313
314         if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
315                 return -EINVAL;
316
317         hdev->sniff_max_interval = val;
318
319         return count;
320 }
321
322 static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf)
323 {
324         struct hci_dev *hdev = dev_get_drvdata(dev);
325         return sprintf(buf, "%d\n", hdev->sniff_min_interval);
326 }
327
328 static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
329 {
330         struct hci_dev *hdev = dev_get_drvdata(dev);
331         u16 val;
332         int rv;
333
334         rv = kstrtou16(buf, 0, &val);
335         if (rv < 0)
336                 return rv;
337
338         if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
339                 return -EINVAL;
340
341         hdev->sniff_min_interval = val;
342
343         return count;
344 }
345
346 static DEVICE_ATTR(bus, S_IRUGO, show_bus, NULL);
347 static DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
348 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
349 static DEVICE_ATTR(class, S_IRUGO, show_class, NULL);
350 static DEVICE_ATTR(address, S_IRUGO, show_address, NULL);
351 static DEVICE_ATTR(features, S_IRUGO, show_features, NULL);
352 static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL);
353 static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL);
354 static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL);
355
356 static DEVICE_ATTR(idle_timeout, S_IRUGO | S_IWUSR,
357                                 show_idle_timeout, store_idle_timeout);
358 static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR,
359                                 show_sniff_max_interval, store_sniff_max_interval);
360 static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR,
361                                 show_sniff_min_interval, store_sniff_min_interval);
362
363 static struct attribute *bt_host_attrs[] = {
364         &dev_attr_bus.attr,
365         &dev_attr_type.attr,
366         &dev_attr_name.attr,
367         &dev_attr_class.attr,
368         &dev_attr_address.attr,
369         &dev_attr_features.attr,
370         &dev_attr_manufacturer.attr,
371         &dev_attr_hci_version.attr,
372         &dev_attr_hci_revision.attr,
373         &dev_attr_idle_timeout.attr,
374         &dev_attr_sniff_max_interval.attr,
375         &dev_attr_sniff_min_interval.attr,
376         NULL
377 };
378
379 static struct attribute_group bt_host_group = {
380         .attrs = bt_host_attrs,
381 };
382
383 static const struct attribute_group *bt_host_groups[] = {
384         &bt_host_group,
385         NULL
386 };
387
388 static void bt_host_release(struct device *dev)
389 {
390         void *data = dev_get_drvdata(dev);
391         kfree(data);
392 }
393
394 static struct device_type bt_host = {
395         .name    = "host",
396         .groups  = bt_host_groups,
397         .release = bt_host_release,
398 };
399
400 static int inquiry_cache_show(struct seq_file *f, void *p)
401 {
402         struct hci_dev *hdev = f->private;
403         struct inquiry_cache *cache = &hdev->inq_cache;
404         struct inquiry_entry *e;
405
406         hci_dev_lock_bh(hdev);
407
408         for (e = cache->list; e; e = e->next) {
409                 struct inquiry_data *data = &e->data;
410                 seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
411                            batostr(&data->bdaddr),
412                            data->pscan_rep_mode, data->pscan_period_mode,
413                            data->pscan_mode, data->dev_class[2],
414                            data->dev_class[1], data->dev_class[0],
415                            __le16_to_cpu(data->clock_offset),
416                            data->rssi, data->ssp_mode, e->timestamp);
417         }
418
419         hci_dev_unlock_bh(hdev);
420
421         return 0;
422 }
423
424 static int inquiry_cache_open(struct inode *inode, struct file *file)
425 {
426         return single_open(file, inquiry_cache_show, inode->i_private);
427 }
428
429 static const struct file_operations inquiry_cache_fops = {
430         .open           = inquiry_cache_open,
431         .read           = seq_read,
432         .llseek         = seq_lseek,
433         .release        = single_release,
434 };
435
436 static int blacklist_show(struct seq_file *f, void *p)
437 {
438         struct hci_dev *hdev = f->private;
439         struct list_head *l;
440
441         hci_dev_lock_bh(hdev);
442
443         list_for_each(l, &hdev->blacklist) {
444                 struct bdaddr_list *b;
445
446                 b = list_entry(l, struct bdaddr_list, list);
447
448                 seq_printf(f, "%s\n", batostr(&b->bdaddr));
449         }
450
451         hci_dev_unlock_bh(hdev);
452
453         return 0;
454 }
455
456 static int blacklist_open(struct inode *inode, struct file *file)
457 {
458         return single_open(file, blacklist_show, inode->i_private);
459 }
460
461 static const struct file_operations blacklist_fops = {
462         .open           = blacklist_open,
463         .read           = seq_read,
464         .llseek         = seq_lseek,
465         .release        = single_release,
466 };
467
468 static void print_bt_uuid(struct seq_file *f, u8 *uuid)
469 {
470         u32 data0, data4;
471         u16 data1, data2, data3, data5;
472
473         memcpy(&data0, &uuid[0], 4);
474         memcpy(&data1, &uuid[4], 2);
475         memcpy(&data2, &uuid[6], 2);
476         memcpy(&data3, &uuid[8], 2);
477         memcpy(&data4, &uuid[10], 4);
478         memcpy(&data5, &uuid[14], 2);
479
480         seq_printf(f, "%.8x-%.4x-%.4x-%.4x-%.8x%.4x\n",
481                                 ntohl(data0), ntohs(data1), ntohs(data2),
482                                 ntohs(data3), ntohl(data4), ntohs(data5));
483 }
484
485 static int uuids_show(struct seq_file *f, void *p)
486 {
487         struct hci_dev *hdev = f->private;
488         struct list_head *l;
489
490         hci_dev_lock_bh(hdev);
491
492         list_for_each(l, &hdev->uuids) {
493                 struct bt_uuid *uuid;
494
495                 uuid = list_entry(l, struct bt_uuid, list);
496
497                 print_bt_uuid(f, uuid->uuid);
498         }
499
500         hci_dev_unlock_bh(hdev);
501
502         return 0;
503 }
504
505 static int uuids_open(struct inode *inode, struct file *file)
506 {
507         return single_open(file, uuids_show, inode->i_private);
508 }
509
510 static const struct file_operations uuids_fops = {
511         .open           = uuids_open,
512         .read           = seq_read,
513         .llseek         = seq_lseek,
514         .release        = single_release,
515 };
516
517 static int auto_accept_delay_set(void *data, u64 val)
518 {
519         struct hci_dev *hdev = data;
520
521         hci_dev_lock_bh(hdev);
522
523         hdev->auto_accept_delay = val;
524
525         hci_dev_unlock_bh(hdev);
526
527         return 0;
528 }
529
530 static int auto_accept_delay_get(void *data, u64 *val)
531 {
532         struct hci_dev *hdev = data;
533
534         hci_dev_lock_bh(hdev);
535
536         *val = hdev->auto_accept_delay;
537
538         hci_dev_unlock_bh(hdev);
539
540         return 0;
541 }
542
543 DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
544                                         auto_accept_delay_set, "%llu\n");
545
546 int hci_register_sysfs(struct hci_dev *hdev)
547 {
548         struct device *dev = &hdev->dev;
549         int err;
550
551         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
552
553         dev->type = &bt_host;
554         dev->class = bt_class;
555         dev->parent = hdev->parent;
556
557         dev_set_name(dev, "%s", hdev->name);
558
559         dev_set_drvdata(dev, hdev);
560
561         err = device_register(dev);
562         if (err < 0)
563                 return err;
564
565         if (!bt_debugfs)
566                 return 0;
567
568         hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
569         if (!hdev->debugfs)
570                 return 0;
571
572         debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
573                                                 hdev, &inquiry_cache_fops);
574
575         debugfs_create_file("blacklist", 0444, hdev->debugfs,
576                                                 hdev, &blacklist_fops);
577
578         debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
579
580         debugfs_create_file("auto_accept_delay", 0444, hdev->debugfs, hdev,
581                                                 &auto_accept_delay_fops);
582         return 0;
583 }
584
585 void hci_unregister_sysfs(struct hci_dev *hdev)
586 {
587         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
588
589         debugfs_remove_recursive(hdev->debugfs);
590
591         device_del(&hdev->dev);
592 }
593
594 int __init bt_sysfs_init(void)
595 {
596         bt_debugfs = debugfs_create_dir("bluetooth", NULL);
597
598         bt_class = class_create(THIS_MODULE, "bluetooth");
599         if (IS_ERR(bt_class))
600                 return PTR_ERR(bt_class);
601
602         return 0;
603 }
604
605 void bt_sysfs_cleanup(void)
606 {
607         class_destroy(bt_class);
608
609         debugfs_remove_recursive(bt_debugfs);
610 }