blob: 74368f79ee5d084e0645c6af221062567f475e47 [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
30#include <linux/config.h>
31#include <linux/module.h>
32
33#include <linux/tty.h>
34#include <linux/tty_driver.h>
35#include <linux/tty_flip.h>
36
Randy Dunlap4fc268d2006-01-11 12:17:47 -080037#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070038#include <linux/slab.h>
39#include <linux/skbuff.h>
40
41#include <net/bluetooth/bluetooth.h>
42#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
165static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
166{
167 struct rfcomm_dev *dev;
168 struct list_head *head = &rfcomm_dev_list, *p;
169 int err = 0;
170
171 BT_DBG("id %d channel %d", req->dev_id, req->channel);
172
173 dev = kmalloc(sizeof(struct rfcomm_dev), GFP_KERNEL);
174 if (!dev)
175 return -ENOMEM;
176 memset(dev, 0, sizeof(struct rfcomm_dev));
177
178 write_lock_bh(&rfcomm_dev_lock);
179
180 if (req->dev_id < 0) {
181 dev->id = 0;
182
183 list_for_each(p, &rfcomm_dev_list) {
184 if (list_entry(p, struct rfcomm_dev, list)->id != dev->id)
185 break;
186
187 dev->id++;
188 head = p;
189 }
190 } else {
191 dev->id = req->dev_id;
192
193 list_for_each(p, &rfcomm_dev_list) {
194 struct rfcomm_dev *entry = list_entry(p, struct rfcomm_dev, list);
195
196 if (entry->id == dev->id) {
197 err = -EADDRINUSE;
198 goto out;
199 }
200
201 if (entry->id > dev->id - 1)
202 break;
203
204 head = p;
205 }
206 }
207
208 if ((dev->id < 0) || (dev->id > RFCOMM_MAX_DEV - 1)) {
209 err = -ENFILE;
210 goto out;
211 }
212
213 sprintf(dev->name, "rfcomm%d", dev->id);
214
215 list_add(&dev->list, head);
216 atomic_set(&dev->refcnt, 1);
217
218 bacpy(&dev->src, &req->src);
219 bacpy(&dev->dst, &req->dst);
220 dev->channel = req->channel;
221
222 dev->flags = req->flags &
223 ((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));
224
225 init_waitqueue_head(&dev->wait);
226 tasklet_init(&dev->wakeup_task, rfcomm_tty_wakeup, (unsigned long) dev);
227
228 rfcomm_dlc_lock(dlc);
229 dlc->data_ready = rfcomm_dev_data_ready;
230 dlc->state_change = rfcomm_dev_state_change;
231 dlc->modem_status = rfcomm_dev_modem_status;
232
233 dlc->owner = dev;
234 dev->dlc = dlc;
235 rfcomm_dlc_unlock(dlc);
236
237 /* It's safe to call __module_get() here because socket already
238 holds reference to this module. */
239 __module_get(THIS_MODULE);
240
241out:
242 write_unlock_bh(&rfcomm_dev_lock);
243
244 if (err) {
245 kfree(dev);
246 return err;
247 }
248
249 tty_register_device(rfcomm_tty_driver, dev->id, NULL);
250
251 return dev->id;
252}
253
254static void rfcomm_dev_del(struct rfcomm_dev *dev)
255{
256 BT_DBG("dev %p", dev);
257
258 write_lock_bh(&rfcomm_dev_lock);
259 list_del_init(&dev->list);
260 write_unlock_bh(&rfcomm_dev_lock);
261
262 rfcomm_dev_put(dev);
263}
264
265/* ---- Send buffer ---- */
266static inline unsigned int rfcomm_room(struct rfcomm_dlc *dlc)
267{
268 /* We can't let it be zero, because we don't get a callback
269 when tx_credits becomes nonzero, hence we'd never wake up */
270 return dlc->mtu * (dlc->tx_credits?:1);
271}
272
273static void rfcomm_wfree(struct sk_buff *skb)
274{
275 struct rfcomm_dev *dev = (void *) skb->sk;
276 atomic_sub(skb->truesize, &dev->wmem_alloc);
277 if (test_bit(RFCOMM_TTY_ATTACHED, &dev->flags))
278 tasklet_schedule(&dev->wakeup_task);
279 rfcomm_dev_put(dev);
280}
281
282static inline void rfcomm_set_owner_w(struct sk_buff *skb, struct rfcomm_dev *dev)
283{
284 rfcomm_dev_hold(dev);
285 atomic_add(skb->truesize, &dev->wmem_alloc);
286 skb->sk = (void *) dev;
287 skb->destructor = rfcomm_wfree;
288}
289
Al Virodd0fc662005-10-07 07:46:04 +0100290static struct sk_buff *rfcomm_wmalloc(struct rfcomm_dev *dev, unsigned long size, gfp_t priority)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291{
292 if (atomic_read(&dev->wmem_alloc) < rfcomm_room(dev->dlc)) {
293 struct sk_buff *skb = alloc_skb(size, priority);
294 if (skb) {
295 rfcomm_set_owner_w(skb, dev);
296 return skb;
297 }
298 }
299 return NULL;
300}
301
302/* ---- Device IOCTLs ---- */
303
304#define NOCAP_FLAGS ((1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP))
305
306static int rfcomm_create_dev(struct sock *sk, void __user *arg)
307{
308 struct rfcomm_dev_req req;
309 struct rfcomm_dlc *dlc;
310 int id;
311
312 if (copy_from_user(&req, arg, sizeof(req)))
313 return -EFAULT;
314
315 BT_DBG("sk %p dev_id %id flags 0x%x", sk, req.dev_id, req.flags);
316
317 if (req.flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN))
318 return -EPERM;
319
320 if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
321 /* Socket must be connected */
322 if (sk->sk_state != BT_CONNECTED)
323 return -EBADFD;
324
325 dlc = rfcomm_pi(sk)->dlc;
326 rfcomm_dlc_hold(dlc);
327 } else {
328 dlc = rfcomm_dlc_alloc(GFP_KERNEL);
329 if (!dlc)
330 return -ENOMEM;
331 }
332
333 id = rfcomm_dev_add(&req, dlc);
334 if (id < 0) {
335 rfcomm_dlc_put(dlc);
336 return id;
337 }
338
339 if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
340 /* DLC is now used by device.
341 * Socket must be disconnected */
342 sk->sk_state = BT_CLOSED;
343 }
344
345 return id;
346}
347
348static int rfcomm_release_dev(void __user *arg)
349{
350 struct rfcomm_dev_req req;
351 struct rfcomm_dev *dev;
352
353 if (copy_from_user(&req, arg, sizeof(req)))
354 return -EFAULT;
355
356 BT_DBG("dev_id %id flags 0x%x", req.dev_id, req.flags);
357
358 if (!(dev = rfcomm_dev_get(req.dev_id)))
359 return -ENODEV;
360
361 if (dev->flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN)) {
362 rfcomm_dev_put(dev);
363 return -EPERM;
364 }
365
366 if (req.flags & (1 << RFCOMM_HANGUP_NOW))
367 rfcomm_dlc_close(dev->dlc, 0);
368
369 rfcomm_dev_del(dev);
370 rfcomm_dev_put(dev);
371 return 0;
372}
373
374static int rfcomm_get_dev_list(void __user *arg)
375{
376 struct rfcomm_dev_list_req *dl;
377 struct rfcomm_dev_info *di;
378 struct list_head *p;
379 int n = 0, size, err;
380 u16 dev_num;
381
382 BT_DBG("");
383
384 if (get_user(dev_num, (u16 __user *) arg))
385 return -EFAULT;
386
387 if (!dev_num || dev_num > (PAGE_SIZE * 4) / sizeof(*di))
388 return -EINVAL;
389
390 size = sizeof(*dl) + dev_num * sizeof(*di);
391
392 if (!(dl = kmalloc(size, GFP_KERNEL)))
393 return -ENOMEM;
394
395 di = dl->dev_info;
396
397 read_lock_bh(&rfcomm_dev_lock);
398
399 list_for_each(p, &rfcomm_dev_list) {
400 struct rfcomm_dev *dev = list_entry(p, struct rfcomm_dev, list);
401 (di + n)->id = dev->id;
402 (di + n)->flags = dev->flags;
403 (di + n)->state = dev->dlc->state;
404 (di + n)->channel = dev->channel;
405 bacpy(&(di + n)->src, &dev->src);
406 bacpy(&(di + n)->dst, &dev->dst);
407 if (++n >= dev_num)
408 break;
409 }
410
411 read_unlock_bh(&rfcomm_dev_lock);
412
413 dl->dev_num = n;
414 size = sizeof(*dl) + n * sizeof(*di);
415
416 err = copy_to_user(arg, dl, size);
417 kfree(dl);
418
419 return err ? -EFAULT : 0;
420}
421
422static int rfcomm_get_dev_info(void __user *arg)
423{
424 struct rfcomm_dev *dev;
425 struct rfcomm_dev_info di;
426 int err = 0;
427
428 BT_DBG("");
429
430 if (copy_from_user(&di, arg, sizeof(di)))
431 return -EFAULT;
432
433 if (!(dev = rfcomm_dev_get(di.id)))
434 return -ENODEV;
435
436 di.flags = dev->flags;
437 di.channel = dev->channel;
438 di.state = dev->dlc->state;
439 bacpy(&di.src, &dev->src);
440 bacpy(&di.dst, &dev->dst);
441
442 if (copy_to_user(arg, &di, sizeof(di)))
443 err = -EFAULT;
444
445 rfcomm_dev_put(dev);
446 return err;
447}
448
449int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
450{
451 BT_DBG("cmd %d arg %p", cmd, arg);
452
453 switch (cmd) {
454 case RFCOMMCREATEDEV:
455 return rfcomm_create_dev(sk, arg);
456
457 case RFCOMMRELEASEDEV:
458 return rfcomm_release_dev(arg);
459
460 case RFCOMMGETDEVLIST:
461 return rfcomm_get_dev_list(arg);
462
463 case RFCOMMGETDEVINFO:
464 return rfcomm_get_dev_info(arg);
465 }
466
467 return -EINVAL;
468}
469
470/* ---- DLC callbacks ---- */
471static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
472{
473 struct rfcomm_dev *dev = dlc->owner;
474 struct tty_struct *tty;
475
476 if (!dev || !(tty = dev->tty)) {
477 kfree_skb(skb);
478 return;
479 }
480
481 BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len);
482
483 if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
Alan Cox33f0f882006-01-09 20:54:13 -0800484 tty_buffer_request_room(tty, skb->len);
485 tty_insert_flip_string(tty, skb->data, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 tty_flip_buffer_push(tty);
487 } else
488 tty->ldisc.receive_buf(tty, skb->data, NULL, skb->len);
489
490 kfree_skb(skb);
491}
492
493static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
494{
495 struct rfcomm_dev *dev = dlc->owner;
496 if (!dev)
497 return;
498
499 BT_DBG("dlc %p dev %p err %d", dlc, dev, err);
500
501 dev->err = err;
502 wake_up_interruptible(&dev->wait);
503
504 if (dlc->state == BT_CLOSED) {
505 if (!dev->tty) {
506 if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {
507 rfcomm_dev_hold(dev);
508 rfcomm_dev_del(dev);
509
510 /* We have to drop DLC lock here, otherwise
511 rfcomm_dev_put() will dead lock if it's
512 the last reference. */
513 rfcomm_dlc_unlock(dlc);
514 rfcomm_dev_put(dev);
515 rfcomm_dlc_lock(dlc);
516 }
517 } else
518 tty_hangup(dev->tty);
519 }
520}
521
522static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
523{
524 struct rfcomm_dev *dev = dlc->owner;
525 if (!dev)
526 return;
Timo Teräs7b9eb9e2005-08-09 20:28:21 -0700527
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 BT_DBG("dlc %p dev %p v24_sig 0x%02x", dlc, dev, v24_sig);
529
Timo Teräs7b9eb9e2005-08-09 20:28:21 -0700530 if ((dev->modem_status & TIOCM_CD) && !(v24_sig & RFCOMM_V24_DV)) {
531 if (dev->tty && !C_CLOCAL(dev->tty))
532 tty_hangup(dev->tty);
533 }
534
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535 dev->modem_status =
536 ((v24_sig & RFCOMM_V24_RTC) ? (TIOCM_DSR | TIOCM_DTR) : 0) |
537 ((v24_sig & RFCOMM_V24_RTR) ? (TIOCM_RTS | TIOCM_CTS) : 0) |
538 ((v24_sig & RFCOMM_V24_IC) ? TIOCM_RI : 0) |
539 ((v24_sig & RFCOMM_V24_DV) ? TIOCM_CD : 0);
540}
541
542/* ---- TTY functions ---- */
543static void rfcomm_tty_wakeup(unsigned long arg)
544{
545 struct rfcomm_dev *dev = (void *) arg;
546 struct tty_struct *tty = dev->tty;
547 if (!tty)
548 return;
549
550 BT_DBG("dev %p tty %p", dev, tty);
551
552 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
553 (tty->ldisc.write_wakeup)(tty);
554
555 wake_up_interruptible(&tty->write_wait);
556#ifdef SERIAL_HAVE_POLL_WAIT
557 wake_up_interruptible(&tty->poll_wait);
558#endif
559}
560
561static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
562{
563 DECLARE_WAITQUEUE(wait, current);
564 struct rfcomm_dev *dev;
565 struct rfcomm_dlc *dlc;
566 int err, id;
567
568 id = tty->index;
569
570 BT_DBG("tty %p id %d", tty, id);
571
572 /* We don't leak this refcount. For reasons which are not entirely
573 clear, the TTY layer will call our ->close() method even if the
574 open fails. We decrease the refcount there, and decreasing it
575 here too would cause breakage. */
576 dev = rfcomm_dev_get(id);
577 if (!dev)
578 return -ENODEV;
579
580 BT_DBG("dev %p dst %s channel %d opened %d", dev, batostr(&dev->dst), dev->channel, dev->opened);
581
582 if (dev->opened++ != 0)
583 return 0;
584
585 dlc = dev->dlc;
586
587 /* Attach TTY and open DLC */
588
589 rfcomm_dlc_lock(dlc);
590 tty->driver_data = dev;
591 dev->tty = tty;
592 rfcomm_dlc_unlock(dlc);
593 set_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
594
595 err = rfcomm_dlc_open(dlc, &dev->src, &dev->dst, dev->channel);
596 if (err < 0)
597 return err;
598
599 /* Wait for DLC to connect */
600 add_wait_queue(&dev->wait, &wait);
601 while (1) {
602 set_current_state(TASK_INTERRUPTIBLE);
603
604 if (dlc->state == BT_CLOSED) {
605 err = -dev->err;
606 break;
607 }
608
609 if (dlc->state == BT_CONNECTED)
610 break;
611
612 if (signal_pending(current)) {
613 err = -EINTR;
614 break;
615 }
616
617 schedule();
618 }
619 set_current_state(TASK_RUNNING);
620 remove_wait_queue(&dev->wait, &wait);
621
622 return err;
623}
624
625static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
626{
627 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
628 if (!dev)
629 return;
630
631 BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
632
633 if (--dev->opened == 0) {
634 /* Close DLC and dettach TTY */
635 rfcomm_dlc_close(dev->dlc, 0);
636
637 clear_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
638 tasklet_kill(&dev->wakeup_task);
639
640 rfcomm_dlc_lock(dev->dlc);
641 tty->driver_data = NULL;
642 dev->tty = NULL;
643 rfcomm_dlc_unlock(dev->dlc);
644 }
645
646 rfcomm_dev_put(dev);
647}
648
649static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
650{
651 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
652 struct rfcomm_dlc *dlc = dev->dlc;
653 struct sk_buff *skb;
654 int err = 0, sent = 0, size;
655
656 BT_DBG("tty %p count %d", tty, count);
657
658 while (count) {
659 size = min_t(uint, count, dlc->mtu);
660
661 skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_ATOMIC);
662
663 if (!skb)
664 break;
665
666 skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
667
668 memcpy(skb_put(skb, size), buf + sent, size);
669
670 if ((err = rfcomm_dlc_send(dlc, skb)) < 0) {
671 kfree_skb(skb);
672 break;
673 }
674
675 sent += size;
676 count -= size;
677 }
678
679 return sent ? sent : err;
680}
681
682static int rfcomm_tty_write_room(struct tty_struct *tty)
683{
684 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
685 int room;
686
687 BT_DBG("tty %p", tty);
688
689 room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc);
690 if (room < 0)
691 room = 0;
692 return room;
693}
694
695static int rfcomm_tty_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, unsigned long arg)
696{
697 BT_DBG("tty %p cmd 0x%02x", tty, cmd);
698
699 switch (cmd) {
700 case TCGETS:
701 BT_DBG("TCGETS is not supported");
702 return -ENOIOCTLCMD;
703
704 case TCSETS:
705 BT_DBG("TCSETS is not supported");
706 return -ENOIOCTLCMD;
707
708 case TIOCMIWAIT:
709 BT_DBG("TIOCMIWAIT");
710 break;
711
712 case TIOCGICOUNT:
713 BT_DBG("TIOCGICOUNT");
714 break;
715
716 case TIOCGSERIAL:
717 BT_ERR("TIOCGSERIAL is not supported");
718 return -ENOIOCTLCMD;
719
720 case TIOCSSERIAL:
721 BT_ERR("TIOCSSERIAL is not supported");
722 return -ENOIOCTLCMD;
723
724 case TIOCSERGSTRUCT:
725 BT_ERR("TIOCSERGSTRUCT is not supported");
726 return -ENOIOCTLCMD;
727
728 case TIOCSERGETLSR:
729 BT_ERR("TIOCSERGETLSR is not supported");
730 return -ENOIOCTLCMD;
731
732 case TIOCSERCONFIG:
733 BT_ERR("TIOCSERCONFIG is not supported");
734 return -ENOIOCTLCMD;
735
736 default:
737 return -ENOIOCTLCMD; /* ioctls which we must ignore */
738
739 }
740
741 return -ENOIOCTLCMD;
742}
743
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old)
745{
J. Suter3a5e9032005-08-09 20:28:46 -0700746 struct termios *new = (struct termios *) tty->termios;
747 int old_baud_rate = tty_termios_baud_rate(old);
748 int new_baud_rate = tty_termios_baud_rate(new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749
J. Suter3a5e9032005-08-09 20:28:46 -0700750 u8 baud, data_bits, stop_bits, parity, x_on, x_off;
751 u16 changes = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752
J. Suter3a5e9032005-08-09 20:28:46 -0700753 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
754
755 BT_DBG("tty %p termios %p", tty, old);
756
757 /* Handle turning off CRTSCTS */
758 if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS))
759 BT_DBG("Turning off CRTSCTS unsupported");
760
761 /* Parity on/off and when on, odd/even */
762 if (((old->c_cflag & PARENB) != (new->c_cflag & PARENB)) ||
763 ((old->c_cflag & PARODD) != (new->c_cflag & PARODD)) ) {
764 changes |= RFCOMM_RPN_PM_PARITY;
765 BT_DBG("Parity change detected.");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 }
J. Suter3a5e9032005-08-09 20:28:46 -0700767
768 /* Mark and space parity are not supported! */
769 if (new->c_cflag & PARENB) {
770 if (new->c_cflag & PARODD) {
771 BT_DBG("Parity is ODD");
772 parity = RFCOMM_RPN_PARITY_ODD;
773 } else {
774 BT_DBG("Parity is EVEN");
775 parity = RFCOMM_RPN_PARITY_EVEN;
776 }
777 } else {
778 BT_DBG("Parity is OFF");
779 parity = RFCOMM_RPN_PARITY_NONE;
780 }
781
782 /* Setting the x_on / x_off characters */
783 if (old->c_cc[VSTOP] != new->c_cc[VSTOP]) {
784 BT_DBG("XOFF custom");
785 x_on = new->c_cc[VSTOP];
786 changes |= RFCOMM_RPN_PM_XON;
787 } else {
788 BT_DBG("XOFF default");
789 x_on = RFCOMM_RPN_XON_CHAR;
790 }
791
792 if (old->c_cc[VSTART] != new->c_cc[VSTART]) {
793 BT_DBG("XON custom");
794 x_off = new->c_cc[VSTART];
795 changes |= RFCOMM_RPN_PM_XOFF;
796 } else {
797 BT_DBG("XON default");
798 x_off = RFCOMM_RPN_XOFF_CHAR;
799 }
800
801 /* Handle setting of stop bits */
802 if ((old->c_cflag & CSTOPB) != (new->c_cflag & CSTOPB))
803 changes |= RFCOMM_RPN_PM_STOP;
804
805 /* POSIX does not support 1.5 stop bits and RFCOMM does not
806 * support 2 stop bits. So a request for 2 stop bits gets
807 * translated to 1.5 stop bits */
808 if (new->c_cflag & CSTOPB) {
809 stop_bits = RFCOMM_RPN_STOP_15;
810 } else {
811 stop_bits = RFCOMM_RPN_STOP_1;
812 }
813
814 /* Handle number of data bits [5-8] */
815 if ((old->c_cflag & CSIZE) != (new->c_cflag & CSIZE))
816 changes |= RFCOMM_RPN_PM_DATA;
817
818 switch (new->c_cflag & CSIZE) {
819 case CS5:
820 data_bits = RFCOMM_RPN_DATA_5;
821 break;
822 case CS6:
823 data_bits = RFCOMM_RPN_DATA_6;
824 break;
825 case CS7:
826 data_bits = RFCOMM_RPN_DATA_7;
827 break;
828 case CS8:
829 data_bits = RFCOMM_RPN_DATA_8;
830 break;
831 default:
832 data_bits = RFCOMM_RPN_DATA_8;
833 break;
834 }
835
836 /* Handle baudrate settings */
837 if (old_baud_rate != new_baud_rate)
838 changes |= RFCOMM_RPN_PM_BITRATE;
839
840 switch (new_baud_rate) {
841 case 2400:
842 baud = RFCOMM_RPN_BR_2400;
843 break;
844 case 4800:
845 baud = RFCOMM_RPN_BR_4800;
846 break;
847 case 7200:
848 baud = RFCOMM_RPN_BR_7200;
849 break;
850 case 9600:
851 baud = RFCOMM_RPN_BR_9600;
852 break;
853 case 19200:
854 baud = RFCOMM_RPN_BR_19200;
855 break;
856 case 38400:
857 baud = RFCOMM_RPN_BR_38400;
858 break;
859 case 57600:
860 baud = RFCOMM_RPN_BR_57600;
861 break;
862 case 115200:
863 baud = RFCOMM_RPN_BR_115200;
864 break;
865 case 230400:
866 baud = RFCOMM_RPN_BR_230400;
867 break;
868 default:
869 /* 9600 is standard accordinag to the RFCOMM specification */
870 baud = RFCOMM_RPN_BR_9600;
871 break;
872
873 }
874
875 if (changes)
876 rfcomm_send_rpn(dev->dlc->session, 1, dev->dlc->dlci, baud,
877 data_bits, stop_bits, parity,
878 RFCOMM_RPN_FLOW_NONE, x_on, x_off, changes);
879
880 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881}
882
883static void rfcomm_tty_throttle(struct tty_struct *tty)
884{
885 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
886
887 BT_DBG("tty %p dev %p", tty, dev);
J. Suter3a5e9032005-08-09 20:28:46 -0700888
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 rfcomm_dlc_throttle(dev->dlc);
890}
891
892static void rfcomm_tty_unthrottle(struct tty_struct *tty)
893{
894 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
895
896 BT_DBG("tty %p dev %p", tty, dev);
J. Suter3a5e9032005-08-09 20:28:46 -0700897
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 rfcomm_dlc_unthrottle(dev->dlc);
899}
900
901static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty)
902{
903 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
904 struct rfcomm_dlc *dlc = dev->dlc;
905
906 BT_DBG("tty %p dev %p", tty, dev);
907
David S. Millerb03efcf2005-07-08 14:57:23 -0700908 if (!skb_queue_empty(&dlc->tx_queue))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 return dlc->mtu;
910
911 return 0;
912}
913
914static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
915{
916 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
917 if (!dev)
918 return;
919
920 BT_DBG("tty %p dev %p", tty, dev);
921
922 skb_queue_purge(&dev->dlc->tx_queue);
923
924 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
925 tty->ldisc.write_wakeup(tty);
926}
927
928static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch)
929{
930 BT_DBG("tty %p ch %c", tty, ch);
931}
932
933static void rfcomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
934{
935 BT_DBG("tty %p timeout %d", tty, timeout);
936}
937
938static void rfcomm_tty_hangup(struct tty_struct *tty)
939{
940 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
941 if (!dev)
942 return;
943
944 BT_DBG("tty %p dev %p", tty, dev);
945
946 rfcomm_tty_flush_buffer(tty);
947
948 if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags))
949 rfcomm_dev_del(dev);
950}
951
952static int rfcomm_tty_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *unused)
953{
954 return 0;
955}
956
957static int rfcomm_tty_tiocmget(struct tty_struct *tty, struct file *filp)
958{
959 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
960
961 BT_DBG("tty %p dev %p", tty, dev);
962
963 return dev->modem_status;
964}
965
966static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsigned int set, unsigned int clear)
967{
J. Suter3a5e9032005-08-09 20:28:46 -0700968 struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
969 struct rfcomm_dlc *dlc = dev->dlc;
970 u8 v24_sig;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971
972 BT_DBG("tty %p dev %p set 0x%02x clear 0x%02x", tty, dev, set, clear);
973
J. Suter3a5e9032005-08-09 20:28:46 -0700974 rfcomm_dlc_get_modem_status(dlc, &v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975
J. Suter3a5e9032005-08-09 20:28:46 -0700976 if (set & TIOCM_DSR || set & TIOCM_DTR)
977 v24_sig |= RFCOMM_V24_RTC;
978 if (set & TIOCM_RTS || set & TIOCM_CTS)
979 v24_sig |= RFCOMM_V24_RTR;
980 if (set & TIOCM_RI)
981 v24_sig |= RFCOMM_V24_IC;
982 if (set & TIOCM_CD)
983 v24_sig |= RFCOMM_V24_DV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984
J. Suter3a5e9032005-08-09 20:28:46 -0700985 if (clear & TIOCM_DSR || clear & TIOCM_DTR)
986 v24_sig &= ~RFCOMM_V24_RTC;
987 if (clear & TIOCM_RTS || clear & TIOCM_CTS)
988 v24_sig &= ~RFCOMM_V24_RTR;
989 if (clear & TIOCM_RI)
990 v24_sig &= ~RFCOMM_V24_IC;
991 if (clear & TIOCM_CD)
992 v24_sig &= ~RFCOMM_V24_DV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993
J. Suter3a5e9032005-08-09 20:28:46 -0700994 rfcomm_dlc_set_modem_status(dlc, v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995
J. Suter3a5e9032005-08-09 20:28:46 -0700996 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997}
998
999/* ---- TTY structure ---- */
1000
1001static struct tty_operations rfcomm_ops = {
1002 .open = rfcomm_tty_open,
1003 .close = rfcomm_tty_close,
1004 .write = rfcomm_tty_write,
1005 .write_room = rfcomm_tty_write_room,
1006 .chars_in_buffer = rfcomm_tty_chars_in_buffer,
1007 .flush_buffer = rfcomm_tty_flush_buffer,
1008 .ioctl = rfcomm_tty_ioctl,
1009 .throttle = rfcomm_tty_throttle,
1010 .unthrottle = rfcomm_tty_unthrottle,
1011 .set_termios = rfcomm_tty_set_termios,
1012 .send_xchar = rfcomm_tty_send_xchar,
1013 .hangup = rfcomm_tty_hangup,
1014 .wait_until_sent = rfcomm_tty_wait_until_sent,
1015 .read_proc = rfcomm_tty_read_proc,
1016 .tiocmget = rfcomm_tty_tiocmget,
1017 .tiocmset = rfcomm_tty_tiocmset,
1018};
1019
1020int rfcomm_init_ttys(void)
1021{
1022 rfcomm_tty_driver = alloc_tty_driver(RFCOMM_TTY_PORTS);
1023 if (!rfcomm_tty_driver)
1024 return -1;
1025
1026 rfcomm_tty_driver->owner = THIS_MODULE;
1027 rfcomm_tty_driver->driver_name = "rfcomm";
1028 rfcomm_tty_driver->devfs_name = "bluetooth/rfcomm/";
1029 rfcomm_tty_driver->name = "rfcomm";
1030 rfcomm_tty_driver->major = RFCOMM_TTY_MAJOR;
1031 rfcomm_tty_driver->minor_start = RFCOMM_TTY_MINOR;
1032 rfcomm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1033 rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL;
1034 rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
1035 rfcomm_tty_driver->init_termios = tty_std_termios;
1036 rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1037 tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);
1038
1039 if (tty_register_driver(rfcomm_tty_driver)) {
1040 BT_ERR("Can't register RFCOMM TTY driver");
1041 put_tty_driver(rfcomm_tty_driver);
1042 return -1;
1043 }
1044
1045 BT_INFO("RFCOMM TTY layer initialized");
1046
1047 return 0;
1048}
1049
1050void rfcomm_cleanup_ttys(void)
1051{
1052 tty_unregister_driver(rfcomm_tty_driver);
1053 put_tty_driver(rfcomm_tty_driver);
1054}