Skip to content

Commit 899ebde

Browse files
Phil Elwellpopcornmix
Phil Elwell
authored andcommitted
tty: amba-pl011: Avoid rare write-when-full error
Under some circumstances on BCM283x processors data loss can be observed - a single byte missing from the TX output stream. These bytes are always the last byte of a batch of 8 written from pl011_tx_chars when from_irq is true, meaning that the FIFO full flag is not checked before writing. The transmit optimisation relies on the FIFO being half-empty when the TX interrupt is raised. Instrumenting the driver further showed that the failure case correlated with the TX FIFO full flag being set at the point where the last byte was written to the data register, which explains the data loss but not how the FIFO appeared to be prematurely full. A possible explanation is that a FIFO write was in flight at the time the interrupt was raised, but as yet there is no hypothesis as to how this might occur. In the absence of a clear understanding of the failure mechanism, avoid the problem by checking the FIFO levels before writing the last byte of the group, which will have minimal performance impact. Signed-off-by: Phil Elwell <[email protected]>
1 parent d6c491c commit 899ebde

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

drivers/tty/serial/amba-pl011.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,10 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
15271527
if (likely(from_irq) && count-- == 0)
15281528
break;
15291529

1530+
if (likely(from_irq) && count == 0 &&
1531+
pl011_read(uap, REG_FR) & UART01x_FR_TXFF)
1532+
break;
1533+
15301534
if (!kfifo_peek(&tport->xmit_fifo, &c))
15311535
break;
15321536

0 commit comments

Comments
 (0)