
NOTE
----

This document was contributed by Cirrus Logic for kernel 2.2.5.  This version
has been updated for 2.3.48 by Andrew Morton <andrewm@uow.edu.au>

Cirrus make a copy of this driver available at their website, as
described below.  In general, you should use the driver version which
comes with your Linux distribution.



CIRRUS LOGIC LAN CS8900/CS8920 ETHERNET ADAPTERS
Linux Network Interface Driver ver. 2.00 <kernel 2.3.48>
===============================================================================
 

TABLE OF CONTENTS

1.0 CIRRUS LOGIC LAN CS8900/CS8920 ETHERNET ADAPTERS
    1.1 Product Overview 
    1.2 Driver Description
	1.2.1 Driver Name
	1.2.2 File in the Driver Package
    1.3 System Requirements
    1.4 Licensing Information

2.0 ADAPTER INSTALLATION and CONFIGURATION
    2.1 CS8900-based Adapter Configuration
    2.2 CS8920-based Adapter Configuration 

3.0 LOADING THE DRIVER AS A MODULE

4.0 COMPILING THE DRIVER
    4.1 Compiling the Driver as a Loadable Module
    4.2 Compiling the driver to support memory mode
    4.3 Compiling the driver to support Rx DMA 
    4.4 Compiling the Driver into the Kernel

5.0 TESTING AND TROUBLESHOOTING
    5.1 Known Defects and Limitations
    5.2 Testing the Adapter
        5.2.1 Diagnostic Self-Test
        5.2.2 Diagnostic Network Test
    5.3 Using the Adapter's LEDs
    5.4 Resolving I/O Conflicts

6.0 TECHNICAL SUPPORT
    6.1 Contacting Cirrus Logic's Technical Support
    6.2 Information Required Before Contacting Technical Support
    6.3 Obtaining the Latest Driver Version
    6.4 Current maintainer
    6.5 Kernel boot parameters


1.0 CIRRUS LOGIC LAN CS8900/CS8920 ETHERNET ADAPTERS
===============================================================================


1.1 PRODUCT OVERVIEW

The CS8900-based ISA Ethernet Adapters from Cirrus Logic follow 
IEEE 802.3 standards and support half or full-duplex operation in ISA bus 
computers on 10 Mbps Ethernet networks.  The adapters are designed for operation 
in 16-bit ISA or EISA bus expansion slots and are available in 
10BaseT-only or 3-media configurations (10BaseT, 10Base2, and AUI for 10Base-5 
or fiber networks).  

CS8920-based adapters are similar to the CS8900-based adapter with additional 
features for Plug and Play (PnP) support and Wakeup Frame recognition.  As 
such, the configuration procedures differ somewhat between the two types of 
adapters.  Refer to the "Adapter Configuration" section for details on 
configuring both types of adapters.


1.2 DRIVER DESCRIPTION

The CS8900/CS8920 Ethernet Adapter driver for Linux supports the Linux
v2.3.48 or greater kernel.  It can be compiled directly into the kernel
or loaded at run-time as a device driver module.

1.2.1 Driver Name: cs89x0

1.2.2 Files in the Driver Archive:

The files in the driver at Cirrus' website include:

  readme.txt         - this file
  build              - batch file to compile cs89x0.c.
  cs89x0.c           - driver C code
  cs89x0.h           - driver header file
  cs89x0.o           - pre-compiled module (for v2.2.5 kernel)
  config/Config.in   - sample file to include cs89x0 driver in the kernel.
  config/Makefile    - sample file to include cs89x0 driver in the kernel.
  config/Space.c     - sample file to include cs89x0 driver in the kernel.



1.3 SYSTEM REQUIREMENTS

The following hardware is required:

   * Cirrus Logic LAN (CS8900/20-based) Ethernet ISA Adapter   

   * IBM or IBM-compatible PC with:
     * An 80386 or higher processor
     * 16 bytes of contiguous IO space available between 210h - 370h
     * One available IRQ (5,10,11,or 12 for the CS8900, 3-7,9-15 for CS8920).

   * Appropriate cable (and connector for AUI, 10BASE-2) for your network
     topology.

