* [PATCH/RFC] serial: sh-sci: Update calculation of timeout for DMA
@ 2015-03-15 14:29 Yoshihiro Kaneko
2015-03-15 15:30 ` Sergei Shtylyov
0 siblings, 1 reply; 3+ messages in thread
From: Yoshihiro Kaneko @ 2015-03-15 14:29 UTC (permalink / raw)
To: linux-serial; +Cc: Greg Kroah-Hartman, Simon Horman, Magnus Damm, linux-sh
From: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
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.
Signedroff-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
---
This patch is based on the tty-next branch of Greg Kroah-Hartman's tty
tree.
drivers/tty/serial/sh-sci.c | 38 ++++++++++++++++++++++++++++++--------
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 5b50c79..891116c 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1967,18 +1967,40 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
#ifdef CONFIG_SERIAL_SH_SCI_DMA
/*
- * Calculate delay for 1.5 DMA buffers: see
- * drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits
+ * Calculate delay for 2 DMA buffers (4 FIFO).
+ * See drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits
* (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function
* calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)."
- * Then below we calculate 3 jiffies (12ms) for 1.5 DMA buffers (3 FIFO
- * sizes), but it has been found out experimentally, that this is not
- * enough: the driver too often needlessly runs on a DMA timeout. 20ms
- * as a minimum seem to work perfectly.
+ * Then below we calculate 5 jiffies (20ms) for 2 DMA buffers (4 FIFO
+ * sizes), but when performing a faster transfer, value obtained by this
+ * formula is may not enough. Therefore, if value is smaller than 20msec,
+ * this sets 20msec as timeout of DMA.
*/
if (s->chan_rx) {
- s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /
- port->fifosize / 2;
+ unsigned int bits;
+
+ /* byte size and parity */
+ switch (termios->c_cflag & CSIZE) {
+ case CS5:
+ bits = 7;
+ break;
+ case CS6:
+ bits = 8;
+ break;
+ case CS7:
+ bits = 9;
+ break;
+ default:
+ bits = 10;
+ break;
+ }
+
+ if (termios->c_cflag & CSTOPB)
+ bits++;
+ if (termios->c_cflag & PARENB)
+ bits++;
+ s->rx_timeout = DIV_ROUND_UP((s->buf_len_rx * 2 * bits * HZ) /
+ (baud / 10), 10);
dev_dbg(port->dev, "DMA Rx t-out %ums, tty t-out %u jiffies\n",
s->rx_timeout * 1000 / HZ, port->timeout);
if (s->rx_timeout < msecs_to_jiffies(20))
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH/RFC] serial: sh-sci: Update calculation of timeout for DMA
2015-03-15 14:29 [PATCH/RFC] serial: sh-sci: Update calculation of timeout for DMA Yoshihiro Kaneko
@ 2015-03-15 15:30 ` Sergei Shtylyov
2015-03-16 13:58 ` Yoshihiro Kaneko
0 siblings, 1 reply; 3+ messages in thread
From: Sergei Shtylyov @ 2015-03-15 15:30 UTC (permalink / raw)
To: Yoshihiro Kaneko, linux-serial
Cc: Greg Kroah-Hartman, Simon Horman, Magnus Damm, linux-sh
On 3/15/2015 5:29 PM, Yoshihiro Kaneko wrote:
> From: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
> 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.
> Signedroff-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
> ---
> This patch is based on the tty-next branch of Greg Kroah-Hartman's tty
> tree.
> drivers/tty/serial/sh-sci.c | 38 ++++++++++++++++++++++++++++++--------
> 1 file changed, 30 insertions(+), 8 deletions(-)
> diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
> index 5b50c79..891116c 100644
> --- a/drivers/tty/serial/sh-sci.c
> +++ b/drivers/tty/serial/sh-sci.c
> @@ -1967,18 +1967,40 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
[...]
> if (s->chan_rx) {
> - s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /
> - port->fifosize / 2;
> + unsigned int bits;
> +
> + /* byte size and parity */
> + switch (termios->c_cflag & CSIZE) {
> + case CS5:
*case* should at the same indentation level as *switch*. I guess you
haven't run the patch thru scripts/checkpatch.pl?
> + bits = 7;
> + break;
> + case CS6:
> + bits = 8;
> + break;
> + case CS7:
> + bits = 9;
> + break;
> + default:
> + bits = 10;
> + break;
> + }
[...]
WBR, Sergei
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH/RFC] serial: sh-sci: Update calculation of timeout for DMA
2015-03-15 15:30 ` Sergei Shtylyov
@ 2015-03-16 13:58 ` Yoshihiro Kaneko
0 siblings, 0 replies; 3+ messages in thread
From: Yoshihiro Kaneko @ 2015-03-16 13:58 UTC (permalink / raw)
To: Sergei Shtylyov
Cc: linux-serial@vger.kernel.org, Greg Kroah-Hartman, Simon Horman,
Magnus Damm, Linux-sh list
Hello,
2015-03-16 0:30 GMT+09:00 Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>:
> On 3/15/2015 5:29 PM, Yoshihiro Kaneko wrote:
>
>> From: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
>
>
>> 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.
>
>
>> Signedroff-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
>> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
>> ---
>
>
>> This patch is based on the tty-next branch of Greg Kroah-Hartman's tty
>> tree.
>
>
>> drivers/tty/serial/sh-sci.c | 38 ++++++++++++++++++++++++++++++--------
>> 1 file changed, 30 insertions(+), 8 deletions(-)
>
>
>> diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
>> index 5b50c79..891116c 100644
>> --- a/drivers/tty/serial/sh-sci.c
>> +++ b/drivers/tty/serial/sh-sci.c
>> @@ -1967,18 +1967,40 @@ static void sci_set_termios(struct uart_port
>> *port, struct ktermios *termios,
>
> [...]
>>
>> if (s->chan_rx) {
>> - s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx
>> * 3 /
>> - port->fifosize / 2;
>> + unsigned int bits;
>> +
>> + /* byte size and parity */
>> + switch (termios->c_cflag & CSIZE) {
>> + case CS5:
>
>
> *case* should at the same indentation level as *switch*. I guess you
> haven't run the patch thru scripts/checkpatch.pl?
Sorry, I forgot to run the script.
Thanks,
Kaneko
>
>> + bits = 7;
>> + break;
>> + case CS6:
>> + bits = 8;
>> + break;
>> + case CS7:
>> + bits = 9;
>> + break;
>> + default:
>> + bits = 10;
>> + break;
>> + }
>
> [...]
>
> WBR, Sergei
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-03-16 13:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-15 14:29 [PATCH/RFC] serial: sh-sci: Update calculation of timeout for DMA Yoshihiro Kaneko
2015-03-15 15:30 ` Sergei Shtylyov
2015-03-16 13:58 ` Yoshihiro Kaneko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox