All of lore.kernel.org
 help / color / mirror / Atom feed
* RE: Linux-2.4.20 modem control
@ 2003-03-17 23:07 Ed Vance
  2003-03-18  0:33 ` Richard B. Johnson
  0 siblings, 1 reply; 21+ messages in thread
From: Ed Vance @ 2003-03-17 23:07 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Mon, Mar 17, 2003 at 1:33 PM, Richard B. Johnson wrote:
> 
> On Mon, 17 Mar 2003, Ed Vance wrote:
> 
> > On Mon, Mar 17, 2003 at 8:19 AM, Richard B. Johnson wrote:
> > > Hello any tty gurus,
> > >
> > > If a modem is connected to /dev/ttyS0 and a getty 
> (actually agetty)
> > > is associated with that device, one can log-in using that modem.
> > >
> > > This is how we've operated for many years. But, Linux 
> version 2.4.20
> > > presents a new problem.
> > >
> > > When a logged-in caller logs out, it is mandatory for the modem
> > > to disconnect. This has previously been done automatically when
> > > the terminal is closed. The closing of the tasks file-descriptors
> > > will eventually call tty_hangup() and the modem would (previously)
> > > hang up.
> > >
> > > Something has changed so that the hang-up sequence 
> doesn't happen if
> > > agetty has already opened the terminal for another possible
> > > connection.
> > > It used to be that the caller, calling close(), did not 
> get control
> > > back until the modem had been hung up. This prevented 
> another agetty
> > > from opening that terminal for I/O because the previous 
> task had not
> > > completed its exit procedure until the terminal was hung up.
> > >
> > > Now, the hang-up sequence appears to be queued. It can (and does)
> > > happen after the previous terminal owner has expired and another
> > > owner has opened the device. This makes /dev/ttyS0 
> useless for remote
> > > log-ins.
> > >
> > > It needs to be, that a 'close()' of a terminal, 
> configured as a modem,
> > > cannot return to the caller until after the DTR has been 
> lowered, and
> > > preferably, after waiting a few hundred milliseconds. 
> Without this,
> > > once logged in, the modem will never disconnect so a new caller
> > > can't log in.
> > >
> > > With faster machines, it is not sufficient to just lower DTR. One
> > > needs to lower DTR and then wait. This is because the next task
> > > can open that terminal in a few hundred microseconds, raising
> > > DTR again. This is not enough time for the modem to hang 
> up because
> > > there is "glitch-filtering" on all modem-control leads. 
> The hang-up
> > > event won't even be seen by the modem.
> > >
> > > So, either the modem control needs to be reverted to its previous
> > > functionality or `agetty` needs to hang up its terminal when it
> > > starts, which seems backwards. In other words, the user of kernel
> > > services should not have to compensate for a defect in the logic
> > > of that service.
> > >
> > > I have temporarily "fixed" this problem by modifying `agetty`.
> > > Can the kernel please be fixed instead?
> > >
> > Hi Richard,
> >
> > Is the HUPCL cflags option (termio hang-up-on-close) asserted
> > when the close happens?
> >
> > The "drop DTR and then wait a bit" behavior is requested by the
> > HUPCL termio option. Otherwise, if CLOCAL is off, it is supposed
> > to just drop DTR with no guarantee of holding it low for any
> > particular amount of time.
> >
> > cheers,
> > Ed
> 
> Well I didn't want to have to re-write agetty. Upon boot, before
> init spawns an agetty, I initialize the modem in 'raw' mode like
> this......
> 
>     /*
>      * Set to dumb RAW mode with no echo and no character 
> interpretation.
>      */
>     memset(&io_mod, 0x00, sizeof(io_mod));      /* bzero() is 
> obsolete  */
>     io_mod.c_cflag     = B57600|CS8|CREAD|CLOCAL;
>     io_mod.c_iflag     = IGNBRK|IGNPAR;
>     io_mod.c_cc[VMIN]  = (cc_t) 1;
>     io_mod.c_cc[VTIME] = (cc_t) 1;
>     if(ioctl(fd, TCSETS, &io_mod) < 0)
>     {
>         fprintf(stderr, "ioctl of %s failed setting 
> parameters (%s)\n",
>                          argv[1], strerror(errno));
>         ERROR_EXIT;
>     }
>     (void)hangup(fd, buffer);
> 
> Hangup just sets the baud-rate to B0 while keeing all other parameters
> the same. It waits a second, then restores the c_clag variables.
> 
> This program then sends initialization strings to the modem, reads
> any echo, then closes. This makes sure that agetty gets connected
> to a modem that will actually answer a call. Agetty sleeps in open()
> because it attempts to open the terminal in blocking mode. That way
> agetty will only wake up after a connection is made. Agetty then
> sets its own parameters which include HUPCL Line 1116:
>            tp->c_cflag = CS8|HUPCL|CREAD| op->speeds[FIRST_SPEED];
> Later on, it sets CRTSCTS when it examines the device parameters.
> 
> So, although my initialization program didn't set HUPCL, agetty did.
> 
> The problem is that agetty execs (does not fork and exec) so 
> it becomes
> /bin/login. /bin/login execs and becomes /bin/bash. There is no
> program waiting to restore modem parameters. When /bin/bash exits,
> /sbin/init will spawn another agetty task and the process repeats.
> If, when /bin/bash exits, the close doesn't lower DTR long enough,
> the modem will not hang up.
> 
Hi Richard,

What you are doing looks just fine.

As long as HUPCL is set when the close happens, DTR will drop. There are
delays that are enforced in both open and close when a second process is
blocked opening a closing port. Of course, that would not be your case,
because the open does not occur until the closing process terminates. In a
quick look, I didn't see an enforced close-to-open delay for your case.
Maybe I missed something. I am looking at 2.4.18 Red Hat -3. I didn't notice
a patch to serial.c in the 2.4.19 or 2.4.20 changelog that would affect
this. There are some weird calculations that appear to scale the close_delay
field value based on HZ.

Which was the last "working" kernel rev that you used?

Did you switch to a faster CPU?

Are you using any "low latency" patches?

Did the HZ value change between the last rev that worked and 2.4.20? 

What HZ value are you running with? 

Cheers,
Ed

---------------------------------------------------------------- 
Ed Vance              edv (at) macrolink (dot) com
Macrolink, Inc.       1500 N. Kellogg Dr  Anaheim, CA  92807
----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: Linux-2.4.20 modem control
@ 2003-03-21  0:45 Ed Vance
  2003-03-21 12:24 ` Richard B. Johnson
  0 siblings, 1 reply; 21+ messages in thread
