*BSD News Article 18059


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!elroy.jpl.nasa.gov!usc!howland.reston.ans.net!xlink.net!math.fu-berlin.de!fub!max.IN-Berlin.DE!not-for-mail
From: berry@max.IN-Berlin.DE (Stefan Behrens)
Newsgroups: comp.os.386bsd.questions
Subject: Re: Slcompress -- enforce HW flow-control, patch
Date: 7 Jul 1993 20:59:25 +0200
Organization: Private Site in Berlin/Germany
Lines: 68
Message-ID: <21f6er$2v7@max.in-berlin.de>
References: <Felipe.28.740578609@utopia.hacktic.nl> <C9I9Hs.ABv@news.cso.uiuc.edu> <hastyC9IFM3.F9u@netcom.com> <BLYMN.93Jul6170320@mallee.awadi.com.au>
NNTP-Posting-Host: max.in-berlin.de
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Summary: patch for /sys/i386/isa/sio.c to enforce hardware flow-control

In article <BLYMN.93Jul6170320@mallee.awadi.com.au> blymn@awadi.com.au (Brett Lymn) writes:
>If you use a v.42bis modem I would *strongly* recommend that you
>ensure that the flow control is enabled on the serial port (use stty
>crtscts to do this).  I did modify slattach to add a flag to enable
>the hardware flow control on the port.

I also recommend the usage of hardware flow-control on the serial port.
But why change every application to support it. I simply hacked the
kernel to force usage of hardware flow-control configurable with the
minor device nuber.
The following patch against 386BSD0.1 pk0.2.4 will enable hw-flow-control
if the bit 6 of the minor number is set. The minor numbers should look
like this:
crw-rw----    1 uucp     dialer    28, 193 Jul  7 20:07 /dev/cua01
crw-------    1 root     wheel     28,  65 Jul  6 18:12 /dev/ttyd1


*** /sys/i368/isa/sio.c.pk0.2.4	Wed Jun 30 21:12:06 1993
--- /sys/i368/isa/sio.c	Wed Jun 30 23:09:38 1993
***************
*** 79,87 ****
  #define	UNIT(x)		(minor(x))	/* XXX */
  #else /* COM_BIDIR */
! #define COM_UNITMASK    0x7f
  #define COM_CALLOUTMASK 0x80
  
  #define UNIT(x)         (minor(x) & COM_UNITMASK)
  #define CALLOUT(x)      (minor(x) & COM_CALLOUTMASK)
  #endif /* COM_BIDIR */
  
--- 79,90 ----
  #define	UNIT(x)		(minor(x))	/* XXX */
  #else /* COM_BIDIR */
! #define COM_UNITMASK    0x3f
  #define COM_CALLOUTMASK 0x80
+ /* force hardware flow control with bit 6 of minor number */
+ #define COM_HWFLOWMASK 0x40
  
  #define UNIT(x)         (minor(x) & COM_UNITMASK)
  #define CALLOUT(x)      (minor(x) & COM_CALLOUTMASK)
+ #define HWFLOW(x)       (minor(x) & COM_HWFLOWMASK)
  #endif /* COM_BIDIR */
  
***************
*** 1297,1300 ****
--- 1300,1319 ----
  	iobase = com->iobase;
  	s = spltty();
+ 	if (HWFLOW(tp->t_dev)) {
+ 		/*
+ 		 * Force usage of hardware flow control.
+ 		 * Do it twice (for tp and for t) although
+ 		 * comparam() is called from sioopen() with
+ 		 * comparam(tp, &tp->t_termios).
+ 		 * But maybe it will be called from somewhere
+ 		 * else via the t_param switch member of
+ 		 * struct tty?
+ 		 */
+ 		tp->t_cflag |= CRTS_IFLOW|CCTS_OFLOW|CRTSCTS;
+ 		t->c_cflag |= CRTS_IFLOW|CCTS_OFLOW|CRTSCTS;	/* once again */
+ 		/* do not use software flow control */
+ 		tp->t_iflag &= ~(IXON|IXOFF|IXANY);
+ 		t->c_iflag &= ~(IXON|IXOFF|IXANY);	/* once again */
+ 	}
  	if (divisor == 0) {
  		(void) commctl(com, 0, DMSET);	/* hang up line */
-- 
Stefan (berry@max.IN-Berlin.DE)