The following software is required:

* LINUX kernel version 2.3.48 or higher

   * CS8900/20 Setup Utility (DOS-based)

   * LINUX kernel sources for your kernel (if compiling into kernel)

   * GNU Toolkit (gcc and make) v2.6 or above (if compiling into kernel 
     or a module)   



1.4 LICENSING INFORMATION

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, version 1.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
more details.

For a full copy of the GNU General Public License, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.



2.0 ADAPTER INSTALLATION and CONFIGURATION
===============================================================================

Both the CS8900 and CS8920-based adapters can be configured using parameters 
stored in an on-board EEPROM. You must use the DOS-based CS8900/20 Setup 
Utility if you want to change the adapter's configuration in EEPROM.  

When loading the driver as a module, you can specify many of the adapter's 
configuration parameters on the command-line to override the EEPROM's settings 
or for interface configuration when an EEPROM is not used. (CS8920-based 
adapters must use an EEPROM.) See Section 3.0 LOADING THE DRIVER AS A MODULE.

Since the CS8900/20 Setup Utility is a DOS-based application, you must install 
and configure the adapter in a DOS-based system using the CS8900/20 Setup 
Utility before installation in the target LINUX system.  (Not required if 
installing a CS8900-based adapter and the default configuration is acceptable.)
     

2.1 CS8900-BASED ADAPTER CONFIGURATION

CS8900-based adapters shipped from Cirrus Logic have been configured 
with the following "default" settings:

  Operation Mode:      Memory Mode
  IRQ:                 10
  Base I/O Address:    300
  Memory Base Address: D0000
  Optimization:	       DOS Client
  Transmission Mode:   Half-duplex
  BootProm:            None
  Media Type:	       Autodetect (3-media cards) or 
                       10BASE-T (10BASE-T only adapter)

You should only change the default configuration settings if conflicts with 
another adapter exists. To change the adapter's configuration, run the 
CS8900/20 Setup Utility. 


2.2 CS8920-BASED ADAPTER CONFIGURATION

CS8920-based adapters are shipped from Cirrus Logic configured as Plug
and Play (PnP) enabled.  However, since the cs89x0 driver does NOT
support PnP, you must install the CS8920 adapter in a DOS-based PC and
run the CS8900/20 Setup Utility to disable PnP and configure the
adapter before installation in the target Linux system.  Failure to do
this will leave the adapter inactive and the driver will be unable to
communicate with the adapter.  


        **************************************************************** 
        *                    CS8920-BASED ADAPTERS:                    *
        *                                                              * 
        * CS8920-BASED ADAPTERS ARE PLUG and PLAY ENABLED BY DEFAULT.  * 
        * THE CS89X0 DRIVER DOES NOT SUPPORT PnP. THEREFORE, YOU MUST  *
        * RUN THE CS8900/20 SETUP UTILITY TO DISABLE PnP SUPPORT AND   *
        * TO ACTIVATE THE ADAPTER.                                     *
        ****************************************************************




3.0 LOADING THE DRIVER AS A MODULE
===============================================================================

If the driver is compiled as a loadable module, you can load the driver module
with the 'modprobe' command.  Many of the adapter's configuration parameters can 
be specified as command-line arguments to the load command.  This facility 
provides a means to override the EEPROM's settings or for interface 
configuration when an EEPROM is not used.

Example:

    insmod cs89x0.o io=0x200 irq=0xA media=aui

This example loads the module and configures the adapter to use an IO port base
address of 200h, interrupt 10, and use the AUI media connection.  The following
configuration options are available on the command line:

* io=###               - specify IO address (200h-360h)
* irq=##               - specify interrupt level
* use_dma=1            - Enable DMA
* dma=#                - specify dma channel (Driver is compiled to support
                         Rx DMA only)
* dmasize=# (16 or 64) - DMA size 16K or 64K.  Default value is set to 16.
* media=rj45           - specify media type
   or media=bnc
   or media=aui
   or media=auto
* duplex=full          - specify forced half/full/autonegotiate duplex
   or duplex=half
   or duplex=auto
