NOTE: This is an unmaintained driver.  It is not guaranteed to work due to
changes made in the tty layer in 2.6.  If you wish to take over maintenance of
this driver, contact Michael Warfield <mhw@wittsend.com>.

Changelog:
----------
11-01-2001:	Original Document

10-29-2004:	Minor misspelling & format fix, update status of driver.
		James Nelson <james4765@gmail.com>

Computone Intelliport II/Plus Multiport Serial Driver
-----------------------------------------------------

Release Notes For Linux Kernel 2.2 and higher.
These notes are for the drivers which have already been integrated into the
kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4.

Version: 1.2.14
Date: 11/01/2001
Historical Author: Andrew Manison <amanison@america.net>
Primary Author: Doug McNash
Support: support@computone.com
Fixes and Updates: Mike Warfield <mhw@wittsend.com>

This file assumes that you are using the Computone drivers which are
integrated into the kernel sources.  For updating the drivers or installing
drivers into kernels which do not already have Computone drivers, please
refer to the instructions in the README.computone file in the driver patch.


1. INTRODUCTION

This driver supports the entire family of Intelliport II/Plus controllers
with the exception of the MicroChannel controllers.  It does not support
products previous to the Intelliport II.

This driver was developed on the v2.0.x Linux tree and has been tested up
to v2.4.14; it will probably not work with earlier v1.X kernels,.


2. QUICK INSTALLATION

Hardware - If you have an ISA card, find a free interrupt and io port. 
		   List those in use with `cat /proc/interrupts` and 
		   `cat /proc/ioports`.  Set the card dip switches to a free 
		   address.  You may need to configure your BIOS to reserve an
		   irq for an ISA card.  PCI and EISA parameters are set
		   automagically.  Insert card into computer with the power off 
		   before or after drivers installation.

	Note the hardware address from the Computone ISA cards installed into
		the system.  These are required for editing ip2.c or editing
		/etc/modprobe.conf, or for specification on the modprobe
		command line.

	Note that the /etc/modules.conf should be used for older (pre-2.6)
		kernels.

Software -

Module installation:

a) Determine free irq/address to use if any (configure BIOS if need be)
b) Run "make config" or "make menuconfig" or "make xconfig"
   Select (m) module for CONFIG_COMPUTONE under character
   devices.  CONFIG_PCI and CONFIG_MODULES also may need to be set.
c) Set address on ISA cards then:
   edit /usr/src/linux/drivers/char/ip2.c if needed 
	or
   edit /etc/modprobe.conf if needed (module).
	or both to match this setting.
d) Run "make modules"
e) Run "make modules_install"
f) Run "/sbin/depmod -a"
g) install driver using `modprobe ip2 <options>` (options listed below)
h) run ip2mkdev (either the script below or the binary version)


Kernel installation:

a) Determine free irq/address to use if any (configure BIOS if need be)
b) Run "make config" or "make menuconfig" or "make xconfig"
   Select (y) kernel for CONFIG_COMPUTONE under character
   devices.  CONFIG_PCI may need to be set if you have PCI bus.
c) Set address on ISA cards then:
	   edit /usr/src/linux/drivers/char/ip2.c  
           (Optional - may be specified on kernel command line now)
d) Run "make zImage" or whatever target you prefer.
e) mv /usr/src/linux/arch/i386/boot/zImage to /boot.
f) Add new config for this kernel into /etc/lilo.conf, run "lilo"
	or copy to a floppy disk and boot from that floppy disk.
g) Reboot using this kernel
h) run ip2mkdev (either the script below or the binary version)

Kernel command line options:

When compiling the driver into the kernel, io and irq may be
compiled into the driver by editing ip2.c and setting the values for
io and irq in the appropriate array.  An alternative is to specify
a command line parameter to the kernel at boot up.

        ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3

Note that this order is very different from the specifications for the
modload parameters which have separate IRQ and IO specifiers.

The io port also selects PCI (1) and EISA (2) boards.

        io=0    No board
        io=1    PCI board
        io=2    EISA board
        else    ISA board io address

You only need to specify the boards which are present.

        Examples:

                2 PCI boards:

                        ip2=1,0,1,0

                1 ISA board at 0x310 irq 5:

                        ip2=0x310,5

This can be added to and "append" option in lilo.conf similar to this:

        append="ip2=1,0,1,0"


