• D
    serial/amba-pl011: Activate TX IRQ passively · 734745ca
    Dave Martin 提交于
    The current PL011 driver transmits a dummy character when the UART
    is opened, to assert the TX IRQ for the first time
    (see pl011_startup()).  The UART is put in loopback mode temporarily,
    so the receiver presumably shouldn't see anything.
    
    However...
    
    At least some platforms containing a PL011 send characters down the
    wire even when loopback mode is enabled.  This means that a
    spurious NUL character may be seen at the receiver when the PL011 is
    opened through the TTY layer.
    
    The current code also temporarily sets the baud rate to maximum and
    the character width to the minimum, to that the dummy TX completes
    as quickly as possible.  If this is seen by the receiver it will
    result in a framing error and can knock the receiver out of sync --
    turning subsequent output into garbage until synchronisation
    is reestablished.  (Particularly problematic during boot with systemd.)
    
    To avoid spurious transmissions, this patch removes assumptions about
    whether the TX IRQ will fire until at least one TX IRQ has been seen.
    
    Instead, the UART will unmask the TX IRQ and then slow-start via
    polling and timer-based soft IRQs initially.  If the TTY layer writes
    enough data to fill the FIFO to the interrupt threshold in one go,
    the TX IRQ should assert, at which point the driver changes to
    fully interrupt-driven TX.
    
    In this way, the TX IRQ is activated as a side-effect instead of
    being done deliberately.
    
    This should also mean that the driver works on the SBSA Generic
    UART[1] (a cut-down PL011) without invasive changes.  The Generic
    UART lacks some features needed for the dummy TX approach to work
    (FIFO disabling and loopback).
    
    [1] Server Base System Architecture (ARM-DEN-0029-v2.3)
        http://infocenter.arm.com/
        (click-thru required :/)
    Signed-off-by: NDave Martin <Dave.Martin@arm.com>
    Tested-by: NAndre Przywara <andre.przywara@arm.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    734745ca
amba-pl011.c 61.4 KB