All of lore.kernel.org
 help / color / mirror / Atom feed
* Revisiting unwanted auto-assertion of DTR & RTS on serial port open
@ 2022-05-26  8:26 Mychaela Falconia
  2022-05-26 11:57 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 2+ messages in thread
From: Mychaela Falconia @ 2022-05-26  8:26 UTC (permalink / raw)
  To: Johan Hovold, Greg Kroah-Hartman, Jiri Slaby, linux-serial, linux-usb

Hello Linux serial and usb-serial maintainers,

I am the hardware engineer who fought here unsuccessfully a year and a
half ago to add Linux support for serial hardware devices in which DTR
and/or RTS modem control signals have been repurposed for non-standard
uses.  On such hw devices it is very often the case that DTR and RTS
may be asserted ONLY when explicitly requested by specialized
userspace applications that go with the hw (by way of TIOCMBIS ioctl,
often followed by a delay and TIOCMBIC to produce a pulse), and NOT at
any other times - in particular, it must be possible to open the
serial port for byte Rx/Tx communication with the target device
_without_ that open syscall unstoppably asserting DTR & RTS right
there and then.  Here is the previous round of discussion:

https://lore.kernel.org/linux-serial/X8iuCXYhOBVMGvXv@localhost/T/

I am now revisiting this issue and making another attempt to get this
capability added to Linux.  The new development is that I have tested
the corresponding feature in FreeBSD, and found it to work correctly -
thus FreeBSD is now the first (and so far only) Unix-style OS in the
world that features an actually working, usable fix for the 1970s UNIX
design bug of unstoppably asserting DTR & RTS on serial port open.
Wouldn't it be good for Linux to follow suit?

The feature in question was added to FreeBSD quite recently:

https://reviews.freebsd.org/D20031

The above link was provided by Johan here a year and a half ago, in
the previous round of this battle.  However, only now I have had a
chance to test FreeBSD's implementation on actual hardware, and
confirm that it actually works as required for signal-repurposing hw
applications.

The diff that appears on the FreeBSD review page above only adds one
new termios flag, CNO_RTSDTR added to cflags.  Johan was proposing
implementing a similar new termios flag in Linux - however, there is a
crucial difference between what Johan was proposing for Linux vs what
is actually implemented in FreeBSD, and it's the difference between
usable and unusable.

FreeBSD's counterpart to Linux ttyUSBx is ttyUx or cuaUx devices.
However, FreeBSD also has .init and .lock devices which don't exist in
Linux, and it's the .init device that makes their newly added
CNO_RTSDTR feature actually work in a usable manner.  If you have a
serial device that absolutely does not tolerate unwanted assertions of
DTR/RTS, not even for one nanosecond, under FreeBSD you can make it
work as follows (using cuaU0 as example here):

Step 1: open /dev/cuaU0.init (the .init suffix is crucial) and perform
the ioctl setting CNO_RTSDTR on this initial-state device.  This step
can be done with stty command.  These .init devices have the special
property that opening one does NOT cause modem control lines to be
asserted, unlike the regular ttyXX or cuaXX device.

Step 2: once the previous step is done, you can open the regular
/dev/cuaU0 device for communication, and no unwanted DTR/RTS assertion
will happen.

Johan's proposal for Linux was superficially similar: he proposed
adding a similar new termios flag.  But because Linux does not have
any counterpart to FreeBSD's .init devices, a termios flag won't work
for this purpose in Linux, it would create a chicken-and-egg problem:
one would need to open the serial port first in order to set the
termios flag, and this very act would cause DTR & RTS to be asserted,
causing irreparable damage: electrocution, setting off explosives, use
your imagination for how these signals could be wired to do highly
damaging actions.

Out of various methods that were discussed here a year and a half ago,
only the sysfs approach would produce a user capability match to what
FreeBSD now provides.  The termios flag idea is a dead end, unless
this community feels that FreeBSD's ttyXX.init and ttyXX.lock should
also be replicated in Linux in full.  Another sensible way would be to
define a new open flag, such as O_NODTR, or reuse/abuse an existing
flag like O_DIRECT which currently does nothing for tty devices - but
people have objected that this approach would be limited to custom
userspace programs, precluding the use of echo, cat etc.

