[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-commits] [COMMIT 2d6ee8e] qemu serial: lost tx irqs (affecting Fre
From: |
Anthony Liguori |
Subject: |
[Qemu-commits] [COMMIT 2d6ee8e] qemu serial: lost tx irqs (affecting FreeBSD's newuart(4) driver) |
Date: |
Wed, 16 Sep 2009 19:03:50 -0000 |
From: Juergen Lock <address@hidden>
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 <address@hidden>
Acked-by: Jan Kiszka <address@hidden>
Acked-by: Stefano Stabellini <address@hidden>
Signed-off-by: Aurelien Jarno <address@hidden>
diff --git a/hw/serial.c b/hw/serial.c
index 1f4ce77..a22770f 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -197,12 +197,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)) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-commits] [COMMIT 2d6ee8e] qemu serial: lost tx irqs (affecting FreeBSD's newuart(4) driver),
Anthony Liguori <=