diff options
author | Jiri Slaby <jslaby@suse.cz> | 2021-11-18 08:31:14 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-11-25 18:33:21 +0100 |
commit | 47b722d473824e9c56b7487d47ea7423483258d9 (patch) | |
tree | eb11e933231dc7130697ef924b8591afa3d2e0d3 /drivers/tty/mxser.c | |
parent | 2fb19b957805e8d6b981cf339caecd7cb6a3893a (diff) |
mxser: call stop_rx from mxser_shutdown_port()
mxser_stop_rx() should be called from mxser_shutdown_port() for several
reasons:
1) info->slock is held while manipulating IER (as on other places),
2) hangup now stops rx too,
3) mxser_close() will use tty_port_close() and there is no place except
tty_port_operations::shutdown() where this can be done,
4) this is the same sequence as serial_core does. So we can map this
code 1:1 when switching the driver to it.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20211118073125.12283-9-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/mxser.c')
-rw-r--r-- | drivers/tty/mxser.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 6b47a0607f59..45ee1122a5f7 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c @@ -808,6 +808,20 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty) } /* + * To stop accepting input, we disable the receive line status interrupts, and + * tell the interrupt driver to stop checking the data ready bit in the line + * status register. + */ +static void mxser_stop_rx(struct mxser_port *info) +{ + info->IER &= ~UART_IER_RLSI; + if (info->board->must_hwid) + info->IER &= ~MOXA_MUST_RECV_ISR; + + outb(info->IER, info->ioaddr + UART_IER); +} + +/* * This routine will shutdown a serial port */ static void mxser_shutdown_port(struct tty_port *port) @@ -817,6 +831,8 @@ static void mxser_shutdown_port(struct tty_port *port) spin_lock_irqsave(&info->slock, flags); + mxser_stop_rx(info); + /* * clear delta_msr_wait queue to avoid mem leaks: we may free the irq * here so the queue might never be waken up @@ -881,20 +897,6 @@ static void mxser_flush_buffer(struct tty_struct *tty) } /* - * To stop accepting input, we disable the receive line status interrupts, and - * tell the interrupt driver to stop checking the data ready bit in the line - * status register. - */ -static void mxser_stop_rx(struct mxser_port *info) -{ - info->IER &= ~UART_IER_RLSI; - if (info->board->must_hwid) - info->IER &= ~MOXA_MUST_RECV_ISR; - - outb(info->IER, info->ioaddr + UART_IER); -} - -/* * This routine is called when the serial port gets closed. First, we * wait for the last remaining data to be sent. Then, we unlink its * async structure from the interrupt chain if necessary, and we free @@ -908,7 +910,6 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) if (tty_port_close_start(port, tty, filp) == 0) return; mutex_lock(&port->mutex); - mxser_stop_rx(info); mxser_flush_buffer(tty); if (tty_port_initialized(port) && C_HUPCL(tty)) tty_port_lower_dtr_rts(port); |