All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sergey Organov <sorganov@gmail.com>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: linux-serial@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	NXP Linux Team <linux-imx@nxp.com>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v6 2/3] serial: imx: set_mctrl(): correctly restore autoRTS state
Date: Tue, 23 Jul 2019 12:20:38 +0300	[thread overview]
Message-ID: <87h87d1509.fsf@osv.gnss.ru> (raw)
In-Reply-To: <20190722202406.hr74mg64sxoovah7@pengutronix.de> ("Uwe \=\?utf-8\?Q\?Kleine-K\=C3\=B6nig\=22's\?\= message of "Mon, 22 Jul 2019 22:24:06 +0200")

Uwe Kleine-König <u.kleine-koenig@pengutronix.de> writes:

> On Mon, Jul 22, 2019 at 10:22:10PM +0300, Sergey Organov wrote:
>> imx_uart_set_mctrl() happened to set UCR2_CTSC bit whenever TIOCM_RTS
>> was set, no matter if RTS/CTS handshake is enabled or not. Now fixed by
>> turning handshake on only when CRTSCTS bit for the port is set.
>>
>> Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>> Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
>> Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
>> Signed-off-by: Sergey Organov <sorganov@gmail.com>
>> ---
>>  drivers/tty/serial/imx.c | 16 ++++++++++++++--
>>  1 file changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
>> index 32f36d8..059ba35 100644
>> --- a/drivers/tty/serial/imx.c
>> +++ b/drivers/tty/serial/imx.c
>> @@ -974,10 +974,22 @@ static void imx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
>>  	if (!(port->rs485.flags & SER_RS485_ENABLED)) {
>>  		u32 ucr2;
>>
>> +		/*
>> +		 * Turn off autoRTS if RTS is lowered and restore autoRTS
>> +		 * setting if RTS is raised.
>
> "lower" and "raising" are misleading here. I recommend sticking to
> "active" and "inactive".

This is copy-pasted from the 8250 driver. I'd prefer to leave it as is.

>
>> +		 */
>>  		ucr2 = imx_uart_readl(sport, UCR2);
>>  		ucr2 &= ~(UCR2_CTS | UCR2_CTSC);
>> -		if (mctrl & TIOCM_RTS)
>> -			ucr2 |= UCR2_CTS | UCR2_CTSC;
>> +		if (mctrl & TIOCM_RTS) {
>> +			ucr2 |= UCR2_CTS;
>> +			/*
>> +			 * UCR2_IRTS is unset if and only if the port is
>> +			 * configured for CRTSCTS, so we use inverted UCR2_IRTS
>> +			 * to get the state to restore to.
>> +			 */
>> +			if (!(ucr2 & UCR2_IRTS))
>> +				ucr2 |= UCR2_CTSC;
>> +		}
>
> If you teach imx_uart_rts_auto about IRTS this function could be reused
> here I think.

Yeah, but imx_uart_rts_auto_if_crtscts_and_rts_is_active() ? I feel
somewhat uncomfortable about that mixing of different purposes.

Besides, one of the purposes of these patch series was to get rid of
imx_uart_rts_auto() as its name is confusing in the context of existing
imx_uart_rts_active() and imx_uart_rts_inactive(), as I already
explained before.

We can rename the function to avoid confusion, add yet another check to
it, and call it from 2 places, but it's still questionable if it's an
improvement, and could be done as a follow-up step anyway. It will look
something like this then:

 -- >8 --

    serial: imx: factor out common code into new imx_uart_set_auto_rts()

	Modified   drivers/tty/serial/imx.c
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index d9a73c7..c8b847e 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -954,6 +954,20 @@ static unsigned int imx_uart_get_mctrl(struct uart_port *port)
 	return ret;
 }

+/*
+ * Compute and set auto RTS in 'ucr2' according to the current state of RTS
+ * signal and CRTSCTS state of port configuration.
+ *
+ * Use inverted UCR2_IRTS to get the state of CRTSCTS, and don't let receiver
+ * control RTS output if RTS is inactive.
+ *
+ */
+static void imx_uart_set_auto_rts(u32 *ucr2)
+{
+	if ((*ucr2 & UCR2_CTS) && !(*ucr2 & UCR2_IRTS))
+		*ucr2 |= UCR2_CTSC;
+}
+
 /* called with port.lock taken and irqs off */
 static void imx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
@@ -971,13 +985,7 @@ static void imx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
 		ucr2 &= ~(UCR2_CTS | UCR2_CTSC);
 		if (mctrl & TIOCM_RTS) {
 			ucr2 |= UCR2_CTS;
-			/*
-			 * UCR2_IRTS is unset if and only if the port is
-			 * configured for CRTSCTS, so we use inverted UCR2_IRTS
-			 * to get the state to restore to.
-			 */
-			if (!(ucr2 & UCR2_IRTS))
-				ucr2 |= UCR2_CTSC;
+			imx_uart_set_auto_rts(&ucr2);
 		}
 		imx_uart_writel(sport, ucr2, UCR2);
 	}