From: Ed Vance @ 2003-03-21  0:45 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Thu, Mar 20, 2003 at 2:14 PM, Richard B. Johnson wrote:
> 
> [SNIPPED...]
> 
> This patch works (no other promises).
> 
> --- linux-2.4.20/drivers/char/serial.c.orig	2003-03-20 
> 16:21:55.000000000 -0500
> +++ linux-2.4.20/drivers/char/serial.c	2003-03-20 
> 16:31:23.000000000 -0500
> @@ -1538,8 +1538,12 @@
>  	serial_out(info, UART_LCR, serial_inp(info, UART_LCR) & 
> ~UART_LCR_SBC);
> 
>  	if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
> -		info->MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
> -	serial_outp(info, UART_MCR, info->MCR);
> +        {
> +           serial_outp(info, UART_MCR,info->MCR & 
> ~(UART_MCR_DTR|UART_MCR_RTS));
> +           set_current_state(TASK_INTERRUPTIBLE);
> +           schedule_timeout(HZ/2);              /* 
> Disconnect modem  */
> +        }
> +	serial_outp(info, UART_MCR, info->MCR);  /* Don't keep it off */
> 
>  	/* disable FIFO's */
>  	serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO |
> 
Hi Richard,

I'm not sure it's a Good Thing(tm) to call schedule_timeout() with 
the interrupts disabled. The shutdown function is framed by 
save_flags();cli and restore_flags(). Don't know exactly what the 
downside of that could be. 

Is the re-enable of DTR actually necessary to get agetty to work? 
DTR is supposed to stay off until the next open. 

Still, if it works for you, it works. 

Cheers,
Ed

