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>
This commit is contained in:
parent
e5934d333f
commit
2d6ee8e7e1
10
hw/serial.c
10
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)) {
|
||||
|
|
Loading…
Reference in a new issue