I now argue for the sysfs attribute approach.  Johan had a patch (he
made it, but didn't fight for it because he really preferred the
termios flag instead) adding a /sys/class/tty/ttyXXX/nordy attribute -
setting this attribute to 1 would suppress automatic assertion of DTR
and RTS on serial port open.  One could argue that a better name for
this new sysfs attribute would be something like
/sys/class/tty/ttyXXX/manual_dtr_rts - but I'll be happy no matter how
it's named, as long as the essential functionality remains.

This sysfs attribute would produce the same fundamental workflow as
currently exists in FreeBSD.  In FreeBSD one needs to open
/dev/cuaXX.init, do the necessary ioctl, then close that fd and open
another path (/dev/cuaXX) to do the actual serial communication.  With
the proposed sysfs attribute, the same fundamental workflow will apply
here: open the sysfs path, do the necessary attribute write, then
close the sysfs fd and open /dev/ttyXXX for the actual communication.
In both cases the preliminary step (/dev/cuaXX.init in FreeBSD, sysfs
path in my proposal for Linux) can be done from the shell, or it can
be incorporated into custom userspace sw that works with the custom hw
device.

I can dig up Johan's old patch adding the nordy attribute, update it
for current HEAD, and formally resubmit it - would the maintainers be
agreeable to such course?

Sincerely,
Mychaela Falconia (she/her)
Custom hardware design engineer,
designing hw specifically for use with FOSS operating systems

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Revisiting unwanted auto-assertion of DTR & RTS on serial port open
  2022-05-26  8:26 Revisiting unwanted auto-assertion of DTR & RTS on serial port open Mychaela Falconia
