tty: serial - fix tty back references in termios
authorAlan Cox <alan@linux.intel.com>
Tue, 1 Jun 2010 20:52:52 +0000 (22:52 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Aug 2010 20:47:41 +0000 (13:47 -0700)
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>
drivers/serial/21285.c
drivers/serial/imx.c
drivers/serial/ioc3_serial.c
drivers/serial/ioc4_serial.c
drivers/serial/max3100.c

index 8681f13450562a75e28ab802f070604b72fee72f..d89aa38c5cf04a2c0adf7959da54fcd84eaa965c 100644 (file)
@@ -216,7 +216,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
                        struct ktermios *old)
 {
        unsigned long flags;
-       unsigned int baud, quot, h_lcr;
+       unsigned int baud, quot, h_lcr, b;
 
        /*
         * We don't support modem control lines.
@@ -234,12 +234,8 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
         */
        baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
        quot = uart_get_divisor(port, baud);
-
-       if (port->state && port->state->port.tty) {
-               struct tty_struct *tty = port->state->port.tty;
-               unsigned int b = port->uartclk / (16 * quot);
-               tty_encode_baud_rate(tty, b, b);
-       }
+       b = port->uartclk / (16 * quot);
+       tty_termios_encode_baud_rate(termios, b, b);
 
        switch (termios->c_cflag & CSIZE) {
        case CS5:
index eacb588a93459911e2d3d5be0a7af7f171dc24ec..66ecc7ab6daba803c5c74f8fa06a6a6b105b8f8c 100644 (file)
@@ -909,13 +909,11 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
        rational_best_approximation(16 * div * baud, sport->port.uartclk,
                1 << 16, 1 << 16, &num, &denom);
 
-       if (port->state && port->state->port.tty) {
-               tdiv64 = sport->port.uartclk;
-               tdiv64 *= num;
-               do_div(tdiv64, denom * 16 * div);
-               tty_encode_baud_rate(sport->port.state->port.tty,
+       tdiv64 = sport->port.uartclk;
+       tdiv64 *= num;
+       do_div(tdiv64, denom * 16 * div);
+       tty_termios_encode_baud_rate(termios,
                                (speed_t)tdiv64, (speed_t)tdiv64);
-       }
 
        num -= 1;
        denom -= 1;
index f164ba4eba02292806cd04ece8864f7efb2f3570..93de907b12088a54ab5809cf79c46ba5ec2757f2 100644 (file)
@@ -954,12 +954,13 @@ ioc3_change_speed(struct uart_port *the_port,
                  struct ktermios *new_termios, struct ktermios *old_termios)
 {
        struct ioc3_port *port = get_ioc3_port(the_port);
-       unsigned int cflag;
+       unsigned int cflag, iflag;
        int baud;
        int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8;
        struct uart_state *state = the_port->state;
 
        cflag = new_termios->c_cflag;
+       iflag = new_termios->c_iflag;
 
        switch (cflag & CSIZE) {
        case CS5:
@@ -1000,12 +1001,12 @@ ioc3_change_speed(struct uart_port *the_port,
 
        state->port.tty->low_latency = 1;
 
-       if (I_IGNPAR(state->port.tty))
+       if (iflag & IGNPAR)
                the_port->ignore_status_mask &= ~(N_PARITY_ERROR
                                                  | N_FRAMING_ERROR);
-       if (I_IGNBRK(state->port.tty)) {
+       if (iflag & IGNBRK) {
                the_port->ignore_status_mask &= ~N_BREAK;
-               if (I_IGNPAR(state->port.tty))
+               if (iflag & IGNPAR)
                        the_port->ignore_status_mask &= ~N_OVERRUN_ERROR;
        }
        if (!(cflag & CREAD)) {
index 8ad28fc64926a88e2d5399439f3852d3818f243f..fcfe82653ac8d1edd73f208faf616446bb2a5e9c 100644 (file)
@@ -1685,11 +1685,12 @@ ioc4_change_speed(struct uart_port *the_port,
 {
        struct ioc4_port *port = get_ioc4_port(the_port, 0);
        int baud, bits;
-       unsigned cflag;
+       unsigned cflag, iflag;
        int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8;
        struct uart_state *state = the_port->state;
 
        cflag = new_termios->c_cflag;
+       iflag = new_termios->c_iflag;
 
        switch (cflag & CSIZE) {
        case CS5:
@@ -1741,12 +1742,12 @@ ioc4_change_speed(struct uart_port *the_port,
 
        state->port.tty->low_latency = 1;
 
-       if (I_IGNPAR(state->port.tty))
+       if (iflag & IGNPAR)
                the_port->ignore_status_mask &= ~(N_PARITY_ERROR
                                                | N_FRAMING_ERROR);
-       if (I_IGNBRK(state->port.tty)) {
+       if (iflag & IGNBRK) {
                the_port->ignore_status_mask &= ~N_BREAK;
-               if (I_IGNPAR(state->port.tty))
+               if (iflag & IGNPAR)
                        the_port->ignore_status_mask &= ~N_OVERRUN_ERROR;
        }
        if (!(cflag & CREAD)) {
index 3351c3bd59e4089f11bc3081df0c91443ab01a7e..beb1afa27d8d3a5549ca9b2b745702bffc8d6301 100644 (file)
@@ -430,17 +430,14 @@ max3100_set_termios(struct uart_port *port, struct ktermios *termios,
        int baud = 0;
        unsigned cflag;
        u32 param_new, param_mask, parity = 0;
-       struct tty_struct *tty = s->port.state->port.tty;
 
        dev_dbg(&s->spi->dev, "%s\n", __func__);
-       if (!tty)
-               return;
 
        cflag = termios->c_cflag;
        param_new = 0;
        param_mask = 0;
 
-       baud = tty_get_baud_rate(tty);
+       baud = tty_termios_baud_rate(termios);
        param_new = s->conf & MAX3100_BAUD;
        switch (baud) {
        case 300:
@@ -485,7 +482,7 @@ max3100_set_termios(struct uart_port *port, struct ktermios *termios,
        default:
                baud = s->baud;
        }
-       tty_encode_baud_rate(tty, baud, baud);
+       tty_termios_encode_baud_rate(termios, baud, baud);
        s->baud = baud;
        param_mask |= MAX3100_BAUD;