diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0123-amba-pl011-Report-AUTOCTS-capability-to-framework.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.14/950-0123-amba-pl011-Report-AUTOCTS-capability-to-framework.patch | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0123-amba-pl011-Report-AUTOCTS-capability-to-framework.patch b/target/linux/brcm2708/patches-4.14/950-0123-amba-pl011-Report-AUTOCTS-capability-to-framework.patch new file mode 100644 index 0000000000..f491df2b8a --- /dev/null +++ b/target/linux/brcm2708/patches-4.14/950-0123-amba-pl011-Report-AUTOCTS-capability-to-framework.patch @@ -0,0 +1,43 @@ +From fc4fafeed9a7cc89b4779681f046a8cc0f506dd9 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <phil@raspberrypi.org> +Date: Wed, 11 Oct 2017 13:48:04 +0100 +Subject: [PATCH 123/454] 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 <phil@raspberrypi.org> +--- + drivers/tty/serial/amba-pl011.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -2063,9 +2063,11 @@ pl011_set_termios(struct uart_port *port + + 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) { |