Message ID | 1400819575-20435-2-git-send-email-b32955@freescale.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 23.05.2014 06:32, Huang Shijie wrote: > This patch disables the receiver ready interrupt for imx_stop_rx. > It reduces the interrupt numbers when the uart is going to close > or suspend. > > Signed-off-by: Huang Shijie <b32955@freescale.com> > --- > drivers/tty/serial/imx.c | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > > diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c > index ed6cdf7..6026101 100644 > --- a/drivers/tty/serial/imx.c > +++ b/drivers/tty/serial/imx.c > @@ -440,6 +440,10 @@ static void imx_stop_rx(struct uart_port *port) > > temp = readl(sport->port.membase + UCR2); > writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2); > + > + /* disable the `Receiver Ready Interrrupt` */ > + temp = readl(sport->port.membase + UCR1); > + writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1); > } While this is about the RX irq, I've a slightly off-topic general question regarding the usage of the *TX* irq in TX DMA mode: It seems to me that the TX irq is kept enabled while the TX DMA is running/enabled? Looking e.g. into the amba-pl011.c there it seems there the logic is: - Set up/start the TX DMA - Disable the TX irq while the TX DMA is running (only waiting for the TX DMA callback, then) - Re-enable the TX irq in the TX DMA callback - Let the TX irq fire, then. And if there are still data, set up the TX DMA again. This sounds quite more logical than the implementation in imx.c. Or is my understanding completely wrong, here? Thanks Dirk
On Fri, May 23, 2014 at 08:10:36AM +0200, Dirk Behme wrote: > On 23.05.2014 06:32, Huang Shijie wrote: > >This patch disables the receiver ready interrupt for imx_stop_rx. > >It reduces the interrupt numbers when the uart is going to close > >or suspend. > > > >Signed-off-by: Huang Shijie <b32955@freescale.com> > >--- > > drivers/tty/serial/imx.c | 4 ++++ > > 1 files changed, 4 insertions(+), 0 deletions(-) > > > >diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c > >index ed6cdf7..6026101 100644 > >--- a/drivers/tty/serial/imx.c > >+++ b/drivers/tty/serial/imx.c > >@@ -440,6 +440,10 @@ static void imx_stop_rx(struct uart_port *port) > > > > temp = readl(sport->port.membase + UCR2); > > writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2); > >+ > >+ /* disable the `Receiver Ready Interrrupt` */ > >+ temp = readl(sport->port.membase + UCR1); > >+ writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1); > > } > > While this is about the RX irq, I've a slightly off-topic general > question regarding the usage of the *TX* irq in TX DMA mode: > > It seems to me that the TX irq is kept enabled while the TX DMA is Not really :) We disable the TXMPTYEN when the DMA is enabled. thanks Huang Shijie
On Fri, May 30, 2014 at 07:52:25AM +0200, Dirk Behme wrote: > On 23.05.2014 06:32, Huang Shijie wrote: > >This patch disables the receiver ready interrupt for imx_stop_rx. > >It reduces the interrupt numbers when the uart is going to close > >or suspend. > > > >Signed-off-by: Huang Shijie <b32955@freescale.com> > >--- > > drivers/tty/serial/imx.c | 4 ++++ > > 1 files changed, 4 insertions(+), 0 deletions(-) > > > >diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c > >index ed6cdf7..6026101 100644 > >--- a/drivers/tty/serial/imx.c > >+++ b/drivers/tty/serial/imx.c > >@@ -440,6 +440,10 @@ static void imx_stop_rx(struct uart_port *port) > > > > temp = readl(sport->port.membase + UCR2); > > writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2); > >+ > >+ /* disable the `Receiver Ready Interrrupt` */ > >+ temp = readl(sport->port.membase + UCR1); > >+ writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1); > > Will this change cause a loss or a processing delay of RX characters > pending in the RX FIFO ? > > It is not clear whether disabling the receiver will clear the RX > FIFO. My guess is that the contents of the RX FIFO will remain > intact when the receiver is disabled. The RX interrupt has an > opportunity to mop up these pending characters in the RX FIFO but > disabling the RX interrupt has potential to leave those characters > in the RX FIFO. Does it matter ? When the @stop_rx() is called, the system(or the application) is closing or suspending, and it has decided to abandon the RX data. So i think it do not matter the RX FIFO has some left data. We will reset the RX FIFO when the UART port is re-started again. thanks Huang Shijie
On 23.05.2014 06:32, Huang Shijie wrote: > This patch disables the receiver ready interrupt for imx_stop_rx. > It reduces the interrupt numbers when the uart is going to close > or suspend. > > Signed-off-by: Huang Shijie <b32955@freescale.com> > --- > drivers/tty/serial/imx.c | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > > diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c > index ed6cdf7..6026101 100644 > --- a/drivers/tty/serial/imx.c > +++ b/drivers/tty/serial/imx.c > @@ -440,6 +440,10 @@ static void imx_stop_rx(struct uart_port *port) > > temp = readl(sport->port.membase + UCR2); > writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2); > + > + /* disable the `Receiver Ready Interrrupt` */ > + temp = readl(sport->port.membase + UCR1); > + writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1); Will this change cause a loss or a processing delay of RX characters pending in the RX FIFO ? It is not clear whether disabling the receiver will clear the RX FIFO. My guess is that the contents of the RX FIFO will remain intact when the receiver is disabled. The RX interrupt has an opportunity to mop up these pending characters in the RX FIFO but disabling the RX interrupt has potential to leave those characters in the RX FIFO. Does it matter ? Thanks Dirk
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index ed6cdf7..6026101 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -440,6 +440,10 @@ static void imx_stop_rx(struct uart_port *port) temp = readl(sport->port.membase + UCR2); writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2); + + /* disable the `Receiver Ready Interrrupt` */ + temp = readl(sport->port.membase + UCR1); + writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1); } /*
This patch disables the receiver ready interrupt for imx_stop_rx. It reduces the interrupt numbers when the uart is going to close or suspend. Signed-off-by: Huang Shijie <b32955@freescale.com> --- drivers/tty/serial/imx.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)