tty: Move packet mode flow control notifications to pty driver
[linux-2.6-block.git] / drivers / tty / pty.c
index 9bbdb1de12e2a8b638d29fa24fcc9f0f77250b42..7c4447a5c0f4c07a9b552aa5229db29f57bf0d76 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/devpts_fs.h>
 #include <linux/slab.h>
 #include <linux/mutex.h>
+#include <linux/poll.h>
 
 
 #ifdef CONFIG_UNIX98_PTYS
@@ -312,6 +313,42 @@ done:
        return 0;
 }
 
+/**
+ *     pty_start - start() handler
+ *     pty_stop  - stop() handler
+ *     @tty: tty being flow-controlled
+ *
+ *     Propagates the TIOCPKT status to the master pty.
+ *
+ *     NB: only the master pty can be in packet mode so only the slave
+ *         needs start()/stop() handlers
+ */
+static void pty_start(struct tty_struct *tty)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&tty->ctrl_lock, flags);
+       if (tty->link && tty->link->packet) {
+               tty->ctrl_status &= ~TIOCPKT_STOP;
+               tty->ctrl_status |= TIOCPKT_START;
+               wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
+       }
+       spin_unlock_irqrestore(&tty->ctrl_lock, flags);
+}
+
+static void pty_stop(struct tty_struct *tty)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&tty->ctrl_lock, flags);
+       if (tty->link && tty->link->packet) {
+               tty->ctrl_status &= ~TIOCPKT_START;
+               tty->ctrl_status |= TIOCPKT_STOP;
+               wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
+       }
+       spin_unlock_irqrestore(&tty->ctrl_lock, flags);
+}
+
 /**
  *     pty_common_install              -       set up the pty pair
  *     @driver: the pty driver
@@ -471,6 +508,8 @@ static const struct tty_operations slave_pty_ops_bsd = {
        .set_termios = pty_set_termios,
        .cleanup = pty_cleanup,
        .resize = pty_resize,
+       .start = pty_start,
+       .stop = pty_stop,
        .remove = pty_remove
 };
 
@@ -646,6 +685,8 @@ static const struct tty_operations pty_unix98_ops = {
        .chars_in_buffer = pty_chars_in_buffer,
        .unthrottle = pty_unthrottle,
        .set_termios = pty_set_termios,
+       .start = pty_start,
+       .stop = pty_stop,
        .shutdown = pty_unix98_shutdown,
        .cleanup = pty_cleanup,
 };