--- linux-2.4.18.SuSE/drivers/char/tty_io.c.orig Tue Mar 5 15:35:55 2002 +++ linux-2.4.18.SuSE/drivers/char/tty_io.c Tue Mar 5 15:39:30 2002 @@ -1696,8 +1696,18 @@ /* the driver doesn't support them. */ case TCSBRK: case TCSBRKP: - if (!tty->driver.ioctl) + if (!tty->driver.ioctl) { + if (cmd == TCSBRK && arg) { + /* tcdrain case */ + retval = tty_check_change(tty); + if (retval) + return retval; + tty_wait_until_sent(tty, 0); + if (signal_pending(current)) + return -EINTR; + } return 0; + } retval = tty->driver.ioctl(tty, file, cmd, arg); if (retval == -ENOIOCTLCMD) retval = 0; --- linux-2.4.18.SuSE/drivers/char/tty_ioctl.c.orig Tue Mar 5 14:31:37 2002 +++ linux-2.4.18.SuSE/drivers/char/tty_ioctl.c Tue Mar 5 14:32:16 2002 @@ -394,7 +394,7 @@ return -EFAULT; return 0; case TCSETSF: - return set_termios(real_tty, arg, TERMIOS_FLUSH); + return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT); case TCSETSW: return set_termios(real_tty, arg, TERMIOS_WAIT); case TCSETS: @@ -402,7 +402,7 @@ case TCGETA: return get_termio(real_tty,(struct termio *) arg); case TCSETAF: - return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_TERMIO); + return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO); case TCSETAW: return set_termios(real_tty, arg, TERMIOS_WAIT | TERMIOS_TERMIO); case TCSETA: