qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] pl011: reset the fifo when enabled or disabled
@ 2014-02-28  0:57 Rob Herring
  2014-03-02 20:20 ` Peter Maydell
  0 siblings, 1 reply; 3+ messages in thread
From: Rob Herring @ 2014-02-28  0:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Christoffer Dall, Rob Herring

From: Rob Herring <rob.herring@linaro.org>

Intermittent issues have been seen where no serial input occurs. It
appears the pl011 gets in a state where the rx interrupt never fires
because the rx interrupt only asserts when crossing the fifo trigger
level. The fifo state appears to get out of sync when the pl011 is
re-configured. This combined with the rx timeout interrupt not being
modeled results in no more rx interrupts.

Disabling the fifo is the recommended way to clear the fifo in the TRM,
but none of the fifo state was getting reset when the fifo was disabled.
Ensure all the fifo state is reset when the fifo is enabled or disabled.

When setting the fifo trigger level, the rx interrupt needs to be asserted
if the current fifo level matches.

Also, fix incorrect logic to set the RXFF flag.

Signed-off-by: Rob Herring <rob.herring@linaro.org>
---
 hw/char/pl011.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index 8ced7cd..9260a3d 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -129,6 +129,9 @@ static void pl011_set_read_trigger(PL011State *s)
     else
 #endif
         s->read_trigger = 1;
+
+    if (s->read_count == s->read_trigger)
+        s->int_level |= PL011_INT_RX;
 }
 
 static void pl011_write(void *opaque, hwaddr offset,
@@ -162,6 +165,10 @@ static void pl011_write(void *opaque, hwaddr offset,
         s->fbrd = value;
         break;
     case 11: /* UARTLCR_H */
+        if (!((s->lcr ^ value) & 0x10)) {
+            s->read_count = 0;
+            s->read_pos = 0;
+        }
         s->lcr = value;
         pl011_set_read_trigger(s);
         break;
@@ -214,7 +221,7 @@ static void pl011_put_fifo(void *opaque, uint32_t value)
     s->read_fifo[slot] = value;
     s->read_count++;
     s->flags &= ~PL011_FLAG_RXFE;
-    if (s->cr & 0x10 || s->read_count == 16) {
+    if (!(s->lcr & 0x10) || s->read_count == 16) {
         s->flags |= PL011_FLAG_RXFF;
     }
     if (s->read_count == s->read_trigger) {
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-03-04 22:39 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-28  0:57 [Qemu-devel] [PATCH] pl011: reset the fifo when enabled or disabled Rob Herring
2014-03-02 20:20 ` Peter Maydell
2014-03-04 22:39   ` Rob Herring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).