All of lore.kernel.org
 help / color / mirror / Atom feed
From: Awais Masood <awais.masood@vadion.com>
To: xen-devel@lists.xenproject.org
Cc: Stefano Stabellini <sstabellini@kernel.org>,
	Wei Liu <wei.liu2@citrix.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Awais Masood <awais.masood@vadion.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	Jan Beulich <jbeulich@suse.com>,
	xen-devel@lists.xen.org
Subject: [PATCH v2 2/2] xen/ns16550: Fix ISR lockup on Designware 8250 (H5)
Date: Tue, 26 Sep 2017 14:37:14 +0500	[thread overview]
Message-ID: <1506418634-20366-3-git-send-email-awais.masood@vadion.com> (raw)
In-Reply-To: <1506418634-20366-1-git-send-email-awais.masood@vadion.com>

On Allwinner H5 (Orange Pi PC2) serial driver goes into an
infinite loop when interrupts are enabled. The reason is a
residual "busy detect" interrupt. Since the condition
UART_IIR_NOINT will not be true unless this interrupt is
cleared, the interrupt handler will remain locked up in this
while loop.

A hw quirk fix was previously added for designware uart under
commit:
50417cd978aa54930d065ac1f139f935d14af76d

It checks for a busy condition during setup and clears the
condition by reading UART_USR register.

On Allwinner H5 (and H3), the "busy detect" condition occurs
later because an LCR write is performed during setup 'after'
this clear and if uart is busy, the "busy detect" condition
will trigger again and cause the ISR lockup.

To solve this problem, the same UART_USR read operation is
added within the interrupt handler to clear the condition.

Linux dw 8250 driver also handles this condition within
interrupt handler
http://elixir.free-electrons.com/linux/latest/source/drivers/tty/serial/8250/8250_dw.c#L233

Tested on Orange Pi PC2 (H5). Earlier this issue was seen on H3
as well and the same fix should help.

Signed-off-by: Awais Masood <awais.masood@vadion.com>

---
Changes since v1:
 * Common quirk fix code moved to a helper function
 * Patch description improved with earlier commit link
---
 xen/drivers/char/ns16550.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
index 6ab5ec3..44ed4ec 100644
--- a/xen/drivers/char/ns16550.c
+++ b/xen/drivers/char/ns16550.c
@@ -505,6 +505,19 @@ static int ns16550_ioport_invalid(struct ns16550 *uart)
     return ns_read_reg(uart, UART_IER) == 0xff;
 }
 
+static void ns16550_handle_dw_usr_busy_quirk(struct ns16550 *uart)
+{
+    if ( uart->dw_usr_bsy &&
+         (ns_read_reg(uart, UART_IIR) & UART_IIR_BSY) == UART_IIR_BSY )
+    {
+        /* DesignWare 8250 detects if LCR is written while the UART is
+         * busy and raises a "busy detect" interrupt. Read the UART
+         * Status Register to clear this state.
+         */
+        ns_read_reg(uart, UART_USR);
+    }
+}
+
 static void ns16550_interrupt(
     int irq, void *dev_id, struct cpu_user_regs *regs)
 {
@@ -521,6 +534,9 @@ static void ns16550_interrupt(
             serial_tx_interrupt(port, regs);
         if ( lsr & UART_LSR_DR )
             serial_rx_interrupt(port, regs);
+
+        /* Handle the DesignWare 8250 'busy-detect' quirk. */
+        ns16550_handle_dw_usr_busy_quirk(uart);
     }
 }
 
@@ -623,15 +639,8 @@ static void ns16550_setup_preirq(struct ns16550 *uart)
     /* No interrupts. */
     ns_write_reg(uart, UART_IER, 0);
 
-    if ( uart->dw_usr_bsy &&
-         (ns_read_reg(uart, UART_IIR) & UART_IIR_BSY) == UART_IIR_BSY )
-    {
-        /* DesignWare 8250 detects if LCR is written while the UART is
-         * busy and raises a "busy detect" interrupt. Read the UART
-         * Status Register to clear this state.
-         */
-        ns_read_reg(uart, UART_USR);
-    }
+    /* Handle the DesignWare 8250 'busy-detect' quirk. */
+    ns16550_handle_dw_usr_busy_quirk(uart);
 
     /* Line control and baud-rate generator. */
     ns_write_reg(uart, UART_LCR, lcr | UART_LCR_DLAB);
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2017-09-26  9:37 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-19 13:38 [PATCH 0/2] xen/arm64/ns16550: Support for Allwinner H5 SoC Awais Masood
2017-09-19 13:38 ` [PATCH 1/2] xen/arm64: Add Support for Allwinner H5 (sun50i) Awais Masood
2017-09-19 13:50   ` Jan Beulich
2017-09-19 13:38 ` [PATCH 2/2] xen/ns16550: Fix ISR lockup on Designware 8250 (H5) Awais Masood
2017-09-19 13:49   ` Jan Beulich
2017-09-26  9:37 ` [PATCH v2 0/2] xen/arm64/ns16550: Support for Allwinner H5 SoC Awais Masood
2017-09-26  9:37   ` [PATCH v2 1/2] xen/arm64: Add Support for Allwinner H5 (sun50i) Awais Masood
2017-09-28 20:03     ` Julien Grall
2017-09-28 22:49       ` Andre Przywara
2017-09-29 16:35         ` Andre Przywara
2017-10-04  9:16           ` Awais Masood
2017-10-04  9:26             ` Andre Przywara
2017-10-04  9:39               ` Awais Masood
2017-10-04 10:03                 ` Andre Przywara
2017-10-03 11:32         ` Julien Grall
2017-09-26  9:37   ` Awais Masood [this message]
2017-09-26 11:58     ` [PATCH v2 2/2] xen/ns16550: Fix ISR lockup on Designware 8250 (H5) Jan Beulich
2017-10-04 11:44   ` [PATCH v3] xen/ns16550: Fix ISR lockup on Allwinner uart Awais Masood
2017-10-06 14:50     ` Jan Beulich
2017-10-10 23:59     ` Stefano Stabellini

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=1506418634-20366-3-git-send-email-awais.masood@vadion.com \
    --to=awais.masood@vadion.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /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.