• Andrew Jeffery's avatar
    serial: 8250: Add UART_BUG_TXRACE workaround for Aspeed VUART · df8f2be2
    Andrew Jeffery authored
    Aspeed Virtual UARTs directly bridge e.g. the system console UART on the
    LPC bus to the UART interface on the BMC's internal APB. As such there's
    no RS-232 signalling involved - the UART interfaces on each bus are
    directly connected as the producers and consumers of the one set of
    FIFOs.
    
    The APB in the AST2600 generally runs at 100MHz while the LPC bus peaks
    at 33MHz. The difference in clock speeds exposes a race in the VUART
    design where a Tx data burst on the APB interface can result in a byte
    lost on the LPC interface. The symptom is LSR[DR] remains clear on the
    LPC interface despite data being present in its Rx FIFO, while LSR[THRE]
    remains clear on the APB interface as the host has not consumed the data
    the BMC has transmitted. In this state, the UART has stalled and no
    further data can be transmitted without manual intervention (e.g.
    resetting the FIFOs, resulting in loss of data).
    
    The recommended work-around is to insert a read cycle on the APB
    interface between writes to THR.
    
    Cc: ChiaWei Wang <chiawei_wang@aspeedtech.com>
    Tested-by: default avatarChiaWei Wang <chiawei_wang@aspeedtech.com>
    Reviewed-by: default avatarJiri Slaby <jirislaby@kernel.org>
    Signed-off-by: default avatarAndrew Jeffery <andrew@aj.id.au>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210520021334.497341-2-andrew@aj.id.auSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    df8f2be2
8250_port.c 85.3 KB