From: Anthony Liguori <anthony@codemonkey.ws>
To: gibbs@FreeBSD.org
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Fix lost serial TX interrupts. Report receive overruns.
Date: Wed, 10 Feb 2010 11:58:45 -0600 [thread overview]
Message-ID: <4B72F3D5.4040504@codemonkey.ws> (raw)
In-Reply-To: <4B621A1B.6090309@FreeBSD.org>
On 01/28/2010 05:13 PM, Justin T. Gibbs wrote:
> This patch compliments the patch submitted by Jergen Lock and further
> improves the performance of QEMU's serial emulation with FreeBSD's
> uart(9) driver.
>
> o Implement receive overrun status. The FreeBSD uart driver
> relies on this status in it's probe routine to determine the size
> of the FIFO supported.
> o As per the 16550 spec, do not overwrite the RX FIFO on an RX overrun.
> o Do not allow TX or RX FIFO overruns to increment the data valid count
> beyond the size of the FIFO.
> o For reads of the IIR register, only clear the "TX holding register
> emtpy interrupt" if the read reports this interrupt. This is required
> by the specification and avoids losing TX interrupts when other,
> higher
> priority interrupts (usually RX) are reported first.
>
> Signed-off-by: Justin T. Gibbs <gibbs@FreeBSD.org>
This patch is malformed. Please export the patch from a git tree via
git-format-patch.
Regards,
Anthony Liguori
>
> --- serial.c.orig Thu Jan 14 15:18:00 2010
> +++ serial.c Thu Jan 28 15:36:04 2010
> @@ -169,11 +169,19 @@
> {
> SerialFIFO *f = (fifo) ? &s->recv_fifo : &s->xmit_fifo;
>
> - f->data[f->head++] = chr;
> + /* Receive overruns do not overwrite FIFO contents. */
> + if (fifo == XMIT_FIFO || f->count < UART_FIFO_LENGTH) {
>
> - if (f->head == UART_FIFO_LENGTH)
> - f->head = 0;
> - f->count++;
> + f->data[f->head++] = chr;
> +
> + if (f->head == UART_FIFO_LENGTH)
> + f->head = 0;
> + }
> +
> + if (f->count < UART_FIFO_LENGTH)
> + f->count++;
> + else if (fifo == RECV_FIFO)
> + s->lsr |= UART_LSR_OE;
>
> return 1;
> }
> @@ -533,8 +541,10 @@
> break;
> case 2:
> ret = s->iir;
> + if (ret & UART_IIR_THRI) {
> s->thr_ipending = 0;
> - serial_update_irq(s);
> + serial_update_irq(s);
> + }
> break;
> case 3:
> ret = s->lcr;
> @@ -544,9 +554,9 @@
> break;
> case 5:
> ret = s->lsr;
> - /* Clear break interrupt */
> - if (s->lsr & UART_LSR_BI) {
> - s->lsr &= ~UART_LSR_BI;
> + /* Clear break and overrun interrupts */
> + if (s->lsr & (UART_LSR_BI|UART_LSR_OE)) {
> + s->lsr &= ~(UART_LSR_BI|UART_LSR_OE);
> serial_update_irq(s);
> }
> break;
> @@ -629,6 +639,8 @@
> /* call the timeout receive callback in 4 char transmit time */
> qemu_mod_timer(s->fifo_timeout_timer, qemu_get_clock
> (vm_clock) + s->char_transmit_time * 4);
> } else {
> + if (s->lsr & UART_LSR_DR)
> + s->lsr |= UART_LSR_OE;
> s->rbr = buf[0];
> s->lsr |= UART_LSR_DR;
> }
>
>
>
>
next prev parent reply other threads:[~2010-02-10 17:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-28 23:13 [Qemu-devel] [PATCH] Fix lost serial TX interrupts. Report receive overruns Justin T. Gibbs
2010-02-10 17:58 ` Anthony Liguori [this message]
2010-02-10 22:37 ` [Qemu-devel] " Justin T. Gibbs
2010-02-22 22:20 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B72F3D5.4040504@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=gibbs@FreeBSD.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).