@@ -1594,12 +1602,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
 			imx_uart_rts_inactive(sport, &ucr2);

 	} else if (termios->c_cflag & CRTSCTS) {
-		/*
-		 * Only let receiver control RTS output if we were not requested
-		 * to have RTS inactive (which then should take precedence).
-		 */
-		if (ucr2 & UCR2_CTS)
-			ucr2 |= UCR2_CTSC;
+		imx_uart_set_auto_rts(&ucr2);
 	}

 	if (termios->c_cflag & CRTSCTS)



-- Sergey

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2019-07-23  9:20 UTC|newest]

Thread overview: 154+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-14  7:28 [PATCH] serial: imx: fix RTS/CTS setting Sascha Hauer
2019-06-14  7:28 ` Sascha Hauer
2019-06-14  7:48 ` Uwe Kleine-König
2019-06-14  7:48   ` Uwe Kleine-König
2019-06-14 12:11 ` [PATCH RFC 0/7] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-06-14 12:11   ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 1/7] serial: imx: fix locking in set_termios() Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 2/7] serial: imx: set_termios(): factor-out 'ucr2' initial value Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 3/7] serial: imx: set_termios(): clarify RTS/CTS bits calculation Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 4/7] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-20  9:37     ` Sascha Hauer
2019-06-20  9:37       ` Sascha Hauer
2019-06-20 13:24       ` Sergey Organov
2019-06-20 13:24         ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 5/7] serial: imx: set_termios(): preserve RTS state Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-14 13:05     ` Lothar Waßmann
2019-06-14 13:28       ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-14 12:11   ` [PATCH RFC 7/7] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-06-14 12:11     ` Sergey Organov
2019-06-20 14:47 ` [PATCH RFC v1 0/7] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 1/7] serial: imx: fix locking in set_termios() Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 2/7] serial: imx: set_termios(): factor-out 'ucr2' initial value Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 3/7] serial: imx: set_termios(): clarify RTS/CTS bits calculation Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 4/7] serial: imx: set_termios(): preserve RTS state Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 5/7] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-20 14:47   ` [PATCH RFC v1 7/7] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-06-20 14:47     ` Sergey Organov
2019-06-26 10:00   ` [PATCH RFC v1 0/7] serial: imx: fix RTS and RTS/CTS handling Sascha Hauer
2019-06-26 10:00     ` Sascha Hauer
2019-06-26 11:19     ` Sergey Organov
2019-06-26 11:19       ` Sergey Organov
2019-06-26 14:11 ` [PATCH v2 " Sergey Organov
2019-06-26 14:11   ` [PATCH v2 1/7] serial: imx: fix locking in set_termios() Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  5:05     ` Uwe Kleine-König
2019-06-27  5:05       ` Uwe Kleine-König
2019-06-26 14:11   ` [PATCH v2 2/7] serial: imx: set_termios(): factor-out 'ucr2' initial value Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  5:05     ` Uwe Kleine-König
2019-06-27  5:05       ` Uwe Kleine-König
2019-06-26 14:11   ` [PATCH v2 3/7] serial: imx: set_termios(): clarify RTS/CTS bits calculation Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  5:26     ` Uwe Kleine-König
2019-06-27  5:26       ` Uwe Kleine-König
2019-06-27  5:58       ` Sergey Organov
2019-06-26 14:11   ` [PATCH v2 4/7] serial: imx: set_termios(): preserve RTS state Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  5:40     ` Uwe Kleine-König
2019-06-27  5:40       ` Uwe Kleine-König
2019-06-27  6:15       ` Sergey Organov
2019-06-26 14:11   ` [PATCH v2 5/7] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  5:47     ` Uwe Kleine-König
2019-06-27  5:47       ` Uwe Kleine-König
2019-06-27  6:16       ` Sergey Organov
2019-06-26 14:11   ` [PATCH v2 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  6:05     ` Uwe Kleine-König
2019-06-27  6:05       ` Uwe Kleine-König
2019-06-27  7:01       ` Sergey Organov
2019-06-26 14:11   ` [PATCH v2 7/7] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-06-26 14:11     ` Sergey Organov
2019-06-27  6:08     ` Uwe Kleine-König
2019-06-27  6:08       ` Uwe Kleine-König
2019-06-27  7:58       ` Sergey Organov
2019-07-04 13:00 ` [PATCH v3 0/7] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-07-04 13:00   ` [PATCH v3 1/7] serial: imx: fix locking in set_termios() Sergey Organov
2019-07-04 13:00   ` [PATCH v3 2/7] serial: imx: set_termios(): factor-out 'ucr2' initial value Sergey Organov
2019-07-04 13:00   ` [PATCH v3 3/7] serial: imx: set_termios(): clarify RTS/CTS bits calculation Sergey Organov
2019-07-04 13:00     ` Sergey Organov
2019-07-04 13:00   ` [PATCH v3 4/7] serial: imx: set_termios(): preserve RTS state Sergey Organov
2019-07-04 13:00     ` Sergey Organov
2019-07-04 13:00   ` [PATCH v3 5/7] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-07-04 13:00     ` Sergey Organov
2019-07-04 13:00   ` [PATCH v3 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-04 13:00     ` Sergey Organov
2019-07-04 13:00   ` [PATCH v3 7/7] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-07-04 13:00     ` Sergey Organov
2019-07-19  8:47 ` [PATCH v4 0/3] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-07-19  8:47   ` [PATCH v4 1/3] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-07-19  8:47     ` Sergey Organov
2019-07-19  9:11     ` Uwe Kleine-König
2019-07-19  9:11       ` Uwe Kleine-König
2019-07-19 12:18       ` Sergey Organov
2019-07-19 14:31         ` Uwe Kleine-König
2019-07-19 14:31           ` Uwe Kleine-König
2019-07-19 15:13           ` Sergey Organov
2019-07-19 20:19             ` Uwe Kleine-König
2019-07-19 20:19               ` Uwe Kleine-König
2019-07-22  7:42               ` Sergey Organov
2019-07-22  7:51                 ` Uwe Kleine-König
2019-07-22  7:51                   ` Uwe Kleine-König
2019-07-22  9:20                   ` Sergey Organov
2019-07-22  9:46                     ` Uwe Kleine-König
2019-07-22  9:46                       ` Uwe Kleine-König
2019-07-22 13:54                       ` Sergey Organov
2019-07-22 16:47                         ` Uwe Kleine-König
2019-07-22 16:47                           ` Uwe Kleine-König
2019-07-22  9:57                   ` Russell King - ARM Linux admin
2019-07-22  9:57                     ` Russell King - ARM Linux admin
2019-07-22 10:04                     ` Uwe Kleine-König
2019-07-22 10:04                       ` Uwe Kleine-König
2019-07-22 10:17                       ` Russell King - ARM Linux admin
2019-07-22 10:17                         ` Russell King - ARM Linux admin
2019-07-19  8:47   ` [PATCH v4 2/3] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-19  8:47     ` Sergey Organov
2019-07-19  8:47   ` [PATCH v4 3/3] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-07-19  8:47     ` Sergey Organov
2019-07-22  9:22 ` [PATCH v5 0/3] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-07-22  9:22   ` [PATCH v5 1/3] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-07-22  9:54     ` Uwe Kleine-König
2019-07-22  9:54       ` Uwe Kleine-König
2019-07-22 13:57       ` Sergey Organov
2019-07-22 16:20         ` Uwe Kleine-König
2019-07-22 16:20           ` Uwe Kleine-König
2019-07-22 19:09           ` Sergey Organov
2019-07-22  9:22   ` [PATCH v5 2/3] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-22  9:22   ` [PATCH v5 3/3] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-07-22 19:22 ` [PATCH v6 0/3] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-07-22 19:22   ` [PATCH v6 1/3] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-07-22 19:22   ` [PATCH v6 2/3] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-22 20:24     ` Uwe Kleine-König
2019-07-22 20:24       ` Uwe Kleine-König
2019-07-23  9:20       ` Sergey Organov [this message]
2019-07-23  9:49         ` Uwe Kleine-König
2019-07-23  9:49           ` Uwe Kleine-König
2019-07-23 11:16           ` Sergey Organov
2019-07-23 11:30           ` Sergey Organov
2019-07-22 19:22   ` [PATCH v6 3/3] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-07-26 18:52 ` [PATCH v7 0/3] serial: imx: fix RTS and RTS/CTS handling Sergey Organov
2019-07-26 18:52   ` [PATCH v7 1/3] serial: imx: set_termios(): do not enable autoRTS if RTS is unset Sergey Organov
2019-07-26 18:52   ` [PATCH v7 2/3] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-26 18:52     ` Sergey Organov
2019-07-26 18:52   ` [PATCH v7 3/3] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
2019-07-26 18:52     ` Sergey Organov
2019-07-26 19:29     ` Uwe Kleine-König
2019-07-26 19:29       ` Uwe Kleine-König
2019-07-29  9:03       ` Sergey Organov
2019-07-29  9:29         ` Uwe Kleine-König
2019-07-29  9:29           ` Uwe Kleine-König

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=87h87d1509.fsf@osv.gnss.ru \
    --to=sorganov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-serial@vger.kernel.org \
    --cc=s.hauer@pengutronix.de \
    --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.