---------------------------------------------------------------- 
Ed Vance              edv (at) macrolink (dot) com
Macrolink, Inc.       1500 N. Kellogg Dr  Anaheim, CA  92807
----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: Linux-2.4.20 modem control
@ 2003-03-19 23:50 Ed Vance
  2003-03-20  1:18 ` Richard B. Johnson
  0 siblings, 1 reply; 21+ messages in thread
From: Ed Vance @ 2003-03-19 23:50 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Wed, Mar 19, 2003 2:32 PM, Richard B. Johnson wrote:
> On Wed, 19 Mar 2003, Ed Vance wrote:
> [SNIPPED...]
> 
> > Hi Richard,
> >
> > The following patch to serial.c in 2.4.20 is a brute-force addition
> > of a hang-up delay of 0.5 sec just before close returns to the user,
> > if the hupcl flag is set. Please try this to determine if there are
> > any other issues with the remote login. If it works, I'll write a
> > better patch that does not duplicate other delays, etc.
> >
> > Cheers,
> > Ed
> >
> 
> Well, it's the "right church, but wrong pew". As soon as anything
> closes STDIO_FILENO, **bang** the modem hangs up. NotGood(tm)!
> So as long as I just execute the shell which was exec'ed ...
> getty...rlogin...bash never called close. However, `ls` on my
> machine is `color-ls` when it calls exit(0)... well you get
> the idea! I can log in, but can't actually execute anything that
> terminates, closing STDIO_FILENO...
> 
> 
Hi Richard,

Bummer! Do you think that each of those events was a "last close" 
of the port? Doesn't bash hold the port open while the `color-ls` 
runs? 

Since the path only delays (doesn't change modem control), these 
closes must have been hidden by quick reopens. Does the unmodified 
agetty set the baud rate to zero to hangup, or was that your change? 
I was thinking that I could move the delay to the code that 
disconnects when baud rate zero is set. 

your thoughts?

Cheers,
Ed

---------------------------------------------------------------- 
Ed Vance              edv (at) macrolink (dot) com
Macrolink, Inc.       1500 N. Kellogg Dr  Anaheim, CA  92807
----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: Linux-2.4.20 modem control
@ 2003-03-19 16:51 Ed Vance
  2003-03-19 17:03 ` Richard B. Johnson
  2003-03-19 22:32 ` Richard B. Johnson
  0 siblings, 2 replies; 21+ messages in thread
From: Ed Vance @ 2003-03-19 16:51 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Mon, Mar 17, 2003 at 8:19 AM, Richard B. Johnson wrote:
> 
> If a modem is connected to /dev/ttyS0 and a getty (actually agetty)
> is associated with that device, one can log-in using that modem.
> 
> This is how we've operated for many years. But, Linux version 2.4.20
> presents a new problem.
> 
> When a logged-in caller logs out, it is mandatory for the modem
> to disconnect. This has previously been done automatically when
> the terminal is closed. The closing of the tasks file-descriptors
> will eventually call tty_hangup() and the modem would (previously)
> hang up.
> 
> Something has changed so that the hang-up sequence doesn't happen if
> agetty has already opened the terminal for another possible 
> connection.
> It used to be that the caller, calling close(), did not get control
> back until the modem had been hung up. This prevented another agetty
> from opening that terminal for I/O because the previous task had not
> completed its exit procedure until the terminal was hung up.
> 
> Now, the hang-up sequence appears to be queued. It can (and does)
> happen after the previous terminal owner has expired and another
> owner has opened the device. This makes /dev/ttyS0 useless for remote
> log-ins.
> 
> It needs to be, that a 'close()' of a terminal, configured as a modem,
> cannot return to the caller until after the DTR has been lowered, and
> preferably, after waiting a few hundred milliseconds. Without this,
> once logged in, the modem will never disconnect so a new caller
> can't log in.
> 
> With faster machines, it is not sufficient to just lower DTR. One
> needs to lower DTR and then wait. This is because the next task
> can open that terminal in a few hundred microseconds, raising
> DTR again. This is not enough time for the modem to hang up because
> there is "glitch-filtering" on all modem-control leads. The hang-up
> event won't even be seen by the modem.
> 
> So, either the modem control needs to be reverted to its previous
> functionality or `agetty` needs to hang up its terminal when it
> starts, which seems backwards. In other words, the user of kernel
> services should not have to compensate for a defect in the logic
> of that service.
> 
> I have temporarily "fixed" this problem by modifying `agetty`.
> Can the kernel please be fixed instead?
> 
Hi Richard,

The following patch to serial.c in 2.4.20 is a brute-force addition 
of a hang-up delay of 0.5 sec just before close returns to the user, 
if the hupcl flag is set. Please try this to determine if there are 
any other issues with the remote login. If it works, I'll write a 
better patch that does not duplicate other delays, etc.

Cheers,
Ed

diff -urN -X dontdiff.txt linux-2.4.20/drivers/char/serial.c
patched-2.4.20/drivers/char/serial.c
--- linux-2.4.20/drivers/char/serial.c	Thu Nov 28 15:53:12 2002
+++ patched-2.4.20/drivers/char/serial.c	Tue Mar 18 16:03:43 2003
@@ -2848,6 +2848,10 @@
 		tty->driver.flush_buffer(tty);
 	if (tty->ldisc.flush_buffer)
 		tty->ldisc.flush_buffer(tty);
+	if (tty->termios->c_cflag & HUPCL) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(HZ/2);	/* 0.5 sec to disconnect modem */
+	}
 	tty->closing = 0;
 	info->event = 0;
 	info->tty = 0;

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: Linux-2.4.20 modem control
@ 2003-03-18  0:34 Ed Vance
  0 siblings, 0 replies; 21+ messages in thread
From: Ed Vance @ 2003-03-18  0:34 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Mon, Mar 17, 2003 at 4:34 PM, Richard B. Johnson wrote:
> 
> On Mon, 17 Mar 2003, Ed Vance wrote:
> [SNIPPED...]
> 
> > >
> > Hi Richard,
> >
> > What you are doing looks just fine.
> >
> > As long as HUPCL is set when the close happens, DTR will 
> > drop. There are delays that are enforced in both open and 
> > close when a second process is blocked opening a closing 
> > port. Of course, that would not be your case, because the 
> > open does not occur until the closing process terminates. 
> > In a quick look, I didn't see an enforced close-to-open 
> > delay for your case. Maybe I missed something. I am 
> > looking at 2.4.18 Red Hat -3. I didn't notice a patch to 
> > serial.c in the 2.4.19 or 2.4.20 changelog that would 
> > affect this. There are some weird calculations that 
> > appear to scale the close_delay field value based on HZ.
> >
> > Which was the last "working" kernel rev that you used?
> >
> > Did you switch to a faster CPU?
> >
> > Are you using any "low latency" patches?
> >
> > Did the HZ value change between the last rev that worked 
> > and 2.4.20?
> >
> > What HZ value are you running with?
> >
> > Cheers,
> > Ed
> 
> I'm now using 2.4.20. The previous version was 2.2.18 (yikes)!
> I just transferred my old hard disks (SCSI) to a new system and
> everything worked fine, so I decided to upgrade to a later more
> stable kernel. I use this system to be my own internet provider
> and I am, in fact, logged in running a ppp link from home over
> the modem at this time. I had to modify `agetty` to make it
> work with the new kernel and a faster CPU (1.2 GHz, 330 MHz
> front-side bus, Tyan Thunder-II).
> 
> The agetty code is attached. It hangs up before it sleeps for
> a new connection because when the previous process terminates,
> init instantly starts a new instance, the modem never hangs up
> even though, possibly the DTR was lowered for that instant.
> 
> Cheers,
> Dick Johnson
> Penguin : Linux version 2.4.20 on an i686 machine (797.90 BogoMips).
> Why is the government concerned about the lunatic fringe? 
> Think about it.
> 
Hi,

Yep. 2.2.18 was a good one.
I'll look at it.

Cheers,
Ed

---------------------------------------------------------------- 
Ed Vance              edv (at) macrolink (dot) com
Macrolink, Inc.       1500 N. Kellogg Dr  Anaheim, CA  92807
----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 21+ messages in thread
* RE: Linux-2.4.20 modem control
@ 2003-03-17 20:07 Ed Vance
  2003-03-17 21:33 ` Richard B. Johnson
  0 siblings, 1 reply; 21+ messages in thread
