blob: 5833b87c51cfef50eb8f6d5638246e3cf2646782 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 RFCOMM implementation for Linux Bluetooth stack (BlueZ).
3 Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
4 Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation;
9
10 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
13 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
14 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
19 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
21 SOFTWARE IS DISCLAIMED.
22*/
23
24/*
25 * RFCOMM TTY.
26 *
27 * $Id: tty.c,v 1.24 2002/10/03 01:54:38 holtmann Exp $
28 */
29
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/module.h>
31
32#include <linux/tty.h>
33#include <linux/tty_driver.h>
34#include <linux/tty_flip.h>
35
Randy Dunlap4fc268d2006-01-11 12:17:47 -080036#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/slab.h>
38#include <linux/skbuff.h>
39
40#include <net/bluetooth/bluetooth.h>
Marcel Holtmann0a85b962006-07-06 13:09:02 +020041#include <net/bluetooth/hci_core.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <net/bluetooth/rfcomm.h>
43
44#ifndef CONFIG_BT_RFCOMM_DEBUG
45#undef BT_DBG
46#define BT_DBG(D...)
47#endif
48
49#define RFCOMM_TTY_MAGIC 0x6d02 /* magic number for rfcomm struct */
50#define RFCOMM_TTY_PORTS RFCOMM_MAX_DEV /* whole lotta rfcomm devices */
51#define RFCOMM_TTY_MAJOR 216 /* device node major id of the usb/bluetooth.c driver */
52#define RFCOMM_TTY_MINOR 0
53
54static struct tty_driver *rfcomm_tty_driver;
55
56struct rfcomm_dev {
57 struct list_head list;
58 atomic_t refcnt;
59
60 char name[12];
61 int id;
62 unsigned long flags;
63 int opened;
64 int err;
65
66 bdaddr_t src;
67 bdaddr_t dst;
68 u8 channel;
69
70 uint modem_status;
71
72 struct rfcomm_dlc *dlc;
73 struct tty_struct *tty;
74 wait_queue_head_t wait;
75 struct tasklet_struct wakeup_task;
76
77 atomic_t wmem_alloc;
78};
79
80static LIST_HEAD(rfcomm_dev_list);
81static DEFINE_RWLOCK(rfcomm_dev_lock);
82
83static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb);
84static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err);
85static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig);
86
87static void rfcomm_tty_wakeup(unsigned long arg);
88
89/* ---- Device functions ---- */
90static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
91{
92 struct rfcomm_dlc *dlc = dev->dlc;
93
94 BT_DBG("dev %p dlc %p", dev, dlc);
95
96 rfcomm_dlc_lock(dlc);
97 /* Detach DLC if it's owned by this dev */
98 if (dlc->owner == dev)
99 dlc->owner = NULL;
100 rfcomm_dlc_unlock(dlc);
101
102 rfcomm_dlc_put(dlc);
103
104 tty_unregister_device(rfcomm_tty_driver, dev->id);
105
106 /* Refcount should only hit zero when called from rfcomm_dev_del()
107 which will have taken us off the list. Everything else are
108 refcounting bugs. */
109 BUG_ON(!list_empty(&dev->list));
110
111 kfree(dev);
112
113 /* It's safe to call module_put() here because socket still
114 holds reference to this module. */
115 module_put(THIS_MODULE);
116}
117
118static inline void rfcomm_dev_hold(struct rfcomm_dev *dev)
119{
120 atomic_inc(&dev->refcnt);
121}
122
123static inline void rfcomm_dev_put(struct rfcomm_dev *dev)
124{
125 /* The reason this isn't actually a race, as you no
126 doubt have a little voice screaming at you in your
127 head, is that the refcount should never actually
128 reach zero unless the device has already been taken
129 off the list, in rfcomm_dev_del(). And if that's not
130 true, we'll hit the BUG() in rfcomm_dev_destruct()
131 anyway. */
132 if (atomic_dec_and_test(&dev->refcnt))
133 rfcomm_dev_destruct(dev);
134}
135
136static struct rfcomm_dev *__rfcomm_dev_get(int id)
137{
138 struct rfcomm_dev *dev;
139 struct list_head *p;
140
141 list_for_each(p, &rfcomm_dev_list) {
142 dev = list_entry(p, struct rfcomm_dev, list);
143 if (dev->id == id)
144 return dev;
145 }
146
147 return NULL;
148}
149
150static inline struct rfcomm_dev *rfcomm_dev_get(int id)
151{
152 struct rfcomm_dev *dev;
153
154 read_lock(&rfcomm_dev_lock);
155
156 dev = __rfcomm_dev_get(id);
157 if (dev)
158 rfcomm_dev_hold(dev);
159
160 read_unlock(&rfcomm_dev_lock);
161
162 return dev;
163}
164
Marcel Holtmann0a85b962006-07-06 13:09:02 +0200165static struct device *rfcomm_get_device(struct rfcomm_dev *dev)
166{
167 struct hci_dev *hdev;
168 struct hci_conn *conn;
169
170 hdev = hci_get_route(&dev->dst, &dev->src);
171 if (!hdev)
172 return NULL;
173
174 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &dev->dst);
Marcel Holtmann0a85b962006-07-06 13:09:02 +0200175
176 hci_dev_put(hdev);
177
Marcel Holtmannb2cfcd72006-10-15 17:31:05 +0200178 return conn ? &conn->dev : NULL;
Marcel Holtmann0a85b962006-07-06 13:09:02 +0200179}
180
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
182{
183 struct rfcomm_dev *dev;
184 struct list_head *head = &rfcomm_dev_list, *p;
185 int err = 0;
186
187 BT_DBG("id %d channel %d", req->dev_id, req->channel);
188
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200189 dev = kzalloc(sizeof(struct rfcomm_dev), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 if (!dev)
191 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192
193 write_lock_bh(&rfcomm_dev_lock);
194
195 if (req->dev_id < 0) {
196 dev->id = 0;
197
198 list_for_each(p, &rfcomm_dev_list) {
199 if (list_entry(p, struct rfcomm_dev, list)->id != dev->id)
200 break;
201
202 dev->id++;
203 head = p;
204 }
205 } else {
206 dev->id = req->dev_id;
207
208 list_for_each(p, &rfcomm_dev_list) {
209 struct rfcomm_dev *entry = list_entry(p, struct rfcomm_dev, list);
210
211 if (entry->id == dev->id) {
212 err = -EADDRINUSE;
213 goto out;
214 }
215
216 if (entry->id > dev->id - 1)
217 break;
218
219 head = p;
220 }
221 }
222
223 if ((dev->id < 0) || (dev->id > RFCOMM_MAX_DEV - 1)) {
224 err = -ENFILE;
225 goto out;
226 }
227
228 sprintf(dev->name, "rfcomm%d", dev->id);
229
230 list_add(&dev->list, head);
231 atomic_set(&dev->refcnt, 1);
232
233 bacpy(&dev->src, &req->src);
234 bacpy(&dev->dst, &req->dst);
235 dev->channel = req->channel;
236
237 dev->flags = req->flags &
238 ((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));
239
240 init_waitqueue_head(&dev->wait);
241 tasklet_init(&dev->wakeup_task, rfcomm_tty_wakeup, (unsigned long) dev);
242
243 rfcomm_dlc_lock(dlc);
244 dlc->data_ready = rfcomm_dev_data_ready;
245 dlc->state_change = rfcomm_dev_state_change;
246 dlc->modem_status = rfcomm_dev_modem_status;
247
248 dlc->owner = dev;
249 dev->dlc = dlc;
250 rfcomm_dlc_unlock(dlc);
251
252 /* It's safe to call __module_get() here because socket already
253 holds reference to this module. */
254 __module_get(THIS_MODULE);
255
256out:
257 write_unlock_bh(&rfcomm_dev_lock);
258
259 if (err) {
260 kfree(dev);
261 return err;
262 }
263
Marcel Holtmann0a85b962006-07-06 13:09:02 +0200264 tty_register_device(rfcomm_tty_driver, dev->id, rfcomm_get_device(dev));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265
266 return dev->id;
267}
268
269static void rfcomm_dev_del(struct rfcomm_dev *dev)
270{
271 BT_DBG("dev %p", dev);
272
273 write_lock_bh(&rfcomm_dev_lock);
274 list_del_init(&dev->list);
275 write_unlock_bh(&rfcomm_dev_lock);
276
277 rfcomm_dev_put(dev);
278}
279
280/* ---- Send buffer ---- */
281static inline unsigned int rfcomm_room(struct rfcomm_dlc *dlc)
282{
283 /* We can't let it be zero, because we don't get a callback
284 when tx_credits becomes nonzero, hence we'd never wake up */
285 return dlc->mtu * (dlc->tx_credits?:1);
286}
287
288static void rfcomm_wfree(struct sk_buff *skb)
289{
290 struct rfcomm_dev *dev = (void *) skb->sk;
291 atomic_sub(skb->truesize, &dev->wmem_alloc);
292 if (test_bit(RFCOMM_TTY_ATTACHED, &dev->flags))
293 tasklet_schedule(&dev->wakeup_task);
294 rfcomm_dev_put(dev);
295}
296
297static inline void rfcomm_set_owner_w(struct sk_buff *skb, struct rfcomm_dev *dev)
298{
299 rfcomm_dev_hold(dev);
300 atomic_add(skb->truesize, &dev->wmem_alloc);
301 skb->sk = (void *) dev;
302 skb->destructor = rfcomm_wfree;
303}
304
Al Virodd0fc662005-10-07 07:46:04 +0100305static struct sk_buff *rfcomm_wmalloc(struct rfcomm_dev *dev, unsigned long size, gfp_t priority)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306{
307 if (atomic_read(&dev->wmem_alloc) < rfcomm_room(dev->dlc)) {
308 struct sk_buff *skb = alloc_skb(size, priority);
309 if (skb) {
310 rfcomm_set_owner_w(skb, dev);
311 return skb;
312 }
313 }
314 return NULL;
315}
316
317/* ---- Device IOCTLs ---- */
318
319#define NOCAP_FLAGS ((1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP))
320
321static int rfcomm_create_dev(struct sock *sk, void __user *arg)
322{
323 struct rfcomm_dev_req req;
324 struct rfcomm_dlc *dlc;
325 int id;
326
327 if (copy_from_user(&req, arg, sizeof(req)))
328 return -EFAULT;
329
330 BT_DBG("sk %p dev_id %id flags 0x%x", sk, req.dev_id, req.flags);
331
332 if (req.flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN))
333 return -EPERM;
334
335 if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
336 /* Socket must be connected */
337 if (sk->sk_state != BT_CONNECTED)
338 return -EBADFD;
339
340 dlc = rfcomm_pi(sk)->dlc;
341 rfcomm_dlc_hold(dlc);
342 } else {
343 dlc = rfcomm_dlc_alloc(GFP_KERNEL);
344 if (!dlc)
345 return -ENOMEM;
346 }
347
348 id = rfcomm_dev_add(&req, dlc);
349 if (id < 0) {
350 rfcomm_dlc_put(dlc);
351 return id;
352 }
353
354 if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
355 /* DLC is now used by device.
356 * Socket must be disconnected */
357 sk->sk_state = BT_CLOSED;
358 }
359
360 return id;
361}
362
363static int rfcomm_release_dev(void __user *arg)
364{
365 struct rfcomm_dev_req req;
366 struct rfcomm_dev *dev;
367
368 if (copy_from_user(&req, arg, sizeof(req)))
369 return -EFAULT;
370
371 BT_DBG("dev_id %id flags 0x%x", req.dev_id, req.flags);
372
373 if (!(dev = rfcomm_dev_get(req.dev_id)))
374 return -ENODEV;
375
376 if (dev->flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN)) {
377 rfcomm_dev_put(dev);
378 return -EPERM;
379 }
380
381 if (req.flags & (1 << RFCOMM_HANGUP_NOW))
382 rfcomm_dlc_close(dev->dlc, 0);
383
384 rfcomm_dev_del(dev);
385 rfcomm_dev_put(dev);
386 return 0;
387}
388
389static int rfcomm_get_dev_list(void __user *arg)
390{
391 struct rfcomm_dev_list_req *dl;
392 struct rfcomm_dev_info *di;
393 struct list_head *p;
394 int n = 0, size, err;
395 u16 dev_num;
396
397 BT_DBG("");
398
399 if (get_user(dev_num, (u16 __user *) arg))
400 return -EFAULT;
401
402 if (!dev_num || dev_num > (PAGE_SIZE * 4) / sizeof(*di))
403 return -EINVAL;
404
405 size = sizeof(*dl) + dev_num * sizeof(*di);
406
407 if (!(dl = kmalloc(size, GFP_KERNEL)))
408 return -ENOMEM;
409
410 di = dl->dev_info;
411
412 read_lock_bh(&rfcomm_dev_lock);
413
414 list_for_each(p, &rfcomm_dev_list) {
415 struct rfcomm_dev *dev = list_entry(p, struct rfcomm_dev, list);
416 (di + n)->id = dev->id;
417 (di + n)->flags = dev->flags;
418 (di + n)->state = dev->dlc->state;
419 (di + n)->channel = dev->channel;
420 bacpy(&(di + n)->src, &dev->src);
421 bacpy(&(di + n)->dst, &dev->dst);
422 if (++n >= dev_num)
423 break;
424 }
425
426 read_unlock_bh(&rfcomm_dev_lock);
427
428 dl->dev_num = n;
429 size = sizeof(*dl) + n * sizeof(*di);
430
431 err = copy_to_user(arg, dl, size);
432 kfree(dl);
433
434 return err ? -EFAULT : 0;
435}
436
437static int rfcomm_get_dev_info(void __user *arg)
438{
439 struct rfcomm_dev *dev;
440 struct rfcomm_dev_info di;
441 int err = 0;
442
443 BT_DBG("");
444
445 if (copy_from_user(&di, arg, sizeof(di)))
446 return -EFAULT;
447
448 if (!(dev = rfcomm_dev_get(di.id)))
449 return -ENODEV;
450
451 di.flags = dev->flags;
452 di.channel = dev->channel;
453 di.state = dev->dlc->state;
454 bacpy(&di.src, &dev->src);
455 bacpy(&di.dst, &dev->dst);
456
457 if (copy_to_user(arg, &di, sizeof(di)))
458 err = -EFAULT;
459
460 rfcomm_dev_put(dev);
461 return err;
462}
463
464int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
465{
466 BT_DBG("cmd %d arg %p", cmd, arg);
467
468 switch (cmd) {
469 case RFCOMMCREATEDEV:
470 return rfcomm_create_dev(sk, arg);
471
472 case RFCOMMRELEASEDEV:
473 return rfcomm_release_dev(arg);
474
475 case RFCOMMGETDEVLIST:
476 return rfcomm_get_dev_list(arg);
477
478 case RFCOMMGETDEVINFO:
479 return rfcomm_get_dev_info(arg);
480 }
481
482 return -EINVAL;
483}
484
485/* ---- DLC callbacks ---- */
486static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
487{
488 struct rfcomm_dev *dev = dlc->owner;
489 struct tty_struct *tty;
490
491 if (!dev || !(tty = dev->tty)) {
492 kfree_skb(skb);
493 return;
494 }
495
496 BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len);
497
Paul Fulghum817d6d32006-06-28 04:26:47 -0700498 tty_insert_flip_string(tty, skb->data, skb->len);
499 tty_flip_buffer_push(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500
501 kfree_skb(skb);
502}
503
504static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
505{
506 struct rfcomm_dev *dev = dlc->owner;
507 if (!dev)
508 return;
509
510 BT_DBG("dlc %p dev %p err %d", dlc, dev, err);
511
512 dev->err = err;
513 wake_up_interruptible(&dev->wait);
514
515 if (dlc->state == BT_CLOSED) {
516 if (!dev->tty) {
517 if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {
518 rfcomm_dev_hold(dev);
519 rfcomm_dev_del(dev);
520
521 /* We have to drop DLC lock here, otherwise
522 rfcomm_dev_put() will dead lock if it's
523 the last reference. */
524 rfcomm_dlc_unlock(dlc);
525 rfcomm_dev_put(dev);
526 rfcomm_dlc_lock(dlc);
527 }
528 } else
529 tty_hangup(dev->tty);
530 }
531}
532
533static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
534{
535 struct rfcomm_dev *dev = dlc->owner;
536 if (!dev)
537 return;
Timo Teräs7b9eb9e2005-08-09 20:28:21 -0700538
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 BT_DBG("dlc %p dev %p v24_sig 0x%02x", dlc, dev, v24_sig);
540
Timo Teräs7b9eb9e2005-08-09 20:28:21 -0700541 if ((dev->modem_status & TIOCM_CD) && !(v24_sig & RFCOMM_V24_DV)) {
542 if (dev->tty && !C_CLOCAL(dev->tty))
543 tty_hangup(dev->tty);
544 }
545
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 dev->modem_status =
547 ((v24_sig & RFCOMM_V24_RTC) ? (TIOCM_DSR | TIOCM_DTR) : 0) |
548 ((v24_sig & RFCOMM_V24_RTR) ? (TIOCM_RTS | TIOCM_CTS) : 0) |
549 ((v24_sig & RFCOMM_V24_IC) ? TIOCM_RI : 0) |
550 ((v24_sig & RFCOMM_V24_DV) ? TIOCM_CD : 0);
551}
552
553/* ---- TTY functions ---- */
554static void rfcomm_tty_wakeup(unsigned long arg)
555{
556 struct rfcomm_dev *dev = (void *) arg;
557 struct tty_struct *tty = dev->tty;
558 if (!tty)
559 return;
560
561 BT_DBG("dev %p tty %p", dev, tty);
562
563 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
564 (tty->ldisc.write_wakeup)(tty);
565
566 wake_up_interruptible(&tty->write_wait);
567#ifdef SERIAL_HAVE_POLL_WAIT
568 wake_up_interruptible(&tty->poll_wait);
569#endif
570}
571
572static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
573{
574 DECLARE_WAITQUEUE(wait, current);
575 struct rfcomm_dev *dev;
576 struct rfcomm_dlc *dlc;
577 int err, id;
578
579 id = tty->index;
580
581 BT_DBG("tty %p id %d", tty, id);
582
583 /* We don't leak this refcount. For reasons which are not entirely
584 clear, the TTY layer will call our ->close() method even if the
585 open fails. We decrease the refcount there, and decreasing it
586 here too would cause breakage. */
587 dev = rfcomm_dev_get(id);
588 if (!dev)
589 return -ENODEV;
590
591 BT_DBG("dev %p dst %s channel %d opened %d", dev, batostr(&dev->dst), dev->channel, dev->opened);
592
593 if (dev->opened++ != 0)
594 return 0;
595
596 dlc = dev->dlc;
597
598 /* Attach TTY and open DLC */
599
600 rfcomm_dlc_lock(dlc);
601 tty->driver_data = dev;
602 dev->tty = tty;
603 rfcomm_dlc_unlock(dlc);
604 set_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
605
606 err = rfcomm_dlc_open(dlc, &dev->src, &dev->dst, dev->channel);
607 if (err < 0)
608 return err;
609
610 /* Wait for DLC to connect */
611 add_wait_queue(&dev->wait, &wait);
612 while (1) {
613 set_current_state(TASK_INTERRUPTIBLE);
614
615 if (dlc->state == BT_CLOSED) {
616 err = -dev->err;
617 break;
618 }
619
620 if (dlc->state == BT_CONNECTED)
621 break;
622
623 if (signal_pending(current)) {
624 err = -EINTR;
625 break;
626 }
627
628 schedule();
629 }
630 set_current_state(TASK_RUNNING);
631 remove_wait_queue(&dev->wait, &wait);
632
633 return err;
634}
635
636static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
637{
638 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
639 if (!dev)
640 return;
641
642 BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
643
644 if (--dev->opened == 0) {
645 /* Close DLC and dettach TTY */
646 rfcomm_dlc_close(dev->dlc, 0);
647
648 clear_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
649 tasklet_kill(&dev->wakeup_task);
650
651 rfcomm_dlc_lock(dev->dlc);
652 tty->driver_data = NULL;
653 dev->tty = NULL;
654 rfcomm_dlc_unlock(dev->dlc);
655 }
656
657 rfcomm_dev_put(dev);
658}
659
660static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
661{
662 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
663 struct rfcomm_dlc *dlc = dev->dlc;
664 struct sk_buff *skb;
665 int err = 0, sent = 0, size;
666
667 BT_DBG("tty %p count %d", tty, count);
668
669 while (count) {
670 size = min_t(uint, count, dlc->mtu);
671
672 skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_ATOMIC);
673
674 if (!skb)
675 break;
676
677 skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
678
679 memcpy(skb_put(skb, size), buf + sent, size);
680
681 if ((err = rfcomm_dlc_send(dlc, skb)) < 0) {
682 kfree_skb(skb);
683 break;
684 }
685
686 sent += size;
687 count -= size;
688 }
689
690 return sent ? sent : err;
691}
692
693static int rfcomm_tty_write_room(struct tty_struct *tty)
694{
695 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
696 int room;
697
698 BT_DBG("tty %p", tty);
699
700 room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc);
701 if (room < 0)
702 room = 0;
703 return room;
704}
705
706static int rfcomm_tty_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, unsigned long arg)
707{
708 BT_DBG("tty %p cmd 0x%02x", tty, cmd);
709
710 switch (cmd) {
711 case TCGETS:
712 BT_DBG("TCGETS is not supported");
713 return -ENOIOCTLCMD;
714
715 case TCSETS:
716 BT_DBG("TCSETS is not supported");
717 return -ENOIOCTLCMD;
718
719 case TIOCMIWAIT:
720 BT_DBG("TIOCMIWAIT");
721 break;
722
723 case TIOCGICOUNT:
724 BT_DBG("TIOCGICOUNT");
725 break;
726
727 case TIOCGSERIAL:
728 BT_ERR("TIOCGSERIAL is not supported");
729 return -ENOIOCTLCMD;
730
731 case TIOCSSERIAL:
732 BT_ERR("TIOCSSERIAL is not supported");
733 return -ENOIOCTLCMD;
734
735 case TIOCSERGSTRUCT:
736 BT_ERR("TIOCSERGSTRUCT is not supported");
737 return -ENOIOCTLCMD;
738
739 case TIOCSERGETLSR:
740 BT_ERR("TIOCSERGETLSR is not supported");
741 return -ENOIOCTLCMD;
742
743 case TIOCSERCONFIG:
744 BT_ERR("TIOCSERCONFIG is not supported");
745 return -ENOIOCTLCMD;
746
747 default:
748 return -ENOIOCTLCMD; /* ioctls which we must ignore */
749
750 }
751
752 return -ENOIOCTLCMD;
753}
754
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old)
756{
J. Suter3a5e9032005-08-09 20:28:46 -0700757 struct termios *new = (struct termios *) tty->termios;
758 int old_baud_rate = tty_termios_baud_rate(old);
759 int new_baud_rate = tty_termios_baud_rate(new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760
J. Suter3a5e9032005-08-09 20:28:46 -0700761 u8 baud, data_bits, stop_bits, parity, x_on, x_off;
762 u16 changes = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763
J. Suter3a5e9032005-08-09 20:28:46 -0700764 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
765
766 BT_DBG("tty %p termios %p", tty, old);
767
768 /* Handle turning off CRTSCTS */
769 if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS))
770 BT_DBG("Turning off CRTSCTS unsupported");
771
772 /* Parity on/off and when on, odd/even */
773 if (((old->c_cflag & PARENB) != (new->c_cflag & PARENB)) ||
774 ((old->c_cflag & PARODD) != (new->c_cflag & PARODD)) ) {
775 changes |= RFCOMM_RPN_PM_PARITY;
776 BT_DBG("Parity change detected.");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777 }
J. Suter3a5e9032005-08-09 20:28:46 -0700778
779 /* Mark and space parity are not supported! */
780 if (new->c_cflag & PARENB) {
781 if (new->c_cflag & PARODD) {
782 BT_DBG("Parity is ODD");
783 parity = RFCOMM_RPN_PARITY_ODD;
784 } else {
785 BT_DBG("Parity is EVEN");
786 parity = RFCOMM_RPN_PARITY_EVEN;
787 }
788 } else {
789 BT_DBG("Parity is OFF");
790 parity = RFCOMM_RPN_PARITY_NONE;
791 }
792
793 /* Setting the x_on / x_off characters */
794 if (old->c_cc[VSTOP] != new->c_cc[VSTOP]) {
795 BT_DBG("XOFF custom");
796 x_on = new->c_cc[VSTOP];
797 changes |= RFCOMM_RPN_PM_XON;
798 } else {
799 BT_DBG("XOFF default");
800 x_on = RFCOMM_RPN_XON_CHAR;
801 }
802
803 if (old->c_cc[VSTART] != new->c_cc[VSTART]) {
804 BT_DBG("XON custom");
805 x_off = new->c_cc[VSTART];
806 changes |= RFCOMM_RPN_PM_XOFF;
807 } else {
808 BT_DBG("XON default");
809 x_off = RFCOMM_RPN_XOFF_CHAR;
810 }
811
812 /* Handle setting of stop bits */
813 if ((old->c_cflag & CSTOPB) != (new->c_cflag & CSTOPB))
814 changes |= RFCOMM_RPN_PM_STOP;
815
816 /* POSIX does not support 1.5 stop bits and RFCOMM does not
817 * support 2 stop bits. So a request for 2 stop bits gets
818 * translated to 1.5 stop bits */
819 if (new->c_cflag & CSTOPB) {
820 stop_bits = RFCOMM_RPN_STOP_15;
821 } else {
822 stop_bits = RFCOMM_RPN_STOP_1;
823 }
824
825 /* Handle number of data bits [5-8] */
826 if ((old->c_cflag & CSIZE) != (new->c_cflag & CSIZE))
827 changes |= RFCOMM_RPN_PM_DATA;
828
829 switch (new->c_cflag & CSIZE) {
830 case CS5:
831 data_bits = RFCOMM_RPN_DATA_5;
832 break;
833 case CS6:
834 data_bits = RFCOMM_RPN_DATA_6;
835 break;
836 case CS7:
837 data_bits = RFCOMM_RPN_DATA_7;
838 break;
839 case CS8:
840 data_bits = RFCOMM_RPN_DATA_8;
841 break;
842 default:
843 data_bits = RFCOMM_RPN_DATA_8;
844 break;
845 }
846
847 /* Handle baudrate settings */
848 if (old_baud_rate != new_baud_rate)
849 changes |= RFCOMM_RPN_PM_BITRATE;
850
851 switch (new_baud_rate) {
852 case 2400:
853 baud = RFCOMM_RPN_BR_2400;
854 break;
855 case 4800:
856 baud = RFCOMM_RPN_BR_4800;
857 break;
858 case 7200:
859 baud = RFCOMM_RPN_BR_7200;
860 break;
861 case 9600:
862 baud = RFCOMM_RPN_BR_9600;
863 break;
864 case 19200:
865 baud = RFCOMM_RPN_BR_19200;
866 break;
867 case 38400:
868 baud = RFCOMM_RPN_BR_38400;
869 break;
870 case 57600:
871 baud = RFCOMM_RPN_BR_57600;
872 break;
873 case 115200:
874 baud = RFCOMM_RPN_BR_115200;
875 break;
876 case 230400:
877 baud = RFCOMM_RPN_BR_230400;
878 break;
879 default:
880 /* 9600 is standard accordinag to the RFCOMM specification */
881 baud = RFCOMM_RPN_BR_9600;
882 break;
883
884 }
885
886 if (changes)
887 rfcomm_send_rpn(dev->dlc->session, 1, dev->dlc->dlci, baud,
888 data_bits, stop_bits, parity,
889 RFCOMM_RPN_FLOW_NONE, x_on, x_off, changes);
890
891 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892}
893
894static void rfcomm_tty_throttle(struct tty_struct *tty)
895{
896 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
897
898 BT_DBG("tty %p dev %p", tty, dev);
J. Suter3a5e9032005-08-09 20:28:46 -0700899
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 rfcomm_dlc_throttle(dev->dlc);
901}
902
903static void rfcomm_tty_unthrottle(struct tty_struct *tty)
904{
905 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
906
907 BT_DBG("tty %p dev %p", tty, dev);
J. Suter3a5e9032005-08-09 20:28:46 -0700908
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 rfcomm_dlc_unthrottle(dev->dlc);
910}
911
912static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty)
913{
914 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
915 struct rfcomm_dlc *dlc = dev->dlc;
916
917 BT_DBG("tty %p dev %p", tty, dev);
918
David S. Millerb03efcf2005-07-08 14:57:23 -0700919 if (!skb_queue_empty(&dlc->tx_queue))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 return dlc->mtu;
921
922 return 0;
923}
924
925static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
926{
927 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
928 if (!dev)
929 return;
930
931 BT_DBG("tty %p dev %p", tty, dev);
932
933 skb_queue_purge(&dev->dlc->tx_queue);
934
935 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
936 tty->ldisc.write_wakeup(tty);
937}
938
939static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch)
940{
941 BT_DBG("tty %p ch %c", tty, ch);
942}
943
944static void rfcomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
945{
946 BT_DBG("tty %p timeout %d", tty, timeout);
947}
948
949static void rfcomm_tty_hangup(struct tty_struct *tty)
950{
951 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
952 if (!dev)
953 return;
954
955 BT_DBG("tty %p dev %p", tty, dev);
956
957 rfcomm_tty_flush_buffer(tty);
958
959 if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags))
960 rfcomm_dev_del(dev);
961}
962
963static int rfcomm_tty_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *unused)
964{
965 return 0;
966}
967
968static int rfcomm_tty_tiocmget(struct tty_struct *tty, struct file *filp)
969{
970 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
971
972 BT_DBG("tty %p dev %p", tty, dev);
973
974 return dev->modem_status;
975}
976
977static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsigned int set, unsigned int clear)
978{
J. Suter3a5e9032005-08-09 20:28:46 -0700979 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
980 struct rfcomm_dlc *dlc = dev->dlc;
981 u8 v24_sig;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982
983 BT_DBG("tty %p dev %p set 0x%02x clear 0x%02x", tty, dev, set, clear);
984
J. Suter3a5e9032005-08-09 20:28:46 -0700985 rfcomm_dlc_get_modem_status(dlc, &v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986
J. Suter3a5e9032005-08-09 20:28:46 -0700987 if (set & TIOCM_DSR || set & TIOCM_DTR)
988 v24_sig |= RFCOMM_V24_RTC;
989 if (set & TIOCM_RTS || set & TIOCM_CTS)
990 v24_sig |= RFCOMM_V24_RTR;
991 if (set & TIOCM_RI)
992 v24_sig |= RFCOMM_V24_IC;
993 if (set & TIOCM_CD)
994 v24_sig |= RFCOMM_V24_DV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995
J. Suter3a5e9032005-08-09 20:28:46 -0700996 if (clear & TIOCM_DSR || clear & TIOCM_DTR)
997 v24_sig &= ~RFCOMM_V24_RTC;
998 if (clear & TIOCM_RTS || clear & TIOCM_CTS)
999 v24_sig &= ~RFCOMM_V24_RTR;
1000 if (clear & TIOCM_RI)
1001 v24_sig &= ~RFCOMM_V24_IC;
1002 if (clear & TIOCM_CD)
1003 v24_sig &= ~RFCOMM_V24_DV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004
J. Suter3a5e9032005-08-09 20:28:46 -07001005 rfcomm_dlc_set_modem_status(dlc, v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006
J. Suter3a5e9032005-08-09 20:28:46 -07001007 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008}
1009
1010/* ---- TTY structure ---- */
1011
Jeff Dikeb68e31d2006-10-02 02:17:18 -07001012static const struct tty_operations rfcomm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 .open = rfcomm_tty_open,
1014 .close = rfcomm_tty_close,
1015 .write = rfcomm_tty_write,
1016 .write_room = rfcomm_tty_write_room,
1017 .chars_in_buffer = rfcomm_tty_chars_in_buffer,
1018 .flush_buffer = rfcomm_tty_flush_buffer,
1019 .ioctl = rfcomm_tty_ioctl,
1020 .throttle = rfcomm_tty_throttle,
1021 .unthrottle = rfcomm_tty_unthrottle,
1022 .set_termios = rfcomm_tty_set_termios,
1023 .send_xchar = rfcomm_tty_send_xchar,
1024 .hangup = rfcomm_tty_hangup,
1025 .wait_until_sent = rfcomm_tty_wait_until_sent,
1026 .read_proc = rfcomm_tty_read_proc,
1027 .tiocmget = rfcomm_tty_tiocmget,
1028 .tiocmset = rfcomm_tty_tiocmset,
1029};
1030
1031int rfcomm_init_ttys(void)
1032{
1033 rfcomm_tty_driver = alloc_tty_driver(RFCOMM_TTY_PORTS);
1034 if (!rfcomm_tty_driver)
1035 return -1;
1036
1037 rfcomm_tty_driver->owner = THIS_MODULE;
1038 rfcomm_tty_driver->driver_name = "rfcomm";
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 rfcomm_tty_driver->name = "rfcomm";
1040 rfcomm_tty_driver->major = RFCOMM_TTY_MAJOR;
1041 rfcomm_tty_driver->minor_start = RFCOMM_TTY_MINOR;
1042 rfcomm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1043 rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07001044 rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 rfcomm_tty_driver->init_termios = tty_std_termios;
1046 rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1047 tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);
1048
1049 if (tty_register_driver(rfcomm_tty_driver)) {
1050 BT_ERR("Can't register RFCOMM TTY driver");
1051 put_tty_driver(rfcomm_tty_driver);
1052 return -1;
1053 }
1054
1055 BT_INFO("RFCOMM TTY layer initialized");
1056
1057 return 0;
1058}
1059
1060void rfcomm_cleanup_ttys(void)
1061{
1062 tty_unregister_driver(rfcomm_tty_driver);
1063 put_tty_driver(rfcomm_tty_driver);
1064}