lkml.org 
[lkml]   [2021]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 44/48] tty: serial: msm_serial: Deactivate RX DMA for polling support
    Date
    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
    @@ -603,6 +603,9 @@ static void msm_start_rx_dma(struct msm_
    u32 val;
    int ret;

    + if (IS_ENABLED(CONFIG_CONSOLE_POLL))
    + return;
    +
    if (!dma->chan)
    return;


    \
     
     \ /
      Last update: 2021-12-06 16:40    [W:3.535 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site