From: Dick Hollenbeck <dick@softplc.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH 1/1] 8250_core.c
Date: Wed, 21 Jan 2015 23:56:34 -0600 [thread overview]
Message-ID: <54C09112.4010306@softplc.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 114 bytes --]
This was generated from 3.14 kernel, but since its so small it will likely apply to newer
kernels without issue.
[-- Attachment #2: 8250_core.patch --]
[-- Type: text/x-patch, Size: 1863 bytes --]
A lesser travelled code path specifically crafted for "tx interrupt buggy"
UARTs seems to be testing the wrong bit for whether or not to prime the
transmit pump. The result is that the tx interrupt never occurs on one chip
I am using that falls into the UART_BUG_TXEN category as I understand it.
The 16550 data sheet even names the interrupt "THRE" and not transmit
shift register empty. The interrupt is fired when the holding register, or its
logical equivalent, the fifo, goes empty; not when the shift register goes
empty. This is a code bug in code hoping to fix a bug in hardware.
The reason this is so late coming to the surface is that lately the 8250
interrupt handler polls for all kinds of special status beyond the intention
of the hardware's purpose specific interrupt. Therefore so long as you
were in the interrupt handler (even if for purposes of servicing a recv
interrupt, you could recover from the broken transmit chain. But if you are
only transmitting, not receiving, then this bug can manifest itself.
This is the fix. It is harmless because so long as the fifo is empty, it
should be legal to re-fill it fully anyways.
Signed-off-by: Dick Hollenbeck <dick@softplc.com>
=== modified file 'drivers/tty/serial/8250/8250_core.c'
--- old/drivers/tty/serial/8250/8250_core.c 2014-07-14 18:39:13 +0000
+++ new/drivers/tty/serial/8250/8250_core.c 2015-01-22 05:28:33 +0000
@@ -1302,11 +1302,15 @@ static void serial8250_start_tx(struct u
up->ier |= UART_IER_THRI;
serial_port_out(port, UART_IER, up->ier);
+ /*
+ * If setting UART_IER_THRI does not cause an
+ * immediate tx interrupt
+ */
if (up->bugs & UART_BUG_TXEN) {
unsigned char lsr;
lsr = serial_in(up, UART_LSR);
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
- if (lsr & UART_LSR_TEMT)
+ if (lsr & UART_LSR_THRE)
serial8250_tx_chars(up);
}
}
next reply other threads:[~2015-01-22 6:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-22 5:56 Dick Hollenbeck [this message]
2015-01-22 8:36 ` [PATCH 1/1] 8250_core.c Frans Klaver
2015-01-22 13:02 ` Peter Hurley
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=54C09112.4010306@softplc.com \
--to=dick@softplc.com \
--cc=linux-kernel@vger.kernel.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