[2613] in Athena Bugs
dhu.c, dz.c and modem control
daemon@ATHENA.MIT.EDU (John T Kohl)
Fri Jul 21 10:42:03 1989
Date: Fri, 21 Jul 89 10:41:31 EDT
From: John T Kohl <jtkohl@ATHENA.MIT.EDU>
To: bugs@ATHENA.MIT.EDU
I find that the modem-control on standard Athena kernels doesn't quite
do the right thing; in particular it's not possible to open a
modem-control line without a carrier on it.
These patches allow a user to specify O_NDELAY flag in open() and get an
open line to a modem without the carrier detect asserted.
I also have a patched kermit which passes this flag if a modem is in
use.
files: /sys/vaxuba/dz.c, /sys/vaxuba/dhu.c
*** /sys/vaxuba/dz.c Wed Jan 14 16:15:40 1987
--- dz.c Tue Oct 18 10:47:00 1988
***************
*** 6,16 ****
* @(#)dz.c 7.1 (Berkeley) 6/5/86
*/
#ifndef lint
! static char rcs_id[] = {"$Header: dz.c,v 3.1 86/10/22 14:03:22 tadl Exp $"};
#endif not lint
/*
* RCS Info
! * $Locker: $
*/
#include "dz.h"
--- 6,16 ----
* @(#)dz.c 7.1 (Berkeley) 6/5/86
*/
#ifndef lint
! static char rcs_id[] = {"$Header: dz.c,v 1.1 88/10/18 10:34:19 jtkohl Locked $"};
#endif not lint
/*
* RCS Info
! * $Locker: jtkohl $
*/
#include "dz.h"
***************
*** 175,184 ****
return (EBUSY);
(void) dzmctl(dev, DZ_ON, DMSET);
(void) spl5();
! while ((tp->t_state & TS_CARR_ON) == 0) {
tp->t_state |= TS_WOPEN;
sleep((caddr_t)&tp->t_rawq, TTIPRI);
! }
(void) spl0();
return ((*linesw[tp->t_line].l_open)(dev, tp));
}
--- 175,187 ----
return (EBUSY);
(void) dzmctl(dev, DZ_ON, DMSET);
(void) spl5();
! if (flag & O_NDELAY)
! tp->t_state |= TS_ONDELAY;
! else
! while ((tp->t_state & TS_CARR_ON) == 0) {
tp->t_state |= TS_WOPEN;
sleep((caddr_t)&tp->t_rawq, TTIPRI);
! }
(void) spl0();
return ((*linesw[tp->t_line].l_open)(dev, tp));
}
***************
*** 590,596 ****
tp = &dz_tty[i];
bit = 1<<(i&07);
car = 0;
! if (dzsoftCAR[i>>3]&bit)
car = 1;
else if (dzaddr->dzcsr & DZ_32) {
dzaddr->dzlcs = i&07;
--- 593,599 ----
tp = &dz_tty[i];
bit = 1<<(i&07);
car = 0;
! if ((dzsoftCAR[i>>3]&bit) || (tp->t_state & TS_ONDELAY))
car = 1;
else if (dzaddr->dzcsr & DZ_32) {
dzaddr->dzlcs = i&07;
*** /sys/vaxuba/dhu.c Wed Jan 14 16:15:26 1987
--- dhu.c Tue Oct 18 10:48:23 1988
***************
*** 6,16 ****
* @(#)dhu.c 7.1 (Berkeley) 6/5/86
*/
#ifndef lint
! static char rcs_id[] = {"$Header: dhu.c,v 3.1 86/10/22 14:02:19 tadl Exp $"};
#endif not lint
/*
* RCS Info
! * $Locker: $
*/
/*
--- 6,16 ----
* @(#)dhu.c 7.1 (Berkeley) 6/5/86
*/
#ifndef lint
! static char rcs_id[] = {"$Header: dhu.c,v 1.1 88/10/18 10:25:27 jtkohl Locked $"};
#endif not lint
/*
* RCS Info
! * $Locker: jtkohl $
*/
/*
***************
*** 241,246 ****
--- 241,248 ----
if ((dhumctl(dev, DHU_ON, DMSET) & DHU_CAR) ||
(dhusoftCAR[dhu] & (1<<(unit&0xf))))
tp->t_state |= TS_CARR_ON;
+ if (flag & O_NDELAY)
+ tp->t_state |= (TS_ONDELAY|TS_CARR_ON);
while ((tp->t_state & TS_CARR_ON) == 0) {
tp->t_state |= TS_WOPEN;
sleep((caddr_t)&tp->t_rawq, TTIPRI);
***************
*** 338,344 ****
if (c & DHU_ST_DCD)
(void)(*linesw[tp->t_line].l_modem)(tp, 1);
else if ((dhusoftCAR[dhu] & (1<<line)) == 0 &&
! (*linesw[tp->t_line].l_modem)(tp, 0) == 0)
(void) dhumctl((dhu<<4)|line, DHU_OFF, DMSET);
continue;
}
--- 340,347 ----
if (c & DHU_ST_DCD)
(void)(*linesw[tp->t_line].l_modem)(tp, 1);
else if ((dhusoftCAR[dhu] & (1<<line)) == 0 &&
! !(tp->t_state & TS_ONDELAY) &&
! (*linesw[tp->t_line].l_modem)(tp, 0) == 0)
(void) dhumctl((dhu<<4)|line, DHU_OFF, DMSET);
continue;
}