• P
    tty: amba-pl011: Avoid rare write-when-full error · ae829e9c
    Phil Elwell 提交于
    raspberrypi inclusion
    category: feature
    bugzilla: 50432
    
    --------------------------------
    
    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: NPhil Elwell <phil@raspberrypi.org>
    Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    ae829e9c
amba-pl011.c 73.4 KB