]> Git Repo - linux.git/commitdiff
tty: amiserial: add missing TIOCSSERIAL jiffies conversions
authorJohan Hovold <[email protected]>
Wed, 7 Apr 2021 10:23:27 +0000 (12:23 +0200)
committerGreg Kroah-Hartman <[email protected]>
Wed, 7 Apr 2021 15:22:07 +0000 (17:22 +0200)
The tty-port close_delay and closing_wait parameters set by TIOCSSERIAL
are specified in jiffies, while the values returned by TIOCGSERIAL are
specified in centiseconds.

Add the missing conversions so that TIOCSSERIAL works as expected also
if this code is ever reused on a system where HZ is not 100.

Signed-off-by: Johan Hovold <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/tty/amiserial.c

index ec6802ba2bf85d7766fae2c448fba346ce596083..ca48ce5a0862a128081aaf145bf57f2463dd5f95 100644 (file)
@@ -937,15 +937,21 @@ static void rs_unthrottle(struct tty_struct * tty)
 static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
 {
        struct serial_state *state = tty->driver_data;
+       unsigned int close_delay, closing_wait;
 
        tty_lock(tty);
+       close_delay = jiffies_to_msecs(state->tport.close_delay) / 10;
+       closing_wait = state->tport.closing_wait;
+       if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
+               closing_wait = jiffies_to_msecs(closing_wait) / 10;
+
        ss->line = tty->index;
        ss->port = state->port;
        ss->flags = state->tport.flags;
        ss->xmit_fifo_size = state->xmit_fifo_size;
        ss->baud_base = state->baud_base;
-       ss->close_delay = state->tport.close_delay;
-       ss->closing_wait = state->tport.closing_wait;
+       ss->close_delay = close_delay;
+       ss->closing_wait = closing_wait;
        ss->custom_divisor = state->custom_divisor;
        tty_unlock(tty);
        return 0;
@@ -957,6 +963,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
        struct tty_port *port = &state->tport;
        bool change_spd;
        int                     retval = 0;
+       unsigned int close_delay, closing_wait;
 
        tty_lock(tty);
        change_spd = ((ss->flags ^ port->flags) & ASYNC_SPD_MASK) ||
@@ -966,11 +973,16 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
                tty_unlock(tty);
                return -EINVAL;
        }
-  
+
+       close_delay = msecs_to_jiffies(ss->close_delay * 10);
+       closing_wait = ss->closing_wait;
+       if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
+               closing_wait = msecs_to_jiffies(closing_wait * 10);
+
        if (!serial_isroot()) {
                if ((ss->baud_base != state->baud_base) ||
-                   (ss->close_delay != port->close_delay) ||
-                   (ss->closing_wait != port->closing_wait) ||
+                   (close_delay != port->close_delay) ||
+                   (closing_wait != port->closing_wait) ||
                    (ss->xmit_fifo_size != state->xmit_fifo_size) ||
                    ((ss->flags & ~ASYNC_USR_MASK) !=
                     (port->flags & ~ASYNC_USR_MASK))) {
@@ -997,8 +1009,8 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
        port->flags = ((port->flags & ~ASYNC_FLAGS) |
                        (ss->flags & ASYNC_FLAGS));
        state->custom_divisor = ss->custom_divisor;
-       port->close_delay = ss->close_delay * HZ/100;
-       port->closing_wait = ss->closing_wait * HZ/100;
+       port->close_delay = close_delay;
+       port->closing_wait = closing_wait;
 
 check_and_exit:
        if (tty_port_initialized(port)) {
This page took 0.062395 seconds and 4 git commands to generate.