diff options
author | Peter Hurley | 2014-10-16 15:33:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman | 2014-11-05 16:34:36 -0800 |
commit | dbfcd851a9ee0bf6952e538be75230b7c071dafb (patch) | |
tree | 83a8d040432dd90ad72c48f5f2158a753f47409a /drivers/tty/pty.c | |
parent | 6460fbbf476ad8d4f4196534c00019975b33e1db (diff) |
tty: Move pty-specific set_termios() handling to pty driver
Packet mode is unique to the pty driver; move the packet mode state
change code from the generic tty ioctl handler to the pty driver.
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Reviewed-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/pty.c')
-rw-r--r-- | drivers/tty/pty.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c index 6c7602592fe0..7f612c524224 100644 --- a/drivers/tty/pty.c +++ b/drivers/tty/pty.c @@ -259,6 +259,34 @@ out: static void pty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) { + unsigned long flags; + + /* See if packet mode change of state. */ + if (tty->link && tty->link->packet) { + int extproc = (old_termios->c_lflag & EXTPROC) | + (tty->termios.c_lflag & EXTPROC); + int old_flow = ((old_termios->c_iflag & IXON) && + (old_termios->c_cc[VSTOP] == '\023') && + (old_termios->c_cc[VSTART] == '\021')); + int new_flow = (I_IXON(tty) && + STOP_CHAR(tty) == '\023' && + START_CHAR(tty) == '\021'); + if ((old_flow != new_flow) || extproc) { + spin_lock_irqsave(&tty->ctrl_lock, flags); + if (old_flow != new_flow) { + tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP); + if (new_flow) + tty->ctrl_status |= TIOCPKT_DOSTOP; + else + tty->ctrl_status |= TIOCPKT_NOSTOP; + } + if (extproc) + tty->ctrl_status |= TIOCPKT_IOCTL; + spin_unlock_irqrestore(&tty->ctrl_lock, flags); + wake_up_interruptible(&tty->link->read_wait); + } + } + tty->termios.c_cflag &= ~(CSIZE | PARENB); tty->termios.c_cflag |= (CS8 | CREAD); } |