diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2009-06-11 12:25:25 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 08:50:56 -0700 |
commit | 1ec739be75a6cb961a46ba0b1982d0edb7f27558 (patch) | |
tree | b9e75b3171d1a5b715465b82c9cb2b711e6d5550 /drivers/char/tty_port.c | |
parent | fcc8ac1825d3d0fb81f73bc1a80ebc863168bb56 (diff) | |
download | op-kernel-dev-1ec739be75a6cb961a46ba0b1982d0edb7f27558.zip op-kernel-dev-1ec739be75a6cb961a46ba0b1982d0edb7f27558.tar.gz |
tty: Implement a drain delay in the tty port
We need this for devices that cannot flush and wait, but which do not order
data and modem events. Without it we will hang up before all the data
clears the hardware. Needed for the USB changes.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/tty_port.c')
-rw-r--r-- | drivers/char/tty_port.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c index 926d4a5..4d08b6d 100644 --- a/drivers/char/tty_port.c +++ b/drivers/char/tty_port.c @@ -308,6 +308,17 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f if (port->flags & ASYNC_INITIALIZED && port->closing_wait != ASYNC_CLOSING_WAIT_NONE) tty_wait_until_sent(tty, port->closing_wait); + if (port->drain_delay) { + unsigned int bps = tty_get_baud_rate(tty); + long timeout; + + if (bps > 1200) + timeout = max_t(long, (HZ * 10 * port->drain_delay) / bps, + HZ / 10); + else + timeout = 2 * HZ; + schedule_timeout_interruptible(timeout); + } return 1; } EXPORT_SYMBOL(tty_port_close_start); |