mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
tty: amiserial: add missing TIOCSSERIAL jiffies conversions
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 <johan@kernel.org> Link: https://lore.kernel.org/r/20210407102334.32361-10-johan@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1d31a831cc
commit
c33a63e8dd
1 changed files with 19 additions and 7 deletions
|
@ -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)) {
|
||||
|
|
Loading…
Reference in a new issue