@ 2022-05-26 11:57 ` Greg Kroah-Hartman
  0 siblings, 0 replies; 2+ messages in thread
From: Greg Kroah-Hartman @ 2022-05-26 11:57 UTC (permalink / raw)
  To: Mychaela Falconia; +Cc: Johan Hovold, Jiri Slaby, linux-serial, linux-usb

On Thu, May 26, 2022 at 12:26:03AM -0800, Mychaela Falconia wrote:
> Hello Linux serial and usb-serial maintainers,
> 
> I am the hardware engineer who fought here unsuccessfully a year and a
> half ago to add Linux support for serial hardware devices in which DTR
> and/or RTS modem control signals have been repurposed for non-standard
> uses.  On such hw devices it is very often the case that DTR and RTS
> may be asserted ONLY when explicitly requested by specialized
> userspace applications that go with the hw (by way of TIOCMBIS ioctl,
> often followed by a delay and TIOCMBIC to produce a pulse), and NOT at
> any other times - in particular, it must be possible to open the
> serial port for byte Rx/Tx communication with the target device
> _without_ that open syscall unstoppably asserting DTR & RTS right
> there and then.  Here is the previous round of discussion:
> 
> https://lore.kernel.org/linux-serial/X8iuCXYhOBVMGvXv@localhost/T/
> 
> I am now revisiting this issue and making another attempt to get this
> capability added to Linux.  The new development is that I have tested
> the corresponding feature in FreeBSD, and found it to work correctly -
> thus FreeBSD is now the first (and so far only) Unix-style OS in the
> world that features an actually working, usable fix for the 1970s UNIX
> design bug of unstoppably asserting DTR & RTS on serial port open.
> Wouldn't it be good for Linux to follow suit?
> 
> The feature in question was added to FreeBSD quite recently:
> 
> https://reviews.freebsd.org/D20031
> 
> The above link was provided by Johan here a year and a half ago, in
> the previous round of this battle.  However, only now I have had a
> chance to test FreeBSD's implementation on actual hardware, and
> confirm that it actually works as required for signal-repurposing hw
> applications.
> 
> The diff that appears on the FreeBSD review page above only adds one
> new termios flag, CNO_RTSDTR added to cflags.  Johan was proposing
> implementing a similar new termios flag in Linux - however, there is a
> crucial difference between what Johan was proposing for Linux vs what
> is actually implemented in FreeBSD, and it's the difference between
> usable and unusable.
> 
> FreeBSD's counterpart to Linux ttyUSBx is ttyUx or cuaUx devices.
> However, FreeBSD also has .init and .lock devices which don't exist in
> Linux, and it's the .init device that makes their newly added
> CNO_RTSDTR feature actually work in a usable manner.  If you have a
> serial device that absolutely does not tolerate unwanted assertions of
> DTR/RTS, not even for one nanosecond, under FreeBSD you can make it
> work as follows (using cuaU0 as example here):
> 
> Step 1: open /dev/cuaU0.init (the .init suffix is crucial) and perform
> the ioctl setting CNO_RTSDTR on this initial-state device.  This step
> can be done with stty command.  These .init devices have the special
> property that opening one does NOT cause modem control lines to be
> asserted, unlike the regular ttyXX or cuaXX device.
> 
> Step 2: once the previous step is done, you can open the regular
> /dev/cuaU0 device for communication, and no unwanted DTR/RTS assertion
> will happen.
> 
> Johan's proposal for Linux was superficially similar: he proposed
> adding a similar new termios flag.  But because Linux does not have
> any counterpart to FreeBSD's .init devices, a termios flag won't work
> for this purpose in Linux, it would create a chicken-and-egg problem:
> one would need to open the serial port first in order to set the
> termios flag, and this very act would cause DTR & RTS to be asserted,
> causing irreparable damage: electrocution, setting off explosives, use
> your imagination for how these signals could be wired to do highly
> damaging actions.
> 
> Out of various methods that were discussed here a year and a half ago,
> only the sysfs approach would produce a user capability match to what
> FreeBSD now provides.  The termios flag idea is a dead end, unless
> this community feels that FreeBSD's ttyXX.init and ttyXX.lock should
> also be replicated in Linux in full.  Another sensible way would be to
> define a new open flag, such as O_NODTR, or reuse/abuse an existing
> flag like O_DIRECT which currently does nothing for tty devices - but
> people have objected that this approach would be limited to custom
> userspace programs, precluding the use of echo, cat etc.
> 
> I now argue for the sysfs attribute approach.  Johan had a patch (he
> made it, but didn't fight for it because he really preferred the
> termios flag instead) adding a /sys/class/tty/ttyXXX/nordy attribute -
> setting this attribute to 1 would suppress automatic assertion of DTR
> and RTS on serial port open.  One could argue that a better name for
> this new sysfs attribute would be something like
> /sys/class/tty/ttyXXX/manual_dtr_rts - but I'll be happy no matter how
> it's named, as long as the essential functionality remains.
> 
> This sysfs attribute would produce the same fundamental workflow as
> currently exists in FreeBSD.  In FreeBSD one needs to open
> /dev/cuaXX.init, do the necessary ioctl, then close that fd and open
> another path (/dev/cuaXX) to do the actual serial communication.  With
> the proposed sysfs attribute, the same fundamental workflow will apply
> here: open the sysfs path, do the necessary attribute write, then
> close the sysfs fd and open /dev/ttyXXX for the actual communication.
> In both cases the preliminary step (/dev/cuaXX.init in FreeBSD, sysfs
> path in my proposal for Linux) can be done from the shell, or it can
> be incorporated into custom userspace sw that works with the custom hw
> device.
> 
> I can dig up Johan's old patch adding the nordy attribute, update it
> for current HEAD, and formally resubmit it - would the maintainers be
> agreeable to such course?

Please rebase and resubmit it and we will be glad to consider it.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-05-26 11:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-26  8:26 Revisiting unwanted auto-assertion of DTR & RTS on serial port open Mychaela Falconia
2022-05-26 11:57 ` Greg Kroah-Hartman

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.