3. INSTALLATION

Previously, the driver sources were packaged with a set of patch files
to update the character drivers' makefile and configuration file, and other 
kernel source files. A build script (ip2build) was included which applies 
the patches if needed, and build any utilities needed.
What you receive may be a single patch file in conventional kernel
patch format build script. That form can also be applied by
running patch -p1 < ThePatchFile.  Otherwise run ip2build.
 
The driver can be installed as a module (recommended) or built into the 
kernel. This is selected as for other drivers through the `make config`
command from the root of the Linux source tree. If the driver is built 
into the kernel you will need to edit the file ip2.c to match the boards 
you are installing. See that file for instructions. If the driver is 
installed as a module the configuration can also be specified on the
modprobe command line as follows:

	modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4

where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11,
12,15) and addr1-4 are the base addresses for up to four controllers. If 
the irqs are not specified the driver uses the default in ip2.c (which 
selects polled mode). If no base addresses are specified the defaults in 
ip2.c are used. If you are autoloading the driver module with kerneld or
kmod the base addresses and interrupt number must also be set in ip2.c
and recompile or just insert and options line in /etc/modprobe.conf or both.
The options line is equivalent to the command line and takes precedence over
what is in ip2.c. 

/etc/modprobe.conf sample:
	options ip2 io=1,0x328 irq=1,10
	alias char-major-71 ip2
	alias char-major-72 ip2
	alias char-major-73 ip2

The equivalent in ip2.c:

static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 };
static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 }; 

The equivalent for the kernel command line (in lilo.conf):

        append="ip2=1,1,0x328,10"


Note:	Both io and irq should be updated to reflect YOUR system.  An "io"
	address of 1 or 2 indicates a PCI or EISA card in the board table.
	The PCI or EISA irq will be assigned automatically.

Specifying an invalid or in-use irq will default the driver into
running in polled mode for that card.  If all irq entries are 0 then
all cards will operate in polled mode.

If you select the driver as part of the kernel run :

	make zlilo (or whatever you do to create a bootable kernel)

If you selected a module run :

	make modules && make modules_install

The utility ip2mkdev (see 5 and 7 below) creates all the device nodes
required by the driver.  For a device to be created it must be configured
in the driver and the board must be installed. Only devices corresponding
to real IntelliPort II ports are created. With multiple boards and expansion
boxes this will leave gaps in the sequence of device names. ip2mkdev uses
Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and
cuf0 - cuf255 for callout devices.


4. USING THE DRIVERS

As noted above, the driver implements the ports in accordance with Linux
conventions, and the devices should be interchangeable with the standard
serial devices. (This is a key point for problem reporting: please make
sure that what you are trying do works on the ttySx/cuax ports first; then 
tell us what went wrong with the ip2 ports!)

Higher speeds can be obtained using the setserial utility which remaps 
38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed. 
Intelliport II installations using the PowerPort expansion module can
use the custom speed setting to select the highest speeds: 153,600 bps,
230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for
custom baud rate configuration is fixed at 921,600 for cards/expansion
modules with ST654's and 115200 for those with Cirrus CD1400's.  This
corresponds to the maximum bit rates those chips are capable.  
For example if the baud base is 921600 and the baud divisor is 18 then
the custom rate is 921600/18 = 51200 bps.  See the setserial man page for
complete details. Of course if stty accepts the higher rates now you can
use that as well as the standard ioctls().


5. ip2mkdev and assorted utilities...

Several utilities, including the source for a binary ip2mkdev utility are
available under .../drivers/char/ip2.  These can be build by changing to
that directory and typing "make" after the kernel has be built.  If you do
not wish to compile the binary utilities, the shell script below can be
cut out and run as "ip2mkdev" to create the necessary device files.  To
use the ip2mkdev script, you must have procfs enabled and the proc file
system mounted on /proc.


6. NOTES

This is a release version of the driver, but it is impossible to test it
in all configurations of Linux. If there is any anomalous behaviour that 
does not match the standard serial port's behaviour please let us know.


7. ip2mkdev shell script

Previously, this script was simply attached here.  It is now attached as a
shar archive to make it easier to extract the script from the documentation.
To create the ip2mkdev shell script change to a convenient directory (/tmp
works just fine) and run the following command:

	unshar Documentation/computone.txt
		(This file)