From: Ed Vance @ 2003-03-17 20:07 UTC (permalink / raw)
  To: 'root@chaos.analogic.com'; +Cc: Linux kernel

On Mon, Mar 17, 2003 at 8:19 AM, Richard B. Johnson wrote:
> Hello any tty gurus,
> 
> If a modem is connected to /dev/ttyS0 and a getty (actually agetty)
> is associated with that device, one can log-in using that modem.
> 
> This is how we've operated for many years. But, Linux version 2.4.20
> presents a new problem.
> 
> When a logged-in caller logs out, it is mandatory for the modem
> to disconnect. This has previously been done automatically when
> the terminal is closed. The closing of the tasks file-descriptors
> will eventually call tty_hangup() and the modem would (previously)
> hang up.
> 
> Something has changed so that the hang-up sequence doesn't happen if
> agetty has already opened the terminal for another possible 
> connection.
> It used to be that the caller, calling close(), did not get control
> back until the modem had been hung up. This prevented another agetty
> from opening that terminal for I/O because the previous task had not
> completed its exit procedure until the terminal was hung up.
> 
> Now, the hang-up sequence appears to be queued. It can (and does)
> happen after the previous terminal owner has expired and another
> owner has opened the device. This makes /dev/ttyS0 useless for remote
> log-ins.
> 
> It needs to be, that a 'close()' of a terminal, configured as a modem,
> cannot return to the caller until after the DTR has been lowered, and
> preferably, after waiting a few hundred milliseconds. Without this,
> once logged in, the modem will never disconnect so a new caller
> can't log in.
> 
> With faster machines, it is not sufficient to just lower DTR. One
> needs to lower DTR and then wait. This is because the next task
> can open that terminal in a few hundred microseconds, raising
> DTR again. This is not enough time for the modem to hang up because
> there is "glitch-filtering" on all modem-control leads. The hang-up
> event won't even be seen by the modem.
> 
> So, either the modem control needs to be reverted to its previous
> functionality or `agetty` needs to hang up its terminal when it
> starts, which seems backwards. In other words, the user of kernel
> services should not have to compensate for a defect in the logic
> of that service.
> 
> I have temporarily "fixed" this problem by modifying `agetty`.
> Can the kernel please be fixed instead?
> 
Hi Richard,

