[2613] in Athena Bugs

home help back first fref pref prev next nref lref last post

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;
  		}

home help back first fref pref prev next nref lref last post