From 191fa37376cec123f2bf43d226a0d8e89c6fdc05 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Wed, 24 Nov 2021 14:29:41 +0100 Subject: [PATCH] kernel/uart: fix GetChar for PL011 Check RX buffer status when GetChar is called in no-wait mode. This fixes an 'infinite keypress' issue that used to occur after 16 keypresses. Change-Id: I47762de387b07c4fed46cc192cd3b81fdabfb270 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4732 Reviewed-by: Adrien Destugues --- src/system/kernel/arch/arm/arch_uart_pl011.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/arch/arm/arch_uart_pl011.cpp b/src/system/kernel/arch/arm/arch_uart_pl011.cpp index b2f23886e2..194c6a1a64 100644 --- a/src/system/kernel/arch/arm/arch_uart_pl011.cpp +++ b/src/system/kernel/arch/arm/arch_uart_pl011.cpp @@ -289,10 +289,14 @@ int ArchUARTPL011::GetChar(bool wait) { if (Enabled() == true) { - // Wait until a character is received? if (wait) { + // Wait until a character is received while ((In32(PL01x_FR) & PL01x_FR_RXFE) != 0) Barrier(); + } else { + // Check if there is any data available in RX fifo + if ((In32(PL01x_FR) & PL01x_FR_RXFE) != 0) + return -1; } return In32(PL01x_DR); }