lkml.org 
[lkml]   [2015]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 1/3] tty: serial: 8250_omap: do not use RX DMA if pause is not supported
    From
    Date
    On 08/07/2015 11:00 PM, Sebastian Andrzej Siewior wrote:
    > The 8250-omap driver requires the DMA-engine driver to support the pause
    > command in order to properly turn off programmed RX transfer before the
    > driver stars manually reading from the FIFO.
    > The lacking support of the requirement has been discovered recently. In
    > order to stay safe here we disable support for RX-DMA as soon as we
    > notice that it does not work. This should happen very early.
    > If the user does not want to see this backtrace he can either disable
    > DMA support (completely or RX-only) or backport the required patches for
    > edma / omap-dma once they hit mainline.
    >
    > Cc: <stable@vger.kernel.org>
    > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    > ---
    > drivers/tty/serial/8250/8250_omap.c | 9 ++++++++-
    > 1 file changed, 8 insertions(+), 1 deletion(-)
    >
    > diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
    > index 0340ee6ba970..07a11e0935e4 100644
    > --- a/drivers/tty/serial/8250/8250_omap.c
    > +++ b/drivers/tty/serial/8250/8250_omap.c
    > @@ -112,6 +112,7 @@ struct omap8250_priv {
    > struct work_struct qos_work;
    > struct uart_8250_dma omap8250_dma;
    > spinlock_t rx_dma_lock;
    > + bool rx_dma_broken;
    > };
    >
    > static u32 uart_read(struct uart_8250_port *up, u32 reg)
    > @@ -761,6 +762,7 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
    > struct omap8250_priv *priv = p->port.private_data;
    > struct uart_8250_dma *dma = p->dma;
    > unsigned long flags;
    > + int ret;
    >
    > spin_lock_irqsave(&priv->rx_dma_lock, flags);
    >
    > @@ -769,7 +771,9 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
    > return;
    > }
    >
    > - dmaengine_pause(dma->rxchan);
    > + ret = dmaengine_pause(dma->rxchan);
    > + if (WARN_ON_ONCE(ret))
    > + priv->rx_dma_broken = true;

    I don't think this is good thing for the stable _and_ for the mainline at the
    same time:
    in stable the rx DMA should not be allowed since the stable kernels does not
    allow pause/resume with omap-dma, so there the rx DMA should be just disabled
    for UART. This change will cause regression since it introduce a WARN_ON_ONCE,
    which will be printed if the user tries to use non working feature.

    In mainline you will eventually going to have pause/resume support so this
    patch will make no sense there.

    >
    > spin_unlock_irqrestore(&priv->rx_dma_lock, flags);
    >
    > @@ -813,6 +817,9 @@ static int omap_8250_rx_dma(struct uart_8250_port *p, unsigned int iir)
    > break;
    > }
    >
    > + if (priv->rx_dma_broken)
    > + return -EINVAL;
    > +
    > spin_lock_irqsave(&priv->rx_dma_lock, flags);
    >
    > if (dma->rx_running)
    >


    --
    Péter


    \
     
     \ /
      Last update: 2015-08-10 14:21    [W:4.063 / U:0.816 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site