Is the HUPCL cflags option (termio hang-up-on-close) asserted 
when the close happens? 

The "drop DTR and then wait a bit" behavior is requested by the 
HUPCL termio option. Otherwise, if CLOCAL is off, it is supposed 
to just drop DTR with no guarantee of holding it low for any 
particular amount of time. 

cheers,
Ed

---------------------------------------------------------------- 
Ed Vance              edv (at) macrolink (dot) com
Macrolink, Inc.       1500 N. Kellogg Dr  Anaheim, CA  92807
----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 21+ messages in thread
* Linux-2.4.20 modem control
@ 2003-03-17 16:19 Richard B. Johnson
  2003-03-17 19:56 ` Jamie Lokier
  0 siblings, 1 reply; 21+ messages in thread
From: Richard B. Johnson @ 2003-03-17 16:19 UTC (permalink / raw)
  To: Linux kernel


Hello any tty gurus,

If a modem is connected to /dev/ttyS0 and a getty (actually agetty)
is associated with that device, one can log-in using that modem.

This is how we've operated for many years. But, Linux version 2.4.20
presents a new problem.

When a logged-in caller logs out, it is mandatory for the modem
to disconnect. This has previously been done automatically when
the terminal is closed. The closing of the tasks file-descriptors
will eventually call tty_hangup() and the modem would (previously)
hang up.

Something has changed so that the hang-up sequence doesn't happen if
agetty has already opened the terminal for another possible connection.
It used to be that the caller, calling close(), did not get control
back until the modem had been hung up. This prevented another agetty
from opening that terminal for I/O because the previous task had not
completed its exit procedure until the terminal was hung up.

Now, the hang-up sequence appears to be queued. It can (and does)
happen after the previous terminal owner has expired and another
owner has opened the device. This makes /dev/ttyS0 useless for remote
log-ins.

It needs to be, that a 'close()' of a terminal, configured as a modem,
cannot return to the caller until after the DTR has been lowered, and
preferably, after waiting a few hundred milliseconds. Without this,
once logged in, the modem will never disconnect so a new caller
can't log in.

With faster machines, it is not sufficient to just lower DTR. One
needs to lower DTR and then wait. This is because the next task
can open that terminal in a few hundred microseconds, raising
DTR again. This is not enough time for the modem to hang up because
there is "glitch-filtering" on all modem-control leads. The hang-up
event won't even be seen by the modem.

So, either the modem control needs to be reverted to its previous
functionality or `agetty` needs to hang up its terminal when it
starts, which seems backwards. In other words, the user of kernel
services should not have to compensate for a defect in the logic
of that service.

I have temporarily "fixed" this problem by modifying `agetty`.
Can the kernel please be fixed instead?


Cheers,
Dick Johnson
Penguin : Linux version 2.4.20 on an i686 machine (797.90 BogoMips).
Why is the government concerned about the lunatic fringe? Think about it.


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

end of thread, other threads:[~2003-03-23 22:50 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-03-17 23:07 Linux-2.4.20 modem control Ed Vance
2003-03-18  0:33 ` Richard B. Johnson
2003-03-18 18:34   ` Steve Lee
2003-03-18 19:17     ` Richard B. Johnson
2003-03-18 19:34       ` Steve Lee
2003-03-18 20:03         ` Richard B. Johnson
2003-03-20 18:51       ` Krzysztof Halasa
  -- strict thread matches above, loose matches on Subject: below --
2003-03-21  0:45 Ed Vance
2003-03-21 12:24 ` Richard B. Johnson
2003-03-19 23:50 Ed Vance
2003-03-20  1:18 ` Richard B. Johnson
2003-03-20 22:13   ` Richard B. Johnson
2003-03-19 16:51 Ed Vance
2003-03-19 17:03 ` Richard B. Johnson
2003-03-19 22:32 ` Richard B. Johnson
2003-03-18  0:34 Ed Vance
2003-03-17 20:07 Ed Vance
2003-03-17 21:33 ` Richard B. Johnson
2003-03-17 16:19 Richard B. Johnson
2003-03-17 19:56 ` Jamie Lokier
2003-03-17 21:12   ` Richard B. Johnson

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.