From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44381) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WOWkr-0003HN-4b for qemu-devel@nongnu.org; Fri, 14 Mar 2014 14:22:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WOWkl-0004k3-KN for qemu-devel@nongnu.org; Fri, 14 Mar 2014 14:22:49 -0400 Received: from mail-oa0-x232.google.com ([2607:f8b0:4003:c02::232]:39457) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WOWkl-0004jy-Ek for qemu-devel@nongnu.org; Fri, 14 Mar 2014 14:22:43 -0400 Received: by mail-oa0-f50.google.com with SMTP id i7so3036116oag.9 for ; Fri, 14 Mar 2014 11:22:43 -0700 (PDT) From: Rob Herring Date: Fri, 14 Mar 2014 13:22:28 -0500 Message-Id: <1394821351-21477-2-git-send-email-robherring2@gmail.com> In-Reply-To: <1394821351-21477-1-git-send-email-robherring2@gmail.com> References: <1394821351-21477-1-git-send-email-robherring2@gmail.com> Subject: [Qemu-devel] [PATCH v2 1/4] pl011: reset the fifo when enabled or disabled List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Peter Maydell Cc: Rob Herring From: Rob Herring 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 tx fifo in the TRM (section 3.3.8). The behavior in this case for the rx fifo is undefined in the TRM, but having fifo contents to be maintained during configuration changes is not likely expected behavior. Reseting the fifo state when the fifo size is changed is the simplest solution. Signed-off-by: Rob Herring --- hw/char/pl011.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index a8ae6f4..f0c3fa3 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -162,6 +162,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; -- 1.8.3.2