You should now have a file ip2mkdev in your current working directory with
permissions set to execute.  Running that script with then create the
necessary devices for the Computone boards, interfaces, and ports which
are present on you system at the time it is run.


#!/bin/sh
# This is a shell archive (produced by GNU sharutils 4.2.1).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 2001-10-29 10:32 EST by <mhw@alcove.wittsend.com>.
# Source directory was `/home2/src/tmp'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode       name
# ------ ---------- ------------------------------------------
#   4251 -rwxr-xr-x ip2mkdev
#
save_IFS="${IFS}"
IFS="${IFS}:"
gettext_dir=FAILED
locale_dir=FAILED
first_param="$1"
for dir in $PATH
do
  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
     && ($dir/gettext --version >/dev/null 2>&1)
  then
    set `$dir/gettext --version 2>&1`
    if test "$3" = GNU
    then
      gettext_dir=$dir
    fi
  fi
  if test "$locale_dir" = FAILED && test -f $dir/shar \
     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
  then
    locale_dir=`$dir/shar --print-text-domain-dir`
  fi
done
IFS="$save_IFS"
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
then
  echo=echo
else
  TEXTDOMAINDIR=$locale_dir
  export TEXTDOMAINDIR
  TEXTDOMAIN=sharutils
  export TEXTDOMAIN
  echo="$gettext_dir/gettext -s"
fi
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
  shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
  shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
  shar_touch='touch -am $3$4$5$6$2 "$8"'
else
  shar_touch=:
  echo
  $echo 'WARNING: not restoring timestamps.  Consider getting and'
  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
#
if mkdir _sh17581; then
  $echo 'x -' 'creating lock directory'
else
  $echo 'failed to create lock directory'
  exit 1
fi
# ============= ip2mkdev ==============
if test -f 'ip2mkdev' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'ip2mkdev' '(file already exists)'
else
  $echo 'x -' extracting 'ip2mkdev' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'ip2mkdev' &&
