diff options
Diffstat (limited to 'drivers/tty/serial/stm32-usart.c')
| -rw-r--r-- | drivers/tty/serial/stm32-usart.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index 1f89ab0e49ac..9570002d07e7 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -550,11 +550,23 @@ static void stm32_usart_transmit_chars(struct uart_port *port)  	struct stm32_port *stm32_port = to_stm32_port(port);  	const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;  	struct circ_buf *xmit = &port->state->xmit; +	u32 isr; +	int ret;  	if (port->x_char) {  		if (stm32_usart_tx_dma_started(stm32_port) &&  		    stm32_usart_tx_dma_enabled(stm32_port))  			stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT); + +		/* Check that TDR is empty before filling FIFO */ +		ret = +		readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, +						  isr, +						  (isr & USART_SR_TXE), +						  10, 1000); +		if (ret) +			dev_warn(port->dev, "1 character may be erased\n"); +  		writel_relaxed(port->x_char, port->membase + ofs->tdr);  		port->x_char = 0;  		port->icount.tx++; @@ -730,7 +742,7 @@ static void stm32_usart_start_tx(struct uart_port *port)  	struct serial_rs485 *rs485conf = &port->rs485;  	struct circ_buf *xmit = &port->state->xmit; -	if (uart_circ_empty(xmit)) +	if (uart_circ_empty(xmit) && !port->x_char)  		return;  	if (rs485conf->flags & SER_RS485_ENABLED) {  |