• Alex Williamson's avatar
    [PATCH] 8250 UART backup timer · 40b36daa
    Alex Williamson authored
    The patch below works around a minor bug found in the UART of the remote
    management card used in many HP ia64 and parisc servers (aka the Diva
    UARTs).  The problem is that the UART does not reassert the THRE interrupt
    if it has been previously cleared and the IIR THRI bit is re-enabled.  This
    can produce a very annoying failure mode when used as a serial console,
    allowing a boot/reboot to hang indefinitely until an RX interrupt kicks it
    into working again (ie.  an unattended reboot could stall).
    
    To solve this problem, a backup timer is introduced that runs alongside the
    standard interrupt driven mechanism.  This timer wakes up periodically,
    checks for a hang condition and gets characters moving again.  This backup
    mechanism is only enabled if the UART is detected as having this problem,
    so systems without these UARTs will have no additional overhead.
    
    This version of the patch incorporates previous comments from Pavel and
    removes races in the bug detection code.  The test is now done before the
    irq linking to prevent races with interrupt handler clearing the THRE
    interrupt.  Short delays and syncs are also added to ensure the device is
    able to update register state before the result is tested.
    
    Aristeu says:
    
      this was tested on the following HP machines and solved the problem:
      rx2600, rx2620, rx1600 and rx1620s.
    
    hpa says:
    
      I have seen this same bug in soft UART IP from "a major vendor."
    Signed-off-by: default avatarAlex Williamson <alex.williamson@hp.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Russell King <rmk@arm.linux.org.uk>
    Acked-by: default avatarAristeu Sergio Rozanski Filho <aris@cathedrallabs.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    40b36daa
8250.c 69.6 KB