
                              READ ME FISRT
		  ATM (i)Chip IA Linux Driver Source
--------------------------------------------------------------------------------
                     Read This Before You Begin!
--------------------------------------------------------------------------------

Description
-----------

This is the README file for the Interphase PCI ATM (i)Chip IA Linux driver 
source release.

The features and limitations of this driver are as follows:
    - A single VPI (VPI value of 0) is supported.
    - Supports 4K VCs for the server board (with 512K control memory) and 1K 
      VCs for the client board (with 128K control memory).
    - UBR, ABR and CBR service categories are supported.
    - Only AAL5 is supported. 
    - Supports setting of PCR on the VCs. 
    - Multiple adapters in a system are supported.
    - All variants of Interphase ATM PCI (i)Chip adapter cards are supported, 
      including x575 (OC3, control memory 128K , 512K and packet memory 128K, 
      512K and 1M), x525 (UTP25) and x531 (DS3 and E3). See 
           http://www.iphase.com/products/ClassSheet.cfm?ClassID=ATM 
      for details.
    - Only x86 platforms are supported.
    - SMP is supported.


Before You Start
---------------- 


Installation
------------

1. Installing the adapters in the system
   To install the ATM adapters in the system, follow the steps below.
       a. Login as root.
       b. Shut down the system and power off the system.
       c. Install one or more ATM adapters in the system.
       d. Connect each adapter to a port on an ATM switch. The green 'Link' 
          LED on the front panel of the adapter will be on if the adapter is 
          connected to the switch properly when the system is powered up.
       e. Power on and boot the system.

2. [ Removed ]

3. Rebuild kernel with ABR support
   [ a. and b. removed ]
    c. Reconfigure the kernel, choose the Interphase ia driver through "make 
       menuconfig" or "make xconfig".
    d. Rebuild the kernel, loadable modules and the atm tools. 
    e. Install the new built kernel and modules and reboot.

4. Load the adapter hardware driver (ia driver) if it is built as a module
       a. Login as root.
       b. Change directory to /lib/modules/<kernel-version>/atm.
       c. Run "insmod suni.o;insmod iphase.o"
	  The yellow 'status' LED on the front panel of the adapter will blink 
          while the driver is loaded in the system.
       d. To verify that the 'ia' driver is loaded successfully, run the 
          following command:

              cat /proc/atm/devices

          If the driver is loaded successfully, the output of the command will 
          be similar to the following lines:

              Itf Type    ESI/"MAC"addr AAL(TX,err,RX,err,drop) ...
              0   ia      xxxxxxxxx  0 ( 0 0 0 0 0 )  5 ( 0 0 0 0 0 )

          You can also check the system log file /var/log/messages for messages
          related to the ATM driver.

5. Ia Driver Configuration 

5.1 Configuration of adapter buffers
    The (i)Chip boards have 3 different packet RAM size variants: 128K, 512K and
    1M. The RAM size decides the number of buffers and buffer size. The default 
    size and number of buffers are set as following: 

          Totol    Rx RAM   Tx RAM   Rx Buf   Tx Buf   Rx buf   Tx buf
         RAM size   size     size     size     size      cnt      cnt
         --------  ------   ------   ------   ------   ------   ------
           128K      64K      64K      10K      10K       6        6
           512K     256K     256K      10K      10K      25       25
             1M     512K     512K      10K      10K      51       51

       These setting should work well in most environments, but can be
       changed by typing the following command: 
 
           insmod <IA_DIR>/ia.o IA_RX_BUF=<RX_CNT> IA_RX_BUF_SZ=<RX_SIZE> \
                   IA_TX_BUF=<TX_CNT> IA_TX_BUF_SZ=<TX_SIZE> 
       Where:
            RX_CNT = number of receive buffers in the range (1-128)
            RX_SIZE = size of receive buffers in the range (48-64K)
            TX_CNT = number of transmit buffers in the range (1-128)
            TX_SIZE = size of transmit buffers in the range (48-64K)

            1. Transmit and receive buffer size must be a multiple of 4.
            2. Care should be taken so that the memory required for the
               transmit and receive buffers is less than or equal to the
               total adapter packet memory.   

5.2 Turn on ia debug trace

    When the ia driver is built with the CONFIG_ATM_IA_DEBUG flag, the driver 
    can provide more debug trace if needed. There is a bit mask variable, 
    IADebugFlag, which controls the output of the traces. You can find the bit 
    map of the IADebugFlag in iphase.h. 
    The debug trace can be turn on through the insmod command line option, for 
    example, "insmod iphase.o IADebugFlag=0xffffffff" can turn on all the debug 
    traces together with loading the driver.

6. Ia Driver Test Using ttcp_atm and PVC

   For the PVC setup, the test machines can either be connected back-to-back or 
   through a switch. If connected through the switch, the switch must be 
   configured for the PVC(s).

   a. For UBR test:
      At the test machine intended to receive data, type:
         ttcp_atm -r -a -s 0.100 
      At the other test machine, type:
         ttcp_atm -t -a -s 0.100 -n 10000
      Run "ttcp_atm -h" to display more options of the ttcp_atm tool.
   b. For ABR test:
      It is the same as the UBR testing, but with an extra command option:
         -Pabr:max_pcr=<xxx>
         where:
             xxx = the maximum peak cell rate, from 170 - 353207.
         This option must be set on both the machines.
   c. For CBR test:
      It is the same as the UBR testing, but with an extra command option:
         -Pcbr:max_pcr=<xxx>
         where:
             xxx = the maximum peak cell rate, from 170 - 353207.
         This option may only be set on the transmit machine.


OUTSTANDING ISSUES
------------------



Contact Information
-------------------

     Customer Support:
         United States:	Telephone:	(214) 654-5555
     			Fax:		(214) 654-5500
			E-Mail:		intouch@iphase.com
	 Europe:	Telephone:	33 (0)1 41 15 44 00
			Fax:		33 (0)1 41 15 12 13
     World Wide Web:	http://www.iphase.com
     Anonymous FTP:	ftp.iphase.com