* debug=#              - debug level (only available if the driver was compiled
                         for debugging)

NOTES:

a) If an EEPROM is present, any specified command-line parameter
   will override the corresponding configuration value stored in
   EEPROM.

b) The "io" parameter must be specified on the command-line.  

c) The driver's hardware probe routine is designed to avoid
   writing to I/O space until it knows that there is a cs89x0
   card at the written addresses.  This could cause problems
   with device probing.  To avoid this behaviour, add one
   to the `io=' module parameter.  This doesn't actually change
   the I/O address, but it is a flag to tell the driver
   to partially initialise the hardware before trying to
   identify the card.  This could be dangerous if you are
   not sure that there is a cs89x0 card at the provided address.

   For example, to scan for an adapter located at IO base 0x300,
   specify an IO address of 0x301.  

d) The "duplex=auto" parameter is only supported for the CS8920.

e) The minimum command-line configuration required if an EEPROM is
   not present is:

   io 
   irq 
   media type (no autodetect)

f) The following additional parameters are CS89XX defaults (values
   used with no EEPROM or command-line argument).

   * DMA Burst = enabled
   * IOCHRDY Enabled = enabled
   * UseSA = enabled
   * CS8900 defaults to half-duplex if not specified on command-line
   * CS8920 defaults to autoneg if not specified on command-line
   * Use reset defaults for other config parameters
   * dma_mode = 0

g) You can use ifconfig to set the adapter's Ethernet address.

h) Many Linux distributions use the 'modprobe' command to load
   modules.  This program uses the '/etc/conf.modules' file to
   determine configuration information which is passed to a driver
   module when it is loaded.  All the configuration options which are
   described above may be placed within /etc/conf.modules.

   For example:

   > cat /etc/conf.modules
   ...
   alias eth0 cs89x0
   options cs89x0 io=0x0200 dma=5 use_dma=1
   ...

   In this example we are telling the module system that the
   ethernet driver for this machine should use the cs89x0 driver.  We
   are asking 'modprobe' to pass the 'io', 'dma' and 'use_dma'
   arguments to the driver when it is loaded.

i) Cirrus recommend that the cs89x0 use the ISA DMA channels 5, 6 or
   7.  You will probably find that other DMA channels will not work.

j) The cs89x0 supports DMA for receiving only.  DMA mode is
   significantly more efficient.  Flooding a 400 MHz Celeron machine
   with large ping packets consumes 82% of its CPU capacity in non-DMA
   mode.  With DMA this is reduced to 45%.

k) If your Linux kernel was compiled with inbuilt plug-and-play
   support you will be able to find information about the cs89x0 card
   with the command

   cat /proc/isapnp

l) If during DMA operation you find erratic behavior or network data
   corruption you should use your PC's BIOS to slow the EISA bus clock.

m) If the cs89x0 driver is compiled directly into the kernel
   (non-modular) then its I/O address is automatically determined by
   ISA bus probing.  The IRQ number, media options, etc are determined
   from the card's EEPROM.

n) If the cs89x0 driver is compiled directly into the kernel, DMA
   mode may be selected by providing the kernel with a boot option
   'cs89x0_dma=N' where 'N' is the desired DMA channel number (5, 6 or 7).

   Kernel boot options may be provided on the LILO command line:

	LILO boot: linux cs89x0_dma=5

   or they may be placed in /etc/lilo.conf:

	image=/boot/bzImage-2.3.48
	  append="cs89x0_dma=5"
	  label=linux
	  root=/dev/hda5
	  read-only

   The DMA Rx buffer size is hardwired to 16 kbytes in this mode.
   (64k mode is not available).


4.0 COMPILING THE DRIVER
===============================================================================

The cs89x0 driver can be compiled directly into the kernel or compiled into
a loadable device driver module.


4.1 COMPILING THE DRIVER AS A LOADABLE MODULE

To compile the driver into a loadable module, use the following command 
(single command line, without quotes):

"gcc -D__KERNEL__ -I/usr/src/linux/include -I/usr/src/linux/net/inet -Wall 
-Wstrict-prototypes -O2 -fomit-frame-pointer -DMODULE -DCONFIG_MODVERSIONS 
-c cs89x0.c"

4.2 COMPILING THE DRIVER TO SUPPORT MEMORY MODE

Support for memory mode was not carried over into the 2.3 series kernels.

4.3 COMPILING THE DRIVER TO SUPPORT Rx DMA

The compile-time optionality for DMA was removed in the 2.3 kernel
series.  DMA support is now unconditionally part of the driver.  It is
enabled by the 'use_dma=1' module option.

4.4 COMPILING THE DRIVER INTO THE KERNEL

If your Linux distribution already has support for the cs89x0 driver
then simply copy the source file to the /usr/src/linux/drivers/net
directory to replace the original ones and run the make utility to
rebuild the kernel.  See Step 3 for rebuilding the kernel.

If your Linux does not include the cs89x0 driver, you need to edit three 
configuration files, copy the source file to the /usr/src/linux/drivers/net
directory, and then run the make utility to rebuild the kernel.

1. Edit the following configuration files by adding the statements as
indicated.  (When possible, try to locate the added text to the section of the
file containing similar statements).


a.) In /usr/src/linux/drivers/net/Config.in, add:

tristate 'CS89x0 support' CONFIG_CS89x0

Example:

     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
       tristate 'ICL EtherTeam 16i/32 support' CONFIG_ETH16I
     fi

     tristate 'CS89x0 support' CONFIG_CS89x0

     tristate 'NE2000/NE1000 support' CONFIG_NE2000
     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
       tristate 'NI5210 support' CONFIG_NI52


b.) In /usr/src/linux/drivers/net/Makefile, add the following lines: 

ifeq ($(CONFIG_CS89x0),y)
L_OBJS += cs89x0.o
else
  ifeq ($(CONFIG_CS89x0),m)
  M_OBJS += cs89x0.o
  endif
endif


c.) In /linux/drivers/net/Space.c file, add the line:

extern int cs89x0_probe(struct device *dev);


Example:

 extern int ultra_probe(struct device *dev);
 extern int wd_probe(struct device *dev);
 extern int el2_probe(struct device *dev);

 extern int cs89x0_probe(struct device *dev);

 extern int ne_probe(struct device *dev);
 extern int hp_probe(struct device *dev);
 extern int hp_plus_probe(struct device *dev);


Also add:

 #ifdef CONFIG_CS89x0
 	{ cs89x0_probe,0 },
 #endif


2.) Copy the driver source files (cs89x0.c and cs89x0.h) 
into the /usr/src/linux/drivers/net directory.


3.) Go to /usr/src/linux directory and run 'make config' followed by 'make' 
(or make bzImage) to rebuild the kernel. 

4.) Use the DOS 'setup' utility to disable plug and play on the NIC.


5.0 TESTING AND TROUBLESHOOTING
===============================================================================

5.1 KNOWN DEFECTS and LIMITATIONS

Refer to the RELEASE.TXT file distributed as part of this archive for a list of 
known defects, driver limitations, and work arounds.


5.2 TESTING THE ADAPTER

Once the adapter has been installed and configured, the diagnostic option of 
the CS8900/20 Setup Utility can be used to test the functionality of the 
adapter and its network connection.  Use the diagnostics 'Self Test' option to
test the functionality of the adapter with the hardware configuration you have
assigned. You can use the diagnostics 'Network Test' to test the ability of the
adapter to communicate across the Ethernet with another PC equipped with a 
CS8900/20-based adapter card (it must also be running the CS8900/20 Setup 
Utility).

         NOTE: The Setup Utility's diagnostics are designed to run in a
         DOS-only operating system environment.  DO NOT run the diagnostics 
         from a DOS or command prompt session under Windows 95, Windows NT, 
         OS/2, or other operating system.

To run the diagnostics tests on the CS8900/20 adapter:

   1.) Boot DOS on the PC and start the CS8900/20 Setup Utility.

   2.) The adapter's current configuration is displayed.  Hit the ENTER key to
       get to the main menu.

   4.) Select 'Diagnostics' (ALT-G) from the main menu.  
       * Select 'Self-Test' to test the adapter's basic functionality.
       * Select 'Network Test' to test the network connection and cabling.


5.2.1 DIAGNOSTIC SELF-TEST

The diagnostic self-test checks the adapter's basic functionality as well as 
its ability to communicate across the ISA bus based on the system resources 
assigned during hardware configuration.  The following tests are performed:

   * IO Register Read/Write Test
     The IO Register Read/Write test insures that the CS8900/20 can be 
     accessed in IO mode, and that the IO base address is correct.

   * Shared Memory Test
     The Shared Memory test insures the CS8900/20 can be accessed in memory 
     mode and that the range of memory addresses assigned does not conflict 
     with other devices in the system.

   * Interrupt Test
     The Interrupt test insures there are no conflicts with the assigned IRQ
     signal.

   * EEPROM Test
     The EEPROM test insures the EEPROM can be read.

   * Chip RAM Test
     The Chip RAM test insures the 4K of memory internal to the CS8900/20 is
     working properly.

   * Internal Loop-back Test
     The Internal Loop Back test insures the adapter's transmitter and 
     receiver are operating properly.  If this test fails, make sure the 
     adapter's cable is connected to the network (check for LED activity for 
     example).

   * Boot PROM Test
     The Boot PROM  test insures the Boot PROM is present, and can be read.
     Failure indicates the Boot PROM  was not successfully read due to a
     hardware problem or due to a conflicts on the Boot PROM address
     assignment. (Test only applies if the adapter is configured to use the
     Boot PROM option.)

Failure of a test item indicates a possible system resource conflict with 
another device on the ISA bus.  In this case, you should use the Manual Setup 
option to reconfigure the adapter by selecting a different value for the system
resource that failed.


5.2.2 DIAGNOSTIC NETWORK TEST

The Diagnostic Network Test verifies a working network connection by 
transferring data between two CS8900/20 adapters installed in different PCs 
on the same network. (Note: the diagnostic network test should not be run 
between two nodes across a router.) 

This test requires that each of the two PCs have a CS8900/20-based adapter
installed and have the CS8900/20 Setup Utility running.  The first PC is 
configured as a Responder and the other PC is configured as an Initiator.  
Once the Initiator is started, it sends data frames to the Responder which 
returns the frames to the Initiator.

The total number of frames received and transmitted are displayed on the 
Initiator's display, along with a count of the number of frames received and 
transmitted OK or in error.  The test can be terminated anytime by the user at 
either PC.

To setup the Diagnostic Network Test:

    1.) Select a PC with a CS8900/20-based adapter and a known working network
        connection to act as the Responder.  Run the CS8900/20 Setup Utility 
        and select 'Diagnostics -> Network Test -> Responder' from the main 
        menu.  Hit ENTER to start the Responder.

    2.) Return to the PC with the CS8900/20-based adapter you want to test and
        start the CS8900/20 Setup Utility. 

    3.) From the main menu, Select 'Diagnostic -> Network Test -> Initiator'.
        Hit ENTER to start the test.
 
You may stop the test on the Initiator at any time while allowing the Responder
to continue running.  In this manner, you can move to additional PCs and test 
them by starting the Initiator on another PC without having to stop/start the 
Responder.
 


5.3 USING THE ADAPTER'S LEDs

The 2 and 3-media adapters have two LEDs visible on the back end of the board 
located near the 10Base-T connector.  

Link Integrity LED: A "steady" ON of the green LED indicates a valid 10Base-T 
connection.  (Only applies to 10Base-T.  The green LED has no significance for
a 10Base-2 or AUI connection.)

TX/RX LED: The yellow LED lights briefly each time the adapter transmits or 
receives data. (The yellow LED will appear to "flicker" on a typical network.)


5.4 RESOLVING I/O CONFLICTS

An IO conflict occurs when two or more adapter use the same ISA resource (IO 
address, memory address or IRQ).  You can usually detect an IO conflict in one 
of four ways after installing and or configuring the CS8900/20-based adapter:

    1.) The system does not boot properly (or at all).

    2.) The driver cannot communicate with the adapter, reporting an "Adapter
        not found" error message.

    3.) You cannot connect to the network or the driver will not load.

    4.) If you have configured the adapter to run in memory mode but the driver
        reports it is using IO mode when loading, this is an indication of a
        memory address conflict.

If an IO conflict occurs, run the CS8900/20 Setup Utility and perform a 
diagnostic self-test.  Normally, the ISA resource in conflict will fail the 
self-test.  If so, reconfigure the adapter selecting another choice for the 
resource in conflict.  Run the diagnostics again to check for further IO 
conflicts.

In some cases, such as when the PC will not boot, it may be necessary to remove
the adapter and reconfigure it by installing it in another PC to run the 
CS8900/20 Setup Utility.  Once reinstalled in the target system, run the 
diagnostics self-test to ensure the new configuration is free of conflicts 
before loading the driver again.

When manually configuring the adapter, keep in mind the typical ISA system 
resource usage as indicated in the tables below.

I/O Address    	Device                        IRQ      Device
-----------    	--------                      ---      --------
 200-20F       	Game I/O adapter               3       COM2, Bus Mouse
 230-23F       	Bus Mouse                      4       COM1
 270-27F       	LPT3: third parallel port      5       LPT2
 2F0-2FF       	COM2: second serial port       6       Floppy Disk controller
 320-32F       	Fixed disk controller          7       LPT1
                                      	       8       Real-time Clock
                                                 9       EGA/VGA display adapter    
                                                12       Mouse (PS/2)                              
Memory Address  Device                          13       Math Coprocessor
--------------  ---------------------           14       Hard Disk controller
A000-BFFF	EGA Graphics Adapter
A000-C7FF	VGA Graphics Adapter
B000-BFFF	Mono Graphics Adapter
B800-BFFF	Color Graphics Adapter
E000-FFFF	AT BIOS




6.0 TECHNICAL SUPPORT
===============================================================================

6.1 CONTACTING CIRRUS LOGIC'S TECHNICAL SUPPORT

Cirrus Logic's CS89XX Technical Application Support can be reached at:

Telephone  :(800) 888-5016 (from inside U.S. and Canada)
           :(512) 442-7555 (from outside the U.S. and Canada)
Fax        :(512) 912-3871
Email      :ethernet@crystal.cirrus.com
WWW        :http://www.cirrus.com


6.2 INFORMATION REQUIRED BEFORE CONTACTING TECHNICAL SUPPORT

Before contacting Cirrus Logic for technical support, be prepared to provide as 
Much of the following information as possible. 

1.) Adapter type (CRD8900, CDB8900, CDB8920, etc.)

2.) Adapter configuration

    * IO Base, Memory Base, IO or memory mode enabled, IRQ, DMA channel
    * Plug and Play enabled/disabled (CS8920-based adapters only)
    * Configured for media auto-detect or specific media type (which type).    

3.) PC System's Configuration

    * Plug and Play system (yes/no)
    * BIOS (make and version)
    * System make and model
    * CPU (type and speed)
    * System RAM
    * SCSI Adapter

4.) Software

    * CS89XX driver and version
    * Your network operating system and version
    * Your system's OS version 
    * Version of all protocol support files

5.) Any Error Message displayed.



6.3 OBTAINING THE LATEST DRIVER VERSION

You can obtain the latest CS89XX drivers and support software from Cirrus Logic's 
Web site.  You can also contact Cirrus Logic's Technical Support (email:
ethernet@crystal.cirrus.com) and request that you be registered for automatic 
software-update notification.

Cirrus Logic maintains a web page at http://www.cirrus.com with the
latest drivers and technical publications.


6.4 Current maintainer

In February 2000 the maintenance of this driver was assumed by Andrew
Morton <akpm@zip.com.au>

6.5 Kernel module parameters

For use in embedded environments with no cs89x0 EEPROM, the kernel boot
parameter `cs89x0_media=' has been implemented.  Usage is:

	cs89x0_media=rj45    or
	cs89x0_media=aui     or
	cs89x0_media=bnc

