From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <5106D736.1050402@ebus.com> Date: Mon, 28 Jan 2013 11:53:26 -0800 From: Doug Brunner MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Xenomai] [PATCH] 16550: Fix crossed timeouts in rt_16550_write List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai@xenomai.org rt_16550_write currently initializes its timeout sequence using rx_timeout. Because xnsynch_acquire ignores the value of timeout (apart from making sure it's positive) when it is passed a non NULL timeout sequence, this means that serial writes are using the read timeout, except for when the user sets a zero tx timeout. (Should xnsynch_acquire be changed to (timeout + current time) to *timeout_seq to decide which will lead to timing out sooner? Seems more consistent but might break existing code...) This changes the initialization of the timeout sequence to use tx_timeout. I also changed the first call to rtdm_mutex_timedlock to use tx_timeout, since this more accurately reflects what is happening. ******************* diff --git a/ksrc/drivers/serial/16550A.c b/ksrc/drivers/serial/16550A.c index 3672539..e92017d 100644 --- a/ksrc/drivers/serial/16550A.c +++ b/ksrc/drivers/serial/16550A.c @@ -979,10 +979,10 @@ ssize_t rt_16550_write(struct rtdm_dev_context * context, ctx = (struct rt_16550_context *)context->dev_private; - rtdm_toseq_init(&timeout_seq, ctx->config.rx_timeout); + rtdm_toseq_init(&timeout_seq, ctx->config.tx_timeout); /* Make write operation atomic. */ - ret = rtdm_mutex_timedlock(&ctx->out_lock, ctx->config.rx_timeout, + ret = rtdm_mutex_timedlock(&ctx->out_lock, ctx->config.tx_timeout, &timeout_seq); if (ret) return ret; ******************* -- Doug Brunner