Bluetooth: Convert inquiry cache to use debugfs instead of sysfs
[pandora-kernel.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
7 #include <net/bluetooth/bluetooth.h>
8 #include <net/bluetooth/hci_core.h>
9
10 struct class *bt_class = NULL;
11 EXPORT_SYMBOL_GPL(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 ssize_t show_bus(struct device *dev, struct device_attribute *attr, char *buf)
196 {
197         struct hci_dev *hdev = dev_get_drvdata(dev);
198         return sprintf(buf, "%s\n", host_bustostr(hdev->bus));
199 }
200
201 static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
202 {
203         struct hci_dev *hdev = dev_get_drvdata(dev);
204         char name[249];
205         int i;
206
207         for (i = 0; i < 248; i++)
208                 name[i] = hdev->dev_name[i];
209
210         name[248] = '\0';
211         return sprintf(buf, "%s\n", name);
212 }
213
214 static ssize_t show_class(struct device *dev, struct device_attribute *attr, char *buf)
215 {
216         struct hci_dev *hdev = dev_get_drvdata(dev);
217         return sprintf(buf, "0x%.2x%.2x%.2x\n",
218                         hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
219 }
220
221 static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf)
222 {
223         struct hci_dev *hdev = dev_get_drvdata(dev);
224         bdaddr_t bdaddr;
225         baswap(&bdaddr, &hdev->bdaddr);
226         return sprintf(buf, "%s\n", batostr(&bdaddr));
227 }
228
229 static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf)
230 {
231         struct hci_dev *hdev = dev_get_drvdata(dev);
232
233         return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
234                                 hdev->features[0], hdev->features[1],
235                                 hdev->features[2], hdev->features[3],
236                                 hdev->features[4], hdev->features[5],
237                                 hdev->features[6], hdev->features[7]);
238 }
239
240 static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf)
241 {
242         struct hci_dev *hdev = dev_get_drvdata(dev);
243         return sprintf(buf, "%d\n", hdev->manufacturer);
244 }
245
246 static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf)
247 {
248         struct hci_dev *hdev = dev_get_drvdata(dev);
249         return sprintf(buf, "%d\n", hdev->hci_ver);
250 }
251
252 static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf)
253 {
254         struct hci_dev *hdev = dev_get_drvdata(dev);
255         return sprintf(buf, "%d\n", hdev->hci_rev);
256 }
257
258 static ssize_t show_idle_timeout(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->idle_timeout);
262 }
263
264 static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
265 {
266         struct hci_dev *hdev = dev_get_drvdata(dev);
267         char *ptr;
268         __u32 val;
269
270         val = simple_strtoul(buf, &ptr, 10);
271         if (ptr == buf)
272                 return -EINVAL;
273
274         if (val != 0 && (val < 500 || val > 3600000))
275                 return -EINVAL;
276
277         hdev->idle_timeout = val;
278
279         return count;
280 }
281
282 static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf)
283 {
284         struct hci_dev *hdev = dev_get_drvdata(dev);
285         return sprintf(buf, "%d\n", hdev->sniff_max_interval);
286 }
287
288 static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
289 {
290         struct hci_dev *hdev = dev_get_drvdata(dev);
291         char *ptr;
292         __u16 val;
293
294         val = simple_strtoul(buf, &ptr, 10);
295         if (ptr == buf)
296                 return -EINVAL;
297
298         if (val < 0x0002 || val > 0xFFFE || val % 2)
299                 return -EINVAL;
300
301         if (val < hdev->sniff_min_interval)
302                 return -EINVAL;
303
304         hdev->sniff_max_interval = val;
305
306         return count;
307 }
308
309 static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf)
310 {
311         struct hci_dev *hdev = dev_get_drvdata(dev);
312         return sprintf(buf, "%d\n", hdev->sniff_min_interval);
313 }
314
315 static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
316 {
317         struct hci_dev *hdev = dev_get_drvdata(dev);
318         char *ptr;
319         __u16 val;
320
321         val = simple_strtoul(buf, &ptr, 10);
322         if (ptr == buf)
323                 return -EINVAL;
324
325         if (val < 0x0002 || val > 0xFFFE || val % 2)
326                 return -EINVAL;
327
328         if (val > hdev->sniff_max_interval)
329                 return -EINVAL;
330
331         hdev->sniff_min_interval = val;
332
333         return count;
334 }
335
336 static DEVICE_ATTR(bus, S_IRUGO, show_bus, NULL);
337 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
338 static DEVICE_ATTR(class, S_IRUGO, show_class, NULL);
339 static DEVICE_ATTR(address, S_IRUGO, show_address, NULL);
340 static DEVICE_ATTR(features, S_IRUGO, show_features, NULL);
341 static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL);
342 static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL);
343 static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL);
344
345 static DEVICE_ATTR(idle_timeout, S_IRUGO | S_IWUSR,
346                                 show_idle_timeout, store_idle_timeout);
347 static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR,
348                                 show_sniff_max_interval, store_sniff_max_interval);
349 static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR,
350                                 show_sniff_min_interval, store_sniff_min_interval);
351
352 static struct attribute *bt_host_attrs[] = {
353         &dev_attr_bus.attr,
354         &dev_attr_name.attr,
355         &dev_attr_class.attr,
356         &dev_attr_address.attr,
357         &dev_attr_features.attr,
358         &dev_attr_manufacturer.attr,
359         &dev_attr_hci_version.attr,
360         &dev_attr_hci_revision.attr,
361         &dev_attr_idle_timeout.attr,
362         &dev_attr_sniff_max_interval.attr,
363         &dev_attr_sniff_min_interval.attr,
364         NULL
365 };
366
367 static struct attribute_group bt_host_group = {
368         .attrs = bt_host_attrs,
369 };
370
371 static const struct attribute_group *bt_host_groups[] = {
372         &bt_host_group,
373         NULL
374 };
375
376 static void bt_host_release(struct device *dev)
377 {
378         void *data = dev_get_drvdata(dev);
379         kfree(data);
380 }
381
382 static struct device_type bt_host = {
383         .name    = "host",
384         .groups  = bt_host_groups,
385         .release = bt_host_release,
386 };
387
388 static int inquiry_cache_open(struct inode *inode, struct file *file)
389 {
390         file->private_data = inode->i_private;
391         return 0;
392 }
393
394 static ssize_t inquiry_cache_read(struct file *file, char __user *userbuf,
395                                                 size_t count, loff_t *ppos)
396 {
397         struct hci_dev *hdev = file->private_data;
398         struct inquiry_cache *cache = &hdev->inq_cache;
399         struct inquiry_entry *e;
400         char buf[4096];
401         int n = 0;
402
403         hci_dev_lock_bh(hdev);
404
405         for (e = cache->list; e; e = e->next) {
406                 struct inquiry_data *data = &e->data;
407                 bdaddr_t bdaddr;
408                 baswap(&bdaddr, &data->bdaddr);
409                 n += sprintf(buf + n, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
410                                 batostr(&bdaddr),
411                                 data->pscan_rep_mode, data->pscan_period_mode,
412                                 data->pscan_mode, data->dev_class[2],
413                                 data->dev_class[1], data->dev_class[0],
414                                 __le16_to_cpu(data->clock_offset),
415                                 data->rssi, data->ssp_mode, e->timestamp);
416         }
417
418         hci_dev_unlock_bh(hdev);
419
420         return simple_read_from_buffer(userbuf, count, ppos, buf, n);
421 }
422
423 static const struct file_operations inquiry_cache_fops = {
424         .open = inquiry_cache_open,
425         .read = inquiry_cache_read,
426 };
427
428 int hci_register_sysfs(struct hci_dev *hdev)
429 {
430         struct device *dev = &hdev->dev;
431         int err;
432
433         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
434
435         dev->type = &bt_host;
436         dev->class = bt_class;
437         dev->parent = hdev->parent;
438
439         dev_set_name(dev, "%s", hdev->name);
440
441         dev_set_drvdata(dev, hdev);
442
443         err = device_register(dev);
444         if (err < 0)
445                 return err;
446
447         if (!bt_debugfs)
448                 return 0;
449
450         hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
451         if (!hdev->debugfs)
452                 return 0;
453
454         debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
455                                                 hdev, &inquiry_cache_fops);
456
457         return 0;
458 }
459
460 void hci_unregister_sysfs(struct hci_dev *hdev)
461 {
462         BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
463
464         debugfs_remove_recursive(hdev->debugfs);
465
466         device_del(&hdev->dev);
467 }
468
469 int __init bt_sysfs_init(void)
470 {
471         bt_workq = create_singlethread_workqueue("bluetooth");
472         if (!bt_workq)
473                 return -ENOMEM;
474
475         bt_debugfs = debugfs_create_dir("bluetooth", NULL);
476
477         bt_class = class_create(THIS_MODULE, "bluetooth");
478         if (IS_ERR(bt_class)) {
479                 destroy_workqueue(bt_workq);
480                 return PTR_ERR(bt_class);
481         }
482
483         return 0;
484 }
485
486 void bt_sysfs_cleanup(void)
487 {
488         class_destroy(bt_class);
489
490         debugfs_remove_recursive(bt_debugfs);
491
492         destroy_workqueue(bt_workq);
493 }