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

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

uart_get_baud_rate: stop mangling termios



Russell King noticed this one: We have to avoid replacing B0 when we pick a
baud rate for a "hung up" port.  Ugly but the proper fix is in the tty layer
and means changing the tty<->serial interfaces so we will defer that for now.

[akpm@linux-foundation.org: fix uninitialised var]
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e991a2bd
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -329,13 +329,15 @@ EXPORT_SYMBOL(uart_update_timeout);
 *	If it's still invalid, we try 9600 baud.
 *	If it's still invalid, we try 9600 baud.
 *
 *
 *	Update the @termios structure to reflect the baud rate
 *	Update the @termios structure to reflect the baud rate
 *	we're actually going to be using.
 *	we're actually going to be using. Don't do this for the case
 *	where B0 is requested ("hang up").
 */
 */
unsigned int
unsigned int
uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
		   struct ktermios *old, unsigned int min, unsigned int max)
		   struct ktermios *old, unsigned int min, unsigned int max)
{
{
	unsigned int try, baud, altbaud = 38400;
	unsigned int try, baud, altbaud = 38400;
	int hung_up = 0;
	upf_t flags = port->flags & UPF_SPD_MASK;
	upf_t flags = port->flags & UPF_SPD_MASK;


	if (flags == UPF_SPD_HI)
	if (flags == UPF_SPD_HI)
@@ -360,8 +362,10 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
		/*
		/*
		 * Special case: B0 rate.
		 * Special case: B0 rate.
		 */
		 */
		if (baud == 0)
		if (baud == 0) {
			hung_up = 1;
			baud = 9600;
			baud = 9600;
		}


		if (baud >= min && baud <= max)
		if (baud >= min && baud <= max)
			return baud;
			return baud;
@@ -373,7 +377,9 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
		termios->c_cflag &= ~CBAUD;
		termios->c_cflag &= ~CBAUD;
		if (old) {
		if (old) {
			baud = tty_termios_baud_rate(old);
			baud = tty_termios_baud_rate(old);
			tty_termios_encode_baud_rate(termios, baud, baud);
			if (!hung_up)
				tty_termios_encode_baud_rate(termios,
								baud, baud);
			old = NULL;
			old = NULL;
			continue;
			continue;
		}
		}
@@ -382,6 +388,7 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
		 * As a last resort, if the quotient is zero,
		 * As a last resort, if the quotient is zero,
		 * default to 9600 bps
		 * default to 9600 bps
		 */
		 */
		if (!hung_up)
			tty_termios_encode_baud_rate(termios, 9600, 9600);
			tty_termios_encode_baud_rate(termios, 9600, 9600);
	}
	}