Message ID | 20171020212021.13065-3-troy.kisky@boundarydevices.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 10/20/2017 2:20 PM, Troy Kisky wrote: > Since imx_disable_rx_int is only called by imx_startup, > let's integrate it into that function. > > Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> > --- > v2: new patch > --- > drivers/tty/serial/imx.c | 39 ++++++++++----------------------------- > 1 file changed, 10 insertions(+), 29 deletions(-) While testing this series, I noticed that sending a break on the serial port caused imx-uart 2020000.serial: DMA transaction error. Is that normal ?
Hello, On Fri, Oct 20, 2017 at 02:25:11PM -0700, Troy Kisky wrote: > On 10/20/2017 2:20 PM, Troy Kisky wrote: > > Since imx_disable_rx_int is only called by imx_startup, > > let's integrate it into that function. > > > > Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> > > --- > > v2: new patch > > --- > > drivers/tty/serial/imx.c | 39 ++++++++++----------------------------- > > 1 file changed, 10 insertions(+), 29 deletions(-) > > While testing this series, I noticed that sending a break on the serial port caused > > imx-uart 2020000.serial: DMA transaction error. > > Is that normal ? I remember that Jürgen (added to To explictly) hit this or a similar problem before, maybe he can commen? Best regards Uwe
Hi, On Sunday 22 October 2017 20:49:56 Uwe Kleine-König wrote: > On Fri, Oct 20, 2017 at 02:25:11PM -0700, Troy Kisky wrote: > > On 10/20/2017 2:20 PM, Troy Kisky wrote: > > > Since imx_disable_rx_int is only called by imx_startup, > > > let's integrate it into that function. > > > > > > Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> > > > --- > > > v2: new patch > > > --- > > > drivers/tty/serial/imx.c | 39 > > > ++++++++++----------------------------- 1 file changed, 10 > > > insertions(+), 29 deletions(-) > > > > While testing this series, I noticed that sending a break on the serial > > port caused > > > > imx-uart 2020000.serial: DMA transaction error. > > > > Is that normal ? > > I remember that Jürgen (added to To explictly) hit this or a similar > problem before, maybe he can commen? Yes, it hit me on i.MX53 after DMA was enabled by default. The driver currently doesn't handle the "break" event when DMA is active. In this case the DMA callback returns with an error (that's the message you see, but it's not an error in this case...), the driver clears the flags and drops the (break) event itself. jb
On Fri, Oct 20, 2017 at 02:20:21PM -0700, Troy Kisky wrote: > Since imx_disable_rx_int is only called by imx_startup, > let's integrate it into that function. > > Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> > --- > v2: new patch > --- > drivers/tty/serial/imx.c | 39 ++++++++++----------------------------- > 1 file changed, 10 insertions(+), 29 deletions(-) Does not apply :(
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 15b0ecb4cf60..506fcd742b47 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -710,27 +710,6 @@ static irqreturn_t imx_rxint(int irq, void *dev_id) return IRQ_HANDLED; } -static void imx_disable_rx_int(struct imx_port *sport) -{ - unsigned long temp; - - sport->dma_is_rxing = 1; - - /* disable the receiver ready and aging timer interrupts */ - temp = readl(sport->port.membase + UCR1); - temp &= ~(UCR1_RRDYEN); - writel(temp, sport->port.membase + UCR1); - - temp = readl(sport->port.membase + UCR2); - temp &= ~(UCR2_ATEN); - writel(temp, sport->port.membase + UCR2); - - /* disable the rx errors interrupts */ - temp = readl(sport->port.membase + UCR4); - temp &= ~UCR4_OREN; - writel(temp, sport->port.membase + UCR4); -} - static void clear_rx_errors(struct imx_port *sport); /* @@ -1024,6 +1003,7 @@ static int start_rx_dma(struct imx_port *sport) struct dma_async_tx_descriptor *desc; int ret; + sport->dma_is_rxing = 1; sport->rx_ring.head = 0; sport->rx_ring.tail = 0; sport->rx_periods = RX_DMA_PERIODS; @@ -1260,18 +1240,21 @@ static int imx_startup(struct uart_port *port) if (sport->dma_is_inited && !sport->dma_is_enabled) imx_enable_dma(sport); - temp = readl(sport->port.membase + UCR1); - temp |= UCR1_RRDYEN | UCR1_UARTEN; + temp = readl(sport->port.membase + UCR1) & ~UCR1_RRDYEN; + if (!sport->dma_is_enabled) + temp |= UCR1_RRDYEN; + temp |= UCR1_UARTEN; if (sport->have_rtscts) temp |= UCR1_RTSDEN; writel(temp, sport->port.membase + UCR1); - temp = readl(sport->port.membase + UCR4); - temp |= UCR4_OREN; + temp = readl(sport->port.membase + UCR4) & ~UCR4_OREN; + if (!sport->dma_is_enabled) + temp |= UCR4_OREN; writel(temp, sport->port.membase + UCR4); - temp = readl(sport->port.membase + UCR2); + temp = readl(sport->port.membase + UCR2) & ~UCR2_ATEN; temp |= (UCR2_RXEN | UCR2_TXEN); if (!sport->have_rtscts) temp |= UCR2_IRTS; @@ -1305,10 +1288,8 @@ static int imx_startup(struct uart_port *port) * In our iMX53 the average delay for the first reception dropped from * approximately 35000 microseconds to 1000 microseconds. */ - if (sport->dma_is_enabled) { - imx_disable_rx_int(sport); + if (sport->dma_is_enabled) start_rx_dma(sport); - } spin_unlock_irqrestore(&sport->port.lock, flags);
Since imx_disable_rx_int is only called by imx_startup, let's integrate it into that function. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> --- v2: new patch --- drivers/tty/serial/imx.c | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-)