From 56b45c5c9c01175f6637aebdf19b017323ba1983 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 11 Oct 2017 13:48:04 +0100 Subject: [PATCH] amba-pl011: Report AUTOCTS capability to framework The PL011 has full hardware RTS/CTS support which is enabled by the driver when flow control is requested. However, it doesn't notify the UART framework of the fact, causing the software CTS support to be enabled at the same time. Software CTS triggers the sending of another batch of characters when CTS becomes asserted. The pl011 interrupt handler processes the CTIS bit before TXIS, which can cause some characters to be sent between the time that the TXIS bit first becomes asserted and the time it is handled by a call to px011_tx_chars. This would be fine were it not for the optimisation in pl011_tx_char that assumes the FIFO is half-empty if called from the interrupt handler and skips the checking of the FIFO status register before sending each character, leading to data loss if the FIFO is more than half-full. Prevent the data loss and improve efficiency by indicating the AUTOCTS support. Signed-off-by: Phil Elwell --- drivers/tty/serial/amba-pl011.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 2f75eb7aa0b2..6ea51976e6cd 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -2021,9 +2021,11 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, old_cr |= UART011_CR_CTSEN; uap->autorts = true; + port->status |= UPSTAT_AUTOCTS; } else { old_cr &= ~(UART011_CR_CTSEN | UART011_CR_RTSEN); uap->autorts = false; + port->status &= ~UPSTAT_AUTOCTS; } if (uap->vendor->oversampling) { -- 2.30.2