aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/xilinx_uartps.c
diff options
context:
space:
mode:
authorShubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>2022-07-29 17:17:47 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-08-30 13:26:01 +0200
commita17fa1216c23bf28819bb957f71f1bab914ba9a8 (patch)
tree660b27612ad0853b2f1b27d2c1ba752a79bf9ab2 /drivers/tty/serial/xilinx_uartps.c
parenttty: xilinx_uartps: Prevent writes when the controller is disabled (diff)
downloadlinux-dev-a17fa1216c23bf28819bb957f71f1bab914ba9a8.tar.xz
linux-dev-a17fa1216c23bf28819bb957f71f1bab914ba9a8.zip
tty: xilinx_uartps: Add timeout waiting for loop
There is a potential infinite loop while waiting for the the TXFULL to deassert. Adds the error message and timeout to avoid infinite loop if it fails to get the TX fifo not full. Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> Link: https://lore.kernel.org/r/20220729114748.18332-7-shubhrajyoti.datta@xilinx.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/xilinx_uartps.c')
-rw-r--r--drivers/tty/serial/xilinx_uartps.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index d1aa44febaea..da83ae6df1e0 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1147,8 +1147,20 @@ static void cdns_uart_console_putchar(struct uart_port *port, unsigned char ch)
}
cpu_relax();
}
- while (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXFULL)
+
+ timeout = jiffies + msecs_to_jiffies(1000);
+ while (1) {
+ ctrl_reg = readl(port->membase + CDNS_UART_SR);
+
+ if (!(ctrl_reg & CDNS_UART_SR_TXFULL))
+ break;
+ if (time_after(jiffies, timeout)) {
+ dev_warn(port->dev,
+ "timeout waiting for TX fifo\n");
+ return;
+ }
cpu_relax();
+ }
writel(ch, port->membase + CDNS_UART_FIFO);
}