All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Hurley <peter@hurleysoftware.com>
To: Soren Brinkmann <soren.brinkmann@xilinx.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.com>,
	Michal Simek <michal.simek@xilinx.com>,
	linux-serial@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH LINUX v3 08/10] tty: xuartps: Move RX path into helper function
Date: Sat, 5 Dec 2015 12:40:07 -0500	[thread overview]
Message-ID: <56632177.1090605@hurleysoftware.com> (raw)
In-Reply-To: <1448161172-19717-9-git-send-email-soren.brinkmann@xilinx.com>

On 11/21/2015 09:59 PM, Soren Brinkmann wrote:
> Move RX-related IRQ handling into a helper function.
Fixes a problem where every char received after a parity or frame error
in the current isr will also be tagged as a parity or frame error.

Reviewed-by: Peter Hurley <peter@hurleysoftware.com>

NB: the sysrq problem in cdns_uart_isr() with needing to drop the
locks is because cdns_uart_console_write() tries to take the port->lock.
The 8250 driver handles this problem by not trying to take the
port->lock if port->sysrq is non-zero. See serial8250_console_write().


> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> ---
>  drivers/tty/serial/xilinx_uartps.c | 50 +++++++++++++++++++++-----------------
>  1 file changed, 28 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
> index f3ac69387b0a..db9e23eaf300 100644
> --- a/drivers/tty/serial/xilinx_uartps.c
> +++ b/drivers/tty/serial/xilinx_uartps.c
> @@ -172,28 +172,8 @@ struct cdns_uart {
>  #define to_cdns_uart(_nb) container_of(_nb, struct cdns_uart, \
>  		clk_rate_change_nb);
>  
> -/**
> - * cdns_uart_isr - Interrupt handler
> - * @irq: Irq number
> - * @dev_id: Id of the port
> - *
> - * Return: IRQHANDLED
> - */
> -static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
> +static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus)
>  {
> -	struct uart_port *port = (struct uart_port *)dev_id;
> -	unsigned long flags;
> -	unsigned int isrstatus, numbytes;
> -	unsigned int data;
> -	char status = TTY_NORMAL;

See, the previous code never reset the status back to TTY_NORMAL after any other
status.

> -
> -	spin_lock_irqsave(&port->lock, flags);
> -
> -	/* Read the interrupt status register to determine which
> -	 * interrupt(s) is/are active.
> -	 */
> -	isrstatus = readl(port->membase + CDNS_UART_ISR_OFFSET);
> -
>  	/*
>  	 * There is no hardware break detection, so we interpret framing
>  	 * error with all-zeros data as a break sequence. Most of the time,
> @@ -223,6 +203,9 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
>  		/* Receive Timeout Interrupt */
>  		while (!(readl(port->membase + CDNS_UART_SR_OFFSET) &
>  					CDNS_UART_SR_RXEMPTY)) {
> +			u32 data;
> +			char status = TTY_NORMAL;
> +
>  			data = readl(port->membase + CDNS_UART_FIFO_OFFSET);
>  
>  			/* Non-NULL byte after BREAK is garbage (99%) */
> @@ -263,10 +246,33 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
>  			}
>  
>  			uart_insert_char(port, isrstatus, CDNS_UART_IXR_OVERRUN,
> -					data, status);
> +					 data, status);
>  		}
>  		tty_flip_buffer_push(&port->state->port);
>  	}
> +}
> +
> +/**
> + * cdns_uart_isr - Interrupt handler
> + * @irq: Irq number
> + * @dev_id: Id of the port
> + *
> + * Return: IRQHANDLED
> + */
> +static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
> +{
> +	struct uart_port *port = (struct uart_port *)dev_id;
> +	unsigned long flags;
> +	unsigned int isrstatus, numbytes;
> +
> +	spin_lock_irqsave(&port->lock, flags);
> +
> +	/* Read the interrupt status register to determine which
> +	 * interrupt(s) is/are active.
> +	 */
> +	isrstatus = readl(port->membase + CDNS_UART_ISR_OFFSET);
> +
> +	cdns_uart_handle_rx(port, isrstatus);
>  
>  	/* Dispatch an appropriate handler */
>  	if ((isrstatus & CDNS_UART_IXR_TXEMPTY) == CDNS_UART_IXR_TXEMPTY) {
> 

WARNING: multiple messages have this Message-ID (diff)
From: peter@hurleysoftware.com (Peter Hurley)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH LINUX v3 08/10] tty: xuartps: Move RX path into helper function
Date: Sat, 5 Dec 2015 12:40:07 -0500	[thread overview]
Message-ID: <56632177.1090605@hurleysoftware.com> (raw)
In-Reply-To: <1448161172-19717-9-git-send-email-soren.brinkmann@xilinx.com>

On 11/21/2015 09:59 PM, Soren Brinkmann wrote:
> Move RX-related IRQ handling into a helper function.
Fixes a problem where every char received after a parity or frame error
in the current isr will also be tagged as a parity or frame error.

Reviewed-by: Peter Hurley <peter@hurleysoftware.com>

NB: the sysrq problem in cdns_uart_isr() with needing to drop the
locks is because cdns_uart_console_write() tries to take the port->lock.
The 8250 driver handles this problem by not trying to take the
port->lock if port->sysrq is non-zero. See serial8250_console_write().


> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> ---
>  drivers/tty/serial/xilinx_uartps.c | 50 +++++++++++++++++++++-----------------
>  1 file changed, 28 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
> index f3ac69387b0a..db9e23eaf300 100644
> --- a/drivers/tty/serial/xilinx_uartps.c
> +++ b/drivers/tty/serial/xilinx_uartps.c
> @@ -172,28 +172,8 @@ struct cdns_uart {
>  #define to_cdns_uart(_nb) container_of(_nb, struct cdns_uart, \
>  		clk_rate_change_nb);
>  
> -/**
> - * cdns_uart_isr - Interrupt handler
> - * @irq: Irq number
> - * @dev_id: Id of the port
> - *
> - * Return: IRQHANDLED
> - */
> -static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
> +static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus)
>  {
> -	struct uart_port *port = (struct uart_port *)dev_id;
> -	unsigned long flags;
> -	unsigned int isrstatus, numbytes;
> -	unsigned int data;
> -	char status = TTY_NORMAL;

See, the previous code never reset the status back to TTY_NORMAL after any other
status.

> -
> -	spin_lock_irqsave(&port->lock, flags);
> -
> -	/* Read the interrupt status register to determine which
> -	 * interrupt(s) is/are active.
> -	 */
> -	isrstatus = readl(port->membase + CDNS_UART_ISR_OFFSET);
> -
>  	/*
>  	 * There is no hardware break detection, so we interpret framing
>  	 * error with all-zeros data as a break sequence. Most of the time,
> @@ -223,6 +203,9 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
>  		/* Receive Timeout Interrupt */
>  		while (!(readl(port->membase + CDNS_UART_SR_OFFSET) &
>  					CDNS_UART_SR_RXEMPTY)) {
> +			u32 data;
> +			char status = TTY_NORMAL;
> +
>  			data = readl(port->membase + CDNS_UART_FIFO_OFFSET);
>  
>  			/* Non-NULL byte after BREAK is garbage (99%) */
> @@ -263,10 +246,33 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
>  			}
>  
>  			uart_insert_char(port, isrstatus, CDNS_UART_IXR_OVERRUN,
> -					data, status);
> +					 data, status);
>  		}
>  		tty_flip_buffer_push(&port->state->port);
>  	}
> +}
> +
> +/**
> + * cdns_uart_isr - Interrupt handler
> + * @irq: Irq number
> + * @dev_id: Id of the port
> + *
> + * Return: IRQHANDLED
> + */
> +static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
> +{
> +	struct uart_port *port = (struct uart_port *)dev_id;
> +	unsigned long flags;
> +	unsigned int isrstatus, numbytes;
> +
> +	spin_lock_irqsave(&port->lock, flags);
> +
> +	/* Read the interrupt status register to determine which
> +	 * interrupt(s) is/are active.
> +	 */
> +	isrstatus = readl(port->membase + CDNS_UART_ISR_OFFSET);
> +
> +	cdns_uart_handle_rx(port, isrstatus);
>  
>  	/* Dispatch an appropriate handler */
>  	if ((isrstatus & CDNS_UART_IXR_TXEMPTY) == CDNS_UART_IXR_TXEMPTY) {
> 

  reply	other threads:[~2015-12-05 17:40 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-22  2:59 [PATCH LINUX v3 00/10] tty: xuartps: Fix lock ups Soren Brinkmann
2015-11-22  2:59 ` Soren Brinkmann
2015-11-22  2:59 ` Soren Brinkmann
2015-11-22  2:59 ` [PATCH LINUX v3 01/10] tty: xuartps: Beautify read-modify writes Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:04   ` Peter Hurley
2015-12-05 17:04     ` Peter Hurley
2015-12-05 17:23     ` Moritz Fischer
2015-12-05 17:23       ` Moritz Fischer
2015-11-22  2:59 ` [PATCH LINUX v3 02/10] tty: xuartps: Use spinlock to serialize HW access Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:05   ` Peter Hurley
2015-12-05 17:05     ` Peter Hurley
2015-11-22  2:59 ` [PATCH LINUX v3 03/10] tty: xuartps: Don't consider circular buffer when enabling transmitter Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:17   ` Peter Hurley
2015-12-05 17:17     ` Peter Hurley
2015-11-22  2:59 ` [PATCH LINUX v3 04/10] tty: xuartps: Clear interrupt status register in shutdown Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:19   ` Peter Hurley
2015-12-05 17:19     ` Peter Hurley
2015-12-05 17:25     ` Moritz Fischer
2015-12-05 17:25       ` Moritz Fischer
2015-11-22  2:59 ` [PATCH LINUX v3 05/10] tty: xuartps: Improve startup function Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:21   ` Peter Hurley
2015-12-05 17:21     ` Peter Hurley
2015-12-05 21:47     ` Sören Brinkmann
2015-12-05 21:47       ` Sören Brinkmann
2015-12-05 21:47       ` Sören Brinkmann
2015-11-22  2:59 ` [PATCH LINUX v3 06/10] tty: xuartps: Keep lock for whole ISR Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:23   ` Peter Hurley
2015-12-05 17:23     ` Peter Hurley
2015-11-22  2:59 ` [PATCH LINUX v3 07/10] tty: xuartps: Acquire port lock for shutdown Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:23   ` Peter Hurley
2015-12-05 17:23     ` Peter Hurley
2015-11-22  2:59 ` [PATCH LINUX v3 08/10] tty: xuartps: Move RX path into helper function Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:40   ` Peter Hurley [this message]
2015-12-05 17:40     ` Peter Hurley
2015-12-05 21:49     ` Sören Brinkmann
2015-12-05 21:49       ` Sören Brinkmann
2015-12-05 21:49       ` Sören Brinkmann
2015-11-22  2:59 ` [PATCH LINUX v3 09/10] tty: xuartps: Only handle RX IRQs when RX is enabled Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:43   ` Peter Hurley
2015-12-05 17:43     ` Peter Hurley
2015-12-05 22:19     ` Sören Brinkmann
2015-12-05 22:19       ` Sören Brinkmann
2015-12-05 22:19       ` Sören Brinkmann
2015-11-22  2:59 ` [PATCH LINUX v3 10/10] tty: xuartps: Cleanup: Reformat if-else Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-11-22  2:59   ` Soren Brinkmann
2015-12-05 17:49 ` [PATCH LINUX v3 00/10] tty: xuartps: Fix lock ups Peter Hurley
2015-12-05 17:49   ` Peter Hurley
2015-12-05 22:02   ` Sören Brinkmann
2015-12-05 22:02     ` Sören Brinkmann
2015-12-05 22:02     ` Sören Brinkmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56632177.1090605@hurleysoftware.com \
    --to=peter@hurleysoftware.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jslaby@suse.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=michal.simek@xilinx.com \
    --cc=soren.brinkmann@xilinx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.