linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Russell King <rmk+lkml@arm.linux.org.uk>
To: Corey Minyard <minyard@acm.org>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
	linux-serial@vger.kernel.org
Subject: Re: Serial 8250: clear the lsr_break_flag at open
Date: Thu, 3 May 2007 13:08:15 +0100	[thread overview]
Message-ID: <20070503120815.GA21024@flint.arm.linux.org.uk> (raw)
In-Reply-To: <46373F42.4080305@acm.org>

On Tue, May 01, 2007 at 08:23:14AM -0500, Corey Minyard wrote:
> Russell King wrote:
> >On Mon, Apr 30, 2007 at 05:08:59PM -0500, Corey Minyard wrote:
> >  
> >>I'm having a hard time understanding why the lsr_break_flag
> >>is necessary.
> >>    
> >
> >Merely reading the LSR clears status bits.  We read the LSR repeatedly
> >so that we can monitor the transmit FIFO when outputting serial console
> >messages.
> >
> >This means that if you have a busy serial console, and you want to send
> >it a sysrq request, there's a chance that the break flag in the LSR will
> >be cleared by the transmit FIFO status polling code thereby being lost.
> >
> >So, we need to remember that status, and we do this via the lsr_break_flag.
> >  
> I should have said a little more.  I couldn't find anywhere in any docs
> for this that said it was a destructive read.

The TI 16550A data sheet says:

* Bit 1: This bit is the overrun error (OE) indicator. ... The OE indicator
  is cleared every time the CPU reads the contents of the LSR.

* Bit 2.: This bit is the parity error (PE) indicator. ... The PE bit is
  cleared every time the CPU reads the contents of the LSR.

* Bit 3: This bit is the framing error (FE) indicator. ... The FE bit is
  cleared every time the CPU reads the contents of the LSR.

* Bit 4: This bit is the break interrupt (BI) indicator. ... The BI bit is
  cleared every time the CPU reads the contents of the LSR.

> So two things:
> 
> There are other bits in this register that also appear to be destroyed on
> read: framing, parity, and overrun.  Should those be saved, too?

Yes.

> There are several places where the LSR is read and nothing is done
> for this, in serial8250_start_tx, serial8250_backup_timeout, and
> serial8250_tx_empty.  It seems like these would need to be handled,
> too.

The backup code is something I never properly reviewed, so no comments
there.  The tx_empty code I assumed would be a relatively rare event,
except when closing the port (at which point you don't particularly care
about errors anyway, not even the break flag since chances are you'll
miss the following character.)

Given that people might want to poll it for various reasons, I guess
saving the status away should be done.  However, there's a slight issue
with working out which character the error is associated with.  Careful
locking may be the answer to that though.

As for start_tx, yes, though slightly harder to check.  Maybe the code
should be modified to reduce the number of potential LSR reads by reading
the IIR first, and only if that shows no interrupt pending should the LSR
be read (and the error flags remembered.)

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

  reply	other threads:[~2007-05-03 12:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-30 22:08 Serial 8250: clear the lsr_break_flag at open Corey Minyard
2007-05-01  9:29 ` Russell King
2007-05-01 13:23   ` Corey Minyard
2007-05-03 12:08     ` Russell King [this message]
2007-05-04  3:43       ` Corey Minyard

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=20070503120815.GA21024@flint.arm.linux.org.uk \
    --to=rmk+lkml@arm.linux.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=minyard@acm.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).