mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Alan Cox <alan@lxorguk.ukuu.org.uk>
To: torvalds@linux-foundation.org, linux-kernel@vger.kernel.org
Subject: [PATCH 8/9] atmel_serial: fix hang in set_termios when crtscts is enabled
Date: Tue, 16 Jun 2009 17:02:03 +0100	[thread overview]
Message-ID: <20090616160157.10041.81193.stgit@t61.ukuu.org.uk> (raw)
In-Reply-To: <20090616155552.10041.63479.stgit@t61.ukuu.org.uk>

From: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>

After enabling hardware flow control, any subsequent termios call may hang
waiting for the transmitter to drain.  This appears to be caused by a
busy-loop in set_termios() waiting for the transmitter to become empty,
which may take a very long time (or hang indefinitely) if the device at
the other end is blocking us.

A quick look through the tty and serial_core code indicates that any
necessary flushing (which is optional) has already been done at this
point, so there's no need for the driver to flush the transmitter on its
own.

Fix it by removing the busy-loop altogether.

Tested-by: Eirik Aanonsen <eaa@wprmedical.com>
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---

 drivers/serial/atmel_serial.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)


diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
index b3497d7..338b15c 100644
--- a/drivers/serial/atmel_serial.c
+++ b/drivers/serial/atmel_serial.c
@@ -1104,11 +1104,13 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
 	/* update the per-port timeout */
 	uart_update_timeout(port, termios->c_cflag, baud);
 
-	/* save/disable interrupts and drain transmitter */
+	/*
+	 * save/disable interrupts. The tty layer will ensure that the
+	 * transmitter is empty if requested by the caller, so there's
+	 * no need to wait for it here.
+	 */
 	imr = UART_GET_IMR(port);
 	UART_PUT_IDR(port, -1);
-	while (!(UART_GET_CSR(port) & ATMEL_US_TXEMPTY))
-		cpu_relax();
 
 	/* disable receiver and transmitter */
 	UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);


  parent reply	other threads:[~2009-06-16 15:04 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-16 15:59 [PATCH 0/9] Series short description Alan Cox
2009-06-16 16:00 ` [PATCH 1/9] tty: Fix leaks introduced by the shift to separate ldisc objects Alan Cox
2009-06-16 16:00 ` [PATCH 2/9] ldisc: Make sure the ldisc isn't active when we close it Alan Cox
2009-06-16 16:00 ` [PATCH 3/9] ldisc: debug aids Alan Cox
2009-06-16 16:01 ` [PATCH 4/9] tty: fix unused warning when TCGETX is not defined Alan Cox
2009-06-16 16:01 ` [PATCH 5/9] pty: Narrow the race on ldisc locking Alan Cox
2009-06-16 16:01 ` [PATCH 6/9] tty: fix sanity check Alan Cox
2009-06-16 16:01 ` [PATCH 7/9] MAINTAINERS: update 8250 section, give Alan Cox a name Alan Cox
2009-06-16 16:02 ` Alan Cox [this message]
2009-06-16 16:02 ` [PATCH 9/9] imx: Check for NULL pointer deref before calling tty_encode_baud_rate Alan Cox

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=20090616160157.10041.81193.stgit@t61.ukuu.org.uk \
    --to=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.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

all inboxes | Powered by JetHome®