From: gemini@geminix.in-berlin.de (Uwe Doering)
Subject: FAS 2.10 async driver, part 1/5
Organization: Private UNIX Site
Date: Mon, 17 Aug 1992 11:37:53 GMT

Submitted-by: gemini@geminix.in-berlin.de
Archive-name: fas210/part01

Hello netlanders,

here is the FAS 2.10 async driver for 286/386 UNIX/Xenix systems.

Some features are new, for instance support for 115200 bps, and several
bugs were fixed. And of course further performance optimizations have been
done to cope with speeds as high as 115200 bps. For further details look
at the RELEASENOTES file.

Here is an excerpt from the README file:

     This is an async driver for 286/386 based unix systems that adds
     several features that are often not supported by vendors drivers.
     It supports

        1.  the NS16550A and i82510 UART chips in full FIFO mode.
        2.  up to 115200 bps with NS16550A.
        3.  built-in modem sharing for input and output.
        4.  modem control on both dialin and dialout devices.
        5.  full and half duplex hardware flow control.
        6.  hardware and software (XON/XOFF) flow control at the same time.
        7.  shared interrupts.
        8.  multiplexed UART registers (HUB-6 card etc.).
        9.  any mix of up to 16 UARTs.
       10.  any I/O address, any IRQ.
       11.  VP/ix, the ISC DOS emulator.


     FAS was successfully tested under the following operating systems:

     Microport UNIX SYSV 3.0
     ISC UNIX 2.0.2, 2.2 & 3.0
     ESIX Rev. C & D
     Bell Tech/Intel UNIX 3.2
     SCO UNIX 3.2.2 & 3.2.4
     SCO XENIX 386 2.3.2
     SCO XENIX 286 2.3.2
     AT&T UNIX 3.2 V 2.1
     SysVr4 UNIX 386 V 2.0 (with tty compatibility drivers)

Enjoy!

      Uwe


#!/bin/sh
# This is fas210, a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 08/17/1992 11:10 UTC by gemini@geminix.in-berlin.de
# Source directory /u/src/private/fas/fas210/tmp
#
# existing files will NOT be overwritten unless -c is specified
# This format requires very little intelligence at unshar time.
# "if test", "cat", "rm", "echo", "true", and "sed" may be needed.
#
# This is part 1 of a multipart archive                                    
# do not concatenate these parts, unpack them in order with /bin/sh        
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#     68 -rw-r--r-- DrivDesc
#  14489 -rw-r--r-- INSTALLATION
#   1496 -rw-r--r-- Makefile.ATT
#   1507 -rw-r--r-- Makefile.BELL
#   1481 -rw-r--r-- Makefile.ESIX
#   1489 -rw-r--r-- Makefile.ISC2
#   1609 -rw-r--r-- Makefile.ISC3
#   1423 -rw-r--r-- Makefile.SCO
#   1431 -rw-r--r-- Makefile.SVR4
#    673 -rw-r--r-- Makefile.X286
#    581 -rw-r--r-- Makefile.X386
#    857 -rw-r--r-- Makefile.uPort
#     26 -rw-r--r-- PATCHLEVEL
#  41566 -rw-r--r-- README
#  40914 -rw-r--r-- RELEASENOTES
#    251 -rw-r--r-- config-ast4
#    255 -rw-r--r-- config-ast4c12
#    253 -rw-r--r-- config-c12
#    255 -rw-r--r-- config-c123
#    253 -rw-r--r-- config-digi8c1
#    251 -rw-r--r-- config-hub6
#  97025 -rw-r--r-- fas.c
#  21392 -rw-r--r-- fas.h
#    136 -rw-r--r-- i_fas-ast4
#    204 -rw-r--r-- i_fas-ast4c12
#     68 -rw-r--r-- i_fas-c12
#    102 -rw-r--r-- i_fas-c123
#    306 -rw-r--r-- i_fas-digi8c1
#    204 -rw-r--r-- i_fas-hub6
#    136 -rw-r--r-- n_fas-ast4
#    204 -rw-r--r-- n_fas-ast4c12
#     68 -rw-r--r-- n_fas-c12
#    102 -rw-r--r-- n_fas-c123
#    306 -rw-r--r-- n_fas-digi8c1
#    204 -rw-r--r-- n_fas-hub6
#     26 -rw-r--r-- s_fas-ast4
#     78 -rw-r--r-- s_fas-ast4c12
#     52 -rw-r--r-- s_fas-c12
#     78 -rw-r--r-- s_fas-c123
#     52 -rw-r--r-- s_fas-digi8c1
#     26 -rw-r--r-- s_fas-hub6
#   5584 -rw-r--r-- space-ast4
#   5803 -rw-r--r-- space-ast4c12
#   5432 -rw-r--r-- space-c12
#   5542 -rw-r--r-- space-c123
#   6073 -rw-r--r-- space-digi8c1
#   5718 -rw-r--r-- space-hub6
#    174 -rwxr-xr-x update_desc
#
if test -r _shar_seq_.tmp; then
	echo 'Must unpack archives in sequence!'
	echo Please unpack part `cat _shar_seq_.tmp` next
	exit 1
fi
# ============= DrivDesc ==============
if test -f 'DrivDesc' -a X"$1" != X"-c"; then
	echo 'x - skipping DrivDesc (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting DrivDesc (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'DrivDesc' &&
XDRIVER=fas
XCLASS=io
XHARDWARE=TRUE
XDESCRIPTION=FAS Serial I/O Driver
SHAR_EOF
true || echo 'restore of DrivDesc failed'
rm -f _shar_wnt_.tmp
fi
# ============= INSTALLATION ==============
if test -f 'INSTALLATION' -a X"$1" != X"-c"; then
	echo 'x - skipping INSTALLATION (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting INSTALLATION (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'INSTALLATION' &&
