From: Bryan Wu <cooloney@kernel.org>
To: alan@redhat.com
Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
Graf Yang <graf.yang@analog.com>,
Michael Hennerich <michael.hennerich@analog.com>,
Bryan Wu <cooloney@kernel.org>
Subject: [PATCH 4/9] Blackfin Serial Driver: fix bug - SIR driver stop receiving randomly
Date: Fri, 17 Oct 2008 01:44:02 +0800 [thread overview]
Message-ID: <1224179047-13073-5-git-send-email-cooloney@kernel.org> (raw)
In-Reply-To: <1224179047-13073-1-git-send-email-cooloney@kernel.org>
From: Graf Yang <graf.yang@analog.com>
Bug description:
The IRDA receiver may can't receiving any more after processed some signals.
To duplicate this issue is put three IRDA devices together, one blackfin,
two none blackfin, they will detect each other. Let one none blackfin devices
irdaping the blackfin devices, when it stopped print out ping information,
it is the time that blackfin stoped receiving, the time is random.
The related register bit is OK, the other devices is sending data continuously.
But no interrupt come.
Fixing:
I tried Michael's suggestion that request the UARTx error interrupt, and reset
the IRDA when found FE error. This method helps much, but it can't completely
avoid stop.
Reset the IRDA before every time sending the data is more safe.
Cc: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
---
drivers/serial/bfin_5xx.c | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c
index aea3a53..3cc7b98 100644
--- a/drivers/serial/bfin_5xx.c
+++ b/drivers/serial/bfin_5xx.c
@@ -74,6 +74,8 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart);
static void bfin_serial_mctrl_check(struct bfin_serial_port *uart);
+static void bfin_serial_reset_irda(struct uart_port *port);
+
/*
* interrupts are disabled on entry
*/
@@ -106,6 +108,14 @@ static void bfin_serial_stop_tx(struct uart_port *port)
static void bfin_serial_start_tx(struct uart_port *port)
{
struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
+ struct tty_struct *tty = uart->port.info->port.tty;
+
+ /*
+ * To avoid losting RX interrupt, we reset IR function
+ * before sending data.
+ */
+ if (tty->termios->c_line == N_IRDA)
+ bfin_serial_reset_irda(port);
#ifdef CONFIG_SERIAL_BFIN_DMA
if (uart->tx_done)
@@ -891,6 +901,20 @@ static int bfin_kgdboc_port_startup(struct uart_port *port)
}
#endif
+static void bfin_serial_reset_irda(struct uart_port *port)
+{
+ int line = port->line;
+ unsigned short val;
+
+ val = UART_GET_GCTL(&bfin_serial_ports[line]);
+ val &= ~(IREN | RPOLC);
+ UART_PUT_GCTL(&bfin_serial_ports[line], val);
+ SSYNC();
+ val |= (IREN | RPOLC);
+ UART_PUT_GCTL(&bfin_serial_ports[line], val);
+ SSYNC();
+}
+
static struct uart_ops bfin_serial_pops = {
.tx_empty = bfin_serial_tx_empty,
.set_mctrl = bfin_serial_set_mctrl,
--
1.5.6
next prev parent reply other threads:[~2008-10-16 17:44 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-16 17:43 [PATCH 0/9] Blacfin Serial Driver updates for 2.6.28-rc1 (v2) Bryan Wu
2008-10-16 17:43 ` [PATCH 1/9] Blackfin Serial Driver: updates kgdb over Blackfin serial driver with kgdb framework Bryan Wu
2008-10-17 17:41 ` Alan Cox
2008-10-16 17:44 ` [PATCH 2/9] Blackfin Serial Driver: Add a debug function to serial driver Bryan Wu
2008-10-16 17:44 ` [PATCH 3/9] Blackfin Serial Driver: use barrier instead of cpu_relax for Blackfin SMP like patch Bryan Wu
2008-10-16 17:44 ` Bryan Wu [this message]
2008-10-16 17:44 ` [PATCH 5/9] Blackfin Serial Driver: Clean serial console and early prink code` Bryan Wu
2008-10-16 17:44 ` [PATCH 6/9] Blackfin Serial Driver: Fix bug - BF527-EZKIT unable to receive large files over UART in DMA mode Bryan Wu
2008-10-16 17:44 ` [PATCH 7/9] Blackfin Serial Driver: Remove BI status for known_good_char Bryan Wu
2008-10-16 17:44 ` [PATCH 8/9] Blackfin Serial Driver: fix a in dma circle rx buffer handling Bryan Wu
2008-10-16 17:44 ` [PATCH 9/9] Blackfin Serial Driver: Change hardware flowcontrol from poll to interrupt driven 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=1224179047-13073-5-git-send-email-cooloney@kernel.org \
--to=cooloney@kernel.org \
--cc=alan@redhat.com \
--cc=graf.yang@analog.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=michael.hennerich@analog.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox