All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Hodaszi <robert.hodaszi@digi.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	linux-serial@vger.kernel.org,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Subject: Re: [PATCH] serial: imx: fix TX stop function not setting state to OFF in RS232-mode
Date: Tue, 20 Apr 2021 21:07:07 +0200	[thread overview]
Message-ID: <a20e43f0-e900-61a9-328c-a8dd9ba7b8d2@digi.com> (raw)
In-Reply-To: <YHFi9gmtpCbIp8aU@kroah.com>

On 2021. 04. 10. 10:33, Greg Kroah-Hartman wrote:
> [EXTERNAL EMAIL]
>
> On Fri, Apr 02, 2021 at 01:05:48PM +0200, Robert Hodaszi wrote:
>> From: Robert Hodaszi <robert.hodaszi@digi.com>
>>
>> If the mode had been changed to RS-485 after at least one character had
>> been sent in RS-232 mode, the RS-485 transmission was not working.
>>
>> Commit cb1a609236096c278ecbfb7be678a693a70283f1 ("serial: imx: implement
>> rts delaying for rs485") added a TX state variable to keep track, when
>> it needs to enable / disable the RS-485 transmitter.
>>
>> In RS-232 mode, the start TX function just sets the state to SEND, and
>> the stop function supposed to set it to OFF.
>>
>> In RS-485 mode, the start TX function expects the state to be either
>> OFF, WAIT_AFTER_SEND, or WAIT_AFTER RTS. It cannot do anything if the
>> state is set to SEND, expects a stop first.
>>
>> But stop TX function in RS-232 mode usually didn't set the state to OFF,
>> as it first checked if the shifter is empty, and if not, it just
>> returned, waiting for a TransmitComplete interrupt, which is only
>> enabled in RS-485 mode. So the stop function was never called again.
>>
>> That check, and the subsequent code part is not needed for RS-232, it
>> just have to set the TX state to OFF.
>>
>> Signed-off-by: Robert Hodaszi <robert.hodaszi@digi.com>
>> ---
>>  drivers/tty/serial/imx.c | 46 +++++++++++++++++++++-------------------
>>  1 file changed, 24 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
>> index 8257597d034d..511badce3edd 100644
>> --- a/drivers/tty/serial/imx.c
>> +++ b/drivers/tty/serial/imx.c
>> @@ -443,6 +443,12 @@ static void imx_uart_stop_tx(struct uart_port *port)
>>      ucr1 = imx_uart_readl(sport, UCR1);
>>      imx_uart_writel(sport, ucr1 & ~UCR1_TRDYEN, UCR1);
>>
>> +    if (!(port->rs485.flags & SER_RS485_ENABLED)) {
>> +        /* Set the TX state in non-RS485 mode, nothing else to do */
>> +        sport->tx_state = OFF;
>> +        return;
>> +    }
>> +
>>      usr2 = imx_uart_readl(sport, USR2);
>>      if (!(usr2 & USR2_TXDC)) {
>>          /* The shifter is still busy, so retry once TC triggers */
>> @@ -453,33 +459,29 @@ static void imx_uart_stop_tx(struct uart_port *port)
>>      ucr4 &= ~UCR4_TCEN;
>>      imx_uart_writel(sport, ucr4, UCR4);
>>
>> -    /* in rs485 mode disable transmitter */
>> -    if (port->rs485.flags & SER_RS485_ENABLED) {
>> -        if (sport->tx_state == SEND) {
>> -            sport->tx_state = WAIT_AFTER_SEND;
>> -            start_hrtimer_ms(&sport->trigger_stop_tx,
>> -                     port->rs485.delay_rts_after_send);
>> -            return;
>> -        }
>> +    if (sport->tx_state == SEND) {
>> +        sport->tx_state = WAIT_AFTER_SEND;
>> +        start_hrtimer_ms(&sport->trigger_stop_tx,
>> +                    port->rs485.delay_rts_after_send);
>> +        return;
>> +    }
>>
>> -        if (sport->tx_state == WAIT_AFTER_RTS ||
>> -            sport->tx_state == WAIT_AFTER_SEND) {
>> -            u32 ucr2;
>> +    if (sport->tx_state == WAIT_AFTER_RTS ||
>> +        sport->tx_state == WAIT_AFTER_SEND) {
>> +        /* in rs485 mode disable transmitter */
>> +        u32 ucr2;
>>
>> - hrtimer_try_to_cancel(&sport->trigger_start_tx);
>> +        hrtimer_try_to_cancel(&sport->trigger_start_tx);
>>
>> -            ucr2 = imx_uart_readl(sport, UCR2);
>> -            if (port->rs485.flags & SER_RS485_RTS_AFTER_SEND)
>> -                imx_uart_rts_active(sport, &ucr2);
>> -            else
>> -                imx_uart_rts_inactive(sport, &ucr2);
>> -            imx_uart_writel(sport, ucr2, UCR2);
>> +        ucr2 = imx_uart_readl(sport, UCR2);
>> +        if (port->rs485.flags & SER_RS485_RTS_AFTER_SEND)
>> +            imx_uart_rts_active(sport, &ucr2);
>> +        else
>> +            imx_uart_rts_inactive(sport, &ucr2);
>> +        imx_uart_writel(sport, ucr2, UCR2);
>>
>> -            imx_uart_start_rx(port);
>> +        imx_uart_start_rx(port);
>>
>> -            sport->tx_state = OFF;
>> -        }
>> -    } else {
>>          sport->tx_state = OFF;
>>      }
>>  }
>> --
>> 2.27.0
> Your patch is corrupted, all the tabs are turned to spaces and it can
> not be applied :(
>
> Please fix up and resend.
>
> thanks,
>
> greg k-h

Sorry, for that (and for the slow reply)! My latest Thunderbird setup
seems not playing very. Went back to my older setup, and sent out a v2.
Hopefully, that will be OK.

Thanks,
Robert Hodaszi


      reply	other threads:[~2021-04-20 19:07 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-02 11:05 [PATCH] serial: imx: fix TX stop function not setting state to OFF in RS232-mode Robert Hodaszi
2021-04-10  8:33 ` Greg Kroah-Hartman
2021-04-20 19:07   ` Robert Hodaszi [this message]

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=a20e43f0-e900-61a9-328c-a8dd9ba7b8d2@digi.com \
    --to=robert.hodaszi@digi.com \
    --cc=festevam@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kernel@pengutronix.de \
    --cc=linux-imx@nxp.com \
    --cc=linux-serial@vger.kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=u.kleine-koenig@pengutronix.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.