XInstallation guide for the FAS Final Async Solution driver
X----------------------------------------------------------
X
XTo install this driver you need the manual of your serial card,
Xyour system manuals and a certain knowledge about what actually
Xa serial driver is.
X
XYou have to be user root to compile and install the driver!
X
X
XCompilation phase
X=================
X
XFirst of all you should copy the makefile that matches your system
Xto the file `Makefile'. Make sure that the makefile contains the
Xproper compiler switches, paths and file names for your system.
XYou may also look at `fas.c' and `fas.h' to find out what defines
Xare possible for conditional compilation. In particular, if you
Xdon't link in the original serial driver you might have to uncomment
Xthe `NEED_PUT_GETCHAR' define in `fas.h'. You also may want to
Xuncomment `HAVE_VPIX' in `fas.h' if you have VP/ix support in
Xthe kernel.
X
XAfter that you choose one of the space-xxxxx configuration files
Xthat matches your serial card and copy this to `space.c'. If you
Xdon't find a matching space file you should copy the one that
Xcomes closest to your card to `space.c'.
X
XIn any case you should check the entries in that file against your
Xcard's manual and jumper settings. The space files contain explanations
Xabout what data you have to enter.
X
XIf your `space.c' is filled in properly you simply type `make' to
Xcompile the driver. If you don't get error messages you may begin
Xwith the actual installation. Otherwise you have to find the cause of
Xthe trouble. Some error reasons may be missing include files, macros
Xthat are defined in different include files or missing at all, or you
Xdon't use the standard UNIX [34].X/386 AT&T C compiler. Don't use any
Xother compiler because this may break things. In particular, don't use
Xthe GNU C compiler as it wants to link in some "helpful" routines that
Xaren't in the kernel.
X
XFor SCO Xenix you have to use the Microsoft C compiler because Xenix
Xdoesn't have the AT&T compiler. You will need the ANSI C version of
Xthe Microsoft compiler because the preprocessor of the original
XXenix distribution doesn't understand `#if defined(...)' statements
Xin 386 mode.
X
X
XInstallation phase
X==================
X
XIf you want to have both the original asy (or sio) and the new FAS
Xdriver in the kernel the only restriction is that ports and interrupt
Xvectors can't be shared between the two drivers. Each driver controls
Xits own separate set of ports and IRQs.
X
XuPort: Copy one of the config-xxxxx files to `config'. Check out
X       whether the interrupt vectors in this file reflect the
X       jumper settings on your serial card. Note that an IRQ2 on
X       your card is an interrupt vector of 9. All other IRQ numbers
X       correspond to the vector number, though.
X
X       Next you have to tell the config program to include the new
X       driver at kernel link time. This is done by a line in the file
X       /etc/atconf/systems/system.std. Look for the line containing
X       `asy' followed by an asterisk (`*') and a comment. Create a
X       similar line where `asy' is substituted with `fas'. Add a
X       proper comment. If you don't want to use any ports under the
X       DOS emulator you should insert an asterisk at the beginning
X       of the line that contains the word `asy'. This excludes the
X       asy driver from the kernel. But if you want to have it in the
X       kernel you have to configure it to only use the ports you
X       need under DOS. The remaining ports should be controlled by
X       the FAS driver.
X
X       Now type `make install' and after that you are ready to link
X       a new kernel. Refer to your system manuals on how to do that.
X
X       Before you reboot the new kernel make sure that you create
X       the proper tty device nodes in /dev. But first you should
X       remove all device nodes belonging to the original asy driver
X       that you don't need any more.
X
X       Now create your own tty device nodes that fit your needs.
X       The default device name prefix for the FAS driver is `ttyF'.
X       That is, ttyF00, ttyF01 ... and ttyFM00, ttyFM01 ...
X       You may choose another prefix, but note that some utilities
X       like uustat depend on tty-devices beginning with `tty'!
X
X       The default value for the major device number is 4, and
X       sane values for the minor device numbers are 80 + device #
X       for the dialout node and 208 + device # for the dialin (getty)
X       node. Device # counts from 0 and reflects the actual port number.
X       Refer to the `README' file for a description of the possible minor
X       device numbers.
X
X       Remember to change the inittab file to the new device names.
X       Other files that contain tty-names for some reason should be
X       updated, too (ttytype, Devices etc.).
X
X       After you have booted the new kernel, provided your configuration
X       was correct, you should be able to use the serial devices.
X
X
XISC:   Copy one of the s_fas-xxxxx files to `s_fas'. Make sure
X       that you have a separate line in it for each block of contiguous
X       port addresses assigned to the same interrupt vector (check
X       the jumper settings on your serial card). Each line contains
X       the number of ports bound to that interrupt, the start and
X       end address of the first (lowest or only) port on this interrupt
X       line and other data. Refer to your ISC manuals if you need to
X       change this file. Note that an IRQ2 on your card is an interrupt
X       vector of 9. All other IRQ numbers correspond to the vector
X       number, though.
X
X       Then you copy one of the n_fas-xxxxx files to `n_fas'. This
X       file contains data needed to automatically create tty device
X       nodes at installation time. Things you may want to change are
X       the tty node names and the minor device numbers (last field) for
X       these nodes. Make sure you have a node for every port on your
X       serial card in this file.
X
X       Sane values for the minor device numbers are 80 + device #
X       for the dialout node and 208 + device # for the dialin (getty)
X       node. Device # counts from 0 and reflects the actual port number.
X       Refer to the `README' file for a description of the possible
X       minor device numbers.
X
X       Now copy one of the i_fas-xxxxx files to `i_fas'. This file
X       contains the getty lines for the inittab file which is rebuild
X       every time a new kernel is installed. Make sure that you use the
X       same device names here as in the file `n_fas'.
X
X       Next you have to modify the file /etc/conf/sdevice.d/asy in a way
X       that only those devices are enabled that you want to be controlled
X       by the original `asy' driver. This is done with an `N' in the second
X       column of the corresponding line to disable the port and a `Y' to
X       enable it. But usually you don't need the original driver any more.
X       Therefore, all lines in /etc/conf/sdevice.d/asy should be set to `N'.
X
X       To tell the kernel config program how to link in the FAS driver
X       you have to add the following line to the file /etc/conf/cf.d/mdevice:
X
X       fas	Iocrwi	iHct	fas	0	4	1	16	-1
X
X       The 6th field contains the major device number of the driver. You
X       may change this if it collides with another driver. This is normal
X       as I can't know in advance what major device numbers all the UNIX
X       vendors will use for their drivers.
X
X       All this is in the ISC manuals. Read them carefully.
X
X       Now type `make install' and after that you are ready to link
X       a new kernel. Refer to your system manuals on how to do that.
X
X       You may have to change files that contain tty names to the new
X       device names (ttytype, Devices etc.). Take the names from `n_fas'.
X
X       After you have booted the new kernel, provided your configuration
X       was correct, you should be able to use the serial devices.
X
X
XESIX:  Follow the description for ISC UNIX.
X
X
XBELL:  Follow the description for ISC UNIX.
X
X
XATT:   Follow the description for ISC UNIX.
X
X
XSCO:   Do the same steps as for ISC UNIX. Here are some additional
X       hints:
X
X       The original SCO serial driver is called `sio' instead of
X       `asy'. You need to remove it because it won't coexist peacefully
X       with FAS.
X
X       According to reports from some beta test sites it isn't enough
X       to disable the `sio' driver by setting all lines in
X       /etc/conf/sdevice.d/sio to `N'. Additionally, you have to
X       delete the `sio' entry in /etc/conf/cf.d/mdevice.
X
X       In file `fas.h' you may need to uncomment the `NEED_PUT_GETCHAR'
X       define before you compile the sources.
X
X       For the device nodes you should use SCO's naming conventions because
X       there are some utilities that expect this tty name format. You need
X       to change the names in `i_fas' and `n_fas'. To prevent a collision
X       with the `sio' device node names you need to remove the file
X       `/etc/conf/node.d/sio'.
X
X       You have to compile FAS with the AT&T standard C compiler (rcc,
X       don't use the Microsoft compiler !) and with the `-DSCO'
X       compiler command line flag. The makefile for SCO takes
X       care of this, though.
X
X       After you made all the changes you need to run the
X       `configure' utility to get all the dependencies right. To convince
X       the configure program that it has work to do you should change some
X       parameter and put in the original value afterwards. Be prepared
X       that there may be more tinkering needed to remove `sio' completely
X       because there seem to be SCO UNIX releases where the kernel config
X       and build programs are broken.
X
X       FAS' boot message doesn't contain informations about the interrupt
X       vector assignment. This is because FAS doesn't have, and doesn't need
X       to have any knowledge about interrupt vectors. Only the generic
X       kernel interrupt dispatcher knows about the assignment.
X
X
XXENIX: The installation procedure for Xenix is completely different
X       from the other UNIX flavors.
X
X       In file `fas.h' you may need to uncomment the `NEED_PUT_GETCHAR'
X       define before you compile the sources. After compilation
X       the files `fas.o' and `space.o' have to be copied to the
X       directory `/usr/sys/io/fas'.
X
X       As the `sio' driver won't coexist peacefully with FAS you have
X       to remove the `sio' line from the file `/usr/sys/conf/xenixconf'.
X       Create a new line for `fas' in this file.
X
X       After this you have to modify the file `/usr/sys/conf/master'.
X       There is a line in it that looks like this:
X
X 	sio      4  0577 104    sio  0   0   5    1   7    3     4     33  34  
X
X       You have to comment this out with an asterisk (`*') at the beginning
X       of the line. Directly after this line you need to insert a new line
X       with the following contents (for two ports, one on IRQ3 and one on
X       IRQ4):
X
X	fas      2  0537 104    fas  0   0   5    1   7    3     4     0   0  
X
X       The second column indicates how many interrupt vectors are used by
X       this driver (two vectors in this example). The last four columns
X       contain the corresponding IRQ numbers (in octal !). Unused vectors
X       are set to zero.
X
X       Here is an example for three ports (on IRQ3, IRQ4 and IRQ5):
X
X	fas      3  0537 104    fas  0   0   5    1   7    3     4     5   0  
X
X       And this is for four ports (IRQ3, IRQ4, IRQ5 and IRQ2/9):
X
X	fas      4  0537 104    fas  0   0   5    1   7    3     4     5   31 
X
X       Note that the AT bus interrupts IRQ8 to IRQ15 are mapped to vector
X       30 (octal) to 37 (octal). Therefore, IRQ9 (IRQ2 on the serial card) is
X       vector 31 (octal) in this example.
X
X       Take care that you don't use interrupt vectors that are already
X       assigned to other drivers.
X
X       For further details refer to the master(F) man page.
X
X       Now you have to insert the following line in `/usr/sys/conf/link_xenix'
X       (before the lines with the system libs):
X
X		../io/fas/fas.o ../io/fas/space.o \
X
X       After you made all the changes you might need to run the
X       `/usr/sys/conf/configure' utility to get all the dependencies right.
X       To convince the configure program that it has work to do you should
X       change some parameter and put in the original value afterwards.
X
X       Go to the directory `/usr/sys/conf' and link the new kernel with
X       the `make' command. If all went well, copy the kernel to the
X       root directory.
X
X       You need to create the FAS device nodes manually in the directory
X       `/dev' (with the command `mknod'). You should use SCO's naming
X       conventions because there are some utilities that expect this
X       tty name format. Here is an example how to make the device nodes:
X
X       mknod tty1a c 5 80; mknod tty1A c 5 208
X       mknod tty1b c 5 81; mknod tty1B c 5 209
X
X       Major device number is always `5' (that of the suspended `sio'
X       driver), the minor device numbers are calculated from the README file.
X       For full duplex hardware flow control tty1[a-z] gets the minor
X       device number 80 + device# (device# counted from 0) and tty1[A-Z] gets
X       208 + device#.
X
X       The last thing you have to do before you reboot your system is
X       to check whether you need to make changes to the files that contain
X       the device names for your original `sio' driver (for programs like
X       `getty', `cu' and `uucico').
X
X       After reboot you should remove all device nodes that belong
X       to the now suspended `sio' driver.
X
X
XSVR4:  Do the same steps as for ISC UNIX. Here are some additional
X       hints:
X
X       Currently, FAS is _not_ a STREAMS driver. Therefore, you need
X       the tty compatibility drivers in the kernel. They are named
X       `ttcompat', `clist', and maybe there are even more drivers
X       needed. Please look into your SysVr4 manuals for more
X       informations.
X
X       Neither VP/ix nor DosMerge are supported by FAS under this
X       operating system. This will change when FAS is converted into
X       a STREAMS driver.
X
X
XOther flavors of UNIX
X=====================
X
XCheck out if one of the above installation schemes is similar to the
Xone you need for your system. Make the appropriate changes and try
Xout if it works. If your system is entirely different you have to
Xfind out from your manuals how to install device drivers. But if
Xyou use a UNIX SYSV/386 [34].X you should get it to work eventually.
X
XGood luck.
SHAR_EOF
true || echo 'restore of INSTALLATION failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.ATT ==============
if test -f 'Makefile.ATT' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.ATT (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.ATT (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.ATT' &&
X# Makefile for AT&T UNIX SYS V/386
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKKCONFDIR = /etc/conf/kconfig.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X	$(SHELL) update_desc $(LKKCONFDIR)/description
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.ATT failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.BELL ==============
if test -f 'Makefile.BELL' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.BELL (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.BELL (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.BELL' &&
X# Makefile for Bell Tech/Intel UNIX SYS V/386
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKKCONFDIR = /etc/conf/kconfig.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X	$(SHELL) update_desc $(LKKCONFDIR)/description
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.BELL failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.ESIX ==============
if test -f 'Makefile.ESIX' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.ESIX (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.ESIX (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.ESIX' &&
X# Makefile for ESIX
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKKCONFDIR = /etc/conf/kconfig.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X	$(SHELL) update_desc $(LKKCONFDIR)/description
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.ESIX failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.ISC2 ==============
if test -f 'Makefile.ISC2' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.ISC2 (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.ISC2 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.ISC2' &&
X# Makefile for ISC UNIX 2.x
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKKCONFDIR = /etc/conf/kconfig.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X	$(SHELL) update_desc $(LKKCONFDIR)/description
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.ISC2 failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.ISC3 ==============
if test -f 'Makefile.ISC3' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.ISC3 (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.ISC3 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.ISC3' &&
X# Makefile for ISC UNIX 3.x
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKKCONFDIR = /etc/conf/kconfig.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL -DLOW_INT_LAT $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c DrivDesc s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp DrivDesc $(LKDRVRDIR)/DrivDesc
X	chmod 644 $(LKDRVRDIR)/DrivDesc
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
XDrivDesc:
X	@echo "The file \`DrivDesc' is missing for some reason"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.ISC3 failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.SCO ==============
if test -f 'Makefile.SCO' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.SCO (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.SCO (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.SCO' &&
X# Makefile for SCO UNIX
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = rcc
XCFLAGS = -O -DINKERNEL -D_INKERNEL -DSCO $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.SCO failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.SVR4 ==============
if test -f 'Makefile.SVR4' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.SVR4 (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.SVR4 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.SVR4' &&
X# Makefile for SysVr4 UNIX 386
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/conf/pack.d/fas
XLKSCONFDIR = /etc/conf/sdevice.d
XLKNCONFDIR = /etc/conf/node.d
XLKICONFDIR = /etc/conf/init.d
XLKDEFINES = `test -r /etc/conf/cf.d/defines && cat /etc/conf/cf.d/defines; exit 0`
XDRVRNAME = Driver.o
XCONFNAME = fas
X
XCC = cc
XCFLAGS = -O -DINKERNEL -D_KERNEL -DSVR4 $(LKDEFINES)
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c s_$(CONFNAME) n_$(CONFNAME) i_$(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp s_$(CONFNAME) $(LKSCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKSCONFDIR)/$(CONFNAME)
X	cp n_$(CONFNAME) $(LKNCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKNCONFDIR)/$(CONFNAME)
X	cp i_$(CONFNAME) $(LKICONFDIR)/$(CONFNAME)
X	chmod 644 $(LKICONFDIR)/$(CONFNAME)
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
Xs_$(CONFNAME):
X	@echo "You must copy the proper s_$(CONFNAME)-xxxxx file to \`s_$(CONFNAME)'"
X	@false
X		
Xn_$(CONFNAME):
X	@echo "You must copy the proper n_$(CONFNAME)-xxxxx file to \`n_$(CONFNAME)'"
X	@false
X		
Xi_$(CONFNAME):
X	@echo "You must copy the proper i_$(CONFNAME)-xxxxx file to \`i_$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cat fas.h > $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.SVR4 failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.X286 ==============
if test -f 'Makefile.X286' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.X286 (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.X286 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.X286' &&
X# Makefile for SCO Xenix 286
X
XSHELL = /bin/sh
XLKDRVRDIR = /usr/sys/io/fas
X
XCC = cc
XCFLAGS = -LARGE -O -K -M2em -DM_KERNEL -UM_I8086 -DSYSINFO -DXENIX
XIOCFLAGS = -O -K -M2em -NT io_text -DM_KERNEL -UM_I8086 -DXENIX
X
XOBJS = fas.o space.o
X
Xall:	$(OBJS)
X
Xfas.o:	fas.c fas.h Makefile
X	$(CC) $(IOCFLAGS) -c fas.c
X
Xspace.o:	space.c fas.h Makefile
X	$(CC) $(CFLAGS) -c space.c
X
Xinstall:	all
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)
X	chmod 644 $(LKDRVRDIR)/fas.o
X	cp space.o $(LKDRVRDIR)
X	chmod 644 $(LKDRVRDIR)/space.o
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X
Xclean:
X	rm -f $(OBJS)
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.X286 failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.X386 ==============
if test -f 'Makefile.X386' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.X386 (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.X386 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.X386' &&
X# Makefile for SCO Xenix 386
X
XSHELL = /bin/sh
XLKDRVRDIR = /usr/sys/io/fas
X
XCC = cc
XCFLAGS = -O -DXENIX -DM_KERNEL -M3e -Zp4
X
XOBJS = fas.o space.o
X
Xall:	$(OBJS)
X
Xfas.o:	fas.c fas.h Makefile
X	$(CC) $(CFLAGS) -c fas.c
X
Xspace.o:	space.c fas.h Makefile
X	$(CC) $(CFLAGS) -c space.c
X
Xinstall:	all
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)
X	chmod 644 $(LKDRVRDIR)/fas.o
X	cp space.o $(LKDRVRDIR)
X	chmod 644 $(LKDRVRDIR)/space.o
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X
Xclean:
X	rm -f $(OBJS)
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.X386 failed'
rm -f _shar_wnt_.tmp
fi
# ============= Makefile.uPort ==============
if test -f 'Makefile.uPort' -a X"$1" != X"-c"; then
	echo 'x - skipping Makefile.uPort (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting Makefile.uPort (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'Makefile.uPort' &&
X# Makefile for uPort SYS V/386
X
XSHELL = /bin/sh
XINCLSYS = /usr/include/sys
XLKDRVRDIR = /etc/atconf/modules/fas
XLKCONFDIR = /etc/atconf/modules/fas
XDRVRNAME = fas.o
XCONFNAME = config
X
XCC = cc
XCFLAGS = -O -DINKERNEL -DOPTIM
X
XOBJS = fas.o
X
Xfas.o:		fas.c $(INCLSYS)/fas.h Makefile
X
Xinstall:	fas.o space.c $(CONFNAME)
X	-mkdir $(LKDRVRDIR) 2> /dev/null
X	chmod 755 $(LKDRVRDIR)
X	cp fas.o $(LKDRVRDIR)/$(DRVRNAME)
X	chmod 644 $(LKDRVRDIR)/$(DRVRNAME)
X	cp space.c $(LKDRVRDIR)/space.c
X	chmod 644 $(LKDRVRDIR)/space.c
X	cp $(CONFNAME) $(LKCONFDIR)/$(CONFNAME)
X	chmod 644 $(LKCONFDIR)/$(CONFNAME)
X
Xspace.c:
X	@echo "You must copy the proper space-xxxxx file to \`space.c'"
X	@false
X	
X$(CONFNAME):
X	@echo "You must copy the proper $(CONFNAME)-xxxxx file to \`$(CONFNAME)'"
X	@false
X		
X$(INCLSYS)/fas.h:	fas.h
X	cp fas.h $(INCLSYS)/fas.h
X
Xclean:
X	rm -f fas.o
X
Xclobber:	clean
X
SHAR_EOF
true || echo 'restore of Makefile.uPort failed'
rm -f _shar_wnt_.tmp
fi
# ============= PATCHLEVEL ==============
if test -f 'PATCHLEVEL' -a X"$1" != X"-c"; then
	echo 'x - skipping PATCHLEVEL (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting PATCHLEVEL (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'PATCHLEVEL' &&
Xrelease 2.10 patchlevel 0
SHAR_EOF
true || echo 'restore of PATCHLEVEL failed'
rm -f _shar_wnt_.tmp
fi
# ============= README ==============
if test -f 'README' -a X"$1" != X"-c"; then
	echo 'x - skipping README (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting README (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'README' &&
XREADME file for the FAS Final Async Solution driver
X---------------------------------------------------
X
XWhat is this package:
X
X     This is an async driver for 286/386 based unix systems that adds
X     several features that are often not supported by vendors drivers.
X     It supports
X
X        1.  the NS16550A and i82510 UART chips in full FIFO mode.
X        2.  up to 115200 bps with NS16550A.
X        3.  built-in modem sharing for input and output.
X        4.  modem control on both dialin and dialout devices.
X        5.  full and half duplex hardware flow control.
X        6.  hardware and software (XON/XOFF) flow control at the same time.
X        7.  shared interrupts.
X        8.  multiplexed UART registers (HUB-6 card etc.).
X        9.  any mix of up to 16 UARTs.
X       10.  any I/O address, any IRQ.
X       11.  VP/ix, the ISC DOS emulator.
X
X
X     FAS was successfully tested under the following operating systems:
X
X     Microport UNIX SYSV 3.0
X     ISC UNIX 2.0.2, 2.2 & 3.0
X     ESIX Rev. C & D
X     Bell Tech/Intel UNIX 3.2
X     SCO UNIX 3.2.2 & 3.2.4
X     SCO XENIX 386 2.3.2
X     SCO XENIX 286 2.3.2
X     AT&T UNIX 3.2 V 2.1
X     SysVr4 UNIX 386 V 2.0 (with tty compatibility drivers)
X
X     This driver should work with most of the UNIX SYS V/386 [34].X ports
X     currently available. You can have both this and the original
X     vendor driver in the same kernel (if you really like to, but I
X     wouldn't know why). Each driver controls its own separate set of
X     serial ports. The only restriction here is that any int vector must
X     not be used by more than one of the drivers. The kernel config
X     program will complain otherwise.
X
X------------------------------------------------------------------------
X     
XHow it works:
X
X     DIALIN/DIALOUT ON THE SAME PORT
X     -------------------------------
X
X     This driver supports shared line usage by having two logical
X     devices sharing one physical line. Each logical device has its
X     own name. For example for the first line the names are ttyF00
X     (minor device 0) and ttyFM00 (minor device 192). The ttyF00
X     is used for cu, kermit, and other programs that want to dial
X     out. It ignores the modem signals and just goes to it. The
X     ttyFM00 line is strictly for getty. When getty calls open on
X     ttyFM00 the driver hangs the open until the modem asserts the
X     carrier detect signal and then lets the open complete. If cu
X     opens ttyF00 while getty is waiting for the open to complete
X     the device is given to cu and the getty open must wait for cu
X     to finish and then will again wait for the carrier. If cu
X     tries to open the ttyF00 line while getty has ttyFM00 open cu
X     will get an error. If getty tries to open ttyFM00 while cu has
X     ttyF00 open the getty open will just hang and wait for cu to
X     close the line and then wait for the carrier. To put it simply
X     you should put up a getty on ttyFM00 with a -t 60 and use ttyF00
X     for cu and uucico.
X
X     Note: In the paragraph above the _real_ getty is meant. With
X           FAS you don't need hacks like uugetty to do dialin and
X           dialout on the same port.
X
X     In the previous example ttyF00 had a minor device number of 0 and
X     ttyFM00 one of 192. But there are several other possible minor
X     device numbers for each port.
X
X     The higher bits of the minor device number control the operating
X     mode of the device. The port can't be opened by two or more
X     different minor devices at the same time.
X
X     Minor device numbers are built according to the following
X     description:
X
X        Bitmap:   m m f f x x x x
X
X           `m m' are the mode bits as follows:
X
X            0 0   The carrier signal is totally ignored. With carrier high->low
X                  *no* SIGHUP signal is generated. The device does *not* block
X                  on open if there is no carrier.
X            0 1   After an initial open, the carrier signal is ignored.
X                  However, as soon as there is a low->high carrier transition,
X                  this device switches to carrier controlled behaviour
X                  until the last process has closed the device. This
X                  includes sending a SIGHUP signal on carrier loss.
X                  Note that after a carrier loss an ioctl call with a TCSETA*
X                  command resets the device to ignore the carrier again until
X                  the next carrier low->high. The device does *not* block on
X                  open if there is no carrier.
X            1 0   The device is carrier controlled. It blocks on open if
X                  there is no carrier.
X            1 1   Same as mode `1 0', but a parallel non-blocking open
X                  is possible while waiting for carrier.
X
X           `f f' are the hardware flow control bits as follows:
X
X            0 0   The RTSFLOW/CTSFLOW/CRTSFL termio(7) flags (if available)
X                  enable half duplex (for output direction, only) or full
X                  duplex (for input and output direction) hardware flow
X                  control according to SCO's specifications. If these flags
X                  are not available no hardware flow control is used by
X                  this device.
X            0 1   The device uses full duplex hardware flow control (for
X                  input and output direction).
X            1 0   The device uses half duplex hardware flow control (for
X                  output direction, only).
X            1 1   Same as mode `1 0', but additionally the output buffer
X                  state is signaled to the connected device.
X
X                  Refer to the `space.c' file to determine which port
X                  signals are actually used for that purpose.
X
X           `x x x x'
X                  This is the physical port number. This driver supports
X                  up to 16 ports. If you need more, you should use an
X                  intelligent serial card because more than 16 devices
X                  will eat up to much CPU time with this dumb-port approach.
X
X     - Note: If a device is carrier controlled, this implies the generation
X             of a SIGHUP signal with every carrier high->low. This is of
X             course only true if the CLOCAL flag is *not* set.
X
X             On my own system I prefer a minor device number of `0101xxxx'
X             (80 + device #) for the non-blocking tty node and `1101xxxx'
X             (208 + device #) for the blocking tty node. This gives me
X             the SIGHUP signal on carrier loss and full duplex hardware
X             flow control with both logical devices. Dialout while a dialin
X             open is waiting for the carrier is also possible with this
X             setup. These numbers are the defaults in the `n_fas-*' sample
X             files.
X
X
X     HARDWARE FLOW CONTROL
X     ---------------------
X
X     FAS supports both full and half duplex hardware flow control, using
X     the RS232C RTS/CTS control lines (by default).
X
X     Full duplex flow control is a method to control character flow in
X     both input and output directions while in half duplex flow control
X     mode only the output direction is controlled.
X
X     You can select between full and half duplex flow control via the
X     minor device number of the device. In full duplex mode the RTS line
X     controls the input direction and the CTS line is responsible for the
X     output direction. In half duplex mode RTS tells the connected device
X     whether there is data in the output buffer (optional), and the CTS
X     line has the same function as in full duplex mode.
X
X     Full duplex mode:
X
X          As long as the FAS input buffer hasn't reached a certain
X          threshold the RTS line is set high to signal the connected
X          device that it may send characters. If the input buffer level
X          rises beyond this threshold RTS will go low and the device
X          is supposed to stop sending characters. As soon as there is
X          sufficient space in the input buffer RTS will go high again
X          and the character flow may continue.
X
X          The CTS line works the other way round. If the connected device
X          sets CTS to high the FAS character output is enabled. If CTS is
X          low, the output is stopped. There is a special feature for the
X          CTS part of the handshake. CTS is only looked at if the DSR
X          line is high. If DSR is low or not connected hardware output
X          handshake is disabled, that is, FAS sends characters
X          regardless of the state of CTS.
X
X          This has two advantages. At first, if you switch off a serial
X          device connected to an FAS port with hardware flow control
X          CTS will go low and therefore the output gets blocked. If at
X          this time there are still characters in the output buffer the
X          last process closing this port can't terminate until the
X          buffer has drained.
X
X          But as DSR will also go low if you switch off the device
X          this blocking of the output will be prevented. In short:
X          Hardware output handshake is only used if the connected
X          device sets DSR high, that is, the device is switched on
X          and is ready. So make sure that you keep this in mind when
X          you make serial cables and when you configure your serial
X          devices. DSR must be on if you want CTS handshake.
X
X          The other advantage of this CTS/DSR mechanismn is that you
X          can still connect dumb serial devices to an FAS hardware
X          handshake port using a minimal 3-wire cable. As an unconnected
X          DSR line is automatically low hardware output handshake is
X          disabled, which is just what you wanted in this case.
X
X          The CLOCAL flag doesn't affect this mode.
X
X          Note: If you use a minor device number where hardware handshake
X                is disabled ("First mode" below) you can, if you have
X                SCO UNIX 3.2.4, enable full duplex hardware flow control
X                by setting the CRTSFL termio(7) flag. Note that this only
X                works if neither CTSFLOW/RTSFLOW nor CLOCAL are set.
X
X     Half duplex mode:
X
X          There are actually three half duplex modes selected by
X          the minor device number:
X
X          First mode:
X             If the RTSFLOW termio(7) flag is set and the CLOCAL flag
X             is _not_ set the RTS line is used to signal the connected
X             device that there is data in the output buffer. As long as
X             there is output data to come the RTS line stays high. If
X             the output buffer has drained RTS drops to low until there
X             is more data to be sent to the connected device.
X
X             If the CTSFLOW termio(7) flag is set and the CLOCAL flag
X             is _not_ set the CTS line is used to control the output
X             character flow. This works as in full duplex mode.
X
X             If neither CTSFLOW nor RTSFLOW are set hardware flow control
X             is disabled. But see the description of the CRTSFL termio(7)
X             flag at the end of the full duplex mode section above.
X
X             Note: Setting the CTSFLOW and RTSFLOW flags (and CRTSFL,
X                   if available) only applies to SCO UNIX and Xenix. To
X                   my knowledge, other UNIX flavours don't have these
X                   flags. For them, hardware flow control is always
X                   disabled in this mode.
X
X          Second mode:
X             This mode overrides the RTSFLOW/CTSFLOW/CRTSFL flags and works
X             as if the CTSFLOW flag is set permanently (all UNIX flavours).
X             The CLOCAL flag doesn't affect this mode.
X
X          Third mode:
X             This mode overrides the RTSFLOW/CTSFLOW/CRTSFL flags and works
X             as if both the RTSFLOW and CTSFLOW flags are set permanently
X             (all UNIX flavours). The CLOCAL flag doesn't affect this mode.
X
X     Note: Under SCO UNIX and Xenix the termio(7) RTSFLOW flag is
X           intended for half duplex hardware flow control devices.
X           Setting it when the connected device does _full_ duplex
X           hardware flow control is a configuration error! The RTS
X           signalling for half duplex devices has a completely different
X           meaning than for full duplex devices. So you should either
X           set only CTSFLOW (or CRTSFL, if available), or you should
X           select hardware flow control via the minor device number.
X           If you set RTSFLOW for full duplex hardware flow control
X           devices it is likely that the port won't work. This is in
X           line with SCO's sio driver implementation.
X
X     On UNIX flavours where the RTS_TOG ioctl() command is available
X     the hardware handshake output (RTS by default) can be set under
X     program control. An ioctl() argument of `0' sets the output to
X     low and an argument of `1' sets it to high. However, this only
X     works if the hardware handshake modes as well as DOS mode are
X     disabled. If one of these modes is enabled FAS needs the hardware
X     handshake output for its own flow control. On the other hand,
X     even if one of these modes is in use and FAS gets an RTS_TOG
X     command, the state of the handware handshake output that this
X     command tries to set is stored and the output is set to the
X     state of the last RTS_TOG command as soon as both hardware
X     handshake modes and DOS mode are disabled. In other words,
X     FAS doesn't block the RTS_TOG command if hardware handshake
X     modes or DOS mode are set but rather overrides the hardware
X     handshake output with the appropriate state computed internally.
X
X
X     VP/ix SUPPORT
X     -------------
X
X     FAS allows DOS programs running under VP/ix to access serial
X     ports. You simply need to modify your personal VP/ix configuration
X     file (`vpix.cnf') to tell the DOS emulator which FAS devices to
X     use for COM1 (or COM1MOUSE) and COM2. Note that VP/ix opens
X     these devices at startup time, so you better make sure that
X     the desired devices aren't used by other processes when you
X     start VP/ix as VP/ix wants to use them exclusively.
X
X     There are some special features with the handling of the RTS and
X     DTR lines you should know about. If your DOS program asserts
X     the DTR line this will actually cause action on the modem
X     enable line you configured in `space.c'. Likewise, RTS asserts
X     the half duplex hardware handshake line configured in `space.c'.
X
X     If the used FAS device has full duplex hardware handshake enabled,
X     asserting RTS from DOS actually stops the character flow from FAS
X     to VP/ix. This prevents input buffers of interrupt driven DOS
X     programs from overflowing. FAS, on the other hand, uses its hardware
X     handshake to prevent an overflow of its own input buffer. Therefore,
X     you can use DOS telecommunication programs even at high baud rates
X     without losing characters, provided your DOS programs are
X     configured to use full duplex RTS/CTS flow control.
X
X     All this virtual handling has the advantage that the DOS program
X     doesn't need to know certain details about your actual port setup.
X     Reading the modem status register, on the other hand, doesn't cause
X     any translation of the register value.
X
X     To enable VP/ix support, you have to uncomment the `HAVE_VPIX'
X     define in `fas.h'.
X
X
X     MODIFYING A PORT'S DEFAULT BEHAVIOUR
X     ------------------------------------
X
X     There are some flags that you can "or" into the base port address
X     in fas_port [] (`space.c') for each port independently. You have
X     to relink the kernel before these flags have any effect. Here is
X     a description:
X
X          NO_FIFO
X             Don't use the FIFO in the UART. This marks the port with
X             a `+' character in the init message at boot time. You can
X             use this if the RX and TX FIFO thresholds interfere with
X             your application (especially at low speeds).
X
X          NO_TEST
X             If for some reason a UART doesn't pass the functionallity
X             test FAS makes at boot time you can override the test
X             result and use this port, anyway. However, you do this
X             on your own risk. Don't be surprised if ports get hung
X             or your machine crashes. I won't support FAS installations
X             where this flag is used. It is intended as a last resort.
X
X          HS_57600
X             If you want to have 57600 bps on a port instead of 38400 bps
X             you should set this flag. The 38400 bps setting is replaced
X             with 57600 bps. As UNIX doesn't know this speed `stty'
X             will still report 38400 bps. Don't let this confuse you.
X             FAS hides the 57600 bps speed from the kernel because
X             UNIX doesn't have support for speeds above 38400 bps.
X             Note: The HS_57600 and HS_115200 flags are exclusive, that
X                   is, for a given port you can set either HS_57600 or
X                   HS_115200, but not both at the same time. If both
X                   flags are set the HS_115200 flag overrides HS_57600.
X
X          HS_115200
X             Same as with HS_57600, but the 38400 bps setting is
X             replaced with 115200 bps.
X             Note: At this high speed it is very likely that even an
X                   NS16550A will lose incoming characters because in
X                   many UNIX flavours the worst case interrupt latency
X                   is rather high. It has to be <= 1 ms or you are in
X                   trouble. This problem is caused by the UNIX kernel
X                   design. FAS can't do anything about it. However,
X                   ISC UNIX 3.0 on a 486/33 works fine at this speed.
X		   On the other hand, ISC UNIX 2.x can't handle it.
X
X          NEW_CTSRTS
X             Many "intelligent" serial cards from third party vendors
X             have the meaning of the RTSFLOW termio(7) flag redefined.
X             It is used, together with CTSFLOW, to enable full duplex
X             hardware flow control, whereas SCO introduced RTSFLOW for
X             the more traditional half duplex hardware flow control
X             that is implemented in their sio driver. By default, FAS
X             emulates the sio driver for compatibility reasons. However,
X             if you like to use CTSFLOW/RTSFLOW for full duplex hardware
X             flow control in a way that is compatible with the above
X             mentioned "intelligent" cards, you can do this by setting
X             NEW_CTSRTS. Also, CTSFLOW/RTSFLOW are no longer affected by
X             CLOCAL if NEW_CTSRTS is set. In this mode CTSFLOW enables
X             the output flow control and RTSFLOW enables the input flow
X             control. Both flags are independent from each other.
X
X     All these flags are defined in `fas.h'. For example, if you
X     want to connect one of those new fast modems at 57600 bps to a port
X     on base address 0x3f8 you would write
X
X          0x3f8 | HS_57600
X
X     at the appropriate position in fas_port []. After installing this
X     FAS configuration and relinking the kernel you can use the modem
X     with 57600 bps by just pretending that you have a 38400 bps device.
X     In the modem's internal setup you have to specify 57600 bps, of
X     course. However, note that you can lose incoming characters at
X     this speed if you have a slow mother board.
X
X
X     WHICH SERIAL CARDS ARE SUPPORTED ?
X     ----------------------------------
X
X     The driver supports and has been tested on many serial async
X     dumb port cards. It supports most combinations of shared
X     interrupts. The current driver supports NS16450, NS16550A,
X     um82450 and i82510. 8250 chips are not supported due to various
X     bugs and speed problems in these parts. They have no place in any
X     286/386 or other high performance system. Replace them with one of
X     the supported chips. They are pin-to-pin compatible.
X     
X     ATTENTION: Don't use NS16550 (without the trailing `A') or
X                WD16550 chips, or any chips from a second source
X                manufacturer! They are all buggy and won't work with
X                FAS. Some aren't even recognized by the FIFO auto-
X                detect code in FAS. Therefore, even if they are
X                cheaper, don't buy them.
X                
X     Take a look at the various samples of space-xxxx for details
X     of how to set up for various devices.
X
X     At boot time you will see a status message on the screen with
X     symbols that show the init state of each port. The symbols
X     are as follows:
X
X        -     not defined in the fas_port array
X        ?     can't initialize port
X        1-9   error during test phase indicated by number
X        *     port is initialized (NS16450)
X        +     port is initialized and has FIFOs forced off
X        f     port is initialized and has FIFOs (i82510)
X        F     port is initialized and has FIFOs (NS16550A)
X
X     This is convenient to check whether you have entered the proper port
X     base addresses in `space.c'.
X
X
X     WHICH CARD WILL SUPPORT SHARED INTERRUPTS ?
X     -------------------------------------------
X
X     Many multi-port cards have jumpers or dip switches that let you
X     assign more than one port to the same interrupt (IRQ) line. This alone
X     is _no_ guaranty that they really support shared interrupts! These
X     cards may be designed for the DOS world where you may want two or more
X     serial ports but don't need to run them concurrently, that is, no more
X     than one of those ports assigned to the same IRQ line is allowed to be
X     in use at a time. For DOS this is sufficient as DOS is no multitasking
X     operating system. For UNIX this won't work because in the worst case
X     all serial ports may be in use at the same time.
X
X     The basic problem is that the PC (and AT) I/O bus can't handle shared
X     interrupts itself. This is due to a brain-dead hardware design. Therefore,
X     there must be some special logic on the serial card to provide shared
X     interrupts. And those cards are quite rare (and usually more expensive).
X
X     Therefore, you have the choice to give every port on the card its own
X     IRQ line or to buy a multi-port card that really has shared interrupts.
X     But in the latter case you better ask your vendor twice to make shure
X     that it has this functionality because from the card's manuals it often
X     isn't obvious which type of card it is. One well-known shared interrupts
X     card is the AST 4-port card. There are many compatible clones available
X     that are usually much cheaper than the original. You can even buy
X     AST compatible 8-port cards where two AST 4-port blocks are on the
X     same board.
X
X
X     CABLING
X     -------
X
X     Don't leave unused input lines (CTS, DCD, DSR, RI) open! Due
X     to crosstalking from other lines these input lines might change
X     their logic level, resulting in all sorts of problems (bad
X     throughput, blocked character output etc.). Therefore, you should
X     connect any unused input line to GND (pin 7 on the D-Sub 25 RS232C
X     connector). Additionally, you should use the proper operating
X     mode (via the minor device number) for your application, for
X     instance, if the connected device doesn't have hardware flow
X     control, you should use a mode where hardware flow control is
X     disabled. The same is true for modem control.
X
X     ATTENTION: If you want to connect two UNIX systems (both using
X     FAS) via a null modem cable, and if you want to run a getty
X     on both ends you need to modify the `space.c' file to prevent
X     both gettys talking to each other, wasting valuable CPU time.
X     Remove the `EI_DTR' (or `EI_RTS', depending on your setup) macro
X     for the desired port from the initializer part of the `fas_modem'
X     array. This will cause DTR (or RTS) to be asserted only on
X     dialout. Therefore, the getty at the other end will become alive
X     only if a dialout is in progress.
X
X     Another caveat is connecting a mouse or other pointer device to an
X     FAS port. There are many mice on the market that don't handle the
X     modem and flow control lines in a proper way. Therefore, they should
X     be connected to a port with a minor device number of 0 + device #.
X     This disables any modem or flow control and prevents the device from
X     locking up under certain circumstances.
X
X
X     A WORD ABOUT CHARACTER LOSSES
X     -----------------------------
X
X     If you've experienced character losses with your vendor async
X     driver at high baud rates you shouldn't blame the vendor for
SHAR_EOF
true || echo 'restore of README failed'
fi
echo 'End of fas210 part 1'
echo 'File README is continued in part 2'
echo 2 > _shar_seq_.tmp
exit 0
-- 
Uwe Doering  |  INET : gemini@geminix.in-berlin.de
Berlin       |----------------------------------------------------------------
Germany      |  UUCP : ...!unido!fub!geminix.in-berlin.de!gemini
Newsgroups: comp.unix.sysv386