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
next prev parent reply other threads:[~2019-07-23 9:20 UTC|newest]
Thread overview: 94+ 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: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 ` [PATCH RFC 1/7] serial: imx: fix locking in set_termios() 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 ` [PATCH RFC 3/7] serial: imx: set_termios(): clarify RTS/CTS bits calculation 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-20 9:37 ` Sascha Hauer
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 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 ` [PATCH RFC 7/7] serial: imx: get rid of imx_uart_rts_auto() 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 ` [PATCH RFC v1 2/7] serial: imx: set_termios(): factor-out 'ucr2' initial value 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 ` [PATCH RFC v1 4/7] serial: imx: set_termios(): preserve RTS state 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 ` [PATCH RFC v1 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state 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-26 10:00 ` [PATCH RFC v1 0/7] serial: imx: fix RTS and RTS/CTS handling Sascha Hauer
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-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-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-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-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-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-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-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 ` [PATCH v3 4/7] serial: imx: set_termios(): preserve RTS state 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 ` [PATCH v3 6/7] serial: imx: set_mctrl(): correctly restore autoRTS state Sergey Organov
2019-07-04 13:00 ` [PATCH v3 7/7] serial: imx: get rid of imx_uart_rts_auto() 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 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 15:13 ` Sergey Organov
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 9:20 ` Sergey Organov
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 9:57 ` Russell King - ARM Linux admin
2019-07-22 10:04 ` Uwe Kleine-König
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 ` [PATCH v4 3/3] serial: imx: get rid of imx_uart_rts_auto() 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 13:57 ` Sergey Organov
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-23 9:20 ` Sergey Organov [this message]
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 ` [PATCH v7 3/3] serial: imx: get rid of imx_uart_rts_auto() Sergey Organov
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
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$(echo .)com \
--cc=gregkh@linuxfoundation$(echo .)org \
--cc=kernel@pengutronix$(echo .)de \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-imx@nxp$(echo .)com \
--cc=linux-serial@vger$(echo .)kernel.org \
--cc=s.hauer@pengutronix$(echo .)de \
--cc=u.kleine-koenig@pengutronix$(echo .)de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox