| From 7492ffc90fa126afb67d4392d56cb4134780194a Mon Sep 17 00:00:00 2001 |
| From: Sven Eckelmann <sven@narfation.org> |
| Date: Sat, 13 Nov 2021 13:10:50 +0100 |
| Subject: tty: serial: msm_serial: Deactivate RX DMA for polling support |
| |
| From: Sven Eckelmann <sven@narfation.org> |
| |
| commit 7492ffc90fa126afb67d4392d56cb4134780194a upstream. |
| |
| The CONSOLE_POLLING mode is used for tools like k(g)db. In this kind of |
| setup, it is often sharing a serial device with the normal system console. |
| This is usually no problem because the polling helpers can consume input |
| values directly (when in kgdb context) and the normal Linux handlers can |
| only consume new input values after kgdb switched back. |
| |
| This is not true anymore when RX DMA is enabled for UARTDM controllers. |
| Single input values can no longer be received correctly. Instead following |
| seems to happen: |
| |
| * on 1. input, some old input is read (continuously) |
| * on 2. input, two old inputs are read (continuously) |
| * on 3. input, three old input values are read (continuously) |
| * on 4. input, 4 previous inputs are received |
| |
| This repeats then for each group of 4 input values. |
| |
| This behavior changes slightly depending on what state the controller was |
| when the first input was received. But this makes working with kgdb |
| basically impossible because control messages are always corrupted when |
| kgdboc tries to parse them. |
| |
| RX DMA should therefore be off when CONSOLE_POLLING is enabled to avoid |
| these kind of problems. No such problem was noticed for TX DMA. |
| |
| Fixes: 99693945013a ("tty: serial: msm: Add RX DMA support") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sven Eckelmann <sven@narfation.org> |
| Link: https://lore.kernel.org/r/20211113121050.7266-1-sven@narfation.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/tty/serial/msm_serial.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/tty/serial/msm_serial.c |
| +++ b/drivers/tty/serial/msm_serial.c |
| @@ -446,6 +446,9 @@ static void msm_start_rx_dma(struct msm_ |
| u32 val; |
| int ret; |
| |
| + if (IS_ENABLED(CONFIG_CONSOLE_POLL)) |
| + return; |
| + |
| if (!dma->chan) |
| return; |
| |