|
|
9ae3a8 |
From d6acc0368578932ee6a2949054a6f640a5b6fa09 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
From: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
Date: Thu, 18 May 2017 09:21:26 +0200
|
|
|
9ae3a8 |
Subject: [PATCH 13/18] serial: update LSR on enabling/disabling FIFOs
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
Message-id: <20170518092131.16571-14-famz@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 75306
|
|
|
9ae3a8 |
O-Subject: [RHEL-7.4 qemu-kvm PATCH v3 13/18] serial: update LSR on enabling/disabling FIFOs
|
|
|
9ae3a8 |
Bugzilla: 1451470
|
|
|
9ae3a8 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
When the transmit FIFO is emptied or enabled, the transmitter
|
|
|
9ae3a8 |
hold register is empty. When it is disabled, it is also emptied and
|
|
|
9ae3a8 |
in addition the previous contents of the transmitter hold register
|
|
|
9ae3a8 |
are discarded. In either case, the THRE bit in LSR must be set and
|
|
|
9ae3a8 |
THRI raised.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
When the receive FIFO is emptied or enabled, the data ready and break
|
|
|
9ae3a8 |
bits must be cleared in LSR. Likewise when the receive FIFO is disabled.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit 023c3a9707d0d9259a1e858cdf7804dd10973fca)
|
|
|
9ae3a8 |
Signed-off-by: Fam Zheng <famz@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Conflicts:
|
|
|
9ae3a8 |
hw/char/serial.c
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Contextual conflict because upstream uses new timer API timer_del while
|
|
|
9ae3a8 |
downstream still uses qemu_del_timer.
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
hw/char/serial.c | 3 +++
|
|
|
9ae3a8 |
1 file changed, 3 insertions(+)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/hw/char/serial.c b/hw/char/serial.c
|
|
|
9ae3a8 |
index c2be4bd..e0d29a8 100644
|
|
|
9ae3a8 |
--- a/hw/char/serial.c
|
|
|
9ae3a8 |
+++ b/hw/char/serial.c
|
|
|
9ae3a8 |
@@ -351,12 +351,15 @@ static void serial_ioport_write(void *opaque, hwaddr addr, uint64_t val,
|
|
|
9ae3a8 |
/* FIFO clear */
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
if (val & UART_FCR_RFR) {
|
|
|
9ae3a8 |
+ s->lsr &= ~(UART_LSR_DR | UART_LSR_BI);
|
|
|
9ae3a8 |
qemu_del_timer(s->fifo_timeout_timer);
|
|
|
9ae3a8 |
s->timeout_ipending=0;
|
|
|
9ae3a8 |
fifo8_reset(&s->recv_fifo);
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
if (val & UART_FCR_XFR) {
|
|
|
9ae3a8 |
+ s->lsr |= UART_LSR_THRE;
|
|
|
9ae3a8 |
+ s->thr_ipending = 1;
|
|
|
9ae3a8 |
fifo8_reset(&s->xmit_fifo);
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.8.3.1
|
|
|
9ae3a8 |
|