Merge drm/drm-fixes into drm-misc-fixes
[linux-2.6-microblaze.git] / drivers / bluetooth / hci_vhci.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *
4  *  Bluetooth virtual HCI driver
5  *
6  *  Copyright (C) 2000-2001  Qualcomm Incorporated
7  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
8  *  Copyright (C) 2004-2006  Marcel Holtmann <marcel@holtmann.org>
9  */
10
11 #include <linux/module.h>
12 #include <asm/unaligned.h>
13
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
17 #include <linux/types.h>
18 #include <linux/errno.h>
19 #include <linux/sched.h>
20 #include <linux/poll.h>
21
22 #include <linux/skbuff.h>
23 #include <linux/miscdevice.h>
24 #include <linux/debugfs.h>
25
26 #include <net/bluetooth/bluetooth.h>
27 #include <net/bluetooth/hci_core.h>
28
29 #define VERSION "1.5"
30
31 static bool amp;
32
33 struct vhci_data {
34         struct hci_dev *hdev;
35
36         wait_queue_head_t read_wait;
37         struct sk_buff_head readq;
38
39         struct mutex open_mutex;
40         struct delayed_work open_timeout;
41
42         bool suspended;
43         bool wakeup;
44 };
45
46 static int vhci_open_dev(struct hci_dev *hdev)
47 {
48         return 0;
49 }
50
51 static int vhci_close_dev(struct hci_dev *hdev)
52 {
53         struct vhci_data *data = hci_get_drvdata(hdev);
54
55         skb_queue_purge(&data->readq);
56
57         return 0;
58 }
59
60 static int vhci_flush(struct hci_dev *hdev)
61 {
62         struct vhci_data *data = hci_get_drvdata(hdev);
63
64         skb_queue_purge(&data->readq);
65
66         return 0;
67 }
68
69 static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
70 {
71         struct vhci_data *data = hci_get_drvdata(hdev);
72
73         memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
74         skb_queue_tail(&data->readq, skb);
75
76         wake_up_interruptible(&data->read_wait);
77         return 0;
78 }
79
80 static int vhci_get_data_path_id(struct hci_dev *hdev, u8 *data_path_id)
81 {
82         *data_path_id = 0;
83         return 0;
84 }
85
86 static int vhci_get_codec_config_data(struct hci_dev *hdev, __u8 type,
87                                       struct bt_codec *codec, __u8 *vnd_len,
88                                       __u8 **vnd_data)
89 {
90         if (type != ESCO_LINK)
91                 return -EINVAL;
92
93         *vnd_len = 0;
94         *vnd_data = NULL;
95         return 0;
96 }
97
98 static bool vhci_wakeup(struct hci_dev *hdev)
99 {
100         struct vhci_data *data = hci_get_drvdata(hdev);
101
102         return data->wakeup;
103 }
104
105 static ssize_t force_suspend_read(struct file *file, char __user *user_buf,
106                                   size_t count, loff_t *ppos)
107 {
108         struct vhci_data *data = file->private_data;
109         char buf[3];
110
111         buf[0] = data->suspended ? 'Y' : 'N';
112         buf[1] = '\n';
113         buf[2] = '\0';
114         return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
115 }
116
117 static ssize_t force_suspend_write(struct file *file,
118                                    const char __user *user_buf,
119                                    size_t count, loff_t *ppos)
120 {
121         struct vhci_data *data = file->private_data;
122         bool enable;
123         int err;
124
125         err = kstrtobool_from_user(user_buf, count, &enable);
126         if (err)
127                 return err;
128
129         if (data->suspended == enable)
130                 return -EALREADY;
131
132         if (enable)
133                 err = hci_suspend_dev(data->hdev);
134         else
135                 err = hci_resume_dev(data->hdev);
136
137         if (err)
138                 return err;
139
140         data->suspended = enable;
141
142         return count;
143 }
144
145 static const struct file_operations force_suspend_fops = {
146         .open           = simple_open,
147         .read           = force_suspend_read,
148         .write          = force_suspend_write,
149         .llseek         = default_llseek,
150 };
151
152 static ssize_t force_wakeup_read(struct file *file, char __user *user_buf,
153                                  size_t count, loff_t *ppos)
154 {
155         struct vhci_data *data = file->private_data;
156         char buf[3];
157
158         buf[0] = data->wakeup ? 'Y' : 'N';
159         buf[1] = '\n';
160         buf[2] = '\0';
161         return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
162 }
163
164 static ssize_t force_wakeup_write(struct file *file,
165                                   const char __user *user_buf, size_t count,
166                                   loff_t *ppos)
167 {
168         struct vhci_data *data = file->private_data;
169         bool enable;
170         int err;
171
172         err = kstrtobool_from_user(user_buf, count, &enable);
173         if (err)
174                 return err;
175
176         if (data->wakeup == enable)
177                 return -EALREADY;
178
179         return count;
180 }
181
182 static const struct file_operations force_wakeup_fops = {
183         .open           = simple_open,
184         .read           = force_wakeup_read,
185         .write          = force_wakeup_write,
186         .llseek         = default_llseek,
187 };
188
189 static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
190 {
191         struct hci_dev *hdev;
192         struct sk_buff *skb;
193         __u8 dev_type;
194
195         if (data->hdev)
196                 return -EBADFD;
197
198         /* bits 0-1 are dev_type (Primary or AMP) */
199         dev_type = opcode & 0x03;
200
201         if (dev_type != HCI_PRIMARY && dev_type != HCI_AMP)
202                 return -EINVAL;
203
204         /* bits 2-5 are reserved (must be zero) */
205         if (opcode & 0x3c)
206                 return -EINVAL;
207
208         skb = bt_skb_alloc(4, GFP_KERNEL);
209         if (!skb)
210                 return -ENOMEM;
211
212         hdev = hci_alloc_dev();
213         if (!hdev) {
214                 kfree_skb(skb);
215                 return -ENOMEM;
216         }
217
218         data->hdev = hdev;
219
220         hdev->bus = HCI_VIRTUAL;
221         hdev->dev_type = dev_type;
222         hci_set_drvdata(hdev, data);
223
224         hdev->open  = vhci_open_dev;
225         hdev->close = vhci_close_dev;
226         hdev->flush = vhci_flush;
227         hdev->send  = vhci_send_frame;
228         hdev->get_data_path_id = vhci_get_data_path_id;
229         hdev->get_codec_config_data = vhci_get_codec_config_data;
230         hdev->wakeup = vhci_wakeup;
231
232         /* bit 6 is for external configuration */
233         if (opcode & 0x40)
234                 set_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks);
235
236         /* bit 7 is for raw device */
237         if (opcode & 0x80)
238                 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
239
240         if (hci_register_dev(hdev) < 0) {
241                 BT_ERR("Can't register HCI device");
242                 hci_free_dev(hdev);
243                 data->hdev = NULL;
244                 kfree_skb(skb);
245                 return -EBUSY;
246         }
247
248         debugfs_create_file("force_suspend", 0644, hdev->debugfs, data,
249                             &force_suspend_fops);
250
251         debugfs_create_file("force_wakeup", 0644, hdev->debugfs, data,
252                             &force_wakeup_fops);
253
254         hci_skb_pkt_type(skb) = HCI_VENDOR_PKT;
255
256         skb_put_u8(skb, 0xff);
257         skb_put_u8(skb, opcode);
258         put_unaligned_le16(hdev->id, skb_put(skb, 2));
259         skb_queue_tail(&data->readq, skb);
260
261         wake_up_interruptible(&data->read_wait);
262         return 0;
263 }
264
265 static int vhci_create_device(struct vhci_data *data, __u8 opcode)
266 {
267         int err;
268
269         mutex_lock(&data->open_mutex);
270         err = __vhci_create_device(data, opcode);
271         mutex_unlock(&data->open_mutex);
272
273         return err;
274 }
275
276 static inline ssize_t vhci_get_user(struct vhci_data *data,
277                                     struct iov_iter *from)
278 {
279         size_t len = iov_iter_count(from);
280         struct sk_buff *skb;
281         __u8 pkt_type, opcode;
282         int ret;
283
284         if (len < 2 || len > HCI_MAX_FRAME_SIZE)
285                 return -EINVAL;
286
287         skb = bt_skb_alloc(len, GFP_KERNEL);
288         if (!skb)
289                 return -ENOMEM;
290
291         if (!copy_from_iter_full(skb_put(skb, len), len, from)) {
292                 kfree_skb(skb);
293                 return -EFAULT;
294         }
295
296         pkt_type = *((__u8 *) skb->data);
297         skb_pull(skb, 1);
298
299         switch (pkt_type) {
300         case HCI_EVENT_PKT:
301         case HCI_ACLDATA_PKT:
302         case HCI_SCODATA_PKT:
303         case HCI_ISODATA_PKT:
304                 if (!data->hdev) {
305                         kfree_skb(skb);
306                         return -ENODEV;
307                 }
308
309                 hci_skb_pkt_type(skb) = pkt_type;
310
311                 ret = hci_recv_frame(data->hdev, skb);
312                 break;
313
314         case HCI_VENDOR_PKT:
315                 cancel_delayed_work_sync(&data->open_timeout);
316
317                 opcode = *((__u8 *) skb->data);
318                 skb_pull(skb, 1);
319
320                 if (skb->len > 0) {
321                         kfree_skb(skb);
322                         return -EINVAL;
323                 }
324
325                 kfree_skb(skb);
326
327                 ret = vhci_create_device(data, opcode);
328                 break;
329
330         default:
331                 kfree_skb(skb);
332                 return -EINVAL;
333         }
334
335         return (ret < 0) ? ret : len;
336 }
337
338 static inline ssize_t vhci_put_user(struct vhci_data *data,
339                                     struct sk_buff *skb,
340                                     char __user *buf, int count)
341 {
342         char __user *ptr = buf;
343         int len;
344
345         len = min_t(unsigned int, skb->len, count);
346
347         if (copy_to_user(ptr, skb->data, len))
348                 return -EFAULT;
349
350         if (!data->hdev)
351                 return len;
352
353         data->hdev->stat.byte_tx += len;
354
355         switch (hci_skb_pkt_type(skb)) {
356         case HCI_COMMAND_PKT:
357                 data->hdev->stat.cmd_tx++;
358                 break;
359         case HCI_ACLDATA_PKT:
360                 data->hdev->stat.acl_tx++;
361                 break;
362         case HCI_SCODATA_PKT:
363                 data->hdev->stat.sco_tx++;
364                 break;
365         }
366
367         return len;
368 }
369
370 static ssize_t vhci_read(struct file *file,
371                          char __user *buf, size_t count, loff_t *pos)
372 {
373         struct vhci_data *data = file->private_data;
374         struct sk_buff *skb;
375         ssize_t ret = 0;
376
377         while (count) {
378                 skb = skb_dequeue(&data->readq);
379                 if (skb) {
380                         ret = vhci_put_user(data, skb, buf, count);
381                         if (ret < 0)
382                                 skb_queue_head(&data->readq, skb);
383                         else
384                                 kfree_skb(skb);
385                         break;
386                 }
387
388                 if (file->f_flags & O_NONBLOCK) {
389                         ret = -EAGAIN;
390                         break;
391                 }
392
393                 ret = wait_event_interruptible(data->read_wait,
394                                                !skb_queue_empty(&data->readq));
395                 if (ret < 0)
396                         break;
397         }
398
399         return ret;
400 }
401
402 static ssize_t vhci_write(struct kiocb *iocb, struct iov_iter *from)
403 {
404         struct file *file = iocb->ki_filp;
405         struct vhci_data *data = file->private_data;
406
407         return vhci_get_user(data, from);
408 }
409
410 static __poll_t vhci_poll(struct file *file, poll_table *wait)
411 {
412         struct vhci_data *data = file->private_data;
413
414         poll_wait(file, &data->read_wait, wait);
415
416         if (!skb_queue_empty(&data->readq))
417                 return EPOLLIN | EPOLLRDNORM;
418
419         return EPOLLOUT | EPOLLWRNORM;
420 }
421
422 static void vhci_open_timeout(struct work_struct *work)
423 {
424         struct vhci_data *data = container_of(work, struct vhci_data,
425                                               open_timeout.work);
426
427         vhci_create_device(data, amp ? HCI_AMP : HCI_PRIMARY);
428 }
429
430 static int vhci_open(struct inode *inode, struct file *file)
431 {
432         struct vhci_data *data;
433
434         data = kzalloc(sizeof(struct vhci_data), GFP_KERNEL);
435         if (!data)
436                 return -ENOMEM;
437
438         skb_queue_head_init(&data->readq);
439         init_waitqueue_head(&data->read_wait);
440
441         mutex_init(&data->open_mutex);
442         INIT_DELAYED_WORK(&data->open_timeout, vhci_open_timeout);
443
444         file->private_data = data;
445         nonseekable_open(inode, file);
446
447         schedule_delayed_work(&data->open_timeout, msecs_to_jiffies(1000));
448
449         return 0;
450 }
451
452 static int vhci_release(struct inode *inode, struct file *file)
453 {
454         struct vhci_data *data = file->private_data;
455         struct hci_dev *hdev;
456
457         cancel_delayed_work_sync(&data->open_timeout);
458
459         hdev = data->hdev;
460
461         if (hdev) {
462                 hci_unregister_dev(hdev);
463                 hci_free_dev(hdev);
464         }
465
466         skb_queue_purge(&data->readq);
467         file->private_data = NULL;
468         kfree(data);
469
470         return 0;
471 }
472
473 static const struct file_operations vhci_fops = {
474         .owner          = THIS_MODULE,
475         .read           = vhci_read,
476         .write_iter     = vhci_write,
477         .poll           = vhci_poll,
478         .open           = vhci_open,
479         .release        = vhci_release,
480         .llseek         = no_llseek,
481 };
482
483 static struct miscdevice vhci_miscdev = {
484         .name   = "vhci",
485         .fops   = &vhci_fops,
486         .minor  = VHCI_MINOR,
487 };
488 module_misc_device(vhci_miscdev);
489
490 module_param(amp, bool, 0644);
491 MODULE_PARM_DESC(amp, "Create AMP controller device");
492
493 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
494 MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION);
495 MODULE_VERSION(VERSION);
496 MODULE_LICENSE("GPL");
497 MODULE_ALIAS("devname:vhci");
498 MODULE_ALIAS_MISCDEV(VHCI_MINOR);