Commit dbfcd851 authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman

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: default avatarPeter Hurley <peter@hurleysoftware.com>
Reviewed-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6460fbbf
...@@ -259,6 +259,34 @@ static int pty_open(struct tty_struct *tty, struct file *filp) ...@@ -259,6 +259,34 @@ static int pty_open(struct tty_struct *tty, struct file *filp)
static void pty_set_termios(struct tty_struct *tty, static void pty_set_termios(struct tty_struct *tty,
struct ktermios *old_termios) 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 &= ~(CSIZE | PARENB);
tty->termios.c_cflag |= (CS8 | CREAD); tty->termios.c_cflag |= (CS8 | CREAD);
} }
......
...@@ -524,10 +524,7 @@ EXPORT_SYMBOL(tty_termios_hw_change); ...@@ -524,10 +524,7 @@ EXPORT_SYMBOL(tty_termios_hw_change);
* @tty: tty to update * @tty: tty to update
* @new_termios: desired new value * @new_termios: desired new value
* *
* Perform updates to the termios values set on this terminal. There * Perform updates to the termios values set on this terminal.
* is a bit of layering violation here with n_tty in terms of the
* internal knowledge of this function.
*
* A master pty's termios should never be set. * A master pty's termios should never be set.
* *
* Locking: termios_rwsem * Locking: termios_rwsem
...@@ -537,7 +534,6 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) ...@@ -537,7 +534,6 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
{ {
struct ktermios old_termios; struct ktermios old_termios;
struct tty_ldisc *ld; struct tty_ldisc *ld;
unsigned long flags;
WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY && WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
tty->driver->subtype == PTY_TYPE_MASTER); tty->driver->subtype == PTY_TYPE_MASTER);
...@@ -553,32 +549,6 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) ...@@ -553,32 +549,6 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
tty->termios = *new_termios; tty->termios = *new_termios;
unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked); unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked);
/* 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);
}
}
if (tty->ops->set_termios) if (tty->ops->set_termios)
(*tty->ops->set_termios)(tty, &old_termios); (*tty->ops->set_termios)(tty, &old_termios);
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment