@@ -348,8 +348,9 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
else if (flags == UPF_SPD_WARP)
altbaud = 460800;
+ baud = tty_termios_baud_rate(termios);
+
for (try = 0; try < 2; try++) {
- baud = tty_termios_baud_rate(termios);
/*
* The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
@@ -359,26 +360,25 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
baud = altbaud;
/*
- * Special case: B0 rate.
+ * Special case: B0 rate. Note: this breaks if the
+ * device cannot support 9600 baud
*/
if (baud == 0) {
hung_up = 1;
baud = 9600;
}
- if (baud >= min && baud <= max)
+ if (baud >= min && baud <= max) {
+ tty_termios_encode_baud_rate(tty, baud, baud);
return baud;
+ }
/*
* Oops, the quotient was zero. Try again with
* the old baud rate if possible.
*/
- termios->c_cflag &= ~CBAUD;
if (old) {
baud = tty_termios_baud_rate(old);
- if (!hung_up)
- tty_termios_encode_baud_rate(termios,
- baud, baud);
old = NULL;
continue;
}
@@ -389,11 +389,9 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
*/
if (!hung_up) {
if (baud <= min)
- tty_termios_encode_baud_rate(termios,
- min + 1, min + 1);
+ baud = min + 1;
else
- tty_termios_encode_baud_rate(termios,
- max - 1, max - 1);
+ baud = max - 1;
}
}
/* Should never happen */
Untested but I suspect the following may help commit 44590a8cc4ee6e40737b843d1d9593345ef3bf04 Author: Alan Cox <alan@linux.intel.com> Date: Fri Sep 21 16:36:36 2012 +0100 serial: avoid iteratively re-encoding the termios If we do that then we will corrupt the termios data in some situations and thus not nicely encode the baud rates as we should. Signed-off-by: Alan Cox <alan@linux.intel.com>