Message ID | 1563543325-12463-3-git-send-email-Dave.Martin@arm.com |
---|---|
State | New |
Headers | show |
Series | serial: pl011: Fix TX dropping race | expand |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index e24bbc0..f28935a 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -1318,6 +1318,10 @@ static void pl011_start_tx(struct uart_port *port) struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port); + /* It's pointless to kick the UART if it's already transmitting... */ + if (uap->im & UART011_TXIM) + return; + if (!pl011_dma_tx_start(uap)) pl011_start_tx_pio(uap); }
When the TX irq is active, writing chars to the TX FIFO from anywhere except pl011_int() is pointless: the UART is already busy, and new chars will be picked up by pl011_int() as soon as there is FIFO space. To reduce the scope for surprises, bail out of pl011_start_tx_pio() without attempting to write to the FIFO or start TX DMA if the TX FIFO interrupt is already in use. This should also avoid pointless overhead in some situations. Signed-off-by: Dave Martin <Dave.Martin@arm.com> --- Please test both with and without this patch. I believe with the previous patch in place, this patch is not strictly necessary. However, if the UART is actively transmitting in the background already, it does make sense not to waste time trying polling the FIFO fill status or setting up DMA etc. --- drivers/tty/serial/amba-pl011.c | 4 ++++ 1 file changed, 4 insertions(+) -- 2.1.4