[PATCH v1 0/7] serial: imx: work-around for hardware RX flood, and then isr improvements
Sergey Organov
sorganov at gmail.com
Sat Jan 21 07:36:32 PST 2023
These series contain a work-around for hardware RX flood in first 2
commits, and then further cleanups and optimizations of the receive IRQ
handler.
WARNING: the flood fix is extensively tested with older version of the
kernel with DMA turned off. The DMA path is tested only a bit, as DMA has
receive problems on my kernel version.
Changes in v1:
* Missing braces fixed.
* Withdrawn patch optimizing imx_uart_readl() -> readl(), on request of
Uwe Kleine-König.
Sergey Organov (7):
serial: imx: factor-out common code to imx_uart_soft_reset()
serial: imx: work-around for hardware RX flood
serial: imx: do not sysrq broken chars
serial: imx: do not break from FIFO reading loop prematurely
serial: imx: remove redundant USR2 read from FIFO reading loop
serial: imx: stop using USR2 in FIFO reading loop
serial: imx: refine local variables in rxint()
drivers/tty/serial/imx.c | 225 ++++++++++++++++++++++++---------------
1 file changed, 140 insertions(+), 85 deletions(-)
Interdiff against v0:
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 45327ff6dd14..447b9060d9df 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -889,15 +889,14 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id)
{
struct imx_port *sport = dev_id;
struct tty_port *port = &sport->port.state->port;
- typeof(sport->port.membase) membase = sport->port.membase;
u32 usr2, rx;
/* If we received something, check for 0xff flood */
- usr2 = readl(membase + USR2);
+ usr2 = imx_uart_readl(sport, USR2);
if (usr2 & USR2_RDR)
imx_uart_check_flood(sport, usr2);
- while ((rx = readl(membase + URXD0)) & URXD_CHARRDY) {
+ while ((rx = imx_uart_readl(sport, URXD0)) & URXD_CHARRDY) {
unsigned int flg = TTY_NORMAL;
sport->port.icount.rx++;
@@ -929,8 +928,9 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id)
flg = TTY_OVERRUN;
sport->port.sysrq = 0;
- } else if (uart_handle_sysrq_char(&sport->port, (unsigned char)rx))
+ } else if (uart_handle_sysrq_char(&sport->port, (unsigned char)rx)) {
continue;
+ }
if (sport->port.ignore_status_mask & URXD_DUMMY_READ)
continue;
--
2.30.1
More information about the linux-arm-kernel
mailing list