summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorJuergen Lock <nox@jelal.kn-bremen.de>2009-09-12 18:52:22 +0200
committerAurelien Jarno <aurelien@aurel32.net>2009-09-24 15:58:56 +0200
commit011b2955110a5356d91d3377a10d23635c78517a (patch)
tree9108a14e9f01a8d9fe7b143516d88103638056c3 /hw
parent3bf676520449eb72ab218c51695db49f7d36da74 (diff)
downloadqemu-011b2955110a5356d91d3377a10d23635c78517a.tar.gz
qemu serial: lost tx irqs (affecting FreeBSD's new uart(4) driver)
Well one problem seems to be the rx condition, ... if ((s->ier & UART_IER_RDI) && (s->lsr & UART_LSR_DR)) is not enough to trigger an irq, yet still causes the following conditions not to be checked anymore at all. Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de> Acked-by: Jan Kiszka <jan.kiszka@web.de> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'hw')
-rw-r--r--hw/serial.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/hw/serial.c b/hw/serial.c
index d70504bb06..498f4a0a16 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -195,12 +195,10 @@ static void serial_update_irq(SerialState *s)
* this is not in the specification but is observed on existing
* hardware. */
tmp_iir = UART_IIR_CTI;
- } else if ((s->ier & UART_IER_RDI) && (s->lsr & UART_LSR_DR)) {
- if (!(s->fcr & UART_FCR_FE)) {
- tmp_iir = UART_IIR_RDI;
- } else if (s->recv_fifo.count >= s->recv_fifo.itl) {
- tmp_iir = UART_IIR_RDI;
- }
+ } else if ((s->ier & UART_IER_RDI) && (s->lsr & UART_LSR_DR) &&
+ (!(s->fcr & UART_FCR_FE) ||
+ s->recv_fifo.count >= s->recv_fifo.itl)) {
+ tmp_iir = UART_IIR_RDI;
} else if ((s->ier & UART_IER_THRI) && s->thr_ipending) {
tmp_iir = UART_IIR_THRI;
} else if ((s->ier & UART_IER_MSI) && (s->msr & UART_MSR_ANY_DELTA)) {