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/x86/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/serial/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
