diff options
Diffstat (limited to 'net/bluetooth/rfcomm')
| -rw-r--r-- | net/bluetooth/rfcomm/Kconfig | 1 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/tty.c | 21 |
2 files changed, 9 insertions, 13 deletions
diff --git a/net/bluetooth/rfcomm/Kconfig b/net/bluetooth/rfcomm/Kconfig index 22e718b554e4..18d352ea2bc7 100644 --- a/net/bluetooth/rfcomm/Kconfig +++ b/net/bluetooth/rfcomm/Kconfig | |||
| @@ -12,6 +12,7 @@ config BT_RFCOMM | |||
| 12 | config BT_RFCOMM_TTY | 12 | config BT_RFCOMM_TTY |
| 13 | bool "RFCOMM TTY support" | 13 | bool "RFCOMM TTY support" |
| 14 | depends on BT_RFCOMM | 14 | depends on BT_RFCOMM |
| 15 | depends on TTY | ||
| 15 | help | 16 | help |
| 16 | This option enables TTY emulation support for RFCOMM channels. | 17 | This option enables TTY emulation support for RFCOMM channels. |
| 17 | 18 | ||
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index bd6fd0f43d2b..b6e44ad6cca6 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
| @@ -541,23 +541,21 @@ int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg) | |||
| 541 | static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) | 541 | static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) |
| 542 | { | 542 | { |
| 543 | struct rfcomm_dev *dev = dlc->owner; | 543 | struct rfcomm_dev *dev = dlc->owner; |
| 544 | struct tty_struct *tty; | ||
| 545 | 544 | ||
| 546 | if (!dev) { | 545 | if (!dev) { |
| 547 | kfree_skb(skb); | 546 | kfree_skb(skb); |
| 548 | return; | 547 | return; |
| 549 | } | 548 | } |
| 550 | 549 | ||
| 551 | tty = dev->port.tty; | 550 | if (!skb_queue_empty(&dev->pending)) { |
| 552 | if (!tty || !skb_queue_empty(&dev->pending)) { | ||
| 553 | skb_queue_tail(&dev->pending, skb); | 551 | skb_queue_tail(&dev->pending, skb); |
| 554 | return; | 552 | return; |
| 555 | } | 553 | } |
| 556 | 554 | ||
| 557 | BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len); | 555 | BT_DBG("dlc %p len %d", dlc, skb->len); |
| 558 | 556 | ||
| 559 | tty_insert_flip_string(tty, skb->data, skb->len); | 557 | tty_insert_flip_string(&dev->port, skb->data, skb->len); |
| 560 | tty_flip_buffer_push(tty); | 558 | tty_flip_buffer_push(&dev->port); |
| 561 | 559 | ||
| 562 | kfree_skb(skb); | 560 | kfree_skb(skb); |
| 563 | } | 561 | } |
| @@ -621,26 +619,23 @@ static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig) | |||
| 621 | /* ---- TTY functions ---- */ | 619 | /* ---- TTY functions ---- */ |
| 622 | static void rfcomm_tty_copy_pending(struct rfcomm_dev *dev) | 620 | static void rfcomm_tty_copy_pending(struct rfcomm_dev *dev) |
| 623 | { | 621 | { |
| 624 | struct tty_struct *tty = dev->port.tty; | ||
| 625 | struct sk_buff *skb; | 622 | struct sk_buff *skb; |
| 626 | int inserted = 0; | 623 | int inserted = 0; |
| 627 | 624 | ||
| 628 | if (!tty) | 625 | BT_DBG("dev %p", dev); |
| 629 | return; | ||
| 630 | |||
| 631 | BT_DBG("dev %p tty %p", dev, tty); | ||
| 632 | 626 | ||
| 633 | rfcomm_dlc_lock(dev->dlc); | 627 | rfcomm_dlc_lock(dev->dlc); |
| 634 | 628 | ||
| 635 | while ((skb = skb_dequeue(&dev->pending))) { | 629 | while ((skb = skb_dequeue(&dev->pending))) { |
| 636 | inserted += tty_insert_flip_string(tty, skb->data, skb->len); | 630 | inserted += tty_insert_flip_string(&dev->port, skb->data, |
| 631 | skb->len); | ||
| 637 | kfree_skb(skb); | 632 | kfree_skb(skb); |
| 638 | } | 633 | } |
| 639 | 634 | ||
| 640 | rfcomm_dlc_unlock(dev->dlc); | 635 | rfcomm_dlc_unlock(dev->dlc); |
| 641 | 636 | ||
| 642 | if (inserted > 0) | 637 | if (inserted > 0) |
| 643 | tty_flip_buffer_push(tty); | 638 | tty_flip_buffer_push(&dev->port); |
| 644 | } | 639 | } |
| 645 | 640 | ||
| 646 | static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp) | 641 | static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp) |
