Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ec739be authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

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: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fcc8ac18
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -201,6 +201,9 @@ struct tty_port {
	unsigned char		*xmit_buf;	/* Optional buffer */
	int			close_delay;	/* Close port delay */
	int			closing_wait;	/* Delay for output */
	int			drain_delay;	/* Set to zero if no pure time
						   based drain is needed else
						   set to size of fifo */
};

/*