aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>2015-03-16 12:19:54 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-26 17:42:27 -0400
commit5f6d851564a978085e23ccc41ee95cfa3a2ee43e (patch)
tree7d7ce56d60f76674fa113e6b3d806468b49e688c /drivers
parentcb772fe75fa189c25ec258d36dabf914205e6635 (diff)
serial: sh-sci: Update calculation of timeout for DMA
The current calculation method in the case of 9600bps, rounding error occurs has become setting that occur timeout faster than the required time. When we use 9600bps, 32byte buffer, 10 bit (CS8) and 100 HZ, it becomes 3 jiffies (30msec). In fact it is necessary 33msec. This updates to the calculation that are not actually less than the value set by the rounding error. Also, this is nothing will be calculated value when there is no load. If there are a lot of case load, overrun error will occur immediately. This is by the buffer size to be calculated twice the DMA buffer, and add the change of setting a sufficient time-out value. Signed-off-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/tty/serial/sh-sci.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 5bf997253a46..e7d6566fafaf 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1991,18 +1991,40 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
1991 1991
1992#ifdef CONFIG_SERIAL_SH_SCI_DMA 1992#ifdef CONFIG_SERIAL_SH_SCI_DMA
1993 /* 1993 /*
1994 * Calculate delay for 1.5 DMA buffers: see 1994 * Calculate delay for 2 DMA buffers (4 FIFO).
1995 * drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits 1995 * See drivers/serial/serial_core.c::uart_update_timeout(). With 10
1996 * (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function 1996 * bits (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function
1997 * calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)." 1997 * calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)."
1998 * Then below we calculate 3 jiffies (12ms) for 1.5 DMA buffers (3 FIFO 1998 * Then below we calculate 5 jiffies (20ms) for 2 DMA buffers (4 FIFO
1999 * sizes), but it has been found out experimentally, that this is not 1999 * sizes), but when performing a faster transfer, value obtained by
2000 * enough: the driver too often needlessly runs on a DMA timeout. 20ms 2000 * this formula is may not enough. Therefore, if value is smaller than
2001 * as a minimum seem to work perfectly. 2001 * 20msec, this sets 20msec as timeout of DMA.
2002 */ 2002 */
2003 if (s->chan_rx) { 2003 if (s->chan_rx) {
2004 s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 / 2004 unsigned int bits;
2005 port->fifosize / 2; 2005
2006 /* byte size and parity */
2007 switch (termios->c_cflag & CSIZE) {
2008 case CS5:
2009 bits = 7;
2010 break;
2011 case CS6:
2012 bits = 8;
2013 break;
2014 case CS7:
2015 bits = 9;
2016 break;
2017 default:
2018 bits = 10;
2019 break;
2020 }
2021
2022 if (termios->c_cflag & CSTOPB)
2023 bits++;
2024 if (termios->c_cflag & PARENB)
2025 bits++;
2026 s->rx_timeout = DIV_ROUND_UP((s->buf_len_rx * 2 * bits * HZ) /
2027 (baud / 10), 10);
2006 dev_dbg(port->dev, "DMA Rx t-out %ums, tty t-out %u jiffies\n", 2028 dev_dbg(port->dev, "DMA Rx t-out %ums, tty t-out %u jiffies\n",
2007 s->rx_timeout * 1000 / HZ, port->timeout); 2029 s->rx_timeout * 1000 / HZ, port->timeout);
2008 if (s->rx_timeout < msecs_to_jiffies(20)) 2030 if (s->rx_timeout < msecs_to_jiffies(20))