public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Bryan Wu <bryan.wu@analog.com>
To: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org
Cc: Mike Frysinger <michael.frysinger@analog.com>,
	Bryan Wu <bryan.wu@analog.com>
Subject: [PATCH 31/32] Blackfin serial driver: implement support for ignoring parity/break errors
Date: Mon, 21 May 2007 18:09:39 +0800	[thread overview]
Message-ID: <11797421881610-git-send-email-bryan.wu@analog.com> (raw)
In-Reply-To: <1179742180228-git-send-email-bryan.wu@analog.com>

From: Mike Frysinger <michael.frysinger@analog.com>

properly setting up and respecting the read_status_mask / ignore_status_mask fields of the serial core

Signed-off-by: Mike Frysinger <michael.frysinger@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
---
 drivers/serial/bfin_5xx.c |   97 ++++++++++++++++++++++++++++-----------------
 1 files changed, 61 insertions(+), 36 deletions(-)

diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c
index a8271d9..787dc71 100644
--- a/drivers/serial/bfin_5xx.c
+++ b/drivers/serial/bfin_5xx.c
@@ -6,8 +6,6 @@
  * Created:
  * Description:  Driver for blackfin 5xx serial ports
  *
- * Rev:          $Id: bfin_5xx.c,v 1.19 2006/09/24 02:33:53 aubrey Exp $
- *
  * Modified:
  *               Copyright 2006 Analog Devices Inc.
  *
@@ -152,7 +150,7 @@ static void local_put_char(struct bfin_serial_port *uart, char ch)
 
 static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
 {
-	struct tty_struct *tty = uart->port.info?uart->port.info->tty:0;
+	struct tty_struct *tty = uart->port.info->tty;
 	unsigned int status, ch, flg;
 #ifdef BF533_FAMILY
 	static int in_break = 0;
@@ -173,8 +171,10 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
 		if (ch != 0) {
 			in_break = 0;
 			ch = UART_GET_CHAR(uart);
-		}
-		return;
+			if (bfin_revid() < 5)
+				return;
+		} else
+			return;
 	}
 #endif
 
@@ -185,27 +185,32 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
 		uart->port.icount.brk++;
 		if (uart_handle_break(&uart->port))
 			goto ignore_char;
-		flg = TTY_BREAK;
-	} else if (status & PE) {
-		flg = TTY_PARITY;
+	}
+	if (status & PE)
 		uart->port.icount.parity++;
-	} else if (status & OE) {
-		flg = TTY_OVERRUN;
+	if (status & OE)
 		uart->port.icount.overrun++;
-	} else if (status & FE) {
-		flg = TTY_FRAME;
+	if (status & FE)
 		uart->port.icount.frame++;
-	} else
+
+	status &= uart->port.read_status_mask;
+
+	if (status & BI)
+		flg = TTY_BREAK;
+	else if (status & PE)
+		flg = TTY_PARITY;
+	else if (status & FE)
+		flg = TTY_FRAME;
+	else
 		flg = TTY_NORMAL;
 
 	if (uart_handle_sysrq_char(&uart->port, ch))
 		goto ignore_char;
-	if (tty)
-		uart_insert_char(&uart->port, status, 2, ch, flg);
 
-ignore_char:
-	if (tty)
-		tty_flip_buffer_push(tty);
+	uart_insert_char(&uart->port, status, OE, ch, flg);
+
+ ignore_char:
+	tty_flip_buffer_push(tty);
 }
 
 static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
@@ -254,7 +259,6 @@ static irqreturn_t bfin_serial_rx_int(int irq, void *dev_id)
 static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
 {
 	struct bfin_serial_port *uart = dev_id;
-	unsigned short status;
 
 	spin_lock(&uart->port.lock);
 	while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_TX_READY)
@@ -325,7 +329,7 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
 	spin_unlock_irqrestore(&uart->port.lock, flags);
 }
 
-static void bfin_serial_dma_rx_chars(struct bfin_serial_port * uart)
+static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart)
 {
 	struct tty_struct *tty = uart->port.info->tty;
 	int i, flg, status;
@@ -337,25 +341,32 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port * uart)
 		uart->port.icount.brk++;
 		if (uart_handle_break(&uart->port))
 			goto dma_ignore_char;
-		flg = TTY_BREAK;
-	} else if (status & PE) {
-		flg = TTY_PARITY;
+	}
+	if (status & PE)
 		uart->port.icount.parity++;
-	} else if (status & OE) {
-		flg = TTY_OVERRUN;
+	if (status & OE)
 		uart->port.icount.overrun++;
-	} else if (status & FE) {
-		flg = TTY_FRAME;
+	if (status & FE)
 		uart->port.icount.frame++;
-	} else
+
+	status &= uart->port.read_status_mask;
+
+	if (status & BI)
+		flg = TTY_BREAK;
+	else if (status & PE)
+		flg = TTY_PARITY;
+	else if (status & FE)
+		flg = TTY_FRAME;
+	else
 		flg = TTY_NORMAL;
 
 	for (i = uart->rx_dma_buf.head; i < uart->rx_dma_buf.tail; i++) {
 		if (uart_handle_sysrq_char(&uart->port, uart->rx_dma_buf.buf[i]))
 			goto dma_ignore_char;
-		uart_insert_char(&uart->port, status, 2, uart->rx_dma_buf.buf[i], flg);
+		uart_insert_char(&uart->port, status, OE, uart->rx_dma_buf.buf[i], flg);
 	}
-dma_ignore_char:
+
+ dma_ignore_char:
 	tty_flip_buffer_push(tty);
 }
 
@@ -620,13 +631,27 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
 			lcr |= EPS;
 	}
 
-	/* These controls are not implemented for this port */
-	termios->c_iflag |= INPCK | BRKINT | PARMRK;
-	termios->c_iflag &= ~(IGNPAR | IGNBRK);
+	port->read_status_mask = OE;
+	if (termios->c_iflag & INPCK)
+		port->read_status_mask |= (FE | PE);
+	if (termios->c_iflag & (BRKINT | PARMRK))
+		port->read_status_mask |= BI;
 
-	/* These controls are not implemented for this port */
-	termios->c_iflag |= INPCK | BRKINT | PARMRK;
-	termios->c_iflag &= ~(IGNPAR | IGNBRK);
+	/*
+	 * Characters to ignore
+	 */
+	port->ignore_status_mask = 0;
+	if (termios->c_iflag & IGNPAR)
+		port->ignore_status_mask |= FE | PE;
+	if (termios->c_iflag & IGNBRK) {
+		port->ignore_status_mask |= BI;
+		/*
+		 * If we're ignoring parity and break indicators,
+		 * ignore overruns too (for real raw support).
+		 */
+		if (termios->c_iflag & IGNPAR)
+			port->ignore_status_mask |= OE;
+	}
 
 	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
 	quot = uart_get_divisor(port, baud);
