]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/char/tty_ioctl.c
ip2: return -EFAULT on copy_to_user errors
[mv-sheeva.git] / drivers / char / tty_ioctl.c
index 6bd5f8866c74b2ed85526a7ffe6465b370d7ce4c..0c18899714593325fa4e51f3235ad5a23e9ed0c4 100644 (file)
@@ -517,19 +517,25 @@ static void change_termios(struct tty_struct *tty, struct ktermios *new_termios)
 
        /* 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) {
+               if ((old_flow != new_flow) || extproc) {
                        spin_lock_irqsave(&tty->ctrl_lock, flags);
-                       tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
-                       if (new_flow)
-                               tty->ctrl_status |= TIOCPKT_DOSTOP;
-                       else
-                               tty->ctrl_status |= TIOCPKT_NOSTOP;
+                       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);
                }