As of commit 2ac33975abda ("serial: qcom-geni: do not kill the machine on fifo underrun") a FIFO underrun will no longer hard lockup the machine. Instead, a FIFO underrun will cause the UART to output a bunch of '\0' characters. The '\0' characters don't seem to show up on most terminal programs and this hides the fact that we had an underrun. An underrun is aq sign of problems in the driver and should be obvious / debugged. Change the driver to put '@' characters in the case of an underrun which should make it much more obvious. Adding this extra initialization doesn't add any real overhead. In fact, this patch reduces code size because the code was calling memset() to init 4 bytes of data. Disassembling the new code shows that early in the function w22 is setup to hold the '@@@@' constant: mov w22, #0x40404040 Each time through the loop w22 is simply stored: str w22, [sp, #4] Cc: Johan Hovold <johan@xxxxxxxxxx> Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx> --- drivers/tty/serial/qcom_geni_serial.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 69a632fefc41..332eaa2faa2b 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -872,10 +872,10 @@ static void qcom_geni_serial_send_chunk_fifo(struct uart_port *uport, { struct qcom_geni_serial_port *port = to_dev_port(uport); unsigned int tx_bytes, remaining = chunk; - u8 buf[BYTES_PER_FIFO_WORD]; while (remaining) { - memset(buf, 0, sizeof(buf)); + u8 buf[BYTES_PER_FIFO_WORD] = { '@', '@', '@', '@' }; + tx_bytes = min(remaining, BYTES_PER_FIFO_WORD); uart_fifo_out(uport, buf, tx_bytes); -- 2.45.2.803.g4e1b14247a-goog