The i.MX driver doesn't set the UPF_AUTO_CTS flag which means that uart_handle_cts_change() will stop/start the receiver on CTS changes. This is completely unnecessary as the hardware will handle CTS changes automatically. With UPF_AUTO_CTS enabled uart_handle_cts_change() boils down to increasing the CTS statistic counter. For clarity inline increasing the counter instead of calling uart_handle_cts_change(). Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/tty/serial/imx.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 0419a084c0ed..82f987dab066 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -703,13 +703,11 @@ static void imx_uart_start_tx(struct uart_port *port) static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) { struct imx_port *sport = dev_id; - u32 usr1; spin_lock(&sport->port.lock); imx_uart_writel(sport, USR1_RTSD, USR1); - usr1 = imx_uart_readl(sport, USR1) & USR1_RTSS; - uart_handle_cts_change(&sport->port, !!usr1); + sport->port.icount.cts++; wake_up_interruptible(&sport->port.state->port.delta_msr_wait); spin_unlock(&sport->port.lock); @@ -1588,6 +1586,9 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, } else if (termios->c_cflag & CRTSCTS) { if (ucr2 & UCR2_CTS) ucr2 |= UCR2_CTSC; + port->status |= UPSTAT_AUTOCTS; + } else { + port->status &= ~UPSTAT_AUTOCTS; } if (termios->c_cflag & CRTSCTS) @@ -1706,6 +1707,9 @@ static void imx_uart_config_port(struct uart_port *port, int flags) if (flags & UART_CONFIG_TYPE) sport->port.type = PORT_IMX; + + if (sport->have_rtscts) + sport->port.flags |= UPF_AUTO_CTS; } /* -- 2.20.1