
                              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/site/iphase-web/?epi_menuItemID=e196f04b4b3b40502f150882e21046a0
      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: 

          Total    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
