diff options
author | Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> | 2022-07-29 17:17:47 +0530 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-08-30 13:26:01 +0200 |
commit | a17fa1216c23bf28819bb957f71f1bab914ba9a8 (patch) | |
tree | 660b27612ad0853b2f1b27d2c1ba752a79bf9ab2 /drivers/tty/serial/xilinx_uartps.c | |
parent | tty: xilinx_uartps: Prevent writes when the controller is disabled (diff) | |
download | linux-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.c | 14 |
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); } |