Subject: Re: [PATCH] CPM_UART: Fix non-console transmit

From: Vitaly Bordug <[email-masked]>
Date: Thu, 19 Oct 2006 23:28:03 +0400

On Thu, 19 Oct 2006 15:25:55 +0300 (EEST)
[email-masked] wrote:

> The SMC and SCC hardware transmitter is enabled at the wrong
> place. Simply writing twice to the non-console port, like
> 
> $ echo asdf > /dev/ttyCPM1
> $ echo asdf > /dev/ttyCPM1
> 
> puts the shell into endless uninterruptible sleep, since the
> transmitter is stopped after the first write, and is not enabled
> before the shutdown function of the second write. Thus the transmit
> buffers are never emptied.
> 
Was about to Ack, but... need one more glance at it on hw. 
I recall something that might be reason of the current implementation,
but had no chance to recover the details.

Thanks for the input. I'll follow-up tomorrow.

> Signed-off-by: Kalle Pokki <[email-masked]>
> ---
>   drivers/serial/cpm_uart/cpm_uart_core.c |    5 ++---
>   1 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c
> b/drivers/serial/cpm_uart/cpm_uart_core.c index 90ff96e..8f3b3e5
> 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c
> +++ b/drivers/serial/cpm_uart/cpm_uart_core.c
> @@ -194,10 +194,8 @@ static void cpm_uart_start_tx(struct uar
>   	if (cpm_uart_tx_pump(port) != 0) {
>   		if (IS_SMC(pinfo)) {
>   			smcp->smc_smcm |= SMCM_TX;
> -			smcp->smc_smcmr |= SMCMR_TEN;
>   		} else {
>   			sccp->scc_sccm |= UART_SCCM_TX;
> -			pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT;
>   		}
>   	}
>   }
> @@ -420,9 +418,10 @@ static int cpm_uart_startup(struct uart_
>   	/* Startup rx-int */
>   	if (IS_SMC(pinfo)) {
>   		pinfo->smcp->smc_smcm |= SMCM_RX;
> -		pinfo->smcp->smc_smcmr |= SMCMR_REN;
> +		pinfo->smcp->smc_smcmr |= (SMCMR_REN | SMCMR_TEN);
>   	} else {
>   		pinfo->sccp->scc_sccm |= UART_SCCM_RX;
> +		pinfo->sccp->scc_gsmrl |= (SCC_GSMRL_ENR |
> SCC_GSMRL_ENT); }
> 
>   	if (!(pinfo->flags & FLAG_CONSOLE))