All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Will Newton <will.newton@gmail.com>
Cc: alex.williamson@hp.com, linux-serial@vger.kernel.org,
	linux-kernel@vger.kernel.org, thomas@koeller.dyndns.org,
	Alan Cox <alan@lxorguk.ukuu.org.uk>
Subject: Re: [PATCH] serial 8250: tighten test for using backup timer
Date: Mon, 11 Aug 2008 14:32:08 -0700	[thread overview]
Message-ID: <20080811143208.8cc89478.akpm@linux-foundation.org> (raw)
In-Reply-To: <87a5b0800808060353v505c4957wbd26aaa9a2624786@mail.gmail.com>

On Wed, 6 Aug 2008 11:53:13 +0100
"Will Newton" <will.newton@gmail.com> wrote:

> >From 36ac82a231498247ada098d31e8d12e735eb34f2 Mon Sep 17 00:00:00 2001
> From: Will Newton <will.newton@gmail.com>
> Date: Wed, 6 Aug 2008 11:48:29 +0100
> Subject: [PATCH] 8250: Improve workaround for UARTs that don't
> re-assert THRE correctly.
> 
> Recent changes to tighten the check for UARTs that don't correctly
> re-assert THRE caused problems when such a UART was opened for the second
> time - the bug could only successfully be detected at first initialization.
> This patch stores the information about the bug in the bugs field of the
> port structure when the port is first started up so subsequent opens can
> check this bit even if the test for the bug fails.
> 
> Signed-off-by: Will Newton <will.newton@gmail.com>
> Acked-by: Alex Williamson <alex.williamson@hp.com>

What are the "recent changes" to which you refer?  I had a quick look
and didn't spot any THRE-related changes this year?


> ---
>  drivers/serial/8250.c |   16 ++++++++++++----
>  drivers/serial/8250.h |    1 +
>  2 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> index 342e12f..9ccc563 100644
> --- a/drivers/serial/8250.c
> +++ b/drivers/serial/8250.c
> @@ -1908,15 +1908,23 @@ static int serial8250_startup(struct uart_port *port)
>  		 * kick the UART on a regular basis.
>  		 */
>  		if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
> +			up->bugs |= UART_BUG_THRE;
>  			pr_debug("ttyS%d - using backup timer\n", port->line);
> -			up->timer.function = serial8250_backup_timeout;
> -			up->timer.data = (unsigned long)up;
> -			mod_timer(&up->timer, jiffies +
> -				poll_timeout(up->port.timeout) + HZ / 5);
>  		}
>  	}
> 
>  	/*
> +	 * The above check will only give an accurate result the first time
> +	 * the port is opened so this value needs to be preserved.
> +	 */
> +	if (up->bugs & UART_BUG_THRE) {
> +		up->timer.function = serial8250_backup_timeout;
> +		up->timer.data = (unsigned long)up;
> +		mod_timer(&up->timer, jiffies +
> +			  poll_timeout(up->port.timeout) + HZ / 5);
> +	}
> +
> +	/*
>  	 * If the "interrupt" for this port doesn't correspond with any
>  	 * hardware interrupt, we use a timer-based system.  The original
>  	 * driver used to do this with IRQ0.
> diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h
> index 78c0016..5202603 100644
> --- a/drivers/serial/8250.h
> +++ b/drivers/serial/8250.h
> @@ -47,6 +47,7 @@ struct serial8250_config {
>  #define UART_BUG_QUOT	(1 << 0)	/* UART has buggy quot LSB */
>  #define UART_BUG_TXEN	(1 << 1)	/* UART has buggy TX IIR status */
>  #define UART_BUG_NOMSR	(1 << 2)	/* UART has buggy MSR status bits (Au1x00) */
> +#define UART_BUG_THRE	(1 << 3)	/* UART has buggy THRE reassertion */
> 
>  #define PROBE_RSA	(1 << 0)
>  #define PROBE_ANY	(~0)

Also, how serious is the problem which is being fixed here?  It
_sounds_ like it's of the "fatal for people who have that hardware"
variety, in which case we should get this into 2.6.27 and probably
2.6.26.x.  Not sure about 2.5.26.x though - the patch doesn't apply
there, but I didn't check whether this is due to functional changes.


Also2, we should officially use setup_timer(), like this:

--- a/drivers/serial/8250.c~serial-8250-tighten-test-for-using-backup-timer-fix
+++ a/drivers/serial/8250.c
@@ -1964,8 +1964,8 @@ static int serial8250_startup(struct uar
 	 * the port is opened so this value needs to be preserved.
 	 */
 	if (up->bugs & UART_BUG_THRE) {
-		up->timer.function = serial8250_backup_timeout;
-		up->timer.data = (unsigned long)up;
+		setup_timer(&up->timer, serial8250_backup_timeout,
+				(unsigned long)up);
 		mod_timer(&up->timer, jiffies +
 			  poll_timeout(up->port.timeout) + HZ / 5);
 	}

but that is a functional change - setup_timer() runs init_timer(),
whereas the code you have there does not.

We _do_ have an init_timer(&up->timer) all the way over in
serial8250_isa_init_ports().  It's all a bit weird.  Could you please
double-check that we're being sensible about the initialisation of this
timer?

Thanks.

  reply	other threads:[~2008-08-11 21:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-19 16:50 [PATCH] serial 8250: tighten test for using backup timer Alex Williamson
2008-08-05 11:44 ` Will Newton
2008-08-05 20:06   ` Alex Williamson
2008-08-06 10:53     ` Will Newton
2008-08-11 21:32       ` Andrew Morton [this message]
2008-08-12  8:32         ` Will Newton
  -- strict thread matches above, loose matches on Subject: below --
2008-08-26 17:45 David Brownell
2008-08-26 17:58 ` Andrew Morton
2008-08-26 18:10   ` Will Newton
2008-09-01 13:36   ` Will Newton
2008-09-01 17:56     ` Andrew Morton

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=20080811143208.8cc89478.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=alex.williamson@hp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=thomas@koeller.dyndns.org \
    --cc=will.newton@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.