Bluetooth: Convert debug files to actually use debugfs instead of sysfs
[linux-2.6.git] / net / bluetooth / hci_sysfs.c
1 /* Bluetooth HCI driver model support. */
2
3 #include <linux/kernel.h>
4 #include <linux/init.h>
5 #include <linux/debugfs.h>
6 #include <linux/seq_file.h>
7
8 #include <net/bluetooth/bluetooth.h>
9 #include <net/bluetooth/hci_core.h>
10
11 static struct class *bt_class;
12
13 struct dentry *bt_debugfs = NULL;
14 EXPORT_SYMBOL_GPL(bt_debugfs);
15
16 static struct workqueue_struct *bt_workq;
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         default:
28                 return "UNKNOWN";
29         }
30 }
31
32 static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf)
33 {
34         struct hci_conn *conn = dev_get_drvdata(dev);
35         return sprintf(buf, "%s\n", link_typetostr(conn->type));
36 }
37
38 static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf)
39 {
40         struct hci_conn *conn = dev_get_drvdata(dev);
41         bdaddr_t bdaddr;
42         baswap(&bdaddr, &conn->dst);
43         return sprintf(buf, "%s\n", batostr(&bdaddr));
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(bt_workq, &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(bt_workq, &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_80211:
201                 return "802.11";
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[249];
223         int i;
224
225         for (i = 0; i < 248; i++)
226                 name[i] = hdev->dev_name[i];
227
228         name[248] = '\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         bdaddr_t bdaddr;
243         baswap(&bdaddr, &hdev->bdaddr);
244         return sprintf(buf, "%s\n", batostr(&bdaddr));
245 }
246
247 static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf)
248 {
249         struct hci_dev *hdev = dev_get_drvdata(dev);
250
251         return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
252                                 hdev->features[0], hdev->features[1],
253                                 hdev->features[2], hdev->features[3],
254                                 hdev->features[4], hdev->features[5],
255                                 hdev->features[6], hdev->features[7]);
256 }
257
258 static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf)
259 {
260         struct hci_dev *hdev = dev_get_drvdata(dev);
261         return sprintf(buf, "%d\n", hdev->manufacturer);
262 }
263
264 static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf)
265 {
266         struct hci_dev *hdev = dev_get_drvdata(dev);
267         return sprintf(buf, "%d\n", hdev->hci_ver);
268 }
269
270 static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf)
271 {
272         struct hci_dev *hdev = dev_get_drvdata(dev);
273         return sprintf(buf, "%d\n", hdev->hci_rev);
274 }
275
276 static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *attr, char *buf)
277 {
278         struct hci_dev *hdev = dev_get_drvdata(dev);
279         return sprintf(buf, "%d\n", hdev->idle_timeout);
280 }
281
282 static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
283 {
284         struct hci_dev *hdev = dev_get_drvdata(dev);
285         char *ptr;
286         __u32 val;
287
288         val = simple_strtoul(buf, &ptr, 10);
289         if (ptr == buf)
290                 return -EINVAL;
291
292         if (val != 0 && (val < 500 || val > 3600000))
293                 return -EINVAL;
294
295         hdev->idle_timeout = val;
296
297         return count;
298 }
299
300 static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf)
301 {
302         struct hci_dev *hdev = dev_get_drvdata(dev);
303         return sprintf(buf, "%d\n", hdev->sniff_max_interval);
304 }
305
306 static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
307 {
308         struct hci_dev *hdev = dev_get_drvdata(dev);
309         char *ptr;
310         __u16 val;
311
312         val = simple_strtoul(buf, &ptr, 10);
313         if (ptr == buf)
314                 return -EINVAL;
315
316         if (val < 0x0002 || val > 0xFFFE || val % 2)
317                 return -EINVAL;
318
319         if (val < hdev->sniff_min_interval)
320                 return -EINVAL;
321
322         hdev->sniff_max_interval = val;
323
324         return count;
325 }
326
327 static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf)
328 {
329         struct hci_dev *hdev = dev_get_drvdata(dev);
330         return sprintf(buf, "%d\n", hdev->sniff_min_interval);
331 }
332
333 static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
334 {
335         struct hci_dev *hdev = dev_get_drvdata(dev);
336         char *ptr;
337         __u16 val;
338
339         val = simple_strtoul(buf, &ptr, 10);
340         if (ptr == buf)
341                 return -EINVAL;
342
343         if (val < 0x0002 || val > 0xFFFE || val % 2)
344                 return -EINVAL;
345
346         if (val > hdev->sniff_max_interval)
347                 return -EINVAL;
348
349         hdev->sniff_min_interval = val;
350
351         return count;
352 }
353
354 static DEVICE_ATTR(bus, S_IRUGO, show_bus, NULL);
355 static DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
356 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
357 static DEVICE_ATTR(class, S_IRUGO, show_class, NULL);
358 static DEVICE_ATTR(address, S_IRUGO, show_address, NULL);
359 static DEVICE_ATTR(features, S_IRUGO, show_features, NULL);
360 static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL);
361 static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL);
362 static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL);
363
364 static DEVICE_ATTR(idle_timeout, S_IRUGO | S_IWUSR,
365                                 show_idle_timeout, store_idle_timeout);
366 static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR,
367                                 show_sniff_max_interval, store_sniff_max_interval);
368 static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR,
369                                 show_sniff_min_interval, store_sniff_min_interval);
370
371 static struct attribute *bt_host_attrs[] = {
372         &dev_attr_bus.attr,
373         &dev_attr_type.attr,
374         &dev_attr_name.attr,
375         &dev_attr_class.attr,
376         &dev_attr_address.attr,
377         &dev_attr_features.attr,
378         &dev_attr_manufacturer.attr,
379         &dev_attr_hci_version.attr,
380         &dev_attr_hci_revision.attr,
381         &dev_attr_idle_timeout.attr,
382         &dev_attr_sniff_max_interval.attr,
383         &dev_attr_sniff_min_interval.attr,
384         NULL
385 };
386
387 static struct attribute_group bt_host_group = {
388         .attrs = bt_host_attrs,
389 };
390
391 static const struct attribute_group *bt_host_groups[] = {
392         &bt_host_group,
393         NULL
394 };
395
396 static void bt_host_release(struct device *dev)
397 {
398         void *data = dev_get_drvdata(dev);
399         kfree(data);
400 }
401
402 static struct device_type bt_host = {
403         .name    = "host",
404         .groups  = bt_host_groups,
405         .release = bt_host_release,
406 };
407
408 static int inquiry_cache_show(struct seq_file *f, void *p)
409 {
410         struct hci_dev *hdev = f->private;
411         struct inquiry_cache *cache = &hdev->inq_cache;
412         struct inquiry_entry *e;
413
414         hci_dev_lock_bh(hdev);
415
416         for (e = cache->list; e; e = e->next) {
417                 struct inquiry_data *data = &e->data;
418                 bdaddr_t bdaddr;
419                 baswap(&bdaddr, &data->bdaddr);
420                 seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
421                            batostr(&bdaddr),
422                            data->pscan_rep_mode, data->pscan_period_mode,
423                            data->pscan_mode, data->dev_class[2],
424                            data->dev_class[1], data->dev_class[0],
425                            __le16_to_cpu(data->clock_offset),
426                            data->rssi, data->ssp_mode, e->timestamp);
427         }
428
429         hci_dev_unlock_bh(hdev);
430
431         return 0;
432 }
433
434 static int inquiry_cache_open(struct inode *inode, struct file *file)
435 {
436         return single_open(file, inquiry_cache_show, inode->i_private);
437 }
438
439 static const struct file_operations inquiry_cache_fops = {
440         .open           = inquiry_cache_open,
441         .read           = seq_read,
442         .llseek         = seq_lseek,
443         .release        = single_release,
444 };
445
446 int hci_register_sysfs(struct hci_dev *hdev)
447 {
448         struct device *dev = &hdev->dev;
449         int err;
450
451         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
452
453         dev->type = &bt_host;
454         dev->class = bt_class;
455         dev->parent = hdev->parent;
456
457         dev_set_name(dev, "%s", hdev->name);
458
459         dev_set_drvdata(dev, hdev);
460
461         err = device_register(dev);
462         if (err < 0)
463                 return err;
464
465         if (!bt_debugfs)
466                 return 0;
467
468         hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
469         if (!hdev->debugfs)
470                 return 0;
471
472         debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
473                                                 hdev, &inquiry_cache_fops);
474
475         return 0;
476 }
477
478 void hci_unregister_sysfs(struct hci_dev *hdev)
479 {
480         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
481
482         debugfs_remove_recursive(hdev->debugfs);
483
484         device_del(&hdev->dev);
485 }
486
487 int __init bt_sysfs_init(void)
488 {
489         bt_workq = create_singlethread_workqueue("bluetooth");
490         if (!bt_workq)
491                 return -ENOMEM;
492
493         bt_debugfs = debugfs_create_dir("bluetooth", NULL);
494
495         bt_class = class_create(THIS_MODULE, "bluetooth");
496         if (IS_ERR(bt_class)) {
497                 destroy_workqueue(bt_workq);
498                 return PTR_ERR(bt_class);
499         }
500
501         return 0;
502 }
503
504 void bt_sysfs_cleanup(void)
505 {
506         class_destroy(bt_class);
507
508         debugfs_remove_recursive(bt_debugfs);
509
510         destroy_workqueue(bt_workq);
511 }