-- 
1.5.1.2

  parent reply	other threads:[~2007-05-21 10:14 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-21 10:09 [PATCH 00/32] Blackfin update for 2.6.22-rc2 Bryan Wu
2007-05-21 10:09 ` [PATCH 01/32] Blackfin arch: Add Workaround for ANOMALY 05000257 Bryan Wu
2007-05-21 10:09 ` [PATCH 02/32] Blackfin arch: add SPI MMC driver support on bf533-stamp, tested on STAMP-BF533 Bryan Wu
2007-05-21 10:09 ` [PATCH 03/32] Blackfin arch: ISP1761 doesn't work for USB flash disk Bryan Wu
2007-05-21 10:09 ` [PATCH 04/32] Blackfin arch: fix a few random warnings Bryan Wu
2007-05-21 10:09 ` [PATCH 05/32] Blackfin arch: Add configuration data for ISP176x on BF561 Bryan Wu
2007-05-21 10:09 ` [PATCH 06/32] Blackfin arch: mark a bunch of local functions as static Bryan Wu
2007-05-21 10:09 ` [PATCH 07/32] Blackfin arch: Fix reserved map after we changed PORT_H definition Bryan Wu
2007-05-21 10:09 ` [PATCH 08/32] Blackfin arch: Move write to VR_CTL closer to IDLE Bryan Wu
2007-05-21 10:09 ` [PATCH 09/32] Blackfin arch: DMA operation cleanup Bryan Wu
2007-05-21 10:09 ` [PATCH 10/32] Blackfin arch: GPIO fix some defines Bryan Wu
2007-05-21 10:09 ` [PATCH 11/32] Blackfin arch: fix trace output for FLAT binaries Bryan Wu
2007-05-21 10:09 ` [PATCH 12/32] Blackfin arch: Fix bug using usb keyboard crashes kernel Bryan Wu
2007-05-21 11:39   ` Pekka Enberg
2007-05-21 10:09 ` [PATCH 13/32] Blackfin arch: initial tepla-bf561 board support Bryan Wu
2007-05-21 10:09 ` [PATCH 14/32] Blackfin arch: make sure we declare the revid functions as pure (since they are) Bryan Wu
2007-05-21 10:09 ` [PATCH 15/32] Blackfin arch: dont clear status register bits in SWRST so we can actually use it Bryan Wu
2007-05-21 10:09 ` [PATCH 16/32] Blackfin arch: finish removing p* volatile defines for MMRs Bryan Wu
2007-05-21 10:09 ` [PATCH 17/32] Blackfin arch: move board specific setup out of common init code and into the board specific init code Bryan Wu
2007-05-21 10:09 ` [PATCH 18/32] Blackfin arch: issue reset via SWRST so we dont clobber the watchdog state Bryan Wu
2007-05-21 10:09 ` [PATCH 19/32] Blackfin arch: document why we have to touch the UART peripheral in our boot up code Bryan Wu
2007-05-21 10:09 ` [PATCH 20/32] Blackfin arch: dma_memcpy borken for > 64K Bryan Wu
2007-05-21 11:26   ` Pekka Enberg
2007-05-21 17:49     ` Mike Frysinger
2007-05-21 10:09 ` [PATCH 21/32] Blackfin arch: dont clear the bit that tells coreb to start booting Bryan Wu
2007-05-21 10:09 ` [PATCH 22/32] Blackfin arch: make sure we use local labels Bryan Wu
2007-05-21 10:09 ` [PATCH 24/32] Blackfin arch: cache SWRST value at bootup so other things like watchdog can non-destructively query it Bryan Wu
2007-05-21 10:09 ` [PATCH 25/32] Blackfin arch: fix signal handling bug Bryan Wu
2007-05-21 10:09 ` [PATCH 26/32] Blackfin arch: Change NO_ACCESS_CHECK to ACCESS_CHECK Bryan Wu
2007-05-21 10:09 ` [PATCH 27/32] Blackfin arch: add board default configs to blackfin arch Bryan Wu
2007-05-21 10:09 ` [PATCH 28/32] Blackfin arch: update defconfig files Bryan Wu
2007-05-21 10:09 ` [PATCH 29/32] Blackfin arch: update pm.c according to power management API change Bryan Wu
2007-05-21 10:09 ` [PATCH 30/32] Blackfin serial driver: fix overhead issue Bryan Wu
2007-05-21 10:09 ` Bryan Wu [this message]
2007-05-21 10:09 ` [PATCH 31/32] Blackfin serial driver: implement support for ignoring parity/break errors Bryan Wu
2007-05-21 14:35 ` [PATCH 00/32] Blackfin update for 2.6.22-rc2 Robin Getz
2007-05-21 14:37   ` Paul Mundt
2007-05-23  0:28     ` Mike Frysinger
2007-05-23  1:06       ` Paul Mundt
2007-05-21 17:36   ` Mike Frysinger
2007-05-21 21:52     ` Robin Getz
2007-05-21 22:01       ` Mike Frysinger
2007-05-22  8:37       ` Bryan Wu

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=11797421881610-git-send-email-bryan.wu@analog.com \
    --to=bryan.wu@analog.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michael.frysinger@analog.com \
    --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