#!/bin/sh -
#
#	ip2mkdev
#
#	Make or remove devices as needed for Computone Intelliport drivers
#
#	First rule!  If the dev file exists and you need it, don't mess
#	with it.  That prevents us from screwing up open ttys, ownership
#	and permissions on a running system!
#
#	This script will NOT remove devices that no longer exist if their
#	board or interface box has been removed.  If you want to get rid
#	of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*"
#	before running this script.  Running this script will then recreate
#	all the valid devices.
#
#	Michael H. Warfield
#	/\/\|=mhw=|\/\/
#	mhw@wittsend.com
#
#	Updated 10/29/2000 for version 1.2.13 naming convention
#		under devfs.	/\/\|=mhw=|\/\/
#
#	Updated 03/09/2000 for devfs support in ip2 drivers. /\/\|=mhw=|\/\/
#
X
if test -d /dev/ip2 ; then
#	This is devfs mode...  We don't do anything except create symlinks
#	from the real devices to the old names!
X	cd /dev
X	echo "Creating symbolic links to devfs devices"
X	for i in `ls ip2` ; do
X		if test ! -L ip2$i ; then
X			# Remove it incase it wasn't a symlink (old device)
X			rm -f ip2$i
X			ln -s ip2/$i ip2$i
X		fi
X	done
X	for i in `( cd tts ; ls F* )` ; do
X		if test ! -L tty$i ; then
X			# Remove it incase it wasn't a symlink (old device)
X			rm -f tty$i
X			ln -s tts/$i tty$i
X		fi
X	done
X	for i in `( cd cua ; ls F* )` ; do
X		DEVNUMBER=`expr $i : 'F\(.*\)'`
X		if test ! -L cuf$DEVNUMBER ; then
X			# Remove it incase it wasn't a symlink (old device)
X			rm -f cuf$DEVNUMBER
X			ln -s cua/$i cuf$DEVNUMBER
X		fi
X	done
X	exit 0
fi
X
if test ! -f /proc/tty/drivers
then
X	echo "\
Unable to check driver status.
Make sure proc file system is mounted."
X
X	exit 255
fi
X
if test ! -f /proc/tty/driver/ip2
then
X	echo "\
Unable to locate ip2 proc file.
Attempting to load driver"
X
X	if /sbin/insmod ip2
X	then
X		if test ! -f /proc/tty/driver/ip2
X		then
X			echo "\
Unable to locate ip2 proc file after loading driver.
Driver initialization failure or driver version error.
"
X		exit 255
X		fi
X	else
X		echo "Unable to load ip2 driver."
X		exit 255
X	fi
fi
X
# Ok...  So we got the driver loaded and we can locate the procfs files.
# Next we need our major numbers.
X
TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tt/!d' -e 's/.*tt[^ 	]*[ 	]*\([0-9]*\)[ 	]*.*/\1/' < /proc/tty/drivers`
CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu[^ 	]*[ 	]*\([0-9]*\)[ 	]*.*/\1/' < /proc/tty/drivers`
BRDMAJOR=`sed -e '/^Driver: /!d' -e 's/.*IMajor=\([0-9]*\)[ 	]*.*/\1/' < /proc/tty/driver/ip2`
X
echo "\
TTYMAJOR = $TTYMAJOR
CUAMAJOR = $CUAMAJOR
BRDMAJOR = $BRDMAJOR
"
X
# Ok...  Now we should know our major numbers, if appropriate...
# Now we need our boards and start the device loops.
X
grep '^Board [0-9]:' /proc/tty/driver/ip2 | while read token number type alltherest
do
X	# The test for blank "type" will catch the stats lead-in lines
X	# if they exist in the file
X	if test "$type" = "vacant" -o "$type" = "Vacant" -o "$type" = ""
X	then
X		continue
X	fi
X
X	BOARDNO=`expr "$number" : '\([0-9]\):'`
X	PORTS=`expr "$alltherest" : '.*ports=\([0-9]*\)' | tr ',' ' '`
X	MINORS=`expr "$alltherest" : '.*minors=\([0-9,]*\)' | tr ',' ' '`
X
X	if test "$BOARDNO" = "" -o "$PORTS" = ""
X	then
#	This may be a bug.  We should at least get this much information
X		echo "Unable to process board line"
X		continue
X	fi
X
X	if test "$MINORS" = ""
X	then
#	Silently skip this one.  This board seems to have no boxes
X		continue
X	fi
X
X	echo "board $BOARDNO: $type ports = $PORTS; port numbers = $MINORS"
X
X	if test "$BRDMAJOR" != ""
X	then
X		BRDMINOR=`expr $BOARDNO \* 4`
X		STSMINOR=`expr $BRDMINOR + 1`
X		if test ! -c /dev/ip2ipl$BOARDNO ; then
X			mknod /dev/ip2ipl$BOARDNO c $BRDMAJOR $BRDMINOR
X		fi
X		if test ! -c /dev/ip2stat$BOARDNO ; then
X			mknod /dev/ip2stat$BOARDNO c $BRDMAJOR $STSMINOR
X		fi
X	fi
X
X	if test "$TTYMAJOR" != ""
X	then
X		PORTNO=$BOARDBASE
X
X		for PORTNO in $MINORS
X		do
X			if test ! -c /dev/ttyF$PORTNO ; then
X				# We got the hardware but no device - make it
X				mknod /dev/ttyF$PORTNO c $TTYMAJOR $PORTNO
X			fi	
X		done
X	fi
X
X	if test "$CUAMAJOR" != ""
X	then
X		PORTNO=$BOARDBASE
X
X		for PORTNO in $MINORS
X		do
X			if test ! -c /dev/cuf$PORTNO ; then
X				# We got the hardware but no device - make it
X				mknod /dev/cuf$PORTNO c $CUAMAJOR $PORTNO
X			fi	
X		done
X	fi
done
X
Xexit 0
SHAR_EOF
  (set 20 01 10 29 10 32 01 'ip2mkdev'; eval "$shar_touch") &&
  chmod 0755 'ip2mkdev' ||
  $echo 'restore of' 'ip2mkdev' 'failed'
  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'ip2mkdev:' 'MD5 check failed'
cb5717134509f38bad9fde6b1f79b4a4  ip2mkdev
SHAR_EOF
  else
    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'ip2mkdev'`"
    test 4251 -eq "$shar_count" ||
    $echo 'ip2mkdev:' 'original size' '4251,' 'current size' "$shar_count!"
  fi
fi
rm -fr _sh17581
exit 0
