diff options
author | Alan Cox <alan@linux.intel.com> | 2010-06-01 16:52:52 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-08-10 16:47:41 -0400 |
commit | eab4f5af6b07009d1fc48bac5f3215c0cbfb2fc3 (patch) | |
tree | e966fec1389f578bfcad82ba2e9ba831e93d815c | |
parent | 192251352f912bccfb942ea35801d2357f11f592 (diff) |
tty: serial - fix tty back references in termios
One or two drivers go poking back into the tty from the termios setting
routine in unsafe ways. We don't need to pass the tty down because the
[ab]users are just using it to get at things they can get at anyway.
This leaves low_latency setting to sort out along with set_ldisc use.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/serial/21285.c | 10 | ||||
-rw-r--r-- | drivers/serial/imx.c | 10 | ||||
-rw-r--r-- | drivers/serial/ioc3_serial.c | 9 | ||||
-rw-r--r-- | drivers/serial/ioc4_serial.c | 9 | ||||
-rw-r--r-- | drivers/serial/max3100.c | 7 |
5 files changed, 19 insertions, 26 deletions
diff --git a/drivers/serial/21285.c b/drivers/serial/21285.c index 8681f1345056..d89aa38c5cf0 100644 --- a/drivers/serial/21285.c +++ b/drivers/serial/21285.c | |||
@@ -216,7 +216,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios, | |||
216 | struct ktermios *old) | 216 | struct ktermios *old) |
217 | { | 217 | { |
218 | unsigned long flags; | 218 | unsigned long flags; |
219 | unsigned int baud, quot, h_lcr; | 219 | unsigned int baud, quot, h_lcr, b; |
220 | 220 | ||
221 | /* | 221 | /* |
222 | * We don't support modem control lines. | 222 | * We don't support modem control lines. |
@@ -234,12 +234,8 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios, | |||
234 | */ | 234 | */ |
235 | baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); | 235 | baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); |
236 | quot = uart_get_divisor(port, baud); | 236 | quot = uart_get_divisor(port, baud); |
237 | 237 | b = port->uartclk / (16 * quot); | |
238 | if (port->state && port->state->port.tty) { | 238 | tty_termios_encode_baud_rate(termios, b, b); |
239 | struct tty_struct *tty = port->state->port.tty; | ||
240 | unsigned int b = port->uartclk / (16 * quot); | ||
241 | tty_encode_baud_rate(tty, b, b); | ||
242 | } | ||
243 | 239 | ||
244 | switch (termios->c_cflag & CSIZE) { | 240 | switch (termios->c_cflag & CSIZE) { |
245 | case CS5: | 241 | case CS5: |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index eacb588a9345..66ecc7ab6dab 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -909,13 +909,11 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios, | |||
909 | rational_best_approximation(16 * div * baud, sport->port.uartclk, | 909 | rational_best_approximation(16 * div * baud, sport->port.uartclk, |
910 | 1 << 16, 1 << 16, &num, &denom); | 910 | 1 << 16, 1 << 16, &num, &denom); |
911 | 911 | ||
912 | if (port->state && port->state->port.tty) { | 912 | tdiv64 = sport->port.uartclk; |
913 | tdiv64 = sport->port.uartclk; | 913 | tdiv64 *= num; |
914 | tdiv64 *= num; | 914 | do_div(tdiv64, denom * 16 * div); |
915 | do_div(tdiv64, denom * 16 * div); | 915 | tty_termios_encode_baud_rate(termios, |
916 | tty_encode_baud_rate(sport->port.state->port.tty, | ||
917 | (speed_t)tdiv64, (speed_t)tdiv64); | 916 | (speed_t)tdiv64, (speed_t)tdiv64); |
918 | } | ||
919 | 917 | ||
920 | num -= 1; | 918 | num -= 1; |
921 | denom -= 1; | 919 | denom -= 1; |
diff --git a/drivers/serial/ioc3_serial.c b/drivers/serial/ioc3_serial.c index f164ba4eba02..93de907b1208 100644 --- a/drivers/serial/ioc3_serial.c +++ b/drivers/serial/ioc3_serial.c | |||
@@ -954,12 +954,13 @@ ioc3_change_speed(struct uart_port *the_port, | |||
954 | struct ktermios *new_termios, struct ktermios *old_termios) | 954 | struct ktermios *new_termios, struct ktermios *old_termios) |
955 | { | 955 | { |
956 | struct ioc3_port *port = get_ioc3_port(the_port); | 956 | struct ioc3_port *port = get_ioc3_port(the_port); |
957 | unsigned int cflag; | 957 | unsigned int cflag, iflag; |
958 | int baud; | 958 | int baud; |
959 | int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; | 959 | int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; |
960 | struct uart_state *state = the_port->state; | 960 | struct uart_state *state = the_port->state; |
961 | 961 | ||
962 | cflag = new_termios->c_cflag; | 962 | cflag = new_termios->c_cflag; |
963 | iflag = new_termios->c_iflag; | ||
963 | 964 | ||
964 | switch (cflag & CSIZE) { | 965 | switch (cflag & CSIZE) { |
965 | case CS5: | 966 | case CS5: |
@@ -1000,12 +1001,12 @@ ioc3_change_speed(struct uart_port *the_port, | |||
1000 | 1001 | ||
1001 | state->port.tty->low_latency = 1; | 1002 | state->port.tty->low_latency = 1; |
1002 | 1003 | ||
1003 | if (I_IGNPAR(state->port.tty)) | 1004 | if (iflag & IGNPAR) |
1004 | the_port->ignore_status_mask &= ~(N_PARITY_ERROR | 1005 | the_port->ignore_status_mask &= ~(N_PARITY_ERROR |
1005 | | N_FRAMING_ERROR); | 1006 | | N_FRAMING_ERROR); |
1006 | if (I_IGNBRK(state->port.tty)) { | 1007 | if (iflag & IGNBRK) { |
1007 | the_port->ignore_status_mask &= ~N_BREAK; | 1008 | the_port->ignore_status_mask &= ~N_BREAK; |
1008 | if (I_IGNPAR(state->port.tty)) | 1009 | if (iflag & IGNPAR) |
1009 | the_port->ignore_status_mask &= ~N_OVERRUN_ERROR; | 1010 | the_port->ignore_status_mask &= ~N_OVERRUN_ERROR; |
1010 | } | 1011 | } |
1011 | if (!(cflag & CREAD)) { | 1012 | if (!(cflag & CREAD)) { |
diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index 8ad28fc64926..fcfe82653ac8 100644 --- a/drivers/serial/ioc4_serial.c +++ b/drivers/serial/ioc4_serial.c | |||
@@ -1685,11 +1685,12 @@ ioc4_change_speed(struct uart_port *the_port, | |||
1685 | { | 1685 | { |
1686 | struct ioc4_port *port = get_ioc4_port(the_port, 0); | 1686 | struct ioc4_port *port = get_ioc4_port(the_port, 0); |
1687 | int baud, bits; | 1687 | int baud, bits; |
1688 | unsigned cflag; | 1688 | unsigned cflag, iflag; |
1689 | int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; | 1689 | int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; |
1690 | struct uart_state *state = the_port->state; | 1690 | struct uart_state *state = the_port->state; |
1691 | 1691 | ||
1692 | cflag = new_termios->c_cflag; | 1692 | cflag = new_termios->c_cflag; |
1693 | iflag = new_termios->c_iflag; | ||
1693 | 1694 | ||
1694 | switch (cflag & CSIZE) { | 1695 | switch (cflag & CSIZE) { |
1695 | case CS5: | 1696 | case CS5: |
@@ -1741,12 +1742,12 @@ ioc4_change_speed(struct uart_port *the_port, | |||
1741 | 1742 | ||
1742 | state->port.tty->low_latency = 1; | 1743 | state->port.tty->low_latency = 1; |
1743 | 1744 | ||
1744 | if (I_IGNPAR(state->port.tty)) | 1745 | if (iflag & IGNPAR) |
1745 | the_port->ignore_status_mask &= ~(N_PARITY_ERROR | 1746 | the_port->ignore_status_mask &= ~(N_PARITY_ERROR |
1746 | | N_FRAMING_ERROR); | 1747 | | N_FRAMING_ERROR); |
1747 | if (I_IGNBRK(state->port.tty)) { | 1748 | if (iflag & IGNBRK) { |
1748 | the_port->ignore_status_mask &= ~N_BREAK; | 1749 | the_port->ignore_status_mask &= ~N_BREAK; |
1749 | if (I_IGNPAR(state->port.tty)) | 1750 | if (iflag & IGNPAR) |
1750 | the_port->ignore_status_mask &= ~N_OVERRUN_ERROR; | 1751 | the_port->ignore_status_mask &= ~N_OVERRUN_ERROR; |
1751 | } | 1752 | } |
1752 | if (!(cflag & CREAD)) { | 1753 | if (!(cflag & CREAD)) { |
diff --git a/drivers/serial/max3100.c b/drivers/serial/max3100.c index 3351c3bd59e4..beb1afa27d8d 100644 --- a/drivers/serial/max3100.c +++ b/drivers/serial/max3100.c | |||
@@ -430,17 +430,14 @@ max3100_set_termios(struct uart_port *port, struct ktermios *termios, | |||
430 | int baud = 0; | 430 | int baud = 0; |
431 | unsigned cflag; | 431 | unsigned cflag; |
432 | u32 param_new, param_mask, parity = 0; | 432 | u32 param_new, param_mask, parity = 0; |
433 | struct tty_struct *tty = s->port.state->port.tty; | ||
434 | 433 | ||
435 | dev_dbg(&s->spi->dev, "%s\n", __func__); | 434 | dev_dbg(&s->spi->dev, "%s\n", __func__); |
436 | if (!tty) | ||
437 | return; | ||
438 | 435 | ||
439 | cflag = termios->c_cflag; | 436 | cflag = termios->c_cflag; |
440 | param_new = 0; | 437 | param_new = 0; |
441 | param_mask = 0; | 438 | param_mask = 0; |
442 | 439 | ||
443 | baud = tty_get_baud_rate(tty); | 440 | baud = tty_termios_baud_rate(termios); |
444 | param_new = s->conf & MAX3100_BAUD; | 441 | param_new = s->conf & MAX3100_BAUD; |
445 | switch (baud) { | 442 | switch (baud) { |
446 | case 300: | 443 | case 300: |
@@ -485,7 +482,7 @@ max3100_set_termios(struct uart_port *port, struct ktermios *termios, | |||
485 | default: | 482 | default: |
486 | baud = s->baud; | 483 | baud = s->baud; |
487 | } | 484 | } |
488 | tty_encode_baud_rate(tty, baud, baud); | 485 | tty_termios_encode_baud_rate(termios, baud, baud); |
489 | s->baud = baud; | 486 | s->baud = baud; |
490 | param_mask |= MAX3100_BAUD; | 487 | param_mask |= MAX3100_BAUD; |
491 | 488 | ||