tokenring: delete all remaining driver support
authorPaul Gortmaker <paul.gortmaker@windriver.com>
Thu, 10 May 2012 02:41:59 +0000 (22:41 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Wed, 16 May 2012 00:23:16 +0000 (20:23 -0400)
This represents the mass deletion of the of the tokenring support.

It gets rid of:
  - the net/tr.c which the drivers depended on
  - the drivers/net component
  - the Kbuild infrastructure around it
  - any tokenring related CONFIG_ settings in any defconfigs
  - the tokenring headers in the include/linux dir
  - the firmware associated with the tokenring drivers.
  - any associated token ring documentation.

Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
43 files changed:
Documentation/filesystems/proc.txt
Documentation/networking/00-INDEX
Documentation/networking/3c359.txt [deleted file]
Documentation/networking/olympic.txt [deleted file]
Documentation/networking/smctr.txt [deleted file]
Documentation/networking/tms380tr.txt [deleted file]
arch/mips/configs/mtx1_defconfig
arch/xtensa/configs/common_defconfig
drivers/message/fusion/mptlan.h
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/Space.c
drivers/net/tokenring/3c359.c [deleted file]
drivers/net/tokenring/3c359.h [deleted file]
drivers/net/tokenring/Kconfig [deleted file]
drivers/net/tokenring/Makefile [deleted file]
drivers/net/tokenring/abyss.c [deleted file]
drivers/net/tokenring/abyss.h [deleted file]
drivers/net/tokenring/ibmtr.c [deleted file]
drivers/net/tokenring/ibmtr_cs.c [deleted file]
drivers/net/tokenring/lanstreamer.c [deleted file]
drivers/net/tokenring/lanstreamer.h [deleted file]
drivers/net/tokenring/madgemc.c [deleted file]
drivers/net/tokenring/madgemc.h [deleted file]
drivers/net/tokenring/olympic.c [deleted file]
drivers/net/tokenring/olympic.h [deleted file]
drivers/net/tokenring/proteon.c [deleted file]
drivers/net/tokenring/skisa.c [deleted file]
drivers/net/tokenring/smctr.c [deleted file]
drivers/net/tokenring/smctr.h [deleted file]
drivers/net/tokenring/tms380tr.c [deleted file]
drivers/net/tokenring/tms380tr.h [deleted file]
drivers/net/tokenring/tmspci.c [deleted file]
firmware/3com/3C359.bin.ihex [deleted file]
firmware/Makefile
firmware/WHENCE
firmware/tr_smctr.bin.ihex [deleted file]
include/linux/Kbuild
include/linux/ibmtr.h [deleted file]
include/linux/if_tr.h [deleted file]
include/linux/trdevice.h [deleted file]
net/802/Makefile
net/802/tr.c [deleted file]

index b7413cb..ef088e5 100644 (file)
@@ -996,7 +996,6 @@ Table 1-9: Network info in /proc/net
  snmp          SNMP data                                                       
  sockstat      Socket statistics                                               
  tcp           TCP  sockets                                                    
- tr_rif        Token ring RIF routing table                                    
  udp           UDP sockets                                                     
  unix          UNIX domain sockets                                             
  wireless      Wireless interface data (Wavelan etc)                           
index 9ad9dde..2cc3c77 100644 (file)
@@ -1,7 +1,5 @@
 00-INDEX
        - this file
-3c359.txt
-       - information on the 3Com TokenLink Velocity XL (3c5359) driver.
 3c505.txt
        - information on the 3Com EtherLink Plus (3c505) driver.
 3c509.txt
@@ -142,8 +140,6 @@ netif-msg.txt
        - Design of the network interface message level setting (NETIF_MSG_*).
 nfc.txt
        - The Linux Near Field Communication (NFS) subsystem.
-olympic.txt
-       - IBM PCI Pit/Pit-Phy/Olympic Token Ring driver info.
 openvswitch.txt
        - Open vSwitch developer documentation.
 operstates.txt
@@ -184,8 +180,6 @@ skfp.txt
        - SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info.
 smc9.txt
        - the driver for SMC's 9000 series of Ethernet cards
-smctr.txt
-       - SMC TokenCard TokenRing Linux driver info.
 spider-net.txt
        - README for the Spidernet Driver (as found in PS3 / Cell BE).
 stmmac.txt
@@ -200,8 +194,6 @@ tcp-thin.txt
        - kernel tuning options for low rate 'thin' TCP streams.
 tlan.txt
        - ThunderLAN (Compaq Netelligent 10/100, Olicom OC-2xxx) driver info.
-tms380tr.txt
-       - SysKonnect Token Ring ISA/PCI adapter driver info.
 tproxy.txt
        - Transparent proxy support user guide.
 tuntap.txt
diff --git a/Documentation/networking/3c359.txt b/Documentation/networking/3c359.txt
deleted file mode 100644 (file)
index dadfe81..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-
-3COM PCI TOKEN LINK VELOCITY XL TOKEN RING CARDS README
-
-Release 0.9.0 - Release   
-       Jul 17th 2000 Mike Phillips 
-
-       1.2.0 - Final
-       Feb 17th 2002 Mike Phillips 
-       Updated for submission to the 2.4.x kernel.
-
-Thanks:
-       Terry Murphy from 3Com for tech docs and support,
-       Adam D. Ligas for testing the driver.
-Note:
-       This driver will NOT work with the 3C339 Token Ring cards, you need
-to use the tms380 driver instead.
-
-Options:
-
-The driver accepts three options: ringspeed, pkt_buf_sz and message_level.
-
-These options can be specified differently for each card found. 
-
-ringspeed:  Has one of three settings 0 (default), 4 or 16.  0 will 
-make the card autosense the ringspeed and join at the appropriate speed, 
-this will be the default option for most people.  4 or 16 allow you to 
-explicitly force the card to operate at a certain speed.  The card will fail 
-if you try to insert it at the wrong speed. (Although some hubs will allow 
-this so be *very* careful).  The main purpose for explicitly setting the ring
-speed is for when the card is first on the ring.  In autosense mode, if the card
-cannot detect any active monitors on the ring it will open at the same speed as
-its last opening. This can be hazardous if this speed does not match the speed
-you want the ring to operate at.  
-
-pkt_buf_sz:  This is this initial receive buffer allocation size.  This will
-default to 4096 if no value is entered. You may increase performance of the 
-driver by setting this to a value larger than the network packet size, although
-the driver now re-sizes buffers based on MTU settings as well. 
-
-message_level: Controls level of messages created by the driver. Defaults to 0:
-which only displays start-up and critical messages.  Presently any non-zero 
-value will display all soft messages as well.  NB This does not turn 
-debugging messages on, that must be done by modified the source code.
-
-Variable MTU size:
-
-The driver can handle a MTU size up to either 4500 or 18000 depending upon 
-ring speed.  The driver also changes the size of the receive buffers as part
-of the mtu re-sizing, so if you set mtu = 18000, you will need to be able
-to allocate 16 * (sk_buff with 18000 buffer size) call it 18500 bytes per ring 
-position = 296,000 bytes of memory space, plus of course anything 
-necessary for the tx sk_buff's.  Remember this is per card, so if you are
-building routers, gateway's etc, you could start to use a lot of memory
-real fast.
-
-2/17/02 Mike Phillips
-
diff --git a/Documentation/networking/olympic.txt b/Documentation/networking/olympic.txt
deleted file mode 100644 (file)
index b95b5bf..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-
-IBM PCI Pit/Pit-Phy/Olympic CHIPSET BASED TOKEN RING CARDS README
-
-Release 0.2.0 - Release    
-       June 8th 1999 Peter De Schrijver & Mike Phillips
-Release 0.9.C - Release
-       April 18th 2001 Mike Phillips
-
-Thanks:
-Erik De Cock, Adrian Bridgett and Frank Fiene for their 
-patience and testing.
-Donald Champion for the cardbus support
-Kyle Lucke for the dma api changes.   
-Jonathon Bitner for hardware support. 
-Everybody on linux-tr for their continued support.  
-Options:
-
-The driver accepts four options: ringspeed, pkt_buf_sz,  
-message_level and network_monitor.
-
-These options can be specified differently for each card found. 
-
-ringspeed:  Has one of three settings 0 (default), 4 or 16.  0 will 
-make the card autosense the ringspeed and join at the appropriate speed, 
-this will be the default option for most people.  4 or 16 allow you to 
-explicitly force the card to operate at a certain speed.  The card will fail 
-if you try to insert it at the wrong speed. (Although some hubs will allow 
-this so be *very* careful).  The main purpose for explicitly setting the ring
-speed is for when the card is first on the ring.  In autosense mode, if the card
-cannot detect any active monitors on the ring it will not open, so you must 
-re-init the card at the appropriate speed.  Unfortunately at present the only
-way of doing this is rmmod and insmod which is a bit tough if it is compiled
-in the kernel.
-
-pkt_buf_sz:  This is this initial receive buffer allocation size.  This will
-default to 4096 if no value is entered. You may increase performance of the 
-driver by setting this to a value larger than the network packet size, although
-the driver now re-sizes buffers based on MTU settings as well. 
-
-message_level: Controls level of messages created by the driver. Defaults to 0:
-which only displays start-up and critical messages.  Presently any non-zero 
-value will display all soft messages as well.  NB This does not turn 
-debugging messages on, that must be done by modified the source code.
-
-network_monitor: Any non-zero value will provide a quasi network monitoring 
-mode.  All unexpected MAC frames (beaconing etc.) will be received
-by the driver and the source and destination addresses printed. 
-Also an entry will be added in  /proc/net called olympic_tr%d, where tr%d
-is the registered device name, i.e tr0, tr1, etc. This displays low
-level information about the configuration of the ring and the adapter.
-This feature has been designed for network administrators to assist in 
-the diagnosis of network / ring problems. (This used to OLYMPIC_NETWORK_MONITOR,
-but has now changed to allow each adapter to be configured differently and
-to alleviate the necessity to re-compile olympic to turn the option on).
-
-Multi-card:
-
-The driver will detect multiple cards and will work with shared interrupts,
-each card is assigned the next token ring device, i.e. tr0 , tr1, tr2.  The 
-driver should also happily reside in the system with other drivers.  It has 
-been tested with ibmtr.c running, and I personally have had one Olicom PCI 
-card and two IBM olympic cards (all on the same interrupt), all running
-together. 
-
-Variable MTU size:
-
-The driver can handle a MTU size up to either 4500 or 18000 depending upon 
-ring speed.  The driver also changes the size of the receive buffers as part
-of the mtu re-sizing, so if you set mtu = 18000, you will need to be able
-to allocate 16 * (sk_buff with 18000 buffer size) call it 18500 bytes per ring 
-position = 296,000 bytes of memory space, plus of course anything 
-necessary for the tx sk_buff's.  Remember this is per card, so if you are
-building routers, gateway's etc, you could start to use a lot of memory
-real fast.
-
-
-6/8/99 Peter De Schrijver and Mike Phillips
-
diff --git a/Documentation/networking/smctr.txt b/Documentation/networking/smctr.txt
deleted file mode 100644 (file)
index 9af25b8..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-Text File for the SMC TokenCard TokenRing Linux driver (smctr.c).
-        By Jay Schulist <jschlst@samba.org>
-
-The Linux SMC Token Ring driver works with the SMC TokenCard Elite (8115T) 
-ISA and SMC TokenCard Elite/A (8115T/A) MCA adapters.
-
-Latest information on this driver can be obtained on the Linux-SNA WWW site.
-Please point your browser to: http://www.linux-sna.org
-
-This driver is rather simple to use. Select Y to Token Ring adapter support
-in the kernel configuration. A choice for SMC Token Ring adapters will
-appear. This drives supports all SMC ISA/MCA adapters. Choose this
-option. I personally recommend compiling the driver as a module (M), but if you
-you would like to compile it statically answer Y instead.
-
-This driver supports multiple adapters without the need to load multiple copies
-of the driver. You should be able to load up to 7 adapters without any kernel
-modifications, if you are in need of more please contact the maintainer of this
-driver.
-
-Load the driver either by lilo/loadlin or as a module. When a module using the
-following command will suffice for most:
-
-# modprobe smctr
-smctr.c: v1.00 12/6/99 by jschlst@samba.org
-tr0: SMC TokenCard 8115T at Io 0x300, Irq 10, Rom 0xd8000, Ram 0xcc000.
-
-Now just setup the device via ifconfig and set and routes you may have. After
-this you are ready to start sending some tokens.
-
-Errata:
-1). For anyone wondering where to pick up the SMC adapters please browse
-    to http://www.smc.com
-
-2). If you are the first/only Token Ring Client on a Token Ring LAN, please
-    specify the ringspeed with the ringspeed=[4/16] module option. If no
-    ringspeed is specified the driver will attempt to autodetect the ring
-    speed and/or if the adapter is the first/only station on the ring take
-    the appropriate actions. 
-
-    NOTE: Default ring speed is 16MB UTP.
-
-3). PnP support for this adapter sucks. I recommend hard setting the 
-    IO/MEM/IRQ by the jumpers on the adapter. If this is not possible
-    load the module with the following io=[ioaddr] mem=[mem_addr]
-    irq=[irq_num].
-
-    The following IRQ, IO, and MEM settings are supported.
-
-    IO ports:
-    0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300,
-    0x320, 0x340, 0x360, 0x380.
-
-    IRQs:
-    2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15
-
-    Memory addresses:
-    0xA0000, 0xA4000, 0xA8000, 0xAC000, 0xB0000, 0xB4000,
-    0xB8000, 0xBC000, 0xC0000, 0xC4000, 0xC8000, 0xCC000,
-    0xD0000, 0xD4000, 0xD8000, 0xDC000, 0xE0000, 0xE4000,
-    0xE8000, 0xEC000, 0xF0000, 0xF4000, 0xF8000, 0xFC000
-
-This driver is under the GNU General Public License. Its Firmware image is
-included as an initialized C-array and is licensed by SMC to the Linux
-users of this driver. However no warranty about its fitness is expressed or
-implied by SMC.
diff --git a/Documentation/networking/tms380tr.txt b/Documentation/networking/tms380tr.txt
deleted file mode 100644 (file)
index 1f73e13..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-Text file for the Linux SysKonnect Token Ring ISA/PCI Adapter Driver.
-       Text file by: Jay Schulist <jschlst@samba.org>
-
-The Linux SysKonnect Token Ring driver works with the SysKonnect TR4/16(+) ISA,
-SysKonnect TR4/16(+) PCI, SysKonnect TR4/16 PCI, and older revisions of the
-SK NET TR4/16 ISA card.
-
-Latest information on this driver can be obtained on the Linux-SNA WWW site.
-Please point your browser to: 
-http://www.linux-sna.org
-
-Many thanks to Christoph Goos for his excellent work on this driver and
-SysKonnect for donating the adapters to Linux-SNA for the testing and 
-maintenance of this device driver.
-
-Important information to be noted:
-1. Adapters can be slow to open (~20 secs) and close (~5 secs), please be 
-   patient.
-2. This driver works very well when autoprobing for adapters. Why even 
-   think about those nasty io/int/dma settings of modprobe when the driver 
-   will do it all for you!
-
-This driver is rather simple to use. Select Y to Token Ring adapter support
-in the kernel configuration. A choice for SysKonnect Token Ring adapters will
-appear. This drives supports all SysKonnect ISA and PCI adapters. Choose this
-option. I personally recommend compiling the driver as a module (M), but if you
-you would like to compile it statically answer Y instead.
-
-This driver supports multiple adapters without the need to load multiple copies
-of the driver. You should be able to load up to 7 adapters without any kernel
-modifications, if you are in need of more please contact the maintainer of this
-driver.
-
-Load the driver either by lilo/loadlin or as a module. When a module using the
-following command will suffice for most:
-
-# modprobe sktr
-
-This will produce output similar to the following: (Output is user specific)
-
-sktr.c: v1.01 08/29/97 by Christoph Goos
-tr0: SK NET TR 4/16 PCI found at 0x6100, using IRQ 17.
-tr1: SK NET TR 4/16 PCI found at 0x6200, using IRQ 16.
-tr2: SK NET TR 4/16 ISA found at 0xa20, using IRQ 10 and DMA 5.
-
-Now just setup the device via ifconfig and set and routes you may have. After
-this you are ready to start sending some tokens.
-
-Errata:
-For anyone wondering where to pick up the SysKonnect adapters please browse
-to http://www.syskonnect.com
-
-This driver is under the GNU General Public License. Its Firmware image is 
-included as an initialized C-array and is licensed by SysKonnect to the Linux 
-users of this driver. However no warranty about its fitness is expressed or 
-implied by SysKonnect.
-
-Below find attached the setting for the SK NET TR 4/16 ISA adapters
--------------------------------------------------------------------
-
-                    ***************************
-                    ***   C O N T E N T S   ***
-                    ***************************
-
-                1) Location of DIP-Switch W1
-                2) Default settings
-                3) DIP-Switch W1 description
-
-
-  ==============================================================
-  CHAPTER 1     LOCATION OF DIP-SWITCH
-  ==============================================================
-
-UÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
-þUÄÄÄÄÄÄ¿                         UÄÄÄÄÄ¿            UÄÄÄ¿         Ã¾
-þAÄÄÄÄÄÄU                      W1 AÄÄÄÄÄU     UÄÄÄÄ¿ Ã¾   Ã¾         Ã¾
-þUÄÄÄÄÄÄ¿                                     Ã¾    Ã¾ Ã¾   Ã¾      UÄÄÅ¿
-þAÄÄÄÄÄÄU              UÄÄÄÄÄÄÄÄÄÄÄ¿          AÄÄÄÄU Ã¾   Ã¾      Ã¾  Ã¾Ã¾
-þUÄÄÄÄÄÄ¿              Ã¾           Ã¾          UÄÄÄ¿  AÄÄÄU      AÄÄÅU
-þAÄÄÄÄÄÄU              Ã¾ TMS380C26 Ã¾          Ã¾   Ã¾                Ã¾
-þUÄÄÄÄÄÄ¿              Ã¾           Ã¾          AÄÄÄU                AÄ¿
-þAÄÄÄÄÄÄU              Ã¾           Ã¾                               Ã¾ Ã¾
-þ                      AÄÄÄÄÄÄÄÄÄÄÄU                               Ã¾ Ã¾
-þ                                                                  Ã¾ Ã¾
-þ                                                                  AÄU
-þ                                                                  Ã¾
-þ                                                                  Ã¾
-þ                                                                  Ã¾
-þ                                                                  Ã¾
-AÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄU
-             AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU  AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU
-
-  ==============================================================
-  CHAPTER 2     DEFAULT SETTINGS
-  ==============================================================
-
-          W1    1  2  3  4  5  6  7  8
-        +------------------------------+
-        | ON    X                      |
-        | OFF      X  X  X  X  X  X  X |
-        +------------------------------+
-
-        W1.1 = ON               Adapter drives address lines SA17..19
-        W1.2 - 1.5 = OFF        BootROM disabled
-        W1.6 - 1.8 = OFF        I/O address 0A20h
-
-  ==============================================================
-  CHAPTER 3     DIP SWITCH W1 DESCRIPTION
-  ==============================================================
-
-      UÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄ¿  ON
-      Ã¾ 1 Ã¾ 2 Ã¾ 3 Ã¾ 4 Ã¾ 5 Ã¾ 6 Ã¾ 7 Ã¾ 8 Ã¾
-      AÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄU  OFF
-      |AD | BootROM Addr. |  I/O      |
-      +-+-+-------+-------+-----+-----+
-        |         |             |
-        |         |             +------ 6     7     8
-        |         |                     ON    ON    ON       1900h
-        |         |                     ON    ON    OFF      0900h
-        |         |                     ON    OFF   ON       1980h
-        |         |                     ON    OFF   OFF      0980h
-        |         |                     OFF   ON    ON       1b20h
-        |         |                     OFF   ON    OFF      0b20h
-        |         |                     OFF   OFF   ON       1a20h
-        |         |                     OFF   OFF   OFF      0a20h    (+)
-        |         |
-        |         |
-        |         +-------- 2     3     4     5
-        |                   OFF   x     x     x       disabled  (+)
-        |                   ON    ON    ON    ON      C0000
-        |                   ON    ON    ON    OFF     C4000
-        |                   ON    ON    OFF   ON      C8000
-        |                   ON    ON    OFF   OFF     CC000
-        |                   ON    OFF   ON    ON      D0000
-        |                   ON    OFF   ON    OFF     D4000
-        |                   ON    OFF   OFF   ON      D8000
-        |                   ON    OFF   OFF   OFF     DC000
-        |
-        |
-        +----- 1
-               OFF    adapter does NOT drive SA<17..19>
-               ON     adapter drives SA<17..19>  (+)
-
-
-        (+) means default setting
-
-                       ********************************
index 807c97e..46c61ed 100644 (file)
@@ -346,11 +346,8 @@ CONFIG_CHELSIO_T1=m
 CONFIG_IXGB=m
 CONFIG_S2IO=m
 CONFIG_MYRI10GE=m
-CONFIG_TR=y
 CONFIG_IBMOL=m
 CONFIG_IBMLS=m
-CONFIG_3C359=m
-CONFIG_TMS380TR=m
 CONFIG_TMSPCI=m
 CONFIG_ABYSS=m
 CONFIG_USB_CATC=m
@@ -376,7 +373,6 @@ CONFIG_PCMCIA_SMC91C92=m
 CONFIG_PCMCIA_XIRC2PS=m
 CONFIG_PCMCIA_AXNET=m
 CONFIG_ARCNET_COM20020_CS=m
-CONFIG_PCMCIA_IBMTR=m
 CONFIG_WAN=y
 CONFIG_LANMEDIA=m
 CONFIG_HDLC=m
index b90038e..a182a4e 100644 (file)
@@ -332,11 +332,6 @@ CONFIG_XT2000_SONIC=y
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
 #
 # Wireless LAN (non-hamradio)
 #
index c171afa..69e9d54 100644 (file)
@@ -69,7 +69,6 @@
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
 #include <linux/delay.h>
-// #include <linux/trdevice.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
index 78a6259..0c2bd80 100644 (file)
@@ -282,8 +282,6 @@ source "drivers/net/slip/Kconfig"
 
 source "drivers/s390/net/Kconfig"
 
-source "drivers/net/tokenring/Kconfig"
-
 source "drivers/net/usb/Kconfig"
 
 source "drivers/net/wireless/Kconfig"
index a6b8ce1..3d375ca 100644 (file)
@@ -50,7 +50,6 @@ obj-$(CONFIG_SLIP) += slip/
 obj-$(CONFIG_SLHC) += slip/
 obj-$(CONFIG_NET_SB1000) += sb1000.o
 obj-$(CONFIG_SUNGEM_PHY) += sungem_phy.o
-obj-$(CONFIG_TR) += tokenring/
 obj-$(CONFIG_WAN) += wan/
 obj-$(CONFIG_WLAN) += wireless/
 obj-$(CONFIG_WIMAX) += wimax/
index 88bbd8f..486e2dc 100644 (file)
@@ -29,7 +29,6 @@
  */
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
-#include <linux/trdevice.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/netlink.h>
@@ -284,46 +283,6 @@ static void __init ethif_probe2(int unit)
                probe_list2(unit, parport_probes, base_addr == 0));
 }
 
-#ifdef CONFIG_TR
-/* Token-ring device probe */
-extern int ibmtr_probe_card(struct net_device *);
-extern struct net_device *smctr_probe(int unit);
-
-static struct devprobe2 tr_probes2[] __initdata = {
-#ifdef CONFIG_SMCTR
-       {smctr_probe, 0},
-#endif
-       {NULL, 0},
-};
-
-static __init int trif_probe(int unit)
-{
-       int err = -ENODEV;
-#ifdef CONFIG_IBMTR
-       struct net_device *dev = alloc_trdev(0);
-       if (!dev)
-               return -ENOMEM;
-
-       sprintf(dev->name, "tr%d", unit);
-       netdev_boot_setup_check(dev);
-       err = ibmtr_probe_card(dev);
-       if (err)
-               free_netdev(dev);
-#endif
-       return err;
-}
-
-static void __init trif_probe2(int unit)
-{
-       unsigned long base_addr = netdev_boot_base("tr", unit);
-
-       if (base_addr == 1)
-               return;
-       probe_list2(unit, tr_probes2, base_addr == 0);
-}
-#endif
-
-
 /*  Statically configured drivers -- order matters here. */
 static int __init net_olddevs_init(void)
 {
@@ -332,11 +291,6 @@ static int __init net_olddevs_init(void)
 #ifdef CONFIG_SBNI
        for (num = 0; num < 8; ++num)
                sbni_probe(num);
-#endif
-#ifdef CONFIG_TR
-       for (num = 0; num < 8; ++num)
-               if (!trif_probe(num))
-                       trif_probe2(num);
 #endif
        for (num = 0; num < 8; ++num)
                ethif_probe2(num);
diff --git a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c
deleted file mode 100644 (file)
index 0924f57..0000000
+++ /dev/null
@@ -1,1831 +0,0 @@
-/*
- *   3c359.c (c) 2000 Mike Phillips (mikep@linuxtr.net) All Rights Reserved
- *
- *  Linux driver for 3Com 3c359 Tokenlink Velocity XL PCI NIC
- *
- *  Base Driver Olympic:
- *     Written 1999 Peter De Schrijver & Mike Phillips
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- * 
- *  7/17/00 - Clean up, version number 0.9.0. Ready to release to the world.
- *
- *  2/16/01 - Port up to kernel 2.4.2 ready for submission into the kernel.
- *  3/05/01 - Last clean up stuff before submission.
- *  2/15/01 - Finally, update to new pci api. 
- *
- *  To Do:
- */
-
-/* 
- *     Technical Card Details
- *
- *  All access to data is done with 16/8 bit transfers.  The transfer
- *  method really sucks. You can only read or write one location at a time.
- *
- *  Also, the microcode for the card must be uploaded if the card does not have
- *  the flashrom on board.  This is a 28K bloat in the driver when compiled
- *  as a module.
- *
- *  Rx is very simple, status into a ring of descriptors, dma data transfer,
- *  interrupts to tell us when a packet is received.
- *
- *  Tx is a little more interesting. Similar scenario, descriptor and dma data
- *  transfers, but we don't have to interrupt the card to tell it another packet
- *  is ready for transmission, we are just doing simple memory writes, not io or mmio
- *  writes.  The card can be set up to simply poll on the next
- *  descriptor pointer and when this value is non-zero will automatically download
- *  the next packet.  The card then interrupts us when the packet is done.
- *
- */
-
-#define XL_DEBUG 0
-
-#include <linux/jiffies.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/in.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/proc_fs.h>
-#include <linux/ptrace.h>
-#include <linux/skbuff.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/stddef.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include <linux/bitops.h>
-#include <linux/firmware.h>
-#include <linux/slab.h>
-
-#include <net/checksum.h>
-
-#include <asm/io.h>
-
-#include "3c359.h"
-
-static char version[] __devinitdata  = 
-"3c359.c v1.2.0 2/17/01 - Mike Phillips (mikep@linuxtr.net)" ; 
-
-#define FW_NAME                "3com/3C359.bin"
-MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; 
-MODULE_DESCRIPTION("3Com 3C359 Velocity XL Token Ring Adapter Driver\n") ;
-MODULE_FIRMWARE(FW_NAME);
-
-/* Module parameters */
-
-/* Ring Speed 0,4,16 
- * 0 = Autosense   
- * 4,16 = Selected speed only, no autosense
- * This allows the card to be the first on the ring
- * and become the active monitor.
- *
- * WARNING: Some hubs will allow you to insert
- * at the wrong speed.
- * 
- * The adapter will _not_ fail to open if there are no
- * active monitors on the ring, it will simply open up in 
- * its last known ringspeed if no ringspeed is specified.
- */
-
-static int ringspeed[XL_MAX_ADAPTERS] = {0,} ;
-
-module_param_array(ringspeed, int, NULL, 0);
-MODULE_PARM_DESC(ringspeed,"3c359: Ringspeed selection - 4,16 or 0") ;
-
-/* Packet buffer size */
-
-static int pkt_buf_sz[XL_MAX_ADAPTERS] = {0,} ;
-module_param_array(pkt_buf_sz, int, NULL, 0) ;
-MODULE_PARM_DESC(pkt_buf_sz,"3c359: Initial buffer size") ;
-/* Message Level */
-
-static int message_level[XL_MAX_ADAPTERS] = {0,} ;
-
-module_param_array(message_level, int, NULL, 0) ;
-MODULE_PARM_DESC(message_level, "3c359: Level of reported messages") ;
-/* 
- *     This is a real nasty way of doing this, but otherwise you
- *     will be stuck with 1555 lines of hex #'s in the code.
- */
-
-static DEFINE_PCI_DEVICE_TABLE(xl_pci_tbl) =
-{
-       {PCI_VENDOR_ID_3COM,PCI_DEVICE_ID_3COM_3C359, PCI_ANY_ID, PCI_ANY_ID, },
-       { }                     /* terminate list */
-};
-MODULE_DEVICE_TABLE(pci,xl_pci_tbl) ; 
-
-static int xl_init(struct net_device *dev);
-static int xl_open(struct net_device *dev);
-static int xl_open_hw(struct net_device *dev) ;  
-static int xl_hw_reset(struct net_device *dev); 
-static netdev_tx_t xl_xmit(struct sk_buff *skb, struct net_device *dev);
-static void xl_dn_comp(struct net_device *dev); 
-static int xl_close(struct net_device *dev);
-static void xl_set_rx_mode(struct net_device *dev);
-static irqreturn_t xl_interrupt(int irq, void *dev_id);
-static int xl_set_mac_address(struct net_device *dev, void *addr) ; 
-static void xl_arb_cmd(struct net_device *dev);
-static void xl_asb_cmd(struct net_device *dev) ; 
-static void xl_srb_cmd(struct net_device *dev, int srb_cmd) ; 
-static void xl_wait_misr_flags(struct net_device *dev) ; 
-static int xl_change_mtu(struct net_device *dev, int mtu);
-static void xl_srb_bh(struct net_device *dev) ; 
-static void xl_asb_bh(struct net_device *dev) ; 
-static void xl_reset(struct net_device *dev) ;  
-static void xl_freemem(struct net_device *dev) ;  
-
-
-/* EEProm Access Functions */
-static u16  xl_ee_read(struct net_device *dev, int ee_addr) ; 
-static void  xl_ee_write(struct net_device *dev, int ee_addr, u16 ee_value) ; 
-
-/* Debugging functions */
-#if XL_DEBUG
-static void print_tx_state(struct net_device *dev) ; 
-static void print_rx_state(struct net_device *dev) ; 
-
-static void print_tx_state(struct net_device *dev)
-{
-
-       struct xl_private *xl_priv = netdev_priv(dev);
-       struct xl_tx_desc *txd ; 
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-       int i ; 
-
-       printk("tx_ring_head: %d, tx_ring_tail: %d, free_ent: %d\n",xl_priv->tx_ring_head,
-               xl_priv->tx_ring_tail, xl_priv->free_ring_entries) ; 
-       printk("Ring    , Address ,   FSH  , DnNextPtr, Buffer, Buffer_Len\n");
-       for (i = 0; i < 16; i++) {
-               txd = &(xl_priv->xl_tx_ring[i]) ; 
-               printk("%d, %08lx, %08x, %08x, %08x, %08x\n", i, virt_to_bus(txd),
-                       txd->framestartheader, txd->dnnextptr, txd->buffer, txd->buffer_length ) ; 
-       }
-
-       printk("DNLISTPTR = %04x\n", readl(xl_mmio + MMIO_DNLISTPTR) );
-       
-       printk("DmaCtl = %04x\n", readl(xl_mmio + MMIO_DMA_CTRL) );
-       printk("Queue status = %0x\n",netif_running(dev) ) ;
-}
-
-static void print_rx_state(struct net_device *dev)
-{
-
-       struct xl_private *xl_priv = netdev_priv(dev);
-       struct xl_rx_desc *rxd ; 
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-       int i ; 
-
-       printk("rx_ring_tail: %d\n", xl_priv->rx_ring_tail);
-       printk("Ring    , Address ,   FrameState  , UPNextPtr, FragAddr, Frag_Len\n");
-       for (i = 0; i < 16; i++) { 
-               /* rxd = (struct xl_rx_desc *)xl_priv->rx_ring_dma_addr + (i * sizeof(struct xl_rx_desc)) ; */
-               rxd = &(xl_priv->xl_rx_ring[i]) ; 
-               printk("%d, %08lx, %08x, %08x, %08x, %08x\n", i, virt_to_bus(rxd),
-                       rxd->framestatus, rxd->upnextptr, rxd->upfragaddr, rxd->upfraglen ) ; 
-       }
-
-       printk("UPLISTPTR = %04x\n", readl(xl_mmio + MMIO_UPLISTPTR));
-       
-       printk("DmaCtl = %04x\n", readl(xl_mmio + MMIO_DMA_CTRL));
-       printk("Queue status = %0x\n",netif_running(dev));
-} 
-#endif
-
-/*
- *     Read values from the on-board EEProm.  This looks very strange
- *     but you have to wait for the EEProm to get/set the value before 
- *     passing/getting the next value from the nic. As with all requests
- *     on this nic it has to be done in two stages, a) tell the nic which
- *     memory address you want to access and b) pass/get the value from the nic.
- *     With the EEProm, you have to wait before and between access a) and b).
- *     As this is only read at initialization time and the wait period is very 
- *     small we shouldn't have to worry about scheduling issues.
- */
-
-static u16 xl_ee_read(struct net_device *dev, int ee_addr)
-{ 
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-
-       /* Wait for EEProm to not be busy */
-       writel(IO_WORD_READ | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       while ( readw(xl_mmio + MMIO_MACDATA) & EEBUSY ) ;
-
-       /* Tell EEProm what we want to do and where */
-       writel(IO_WORD_WRITE | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(EEREAD + ee_addr, xl_mmio + MMIO_MACDATA) ; 
-
-       /* Wait for EEProm to not be busy */
-       writel(IO_WORD_READ | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       while ( readw(xl_mmio + MMIO_MACDATA) & EEBUSY ) ; 
-       
-       /* Tell EEProm what we want to do and where */
-       writel(IO_WORD_WRITE | EECONTROL , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(EEREAD + ee_addr, xl_mmio + MMIO_MACDATA) ; 
-
-       /* Finally read the value from the EEProm */
-       writel(IO_WORD_READ | EEDATA , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       return readw(xl_mmio + MMIO_MACDATA) ; 
-}
-
-/* 
- *     Write values to the onboard eeprom. As with eeprom read you need to 
- *     set which location to write, wait, value to write, wait, with the 
- *     added twist of having to enable eeprom writes as well.
- */
-
-static void  xl_ee_write(struct net_device *dev, int ee_addr, u16 ee_value) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-
-       /* Wait for EEProm to not be busy */
-       writel(IO_WORD_READ | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       while ( readw(xl_mmio + MMIO_MACDATA) & EEBUSY ) ;
-       
-       /* Enable write/erase */
-       writel(IO_WORD_WRITE | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(EE_ENABLE_WRITE, xl_mmio + MMIO_MACDATA) ; 
-
-       /* Wait for EEProm to not be busy */
-       writel(IO_WORD_READ | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       while ( readw(xl_mmio + MMIO_MACDATA) & EEBUSY ) ;
-
-       /* Put the value we want to write into EEDATA */ 
-       writel(IO_WORD_WRITE | EEDATA, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(ee_value, xl_mmio + MMIO_MACDATA) ;
-
-       /* Tell EEProm to write eevalue into ee_addr */
-       writel(IO_WORD_WRITE | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(EEWRITE + ee_addr, xl_mmio + MMIO_MACDATA) ; 
-
-       /* Wait for EEProm to not be busy, to ensure write gets done */
-       writel(IO_WORD_READ | EECONTROL, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       while ( readw(xl_mmio + MMIO_MACDATA) & EEBUSY ) ;
-       
-       return ; 
-}
-
-static const struct net_device_ops xl_netdev_ops = {
-       .ndo_open               = xl_open,
-       .ndo_stop               = xl_close,
-       .ndo_start_xmit         = xl_xmit,
-       .ndo_change_mtu         = xl_change_mtu,
-       .ndo_set_rx_mode        = xl_set_rx_mode,
-       .ndo_set_mac_address    = xl_set_mac_address,
-};
-static int __devinit xl_probe(struct pci_dev *pdev,
-                             const struct pci_device_id *ent) 
-{
-       struct net_device *dev ; 
-       struct xl_private *xl_priv ; 
-       static int card_no = -1 ;
-       int i ; 
-
-       card_no++ ; 
-
-       if (pci_enable_device(pdev)) { 
-               return -ENODEV ; 
-       } 
-
-       pci_set_master(pdev);
-
-       if ((i = pci_request_regions(pdev,"3c359"))) { 
-               return i ; 
-       }
-
-       /* 
-        * Allowing init_trdev to allocate the private data will align
-        * xl_private on a 32 bytes boundary which we need for the rx/tx
-        * descriptors
-        */
-
-       dev = alloc_trdev(sizeof(struct xl_private)) ; 
-       if (!dev) { 
-               pci_release_regions(pdev) ; 
-               return -ENOMEM ; 
-       } 
-       xl_priv = netdev_priv(dev);
-
-#if XL_DEBUG  
-       printk("pci_device: %p, dev:%p, dev->priv: %p, ba[0]: %10x, ba[1]:%10x\n", 
-               pdev, dev, netdev_priv(dev), (unsigned int)pdev->resource[0].start, (unsigned int)pdev->resource[1].start);
-#endif 
-
-       dev->irq=pdev->irq;
-       dev->base_addr=pci_resource_start(pdev,0) ; 
-       xl_priv->xl_card_name = pci_name(pdev);
-       xl_priv->xl_mmio=ioremap(pci_resource_start(pdev,1), XL_IO_SPACE);
-       xl_priv->pdev = pdev ; 
-               
-       if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) )
-               xl_priv->pkt_buf_sz = PKT_BUF_SZ ; 
-       else
-               xl_priv->pkt_buf_sz = pkt_buf_sz[card_no] ; 
-
-       dev->mtu = xl_priv->pkt_buf_sz - TR_HLEN ; 
-       xl_priv->xl_ring_speed = ringspeed[card_no] ; 
-       xl_priv->xl_message_level = message_level[card_no] ; 
-       xl_priv->xl_functional_addr[0] = xl_priv->xl_functional_addr[1] = xl_priv->xl_functional_addr[2] = xl_priv->xl_functional_addr[3] = 0 ; 
-       xl_priv->xl_copy_all_options = 0 ; 
-               
-       if((i = xl_init(dev))) {
-               iounmap(xl_priv->xl_mmio) ; 
-               free_netdev(dev) ; 
-               pci_release_regions(pdev) ; 
-               return i ; 
-       }                               
-
-       dev->netdev_ops = &xl_netdev_ops;
-       SET_NETDEV_DEV(dev, &pdev->dev);
-
-       pci_set_drvdata(pdev,dev) ; 
-       if ((i = register_netdev(dev))) { 
-               printk(KERN_ERR "3C359, register netdev failed\n") ;  
-               pci_set_drvdata(pdev,NULL) ; 
-               iounmap(xl_priv->xl_mmio) ; 
-               free_netdev(dev) ; 
-               pci_release_regions(pdev) ; 
-               return i ; 
-       }
-   
-       printk(KERN_INFO "3C359: %s registered as: %s\n",xl_priv->xl_card_name,dev->name) ; 
-
-       return 0; 
-}
-
-static int xl_init_firmware(struct xl_private *xl_priv)
-{
-       int err;
-
-       err = request_firmware(&xl_priv->fw, FW_NAME, &xl_priv->pdev->dev);
-       if (err) {
-               printk(KERN_ERR "Failed to load firmware \"%s\"\n", FW_NAME);
-               return err;
-       }
-
-       if (xl_priv->fw->size < 16) {
-               printk(KERN_ERR "Bogus length %zu in \"%s\"\n",
-                      xl_priv->fw->size, FW_NAME);
-               release_firmware(xl_priv->fw);
-               err = -EINVAL;
-       }
-
-       return err;
-}
-
-static int __devinit xl_init(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       int err;
-
-       printk(KERN_INFO "%s\n", version);
-       printk(KERN_INFO "%s: I/O at %hx, MMIO at %p, using irq %d\n",
-               xl_priv->xl_card_name, (unsigned int)dev->base_addr ,xl_priv->xl_mmio, dev->irq);
-
-       spin_lock_init(&xl_priv->xl_lock) ; 
-
-       err = xl_init_firmware(xl_priv);
-       if (err == 0)
-               err = xl_hw_reset(dev);
-
-       return err;
-}
-
-
-/* 
- *     Hardware reset.  This needs to be a separate entity as we need to reset the card
- *     when we change the EEProm settings.
- */
-
-static int xl_hw_reset(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-       unsigned long t ; 
-       u16 i ; 
-       u16 result_16 ; 
-       u8 result_8 ;
-       u16 start ; 
-       int j ;
-
-       if (xl_priv->fw == NULL)
-               return -EINVAL;
-
-       /*
-        *  Reset the card.  If the card has got the microcode on board, we have 
-         *  missed the initialization interrupt, so we must always do this.
-        */
-
-       writew( GLOBAL_RESET, xl_mmio + MMIO_COMMAND ) ; 
-
-       /* 
-        * Must wait for cmdInProgress bit (12) to clear before continuing with
-        * card configuration.
-        */
-
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 40 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL  card not responding to global reset.\n", dev->name);
-                       return -ENODEV;
-               }
-       }
-
-       /*
-        *  Enable pmbar by setting bit in CPAttention
-        */
-
-       writel( (IO_BYTE_READ | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-       result_8 = readb(xl_mmio + MMIO_MACDATA) ; 
-       result_8 = result_8 | CPA_PMBARVIS ; 
-       writel( (IO_BYTE_WRITE | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(result_8, xl_mmio + MMIO_MACDATA) ; 
-       
-       /*
-        * Read cpHold bit in pmbar, if cleared we have got Flashrom on board.
-        * If not, we need to upload the microcode to the card
-        */
-
-       writel( (IO_WORD_READ | PMBAR),xl_mmio + MMIO_MAC_ACCESS_CMD);  
-
-#if XL_DEBUG
-       printk(KERN_INFO "Read from PMBAR = %04x\n", readw(xl_mmio + MMIO_MACDATA));
-#endif
-
-       if ( readw( (xl_mmio + MMIO_MACDATA))  & PMB_CPHOLD ) { 
-
-               /* Set PmBar, privateMemoryBase bits (8:2) to 0 */
-
-               writel( (IO_WORD_READ | PMBAR),xl_mmio + MMIO_MAC_ACCESS_CMD);  
-               result_16 = readw(xl_mmio + MMIO_MACDATA) ; 
-               result_16 = result_16 & ~((0x7F) << 2) ; 
-               writel( (IO_WORD_WRITE | PMBAR), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writew(result_16,xl_mmio + MMIO_MACDATA) ; 
-       
-               /* Set CPAttention, memWrEn bit */
-
-               writel( (IO_BYTE_READ | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               result_8 = readb(xl_mmio + MMIO_MACDATA) ; 
-               result_8 = result_8 | CPA_MEMWREN  ; 
-               writel( (IO_BYTE_WRITE | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(result_8, xl_mmio + MMIO_MACDATA) ; 
-
-               /* 
-                * Now to write the microcode into the shared ram 
-                * The microcode must finish at position 0xFFFF,
-                * so we must subtract to get the start position for the code
-                *
-                * Looks strange but ensures compiler only uses
-                * 16 bit unsigned int
-                */
-               start = (0xFFFF - (xl_priv->fw->size) + 1) ;
-
-               printk(KERN_INFO "3C359: Uploading Microcode: "); 
-
-               for (i = start, j = 0; j < xl_priv->fw->size; i++, j++) {
-                       writel(MEM_BYTE_WRITE | 0XD0000 | i,
-                              xl_mmio + MMIO_MAC_ACCESS_CMD);
-                       writeb(xl_priv->fw->data[j], xl_mmio + MMIO_MACDATA);
-                       if (j % 1024 == 0)
-                               printk(".");
-               }
-               printk("\n") ; 
-
-               for (i = 0; i < 16; i++) {
-                       writel((MEM_BYTE_WRITE | 0xDFFF0) + i,
-                              xl_mmio + MMIO_MAC_ACCESS_CMD);
-                       writeb(xl_priv->fw->data[xl_priv->fw->size - 16 + i],
-                              xl_mmio + MMIO_MACDATA);
-               }
-
-               /*
-                * Have to write the start address of the upload to FFF4, but
-                 * the address must be >> 4. You do not want to know how long
-                 * it took me to discover this.
-                */
-
-               writel(MEM_WORD_WRITE | 0xDFFF4, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writew(start >> 4, xl_mmio + MMIO_MACDATA);
-
-               /* Clear the CPAttention, memWrEn Bit */
-       
-               writel( (IO_BYTE_READ | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               result_8 = readb(xl_mmio + MMIO_MACDATA) ; 
-               result_8 = result_8 & ~CPA_MEMWREN ; 
-               writel( (IO_BYTE_WRITE | CPATTENTION), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(result_8, xl_mmio + MMIO_MACDATA) ; 
-
-               /* Clear the cpHold bit in pmbar */
-
-               writel( (IO_WORD_READ | PMBAR),xl_mmio + MMIO_MAC_ACCESS_CMD);  
-               result_16 = readw(xl_mmio + MMIO_MACDATA) ; 
-               result_16 = result_16 & ~PMB_CPHOLD ; 
-               writel( (IO_WORD_WRITE | PMBAR), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writew(result_16,xl_mmio + MMIO_MACDATA) ; 
-
-
-       } /* If microcode upload required */
-
-       /* 
-        * The card should now go though a self test procedure and get itself ready
-         * to be opened, we must wait for an srb response with the initialization
-         * information. 
-        */
-
-#if XL_DEBUG
-       printk(KERN_INFO "%s: Microcode uploaded, must wait for the self test to complete\n", dev->name);
-#endif
-
-       writew(SETINDENABLE | 0xFFF, xl_mmio + MMIO_COMMAND) ; 
-
-       t=jiffies;
-       while ( !(readw(xl_mmio + MMIO_INTSTATUS_AUTO) & INTSTAT_SRB) ) { 
-               schedule();             
-               if (time_after(jiffies, t + 15 * HZ)) {
-                       printk(KERN_ERR "3COM 3C359 Velocity XL  card not responding.\n");
-                       return -ENODEV; 
-               }
-       }
-
-       /*
-        * Write the RxBufArea with D000, RxEarlyThresh, TxStartThresh, 
-        * DnPriReqThresh, read the tech docs if you want to know what
-        * values they need to be.
-        */
-
-       writel(MMIO_WORD_WRITE | RXBUFAREA, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(0xD000, xl_mmio + MMIO_MACDATA) ; 
-       
-       writel(MMIO_WORD_WRITE | RXEARLYTHRESH, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(0X0020, xl_mmio + MMIO_MACDATA) ; 
-       
-       writew( SETTXSTARTTHRESH | 0x40 , xl_mmio + MMIO_COMMAND) ; 
-
-       writeb(0x04, xl_mmio + MMIO_DNBURSTTHRESH) ; 
-       writeb(0x04, xl_mmio + DNPRIREQTHRESH) ;
-
-       /*
-        * Read WRBR to provide the location of the srb block, have to use byte reads not word reads. 
-        * Tech docs have this wrong !!!!
-        */
-
-       writel(MMIO_BYTE_READ | WRBR, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       xl_priv->srb = readb(xl_mmio + MMIO_MACDATA) << 8 ; 
-       writel( (MMIO_BYTE_READ | WRBR) + 1, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       xl_priv->srb = xl_priv->srb | readb(xl_mmio + MMIO_MACDATA) ;
-
-#if XL_DEBUG
-       writel(IO_WORD_READ | SWITCHSETTINGS, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       if ( readw(xl_mmio + MMIO_MACDATA) & 2) { 
-               printk(KERN_INFO "Default ring speed 4 mbps\n");
-       } else {
-               printk(KERN_INFO "Default ring speed 16 mbps\n");
-       } 
-       printk(KERN_INFO "%s: xl_priv->srb = %04x\n",xl_priv->xl_card_name, xl_priv->srb);
-#endif
-
-       return 0;
-}
-
-static int xl_open(struct net_device *dev) 
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-       u8 i ; 
-       __le16 hwaddr[3] ; /* Should be u8[6] but we get word return values */
-       int open_err ;
-
-       u16 switchsettings, switchsettings_eeprom  ;
-       if (request_irq(dev->irq, xl_interrupt, IRQF_SHARED , "3c359", dev))
-               return -EAGAIN;
-
-       /* 
-        * Read the information from the EEPROM that we need.
-        */
-       
-       hwaddr[0] = cpu_to_le16(xl_ee_read(dev,0x10));
-       hwaddr[1] = cpu_to_le16(xl_ee_read(dev,0x11));
-       hwaddr[2] = cpu_to_le16(xl_ee_read(dev,0x12));
-
-       /* Ring speed */
-
-       switchsettings_eeprom = xl_ee_read(dev,0x08) ;
-       switchsettings = switchsettings_eeprom ;  
-
-       if (xl_priv->xl_ring_speed != 0) { 
-               if (xl_priv->xl_ring_speed == 4)  
-                       switchsettings = switchsettings | 0x02 ; 
-               else 
-                       switchsettings = switchsettings & ~0x02 ; 
-       }
-
-       /* Only write EEProm if there has been a change */
-       if (switchsettings != switchsettings_eeprom) { 
-               xl_ee_write(dev,0x08,switchsettings) ; 
-               /* Hardware reset after changing EEProm */
-               xl_hw_reset(dev) ; 
-       }
-
-       memcpy(dev->dev_addr,hwaddr,dev->addr_len) ; 
-       
-       open_err = xl_open_hw(dev) ; 
-
-       /* 
-        * This really needs to be cleaned up with better error reporting.
-        */
-
-       if (open_err != 0) { /* Something went wrong with the open command */
-               if (open_err & 0x07) { /* Wrong speed, retry at different speed */
-                       printk(KERN_WARNING "%s: Open Error, retrying at different ringspeed\n", dev->name);
-                       switchsettings = switchsettings ^ 2 ; 
-                       xl_ee_write(dev,0x08,switchsettings) ; 
-                       xl_hw_reset(dev) ; 
-                       open_err = xl_open_hw(dev) ; 
-                       if (open_err != 0) { 
-                               printk(KERN_WARNING "%s: Open error returned a second time, we're bombing out now\n", dev->name); 
-                               free_irq(dev->irq,dev) ;                                                
-                               return -ENODEV ;
-                       }  
-               } else { 
-                       printk(KERN_WARNING "%s: Open Error = %04x\n", dev->name, open_err) ; 
-                       free_irq(dev->irq,dev) ; 
-                       return -ENODEV ; 
-               }
-       }
-
-       /*
-        * Now to set up the Rx and Tx buffer structures
-        */
-       /* These MUST be on 8 byte boundaries */
-       xl_priv->xl_tx_ring = kzalloc((sizeof(struct xl_tx_desc) * XL_TX_RING_SIZE) + 7, GFP_DMA | GFP_KERNEL);
-       if (xl_priv->xl_tx_ring == NULL) {
-               free_irq(dev->irq,dev);
-               return -ENOMEM;
-       }
-       xl_priv->xl_rx_ring = kzalloc((sizeof(struct xl_rx_desc) * XL_RX_RING_SIZE) +7, GFP_DMA | GFP_KERNEL);
-       if (xl_priv->xl_rx_ring == NULL) {
-               free_irq(dev->irq,dev);
-               kfree(xl_priv->xl_tx_ring);
-               return -ENOMEM;
-       }
-
-        /* Setup Rx Ring */
-        for (i=0 ; i < XL_RX_RING_SIZE ; i++) { 
-               struct sk_buff *skb ; 
-
-               skb = dev_alloc_skb(xl_priv->pkt_buf_sz) ; 
-               if (skb==NULL) 
-                       break ; 
-
-               skb->dev = dev ; 
-               xl_priv->xl_rx_ring[i].upfragaddr = cpu_to_le32(pci_map_single(xl_priv->pdev, skb->data,xl_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
-               xl_priv->xl_rx_ring[i].upfraglen = cpu_to_le32(xl_priv->pkt_buf_sz) | RXUPLASTFRAG;
-               xl_priv->rx_ring_skb[i] = skb ;         
-       }
-
-       if (i==0) { 
-               printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
-               free_irq(dev->irq,dev) ; 
-               kfree(xl_priv->xl_tx_ring);
-               kfree(xl_priv->xl_rx_ring);
-               return -EIO ; 
-       } 
-
-       xl_priv->rx_ring_no = i ; 
-       xl_priv->rx_ring_tail = 0 ; 
-       xl_priv->rx_ring_dma_addr = pci_map_single(xl_priv->pdev,xl_priv->xl_rx_ring, sizeof(struct xl_rx_desc) * XL_RX_RING_SIZE, PCI_DMA_TODEVICE) ; 
-       for (i=0;i<(xl_priv->rx_ring_no-1);i++) { 
-               xl_priv->xl_rx_ring[i].upnextptr = cpu_to_le32(xl_priv->rx_ring_dma_addr + (sizeof (struct xl_rx_desc) * (i+1)));
-       } 
-       xl_priv->xl_rx_ring[i].upnextptr = 0 ; 
-
-       writel(xl_priv->rx_ring_dma_addr, xl_mmio + MMIO_UPLISTPTR) ; 
-       
-       /* Setup Tx Ring */
-       
-       xl_priv->tx_ring_dma_addr = pci_map_single(xl_priv->pdev,xl_priv->xl_tx_ring, sizeof(struct xl_tx_desc) * XL_TX_RING_SIZE,PCI_DMA_TODEVICE) ; 
-       
-       xl_priv->tx_ring_head = 1 ; 
-       xl_priv->tx_ring_tail = 255 ; /* Special marker for first packet */
-       xl_priv->free_ring_entries = XL_TX_RING_SIZE ; 
-
-       /*
-        * Setup the first dummy DPD entry for polling to start working.
-        */
-
-       xl_priv->xl_tx_ring[0].framestartheader = TXDPDEMPTY;
-       xl_priv->xl_tx_ring[0].buffer = 0 ; 
-       xl_priv->xl_tx_ring[0].buffer_length = 0 ; 
-       xl_priv->xl_tx_ring[0].dnnextptr = 0 ; 
-
-       writel(xl_priv->tx_ring_dma_addr, xl_mmio + MMIO_DNLISTPTR) ; 
-       writel(DNUNSTALL, xl_mmio + MMIO_COMMAND) ; 
-       writel(UPUNSTALL, xl_mmio + MMIO_COMMAND) ; 
-       writel(DNENABLE, xl_mmio + MMIO_COMMAND) ; 
-       writeb(0x40, xl_mmio + MMIO_DNPOLL) ;   
-
-       /*
-        * Enable interrupts on the card
-        */
-
-       writel(SETINTENABLE | INT_MASK, xl_mmio + MMIO_COMMAND) ; 
-       writel(SETINDENABLE | INT_MASK, xl_mmio + MMIO_COMMAND) ; 
-
-       netif_start_queue(dev) ;        
-       return 0;
-       
-}      
-
-static int xl_open_hw(struct net_device *dev) 
-{ 
-       struct xl_private *xl_priv=netdev_priv(dev);
-       u8 __iomem *xl_mmio = xl_priv->xl_mmio ; 
-       u16 vsoff ;
-       char ver_str[33];  
-       int open_err ; 
-       int i ; 
-       unsigned long t ; 
-
-       /*
-        * Okay, let's build up the Open.NIC srb command
-        *
-        */
-               
-       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(OPEN_NIC, xl_mmio + MMIO_MACDATA) ; 
-       
-       /*
-        * Use this as a test byte, if it comes back with the same value, the command didn't work
-        */
-
-       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb)+ 2, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0xff,xl_mmio + MMIO_MACDATA) ; 
-
-       /* Open options */
-       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + 8, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0x00, xl_mmio + MMIO_MACDATA) ; 
-       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + 9, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0x00, xl_mmio + MMIO_MACDATA) ; 
-
-       /* 
-        * Node address, be careful here, the docs say you can just put zeros here and it will use
-        * the hardware address, it doesn't, you must include the node address in the open command.
-        */
-
-       if (xl_priv->xl_laa[0]) {  /* If using a LAA address */
-               for (i=10;i<16;i++) { 
-                       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                       writeb(xl_priv->xl_laa[i-10],xl_mmio + MMIO_MACDATA) ;
-               }
-               memcpy(dev->dev_addr,xl_priv->xl_laa,dev->addr_len) ; 
-       } else { /* Regular hardware address */ 
-               for (i=10;i<16;i++) { 
-                       writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                       writeb(dev->dev_addr[i-10], xl_mmio + MMIO_MACDATA) ; 
-               }
-       }
-
-       /* Default everything else to 0 */
-       for (i = 16; i < 34; i++) {
-               writel( (MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(0x00,xl_mmio + MMIO_MACDATA) ; 
-       }
-       
-       /*
-        *  Set the csrb bit in the MISR register
-        */
-
-       xl_wait_misr_flags(dev) ; 
-       writel(MEM_BYTE_WRITE | MF_CSRB, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0xFF, xl_mmio + MMIO_MACDATA) ; 
-       writel(MMIO_BYTE_WRITE | MISR_SET, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(MISR_CSRB , xl_mmio + MMIO_MACDATA) ; 
-
-       /*
-        * Now wait for the command to run
-        */
-
-       t=jiffies;
-       while (! (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_SRB)) { 
-               schedule();             
-               if (time_after(jiffies, t + 40 * HZ)) {
-                       printk(KERN_ERR "3COM 3C359 Velocity XL  card not responding.\n");
-                       break ; 
-               }
-       }
-
-       /*
-        * Let's interpret the open response
-        */
-
-       writel( (MEM_BYTE_READ | 0xD0000 | xl_priv->srb)+2, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       if (readb(xl_mmio + MMIO_MACDATA)!=0) {
-               open_err = readb(xl_mmio + MMIO_MACDATA) << 8 ; 
-               writel( (MEM_BYTE_READ | 0xD0000 | xl_priv->srb) + 7, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               open_err |= readb(xl_mmio + MMIO_MACDATA) ; 
-               return open_err ; 
-       } else { 
-               writel( (MEM_WORD_READ | 0xD0000 | xl_priv->srb) + 8, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               xl_priv->asb = swab16(readw(xl_mmio + MMIO_MACDATA)) ;
-               printk(KERN_INFO "%s: Adapter Opened Details: ",dev->name) ; 
-               printk("ASB: %04x",xl_priv->asb ) ; 
-               writel( (MEM_WORD_READ | 0xD0000 | xl_priv->srb) + 10, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               printk(", SRB: %04x",swab16(readw(xl_mmio + MMIO_MACDATA)) ) ;
-               writel( (MEM_WORD_READ | 0xD0000 | xl_priv->srb) + 12, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               xl_priv->arb = swab16(readw(xl_mmio + MMIO_MACDATA)) ;
-               printk(", ARB: %04x\n",xl_priv->arb );
-               writel( (MEM_WORD_READ | 0xD0000 | xl_priv->srb) + 14, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               vsoff = swab16(readw(xl_mmio + MMIO_MACDATA)) ;
-
-               /* 
-                * Interesting, sending the individual characters directly to printk was causing klogd to use
-                * use 100% of processor time, so we build up the string and print that instead.
-                */
-
-               for (i=0;i<0x20;i++) { 
-                       writel( (MEM_BYTE_READ | 0xD0000 | vsoff) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                       ver_str[i] = readb(xl_mmio + MMIO_MACDATA) ; 
-               }
-               ver_str[i] = '\0' ; 
-               printk(KERN_INFO "%s: Microcode version String: %s\n",dev->name,ver_str);
-       }       
-       
-       /*
-        * Issue the AckInterrupt
-        */
-       writew(ACK_INTERRUPT | SRBRACK | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-
-       return 0 ; 
-}
-
-/*
- *     There are two ways of implementing rx on the 359 NIC, either
- *     interrupt driven or polling.  We are going to uses interrupts,
- *     it is the easier way of doing things.
- *     
- *     The Rx works with a ring of Rx descriptors.  At initialise time the ring
- *     entries point to the next entry except for the last entry in the ring 
- *     which points to 0.  The card is programmed with the location of the first
- *     available descriptor and keeps reading the next_ptr until next_ptr is set
- *     to 0.  Hopefully with a ring size of 16 the card will never get to read a next_ptr
- *     of 0.  As the Rx interrupt is received we copy the frame up to the protocol layers
- *     and then point the end of the ring to our current position and point our current
- *     position to 0, therefore making the current position the last position on the ring.
- *     The last position on the ring therefore loops continually loops around the rx ring.
- *     
- *     rx_ring_tail is the position on the ring to process next. (Think of a snake, the head 
- *     expands as the card adds new packets and we go around eating the tail processing the
- *     packets.)
- *
- *     Undoubtably it could be streamlined and improved upon, but at the moment it works 
- *     and the fast path through the routine is fine. 
- *     
- *     adv_rx_ring could be inlined to increase performance, but its called a *lot* of times
- *     in xl_rx so would increase the size of the function significantly. 
- */
-
-static void adv_rx_ring(struct net_device *dev) /* Advance rx_ring, cut down on bloat in xl_rx */ 
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       int n = xl_priv->rx_ring_tail;
-       int prev_ring_loc;
-
-       prev_ring_loc = (n + XL_RX_RING_SIZE - 1) & (XL_RX_RING_SIZE - 1);
-       xl_priv->xl_rx_ring[prev_ring_loc].upnextptr = cpu_to_le32(xl_priv->rx_ring_dma_addr + (sizeof (struct xl_rx_desc) * n));
-       xl_priv->xl_rx_ring[n].framestatus = 0;
-       xl_priv->xl_rx_ring[n].upnextptr = 0;
-       xl_priv->rx_ring_tail++;
-       xl_priv->rx_ring_tail &= (XL_RX_RING_SIZE-1);
-}
-
-static void xl_rx(struct net_device *dev)
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       struct sk_buff *skb, *skb2 ; 
-       int frame_length = 0, copy_len = 0  ;   
-       int temp_ring_loc ;  
-
-       /*
-        * Receive the next frame, loop around the ring until all frames
-        * have been received.
-        */      
-       
-       while (xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].framestatus & (RXUPDCOMPLETE | RXUPDFULL) ) { /* Descriptor to process */
-
-               if (xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].framestatus & RXUPDFULL ) { /* UpdFull, Multiple Descriptors used for the frame */
-
-                       /* 
-                        * This is a pain, you need to go through all the descriptors until the last one 
-                        * for this frame to find the framelength
-                        */
-
-                       temp_ring_loc = xl_priv->rx_ring_tail ; 
-
-                       while (xl_priv->xl_rx_ring[temp_ring_loc].framestatus & RXUPDFULL ) {
-                               temp_ring_loc++ ; 
-                               temp_ring_loc &= (XL_RX_RING_SIZE-1) ; 
-                       }
-
-                       frame_length = le32_to_cpu(xl_priv->xl_rx_ring[temp_ring_loc].framestatus) & 0x7FFF;
-
-                       skb = dev_alloc_skb(frame_length) ;
-                       if (skb==NULL) { /* No memory for frame, still need to roll forward the rx ring */
-                               printk(KERN_WARNING "%s: dev_alloc_skb failed - multi buffer !\n", dev->name) ; 
-                               while (xl_priv->rx_ring_tail != temp_ring_loc)  
-                                       adv_rx_ring(dev) ; 
-                               
-                               adv_rx_ring(dev) ; /* One more time just for luck :) */ 
-                               dev->stats.rx_dropped++ ; 
-
-                               writel(ACK_INTERRUPT | UPCOMPACK | LATCH_ACK , xl_mmio + MMIO_COMMAND) ; 
-                               return ;                                
-                       }
-       
-                       while (xl_priv->rx_ring_tail != temp_ring_loc) { 
-                               copy_len = le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfraglen) & 0x7FFF;
-                               frame_length -= copy_len ;  
-                               pci_dma_sync_single_for_cpu(xl_priv->pdev,le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr),xl_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE);
-                               skb_copy_from_linear_data(xl_priv->rx_ring_skb[xl_priv->rx_ring_tail],
-                                                         skb_put(skb, copy_len),
-                                                         copy_len);
-                               pci_dma_sync_single_for_device(xl_priv->pdev,le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr),xl_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE);
-                               adv_rx_ring(dev) ; 
-                       } 
-
-                       /* Now we have found the last fragment */
-                       pci_dma_sync_single_for_cpu(xl_priv->pdev,le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr),xl_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE);
-                       skb_copy_from_linear_data(xl_priv->rx_ring_skb[xl_priv->rx_ring_tail],
-                                     skb_put(skb,copy_len), frame_length);
-/*                     memcpy(skb_put(skb,frame_length), bus_to_virt(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr), frame_length) ; */
-                       pci_dma_sync_single_for_device(xl_priv->pdev,le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr),xl_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE);
-                       adv_rx_ring(dev) ; 
-                       skb->protocol = tr_type_trans(skb,dev) ; 
-                       netif_rx(skb) ; 
-
-               } else { /* Single Descriptor Used, simply swap buffers over, fast path  */
-
-                       frame_length = le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].framestatus) & 0x7FFF;
-                       
-                       skb = dev_alloc_skb(xl_priv->pkt_buf_sz) ; 
-
-                       if (skb==NULL) { /* Still need to fix the rx ring */
-                               printk(KERN_WARNING "%s: dev_alloc_skb failed in rx, single buffer\n",dev->name);
-                               adv_rx_ring(dev) ; 
-                               dev->stats.rx_dropped++ ; 
-                               writel(ACK_INTERRUPT | UPCOMPACK | LATCH_ACK , xl_mmio + MMIO_COMMAND) ; 
-                               return ; 
-                       }
-
-                       skb2 = xl_priv->rx_ring_skb[xl_priv->rx_ring_tail] ; 
-                       pci_unmap_single(xl_priv->pdev, le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr), xl_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
-                       skb_put(skb2, frame_length) ; 
-                       skb2->protocol = tr_type_trans(skb2,dev) ; 
-
-                       xl_priv->rx_ring_skb[xl_priv->rx_ring_tail] = skb ;     
-                       xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr = cpu_to_le32(pci_map_single(xl_priv->pdev,skb->data,xl_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
-                       xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfraglen = cpu_to_le32(xl_priv->pkt_buf_sz) | RXUPLASTFRAG;
-                       adv_rx_ring(dev) ; 
-                       dev->stats.rx_packets++ ; 
-                       dev->stats.rx_bytes += frame_length ;   
-
-                       netif_rx(skb2) ;                
-                } /* if multiple buffers */
-       } /* while packet to do */
-
-       /* Clear the updComplete interrupt */
-       writel(ACK_INTERRUPT | UPCOMPACK | LATCH_ACK , xl_mmio + MMIO_COMMAND) ; 
-       return ;        
-}
-
-/*
- * This is ruthless, it doesn't care what state the card is in it will 
- * completely reset the adapter.
- */
-
-static void xl_reset(struct net_device *dev) 
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       unsigned long t; 
-
-       writew( GLOBAL_RESET, xl_mmio + MMIO_COMMAND ) ; 
-
-       /* 
-        * Must wait for cmdInProgress bit (12) to clear before continuing with
-        * card configuration.
-        */
-
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               if (time_after(jiffies, t + 40 * HZ)) {
-                       printk(KERN_ERR "3COM 3C359 Velocity XL  card not responding.\n");
-                       break ; 
-               }
-       }
-       
-}
-
-static void xl_freemem(struct net_device *dev) 
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       int i ; 
-
-       for (i=0;i<XL_RX_RING_SIZE;i++) {
-               dev_kfree_skb_irq(xl_priv->rx_ring_skb[xl_priv->rx_ring_tail]) ; 
-               pci_unmap_single(xl_priv->pdev,le32_to_cpu(xl_priv->xl_rx_ring[xl_priv->rx_ring_tail].upfragaddr),xl_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE);
-               xl_priv->rx_ring_tail++ ; 
-               xl_priv->rx_ring_tail &= XL_RX_RING_SIZE-1; 
-       } 
-
-       /* unmap ring */
-       pci_unmap_single(xl_priv->pdev,xl_priv->rx_ring_dma_addr, sizeof(struct xl_rx_desc) * XL_RX_RING_SIZE, PCI_DMA_FROMDEVICE) ; 
-       
-       pci_unmap_single(xl_priv->pdev,xl_priv->tx_ring_dma_addr, sizeof(struct xl_tx_desc) * XL_TX_RING_SIZE, PCI_DMA_TODEVICE) ; 
-
-       kfree(xl_priv->xl_rx_ring) ; 
-       kfree(xl_priv->xl_tx_ring) ; 
-
-       return  ; 
-}
-
-static irqreturn_t xl_interrupt(int irq, void *dev_id) 
-{
-       struct net_device *dev = (struct net_device *)dev_id;
-       struct xl_private *xl_priv =netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       u16 intstatus, macstatus  ;
-
-       intstatus = readw(xl_mmio + MMIO_INTSTATUS) ;  
-
-       if (!(intstatus & 1)) /* We didn't generate the interrupt */
-               return IRQ_NONE;
-
-       spin_lock(&xl_priv->xl_lock) ; 
-
-       /*
-        * Process the interrupt
-        */
-       /*
-        * Something fishy going on here, we shouldn't get 0001 ints, not fatal though.
-        */
-       if (intstatus == 0x0001) {  
-               writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ;
-               printk(KERN_INFO "%s: 00001 int received\n",dev->name);
-       } else {  
-               if (intstatus & (HOSTERRINT | SRBRINT | ARBCINT | UPCOMPINT | DNCOMPINT | HARDERRINT | (1<<8) | TXUNDERRUN | ASBFINT)) { 
-                       
-                       /* 
-                        * Host Error.
-                        * It may be possible to recover from this, but usually it means something
-                        * is seriously fubar, so we just close the adapter.
-                        */
-
-                       if (intstatus & HOSTERRINT) {
-                               printk(KERN_WARNING "%s: Host Error, performing global reset, intstatus = %04x\n",dev->name,intstatus);
-                               writew( GLOBAL_RESET, xl_mmio + MMIO_COMMAND ) ;
-                               printk(KERN_WARNING "%s: Resetting hardware:\n", dev->name);
-                               netif_stop_queue(dev) ;
-                               xl_freemem(dev) ; 
-                               free_irq(dev->irq,dev);         
-                               xl_reset(dev) ; 
-                               writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-                               spin_unlock(&xl_priv->xl_lock) ; 
-                               return IRQ_HANDLED;
-                       } /* Host Error */
-
-                       if (intstatus & SRBRINT ) {  /* Srbc interrupt */
-                               writel(ACK_INTERRUPT | SRBRACK | LATCH_ACK, xl_mmio + MMIO_COMMAND) ;
-                               if (xl_priv->srb_queued)
-                                       xl_srb_bh(dev) ; 
-                       } /* SRBR Interrupt */
-
-                       if (intstatus & TXUNDERRUN) { /* Issue DnReset command */
-                               writel(DNRESET, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                               while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { /* Wait for command to run */
-                                       /* !!! FIX-ME !!!! 
-                                       Must put a timeout check here ! */
-                                       /* Empty Loop */
-                               } 
-                               printk(KERN_WARNING "%s: TX Underrun received\n",dev->name);
-                               writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-                       } /* TxUnderRun */
-       
-                       if (intstatus & ARBCINT ) { /* Arbc interrupt */
-                               xl_arb_cmd(dev) ; 
-                       } /* Arbc */
-
-                       if (intstatus & ASBFINT) { 
-                               if (xl_priv->asb_queued == 1) {
-                                       xl_asb_cmd(dev) ; 
-                               } else if (xl_priv->asb_queued == 2) {
-                                       xl_asb_bh(dev) ; 
-                               } else { 
-                                       writel(ACK_INTERRUPT | LATCH_ACK | ASBFACK, xl_mmio + MMIO_COMMAND) ; 
-                               }  
-                       } /* Asbf */
-
-                       if (intstatus & UPCOMPINT ) /* UpComplete */
-                               xl_rx(dev) ; 
-
-                       if (intstatus & DNCOMPINT )  /* DnComplete */
-                               xl_dn_comp(dev) ; 
-
-                       if (intstatus & HARDERRINT ) { /* Hardware error */
-                               writel(MMIO_WORD_READ | MACSTATUS, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                               macstatus = readw(xl_mmio + MMIO_MACDATA) ; 
-                               printk(KERN_WARNING "%s: MacStatusError, details: ", dev->name);
-                               if (macstatus & (1<<14)) 
-                                       printk(KERN_WARNING "tchk error: Unrecoverable error\n");
-                               if (macstatus & (1<<3))
-                                       printk(KERN_WARNING "eint error: Internal watchdog timer expired\n");
-                               if (macstatus & (1<<2))
-                                       printk(KERN_WARNING "aint error: Host tried to perform invalid operation\n");
-                               printk(KERN_WARNING "Instatus = %02x, macstatus = %02x\n",intstatus,macstatus) ; 
-                               printk(KERN_WARNING "%s: Resetting hardware:\n", dev->name);
-                               netif_stop_queue(dev) ;
-                               xl_freemem(dev) ; 
-                               free_irq(dev->irq,dev); 
-                               unregister_netdev(dev) ; 
-                               free_netdev(dev) ;  
-                               xl_reset(dev) ; 
-                               writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-                               spin_unlock(&xl_priv->xl_lock) ; 
-                               return IRQ_HANDLED;
-                       }
-               } else { 
-                       printk(KERN_WARNING "%s: Received Unknown interrupt : %04x\n", dev->name, intstatus);
-                       writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ;     
-               }
-       } 
-
-       /* Turn interrupts back on */
-
-       writel( SETINDENABLE | INT_MASK, xl_mmio + MMIO_COMMAND) ; 
-       writel( SETINTENABLE | INT_MASK, xl_mmio + MMIO_COMMAND) ; 
-
-       spin_unlock(&xl_priv->xl_lock) ;
-       return IRQ_HANDLED;
-}      
-
-/*
- *     Tx - Polling configuration
- */
-       
-static netdev_tx_t xl_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       struct xl_tx_desc *txd ; 
-       int tx_head, tx_tail, tx_prev ; 
-       unsigned long flags ;   
-
-       spin_lock_irqsave(&xl_priv->xl_lock,flags) ; 
-
-       netif_stop_queue(dev) ; 
-
-       if (xl_priv->free_ring_entries > 1 ) {  
-               /*
-                * Set up the descriptor for the packet 
-                */
-               tx_head = xl_priv->tx_ring_head ; 
-               tx_tail = xl_priv->tx_ring_tail ; 
-
-               txd = &(xl_priv->xl_tx_ring[tx_head]) ; 
-               txd->dnnextptr = 0 ; 
-               txd->framestartheader = cpu_to_le32(skb->len) | TXDNINDICATE;
-               txd->buffer = cpu_to_le32(pci_map_single(xl_priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE));
-               txd->buffer_length = cpu_to_le32(skb->len) | TXDNFRAGLAST;
-               xl_priv->tx_ring_skb[tx_head] = skb ; 
-               dev->stats.tx_packets++ ; 
-               dev->stats.tx_bytes += skb->len ;
-
-               /* 
-                * Set the nextptr of the previous descriptor equal to this descriptor, add XL_TX_RING_SIZE -1 
-                * to ensure no negative numbers in unsigned locations.
-                */ 
-       
-               tx_prev = (xl_priv->tx_ring_head + XL_TX_RING_SIZE - 1) & (XL_TX_RING_SIZE - 1) ; 
-
-               xl_priv->tx_ring_head++ ; 
-               xl_priv->tx_ring_head &= (XL_TX_RING_SIZE - 1) ;
-               xl_priv->free_ring_entries-- ; 
-
-               xl_priv->xl_tx_ring[tx_prev].dnnextptr = cpu_to_le32(xl_priv->tx_ring_dma_addr + (sizeof (struct xl_tx_desc) * tx_head));
-
-               /* Sneaky, by doing a read on DnListPtr we can force the card to poll on the DnNextPtr */
-               /* readl(xl_mmio + MMIO_DNLISTPTR) ; */
-
-               netif_wake_queue(dev) ; 
-
-               spin_unlock_irqrestore(&xl_priv->xl_lock,flags) ; 
-               return NETDEV_TX_OK;
-       } else {
-               spin_unlock_irqrestore(&xl_priv->xl_lock,flags) ; 
-               return NETDEV_TX_BUSY;
-       }
-
-}
-       
-/* 
- * The NIC has told us that a packet has been downloaded onto the card, we must
- * find out which packet it has done, clear the skb and information for the packet
- * then advance around the ring for all transmitted packets
- */
-
-static void xl_dn_comp(struct net_device *dev) 
-{
-       struct xl_private *xl_priv=netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       struct xl_tx_desc *txd ; 
-
-
-       if (xl_priv->tx_ring_tail == 255) {/* First time */
-               xl_priv->xl_tx_ring[0].framestartheader = 0 ; 
-               xl_priv->xl_tx_ring[0].dnnextptr = 0 ;  
-               xl_priv->tx_ring_tail = 1 ; 
-       }
-
-       while (xl_priv->xl_tx_ring[xl_priv->tx_ring_tail].framestartheader & TXDNCOMPLETE ) { 
-               txd = &(xl_priv->xl_tx_ring[xl_priv->tx_ring_tail]) ;
-               pci_unmap_single(xl_priv->pdev, le32_to_cpu(txd->buffer), xl_priv->tx_ring_skb[xl_priv->tx_ring_tail]->len, PCI_DMA_TODEVICE);
-               txd->framestartheader = 0 ; 
-               txd->buffer = cpu_to_le32(0xdeadbeef);
-               txd->buffer_length  = 0 ;  
-               dev_kfree_skb_irq(xl_priv->tx_ring_skb[xl_priv->tx_ring_tail]) ;
-               xl_priv->tx_ring_tail++ ; 
-               xl_priv->tx_ring_tail &= (XL_TX_RING_SIZE - 1) ; 
-               xl_priv->free_ring_entries++ ; 
-       }
-
-       netif_wake_queue(dev) ; 
-
-       writel(ACK_INTERRUPT | DNCOMPACK | LATCH_ACK , xl_mmio + MMIO_COMMAND) ; 
-}
-
-/*
- * Close the adapter properly.
- * This srb reply cannot be handled from interrupt context as we have
- * to free the interrupt from the driver. 
- */
-
-static int xl_close(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       unsigned long t ; 
-
-       netif_stop_queue(dev) ; 
-
-       /*
-        * Close the adapter, need to stall the rx and tx queues.
-        */
-
-       writew(DNSTALL, xl_mmio + MMIO_COMMAND) ; 
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-DNSTALL not responding.\n", dev->name);
-                       break ; 
-               }
-       }
-       writew(DNDISABLE, xl_mmio + MMIO_COMMAND) ; 
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-DNDISABLE not responding.\n", dev->name);
-                       break ;
-               }
-       }
-       writew(UPSTALL, xl_mmio + MMIO_COMMAND) ; 
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-UPSTALL not responding.\n", dev->name);
-                       break ; 
-               }
-       }
-
-       /* Turn off interrupts, we will still get the indication though
-        * so we can trap it
-        */
-
-       writel(SETINTENABLE, xl_mmio + MMIO_COMMAND) ; 
-
-       xl_srb_cmd(dev,CLOSE_NIC) ; 
-
-       t=jiffies;
-       while (!(readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_SRB)) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-CLOSENIC not responding.\n", dev->name);
-                       break ; 
-               }
-       }
-       /* Read the srb response from the adapter */
-
-       writel(MEM_BYTE_READ | 0xd0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD);
-       if (readb(xl_mmio + MMIO_MACDATA) != CLOSE_NIC) { 
-               printk(KERN_INFO "%s: CLOSE_NIC did not get a CLOSE_NIC response\n",dev->name);
-       } else { 
-               writel((MEM_BYTE_READ | 0xd0000 | xl_priv->srb) +2, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-               if (readb(xl_mmio + MMIO_MACDATA)==0) { 
-                       printk(KERN_INFO "%s: Adapter has been closed\n",dev->name);
-                       writew(ACK_INTERRUPT | SRBRACK | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-
-                       xl_freemem(dev) ; 
-                       free_irq(dev->irq,dev) ; 
-               } else { 
-                       printk(KERN_INFO "%s: Close nic command returned error code %02x\n",dev->name, readb(xl_mmio + MMIO_MACDATA)) ;
-               } 
-       }
-
-       /* Reset the upload and download logic */
-       writew(UPRESET, xl_mmio + MMIO_COMMAND) ; 
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-UPRESET not responding.\n", dev->name);
-                       break ; 
-               }
-       }
-       writew(DNRESET, xl_mmio + MMIO_COMMAND) ; 
-       t=jiffies;
-       while (readw(xl_mmio + MMIO_INTSTATUS) & INTSTAT_CMD_IN_PROGRESS) { 
-               schedule();             
-               if (time_after(jiffies, t + 10 * HZ)) {
-                       printk(KERN_ERR "%s: 3COM 3C359 Velocity XL-DNRESET not responding.\n", dev->name);
-                       break ; 
-               }
-       }
-       xl_hw_reset(dev) ; 
-       return 0 ;
-}
-
-static void xl_set_rx_mode(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       struct netdev_hw_addr *ha;
-       unsigned char dev_mc_address[4] ; 
-       u16 options ; 
-
-       if (dev->flags & IFF_PROMISC)
-               options = 0x0004 ; 
-       else
-               options = 0x0000 ; 
-
-       if (options ^ xl_priv->xl_copy_all_options) { /* Changed, must send command */
-               xl_priv->xl_copy_all_options = options ; 
-               xl_srb_cmd(dev, SET_RECEIVE_MODE) ;
-               return ;  
-       }
-
-       dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ;
-
-       netdev_for_each_mc_addr(ha, dev) {
-               dev_mc_address[0] |= ha->addr[2];
-               dev_mc_address[1] |= ha->addr[3];
-               dev_mc_address[2] |= ha->addr[4];
-               dev_mc_address[3] |= ha->addr[5];
-        }
-
-       if (memcmp(xl_priv->xl_functional_addr,dev_mc_address,4) != 0) { /* Options have changed, run the command */
-               memcpy(xl_priv->xl_functional_addr, dev_mc_address,4) ; 
-               xl_srb_cmd(dev, SET_FUNC_ADDRESS) ; 
-       }
-       return ; 
-}
-
-
-/*
- *     We issued an srb command and now we must read
- *     the response from the completed command.
- */
-
-static void xl_srb_bh(struct net_device *dev) 
-{ 
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       u8 srb_cmd, ret_code ; 
-       int i ; 
-
-       writel(MEM_BYTE_READ | 0xd0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-       srb_cmd = readb(xl_mmio + MMIO_MACDATA) ; 
-       writel((MEM_BYTE_READ | 0xd0000 | xl_priv->srb) +2, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-       ret_code = readb(xl_mmio + MMIO_MACDATA) ; 
-
-       /* Ret_code is standard across all commands */
-
-       switch (ret_code) { 
-       case 1:
-               printk(KERN_INFO "%s: Command: %d - Invalid Command code\n",dev->name,srb_cmd) ; 
-               break ; 
-       case 4:
-               printk(KERN_INFO "%s: Command: %d - Adapter is closed, must be open for this command\n",dev->name,srb_cmd);
-               break ;
-       
-       case 6:
-               printk(KERN_INFO "%s: Command: %d - Options Invalid for command\n",dev->name,srb_cmd);
-               break ;
-
-       case 0: /* Successful command execution */ 
-               switch (srb_cmd) { 
-               case READ_LOG: /* Returns 14 bytes of data from the NIC */
-                       if(xl_priv->xl_message_level)
-                               printk(KERN_INFO "%s: READ.LOG 14 bytes of data ",dev->name) ; 
-                       /* 
-                        * We still have to read the log even if message_level = 0 and we don't want
-                        * to see it
-                        */
-                       for (i=0;i<14;i++) { 
-                               writel(MEM_BYTE_READ | 0xd0000 | xl_priv->srb | i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                               if(xl_priv->xl_message_level) 
-                                       printk("%02x:",readb(xl_mmio + MMIO_MACDATA)) ;         
-                       } 
-                       printk("\n") ; 
-                       break ; 
-               case SET_FUNC_ADDRESS:
-                       if(xl_priv->xl_message_level) 
-                               printk(KERN_INFO "%s: Functional Address Set\n",dev->name);
-                       break ; 
-               case CLOSE_NIC:
-                       if(xl_priv->xl_message_level)
-                               printk(KERN_INFO "%s: Received CLOSE_NIC interrupt in interrupt handler\n",dev->name);
-                       break ; 
-               case SET_MULTICAST_MODE:
-                       if(xl_priv->xl_message_level)
-                               printk(KERN_INFO "%s: Multicast options successfully changed\n",dev->name) ; 
-                       break ;
-               case SET_RECEIVE_MODE:
-                       if(xl_priv->xl_message_level) {  
-                               if (xl_priv->xl_copy_all_options == 0x0004) 
-                                       printk(KERN_INFO "%s: Entering promiscuous mode\n", dev->name);
-                               else
-                                       printk(KERN_INFO "%s: Entering normal receive mode\n",dev->name);
-                       }
-                       break ; 
-               } /* switch */
-               break ; 
-       } /* switch */
-       return ;        
-} 
-
-static int xl_set_mac_address (struct net_device *dev, void *addr) 
-{
-       struct sockaddr *saddr = addr ; 
-       struct xl_private *xl_priv = netdev_priv(dev);
-
-       if (netif_running(dev)) { 
-               printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ; 
-               return -EIO ; 
-       }
-
-       memcpy(xl_priv->xl_laa, saddr->sa_data,dev->addr_len) ; 
-       
-       if (xl_priv->xl_message_level) { 
-               printk(KERN_INFO "%s: MAC/LAA Set to  = %x.%x.%x.%x.%x.%x\n",dev->name, xl_priv->xl_laa[0],
-               xl_priv->xl_laa[1], xl_priv->xl_laa[2],
-               xl_priv->xl_laa[3], xl_priv->xl_laa[4],
-               xl_priv->xl_laa[5]);
-       } 
-
-       return 0 ; 
-}
-
-static void xl_arb_cmd(struct net_device *dev)
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       u8 arb_cmd ; 
-       u16 lan_status, lan_status_diff ; 
-
-       writel( ( MEM_BYTE_READ | 0xD0000 | xl_priv->arb), xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       arb_cmd = readb(xl_mmio + MMIO_MACDATA) ; 
-       
-       if (arb_cmd == RING_STATUS_CHANGE) { /* Ring.Status.Change */
-               writel( ( (MEM_WORD_READ | 0xD0000 | xl_priv->arb) + 6), xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-                
-               printk(KERN_INFO "%s: Ring Status Change: New Status = %04x\n", dev->name, swab16(readw(xl_mmio + MMIO_MACDATA) )) ;
-
-               lan_status = swab16(readw(xl_mmio + MMIO_MACDATA));
-       
-               /* Acknowledge interrupt, this tells nic we are done with the arb */
-               writel(ACK_INTERRUPT | ARBCACK | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-                       
-               lan_status_diff = xl_priv->xl_lan_status ^ lan_status ; 
-
-               if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR) ) { 
-                       if (lan_status_diff & LSC_LWF) 
-                               printk(KERN_WARNING "%s: Short circuit detected on the lobe\n",dev->name);
-                       if (lan_status_diff & LSC_ARW) 
-                               printk(KERN_WARNING "%s: Auto removal error\n",dev->name);
-                       if (lan_status_diff & LSC_FPE)
-                               printk(KERN_WARNING "%s: FDX Protocol Error\n",dev->name);
-                       if (lan_status_diff & LSC_RR) 
-                               printk(KERN_WARNING "%s: Force remove MAC frame received\n",dev->name);
-               
-                       /* Adapter has been closed by the hardware */
-
-                       netif_stop_queue(dev);
-                       xl_freemem(dev) ; 
-                       free_irq(dev->irq,dev);
-                       
-                       printk(KERN_WARNING "%s: Adapter has been closed\n", dev->name);
-               } /* If serious error */
-               
-               if (xl_priv->xl_message_level) { 
-                       if (lan_status_diff & LSC_SIG_LOSS) 
-                                       printk(KERN_WARNING "%s: No receive signal detected\n", dev->name);
-                       if (lan_status_diff & LSC_HARD_ERR)
-                                       printk(KERN_INFO "%s: Beaconing\n",dev->name);
-                       if (lan_status_diff & LSC_SOFT_ERR)
-                                       printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame\n",dev->name);
-                       if (lan_status_diff & LSC_TRAN_BCN) 
-                                       printk(KERN_INFO "%s: We are transmitting the beacon, aaah\n",dev->name);
-                       if (lan_status_diff & LSC_SS) 
-                                       printk(KERN_INFO "%s: Single Station on the ring\n", dev->name);
-                       if (lan_status_diff & LSC_RING_REC)
-                                       printk(KERN_INFO "%s: Ring recovery ongoing\n",dev->name);
-                       if (lan_status_diff & LSC_FDX_MODE)
-                                       printk(KERN_INFO "%s: Operating in FDX mode\n",dev->name);
-               }       
-               
-               if (lan_status_diff & LSC_CO) { 
-                               if (xl_priv->xl_message_level) 
-                                       printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-                               /* Issue READ.LOG command */
-                               xl_srb_cmd(dev, READ_LOG) ;     
-               }
-
-               /* There is no command in the tech docs to issue the read_sr_counters */
-               if (lan_status_diff & LSC_SR_CO) { 
-                       if (xl_priv->xl_message_level)
-                               printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
-               }
-
-               xl_priv->xl_lan_status = lan_status ; 
-       
-       }  /* Lan.change.status */
-       else if ( arb_cmd == RECEIVE_DATA) { /* Received.Data */
-#if XL_DEBUG
-               printk(KERN_INFO "Received.Data\n");
-#endif                 
-               writel( ((MEM_WORD_READ | 0xD0000 | xl_priv->arb) + 6), xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-               xl_priv->mac_buffer = swab16(readw(xl_mmio + MMIO_MACDATA)) ;
-               
-               /* Now we are going to be really basic here and not do anything
-                * with the data at all. The tech docs do not give me enough
-                * information to calculate the buffers properly so we're
-                * just going to tell the nic that we've dealt with the frame
-                * anyway.
-                */
-
-               /* Acknowledge interrupt, this tells nic we are done with the arb */
-               writel(ACK_INTERRUPT | ARBCACK | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; 
-
-               /* Is the ASB free ? */         
-                       
-               xl_priv->asb_queued = 0 ;                       
-               writel( ((MEM_BYTE_READ | 0xD0000 | xl_priv->asb) + 2), xl_mmio + MMIO_MAC_ACCESS_CMD) ;
-               if (readb(xl_mmio + MMIO_MACDATA) != 0xff) { 
-                       xl_priv->asb_queued = 1 ;
-
-                       xl_wait_misr_flags(dev) ;  
-
-                       writel(MEM_BYTE_WRITE | MF_ASBFR, xl_mmio + MMIO_MAC_ACCESS_CMD); 
-                       writeb(0xff, xl_mmio + MMIO_MACDATA) ;
-                       writel(MMIO_BYTE_WRITE | MISR_SET, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                       writeb(MISR_ASBFR, xl_mmio + MMIO_MACDATA) ; 
-                       return ;        
-                       /* Drop out and wait for the bottom half to be run */
-               }
-       
-               xl_asb_cmd(dev) ; 
-               
-       } else {
-               printk(KERN_WARNING "%s: Received unknown arb (xl_priv) command: %02x\n",dev->name,arb_cmd);
-       }
-
-       /* Acknowledge the arb interrupt */
-
-       writel(ACK_INTERRUPT | ARBCACK | LATCH_ACK , xl_mmio + MMIO_COMMAND) ; 
-
-       return ; 
-}
-
-
-/*
- *     There is only one asb command, but we can get called from different
- *     places.
- */
-
-static void xl_asb_cmd(struct net_device *dev)
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-
-       if (xl_priv->asb_queued == 1) 
-               writel(ACK_INTERRUPT | LATCH_ACK | ASBFACK, xl_mmio + MMIO_COMMAND) ; 
-               
-       writel(MEM_BYTE_WRITE | 0xd0000 | xl_priv->asb, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0x81, xl_mmio + MMIO_MACDATA) ; 
-
-       writel(MEM_WORD_WRITE | 0xd0000 | xl_priv->asb | 6, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writew(swab16(xl_priv->mac_buffer), xl_mmio + MMIO_MACDATA) ;
-
-       xl_wait_misr_flags(dev) ;       
-
-       writel(MEM_BYTE_WRITE | MF_RASB, xl_mmio + MMIO_MAC_ACCESS_CMD); 
-       writeb(0xff, xl_mmio + MMIO_MACDATA) ;
-
-       writel(MMIO_BYTE_WRITE | MISR_SET, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(MISR_RASB, xl_mmio + MMIO_MACDATA) ; 
-
-       xl_priv->asb_queued = 2 ; 
-
-       return ; 
-}
-
-/*
- *     This will only get called if there was an error
- *     from the asb cmd.
- */
-static void xl_asb_bh(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       u8 ret_code ; 
-
-       writel(MMIO_BYTE_READ | 0xd0000 | xl_priv->asb | 2, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       ret_code = readb(xl_mmio + MMIO_MACDATA) ; 
-       switch (ret_code) { 
-               case 0x01:
-                       printk(KERN_INFO "%s: ASB Command, unrecognized command code\n",dev->name);
-                       break ;
-               case 0x26:
-                       printk(KERN_INFO "%s: ASB Command, unexpected receive buffer\n", dev->name);
-                       break ; 
-               case 0x40:
-                       printk(KERN_INFO "%s: ASB Command, Invalid Station ID\n", dev->name);
-                       break ;  
-       }
-       xl_priv->asb_queued = 0 ; 
-       writel(ACK_INTERRUPT | LATCH_ACK | ASBFACK, xl_mmio + MMIO_COMMAND) ;
-       return ;  
-}
-
-/*     
- *     Issue srb commands to the nic 
- */
-
-static void xl_srb_cmd(struct net_device *dev, int srb_cmd) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-
-       switch (srb_cmd) { 
-       case READ_LOG:
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(READ_LOG, xl_mmio + MMIO_MACDATA) ; 
-               break; 
-
-       case CLOSE_NIC:
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(CLOSE_NIC, xl_mmio + MMIO_MACDATA) ; 
-               break ;
-
-       case SET_RECEIVE_MODE:
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(SET_RECEIVE_MODE, xl_mmio + MMIO_MACDATA) ; 
-               writel(MEM_WORD_WRITE | 0xD0000 | xl_priv->srb | 4, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writew(xl_priv->xl_copy_all_options, xl_mmio + MMIO_MACDATA) ; 
-               break ;
-
-       case SET_FUNC_ADDRESS:
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(SET_FUNC_ADDRESS, xl_mmio + MMIO_MACDATA) ; 
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb | 6 , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(xl_priv->xl_functional_addr[0], xl_mmio + MMIO_MACDATA) ; 
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb | 7 , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(xl_priv->xl_functional_addr[1], xl_mmio + MMIO_MACDATA) ; 
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb | 8 , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(xl_priv->xl_functional_addr[2], xl_mmio + MMIO_MACDATA) ; 
-               writel(MEM_BYTE_WRITE | 0xD0000 | xl_priv->srb | 9 , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-               writeb(xl_priv->xl_functional_addr[3], xl_mmio + MMIO_MACDATA) ;
-               break ;  
-       } /* switch */
-
-
-       xl_wait_misr_flags(dev)  ; 
-
-       /* Write 0xff to the CSRB flag */
-       writel(MEM_BYTE_WRITE | MF_CSRB , xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0xFF, xl_mmio + MMIO_MACDATA) ; 
-       /* Set csrb bit in MISR register to process command */
-       writel(MMIO_BYTE_WRITE | MISR_SET, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(MISR_CSRB, xl_mmio + MMIO_MACDATA) ; 
-       xl_priv->srb_queued = 1 ; 
-
-       return ; 
-}
-
-/*
- * This is nasty, to use the MISR command you have to wait for 6 memory locations
- * to be zero. This is the way the driver does on other OS'es so we should be ok with 
- * the empty loop.
- */
-
-static void xl_wait_misr_flags(struct net_device *dev) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u8 __iomem * xl_mmio = xl_priv->xl_mmio ; 
-       
-       int i  ; 
-       
-       writel(MMIO_BYTE_READ | MISR_RW, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       if (readb(xl_mmio + MMIO_MACDATA) != 0) {  /* Misr not clear */
-               for (i=0; i<6; i++) { 
-                       writel(MEM_BYTE_READ | 0xDFFE0 | i, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-                       while (readb(xl_mmio + MMIO_MACDATA) != 0) {
-                               ;       /* Empty Loop */
-                       }
-               } 
-       }
-
-       writel(MMIO_BYTE_WRITE | MISR_AND, xl_mmio + MMIO_MAC_ACCESS_CMD) ; 
-       writeb(0x80, xl_mmio + MMIO_MACDATA) ; 
-
-       return ; 
-} 
-
-/*
- *     Change mtu size, this should work the same as olympic
- */
-
-static int xl_change_mtu(struct net_device *dev, int mtu) 
-{
-       struct xl_private *xl_priv = netdev_priv(dev);
-       u16 max_mtu ; 
-
-       if (xl_priv->xl_ring_speed == 4)
-               max_mtu = 4500 ; 
-       else
-               max_mtu = 18000 ; 
-       
-       if (mtu > max_mtu)
-               return -EINVAL ; 
-       if (mtu < 100) 
-               return -EINVAL ; 
-
-       dev->mtu = mtu ; 
-       xl_priv->pkt_buf_sz = mtu + TR_HLEN ; 
-
-       return 0 ; 
-}
-
-static void __devexit xl_remove_one (struct pci_dev *pdev)
-{
-       struct net_device *dev = pci_get_drvdata(pdev);
-       struct xl_private *xl_priv=netdev_priv(dev);
-       
-       release_firmware(xl_priv->fw);
-       unregister_netdev(dev);
-       iounmap(xl_priv->xl_mmio) ; 
-       pci_release_regions(pdev) ; 
-       pci_set_drvdata(pdev,NULL) ; 
-       free_netdev(dev);
-       return ; 
-}
-
-static struct pci_driver xl_3c359_driver = {
-       .name           = "3c359",
-       .id_table       = xl_pci_tbl,
-       .probe          = xl_probe,
-       .remove         = __devexit_p(xl_remove_one),
-};
-
-module_pci_driver(xl_3c359_driver);
-
-MODULE_LICENSE("GPL") ; 
diff --git a/drivers/net/tokenring/3c359.h b/drivers/net/tokenring/3c359.h
deleted file mode 100644 (file)
index bcb1a6b..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  3c359.h (c) 2000 Mike Phillips (mikep@linuxtr.net) All Rights Reserved
- *
- *  Linux driver for 3Com 3C359 Token Link PCI XL cards.
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License Version 2 or (at your option) 
- *  any later verion, incorporated herein by reference.
- */
-
-/* Memory Access Commands */
-#define IO_BYTE_READ 0x28 << 24
-#define IO_BYTE_WRITE 0x18 << 24 
-#define IO_WORD_READ 0x20 << 24
-#define IO_WORD_WRITE 0x10 << 24
-#define MMIO_BYTE_READ 0x88 << 24
-#define MMIO_BYTE_WRITE 0x48 << 24
-#define MMIO_WORD_READ 0x80 << 24
-#define MMIO_WORD_WRITE 0x40 << 24
-#define MEM_BYTE_READ 0x8C << 24
-#define MEM_BYTE_WRITE 0x4C << 24
-#define MEM_WORD_READ 0x84 << 24
-#define MEM_WORD_WRITE 0x44 << 24
-
-#define PMBAR 0x1C80
-#define PMB_CPHOLD (1<<10)
-
-#define CPATTENTION 0x180D
-#define CPA_PMBARVIS (1<<7)
-#define CPA_MEMWREN (1<<6)
-
-#define SWITCHSETTINGS 0x1C88
-#define EECONTROL 0x1C8A
-#define EEDATA 0x1C8C
-#define EEREAD 0x0080 
-#define EEWRITE 0x0040
-#define EEERASE 0x0060
-#define EE_ENABLE_WRITE 0x0030
-#define EEBUSY (1<<15)
-
-#define WRBR 0xCDE02
-#define WWOR 0xCDE04
-#define WWCR 0xCDE06
-#define MACSTATUS 0xCDE08 
-#define MISR_RW 0xCDE0B
-#define MISR_AND 0xCDE2B
-#define MISR_SET 0xCDE4B
-#define RXBUFAREA 0xCDE10
-#define RXEARLYTHRESH 0xCDE12
-#define TXSTARTTHRESH 0x58
-#define DNPRIREQTHRESH 0x2C
-
-#define MISR_CSRB (1<<5)
-#define MISR_RASB (1<<4)
-#define MISR_SRBFR (1<<3)
-#define MISR_ASBFR (1<<2)
-#define MISR_ARBF (1<<1) 
-
-/* MISR Flags memory locations */
-#define MF_SSBF 0xDFFE0 
-#define MF_ARBF 0xDFFE1
-#define MF_ASBFR 0xDFFE2
-#define MF_SRBFR 0xDFFE3
-#define MF_RASB 0xDFFE4
-#define MF_CSRB 0xDFFE5
-
-#define MMIO_MACDATA 0x10 
-#define MMIO_MAC_ACCESS_CMD 0x14
-#define MMIO_TIMER 0x1A
-#define MMIO_DMA_CTRL 0x20
-#define MMIO_DNLISTPTR 0x24
-#define MMIO_HASHFILTER 0x28
-#define MMIO_CONFIG 0x29
-#define MMIO_DNPRIREQTHRESH 0x2C
-#define MMIO_DNPOLL 0x2D
-#define MMIO_UPPKTSTATUS 0x30
-#define MMIO_FREETIMER 0x34
-#define MMIO_COUNTDOWN 0x36
-#define MMIO_UPLISTPTR 0x38
-#define MMIO_UPPOLL 0x3C
-#define MMIO_UPBURSTTHRESH 0x40
-#define MMIO_DNBURSTTHRESH 0x41
-#define MMIO_INTSTATUS_AUTO 0x56
-#define MMIO_TXSTARTTHRESH 0x58
-#define MMIO_INTERRUPTENABLE 0x5A
-#define MMIO_INDICATIONENABLE 0x5C
-#define MMIO_COMMAND 0x5E  /* These two are meant to be the same */
-#define MMIO_INTSTATUS 0x5E /* Makes the code more readable this way */
-#define INTSTAT_CMD_IN_PROGRESS (1<<12) 
-#define INTSTAT_SRB (1<<14)
-#define INTSTAT_INTLATCH (1<<0)
-
-/* Indication / Interrupt Mask 
- * Annoyingly the bits to be set in the indication and interrupt enable
- * do not match with the actual bits received in the interrupt, although
- * they are in the same order. 
- * The mapping for the indication / interrupt are:
- * Bit Indication / Interrupt
- *   0 HostError
- *   1 txcomplete
- *   2 updneeded
- *   3 rxcomplete
- *   4 intrequested
- *   5 macerror
- *   6  dncomplete
- *   7 upcomplete
- *   8 txunderrun
- *   9 asbf
- *  10 srbr
- *  11 arbc
- *
- *  The only ones we don't want to receive are txcomplete and rxcomplete
- *  we use dncomplete and upcomplete instead.
- */
-
-#define INT_MASK 0xFF5
-
-/* Note the subtle difference here, IND and INT */
-
-#define SETINDENABLE (8<<12)
-#define SETINTENABLE (7<<12)
-#define SRBBIT (1<<10)
-#define ASBBIT (1<<9)
-#define ARBBIT (1<<11)
-
-#define SRB 0xDFE90
-#define ASB 0xDFED0
-#define ARB 0xD0000
-#define SCRATCH 0xDFEF0
-
-#define INT_REQUEST 0x6000 /* (6 << 12) */
-#define ACK_INTERRUPT 0x6800 /* (13 <<11) */
-#define GLOBAL_RESET 0x00 
-#define DNDISABLE 0x5000 
-#define DNENABLE 0x4800 
-#define DNSTALL 0x3002
-#define DNRESET 0x5800
-#define DNUNSTALL 0x3003
-#define UPRESET 0x2800
-#define UPSTALL 0x3000
-#define UPUNSTALL 0x3001
-#define SETCONFIG 0x4000
-#define SETTXSTARTTHRESH 0x9800 
-
-/* Received Interrupts */
-#define ASBFINT (1<<13)
-#define SRBRINT (1<<14)
-#define ARBCINT (1<<15)
-#define TXUNDERRUN (1<<11)
-
-#define UPCOMPINT (1<<10)
-#define DNCOMPINT (1<<9)
-#define HARDERRINT (1<<7)
-#define RXCOMPLETE (1<<4)
-#define TXCOMPINT (1<<2)
-#define HOSTERRINT (1<<1)
-
-/* Receive descriptor bits */
-#define RXOVERRUN cpu_to_le32(1<<19)
-#define RXFC cpu_to_le32(1<<21)
-#define RXAR cpu_to_le32(1<<22)
-#define RXUPDCOMPLETE cpu_to_le32(1<<23)
-#define RXUPDFULL cpu_to_le32(1<<24)
-#define RXUPLASTFRAG cpu_to_le32(1<<31)
-
-/* Transmit descriptor bits */
-#define TXDNCOMPLETE cpu_to_le32(1<<16)
-#define TXTXINDICATE cpu_to_le32(1<<27)
-#define TXDPDEMPTY cpu_to_le32(1<<29)
-#define TXDNINDICATE cpu_to_le32(1<<31)
-#define TXDNFRAGLAST cpu_to_le32(1<<31)
-
-/* Interrupts to Acknowledge */
-#define LATCH_ACK 1 
-#define TXCOMPACK (1<<1)
-#define INTREQACK (1<<2)
-#define DNCOMPACK (1<<3)
-#define UPCOMPACK (1<<4)
-#define ASBFACK (1<<5)
-#define SRBRACK (1<<6)
-#define ARBCACK (1<<7)
-
-#define XL_IO_SPACE 128
-#define SRB_COMMAND_SIZE 50
-
-/* Adapter Commands */
-#define REQUEST_INT 0x00
-#define MODIFY_OPEN_PARMS 0x01
-#define RESTORE_OPEN_PARMS 0x02
-#define OPEN_NIC 0x03
-#define CLOSE_NIC 0x04
-#define SET_SLEEP_MODE 0x05
-#define SET_GROUP_ADDRESS 0x06
-#define SET_FUNC_ADDRESS 0x07
-#define READ_LOG 0x08
-#define SET_MULTICAST_MODE 0x0C
-#define CHANGE_WAKEUP_PATTERN 0x0D
-#define GET_STATISTICS 0x13
-#define SET_RECEIVE_MODE 0x1F
-
-/* ARB Commands */
-#define RECEIVE_DATA 0x81
-#define RING_STATUS_CHANGE 0x84
-
-/* ASB Commands */
-#define ASB_RECEIVE_DATE 0x81 
-
-/* Defines for LAN STATUS CHANGE reports */
-#define LSC_SIG_LOSS 0x8000
-#define LSC_HARD_ERR 0x4000
-#define LSC_SOFT_ERR 0x2000
-#define LSC_TRAN_BCN 0x1000
-#define LSC_LWF      0x0800
-#define LSC_ARW      0x0400
-#define LSC_FPE      0x0200
-#define LSC_RR       0x0100
-#define LSC_CO       0x0080
-#define LSC_SS       0x0040
-#define LSC_RING_REC 0x0020
-#define LSC_SR_CO    0x0010
-#define LSC_FDX_MODE 0x0004
-
-#define XL_MAX_ADAPTERS 8 /* 0x08 __MODULE_STRING can't hand 0xnn */
-
-/* 3c359 defaults for buffers */
-#define XL_RX_RING_SIZE 16 /* must be a power of 2 */
-#define XL_TX_RING_SIZE 16 /* must be a power of 2 */
-
-#define PKT_BUF_SZ 4096 /* Default packet size */
-
-/* 3c359 data structures */
-
-struct xl_tx_desc {
-       __le32 dnnextptr;
-       __le32 framestartheader;
-       __le32 buffer;
-       __le32 buffer_length;
-};
-
-struct xl_rx_desc {
-       __le32 upnextptr;
-       __le32 framestatus;
-       __le32 upfragaddr;
-       __le32 upfraglen;
-};
-
-struct xl_private {
-       
-
-       /* These two structures must be aligned on 8 byte boundaries */
-
-       /* struct xl_rx_desc xl_rx_ring[XL_RX_RING_SIZE]; */
-       /* struct xl_tx_desc xl_tx_ring[XL_TX_RING_SIZE]; */
-       struct xl_rx_desc *xl_rx_ring ; 
-       struct xl_tx_desc *xl_tx_ring ; 
-       struct sk_buff *tx_ring_skb[XL_TX_RING_SIZE], *rx_ring_skb[XL_RX_RING_SIZE];    
-       int tx_ring_head, tx_ring_tail ;  
-       int rx_ring_tail, rx_ring_no ; 
-       int free_ring_entries ; 
-
-       u16 srb;
-       u16 arb;
-       u16 asb;
-
-       u8 __iomem *xl_mmio;
-       const char *xl_card_name;
-       struct pci_dev *pdev ; 
-       
-       spinlock_t xl_lock ; 
-
-       volatile int srb_queued;    
-       struct wait_queue *srb_wait;
-       volatile int asb_queued;   
-
-       u16 mac_buffer ;        
-       u16 xl_lan_status ;
-       u8 xl_ring_speed ;
-       u16 pkt_buf_sz ; 
-       u8 xl_message_level; 
-       u16 xl_copy_all_options ;  
-       unsigned char xl_functional_addr[4] ; 
-       u16 xl_addr_table_addr, xl_parms_addr ; 
-       u8 xl_laa[6] ; 
-       u32 rx_ring_dma_addr ; 
-       u32 tx_ring_dma_addr ; 
-
-       /* firmware section */
-       const struct firmware *fw;
-};
-
diff --git a/drivers/net/tokenring/Kconfig b/drivers/net/tokenring/Kconfig
deleted file mode 100644 (file)
index ef3bb13..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-#
-# Token Ring driver configuration
-#
-
-# So far, we only have PCI, ISA, and MCA token ring devices
-menuconfig TR
-       bool "Token Ring driver support"
-       depends on NETDEVICES && !UML
-       depends on (PCI || ISA || MCA || CCW || PCMCIA)
-       help
-         Token Ring is IBM's way of communication on a local network; the
-         rest of the world uses Ethernet. To participate on a Token Ring
-         network, you need a special Token ring network card. If you are
-         connected to such a Token Ring network and want to use your Token
-         Ring card under Linux, say Y here and to the driver for your
-         particular card below and read the Token-Ring mini-HOWTO, available
-         from <http://www.tldp.org/docs.html#howto>. Most people can
-         say N here.
-
-if TR
-
-config WANT_LLC
-       def_bool y
-       select LLC
-
-config PCMCIA_IBMTR
-       tristate "IBM PCMCIA tokenring adapter support"
-       depends on IBMTR!=y && PCMCIA
-       ---help---
-         Say Y here if you intend to attach this type of Token Ring PCMCIA
-         card to your computer. You then also need to say Y to "Token Ring
-         driver support".
-
-         To compile this driver as a module, choose M here: the module will be
-         called ibmtr_cs.
-
-config IBMTR
-       tristate "IBM Tropic chipset based adapter support"
-       depends on ISA || MCA
-       ---help---
-         This is support for all IBM Token Ring cards that don't use DMA. If
-         you have such a beast, say Y and read the Token-Ring mini-HOWTO,
-         available from <http://www.tldp.org/docs.html#howto>.
-
-         Warning: this driver will almost definitely fail if more than one
-         active Token Ring card is present.
-
-         To compile this driver as a module, choose M here: the module will be
-         called ibmtr.
-
-config IBMOL
-       tristate "IBM Olympic chipset PCI adapter support"
-       depends on PCI
-       ---help---
-         This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
-         Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
-         Wake On Lan, and PCI 100/16/4 adapters.
-
-         If you have such an adapter, say Y and read the Token-Ring
-         mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the module will be
-         called olympic.
-
-         Also read <file:Documentation/networking/olympic.txt> or check the
-         Linux Token Ring Project site for the latest information at
-         <http://www.linuxtr.net/>.
-
-config IBMLS
-       tristate "IBM Lanstreamer chipset PCI adapter support"
-       depends on PCI && !64BIT
-       help
-         This is support for IBM Lanstreamer PCI Token Ring Cards.
-
-         If you have such an adapter, say Y and read the Token-Ring
-         mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the module will be
-         called lanstreamer.
-
-config 3C359
-       tristate "3Com 3C359 Token Link Velocity XL adapter support"
-       depends on PCI
-       ---help---
-         This is support for the 3Com PCI Velocity XL cards, specifically
-         the 3Com 3C359, please note this is not for the 3C339 cards, you
-         should use the tms380 driver instead.
-
-         If you have such an adapter, say Y and read the Token-Ring
-         mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the module will be
-         called 3c359.
-
-         Also read the file <file:Documentation/networking/3c359.txt> or check the 
-         Linux Token Ring Project site for the latest information at
-         <http://www.linuxtr.net>
-
-config TMS380TR
-       tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
-       depends on PCI || ISA || MCA
-       select FW_LOADER
-       ---help---
-         This driver provides generic support for token ring adapters
-         based on the Texas Instruments TMS380 series chipsets.  This
-         includes the SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect
-         TR4/16(+) PCI (SK-4590), SysKonnect TR4/16 PCI (SK-4591),
-         Compaq 4/16 PCI, Thomas-Conrad TC4048 4/16 PCI, and several
-         Madge adapters.  If you say Y here, you will be asked to select
-         which cards to support below.  If you're using modules, each
-         class of card will be supported by a separate module.
-
-         If you have such an adapter and would like to use it, say Y and
-         read the Token-Ring mini-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         Also read the file <file:Documentation/networking/tms380tr.txt> or
-         check <http://www.auk.cx/tms380tr/>.
-
-         To compile this driver as a module, choose M here: the module will be
-         called tms380tr.
-
-config TMSPCI
-       tristate "Generic TMS380 PCI support"
-       depends on TMS380TR && PCI
-       ---help---
-         This tms380 module supports generic TMS380-based PCI cards.
-
-         These cards are known to work:
-         - Compaq 4/16 TR PCI
-         - SysKonnect TR4/16 PCI (SK-4590/SK-4591)
-         - Thomas-Conrad TC4048 PCI 4/16
-         - 3Com Token Link Velocity
-
-         To compile this driver as a module, choose M here: the module will be
-         called tmspci.
-
-config SKISA
-       tristate "SysKonnect TR4/16 ISA support"
-       depends on TMS380TR && ISA && ISA_DMA_API
-       help
-         This tms380 module supports SysKonnect TR4/16 ISA cards.
-
-         These cards are known to work:
-         - SysKonnect TR4/16 ISA (SK-4190)
-
-         To compile this driver as a module, choose M here: the module will be
-         called skisa.
-
-config PROTEON
-       tristate "Proteon ISA support"
-       depends on TMS380TR && ISA && ISA_DMA_API
-       help
-         This tms380 module supports Proteon ISA cards.
-
-         These cards are known to work:
-         - Proteon 1392
-         - Proteon 1392 plus
-
-         To compile this driver as a module, choose M here: the module will be
-         called proteon.
-
-config ABYSS
-       tristate "Madge Smart 16/4 PCI Mk2 support"
-       depends on TMS380TR && PCI
-       help
-         This tms380 module supports the Madge Smart 16/4 PCI Mk2
-         cards (51-02).
-
-         To compile this driver as a module, choose M here: the module will be
-         called abyss.
-
-config MADGEMC
-       tristate "Madge Smart 16/4 Ringnode MicroChannel"
-       depends on TMS380TR && MCA
-       help
-         This tms380 module supports the Madge Smart 16/4 MC16 and MC32
-         MicroChannel adapters.
-
-         To compile this driver as a module, choose M here: the module will be
-         called madgemc.
-
-config SMCTR
-       tristate "SMC ISA/MCA adapter support"
-       depends on (ISA || MCA_LEGACY) && (BROKEN || !64BIT)
-       ---help---
-         This is support for the ISA and MCA SMC Token Ring cards,
-         specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
-         (8115T/A) adapters.
-
-         If you have such an adapter and would like to use it, say Y or M and
-         read the Token-Ring mini-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto> and the file
-         <file:Documentation/networking/smctr.txt>.
-
-         To compile this driver as a module, choose M here: the module will be
-         called smctr.
-
-endif # TR
diff --git a/drivers/net/tokenring/Makefile b/drivers/net/tokenring/Makefile
deleted file mode 100644 (file)
index f1be8d9..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Makefile for drivers/net/tokenring
-#
-
-obj-$(CONFIG_PCMCIA_IBMTR)     += ibmtr_cs.o
-obj-$(CONFIG_IBMTR)    += ibmtr.o
-obj-$(CONFIG_IBMOL)    += olympic.o
-obj-$(CONFIG_IBMLS)    += lanstreamer.o
-obj-$(CONFIG_TMS380TR) += tms380tr.o
-obj-$(CONFIG_ABYSS)    += abyss.o
-obj-$(CONFIG_MADGEMC)  += madgemc.o
-obj-$(CONFIG_PROTEON)  += proteon.o
-obj-$(CONFIG_TMSPCI)   += tmspci.o
-obj-$(CONFIG_SKISA)    += skisa.o
-obj-$(CONFIG_SMCTR)    += smctr.o
-obj-$(CONFIG_3C359)    += 3c359.o
diff --git a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c
deleted file mode 100644 (file)
index b715e6b..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- *  abyss.c: Network driver for the Madge Smart 16/4 PCI Mk2 token ring card.
- *
- *  Written 1999-2000 by Adam Fritzler
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This driver module supports the following cards:
- *      - Madge Smart 16/4 PCI Mk2
- *
- *  Maintainer(s):
- *    AF       Adam Fritzler
- *
- *  Modification History:
- *     30-Dec-99       AF      Split off from the tms380tr driver.
- *     22-Jan-00       AF      Updated to use indirect read/writes 
- *     23-Nov-00       JG      New PCI API, cleanups
- *
- *
- *  TODO:
- *     1. See if we can use MMIO instead of inb/outb/inw/outw
- *     2. Add support for Mk1 (has AT24 attached to the PCI
- *             config registers)
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include "tms380tr.h"
-#include "abyss.h"            /* Madge-specific constants */
-
-static char version[] __devinitdata =
-"abyss.c: v1.02 23/11/2000 by Adam Fritzler\n";
-
-#define ABYSS_IO_EXTENT 64
-
-static DEFINE_PCI_DEVICE_TABLE(abyss_pci_tbl) = {
-       { PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_MK2,
-         PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_TOKEN_RING << 8, 0x00ffffff, },
-       { }                     /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(pci, abyss_pci_tbl);
-
-MODULE_LICENSE("GPL");
-
-static int abyss_open(struct net_device *dev);
-static int abyss_close(struct net_device *dev);
-static void abyss_enable(struct net_device *dev);
-static int abyss_chipset_init(struct net_device *dev);
-static void abyss_read_eeprom(struct net_device *dev);
-static unsigned short abyss_setnselout_pins(struct net_device *dev);
-
-static void at24_writedatabyte(unsigned long regaddr, unsigned char byte);
-static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr);
-static int at24_sendcmd(unsigned long regaddr, unsigned char cmd);
-static unsigned char at24_readdatabit(unsigned long regaddr);
-static unsigned char at24_readdatabyte(unsigned long regaddr);
-static int at24_waitforack(unsigned long regaddr);
-static int at24_waitfornack(unsigned long regaddr);
-static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data);
-static void at24_start(unsigned long regaddr);
-static unsigned char at24_readb(unsigned long regaddr, unsigned char addr);
-
-static unsigned short abyss_sifreadb(struct net_device *dev, unsigned short reg)
-{
-       return inb(dev->base_addr + reg);
-}
-
-static unsigned short abyss_sifreadw(struct net_device *dev, unsigned short reg)
-{
-       return inw(dev->base_addr + reg);
-}
-
-static void abyss_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outb(val, dev->base_addr + reg);
-}
-
-static void abyss_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outw(val, dev->base_addr + reg);
-}
-
-static struct net_device_ops abyss_netdev_ops;
-
-static int __devinit abyss_attach(struct pci_dev *pdev, const struct pci_device_id *ent)
-{      
-       static int versionprinted;
-       struct net_device *dev;
-       struct net_local *tp;
-       int ret, pci_irq_line;
-       unsigned long pci_ioaddr;
-       
-       if (versionprinted++ == 0)
-               printk("%s", version);
-
-       if (pci_enable_device(pdev))
-               return -EIO;
-
-       /* Remove I/O space marker in bit 0. */
-       pci_irq_line = pdev->irq;
-       pci_ioaddr = pci_resource_start (pdev, 0);
-               
-       /* At this point we have found a valid card. */
-               
-       dev = alloc_trdev(sizeof(struct net_local));
-       if (!dev)
-               return -ENOMEM;
-
-       if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) {
-               ret = -EBUSY;
-               goto err_out_trdev;
-       }
-               
-       ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
-                         dev->name, dev);
-       if (ret)
-               goto err_out_region;
-               
-       dev->base_addr  = pci_ioaddr;
-       dev->irq        = pci_irq_line;
-               
-       printk("%s: Madge Smart 16/4 PCI Mk2 (Abyss)\n", dev->name);
-       printk("%s:    IO: %#4lx  IRQ: %d\n",
-              dev->name, pci_ioaddr, dev->irq);
-       /*
-        * The TMS SIF registers lay 0x10 above the card base address.
-        */
-       dev->base_addr += 0x10;
-               
-       ret = tmsdev_init(dev, &pdev->dev);
-       if (ret) {
-               printk("%s: unable to get memory for dev->priv.\n", 
-                      dev->name);
-               goto err_out_irq;
-       }
-
-       abyss_read_eeprom(dev);
-
-       printk("%s:    Ring Station Address: %pM\n", dev->name, dev->dev_addr);
-
-       tp = netdev_priv(dev);
-       tp->setnselout = abyss_setnselout_pins;
-       tp->sifreadb = abyss_sifreadb;
-       tp->sifreadw = abyss_sifreadw;
-       tp->sifwriteb = abyss_sifwriteb;
-       tp->sifwritew = abyss_sifwritew;
-
-       memcpy(tp->ProductID, "Madge PCI 16/4 Mk2", PROD_ID_SIZE + 1);
-               
-       dev->netdev_ops = &abyss_netdev_ops;
-
-       pci_set_drvdata(pdev, dev);
-       SET_NETDEV_DEV(dev, &pdev->dev);
-
-       ret = register_netdev(dev);
-       if (ret)
-               goto err_out_tmsdev;
-       return 0;
-
-err_out_tmsdev:
-       pci_set_drvdata(pdev, NULL);
-       tmsdev_term(dev);
-err_out_irq:
-       free_irq(pdev->irq, dev);
-err_out_region:
-       release_region(pci_ioaddr, ABYSS_IO_EXTENT);
-err_out_trdev:
-       free_netdev(dev);
-       return ret;
-}
-
-static unsigned short abyss_setnselout_pins(struct net_device *dev)
-{
-       unsigned short val = 0;
-       struct net_local *tp = netdev_priv(dev);
-       
-       if(tp->DataRate == SPEED_4)
-               val |= 0x01;  /* Set 4Mbps */
-       else
-               val |= 0x00;  /* Set 16Mbps */
-       
-       return val;
-}
-
-/*
- * The following Madge boards should use this code:
- *   - Smart 16/4 PCI Mk2 (Abyss)
- *   - Smart 16/4 PCI Mk1 (PCI T)
- *   - Smart 16/4 Client Plus PnP (Big Apple)
- *   - Smart 16/4 Cardbus Mk2
- *
- * These access an Atmel AT24 SEEPROM using their glue chip registers. 
- *
- */
-static void at24_writedatabyte(unsigned long regaddr, unsigned char byte)
-{
-       int i;
-       
-       for (i = 0; i < 8; i++) {
-               at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);
-               at24_setlines(regaddr, 1, (byte >> (7-i))&0x01);
-               at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);
-       }
-}
-
-static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr)
-{
-       if (at24_sendcmd(regaddr, cmd)) {
-               at24_writedatabyte(regaddr, addr);
-               return at24_waitforack(regaddr);
-       }
-       return 0;
-}
-
-static int at24_sendcmd(unsigned long regaddr, unsigned char cmd)
-{
-       int i;
-       
-       for (i = 0; i < 10; i++) {
-               at24_start(regaddr);
-               at24_writedatabyte(regaddr, cmd);
-               if (at24_waitforack(regaddr))
-                       return 1;
-       }
-       return 0;
-}
-
-static unsigned char at24_readdatabit(unsigned long regaddr)
-{
-       unsigned char val;
-
-       at24_setlines(regaddr, 0, 1);
-       at24_setlines(regaddr, 1, 1);
-       val = (inb(regaddr) & AT24_DATA)?1:0;
-       at24_setlines(regaddr, 1, 1);
-       at24_setlines(regaddr, 0, 1);
-       return val;
-}
-
-static unsigned char at24_readdatabyte(unsigned long regaddr)
-{
-       unsigned char data = 0;
-       int i;
-       
-       for (i = 0; i < 8; i++) {
-               data <<= 1;
-               data |= at24_readdatabit(regaddr);
-       }
-
-       return data;
-}
-
-static int at24_waitforack(unsigned long regaddr)
-{
-       int i;
-       
-       for (i = 0; i < 10; i++) {
-               if ((at24_readdatabit(regaddr) & 0x01) == 0x00)
-                       return 1;
-       }
-       return 0;
-}
-
-static int at24_waitfornack(unsigned long regaddr)
-{
-       int i;
-       for (i = 0; i < 10; i++) {
-               if ((at24_readdatabit(regaddr) & 0x01) == 0x01)
-                       return 1;
-       }
-       return 0;
-}
-
-static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data)
-{
-       unsigned char val = AT24_ENABLE;
-       if (clock)
-               val |= AT24_CLOCK;
-       if (data)
-               val |= AT24_DATA;
-
-       outb(val, regaddr); 
-       tms380tr_wait(20); /* Very necessary. */
-}
-
-static void at24_start(unsigned long regaddr)
-{
-       at24_setlines(regaddr, 0, 1);
-       at24_setlines(regaddr, 1, 1);
-       at24_setlines(regaddr, 1, 0);
-       at24_setlines(regaddr, 0, 1);
-}
-
-static unsigned char at24_readb(unsigned long regaddr, unsigned char addr)
-{
-       unsigned char data = 0xff;
-       
-       if (at24_sendfullcmd(regaddr, AT24_WRITE, addr)) {
-               if (at24_sendcmd(regaddr, AT24_READ)) {
-                       data = at24_readdatabyte(regaddr);
-                       if (!at24_waitfornack(regaddr))
-                               data = 0xff;
-               }
-       }
-       return data;
-}
-
-
-/*
- * Enable basic functions of the Madge chipset needed
- * for initialization.
- */
-static void abyss_enable(struct net_device *dev)
-{
-       unsigned char reset_reg;
-       unsigned long ioaddr;
-       
-       ioaddr = dev->base_addr;
-       reset_reg = inb(ioaddr + PCIBM2_RESET_REG);
-       reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-       tms380tr_wait(100);
-}
-
-/*
- * Enable the functions of the Madge chipset needed for
- * full working order. 
- */
-static int abyss_chipset_init(struct net_device *dev)
-{
-       unsigned char reset_reg;
-       unsigned long ioaddr;
-       
-       ioaddr = dev->base_addr;
-       
-       reset_reg = inb(ioaddr + PCIBM2_RESET_REG);
-       
-       reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-       
-       reset_reg &= ~(PCIBM2_RESET_REG_CHIP_NRES |
-                      PCIBM2_RESET_REG_FIFO_NRES | 
-                      PCIBM2_RESET_REG_SIF_NRES);
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-       
-       tms380tr_wait(100);
-       
-       reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-       
-       reset_reg |= PCIBM2_RESET_REG_SIF_NRES;
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-
-       reset_reg |= PCIBM2_RESET_REG_FIFO_NRES;
-       outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
-
-       outb(PCIBM2_INT_CONTROL_REG_SINTEN | 
-            PCIBM2_INT_CONTROL_REG_PCI_ERR_ENABLE, 
-            ioaddr + PCIBM2_INT_CONTROL_REG);
-  
-       outb(30, ioaddr + PCIBM2_FIFO_THRESHOLD);
-       
-       return 0;
-}
-
-static inline void abyss_chipset_close(struct net_device *dev)
-{
-       unsigned long ioaddr;
-       
-       ioaddr = dev->base_addr;
-       outb(0, ioaddr + PCIBM2_RESET_REG);
-}
-
-/*
- * Read configuration data from the AT24 SEEPROM on Madge cards.
- *
- */
-static void abyss_read_eeprom(struct net_device *dev)
-{
-       struct net_local *tp;
-       unsigned long ioaddr;
-       unsigned short val;
-       int i;
-       
-       tp = netdev_priv(dev);
-       ioaddr = dev->base_addr;
-       
-       /* Must enable glue chip first */
-       abyss_enable(dev);
-       
-       val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 
-                        PCIBM2_SEEPROM_RING_SPEED);
-       tp->DataRate = val?SPEED_4:SPEED_16; /* set open speed */
-       printk("%s:    SEEPROM: ring speed: %dMb/sec\n", dev->name, tp->DataRate);
-       
-       val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG,
-                        PCIBM2_SEEPROM_RAM_SIZE) * 128;
-       printk("%s:    SEEPROM: adapter RAM: %dkb\n", dev->name, val);
-       
-       dev->addr_len = 6;
-       for (i = 0; i < 6; i++) 
-               dev->dev_addr[i] = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 
-                                             PCIBM2_SEEPROM_BIA+i);
-}
-
-static int abyss_open(struct net_device *dev)
-{  
-       abyss_chipset_init(dev);
-       tms380tr_open(dev);
-       return 0;
-}
-
-static int abyss_close(struct net_device *dev)
-{
-       tms380tr_close(dev);
-       abyss_chipset_close(dev);
-       return 0;
-}
-
-static void __devexit abyss_detach (struct pci_dev *pdev)
-{
-       struct net_device *dev = pci_get_drvdata(pdev);
-       
-       BUG_ON(!dev);
-       unregister_netdev(dev);
-       release_region(dev->base_addr-0x10, ABYSS_IO_EXTENT);
-       free_irq(dev->irq, dev);
-       tmsdev_term(dev);
-       free_netdev(dev);
-       pci_set_drvdata(pdev, NULL);
-}
-
-static struct pci_driver abyss_driver = {
-       .name           = "abyss",
-       .id_table       = abyss_pci_tbl,
-       .probe          = abyss_attach,
-       .remove         = __devexit_p(abyss_detach),
-};
-
-static int __init abyss_init (void)
-{
-       abyss_netdev_ops = tms380tr_netdev_ops;
-
-       abyss_netdev_ops.ndo_open = abyss_open;
-       abyss_netdev_ops.ndo_stop = abyss_close;
-
-       return pci_register_driver(&abyss_driver);
-}
-
-static void __exit abyss_rmmod (void)
-{
-       pci_unregister_driver (&abyss_driver);
-}
-
-module_init(abyss_init);
-module_exit(abyss_rmmod);
-
diff --git a/drivers/net/tokenring/abyss.h b/drivers/net/tokenring/abyss.h
deleted file mode 100644 (file)
index b0a473b..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* 
- * abyss.h: Header for the abyss tms380tr module
- *
- * Authors:
- * - Adam Fritzler
- */
-
-#ifndef __LINUX_MADGETR_H
-#define __LINUX_MADGETR_H
-
-#ifdef __KERNEL__
-
-/*
- * For Madge Smart 16/4 PCI Mk2.  Since we increment the base address
- * to get everything correct for the TMS SIF, we do these as negatives
- * as they fall below the SIF in addressing.
- */
-#define PCIBM2_INT_STATUS_REG          ((short)-15)/* 0x01 */
-#define PCIBM2_INT_CONTROL_REG         ((short)-14)/* 0x02 */
-#define PCIBM2_RESET_REG               ((short)-12)/* 0x04 */
-#define PCIBM2_SEEPROM_REG             ((short)-9) /* 0x07 */
-
-#define PCIBM2_INT_CONTROL_REG_SINTEN           0x02
-#define PCIBM2_INT_CONTROL_REG_PCI_ERR_ENABLE   0x80
-#define PCIBM2_INT_STATUS_REG_PCI_ERR           0x80
-
-#define PCIBM2_RESET_REG_CHIP_NRES              0x01
-#define PCIBM2_RESET_REG_FIFO_NRES              0x02
-#define PCIBM2_RESET_REG_SIF_NRES               0x04
-
-#define PCIBM2_FIFO_THRESHOLD   0x21
-#define PCIBM2_BURST_LENGTH     0x22
-
-/*
- * Bits in PCIBM2_SEEPROM_REG.
- */
-#define AT24_ENABLE             0x04
-#define AT24_DATA               0x02
-#define AT24_CLOCK              0x01
-
-/*
- * AT24 Commands.
- */
-#define AT24_WRITE              0xA0
-#define AT24_READ               0xA1
-
-/*
- * Addresses in AT24 SEEPROM.
- */
-#define PCIBM2_SEEPROM_BIA          0x12
-#define PCIBM2_SEEPROM_RING_SPEED   0x18
-#define PCIBM2_SEEPROM_RAM_SIZE     0x1A
-#define PCIBM2_SEEPROM_HWF1         0x1C
-#define PCIBM2_SEEPROM_HWF2         0x1E
-
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_MADGETR_H */
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c
deleted file mode 100644 (file)
index b5c8c18..0000000
+++ /dev/null
@@ -1,1964 +0,0 @@
-/* ibmtr.c:  A shared-memory IBM Token Ring 16/4 driver for linux
- *
- *     Written 1993 by Mark Swanson and Peter De Schrijver.
- *     This software may be used and distributed according to the terms
- *     of the GNU General Public License, incorporated herein by reference.
- *
- *     This device driver should work with Any IBM Token Ring Card that does
- *     not use DMA.
- *
- *     I used Donald Becker's (becker@scyld.com) device driver work
- *     as a base for most of my initial work.
- *
- *     Changes by Peter De Schrijver
- *             (Peter.Deschrijver@linux.cc.kuleuven.ac.be) :
- *
- *     + changed name to ibmtr.c in anticipation of other tr boards.
- *     + changed reset code and adapter open code.
- *     + added SAP open code.
- *     + a first attempt to write interrupt, transmit and receive routines.
- *
- *     Changes by David W. Morris (dwm@shell.portal.com) :
- *     941003 dwm: - Restructure tok_probe for multiple adapters, devices.
- *     + Add comments, misc reorg for clarity.
- *     + Flatten interrupt handler levels.
- *
- *     Changes by Farzad Farid (farzy@zen.via.ecp.fr)
- *     and Pascal Andre (andre@chimay.via.ecp.fr) (March 9 1995) :
- *     + multi ring support clean up.
- *     + RFC1042 compliance enhanced.
- *
- *     Changes by Pascal Andre (andre@chimay.via.ecp.fr) (September 7 1995) :
- *     + bug correction in tr_tx
- *     + removed redundant information display
- *     + some code reworking
- *
- *     Changes by Michel Lespinasse (walken@via.ecp.fr),
- *     Yann Doussot (doussot@via.ecp.fr) and Pascal Andre (andre@via.ecp.fr)
- *     (February 18, 1996) :
- *     + modified shared memory and mmio access port the driver to
- *       alpha platform (structure access -> readb/writeb)
- *
- *     Changes by Steve Kipisz (bungy@ibm.net or kipisz@vnet.ibm.com)
- *     (January 18 1996):
- *     + swapped WWOR and WWCR in ibmtr.h
- *     + moved some init code from tok_probe into trdev_init.  The
- *       PCMCIA code can call trdev_init to complete initializing
- *       the driver.
- *     + added -DPCMCIA to support PCMCIA
- *     + detecting PCMCIA Card Removal in interrupt handler.  If
- *       ISRP is FF, then a PCMCIA card has been removed
- *        10/2000 Burt needed a new method to avoid crashing the OS
- *
- *     Changes by Paul Norton (pnorton@cts.com) :
- *     + restructured the READ.LOG logic to prevent the transmit SRB
- *       from being rudely overwritten before the transmit cycle is
- *       complete. (August 15 1996)
- *     + completed multiple adapter support. (November 20 1996)
- *     + implemented csum_partial_copy in tr_rx and increased receive 
- *        buffer size and count. Minor fixes. (March 15, 1997)
- *
- *     Changes by Christopher Turcksin <wabbit@rtfc.demon.co.uk>
- *     + Now compiles ok as a module again.
- *
- *     Changes by Paul Norton (pnorton@ieee.org) :
- *      + moved the header manipulation code in tr_tx and tr_rx to
- *        net/802/tr.c. (July 12 1997)
- *      + add retry and timeout on open if cable disconnected. (May 5 1998)
- *      + lifted 2000 byte mtu limit. now depends on shared-RAM size.
- *        May 25 1998)
- *      + can't allocate 2k recv buff at 8k shared-RAM. (20 October 1998)
- *
- *      Changes by Joel Sloan (jjs@c-me.com) :
- *      + disable verbose debug messages by default - to enable verbose
- *       debugging, edit the IBMTR_DEBUG_MESSAGES define below 
- *     
- *     Changes by Mike Phillips <phillim@amtrak.com> :
- *     + Added extra #ifdef's to work with new PCMCIA Token Ring Code.
- *       The PCMCIA code now just sets up the card so it can be recognized
- *        by ibmtr_probe. Also checks allocated memory vs. on-board memory
- *       for correct figure to use.
- *
- *     Changes by Tim Hockin (thockin@isunix.it.ilstu.edu) :
- *     + added spinlocks for SMP sanity (10 March 1999)
- *
- *      Changes by Jochen Friedrich to enable RFC1469 Option 2 multicasting
- *      i.e. using functional address C0 00 00 04 00 00 to transmit and 
- *      receive multicast packets.
- *
- *      Changes by Mike Sullivan (based on original sram patch by Dave Grothe
- *      to support windowing into on adapter shared ram.
- *      i.e. Use LANAID to setup a PnP configuration with 16K RAM. Paging
- *      will shift this 16K window over the entire available shared RAM.
- *
- *      Changes by Peter De Schrijver (p2@mind.be) :
- *      + fixed a problem with PCMCIA card removal
- *
- *      Change by Mike Sullivan et al.:
- *      + added turbo card support. No need to use lanaid to configure
- *      the adapter into isa compatibility mode.
- *
- *      Changes by Burt Silverman to allow the computer to behave nicely when
- *     a cable is pulled or not in place, or a PCMCIA card is removed hot.
- */
-
-/* change the define of IBMTR_DEBUG_MESSAGES to a nonzero value 
-in the event that chatty debug messages are desired - jjs 12/30/98 */
-
-#define IBMTR_DEBUG_MESSAGES 0
-
-#include <linux/module.h>
-#include <linux/sched.h>
-
-#ifdef PCMCIA          /* required for ibmtr_cs.c to build */
-#undef MODULE          /* yes, really */
-#undef ENABLE_PAGING
-#else
-#define ENABLE_PAGING 1                
-#endif
-
-/* changes the output format of driver initialization */
-#define TR_VERBOSE     0
-
-/* some 95 OS send many non UI frame; this allow removing the warning */
-#define TR_FILTERNONUI 1
-
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/ip.h>
-#include <linux/trdevice.h>
-#include <linux/ibmtr.h>
-
-#include <net/checksum.h>
-
-#include <asm/io.h>
-
-#define DPRINTK(format, args...) printk("%s: " format, dev->name , ## args)
-#define DPRINTD(format, args...) DummyCall("%s: " format, dev->name , ## args)
-
-/* version and credits */
-#ifndef PCMCIA
-static char version[] __devinitdata =
-    "\nibmtr.c: v1.3.57   8/ 7/94 Peter De Schrijver and Mark Swanson\n"
-    "         v2.1.125 10/20/98 Paul Norton    <pnorton@ieee.org>\n"
-    "         v2.2.0   12/30/98 Joel Sloan     <jjs@c-me.com>\n"
-    "         v2.2.1   02/08/00 Mike Sullivan  <sullivam@us.ibm.com>\n" 
-    "         v2.2.2   07/27/00 Burt Silverman <burts@us.ibm.com>\n" 
-    "         v2.4.0   03/01/01 Mike Sullivan <sullivan@us.ibm.com>\n";
-#endif
-
-/* this allows displaying full adapter information */
-
-static char *channel_def[] __devinitdata = { "ISA", "MCA", "ISA P&P" };
-
-static char pcchannelid[] __devinitdata = {
-       0x05, 0x00, 0x04, 0x09,
-       0x04, 0x03, 0x04, 0x0f,
-       0x03, 0x06, 0x03, 0x01,
-       0x03, 0x01, 0x03, 0x00,
-       0x03, 0x09, 0x03, 0x09,
-       0x03, 0x00, 0x02, 0x00
-};
-
-static char mcchannelid[] __devinitdata =  {
-       0x04, 0x0d, 0x04, 0x01,
-       0x05, 0x02, 0x05, 0x03,
-       0x03, 0x06, 0x03, 0x03,
-       0x05, 0x08, 0x03, 0x04,
-       0x03, 0x05, 0x03, 0x01,
-       0x03, 0x08, 0x02, 0x00
-};
-
-static char __devinit *adapter_def(char type)
-{
-       switch (type) {
-       case 0xF: return "PC Adapter | PC Adapter II | Adapter/A";
-       case 0xE: return "16/4 Adapter | 16/4 Adapter/A (long)";
-       case 0xD: return "16/4 Adapter/A (short) | 16/4 ISA-16 Adapter";
-       case 0xC: return "Auto 16/4 Adapter";
-       default: return "adapter (unknown type)";
-       }
-};
-
-#define TRC_INIT 0x01          /*  Trace initialization & PROBEs */
-#define TRC_INITV 0x02         /*  verbose init trace points     */
-static unsigned char ibmtr_debug_trace = 0;
-
-static int     ibmtr_probe1(struct net_device *dev, int ioaddr);
-static unsigned char get_sram_size(struct tok_info *adapt_info);
-static int     trdev_init(struct net_device *dev);
-static int     tok_open(struct net_device *dev);
-static int     tok_init_card(struct net_device *dev);
-static void    tok_open_adapter(unsigned long dev_addr);
-static void    open_sap(unsigned char type, struct net_device *dev);
-static void    tok_set_multicast_list(struct net_device *dev);
-static netdev_tx_t tok_send_packet(struct sk_buff *skb,
-                                        struct net_device *dev);
-static int     tok_close(struct net_device *dev);
-static irqreturn_t tok_interrupt(int irq, void *dev_id);
-static void    initial_tok_int(struct net_device *dev);
-static void    tr_tx(struct net_device *dev);
-static void    tr_rx(struct net_device *dev);
-static void    ibmtr_reset_timer(struct timer_list*tmr,struct net_device *dev);
-static void    tok_rerun(unsigned long dev_addr);
-static void    ibmtr_readlog(struct net_device *dev);
-static int     ibmtr_change_mtu(struct net_device *dev, int mtu);
-static void    find_turbo_adapters(int *iolist);
-
-static int ibmtr_portlist[IBMTR_MAX_ADAPTERS+1] __devinitdata = {
-       0xa20, 0xa24, 0, 0, 0
-};
-static int __devinitdata turbo_io[IBMTR_MAX_ADAPTERS] = {0};
-static int __devinitdata turbo_irq[IBMTR_MAX_ADAPTERS] = {0};
-static int __devinitdata turbo_searched = 0;
-
-#ifndef PCMCIA
-static __u32 ibmtr_mem_base __devinitdata = 0xd0000;
-#endif
-
-static void __devinit PrtChanID(char *pcid, short stride)
-{
-       short i, j;
-       for (i = 0, j = 0; i < 24; i++, j += stride)
-               printk("%1x", ((int) pcid[j]) & 0x0f);
-       printk("\n");
-}
-
-static void __devinit HWPrtChanID(void __iomem *pcid, short stride)
-{
-       short i, j;
-       for (i = 0, j = 0; i < 24; i++, j += stride)
-               printk("%1x", ((int) readb(pcid + j)) & 0x0f);
-       printk("\n");
-}
-
-/* We have to ioremap every checked address, because isa_readb is 
- * going away. 
- */
-
-static void __devinit find_turbo_adapters(int *iolist)
-{
-       int ram_addr;
-       int index=0;
-       void __iomem *chanid;
-       int found_turbo=0;
-       unsigned char *tchanid, ctemp;
-       int i, j;
-       unsigned long jif;
-       void __iomem *ram_mapped ;   
-
-       if (turbo_searched == 1) return;
-       turbo_searched=1;
-       for (ram_addr=0xC0000; ram_addr < 0xE0000; ram_addr+=0x2000) {
-
-               __u32 intf_tbl=0;
-
-               found_turbo=1;
-               ram_mapped = ioremap((u32)ram_addr,0x1fff) ; 
-               if (ram_mapped==NULL) 
-                       continue ; 
-               chanid=(CHANNEL_ID + ram_mapped);
-               tchanid=pcchannelid;
-               ctemp=readb(chanid) & 0x0f;
-               if (ctemp != *tchanid) continue;
-               for (i=2,j=1; i<=46; i=i+2,j++) {
-                       if ((readb(chanid+i) & 0x0f) != tchanid[j]){
-                               found_turbo=0;
-                               break;
-                       }
-               }
-               if (!found_turbo) continue;
-
-               writeb(0x90, ram_mapped+0x1E01);
-               for(i=2; i<0x0f; i++) {
-                       writeb(0x00, ram_mapped+0x1E01+i);
-               }
-               writeb(0x00, ram_mapped+0x1E01);
-               for(jif=jiffies+TR_BUSY_INTERVAL; time_before_eq(jiffies,jif););
-               intf_tbl=ntohs(readw(ram_mapped+ACA_OFFSET+ACA_RW+WRBR_EVEN));
-               if (intf_tbl) {
-#if IBMTR_DEBUG_MESSAGES
-                       printk("ibmtr::find_turbo_adapters, Turbo found at "
-                               "ram_addr %x\n",ram_addr);
-                       printk("ibmtr::find_turbo_adapters, interface_table ");
-                       for(i=0; i<6; i++) {
-                               printk("%x:",readb(ram_addr+intf_tbl+i));
-                       }
-                       printk("\n");
-#endif
-                       turbo_io[index]=ntohs(readw(ram_mapped+intf_tbl+4));
-                       turbo_irq[index]=readb(ram_mapped+intf_tbl+3);
-                       outb(0, turbo_io[index] + ADAPTRESET);
-                       for(jif=jiffies+TR_RST_TIME;time_before_eq(jiffies,jif););
-                       outb(0, turbo_io[index] + ADAPTRESETREL);
-                       index++;
-                       continue;
-               }
-#if IBMTR_DEBUG_MESSAGES 
-               printk("ibmtr::find_turbo_adapters, ibmtr card found at"
-                       " %x but not a Turbo model\n",ram_addr);
-#endif
-       iounmap(ram_mapped) ;   
-       } /* for */
-       for(i=0; i<IBMTR_MAX_ADAPTERS; i++) {
-               if(!turbo_io[i]) break;
-               for (j=0; j<IBMTR_MAX_ADAPTERS; j++) {
-                       if ( iolist[j] && iolist[j] != turbo_io[i]) continue;
-                       iolist[j]=turbo_io[i];
-                       break;
-               }
-       }
-}
-
-static void ibmtr_cleanup_card(struct net_device *dev)
-{
-       if (dev->base_addr) {
-               outb(0,dev->base_addr+ADAPTRESET);
-               
-               schedule_timeout_uninterruptible(TR_RST_TIME); /* wait 50ms */
-
-               outb(0,dev->base_addr+ADAPTRESETREL);
-       }
-
-#ifndef PCMCIA
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr, IBMTR_IO_EXTENT);
-
-       { 
-               struct tok_info *ti = netdev_priv(dev);
-               iounmap(ti->mmio);
-               iounmap(ti->sram_virt);
-       }
-#endif         
-}
-
-/****************************************************************************
- *     ibmtr_probe():  Routine specified in the network device structure
- *     to probe for an IBM Token Ring Adapter.  Routine outline:
- *     I.    Interrogate hardware to determine if an adapter exists
- *           and what the speeds and feeds are
- *     II.   Setup data structures to control execution based upon
- *           adapter characteristics.
- *
- *     We expect ibmtr_probe to be called once for each device entry
- *     which references it.
- ****************************************************************************/
-
-static int __devinit ibmtr_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-
-       if (base_addr && base_addr <= 0x1ff) /* Don't probe at all. */
-               return -ENXIO;
-       if (base_addr > 0x1ff) { /* Check a single specified location.  */
-               if (!ibmtr_probe1(dev, base_addr)) return 0;
-               return -ENODEV;
-       }
-       find_turbo_adapters(ibmtr_portlist);
-       for (i = 0; ibmtr_portlist[i]; i++) {
-               int ioaddr = ibmtr_portlist[i];
-
-               if (!ibmtr_probe1(dev, ioaddr)) return 0;
-       }
-       return -ENODEV;
-}
-
-int __devinit ibmtr_probe_card(struct net_device *dev)
-{
-       int err = ibmtr_probe(dev);
-       if (!err) {
-               err = register_netdev(dev);
-               if (err)
-                       ibmtr_cleanup_card(dev);
-       }
-       return err;
-}
-
-/*****************************************************************************/
-
-static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
-{
-
-       unsigned char segment, intr=0, irq=0, i, j, cardpresent=NOTOK, temp=0;
-       void __iomem * t_mmio = NULL;
-       struct tok_info *ti = netdev_priv(dev);
-       void __iomem *cd_chanid;
-       unsigned char *tchanid, ctemp;
-#ifndef PCMCIA
-       unsigned char t_irq=0;
-        unsigned long timeout;
-       static int version_printed;
-#endif
-
-       /*    Query the adapter PIO base port which will return
-        *    indication of where MMIO was placed. We also have a
-        *    coded interrupt number.
-        */
-       segment = inb(PIOaddr);
-       if (segment < 0x40 || segment > 0xe0) {
-               /* Out of range values so we'll assume non-existent IO device
-                * but this is not necessarily a problem, esp if a turbo
-                * adapter is being used.  */
-#if IBMTR_DEBUG_MESSAGES
-               DPRINTK("ibmtr_probe1(): unhappy that inb(0x%X) == 0x%X, "
-                       "Hardware Problem?\n",PIOaddr,segment);
-#endif
-               return -ENODEV;
-       }
-       /*
-        *    Compute the linear base address of the MMIO area
-        *    as LINUX doesn't care about segments
-        */
-       t_mmio = ioremap(((__u32) (segment & 0xfc) << 11) + 0x80000,2048);
-       if (!t_mmio) { 
-               DPRINTK("Cannot remap mmiobase memory area") ; 
-               return -ENODEV ; 
-       } 
-       intr = segment & 0x03;  /* low bits is coded interrupt # */
-       if (ibmtr_debug_trace & TRC_INIT)
-               DPRINTK("PIOaddr: %4hx seg/intr: %2x mmio base: %p intr: %d\n"
-                               , PIOaddr, (int) segment, t_mmio, (int) intr);
-
-       /*
-        *    Now we will compare expected 'channelid' strings with
-        *    what we is there to learn of ISA/MCA or not TR card
-        */
-#ifdef PCMCIA
-       iounmap(t_mmio);
-       t_mmio = ti->mmio;      /*BMS to get virtual address */
-       irq = ti->irq;          /*BMS to display the irq!   */
-#endif
-       cd_chanid = (CHANNEL_ID + t_mmio);      /* for efficiency */
-       tchanid = pcchannelid;
-       cardpresent = TR_ISA;   /* try ISA */
-
-       /*    Suboptimize knowing first byte different */
-       ctemp = readb(cd_chanid) & 0x0f;
-       if (ctemp != *tchanid) {        /* NOT ISA card, try MCA */
-               tchanid = mcchannelid;
-               cardpresent = TR_MCA;
-               if (ctemp != *tchanid)  /* Neither ISA nor MCA */
-                       cardpresent = NOTOK;
-       }
-       if (cardpresent != NOTOK) {
-               /*       Know presumed type, try rest of ID */
-               for (i = 2, j = 1; i <= 46; i = i + 2, j++) {
-                       if( (readb(cd_chanid+i)&0x0f) == tchanid[j]) continue;
-                       /* match failed, not TR card */
-                       cardpresent = NOTOK;
-                       break;
-               }
-       }
-       /* 
-        *    If we have an ISA board check for the ISA P&P version,
-        *    as it has different IRQ settings 
-        */
-       if (cardpresent == TR_ISA && (readb(AIPFID + t_mmio) == 0x0e))
-               cardpresent = TR_ISAPNP;
-       if (cardpresent == NOTOK) {     /* "channel_id" did not match, report */
-               if (!(ibmtr_debug_trace & TRC_INIT)) {
-#ifndef PCMCIA
-                       iounmap(t_mmio);
-#endif
-                       return -ENODEV;
-               }
-               DPRINTK( "Channel ID string not found for PIOaddr: %4hx\n",
-                                                               PIOaddr);
-               DPRINTK("Expected for ISA: ");
-               PrtChanID(pcchannelid, 1);
-               DPRINTK("           found: ");
-/* BMS Note that this can be misleading, when hardware is flaky, because you
-   are reading it a second time here. So with my flaky hardware, I'll see my-
-   self in this block, with the HW ID matching the ISA ID exactly! */
-               HWPrtChanID(cd_chanid, 2);
-               DPRINTK("Expected for MCA: ");
-               PrtChanID(mcchannelid, 1);
-       }
-       /* Now, setup some of the pl0 buffers for this driver.. */
-       /* If called from PCMCIA, it is already set up, so no need to 
-          waste the memory, just use the existing structure */
-#ifndef PCMCIA
-       ti->mmio = t_mmio;
-        for (i = 0; i < IBMTR_MAX_ADAPTERS; i++) {
-                if (turbo_io[i] != PIOaddr)
-                       continue;
-#if IBMTR_DEBUG_MESSAGES 
-               printk("ibmtr::tr_probe1, setting PIOaddr %x to Turbo\n",
-                      PIOaddr);
-#endif
-               ti->turbo = 1;
-               t_irq = turbo_irq[i];
-        }
-#endif /* !PCMCIA */
-       ti->readlog_pending = 0;
-       init_waitqueue_head(&ti->wait_for_reset);
-
-       /* if PCMCIA, the card can be recognized as either TR_ISA or TR_ISAPNP
-        * depending which card is inserted.    */
-       
-#ifndef PCMCIA
-       switch (cardpresent) {
-       case TR_ISA:
-               if (intr == 0) irq = 9; /* irq2 really is irq9 */
-               if (intr == 1) irq = 3;
-               if (intr == 2) irq = 6;
-               if (intr == 3) irq = 7;
-               ti->adapter_int_enable = PIOaddr + ADAPTINTREL;
-               break;
-       case TR_MCA:
-               if (intr == 0) irq = 9;
-               if (intr == 1) irq = 3;
-               if (intr == 2) irq = 10;
-               if (intr == 3) irq = 11;
-               ti->global_int_enable = 0;
-               ti->adapter_int_enable = 0;
-               ti->sram_phys=(__u32)(inb(PIOaddr+ADAPTRESETREL) & 0xfe) << 12;
-               break;
-       case TR_ISAPNP:
-               if (!t_irq) {
-                       if (intr == 0) irq = 9;
-                       if (intr == 1) irq = 3;
-                       if (intr == 2) irq = 10;
-                       if (intr == 3) irq = 11;
-               } else
-                       irq=t_irq;
-               timeout = jiffies + TR_SPIN_INTERVAL;
-               while (!readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN)){
-                       if (!time_after(jiffies, timeout)) continue;
-                       DPRINTK( "Hardware timeout during initialization.\n");
-                       iounmap(t_mmio);
-                       return -ENODEV;
-               }
-               ti->sram_phys =
-                    ((__u32)readb(ti->mmio+ACA_OFFSET+ACA_RW+RRR_EVEN)<<12);
-               ti->adapter_int_enable = PIOaddr + ADAPTINTREL;
-               break;
-       } /*end switch (cardpresent) */
-#endif /*not PCMCIA */
-
-       if (ibmtr_debug_trace & TRC_INIT) {     /* just report int */
-               DPRINTK("irq=%d", irq);
-               printk(", sram_phys=0x%x", ti->sram_phys);
-               if(ibmtr_debug_trace&TRC_INITV){ /* full chat in verbose only */
-                       DPRINTK(", ti->mmio=%p", ti->mmio);
-                       printk(", segment=%02X", segment);
-               }
-               printk(".\n");
-       }
-
-       /* Get hw address of token ring card */
-       j = 0;
-       for (i = 0; i < 0x18; i = i + 2) {
-               /* technical reference states to do this */
-               temp = readb(ti->mmio + AIP + i) & 0x0f;
-               ti->hw_address[j] = temp;
-               if (j & 1)
-                       dev->dev_addr[(j / 2)] =
-                               ti->hw_address[j]+ (ti->hw_address[j - 1] << 4);
-               ++j;
-       }
-       /* get Adapter type:  'F' = Adapter/A, 'E' = 16/4 Adapter II,... */
-       ti->adapter_type = readb(ti->mmio + AIPADAPTYPE);
-
-       /* get Data Rate:  F=4Mb, E=16Mb, D=4Mb & 16Mb ?? */
-       ti->data_rate = readb(ti->mmio + AIPDATARATE);
-
-       /* Get Early Token Release support?: F=no, E=4Mb, D=16Mb, C=4&16Mb */
-       ti->token_release = readb(ti->mmio + AIPEARLYTOKEN);
-
-       /* How much shared RAM is on adapter ? */
-       if (ti->turbo) {
-               ti->avail_shared_ram=127;
-       } else {
-               ti->avail_shared_ram = get_sram_size(ti);/*in 512 byte units */
-       }
-       /* We need to set or do a bunch of work here based on previous results*/
-       /* Support paging?  What sizes?:  F=no, E=16k, D=32k, C=16 & 32k */
-       ti->shared_ram_paging = readb(ti->mmio + AIPSHRAMPAGE);
-
-       /* Available DHB  4Mb size:   F=2048, E=4096, D=4464 */
-       switch (readb(ti->mmio + AIP4MBDHB)) {
-       case 0xe: ti->dhb_size4mb = 4096; break;
-       case 0xd: ti->dhb_size4mb = 4464; break;
-       default:  ti->dhb_size4mb = 2048; break;
-       }
-
-       /* Available DHB 16Mb size:  F=2048, E=4096, D=8192, C=16384, B=17960 */
-       switch (readb(ti->mmio + AIP16MBDHB)) {
-       case 0xe: ti->dhb_size16mb = 4096; break;
-       case 0xd: ti->dhb_size16mb = 8192; break;
-       case 0xc: ti->dhb_size16mb = 16384; break;
-       case 0xb: ti->dhb_size16mb = 17960; break;
-       default:  ti->dhb_size16mb = 2048; break;
-       }
-
-       /*    We must figure out how much shared memory space this adapter
-        *    will occupy so that if there are two adapters we can fit both
-        *    in.  Given a choice, we will limit this adapter to 32K.  The
-        *    maximum space will will use for two adapters is 64K so if the
-        *    adapter we are working on demands 64K (it also doesn't support
-        *    paging), then only one adapter can be supported.  
-        */
-
-       /*
-        *    determine how much of total RAM is mapped into PC space 
-        */
-       ti->mapped_ram_size= /*sixteen to onehundredtwentyeight 512byte blocks*/
-           1<< ((readb(ti->mmio+ACA_OFFSET+ACA_RW+RRR_ODD) >> 2 & 0x03) + 4);
-       ti->page_mask = 0;
-       if (ti->turbo)  ti->page_mask=0xf0;
-       else if (ti->shared_ram_paging == 0xf);  /* No paging in adapter */
-       else {
-#ifdef ENABLE_PAGING
-               unsigned char pg_size = 0;
-               /* BMS:   page size: PCMCIA, use configuration register;
-                  ISAPNP, use LANAIDC config tool from www.ibm.com  */
-               switch (ti->shared_ram_paging) {
-               case 0xf:
-                       break;
-               case 0xe:
-                       ti->page_mask = (ti->mapped_ram_size == 32) ? 0xc0 : 0;
-                       pg_size = 32;   /* 16KB page size */
-                       break;
-               case 0xd:
-                       ti->page_mask = (ti->mapped_ram_size == 64) ? 0x80 : 0;
-                       pg_size = 64;   /* 32KB page size */
-                       break;
-               case 0xc:
-                       switch (ti->mapped_ram_size) {
-                       case 32:
-                               ti->page_mask = 0xc0;
-                               pg_size = 32;
-                               break;
-                       case 64:
-                               ti->page_mask = 0x80;
-                               pg_size = 64;
-                               break;
-                       }
-                       break;
-               default:
-                       DPRINTK("Unknown shared ram paging info %01X\n",
-                                                       ti->shared_ram_paging);
-                       iounmap(t_mmio); 
-                       return -ENODEV;
-                       break;
-               } /*end switch shared_ram_paging */
-
-               if (ibmtr_debug_trace & TRC_INIT)
-                       DPRINTK("Shared RAM paging code: %02X, "
-                               "mapped RAM size: %dK, shared RAM size: %dK, "
-                               "page mask: %02X\n:",
-                               ti->shared_ram_paging, ti->mapped_ram_size / 2,
-                               ti->avail_shared_ram / 2, ti->page_mask);
-#endif /*ENABLE_PAGING */
-       }
-
-#ifndef PCMCIA
-       /* finish figuring the shared RAM address */
-       if (cardpresent == TR_ISA) {
-               static const __u32 ram_bndry_mask[] = {
-                       0xffffe000, 0xffffc000, 0xffff8000, 0xffff0000
-               };
-               __u32 new_base, rrr_32, chk_base, rbm;
-
-               rrr_32=readb(ti->mmio+ACA_OFFSET+ACA_RW+RRR_ODD) >> 2 & 0x03;
-               rbm = ram_bndry_mask[rrr_32];
-               new_base = (ibmtr_mem_base + (~rbm)) & rbm;/* up to boundary */
-               chk_base = new_base + (ti->mapped_ram_size << 9);
-               if (chk_base > (ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE)) {
-                       DPRINTK("Shared RAM for this adapter (%05x) exceeds "
-                       "driver limit (%05x), adapter not started.\n",
-                       chk_base, ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE);
-                       iounmap(t_mmio);
-                       return -ENODEV;
-               } else { /* seems cool, record what we have figured out */
-                       ti->sram_base = new_base >> 12;
-                       ibmtr_mem_base = chk_base;
-               }
-       }
-       else  ti->sram_base = ti->sram_phys >> 12;
-
-       /* The PCMCIA has already got the interrupt line and the io port, 
-          so no chance of anybody else getting it - MLP */
-       if (request_irq(dev->irq = irq, tok_interrupt, 0, "ibmtr", dev) != 0) {
-               DPRINTK("Could not grab irq %d.  Halting Token Ring driver.\n",
-                                       irq);
-               iounmap(t_mmio);
-               return -ENODEV;
-       }
-       /*?? Now, allocate some of the PIO PORTs for this driver.. */
-       /* record PIOaddr range as busy */
-       if (!request_region(PIOaddr, IBMTR_IO_EXTENT, "ibmtr")) {
-               DPRINTK("Could not grab PIO range. Halting driver.\n");
-               free_irq(dev->irq, dev);
-               iounmap(t_mmio);
-               return -EBUSY;
-       }
-
-       if (!version_printed++) {
-               printk(version);
-       }
-#endif /* !PCMCIA */
-       DPRINTK("%s %s found\n",
-               channel_def[cardpresent - 1], adapter_def(ti->adapter_type));
-       DPRINTK("using irq %d, PIOaddr %hx, %dK shared RAM.\n",
-                       irq, PIOaddr, ti->mapped_ram_size / 2);
-       DPRINTK("Hardware address : %pM\n", dev->dev_addr);
-       if (ti->page_mask)
-               DPRINTK("Shared RAM paging enabled. "
-                       "Page size: %uK Shared Ram size %dK\n",
-                       ((ti->page_mask^0xff)+1) >>2, ti->avail_shared_ram / 2);
-       else
-               DPRINTK("Shared RAM paging disabled. ti->page_mask %x\n",
-                                                               ti->page_mask);
-
-       /* Calculate the maximum DHB we can use */
-       /* two cases where avail_shared_ram doesn't equal mapped_ram_size:
-           1. avail_shared_ram is 127 but mapped_ram_size is 128 (typical)
-           2. user has configured adapter for less than avail_shared_ram
-              but is not using paging (she should use paging, I believe)
-       */
-       if (!ti->page_mask) {
-               ti->avail_shared_ram=
-                               min(ti->mapped_ram_size,ti->avail_shared_ram);
-       }
-
-       switch (ti->avail_shared_ram) {
-       case 16:                /* 8KB shared RAM */
-               ti->dhb_size4mb = min(ti->dhb_size4mb, (unsigned short)2048);
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=2;
-               ti->dhb_size16mb = min(ti->dhb_size16mb, (unsigned short)2048);
-               ti->rbuf_len16 = 1032;
-               ti->rbuf_cnt16=2;
-               break;
-       case 32:                /* 16KB shared RAM */
-               ti->dhb_size4mb = min(ti->dhb_size4mb, (unsigned short)4464);
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=4;
-               ti->dhb_size16mb = min(ti->dhb_size16mb, (unsigned short)4096);
-               ti->rbuf_len16 = 1032;  /*1024 usable */
-               ti->rbuf_cnt16=4;
-               break;
-       case 64:                /* 32KB shared RAM */
-               ti->dhb_size4mb = min(ti->dhb_size4mb, (unsigned short)4464);
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=6;
-               ti->dhb_size16mb = min(ti->dhb_size16mb, (unsigned short)10240);
-               ti->rbuf_len16 = 1032;
-               ti->rbuf_cnt16=6;
-               break;
-       case 127:               /* 63.5KB shared RAM */
-               ti->dhb_size4mb = min(ti->dhb_size4mb, (unsigned short)4464);
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=6;
-               ti->dhb_size16mb = min(ti->dhb_size16mb, (unsigned short)16384);
-               ti->rbuf_len16 = 1032;
-               ti->rbuf_cnt16=16;
-               break;
-       case 128:               /* 64KB   shared RAM */
-               ti->dhb_size4mb = min(ti->dhb_size4mb, (unsigned short)4464);
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=6;
-               ti->dhb_size16mb = min(ti->dhb_size16mb, (unsigned short)17960);
-               ti->rbuf_len16 = 1032;
-               ti->rbuf_cnt16=16;
-               break;
-       default:
-               ti->dhb_size4mb = 2048;
-               ti->rbuf_len4 = 1032;
-               ti->rbuf_cnt4=2;
-               ti->dhb_size16mb = 2048;
-               ti->rbuf_len16 = 1032;
-               ti->rbuf_cnt16=2;
-               break;
-       }
-       /* this formula is not smart enough for the paging case
-       ti->rbuf_cnt<x> = (ti->avail_shared_ram * BLOCKSZ - ADAPT_PRIVATE -
-                       ARBLENGTH - SSBLENGTH - DLC_MAX_SAP * SAPLENGTH -
-                       DLC_MAX_STA * STALENGTH - ti->dhb_size<x>mb * NUM_DHB -
-                       SRBLENGTH - ASBLENGTH) / ti->rbuf_len<x>;
-       */
-       ti->maxmtu16 = (ti->rbuf_len16 - 8) * ti->rbuf_cnt16  - TR_HLEN;
-       ti->maxmtu4 = (ti->rbuf_len4 - 8) * ti->rbuf_cnt4 - TR_HLEN;
-       /*BMS assuming 18 bytes of Routing Information (usually works) */
-       DPRINTK("Maximum Receive Internet Protocol MTU 16Mbps: %d, 4Mbps: %d\n",
-                                                    ti->maxmtu16, ti->maxmtu4);
-
-       dev->base_addr = PIOaddr;       /* set the value for device */
-       dev->mem_start = ti->sram_base << 12;
-       dev->mem_end = dev->mem_start + (ti->mapped_ram_size << 9) - 1;
-       trdev_init(dev);
-       return 0;   /* Return 0 to indicate we have found a Token Ring card. */
-}                              /*ibmtr_probe1() */
-
-/*****************************************************************************/
-
-/* query the adapter for the size of shared RAM  */
-/* the function returns the RAM size in units of 512 bytes */
-
-static unsigned char __devinit get_sram_size(struct tok_info *adapt_info)
-{
-       unsigned char avail_sram_code;
-       static unsigned char size_code[] = { 0, 16, 32, 64, 127, 128 };
-       /* Adapter gives
-          'F' -- use RRR bits 3,2
-          'E' -- 8kb   'D' -- 16kb
-          'C' -- 32kb  'A' -- 64KB
-          'B' - 64KB less 512 bytes at top
-          (WARNING ... must zero top bytes in INIT */
-
-       avail_sram_code = 0xf - readb(adapt_info->mmio + AIPAVAILSHRAM);
-       if (avail_sram_code) return size_code[avail_sram_code];
-       else            /* for code 'F', must compute size from RRR(3,2) bits */
-               return 1 <<
-                ((readb(adapt_info->mmio+ACA_OFFSET+ACA_RW+RRR_ODD)>>2&3)+4);
-}
-
-/*****************************************************************************/
-
-static const struct net_device_ops trdev_netdev_ops = {
-       .ndo_open               = tok_open,
-       .ndo_stop               = tok_close,
-       .ndo_start_xmit         = tok_send_packet,
-       .ndo_set_rx_mode        = tok_set_multicast_list,
-       .ndo_change_mtu         = ibmtr_change_mtu,
-};
-
-static int __devinit trdev_init(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-
-       SET_PAGE(ti->srb_page);
-        ti->open_failure = NO    ;
-       dev->netdev_ops = &trdev_netdev_ops;
-
-       return 0;
-}
-
-/*****************************************************************************/
-
-static int tok_init_card(struct net_device *dev)
-{
-       struct tok_info *ti;
-       short PIOaddr;
-       unsigned long i;
-
-       PIOaddr = dev->base_addr;
-       ti = netdev_priv(dev);
-       /* Special processing for first interrupt after reset */
-       ti->do_tok_int = FIRST_INT;
-       /* Reset adapter */
-       writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
-       outb(0, PIOaddr + ADAPTRESET);
-
-       schedule_timeout_uninterruptible(TR_RST_TIME); /* wait 50ms */
-
-       outb(0, PIOaddr + ADAPTRESETREL);
-#ifdef ENABLE_PAGING
-       if (ti->page_mask)
-               writeb(SRPR_ENABLE_PAGING,ti->mmio+ACA_OFFSET+ACA_RW+SRPR_EVEN);
-#endif
-       writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-       i = sleep_on_timeout(&ti->wait_for_reset, 4 * HZ);
-       return i? 0 : -EAGAIN;
-}
-
-/*****************************************************************************/
-static int tok_open(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-       int i;
-
-       /*the case we were left in a failure state during a previous open */
-       if (ti->open_failure == YES) {
-               DPRINTK("Last time you were disconnected, how about now?\n");
-               printk("You can't insert with an ICS connector half-cocked.\n");
-       }
-
-       ti->open_status  = CLOSED; /* CLOSED or OPEN      */
-       ti->sap_status   = CLOSED; /* CLOSED or OPEN      */
-       ti->open_failure =     NO; /* NO     or YES       */
-       ti->open_mode    = MANUAL; /* MANUAL or AUTOMATIC */
-
-       ti->sram_phys &= ~1; /* to reverse what we do in tok_close */
-       /* init the spinlock */
-       spin_lock_init(&ti->lock);
-       init_timer(&ti->tr_timer);
-       
-       i = tok_init_card(dev);
-       if (i) return i;
-
-       while (1){
-               tok_open_adapter((unsigned long) dev);
-               i= interruptible_sleep_on_timeout(&ti->wait_for_reset, 25 * HZ);
-               /* sig catch: estimate opening adapter takes more than .5 sec*/
-               if (i>(245*HZ)/10) break; /* fancier than if (i==25*HZ) */
-               if (i==0) break;
-               if (ti->open_status == OPEN && ti->sap_status==OPEN) {
-                       netif_start_queue(dev);
-                       DPRINTK("Adapter is up and running\n");
-                       return 0;
-               }
-               i=schedule_timeout_interruptible(TR_RETRY_INTERVAL);
-                                                       /* wait 30 seconds */
-               if(i!=0) break; /*prob. a signal, like the i>24*HZ case above */
-       }
-       outb(0, dev->base_addr + ADAPTRESET);/* kill pending interrupts*/
-       DPRINTK("TERMINATED via signal\n");     /*BMS useful */
-       return -EAGAIN;
-}
-
-/*****************************************************************************/
-
-#define COMMAND_OFST             0
-#define OPEN_OPTIONS_OFST        8
-#define NUM_RCV_BUF_OFST        24
-#define RCV_BUF_LEN_OFST        26
-#define DHB_LENGTH_OFST         28
-#define NUM_DHB_OFST            30
-#define DLC_MAX_SAP_OFST        32
-#define DLC_MAX_STA_OFST        33
-
-static void tok_open_adapter(unsigned long dev_addr)
-{
-       struct net_device *dev = (struct net_device *) dev_addr;
-       struct tok_info *ti;
-       int i;
-
-       ti = netdev_priv(dev);
-       SET_PAGE(ti->init_srb_page); 
-       writeb(~SRB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
-       for (i = 0; i < sizeof(struct dir_open_adapter); i++)
-               writeb(0, ti->init_srb + i);
-       writeb(DIR_OPEN_ADAPTER, ti->init_srb + COMMAND_OFST);
-       writew(htons(OPEN_PASS_BCON_MAC), ti->init_srb + OPEN_OPTIONS_OFST);
-       if (ti->ring_speed == 16) {
-               writew(htons(ti->dhb_size16mb), ti->init_srb + DHB_LENGTH_OFST);
-               writew(htons(ti->rbuf_cnt16), ti->init_srb + NUM_RCV_BUF_OFST);
-               writew(htons(ti->rbuf_len16), ti->init_srb + RCV_BUF_LEN_OFST);
-       } else {
-               writew(htons(ti->dhb_size4mb), ti->init_srb + DHB_LENGTH_OFST);
-               writew(htons(ti->rbuf_cnt4), ti->init_srb + NUM_RCV_BUF_OFST);
-               writew(htons(ti->rbuf_len4), ti->init_srb + RCV_BUF_LEN_OFST);
-       }
-       writeb(NUM_DHB,         /* always 2 */ ti->init_srb + NUM_DHB_OFST);
-       writeb(DLC_MAX_SAP, ti->init_srb + DLC_MAX_SAP_OFST);
-       writeb(DLC_MAX_STA, ti->init_srb + DLC_MAX_STA_OFST);
-       ti->srb = ti->init_srb; /* We use this one in the interrupt handler */
-       ti->srb_page = ti->init_srb_page;
-       DPRINTK("Opening adapter: Xmit bfrs: %d X %d, Rcv bfrs: %d X %d\n",
-               readb(ti->init_srb + NUM_DHB_OFST),
-               ntohs(readw(ti->init_srb + DHB_LENGTH_OFST)),
-               ntohs(readw(ti->init_srb + NUM_RCV_BUF_OFST)),
-               ntohs(readw(ti->init_srb + RCV_BUF_LEN_OFST)));
-       writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-       writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-}
-
-/*****************************************************************************/
-
-static void open_sap(unsigned char type, struct net_device *dev)
-{
-       int i;
-       struct tok_info *ti = netdev_priv(dev);
-
-       SET_PAGE(ti->srb_page);
-       for (i = 0; i < sizeof(struct dlc_open_sap); i++)
-               writeb(0, ti->srb + i);
-
-#define MAX_I_FIELD_OFST        14
-#define SAP_VALUE_OFST          16
-#define SAP_OPTIONS_OFST        17
-#define STATION_COUNT_OFST      18
-
-       writeb(DLC_OPEN_SAP, ti->srb + COMMAND_OFST);
-       writew(htons(MAX_I_FIELD), ti->srb + MAX_I_FIELD_OFST);
-       writeb(SAP_OPEN_IND_SAP | SAP_OPEN_PRIORITY, ti->srb+ SAP_OPTIONS_OFST);
-       writeb(SAP_OPEN_STATION_CNT, ti->srb + STATION_COUNT_OFST);
-       writeb(type, ti->srb + SAP_VALUE_OFST);
-       writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-}
-
-
-/*****************************************************************************/
-
-static void tok_set_multicast_list(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-       struct netdev_hw_addr *ha;
-       unsigned char address[4];
-
-       int i;
-
-       /*BMS the next line is CRUCIAL or you may be sad when you */
-       /*BMS ifconfig tr down or hot unplug a PCMCIA card ??hownowbrowncow*/
-       if (/*BMSHELPdev->start == 0 ||*/ ti->open_status != OPEN) return;
-       address[0] = address[1] = address[2] = address[3] = 0;
-       netdev_for_each_mc_addr(ha, dev) {
-               address[0] |= ha->addr[2];
-               address[1] |= ha->addr[3];
-               address[2] |= ha->addr[4];
-               address[3] |= ha->addr[5];
-       }
-       SET_PAGE(ti->srb_page);
-       for (i = 0; i < sizeof(struct srb_set_funct_addr); i++)
-               writeb(0, ti->srb + i);
-
-#define FUNCT_ADDRESS_OFST 6
-
-       writeb(DIR_SET_FUNC_ADDR, ti->srb + COMMAND_OFST);
-       for (i = 0; i < 4; i++) 
-               writeb(address[i], ti->srb + FUNCT_ADDRESS_OFST + i);
-       writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-#if TR_VERBOSE
-       DPRINTK("Setting functional address: ");
-       for (i=0;i<4;i++)  printk("%02X ", address[i]);
-       printk("\n");
-#endif
-}
-
-/*****************************************************************************/
-
-#define STATION_ID_OFST 4
-
-static netdev_tx_t tok_send_packet(struct sk_buff *skb,
-                                        struct net_device *dev)
-{
-       struct tok_info *ti;
-       unsigned long flags;
-       ti = netdev_priv(dev);
-
-        netif_stop_queue(dev);
-
-       /* lock against other CPUs */
-       spin_lock_irqsave(&(ti->lock), flags);
-
-       /* Save skb; we'll need it when the adapter asks for the data */
-       ti->current_skb = skb;
-       SET_PAGE(ti->srb_page);
-       writeb(XMIT_UI_FRAME, ti->srb + COMMAND_OFST);
-       writew(ti->exsap_station_id, ti->srb + STATION_ID_OFST);
-       writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-       spin_unlock_irqrestore(&(ti->lock), flags);
-       return NETDEV_TX_OK;
-}
-
-/*****************************************************************************/
-
-static int tok_close(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-
-       /* Important for PCMCIA hot unplug, otherwise, we'll pull the card, */
-       /* unloading the module from memory, and then if a timer pops, ouch */
-       del_timer_sync(&ti->tr_timer);
-       outb(0, dev->base_addr + ADAPTRESET);
-       ti->sram_phys |= 1;
-       ti->open_status = CLOSED;
-
-       netif_stop_queue(dev);
-       DPRINTK("Adapter is closed.\n");
-       return 0;
-}
-
-/*****************************************************************************/
-
-#define RETCODE_OFST           2
-#define OPEN_ERROR_CODE_OFST   6
-#define ASB_ADDRESS_OFST        8
-#define SRB_ADDRESS_OFST        10
-#define ARB_ADDRESS_OFST        12
-#define SSB_ADDRESS_OFST        14
-
-static char *printphase[]= {"Lobe media test","Physical insertion",
-             "Address verification","Roll call poll","Request Parameters"};
-static char *printerror[]={"Function failure","Signal loss","Reserved",
-               "Frequency error","Timeout","Ring failure","Ring beaconing",
-               "Duplicate node address",
-               "Parameter request-retry count exceeded","Remove received",
-               "IMPL force received","Duplicate modifier",
-               "No monitor detected","Monitor contention failed for RPL"};
-
-static void __iomem *map_address(struct tok_info *ti, unsigned index, __u8 *page)
-{
-       if (ti->page_mask) {
-               *page = (index >> 8) & ti->page_mask;
-               index &= ~(ti->page_mask << 8);
-       }
-       return ti->sram_virt + index;
-}
-
-static void dir_open_adapter (struct net_device *dev)
-{
-        struct tok_info *ti = netdev_priv(dev);
-        unsigned char ret_code;
-        __u16 err;
-
-        ti->srb = map_address(ti,
-               ntohs(readw(ti->init_srb + SRB_ADDRESS_OFST)),
-               &ti->srb_page);
-        ti->ssb = map_address(ti,
-               ntohs(readw(ti->init_srb + SSB_ADDRESS_OFST)),
-               &ti->ssb_page);
-        ti->arb = map_address(ti,
-               ntohs(readw(ti->init_srb + ARB_ADDRESS_OFST)),
-               &ti->arb_page);
-        ti->asb = map_address(ti,
-               ntohs(readw(ti->init_srb + ASB_ADDRESS_OFST)),
-               &ti->asb_page);
-        ti->current_skb = NULL;
-        ret_code = readb(ti->init_srb + RETCODE_OFST);
-        err = ntohs(readw(ti->init_srb + OPEN_ERROR_CODE_OFST));
-        if (!ret_code) {
-               ti->open_status = OPEN; /* TR adapter is now available */
-                if (ti->open_mode == AUTOMATIC) {
-                       DPRINTK("Adapter reopened.\n");
-                }
-                writeb(~SRB_RESP_INT, ti->mmio+ACA_OFFSET+ACA_RESET+ISRP_ODD);
-                open_sap(EXTENDED_SAP, dev);
-               return;
-       }
-       ti->open_failure = YES;
-       if (ret_code == 7){
-               if (err == 0x24) {
-                       if (!ti->auto_speedsave) {
-                               DPRINTK("Open failed: Adapter speed must match "
-                                 "ring speed if Automatic Ring Speed Save is "
-                                "disabled.\n");
-                               ti->open_action = FAIL;
-                       }else
-                               DPRINTK("Retrying open to adjust to "
-                                       "ring speed, ");
-                } else if (err == 0x2d) {
-                       DPRINTK("Physical Insertion: No Monitor Detected, ");
-                       printk("retrying after %ds delay...\n",
-                                       TR_RETRY_INTERVAL/HZ);
-                } else if (err == 0x11) {
-                       DPRINTK("Lobe Media Function Failure (0x11), ");
-                       printk(" retrying after %ds delay...\n",
-                                       TR_RETRY_INTERVAL/HZ);
-                } else {
-                       char **prphase = printphase;
-                       char **prerror = printerror;
-                       int pnr = err / 16 - 1;
-                       int enr = err % 16 - 1;
-                       DPRINTK("TR Adapter misc open failure, error code = ");
-                       if (pnr < 0 || pnr >= ARRAY_SIZE(printphase) ||
-                                       enr < 0 ||
-                                       enr >= ARRAY_SIZE(printerror))
-                               printk("0x%x, invalid Phase/Error.", err);
-                       else
-                               printk("0x%x, Phase: %s, Error: %s\n", err,
-                                               prphase[pnr], prerror[enr]);
-                       printk(" retrying after %ds delay...\n",
-                                       TR_RETRY_INTERVAL/HZ);
-                }
-        } else DPRINTK("open failed: ret_code = %02X..., ", ret_code);
-       if (ti->open_action != FAIL) {
-               if (ti->open_mode==AUTOMATIC){
-                       ti->open_action = REOPEN;
-                       ibmtr_reset_timer(&(ti->tr_timer), dev);
-                       return;
-               }
-               wake_up(&ti->wait_for_reset);
-               return;
-       }
-       DPRINTK("FAILURE, CAPUT\n");
-}
-
-/******************************************************************************/
-
-static irqreturn_t tok_interrupt(int irq, void *dev_id)
-{
-       unsigned char status;
-       /*  unsigned char status_even ; */
-       struct tok_info *ti;
-       struct net_device *dev;
-#ifdef ENABLE_PAGING
-       unsigned char save_srpr;
-#endif
-
-       dev = dev_id;
-#if TR_VERBOSE
-       DPRINTK("Int from tok_driver, dev : %p irq%d\n", dev,irq);
-#endif
-       ti = netdev_priv(dev);
-       if (ti->sram_phys & 1)
-               return IRQ_NONE;         /* PCMCIA card extraction flag */
-       spin_lock(&(ti->lock));
-#ifdef ENABLE_PAGING
-       save_srpr = readb(ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
-#endif
-
-       /* Disable interrupts till processing is finished */
-       writeb((~INT_ENABLE), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
-
-       /* Reset interrupt for ISA boards */
-       if (ti->adapter_int_enable)
-               outb(0, ti->adapter_int_enable);
-       else /* used for PCMCIA cards */
-               outb(0, ti->global_int_enable);
-        if (ti->do_tok_int == FIRST_INT){
-                initial_tok_int(dev);
-#ifdef ENABLE_PAGING
-                writeb(save_srpr, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
-#endif
-                spin_unlock(&(ti->lock));
-                return IRQ_HANDLED;
-        }
-       /*  Begin interrupt handler HERE inline to avoid the extra
-           levels of logic and call depth for the original solution. */
-       status = readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_ODD);
-       /*BMSstatus_even = readb (ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN) */
-       /*BMSdebugprintk("tok_interrupt: ISRP_ODD = 0x%x ISRP_EVEN = 0x%x\n", */
-       /*BMS                                       status,status_even);      */
-
-       if (status & ADAP_CHK_INT) {
-               int i;
-               void __iomem *check_reason;
-               __u8 check_reason_page = 0;
-               check_reason = map_address(ti,
-                       ntohs(readw(ti->mmio+ ACA_OFFSET+ACA_RW + WWCR_EVEN)),
-                       &check_reason_page);
-               SET_PAGE(check_reason_page);
-
-               DPRINTK("Adapter check interrupt\n");
-               DPRINTK("8 reason bytes follow: ");
-               for (i = 0; i < 8; i++, check_reason++)
-                       printk("%02X ", (int) readb(check_reason));
-               printk("\n");
-               writeb(~ADAP_CHK_INT, ti->mmio+ ACA_OFFSET+ACA_RESET+ ISRP_ODD);
-               status = readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRA_EVEN);
-               DPRINTK("ISRA_EVEN == 0x02%x\n",status);
-               ti->open_status = CLOSED;
-               ti->sap_status  = CLOSED;
-               ti->open_mode   = AUTOMATIC;
-               netif_carrier_off(dev);
-               netif_stop_queue(dev);
-               ti->open_action = RESTART;
-               outb(0, dev->base_addr + ADAPTRESET);
-               ibmtr_reset_timer(&(ti->tr_timer), dev);/*BMS try to reopen*/
-               spin_unlock(&(ti->lock));
-               return IRQ_HANDLED;
-       }
-       if (readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN)
-               & (TCR_INT | ERR_INT | ACCESS_INT)) {
-               DPRINTK("adapter error: ISRP_EVEN : %02x\n",
-                       (int)readb(ti->mmio+ ACA_OFFSET + ACA_RW + ISRP_EVEN));
-               writeb(~(TCR_INT | ERR_INT | ACCESS_INT),
-                       ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
-               status= readb(ti->mmio+ ACA_OFFSET + ACA_RW + ISRA_EVEN);/*BMS*/
-               DPRINTK("ISRA_EVEN == 0x02%x\n",status);/*BMS*/
-                writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-#ifdef ENABLE_PAGING
-                writeb(save_srpr, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
-#endif
-                spin_unlock(&(ti->lock));
-                return IRQ_HANDLED;
-        }
-       if (status & SRB_RESP_INT) {    /* SRB response */
-               SET_PAGE(ti->srb_page);
-#if TR_VERBOSE
-               DPRINTK("SRB resp: cmd=%02X rsp=%02X\n",
-                               readb(ti->srb), readb(ti->srb + RETCODE_OFST));
-#endif
-               switch (readb(ti->srb)) {       /* SRB command check */
-               case XMIT_DIR_FRAME:{
-                       unsigned char xmit_ret_code;
-                       xmit_ret_code = readb(ti->srb + RETCODE_OFST);
-                       if (xmit_ret_code == 0xff) break;
-                       DPRINTK("error on xmit_dir_frame request: %02X\n",
-                                                               xmit_ret_code);
-                       if (ti->current_skb) {
-                               dev_kfree_skb_irq(ti->current_skb);
-                               ti->current_skb = NULL;
-                       }
-                       /*dev->tbusy = 0;*/
-                       netif_wake_queue(dev);
-                       if (ti->readlog_pending)
-                               ibmtr_readlog(dev);
-                       break;
-               }
-               case XMIT_UI_FRAME:{
-                       unsigned char xmit_ret_code;
-
-                       xmit_ret_code = readb(ti->srb + RETCODE_OFST);
-                       if (xmit_ret_code == 0xff) break;
-                       DPRINTK("error on xmit_ui_frame request: %02X\n",
-                                                               xmit_ret_code);
-                       if (ti->current_skb) {
-                               dev_kfree_skb_irq(ti->current_skb);
-                               ti->current_skb = NULL;
-                       }
-                       netif_wake_queue(dev);
-                       if (ti->readlog_pending)
-                               ibmtr_readlog(dev);
-                       break;
-               }
-               case DIR_OPEN_ADAPTER:
-                       dir_open_adapter(dev);
-                       break;
-               case DLC_OPEN_SAP:
-                       if (readb(ti->srb + RETCODE_OFST)) {
-                               DPRINTK("open_sap failed: ret_code = %02X, "
-                                       "retrying\n",
-                                       (int) readb(ti->srb + RETCODE_OFST));
-                               ti->open_action = REOPEN;
-                               ibmtr_reset_timer(&(ti->tr_timer), dev);
-                               break;
-                       }
-                       ti->exsap_station_id = readw(ti->srb + STATION_ID_OFST);
-                       ti->sap_status = OPEN;/* TR adapter is now available */
-                       if (ti->open_mode==MANUAL){
-                               wake_up(&ti->wait_for_reset);
-                               break;
-                       }
-                       netif_wake_queue(dev);
-                       netif_carrier_on(dev);
-                       break;
-               case DIR_INTERRUPT:
-               case DIR_MOD_OPEN_PARAMS:
-               case DIR_SET_GRP_ADDR:
-               case DIR_SET_FUNC_ADDR:
-               case DLC_CLOSE_SAP:
-                       if (readb(ti->srb + RETCODE_OFST))
-                               DPRINTK("error on %02X: %02X\n",
-                                       (int) readb(ti->srb + COMMAND_OFST),
-                                       (int) readb(ti->srb + RETCODE_OFST));
-                       break;
-               case DIR_READ_LOG:
-                       if (readb(ti->srb + RETCODE_OFST)){
-                               DPRINTK("error on dir_read_log: %02X\n",
-                                       (int) readb(ti->srb + RETCODE_OFST));
-                               netif_wake_queue(dev);
-                               break;
-                       }
-#if IBMTR_DEBUG_MESSAGES
-
-#define LINE_ERRORS_OFST                 0
-#define INTERNAL_ERRORS_OFST             1
-#define BURST_ERRORS_OFST                2
-#define AC_ERRORS_OFST                   3
-#define ABORT_DELIMITERS_OFST            4
-#define LOST_FRAMES_OFST                 6
-#define RECV_CONGEST_COUNT_OFST          7
-#define FRAME_COPIED_ERRORS_OFST         8
-#define FREQUENCY_ERRORS_OFST            9
-#define TOKEN_ERRORS_OFST               10
-
-                       DPRINTK("Line errors %02X, Internal errors %02X, "
-                       "Burst errors %02X\n" "A/C errors %02X, "
-                       "Abort delimiters %02X, Lost frames %02X\n"
-                       "Receive congestion count %02X, "
-                       "Frame copied errors %02X\nFrequency errors %02X, "
-                       "Token errors %02X\n",
-                       (int) readb(ti->srb + LINE_ERRORS_OFST),
-                       (int) readb(ti->srb + INTERNAL_ERRORS_OFST),
-                       (int) readb(ti->srb + BURST_ERRORS_OFST),
-                       (int) readb(ti->srb + AC_ERRORS_OFST),
-                       (int) readb(ti->srb + ABORT_DELIMITERS_OFST),
-                       (int) readb(ti->srb + LOST_FRAMES_OFST),
-                       (int) readb(ti->srb + RECV_CONGEST_COUNT_OFST),
-                       (int) readb(ti->srb + FRAME_COPIED_ERRORS_OFST),
-                       (int) readb(ti->srb + FREQUENCY_ERRORS_OFST),
-                       (int) readb(ti->srb + TOKEN_ERRORS_OFST));
-#endif
-                       netif_wake_queue(dev);
-                       break;
-               default:
-                       DPRINTK("Unknown command %02X encountered\n",
-                                               (int) readb(ti->srb));
-               }       /* end switch SRB command check */
-               writeb(~SRB_RESP_INT, ti->mmio+ ACA_OFFSET+ACA_RESET+ ISRP_ODD);
-       }       /* if SRB response */
-       if (status & ASB_FREE_INT) {    /* ASB response */
-               SET_PAGE(ti->asb_page);
-#if TR_VERBOSE
-               DPRINTK("ASB resp: cmd=%02X\n", readb(ti->asb));
-#endif
-
-               switch (readb(ti->asb)) {       /* ASB command check */
-               case REC_DATA:
-               case XMIT_UI_FRAME:
-               case XMIT_DIR_FRAME:
-                       break;
-               default:
-                       DPRINTK("unknown command in asb %02X\n",
-                                               (int) readb(ti->asb));
-               }       /* switch ASB command check */
-               if (readb(ti->asb + 2) != 0xff) /* checks ret_code */
-                       DPRINTK("ASB error %02X in cmd %02X\n",
-                               (int) readb(ti->asb + 2), (int) readb(ti->asb));
-               writeb(~ASB_FREE_INT, ti->mmio+ ACA_OFFSET+ACA_RESET+ ISRP_ODD);
-       }       /* if ASB response */
-
-#define STATUS_OFST             6
-#define NETW_STATUS_OFST        6
-
-       if (status & ARB_CMD_INT) {     /* ARB response */
-               SET_PAGE(ti->arb_page);
-#if TR_VERBOSE
-               DPRINTK("ARB resp: cmd=%02X\n", readb(ti->arb));
-#endif
-
-               switch (readb(ti->arb)) {       /* ARB command check */
-               case DLC_STATUS:
-                       DPRINTK("DLC_STATUS new status: %02X on station %02X\n",
-                               ntohs(readw(ti->arb + STATUS_OFST)),
-                               ntohs(readw(ti->arb+ STATION_ID_OFST)));
-                       break;
-               case REC_DATA:
-                       tr_rx(dev);
-                       break;
-               case RING_STAT_CHANGE:{
-                       unsigned short ring_status;
-                       ring_status= ntohs(readw(ti->arb + NETW_STATUS_OFST));
-                       if (ibmtr_debug_trace & TRC_INIT)
-                               DPRINTK("Ring Status Change...(0x%x)\n",
-                                                               ring_status);
-                       if(ring_status& (REMOVE_RECV|AUTO_REMOVAL|LOBE_FAULT)){
-                               netif_stop_queue(dev);
-                               netif_carrier_off(dev);
-                               DPRINTK("Remove received, or Auto-removal error"
-                                       ", or Lobe fault\n");
-                               DPRINTK("We'll try to reopen the closed adapter"
-                                       " after a %d second delay.\n",
-                                               TR_RETRY_INTERVAL/HZ);
-                               /*I was confused: I saw the TR reopening but */
-                               /*forgot:with an RJ45 in an RJ45/ICS adapter */
-                               /*but adapter not in the ring, the TR will   */
-                               /* open, and then soon close and come here.  */
-                               ti->open_mode = AUTOMATIC;
-                               ti->open_status = CLOSED; /*12/2000 BMS*/
-                               ti->open_action = REOPEN;
-                               ibmtr_reset_timer(&(ti->tr_timer), dev);
-                       } else if (ring_status & LOG_OVERFLOW) {
-                               if(netif_queue_stopped(dev))
-                                       ti->readlog_pending = 1;
-                               else
-                                       ibmtr_readlog(dev);
-                       }
-                       break;
-               }
-               case XMIT_DATA_REQ:
-                       tr_tx(dev);
-                       break;
-               default:
-                       DPRINTK("Unknown command %02X in arb\n",
-                                               (int) readb(ti->arb));
-                       break;
-               }       /* switch ARB command check */
-               writeb(~ARB_CMD_INT, ti->mmio+ ACA_OFFSET+ACA_RESET + ISRP_ODD);
-               writeb(ARB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-       }       /* if ARB response */
-       if (status & SSB_RESP_INT) {    /* SSB response */
-               unsigned char retcode;
-               SET_PAGE(ti->ssb_page);
-#if TR_VERBOSE
-               DPRINTK("SSB resp: cmd=%02X rsp=%02X\n",
-                               readb(ti->ssb), readb(ti->ssb + 2));
-#endif
-
-               switch (readb(ti->ssb)) {       /* SSB command check */
-               case XMIT_DIR_FRAME:
-               case XMIT_UI_FRAME:
-                       retcode = readb(ti->ssb + 2);
-                       if (retcode && (retcode != 0x22))/* checks ret_code */
-                               DPRINTK("xmit ret_code: %02X xmit error code: "
-                                       "%02X\n",
-                                       (int)retcode, (int)readb(ti->ssb + 6));
-                       else
-                               dev->stats.tx_packets++;
-                       break;
-               case XMIT_XID_CMD:
-                       DPRINTK("xmit xid ret_code: %02X\n",
-                                               (int) readb(ti->ssb + 2));
-               default:
-                       DPRINTK("Unknown command %02X in ssb\n",
-                                               (int) readb(ti->ssb));
-               }       /* SSB command check */
-               writeb(~SSB_RESP_INT, ti->mmio+ ACA_OFFSET+ACA_RESET+ ISRP_ODD);
-               writeb(SSB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-       }       /* if SSB response */
-#ifdef ENABLE_PAGING
-       writeb(save_srpr, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
-#endif
-       writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-       spin_unlock(&(ti->lock));
-       return IRQ_HANDLED;
-}                              /*tok_interrupt */
-
-/*****************************************************************************/
-
-#define INIT_STATUS_OFST        1
-#define INIT_STATUS_2_OFST      2
-#define ENCODED_ADDRESS_OFST    8
-
-static void initial_tok_int(struct net_device *dev)
-{
-
-       __u32 encoded_addr, hw_encoded_addr;
-       struct tok_info *ti;
-        unsigned char init_status; /*BMS 12/2000*/
-
-       ti = netdev_priv(dev);
-
-       ti->do_tok_int = NOT_FIRST;
-
-       /* we assign the shared-ram address for ISA devices */
-       writeb(ti->sram_base, ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN);
-#ifndef PCMCIA
-        ti->sram_virt = ioremap(((__u32)ti->sram_base << 12), ti->avail_shared_ram);
-#endif
-       ti->init_srb = map_address(ti,
-               ntohs(readw(ti->mmio + ACA_OFFSET + WRBR_EVEN)),
-               &ti->init_srb_page);
-       if (ti->page_mask && ti->avail_shared_ram == 127) {
-               void __iomem *last_512;
-               __u8 last_512_page=0;
-               int i;
-               last_512 = map_address(ti, 0xfe00, &last_512_page);
-               /* initialize high section of ram (if necessary) */
-               SET_PAGE(last_512_page);
-               for (i = 0; i < 512; i++)
-                       writeb(0, last_512 + i);
-       }
-       SET_PAGE(ti->init_srb_page);
-
-#if TR_VERBOSE
-       {
-       int i;
-
-       DPRINTK("ti->init_srb_page=0x%x\n", ti->init_srb_page);
-       DPRINTK("init_srb(%p):", ti->init_srb );
-       for (i = 0; i < 20; i++)
-               printk("%02X ", (int) readb(ti->init_srb + i));
-       printk("\n");
-       }
-#endif
-
-       hw_encoded_addr = readw(ti->init_srb + ENCODED_ADDRESS_OFST);
-       encoded_addr = ntohs(hw_encoded_addr);
-        init_status= /*BMS 12/2000 check for shallow mode possibility (Turbo)*/
-       readb(ti->init_srb+offsetof(struct srb_init_response,init_status));
-       /*printk("Initial interrupt: init_status= 0x%02x\n",init_status);*/
-       ti->ring_speed = init_status & 0x01 ? 16 : 4;
-       DPRINTK("Initial interrupt : %d Mbps, shared RAM base %08x.\n",
-                               ti->ring_speed, (unsigned int)dev->mem_start);
-       ti->auto_speedsave = (readb(ti->init_srb+INIT_STATUS_2_OFST) & 4) != 0;
-
-        if (ti->open_mode == MANUAL)   wake_up(&ti->wait_for_reset);
-       else                            tok_open_adapter((unsigned long)dev);
-        
-} /*initial_tok_int() */
-
-/*****************************************************************************/
-
-#define CMD_CORRELATE_OFST      1
-#define DHB_ADDRESS_OFST        6
-
-#define FRAME_LENGTH_OFST       6
-#define HEADER_LENGTH_OFST      8
-#define RSAP_VALUE_OFST         9
-
-static void tr_tx(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-       struct trh_hdr *trhdr = (struct trh_hdr *) ti->current_skb->data;
-       unsigned int hdr_len;
-       __u32 dhb=0,dhb_base;
-       void __iomem *dhbuf = NULL;
-       unsigned char xmit_command;
-       int i,dhb_len=0x4000,src_len,src_offset;
-       struct trllc *llc;
-       struct srb_xmit xsrb;
-       __u8 dhb_page = 0;
-       __u8 llc_ssap;
-
-       SET_PAGE(ti->asb_page);
-
-       if (readb(ti->asb+RETCODE_OFST) != 0xFF) DPRINTK("ASB not free !!!\n");
-
-       /* in providing the transmit interrupts, is telling us it is ready for
-          data and providing a shared memory address for us to stuff with data.
-          Here we compute the effective address where we will place data.
-       */
-       SET_PAGE(ti->arb_page);
-       dhb=dhb_base=ntohs(readw(ti->arb + DHB_ADDRESS_OFST));
-       if (ti->page_mask) {
-               dhb_page = (dhb_base >> 8) & ti->page_mask;
-               dhb=dhb_base & ~(ti->page_mask << 8);
-       }
-       dhbuf = ti->sram_virt + dhb;
-
-       /* Figure out the size of the 802.5 header */
-       if (!(trhdr->saddr[0] & 0x80))  /* RIF present? */
-               hdr_len = sizeof(struct trh_hdr) - TR_MAXRIFLEN;
-       else
-               hdr_len = ((ntohs(trhdr->rcf) & TR_RCF_LEN_MASK) >> 8)
-                   + sizeof(struct trh_hdr) - TR_MAXRIFLEN;
-
-       llc = (struct trllc *) (ti->current_skb->data + hdr_len);
-
-       llc_ssap = llc->ssap;
-       SET_PAGE(ti->srb_page);
-       memcpy_fromio(&xsrb, ti->srb, sizeof(xsrb));
-       SET_PAGE(ti->asb_page);
-       xmit_command = xsrb.command;
-
-       writeb(xmit_command, ti->asb + COMMAND_OFST);
-       writew(xsrb.station_id, ti->asb + STATION_ID_OFST);
-       writeb(llc_ssap, ti->asb + RSAP_VALUE_OFST);
-       writeb(xsrb.cmd_corr, ti->asb + CMD_CORRELATE_OFST);
-       writeb(0, ti->asb + RETCODE_OFST);
-       if ((xmit_command == XMIT_XID_CMD) || (xmit_command == XMIT_TEST_CMD)) {
-               writew(htons(0x11), ti->asb + FRAME_LENGTH_OFST);
-               writeb(0x0e, ti->asb + HEADER_LENGTH_OFST);
-               SET_PAGE(dhb_page);
-               writeb(AC, dhbuf);
-               writeb(LLC_FRAME, dhbuf + 1);
-               for (i = 0; i < TR_ALEN; i++)
-                       writeb((int) 0x0FF, dhbuf + i + 2);
-               for (i = 0; i < TR_ALEN; i++)
-                       writeb(0, dhbuf + i + TR_ALEN + 2);
-               writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-               return;
-       }
-       /*
-        *    the token ring packet is copied from sk_buff to the adapter
-        *    buffer identified in the command data received with the interrupt.
-        */
-       writeb(hdr_len, ti->asb + HEADER_LENGTH_OFST);
-       writew(htons(ti->current_skb->len), ti->asb + FRAME_LENGTH_OFST);
-       src_len=ti->current_skb->len;
-       src_offset=0;
-       dhb=dhb_base;
-       while(1) {
-               if (ti->page_mask) {
-                       dhb_page=(dhb >> 8) & ti->page_mask;
-                       dhb=dhb & ~(ti->page_mask << 8);
-                       dhb_len=0x4000-dhb; /* remaining size of this page */
-               }
-               dhbuf = ti->sram_virt + dhb;
-               SET_PAGE(dhb_page);
-               if (src_len > dhb_len) {
-                       memcpy_toio(dhbuf,&ti->current_skb->data[src_offset],
-                                       dhb_len);
-                       src_len -= dhb_len;
-                       src_offset += dhb_len;
-                       dhb_base+=dhb_len;
-                       dhb=dhb_base;
-                       continue;
-               }
-               memcpy_toio(dhbuf, &ti->current_skb->data[src_offset], src_len);
-               break;
-       }
-       writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-       dev->stats.tx_bytes += ti->current_skb->len;
-       dev_kfree_skb_irq(ti->current_skb);
-       ti->current_skb = NULL;
-       netif_wake_queue(dev);
-       if (ti->readlog_pending)
-               ibmtr_readlog(dev);
-}                              /*tr_tx */
-
-/*****************************************************************************/
-
-
-#define RECEIVE_BUFFER_OFST     6
-#define LAN_HDR_LENGTH_OFST     8
-#define DLC_HDR_LENGTH_OFST     9
-
-#define DSAP_OFST               0
-#define SSAP_OFST               1
-#define LLC_OFST                2
-#define PROTID_OFST             3
-#define ETHERTYPE_OFST          6
-
-static void tr_rx(struct net_device *dev)
-{
-       struct tok_info *ti = netdev_priv(dev);
-       __u32 rbuffer;
-       void __iomem *rbuf, *rbufdata, *llc;
-       __u8 rbuffer_page = 0;
-       unsigned char *data;
-       unsigned int rbuffer_len, lan_hdr_len, hdr_len, ip_len, length;
-       unsigned char dlc_hdr_len;
-       struct sk_buff *skb;
-       unsigned int skb_size = 0;
-       int IPv4_p = 0;
-       unsigned int chksum = 0;
-       struct iphdr *iph;
-       struct arb_rec_req rarb;
-
-       SET_PAGE(ti->arb_page);
-       memcpy_fromio(&rarb, ti->arb, sizeof(rarb));
-       rbuffer = ntohs(rarb.rec_buf_addr) ;
-       rbuf = map_address(ti, rbuffer, &rbuffer_page);
-
-       SET_PAGE(ti->asb_page);
-
-       if (readb(ti->asb + RETCODE_OFST) !=0xFF) DPRINTK("ASB not free !!!\n");
-
-       writeb(REC_DATA, ti->asb + COMMAND_OFST);
-       writew(rarb.station_id, ti->asb + STATION_ID_OFST);
-       writew(rarb.rec_buf_addr, ti->asb + RECEIVE_BUFFER_OFST);
-
-       lan_hdr_len = rarb.lan_hdr_len;
-       if (lan_hdr_len > sizeof(struct trh_hdr)) {
-               DPRINTK("Linux cannot handle greater than 18 bytes RIF\n");
-               return;
-       }                       /*BMS I added this above just to be very safe */
-       dlc_hdr_len = readb(ti->arb + DLC_HDR_LENGTH_OFST);
-       hdr_len = lan_hdr_len + sizeof(struct trllc) + sizeof(struct iphdr);
-
-       SET_PAGE(rbuffer_page);
-       llc = rbuf + offsetof(struct rec_buf, data) + lan_hdr_len;
-
-#if TR_VERBOSE
-       DPRINTK("offsetof data: %02X lan_hdr_len: %02X\n",
-       (__u32) offsetof(struct rec_buf, data), (unsigned int) lan_hdr_len);
-       DPRINTK("llc: %08X rec_buf_addr: %04X dev->mem_start: %lX\n",
-               llc, ntohs(rarb.rec_buf_addr), dev->mem_start);
-       DPRINTK("dsap: %02X, ssap: %02X, llc: %02X, protid: %02X%02X%02X, "
-               "ethertype: %04X\n",
-               (int) readb(llc + DSAP_OFST), (int) readb(llc + SSAP_OFST),
-               (int) readb(llc + LLC_OFST), (int) readb(llc + PROTID_OFST),
-               (int) readb(llc+PROTID_OFST+1),(int)readb(llc+PROTID_OFST + 2),
-               (int) ntohs(readw(llc + ETHERTYPE_OFST)));
-#endif
-       if (readb(llc + offsetof(struct trllc, llc)) != UI_CMD) {
-               SET_PAGE(ti->asb_page);
-               writeb(DATA_LOST, ti->asb + RETCODE_OFST);
-               dev->stats.rx_dropped++;
-               writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-               return;
-       }
-       length = ntohs(rarb.frame_len);
-       if (readb(llc + DSAP_OFST) == EXTENDED_SAP &&
-          readb(llc + SSAP_OFST) == EXTENDED_SAP &&
-               length >= hdr_len)      IPv4_p = 1;
-#if TR_VERBOSE
-#define SADDR_OFST     8
-#define DADDR_OFST     2
-
-       if (!IPv4_p) {
-
-               void __iomem *trhhdr = rbuf + offsetof(struct rec_buf, data);
-               u8 saddr[6];
-               u8 daddr[6];
-               int i;
-               for (i = 0 ; i < 6 ; i++)
-                       saddr[i] = readb(trhhdr + SADDR_OFST + i);
-               for (i = 0 ; i < 6 ; i++)
-                       daddr[i] = readb(trhhdr + DADDR_OFST + i);
-               DPRINTK("Probably non-IP frame received.\n");
-               DPRINTK("ssap: %02X dsap: %02X "
-                       "saddr: %pM daddr: %pM\n",
-                       readb(llc + SSAP_OFST), readb(llc + DSAP_OFST),
-                       saddr, daddr);
-       }
-#endif
-
-       /*BMS handle the case she comes in with few hops but leaves with many */
-        skb_size=length-lan_hdr_len+sizeof(struct trh_hdr)+sizeof(struct trllc);
-
-       if (!(skb = dev_alloc_skb(skb_size))) {
-               DPRINTK("out of memory. frame dropped.\n");
-               dev->stats.rx_dropped++;
-               SET_PAGE(ti->asb_page);
-               writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code));
-               writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-               return;
-       }
-       /*BMS again, if she comes in with few but leaves with many */
-       skb_reserve(skb, sizeof(struct trh_hdr) - lan_hdr_len);
-       skb_put(skb, length);
-       data = skb->data;
-       rbuffer_len = ntohs(readw(rbuf + offsetof(struct rec_buf, buf_len)));
-       rbufdata = rbuf + offsetof(struct rec_buf, data);
-
-       if (IPv4_p) {
-               /* Copy the headers without checksumming */
-               memcpy_fromio(data, rbufdata, hdr_len);
-
-               /* Watch for padded packets and bogons */
-               iph= (struct iphdr *)(data+ lan_hdr_len + sizeof(struct trllc));
-               ip_len = ntohs(iph->tot_len) - sizeof(struct iphdr);
-               length -= hdr_len;
-               if ((ip_len <= length) && (ip_len > 7))
-                       length = ip_len;
-               data += hdr_len;
-               rbuffer_len -= hdr_len;
-               rbufdata += hdr_len;
-       }
-       /* Copy the payload... */
-#define BUFFER_POINTER_OFST    2
-#define BUFFER_LENGTH_OFST      6
-       for (;;) {
-               if (ibmtr_debug_trace&TRC_INITV && length < rbuffer_len)
-                       DPRINTK("CURIOUS, length=%d < rbuffer_len=%d\n",
-                                               length,rbuffer_len);
-               if (IPv4_p)
-                       chksum=csum_partial_copy_nocheck((void*)rbufdata,
-                           data,length<rbuffer_len?length:rbuffer_len,chksum);
-               else
-                       memcpy_fromio(data, rbufdata, rbuffer_len);
-               rbuffer = ntohs(readw(rbuf+BUFFER_POINTER_OFST)) ;
-               if (!rbuffer)
-                       break;
-               rbuffer -= 2;
-               length -= rbuffer_len;
-               data += rbuffer_len;
-               rbuf = map_address(ti, rbuffer, &rbuffer_page);
-               SET_PAGE(rbuffer_page);
-               rbuffer_len = ntohs(readw(rbuf + BUFFER_LENGTH_OFST));
-               rbufdata = rbuf + offsetof(struct rec_buf, data);
-       }
-
-       SET_PAGE(ti->asb_page);
-       writeb(0, ti->asb + offsetof(struct asb_rec, ret_code));
-
-       writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-
-       dev->stats.rx_bytes += skb->len;
-       dev->stats.rx_packets++;
-
-       skb->protocol = tr_type_trans(skb, dev);
-       if (IPv4_p) {
-               skb->csum = chksum;
-               skb->ip_summed = CHECKSUM_COMPLETE;
-       }
-       netif_rx(skb);
-}                              /*tr_rx */
-
-/*****************************************************************************/
-
-static void ibmtr_reset_timer(struct timer_list *tmr, struct net_device *dev)
-{
-       tmr->expires = jiffies + TR_RETRY_INTERVAL;
-       tmr->data = (unsigned long) dev;
-       tmr->function = tok_rerun;
-       init_timer(tmr);
-       add_timer(tmr);
-}
-
-/*****************************************************************************/
-
-static void tok_rerun(unsigned long dev_addr)
-{
-       struct net_device *dev = (struct net_device *)dev_addr;
-       struct tok_info *ti = netdev_priv(dev);
-
-       if ( ti->open_action == RESTART){
-               ti->do_tok_int = FIRST_INT;
-               outb(0, dev->base_addr + ADAPTRESETREL);
-#ifdef ENABLE_PAGING
-               if (ti->page_mask)
-                       writeb(SRPR_ENABLE_PAGING,
-                               ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN);
-#endif
-
-               writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-       } else
-               tok_open_adapter(dev_addr);
-}
-
-/*****************************************************************************/
-
-static void ibmtr_readlog(struct net_device *dev)
-{
-       struct tok_info *ti;
-
-       ti = netdev_priv(dev);
-
-       ti->readlog_pending = 0;
-       SET_PAGE(ti->srb_page);
-       writeb(DIR_READ_LOG, ti->srb);
-       writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-       writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-
-       netif_stop_queue(dev);
-
-}
-
-/*****************************************************************************/
-
-static int ibmtr_change_mtu(struct net_device *dev, int mtu)
-{
-       struct tok_info *ti = netdev_priv(dev);
-
-       if (ti->ring_speed == 16 && mtu > ti->maxmtu16)
-               return -EINVAL;
-       if (ti->ring_speed == 4 && mtu > ti->maxmtu4)
-               return -EINVAL;
-       dev->mtu = mtu;
-       return 0;
-}
-
-/*****************************************************************************/
-#ifdef MODULE
-
-/* 3COM 3C619C supports 8 interrupts, 32 I/O ports */
-static struct net_device *dev_ibmtr[IBMTR_MAX_ADAPTERS];
-static int io[IBMTR_MAX_ADAPTERS] = { 0xa20, 0xa24 };
-static int irq[IBMTR_MAX_ADAPTERS];
-static int mem[IBMTR_MAX_ADAPTERS];
-
-MODULE_LICENSE("GPL");
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-
-static int __init ibmtr_init(void)
-{
-       int i;
-       int count=0;
-
-       find_turbo_adapters(io);
-
-       for (i = 0; i < IBMTR_MAX_ADAPTERS && io[i]; i++) {
-               struct net_device *dev;
-               irq[i] = 0;
-               mem[i] = 0;
-               dev = alloc_trdev(sizeof(struct tok_info));
-               if (dev == NULL) { 
-                       if (i == 0)
-                               return -ENOMEM;
-                       break;
-               }
-               dev->base_addr = io[i];
-               dev->irq = irq[i];
-               dev->mem_start = mem[i];
-
-               if (ibmtr_probe_card(dev)) {
-                       free_netdev(dev);
-                       continue;
-               }
-               dev_ibmtr[i] = dev;
-               count++;
-       }
-       if (count) return 0;
-       printk("ibmtr: register_netdev() returned non-zero.\n");
-       return -EIO;
-}
-module_init(ibmtr_init);
-
-static void __exit ibmtr_cleanup(void)
-{
-       int i;
-
-       for (i = 0; i < IBMTR_MAX_ADAPTERS; i++){
-               if (!dev_ibmtr[i])
-                       continue;
-               unregister_netdev(dev_ibmtr[i]);
-               ibmtr_cleanup_card(dev_ibmtr[i]);
-               free_netdev(dev_ibmtr[i]);
-       }
-}
-module_exit(ibmtr_cleanup);
-#endif
diff --git a/drivers/net/tokenring/ibmtr_cs.c b/drivers/net/tokenring/ibmtr_cs.c
deleted file mode 100644 (file)
index 356e28e..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/*======================================================================
-
-    A PCMCIA token-ring driver for IBM-based cards
-
-    This driver supports the IBM PCMCIA Token-Ring Card.
-    Written by Steve Kipisz, kipisz@vnet.ibm.com or
-                             bungy@ibm.net
-
-    Written 1995,1996.
-
-    This code is based on pcnet_cs.c from David Hinds.
-    
-    V2.2.0 February 1999 - Mike Phillips phillim@amtrak.com
-
-    Linux V2.2.x presented significant changes to the underlying
-    ibmtr.c code.  Mainly the code became a lot more organized and
-    modular.
-
-    This caused the old PCMCIA Token Ring driver to give up and go 
-    home early. Instead of just patching the old code to make it 
-    work, the PCMCIA code has been streamlined, updated and possibly
-    improved.
-
-    This code now only contains code required for the Card Services.
-    All we do here is set the card up enough so that the real ibmtr.c
-    driver can find it and work with it properly.
-
-    i.e. We set up the io port, irq, mmio memory and shared ram
-    memory.  This enables ibmtr_probe in ibmtr.c to find the card and
-    configure it as though it was a normal ISA and/or PnP card.
-
-    CHANGES
-
-    v2.2.5 April 1999 Mike Phillips (phillim@amtrak.com)
-    Obscure bug fix, required changed to ibmtr.c not ibmtr_cs.c
-    
-    v2.2.7 May 1999 Mike Phillips (phillim@amtrak.com)
-    Updated to version 2.2.7 to match the first version of the kernel
-    that the modification to ibmtr.c were incorporated into.
-    
-    v2.2.17 July 2000 Burt Silverman (burts@us.ibm.com)
-    Address translation feature of PCMCIA controller is usable so
-    memory windows can be placed in High memory (meaning above
-    0xFFFFF.)
-
-======================================================================*/
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/timer.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/ibmtr.h>
-
-#include <pcmcia/cistpl.h>
-#include <pcmcia/ds.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#define PCMCIA
-#include "ibmtr.c"
-
-
-/*====================================================================*/
-
-/* Parameters that can be set with 'insmod' */
-
-/* MMIO base address */
-static u_long mmiobase = 0xce000;
-
-/* SRAM base address */
-static u_long srambase = 0xd0000;
-
-/* SRAM size 8,16,32,64 */
-static u_long sramsize = 64;
-
-/* Ringspeed 4,16 */
-static int ringspeed = 16;
-
-module_param(mmiobase, ulong, 0);
-module_param(srambase, ulong, 0);
-module_param(sramsize, ulong, 0);
-module_param(ringspeed, int, 0);
-MODULE_LICENSE("GPL");
-
-/*====================================================================*/
-
-static int ibmtr_config(struct pcmcia_device *link);
-static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase);
-static void ibmtr_release(struct pcmcia_device *link);
-static void ibmtr_detach(struct pcmcia_device *p_dev);
-
-/*====================================================================*/
-
-typedef struct ibmtr_dev_t {
-       struct pcmcia_device    *p_dev;
-       struct net_device       *dev;
-       struct tok_info         *ti;
-} ibmtr_dev_t;
-
-static irqreturn_t ibmtr_interrupt(int irq, void *dev_id) {
-       ibmtr_dev_t *info = dev_id;
-       struct net_device *dev = info->dev;
-       return tok_interrupt(irq, dev);
-};
-
-static int __devinit ibmtr_attach(struct pcmcia_device *link)
-{
-    ibmtr_dev_t *info;
-    struct net_device *dev;
-
-    dev_dbg(&link->dev, "ibmtr_attach()\n");
-
-    /* Create new token-ring device */
-    info = kzalloc(sizeof(*info), GFP_KERNEL);
-    if (!info) return -ENOMEM;
-    dev = alloc_trdev(sizeof(struct tok_info));
-    if (!dev) {
-       kfree(info);
-       return -ENOMEM;
-    }
-
-    info->p_dev = link;
-    link->priv = info;
-    info->ti = netdev_priv(dev);
-
-    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
-    link->resource[0]->end = 4;
-    link->config_flags |= CONF_ENABLE_IRQ;
-    link->config_regs = PRESENT_OPTION;
-
-    info->dev = dev;
-
-    return ibmtr_config(link);
-} /* ibmtr_attach */
-
-static void ibmtr_detach(struct pcmcia_device *link)
-{
-    struct ibmtr_dev_t *info = link->priv;
-    struct net_device *dev = info->dev;
-     struct tok_info *ti = netdev_priv(dev);
-
-    dev_dbg(&link->dev, "ibmtr_detach\n");
-    
-    /* 
-     * When the card removal interrupt hits tok_interrupt(), 
-     * bail out early, so we don't crash the machine 
-     */
-    ti->sram_phys |= 1;
-
-    unregister_netdev(dev);
-    
-    del_timer_sync(&(ti->tr_timer));
-
-    ibmtr_release(link);
-
-    free_netdev(dev);
-    kfree(info);
-} /* ibmtr_detach */
-
-static int __devinit ibmtr_config(struct pcmcia_device *link)
-{
-    ibmtr_dev_t *info = link->priv;
-    struct net_device *dev = info->dev;
-    struct tok_info *ti = netdev_priv(dev);
-    int i, ret;
-
-    dev_dbg(&link->dev, "ibmtr_config\n");
-
-    link->io_lines = 16;
-    link->config_index = 0x61;
-
-    /* Determine if this is PRIMARY or ALTERNATE. */
-
-    /* Try PRIMARY card at 0xA20-0xA23 */
-    link->resource[0]->start = 0xA20;
-    i = pcmcia_request_io(link);
-    if (i != 0) {
-       /* Couldn't get 0xA20-0xA23.  Try ALTERNATE at 0xA24-0xA27. */
-       link->resource[0]->start = 0xA24;
-       ret = pcmcia_request_io(link);
-       if (ret)
-               goto failed;
-    }
-    dev->base_addr = link->resource[0]->start;
-
-    ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
-    if (ret)
-           goto failed;
-    dev->irq = link->irq;
-    ti->irq = link->irq;
-    ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
-
-    /* Allocate the MMIO memory window */
-    link->resource[2]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
-    link->resource[2]->flags |= WIN_USE_WAIT;
-    link->resource[2]->start = 0;
-    link->resource[2]->end = 0x2000;
-    ret = pcmcia_request_window(link, link->resource[2], 250);
-    if (ret)
-           goto failed;
-
-    ret = pcmcia_map_mem_page(link, link->resource[2], mmiobase);
-    if (ret)
-           goto failed;
-    ti->mmio = ioremap(link->resource[2]->start,
-                   resource_size(link->resource[2]));
-
-    /* Allocate the SRAM memory window */
-    link->resource[3]->flags = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
-    link->resource[3]->flags |= WIN_USE_WAIT;
-    link->resource[3]->start = 0;
-    link->resource[3]->end = sramsize * 1024;
-    ret = pcmcia_request_window(link, link->resource[3], 250);
-    if (ret)
-           goto failed;
-
-    ret = pcmcia_map_mem_page(link, link->resource[3], srambase);
-    if (ret)
-           goto failed;
-
-    ti->sram_base = srambase >> 12;
-    ti->sram_virt = ioremap(link->resource[3]->start,
-                   resource_size(link->resource[3]));
-    ti->sram_phys = link->resource[3]->start;
-
-    ret = pcmcia_enable_device(link);
-    if (ret)
-           goto failed;
-
-    /*  Set up the Token-Ring Controller Configuration Register and
-        turn on the card.  Check the "Local Area Network Credit Card
-        Adapters Technical Reference"  SC30-3585 for this info.  */
-    ibmtr_hw_setup(dev, mmiobase);
-
-    SET_NETDEV_DEV(dev, &link->dev);
-
-    i = ibmtr_probe_card(dev);
-    if (i != 0) {
-       pr_notice("register_netdev() failed\n");
-       goto failed;
-    }
-
-    netdev_info(dev, "port %#3lx, irq %d, mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
-               dev->base_addr, dev->irq,
-               (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
-               dev->dev_addr);
-    return 0;
-
-failed:
-    ibmtr_release(link);
-    return -ENODEV;
-} /* ibmtr_config */
-
-static void ibmtr_release(struct pcmcia_device *link)
-{
-       ibmtr_dev_t *info = link->priv;
-       struct net_device *dev = info->dev;
-
-       dev_dbg(&link->dev, "ibmtr_release\n");
-
-       if (link->resource[2]->end) {
-               struct tok_info *ti = netdev_priv(dev);
-               iounmap(ti->mmio);
-       }
-       pcmcia_disable_device(link);
-}
-
-static int ibmtr_suspend(struct pcmcia_device *link)
-{
-       ibmtr_dev_t *info = link->priv;
-       struct net_device *dev = info->dev;
-
-       if (link->open)
-               netif_device_detach(dev);
-
-       return 0;
-}
-
-static int __devinit ibmtr_resume(struct pcmcia_device *link)
-{
-       ibmtr_dev_t *info = link->priv;
-       struct net_device *dev = info->dev;
-
-       if (link->open) {
-               ibmtr_probe(dev);       /* really? */
-               netif_device_attach(dev);
-       }
-
-       return 0;
-}
-
-
-/*====================================================================*/
-
-static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
-{
-    int i;
-
-    /* Bizarre IBM behavior, there are 16 bits of information we
-       need to set, but the card only allows us to send 4 bits at a 
-       time.  For each byte sent to base_addr, bits 7-4 tell the
-       card which part of the 16 bits we are setting, bits 3-0 contain 
-       the actual information */
-
-    /* First nibble provides 4 bits of mmio */
-    i = (mmiobase >> 16) & 0x0F;
-    outb(i, dev->base_addr);
-
-    /* Second nibble provides 3 bits of mmio */
-    i = 0x10 | ((mmiobase >> 12) & 0x0E);
-    outb(i, dev->base_addr);
-
-    /* Third nibble, hard-coded values */
-    i = 0x26;
-    outb(i, dev->base_addr);
-
-    /* Fourth nibble sets shared ram page size */
-
-    /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */          
-    i = (sramsize >> 4) & 0x07;
-    i = ((i == 4) ? 3 : i) << 2;
-    i |= 0x30;
-
-    if (ringspeed == 16)
-       i |= 2;
-    if (dev->base_addr == 0xA24)
-       i |= 1;
-    outb(i, dev->base_addr);
-
-    /* 0x40 will release the card for use */
-    outb(0x40, dev->base_addr);
-}
-
-static const struct pcmcia_device_id ibmtr_ids[] = {
-       PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
-       PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
-       PCMCIA_DEVICE_NULL,
-};
-MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
-
-static struct pcmcia_driver ibmtr_cs_driver = {
-       .owner          = THIS_MODULE,
-       .name           = "ibmtr_cs",
-       .probe          = ibmtr_attach,
-       .remove         = ibmtr_detach,
-       .id_table       = ibmtr_ids,
-       .suspend        = ibmtr_suspend,
-       .resume         = ibmtr_resume,
-};
-
-static int __init init_ibmtr_cs(void)
-{
-       return pcmcia_register_driver(&ibmtr_cs_driver);
-}
-
-static void __exit exit_ibmtr_cs(void)
-{
-       pcmcia_unregister_driver(&ibmtr_cs_driver);
-}
-
-module_init(init_ibmtr_cs);
-module_exit(exit_ibmtr_cs);
diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c
deleted file mode 100644 (file)
index 97e4c65..0000000
+++ /dev/null
@@ -1,1909 +0,0 @@
-/*
- *   lanstreamer.c -- driver for the IBM Auto LANStreamer PCI Adapter
- *
- *  Written By: Mike Sullivan, IBM Corporation
- *
- *  Copyright (C) 1999 IBM Corporation
- *
- *  Linux driver for IBM PCI tokenring cards based on the LanStreamer MPC
- *  chipset. 
- *
- *  This driver is based on the olympic driver for IBM PCI TokenRing cards (Pit/Pit-Phy/Olympic
- *  chipsets) written  by:
- *      1999 Peter De Schrijver All Rights Reserved
- *     1999 Mike Phillips (phillim@amtrak.com)
- *
- *  Base Driver Skeleton:
- *      Written 1993-94 by Donald Becker.
- *
- *      Copyright 1993 United States Government as represented by the
- *      Director, National Security Agency.
- *
- * 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; either version 2 of the License, or         
- * (at your option) any later version.                                       
- *                                                                           
- * 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.                              
- *                                                                           
- * NO WARRANTY                                                               
- * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        
- * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      
- * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    
- * solely responsible for determining the appropriateness of using and       
- * distributing the Program and assumes all risks associated with its        
- * exercise of rights under this Agreement, including but not limited to     
- * the risks and costs of program errors, damage to or loss of data,         
- * programs or equipment, and unavailability or interruption of operations.  
- *                                                                           
- * DISCLAIMER OF LIABILITY                                                   
- * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        
- * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    
- * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  
- * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             
- *                                                                           
- * You should have received a copy of the GNU General Public License         
- * along with this program; if not, write to the Free Software               
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
- *                                                                           
- * 
- *  12/10/99 - Alpha Release 0.1.0
- *            First release to the public
- *  03/03/00 - Merged to kernel, indented -kr -i8 -bri0, fixed some missing
- *             malloc free checks, reviewed code. <alan@redhat.com>
- *  03/13/00 - Added spinlocks for smp
- *  03/08/01 - Added support for module_init() and module_exit()
- *  08/15/01 - Added ioctl() functionality for debugging, changed netif_*_queue
- *             calls and other incorrectness - Kent Yoder <yoder1@us.ibm.com>
- *  11/05/01 - Restructured the interrupt function, added delays, reduced the 
- *             the number of TX descriptors to 1, which together can prevent 
- *             the card from locking up the box - <yoder1@us.ibm.com>
- *  09/27/02 - New PCI interface + bug fix. - <yoder1@us.ibm.com>
- *  11/13/02 - Removed free_irq calls which could cause a hang, added
- *            netif_carrier_{on|off} - <yoder1@us.ibm.com>
- *  
- *  To Do:
- *
- *
- *  If Problems do Occur
- *  Most problems can be rectified by either closing and opening the interface
- *  (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
- *  if compiled into the kernel).
- */
-
-/* Change STREAMER_DEBUG to 1 to get verbose, and I mean really verbose, messages */
-
-#define STREAMER_DEBUG 0
-#define STREAMER_DEBUG_PACKETS 0
-
-/* Change STREAMER_NETWORK_MONITOR to receive mac frames through the arb channel.
- * Will also create a /proc/net/streamer_tr entry if proc_fs is compiled into the
- * kernel.
- * Intended to be used to create a ring-error reporting network module 
- * i.e. it will give you the source address of beaconers on the ring 
- */
-
-#define STREAMER_NETWORK_MONITOR 0
-
-/* #define CONFIG_PROC_FS */
-
-/*
- *  Allow or disallow ioctl's for debugging
- */
-
-#define STREAMER_IOCTL 0
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/in.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/proc_fs.h>
-#include <linux/ptrace.h>
-#include <linux/skbuff.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/stddef.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/dma-mapping.h>
-#include <linux/spinlock.h>
-#include <linux/bitops.h>
-#include <linux/jiffies.h>
-#include <linux/slab.h>
-
-#include <net/net_namespace.h>
-#include <net/checksum.h>
-
-#include <asm/io.h>
-
-#include "lanstreamer.h"
-
-#if (BITS_PER_LONG == 64)
-#error broken on 64-bit: stores pointer to rx_ring->buffer in 32-bit int
-#endif
-
-
-/* I've got to put some intelligence into the version number so that Peter and I know
- * which version of the code somebody has got. 
- * Version Number = a.b.c.d  where a.b.c is the level of code and d is the latest author.
- * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
- * 
- * Official releases will only have an a.b.c version number format.
- */
-
-static char version[] = "LanStreamer.c v0.4.0 03/08/01 - Mike Sullivan\n"
-                        "              v0.5.3 11/13/02 - Kent Yoder";
-
-static DEFINE_PCI_DEVICE_TABLE(streamer_pci_tbl) = {
-       { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR, PCI_ANY_ID, PCI_ANY_ID,},
-       {}      /* terminating entry */
-};
-MODULE_DEVICE_TABLE(pci,streamer_pci_tbl);
-
-
-static char *open_maj_error[] = {
-       "No error", "Lobe Media Test", "Physical Insertion",
-       "Address Verification", "Neighbor Notification (Ring Poll)",
-       "Request Parameters", "FDX Registration Request",
-       "FDX Lobe Media Test", "FDX Duplicate Address Check",
-       "Unknown stage"
-};
-
-static char *open_min_error[] = {
-       "No error", "Function Failure", "Signal Lost", "Wire Fault",
-       "Ring Speed Mismatch", "Timeout", "Ring Failure", "Ring Beaconing",
-       "Duplicate Node Address", "Request Parameters", "Remove Received",
-       "Reserved", "Reserved", "No Monitor Detected for RPL",
-       "Monitor Contention failer for RPL", "FDX Protocol Error"
-};
-
-/* Module parameters */
-
-/* Ring Speed 0,4,16
- * 0 = Autosense         
- * 4,16 = Selected speed only, no autosense
- * This allows the card to be the first on the ring
- * and become the active monitor.
- *
- * WARNING: Some hubs will allow you to insert
- * at the wrong speed
- */
-
-static int ringspeed[STREAMER_MAX_ADAPTERS] = { 0, };
-
-module_param_array(ringspeed, int, NULL, 0);
-
-/* Packet buffer size */
-
-static int pkt_buf_sz[STREAMER_MAX_ADAPTERS] = { 0, };
-
-module_param_array(pkt_buf_sz, int, NULL, 0);
-
-/* Message Level */
-
-static int message_level[STREAMER_MAX_ADAPTERS] = { 1, };
-
-module_param_array(message_level, int, NULL, 0);
-
-#if STREAMER_IOCTL
-static int streamer_ioctl(struct net_device *, struct ifreq *, int);
-#endif
-
-static int streamer_reset(struct net_device *dev);
-static int streamer_open(struct net_device *dev);
-static netdev_tx_t streamer_xmit(struct sk_buff *skb,
-                                      struct net_device *dev);
-static int streamer_close(struct net_device *dev);
-static void streamer_set_rx_mode(struct net_device *dev);
-static irqreturn_t streamer_interrupt(int irq, void *dev_id);
-static int streamer_set_mac_address(struct net_device *dev, void *addr);
-static void streamer_arb_cmd(struct net_device *dev);
-static int streamer_change_mtu(struct net_device *dev, int mtu);
-static void streamer_srb_bh(struct net_device *dev);
-static void streamer_asb_bh(struct net_device *dev);
-#if STREAMER_NETWORK_MONITOR
-#ifdef CONFIG_PROC_FS
-static int streamer_proc_info(char *buffer, char **start, off_t offset,
-                             int length, int *eof, void *data);
-static int sprintf_info(char *buffer, struct net_device *dev);
-struct streamer_private *dev_streamer=NULL;
-#endif
-#endif
-
-static const struct net_device_ops streamer_netdev_ops = {
-       .ndo_open               = streamer_open,
-       .ndo_stop               = streamer_close,
-       .ndo_start_xmit         = streamer_xmit,
-       .ndo_change_mtu         = streamer_change_mtu,
-#if STREAMER_IOCTL
-       .ndo_do_ioctl           = streamer_ioctl,
-#endif
-       .ndo_set_rx_mode        = streamer_set_rx_mode,
-       .ndo_set_mac_address    = streamer_set_mac_address,
-};
-
-static int __devinit streamer_init_one(struct pci_dev *pdev,
-                                      const struct pci_device_id *ent)
-{
-       struct net_device *dev;
-       struct streamer_private *streamer_priv;
-       unsigned long pio_start, pio_end, pio_flags, pio_len;
-       unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
-       int rc = 0;
-       static int card_no=-1;
-       u16 pcr;
-
-#if STREAMER_DEBUG
-       printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev);
-#endif
-
-       card_no++;
-       dev = alloc_trdev(sizeof(*streamer_priv));
-       if (dev==NULL) {
-               printk(KERN_ERR "lanstreamer: out of memory.\n");
-               return -ENOMEM;
-       }
-
-       streamer_priv = netdev_priv(dev);
-
-#if STREAMER_NETWORK_MONITOR
-#ifdef CONFIG_PROC_FS
-       if (!dev_streamer)
-               create_proc_read_entry("streamer_tr", 0, init_net.proc_net,
-                                       streamer_proc_info, NULL); 
-       streamer_priv->next = dev_streamer;
-       dev_streamer = streamer_priv;
-#endif
-#endif
-
-       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-       if (rc) {
-               printk(KERN_ERR "%s: No suitable PCI mapping available.\n",
-                               dev->name);
-               rc = -ENODEV;
-               goto err_out;
-       }
-
-       rc = pci_enable_device(pdev);
-       if (rc) {
-               printk(KERN_ERR "lanstreamer: unable to enable pci device\n");
-               rc=-EIO;
-               goto err_out;
-       }
-
-       pci_set_master(pdev);
-
-       rc = pci_set_mwi(pdev);
-       if (rc) {
-               printk(KERN_ERR "lanstreamer: unable to enable MWI on pci device\n");
-               goto err_out_disable;
-       }
-
-       pio_start = pci_resource_start(pdev, 0);
-       pio_end = pci_resource_end(pdev, 0);
-       pio_flags = pci_resource_flags(pdev, 0);
-       pio_len = pci_resource_len(pdev, 0);
-
-       mmio_start = pci_resource_start(pdev, 1);
-       mmio_end = pci_resource_end(pdev, 1);
-       mmio_flags = pci_resource_flags(pdev, 1);
-       mmio_len = pci_resource_len(pdev, 1);
-
-#if STREAMER_DEBUG
-       printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n",
-               pio_start, pio_end, pio_len, pio_flags);
-       printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n",
-               mmio_start, mmio_end, mmio_flags, mmio_len);
-#endif
-
-       if (!request_region(pio_start, pio_len, "lanstreamer")) {
-               printk(KERN_ERR "lanstreamer: unable to get pci io addr %lx\n",
-                       pio_start);
-               rc= -EBUSY;
-               goto err_out_mwi;
-       }
-
-       if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) {
-               printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %lx\n",
-                       mmio_start);
-               rc= -EBUSY;
-               goto err_out_free_pio;
-       }
-
-       streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len);
-       if (streamer_priv->streamer_mmio == NULL) {
-               printk(KERN_ERR "lanstreamer: unable to remap MMIO %lx\n",
-                       mmio_start);
-               rc= -EIO;
-               goto err_out_free_mmio;
-       }
-
-       init_waitqueue_head(&streamer_priv->srb_wait);
-       init_waitqueue_head(&streamer_priv->trb_wait);
-
-       dev->netdev_ops = &streamer_netdev_ops;
-       dev->irq = pdev->irq;
-       dev->base_addr=pio_start;
-       SET_NETDEV_DEV(dev, &pdev->dev);
-
-       streamer_priv->streamer_card_name = (char *)pdev->resource[0].name;
-       streamer_priv->pci_dev = pdev;
-
-       if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000))
-               streamer_priv->pkt_buf_sz = PKT_BUF_SZ;
-       else
-               streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no];
-
-       streamer_priv->streamer_ring_speed = ringspeed[card_no];
-       streamer_priv->streamer_message_level = message_level[card_no];
-
-       pci_set_drvdata(pdev, dev);
-
-       spin_lock_init(&streamer_priv->streamer_lock);
-
-       pci_read_config_word (pdev, PCI_COMMAND, &pcr);
-       pcr |= PCI_COMMAND_SERR;
-       pci_write_config_word (pdev, PCI_COMMAND, pcr);
-
-       printk("%s\n", version);
-       printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name,
-               streamer_priv->streamer_card_name,
-               (unsigned int) dev->base_addr,
-               streamer_priv->streamer_mmio, 
-               dev->irq);
-
-       if (streamer_reset(dev))
-               goto err_out_unmap;
-
-       rc = register_netdev(dev);
-       if (rc)
-               goto err_out_unmap;
-       return 0;
-
-err_out_unmap:
-       iounmap(streamer_priv->streamer_mmio);
-err_out_free_mmio:
-       release_mem_region(mmio_start, mmio_len);
-err_out_free_pio:
-       release_region(pio_start, pio_len);
-err_out_mwi:
-       pci_clear_mwi(pdev);
-err_out_disable:
-       pci_disable_device(pdev);
-err_out:
-       free_netdev(dev);
-#if STREAMER_DEBUG
-       printk("lanstreamer: Exit error %x\n",rc);
-#endif
-       return rc;
-}
-
-static void __devexit streamer_remove_one(struct pci_dev *pdev)
-{
-       struct net_device *dev=pci_get_drvdata(pdev);
-       struct streamer_private *streamer_priv;
-
-#if STREAMER_DEBUG
-       printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev);
-#endif
-
-       if (dev == NULL) {
-               printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n");
-               return;
-       }
-
-       streamer_priv=netdev_priv(dev);
-       if (streamer_priv == NULL) {
-               printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n");
-               return;
-       }
-
-#if STREAMER_NETWORK_MONITOR
-#ifdef CONFIG_PROC_FS
-       {
-               struct streamer_private **p, **next;
-
-               for (p = &dev_streamer; *p; p = next) {
-                       next = &(*p)->next;
-                       if (*p == streamer_priv) {
-                               *p = *next;
-                               break;
-                       }
-               }
-               if (!dev_streamer)
-                       remove_proc_entry("streamer_tr", init_net.proc_net);
-       }
-#endif
-#endif
-
-       unregister_netdev(dev);
-       iounmap(streamer_priv->streamer_mmio);
-       release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1));
-       release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0));
-       pci_clear_mwi(pdev);
-       pci_disable_device(pdev);
-       free_netdev(dev);
-       pci_set_drvdata(pdev, NULL);
-}
-
-
-static int streamer_reset(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv;
-       __u8 __iomem *streamer_mmio;
-       unsigned long t;
-       unsigned int uaa_addr;
-       struct sk_buff *skb = NULL;
-       __u16 misr;
-
-       streamer_priv = netdev_priv(dev);
-       streamer_mmio = streamer_priv->streamer_mmio;
-
-       writew(readw(streamer_mmio + BCTL) | BCTL_SOFTRESET, streamer_mmio + BCTL);
-       t = jiffies;
-       /* Hold soft reset bit for a while */
-       ssleep(1);
-       
-       writew(readw(streamer_mmio + BCTL) & ~BCTL_SOFTRESET,
-              streamer_mmio + BCTL);
-
-#if STREAMER_DEBUG
-       printk("BCTL: %x\n", readw(streamer_mmio + BCTL));
-       printk("GPR: %x\n", readw(streamer_mmio + GPR));
-       printk("SISRMASK: %x\n", readw(streamer_mmio + SISR_MASK));
-#endif
-       writew(readw(streamer_mmio + BCTL) | (BCTL_RX_FIFO_8 | BCTL_TX_FIFO_8), streamer_mmio + BCTL );
-
-       if (streamer_priv->streamer_ring_speed == 0) {  /* Autosense */
-               writew(readw(streamer_mmio + GPR) | GPR_AUTOSENSE,
-                      streamer_mmio + GPR);
-               if (streamer_priv->streamer_message_level)
-                       printk(KERN_INFO "%s: Ringspeed autosense mode on\n",
-                              dev->name);
-       } else if (streamer_priv->streamer_ring_speed == 16) {
-               if (streamer_priv->streamer_message_level)
-                       printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n",
-                              dev->name);
-               writew(GPR_16MBPS, streamer_mmio + GPR);
-       } else if (streamer_priv->streamer_ring_speed == 4) {
-               if (streamer_priv->streamer_message_level)
-                       printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n",
-                              dev->name);
-               writew(0, streamer_mmio + GPR);
-       }
-
-       skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
-       if (!skb) {
-               printk(KERN_INFO "%s: skb allocation for diagnostics failed...proceeding\n",
-                      dev->name);
-       } else {
-               struct streamer_rx_desc *rx_ring;
-                u8 *data;
-
-               rx_ring=(struct streamer_rx_desc *)skb->data;
-               data=((u8 *)skb->data)+sizeof(struct streamer_rx_desc);
-               rx_ring->forward=0;
-               rx_ring->status=0;
-               rx_ring->buffer=cpu_to_le32(pci_map_single(streamer_priv->pci_dev, data, 
-                                                       512, PCI_DMA_FROMDEVICE));
-               rx_ring->framelen_buflen=512; 
-               writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, rx_ring, 512, PCI_DMA_FROMDEVICE)),
-                       streamer_mmio+RXBDA);
-       }
-
-#if STREAMER_DEBUG
-       printk("GPR = %x\n", readw(streamer_mmio + GPR));
-#endif
-       /* start solo init */
-       writew(SISR_MI, streamer_mmio + SISR_MASK_SUM);
-
-       while (!((readw(streamer_mmio + SISR)) & SISR_SRB_REPLY)) {
-               msleep_interruptible(100);
-               if (time_after(jiffies, t + 40 * HZ)) {
-                       printk(KERN_ERR
-                              "IBM PCI tokenring card not responding\n");
-                       release_region(dev->base_addr, STREAMER_IO_SPACE);
-                       if (skb)
-                               dev_kfree_skb(skb);
-                       return -1;
-               }
-       }
-       writew(~SISR_SRB_REPLY, streamer_mmio + SISR_RUM);
-       misr = readw(streamer_mmio + MISR_RUM);
-       writew(~misr, streamer_mmio + MISR_RUM);
-
-       if (skb)
-               dev_kfree_skb(skb);     /* release skb used for diagnostics */
-
-#if STREAMER_DEBUG
-       printk("LAPWWO: %x, LAPA: %x LAPE:  %x\n",
-              readw(streamer_mmio + LAPWWO), readw(streamer_mmio + LAPA),
-              readw(streamer_mmio + LAPE));
-#endif
-
-#if STREAMER_DEBUG
-       {
-               int i;
-               writew(readw(streamer_mmio + LAPWWO),
-                      streamer_mmio + LAPA);
-               printk("initialization response srb dump: ");
-               for (i = 0; i < 10; i++)
-                       printk("%x:",
-                              ntohs(readw(streamer_mmio + LAPDINC)));
-               printk("\n");
-       }
-#endif
-
-       writew(readw(streamer_mmio + LAPWWO) + 6, streamer_mmio + LAPA);
-       if (readw(streamer_mmio + LAPD)) {
-               printk(KERN_INFO "tokenring card initialization failed. errorcode : %x\n",
-                      ntohs(readw(streamer_mmio + LAPD)));
-               release_region(dev->base_addr, STREAMER_IO_SPACE);
-               return -1;
-       }
-
-       writew(readw(streamer_mmio + LAPWWO) + 8, streamer_mmio + LAPA);
-       uaa_addr = ntohs(readw(streamer_mmio + LAPDINC));
-       readw(streamer_mmio + LAPDINC); /* skip over Level.Addr field */
-       streamer_priv->streamer_addr_table_addr = ntohs(readw(streamer_mmio + LAPDINC));
-       streamer_priv->streamer_parms_addr = ntohs(readw(streamer_mmio + LAPDINC));
-
-#if STREAMER_DEBUG
-       printk("UAA resides at %x\n", uaa_addr);
-#endif
-
-       /* setup uaa area for access with LAPD */
-       {
-               int i;
-               __u16 addr;
-               writew(uaa_addr, streamer_mmio + LAPA);
-               for (i = 0; i < 6; i += 2) {
-                       addr=ntohs(readw(streamer_mmio+LAPDINC));
-                       dev->dev_addr[i]= (addr >> 8) & 0xff;
-                       dev->dev_addr[i+1]= addr & 0xff;
-               }
-#if STREAMER_DEBUG
-               printk("Adapter address: %pM\n", dev->dev_addr);
-#endif
-       }
-       return 0;
-}
-
-static int streamer_open(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv = netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       unsigned long flags;
-       char open_error[255];
-       int i, open_finished = 1;
-       __u16 srb_word;
-       __u16 srb_open;
-       int rc;
-
-       if (readw(streamer_mmio+BMCTL_SUM) & BMCTL_RX_ENABLED) {
-               rc=streamer_reset(dev);
-       }
-
-       if (request_irq(dev->irq, streamer_interrupt, IRQF_SHARED, "lanstreamer", dev)) {
-               return -EAGAIN;
-       }
-#if STREAMER_DEBUG
-       printk("BMCTL: %x\n", readw(streamer_mmio + BMCTL_SUM));
-       printk("pending ints: %x\n", readw(streamer_mmio + SISR));
-#endif
-
-       writew(SISR_MI | SISR_SRB_REPLY, streamer_mmio + SISR_MASK);    /* more ints later, doesn't stop arb cmd interrupt */
-       writew(LISR_LIE, streamer_mmio + LISR); /* more ints later */
-
-       /* adapter is closed, so SRB is pointed to by LAPWWO */
-       writew(readw(streamer_mmio + LAPWWO), streamer_mmio + LAPA);
-
-#if STREAMER_DEBUG
-       printk("LAPWWO: %x, LAPA: %x\n", readw(streamer_mmio + LAPWWO),
-              readw(streamer_mmio + LAPA));
-       printk("LAPE: %x\n", readw(streamer_mmio + LAPE));
-       printk("SISR Mask = %04x\n", readw(streamer_mmio + SISR_MASK));
-#endif
-       do {
-               for (i = 0; i < SRB_COMMAND_SIZE; i += 2) {
-                       writew(0, streamer_mmio + LAPDINC);
-               }
-
-               writew(readw(streamer_mmio+LAPWWO),streamer_mmio+LAPA);
-               writew(htons(SRB_OPEN_ADAPTER<<8),streamer_mmio+LAPDINC) ;      /* open */
-               writew(htons(STREAMER_CLEAR_RET_CODE<<8),streamer_mmio+LAPDINC);
-               writew(STREAMER_CLEAR_RET_CODE, streamer_mmio + LAPDINC);
-
-               writew(readw(streamer_mmio + LAPWWO) + 8, streamer_mmio + LAPA);
-#if STREAMER_NETWORK_MONITOR
-               /* If Network Monitor, instruct card to copy MAC frames through the ARB */
-               writew(htons(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON), streamer_mmio + LAPDINC);     /* offset 8 word contains open options */
-#else
-               writew(htons(OPEN_ADAPTER_ENABLE_FDX), streamer_mmio + LAPDINC);        /* Offset 8 word contains Open.Options */
-#endif
-
-               if (streamer_priv->streamer_laa[0]) {
-                       writew(readw(streamer_mmio + LAPWWO) + 12, streamer_mmio + LAPA);
-                       writew(htons((streamer_priv->streamer_laa[0] << 8) | 
-                                    streamer_priv->streamer_laa[1]),streamer_mmio+LAPDINC);
-                       writew(htons((streamer_priv->streamer_laa[2] << 8) | 
-                                    streamer_priv->streamer_laa[3]),streamer_mmio+LAPDINC);
-                       writew(htons((streamer_priv->streamer_laa[4] << 8) | 
-                                    streamer_priv->streamer_laa[5]),streamer_mmio+LAPDINC);
-                       memcpy(dev->dev_addr, streamer_priv->streamer_laa, dev->addr_len);
-               }
-
-               /* save off srb open offset */
-               srb_open = readw(streamer_mmio + LAPWWO);
-#if STREAMER_DEBUG
-               writew(readw(streamer_mmio + LAPWWO),
-                      streamer_mmio + LAPA);
-               printk("srb open request:\n");
-               for (i = 0; i < 16; i++) {
-                       printk("%x:", ntohs(readw(streamer_mmio + LAPDINC)));
-               }
-               printk("\n");
-#endif
-               spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
-               streamer_priv->srb_queued = 1;
-
-               /* signal solo that SRB command has been issued */
-               writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
-               spin_unlock_irqrestore(&streamer_priv->streamer_lock, flags);
-
-               while (streamer_priv->srb_queued) {
-                       interruptible_sleep_on_timeout(&streamer_priv->srb_wait, 5 * HZ);
-                       if (signal_pending(current)) {
-                               printk(KERN_WARNING "%s: SRB timed out.\n", dev->name);
-                               printk(KERN_WARNING "SISR=%x MISR=%x, LISR=%x\n",
-                                      readw(streamer_mmio + SISR),
-                                      readw(streamer_mmio + MISR_RUM),
-                                      readw(streamer_mmio + LISR));
-                               streamer_priv->srb_queued = 0;
-                               break;
-                       }
-               }
-
-#if STREAMER_DEBUG
-               printk("SISR_MASK: %x\n", readw(streamer_mmio + SISR_MASK));
-               printk("srb open response:\n");
-               writew(srb_open, streamer_mmio + LAPA);
-               for (i = 0; i < 10; i++) {
-                       printk("%x:",
-                              ntohs(readw(streamer_mmio + LAPDINC)));
-               }
-#endif
-
-               /* If we get the same return response as we set, the interrupt wasn't raised and the open
-                * timed out.
-                */
-               writew(srb_open + 2, streamer_mmio + LAPA);
-               srb_word = ntohs(readw(streamer_mmio + LAPD)) >> 8;
-               if (srb_word == STREAMER_CLEAR_RET_CODE) {
-                       printk(KERN_WARNING "%s: Adapter Open time out or error.\n",
-                              dev->name);
-                       return -EIO;
-               }
-
-               if (srb_word != 0) {
-                       if (srb_word == 0x07) {
-                               if (!streamer_priv->streamer_ring_speed && open_finished) {     /* Autosense , first time around */
-                                       printk(KERN_WARNING "%s: Retrying at different ring speed\n",
-                                              dev->name);
-                                       open_finished = 0;
-                               } else {
-                                       __u16 error_code;
-
-                                       writew(srb_open + 6, streamer_mmio + LAPA);
-                                       error_code = ntohs(readw(streamer_mmio + LAPD));
-                                       strcpy(open_error, open_maj_error[(error_code & 0xf0) >> 4]);
-                                       strcat(open_error, " - ");
-                                       strcat(open_error, open_min_error[(error_code & 0x0f)]);
-
-                                       if (!streamer_priv->streamer_ring_speed &&
-                                           ((error_code & 0x0f) == 0x0d))
-                                       {
-                                               printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n", dev->name);
-                                               printk(KERN_WARNING "%s: Please try again with a specified ring speed\n", dev->name);
-                                               free_irq(dev->irq, dev);
-                                               return -EIO;
-                                       }
-
-                                       printk(KERN_WARNING "%s: %s\n",
-                                              dev->name, open_error);
-                                       free_irq(dev->irq, dev);
-                                       return -EIO;
-
-                               }       /* if autosense && open_finished */
-                       } else {
-                               printk(KERN_WARNING "%s: Bad OPEN response: %x\n",
-                                      dev->name, srb_word);
-                               free_irq(dev->irq, dev);
-                               return -EIO;
-                       }
-               } else
-                       open_finished = 1;
-       } while (!(open_finished));     /* Will only loop if ring speed mismatch re-open attempted && autosense is on */
-
-       writew(srb_open + 18, streamer_mmio + LAPA);
-       srb_word=ntohs(readw(streamer_mmio+LAPD)) >> 8;
-       if (srb_word & (1 << 3))
-               if (streamer_priv->streamer_message_level)
-                       printk(KERN_INFO "%s: Opened in FDX Mode\n", dev->name);
-
-       if (srb_word & 1)
-               streamer_priv->streamer_ring_speed = 16;
-       else
-               streamer_priv->streamer_ring_speed = 4;
-
-       if (streamer_priv->streamer_message_level)
-               printk(KERN_INFO "%s: Opened in %d Mbps mode\n", 
-                       dev->name,
-                       streamer_priv->streamer_ring_speed);
-
-       writew(srb_open + 8, streamer_mmio + LAPA);
-       streamer_priv->asb = ntohs(readw(streamer_mmio + LAPDINC));
-       streamer_priv->srb = ntohs(readw(streamer_mmio + LAPDINC));
-       streamer_priv->arb = ntohs(readw(streamer_mmio + LAPDINC));
-       readw(streamer_mmio + LAPDINC); /* offset 14 word is rsvd */
-       streamer_priv->trb = ntohs(readw(streamer_mmio + LAPDINC));
-
-       streamer_priv->streamer_receive_options = 0x00;
-       streamer_priv->streamer_copy_all_options = 0;
-
-       /* setup rx ring */
-       /* enable rx channel */
-       writew(~BMCTL_RX_DIS, streamer_mmio + BMCTL_RUM);
-
-       /* setup rx descriptors */
-       streamer_priv->streamer_rx_ring=
-           kmalloc( sizeof(struct streamer_rx_desc)*
-                    STREAMER_RX_RING_SIZE,GFP_KERNEL);
-       if (!streamer_priv->streamer_rx_ring) {
-           printk(KERN_WARNING "%s ALLOC of streamer rx ring FAILED!!\n",dev->name);
-           return -EIO;
-       }
-
-       for (i = 0; i < STREAMER_RX_RING_SIZE; i++) {
-               struct sk_buff *skb;
-
-               skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
-               if (skb == NULL)
-                       break;
-
-               skb->dev = dev;
-
-               streamer_priv->streamer_rx_ring[i].forward = 
-                       cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[i + 1],
-                                       sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE));
-               streamer_priv->streamer_rx_ring[i].status = 0;
-               streamer_priv->streamer_rx_ring[i].buffer = 
-                       cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data,
-                                             streamer_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
-               streamer_priv->streamer_rx_ring[i].framelen_buflen = streamer_priv->pkt_buf_sz;
-               streamer_priv->rx_ring_skb[i] = skb;
-       }
-       streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1].forward =
-                               cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0],
-                                               sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE));
-
-       if (i == 0) {
-               printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n", dev->name);
-               free_irq(dev->irq, dev);
-               return -EIO;
-       }
-
-       streamer_priv->rx_ring_last_received = STREAMER_RX_RING_SIZE - 1;       /* last processed rx status */
-
-       writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0],
-                               sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), 
-               streamer_mmio + RXBDA);
-       writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1],
-                               sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), 
-               streamer_mmio + RXLBDA);
-
-       /* set bus master interrupt event mask */
-       writew(MISR_RX_NOBUF | MISR_RX_EOF, streamer_mmio + MISR_MASK);
-
-
-       /* setup tx ring */
-       streamer_priv->streamer_tx_ring=kmalloc(sizeof(struct streamer_tx_desc)*
-                                               STREAMER_TX_RING_SIZE,GFP_KERNEL);
-       if (!streamer_priv->streamer_tx_ring) {
-           printk(KERN_WARNING "%s ALLOC of streamer_tx_ring FAILED\n",dev->name);
-           return -EIO;
-       }
-
-       writew(~BMCTL_TX2_DIS, streamer_mmio + BMCTL_RUM);      /* Enables TX channel 2 */
-       for (i = 0; i < STREAMER_TX_RING_SIZE; i++) {
-               streamer_priv->streamer_tx_ring[i].forward = cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
-                                                                               &streamer_priv->streamer_tx_ring[i + 1],
-                                                                               sizeof(struct streamer_tx_desc),
-                                                                               PCI_DMA_TODEVICE));
-               streamer_priv->streamer_tx_ring[i].status = 0;
-               streamer_priv->streamer_tx_ring[i].bufcnt_framelen = 0;
-               streamer_priv->streamer_tx_ring[i].buffer = 0;
-               streamer_priv->streamer_tx_ring[i].buflen = 0;
-               streamer_priv->streamer_tx_ring[i].rsvd1 = 0;
-               streamer_priv->streamer_tx_ring[i].rsvd2 = 0;
-               streamer_priv->streamer_tx_ring[i].rsvd3 = 0;
-       }
-       streamer_priv->streamer_tx_ring[STREAMER_TX_RING_SIZE - 1].forward =
-                                       cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_tx_ring[0],
-                                                       sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE));
-
-       streamer_priv->free_tx_ring_entries = STREAMER_TX_RING_SIZE;
-       streamer_priv->tx_ring_free = 0;        /* next entry in tx ring to use */
-       streamer_priv->tx_ring_last_status = STREAMER_TX_RING_SIZE - 1;
-
-       /* set Busmaster interrupt event mask (handle receives on interrupt only */
-       writew(MISR_TX2_EOF | MISR_RX_NOBUF | MISR_RX_EOF, streamer_mmio + MISR_MASK);
-       /* set system event interrupt mask */
-       writew(SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE, streamer_mmio + SISR_MASK_SUM);
-
-#if STREAMER_DEBUG
-       printk("BMCTL: %x\n", readw(streamer_mmio + BMCTL_SUM));
-       printk("SISR MASK: %x\n", readw(streamer_mmio + SISR_MASK));
-#endif
-
-#if STREAMER_NETWORK_MONITOR
-
-       writew(streamer_priv->streamer_addr_table_addr, streamer_mmio + LAPA);
-       printk("%s: Node Address: %04x:%04x:%04x\n", dev->name,
-               ntohs(readw(streamer_mmio + LAPDINC)),
-               ntohs(readw(streamer_mmio + LAPDINC)),
-               ntohs(readw(streamer_mmio + LAPDINC)));
-       readw(streamer_mmio + LAPDINC);
-       readw(streamer_mmio + LAPDINC);
-       printk("%s: Functional Address: %04x:%04x\n", dev->name,
-               ntohs(readw(streamer_mmio + LAPDINC)),
-               ntohs(readw(streamer_mmio + LAPDINC)));
-
-       writew(streamer_priv->streamer_parms_addr + 4,
-               streamer_mmio + LAPA);
-       printk("%s: NAUN Address: %04x:%04x:%04x\n", dev->name,
-               ntohs(readw(streamer_mmio + LAPDINC)),
-               ntohs(readw(streamer_mmio + LAPDINC)),
-               ntohs(readw(streamer_mmio + LAPDINC)));
-#endif
-
-       netif_start_queue(dev);
-       netif_carrier_on(dev);
-       return 0;
-}
-
-/*
- *     When we enter the rx routine we do not know how many frames have been 
- *     queued on the rx channel.  Therefore we start at the next rx status
- *     position and travel around the receive ring until we have completed
- *     all the frames.
- *
- *     This means that we may process the frame before we receive the end
- *     of frame interrupt. This is why we always test the status instead
- *     of blindly processing the next frame.
- *     
- */
-static void streamer_rx(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       struct streamer_rx_desc *rx_desc;
-       int rx_ring_last_received, length, frame_length, buffer_cnt = 0;
-       struct sk_buff *skb, *skb2;
-
-       /* setup the next rx descriptor to be received */
-       rx_desc = &streamer_priv->streamer_rx_ring[(streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1)];
-       rx_ring_last_received = streamer_priv->rx_ring_last_received;
-
-       while (rx_desc->status & 0x01000000) {  /* While processed descriptors are available */
-               if (rx_ring_last_received != streamer_priv->rx_ring_last_received) 
-               {
-                       printk(KERN_WARNING "RX Error 1 rx_ring_last_received not the same %x %x\n",
-                               rx_ring_last_received, streamer_priv->rx_ring_last_received);
-               }
-               streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
-               rx_ring_last_received = streamer_priv->rx_ring_last_received;
-
-               length = rx_desc->framelen_buflen & 0xffff;     /* buffer length */
-               frame_length = (rx_desc->framelen_buflen >> 16) & 0xffff;
-
-               if (rx_desc->status & 0x7E830000) {     /* errors */
-                       if (streamer_priv->streamer_message_level) {
-                               printk(KERN_WARNING "%s: Rx Error %x\n",
-                                      dev->name, rx_desc->status);
-                       }
-               } else {        /* received without errors */
-                       if (rx_desc->status & 0x80000000) {     /* frame complete */
-                               buffer_cnt = 1;
-                               skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
-                       } else {
-                               skb = dev_alloc_skb(frame_length);
-                       }
-
-                       if (skb == NULL) 
-                       {
-                               printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers.\n",  dev->name);
-                               dev->stats.rx_dropped++;
-                       } else {        /* we allocated an skb OK */
-                               if (buffer_cnt == 1) {
-                                       /* release the DMA mapping */
-                                       pci_unmap_single(streamer_priv->pci_dev, 
-                                               le32_to_cpu(streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer),
-                                               streamer_priv->pkt_buf_sz, 
-                                               PCI_DMA_FROMDEVICE);
-                                       skb2 = streamer_priv->rx_ring_skb[rx_ring_last_received];
-#if STREAMER_DEBUG_PACKETS
-                                       {
-                                               int i;
-                                               printk("streamer_rx packet print: skb->data2 %p  skb->head %p\n", skb2->data, skb2->head);
-                                               for (i = 0; i < frame_length; i++) 
-                                               {
-                                                       printk("%x:", skb2->data[i]);
-                                                       if (((i + 1) % 16) == 0)
-                                                               printk("\n");
-                                               }
-                                               printk("\n");
-                                       }
-#endif
-                                       skb_put(skb2, length);
-                                       skb2->protocol = tr_type_trans(skb2, dev);
-                                       /* recycle this descriptor */
-                                       streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0;
-                                       streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz;
-                                       streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer = 
-                                               cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, streamer_priv->pkt_buf_sz,
-                                                               PCI_DMA_FROMDEVICE));
-                                       streamer_priv->rx_ring_skb[rx_ring_last_received] = skb;
-                                       /* place recycled descriptor back on the adapter */
-                                       writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
-                                                                       &streamer_priv->streamer_rx_ring[rx_ring_last_received],
-                                                                       sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE)),
-                                               streamer_mmio + RXLBDA);
-                                       /* pass the received skb up to the protocol */
-                                       netif_rx(skb2);
-                               } else {
-                                       do {    /* Walk the buffers */
-                                               pci_unmap_single(streamer_priv->pci_dev, le32_to_cpu(rx_desc->buffer), length, PCI_DMA_FROMDEVICE), 
-                                               memcpy(skb_put(skb, length), (void *)rx_desc->buffer, length);  /* copy this fragment */
-                                               streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0;
-                                               streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz;
-                                               
-                                               /* give descriptor back to the adapter */
-                                               writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
-                                                                       &streamer_priv->streamer_rx_ring[rx_ring_last_received],
-                                                                       length, PCI_DMA_FROMDEVICE)), 
-                                                       streamer_mmio + RXLBDA);
-
-                                               if (rx_desc->status & 0x80000000)
-                                                       break;  /* this descriptor completes the frame */
-
-                                               /* else get the next pending descriptor */
-                                               if (rx_ring_last_received!= streamer_priv->rx_ring_last_received)
-                                               {
-                                                       printk("RX Error rx_ring_last_received not the same %x %x\n",
-                                                               rx_ring_last_received,
-                                                               streamer_priv->rx_ring_last_received);
-                                               }
-                                               rx_desc = &streamer_priv->streamer_rx_ring[(streamer_priv->rx_ring_last_received+1) & (STREAMER_RX_RING_SIZE-1)];
-
-                                               length = rx_desc->framelen_buflen & 0xffff;     /* buffer length */
-                                               streamer_priv->rx_ring_last_received =  (streamer_priv->rx_ring_last_received+1) & (STREAMER_RX_RING_SIZE - 1);
-                                               rx_ring_last_received = streamer_priv->rx_ring_last_received;
-                                       } while (1);
-
-                                       skb->protocol = tr_type_trans(skb, dev);
-                                       /* send up to the protocol */
-                                       netif_rx(skb);
-                               }
-                               dev->stats.rx_packets++;
-                               dev->stats.rx_bytes += length;
-                       }       /* if skb == null */
-               }               /* end received without errors */
-
-               /* try the next one */
-               rx_desc = &streamer_priv->streamer_rx_ring[(rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1)];
-       }                       /* end for all completed rx descriptors */
-}
-
-static irqreturn_t streamer_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = (struct net_device *) dev_id;
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       __u16 sisr;
-       __u16 misr;
-       u8 max_intr = MAX_INTR;
-
-       spin_lock(&streamer_priv->streamer_lock);
-       sisr = readw(streamer_mmio + SISR);
-
-       while((sisr & (SISR_MI | SISR_SRB_REPLY | SISR_ADAPTER_CHECK | SISR_ASB_FREE | 
-                      SISR_ARB_CMD | SISR_TRB_REPLY | SISR_PAR_ERR | SISR_SERR_ERR)) &&
-             (max_intr > 0)) {
-
-               if(sisr & SISR_PAR_ERR) {
-                       writew(~SISR_PAR_ERR, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-
-               else if(sisr & SISR_SERR_ERR) {
-                       writew(~SISR_SERR_ERR, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-
-               else if(sisr & SISR_MI) {
-                       misr = readw(streamer_mmio + MISR_RUM);
-
-               if (misr & MISR_TX2_EOF) {
-                               while(streamer_priv->streamer_tx_ring[(streamer_priv->tx_ring_last_status + 1) & (STREAMER_TX_RING_SIZE - 1)].status) {
-                               streamer_priv->tx_ring_last_status = (streamer_priv->tx_ring_last_status + 1) & (STREAMER_TX_RING_SIZE - 1);
-                               streamer_priv->free_tx_ring_entries++;
-                               dev->stats.tx_bytes += streamer_priv->tx_ring_skb[streamer_priv->tx_ring_last_status]->len;
-                               dev->stats.tx_packets++;
-                               dev_kfree_skb_irq(streamer_priv->tx_ring_skb[streamer_priv->tx_ring_last_status]);
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].buffer = 0xdeadbeef;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].status = 0;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].bufcnt_framelen = 0;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].buflen = 0;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd1 = 0;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd2 = 0;
-                               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd3 = 0;
-                       }
-                       netif_wake_queue(dev);
-               }
-
-               if (misr & MISR_RX_EOF) {
-                       streamer_rx(dev);
-               }
-               /* MISR_RX_EOF */
-
-                       if (misr & MISR_RX_NOBUF) {
-                               /* According to the documentation, we don't have to do anything,  
-                                 * but trapping it keeps it out of /var/log/messages.  
-                                 */
-                       }               /* SISR_RX_NOBUF */
-
-                       writew(~misr, streamer_mmio + MISR_RUM);
-                       (void)readw(streamer_mmio + MISR_RUM);
-               }
-
-               else if (sisr & SISR_SRB_REPLY) {
-                       if (streamer_priv->srb_queued == 1) {
-                               wake_up_interruptible(&streamer_priv->srb_wait);
-                       } else if (streamer_priv->srb_queued == 2) {
-                               streamer_srb_bh(dev);
-                       }
-                       streamer_priv->srb_queued = 0;
-
-                       writew(~SISR_SRB_REPLY, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-
-               else if (sisr & SISR_ADAPTER_CHECK) {
-                       printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name);
-                       writel(readl(streamer_mmio + LAPWWO), streamer_mmio + LAPA);
-                       printk(KERN_WARNING "%s: Words %x:%x:%x:%x:\n",
-                              dev->name, readw(streamer_mmio + LAPDINC),
-                              ntohs(readw(streamer_mmio + LAPDINC)),
-                              ntohs(readw(streamer_mmio + LAPDINC)),
-                              ntohs(readw(streamer_mmio + LAPDINC)));
-                       netif_stop_queue(dev);
-                       netif_carrier_off(dev);
-                       printk(KERN_WARNING "%s: Adapter must be manually reset.\n", dev->name);
-               }
-
-               /* SISR_ADAPTER_CHECK */
-               else if (sisr & SISR_ASB_FREE) {
-                       /* Wake up anything that is waiting for the asb response */
-                       if (streamer_priv->asb_queued) {
-                               streamer_asb_bh(dev);
-                       }
-                       writew(~SISR_ASB_FREE, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-               /* SISR_ASB_FREE */
-               else if (sisr & SISR_ARB_CMD) {
-                       streamer_arb_cmd(dev);
-                       writew(~SISR_ARB_CMD, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-               /* SISR_ARB_CMD */
-               else if (sisr & SISR_TRB_REPLY) {
-                       /* Wake up anything that is waiting for the trb response */
-                       if (streamer_priv->trb_queued) {
-                               wake_up_interruptible(&streamer_priv->
-                                                     trb_wait);
-                       }
-                       streamer_priv->trb_queued = 0;
-                       writew(~SISR_TRB_REPLY, streamer_mmio + SISR_RUM);
-                       (void)readw(streamer_mmio + SISR_RUM);
-               }
-               /* SISR_TRB_REPLY */
-
-               sisr = readw(streamer_mmio + SISR);
-               max_intr--;
-       } /* while() */         
-
-       spin_unlock(&streamer_priv->streamer_lock) ; 
-       return IRQ_HANDLED;
-}
-
-static netdev_tx_t streamer_xmit(struct sk_buff *skb,
-                                      struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       unsigned long flags ;
-
-       spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
-
-       if (streamer_priv->free_tx_ring_entries) {
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].status = 0;
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].bufcnt_framelen = 0x00020000 | skb->len;
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buffer = 
-                       cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE));
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd1 = skb->len;
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd2 = 0;
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd3 = 0;
-               streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buflen = skb->len;
-
-               streamer_priv->tx_ring_skb[streamer_priv->tx_ring_free] = skb;
-               streamer_priv->free_tx_ring_entries--;
-#if STREAMER_DEBUG_PACKETS
-               {
-                       int i;
-                       printk("streamer_xmit packet print:\n");
-                       for (i = 0; i < skb->len; i++) {
-                               printk("%x:", skb->data[i]);
-                               if (((i + 1) % 16) == 0)
-                                       printk("\n");
-                       }
-                       printk("\n");
-               }
-#endif
-
-               writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
-                                       &streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free],
-                                       sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE)),
-                       streamer_mmio + TX2LFDA);
-               (void)readl(streamer_mmio + TX2LFDA);
-
-               streamer_priv->tx_ring_free = (streamer_priv->tx_ring_free + 1) & (STREAMER_TX_RING_SIZE - 1);
-               spin_unlock_irqrestore(&streamer_priv->streamer_lock,flags);
-               return NETDEV_TX_OK;
-       } else {
-               netif_stop_queue(dev);
-               spin_unlock_irqrestore(&streamer_priv->streamer_lock,flags);
-               return NETDEV_TX_BUSY;
-       }
-}
-
-
-static int streamer_close(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       unsigned long flags;
-       int i;
-
-       netif_stop_queue(dev);
-       netif_carrier_off(dev);
-       writew(streamer_priv->srb, streamer_mmio + LAPA);
-       writew(htons(SRB_CLOSE_ADAPTER << 8),streamer_mmio+LAPDINC);
-       writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-
-       spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
-
-       streamer_priv->srb_queued = 1;
-       writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
-
-       spin_unlock_irqrestore(&streamer_priv->streamer_lock, flags);
-
-       while (streamer_priv->srb_queued) 
-       {
-               interruptible_sleep_on_timeout(&streamer_priv->srb_wait,
-                                              jiffies + 60 * HZ);
-               if (signal_pending(current)) 
-               {
-                       printk(KERN_WARNING "%s: SRB timed out.\n", dev->name);
-                       printk(KERN_WARNING "SISR=%x MISR=%x LISR=%x\n",
-                              readw(streamer_mmio + SISR),
-                              readw(streamer_mmio + MISR_RUM),
-                              readw(streamer_mmio + LISR));
-                       streamer_priv->srb_queued = 0;
-                       break;
-               }
-       }
-
-       streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
-
-       for (i = 0; i < STREAMER_RX_RING_SIZE; i++) {
-               if (streamer_priv->rx_ring_skb[streamer_priv->rx_ring_last_received]) {
-                       dev_kfree_skb(streamer_priv->rx_ring_skb[streamer_priv->rx_ring_last_received]);
-               } 
-               streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
-       }
-
-       /* reset tx/rx fifo's and busmaster logic */
-
-       /* TBD. Add graceful way to reset the LLC channel without doing a soft reset. 
-          writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
-          udelay(1);
-          writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL);
-        */
-
-#if STREAMER_DEBUG
-       writew(streamer_priv->srb, streamer_mmio + LAPA);
-       printk("srb): ");
-       for (i = 0; i < 2; i++) {
-               printk("%x ", ntohs(readw(streamer_mmio + LAPDINC)));
-       }
-       printk("\n");
-#endif
-       free_irq(dev->irq, dev);
-       return 0;
-}
-
-static void streamer_set_rx_mode(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       __u8 options = 0;
-       struct netdev_hw_addr *ha;
-       unsigned char dev_mc_address[5];
-
-       writel(streamer_priv->srb, streamer_mmio + LAPA);
-       options = streamer_priv->streamer_copy_all_options;
-
-       if (dev->flags & IFF_PROMISC)
-               options |= (3 << 5);    /* All LLC and MAC frames, all through the main rx channel */
-       else
-               options &= ~(3 << 5);
-
-       /* Only issue the srb if there is a change in options */
-
-       if ((options ^ streamer_priv->streamer_copy_all_options)) 
-       {
-               /* Now to issue the srb command to alter the copy.all.options */
-               writew(htons(SRB_MODIFY_RECEIVE_OPTIONS << 8), streamer_mmio+LAPDINC);
-               writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-               writew(htons((streamer_priv->streamer_receive_options << 8) | options),streamer_mmio+LAPDINC);
-               writew(htons(0x4a41),streamer_mmio+LAPDINC);
-               writew(htons(0x4d45),streamer_mmio+LAPDINC);
-               writew(htons(0x5320),streamer_mmio+LAPDINC);
-               writew(0x2020, streamer_mmio + LAPDINC);
-
-               streamer_priv->srb_queued = 2;  /* Can't sleep, use srb_bh */
-
-               writel(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
-
-               streamer_priv->streamer_copy_all_options = options;
-               return;
-       }
-
-       /* Set the functional addresses we need for multicast */
-       writel(streamer_priv->srb,streamer_mmio+LAPA);
-       dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ; 
-  
-       netdev_for_each_mc_addr(ha, dev) {
-               dev_mc_address[0] |= ha->addr[2];
-               dev_mc_address[1] |= ha->addr[3];
-               dev_mc_address[2] |= ha->addr[4];
-               dev_mc_address[3] |= ha->addr[5];
-       }
-  
-       writew(htons(SRB_SET_FUNC_ADDRESS << 8),streamer_mmio+LAPDINC);
-       writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-       writew(0,streamer_mmio+LAPDINC);
-       writew(htons( (dev_mc_address[0] << 8) | dev_mc_address[1]),streamer_mmio+LAPDINC);
-       writew(htons( (dev_mc_address[2] << 8) | dev_mc_address[3]),streamer_mmio+LAPDINC);
-       streamer_priv->srb_queued = 2 ; 
-       writel(LISR_SRB_CMD,streamer_mmio+LISR_SUM);
-}
-
-static void streamer_srb_bh(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv = netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       __u16 srb_word;
-
-       writew(streamer_priv->srb, streamer_mmio + LAPA);
-       srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-
-       switch (srb_word) {
-
-               /* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous) 
-                * At some point we should do something if we get an error, such as
-                * resetting the IFF_PROMISC flag in dev
-                */
-
-       case SRB_MODIFY_RECEIVE_OPTIONS:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-
-               switch (srb_word) {
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-               default:
-                       if (streamer_priv->streamer_message_level)
-                               printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",
-                                      dev->name,
-                                      streamer_priv->streamer_copy_all_options,
-                                      streamer_priv->streamer_receive_options);
-                       break;
-               }               /* switch srb[2] */
-               break;
-
-
-               /* SRB_SET_GROUP_ADDRESS - Multicast group setting 
-                */
-       case SRB_SET_GROUP_ADDRESS:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-               switch (srb_word) {
-               case 0x00:
-                       break;
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-               case 0x3c:
-                       printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n", dev->name);
-                       break;
-               case 0x3e:      /* If we ever implement individual multicast addresses, will need to deal with this */
-                       printk(KERN_WARNING "%s: Group address registers full\n", dev->name);
-                       break;
-               case 0x55:
-                       printk(KERN_INFO "%s: Group Address already set.\n", dev->name);
-                       break;
-               default:
-                       break;
-               }               /* switch srb[2] */
-               break;
-
-
-               /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
-                */
-       case SRB_RESET_GROUP_ADDRESS:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-               switch (srb_word) {
-               case 0x00:
-                       break;
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-               case 0x39:      /* Must deal with this if individual multicast addresses used */
-                       printk(KERN_INFO "%s: Group address not found\n", dev->name);
-                       break;
-               default:
-                       break;
-               }               /* switch srb[2] */
-               break;
-
-
-               /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode 
-                */
-
-       case SRB_SET_FUNC_ADDRESS:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-               switch (srb_word) {
-               case 0x00:
-                       if (streamer_priv->streamer_message_level)
-                               printk(KERN_INFO "%s: Functional Address Mask Set\n", dev->name);
-                       break;
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-               default:
-                       break;
-               }               /* switch srb[2] */
-               break;
-
-               /* SRB_READ_LOG - Read and reset the adapter error counters
-                */
-
-       case SRB_READ_LOG:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-               switch (srb_word) {
-               case 0x00:
-                       {
-                               int i;
-                               if (streamer_priv->streamer_message_level)
-                                       printk(KERN_INFO "%s: Read Log command complete\n", dev->name);
-                               printk("Read Log statistics: ");
-                               writew(streamer_priv->srb + 6,
-                                      streamer_mmio + LAPA);
-                               for (i = 0; i < 5; i++) {
-                                       printk("%x:", ntohs(readw(streamer_mmio + LAPDINC)));
-                               }
-                               printk("\n");
-                       }
-                       break;
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-
-               }               /* switch srb[2] */
-               break;
-
-               /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
-
-       case SRB_READ_SR_COUNTERS:
-               srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
-               switch (srb_word) {
-               case 0x00:
-                       if (streamer_priv->streamer_message_level)
-                               printk(KERN_INFO "%s: Read Source Routing Counters issued\n", dev->name);
-                       break;
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
-                       break;
-               case 0x04:
-                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
-                       break;
-               default:
-                       break;
-               }               /* switch srb[2] */
-               break;
-
-       default:
-               printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n", dev->name);
-               break;
-       }                       /* switch srb[0] */
-}
-
-static int streamer_set_mac_address(struct net_device *dev, void *addr)
-{
-       struct sockaddr *saddr = addr;
-       struct streamer_private *streamer_priv = netdev_priv(dev);
-
-       if (netif_running(dev)) 
-       {
-               printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name);
-               return -EIO;
-       }
-
-       memcpy(streamer_priv->streamer_laa, saddr->sa_data, dev->addr_len);
-
-       if (streamer_priv->streamer_message_level) {
-               printk(KERN_INFO "%s: MAC/LAA Set to  = %x.%x.%x.%x.%x.%x\n",
-                      dev->name, streamer_priv->streamer_laa[0],
-                      streamer_priv->streamer_laa[1],
-                      streamer_priv->streamer_laa[2],
-                      streamer_priv->streamer_laa[3],
-                      streamer_priv->streamer_laa[4],
-                      streamer_priv->streamer_laa[5]);
-       }
-       return 0;
-}
-
-static void streamer_arb_cmd(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       __u8 header_len;
-       __u16 frame_len, buffer_len;
-       struct sk_buff *mac_frame;
-       __u8 frame_data[256];
-       __u16 buff_off;
-       __u16 lan_status = 0, lan_status_diff;  /* Initialize to stop compiler warning */
-       __u8 fdx_prot_error;
-       __u16 next_ptr;
-       __u16 arb_word;
-
-#if STREAMER_NETWORK_MONITOR
-       struct trh_hdr *mac_hdr;
-#endif
-
-       writew(streamer_priv->arb, streamer_mmio + LAPA);
-       arb_word=ntohs(readw(streamer_mmio+LAPD)) >> 8;
-       
-       if (arb_word == ARB_RECEIVE_DATA) {     /* Receive.data, MAC frames */
-               writew(streamer_priv->arb + 6, streamer_mmio + LAPA);
-               streamer_priv->mac_rx_buffer = buff_off = ntohs(readw(streamer_mmio + LAPDINC));
-               header_len=ntohs(readw(streamer_mmio+LAPDINC)) >> 8; /* 802.5 Token-Ring Header Length */
-               frame_len = ntohs(readw(streamer_mmio + LAPDINC));
-
-#if STREAMER_DEBUG
-               {
-                       int i;
-                       __u16 next;
-                       __u8 status;
-                       __u16 len;
-
-                       writew(ntohs(buff_off), streamer_mmio + LAPA);  /*setup window to frame data */
-                       next = htons(readw(streamer_mmio + LAPDINC));
-                       status =
-                           ntohs(readw(streamer_mmio + LAPDINC)) & 0xff;
-                       len = ntohs(readw(streamer_mmio + LAPDINC));
-
-                       /* print out 1st 14 bytes of frame data */
-                       for (i = 0; i < 7; i++) {
-                               printk("Loc %d = %04x\n", i,
-                                      ntohs(readw
-                                            (streamer_mmio + LAPDINC)));
-                       }
-
-                       printk("next %04x, fs %02x, len %04x\n", next,
-                              status, len);
-               }
-#endif
-               if (!(mac_frame = dev_alloc_skb(frame_len))) {
-                       printk(KERN_WARNING "%s: Memory squeeze, dropping frame.\n",
-                              dev->name);
-                       goto drop_frame;
-               }
-               /* Walk the buffer chain, creating the frame */
-
-               do {
-                       int i;
-                       __u16 rx_word;
-
-                       writew(htons(buff_off), streamer_mmio + LAPA);  /* setup window to frame data */
-                       next_ptr = ntohs(readw(streamer_mmio + LAPDINC));
-                       readw(streamer_mmio + LAPDINC); /* read thru status word */
-                       buffer_len = ntohs(readw(streamer_mmio + LAPDINC));
-
-                       if (buffer_len > 256)
-                               break;
-
-                       i = 0;
-                       while (i < buffer_len) {
-                               rx_word=ntohs(readw(streamer_mmio+LAPDINC));
-                               frame_data[i]=rx_word >> 8;
-                               frame_data[i+1]=rx_word & 0xff;
-                               i += 2;
-                       }
-
-                       memcpy(skb_put(mac_frame, buffer_len),
-                                     frame_data, buffer_len);
-               } while (next_ptr && (buff_off = next_ptr));
-
-               mac_frame->protocol = tr_type_trans(mac_frame, dev);
-#if STREAMER_NETWORK_MONITOR
-               printk(KERN_WARNING "%s: Received MAC Frame, details:\n",
-                      dev->name);
-               mac_hdr = tr_hdr(mac_frame);
-               printk(KERN_WARNING
-                      "%s: MAC Frame Dest. Addr: %pM\n",
-                      dev->name, mac_hdr->daddr);
-               printk(KERN_WARNING
-                      "%s: MAC Frame Srce. Addr: %pM\n",
-                      dev->name, mac_hdr->saddr);
-#endif
-               netif_rx(mac_frame);
-
-               /* Now tell the card we have dealt with the received frame */
-drop_frame:
-               /* Set LISR Bit 1 */
-               writel(LISR_ARB_FREE, streamer_priv->streamer_mmio + LISR_SUM);
-
-               /* Is the ASB free ? */
-
-               if (!(readl(streamer_priv->streamer_mmio + SISR) & SISR_ASB_FREE)) 
-               {
-                       streamer_priv->asb_queued = 1;
-                       writel(LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
-                       return;
-                       /* Drop out and wait for the bottom half to be run */
-               }
-
-
-               writew(streamer_priv->asb, streamer_mmio + LAPA);
-               writew(htons(ASB_RECEIVE_DATA << 8), streamer_mmio+LAPDINC);
-               writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-               writew(0, streamer_mmio + LAPDINC);
-               writew(htons(streamer_priv->mac_rx_buffer), streamer_mmio + LAPD);
-
-               writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
-
-               streamer_priv->asb_queued = 2;
-               return;
-
-       } else if (arb_word == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */
-               writew(streamer_priv->arb + 6, streamer_mmio + LAPA);
-               lan_status = ntohs(readw(streamer_mmio + LAPDINC));
-               fdx_prot_error = ntohs(readw(streamer_mmio+LAPD)) >> 8;
-               
-               /* Issue ARB Free */
-               writew(LISR_ARB_FREE, streamer_priv->streamer_mmio + LISR_SUM);
-
-               lan_status_diff = (streamer_priv->streamer_lan_status ^ lan_status) & 
-                   lan_status; 
-
-               if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR)) 
-               {
-                       if (lan_status_diff & LSC_LWF)
-                               printk(KERN_WARNING "%s: Short circuit detected on the lobe\n", dev->name);
-                       if (lan_status_diff & LSC_ARW)
-                               printk(KERN_WARNING "%s: Auto removal error\n", dev->name);
-                       if (lan_status_diff & LSC_FPE)
-                               printk(KERN_WARNING "%s: FDX Protocol Error\n", dev->name);
-                       if (lan_status_diff & LSC_RR)
-                               printk(KERN_WARNING "%s: Force remove MAC frame received\n", dev->name);
-
-                       /* Adapter has been closed by the hardware */
-
-                       /* reset tx/rx fifo's and busmaster logic */
-
-                       /* @TBD. no llc reset on autostreamer writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
-                          udelay(1);
-                          writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL); */
-
-                       netif_stop_queue(dev);
-                       netif_carrier_off(dev);
-                       printk(KERN_WARNING "%s: Adapter must be manually reset.\n", dev->name);
-               }
-               /* If serious error */
-               if (streamer_priv->streamer_message_level) {
-                       if (lan_status_diff & LSC_SIG_LOSS)
-                               printk(KERN_WARNING "%s: No receive signal detected\n", dev->name);
-                       if (lan_status_diff & LSC_HARD_ERR) 
-                               printk(KERN_INFO "%s: Beaconing\n", dev->name);
-                       if (lan_status_diff & LSC_SOFT_ERR)
-                               printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame\n", dev->name);
-                       if (lan_status_diff & LSC_TRAN_BCN)
-                               printk(KERN_INFO "%s: We are transmitting the beacon, aaah\n", dev->name);
-                       if (lan_status_diff & LSC_SS)
-                               printk(KERN_INFO "%s: Single Station on the ring\n", dev->name);
-                       if (lan_status_diff & LSC_RING_REC)
-                               printk(KERN_INFO "%s: Ring recovery ongoing\n", dev->name);
-                       if (lan_status_diff & LSC_FDX_MODE)
-                               printk(KERN_INFO "%s: Operating in FDX mode\n", dev->name);
-               }
-
-               if (lan_status_diff & LSC_CO) {
-                       if (streamer_priv->streamer_message_level)
-                               printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-
-                       /* Issue READ.LOG command */
-
-                       writew(streamer_priv->srb, streamer_mmio + LAPA);
-                       writew(htons(SRB_READ_LOG << 8),streamer_mmio+LAPDINC);
-                       writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-                       writew(0, streamer_mmio + LAPDINC);
-                       streamer_priv->srb_queued = 2;  /* Can't sleep, use srb_bh */
-
-                       writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
-               }
-
-               if (lan_status_diff & LSC_SR_CO) {
-                       if (streamer_priv->streamer_message_level)
-                               printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
-
-                       /* Issue a READ.SR.COUNTERS */
-                       writew(streamer_priv->srb, streamer_mmio + LAPA);
-                       writew(htons(SRB_READ_SR_COUNTERS << 8),
-                              streamer_mmio+LAPDINC);
-                       writew(htons(STREAMER_CLEAR_RET_CODE << 8),
-                              streamer_mmio+LAPDINC);
-                       streamer_priv->srb_queued = 2;  /* Can't sleep, use srb_bh */
-                       writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
-
-               }
-               streamer_priv->streamer_lan_status = lan_status;
-       } /* Lan.change.status */
-       else
-               printk(KERN_WARNING "%s: Unknown arb command\n", dev->name);
-}
-
-static void streamer_asb_bh(struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-
-       if (streamer_priv->asb_queued == 1) 
-       {
-               /* Dropped through the first time */
-
-               writew(streamer_priv->asb, streamer_mmio + LAPA);
-               writew(htons(ASB_RECEIVE_DATA << 8),streamer_mmio+LAPDINC);
-               writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
-               writew(0, streamer_mmio + LAPDINC);
-               writew(htons(streamer_priv->mac_rx_buffer), streamer_mmio + LAPD);
-
-               writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
-               streamer_priv->asb_queued = 2;
-
-               return;
-       }
-
-       if (streamer_priv->asb_queued == 2) {
-               __u8 rc;
-               writew(streamer_priv->asb + 2, streamer_mmio + LAPA);
-               rc=ntohs(readw(streamer_mmio+LAPD)) >> 8;
-               switch (rc) {
-               case 0x01:
-                       printk(KERN_WARNING "%s: Unrecognized command code\n", dev->name);
-                       break;
-               case 0x26:
-                       printk(KERN_WARNING "%s: Unrecognized buffer address\n", dev->name);
-                       break;
-               case 0xFF:
-                       /* Valid response, everything should be ok again */
-                       break;
-               default:
-                       printk(KERN_WARNING "%s: Invalid return code in asb\n", dev->name);
-                       break;
-               }
-       }
-       streamer_priv->asb_queued = 0;
-}
-
-static int streamer_change_mtu(struct net_device *dev, int mtu)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u16 max_mtu;
-
-       if (streamer_priv->streamer_ring_speed == 4)
-               max_mtu = 4500;
-       else
-               max_mtu = 18000;
-
-       if (mtu > max_mtu)
-               return -EINVAL;
-       if (mtu < 100)
-               return -EINVAL;
-
-       dev->mtu = mtu;
-       streamer_priv->pkt_buf_sz = mtu + TR_HLEN;
-
-       return 0;
-}
-
-#if STREAMER_NETWORK_MONITOR
-#ifdef CONFIG_PROC_FS
-static int streamer_proc_info(char *buffer, char **start, off_t offset,
-                             int length, int *eof, void *data)
-{
-  struct streamer_private *sdev=NULL;
-       struct pci_dev *pci_device = NULL;
-       int len = 0;
-       off_t begin = 0;
-       off_t pos = 0;
-       int size;
-
-  struct net_device *dev;
-
-       size = sprintf(buffer, "IBM LanStreamer/MPC Chipset Token Ring Adapters\n");
-
-       pos += size;
-       len += size;
-
-  for(sdev=dev_streamer; sdev; sdev=sdev->next) {
-    pci_device=sdev->pci_dev;
-    dev=pci_get_drvdata(pci_device);
-
-                               size = sprintf_info(buffer + len, dev);
-                               len += size;
-                               pos = begin + len;
-
-                               if (pos < offset) {
-                                       len = 0;
-                                       begin = pos;
-                               }
-                               if (pos > offset + length)
-                                       break;
-               }               /* for */
-
-       *start = buffer + (offset - begin);     /* Start of wanted data */
-       len -= (offset - begin);        /* Start slop */
-       if (len > length)
-               len = length;   /* Ending slop */
-       return len;
-}
-
-static int sprintf_info(char *buffer, struct net_device *dev)
-{
-       struct streamer_private *streamer_priv =
-           netdev_priv(dev);
-       __u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
-       struct streamer_adapter_addr_table sat;
-       struct streamer_parameters_table spt;
-       int size = 0;
-       int i;
-
-       writew(streamer_priv->streamer_addr_table_addr, streamer_mmio + LAPA);
-       for (i = 0; i < 14; i += 2) {
-               __u16 io_word;
-               __u8 *datap = (__u8 *) & sat;
-               io_word=ntohs(readw(streamer_mmio+LAPDINC));
-               datap[size]=io_word >> 8;
-               datap[size+1]=io_word & 0xff;
-       }
-       writew(streamer_priv->streamer_parms_addr, streamer_mmio + LAPA);
-       for (i = 0; i < 68; i += 2) {
-               __u16 io_word;
-               __u8 *datap = (__u8 *) & spt;
-               io_word=ntohs(readw(streamer_mmio+LAPDINC));
-               datap[size]=io_word >> 8;
-               datap[size+1]=io_word & 0xff;
-       }
-
-       size = sprintf(buffer, "\n%6s: Adapter Address   : Node Address      : Functional Addr\n", dev->name);
-
-       size += sprintf(buffer + size,
-                       "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
-                       dev->name, dev->dev_addr, sat.node_addr,
-                       sat.func_addr[0], sat.func_addr[1],
-                       sat.func_addr[2], sat.func_addr[3]);
-
-       size += sprintf(buffer + size, "\n%6s: Token Ring Parameters Table:\n", dev->name);
-
-       size += sprintf(buffer + size, "%6s: Physical Addr : Up Node Address   : Poll Address      : AccPri : Auth Src : Att Code :\n", dev->name);
-
-       size += sprintf(buffer + size,
-                   "%6s: %02x:%02x:%02x:%02x   : %pM : %pM : %04x   : %04x     :  %04x    :\n",
-                   dev->name, spt.phys_addr[0], spt.phys_addr[1],
-                   spt.phys_addr[2], spt.phys_addr[3],
-                   spt.up_node_addr, spt.poll_addr,
-                   ntohs(spt.acc_priority), ntohs(spt.auth_source_class),
-                   ntohs(spt.att_code));
-
-       size += sprintf(buffer + size, "%6s: Source Address    : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n", dev->name);
-
-       size += sprintf(buffer + size,
-                   "%6s: %pM : %04x  : %04x   : %04x   : %04x   : %04x    :     %04x     : \n",
-                   dev->name, spt.source_addr,
-                   ntohs(spt.beacon_type), ntohs(spt.major_vector),
-                   ntohs(spt.lan_status), ntohs(spt.local_ring),
-                   ntohs(spt.mon_error), ntohs(spt.frame_correl));
-
-       size += sprintf(buffer + size, "%6s: Beacon Details :  Tx  :  Rx  : NAUN Node Address : NAUN Node Phys : \n",
-                   dev->name);
-
-       size += sprintf(buffer + size,
-                   "%6s:                :  %02x  :  %02x  : %pM : %02x:%02x:%02x:%02x    : \n",
-                   dev->name, ntohs(spt.beacon_transmit),
-                   ntohs(spt.beacon_receive),
-                   spt.beacon_naun,
-                   spt.beacon_phys[0], spt.beacon_phys[1],
-                   spt.beacon_phys[2], spt.beacon_phys[3]);
-       return size;
-}
-#endif
-#endif
-
-static struct pci_driver streamer_pci_driver = {
-  .name     = "lanstreamer",
-  .id_table = streamer_pci_tbl,
-  .probe    = streamer_init_one,
-  .remove   = __devexit_p(streamer_remove_one),
-};
-
-module_pci_driver(streamer_pci_driver);
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/tokenring/lanstreamer.h b/drivers/net/tokenring/lanstreamer.h
deleted file mode 100644 (file)
index 3c58d6a..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- *   lanstreamer.h -- driver for the IBM Auto LANStreamer PCI Adapter
- *
- *  Written By: Mike Sullivan, IBM Corporation
- *
- *  Copyright (C) 1999 IBM Corporation
- *
- *  Linux driver for IBM PCI tokenring cards based on the LanStreamer MPC
- *  chipset. 
- *
- *  This driver is based on the olympic driver for IBM PCI TokenRing cards (Pit/Pit-Phy/Olympic
- *  chipsets) written  by:
- *      1999 Peter De Schrijver All Rights Reserved
- *     1999 Mike Phillips (phillim@amtrak.com)
- *
- *  Base Driver Skeleton:
- *      Written 1993-94 by Donald Becker.
- *
- *      Copyright 1993 United States Government as represented by the
- *      Director, National Security Agency.
- *
- * 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; either version 2 of the License, or         
- * (at your option) any later version.                                       
- *                                                                           
- * 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.                              
- *                                                                           
- * NO WARRANTY                                                               
- * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        
- * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      
- * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    
- * solely responsible for determining the appropriateness of using and       
- * distributing the Program and assumes all risks associated with its        
- * exercise of rights under this Agreement, including but not limited to     
- * the risks and costs of program errors, damage to or loss of data,         
- * programs or equipment, and unavailability or interruption of operations.  
- *                                                                           
- * DISCLAIMER OF LIABILITY                                                   
- * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        
- * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    
- * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  
- * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             
- *                                                                           
- * You should have received a copy of the GNU General Public License         
- * along with this program; if not, write to the Free Software               
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
- *                                                                           
- * 
- *  12/10/99 - Alpha Release 0.1.0
- *            First release to the public
- *  08/15/01 - Added ioctl() definitions and others - Kent Yoder <yoder1@us.ibm.com>
- *
- */
-
-/* MAX_INTR - the maximum number of times we can loop
- * inside the interrupt function before returning
- * control to the OS (maximum value is 256)
- */
-#define MAX_INTR 5
-
-#define CLS 0x0C
-#define MLR 0x86
-#define LTR 0x0D
-
-#define BCTL 0x60
-#define BCTL_SOFTRESET (1<<15)
-#define BCTL_RX_FIFO_8 (1<<1)
-#define BCTL_TX_FIFO_8 (1<<3)
-
-#define GPR 0x4a
-#define GPR_AUTOSENSE (1<<2)
-#define GPR_16MBPS (1<<3)
-
-#define LISR 0x10
-#define LISR_SUM 0x12
-#define LISR_RUM 0x14
-
-#define LISR_LIE (1<<15)
-#define LISR_SLIM (1<<13)
-#define LISR_SLI (1<<12)
-#define LISR_BPEI (1<<9)
-#define LISR_BPE (1<<8)
-#define LISR_SRB_CMD (1<<5)
-#define LISR_ASB_REPLY (1<<4)
-#define LISR_ASB_FREE_REQ (1<<2)
-#define LISR_ARB_FREE (1<<1)
-#define LISR_TRB_FRAME (1<<0)
-
-#define SISR 0x16
-#define SISR_SUM 0x18
-#define SISR_RUM 0x1A
-#define SISR_MASK 0x54
-#define SISR_MASK_SUM 0x56
-#define SISR_MASK_RUM 0x58
-
-#define SISR_MI (1<<15)
-#define SISR_SERR_ERR (1<<14)
-#define SISR_TIMER (1<<11)
-#define SISR_LAP_PAR_ERR (1<<10)
-#define SISR_LAP_ACC_ERR (1<<9)
-#define SISR_PAR_ERR (1<<8)
-#define SISR_ADAPTER_CHECK (1<<6)
-#define SISR_SRB_REPLY (1<<5)
-#define SISR_ASB_FREE (1<<4)
-#define SISR_ARB_CMD (1<<3)
-#define SISR_TRB_REPLY (1<<2)
-
-#define MISR_RUM 0x5A
-#define MISR_MASK 0x5C
-#define MISR_MASK_RUM 0x5E
-
-#define MISR_TX2_IDLE (1<<15)
-#define MISR_TX2_NO_STATUS (1<<14)
-#define MISR_TX2_HALT (1<<13)
-#define MISR_TX2_EOF (1<<12)
-#define MISR_TX1_IDLE (1<<11)
-#define MISR_TX1_NO_STATUS (1<<10)
-#define MISR_TX1_HALT (1<<9)
-#define MISR_TX1_EOF (1<<8)
-#define MISR_RX_NOBUF (1<<5)
-#define MISR_RX_EOB (1<<4)
-#define MISR_RX_NO_STATUS (1<<2)
-#define MISR_RX_HALT (1<<1)
-#define MISR_RX_EOF (1<<0)
-
-#define LAPA 0x62
-#define LAPE 0x64
-#define LAPD 0x66
-#define LAPDINC 0x68
-#define LAPWWO 0x6A
-#define LAPWWC 0x6C
-#define LAPCTL 0x6E
-
-#define TIMER 0x4E4
-
-#define BMCTL_SUM 0x50
-#define BMCTL_RUM 0x52
-#define BMCTL_TX1_DIS (1<<14)
-#define BMCTL_TX2_DIS (1<<10)
-#define BMCTL_RX_DIS (1<<6)
-#define BMCTL_RX_ENABLED  (1<<5)
-
-#define RXLBDA  0x90
-#define RXBDA   0x94
-#define RXSTAT  0x98
-#define RXDBA   0x9C
-
-#define TX1LFDA 0xA0
-#define TX1FDA  0xA4
-#define TX1STAT 0xA8
-#define TX1DBA  0xAC
-#define TX2LFDA 0xB0
-#define TX2FDA  0xB4
-#define TX2STAT 0xB8
-#define TX2DBA  0xBC
-
-#define STREAMER_IO_SPACE 256
-
-#define SRB_COMMAND_SIZE 50
-
-#define STREAMER_MAX_ADAPTERS 8        /* 0x08 __MODULE_STRING can't hand 0xnn */
-
-/* Defines for LAN STATUS CHANGE reports */
-#define LSC_SIG_LOSS 0x8000
-#define LSC_HARD_ERR 0x4000
-#define LSC_SOFT_ERR 0x2000
-#define LSC_TRAN_BCN 0x1000
-#define LSC_LWF      0x0800
-#define LSC_ARW      0x0400
-#define LSC_FPE      0x0200
-#define LSC_RR       0x0100
-#define LSC_CO       0x0080
-#define LSC_SS       0x0040
-#define LSC_RING_REC 0x0020
-#define LSC_SR_CO    0x0010
-#define LSC_FDX_MODE 0x0004
-
-/* Defines for OPEN ADAPTER command */
-
-#define OPEN_ADAPTER_EXT_WRAP (1<<15)
-#define OPEN_ADAPTER_DIS_HARDEE (1<<14)
-#define OPEN_ADAPTER_DIS_SOFTERR (1<<13)
-#define OPEN_ADAPTER_PASS_ADC_MAC (1<<12)
-#define OPEN_ADAPTER_PASS_ATT_MAC (1<<11)
-#define OPEN_ADAPTER_ENABLE_EC (1<<10)
-#define OPEN_ADAPTER_CONTENDER (1<<8)
-#define OPEN_ADAPTER_PASS_BEACON (1<<7)
-#define OPEN_ADAPTER_ENABLE_FDX (1<<6)
-#define OPEN_ADAPTER_ENABLE_RPL (1<<5)
-#define OPEN_ADAPTER_INHIBIT_ETR (1<<4)
-#define OPEN_ADAPTER_INTERNAL_WRAP (1<<3)
-
-
-/* Defines for SRB Commands */
-#define SRB_CLOSE_ADAPTER 0x04
-#define SRB_CONFIGURE_BRIDGE 0x0c
-#define SRB_CONFIGURE_HP_CHANNEL 0x13
-#define SRB_MODIFY_BRIDGE_PARMS 0x15
-#define SRB_MODIFY_OPEN_OPTIONS 0x01
-#define SRB_MODIFY_RECEIVE_OPTIONS 0x17
-#define SRB_NO_OPERATION 0x00
-#define SRB_OPEN_ADAPTER 0x03
-#define SRB_READ_LOG 0x08
-#define SRB_READ_SR_COUNTERS 0x16
-#define SRB_RESET_GROUP_ADDRESS 0x02
-#define SRB_RESET_TARGET_SEGMETN 0x14
-#define SRB_SAVE_CONFIGURATION 0x1b
-#define SRB_SET_BRIDGE_PARMS 0x09
-#define SRB_SET_FUNC_ADDRESS 0x07
-#define SRB_SET_GROUP_ADDRESS 0x06
-#define SRB_SET_TARGET_SEGMENT 0x05
-
-/* Clear return code */
-#define STREAMER_CLEAR_RET_CODE 0xfe
-
-/* ARB Commands */
-#define ARB_RECEIVE_DATA 0x81
-#define ARB_LAN_CHANGE_STATUS 0x84
-
-/* ASB Response commands */
-#define ASB_RECEIVE_DATA 0x81
-
-
-/* Streamer defaults for buffers */
-
-#define STREAMER_RX_RING_SIZE 16       /* should be a power of 2 */
-/* Setting the number of TX descriptors to 1 is a workaround for an
- * undocumented hardware problem with the lanstreamer board. Setting
- * this to something higher may slightly increase the throughput you
- * can get from the card, but at the risk of locking up the box. - 
- * <yoder1@us.ibm.com>
- */
-#define STREAMER_TX_RING_SIZE 1        /* should be a power of 2 */
-
-#define PKT_BUF_SZ 4096                /* Default packet size */
-
-/* Streamer data structures */
-
-struct streamer_tx_desc {
-       __u32 forward;
-       __u32 status;
-       __u32 bufcnt_framelen;
-       __u32 buffer;
-       __u32 buflen;
-       __u32 rsvd1;
-       __u32 rsvd2;
-       __u32 rsvd3;
-};
-
-struct streamer_rx_desc {
-       __u32 forward;
-       __u32 status;
-       __u32 buffer;
-       __u32 framelen_buflen;
-};
-
-struct mac_receive_buffer {
-       __u16 next;
-       __u8 padding;
-       __u8 frame_status;
-       __u16 buffer_length;
-       __u8 frame_data;
-};
-
-struct streamer_private {
-
-       __u16 srb;
-       __u16 trb;
-       __u16 arb;
-       __u16 asb;
-
-        struct streamer_private *next;
-        struct pci_dev *pci_dev;
-       __u8 __iomem *streamer_mmio;
-        char *streamer_card_name;
-        spinlock_t streamer_lock;
-
-       volatile int srb_queued;        /* True if an SRB is still posted */
-       wait_queue_head_t srb_wait;
-
-       volatile int asb_queued;        /* True if an ASB is posted */
-
-       volatile int trb_queued;        /* True if a TRB is posted */
-       wait_queue_head_t trb_wait;
-
-       struct streamer_rx_desc *streamer_rx_ring;
-       struct streamer_tx_desc *streamer_tx_ring;
-       struct sk_buff *tx_ring_skb[STREAMER_TX_RING_SIZE],
-           *rx_ring_skb[STREAMER_RX_RING_SIZE];
-       int tx_ring_free, tx_ring_last_status, rx_ring_last_received,
-           free_tx_ring_entries;
-
-       __u16 streamer_lan_status;
-       __u8 streamer_ring_speed;
-       __u16 pkt_buf_sz;
-       __u8 streamer_receive_options, streamer_copy_all_options,
-           streamer_message_level;
-       __u16 streamer_addr_table_addr, streamer_parms_addr;
-       __u16 mac_rx_buffer;
-       __u8 streamer_laa[6];
-};
-
-struct streamer_adapter_addr_table {
-
-       __u8 node_addr[6];
-       __u8 reserved[4];
-       __u8 func_addr[4];
-};
-
-struct streamer_parameters_table {
-
-       __u8 phys_addr[4];
-       __u8 up_node_addr[6];
-       __u8 up_phys_addr[4];
-       __u8 poll_addr[6];
-       __u16 reserved;
-       __u16 acc_priority;
-       __u16 auth_source_class;
-       __u16 att_code;
-       __u8 source_addr[6];
-       __u16 beacon_type;
-       __u16 major_vector;
-       __u16 lan_status;
-       __u16 soft_error_time;
-       __u16 reserved1;
-       __u16 local_ring;
-       __u16 mon_error;
-       __u16 beacon_transmit;
-       __u16 beacon_receive;
-       __u16 frame_correl;
-       __u8 beacon_naun[6];
-       __u32 reserved2;
-       __u8 beacon_phys[4];
-};
diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c
deleted file mode 100644 (file)
index 28adcdf..0000000
+++ /dev/null
@@ -1,761 +0,0 @@
-/*
- *  madgemc.c: Driver for the Madge Smart 16/4 MC16 MCA token ring card.
- *
- *  Written 2000 by Adam Fritzler
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This driver module supports the following cards:
- *      - Madge Smart 16/4 Ringnode MC16
- *     - Madge Smart 16/4 Ringnode MC32 (??)
- *
- *  Maintainer(s):
- *    AF       Adam Fritzler
- *
- *  Modification History:
- *     16-Jan-00       AF      Created
- *
- */
-static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";
-
-#include <linux/module.h>
-#include <linux/mca.h>
-#include <linux/slab.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include "tms380tr.h"
-#include "madgemc.h"            /* Madge-specific constants */
-
-#define MADGEMC_IO_EXTENT 32
-#define MADGEMC_SIF_OFFSET 0x08
-
-struct card_info {
-       /*
-        * These are read from the BIA ROM.
-        */
-       unsigned int manid;
-       unsigned int cardtype;
-       unsigned int cardrev;
-       unsigned int ramsize;
-       
-       /*
-        * These are read from the MCA POS registers.  
-        */
-       unsigned int burstmode:2;
-       unsigned int fairness:1; /* 0 = Fair, 1 = Unfair */
-       unsigned int arblevel:4;
-       unsigned int ringspeed:2; /* 0 = 4mb, 1 = 16, 2 = Auto/none */
-       unsigned int cabletype:1; /* 0 = RJ45, 1 = DB9 */
-};
-
-static int madgemc_open(struct net_device *dev);
-static int madgemc_close(struct net_device *dev);
-static int madgemc_chipset_init(struct net_device *dev);
-static void madgemc_read_rom(struct net_device *dev, struct card_info *card);
-static unsigned short madgemc_setnselout_pins(struct net_device *dev);
-static void madgemc_setcabletype(struct net_device *dev, int type);
-
-static int madgemc_mcaproc(char *buf, int slot, void *d);
-
-static void madgemc_setregpage(struct net_device *dev, int page);
-static void madgemc_setsifsel(struct net_device *dev, int val);
-static void madgemc_setint(struct net_device *dev, int val);
-
-static irqreturn_t madgemc_interrupt(int irq, void *dev_id);
-
-/*
- * These work around paging, however they don't guarantee you're on the
- * right page.
- */
-#define SIFREADB(reg) (inb(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
-#define SIFWRITEB(val, reg) (outb(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
-#define SIFREADW(reg) (inw(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
-#define SIFWRITEW(val, reg) (outw(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
-
-/*
- * Read a byte-length value from the register.
- */
-static unsigned short madgemc_sifreadb(struct net_device *dev, unsigned short reg)
-{
-       unsigned short ret;
-       if (reg<0x8)    
-               ret = SIFREADB(reg);
-       else {
-               madgemc_setregpage(dev, 1);     
-               ret = SIFREADB(reg);
-               madgemc_setregpage(dev, 0);
-       }
-       return ret;
-}
-
-/*
- * Write a byte-length value to a register.
- */
-static void madgemc_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       if (reg<0x8)
-               SIFWRITEB(val, reg);
-       else {
-               madgemc_setregpage(dev, 1);
-               SIFWRITEB(val, reg);
-               madgemc_setregpage(dev, 0);
-       }
-}
-
-/*
- * Read a word-length value from a register
- */
-static unsigned short madgemc_sifreadw(struct net_device *dev, unsigned short reg)
-{
-       unsigned short ret;
-       if (reg<0x8)    
-               ret = SIFREADW(reg);
-       else {
-               madgemc_setregpage(dev, 1);     
-               ret = SIFREADW(reg);
-               madgemc_setregpage(dev, 0);
-       }
-       return ret;
-}
-
-/*
- * Write a word-length value to a register.
- */
-static void madgemc_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       if (reg<0x8)
-               SIFWRITEW(val, reg);
-       else {
-               madgemc_setregpage(dev, 1);
-               SIFWRITEW(val, reg);
-               madgemc_setregpage(dev, 0);
-       }
-}
-
-static struct net_device_ops madgemc_netdev_ops __read_mostly;
-
-static int __devinit madgemc_probe(struct device *device)
-{      
-       static int versionprinted;
-       struct net_device *dev;
-       struct net_local *tp;
-       struct card_info *card;
-       struct mca_device *mdev = to_mca_device(device);
-       int ret = 0;
-
-       if (versionprinted++ == 0)
-               printk("%s", version);
-
-       if(mca_device_claimed(mdev))
-               return -EBUSY;
-       mca_device_set_claim(mdev, 1);
-
-       dev = alloc_trdev(sizeof(struct net_local));
-       if (!dev) {
-               printk("madgemc: unable to allocate dev space\n");
-               mca_device_set_claim(mdev, 0);
-               ret = -ENOMEM;
-               goto getout;
-       }
-
-       dev->netdev_ops = &madgemc_netdev_ops;
-
-       card = kmalloc(sizeof(struct card_info), GFP_KERNEL);
-       if (card==NULL) {
-               ret = -ENOMEM;
-               goto getout1;
-       }
-
-       /*
-        * Parse configuration information.  This all comes
-        * directly from the publicly available @002d.ADF.
-        * Get it from Madge or your local ADF library.
-        */
-
-       /*
-        * Base address 
-        */
-       dev->base_addr = 0x0a20 + 
-               ((mdev->pos[2] & MC16_POS2_ADDR2)?0x0400:0) +
-               ((mdev->pos[0] & MC16_POS0_ADDR1)?0x1000:0) +
-               ((mdev->pos[3] & MC16_POS3_ADDR3)?0x2000:0);
-
-       /*
-        * Interrupt line
-        */
-       switch(mdev->pos[0] >> 6) { /* upper two bits */
-               case 0x1: dev->irq = 3; break;
-               case 0x2: dev->irq = 9; break; /* IRQ 2 = IRQ 9 */
-               case 0x3: dev->irq = 10; break;
-               default: dev->irq = 0; break;
-       }
-
-       if (dev->irq == 0) {
-               printk("%s: invalid IRQ\n", dev->name);
-               ret = -EBUSY;
-               goto getout2;
-       }
-
-       if (!request_region(dev->base_addr, MADGEMC_IO_EXTENT, 
-                          "madgemc")) {
-               printk(KERN_INFO "madgemc: unable to setup Smart MC in slot %d because of I/O base conflict at 0x%04lx\n", mdev->slot, dev->base_addr);
-               dev->base_addr += MADGEMC_SIF_OFFSET;
-               ret = -EBUSY;
-               goto getout2;
-       }
-       dev->base_addr += MADGEMC_SIF_OFFSET;
-       
-       /*
-        * Arbitration Level
-        */
-       card->arblevel = ((mdev->pos[0] >> 1) & 0x7) + 8;
-
-       /*
-        * Burst mode and Fairness
-        */
-       card->burstmode = ((mdev->pos[2] >> 6) & 0x3);
-       card->fairness = ((mdev->pos[2] >> 4) & 0x1);
-
-       /*
-        * Ring Speed
-        */
-       if ((mdev->pos[1] >> 2)&0x1)
-               card->ringspeed = 2; /* not selected */
-       else if ((mdev->pos[2] >> 5) & 0x1)
-               card->ringspeed = 1; /* 16Mb */
-       else
-               card->ringspeed = 0; /* 4Mb */
-
-       /* 
-        * Cable type
-        */
-       if ((mdev->pos[1] >> 6)&0x1)
-               card->cabletype = 1; /* STP/DB9 */
-       else
-               card->cabletype = 0; /* UTP/RJ-45 */
-
-
-       /* 
-        * ROM Info. This requires us to actually twiddle
-        * bits on the card, so we must ensure above that 
-        * the base address is free of conflict (request_region above).
-        */
-       madgemc_read_rom(dev, card);
-               
-       if (card->manid != 0x4d) { /* something went wrong */
-               printk(KERN_INFO "%s: Madge MC ROM read failed (unknown manufacturer ID %02x)\n", dev->name, card->manid);
-               goto getout3;
-       }
-               
-       if ((card->cardtype != 0x08) && (card->cardtype != 0x0d)) {
-               printk(KERN_INFO "%s: Madge MC ROM read failed (unknown card ID %02x)\n", dev->name, card->cardtype);
-               ret = -EIO;
-               goto getout3;
-       }
-              
-       /* All cards except Rev 0 and 1 MC16's have 256kb of RAM */
-       if ((card->cardtype == 0x08) && (card->cardrev <= 0x01))
-               card->ramsize = 128;
-       else
-               card->ramsize = 256;
-
-       printk("%s: %s Rev %d at 0x%04lx IRQ %d\n", 
-              dev->name, 
-              (card->cardtype == 0x08)?MADGEMC16_CARDNAME:
-              MADGEMC32_CARDNAME, card->cardrev, 
-              dev->base_addr, dev->irq);
-
-       if (card->cardtype == 0x0d)
-               printk("%s:     Warning: MC32 support is experimental and highly untested\n", dev->name);
-       
-       if (card->ringspeed==2) { /* Unknown */
-               printk("%s:     Warning: Ring speed not set in POS -- Please run the reference disk and set it!\n", dev->name);
-               card->ringspeed = 1; /* default to 16mb */
-       }
-               
-       printk("%s:     RAM Size: %dKB\n", dev->name, card->ramsize);
-
-       printk("%s:     Ring Speed: %dMb/sec on %s\n", dev->name, 
-              (card->ringspeed)?16:4, 
-              card->cabletype?"STP/DB9":"UTP/RJ-45");
-       printk("%s:     Arbitration Level: %d\n", dev->name, 
-              card->arblevel);
-
-       printk("%s:     Burst Mode: ", dev->name);
-       switch(card->burstmode) {
-               case 0: printk("Cycle steal"); break;
-               case 1: printk("Limited burst"); break;
-               case 2: printk("Delayed release"); break;
-               case 3: printk("Immediate release"); break;
-       }
-       printk(" (%s)\n", (card->fairness)?"Unfair":"Fair");
-
-
-       /* 
-        * Enable SIF before we assign the interrupt handler,
-        * just in case we get spurious interrupts that need
-        * handling.
-        */ 
-       outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */
-       madgemc_setsifsel(dev, 1);
-       if (request_irq(dev->irq, madgemc_interrupt, IRQF_SHARED,
-                      "madgemc", dev)) {
-               ret = -EBUSY;
-               goto getout3;
-       }
-
-       madgemc_chipset_init(dev); /* enables interrupts! */
-       madgemc_setcabletype(dev, card->cabletype);
-
-       /* Setup MCA structures */
-       mca_device_set_name(mdev, (card->cardtype == 0x08)?MADGEMC16_CARDNAME:MADGEMC32_CARDNAME);
-       mca_set_adapter_procfn(mdev->slot, madgemc_mcaproc, dev);
-
-       printk("%s:     Ring Station Address: %pM\n",
-              dev->name, dev->dev_addr);
-
-       if (tmsdev_init(dev, device)) {
-               printk("%s: unable to get memory for dev->priv.\n", 
-                      dev->name);
-               ret = -ENOMEM;
-               goto getout4;
-       }
-       tp = netdev_priv(dev);
-
-       /* 
-        * The MC16 is physically a 32bit card.  However, Madge
-        * insists on calling it 16bit, so I'll assume here that
-        * they know what they're talking about.  Cut off DMA
-        * at 16mb.
-        */
-       tp->setnselout = madgemc_setnselout_pins;
-       tp->sifwriteb = madgemc_sifwriteb;
-       tp->sifreadb = madgemc_sifreadb;
-       tp->sifwritew = madgemc_sifwritew;
-       tp->sifreadw = madgemc_sifreadw;
-       tp->DataRate = (card->ringspeed)?SPEED_16:SPEED_4;
-
-       memcpy(tp->ProductID, "Madge MCA 16/4    ", PROD_ID_SIZE + 1);
-
-       tp->tmspriv = card;
-       dev_set_drvdata(device, dev);
-
-       if (register_netdev(dev) == 0)
-               return 0;
-
-       dev_set_drvdata(device, NULL);
-       ret = -ENOMEM;
-getout4:
-       free_irq(dev->irq, dev);
-getout3:
-       release_region(dev->base_addr-MADGEMC_SIF_OFFSET, 
-                      MADGEMC_IO_EXTENT); 
-getout2:
-       kfree(card);
-getout1:
-       free_netdev(dev);
-getout:
-       mca_device_set_claim(mdev, 0);
-       return ret;
-}
-
-/*
- * Handle interrupts generated by the card
- *
- * The MicroChannel Madge cards need slightly more handling
- * after an interrupt than other TMS380 cards do.
- *
- * First we must make sure it was this card that generated the
- * interrupt (since interrupt sharing is allowed).  Then,
- * because we're using level-triggered interrupts (as is
- * standard on MCA), we must toggle the interrupt line
- * on the card in order to claim and acknowledge the interrupt.
- * Once that is done, the interrupt should be handlable in
- * the normal tms380tr_interrupt() routine.
- *
- * There's two ways we can check to see if the interrupt is ours,
- * both with their own disadvantages...
- *
- * 1)          Read in the SIFSTS register from the TMS controller.  This
- *     is guaranteed to be accurate, however, there's a fairly
- *     large performance penalty for doing so: the Madge chips
- *     must request the register from the Eagle, the Eagle must
- *     read them from its internal bus, and then take the route
- *     back out again, for a 16bit read.  
- *
- * 2)  Use the MC_CONTROL_REG0_SINTR bit from the Madge ASICs.
- *     The major disadvantage here is that the accuracy of the
- *     bit is in question.  However, it cuts out the extra read
- *     cycles it takes to read the Eagle's SIF, as its only an
- *     8bit read, and theoretically the Madge bit is directly
- *     connected to the interrupt latch coming out of the Eagle
- *     hardware (that statement is not verified).  
- *
- * I can't determine which of these methods has the best win.  For now,
- * we make a compromise.  Use the Madge way for the first interrupt,
- * which should be the fast-path, and then once we hit the first 
- * interrupt, keep on trying using the SIF method until we've
- * exhausted all contiguous interrupts.
- *
- */
-static irqreturn_t madgemc_interrupt(int irq, void *dev_id)
-{
-       int pending,reg1;
-       struct net_device *dev;
-
-       if (!dev_id) {
-               printk("madgemc_interrupt: was not passed a dev_id!\n");
-               return IRQ_NONE;
-       }
-
-       dev = dev_id;
-
-       /* Make sure its really us. -- the Madge way */
-       pending = inb(dev->base_addr + MC_CONTROL_REG0);
-       if (!(pending & MC_CONTROL_REG0_SINTR))
-               return IRQ_NONE; /* not our interrupt */
-
-       /*
-        * Since we're level-triggered, we may miss the rising edge
-        * of the next interrupt while we're off handling this one,
-        * so keep checking until the SIF verifies that it has nothing
-        * left for us to do.
-        */
-       pending = STS_SYSTEM_IRQ;
-       do {
-               if (pending & STS_SYSTEM_IRQ) {
-
-                       /* Toggle the interrupt to reset the latch on card */
-                       reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
-                       outb(reg1 ^ MC_CONTROL_REG1_SINTEN, 
-                            dev->base_addr + MC_CONTROL_REG1);
-                       outb(reg1, dev->base_addr + MC_CONTROL_REG1);
-
-                       /* Continue handling as normal */
-                       tms380tr_interrupt(irq, dev_id);
-
-                       pending = SIFREADW(SIFSTS); /* restart - the SIF way */
-
-               } else
-                       return IRQ_HANDLED; 
-       } while (1);
-
-       return IRQ_HANDLED; /* not reachable */
-}
-
-/*
- * Set the card to the preferred ring speed.
- *
- * Unlike newer cards, the MC16/32 have their speed selection
- * circuit connected to the Madge ASICs and not to the TMS380
- * NSELOUT pins. Set the ASIC bits correctly here, and return 
- * zero to leave the TMS NSELOUT bits unaffected.
- *
- */
-static unsigned short madgemc_setnselout_pins(struct net_device *dev)
-{
-       unsigned char reg1;
-       struct net_local *tp = netdev_priv(dev);
-       
-       reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
-
-       if(tp->DataRate == SPEED_16)
-               reg1 |= MC_CONTROL_REG1_SPEED_SEL; /* add for 16mb */
-       else if (reg1 & MC_CONTROL_REG1_SPEED_SEL)
-               reg1 ^= MC_CONTROL_REG1_SPEED_SEL; /* remove for 4mb */
-       outb(reg1, dev->base_addr + MC_CONTROL_REG1);
-
-       return 0; /* no change */
-}
-
-/*
- * Set the register page.  This equates to the SRSX line
- * on the TMS380Cx6.
- *
- * Register selection is normally done via three contiguous
- * bits.  However, some boards (such as the MC16/32) use only
- * two bits, plus a separate bit in the glue chip.  This
- * sets the SRSX bit (the top bit).  See page 4-17 in the
- * Yellow Book for which registers are affected.
- *
- */
-static void madgemc_setregpage(struct net_device *dev, int page)
-{      
-       static int reg1;
-
-       reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
-       if ((page == 0) && (reg1 & MC_CONTROL_REG1_SRSX)) {
-               outb(reg1 ^ MC_CONTROL_REG1_SRSX, 
-                    dev->base_addr + MC_CONTROL_REG1);
-       }
-       else if (page == 1) {
-               outb(reg1 | MC_CONTROL_REG1_SRSX, 
-                    dev->base_addr + MC_CONTROL_REG1);
-       }
-       reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
-}
-
-/*
- * The SIF registers are not mapped into register space by default
- * Set this to 1 to map them, 0 to map the BIA ROM.
- *
- */
-static void madgemc_setsifsel(struct net_device *dev, int val)
-{
-       unsigned int reg0;
-
-       reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
-       if ((val == 0) && (reg0 & MC_CONTROL_REG0_SIFSEL)) {
-               outb(reg0 ^ MC_CONTROL_REG0_SIFSEL, 
-                    dev->base_addr + MC_CONTROL_REG0);
-       } else if (val == 1) {
-               outb(reg0 | MC_CONTROL_REG0_SIFSEL, 
-                    dev->base_addr + MC_CONTROL_REG0);
-       }       
-       reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
-}
-
-/*
- * Enable SIF interrupts
- *
- * This does not enable interrupts in the SIF, but rather
- * enables SIF interrupts to be passed onto the host.
- *
- */
-static void madgemc_setint(struct net_device *dev, int val)
-{
-       unsigned int reg1;
-
-       reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
-       if ((val == 0) && (reg1 & MC_CONTROL_REG1_SINTEN)) {
-               outb(reg1 ^ MC_CONTROL_REG1_SINTEN, 
-                    dev->base_addr + MC_CONTROL_REG1);
-       } else if (val == 1) {
-               outb(reg1 | MC_CONTROL_REG1_SINTEN, 
-                    dev->base_addr + MC_CONTROL_REG1);
-       }
-}
-
-/*
- * Cable type is set via control register 7. Bit zero high
- * for UTP, low for STP.
- */
-static void madgemc_setcabletype(struct net_device *dev, int type)
-{
-       outb((type==0)?MC_CONTROL_REG7_CABLEUTP:MC_CONTROL_REG7_CABLESTP,
-            dev->base_addr + MC_CONTROL_REG7);
-}
-
-/*
- * Enable the functions of the Madge chipset needed for
- * full working order. 
- */
-static int madgemc_chipset_init(struct net_device *dev)
-{
-       outb(0, dev->base_addr + MC_CONTROL_REG1); /* pull SRESET low */
-       tms380tr_wait(100); /* wait for card to reset */
-
-       /* bring back into normal operating mode */
-       outb(MC_CONTROL_REG1_NSRESET, dev->base_addr + MC_CONTROL_REG1);
-
-       /* map SIF registers */
-       madgemc_setsifsel(dev, 1);
-
-       /* enable SIF interrupts */
-       madgemc_setint(dev, 1); 
-
-       return 0;
-}
-
-/*
- * Disable the board, and put back into power-up state.
- */
-static void madgemc_chipset_close(struct net_device *dev)
-{
-       /* disable interrupts */
-       madgemc_setint(dev, 0);
-       /* unmap SIF registers */
-       madgemc_setsifsel(dev, 0);
-}
-
-/*
- * Read the card type (MC16 or MC32) from the card.
- *
- * The configuration registers are stored in two separate
- * pages.  Pages are flipped by clearing bit 3 of CONTROL_REG0 (PAGE)
- * for page zero, or setting bit 3 for page one.
- *
- * Page zero contains the following data:
- *     Byte 0: Manufacturer ID (0x4D -- ASCII "M")
- *     Byte 1: Card type:
- *                     0x08 for MC16
- *                     0x0D for MC32
- *     Byte 2: Card revision
- *     Byte 3: Mirror of POS config register 0
- *     Byte 4: Mirror of POS 1
- *     Byte 5: Mirror of POS 2
- *
- * Page one contains the following data:
- *     Byte 0: Unused
- *     Byte 1-6: BIA, MSB to LSB.
- *
- * Note that to read the BIA, we must unmap the SIF registers
- * by clearing bit 2 of CONTROL_REG0 (SIFSEL), as the data
- * will reside in the same logical location.  For this reason,
- * _never_ read the BIA while the Eagle processor is running!
- * The SIF will be completely inaccessible until the BIA operation
- * is complete.
- *
- */
-static void madgemc_read_rom(struct net_device *dev, struct card_info *card)
-{
-       unsigned long ioaddr;
-       unsigned char reg0, reg1, tmpreg0, i;
-
-       ioaddr = dev->base_addr;
-
-       reg0 = inb(ioaddr + MC_CONTROL_REG0);
-       reg1 = inb(ioaddr + MC_CONTROL_REG1);
-
-       /* Switch to page zero and unmap SIF */
-       tmpreg0 = reg0 & ~(MC_CONTROL_REG0_PAGE + MC_CONTROL_REG0_SIFSEL);
-       outb(tmpreg0, ioaddr + MC_CONTROL_REG0);
-       
-       card->manid = inb(ioaddr + MC_ROM_MANUFACTURERID);
-       card->cardtype = inb(ioaddr + MC_ROM_ADAPTERID);
-       card->cardrev = inb(ioaddr + MC_ROM_REVISION);
-
-       /* Switch to rom page one */
-       outb(tmpreg0 | MC_CONTROL_REG0_PAGE, ioaddr + MC_CONTROL_REG0);
-
-       /* Read BIA */
-       dev->addr_len = 6;
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = inb(ioaddr + MC_ROM_BIA_START + i);
-       
-       /* Restore original register values */
-       outb(reg0, ioaddr + MC_CONTROL_REG0);
-       outb(reg1, ioaddr + MC_CONTROL_REG1);
-}
-
-static int madgemc_open(struct net_device *dev)
-{  
-       /*
-        * Go ahead and reinitialize the chipset again, just to 
-        * make sure we didn't get left in a bad state.
-        */
-       madgemc_chipset_init(dev);
-       tms380tr_open(dev);
-       return 0;
-}
-
-static int madgemc_close(struct net_device *dev)
-{
-       tms380tr_close(dev);
-       madgemc_chipset_close(dev);
-       return 0;
-}
-
-/*
- * Give some details available from /proc/mca/slotX
- */
-static int madgemc_mcaproc(char *buf, int slot, void *d) 
-{      
-       struct net_device *dev = (struct net_device *)d;
-       struct net_local *tp = netdev_priv(dev);
-       struct card_info *curcard = tp->tmspriv;
-       int len = 0;
-       
-       len += sprintf(buf+len, "-------\n");
-       if (curcard) {
-               len += sprintf(buf+len, "Card Revision: %d\n", curcard->cardrev);
-               len += sprintf(buf+len, "RAM Size: %dkb\n", curcard->ramsize);
-               len += sprintf(buf+len, "Cable type: %s\n", (curcard->cabletype)?"STP/DB9":"UTP/RJ-45");
-               len += sprintf(buf+len, "Configured ring speed: %dMb/sec\n", (curcard->ringspeed)?16:4);
-               len += sprintf(buf+len, "Running ring speed: %dMb/sec\n", (tp->DataRate==SPEED_16)?16:4);
-               len += sprintf(buf+len, "Device: %s\n", dev->name);
-               len += sprintf(buf+len, "IO Port: 0x%04lx\n", dev->base_addr);
-               len += sprintf(buf+len, "IRQ: %d\n", dev->irq);
-               len += sprintf(buf+len, "Arbitration Level: %d\n", curcard->arblevel);
-               len += sprintf(buf+len, "Burst Mode: ");
-               switch(curcard->burstmode) {
-               case 0: len += sprintf(buf+len, "Cycle steal"); break;
-               case 1: len += sprintf(buf+len, "Limited burst"); break;
-               case 2: len += sprintf(buf+len, "Delayed release"); break;
-               case 3: len += sprintf(buf+len, "Immediate release"); break;
-               }
-               len += sprintf(buf+len, " (%s)\n", (curcard->fairness)?"Unfair":"Fair");
-               
-               len += sprintf(buf+len, "Ring Station Address: %pM\n",
-                              dev->dev_addr);
-       } else 
-               len += sprintf(buf+len, "Card not configured\n");
-
-       return len;
-}
-
-static int __devexit madgemc_remove(struct device *device)
-{
-       struct net_device *dev = dev_get_drvdata(device);
-       struct net_local *tp;
-        struct card_info *card;
-
-       BUG_ON(!dev);
-
-       tp = netdev_priv(dev);
-       card = tp->tmspriv;
-       kfree(card);
-       tp->tmspriv = NULL;
-
-       unregister_netdev(dev);
-       release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT);
-       free_irq(dev->irq, dev);
-       tmsdev_term(dev);
-       free_netdev(dev);
-       dev_set_drvdata(device, NULL);
-
-       return 0;
-}
-
-static short madgemc_adapter_ids[] __initdata = {
-       0x002d,
-       0x0000
-};
-
-static struct mca_driver madgemc_driver = {
-       .id_table = madgemc_adapter_ids,
-       .driver = {
-               .name = "madgemc",
-               .bus = &mca_bus_type,
-               .probe = madgemc_probe,
-               .remove = __devexit_p(madgemc_remove),
-       },
-};
-
-static int __init madgemc_init (void)
-{
-       madgemc_netdev_ops = tms380tr_netdev_ops;
-       madgemc_netdev_ops.ndo_open = madgemc_open;
-       madgemc_netdev_ops.ndo_stop = madgemc_close;
-
-       return mca_register_driver (&madgemc_driver);
-}
-
-static void __exit madgemc_exit (void)
-{
-       mca_unregister_driver (&madgemc_driver);
-}
-
-module_init(madgemc_init);
-module_exit(madgemc_exit);
-
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/net/tokenring/madgemc.h b/drivers/net/tokenring/madgemc.h
deleted file mode 100644 (file)
index fe88e27..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* 
- * madgemc.h: Header for the madgemc tms380tr module
- *
- * Authors:
- * - Adam Fritzler
- */
-
-#ifndef __LINUX_MADGEMC_H
-#define __LINUX_MADGEMC_H
-
-#ifdef __KERNEL__
-
-#define MADGEMC16_CARDNAME "Madge Smart 16/4 MC16 Ringnode"
-#define MADGEMC32_CARDNAME "Madge Smart 16/4 MC32 Ringnode"
-
-/* 
- * Bit definitions for the POS config registers
- */
-#define MC16_POS0_ADDR1 0x20
-#define MC16_POS2_ADDR2 0x04
-#define MC16_POS3_ADDR3 0x20
-
-#define MC_CONTROL_REG0                ((long)-8) /* 0x00 */
-#define MC_CONTROL_REG1                ((long)-7) /* 0x01 */
-#define MC_ADAPTER_POS_REG0    ((long)-6) /* 0x02 */
-#define MC_ADAPTER_POS_REG1    ((long)-5) /* 0x03 */
-#define MC_ADAPTER_POS_REG2    ((long)-4) /* 0x04 */
-#define MC_ADAPTER_REG5_UNUSED ((long)-3) /* 0x05 */
-#define MC_ADAPTER_REG6_UNUSED ((long)-2) /* 0x06 */
-#define MC_CONTROL_REG7                ((long)-1) /* 0x07 */
-
-#define MC_CONTROL_REG0_UNKNOWN1       0x01
-#define MC_CONTROL_REG0_UNKNOWN2       0x02
-#define MC_CONTROL_REG0_SIFSEL         0x04
-#define MC_CONTROL_REG0_PAGE           0x08
-#define MC_CONTROL_REG0_TESTINTERRUPT  0x10
-#define MC_CONTROL_REG0_UNKNOWN20      0x20
-#define MC_CONTROL_REG0_SINTR          0x40
-#define MC_CONTROL_REG0_UNKNOWN80      0x80
-
-#define MC_CONTROL_REG1_SINTEN         0x01
-#define MC_CONTROL_REG1_BITOFDEATH     0x02
-#define MC_CONTROL_REG1_NSRESET                0x04
-#define MC_CONTROL_REG1_UNKNOWN8       0x08
-#define MC_CONTROL_REG1_UNKNOWN10      0x10
-#define MC_CONTROL_REG1_UNKNOWN20      0x20
-#define MC_CONTROL_REG1_SRSX           0x40
-#define MC_CONTROL_REG1_SPEED_SEL      0x80
-
-#define MC_CONTROL_REG7_CABLESTP       0x00
-#define MC_CONTROL_REG7_CABLEUTP       0x01
-
-/*
- * ROM Page Zero
- */
-#define MC_ROM_MANUFACTURERID          0x00
-#define MC_ROM_ADAPTERID               0x01
-#define MC_ROM_REVISION                        0x02
-#define MC_ROM_CONFIG0                 0x03
-#define MC_ROM_CONFIG1                 0x04
-#define MC_ROM_CONFIG2                 0x05
-
-/*
- * ROM Page One
- */
-#define MC_ROM_UNUSED_BYTE             0x00
-#define MC_ROM_BIA_START               0x01
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_MADGEMC_H */
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c
deleted file mode 100644 (file)
index 4d45fe8..0000000
+++ /dev/null
@@ -1,1737 +0,0 @@
-/*
- *   olympic.c (c) 1999 Peter De Schrijver All Rights Reserved
- *                1999/2000 Mike Phillips (mikep@linuxtr.net)
- *
- *  Linux driver for IBM PCI tokenring cards based on the Pit/Pit-Phy/Olympic
- *  chipset. 
- *
- *  Base Driver Skeleton:
- *      Written 1993-94 by Donald Becker.
- *
- *      Copyright 1993 United States Government as represented by the
- *      Director, National Security Agency.
- *
- *  Thanks to Erik De Cock, Adrian Bridgett and Frank Fiene for their 
- *  assistance and perserverance with the testing of this driver.
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- * 
- *  4/27/99 - Alpha Release 0.1.0
- *            First release to the public
- *
- *  6/8/99  - Official Release 0.2.0   
- *            Merged into the kernel code 
- *  8/18/99 - Updated driver for 2.3.13 kernel to use new pci
- *           resource. Driver also reports the card name returned by
- *            the pci resource.
- *  1/11/00 - Added spinlocks for smp
- *  2/23/00 - Updated to dev_kfree_irq 
- *  3/10/00 - Fixed FDX enable which triggered other bugs also 
- *            squashed.
- *  5/20/00 - Changes to handle Olympic on LinuxPPC. Endian changes.
- *            The odd thing about the changes is that the fix for
- *            endian issues with the big-endian data in the arb, asb...
- *            was to always swab() the bytes, no matter what CPU.
- *            That's because the read[wl]() functions always swap the
- *            bytes on the way in on PPC.
- *            Fixing the hardware descriptors was another matter,
- *            because they weren't going through read[wl](), there all
- *            the results had to be in memory in le32 values. kdaaker
- *
- * 12/23/00 - Added minimal Cardbus support (Thanks Donald).
- *
- * 03/09/01 - Add new pci api, dev_base_lock, general clean up. 
- *
- * 03/27/01 - Add new dma pci (Thanks to Kyle Lucke) and alloc_trdev
- *           Change proc_fs behaviour, now one entry per adapter.
- *
- * 04/09/01 - Couple of bug fixes to the dma unmaps and ejecting the
- *           adapter when live does not take the system down with it.
- * 
- * 06/02/01 - Clean up, copy skb for small packets
- * 
- * 06/22/01 - Add EISR error handling routines 
- *
- * 07/19/01 - Improve bad LAA reporting, strip out freemem
- *           into a separate function, its called from 3 
- *           different places now. 
- * 02/09/02 - Replaced sleep_on. 
- * 03/01/02 - Replace access to several registers from 32 bit to 
- *           16 bit. Fixes alignment errors on PPC 64 bit machines.
- *           Thanks to Al Trautman for this one.
- * 03/10/02 - Fix BUG in arb_cmd. Bug was there all along but was
- *           silently ignored until the error checking code 
- *           went into version 1.0.0 
- * 06/04/02 - Add correct start up sequence for the cardbus adapters.
- *           Required for strict compliance with pci power mgmt specs.
- *  To Do:
- *
- *          Wake on lan        
- * 
- *  If Problems do Occur
- *  Most problems can be rectified by either closing and opening the interface
- *  (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
- *  if compiled into the kernel).
- */
-
-/* Change OLYMPIC_DEBUG to 1 to get verbose, and I mean really verbose, messages */
-
-#define OLYMPIC_DEBUG 0
-
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/in.h>
-#include <linux/ioport.h>
-#include <linux/seq_file.h>
-#include <linux/string.h>
-#include <linux/proc_fs.h>
-#include <linux/ptrace.h>
-#include <linux/skbuff.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/stddef.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-#include <linux/bitops.h>
-#include <linux/jiffies.h>
-
-#include <net/checksum.h>
-#include <net/net_namespace.h>
-
-#include <asm/io.h>
-
-#include "olympic.h"
-
-/* I've got to put some intelligence into the version number so that Peter and I know
- * which version of the code somebody has got. 
- * Version Number = a.b.c.d  where a.b.c is the level of code and d is the latest author.
- * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
- * 
- * Official releases will only have an a.b.c version number format. 
- */
-
-static char version[] =
-"Olympic.c v1.0.5 6/04/02 - Peter De Schrijver & Mike Phillips" ; 
-
-static char *open_maj_error[]  = {"No error", "Lobe Media Test", "Physical Insertion",
-                                  "Address Verification", "Neighbor Notification (Ring Poll)",
-                                  "Request Parameters","FDX Registration Request",
-                                  "FDX Duplicate Address Check", "Station registration Query Wait",
-                                  "Unknown stage"};
-
-static char *open_min_error[] = {"No error", "Function Failure", "Signal Lost", "Wire Fault",
-                                  "Ring Speed Mismatch", "Timeout","Ring Failure","Ring Beaconing",
-                                  "Duplicate Node Address","Request Parameters","Remove Received",
-                                  "Reserved", "Reserved", "No Monitor Detected for RPL", 
-                                  "Monitor Contention failer for RPL", "FDX Protocol Error"};
-
-/* Module parameters */
-
-MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; 
-MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ; 
-
-/* Ring Speed 0,4,16,100 
- * 0 = Autosense         
- * 4,16 = Selected speed only, no autosense
- * This allows the card to be the first on the ring
- * and become the active monitor.
- * 100 = Nothing at present, 100mbps is autodetected
- * if FDX is turned on. May be implemented in the future to 
- * fail if 100mpbs is not detected.
- *
- * WARNING: Some hubs will allow you to insert
- * at the wrong speed
- */
-
-static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ;
-module_param_array(ringspeed, int, NULL, 0);
-
-/* Packet buffer size */
-
-static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ;
-module_param_array(pkt_buf_sz, int, NULL, 0) ;
-
-/* Message Level */
-
-static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ; 
-module_param_array(message_level, int, NULL, 0) ;
-
-/* Change network_monitor to receive mac frames through the arb channel.
- * Will also create a /proc/net/olympic_tr%d entry, where %d is the tr
- * device, i.e. tr0, tr1 etc. 
- * Intended to be used to create a ring-error reporting network module 
- * i.e. it will give you the source address of beaconers on the ring 
- */
-static int network_monitor[OLYMPIC_MAX_ADAPTERS] = {0,};
-module_param_array(network_monitor, int, NULL, 0);
-
-static DEFINE_PCI_DEVICE_TABLE(olympic_pci_tbl) = {
-       {PCI_VENDOR_ID_IBM,PCI_DEVICE_ID_IBM_TR_WAKE,PCI_ANY_ID,PCI_ANY_ID,},
-       { }     /* Terminating Entry */
-};
-MODULE_DEVICE_TABLE(pci,olympic_pci_tbl) ; 
-
-
-static int olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent); 
-static int olympic_init(struct net_device *dev);
-static int olympic_open(struct net_device *dev);
-static netdev_tx_t olympic_xmit(struct sk_buff *skb,
-                                     struct net_device *dev);
-static int olympic_close(struct net_device *dev);
-static void olympic_set_rx_mode(struct net_device *dev);
-static void olympic_freemem(struct net_device *dev) ;  
-static irqreturn_t olympic_interrupt(int irq, void *dev_id);
-static int olympic_set_mac_address(struct net_device *dev, void *addr) ; 
-static void olympic_arb_cmd(struct net_device *dev);
-static int olympic_change_mtu(struct net_device *dev, int mtu);
-static void olympic_srb_bh(struct net_device *dev) ; 
-static void olympic_asb_bh(struct net_device *dev) ; 
-static const struct file_operations olympic_proc_ops;
-
-static const struct net_device_ops olympic_netdev_ops = {
-       .ndo_open               = olympic_open,
-       .ndo_stop               = olympic_close,
-       .ndo_start_xmit         = olympic_xmit,
-       .ndo_change_mtu         = olympic_change_mtu,
-       .ndo_set_rx_mode        = olympic_set_rx_mode,
-       .ndo_set_mac_address    = olympic_set_mac_address,
-};
-
-static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
-{
-       struct net_device *dev ; 
-       struct olympic_private *olympic_priv;
-       static int card_no = -1 ;
-       int i ; 
-
-       card_no++ ; 
-
-       if ((i = pci_enable_device(pdev))) {
-               return i ; 
-       }
-
-       pci_set_master(pdev);
-
-       if ((i = pci_request_regions(pdev,"olympic"))) { 
-               goto op_disable_dev;
-       }
-       dev = alloc_trdev(sizeof(struct olympic_private)) ; 
-       if (!dev) {
-               i = -ENOMEM; 
-               goto op_release_dev;
-       }
-
-       olympic_priv = netdev_priv(dev) ;
-       
-       spin_lock_init(&olympic_priv->olympic_lock) ; 
-
-       init_waitqueue_head(&olympic_priv->srb_wait);
-       init_waitqueue_head(&olympic_priv->trb_wait);
-#if OLYMPIC_DEBUG  
-       printk(KERN_INFO "pci_device: %p, dev:%p, dev->priv: %p\n", pdev, dev, netdev_priv(dev));
-#endif
-       dev->irq=pdev->irq;
-       dev->base_addr=pci_resource_start(pdev, 0);
-       olympic_priv->olympic_card_name = pci_name(pdev);
-       olympic_priv->pdev = pdev; 
-       olympic_priv->olympic_mmio = ioremap(pci_resource_start(pdev,1),256);
-       olympic_priv->olympic_lap = ioremap(pci_resource_start(pdev,2),2048);
-       if (!olympic_priv->olympic_mmio || !olympic_priv->olympic_lap) {
-               goto op_free_iomap;
-       }
-                               
-       if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) )
-               olympic_priv->pkt_buf_sz = PKT_BUF_SZ ; 
-       else
-               olympic_priv->pkt_buf_sz = pkt_buf_sz[card_no] ; 
-
-       dev->mtu = olympic_priv->pkt_buf_sz - TR_HLEN ; 
-       olympic_priv->olympic_ring_speed = ringspeed[card_no] ; 
-       olympic_priv->olympic_message_level = message_level[card_no] ; 
-       olympic_priv->olympic_network_monitor = network_monitor[card_no];
-       
-       if ((i = olympic_init(dev))) {
-               goto op_free_iomap;
-       }                               
-
-       dev->netdev_ops = &olympic_netdev_ops;
-       SET_NETDEV_DEV(dev, &pdev->dev);
-
-       pci_set_drvdata(pdev,dev) ; 
-       register_netdev(dev) ; 
-       printk("Olympic: %s registered as: %s\n",olympic_priv->olympic_card_name,dev->name);
-       if (olympic_priv->olympic_network_monitor) { /* Must go after register_netdev as we need the device name */ 
-               char proc_name[20] ; 
-               strcpy(proc_name,"olympic_") ;
-               strcat(proc_name,dev->name) ; 
-               proc_create_data(proc_name, 0, init_net.proc_net, &olympic_proc_ops, dev);
-               printk("Olympic: Network Monitor information: /proc/%s\n",proc_name); 
-       }
-       return  0 ;
-
-op_free_iomap:
-       if (olympic_priv->olympic_mmio)
-               iounmap(olympic_priv->olympic_mmio); 
-       if (olympic_priv->olympic_lap)
-               iounmap(olympic_priv->olympic_lap);
-
-       free_netdev(dev);
-op_release_dev:
-       pci_release_regions(pdev); 
-
-op_disable_dev:
-       pci_disable_device(pdev);
-       return i;
-}
-
-static int olympic_init(struct net_device *dev)
-{
-       struct olympic_private *olympic_priv;
-       u8 __iomem *olympic_mmio, *init_srb,*adapter_addr;
-       unsigned long t; 
-       unsigned int uaa_addr;
-
-       olympic_priv=netdev_priv(dev);
-       olympic_mmio=olympic_priv->olympic_mmio;
-
-       printk("%s\n", version);
-       printk("%s. I/O at %hx, MMIO at %p, LAP at %p, using irq %d\n", olympic_priv->olympic_card_name, (unsigned int) dev->base_addr,olympic_priv->olympic_mmio, olympic_priv->olympic_lap, dev->irq);
-
-       writel(readl(olympic_mmio+BCTL) | BCTL_SOFTRESET,olympic_mmio+BCTL);
-       t=jiffies;
-       while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
-               schedule();             
-               if(time_after(jiffies, t + 40*HZ)) {
-                       printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
-                       return -ENODEV;
-               }
-       }
-
-
-       /* Needed for cardbus */
-       if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) {
-               writel(readl(olympic_priv->olympic_mmio+FERMASK)|FERMASK_INT_BIT, olympic_mmio+FERMASK);
-       }
-       
-#if OLYMPIC_DEBUG
-       printk("BCTL: %x\n",readl(olympic_mmio+BCTL));
-       printk("GPR: %x\n",readw(olympic_mmio+GPR));
-       printk("SISRMASK: %x\n",readl(olympic_mmio+SISR_MASK));
-#endif
-       /* Aaaahhh, You have got to be real careful setting GPR, the card
-          holds the previous values from flash memory, including autosense 
-           and ring speed */
-
-       writel(readl(olympic_mmio+BCTL)|BCTL_MIMREB,olympic_mmio+BCTL);
-       
-       if (olympic_priv->olympic_ring_speed  == 0) { /* Autosense */
-               writew(readw(olympic_mmio+GPR)|GPR_AUTOSENSE,olympic_mmio+GPR);
-               if (olympic_priv->olympic_message_level) 
-                       printk(KERN_INFO "%s: Ringspeed autosense mode on\n",olympic_priv->olympic_card_name);
-       } else if (olympic_priv->olympic_ring_speed == 16) {
-               if (olympic_priv->olympic_message_level) 
-                       printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n", olympic_priv->olympic_card_name);
-               writew(GPR_16MBPS, olympic_mmio+GPR);
-       } else if (olympic_priv->olympic_ring_speed == 4) {
-               if (olympic_priv->olympic_message_level) 
-                       printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n", olympic_priv->olympic_card_name) ; 
-               writew(0, olympic_mmio+GPR);
-       } 
-       
-       writew(readw(olympic_mmio+GPR)|GPR_NEPTUNE_BF,olympic_mmio+GPR);
-
-#if OLYMPIC_DEBUG
-       printk("GPR = %x\n",readw(olympic_mmio + GPR) ) ; 
-#endif
-       /* Solo has been paused to meet the Cardbus power
-        * specs if the adapter is cardbus. Check to 
-        * see its been paused and then restart solo. The
-        * adapter should set the pause bit within 1 second.
-        */
-
-       if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) { 
-               t=jiffies;
-               while (!(readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE)) {
-                       schedule() ; 
-                       if(time_after(jiffies, t + 2*HZ)) {
-                               printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; 
-                               return -ENODEV;
-                       }
-               }
-               writel(readl(olympic_mmio+CLKCTL) & ~CLKCTL_PAUSE, olympic_mmio+CLKCTL) ; 
-       }
-       
-       /* start solo init */
-       writel((1<<15),olympic_mmio+SISR_MASK_SUM);
-
-       t=jiffies;
-       while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
-               schedule();             
-               if(time_after(jiffies, t + 15*HZ)) {
-                       printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
-                       return -ENODEV;
-               }
-       }
-       
-       writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
-
-#if OLYMPIC_DEBUG
-       printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
-#endif
-
-       init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
-
-#if OLYMPIC_DEBUG              
-{
-       int i;
-       printk("init_srb(%p): ",init_srb);
-       for(i=0;i<20;i++)
-               printk("%x ",readb(init_srb+i));
-       printk("\n");
-}
-#endif 
-       if(readw(init_srb+6)) {
-               printk(KERN_INFO "tokenring card initialization failed. errorcode : %x\n",readw(init_srb+6));
-               return -ENODEV;
-       }
-
-       if (olympic_priv->olympic_message_level) {
-               if ( readb(init_srb +2) & 0x40) { 
-                       printk(KERN_INFO "Olympic: Adapter is FDX capable.\n") ;
-               } else { 
-                       printk(KERN_INFO "Olympic: Adapter cannot do FDX.\n");
-               }
-       }
-  
-       uaa_addr=swab16(readw(init_srb+8));
-
-#if OLYMPIC_DEBUG
-       printk("UAA resides at %x\n",uaa_addr);
-#endif
-
-       writel(uaa_addr,olympic_mmio+LAPA);
-       adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
-
-       memcpy_fromio(&dev->dev_addr[0], adapter_addr,6);
-
-#if OLYMPIC_DEBUG
-       printk("adapter address: %pM\n", dev->dev_addr);
-#endif
-
-       olympic_priv->olympic_addr_table_addr = swab16(readw(init_srb + 12)); 
-       olympic_priv->olympic_parms_addr = swab16(readw(init_srb + 14)); 
-
-       return 0;
-
-}
-
-static int olympic_open(struct net_device *dev)
-{
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*init_srb;
-       unsigned long flags, t;
-       int i, open_finished = 1 ;
-       u8 resp, err;
-
-       DECLARE_WAITQUEUE(wait,current) ; 
-
-       olympic_init(dev);
-
-       if (request_irq(dev->irq, olympic_interrupt, IRQF_SHARED , "olympic",
-                       dev))
-               return -EAGAIN;
-
-#if OLYMPIC_DEBUG
-       printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
-       printk("pending ints: %x\n",readl(olympic_mmio+SISR_RR));
-#endif
-
-       writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
-
-       writel(SISR_MI | SISR_SRB_REPLY, olympic_mmio+SISR_MASK); /* more ints later, doesn't stop arb cmd interrupt */
-
-       writel(LISR_LIE,olympic_mmio+LISR); /* more ints later */
-
-       /* adapter is closed, so SRB is pointed to by LAPWWO */
-
-       writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
-       init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
-       
-#if OLYMPIC_DEBUG
-       printk("LAPWWO: %x, LAPA: %x\n",readw(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
-       printk("SISR Mask = %04x\n", readl(olympic_mmio+SISR_MASK));
-       printk("Before the open command\n");
-#endif 
-       do {
-               memset_io(init_srb,0,SRB_COMMAND_SIZE);
-
-               writeb(SRB_OPEN_ADAPTER,init_srb) ;     /* open */
-               writeb(OLYMPIC_CLEAR_RET_CODE,init_srb+2);
-
-               /* If Network Monitor, instruct card to copy MAC frames through the ARB */
-               if (olympic_priv->olympic_network_monitor) 
-                       writew(swab16(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON), init_srb+8);
-               else
-                       writew(swab16(OPEN_ADAPTER_ENABLE_FDX), init_srb+8);
-       
-               /* Test OR of first 3 bytes as its totally possible for 
-                * someone to set the first 2 bytes to be zero, although this 
-                * is an error, the first byte must have bit 6 set to 1  */
-
-               if (olympic_priv->olympic_laa[0] | olympic_priv->olympic_laa[1] | olympic_priv->olympic_laa[2]) {
-                       writeb(olympic_priv->olympic_laa[0],init_srb+12);
-                       writeb(olympic_priv->olympic_laa[1],init_srb+13);
-                       writeb(olympic_priv->olympic_laa[2],init_srb+14);
-                       writeb(olympic_priv->olympic_laa[3],init_srb+15);
-                       writeb(olympic_priv->olympic_laa[4],init_srb+16);
-                       writeb(olympic_priv->olympic_laa[5],init_srb+17);
-                       memcpy(dev->dev_addr,olympic_priv->olympic_laa,dev->addr_len) ;  
-               }       
-               writeb(1,init_srb+30);
-
-               spin_lock_irqsave(&olympic_priv->olympic_lock,flags);   
-               olympic_priv->srb_queued=1;
-
-               writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-               spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
-
-               t = jiffies ; 
-       
-               add_wait_queue(&olympic_priv->srb_wait,&wait) ;
-               set_current_state(TASK_INTERRUPTIBLE) ; 
-               while(olympic_priv->srb_queued) {        
-                       schedule() ; 
-                       if(signal_pending(current))     {            
-                               printk(KERN_WARNING "%s: Signal received in open.\n",
-                                       dev->name);
-                               printk(KERN_WARNING "SISR=%x LISR=%x\n",
-                                       readl(olympic_mmio+SISR),
-                                       readl(olympic_mmio+LISR));
-                               olympic_priv->srb_queued=0;
-                               break;
-                       }
-                       if (time_after(jiffies, t + 10*HZ)) {
-                               printk(KERN_WARNING "%s: SRB timed out.\n",dev->name);
-                               olympic_priv->srb_queued=0;
-                               break ; 
-                       } 
-                       set_current_state(TASK_INTERRUPTIBLE) ; 
-               }
-               remove_wait_queue(&olympic_priv->srb_wait,&wait) ; 
-               set_current_state(TASK_RUNNING) ; 
-               olympic_priv->srb_queued = 0 ; 
-#if OLYMPIC_DEBUG
-               printk("init_srb(%p): ",init_srb);
-               for(i=0;i<20;i++)
-                       printk("%02x ",readb(init_srb+i));
-               printk("\n");
-#endif
-               
-               /* If we get the same return response as we set, the interrupt wasn't raised and the open
-                 * timed out.
-                */
-
-               switch (resp = readb(init_srb+2)) {
-               case OLYMPIC_CLEAR_RET_CODE:
-                       printk(KERN_WARNING "%s: Adapter Open time out or error.\n", dev->name) ; 
-                       goto out;
-               case 0:
-                       open_finished = 1;
-                       break;
-               case 0x07:
-                       if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */
-                               printk(KERN_WARNING "%s: Retrying at different ring speed\n", dev->name);
-                               open_finished = 0 ;  
-                               continue;
-                       }
-
-                       err = readb(init_srb+7);
-
-                       if (!olympic_priv->olympic_ring_speed && ((err & 0x0f) == 0x0d)) { 
-                               printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name);
-                               printk(KERN_WARNING "%s: Please try again with a specified ring speed\n",dev->name);
-                       } else {
-                               printk(KERN_WARNING "%s: %s - %s\n", dev->name,
-                                       open_maj_error[(err & 0xf0) >> 4],
-                                       open_min_error[(err & 0x0f)]);
-                       }
-                       goto out;
-
-               case 0x32:
-                       printk(KERN_WARNING "%s: Invalid LAA: %pM\n",
-                              dev->name, olympic_priv->olympic_laa);
-                       goto out;
-
-               default:
-                       printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name, resp);
-                       goto out;
-
-               }
-       } while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */   
-
-       if (readb(init_srb+18) & (1<<3)) 
-               if (olympic_priv->olympic_message_level) 
-                       printk(KERN_INFO "%s: Opened in FDX Mode\n",dev->name);
-
-       if (readb(init_srb+18) & (1<<1))
-               olympic_priv->olympic_ring_speed = 100 ; 
-       else if (readb(init_srb+18) & 1)
-               olympic_priv->olympic_ring_speed = 16 ; 
-       else
-               olympic_priv->olympic_ring_speed = 4 ; 
-
-       if (olympic_priv->olympic_message_level) 
-               printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed);
-
-       olympic_priv->asb = swab16(readw(init_srb+8));
-       olympic_priv->srb = swab16(readw(init_srb+10));
-       olympic_priv->arb = swab16(readw(init_srb+12));
-       olympic_priv->trb = swab16(readw(init_srb+16));
-
-       olympic_priv->olympic_receive_options = 0x01 ; 
-       olympic_priv->olympic_copy_all_options = 0 ; 
-       
-       /* setup rx ring */
-       
-       writel((3<<16),olympic_mmio+BMCTL_RWM); /* Ensure end of frame generated interrupts */ 
-
-       writel(BMCTL_RX_DIS|3,olympic_mmio+BMCTL_RWM); /* Yes, this the enables RX channel */
-
-       for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
-
-               struct sk_buff *skb;
-               
-               skb=dev_alloc_skb(olympic_priv->pkt_buf_sz);
-               if(skb == NULL)
-                       break;
-
-               skb->dev = dev;
-
-               olympic_priv->olympic_rx_ring[i].buffer = cpu_to_le32(pci_map_single(olympic_priv->pdev, 
-                                                         skb->data,olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE)) ; 
-               olympic_priv->olympic_rx_ring[i].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz); 
-               olympic_priv->rx_ring_skb[i]=skb;
-       }
-
-       if (i==0) {
-               printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
-               goto out;
-       }
-
-       olympic_priv->rx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_rx_ring, 
-                                        sizeof(struct olympic_rx_desc) * OLYMPIC_RX_RING_SIZE, PCI_DMA_TODEVICE);
-       writel(olympic_priv->rx_ring_dma_addr, olympic_mmio+RXDESCQ);
-       writel(olympic_priv->rx_ring_dma_addr, olympic_mmio+RXCDA);
-       writew(i, olympic_mmio+RXDESCQCNT);
-               
-       olympic_priv->rx_status_ring_dma_addr = pci_map_single(olympic_priv->pdev, olympic_priv->olympic_rx_status_ring, 
-                                               sizeof(struct olympic_rx_status) * OLYMPIC_RX_RING_SIZE, PCI_DMA_FROMDEVICE);
-       writel(olympic_priv->rx_status_ring_dma_addr, olympic_mmio+RXSTATQ);
-       writel(olympic_priv->rx_status_ring_dma_addr, olympic_mmio+RXCSA);
-       
-       olympic_priv->rx_ring_last_received = OLYMPIC_RX_RING_SIZE - 1; /* last processed rx status */
-       olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE - 1;  
-
-       writew(i, olympic_mmio+RXSTATQCNT);
-
-#if OLYMPIC_DEBUG 
-       printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
-       printk("RXCSA: %x, rx_status_ring[0]: %p\n",readl(olympic_mmio+RXCSA),&olympic_priv->olympic_rx_status_ring[0]);
-       printk(" stat_ring[1]: %p, stat_ring[2]: %p, stat_ring[3]: %p\n", &(olympic_priv->olympic_rx_status_ring[1]), &(olympic_priv->olympic_rx_status_ring[2]), &(olympic_priv->olympic_rx_status_ring[3]) );
-       printk(" stat_ring[4]: %p, stat_ring[5]: %p, stat_ring[6]: %p\n", &(olympic_priv->olympic_rx_status_ring[4]), &(olympic_priv->olympic_rx_status_ring[5]), &(olympic_priv->olympic_rx_status_ring[6]) );
-       printk(" stat_ring[7]: %p\n", &(olympic_priv->olympic_rx_status_ring[7])  );
-
-       printk("RXCDA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCDA),&olympic_priv->olympic_rx_ring[0]);
-       printk("Rx_ring_dma_addr = %08x, rx_status_dma_addr = %08x\n",
-               olympic_priv->rx_ring_dma_addr,olympic_priv->rx_status_ring_dma_addr) ; 
-#endif
-
-       writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | i,olympic_mmio+RXENQ);
-
-#if OLYMPIC_DEBUG 
-       printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
-       printk("RXCSA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCSA),&olympic_priv->olympic_rx_status_ring[0]);
-       printk("RXCDA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCDA),&olympic_priv->olympic_rx_ring[0]);
-#endif 
-
-       writel(SISR_RX_STATUS | SISR_RX_NOBUF,olympic_mmio+SISR_MASK_SUM);
-
-       /* setup tx ring */
-
-       writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */
-       for(i=0;i<OLYMPIC_TX_RING_SIZE;i++) 
-               olympic_priv->olympic_tx_ring[i].buffer=cpu_to_le32(0xdeadbeef);
-
-       olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE;
-       olympic_priv->tx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_tx_ring,
-                                        sizeof(struct olympic_tx_desc) * OLYMPIC_TX_RING_SIZE,PCI_DMA_TODEVICE) ; 
-       writel(olympic_priv->tx_ring_dma_addr, olympic_mmio+TXDESCQ_1);
-       writel(olympic_priv->tx_ring_dma_addr, olympic_mmio+TXCDA_1);
-       writew(OLYMPIC_TX_RING_SIZE, olympic_mmio+TXDESCQCNT_1);
-       
-       olympic_priv->tx_status_ring_dma_addr = pci_map_single(olympic_priv->pdev, olympic_priv->olympic_tx_status_ring,
-                                               sizeof(struct olympic_tx_status) * OLYMPIC_TX_RING_SIZE, PCI_DMA_FROMDEVICE);
-       writel(olympic_priv->tx_status_ring_dma_addr,olympic_mmio+TXSTATQ_1);
-       writel(olympic_priv->tx_status_ring_dma_addr,olympic_mmio+TXCSA_1);
-       writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXSTATQCNT_1);
-               
-       olympic_priv->tx_ring_free=0; /* next entry in tx ring to use */
-       olympic_priv->tx_ring_last_status=OLYMPIC_TX_RING_SIZE-1; /* last processed tx status */
-
-       writel(0xffffffff, olympic_mmio+EISR_RWM) ; /* clean the eisr */
-       writel(0,olympic_mmio+EISR) ; 
-       writel(EISR_MASK_OPTIONS,olympic_mmio+EISR_MASK) ; /* enables most of the TX error interrupts */
-       writel(SISR_TX1_EOF | SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE | SISR_ERR,olympic_mmio+SISR_MASK_SUM);
-
-#if OLYMPIC_DEBUG 
-       printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
-       printk("SISR MASK: %x\n",readl(olympic_mmio+SISR_MASK));
-#endif
-
-       if (olympic_priv->olympic_network_monitor) { 
-               u8 __iomem *oat;
-               u8 __iomem *opt;
-               u8 addr[6];
-               oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr);
-               opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr);
-
-               for (i = 0; i < 6; i++)
-                       addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+i);
-               printk("%s: Node Address: %pM\n", dev->name, addr);
-               printk("%s: Functional Address: %02x:%02x:%02x:%02x\n",dev->name, 
-                       readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)), 
-                       readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
-                       readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
-                       readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
-
-               for (i = 0; i < 6; i++)
-                       addr[i] = readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+i);
-               printk("%s: NAUN Address: %pM\n", dev->name, addr);
-       }
-       
-       netif_start_queue(dev);
-       return 0;
-
-out:
-       free_irq(dev->irq, dev);
-       return -EIO;
-}      
-
-/*
- *     When we enter the rx routine we do not know how many frames have been 
- *     queued on the rx channel.  Therefore we start at the next rx status
- *     position and travel around the receive ring until we have completed
- *     all the frames.
- *
- *     This means that we may process the frame before we receive the end
- *     of frame interrupt. This is why we always test the status instead
- *     of blindly processing the next frame.
- *
- *     We also remove the last 4 bytes from the packet as well, these are
- *     just token ring trailer info and upset protocols that don't check 
- *     their own length, i.e. SNA. 
- *     
- */
-static void olympic_rx(struct net_device *dev)
-{
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
-       struct olympic_rx_status *rx_status;
-       struct olympic_rx_desc *rx_desc ; 
-       int rx_ring_last_received,length, buffer_cnt, cpy_length, frag_len;
-       struct sk_buff *skb, *skb2;
-       int i;
-
-       rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ; 
-       while (rx_status->status_buffercnt) { 
-                u32 l_status_buffercnt;
-
-               olympic_priv->rx_status_last_received++ ;
-               olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1);
-#if OLYMPIC_DEBUG
-               printk("rx status: %x rx len: %x\n", le32_to_cpu(rx_status->status_buffercnt), le32_to_cpu(rx_status->fragmentcnt_framelen));
-#endif
-               length = le32_to_cpu(rx_status->fragmentcnt_framelen) & 0xffff;
-               buffer_cnt = le32_to_cpu(rx_status->status_buffercnt) & 0xffff; 
-               i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */ 
-               frag_len = le32_to_cpu(rx_status->fragmentcnt_framelen) >> 16; 
-
-#if OLYMPIC_DEBUG 
-               printk("length: %x, frag_len: %x, buffer_cnt: %x\n", length, frag_len, buffer_cnt);
-#endif
-                l_status_buffercnt = le32_to_cpu(rx_status->status_buffercnt);
-               if(l_status_buffercnt & 0xC0000000) {
-                       if (l_status_buffercnt & 0x3B000000) {
-                               if (olympic_priv->olympic_message_level) {
-                                       if (l_status_buffercnt & (1<<29))  /* Rx Frame Truncated */
-                                               printk(KERN_WARNING "%s: Rx Frame Truncated\n",dev->name);
-                                       if (l_status_buffercnt & (1<<28)) /*Rx receive overrun */
-                                               printk(KERN_WARNING "%s: Rx Frame Receive overrun\n",dev->name);
-                                       if (l_status_buffercnt & (1<<27)) /* No receive buffers */
-                                               printk(KERN_WARNING "%s: No receive buffers\n",dev->name);
-                                       if (l_status_buffercnt & (1<<25)) /* Receive frame error detect */
-                                               printk(KERN_WARNING "%s: Receive frame error detect\n",dev->name);
-                                       if (l_status_buffercnt & (1<<24)) /* Received Error Detect */
-                                               printk(KERN_WARNING "%s: Received Error Detect\n",dev->name);
-                               } 
-                               olympic_priv->rx_ring_last_received += i ; 
-                               olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ; 
-                               dev->stats.rx_errors++;
-                       } else {        
-                       
-                               if (buffer_cnt == 1) {
-                                       skb = dev_alloc_skb(max_t(int, olympic_priv->pkt_buf_sz,length)) ; 
-                               } else {
-                                       skb = dev_alloc_skb(length) ; 
-                               }
-
-                               if (skb == NULL) {
-                                       printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers.\n",dev->name) ;
-                                       dev->stats.rx_dropped++;
-                                       /* Update counters even though we don't transfer the frame */
-                                       olympic_priv->rx_ring_last_received += i ; 
-                                       olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ;  
-                               } else  {
-                                       /* Optimise based upon number of buffers used. 
-                                          If only one buffer is used we can simply swap the buffers around.
-                                          If more than one then we must use the new buffer and copy the information
-                                          first. Ideally all frames would be in a single buffer, this can be tuned by
-                                                  altering the buffer size. If the length of the packet is less than
-                                          1500 bytes we're going to copy it over anyway to stop packets getting
-                                          dropped from sockets with buffers smaller than our pkt_buf_sz. */
-                               
-                                       if (buffer_cnt==1) {
-                                               olympic_priv->rx_ring_last_received++ ; 
-                                               olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
-                                               rx_ring_last_received = olympic_priv->rx_ring_last_received ;
-                                               if (length > 1500) { 
-                                                       skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ; 
-                                                       /* unmap buffer */
-                                                       pci_unmap_single(olympic_priv->pdev,
-                                                               le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer), 
-                                                               olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ; 
-                                                       skb_put(skb2,length-4);
-                                                       skb2->protocol = tr_type_trans(skb2,dev);
-                                                       olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer = 
-                                                               cpu_to_le32(pci_map_single(olympic_priv->pdev, skb->data, 
-                                                               olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
-                                                       olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = 
-                                                               cpu_to_le32(olympic_priv->pkt_buf_sz); 
-                                                       olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ; 
-                                                       netif_rx(skb2) ; 
-                                               } else { 
-                                                       pci_dma_sync_single_for_cpu(olympic_priv->pdev,
-                                                               le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
-                                                               olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ; 
-                                                       skb_copy_from_linear_data(olympic_priv->rx_ring_skb[rx_ring_last_received],
-                                                                     skb_put(skb,length - 4),
-                                                                     length - 4);
-                                                       pci_dma_sync_single_for_device(olympic_priv->pdev,
-                                                               le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
-                                                               olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
-                                                       skb->protocol = tr_type_trans(skb,dev) ; 
-                                                       netif_rx(skb) ; 
-                                               } 
-                                       } else {
-                                               do { /* Walk the buffers */ 
-                                                       olympic_priv->rx_ring_last_received++ ; 
-                                                       olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
-                                                       rx_ring_last_received = olympic_priv->rx_ring_last_received ; 
-                                                       pci_dma_sync_single_for_cpu(olympic_priv->pdev,
-                                                               le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
-                                                               olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ; 
-                                                       rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]);
-                                                       cpy_length = (i == 1 ? frag_len : le32_to_cpu(rx_desc->res_length)); 
-                                                       skb_copy_from_linear_data(olympic_priv->rx_ring_skb[rx_ring_last_received],
-                                                                     skb_put(skb, cpy_length),
-                                                                     cpy_length);
-                                                       pci_dma_sync_single_for_device(olympic_priv->pdev,
-                                                               le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
-                                                               olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
-                                               } while (--i) ; 
-                                               skb_trim(skb,skb->len-4) ; 
-                                               skb->protocol = tr_type_trans(skb,dev);
-                                               netif_rx(skb) ; 
-                                       } 
-                                       dev->stats.rx_packets++ ;
-                                       dev->stats.rx_bytes += length ;
-                               } /* if skb == null */
-                       } /* If status & 0x3b */
-
-               } else { /*if buffercnt & 0xC */
-                       olympic_priv->rx_ring_last_received += i ; 
-                       olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE - 1) ; 
-               } 
-
-               rx_status->fragmentcnt_framelen = 0 ; 
-               rx_status->status_buffercnt = 0 ; 
-               rx_status = &(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received+1) & (OLYMPIC_RX_RING_SIZE -1) ]);
-
-               writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) |  buffer_cnt , olympic_mmio+RXENQ); 
-       } /* while */
-
-}
-
-static void olympic_freemem(struct net_device *dev) 
-{ 
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       int i;
-                       
-       for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
-               if (olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] != NULL) {
-                       dev_kfree_skb_irq(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]);
-                       olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] = NULL;
-               }
-               if (olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer != cpu_to_le32(0xdeadbeef)) {
-                       pci_unmap_single(olympic_priv->pdev, 
-                       le32_to_cpu(olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer),
-                       olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE);
-               }
-               olympic_priv->rx_status_last_received++;
-               olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
-       }
-       /* unmap rings */
-       pci_unmap_single(olympic_priv->pdev, olympic_priv->rx_status_ring_dma_addr, 
-               sizeof(struct olympic_rx_status) * OLYMPIC_RX_RING_SIZE, PCI_DMA_FROMDEVICE);
-       pci_unmap_single(olympic_priv->pdev, olympic_priv->rx_ring_dma_addr,
-               sizeof(struct olympic_rx_desc) * OLYMPIC_RX_RING_SIZE, PCI_DMA_TODEVICE);
-
-       pci_unmap_single(olympic_priv->pdev, olympic_priv->tx_status_ring_dma_addr, 
-               sizeof(struct olympic_tx_status) * OLYMPIC_TX_RING_SIZE, PCI_DMA_FROMDEVICE);
-       pci_unmap_single(olympic_priv->pdev, olympic_priv->tx_ring_dma_addr, 
-               sizeof(struct olympic_tx_desc) * OLYMPIC_TX_RING_SIZE, PCI_DMA_TODEVICE);
-
-       return ; 
-}
-static irqreturn_t olympic_interrupt(int irq, void *dev_id) 
-{
-       struct net_device *dev= (struct net_device *)dev_id;
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
-       u32 sisr;
-       u8 __iomem *adapter_check_area ; 
-       
-       /* 
-        *  Read sisr but don't reset it yet. 
-        *  The indication bit may have been set but the interrupt latch
-        *  bit may not be set, so we'd lose the interrupt later. 
-        */ 
-       sisr=readl(olympic_mmio+SISR) ; 
-       if (!(sisr & SISR_MI)) /* Interrupt isn't for us */ 
-               return IRQ_NONE;
-       sisr=readl(olympic_mmio+SISR_RR) ;  /* Read & Reset sisr */ 
-
-       spin_lock(&olympic_priv->olympic_lock);
-
-       /* Hotswap gives us this on removal */
-       if (sisr == 0xffffffff) { 
-               printk(KERN_WARNING "%s: Hotswap adapter removal.\n",dev->name) ; 
-               spin_unlock(&olympic_priv->olympic_lock) ; 
-               return IRQ_NONE;
-       } 
-               
-       if (sisr & (SISR_SRB_REPLY | SISR_TX1_EOF | SISR_RX_STATUS | SISR_ADAPTER_CHECK |  
-                       SISR_ASB_FREE | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_RX_NOBUF | SISR_ERR)) {  
-       
-               /* If we ever get this the adapter is seriously dead. Only a reset is going to 
-                * bring it back to life. We're talking pci bus errors and such like :( */ 
-               if((sisr & SISR_ERR) && (readl(olympic_mmio+EISR) & EISR_MASK_OPTIONS)) {
-                       printk(KERN_ERR "Olympic: EISR Error, EISR=%08x\n",readl(olympic_mmio+EISR)) ; 
-                       printk(KERN_ERR "The adapter must be reset to clear this condition.\n") ; 
-                       printk(KERN_ERR "Please report this error to the driver maintainer and/\n") ; 
-                       printk(KERN_ERR "or the linux-tr mailing list.\n") ; 
-                       wake_up_interruptible(&olympic_priv->srb_wait);
-                       spin_unlock(&olympic_priv->olympic_lock) ; 
-                       return IRQ_HANDLED;
-               } /* SISR_ERR */
-
-               if(sisr & SISR_SRB_REPLY) {
-                       if(olympic_priv->srb_queued==1) {
-                               wake_up_interruptible(&olympic_priv->srb_wait);
-                       } else if (olympic_priv->srb_queued==2) { 
-                               olympic_srb_bh(dev) ; 
-                       }
-                       olympic_priv->srb_queued=0;
-               } /* SISR_SRB_REPLY */
-
-               /* We shouldn't ever miss the Tx interrupt, but the you never know, hence the loop to ensure
-                  we get all tx completions. */
-               if (sisr & SISR_TX1_EOF) {
-                       while(olympic_priv->olympic_tx_status_ring[(olympic_priv->tx_ring_last_status + 1) & (OLYMPIC_TX_RING_SIZE-1)].status) { 
-                               olympic_priv->tx_ring_last_status++;
-                               olympic_priv->tx_ring_last_status &= (OLYMPIC_TX_RING_SIZE-1);
-                               olympic_priv->free_tx_ring_entries++;
-                               dev->stats.tx_bytes += olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len;
-                               dev->stats.tx_packets++ ;
-                               pci_unmap_single(olympic_priv->pdev, 
-                                       le32_to_cpu(olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer), 
-                                       olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len,PCI_DMA_TODEVICE);
-                               dev_kfree_skb_irq(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]);
-                               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=cpu_to_le32(0xdeadbeef);
-                               olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0;
-                       }
-                       netif_wake_queue(dev);
-               } /* SISR_TX1_EOF */
-       
-               if (sisr & SISR_RX_STATUS) {
-                       olympic_rx(dev);
-               } /* SISR_RX_STATUS */
-       
-               if (sisr & SISR_ADAPTER_CHECK) {
-                       netif_stop_queue(dev);
-                       printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name);
-                       writel(readl(olympic_mmio+LAPWWC),olympic_mmio+LAPA);
-                       adapter_check_area = olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWC)) & (~0xf800)) ;
-                       printk(KERN_WARNING "%s: Bytes %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, readb(adapter_check_area+0), readb(adapter_check_area+1), readb(adapter_check_area+2), readb(adapter_check_area+3), readb(adapter_check_area+4), readb(adapter_check_area+5), readb(adapter_check_area+6), readb(adapter_check_area+7)) ; 
-                       spin_unlock(&olympic_priv->olympic_lock) ; 
-                       return IRQ_HANDLED; 
-               } /* SISR_ADAPTER_CHECK */
-       
-               if (sisr & SISR_ASB_FREE) {
-                       /* Wake up anything that is waiting for the asb response */  
-                       if (olympic_priv->asb_queued) {
-                               olympic_asb_bh(dev) ; 
-                       }
-               } /* SISR_ASB_FREE */
-       
-               if (sisr & SISR_ARB_CMD) {
-                       olympic_arb_cmd(dev) ; 
-               } /* SISR_ARB_CMD */
-       
-               if (sisr & SISR_TRB_REPLY) {
-                       /* Wake up anything that is waiting for the trb response */
-                       if (olympic_priv->trb_queued) {
-                               wake_up_interruptible(&olympic_priv->trb_wait);
-                       }
-                       olympic_priv->trb_queued = 0 ; 
-               } /* SISR_TRB_REPLY */  
-       
-               if (sisr & SISR_RX_NOBUF) {
-                       /* According to the documentation, we don't have to do anything, but trapping it keeps it out of
-                                  /var/log/messages.  */
-               } /* SISR_RX_NOBUF */
-       } else { 
-               printk(KERN_WARNING "%s: Unexpected interrupt: %x\n",dev->name, sisr);
-               printk(KERN_WARNING "%s: SISR_MASK: %x\n",dev->name, readl(olympic_mmio+SISR_MASK)) ;
-       } /* One if the interrupts we want */
-       writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
-       
-       spin_unlock(&olympic_priv->olympic_lock) ; 
-       return IRQ_HANDLED;
-}      
-
-static netdev_tx_t olympic_xmit(struct sk_buff *skb,
-                                     struct net_device *dev)
-{
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
-       unsigned long flags ; 
-
-       spin_lock_irqsave(&olympic_priv->olympic_lock, flags);
-
-       netif_stop_queue(dev);
-       
-       if(olympic_priv->free_tx_ring_entries) {
-               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer = 
-                       cpu_to_le32(pci_map_single(olympic_priv->pdev, skb->data, skb->len,PCI_DMA_TODEVICE));
-               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length = cpu_to_le32(skb->len | (0x80000000));
-               olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb;
-               olympic_priv->free_tx_ring_entries--;
-
-               olympic_priv->tx_ring_free++;
-               olympic_priv->tx_ring_free &= (OLYMPIC_TX_RING_SIZE-1);
-               writew((((readw(olympic_mmio+TXENQ_1)) & 0x8000) ^ 0x8000) | 1,olympic_mmio+TXENQ_1);
-               netif_wake_queue(dev);
-               spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
-               return NETDEV_TX_OK;
-       } else {
-               spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
-               return NETDEV_TX_BUSY;
-       } 
-
-}
-       
-
-static int olympic_close(struct net_device *dev) 
-{
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*srb;
-       unsigned long t,flags;
-
-       DECLARE_WAITQUEUE(wait,current) ; 
-
-       netif_stop_queue(dev);
-       
-       writel(olympic_priv->srb,olympic_mmio+LAPA);
-       srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
-       
-       writeb(SRB_CLOSE_ADAPTER,srb+0);
-       writeb(0,srb+1);
-       writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
-
-       add_wait_queue(&olympic_priv->srb_wait,&wait) ;
-       set_current_state(TASK_INTERRUPTIBLE) ; 
-
-       spin_lock_irqsave(&olympic_priv->olympic_lock,flags);
-       olympic_priv->srb_queued=1;
-
-       writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-       spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
-
-       while(olympic_priv->srb_queued) {
-
-               t = schedule_timeout_interruptible(60*HZ);
-
-               if(signal_pending(current))     {            
-                       printk(KERN_WARNING "%s: SRB timed out.\n",dev->name);
-                       printk(KERN_WARNING "SISR=%x MISR=%x\n",readl(olympic_mmio+SISR),readl(olympic_mmio+LISR));
-                       olympic_priv->srb_queued=0;
-                       break;
-               }
-
-               if (t == 0) { 
-                       printk(KERN_WARNING "%s: SRB timed out. May not be fatal.\n",dev->name);
-               } 
-               olympic_priv->srb_queued=0;
-       }
-       remove_wait_queue(&olympic_priv->srb_wait,&wait) ; 
-
-       olympic_priv->rx_status_last_received++;
-       olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
-
-       olympic_freemem(dev) ;  
-
-       /* reset tx/rx fifo's and busmaster logic */
-
-       writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
-       udelay(1);
-       writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
-
-#if OLYMPIC_DEBUG
-       {
-       int i ; 
-       printk("srb(%p): ",srb);
-       for(i=0;i<4;i++)
-               printk("%x ",readb(srb+i));
-       printk("\n");
-       }
-#endif
-       free_irq(dev->irq,dev);
-
-       return 0;
-       
-}
-
-static void olympic_set_rx_mode(struct net_device *dev) 
-{
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-       u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ; 
-       u8 options = 0; 
-       u8 __iomem *srb;
-       struct netdev_hw_addr *ha;
-       unsigned char dev_mc_address[4] ; 
-
-       writel(olympic_priv->srb,olympic_mmio+LAPA);
-       srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
-       options = olympic_priv->olympic_copy_all_options; 
-
-       if (dev->flags&IFF_PROMISC)  
-               options |= 0x61 ;
-       else
-               options &= ~0x61 ; 
-
-       /* Only issue the srb if there is a change in options */
-
-       if ((options ^ olympic_priv->olympic_copy_all_options)) { 
-       
-               /* Now to issue the srb command to alter the copy.all.options */
-       
-               writeb(SRB_MODIFY_RECEIVE_OPTIONS,srb);
-               writeb(0,srb+1);
-               writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
-               writeb(0,srb+3);
-               writeb(olympic_priv->olympic_receive_options,srb+4);
-               writeb(options,srb+5);
-
-               olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
-
-               writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-
-               olympic_priv->olympic_copy_all_options = options ;
-               
-               return ;  
-       } 
-
-       /* Set the functional addresses we need for multicast */
-
-       dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ; 
-
-       netdev_for_each_mc_addr(ha, dev) {
-               dev_mc_address[0] |= ha->addr[2];
-               dev_mc_address[1] |= ha->addr[3];
-               dev_mc_address[2] |= ha->addr[4];
-               dev_mc_address[3] |= ha->addr[5];
-       }
-
-       writeb(SRB_SET_FUNC_ADDRESS,srb+0);
-       writeb(0,srb+1);
-       writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
-       writeb(0,srb+3);
-       writeb(0,srb+4);
-       writeb(0,srb+5);
-       writeb(dev_mc_address[0],srb+6);
-       writeb(dev_mc_address[1],srb+7);
-       writeb(dev_mc_address[2],srb+8);
-       writeb(dev_mc_address[3],srb+9);
-
-       olympic_priv->srb_queued = 2 ;
-       writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-
-}
-
-static void olympic_srb_bh(struct net_device *dev) 
-{ 
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-       u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ; 
-       u8 __iomem *srb;
-
-       writel(olympic_priv->srb,olympic_mmio+LAPA);
-       srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
-
-       switch (readb(srb)) { 
-
-               /* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous) 
-                 * At some point we should do something if we get an error, such as
-                 * resetting the IFF_PROMISC flag in dev
-                */
-
-               case SRB_MODIFY_RECEIVE_OPTIONS:
-                       switch (readb(srb+2)) { 
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name) ; 
-                                       break ; 
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
-                                       break ; 
-                               default:
-                                       if (olympic_priv->olympic_message_level) 
-                                               printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",dev->name,olympic_priv->olympic_copy_all_options, olympic_priv->olympic_receive_options) ; 
-                                       break ;         
-                       } /* switch srb[2] */ 
-                       break ;
-               
-               /* SRB_SET_GROUP_ADDRESS - Multicast group setting 
-                 */
-
-               case SRB_SET_GROUP_ADDRESS:
-                       switch (readb(srb+2)) { 
-                               case 0x00:
-                                       break ; 
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                                       break ;
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name); 
-                                       break ;
-                               case 0x3c:
-                                       printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n",dev->name) ; 
-                                       break ;
-                               case 0x3e: /* If we ever implement individual multicast addresses, will need to deal with this */
-                                       printk(KERN_WARNING "%s: Group address registers full\n",dev->name) ; 
-                                       break ;  
-                               case 0x55:
-                                       printk(KERN_INFO "%s: Group Address already set.\n",dev->name) ; 
-                                       break ;
-                               default:
-                                       break ; 
-                       } /* switch srb[2] */ 
-                       break ; 
-
-               /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
-                */
-
-               case SRB_RESET_GROUP_ADDRESS:
-                       switch (readb(srb+2)) { 
-                               case 0x00:
-                                       break ; 
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                                       break ; 
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
-                                       break ; 
-                               case 0x39: /* Must deal with this if individual multicast addresses used */
-                                       printk(KERN_INFO "%s: Group address not found\n",dev->name);
-                                       break ;
-                               default:
-                                       break ; 
-                       } /* switch srb[2] */
-                       break ; 
-
-               
-               /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode 
-                */
-
-               case SRB_SET_FUNC_ADDRESS:
-                       switch (readb(srb+2)) { 
-                               case 0x00:
-                                       if (olympic_priv->olympic_message_level)
-                                               printk(KERN_INFO "%s: Functional Address Mask Set\n",dev->name);
-                                       break ;
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                                       break ; 
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
-                                       break ; 
-                               default:
-                                       break ; 
-                       } /* switch srb[2] */
-                       break ; 
-       
-               /* SRB_READ_LOG - Read and reset the adapter error counters
-                */
-
-               case SRB_READ_LOG:
-                       switch (readb(srb+2)) { 
-                               case 0x00: 
-                                       if (olympic_priv->olympic_message_level) 
-                                               printk(KERN_INFO "%s: Read Log issued\n",dev->name) ; 
-                                       break ; 
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                                       break ; 
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
-                                       break ; 
-                       
-                       } /* switch srb[2] */
-                       break ; 
-               
-               /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
-
-               case SRB_READ_SR_COUNTERS:
-                       switch (readb(srb+2)) { 
-                               case 0x00: 
-                                       if (olympic_priv->olympic_message_level) 
-                                               printk(KERN_INFO "%s: Read Source Routing Counters issued\n",dev->name) ; 
-                                       break ; 
-                               case 0x01:
-                                       printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
-                                       break ; 
-                               case 0x04:
-                                       printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
-                                       break ; 
-                               default:
-                                       break ; 
-                       } /* switch srb[2] */
-                       break ;
-               default:
-                       printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n",dev->name);
-                       break ; 
-       } /* switch srb[0] */
-
-} 
-
-static int olympic_set_mac_address (struct net_device *dev, void *addr) 
-{
-       struct sockaddr *saddr = addr ; 
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-
-       if (netif_running(dev)) { 
-               printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ; 
-               return -EIO ; 
-       }
-
-       memcpy(olympic_priv->olympic_laa, saddr->sa_data,dev->addr_len) ; 
-       
-       if (olympic_priv->olympic_message_level) { 
-               printk(KERN_INFO "%s: MAC/LAA Set to  = %x.%x.%x.%x.%x.%x\n",dev->name, olympic_priv->olympic_laa[0],
-               olympic_priv->olympic_laa[1], olympic_priv->olympic_laa[2],
-               olympic_priv->olympic_laa[3], olympic_priv->olympic_laa[4],
-               olympic_priv->olympic_laa[5]);
-       } 
-
-       return 0 ; 
-}
-
-static void olympic_arb_cmd(struct net_device *dev)
-{
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-       u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
-       u8 __iomem *arb_block, *asb_block, *srb  ; 
-       u8 header_len ; 
-       u16 frame_len, buffer_len ;
-       struct sk_buff *mac_frame ;  
-       u8 __iomem *buf_ptr ;
-       u8 __iomem *frame_data ;  
-       u16 buff_off ; 
-       u16 lan_status = 0, lan_status_diff  ; /* Initialize to stop compiler warning */
-       u8 fdx_prot_error ; 
-       u16 next_ptr;
-
-       arb_block = (olympic_priv->olympic_lap + olympic_priv->arb) ; 
-       asb_block = (olympic_priv->olympic_lap + olympic_priv->asb) ; 
-       srb = (olympic_priv->olympic_lap + olympic_priv->srb) ; 
-       
-       if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */
-
-               header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */  
-               frame_len = swab16(readw(arb_block + 10)) ; 
-
-               buff_off = swab16(readw(arb_block + 6)) ;
-               
-               buf_ptr = olympic_priv->olympic_lap + buff_off ; 
-
-#if OLYMPIC_DEBUG
-{
-               int i;
-               frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; 
-
-               for (i=0 ;  i < 14 ; i++) { 
-                       printk("Loc %d = %02x\n",i,readb(frame_data + i)); 
-               }
-
-               printk("next %04x, fs %02x, len %04x\n",readw(buf_ptr+offsetof(struct mac_receive_buffer,next)), readb(buf_ptr+offsetof(struct mac_receive_buffer,frame_status)), readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length)));
-}
-#endif 
-               mac_frame = dev_alloc_skb(frame_len) ; 
-               if (!mac_frame) {
-                       printk(KERN_WARNING "%s: Memory squeeze, dropping frame.\n", dev->name);
-                       goto drop_frame;
-               }
-
-               /* Walk the buffer chain, creating the frame */
-
-               do {
-                       frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; 
-                       buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); 
-                       memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ;
-                       next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); 
-               } while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + swab16(next_ptr)));
-
-               mac_frame->protocol = tr_type_trans(mac_frame, dev);
-
-               if (olympic_priv->olympic_network_monitor) { 
-                       struct trh_hdr *mac_hdr;
-                       printk(KERN_WARNING "%s: Received MAC Frame, details:\n",dev->name);
-                       mac_hdr = tr_hdr(mac_frame);
-                       printk(KERN_WARNING "%s: MAC Frame Dest. Addr: %pM\n",
-                              dev->name, mac_hdr->daddr);
-                       printk(KERN_WARNING "%s: MAC Frame Srce. Addr: %pM\n",
-                              dev->name, mac_hdr->saddr);
-               }
-               netif_rx(mac_frame);
-
-drop_frame:
-               /* Now tell the card we have dealt with the received frame */
-
-               /* Set LISR Bit 1 */
-               writel(LISR_ARB_FREE,olympic_priv->olympic_mmio + LISR_SUM);
-
-               /* Is the ASB free ? */         
-               
-               if (readb(asb_block + 2) != 0xff) { 
-                       olympic_priv->asb_queued = 1 ; 
-                       writel(LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM); 
-                       return ;        
-                       /* Drop out and wait for the bottom half to be run */
-               }
-               
-               writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
-               writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
-               writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
-               writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */                
-
-               writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
-               
-               olympic_priv->asb_queued = 2 ; 
-       
-               return ;        
-               
-       } else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */
-               lan_status = swab16(readw(arb_block+6));
-               fdx_prot_error = readb(arb_block+8) ; 
-               
-               /* Issue ARB Free */
-               writel(LISR_ARB_FREE,olympic_priv->olympic_mmio+LISR_SUM);
-
-               lan_status_diff = olympic_priv->olympic_lan_status ^ lan_status ; 
-
-               if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR) ) { 
-                       if (lan_status_diff & LSC_LWF) 
-                                       printk(KERN_WARNING "%s: Short circuit detected on the lobe\n",dev->name);
-                       if (lan_status_diff & LSC_ARW) 
-                                       printk(KERN_WARNING "%s: Auto removal error\n",dev->name);
-                       if (lan_status_diff & LSC_FPE)
-                                       printk(KERN_WARNING "%s: FDX Protocol Error\n",dev->name);
-                       if (lan_status_diff & LSC_RR) 
-                                       printk(KERN_WARNING "%s: Force remove MAC frame received\n",dev->name);
-               
-                       /* Adapter has been closed by the hardware */
-               
-                       /* reset tx/rx fifo's and busmaster logic */
-
-                       writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
-                       udelay(1);
-                       writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
-                       netif_stop_queue(dev);
-                       olympic_priv->srb = readw(olympic_priv->olympic_lap + LAPWWO) ; 
-                       printk(KERN_WARNING "%s: Adapter has been closed\n", dev->name);
-               } /* If serious error */
-               
-               if (olympic_priv->olympic_message_level) { 
-                       if (lan_status_diff & LSC_SIG_LOSS) 
-                                       printk(KERN_WARNING "%s: No receive signal detected\n", dev->name);
-                       if (lan_status_diff & LSC_HARD_ERR)
-                                       printk(KERN_INFO "%s: Beaconing\n",dev->name);
-                       if (lan_status_diff & LSC_SOFT_ERR)
-                                       printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame\n",dev->name);
-                       if (lan_status_diff & LSC_TRAN_BCN) 
-                                       printk(KERN_INFO "%s: We are transmitting the beacon, aaah\n",dev->name);
-                       if (lan_status_diff & LSC_SS) 
-                                       printk(KERN_INFO "%s: Single Station on the ring\n", dev->name);
-                       if (lan_status_diff & LSC_RING_REC)
-                                       printk(KERN_INFO "%s: Ring recovery ongoing\n",dev->name);
-                       if (lan_status_diff & LSC_FDX_MODE)
-                                       printk(KERN_INFO "%s: Operating in FDX mode\n",dev->name);
-               }       
-               
-               if (lan_status_diff & LSC_CO) { 
-                                       
-                               if (olympic_priv->olympic_message_level) 
-                                       printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-                                       
-                               /* Issue READ.LOG command */
-
-                               writeb(SRB_READ_LOG, srb);
-                               writeb(0,srb+1);
-                               writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
-                               writeb(0,srb+3);
-                               writeb(0,srb+4);
-                               writeb(0,srb+5);
-                                       
-                               olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
-
-                               writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-                                       
-               }
-
-               if (lan_status_diff & LSC_SR_CO) { 
-
-                               if (olympic_priv->olympic_message_level)
-                                       printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
-
-                               /* Issue a READ.SR.COUNTERS */
-                               
-                               writeb(SRB_READ_SR_COUNTERS,srb);
-                               writeb(0,srb+1);
-                               writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
-                               writeb(0,srb+3);
-                               
-                               olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
-
-                               writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
-
-               }
-
-               olympic_priv->olympic_lan_status = lan_status ; 
-       
-       }  /* Lan.change.status */
-       else
-               printk(KERN_WARNING "%s: Unknown arb command\n", dev->name);
-}
-
-static void olympic_asb_bh(struct net_device *dev) 
-{
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-       u8 __iomem *arb_block, *asb_block ; 
-
-       arb_block = (olympic_priv->olympic_lap + olympic_priv->arb) ; 
-       asb_block = (olympic_priv->olympic_lap + olympic_priv->asb) ; 
-
-       if (olympic_priv->asb_queued == 1) {   /* Dropped through the first time */
-
-               writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
-               writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
-               writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
-               writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */                
-
-               writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
-               olympic_priv->asb_queued = 2 ; 
-
-               return ; 
-       }
-
-       if (olympic_priv->asb_queued == 2) { 
-               switch (readb(asb_block+2)) {
-                       case 0x01:
-                               printk(KERN_WARNING "%s: Unrecognized command code\n", dev->name);
-                               break ;
-                       case 0x26:
-                               printk(KERN_WARNING "%s: Unrecognized buffer address\n", dev->name);
-                               break ;
-                       case 0xFF:
-                               /* Valid response, everything should be ok again */
-                               break ;
-                       default:
-                               printk(KERN_WARNING "%s: Invalid return code in asb\n",dev->name);
-                               break ;
-               }
-       }
-       olympic_priv->asb_queued = 0 ; 
-}
-static int olympic_change_mtu(struct net_device *dev, int mtu) 
-{
-       struct olympic_private *olympic_priv = netdev_priv(dev);
-       u16 max_mtu ; 
-
-       if (olympic_priv->olympic_ring_speed == 4)
-               max_mtu = 4500 ; 
-       else
-               max_mtu = 18000 ; 
-       
-       if (mtu > max_mtu)
-               return -EINVAL ; 
-       if (mtu < 100) 
-               return -EINVAL ; 
-
-       dev->mtu = mtu ; 
-       olympic_priv->pkt_buf_sz = mtu + TR_HLEN ; 
-
-       return 0 ; 
-}
-
-static int olympic_proc_show(struct seq_file *m, void *v)
-{
-       struct net_device *dev = m->private;
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-       u8 __iomem *oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ; 
-       u8 __iomem *opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ; 
-       u8 addr[6];
-       u8 addr2[6];
-       int i;
-
-       seq_printf(m,
-               "IBM Pit/Pit-Phy/Olympic Chipset Token Ring Adapter %s\n",dev->name);
-       seq_printf(m, "\n%6s: Adapter Address   : Node Address      : Functional Addr\n",
-          dev->name); 
-
-       for (i = 0 ; i < 6 ; i++)
-               addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr) + i);
-
-       seq_printf(m, "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
-          dev->name,
-          dev->dev_addr, addr,
-          readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)), 
-          readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
-          readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
-          readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
-        
-       seq_printf(m, "\n%6s: Token Ring Parameters Table:\n", dev->name);
-
-       seq_printf(m, "%6s: Physical Addr : Up Node Address   : Poll Address      : AccPri : Auth Src : Att Code :\n",
-         dev->name) ; 
-
-       for (i = 0 ; i < 6 ; i++)
-               addr[i] = readb(opt+offsetof(struct olympic_parameters_table, up_node_addr) + i);
-       for (i = 0 ; i < 6 ; i++)
-               addr2[i] =  readb(opt+offsetof(struct olympic_parameters_table, poll_addr) + i);
-
-       seq_printf(m, "%6s: %02x:%02x:%02x:%02x   : %pM : %pM : %04x   : %04x     :  %04x    :\n",
-         dev->name,
-         readb(opt+offsetof(struct olympic_parameters_table, phys_addr)),
-         readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+1),
-         readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+2),
-         readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+3),
-         addr, addr2,
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
-
-       seq_printf(m, "%6s: Source Address    : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
-         dev->name) ; 
-       
-       for (i = 0 ; i < 6 ; i++)
-               addr[i] = readb(opt+offsetof(struct olympic_parameters_table, source_addr) + i);
-       seq_printf(m, "%6s: %pM : %04x  : %04x   : %04x   : %04x   : %04x    :     %04x     : \n",
-         dev->name, addr,
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, lan_status))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, local_ring))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
-
-       seq_printf(m, "%6s: Beacon Details :  Tx  :  Rx  : NAUN Node Address : NAUN Node Phys : \n",
-         dev->name) ; 
-
-       for (i = 0 ; i < 6 ; i++)
-               addr[i] = readb(opt+offsetof(struct olympic_parameters_table, beacon_naun) + i);
-       seq_printf(m, "%6s:                :  %02x  :  %02x  : %pM : %02x:%02x:%02x:%02x    : \n",
-         dev->name,
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
-         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
-         addr,
-         readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)),
-         readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+1),
-         readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+2),
-         readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+3));
-
-       return 0;
-}
-
-static int olympic_proc_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, olympic_proc_show, PDE(inode)->data);
-}
-
-static const struct file_operations olympic_proc_ops = {
-       .open           = olympic_proc_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-static void __devexit olympic_remove_one(struct pci_dev *pdev) 
-{
-       struct net_device *dev = pci_get_drvdata(pdev) ; 
-       struct olympic_private *olympic_priv=netdev_priv(dev);
-
-       if (olympic_priv->olympic_network_monitor) { 
-               char proc_name[20] ; 
-               strcpy(proc_name,"olympic_") ;
-               strcat(proc_name,dev->name) ;
-               remove_proc_entry(proc_name,init_net.proc_net);
-       }
-       unregister_netdev(dev) ; 
-       iounmap(olympic_priv->olympic_mmio) ; 
-       iounmap(olympic_priv->olympic_lap) ; 
-       pci_release_regions(pdev) ;
-       pci_set_drvdata(pdev,NULL) ;    
-       free_netdev(dev) ; 
-}
-
-static struct pci_driver olympic_driver = { 
-       .name           = "olympic",
-       .id_table       = olympic_pci_tbl,
-       .probe          = olympic_probe,
-       .remove         = __devexit_p(olympic_remove_one),
-};
-
-module_pci_driver(olympic_driver);
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/tokenring/olympic.h b/drivers/net/tokenring/olympic.h
deleted file mode 100644 (file)
index 30631ba..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- *  olympic.h (c) 1999 Peter De Schrijver All Rights Reserved
- *                1999,2000 Mike Phillips (mikep@linuxtr.net)
- *
- *  Linux driver for IBM PCI tokenring cards based on the olympic and the PIT/PHY chipset.
- *
- *  Base Driver Skeleton:
- *      Written 1993-94 by Donald Becker.
- *
- *      Copyright 1993 United States Government as represented by the
- *      Director, National Security Agency.
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- */
-
-#define CID 0x4e
-
-#define BCTL 0x70
-#define BCTL_SOFTRESET (1<<15)
-#define BCTL_MIMREB (1<<6)
-#define BCTL_MODE_INDICATOR (1<<5)
-
-#define GPR 0x4a
-#define GPR_OPTI_BF (1<<6)
-#define GPR_NEPTUNE_BF (1<<4) 
-#define GPR_AUTOSENSE (1<<2)
-#define GPR_16MBPS (1<<3) 
-
-#define PAG 0x85
-#define LBC 0x8e
-
-#define LISR 0x10
-#define LISR_SUM 0x14
-#define LISR_RWM 0x18
-
-#define LISR_LIE (1<<15)
-#define LISR_SLIM (1<<13)
-#define LISR_SLI (1<<12)
-#define LISR_PCMSRMASK (1<<11)
-#define LISR_PCMSRINT (1<<10)
-#define LISR_WOLMASK (1<<9)
-#define LISR_WOL (1<<8)
-#define LISR_SRB_CMD (1<<5)
-#define LISR_ASB_REPLY (1<<4)
-#define LISR_ASB_FREE_REQ (1<<2)
-#define LISR_ARB_FREE (1<<1)
-#define LISR_TRB_FRAME (1<<0)
-
-#define SISR 0x20
-#define SISR_SUM 0x24
-#define SISR_RWM 0x28
-#define SISR_RR 0x2C
-#define SISR_RESMASK 0x30
-#define SISR_MASK 0x54
-#define SISR_MASK_SUM 0x58
-#define SISR_MASK_RWM 0x5C
-
-#define SISR_TX2_IDLE (1<<31)
-#define SISR_TX2_HALT (1<<29)
-#define SISR_TX2_EOF (1<<28)
-#define SISR_TX1_IDLE (1<<27)
-#define SISR_TX1_HALT (1<<25)
-#define SISR_TX1_EOF (1<<24)
-#define SISR_TIMEOUT (1<<23)
-#define SISR_RX_NOBUF (1<<22)
-#define SISR_RX_STATUS (1<<21)
-#define SISR_RX_HALT (1<<18)
-#define SISR_RX_EOF_EARLY (1<<16)
-#define SISR_MI (1<<15)
-#define SISR_PI (1<<13)
-#define SISR_ERR (1<<9)
-#define SISR_ADAPTER_CHECK (1<<6)
-#define SISR_SRB_REPLY (1<<5)
-#define SISR_ASB_FREE (1<<4)
-#define SISR_ARB_CMD (1<<3)
-#define SISR_TRB_REPLY (1<<2)
-
-#define EISR 0x34
-#define EISR_RWM 0x38
-#define EISR_MASK 0x3c
-#define EISR_MASK_OPTIONS 0x001FFF7F
-
-#define LAPA 0x60
-#define LAPWWO 0x64
-#define LAPWWC 0x68
-#define LAPCTL 0x6C
-#define LAIPD 0x78
-#define LAIPDDINC 0x7C
-
-#define TIMER 0x50
-
-#define CLKCTL 0x74
-#define CLKCTL_PAUSE (1<<15) 
-
-#define PM_CON 0x4
-
-#define BMCTL_SUM 0x40
-#define BMCTL_RWM 0x44
-#define BMCTL_TX2_DIS (1<<30) 
-#define BMCTL_TX1_DIS (1<<26) 
-#define BMCTL_RX_DIS (1<<22) 
-
-#define BMASR 0xcc
-
-#define RXDESCQ 0x90
-#define RXDESCQCNT 0x94
-#define RXCDA 0x98
-#define RXENQ 0x9C
-#define RXSTATQ 0xA0
-#define RXSTATQCNT 0xA4
-#define RXCSA 0xA8
-#define RXCLEN 0xAC
-#define RXHLEN 0xAE
-
-#define TXDESCQ_1 0xb0
-#define TXDESCQ_2 0xd0
-#define TXDESCQCNT_1 0xb4
-#define TXDESCQCNT_2 0xd4
-#define TXCDA_1 0xb8
-#define TXCDA_2 0xd8
-#define TXENQ_1 0xbc
-#define TXENQ_2 0xdc
-#define TXSTATQ_1 0xc0
-#define TXSTATQ_2 0xe0
-#define TXSTATQCNT_1 0xc4
-#define TXSTATQCNT_2 0xe4
-#define TXCSA_1 0xc8
-#define TXCSA_2 0xe8
-/* Cardbus */
-#define FERMASK 0xf4
-#define FERMASK_INT_BIT (1<<15)
-
-#define OLYMPIC_IO_SPACE 256
-
-#define SRB_COMMAND_SIZE 50
-
-#define OLYMPIC_MAX_ADAPTERS 8 /* 0x08 __MODULE_STRING can't hand 0xnn */
-
-/* Defines for LAN STATUS CHANGE reports */
-#define LSC_SIG_LOSS 0x8000
-#define LSC_HARD_ERR 0x4000
-#define LSC_SOFT_ERR 0x2000
-#define LSC_TRAN_BCN 0x1000
-#define LSC_LWF      0x0800
-#define LSC_ARW      0x0400
-#define LSC_FPE      0x0200
-#define LSC_RR       0x0100
-#define LSC_CO       0x0080
-#define LSC_SS       0x0040
-#define LSC_RING_REC 0x0020
-#define LSC_SR_CO    0x0010
-#define LSC_FDX_MODE 0x0004
-
-/* Defines for OPEN ADAPTER command */
-
-#define OPEN_ADAPTER_EXT_WRAP (1<<15)
-#define OPEN_ADAPTER_DIS_HARDEE (1<<14)
-#define OPEN_ADAPTER_DIS_SOFTERR (1<<13)
-#define OPEN_ADAPTER_PASS_ADC_MAC (1<<12)
-#define OPEN_ADAPTER_PASS_ATT_MAC (1<<11)
-#define OPEN_ADAPTER_ENABLE_EC (1<<10)
-#define OPEN_ADAPTER_CONTENDER (1<<8)
-#define OPEN_ADAPTER_PASS_BEACON (1<<7)
-#define OPEN_ADAPTER_ENABLE_FDX (1<<6)
-#define OPEN_ADAPTER_ENABLE_RPL (1<<5)
-#define OPEN_ADAPTER_INHIBIT_ETR (1<<4)
-#define OPEN_ADAPTER_INTERNAL_WRAP (1<<3)
-#define OPEN_ADAPTER_USE_OPTS2 (1<<0)
-
-#define OPEN_ADAPTER_2_ENABLE_ONNOW (1<<15)
-
-/* Defines for SRB Commands */
-
-#define SRB_ACCESS_REGISTER 0x1f
-#define SRB_CLOSE_ADAPTER 0x04
-#define SRB_CONFIGURE_BRIDGE 0x0c
-#define SRB_CONFIGURE_WAKEUP_EVENT 0x1a
-#define SRB_MODIFY_BRIDGE_PARMS 0x15
-#define SRB_MODIFY_OPEN_OPTIONS 0x01
-#define SRB_MODIFY_RECEIVE_OPTIONS 0x17
-#define SRB_NO_OPERATION 0x00
-#define SRB_OPEN_ADAPTER 0x03
-#define SRB_READ_LOG 0x08
-#define SRB_READ_SR_COUNTERS 0x16
-#define SRB_RESET_GROUP_ADDRESS 0x02
-#define SRB_SAVE_CONFIGURATION 0x1b
-#define SRB_SET_BRIDGE_PARMS 0x09
-#define SRB_SET_BRIDGE_TARGETS 0x10
-#define SRB_SET_FUNC_ADDRESS 0x07
-#define SRB_SET_GROUP_ADDRESS 0x06
-#define SRB_SET_GROUP_ADDR_OPTIONS 0x11
-#define SRB_UPDATE_WAKEUP_PATTERN 0x19
-
-/* Clear return code */
-
-#define OLYMPIC_CLEAR_RET_CODE 0xfe 
-
-/* ARB Commands */
-#define ARB_RECEIVE_DATA 0x81
-#define ARB_LAN_CHANGE_STATUS 0x84
-/* ASB Response commands */
-
-#define ASB_RECEIVE_DATA 0x81
-
-
-/* Olympic defaults for buffers */
-#define OLYMPIC_RX_RING_SIZE 16 /* should be a power of 2 */
-#define OLYMPIC_TX_RING_SIZE 8 /* should be a power of 2 */
-
-#define PKT_BUF_SZ 4096 /* Default packet size */
-
-/* Olympic data structures */
-
-/* xxxx These structures are all little endian in hardware. */
-
-struct olympic_tx_desc {
-       __le32 buffer;
-       __le32 status_length;
-};
-
-struct olympic_tx_status {
-       __le32 status;
-};
-
-struct olympic_rx_desc {
-       __le32 buffer;
-       __le32 res_length; 
-};
-
-struct olympic_rx_status {
-       __le32 fragmentcnt_framelen;
-       __le32 status_buffercnt;
-};
-/* xxxx END These structures are all little endian in hardware. */
-/* xxxx There may be more, but I'm pretty sure about these */
-
-struct mac_receive_buffer {
-       __le16 next ; 
-       u8 padding ; 
-       u8 frame_status ;
-       __le16 buffer_length ; 
-       u8 frame_data ; 
-};
-
-struct olympic_private {
-       
-       u16 srb;      /* be16 */
-       u16 trb;      /* be16 */
-       u16 arb;      /* be16 */
-       u16 asb;      /* be16 */
-
-       u8 __iomem *olympic_mmio;
-       u8 __iomem *olympic_lap;
-       struct pci_dev *pdev ; 
-       const char *olympic_card_name;
-
-       spinlock_t olympic_lock ; 
-
-       volatile int srb_queued;    /* True if an SRB is still posted */        
-       wait_queue_head_t srb_wait;
-
-       volatile int asb_queued;    /* True if an ASB is posted */
-
-       volatile int trb_queued;   /* True if a TRB is posted */
-       wait_queue_head_t trb_wait ; 
-
-       /* These must be on a 4 byte boundary. */
-       struct olympic_rx_desc olympic_rx_ring[OLYMPIC_RX_RING_SIZE];
-       struct olympic_tx_desc olympic_tx_ring[OLYMPIC_TX_RING_SIZE];
-       struct olympic_rx_status olympic_rx_status_ring[OLYMPIC_RX_RING_SIZE];  
-       struct olympic_tx_status olympic_tx_status_ring[OLYMPIC_TX_RING_SIZE];  
-
-       struct sk_buff *tx_ring_skb[OLYMPIC_TX_RING_SIZE], *rx_ring_skb[OLYMPIC_RX_RING_SIZE];  
-       int tx_ring_free, tx_ring_last_status, rx_ring_last_received,rx_status_last_received, free_tx_ring_entries;
-
-       u16 olympic_lan_status ;
-       u8 olympic_ring_speed ;
-       u16 pkt_buf_sz ; 
-       u8 olympic_receive_options, olympic_copy_all_options,olympic_message_level, olympic_network_monitor;  
-       u16 olympic_addr_table_addr, olympic_parms_addr ; 
-       u8 olympic_laa[6] ; 
-       u32 rx_ring_dma_addr;
-       u32 rx_status_ring_dma_addr;
-       u32 tx_ring_dma_addr;
-       u32 tx_status_ring_dma_addr;
-};
-
-struct olympic_adapter_addr_table {
-
-       u8 node_addr[6] ; 
-       u8 reserved[4] ; 
-       u8 func_addr[4] ; 
-} ; 
-
-struct olympic_parameters_table { 
-       
-       u8  phys_addr[4] ; 
-       u8  up_node_addr[6] ; 
-       u8  up_phys_addr[4] ; 
-       u8  poll_addr[6] ; 
-       u16 reserved ; 
-       u16 acc_priority ; 
-       u16 auth_source_class ; 
-       u16 att_code ; 
-       u8  source_addr[6] ; 
-       u16 beacon_type ; 
-       u16 major_vector ; 
-       u16 lan_status ; 
-       u16 soft_error_time ; 
-       u16 reserved1 ; 
-       u16 local_ring ; 
-       u16 mon_error ; 
-       u16 beacon_transmit ; 
-       u16 beacon_receive ; 
-       u16 frame_correl ; 
-       u8  beacon_naun[6] ; 
-       u32 reserved2 ; 
-       u8  beacon_phys[4] ;    
-}; 
diff --git a/drivers/net/tokenring/proteon.c b/drivers/net/tokenring/proteon.c
deleted file mode 100644 (file)
index 62d90e4..0000000
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- *  proteon.c: A network driver for Proteon ISA token ring cards.
- *
- *  Based on tmspci written 1999 by Adam Fritzler
- *  
- *  Written 2003 by Jochen Friedrich
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This driver module supports the following cards:
- *     - Proteon 1392, 1392+
- *
- *  Maintainer(s):
- *    AF        Adam Fritzler
- *    JF       Jochen Friedrich        jochen@scram.de
- *
- *  Modification History:
- *     02-Jan-03       JF      Created
- *
- */
-static const char version[] = "proteon.c: v1.00 02/01/2003 by Jochen Friedrich\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/platform_device.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/pci.h>
-#include <asm/dma.h>
-
-#include "tms380tr.h"
-
-#define PROTEON_IO_EXTENT 32
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int portlist[] __initdata = {
-       0x0A20, 0x0E20, 0x1A20, 0x1E20, 0x2A20, 0x2E20, 0x3A20, 0x3E20,// Prot.
-       0x4A20, 0x4E20, 0x5A20, 0x5E20, 0x6A20, 0x6E20, 0x7A20, 0x7E20,// Prot.
-       0x8A20, 0x8E20, 0x9A20, 0x9E20, 0xAA20, 0xAE20, 0xBA20, 0xBE20,// Prot.
-       0xCA20, 0xCE20, 0xDA20, 0xDE20, 0xEA20, 0xEE20, 0xFA20, 0xFE20,// Prot.
-       0
-};
-
-/* A zero-terminated list of IRQs to be probed. */
-static unsigned short irqlist[] = {
-       7, 6, 5, 4, 3, 12, 11, 10, 9,
-       0
-};
-
-/* A zero-terminated list of DMAs to be probed. */
-static int dmalist[] __initdata = {
-       5, 6, 7,
-       0
-};
-
-static char cardname[] = "Proteon 1392\0";
-static u64 dma_mask = ISA_MAX_ADDRESS;
-static int proteon_open(struct net_device *dev);
-static void proteon_read_eeprom(struct net_device *dev);
-static unsigned short proteon_setnselout_pins(struct net_device *dev);
-
-static unsigned short proteon_sifreadb(struct net_device *dev, unsigned short reg)
-{
-       return inb(dev->base_addr + reg);
-}
-
-static unsigned short proteon_sifreadw(struct net_device *dev, unsigned short reg)
-{
-       return inw(dev->base_addr + reg);
-}
-
-static void proteon_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outb(val, dev->base_addr + reg);
-}
-
-static void proteon_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outw(val, dev->base_addr + reg);
-}
-
-static int __init proteon_probe1(struct net_device *dev, int ioaddr)
-{
-       unsigned char chk1, chk2;
-       int i;
-
-       if (!request_region(ioaddr, PROTEON_IO_EXTENT, cardname))
-               return -ENODEV;
-               
-
-       chk1 = inb(ioaddr + 0x1f);      /* Get Proteon ID reg 1 */
-       if (chk1 != 0x1f) 
-               goto nodev;
-
-       chk1 = inb(ioaddr + 0x1e) & 0x07;       /* Get Proteon ID reg 0 */
-       for (i=0; i<16; i++) {
-               chk2 = inb(ioaddr + 0x1e) & 0x07;
-               if (((chk1 + 1) & 0x07) != chk2)
-                       goto nodev;
-               chk1 = chk2;
-       }
-
-       dev->base_addr = ioaddr;
-       return 0;
-nodev:
-       release_region(ioaddr, PROTEON_IO_EXTENT); 
-       return -ENODEV;
-}
-
-static struct net_device_ops proteon_netdev_ops __read_mostly;
-
-static int __init setup_card(struct net_device *dev, struct device *pdev)
-{
-       struct net_local *tp;
-        static int versionprinted;
-       const unsigned *port;
-       int j,err = 0;
-
-       if (!dev)
-               return -ENOMEM;
-
-       if (dev->base_addr)     /* probe specific location */
-               err = proteon_probe1(dev, dev->base_addr);
-       else {
-               for (port = portlist; *port; port++) {
-                       err = proteon_probe1(dev, *port);
-                       if (!err)
-                               break;
-               }
-       }
-       if (err)
-               goto out5;
-
-       /* At this point we have found a valid card. */
-
-       if (versionprinted++ == 0)
-               printk(KERN_DEBUG "%s", version);
-
-       err = -EIO;
-       pdev->dma_mask = &dma_mask;
-       if (tmsdev_init(dev, pdev))
-               goto out4;
-
-       dev->base_addr &= ~3; 
-               
-       proteon_read_eeprom(dev);
-
-       printk(KERN_DEBUG "proteon.c:    Ring Station Address: %pM\n",
-              dev->dev_addr);
-               
-       tp = netdev_priv(dev);
-       tp->setnselout = proteon_setnselout_pins;
-               
-       tp->sifreadb = proteon_sifreadb;
-       tp->sifreadw = proteon_sifreadw;
-       tp->sifwriteb = proteon_sifwriteb;
-       tp->sifwritew = proteon_sifwritew;
-       
-       memcpy(tp->ProductID, cardname, PROD_ID_SIZE + 1);
-
-       tp->tmspriv = NULL;
-
-       dev->netdev_ops = &proteon_netdev_ops;
-
-       if (dev->irq == 0)
-       {
-               for(j = 0; irqlist[j] != 0; j++)
-               {
-                       dev->irq = irqlist[j];
-                       if (!request_irq(dev->irq, tms380tr_interrupt, 0, 
-                               cardname, dev))
-                               break;
-                }
-               
-                if(irqlist[j] == 0)
-                {
-                        printk(KERN_INFO "proteon.c: AutoSelect no IRQ available\n");
-                       goto out3;
-               }
-       }
-       else
-       {
-               for(j = 0; irqlist[j] != 0; j++)
-                       if (irqlist[j] == dev->irq)
-                               break;
-               if (irqlist[j] == 0)
-               {
-                       printk(KERN_INFO "proteon.c: Illegal IRQ %d specified\n",
-                               dev->irq);
-                       goto out3;
-               }
-               if (request_irq(dev->irq, tms380tr_interrupt, 0, 
-                       cardname, dev))
-               {
-                        printk(KERN_INFO "proteon.c: Selected IRQ %d not available\n",
-                               dev->irq);
-                       goto out3;
-               }
-       }
-
-       if (dev->dma == 0)
-       {
-               for(j = 0; dmalist[j] != 0; j++)
-               {
-                       dev->dma = dmalist[j];
-                        if (!request_dma(dev->dma, cardname))
-                               break;
-               }
-
-               if(dmalist[j] == 0)
-               {
-                       printk(KERN_INFO "proteon.c: AutoSelect no DMA available\n");
-                       goto out2;
-               }
-       }
-       else
-       {
-               for(j = 0; dmalist[j] != 0; j++)
-                       if (dmalist[j] == dev->dma)
-                               break;
-               if (dmalist[j] == 0)
-               {
-                        printk(KERN_INFO "proteon.c: Illegal DMA %d specified\n",
-                               dev->dma);
-                       goto out2;
-               }
-               if (request_dma(dev->dma, cardname))
-               {
-                        printk(KERN_INFO "proteon.c: Selected DMA %d not available\n",
-                               dev->dma);
-                       goto out2;
-               }
-       }
-
-       err = register_netdev(dev);
-       if (err)
-               goto out;
-
-       printk(KERN_DEBUG "%s:    IO: %#4lx  IRQ: %d  DMA: %d\n",
-              dev->name, dev->base_addr, dev->irq, dev->dma);
-
-       return 0;
-out:
-       free_dma(dev->dma);
-out2:
-       free_irq(dev->irq, dev);
-out3:
-       tmsdev_term(dev);
-out4:
-       release_region(dev->base_addr, PROTEON_IO_EXTENT);
-out5:
-       return err;
-}
-
-/*
- * Reads MAC address from adapter RAM, which should've read it from
- * the onboard ROM.  
- *
- * Calling this on a board that does not support it can be a very
- * dangerous thing.  The Madge board, for instance, will lock your
- * machine hard when this is called.  Luckily, its supported in a
- * separate driver.  --ASF
- */
-static void proteon_read_eeprom(struct net_device *dev)
-{
-       int i;
-       
-       /* Address: 0000:0000 */
-       proteon_sifwritew(dev, 0, SIFADX);
-       proteon_sifwritew(dev, 0, SIFADR);      
-       
-       /* Read six byte MAC address data */
-       dev->addr_len = 6;
-       for(i = 0; i < 6; i++)
-               dev->dev_addr[i] = proteon_sifreadw(dev, SIFINC) >> 8;
-}
-
-static unsigned short proteon_setnselout_pins(struct net_device *dev)
-{
-       return 0;
-}
-
-static int proteon_open(struct net_device *dev)
-{  
-       struct net_local *tp = netdev_priv(dev);
-       unsigned short val = 0;
-       int i;
-
-       /* Proteon reset sequence */
-       outb(0, dev->base_addr + 0x11);
-       mdelay(20);
-       outb(0x04, dev->base_addr + 0x11);
-       mdelay(20);
-       outb(0, dev->base_addr + 0x11);
-       mdelay(100);
-
-       /* set control/status reg */
-       val = inb(dev->base_addr + 0x11);
-       val |= 0x78;
-       val &= 0xf9;
-       if(tp->DataRate == SPEED_4)
-               val |= 0x20;
-       else
-               val &= ~0x20;
-
-       outb(val, dev->base_addr + 0x11);
-       outb(0xff, dev->base_addr + 0x12);
-       for(i = 0; irqlist[i] != 0; i++)
-       {
-               if(irqlist[i] == dev->irq)
-                       break;
-       }
-       val = i;
-       i = (7 - dev->dma) << 4;
-       val |= i;
-       outb(val, dev->base_addr + 0x13);
-
-       return tms380tr_open(dev);
-}
-
-#define ISATR_MAX_ADAPTERS 3
-
-static int io[ISATR_MAX_ADAPTERS];
-static int irq[ISATR_MAX_ADAPTERS];
-static int dma[ISATR_MAX_ADAPTERS];
-
-MODULE_LICENSE("GPL");
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(dma, int, NULL, 0);
-
-static struct platform_device *proteon_dev[ISATR_MAX_ADAPTERS];
-
-static struct platform_driver proteon_driver = {
-       .driver         = {
-               .name   = "proteon",
-       },
-};
-
-static int __init proteon_init(void)
-{
-       struct net_device *dev;
-       struct platform_device *pdev;
-       int i, num = 0, err = 0;
-
-       proteon_netdev_ops = tms380tr_netdev_ops;
-       proteon_netdev_ops.ndo_open = proteon_open;
-       proteon_netdev_ops.ndo_stop = tms380tr_close;
-
-       err = platform_driver_register(&proteon_driver);
-       if (err)
-               return err;
-
-       for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-               dev = alloc_trdev(sizeof(struct net_local));
-               if (!dev)
-                       continue;
-
-               dev->base_addr = io[i];
-               dev->irq = irq[i];
-               dev->dma = dma[i];
-               pdev = platform_device_register_simple("proteon",
-                       i, NULL, 0);
-               if (IS_ERR(pdev)) {
-                       free_netdev(dev);
-                       continue;
-               }
-               err = setup_card(dev, &pdev->dev);
-               if (!err) {
-                       proteon_dev[i] = pdev;
-                       platform_set_drvdata(pdev, dev);
-                       ++num;
-               } else {
-                       platform_device_unregister(pdev);
-                       free_netdev(dev);
-               }
-       }
-
-       printk(KERN_NOTICE "proteon.c: %d cards found.\n", num);
-       /* Probe for cards. */
-       if (num == 0) {
-               printk(KERN_NOTICE "proteon.c: No cards found.\n");
-               platform_driver_unregister(&proteon_driver);
-               return -ENODEV;
-       }
-       return 0;
-}
-
-static void __exit proteon_cleanup(void)
-{
-       struct net_device *dev;
-       int i;
-
-       for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-               struct platform_device *pdev = proteon_dev[i];
-               
-               if (!pdev)
-                       continue;
-               dev = platform_get_drvdata(pdev);
-               unregister_netdev(dev);
-               release_region(dev->base_addr, PROTEON_IO_EXTENT);
-               free_irq(dev->irq, dev);
-               free_dma(dev->dma);
-               tmsdev_term(dev);
-               free_netdev(dev);
-               platform_set_drvdata(pdev, NULL);
-               platform_device_unregister(pdev);
-       }
-       platform_driver_unregister(&proteon_driver);
-}
-
-module_init(proteon_init);
-module_exit(proteon_cleanup);
diff --git a/drivers/net/tokenring/skisa.c b/drivers/net/tokenring/skisa.c
deleted file mode 100644 (file)
index ee11e93..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- *  skisa.c: A network driver for SK-NET TMS380-based ISA token ring cards.
- *
- *  Based on tmspci written 1999 by Adam Fritzler
- *  
- *  Written 2000 by Jochen Friedrich
- *  Dedicated to my girlfriend Steffi Bopp
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This driver module supports the following cards:
- *     - SysKonnect TR4/16(+) ISA      (SK-4190)
- *
- *  Maintainer(s):
- *    AF        Adam Fritzler
- *    JF       Jochen Friedrich        jochen@scram.de
- *
- *  Modification History:
- *     14-Jan-01       JF      Created
- *     28-Oct-02       JF      Fixed probe of card for static compilation.
- *                             Fixed module init to not make hotplug go wild.
- *     09-Nov-02       JF      Fixed early bail out on out of memory
- *                             situations if multiple cards are found.
- *                             Cleaned up some unnecessary console SPAM.
- *     09-Dec-02       JF      Fixed module reference counting.
- *     02-Jan-03       JF      Renamed to skisa.c
- *
- */
-static const char version[] = "skisa.c: v1.03 09/12/2002 by Jochen Friedrich\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/platform_device.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/pci.h>
-#include <asm/dma.h>
-
-#include "tms380tr.h"
-
-#define SK_ISA_IO_EXTENT 32
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int portlist[] __initdata = {
-       0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900,// SK
-       0
-};
-
-/* A zero-terminated list of IRQs to be probed. 
- * Used again after initial probe for sktr_chipset_init, called from sktr_open.
- */
-static const unsigned short irqlist[] = {
-       3, 5, 9, 10, 11, 12, 15,
-       0
-};
-
-/* A zero-terminated list of DMAs to be probed. */
-static int dmalist[] __initdata = {
-       5, 6, 7,
-       0
-};
-
-static char isa_cardname[] = "SK NET TR 4/16 ISA\0";
-static u64 dma_mask = ISA_MAX_ADDRESS;
-static int sk_isa_open(struct net_device *dev);
-static void sk_isa_read_eeprom(struct net_device *dev);
-static unsigned short sk_isa_setnselout_pins(struct net_device *dev);
-
-static unsigned short sk_isa_sifreadb(struct net_device *dev, unsigned short reg)
-{
-       return inb(dev->base_addr + reg);
-}
-
-static unsigned short sk_isa_sifreadw(struct net_device *dev, unsigned short reg)
-{
-       return inw(dev->base_addr + reg);
-}
-
-static void sk_isa_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outb(val, dev->base_addr + reg);
-}
-
-static void sk_isa_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outw(val, dev->base_addr + reg);
-}
-
-
-static int __init sk_isa_probe1(struct net_device *dev, int ioaddr)
-{
-       unsigned char old, chk1, chk2;
-
-       if (!request_region(ioaddr, SK_ISA_IO_EXTENT, isa_cardname))
-               return -ENODEV;
-
-       old = inb(ioaddr + SIFADR);     /* Get the old SIFADR value */
-
-       chk1 = 0;       /* Begin with check value 0 */
-       do {
-               /* Write new SIFADR value */
-               outb(chk1, ioaddr + SIFADR);
-
-               /* Read, invert and write */
-               chk2 = inb(ioaddr + SIFADD);
-               chk2 ^= 0x0FE;
-               outb(chk2, ioaddr + SIFADR);
-
-               /* Read, invert and compare */
-               chk2 = inb(ioaddr + SIFADD);
-               chk2 ^= 0x0FE;
-
-               if(chk1 != chk2) {
-                       release_region(ioaddr, SK_ISA_IO_EXTENT);
-                       return -ENODEV;
-               }
-
-               chk1 -= 2;
-       } while(chk1 != 0);     /* Repeat 128 times (all byte values) */
-
-       /* Restore the SIFADR value */
-       outb(old, ioaddr + SIFADR);
-
-       dev->base_addr = ioaddr;
-       return 0;
-}
-
-static struct net_device_ops sk_isa_netdev_ops __read_mostly;
-
-static int __init setup_card(struct net_device *dev, struct device *pdev)
-{
-       struct net_local *tp;
-        static int versionprinted;
-       const unsigned *port;
-       int j, err = 0;
-
-       if (!dev)
-               return -ENOMEM;
-
-       if (dev->base_addr)     /* probe specific location */
-               err = sk_isa_probe1(dev, dev->base_addr);
-       else {
-               for (port = portlist; *port; port++) {
-                       err = sk_isa_probe1(dev, *port);
-                       if (!err)
-                               break;
-               }
-       }
-       if (err)
-               goto out5;
-
-       /* At this point we have found a valid card. */
-
-       if (versionprinted++ == 0)
-               printk(KERN_DEBUG "%s", version);
-
-       err = -EIO;
-       pdev->dma_mask = &dma_mask;
-       if (tmsdev_init(dev, pdev))
-               goto out4;
-
-       dev->base_addr &= ~3; 
-               
-       sk_isa_read_eeprom(dev);
-
-       printk(KERN_DEBUG "skisa.c:    Ring Station Address: %pM\n",
-              dev->dev_addr);
-               
-       tp = netdev_priv(dev);
-       tp->setnselout = sk_isa_setnselout_pins;
-               
-       tp->sifreadb = sk_isa_sifreadb;
-       tp->sifreadw = sk_isa_sifreadw;
-       tp->sifwriteb = sk_isa_sifwriteb;
-       tp->sifwritew = sk_isa_sifwritew;
-       
-       memcpy(tp->ProductID, isa_cardname, PROD_ID_SIZE + 1);
-
-       tp->tmspriv = NULL;
-
-       dev->netdev_ops = &sk_isa_netdev_ops;
-
-       if (dev->irq == 0)
-       {
-               for(j = 0; irqlist[j] != 0; j++)
-               {
-                       dev->irq = irqlist[j];
-                       if (!request_irq(dev->irq, tms380tr_interrupt, 0, 
-                               isa_cardname, dev))
-                               break;
-                }
-               
-                if(irqlist[j] == 0)
-                {
-                        printk(KERN_INFO "skisa.c: AutoSelect no IRQ available\n");
-                       goto out3;
-               }
-       }
-       else
-       {
-               for(j = 0; irqlist[j] != 0; j++)
-                       if (irqlist[j] == dev->irq)
-                               break;
-               if (irqlist[j] == 0)
-               {
-                       printk(KERN_INFO "skisa.c: Illegal IRQ %d specified\n",
-                               dev->irq);
-                       goto out3;
-               }
-               if (request_irq(dev->irq, tms380tr_interrupt, 0, 
-                       isa_cardname, dev))
-               {
-                        printk(KERN_INFO "skisa.c: Selected IRQ %d not available\n",
-                               dev->irq);
-                       goto out3;
-               }
-       }
-
-       if (dev->dma == 0)
-       {
-               for(j = 0; dmalist[j] != 0; j++)
-               {
-                       dev->dma = dmalist[j];
-                        if (!request_dma(dev->dma, isa_cardname))
-                               break;
-               }
-
-               if(dmalist[j] == 0)
-               {
-                       printk(KERN_INFO "skisa.c: AutoSelect no DMA available\n");
-                       goto out2;
-               }
-       }
-       else
-       {
-               for(j = 0; dmalist[j] != 0; j++)
-                       if (dmalist[j] == dev->dma)
-                               break;
-               if (dmalist[j] == 0)
-               {
-                        printk(KERN_INFO "skisa.c: Illegal DMA %d specified\n",
-                               dev->dma);
-                       goto out2;
-               }
-               if (request_dma(dev->dma, isa_cardname))
-               {
-                        printk(KERN_INFO "skisa.c: Selected DMA %d not available\n",
-                               dev->dma);
-                       goto out2;
-               }
-       }
-
-       err = register_netdev(dev);
-       if (err)
-               goto out;
-
-       printk(KERN_DEBUG "%s:    IO: %#4lx  IRQ: %d  DMA: %d\n",
-              dev->name, dev->base_addr, dev->irq, dev->dma);
-
-       return 0;
-out:
-       free_dma(dev->dma);
-out2:
-       free_irq(dev->irq, dev);
-out3:
-       tmsdev_term(dev);
-out4:
-       release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-out5:
-       return err;
-}
-
-/*
- * Reads MAC address from adapter RAM, which should've read it from
- * the onboard ROM.  
- *
- * Calling this on a board that does not support it can be a very
- * dangerous thing.  The Madge board, for instance, will lock your
- * machine hard when this is called.  Luckily, its supported in a
- * separate driver.  --ASF
- */
-static void sk_isa_read_eeprom(struct net_device *dev)
-{
-       int i;
-       
-       /* Address: 0000:0000 */
-       sk_isa_sifwritew(dev, 0, SIFADX);
-       sk_isa_sifwritew(dev, 0, SIFADR);       
-       
-       /* Read six byte MAC address data */
-       dev->addr_len = 6;
-       for(i = 0; i < 6; i++)
-               dev->dev_addr[i] = sk_isa_sifreadw(dev, SIFINC) >> 8;
-}
-
-static unsigned short sk_isa_setnselout_pins(struct net_device *dev)
-{
-       return 0;
-}
-
-static int sk_isa_open(struct net_device *dev)
-{  
-       struct net_local *tp = netdev_priv(dev);
-       unsigned short val = 0;
-       unsigned short oldval;
-       int i;
-
-       val = 0;
-       for(i = 0; irqlist[i] != 0; i++)
-       {
-               if(irqlist[i] == dev->irq)
-                       break;
-       }
-
-       val |= CYCLE_TIME << 2;
-       val |= i << 4;
-       i = dev->dma - 5;
-       val |= i;
-       if(tp->DataRate == SPEED_4)
-               val |= LINE_SPEED_BIT;
-       else
-               val &= ~LINE_SPEED_BIT;
-       oldval = sk_isa_sifreadb(dev, POSREG);
-       /* Leave cycle bits alone */
-       oldval |= 0xf3;
-       val &= oldval;
-       sk_isa_sifwriteb(dev, val, POSREG);
-
-       return tms380tr_open(dev);
-}
-
-#define ISATR_MAX_ADAPTERS 3
-
-static int io[ISATR_MAX_ADAPTERS];
-static int irq[ISATR_MAX_ADAPTERS];
-static int dma[ISATR_MAX_ADAPTERS];
-
-MODULE_LICENSE("GPL");
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(dma, int, NULL, 0);
-
-static struct platform_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
-
-static struct platform_driver sk_isa_driver = {
-       .driver         = {
-               .name   = "skisa",
-       },
-};
-
-static int __init sk_isa_init(void)
-{
-       struct net_device *dev;
-       struct platform_device *pdev;
-       int i, num = 0, err = 0;
-
-       sk_isa_netdev_ops = tms380tr_netdev_ops;
-       sk_isa_netdev_ops.ndo_open = sk_isa_open;
-       sk_isa_netdev_ops.ndo_stop = tms380tr_close;
-
-       err = platform_driver_register(&sk_isa_driver);
-       if (err)
-               return err;
-
-       for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-               dev = alloc_trdev(sizeof(struct net_local));
-               if (!dev)
-                       continue;
-
-               dev->base_addr = io[i];
-               dev->irq = irq[i];
-               dev->dma = dma[i];
-               pdev = platform_device_register_simple("skisa",
-                       i, NULL, 0);
-               if (IS_ERR(pdev)) {
-                       free_netdev(dev);
-                       continue;
-               }
-               err = setup_card(dev, &pdev->dev);
-               if (!err) {
-                       sk_isa_dev[i] = pdev;
-                       platform_set_drvdata(sk_isa_dev[i], dev);
-                       ++num;
-               } else {
-                       platform_device_unregister(pdev);
-                       free_netdev(dev);
-               }
-       }
-
-       printk(KERN_NOTICE "skisa.c: %d cards found.\n", num);
-       /* Probe for cards. */
-       if (num == 0) {
-               printk(KERN_NOTICE "skisa.c: No cards found.\n");
-               platform_driver_unregister(&sk_isa_driver);
-               return -ENODEV;
-       }
-       return 0;
-}
-
-static void __exit sk_isa_cleanup(void)
-{
-       struct net_device *dev;
-       int i;
-
-       for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-               struct platform_device *pdev = sk_isa_dev[i];
-
-               if (!pdev)
-                       continue;
-               dev = platform_get_drvdata(pdev);
-               unregister_netdev(dev);
-               release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-               free_irq(dev->irq, dev);
-               free_dma(dev->dma);
-               tmsdev_term(dev);
-               free_netdev(dev);
-               platform_set_drvdata(pdev, NULL);
-               platform_device_unregister(pdev);
-       }
-       platform_driver_unregister(&sk_isa_driver);
-}
-
-module_init(sk_isa_init);
-module_exit(sk_isa_cleanup);
diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c
deleted file mode 100644 (file)
index cb35fb7..0000000
+++ /dev/null
@@ -1,5717 +0,0 @@
-/*
- *  smctr.c: A network driver for the SMC Token Ring Adapters.
- *
- *  Written by Jay Schulist <jschlst@samba.org>
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This device driver works with the following SMC adapters:
- *      - SMC TokenCard Elite   (8115T, chips 825/584)
- *      - SMC TokenCard Elite/A MCA (8115T/A, chips 825/594)
- *
- *  Source(s):
- *     - SMC TokenCard SDK.
- *
- *  Maintainer(s):
- *    JS        Jay Schulist <jschlst@samba.org>
- *
- * Changes:
- *    07102000          JS      Fixed a timing problem in smctr_wait_cmd();
- *                              Also added a bit more discriptive error msgs.
- *    07122000          JS      Fixed problem with detecting a card with
- *                             module io/irq/mem specified.
- *
- *  To do:
- *    1. Multicast support.
- *
- *  Initial 2.5 cleanup Alan Cox <alan@lxorguk.ukuu.org.uk>  2002/10/28
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/time.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/mca-legacy.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/trdevice.h>
-#include <linux/bitops.h>
-#include <linux/firmware.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/irq.h>
-
-#if BITS_PER_LONG == 64
-#error FIXME: driver does not support 64-bit platforms
-#endif
-
-#include "smctr.h"               /* Our Stuff */
-
-static const char version[] __initdata =
-       KERN_INFO "smctr.c: v1.4 7/12/00 by jschlst@samba.org\n";
-static const char cardname[] = "smctr";
-
-
-#define SMCTR_IO_EXTENT   20
-
-#ifdef CONFIG_MCA_LEGACY
-static unsigned int smctr_posid = 0x6ec6;
-#endif
-
-static int ringspeed;
-
-/* SMC Name of the Adapter. */
-static char smctr_name[] = "SMC TokenCard";
-static char *smctr_model = "Unknown";
-
-/* Use 0 for production, 1 for verification, 2 for debug, and
- * 3 for very verbose debug.
- */
-#ifndef SMCTR_DEBUG
-#define SMCTR_DEBUG 1
-#endif
-static unsigned int smctr_debug = SMCTR_DEBUG;
-
-/* smctr.c prototypes and functions are arranged alphabeticly 
- * for clearity, maintainability and pure old fashion fun. 
- */
-/* A */
-static int smctr_alloc_shared_memory(struct net_device *dev);
-
-/* B */
-static int smctr_bypass_state(struct net_device *dev);
-
-/* C */
-static int smctr_checksum_firmware(struct net_device *dev);
-static int __init smctr_chk_isa(struct net_device *dev);
-static int smctr_chg_rx_mask(struct net_device *dev);
-static int smctr_clear_int(struct net_device *dev);
-static int smctr_clear_trc_reset(int ioaddr);
-static int smctr_close(struct net_device *dev);
-
-/* D */
-static int smctr_decode_firmware(struct net_device *dev,
-                                const struct firmware *fw);
-static int smctr_disable_16bit(struct net_device *dev);
-static int smctr_disable_adapter_ctrl_store(struct net_device *dev);
-static int smctr_disable_bic_int(struct net_device *dev);
-
-/* E */
-static int smctr_enable_16bit(struct net_device *dev);
-static int smctr_enable_adapter_ctrl_store(struct net_device *dev);
-static int smctr_enable_adapter_ram(struct net_device *dev);
-static int smctr_enable_bic_int(struct net_device *dev);
-
-/* G */
-static int __init smctr_get_boardid(struct net_device *dev, int mca);
-static int smctr_get_group_address(struct net_device *dev);
-static int smctr_get_functional_address(struct net_device *dev);
-static unsigned int smctr_get_num_rx_bdbs(struct net_device *dev);
-static int smctr_get_physical_drop_number(struct net_device *dev);
-static __u8 *smctr_get_rx_pointer(struct net_device *dev, short queue);
-static int smctr_get_station_id(struct net_device *dev);
-static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue,
-        __u16 bytes_count);
-static int smctr_get_upstream_neighbor_addr(struct net_device *dev);
-
-/* H */
-static int smctr_hardware_send_packet(struct net_device *dev,
-        struct net_local *tp);
-/* I */
-static int smctr_init_acbs(struct net_device *dev);
-static int smctr_init_adapter(struct net_device *dev);
-static int smctr_init_card_real(struct net_device *dev);
-static int smctr_init_rx_bdbs(struct net_device *dev);
-static int smctr_init_rx_fcbs(struct net_device *dev);
-static int smctr_init_shared_memory(struct net_device *dev);
-static int smctr_init_tx_bdbs(struct net_device *dev);
-static int smctr_init_tx_fcbs(struct net_device *dev);
-static int smctr_internal_self_test(struct net_device *dev);
-static irqreturn_t smctr_interrupt(int irq, void *dev_id);
-static int smctr_issue_enable_int_cmd(struct net_device *dev,
-        __u16 interrupt_enable_mask);
-static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code,
-        __u16 ibits);
-static int smctr_issue_init_timers_cmd(struct net_device *dev);
-static int smctr_issue_init_txrx_cmd(struct net_device *dev);
-static int smctr_issue_insert_cmd(struct net_device *dev);
-static int smctr_issue_read_ring_status_cmd(struct net_device *dev);
-static int smctr_issue_read_word_cmd(struct net_device *dev, __u16 aword_cnt);
-static int smctr_issue_remove_cmd(struct net_device *dev);
-static int smctr_issue_resume_acb_cmd(struct net_device *dev);
-static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue);
-static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue);
-static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue);
-static int smctr_issue_test_internal_rom_cmd(struct net_device *dev);
-static int smctr_issue_test_hic_cmd(struct net_device *dev);
-static int smctr_issue_test_mac_reg_cmd(struct net_device *dev);
-static int smctr_issue_trc_loopback_cmd(struct net_device *dev);
-static int smctr_issue_tri_loopback_cmd(struct net_device *dev);
-static int smctr_issue_write_byte_cmd(struct net_device *dev,
-        short aword_cnt, void *byte);
-static int smctr_issue_write_word_cmd(struct net_device *dev,
-        short aword_cnt, void *word);
-
-/* J */
-static int smctr_join_complete_state(struct net_device *dev);
-
-/* L */
-static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev);
-static int smctr_load_firmware(struct net_device *dev);
-static int smctr_load_node_addr(struct net_device *dev);
-static int smctr_lobe_media_test(struct net_device *dev);
-static int smctr_lobe_media_test_cmd(struct net_device *dev);
-static int smctr_lobe_media_test_state(struct net_device *dev);
-
-/* M */
-static int smctr_make_8025_hdr(struct net_device *dev,
-        MAC_HEADER *rmf, MAC_HEADER *tmf, __u16 ac_fc);
-static int smctr_make_access_pri(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_addr_mod(struct net_device *dev, MAC_SUB_VECTOR *tsv);
-static int smctr_make_auth_funct_class(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_corr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv, __u16 correlator);
-static int smctr_make_funct_addr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_group_addr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_phy_drop_num(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_product_id(struct net_device *dev, MAC_SUB_VECTOR *tsv);
-static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv);
-static int smctr_make_ring_station_status(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_ring_station_version(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_tx_status_code(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv, __u16 tx_fstatus);
-static int smctr_make_upstream_neighbor_addr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-static int smctr_make_wrap_data(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv);
-
-/* O */
-static int smctr_open(struct net_device *dev);
-static int smctr_open_tr(struct net_device *dev);
-
-/* P */
-struct net_device *smctr_probe(int unit);
-static int __init smctr_probe1(struct net_device *dev, int ioaddr);
-static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
-        struct net_device *dev, __u16 rx_status);
-
-/* R */
-static int smctr_ram_memory_test(struct net_device *dev);
-static int smctr_rcv_chg_param(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator);
-static int smctr_rcv_init(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator);
-static int smctr_rcv_tx_forward(struct net_device *dev, MAC_HEADER *rmf);
-static int smctr_rcv_rq_addr_state_attch(struct net_device *dev,
-        MAC_HEADER *rmf, __u16 *correlator);
-static int smctr_rcv_unknown(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator);
-static int smctr_reset_adapter(struct net_device *dev);
-static int smctr_restart_tx_chain(struct net_device *dev, short queue);
-static int smctr_ring_status_chg(struct net_device *dev);
-static int smctr_rx_frame(struct net_device *dev);
-
-/* S */
-static int smctr_send_dat(struct net_device *dev);
-static netdev_tx_t smctr_send_packet(struct sk_buff *skb,
-                                          struct net_device *dev);
-static int smctr_send_lobe_media_test(struct net_device *dev);
-static int smctr_send_rpt_addr(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator);
-static int smctr_send_rpt_attch(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator);
-static int smctr_send_rpt_state(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator);
-static int smctr_send_rpt_tx_forward(struct net_device *dev,
-        MAC_HEADER *rmf, __u16 tx_fstatus);
-static int smctr_send_rsp(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 rcode, __u16 correlator);
-static int smctr_send_rq_init(struct net_device *dev);
-static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *tx_fstatus);
-static int smctr_set_auth_access_pri(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv);
-static int smctr_set_auth_funct_class(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv);
-static int smctr_set_corr(struct net_device *dev, MAC_SUB_VECTOR *rsv,
-       __u16 *correlator);
-static int smctr_set_error_timer_value(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv);
-static int smctr_set_frame_forward(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv, __u8 dc_sc);
-static int smctr_set_local_ring_num(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv);
-static unsigned short smctr_set_ctrl_attention(struct net_device *dev);
-static void smctr_set_multicast_list(struct net_device *dev);
-static int smctr_set_page(struct net_device *dev, __u8 *buf);
-static int smctr_set_phy_drop(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv);
-static int smctr_set_ring_speed(struct net_device *dev);
-static int smctr_set_rx_look_ahead(struct net_device *dev);
-static int smctr_set_trc_reset(int ioaddr);
-static int smctr_setup_single_cmd(struct net_device *dev,
-        __u16 command, __u16 subcommand);
-static int smctr_setup_single_cmd_w_data(struct net_device *dev,
-        __u16 command, __u16 subcommand);
-static char *smctr_malloc(struct net_device *dev, __u16 size);
-static int smctr_status_chg(struct net_device *dev);
-
-/* T */
-static void smctr_timeout(struct net_device *dev);
-static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
-        __u16 queue);
-static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue);
-static unsigned short smctr_tx_move_frame(struct net_device *dev,
-        struct sk_buff *skb, __u8 *pbuff, unsigned int bytes);
-
-/* U */
-static int smctr_update_err_stats(struct net_device *dev);
-static int smctr_update_rx_chain(struct net_device *dev, __u16 queue);
-static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
-        __u16 queue);
-
-/* W */
-static int smctr_wait_cmd(struct net_device *dev);
-static int smctr_wait_while_cbusy(struct net_device *dev);
-
-#define TO_256_BYTE_BOUNDRY(X)  (((X + 0xff) & 0xff00) - X)
-#define TO_PARAGRAPH_BOUNDRY(X) (((X + 0x0f) & 0xfff0) - X)
-#define PARAGRAPH_BOUNDRY(X)    smctr_malloc(dev, TO_PARAGRAPH_BOUNDRY(X))
-
-/* Allocate Adapter Shared Memory.
- * IMPORTANT NOTE: Any changes to this function MUST be mirrored in the
- * function "get_num_rx_bdbs" below!!!
- *
- * Order of memory allocation:
- *
- *       0. Initial System Configuration Block Pointer
- *       1. System Configuration Block
- *       2. System Control Block
- *       3. Action Command Block
- *       4. Interrupt Status Block
- *
- *       5. MAC TX FCB'S
- *       6. NON-MAC TX FCB'S
- *       7. MAC TX BDB'S
- *       8. NON-MAC TX BDB'S
- *       9. MAC RX FCB'S
- *      10. NON-MAC RX FCB'S
- *      11. MAC RX BDB'S
- *      12. NON-MAC RX BDB'S
- *      13. MAC TX Data Buffer( 1, 256 byte buffer)
- *      14. MAC RX Data Buffer( 1, 256 byte buffer)
- *
- *      15. NON-MAC TX Data Buffer
- *      16. NON-MAC RX Data Buffer
- */
-static int smctr_alloc_shared_memory(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_alloc_shared_memory\n", dev->name);
-
-        /* Allocate initial System Control Block pointer.
-         * This pointer is located in the last page, last offset - 4.
-         */
-        tp->iscpb_ptr = (ISCPBlock *)(tp->ram_access + ((__u32)64 * 0x400)
-                - (long)ISCP_BLOCK_SIZE);
-
-        /* Allocate System Control Blocks. */
-        tp->scgb_ptr = (SCGBlock *)smctr_malloc(dev, sizeof(SCGBlock));
-        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
-
-        tp->sclb_ptr = (SCLBlock *)smctr_malloc(dev, sizeof(SCLBlock));
-        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
-
-        tp->acb_head = (ACBlock *)smctr_malloc(dev,
-                sizeof(ACBlock)*tp->num_acbs);
-        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
-
-        tp->isb_ptr = (ISBlock *)smctr_malloc(dev, sizeof(ISBlock));
-        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
-
-        tp->misc_command_data = (__u16 *)smctr_malloc(dev, MISC_DATA_SIZE);
-        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
-
-        /* Allocate transmit FCBs. */
-        tp->tx_fcb_head[MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
-                sizeof(FCBlock) * tp->num_tx_fcbs[MAC_QUEUE]);
-
-        tp->tx_fcb_head[NON_MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
-                sizeof(FCBlock) * tp->num_tx_fcbs[NON_MAC_QUEUE]);
-
-        tp->tx_fcb_head[BUG_QUEUE] = (FCBlock *)smctr_malloc(dev,
-                sizeof(FCBlock) * tp->num_tx_fcbs[BUG_QUEUE]);
-
-        /* Allocate transmit BDBs. */
-        tp->tx_bdb_head[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
-                sizeof(BDBlock) * tp->num_tx_bdbs[MAC_QUEUE]);
-
-        tp->tx_bdb_head[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
-                sizeof(BDBlock) * tp->num_tx_bdbs[NON_MAC_QUEUE]);
-
-        tp->tx_bdb_head[BUG_QUEUE] = (BDBlock *)smctr_malloc(dev,
-                sizeof(BDBlock) * tp->num_tx_bdbs[BUG_QUEUE]);
-
-        /* Allocate receive FCBs. */
-        tp->rx_fcb_head[MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
-                sizeof(FCBlock) * tp->num_rx_fcbs[MAC_QUEUE]);
-
-        tp->rx_fcb_head[NON_MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
-                sizeof(FCBlock) * tp->num_rx_fcbs[NON_MAC_QUEUE]);
-
-        /* Allocate receive BDBs. */
-        tp->rx_bdb_head[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
-                sizeof(BDBlock) * tp->num_rx_bdbs[MAC_QUEUE]);
-
-        tp->rx_bdb_end[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev, 0);
-
-        tp->rx_bdb_head[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
-                sizeof(BDBlock) * tp->num_rx_bdbs[NON_MAC_QUEUE]);
-
-        tp->rx_bdb_end[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev, 0);
-
-        /* Allocate MAC transmit buffers.
-         * MAC Tx Buffers doen't have to be on an ODD Boundary.
-         */
-        tp->tx_buff_head[MAC_QUEUE]
-                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[MAC_QUEUE]);
-        tp->tx_buff_curr[MAC_QUEUE] = tp->tx_buff_head[MAC_QUEUE];
-        tp->tx_buff_end [MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
-
-        /* Allocate BUG transmit buffers. */
-        tp->tx_buff_head[BUG_QUEUE]
-                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[BUG_QUEUE]);
-        tp->tx_buff_curr[BUG_QUEUE] = tp->tx_buff_head[BUG_QUEUE];
-        tp->tx_buff_end[BUG_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
-
-        /* Allocate MAC receive data buffers.
-         * MAC Rx buffer doesn't have to be on a 256 byte boundary.
-         */
-        tp->rx_buff_head[MAC_QUEUE] = (__u16 *)smctr_malloc(dev,
-                RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[MAC_QUEUE]);
-        tp->rx_buff_end[MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
-
-        /* Allocate Non-MAC transmit buffers.
-         * ?? For maximum Netware performance, put Tx Buffers on
-         * ODD Boundary and then restore malloc to Even Boundrys.
-         */
-        smctr_malloc(dev, 1L);
-        tp->tx_buff_head[NON_MAC_QUEUE]
-                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[NON_MAC_QUEUE]);
-        tp->tx_buff_curr[NON_MAC_QUEUE] = tp->tx_buff_head[NON_MAC_QUEUE];
-        tp->tx_buff_end [NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
-        smctr_malloc(dev, 1L);
-
-        /* Allocate Non-MAC receive data buffers.
-         * To guarantee a minimum of 256 contiguous memory to
-         * UM_Receive_Packet's lookahead pointer, before a page
-         * change or ring end is encountered, place each rx buffer on
-         * a 256 byte boundary.
-         */
-        smctr_malloc(dev, TO_256_BYTE_BOUNDRY(tp->sh_mem_used));
-        tp->rx_buff_head[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev,
-                RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[NON_MAC_QUEUE]);
-        tp->rx_buff_end[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
-
-        return 0;
-}
-
-/* Enter Bypass state. */
-static int smctr_bypass_state(struct net_device *dev)
-{
-        int err;
-
-       if(smctr_debug > 10)
-               printk(KERN_DEBUG "%s: smctr_bypass_state\n", dev->name);
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_BYPASS_STATE);
-
-        return err;
-}
-
-static int smctr_checksum_firmware(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u16 i, checksum = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_checksum_firmware\n", dev->name);
-
-        smctr_enable_adapter_ctrl_store(dev);
-
-        for(i = 0; i < CS_RAM_SIZE; i += 2)
-                checksum += *((__u16 *)(tp->ram_access + i));
-
-        tp->microcode_version = *(__u16 *)(tp->ram_access
-                + CS_RAM_VERSION_OFFSET);
-        tp->microcode_version >>= 8;
-
-        smctr_disable_adapter_ctrl_store(dev);
-
-        if(checksum)
-                return checksum;
-
-        return 0;
-}
-
-static int __init smctr_chk_mca(struct net_device *dev)
-{
-#ifdef CONFIG_MCA_LEGACY
-       struct net_local *tp = netdev_priv(dev);
-       int current_slot;
-       __u8 r1, r2, r3, r4, r5;
-
-       current_slot = mca_find_unused_adapter(smctr_posid, 0);
-       if(current_slot == MCA_NOTFOUND)
-               return -ENODEV;
-
-       mca_set_adapter_name(current_slot, smctr_name);
-       mca_mark_as_used(current_slot);
-       tp->slot_num = current_slot;
-
-       r1 = mca_read_stored_pos(tp->slot_num, 2);
-       r2 = mca_read_stored_pos(tp->slot_num, 3);
-
-       if(tp->slot_num)
-               outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num - 1) | CNFG_SLOT_ENABLE_BIT));
-       else
-               outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num) | CNFG_SLOT_ENABLE_BIT));
-
-       r1 = inb(CNFG_POS_REG1);
-       r2 = inb(CNFG_POS_REG0);
-
-       tp->bic_type = BIC_594_CHIP;
-
-       /* IO */
-       r2 = mca_read_stored_pos(tp->slot_num, 2);
-       r2 &= 0xF0;
-       dev->base_addr = ((__u16)r2 << 8) + (__u16)0x800;
-       request_region(dev->base_addr, SMCTR_IO_EXTENT, smctr_name);
-
-       /* IRQ */
-       r5 = mca_read_stored_pos(tp->slot_num, 5);
-       r5 &= 0xC;
-        switch(r5)
-       {
-               case 0:
-                       dev->irq = 3;
-                               break;
-
-               case 0x4:
-                       dev->irq = 4;
-                               break;
-
-               case 0x8:
-                       dev->irq = 10;
-                               break;
-
-               default:
-                       dev->irq = 15;
-                               break;
-       }
-       if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) {
-               release_region(dev->base_addr, SMCTR_IO_EXTENT);
-               return -ENODEV;
-       }
-
-       /* Get RAM base */
-       r3 = mca_read_stored_pos(tp->slot_num, 3);
-       tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000;
-       if (r3 & 0x8)
-               tp->ram_base += 0x010000;
-       if (r3 & 0x80)
-               tp->ram_base += 0xF00000;
-
-       /* Get Ram Size */
-       r3 &= 0x30;
-       r3 >>= 4;
-
-       tp->ram_usable = (__u16)CNFG_SIZE_8KB << r3;
-       tp->ram_size = (__u16)CNFG_SIZE_64KB;
-       tp->board_id |= TOKEN_MEDIA;
-
-       r4 = mca_read_stored_pos(tp->slot_num, 4);
-       tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0x0C0000;
-       if (r4 & 0x8)
-               tp->rom_base += 0x010000;
-
-       /* Get ROM size. */
-       r4 >>= 4;
-       switch (r4) {
-               case 0:
-                       tp->rom_size = CNFG_SIZE_8KB;
-                       break;
-               case 1:
-                       tp->rom_size = CNFG_SIZE_16KB;
-                       break;
-               case 2:
-                       tp->rom_size = CNFG_SIZE_32KB;
-                       break;
-               default:
-                       tp->rom_size = ROM_DISABLE;
-       }
-
-       /* Get Media Type. */
-       r5 = mca_read_stored_pos(tp->slot_num, 5);
-       r5 &= CNFG_MEDIA_TYPE_MASK;
-       switch(r5)
-       {
-               case (0):
-                       tp->media_type = MEDIA_STP_4;
-                       break;
-
-               case (1):
-                       tp->media_type = MEDIA_STP_16;
-                       break;
-
-               case (3):
-                       tp->media_type = MEDIA_UTP_16;
-                       break;
-
-               default:
-                       tp->media_type = MEDIA_UTP_4;
-                       break;
-       }
-       tp->media_menu = 14;
-
-       r2 = mca_read_stored_pos(tp->slot_num, 2);
-       if(!(r2 & 0x02))
-               tp->mode_bits |= EARLY_TOKEN_REL;
-
-       /* Disable slot */
-       outb(CNFG_POS_CONTROL_REG, 0);
-
-       tp->board_id = smctr_get_boardid(dev, 1);
-       switch(tp->board_id & 0xffff)
-        {
-                case WD8115TA:
-                        smctr_model = "8115T/A";
-                        break;
-
-                case WD8115T:
-                       if(tp->extra_info & CHIP_REV_MASK)
-                                smctr_model = "8115T rev XE";
-                        else
-                                smctr_model = "8115T rev XD";
-                        break;
-
-                default:
-                        smctr_model = "Unknown";
-                        break;
-        }
-
-       return 0;
-#else
-       return -1;
-#endif /* CONFIG_MCA_LEGACY */
-}
-
-static int smctr_chg_rx_mask(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err = 0;
-
-        if(smctr_debug > 10)
-               printk(KERN_DEBUG "%s: smctr_chg_rx_mask\n", dev->name);
-
-        smctr_enable_16bit(dev);
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        if(tp->mode_bits & LOOPING_MODE_MASK)
-                tp->config_word0 |= RX_OWN_BIT;
-        else
-                tp->config_word0 &= ~RX_OWN_BIT;
-
-        if(tp->receive_mask & PROMISCUOUS_MODE)
-                tp->config_word0 |= PROMISCUOUS_BIT;
-        else
-                tp->config_word0 &= ~PROMISCUOUS_BIT;
-
-        if(tp->receive_mask & ACCEPT_ERR_PACKETS)
-                tp->config_word0 |= SAVBAD_BIT;
-        else
-                tp->config_word0 &= ~SAVBAD_BIT;
-
-        if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)
-                tp->config_word0 |= RXATMAC;
-        else
-                tp->config_word0 &= ~RXATMAC;
-
-        if(tp->receive_mask & ACCEPT_MULTI_PROM)
-                tp->config_word1 |= MULTICAST_ADDRESS_BIT;
-        else
-                tp->config_word1 &= ~MULTICAST_ADDRESS_BIT;
-
-        if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING)
-                tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS;
-        else
-        {
-                if(tp->receive_mask & ACCEPT_SOURCE_ROUTING)
-                        tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT;
-                else
-                        tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS;
-        }
-
-        if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_0,
-                &tp->config_word0)))
-        {
-                return err;
-        }
-
-        if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_1,
-                &tp->config_word1)))
-        {
-                return err;
-        }
-
-        smctr_disable_16bit(dev);
-
-        return 0;
-}
-
-static int smctr_clear_int(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        outb((tp->trc_mask | CSR_CLRTINT), dev->base_addr + CSR);
-
-        return 0;
-}
-
-static int smctr_clear_trc_reset(int ioaddr)
-{
-        __u8 r;
-
-        r = inb(ioaddr + MSR);
-        outb(~MSR_RST & r, ioaddr + MSR);
-
-        return 0;
-}
-
-/*
- * The inverse routine to smctr_open().
- */
-static int smctr_close(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        struct sk_buff *skb;
-        int err;
-
-       netif_stop_queue(dev);
-       
-       tp->cleanup = 1;
-
-        /* Check to see if adapter is already in a closed state. */
-        if(tp->status != OPEN)
-                return 0;
-
-        smctr_enable_16bit(dev);
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        if((err = smctr_issue_remove_cmd(dev)))
-        {
-                smctr_disable_16bit(dev);
-                return err;
-        }
-
-        for(;;)
-        {
-                skb = skb_dequeue(&tp->SendSkbQueue);
-                if(skb == NULL)
-                        break;
-                tp->QueueSkb++;
-                dev_kfree_skb(skb);
-        }
-
-
-        return 0;
-}
-
-static int smctr_decode_firmware(struct net_device *dev,
-                                const struct firmware *fw)
-{
-        struct net_local *tp = netdev_priv(dev);
-        short bit = 0x80, shift = 12;
-        DECODE_TREE_NODE *tree;
-        short branch, tsize;
-        __u16 buff = 0;
-        long weight;
-        __u8 *ucode;
-        __u16 *mem;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name);
-
-        weight  = *(long *)(fw->data + WEIGHT_OFFSET);
-        tsize   = *(__u8 *)(fw->data + TREE_SIZE_OFFSET);
-        tree    = (DECODE_TREE_NODE *)(fw->data + TREE_OFFSET);
-        ucode   = (__u8 *)(fw->data + TREE_OFFSET
-                        + (tsize * sizeof(DECODE_TREE_NODE)));
-        mem     = (__u16 *)(tp->ram_access);
-
-        while(weight)
-        {
-                branch = ROOT;
-                while((tree + branch)->tag != LEAF && weight)
-                {
-                        branch = *ucode & bit ? (tree + branch)->llink
-                                : (tree + branch)->rlink;
-
-                        bit >>= 1;
-                        weight--;
-
-                        if(bit == 0)
-                        {
-                                bit = 0x80;
-                                ucode++;
-                        }
-                }
-
-                buff |= (tree + branch)->info << shift;
-                shift -= 4;
-
-                if(shift < 0)
-                {
-                        *(mem++) = SWAP_BYTES(buff);
-                        buff    = 0;
-                        shift   = 12;
-                }
-        }
-
-        /* The following assumes the Control Store Memory has
-         * been initialized to zero. If the last partial word
-         * is zero, it will not be written.
-         */
-        if(buff)
-                *(mem++) = SWAP_BYTES(buff);
-
-        return 0;
-}
-
-static int smctr_disable_16bit(struct net_device *dev)
-{
-        return 0;
-}
-
-/*
- * On Exit, Adapter is:
- * 1. TRC is in a reset state and un-initialized.
- * 2. Adapter memory is enabled.
- * 3. Control Store memory is out of context (-WCSS is 1).
- */
-static int smctr_disable_adapter_ctrl_store(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_disable_adapter_ctrl_store\n", dev->name);
-
-        tp->trc_mask |= CSR_WCSS;
-        outb(tp->trc_mask, ioaddr + CSR);
-
-        return 0;
-}
-
-static int smctr_disable_bic_int(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-
-        tp->trc_mask = CSR_MSK_ALL | CSR_MSKCBUSY
-               | CSR_MSKTINT | CSR_WCSS;
-        outb(tp->trc_mask, ioaddr + CSR);
-
-        return 0;
-}
-
-static int smctr_enable_16bit(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u8    r;
-
-        if(tp->adapter_bus == BUS_ISA16_TYPE)
-        {
-                r = inb(dev->base_addr + LAAR);
-                outb((r | LAAR_MEM16ENB), dev->base_addr + LAAR);
-        }
-
-        return 0;
-}
-
-/*
- * To enable the adapter control store memory:
- * 1. Adapter must be in a RESET state.
- * 2. Adapter memory must be enabled.
- * 3. Control Store Memory is in context (-WCSS is 0).
- */
-static int smctr_enable_adapter_ctrl_store(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_enable_adapter_ctrl_store\n", dev->name);
-
-        smctr_set_trc_reset(ioaddr);
-        smctr_enable_adapter_ram(dev);
-
-        tp->trc_mask &= ~CSR_WCSS;
-        outb(tp->trc_mask, ioaddr + CSR);
-
-        return 0;
-}
-
-static int smctr_enable_adapter_ram(struct net_device *dev)
-{
-        int ioaddr = dev->base_addr;
-        __u8 r;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_enable_adapter_ram\n", dev->name);
-
-        r = inb(ioaddr + MSR);
-        outb(MSR_MEMB | r, ioaddr + MSR);
-
-        return 0;
-}
-
-static int smctr_enable_bic_int(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-        __u8 r;
-
-        switch(tp->bic_type)
-        {
-                case (BIC_584_CHIP):
-                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;
-                        outb(tp->trc_mask, ioaddr + CSR);
-                        r = inb(ioaddr + IRR);
-                        outb(r | IRR_IEN, ioaddr + IRR);
-                        break;
-
-                case (BIC_594_CHIP):
-                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;
-                        outb(tp->trc_mask, ioaddr + CSR);
-                        r = inb(ioaddr + IMCCR);
-                        outb(r | IMCCR_EIL, ioaddr + IMCCR);
-                        break;
-        }
-
-        return 0;
-}
-
-static int __init smctr_chk_isa(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-        __u8 r1, r2, b, chksum = 0;
-        __u16 r;
-       int i;
-       int err = -ENODEV;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr);
-
-       if((ioaddr & 0x1F) != 0)
-                goto out;
-
-        /* Grab the region so that no one else tries to probe our ioports. */
-       if (!request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name)) {
-               err = -EBUSY;
-               goto out;
-       }
-
-        /* Checksum SMC node address */
-        for(i = 0; i < 8; i++)
-        {
-                b = inb(ioaddr + LAR0 + i);
-                chksum += b;
-        }
-
-        if (chksum != NODE_ADDR_CKSUM)
-                goto out2;
-
-        b = inb(ioaddr + BDID);
-       if(b != BRD_ID_8115T)
-        {
-                printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name);
-                goto out2;
-        }
-
-        /* Check for 8115T Board ID */
-        r2 = 0;
-        for(r = 0; r < 8; r++)
-        {
-            r1 = inb(ioaddr + 0x8 + r);
-            r2 += r1;
-        }
-
-        /* value of RegF adds up the sum to 0xFF */
-        if((r2 != 0xFF) && (r2 != 0xEE))
-                goto out2;
-
-        /* Get adapter ID */
-        tp->board_id = smctr_get_boardid(dev, 0);
-        switch(tp->board_id & 0xffff)
-        {
-                case WD8115TA:
-                        smctr_model = "8115T/A";
-                        break;
-
-                case WD8115T:
-                       if(tp->extra_info & CHIP_REV_MASK)
-                                smctr_model = "8115T rev XE";
-                        else
-                                smctr_model = "8115T rev XD";
-                        break;
-
-                default:
-                        smctr_model = "Unknown";
-                        break;
-        }
-
-        /* Store BIC type. */
-        tp->bic_type = BIC_584_CHIP;
-        tp->nic_type = NIC_825_CHIP;
-
-        /* Copy Ram Size */
-        tp->ram_usable  = CNFG_SIZE_16KB;
-        tp->ram_size    = CNFG_SIZE_64KB;
-
-        /* Get 58x Ram Base */
-        r1 = inb(ioaddr);
-        r1 &= 0x3F;
-
-        r2 = inb(ioaddr + CNFG_LAAR_584);
-        r2 &= CNFG_LAAR_MASK;
-        r2 <<= 3;
-        r2 |= ((r1 & 0x38) >> 3);
-
-        tp->ram_base = ((__u32)r2 << 16) + (((__u32)(r1 & 0x7)) << 13);
-
-        /* Get 584 Irq */
-        r1 = 0;
-        r1 = inb(ioaddr + CNFG_ICR_583);
-        r1 &= CNFG_ICR_IR2_584;
-
-        r2 = inb(ioaddr + CNFG_IRR_583);
-        r2 &= CNFG_IRR_IRQS;     /* 0x60 */
-        r2 >>= 5;
-
-        switch(r2)
-        {
-                case 0:
-                        if(r1 == 0)
-                                dev->irq = 2;
-                        else
-                                dev->irq = 10;
-                        break;
-
-                case 1:
-                        if(r1 == 0)
-                                dev->irq = 3;
-                        else
-                                dev->irq = 11;
-                        break;
-
-                case 2:
-                        if(r1 == 0)
-                        {
-                                if(tp->extra_info & ALTERNATE_IRQ_BIT)
-                                        dev->irq = 5;
-                                else
-                                        dev->irq = 4;
-                        }
-                        else
-                                dev->irq = 15;
-                        break;
-
-                case 3:
-                        if(r1 == 0)
-                                dev->irq = 7;
-                        else
-                                dev->irq = 4;
-                        break;
-
-                default:
-                        printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name);
-                        goto out2;
-         }
-
-        if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev))
-                goto out2;
-
-        /* Get 58x Rom Base */
-        r1 = inb(ioaddr + CNFG_BIO_583);
-        r1 &= 0x3E;
-        r1 |= 0x40;
-
-        tp->rom_base = (__u32)r1 << 13;
-
-        /* Get 58x Rom Size */
-        r1 = inb(ioaddr + CNFG_BIO_583);
-        r1 &= 0xC0;
-        if(r1 == 0)
-                tp->rom_size = ROM_DISABLE;
-        else
-        {
-                r1 >>= 6;
-                tp->rom_size = (__u16)CNFG_SIZE_8KB << r1;
-        }
-
-        /* Get 58x Boot Status */
-        r1 = inb(ioaddr + CNFG_GP2);
-
-        tp->mode_bits &= (~BOOT_STATUS_MASK);
-
-        if(r1 & CNFG_GP2_BOOT_NIBBLE)
-                tp->mode_bits |= BOOT_TYPE_1;
-
-        /* Get 58x Zero Wait State */
-        tp->mode_bits &= (~ZERO_WAIT_STATE_MASK);
-
-        r1 = inb(ioaddr + CNFG_IRR_583);
-
-        if(r1 & CNFG_IRR_ZWS)
-                 tp->mode_bits |= ZERO_WAIT_STATE_8_BIT;
-
-        if(tp->board_id & BOARD_16BIT)
-        {
-                r1 = inb(ioaddr + CNFG_LAAR_584);
-
-                if(r1 & CNFG_LAAR_ZWS)
-                        tp->mode_bits |= ZERO_WAIT_STATE_16_BIT;
-        }
-
-        /* Get 584 Media Menu */
-        tp->media_menu = 14;
-        r1 = inb(ioaddr + CNFG_IRR_583);
-
-        tp->mode_bits &= 0xf8ff;       /* (~CNFG_INTERFACE_TYPE_MASK) */
-        if((tp->board_id & TOKEN_MEDIA) == TOKEN_MEDIA)
-        {
-                /* Get Advanced Features */
-                if(((r1 & 0x6) >> 1) == 0x3)
-                        tp->media_type |= MEDIA_UTP_16;
-                else
-                {
-                        if(((r1 & 0x6) >> 1) == 0x2)
-                                tp->media_type |= MEDIA_STP_16;
-                        else
-                        {
-                                if(((r1 & 0x6) >> 1) == 0x1)
-                                        tp->media_type |= MEDIA_UTP_4;
-
-                                else
-                                        tp->media_type |= MEDIA_STP_4;
-                        }
-                }
-
-                r1 = inb(ioaddr + CNFG_GP2);
-                if(!(r1 & 0x2) )           /* GP2_ETRD */
-                        tp->mode_bits |= EARLY_TOKEN_REL;
-
-                /* see if the chip is corrupted
-                if(smctr_read_584_chksum(ioaddr))
-                {
-                        printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name);
-                       free_irq(dev->irq, dev);
-                        goto out2;
-                }
-               */
-        }
-
-        return 0;
-
-out2:
-       release_region(ioaddr, SMCTR_IO_EXTENT);
-out:
-       return err;
-}
-
-static int __init smctr_get_boardid(struct net_device *dev, int mca)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-        __u8 r, r1, IdByte;
-        __u16 BoardIdMask;
-
-        tp->board_id = BoardIdMask = 0;
-
-       if(mca)
-       {
-               BoardIdMask |= (MICROCHANNEL+INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);
-               tp->extra_info |= (INTERFACE_594_CHIP+RAM_SIZE_64K+NIC_825_BIT+ALTERNATE_IRQ_BIT+SLOT_16BIT);
-       }
-       else
-       {
-               BoardIdMask|=(INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);
-               tp->extra_info |= (INTERFACE_584_CHIP + RAM_SIZE_64K
-                       + NIC_825_BIT + ALTERNATE_IRQ_BIT);
-       }
-
-       if(!mca)
-       {
-               r = inb(ioaddr + BID_REG_1);
-               r &= 0x0c;
-                       outb(r, ioaddr + BID_REG_1);
-               r = inb(ioaddr + BID_REG_1);
-
-               if(r & BID_SIXTEEN_BIT_BIT)
-               {
-                       tp->extra_info |= SLOT_16BIT;
-                       tp->adapter_bus = BUS_ISA16_TYPE;
-               }
-               else
-                       tp->adapter_bus = BUS_ISA8_TYPE;
-       }
-       else
-               tp->adapter_bus = BUS_MCA_TYPE;
-
-        /* Get Board Id Byte */
-        IdByte = inb(ioaddr + BID_BOARD_ID_BYTE);
-
-        /* if Major version > 1.0 then
-         *      return;
-         */
-        if(IdByte & 0xF8)
-                return -1;
-
-        r1 = inb(ioaddr + BID_REG_1);
-        r1 &= BID_ICR_MASK;
-        r1 |= BID_OTHER_BIT;
-
-        outb(r1, ioaddr + BID_REG_1);
-        r1 = inb(ioaddr + BID_REG_3);
-
-        r1 &= BID_EAR_MASK;
-        r1 |= BID_ENGR_PAGE;
-
-        outb(r1, ioaddr + BID_REG_3);
-        r1 = inb(ioaddr + BID_REG_1);
-        r1 &= BID_ICR_MASK;
-        r1 |= (BID_RLA | BID_OTHER_BIT);
-
-        outb(r1, ioaddr + BID_REG_1);
-
-        r1 = inb(ioaddr + BID_REG_1);
-        while(r1 & BID_RECALL_DONE_MASK)
-                r1 = inb(ioaddr + BID_REG_1);
-
-        r = inb(ioaddr + BID_LAR_0 + BID_REG_6);
-
-        /* clear chip rev bits */
-        tp->extra_info &= ~CHIP_REV_MASK;
-        tp->extra_info |= ((r & BID_EEPROM_CHIP_REV_MASK) << 6);
-
-        r1 = inb(ioaddr + BID_REG_1);
-        r1 &= BID_ICR_MASK;
-        r1 |= BID_OTHER_BIT;
-
-        outb(r1, ioaddr + BID_REG_1);
-        r1 = inb(ioaddr + BID_REG_3);
-
-        r1 &= BID_EAR_MASK;
-        r1 |= BID_EA6;
-
-        outb(r1, ioaddr + BID_REG_3);
-        r1 = inb(ioaddr + BID_REG_1);
-
-        r1 &= BID_ICR_MASK;
-        r1 |= BID_RLA;
-
-        outb(r1, ioaddr + BID_REG_1);
-        r1 = inb(ioaddr + BID_REG_1);
-
-        while(r1 & BID_RECALL_DONE_MASK)
-                r1 = inb(ioaddr + BID_REG_1);
-
-        return BoardIdMask;
-}
-
-static int smctr_get_group_address(struct net_device *dev)
-{
-        smctr_issue_read_word_cmd(dev, RW_INDIVIDUAL_GROUP_ADDR);
-
-        return smctr_wait_cmd(dev);
-}
-
-static int smctr_get_functional_address(struct net_device *dev)
-{
-        smctr_issue_read_word_cmd(dev, RW_FUNCTIONAL_ADDR);
-
-        return smctr_wait_cmd(dev);
-}
-
-/* Calculate number of Non-MAC receive BDB's and data buffers.
- * This function must simulate allocateing shared memory exactly
- * as the allocate_shared_memory function above.
- */
-static unsigned int smctr_get_num_rx_bdbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int mem_used = 0;
-
-        /* Allocate System Control Blocks. */
-        mem_used += sizeof(SCGBlock);
-
-        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
-        mem_used += sizeof(SCLBlock);
-
-        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
-        mem_used += sizeof(ACBlock) * tp->num_acbs;
-
-        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
-        mem_used += sizeof(ISBlock);
-
-        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
-        mem_used += MISC_DATA_SIZE;
-
-        /* Allocate transmit FCB's. */
-        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
-
-        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[MAC_QUEUE];
-        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[NON_MAC_QUEUE];
-        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[BUG_QUEUE];
-
-        /* Allocate transmit BDBs. */
-        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[MAC_QUEUE];
-        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[NON_MAC_QUEUE];
-        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[BUG_QUEUE];
-
-        /* Allocate receive FCBs. */
-        mem_used += sizeof(FCBlock) * tp->num_rx_fcbs[MAC_QUEUE];
-        mem_used += sizeof(FCBlock) * tp->num_rx_fcbs[NON_MAC_QUEUE];
-
-        /* Allocate receive BDBs. */
-        mem_used += sizeof(BDBlock) * tp->num_rx_bdbs[MAC_QUEUE];
-
-        /* Allocate MAC transmit buffers.
-         * MAC transmit buffers don't have to be on an ODD Boundary.
-         */
-        mem_used += tp->tx_buff_size[MAC_QUEUE];
-
-        /* Allocate BUG transmit buffers. */
-        mem_used += tp->tx_buff_size[BUG_QUEUE];
-
-        /* Allocate MAC receive data buffers.
-         * MAC receive buffers don't have to be on a 256 byte boundary.
-         */
-        mem_used += RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[MAC_QUEUE];
-
-        /* Allocate Non-MAC transmit buffers.
-         * For maximum Netware performance, put Tx Buffers on
-         * ODD Boundary,and then restore malloc to Even Boundrys.
-         */
-        mem_used += 1L;
-        mem_used += tp->tx_buff_size[NON_MAC_QUEUE];
-        mem_used += 1L;
-
-        /* CALCULATE NUMBER OF NON-MAC RX BDB'S
-         * AND NON-MAC RX DATA BUFFERS
-         *
-         * Make sure the mem_used offset at this point is the
-         * same as in allocate_shared memory or the following
-         * boundary adjustment will be incorrect (i.e. not allocating
-         * the non-mac receive buffers above cannot change the 256
-         * byte offset).
-         *
-         * Since this cannot be guaranteed, adding the full 256 bytes
-         * to the amount of shared memory used at this point will guaranteed
-         * that the rx data buffers do not overflow shared memory.
-         */
-        mem_used += 0x100;
-
-        return (0xffff - mem_used) / (RX_DATA_BUFFER_SIZE + sizeof(BDBlock));
-}
-
-static int smctr_get_physical_drop_number(struct net_device *dev)
-{
-        smctr_issue_read_word_cmd(dev, RW_PHYSICAL_DROP_NUMBER);
-
-        return smctr_wait_cmd(dev);
-}
-
-static __u8 * smctr_get_rx_pointer(struct net_device *dev, short queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        BDBlock *bdb;
-
-        bdb = (BDBlock *)((__u32)tp->ram_access
-                + (__u32)(tp->rx_fcb_curr[queue]->trc_bdb_ptr));
-
-        tp->rx_fcb_curr[queue]->bdb_ptr = bdb;
-
-        return (__u8 *)bdb->data_block_ptr;
-}
-
-static int smctr_get_station_id(struct net_device *dev)
-{
-        smctr_issue_read_word_cmd(dev, RW_INDIVIDUAL_MAC_ADDRESS);
-
-        return smctr_wait_cmd(dev);
-}
-
-/*
- * Get the current statistics. This may be called with the card open
- * or closed.
- */
-static struct net_device_stats *smctr_get_stats(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        return (struct net_device_stats *)&tp->MacStat;
-}
-
-static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue,
-        __u16 bytes_count)
-{
-        struct net_local *tp = netdev_priv(dev);
-        FCBlock *pFCB;
-        BDBlock *pbdb;
-        unsigned short alloc_size;
-        unsigned short *temp;
-
-        if(smctr_debug > 20)
-                printk(KERN_DEBUG "smctr_get_tx_fcb\n");
-
-        /* check if there is enough FCB blocks */
-        if(tp->num_tx_fcbs_used[queue] >= tp->num_tx_fcbs[queue])
-                return (FCBlock *)(-1L);
-
-        /* round off the input pkt size to the nearest even number */
-        alloc_size = (bytes_count + 1) & 0xfffe;
-
-        /* check if enough mem */
-        if((tp->tx_buff_used[queue] + alloc_size) > tp->tx_buff_size[queue])
-                return (FCBlock *)(-1L);
-
-        /* check if past the end ;
-         * if exactly enough mem to end of ring, alloc from front.
-         * this avoids update of curr when curr = end
-         */
-        if(((unsigned long)(tp->tx_buff_curr[queue]) + alloc_size)
-                >= (unsigned long)(tp->tx_buff_end[queue]))
-        {
-                /* check if enough memory from ring head */
-                alloc_size = alloc_size +
-                        (__u16)((__u32)tp->tx_buff_end[queue]
-                        - (__u32)tp->tx_buff_curr[queue]);
-
-                if((tp->tx_buff_used[queue] + alloc_size)
-                        > tp->tx_buff_size[queue])
-                {
-                        return (FCBlock *)(-1L);
-                }
-
-                /* ring wrap */
-                tp->tx_buff_curr[queue] = tp->tx_buff_head[queue];
-        }
-
-        tp->tx_buff_used[queue] += alloc_size;
-        tp->num_tx_fcbs_used[queue]++;
-        tp->tx_fcb_curr[queue]->frame_length = bytes_count;
-        tp->tx_fcb_curr[queue]->memory_alloc = alloc_size;
-        temp = tp->tx_buff_curr[queue];
-        tp->tx_buff_curr[queue]
-                = (__u16 *)((__u32)temp + (__u32)((bytes_count + 1) & 0xfffe));
-
-        pbdb = tp->tx_fcb_curr[queue]->bdb_ptr;
-        pbdb->buffer_length = bytes_count;
-        pbdb->data_block_ptr = temp;
-        pbdb->trc_data_block_ptr = TRC_POINTER(temp);
-
-        pFCB = tp->tx_fcb_curr[queue];
-        tp->tx_fcb_curr[queue] = tp->tx_fcb_curr[queue]->next_ptr;
-
-        return pFCB;
-}
-
-static int smctr_get_upstream_neighbor_addr(struct net_device *dev)
-{
-        smctr_issue_read_word_cmd(dev, RW_UPSTREAM_NEIGHBOR_ADDRESS);
-
-        return smctr_wait_cmd(dev);
-}
-
-static int smctr_hardware_send_packet(struct net_device *dev,
-        struct net_local *tp)
-{
-        struct tr_statistics *tstat = &tp->MacStat;
-        struct sk_buff *skb;
-        FCBlock *fcb;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG"%s: smctr_hardware_send_packet\n", dev->name);
-
-        if(tp->status != OPEN)
-                return -1;
-
-        if(tp->monitor_state_ready != 1)
-                return -1;
-
-        for(;;)
-        {
-                /* Send first buffer from queue */
-                skb = skb_dequeue(&tp->SendSkbQueue);
-                if(skb == NULL)
-                        return -1;
-
-                tp->QueueSkb++;
-
-                if(skb->len < SMC_HEADER_SIZE || skb->len > tp->max_packet_size)
-                       return -1;
-
-                smctr_enable_16bit(dev);
-                smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-                if((fcb = smctr_get_tx_fcb(dev, NON_MAC_QUEUE, skb->len))
-                        == (FCBlock *)(-1L))
-                {
-                        smctr_disable_16bit(dev);
-                        return -1;
-                }
-
-                smctr_tx_move_frame(dev, skb,
-                        (__u8 *)fcb->bdb_ptr->data_block_ptr, skb->len);
-
-                smctr_set_page(dev, (__u8 *)fcb);
-
-                smctr_trc_send_packet(dev, fcb, NON_MAC_QUEUE);
-                dev_kfree_skb(skb);
-
-                tstat->tx_packets++;
-
-                smctr_disable_16bit(dev);
-        }
-
-        return 0;
-}
-
-static int smctr_init_acbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i;
-        ACBlock *acb;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_init_acbs\n", dev->name);
-
-        acb                     = tp->acb_head;
-        acb->cmd_done_status    = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL);
-        acb->cmd_info           = ACB_CHAIN_END;
-        acb->cmd                = 0;
-        acb->subcmd             = 0;
-        acb->data_offset_lo     = 0;
-        acb->data_offset_hi     = 0;
-        acb->next_ptr
-                = (ACBlock *)(((char *)acb) + sizeof(ACBlock));
-        acb->trc_next_ptr       = TRC_POINTER(acb->next_ptr);
-
-        for(i = 1; i < tp->num_acbs; i++)
-        {
-                acb             = acb->next_ptr;
-                acb->cmd_done_status
-                        = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL);
-                acb->cmd_info = ACB_CHAIN_END;
-                acb->cmd        = 0;
-                acb->subcmd     = 0;
-                acb->data_offset_lo = 0;
-                acb->data_offset_hi = 0;
-                acb->next_ptr
-                        = (ACBlock *)(((char *)acb) + sizeof(ACBlock));
-                acb->trc_next_ptr = TRC_POINTER(acb->next_ptr);
-        }
-
-        acb->next_ptr           = tp->acb_head;
-        acb->trc_next_ptr       = TRC_POINTER(tp->acb_head);
-        tp->acb_next            = tp->acb_head->next_ptr;
-        tp->acb_curr            = tp->acb_head->next_ptr;
-        tp->num_acbs_used       = 0;
-
-        return 0;
-}
-
-static int smctr_init_adapter(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_init_adapter\n", dev->name);
-
-        tp->status              = CLOSED;
-        tp->page_offset_mask    = (tp->ram_usable * 1024) - 1;
-        skb_queue_head_init(&tp->SendSkbQueue);
-        tp->QueueSkb = MAX_TX_QUEUE;
-
-        if(!(tp->group_address_0 & 0x0080))
-                tp->group_address_0 |= 0x00C0;
-
-        if(!(tp->functional_address_0 & 0x00C0))
-                tp->functional_address_0 |= 0x00C0;
-
-        tp->functional_address[0] &= 0xFF7F;
-
-        if(tp->authorized_function_classes == 0)
-                tp->authorized_function_classes = 0x7FFF;
-
-        if(tp->authorized_access_priority == 0)
-                tp->authorized_access_priority = 0x06;
-
-        smctr_disable_bic_int(dev);
-        smctr_set_trc_reset(dev->base_addr);
-
-        smctr_enable_16bit(dev);
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        if(smctr_checksum_firmware(dev))
-       {
-                printk(KERN_ERR "%s: Previously loaded firmware is missing\n",dev->name);
-               return -ENOENT;
-        }
-
-        if((err = smctr_ram_memory_test(dev)))
-       {
-                printk(KERN_ERR "%s: RAM memory test failed.\n", dev->name);
-                return -EIO;
-        }
-
-       smctr_set_rx_look_ahead(dev);
-        smctr_load_node_addr(dev);
-
-        /* Initialize adapter for Internal Self Test. */
-        smctr_reset_adapter(dev);
-        if((err = smctr_init_card_real(dev)))
-       {
-                printk(KERN_ERR "%s: Initialization of card failed (%d)\n",
-                        dev->name, err);
-                return -EINVAL;
-        }
-
-        /* This routine clobbers the TRC's internal registers. */
-        if((err = smctr_internal_self_test(dev)))
-       {
-                printk(KERN_ERR "%s: Card failed internal self test (%d)\n",
-                        dev->name, err);
-                return -EINVAL;
-        }
-
-        /* Re-Initialize adapter's internal registers */
-        smctr_reset_adapter(dev);
-        if((err = smctr_init_card_real(dev)))
-       {
-                printk(KERN_ERR "%s: Initialization of card failed (%d)\n",
-                        dev->name, err);
-                return -EINVAL;
-        }
-
-        smctr_enable_bic_int(dev);
-
-        if((err = smctr_issue_enable_int_cmd(dev, TRC_INTERRUPT_ENABLE_MASK)))
-                return err;
-
-        smctr_disable_16bit(dev);
-
-        return 0;
-}
-
-static int smctr_init_card_real(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_init_card_real\n", dev->name);
-
-        tp->sh_mem_used = 0;
-        tp->num_acbs    = NUM_OF_ACBS;
-
-        /* Range Check Max Packet Size */
-        if(tp->max_packet_size < 256)
-                tp->max_packet_size = 256;
-        else
-        {
-                if(tp->max_packet_size > NON_MAC_TX_BUFFER_MEMORY)
-                        tp->max_packet_size = NON_MAC_TX_BUFFER_MEMORY;
-        }
-
-        tp->num_of_tx_buffs = (NON_MAC_TX_BUFFER_MEMORY
-                / tp->max_packet_size) - 1;
-
-        if(tp->num_of_tx_buffs > NUM_NON_MAC_TX_FCBS)
-                tp->num_of_tx_buffs = NUM_NON_MAC_TX_FCBS;
-        else
-        {
-                if(tp->num_of_tx_buffs == 0)
-                        tp->num_of_tx_buffs = 1;
-        }
-
-        /* Tx queue constants */
-        tp->num_tx_fcbs        [BUG_QUEUE]     = NUM_BUG_TX_FCBS;
-        tp->num_tx_bdbs        [BUG_QUEUE]     = NUM_BUG_TX_BDBS;
-        tp->tx_buff_size       [BUG_QUEUE]     = BUG_TX_BUFFER_MEMORY;
-        tp->tx_buff_used       [BUG_QUEUE]     = 0;
-        tp->tx_queue_status    [BUG_QUEUE]     = NOT_TRANSMITING;
-
-        tp->num_tx_fcbs        [MAC_QUEUE]     = NUM_MAC_TX_FCBS;
-        tp->num_tx_bdbs        [MAC_QUEUE]     = NUM_MAC_TX_BDBS;
-        tp->tx_buff_size       [MAC_QUEUE]     = MAC_TX_BUFFER_MEMORY;
-        tp->tx_buff_used       [MAC_QUEUE]     = 0;
-        tp->tx_queue_status    [MAC_QUEUE]     = NOT_TRANSMITING;
-
-        tp->num_tx_fcbs        [NON_MAC_QUEUE] = NUM_NON_MAC_TX_FCBS;
-        tp->num_tx_bdbs        [NON_MAC_QUEUE] = NUM_NON_MAC_TX_BDBS;
-        tp->tx_buff_size       [NON_MAC_QUEUE] = NON_MAC_TX_BUFFER_MEMORY;
-        tp->tx_buff_used       [NON_MAC_QUEUE] = 0;
-        tp->tx_queue_status    [NON_MAC_QUEUE] = NOT_TRANSMITING;
-
-        /* Receive Queue Constants */
-        tp->num_rx_fcbs[MAC_QUEUE] = NUM_MAC_RX_FCBS;
-        tp->num_rx_bdbs[MAC_QUEUE] = NUM_MAC_RX_BDBS;
-
-        if(tp->extra_info & CHIP_REV_MASK)
-                tp->num_rx_fcbs[NON_MAC_QUEUE] = 78;    /* 825 Rev. XE */
-        else
-                tp->num_rx_fcbs[NON_MAC_QUEUE] = 7;     /* 825 Rev. XD */
-
-        tp->num_rx_bdbs[NON_MAC_QUEUE] = smctr_get_num_rx_bdbs(dev);
-
-        smctr_alloc_shared_memory(dev);
-        smctr_init_shared_memory(dev);
-
-        if((err = smctr_issue_init_timers_cmd(dev)))
-                return err;
-
-        if((err = smctr_issue_init_txrx_cmd(dev)))
-       {
-                printk(KERN_ERR "%s: Hardware failure\n", dev->name);
-                return err;
-        }
-
-        return 0;
-}
-
-static int smctr_init_rx_bdbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, j;
-        BDBlock *bdb;
-        __u16 *buf;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_init_rx_bdbs\n", dev->name);
-
-        for(i = 0; i < NUM_RX_QS_USED; i++)
-        {
-                bdb = tp->rx_bdb_head[i];
-                buf = tp->rx_buff_head[i];
-                bdb->info = (BDB_CHAIN_END | BDB_NO_WARNING);
-                bdb->buffer_length = RX_DATA_BUFFER_SIZE;
-                bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
-                bdb->data_block_ptr = buf;
-                bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
-
-                if(i == NON_MAC_QUEUE)
-                        bdb->trc_data_block_ptr = RX_BUFF_TRC_POINTER(buf);
-                else
-                        bdb->trc_data_block_ptr = TRC_POINTER(buf);
-
-                for(j = 1; j < tp->num_rx_bdbs[i]; j++)
-                {
-                        bdb->next_ptr->back_ptr = bdb;
-                        bdb = bdb->next_ptr;
-                        buf = (__u16 *)((char *)buf + RX_DATA_BUFFER_SIZE);
-                        bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
-                        bdb->buffer_length = RX_DATA_BUFFER_SIZE;
-                        bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
-                        bdb->data_block_ptr = buf;
-                        bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
-
-                        if(i == NON_MAC_QUEUE)
-                                bdb->trc_data_block_ptr = RX_BUFF_TRC_POINTER(buf);
-                        else
-                                bdb->trc_data_block_ptr = TRC_POINTER(buf);
-                }
-
-                bdb->next_ptr           = tp->rx_bdb_head[i];
-                bdb->trc_next_ptr       = TRC_POINTER(tp->rx_bdb_head[i]);
-
-                tp->rx_bdb_head[i]->back_ptr    = bdb;
-                tp->rx_bdb_curr[i]              = tp->rx_bdb_head[i]->next_ptr;
-        }
-
-        return 0;
-}
-
-static int smctr_init_rx_fcbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, j;
-        FCBlock *fcb;
-
-        for(i = 0; i < NUM_RX_QS_USED; i++)
-        {
-                fcb               = tp->rx_fcb_head[i];
-                fcb->frame_status = 0;
-                fcb->frame_length = 0;
-                fcb->info         = FCB_CHAIN_END;
-                fcb->next_ptr     = (FCBlock *)(((char*)fcb) + sizeof(FCBlock));
-                if(i == NON_MAC_QUEUE)
-                        fcb->trc_next_ptr = RX_FCB_TRC_POINTER(fcb->next_ptr);
-                else
-                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
-
-                for(j = 1; j < tp->num_rx_fcbs[i]; j++)
-                {
-                        fcb->next_ptr->back_ptr = fcb;
-                        fcb                     = fcb->next_ptr;
-                        fcb->frame_status       = 0;
-                        fcb->frame_length       = 0;
-                        fcb->info               = FCB_WARNING;
-                        fcb->next_ptr
-                                = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
-
-                        if(i == NON_MAC_QUEUE)
-                                fcb->trc_next_ptr
-                                        = RX_FCB_TRC_POINTER(fcb->next_ptr);
-                        else
-                                fcb->trc_next_ptr
-                                        = TRC_POINTER(fcb->next_ptr);
-                }
-
-                fcb->next_ptr = tp->rx_fcb_head[i];
-
-                if(i == NON_MAC_QUEUE)
-                        fcb->trc_next_ptr = RX_FCB_TRC_POINTER(fcb->next_ptr);
-                else
-                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
-
-                tp->rx_fcb_head[i]->back_ptr    = fcb;
-                tp->rx_fcb_curr[i]              = tp->rx_fcb_head[i]->next_ptr;
-        }
-
-        return 0;
-}
-
-static int smctr_init_shared_memory(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i;
-        __u32 *iscpb;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_init_shared_memory\n", dev->name);
-
-        smctr_set_page(dev, (__u8 *)(unsigned int)tp->iscpb_ptr);
-
-        /* Initialize Initial System Configuration Point. (ISCP) */
-        iscpb = (__u32 *)PAGE_POINTER(&tp->iscpb_ptr->trc_scgb_ptr);
-        *iscpb = (__u32)(SWAP_WORDS(TRC_POINTER(tp->scgb_ptr)));
-
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        /* Initialize System Configuration Pointers. (SCP) */
-        tp->scgb_ptr->config = (SCGB_ADDRESS_POINTER_FORMAT
-                | SCGB_MULTI_WORD_CONTROL | SCGB_DATA_FORMAT
-                | SCGB_BURST_LENGTH);
-
-        tp->scgb_ptr->trc_sclb_ptr      = TRC_POINTER(tp->sclb_ptr);
-        tp->scgb_ptr->trc_acb_ptr       = TRC_POINTER(tp->acb_head);
-        tp->scgb_ptr->trc_isb_ptr       = TRC_POINTER(tp->isb_ptr);
-        tp->scgb_ptr->isbsiz            = (sizeof(ISBlock)) - 2;
-
-        /* Initialize System Control Block. (SCB) */
-        tp->sclb_ptr->valid_command    = SCLB_VALID | SCLB_CMD_NOP;
-        tp->sclb_ptr->iack_code        = 0;
-        tp->sclb_ptr->resume_control   = 0;
-        tp->sclb_ptr->int_mask_control = 0;
-        tp->sclb_ptr->int_mask_state   = 0;
-
-        /* Initialize Interrupt Status Block. (ISB) */
-        for(i = 0; i < NUM_OF_INTERRUPTS; i++)
-        {
-                tp->isb_ptr->IStatus[i].IType = 0xf0;
-                tp->isb_ptr->IStatus[i].ISubtype = 0;
-        }
-
-        tp->current_isb_index = 0;
-
-        /* Initialize Action Command Block. (ACB) */
-        smctr_init_acbs(dev);
-
-        /* Initialize transmit FCB's and BDB's. */
-        smctr_link_tx_fcbs_to_bdbs(dev);
-        smctr_init_tx_bdbs(dev);
-        smctr_init_tx_fcbs(dev);
-
-        /* Initialize receive FCB's and BDB's. */
-        smctr_init_rx_bdbs(dev);
-        smctr_init_rx_fcbs(dev);
-
-        return 0;
-}
-
-static int smctr_init_tx_bdbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, j;
-        BDBlock *bdb;
-
-        for(i = 0; i < NUM_TX_QS_USED; i++)
-        {
-                bdb = tp->tx_bdb_head[i];
-                bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
-                bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
-                bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
-
-                for(j = 1; j < tp->num_tx_bdbs[i]; j++)
-                {
-                        bdb->next_ptr->back_ptr = bdb;
-                        bdb = bdb->next_ptr;
-                        bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
-                        bdb->next_ptr
-                                = (BDBlock *)(((char *)bdb) + sizeof( BDBlock));                        bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
-                }
-
-                bdb->next_ptr = tp->tx_bdb_head[i];
-                bdb->trc_next_ptr = TRC_POINTER(tp->tx_bdb_head[i]);
-                tp->tx_bdb_head[i]->back_ptr = bdb;
-        }
-
-        return 0;
-}
-
-static int smctr_init_tx_fcbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, j;
-        FCBlock *fcb;
-
-        for(i = 0; i < NUM_TX_QS_USED; i++)
-        {
-                fcb               = tp->tx_fcb_head[i];
-                fcb->frame_status = 0;
-                fcb->frame_length = 0;
-                fcb->info         = FCB_CHAIN_END;
-                fcb->next_ptr = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
-                fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
-
-                for(j = 1; j < tp->num_tx_fcbs[i]; j++)
-                {
-                        fcb->next_ptr->back_ptr = fcb;
-                        fcb                     = fcb->next_ptr;
-                        fcb->frame_status       = 0;
-                        fcb->frame_length       = 0;
-                        fcb->info               = FCB_CHAIN_END;
-                        fcb->next_ptr
-                                = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
-                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
-                }
-
-                fcb->next_ptr           = tp->tx_fcb_head[i];
-                fcb->trc_next_ptr       = TRC_POINTER(tp->tx_fcb_head[i]);
-
-                tp->tx_fcb_head[i]->back_ptr    = fcb;
-                tp->tx_fcb_end[i]               = tp->tx_fcb_head[i]->next_ptr;
-                tp->tx_fcb_curr[i]              = tp->tx_fcb_head[i]->next_ptr;
-                tp->num_tx_fcbs_used[i]         = 0;
-        }
-
-        return 0;
-}
-
-static int smctr_internal_self_test(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if((err = smctr_issue_test_internal_rom_cmd(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        if(tp->acb_head->cmd_done_status & 0xff)
-                return -1;
-
-        if((err = smctr_issue_test_hic_cmd(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        if(tp->acb_head->cmd_done_status & 0xff)
-                return -1;
-
-        if((err = smctr_issue_test_mac_reg_cmd(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        if(tp->acb_head->cmd_done_status & 0xff)
-                return -1;
-
-        return 0;
-}
-
-/*
- * The typical workload of the driver: Handle the network interface interrupts.
- */
-static irqreturn_t smctr_interrupt(int irq, void *dev_id)
-{
-        struct net_device *dev = dev_id;
-        struct net_local *tp;
-        int ioaddr;
-        __u16 interrupt_unmask_bits = 0, interrupt_ack_code = 0xff00;
-        __u16 err1, err = NOT_MY_INTERRUPT;
-        __u8 isb_type, isb_subtype;
-        __u16 isb_index;
-
-        ioaddr = dev->base_addr;
-        tp = netdev_priv(dev);
-
-        if(tp->status == NOT_INITIALIZED)
-                return IRQ_NONE;
-
-        spin_lock(&tp->lock);
-        
-        smctr_disable_bic_int(dev);
-        smctr_enable_16bit(dev);
-
-        smctr_clear_int(dev);
-
-        /* First read the LSB */
-        while((tp->isb_ptr->IStatus[tp->current_isb_index].IType & 0xf0) == 0)
-        {
-                isb_index       = tp->current_isb_index;
-                isb_type        = tp->isb_ptr->IStatus[isb_index].IType;
-                isb_subtype     = tp->isb_ptr->IStatus[isb_index].ISubtype;
-
-                (tp->current_isb_index)++;
-                if(tp->current_isb_index == NUM_OF_INTERRUPTS)
-                        tp->current_isb_index = 0;
-
-                if(isb_type >= 0x10)
-                {
-                        smctr_disable_16bit(dev);
-                       spin_unlock(&tp->lock);
-                        return IRQ_HANDLED;
-                }
-
-                err = HARDWARE_FAILED;
-                interrupt_ack_code = isb_index;
-                tp->isb_ptr->IStatus[isb_index].IType |= 0xf0;
-
-                interrupt_unmask_bits |= (1 << (__u16)isb_type);
-
-                switch(isb_type)
-                {
-                        case ISB_IMC_MAC_TYPE_3:
-                                smctr_disable_16bit(dev);
-
-                                switch(isb_subtype)
-                                {
-                                        case 0:
-                                                tp->monitor_state = MS_MONITOR_FSM_INACTIVE;
-                                               break;
-
-                                        case 1:
-                                                tp->monitor_state = MS_REPEAT_BEACON_STATE;
-                                                break;
-
-                                        case 2:
-                                                tp->monitor_state = MS_REPEAT_CLAIM_TOKEN_STATE;
-                                                break;
-
-                                        case 3:
-                                                tp->monitor_state = MS_TRANSMIT_CLAIM_TOKEN_STATE;                                                break;
-
-                                        case 4:
-                                                tp->monitor_state = MS_STANDBY_MONITOR_STATE;
-                                                break;
-
-                                        case 5:
-                                                tp->monitor_state = MS_TRANSMIT_BEACON_STATE;
-                                                break;
-
-                                        case 6:
-                                                tp->monitor_state = MS_ACTIVE_MONITOR_STATE;
-                                                break;
-
-                                        case 7:
-                                                tp->monitor_state = MS_TRANSMIT_RING_PURGE_STATE;
-                                                break;
-
-                                        case 8:   /* diagnostic state */
-                                                break;
-
-                                        case 9:
-                                                tp->monitor_state = MS_BEACON_TEST_STATE;
-                                                if(smctr_lobe_media_test(dev))
-                                                {
-                                                        tp->ring_status_flags = RING_STATUS_CHANGED;
-                                                        tp->ring_status = AUTO_REMOVAL_ERROR;
-                                                        smctr_ring_status_chg(dev);
-                                                        smctr_bypass_state(dev);
-                                                }
-                                                else
-                                                        smctr_issue_insert_cmd(dev);
-                                                break;
-
-                                        /* case 0x0a-0xff, illegal states */
-                                        default:
-                                                break;
-                                }
-
-                                tp->ring_status_flags = MONITOR_STATE_CHANGED;
-                                err = smctr_ring_status_chg(dev);
-
-                                smctr_enable_16bit(dev);
-                                break;
-
-                        /* Type 0x02 - MAC Error Counters Interrupt
-                         * One or more MAC Error Counter is half full
-                         *      MAC Error Counters
-                         *      Lost_FR_Error_Counter
-                         *      RCV_Congestion_Counter
-                         *      FR_copied_Error_Counter
-                         *      FREQ_Error_Counter
-                         *      Token_Error_Counter
-                         *      Line_Error_Counter
-                         *      Internal_Error_Count
-                         */
-                        case ISB_IMC_MAC_ERROR_COUNTERS:
-                                /* Read 802.5 Error Counters */
-                                err = smctr_issue_read_ring_status_cmd(dev);
-                                break;
-
-                        /* Type 0x04 - MAC Type 2 Interrupt
-                         * HOST needs to enqueue MAC Frame for transmission
-                         * SubType Bit 15 - RQ_INIT_PDU( Request Initialization)                         * Changed from RQ_INIT_PDU to
-                         * TRC_Status_Changed_Indicate
-                         */
-                        case ISB_IMC_MAC_TYPE_2:
-                                err = smctr_issue_read_ring_status_cmd(dev);
-                                break;
-
-
-                        /* Type 0x05 - TX Frame Interrupt (FI). */
-                        case ISB_IMC_TX_FRAME:
-                                /* BUG QUEUE for TRC stuck receive BUG */
-                                if(isb_subtype & TX_PENDING_PRIORITY_2)
-                                {
-                                        if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS)
-                                                break;
-                                }
-
-                                /* NON-MAC frames only */
-                                if(isb_subtype & TX_PENDING_PRIORITY_1)
-                                {
-                                        if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS)
-                                                break;
-                                }
-
-                                /* MAC frames only */
-                                if(isb_subtype & TX_PENDING_PRIORITY_0)
-                                        err = smctr_tx_complete(dev, MAC_QUEUE);                                break;
-
-                        /* Type 0x06 - TX END OF QUEUE (FE) */
-                        case ISB_IMC_END_OF_TX_QUEUE:
-                                /* BUG queue */
-                                if(isb_subtype & TX_PENDING_PRIORITY_2)
-                                {
-                                        /* ok to clear Receive FIFO overrun
-                                         * imask send_BUG now completes.
-                                         */
-                                        interrupt_unmask_bits |= 0x800;
-
-                                        tp->tx_queue_status[BUG_QUEUE] = NOT_TRANSMITING;
-                                        if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS)
-                                                break;
-                                        if((err = smctr_restart_tx_chain(dev, BUG_QUEUE)) != SUCCESS)
-                                                break;
-                                }
-
-                                /* NON-MAC queue only */
-                                if(isb_subtype & TX_PENDING_PRIORITY_1)
-                                {
-                                        tp->tx_queue_status[NON_MAC_QUEUE] = NOT_TRANSMITING;
-                                        if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS)
-                                                break;
-                                        if((err = smctr_restart_tx_chain(dev, NON_MAC_QUEUE)) != SUCCESS)
-                                                break;
-                                }
-
-                                /* MAC queue only */
-                                if(isb_subtype & TX_PENDING_PRIORITY_0)
-                                {
-                                        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
-                                        if((err = smctr_tx_complete(dev, MAC_QUEUE)) != SUCCESS)
-                                                break;
-
-                                        err = smctr_restart_tx_chain(dev, MAC_QUEUE);
-                                }
-                                break;
-
-                        /* Type 0x07 - NON-MAC RX Resource Interrupt
-                         *   Subtype bit 12 - (BW) BDB warning
-                         *   Subtype bit 13 - (FW) FCB warning
-                         *   Subtype bit 14 - (BE) BDB End of chain
-                         *   Subtype bit 15 - (FE) FCB End of chain
-                         */
-                        case ISB_IMC_NON_MAC_RX_RESOURCE:
-                                tp->rx_fifo_overrun_count = 0;
-                                tp->receive_queue_number = NON_MAC_QUEUE;
-                                err1 = smctr_rx_frame(dev);
-
-                                if(isb_subtype & NON_MAC_RX_RESOURCE_FE)
-                                {
-                                        if((err = smctr_issue_resume_rx_fcb_cmd(                                                dev, NON_MAC_QUEUE)) != SUCCESS)                                                break;
-
-                                        if(tp->ptr_rx_fcb_overruns)
-                                                (*tp->ptr_rx_fcb_overruns)++;
-                                }
-
-                                if(isb_subtype & NON_MAC_RX_RESOURCE_BE)
-                                {
-                                        if((err = smctr_issue_resume_rx_bdb_cmd(                                                dev, NON_MAC_QUEUE)) != SUCCESS)                                                break;
-
-                                        if(tp->ptr_rx_bdb_overruns)
-                                                (*tp->ptr_rx_bdb_overruns)++;
-                                }
-                                err = err1;
-                                break;
-
-                        /* Type 0x08 - MAC RX Resource Interrupt
-                         *   Subtype bit 12 - (BW) BDB warning
-                         *   Subtype bit 13 - (FW) FCB warning
-                         *   Subtype bit 14 - (BE) BDB End of chain
-                         *   Subtype bit 15 - (FE) FCB End of chain
-                         */
-                        case ISB_IMC_MAC_RX_RESOURCE:
-                                tp->receive_queue_number = MAC_QUEUE;
-                                err1 = smctr_rx_frame(dev);
-
-                                if(isb_subtype & MAC_RX_RESOURCE_FE)
-                                {
-                                        if((err = smctr_issue_resume_rx_fcb_cmd(                                                dev, MAC_QUEUE)) != SUCCESS)
-                                                break;
-
-                                        if(tp->ptr_rx_fcb_overruns)
-                                                (*tp->ptr_rx_fcb_overruns)++;
-                                }
-
-                                if(isb_subtype & MAC_RX_RESOURCE_BE)
-                                {
-                                        if((err = smctr_issue_resume_rx_bdb_cmd(                                                dev, MAC_QUEUE)) != SUCCESS)
-                                                break;
-
-                                        if(tp->ptr_rx_bdb_overruns)
-                                                (*tp->ptr_rx_bdb_overruns)++;
-                                }
-                                err = err1;
-                                break;
-
-                        /* Type 0x09 - NON_MAC RX Frame Interrupt */
-                        case ISB_IMC_NON_MAC_RX_FRAME:
-                                tp->rx_fifo_overrun_count = 0;
-                                tp->receive_queue_number = NON_MAC_QUEUE;
-                                err = smctr_rx_frame(dev);
-                                break;
-
-                        /* Type 0x0A - MAC RX Frame Interrupt */
-                        case ISB_IMC_MAC_RX_FRAME:
-                                tp->receive_queue_number = MAC_QUEUE;
-                                err = smctr_rx_frame(dev);
-                                break;
-
-                        /* Type 0x0B - TRC status
-                         * TRC has encountered an error condition
-                         * subtype bit 14 - transmit FIFO underrun
-                         * subtype bit 15 - receive FIFO overrun
-                         */
-                        case ISB_IMC_TRC_FIFO_STATUS:
-                                if(isb_subtype & TRC_FIFO_STATUS_TX_UNDERRUN)
-                                {
-                                        if(tp->ptr_tx_fifo_underruns)
-                                                (*tp->ptr_tx_fifo_underruns)++;
-                                }
-
-                                if(isb_subtype & TRC_FIFO_STATUS_RX_OVERRUN)
-                                {
-                                        /* update overrun stuck receive counter
-                                         * if >= 3, has to clear it by sending
-                                         * back to back frames. We pick
-                                         * DAT(duplicate address MAC frame)
-                                         */
-                                        tp->rx_fifo_overrun_count++;
-
-                                        if(tp->rx_fifo_overrun_count >= 3)
-                                        {
-                                                tp->rx_fifo_overrun_count = 0;
-
-                                                /* delay clearing fifo overrun
-                                                 * imask till send_BUG tx
-                                                 * complete posted
-                                                 */
-                                                interrupt_unmask_bits &= (~0x800);
-                                                printk(KERN_CRIT "Jay please send bug\n");//                                              smctr_send_bug(dev);
-                                        }
-
-                                        if(tp->ptr_rx_fifo_overruns)
-                                                (*tp->ptr_rx_fifo_overruns)++;
-                                }
-
-                                err = SUCCESS;
-                                break;
-
-                        /* Type 0x0C - Action Command Status Interrupt
-                         * Subtype bit 14 - CB end of command chain (CE)
-                         * Subtype bit 15 - CB command interrupt (CI)
-                         */
-                        case ISB_IMC_COMMAND_STATUS:
-                                err = SUCCESS;
-                                if(tp->acb_head->cmd == ACB_CMD_HIC_NOP)
-                                {
-                                        printk(KERN_ERR "i1\n");
-                                        smctr_disable_16bit(dev);
-
-                                        /* XXXXXXXXXXXXXXXXX */
-                                /*      err = UM_Interrupt(dev); */
-
-                                        smctr_enable_16bit(dev);
-                                }
-                                else
-                                {
-                                        if((tp->acb_head->cmd
-                                           == ACB_CMD_READ_TRC_STATUS) &&
-                                          (tp->acb_head->subcmd
-                                           == RW_TRC_STATUS_BLOCK))
-                                        {
-                                                if(tp->ptr_bcn_type)
-                                                {
-                                                        *(tp->ptr_bcn_type)
-                                                                = (__u32)((SBlock *)tp->misc_command_data)->BCN_Type;
-                                                }
-
-                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & ERROR_COUNTERS_CHANGED)
-                                                {
-                                                        smctr_update_err_stats(dev);
-                                                }
-
-                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & TI_NDIS_RING_STATUS_CHANGED)
-                                                {
-                                                        tp->ring_status
-                                                                = ((SBlock*)tp->misc_command_data)->TI_NDIS_Ring_Status;
-                                                        smctr_disable_16bit(dev);
-                                                        err = smctr_ring_status_chg(dev);
-                                                        smctr_enable_16bit(dev);
-                                                        if((tp->ring_status & REMOVE_RECEIVED) &&
-                                                          (tp->config_word0 & NO_AUTOREMOVE))
-                                                        {
-                                                                smctr_issue_remove_cmd(dev);
-                                                        }
-
-                                                        if(err != SUCCESS)
-                                                        {
-                                                                tp->acb_pending = 0;
-                                                                break;
-                                                        }
-                                                }
-
-                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & UNA_CHANGED)
-                                                {
-                                                        if(tp->ptr_una)
-                                                        {
-                                                                tp->ptr_una[0] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]);
-                                                                tp->ptr_una[1] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]);
-                                                                tp->ptr_una[2] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]);
-                                                        }
-
-                                                }
-
-                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & READY_TO_SEND_RQ_INIT)                                                {
-                                                        err = smctr_send_rq_init(dev);
-                                                }
-                                        }
-                                }
-
-                                tp->acb_pending = 0;
-                                break;
-
-                        /* Type 0x0D - MAC Type 1 interrupt
-                         * Subtype -- 00 FR_BCN received at S12
-                         *            01 FR_BCN received at S21
-                         *            02 FR_DAT(DA=MA, A<>0) received at S21
-                         *            03 TSM_EXP at S21
-                         *            04 FR_REMOVE received at S42
-                         *            05 TBR_EXP, BR_FLAG_SET at S42
-                         *            06 TBT_EXP at S53
-                         */
-                        case ISB_IMC_MAC_TYPE_1:
-                                if(isb_subtype > 8)
-                                {
-                                        err = HARDWARE_FAILED;
-                                        break;
-                                }
-
-                                err = SUCCESS;
-                                switch(isb_subtype)
-                                {
-                                        case 0:
-                                                tp->join_state = JS_BYPASS_STATE;
-                                                if(tp->status != CLOSED)
-                                                {
-                                                        tp->status = CLOSED;
-                                                        err = smctr_status_chg(dev);
-                                                }
-                                                break;
-
-                                        case 1:
-                                                tp->join_state = JS_LOBE_TEST_STATE;
-                                                break;
-
-                                        case 2:
-                                                tp->join_state = JS_DETECT_MONITOR_PRESENT_STATE;
-                                                break;
-
-                                        case 3:
-                                                tp->join_state = JS_AWAIT_NEW_MONITOR_STATE;
-                                                break;
-
-                                        case 4:
-                                                tp->join_state = JS_DUPLICATE_ADDRESS_TEST_STATE;
-                                                break;
-
-                                        case 5:
-                                                tp->join_state = JS_NEIGHBOR_NOTIFICATION_STATE;
-                                                break;
-
-                                        case 6:
-                                                tp->join_state = JS_REQUEST_INITIALIZATION_STATE;
-                                                break;
-
-                                        case 7:
-                                                tp->join_state = JS_JOIN_COMPLETE_STATE;
-                                                tp->status = OPEN;
-                                                err = smctr_status_chg(dev);
-                                                break;
-
-                                        case 8:
-                                                tp->join_state = JS_BYPASS_WAIT_STATE;
-                                                break;
-                                }
-                                break ;
-
-                        /* Type 0x0E - TRC Initialization Sequence Interrupt
-                         * Subtype -- 00-FF Initializatin sequence complete
-                         */
-                        case ISB_IMC_TRC_INTRNL_TST_STATUS:
-                                tp->status = INITIALIZED;
-                                smctr_disable_16bit(dev);
-                                err = smctr_status_chg(dev);
-                                smctr_enable_16bit(dev);
-                                break;
-
-                        /* other interrupt types, illegal */
-                        default:
-                                break;
-                }
-
-                if(err != SUCCESS)
-                        break;
-        }
-
-        /* Checking the ack code instead of the unmask bits here is because :
-         * while fixing the stuck receive, DAT frame are sent and mask off
-         * FIFO overrun interrupt temporarily (interrupt_unmask_bits = 0)
-         * but we still want to issue ack to ISB
-         */
-        if(!(interrupt_ack_code & 0xff00))
-                smctr_issue_int_ack(dev, interrupt_ack_code, interrupt_unmask_bits);
-
-        smctr_disable_16bit(dev);
-        smctr_enable_bic_int(dev);
-        spin_unlock(&tp->lock);
-
-        return IRQ_HANDLED;
-}
-
-static int smctr_issue_enable_int_cmd(struct net_device *dev,
-        __u16 interrupt_enable_mask)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        tp->sclb_ptr->int_mask_control  = interrupt_enable_mask;
-        tp->sclb_ptr->valid_command     = SCLB_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_wait_while_cbusy(dev))
-                return -1;
-
-        tp->sclb_ptr->int_mask_control = ibits;
-        tp->sclb_ptr->iack_code = iack_code << 1; /* use the offset from base */        tp->sclb_ptr->resume_control = 0;
-        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_IACK_CODE_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_init_timers_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i;
-        int err;
-        __u16 *pTimer_Struc = (__u16 *)tp->misc_command_data;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        tp->config_word0 = THDREN | DMA_TRIGGER | USETPT | NO_AUTOREMOVE;
-        tp->config_word1 = 0;
-
-        if((tp->media_type == MEDIA_STP_16) ||
-          (tp->media_type == MEDIA_UTP_16) ||
-          (tp->media_type == MEDIA_STP_16_UTP_16))
-        {
-                tp->config_word0 |= FREQ_16MB_BIT;
-        }
-
-        if(tp->mode_bits & EARLY_TOKEN_REL)
-                tp->config_word0 |= ETREN;
-
-        if(tp->mode_bits & LOOPING_MODE_MASK)
-                tp->config_word0 |= RX_OWN_BIT;
-        else
-                tp->config_word0 &= ~RX_OWN_BIT;
-
-        if(tp->receive_mask & PROMISCUOUS_MODE)
-                tp->config_word0 |= PROMISCUOUS_BIT;
-        else
-                tp->config_word0 &= ~PROMISCUOUS_BIT;
-
-        if(tp->receive_mask & ACCEPT_ERR_PACKETS)
-                tp->config_word0 |= SAVBAD_BIT;
-        else
-                tp->config_word0 &= ~SAVBAD_BIT;
-
-        if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)
-                tp->config_word0 |= RXATMAC;
-        else
-                tp->config_word0 &= ~RXATMAC;
-
-        if(tp->receive_mask & ACCEPT_MULTI_PROM)
-                tp->config_word1 |= MULTICAST_ADDRESS_BIT;
-        else
-                tp->config_word1 &= ~MULTICAST_ADDRESS_BIT;
-
-        if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING)
-                tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS;
-        else
-        {
-                if(tp->receive_mask & ACCEPT_SOURCE_ROUTING)
-                        tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT;
-                else
-                        tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS;
-        }
-
-        if((tp->media_type == MEDIA_STP_16) ||
-          (tp->media_type == MEDIA_UTP_16) ||
-          (tp->media_type == MEDIA_STP_16_UTP_16))
-        {
-                tp->config_word1 |= INTERFRAME_SPACING_16;
-        }
-        else
-                tp->config_word1 |= INTERFRAME_SPACING_4;
-
-        *pTimer_Struc++ = tp->config_word0;
-        *pTimer_Struc++ = tp->config_word1;
-
-        if((tp->media_type == MEDIA_STP_4) ||
-          (tp->media_type == MEDIA_UTP_4) ||
-          (tp->media_type == MEDIA_STP_4_UTP_4))
-        {
-                *pTimer_Struc++ = 0x00FA;       /* prescale */
-                *pTimer_Struc++ = 0x2710;       /* TPT_limit */
-                *pTimer_Struc++ = 0x2710;       /* TQP_limit */
-                *pTimer_Struc++ = 0x0A28;       /* TNT_limit */
-                *pTimer_Struc++ = 0x3E80;       /* TBT_limit */
-                *pTimer_Struc++ = 0x3A98;       /* TSM_limit */
-                *pTimer_Struc++ = 0x1B58;       /* TAM_limit */
-                *pTimer_Struc++ = 0x00C8;       /* TBR_limit */
-                *pTimer_Struc++ = 0x07D0;       /* TER_limit */
-                *pTimer_Struc++ = 0x000A;       /* TGT_limit */
-                *pTimer_Struc++ = 0x1162;       /* THT_limit */
-                *pTimer_Struc++ = 0x07D0;       /* TRR_limit */
-                *pTimer_Struc++ = 0x1388;       /* TVX_limit */
-                *pTimer_Struc++ = 0x0000;       /* reserved */
-        }
-        else
-        {
-                *pTimer_Struc++ = 0x03E8;       /* prescale */
-                *pTimer_Struc++ = 0x9C40;       /* TPT_limit */
-                *pTimer_Struc++ = 0x9C40;       /* TQP_limit */
-                *pTimer_Struc++ = 0x0A28;       /* TNT_limit */
-                *pTimer_Struc++ = 0x3E80;       /* TBT_limit */
-                *pTimer_Struc++ = 0x3A98;       /* TSM_limit */
-                *pTimer_Struc++ = 0x1B58;       /* TAM_limit */
-                *pTimer_Struc++ = 0x00C8;       /* TBR_limit */
-                *pTimer_Struc++ = 0x07D0;       /* TER_limit */
-                *pTimer_Struc++ = 0x000A;       /* TGT_limit */
-                *pTimer_Struc++ = 0x4588;       /* THT_limit */
-                *pTimer_Struc++ = 0x1F40;       /* TRR_limit */
-                *pTimer_Struc++ = 0x4E20;       /* TVX_limit */
-                *pTimer_Struc++ = 0x0000;       /* reserved */
-        }
-
-        /* Set node address. */
-        *pTimer_Struc++ = dev->dev_addr[0] << 8
-                | (dev->dev_addr[1] & 0xFF);
-        *pTimer_Struc++ = dev->dev_addr[2] << 8
-                | (dev->dev_addr[3] & 0xFF);
-        *pTimer_Struc++ = dev->dev_addr[4] << 8
-                | (dev->dev_addr[5] & 0xFF);
-
-        /* Set group address. */
-        *pTimer_Struc++ = tp->group_address_0 << 8
-                | tp->group_address_0 >> 8;
-        *pTimer_Struc++ = tp->group_address[0] << 8
-                | tp->group_address[0] >> 8;
-        *pTimer_Struc++ = tp->group_address[1] << 8
-                | tp->group_address[1] >> 8;
-
-        /* Set functional address. */
-        *pTimer_Struc++ = tp->functional_address_0 << 8
-                | tp->functional_address_0 >> 8;
-        *pTimer_Struc++ = tp->functional_address[0] << 8
-                | tp->functional_address[0] >> 8;
-        *pTimer_Struc++ = tp->functional_address[1] << 8
-                | tp->functional_address[1] >> 8;
-
-        /* Set Bit-Wise group address. */
-        *pTimer_Struc++ = tp->bitwise_group_address[0] << 8
-                | tp->bitwise_group_address[0] >> 8;
-        *pTimer_Struc++ = tp->bitwise_group_address[1] << 8
-                | tp->bitwise_group_address[1] >> 8;
-
-        /* Set ring number address. */
-        *pTimer_Struc++ = tp->source_ring_number;
-        *pTimer_Struc++ = tp->target_ring_number;
-
-        /* Physical drop number. */
-        *pTimer_Struc++ = (unsigned short)0;
-        *pTimer_Struc++ = (unsigned short)0;
-
-        /* Product instance ID. */
-        for(i = 0; i < 9; i++)
-                *pTimer_Struc++ = (unsigned short)0;
-
-        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TRC_TIMERS, 0);
-
-        return err;
-}
-
-static int smctr_issue_init_txrx_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i;
-        int err;
-        void **txrx_ptrs = (void *)tp->misc_command_data;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-       {
-                printk(KERN_ERR "%s: Hardware failure\n", dev->name);
-                return err;
-        }
-
-        /* Initialize Transmit Queue Pointers that are used, to point to
-         * a single FCB.
-         */
-        for(i = 0; i < NUM_TX_QS_USED; i++)
-                *txrx_ptrs++ = (void *)TRC_POINTER(tp->tx_fcb_head[i]);
-
-        /* Initialize Transmit Queue Pointers that are NOT used to ZERO. */
-        for(; i < MAX_TX_QS; i++)
-                *txrx_ptrs++ = (void *)0;
-
-        /* Initialize Receive Queue Pointers (MAC and Non-MAC) that are
-         * used, to point to a single FCB and a BDB chain of buffers.
-         */
-        for(i = 0; i < NUM_RX_QS_USED; i++)
-        {
-                *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_fcb_head[i]);
-                *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_bdb_head[i]);
-        }
-
-        /* Initialize Receive Queue Pointers that are NOT used to ZERO. */
-        for(; i < MAX_RX_QS; i++)
-        {
-                *txrx_ptrs++ = (void *)0;
-                *txrx_ptrs++ = (void *)0;
-        }
-
-        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TX_RX, 0);
-
-        return err;
-}
-
-static int smctr_issue_insert_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_INSERT, ACB_SUB_CMD_NOP);
-
-        return err;
-}
-
-static int smctr_issue_read_ring_status_cmd(struct net_device *dev)
-{
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_READ_TRC_STATUS,
-                RW_TRC_STATUS_BLOCK);
-
-        return err;
-}
-
-static int smctr_issue_read_word_cmd(struct net_device *dev, __u16 aword_cnt)
-{
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_READ_VALUE,
-                aword_cnt);
-
-        return err;
-}
-
-static int smctr_issue_remove_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        tp->sclb_ptr->resume_control    = 0;
-        tp->sclb_ptr->valid_command     = SCLB_VALID | SCLB_CMD_REMOVE;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_resume_acb_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        tp->sclb_ptr->resume_control = SCLB_RC_ACB;
-        tp->sclb_ptr->valid_command  = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
-
-        tp->acb_pending = 1;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if(queue == MAC_QUEUE)
-                tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_BDB;
-        else
-                tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_BDB;
-
-        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name);
-
-        if(smctr_wait_while_cbusy(dev))
-                return -1;
-
-        if(queue == MAC_QUEUE)
-                tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_FCB;
-        else
-                tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_FCB;
-
-        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name);
-
-        if(smctr_wait_while_cbusy(dev))
-                return -1;
-
-        tp->sclb_ptr->resume_control = (SCLB_RC_TFCB0 << queue);
-        tp->sclb_ptr->valid_command = SCLB_RESUME_CONTROL_VALID | SCLB_VALID;
-
-        smctr_set_ctrl_attention(dev);
-
-        return 0;
-}
-
-static int smctr_issue_test_internal_rom_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
-                TRC_INTERNAL_ROM_TEST);
-
-        return err;
-}
-
-static int smctr_issue_test_hic_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_HIC_TEST,
-                TRC_HOST_INTERFACE_REG_TEST);
-
-        return err;
-}
-
-static int smctr_issue_test_mac_reg_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
-                TRC_MAC_REGISTERS_TEST);
-
-        return err;
-}
-
-static int smctr_issue_trc_loopback_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
-                TRC_INTERNAL_LOOPBACK);
-
-        return err;
-}
-
-static int smctr_issue_tri_loopback_cmd(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
-                TRC_TRI_LOOPBACK);
-
-        return err;
-}
-
-static int smctr_issue_write_byte_cmd(struct net_device *dev,
-        short aword_cnt, void *byte)
-{
-       struct net_local *tp = netdev_priv(dev);
-        unsigned int iword, ibyte;
-       int err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        for(iword = 0, ibyte = 0; iword < (unsigned int)(aword_cnt & 0xff);
-               iword++, ibyte += 2)
-        {
-                tp->misc_command_data[iword] = (*((__u8 *)byte + ibyte) << 8)
-                       | (*((__u8 *)byte + ibyte + 1));
-        }
-
-        return smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE,
-               aword_cnt);
-}
-
-static int smctr_issue_write_word_cmd(struct net_device *dev,
-        short aword_cnt, void *word)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, err;
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        for(i = 0; i < (unsigned int)(aword_cnt & 0xff); i++)
-                tp->misc_command_data[i] = *((__u16 *)word + i);
-
-        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE,
-                aword_cnt);
-
-        return err;
-}
-
-static int smctr_join_complete_state(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE,
-                JS_JOIN_COMPLETE_STATE);
-
-        return err;
-}
-
-static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, j;
-        FCBlock *fcb;
-        BDBlock *bdb;
-
-        for(i = 0; i < NUM_TX_QS_USED; i++)
-        {
-                fcb = tp->tx_fcb_head[i];
-                bdb = tp->tx_bdb_head[i];
-
-                for(j = 0; j < tp->num_tx_fcbs[i]; j++)
-                {
-                        fcb->bdb_ptr            = bdb;
-                        fcb->trc_bdb_ptr        = TRC_POINTER(bdb);
-                        fcb = (FCBlock *)((char *)fcb + sizeof(FCBlock));
-                        bdb = (BDBlock *)((char *)bdb + sizeof(BDBlock));
-                }
-        }
-
-        return 0;
-}
-
-static int smctr_load_firmware(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-       const struct firmware *fw;
-        __u16 i, checksum = 0;
-        int err = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name);
-
-       if (request_firmware(&fw, "tr_smctr.bin", &dev->dev)) {
-               printk(KERN_ERR "%s: firmware not found\n", dev->name);
-               return UCODE_NOT_PRESENT;
-       }
-
-        tp->num_of_tx_buffs     = 4;
-        tp->mode_bits          |= UMAC;
-        tp->receive_mask        = 0;
-        tp->max_packet_size     = 4177;
-
-        /* Can only upload the firmware once per adapter reset. */
-        if (tp->microcode_version != 0) {
-               err = (UCODE_PRESENT);
-               goto out;
-       }
-
-        /* Verify the firmware exists and is there in the right amount. */
-        if (!fw->data ||
-           (*(fw->data + UCODE_VERSION_OFFSET) < UCODE_VERSION))
-        {
-                err = (UCODE_NOT_PRESENT);
-               goto out;
-        }
-
-        /* UCODE_SIZE is not included in Checksum. */
-        for(i = 0; i < *((__u16 *)(fw->data + UCODE_SIZE_OFFSET)); i += 2)
-                checksum += *((__u16 *)(fw->data + 2 + i));
-        if (checksum) {
-               err = (UCODE_NOT_PRESENT);
-               goto out;
-       }
-
-        /* At this point we have a valid firmware image, lets kick it on up. */
-        smctr_enable_adapter_ram(dev);
-        smctr_enable_16bit(dev);
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        if((smctr_checksum_firmware(dev)) ||
-          (*(fw->data + UCODE_VERSION_OFFSET) > tp->microcode_version))
-        {
-                smctr_enable_adapter_ctrl_store(dev);
-
-                /* Zero out ram space for firmware. */
-                for(i = 0; i < CS_RAM_SIZE; i += 2)
-                        *((__u16 *)(tp->ram_access + i)) = 0;
-
-                smctr_decode_firmware(dev, fw);
-
-                tp->microcode_version = *(fw->data + UCODE_VERSION_OFFSET);                *((__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET))
-                        = (tp->microcode_version << 8);
-                *((__u16 *)(tp->ram_access + CS_RAM_CHECKSUM_OFFSET))
-                        = ~(tp->microcode_version << 8) + 1;
-
-                smctr_disable_adapter_ctrl_store(dev);
-
-                if(smctr_checksum_firmware(dev))
-                        err = HARDWARE_FAILED;
-        }
-        else
-                err = UCODE_PRESENT;
-
-        smctr_disable_16bit(dev);
- out:
-       release_firmware(fw);
-        return err;
-}
-
-static int smctr_load_node_addr(struct net_device *dev)
-{
-        int ioaddr = dev->base_addr;
-        unsigned int i;
-        __u8 r;
-
-        for(i = 0; i < 6; i++)
-        {
-                r = inb(ioaddr + LAR0 + i);
-                dev->dev_addr[i] = (char)r;
-        }
-        dev->addr_len = 6;
-
-        return 0;
-}
-
-/* Lobe Media Test.
- * During the transmission of the initial 1500 lobe media MAC frames,
- * the phase lock loop in the 805 chip may lock, and then un-lock, causing
- * the 825 to go into a PURGE state. When performing a PURGE, the MCT
- * microcode will not transmit any frames given to it by the host, and
- * will consequently cause a timeout.
- *
- * NOTE 1: If the monitor_state is MS_BEACON_TEST_STATE, all transmit
- * queues other than the one used for the lobe_media_test should be
- * disabled.!?
- *
- * NOTE 2: If the monitor_state is MS_BEACON_TEST_STATE and the receive_mask
- * has any multi-cast or promiscuous bits set, the receive_mask needs to
- * be changed to clear the multi-cast or promiscuous mode bits, the lobe_test
- * run, and then the receive mask set back to its original value if the test
- * is successful.
- */
-static int smctr_lobe_media_test(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, perror = 0;
-        unsigned short saved_rcv_mask;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_lobe_media_test\n", dev->name);
-
-        /* Clear receive mask for lobe test. */
-        saved_rcv_mask          = tp->receive_mask;
-        tp->receive_mask        = 0;
-
-        smctr_chg_rx_mask(dev);
-
-        /* Setup the lobe media test. */
-        smctr_lobe_media_test_cmd(dev);
-        if(smctr_wait_cmd(dev))
-               goto err;
-
-        /* Tx lobe media test frames. */
-        for(i = 0; i < 1500; ++i)
-        {
-                if(smctr_send_lobe_media_test(dev))
-                {
-                        if(perror)
-                               goto err;
-                        else
-                        {
-                                perror = 1;
-                                if(smctr_lobe_media_test_cmd(dev))
-                                       goto err;
-                        }
-                }
-        }
-
-        if(smctr_send_dat(dev))
-        {
-                if(smctr_send_dat(dev))
-                       goto err;
-        }
-
-        /* Check if any frames received during test. */
-        if((tp->rx_fcb_curr[MAC_QUEUE]->frame_status) ||
-          (tp->rx_fcb_curr[NON_MAC_QUEUE]->frame_status))
-               goto err;
-
-        /* Set receive mask to "Promisc" mode. */
-        tp->receive_mask = saved_rcv_mask;
-
-        smctr_chg_rx_mask(dev);
-
-        return 0;
-err:
-       smctr_reset_adapter(dev);
-       tp->status = CLOSED;
-       return LOBE_MEDIA_TEST_FAILED;
-}
-
-static int smctr_lobe_media_test_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_lobe_media_test_cmd\n", dev->name);
-
-        /* Change to lobe media test state. */
-        if(tp->monitor_state != MS_BEACON_TEST_STATE)
-        {
-                smctr_lobe_media_test_state(dev);
-                if(smctr_wait_cmd(dev))
-                {
-                        printk(KERN_ERR "Lobe Failed test state\n");
-                        return LOBE_MEDIA_TEST_FAILED;
-                }
-        }
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
-                TRC_LOBE_MEDIA_TEST);
-
-        return err;
-}
-
-static int smctr_lobe_media_test_state(struct net_device *dev)
-{
-        int err;
-
-        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE,
-                JS_LOBE_TEST_STATE);
-
-        return err;
-}
-
-static int smctr_make_8025_hdr(struct net_device *dev,
-        MAC_HEADER *rmf, MAC_HEADER *tmf, __u16 ac_fc)
-{
-        tmf->ac = MSB(ac_fc);                 /* msb is access control */
-        tmf->fc = LSB(ac_fc);                 /* lsb is frame control */
-
-        tmf->sa[0] = dev->dev_addr[0];
-        tmf->sa[1] = dev->dev_addr[1];
-        tmf->sa[2] = dev->dev_addr[2];
-        tmf->sa[3] = dev->dev_addr[3];
-        tmf->sa[4] = dev->dev_addr[4];
-        tmf->sa[5] = dev->dev_addr[5];
-
-        switch(tmf->vc)
-        {
-               /* Send RQ_INIT to RPS */
-                case RQ_INIT:
-                        tmf->da[0] = 0xc0;
-                        tmf->da[1] = 0x00;
-                        tmf->da[2] = 0x00;
-                        tmf->da[3] = 0x00;
-                        tmf->da[4] = 0x00;
-                        tmf->da[5] = 0x02;
-                        break;
-
-               /* Send RPT_TX_FORWARD to CRS */
-                case RPT_TX_FORWARD:
-                        tmf->da[0] = 0xc0;
-                        tmf->da[1] = 0x00;
-                        tmf->da[2] = 0x00;
-                        tmf->da[3] = 0x00;
-                        tmf->da[4] = 0x00;
-                        tmf->da[5] = 0x10;
-                        break;
-
-               /* Everything else goes to sender */
-                default:
-                        tmf->da[0] = rmf->sa[0];
-                        tmf->da[1] = rmf->sa[1];
-                        tmf->da[2] = rmf->sa[2];
-                        tmf->da[3] = rmf->sa[3];
-                        tmf->da[4] = rmf->sa[4];
-                        tmf->da[5] = rmf->sa[5];
-                        break;
-        }
-
-        return 0;
-}
-
-static int smctr_make_access_pri(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        tsv->svi = AUTHORIZED_ACCESS_PRIORITY;
-        tsv->svl = S_AUTHORIZED_ACCESS_PRIORITY;
-
-        tsv->svv[0] = MSB(tp->authorized_access_priority);
-        tsv->svv[1] = LSB(tp->authorized_access_priority);
-
-       return 0;
-}
-
-static int smctr_make_addr_mod(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        tsv->svi = ADDRESS_MODIFER;
-        tsv->svl = S_ADDRESS_MODIFER;
-
-        tsv->svv[0] = 0;
-        tsv->svv[1] = 0;
-
-        return 0;
-}
-
-static int smctr_make_auth_funct_class(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        tsv->svi = AUTHORIZED_FUNCTION_CLASS;
-        tsv->svl = S_AUTHORIZED_FUNCTION_CLASS;
-
-        tsv->svv[0] = MSB(tp->authorized_function_classes);
-        tsv->svv[1] = LSB(tp->authorized_function_classes);
-
-        return 0;
-}
-
-static int smctr_make_corr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv, __u16 correlator)
-{
-        tsv->svi = CORRELATOR;
-        tsv->svl = S_CORRELATOR;
-
-        tsv->svv[0] = MSB(correlator);
-        tsv->svv[1] = LSB(correlator);
-
-        return 0;
-}
-
-static int smctr_make_funct_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        smctr_get_functional_address(dev);
-
-        tsv->svi = FUNCTIONAL_ADDRESS;
-        tsv->svl = S_FUNCTIONAL_ADDRESS;
-
-        tsv->svv[0] = MSB(tp->misc_command_data[0]);
-        tsv->svv[1] = LSB(tp->misc_command_data[0]);
-
-        tsv->svv[2] = MSB(tp->misc_command_data[1]);
-        tsv->svv[3] = LSB(tp->misc_command_data[1]);
-
-        return 0;
-}
-
-static int smctr_make_group_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        smctr_get_group_address(dev);
-
-        tsv->svi = GROUP_ADDRESS;
-        tsv->svl = S_GROUP_ADDRESS;
-
-        tsv->svv[0] = MSB(tp->misc_command_data[0]);
-        tsv->svv[1] = LSB(tp->misc_command_data[0]);
-
-        tsv->svv[2] = MSB(tp->misc_command_data[1]);
-        tsv->svv[3] = LSB(tp->misc_command_data[1]);
-
-        /* Set Group Address Sub-vector to all zeros if only the
-         * Group Address/Functional Address Indicator is set.
-         */
-        if(tsv->svv[0] == 0x80 && tsv->svv[1] == 0x00 &&
-          tsv->svv[2] == 0x00 && tsv->svv[3] == 0x00)
-                tsv->svv[0] = 0x00;
-
-        return 0;
-}
-
-static int smctr_make_phy_drop_num(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        smctr_get_physical_drop_number(dev);
-
-        tsv->svi = PHYSICAL_DROP;
-        tsv->svl = S_PHYSICAL_DROP;
-
-        tsv->svv[0] = MSB(tp->misc_command_data[0]);
-        tsv->svv[1] = LSB(tp->misc_command_data[0]);
-
-        tsv->svv[2] = MSB(tp->misc_command_data[1]);
-        tsv->svv[3] = LSB(tp->misc_command_data[1]);
-
-        return 0;
-}
-
-static int smctr_make_product_id(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        int i;
-
-        tsv->svi = PRODUCT_INSTANCE_ID;
-        tsv->svl = S_PRODUCT_INSTANCE_ID;
-
-        for(i = 0; i < 18; i++)
-                tsv->svv[i] = 0xF0;
-
-        return 0;
-}
-
-static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        smctr_get_station_id(dev);
-
-        tsv->svi = STATION_IDENTIFER;
-        tsv->svl = S_STATION_IDENTIFER;
-
-        tsv->svv[0] = MSB(tp->misc_command_data[0]);
-        tsv->svv[1] = LSB(tp->misc_command_data[0]);
-
-        tsv->svv[2] = MSB(tp->misc_command_data[1]);
-        tsv->svv[3] = LSB(tp->misc_command_data[1]);
-
-        tsv->svv[4] = MSB(tp->misc_command_data[2]);
-        tsv->svv[5] = LSB(tp->misc_command_data[2]);
-
-        return 0;
-}
-
-static int smctr_make_ring_station_status(struct net_device *dev,
-        MAC_SUB_VECTOR * tsv)
-{
-        tsv->svi = RING_STATION_STATUS;
-        tsv->svl = S_RING_STATION_STATUS;
-
-        tsv->svv[0] = 0;
-        tsv->svv[1] = 0;
-        tsv->svv[2] = 0;
-        tsv->svv[3] = 0;
-        tsv->svv[4] = 0;
-        tsv->svv[5] = 0;
-
-        return 0;
-}
-
-static int smctr_make_ring_station_version(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        tsv->svi = RING_STATION_VERSION_NUMBER;
-        tsv->svl = S_RING_STATION_VERSION_NUMBER;
-
-        tsv->svv[0] = 0xe2;            /* EBCDIC - S */
-        tsv->svv[1] = 0xd4;            /* EBCDIC - M */
-        tsv->svv[2] = 0xc3;            /* EBCDIC - C */
-        tsv->svv[3] = 0x40;            /* EBCDIC -   */
-        tsv->svv[4] = 0xe5;            /* EBCDIC - V */
-        tsv->svv[5] = 0xF0 + (tp->microcode_version >> 4);
-        tsv->svv[6] = 0xF0 + (tp->microcode_version & 0x0f);
-        tsv->svv[7] = 0x40;            /* EBCDIC -   */
-        tsv->svv[8] = 0xe7;            /* EBCDIC - X */
-
-        if(tp->extra_info & CHIP_REV_MASK)
-                tsv->svv[9] = 0xc5;    /* EBCDIC - E */
-        else
-                tsv->svv[9] = 0xc4;    /* EBCDIC - D */
-
-        return 0;
-}
-
-static int smctr_make_tx_status_code(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv, __u16 tx_fstatus)
-{
-        tsv->svi = TRANSMIT_STATUS_CODE;
-        tsv->svl = S_TRANSMIT_STATUS_CODE;
-
-       tsv->svv[0] = ((tx_fstatus & 0x0100 >> 6) | IBM_PASS_SOURCE_ADDR);
-
-        /* Stripped frame status of Transmitted Frame */
-        tsv->svv[1] = tx_fstatus & 0xff;
-
-        return 0;
-}
-
-static int smctr_make_upstream_neighbor_addr(struct net_device *dev,
-        MAC_SUB_VECTOR *tsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        smctr_get_upstream_neighbor_addr(dev);
-
-        tsv->svi = UPSTREAM_NEIGHBOR_ADDRESS;
-        tsv->svl = S_UPSTREAM_NEIGHBOR_ADDRESS;
-
-        tsv->svv[0] = MSB(tp->misc_command_data[0]);
-        tsv->svv[1] = LSB(tp->misc_command_data[0]);
-
-        tsv->svv[2] = MSB(tp->misc_command_data[1]);
-        tsv->svv[3] = LSB(tp->misc_command_data[1]);
-
-        tsv->svv[4] = MSB(tp->misc_command_data[2]);
-        tsv->svv[5] = LSB(tp->misc_command_data[2]);
-
-        return 0;
-}
-
-static int smctr_make_wrap_data(struct net_device *dev, MAC_SUB_VECTOR *tsv)
-{
-        tsv->svi = WRAP_DATA;
-        tsv->svl = S_WRAP_DATA;
-
-        return 0;
-}
-
-/*
- * Open/initialize the board. This is called sometime after
- * booting when the 'ifconfig' program is run.
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is non-reboot way to recover if something goes wrong.
- */
-static int smctr_open(struct net_device *dev)
-{
-        int err;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_open\n", dev->name);
-
-        err = smctr_init_adapter(dev);
-        if(err < 0)
-                return err;
-
-        return err;
-}
-
-/* Interrupt driven open of Token card. */
-static int smctr_open_tr(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned long flags;
-        int err;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_open_tr\n", dev->name);
-
-        /* Now we can actually open the adapter. */
-        if(tp->status == OPEN)
-                return 0;
-        if(tp->status != INITIALIZED)
-                return -1;
-
-       /* FIXME: it would work a lot better if we masked the irq sources
-          on the card here, then we could skip the locking and poll nicely */
-       spin_lock_irqsave(&tp->lock, flags);
-       
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)MAC_QUEUE)))
-                goto out;
-
-        if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)MAC_QUEUE)))
-                goto out;
-
-        if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)NON_MAC_QUEUE)))
-                goto out;
-
-        if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)NON_MAC_QUEUE)))
-                goto out;
-
-        tp->status = CLOSED;
-
-        /* Insert into the Ring or Enter Loopback Mode. */
-        if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_1)
-        {
-                tp->status = CLOSED;
-
-                if(!(err = smctr_issue_trc_loopback_cmd(dev)))
-                {
-                        if(!(err = smctr_wait_cmd(dev)))
-                                tp->status = OPEN;
-                }
-
-                smctr_status_chg(dev);
-        }
-        else
-        {
-                if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_2)
-                {
-                        tp->status = CLOSED;
-                        if(!(err = smctr_issue_tri_loopback_cmd(dev)))
-                        {
-                                if(!(err = smctr_wait_cmd(dev)))
-                                        tp->status = OPEN;
-                        }
-
-                        smctr_status_chg(dev);
-                }
-                else
-                {
-                        if((tp->mode_bits & LOOPING_MODE_MASK)
-                                == LOOPBACK_MODE_3)
-                        {
-                                tp->status = CLOSED;
-                                if(!(err = smctr_lobe_media_test_cmd(dev)))
-                                {
-                                        if(!(err = smctr_wait_cmd(dev)))
-                                                tp->status = OPEN;
-                                }
-                                smctr_status_chg(dev);
-                        }
-                        else
-                        {
-                                if(!(err = smctr_lobe_media_test(dev)))
-                                        err = smctr_issue_insert_cmd(dev);
-                               else
-                                {
-                                        if(err == LOBE_MEDIA_TEST_FAILED)
-                                                printk(KERN_WARNING "%s: Lobe Media Test Failure - Check cable?\n", dev->name);
-                                }
-                        }
-                }
-        }
-
-out:
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return err;
-}
-
-/* Check for a network adapter of this type, 
- * and return device structure if one exists.
- */
-struct net_device __init *smctr_probe(int unit)
-{
-       struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-       static const unsigned ports[] = {
-               0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300,
-               0x320, 0x340, 0x360, 0x380, 0
-       };
-       const unsigned *port;
-        int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "tr%d", unit);
-               netdev_boot_setup_check(dev);
-       }
-
-        if (dev->base_addr > 0x1ff)    /* Check a single specified location. */
-               err = smctr_probe1(dev, dev->base_addr);
-        else if(dev->base_addr != 0)  /* Don't probe at all. */
-                err =-ENXIO;
-       else {
-               for (port = ports; *port; port++) {
-                       err = smctr_probe1(dev, *port);
-                       if (!err)
-                               break;
-               }
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-#ifdef CONFIG_MCA_LEGACY
-       { struct net_local *tp = netdev_priv(dev);
-         if (tp->slot_num)
-               mca_mark_as_unused(tp->slot_num);
-       }
-#endif
-       release_region(dev->base_addr, SMCTR_IO_EXTENT);
-       free_irq(dev->irq, dev);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops smctr_netdev_ops = {
-       .ndo_open          = smctr_open,
-       .ndo_stop          = smctr_close,
-       .ndo_start_xmit    = smctr_send_packet,
-       .ndo_tx_timeout    = smctr_timeout,
-       .ndo_get_stats     = smctr_get_stats,
-       .ndo_set_rx_mode   = smctr_set_multicast_list,
-};
-
-static int __init smctr_probe1(struct net_device *dev, int ioaddr)
-{
-        static unsigned version_printed;
-        struct net_local *tp = netdev_priv(dev);
-        int err;
-        __u32 *ram;
-
-        if(smctr_debug && version_printed++ == 0)
-                printk(version);
-
-        spin_lock_init(&tp->lock);
-        dev->base_addr = ioaddr;
-
-       /* Actually detect an adapter now. */
-        err = smctr_chk_isa(dev);
-        if(err < 0)
-        {
-               if ((err = smctr_chk_mca(dev)) < 0) {
-                       err = -ENODEV;
-                       goto out;
-               }
-        }
-
-        tp = netdev_priv(dev);
-        dev->mem_start = tp->ram_base;
-        dev->mem_end = dev->mem_start + 0x10000;
-        ram = (__u32 *)phys_to_virt(dev->mem_start);
-        tp->ram_access = *(__u32 *)&ram;
-       tp->status = NOT_INITIALIZED;
-
-        err = smctr_load_firmware(dev);
-        if(err != UCODE_PRESENT && err != SUCCESS)
-        {
-                printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err);
-               err = -EIO;
-               goto out;
-        }
-
-       /* Allow user to specify ring speed on module insert. */
-       if(ringspeed == 4)
-               tp->media_type = MEDIA_UTP_4;
-       else
-               tp->media_type = MEDIA_UTP_16;
-
-        printk(KERN_INFO "%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n",
-                dev->name, smctr_name, smctr_model,
-                (unsigned int)dev->base_addr,
-                dev->irq, tp->rom_base, tp->ram_base);
-
-       dev->netdev_ops = &smctr_netdev_ops;
-        dev->watchdog_timeo    = HZ;
-        return 0;
-
-out:
-       return err;
-}
-
-static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
-        struct net_device *dev, __u16 rx_status)
-{
-        struct net_local *tp = netdev_priv(dev);
-        struct sk_buff *skb;
-        __u16 rcode, correlator;
-        int err = 0;
-        __u8 xframe = 1;
-
-        rmf->vl = SWAP_BYTES(rmf->vl);
-        if(rx_status & FCB_RX_STATUS_DA_MATCHED)
-        {
-                switch(rmf->vc)
-                {
-                        /* Received MAC Frames Processed by RS. */
-                        case INIT:
-                                if((rcode = smctr_rcv_init(dev, rmf, &correlator)) == HARDWARE_FAILED)
-                                {
-                                        return rcode;
-                                }
-
-                                if((err = smctr_send_rsp(dev, rmf, rcode,
-                                        correlator)))
-                                {
-                                        return err;
-                                }
-                                break;
-
-                        case CHG_PARM:
-                                if((rcode = smctr_rcv_chg_param(dev, rmf,
-                                        &correlator)) ==HARDWARE_FAILED)
-                                {
-                                        return rcode;
-                                }
-
-                                if((err = smctr_send_rsp(dev, rmf, rcode,
-                                        correlator)))
-                                {
-                                        return err;
-                                }
-                                break;
-
-                        case RQ_ADDR:
-                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
-                                        rmf, &correlator)) != POSITIVE_ACK)
-                                {
-                                        if(rcode == HARDWARE_FAILED)
-                                                return rcode;
-                                        else
-                                                return smctr_send_rsp(dev, rmf,
-                                                        rcode, correlator);
-                                }
-
-                                if((err = smctr_send_rpt_addr(dev, rmf,
-                                        correlator)))
-                                {
-                                        return err;
-                                }
-                                break;
-
-                        case RQ_ATTCH:
-                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
-                                        rmf, &correlator)) != POSITIVE_ACK)
-                                {
-                                        if(rcode == HARDWARE_FAILED)
-                                                return rcode;
-                                        else
-                                                return smctr_send_rsp(dev, rmf,
-                                                        rcode,
-                                                        correlator);
-                                }
-
-                                if((err = smctr_send_rpt_attch(dev, rmf,
-                                        correlator)))
-                                {
-                                        return err;
-                                }
-                                break;
-
-                        case RQ_STATE:
-                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
-                                        rmf, &correlator)) != POSITIVE_ACK)
-                                {
-                                        if(rcode == HARDWARE_FAILED)
-                                                return rcode;
-                                        else
-                                                return smctr_send_rsp(dev, rmf,
-                                                        rcode,
-                                                        correlator);
-                                }
-
-                                if((err = smctr_send_rpt_state(dev, rmf,
-                                        correlator)))
-                                {
-                                        return err;
-                                }
-                                break;
-
-                        case TX_FORWARD: {
-                               __u16 uninitialized_var(tx_fstatus);
-
-                                if((rcode = smctr_rcv_tx_forward(dev, rmf))
-                                        != POSITIVE_ACK)
-                                {
-                                        if(rcode == HARDWARE_FAILED)
-                                                return rcode;
-                                        else
-                                                return smctr_send_rsp(dev, rmf,
-                                                        rcode,
-                                                        correlator);
-                                }
-
-                                if((err = smctr_send_tx_forward(dev, rmf,
-                                        &tx_fstatus)) == HARDWARE_FAILED)
-                                {
-                                        return err;
-                                }
-
-                                if(err == A_FRAME_WAS_FORWARDED)
-                                {
-                                        if((err = smctr_send_rpt_tx_forward(dev,
-                                               rmf, tx_fstatus))
-                                                == HARDWARE_FAILED)
-                                        {
-                                                return err;
-                                        }
-                                }
-                                break;
-                       }
-
-                        /* Received MAC Frames Processed by CRS/REM/RPS. */
-                        case RSP:
-                        case RQ_INIT:
-                        case RPT_NEW_MON:
-                        case RPT_SUA_CHG:
-                        case RPT_ACTIVE_ERR:
-                        case RPT_NN_INCMP:
-                        case RPT_ERROR:
-                        case RPT_ATTCH:
-                        case RPT_STATE:
-                        case RPT_ADDR:
-                                break;
-
-                        /* Rcvd Att. MAC Frame (if RXATMAC set) or UNKNOWN */
-                        default:
-                                xframe = 0;
-                                if(!(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES))
-                                {
-                                        rcode = smctr_rcv_unknown(dev, rmf,
-                                                &correlator);
-                                        if((err = smctr_send_rsp(dev, rmf,rcode,
-                                                correlator)))
-                                        {
-                                                return err;
-                                        }
-                                }
-
-                                break;
-                }
-        }
-        else
-        {
-                /* 1. DA doesn't match (Promiscuous Mode).
-                 * 2. Parse for Extended MAC Frame Type.
-                 */
-                switch(rmf->vc)
-                {
-                        case RSP:
-                        case INIT:
-                        case RQ_INIT:
-                        case RQ_ADDR:
-                        case RQ_ATTCH:
-                        case RQ_STATE:
-                        case CHG_PARM:
-                        case RPT_ADDR:
-                        case RPT_ERROR:
-                        case RPT_ATTCH:
-                        case RPT_STATE:
-                        case RPT_NEW_MON:
-                        case RPT_SUA_CHG:
-                        case RPT_NN_INCMP:
-                        case RPT_ACTIVE_ERR:
-                                break;
-
-                        default:
-                                xframe = 0;
-                                break;
-                }
-        }
-
-        /* NOTE: UNKNOWN MAC frames will NOT be passed up unless
-         * ACCEPT_ATT_MAC_FRAMES is set.
-         */
-        if(((tp->receive_mask & ACCEPT_ATT_MAC_FRAMES) &&
-           (xframe == (__u8)0)) ||
-          ((tp->receive_mask & ACCEPT_EXT_MAC_FRAMES) &&
-           (xframe == (__u8)1)))
-        {
-                rmf->vl = SWAP_BYTES(rmf->vl);
-
-                if (!(skb = dev_alloc_skb(size)))
-                       return -ENOMEM;
-                skb->len = size;
-
-                /* Slide data into a sleek skb. */
-                skb_put(skb, skb->len);
-                skb_copy_to_linear_data(skb, rmf, skb->len);
-
-                /* Update Counters */
-                tp->MacStat.rx_packets++;
-                tp->MacStat.rx_bytes += skb->len;
-
-                /* Kick the packet on up. */
-                skb->protocol = tr_type_trans(skb, dev);
-                netif_rx(skb);
-                err = 0;
-        }
-
-        return err;
-}
-
-/* Adapter RAM test. Incremental word ODD boundary data test. */
-static int smctr_ram_memory_test(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u16 page, pages_of_ram, start_pattern = 0, word_pattern = 0,
-                word_read = 0, err_word = 0, err_pattern = 0;
-        unsigned int err_offset;
-        __u32 j, pword;
-        __u8 err = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_ram_memory_test\n", dev->name);
-
-        start_pattern   = 0x0001;
-        pages_of_ram    = tp->ram_size / tp->ram_usable;
-        pword           = tp->ram_access;
-
-        /* Incremental word ODD boundary test. */
-        for(page = 0; (page < pages_of_ram) && (~err);
-                page++, start_pattern += 0x8000)
-        {
-                smctr_set_page(dev, (__u8 *)(tp->ram_access
-                        + (page * tp->ram_usable * 1024) + 1));
-                word_pattern = start_pattern;
-
-                for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1; j += 2)
-                        *(__u16 *)(pword + j) = word_pattern++;
-
-                word_pattern = start_pattern;
-
-                for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1 && (~err);
-                   j += 2, word_pattern++)
-                {
-                        word_read = *(__u16 *)(pword + j);
-                        if(word_read != word_pattern)
-                        {
-                                err             = (__u8)1;
-                                err_offset      = j;
-                                err_word        = word_read;
-                                err_pattern     = word_pattern;
-                                return RAM_TEST_FAILED;
-                        }
-                }
-        }
-
-        /* Zero out memory. */
-        for(page = 0; page < pages_of_ram && (~err); page++)
-        {
-                smctr_set_page(dev, (__u8 *)(tp->ram_access
-                        + (page * tp->ram_usable * 1024)));
-                word_pattern = 0;
-
-                for(j = 0; j < (__u32)tp->ram_usable * 1024; j +=2)
-                        *(__u16 *)(pword + j) = word_pattern;
-
-                for(j =0; j < (__u32)tp->ram_usable * 1024 && (~err); j += 2)
-                {
-                        word_read = *(__u16 *)(pword + j);
-                        if(word_read != word_pattern)
-                        {
-                                err             = (__u8)1;
-                                err_offset      = j;
-                                err_word        = word_read;
-                                err_pattern     = word_pattern;
-                                return RAM_TEST_FAILED;
-                        }
-                }
-        }
-
-        smctr_set_page(dev, (__u8 *)tp->ram_access);
-
-        return 0;
-}
-
-static int smctr_rcv_chg_param(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator)
-{
-        MAC_SUB_VECTOR *rsv;
-        signed short vlen;
-        __u16 rcode = POSITIVE_ACK;
-        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
-
-        /* This Frame can only come from a CRS */
-        if((rmf->dc_sc & SC_MASK) != SC_CRS)
-                return E_INAPPROPRIATE_SOURCE_CLASS;
-
-        /* Remove MVID Length from total length. */
-        vlen = (signed short)rmf->vl - 4;
-
-        /* Point to First SVID */
-        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
-
-        /* Search for Appropriate SVID's. */
-        while((vlen > 0) && (rcode == POSITIVE_ACK))
-        {
-                switch(rsv->svi)
-                {
-                        case CORRELATOR:
-                                svectors |= F_CORRELATOR;
-                                rcode = smctr_set_corr(dev, rsv, correlator);
-                                break;
-
-                        case LOCAL_RING_NUMBER:
-                                svectors |= F_LOCAL_RING_NUMBER;
-                                rcode = smctr_set_local_ring_num(dev, rsv);
-                                break;
-
-                        case ASSIGN_PHYSICAL_DROP:
-                                svectors |= F_ASSIGN_PHYSICAL_DROP;
-                                rcode = smctr_set_phy_drop(dev, rsv);
-                                break;
-
-                        case ERROR_TIMER_VALUE:
-                                svectors |= F_ERROR_TIMER_VALUE;
-                                rcode = smctr_set_error_timer_value(dev, rsv);
-                                break;
-
-                        case AUTHORIZED_FUNCTION_CLASS:
-                                svectors |= F_AUTHORIZED_FUNCTION_CLASS;
-                                rcode = smctr_set_auth_funct_class(dev, rsv);
-                                break;
-
-                        case AUTHORIZED_ACCESS_PRIORITY:
-                                svectors |= F_AUTHORIZED_ACCESS_PRIORITY;
-                                rcode = smctr_set_auth_access_pri(dev, rsv);
-                                break;
-
-                        default:
-                                rcode = E_SUB_VECTOR_UNKNOWN;
-                                break;
-                }
-
-                /* Let Sender Know if SUM of SV length's is
-                 * larger then length in MVID length field
-                 */
-                if((vlen -= rsv->svl) < 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-
-                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
-        }
-
-        if(rcode == POSITIVE_ACK)
-        {
-                /* Let Sender Know if MVID length field
-                 * is larger then SUM of SV length's
-                 */
-                if(vlen != 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-                else
-               {
-                       /* Let Sender Know if Expected SVID Missing */
-                       if((svectors & R_CHG_PARM) ^ R_CHG_PARM)
-                               rcode = E_MISSING_SUB_VECTOR;
-               }
-        }
-
-        return rcode;
-}
-
-static int smctr_rcv_init(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator)
-{
-        MAC_SUB_VECTOR *rsv;
-        signed short vlen;
-        __u16 rcode = POSITIVE_ACK;
-        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
-
-        /* This Frame can only come from a RPS */
-        if((rmf->dc_sc & SC_MASK) != SC_RPS)
-                return E_INAPPROPRIATE_SOURCE_CLASS;
-
-        /* Remove MVID Length from total length. */
-        vlen = (signed short)rmf->vl - 4;
-
-        /* Point to First SVID */
-        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
-
-        /* Search for Appropriate SVID's */
-        while((vlen > 0) && (rcode == POSITIVE_ACK))
-        {
-                switch(rsv->svi)
-                {
-                        case CORRELATOR:
-                                svectors |= F_CORRELATOR;
-                                rcode = smctr_set_corr(dev, rsv, correlator);
-                                break;
-
-                        case LOCAL_RING_NUMBER:
-                                svectors |= F_LOCAL_RING_NUMBER;
-                                rcode = smctr_set_local_ring_num(dev, rsv);
-                                break;
-
-                        case ASSIGN_PHYSICAL_DROP:
-                                svectors |= F_ASSIGN_PHYSICAL_DROP;
-                                rcode = smctr_set_phy_drop(dev, rsv);
-                                break;
-
-                        case ERROR_TIMER_VALUE:
-                                svectors |= F_ERROR_TIMER_VALUE;
-                                rcode = smctr_set_error_timer_value(dev, rsv);
-                                break;
-
-                        default:
-                                rcode = E_SUB_VECTOR_UNKNOWN;
-                                break;
-                }
-
-                /* Let Sender Know if SUM of SV length's is
-                 * larger then length in MVID length field
-                */
-                if((vlen -= rsv->svl) < 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-
-                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
-        }
-
-        if(rcode == POSITIVE_ACK)
-        {
-                /* Let Sender Know if MVID length field
-                 * is larger then SUM of SV length's
-                 */
-                if(vlen != 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-                else
-               {
-                       /* Let Sender Know if Expected SV Missing */
-                       if((svectors & R_INIT) ^ R_INIT)
-                               rcode = E_MISSING_SUB_VECTOR;
-               }
-        }
-
-        return rcode;
-}
-
-static int smctr_rcv_tx_forward(struct net_device *dev, MAC_HEADER *rmf)
-{
-        MAC_SUB_VECTOR *rsv;
-        signed short vlen;
-        __u16 rcode = POSITIVE_ACK;
-        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
-
-        /* This Frame can only come from a CRS */
-        if((rmf->dc_sc & SC_MASK) != SC_CRS)
-                return E_INAPPROPRIATE_SOURCE_CLASS;
-
-        /* Remove MVID Length from total length */
-        vlen = (signed short)rmf->vl - 4;
-
-        /* Point to First SVID */
-        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
-
-        /* Search for Appropriate SVID's */
-        while((vlen > 0) && (rcode == POSITIVE_ACK))
-        {
-                switch(rsv->svi)
-                {
-                        case FRAME_FORWARD:
-                                svectors |= F_FRAME_FORWARD;
-                                rcode = smctr_set_frame_forward(dev, rsv, 
-                                       rmf->dc_sc);
-                                break;
-
-                        default:
-                                rcode = E_SUB_VECTOR_UNKNOWN;
-                                break;
-                }
-
-                /* Let Sender Know if SUM of SV length's is
-                 * larger then length in MVID length field
-                */
-                if((vlen -= rsv->svl) < 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-
-                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
-        }
-
-        if(rcode == POSITIVE_ACK)
-        {
-                /* Let Sender Know if MVID length field
-                 * is larger then SUM of SV length's
-                 */
-                if(vlen != 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-                else
-               {
-                       /* Let Sender Know if Expected SV Missing */
-                       if((svectors & R_TX_FORWARD) ^ R_TX_FORWARD)
-                               rcode = E_MISSING_SUB_VECTOR;
-               }
-        }
-
-        return rcode;
-}
-
-static int smctr_rcv_rq_addr_state_attch(struct net_device *dev,
-        MAC_HEADER *rmf, __u16 *correlator)
-{
-        MAC_SUB_VECTOR *rsv;
-        signed short vlen;
-        __u16 rcode = POSITIVE_ACK;
-        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
-
-        /* Remove MVID Length from total length */
-        vlen = (signed short)rmf->vl - 4;
-
-        /* Point to First SVID */
-        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
-
-        /* Search for Appropriate SVID's */
-        while((vlen > 0) && (rcode == POSITIVE_ACK))
-        {
-                switch(rsv->svi)
-                {
-                        case CORRELATOR:
-                                svectors |= F_CORRELATOR;
-                                rcode = smctr_set_corr(dev, rsv, correlator);
-                                break;
-
-                        default:
-                                rcode = E_SUB_VECTOR_UNKNOWN;
-                                break;
-                }
-
-                /* Let Sender Know if SUM of SV length's is
-                 * larger then length in MVID length field
-                 */
-                if((vlen -= rsv->svl) < 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-
-                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
-        }
-
-        if(rcode == POSITIVE_ACK)
-        {
-                /* Let Sender Know if MVID length field
-                 * is larger then SUM of SV length's
-                 */
-                if(vlen != 0)
-                        rcode = E_VECTOR_LENGTH_ERROR;
-                else
-               {
-                       /* Let Sender Know if Expected SVID Missing */
-                       if((svectors & R_RQ_ATTCH_STATE_ADDR) 
-                               ^ R_RQ_ATTCH_STATE_ADDR)
-                               rcode = E_MISSING_SUB_VECTOR;
-                       }
-        }
-
-        return rcode;
-}
-
-static int smctr_rcv_unknown(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *correlator)
-{
-        MAC_SUB_VECTOR *rsv;
-        signed short vlen;
-
-        *correlator = 0;
-
-        /* Remove MVID Length from total length */
-        vlen = (signed short)rmf->vl - 4;
-
-        /* Point to First SVID */
-        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
-
-        /* Search for CORRELATOR for RSP to UNKNOWN */
-        while((vlen > 0) && (*correlator == 0))
-        {
-                switch(rsv->svi)
-                {
-                        case CORRELATOR:
-                                smctr_set_corr(dev, rsv, correlator);
-                                break;
-
-                        default:
-                                break;
-                }
-
-                vlen -= rsv->svl;
-                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
-        }
-
-        return E_UNRECOGNIZED_VECTOR_ID;
-}
-
-/*
- * Reset the 825 NIC and exit w:
- * 1. The NIC reset cleared (non-reset state), halted and un-initialized.
- * 2. TINT masked.
- * 3. CBUSY masked.
- * 4. TINT clear.
- * 5. CBUSY clear.
- */
-static int smctr_reset_adapter(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-
-        /* Reseting the NIC will put it in a halted and un-initialized state. */        smctr_set_trc_reset(ioaddr);
-        mdelay(200); /* ~2 ms */
-
-        smctr_clear_trc_reset(ioaddr);
-        mdelay(200); /* ~2 ms */
-
-        /* Remove any latched interrupts that occurred prior to reseting the
-         * adapter or possibily caused by line glitches due to the reset.
-         */
-        outb(tp->trc_mask | CSR_CLRTINT | CSR_CLRCBUSY, ioaddr + CSR);
-
-        return 0;
-}
-
-static int smctr_restart_tx_chain(struct net_device *dev, short queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_restart_tx_chain\n", dev->name);
-
-        if(tp->num_tx_fcbs_used[queue] != 0 &&
-          tp->tx_queue_status[queue] == NOT_TRANSMITING)
-        {
-                tp->tx_queue_status[queue] = TRANSMITING;
-                err = smctr_issue_resume_tx_fcb_cmd(dev, queue);
-        }
-
-        return err;
-}
-
-static int smctr_ring_status_chg(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name);
-
-        /* Check for ring_status_flag: whenever MONITOR_STATE_BIT
-         * Bit is set, check value of monitor_state, only then we
-         * enable and start transmit/receive timeout (if and only
-         * if it is MS_ACTIVE_MONITOR_STATE or MS_STANDBY_MONITOR_STATE)
-         */
-        if(tp->ring_status_flags == MONITOR_STATE_CHANGED)
-        {
-                if((tp->monitor_state == MS_ACTIVE_MONITOR_STATE) ||
-                  (tp->monitor_state == MS_STANDBY_MONITOR_STATE))
-                {
-                        tp->monitor_state_ready = 1;
-                }
-                else
-                {
-                        /* if adapter is NOT in either active monitor
-                         * or standby monitor state => Disable
-                         * transmit/receive timeout.
-                         */
-                        tp->monitor_state_ready = 0;
-
-                       /* Ring speed problem, switching to auto mode. */
-                       if(tp->monitor_state == MS_MONITOR_FSM_INACTIVE &&
-                          !tp->cleanup)
-                       {
-                               printk(KERN_INFO "%s: Incorrect ring speed switching.\n",
-                                       dev->name);
-                               smctr_set_ring_speed(dev);
-                       }
-                }
-        }
-
-        if(!(tp->ring_status_flags & RING_STATUS_CHANGED))
-                return 0;
-
-        switch(tp->ring_status)
-        {
-                case RING_RECOVERY:
-                        printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
-                        break;
-
-                case SINGLE_STATION:
-                        printk(KERN_INFO "%s: Single Statinon\n", dev->name);
-                        break;
-
-                case COUNTER_OVERFLOW:
-                        printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-                        break;
-
-                case REMOVE_RECEIVED:
-                        printk(KERN_INFO "%s: Remove Received\n", dev->name);
-                        break;
-
-                case AUTO_REMOVAL_ERROR:
-                        printk(KERN_INFO "%s: Auto Remove Error\n", dev->name);
-                        break;
-
-                case LOBE_WIRE_FAULT:
-                        printk(KERN_INFO "%s: Lobe Wire Fault\n", dev->name);
-                        break;
-
-                case TRANSMIT_BEACON:
-                        printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
-                        break;
-
-                case SOFT_ERROR:
-                        printk(KERN_INFO "%s: Soft Error\n", dev->name);
-                        break;
-
-                case HARD_ERROR:
-                        printk(KERN_INFO "%s: Hard Error\n", dev->name);
-                        break;
-
-                case SIGNAL_LOSS:
-                        printk(KERN_INFO "%s: Signal Loss\n", dev->name);
-                        break;
-
-                default:
-                       printk(KERN_INFO "%s: Unknown ring status change\n",
-                               dev->name);
-                        break;
-        }
-
-        return 0;
-}
-
-static int smctr_rx_frame(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u16 queue, status, rx_size, err = 0;
-        __u8 *pbuff;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_rx_frame\n", dev->name);
-
-        queue = tp->receive_queue_number;
-
-        while((status = tp->rx_fcb_curr[queue]->frame_status) != SUCCESS)
-        {
-                err = HARDWARE_FAILED;
-
-                if(((status & 0x007f) == 0) ||
-                  ((tp->receive_mask & ACCEPT_ERR_PACKETS) != 0))
-                {
-                        /* frame length less the CRC (4 bytes) + FS (1 byte) */
-                        rx_size = tp->rx_fcb_curr[queue]->frame_length - 5;
-
-                        pbuff = smctr_get_rx_pointer(dev, queue);
-
-                        smctr_set_page(dev, pbuff);
-                        smctr_disable_16bit(dev);
-
-                        /* pbuff points to addr within one page */
-                        pbuff = (__u8 *)PAGE_POINTER(pbuff);
-
-                        if(queue == NON_MAC_QUEUE)
-                        {
-                                struct sk_buff *skb;
-
-                                skb = dev_alloc_skb(rx_size);
-                               if (skb) {
-                                       skb_put(skb, rx_size);
-
-                                       skb_copy_to_linear_data(skb, pbuff, rx_size);
-
-                                       /* Update Counters */
-                                       tp->MacStat.rx_packets++;
-                                       tp->MacStat.rx_bytes += skb->len;
-
-                                       /* Kick the packet on up. */
-                                       skb->protocol = tr_type_trans(skb, dev);
-                                       netif_rx(skb);
-                               } else {
-                               }
-                        }
-                        else
-                                smctr_process_rx_packet((MAC_HEADER *)pbuff,
-                                        rx_size, dev, status);
-                }
-
-                smctr_enable_16bit(dev);
-                smctr_set_page(dev, (__u8 *)tp->ram_access);
-                smctr_update_rx_chain(dev, queue);
-
-                if(err != SUCCESS)
-                        break;
-        }
-
-        return err;
-}
-
-static int smctr_send_dat(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int i, err;
-        MAC_HEADER *tmf;
-        FCBlock *fcb;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_send_dat\n", dev->name);
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE,
-                sizeof(MAC_HEADER))) == (FCBlock *)(-1L))
-        {
-                return OUT_OF_RESOURCES;
-        }
-
-        /* Initialize DAT Data Fields. */
-        tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->ac = MSB(AC_FC_DAT);
-        tmf->fc = LSB(AC_FC_DAT);
-
-        for(i = 0; i < 6; i++)
-        {
-                tmf->sa[i] = dev->dev_addr[i];
-                tmf->da[i] = dev->dev_addr[i];
-
-        }
-
-        tmf->vc        = DAT;
-        tmf->dc_sc     = DC_RS | SC_RS;
-        tmf->vl        = 4;
-        tmf->vl        = SWAP_BYTES(tmf->vl);
-
-        /* Start Transmit. */
-        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
-                return err;
-
-        /* Wait for Transmit to Complete */
-        for(i = 0; i < 10000; i++)
-        {
-                if(fcb->frame_status & FCB_COMMAND_DONE)
-                        break;
-                mdelay(1);
-        }
-
-        /* Check if GOOD frame Tx'ed. */
-        if(!(fcb->frame_status &  FCB_COMMAND_DONE) ||
-          fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS))
-        {
-                return INITIALIZE_FAILED;
-        }
-
-        /* De-allocated Tx FCB and Frame Buffer
-         * The FCB must be de-allocated manually if executing with
-         * interrupts disabled, other wise the ISR (LM_Service_Events)
-         * will de-allocate it when the interrupt occurs.
-         */
-        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
-        smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
-
-        return 0;
-}
-
-static void smctr_timeout(struct net_device *dev)
-{
-       /*
-         * If we get here, some higher level has decided we are broken.
-         * There should really be a "kick me" function call instead.
-         *
-         * Resetting the token ring adapter takes a long time so just
-         * fake transmission time and go on trying. Our own timeout
-         * routine is in sktr_timer_chk()
-         */
-        dev->trans_start = jiffies; /* prevent tx timeout */
-        netif_wake_queue(dev);
-}
-
-/*
- * Gets skb from system, queues it and checks if it can be sent
- */
-static netdev_tx_t smctr_send_packet(struct sk_buff *skb,
-                                          struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name);
-
-        /*
-         * Block a transmit overlap
-         */
-         
-        netif_stop_queue(dev);
-
-        if(tp->QueueSkb == 0)
-                return NETDEV_TX_BUSY;     /* Return with tbusy set: queue full */
-
-        tp->QueueSkb--;
-        skb_queue_tail(&tp->SendSkbQueue, skb);
-        smctr_hardware_send_packet(dev, tp);
-        if(tp->QueueSkb > 0)
-               netif_wake_queue(dev);
-               
-        return NETDEV_TX_OK;
-}
-
-static int smctr_send_lobe_media_test(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-       MAC_SUB_VECTOR *tsv;
-       MAC_HEADER *tmf;
-        FCBlock *fcb;
-       __u32 i;
-       int err;
-
-        if(smctr_debug > 15)
-                printk(KERN_DEBUG "%s: smctr_send_lobe_media_test\n", dev->name);
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(struct trh_hdr)
-                + S_WRAP_DATA + S_WRAP_DATA)) == (FCBlock *)(-1L))
-        {
-                return OUT_OF_RESOURCES;
-        }
-
-        /* Initialize DAT Data Fields. */
-        tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->ac = MSB(AC_FC_LOBE_MEDIA_TEST);
-        tmf->fc = LSB(AC_FC_LOBE_MEDIA_TEST);
-
-        for(i = 0; i < 6; i++)
-        {
-                tmf->da[i] = 0;
-                tmf->sa[i] = dev->dev_addr[i];
-        }
-
-        tmf->vc        = LOBE_MEDIA_TEST;
-        tmf->dc_sc     = DC_RS | SC_RS;
-        tmf->vl        = 4;
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_wrap_data(dev, tsv);
-        tmf->vl += tsv->svl;
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_wrap_data(dev, tsv);
-        tmf->vl += tsv->svl;
-
-        /* Start Transmit. */
-        tmf->vl = SWAP_BYTES(tmf->vl);
-        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
-                return err;
-
-        /* Wait for Transmit to Complete. (10 ms). */
-        for(i=0; i < 10000; i++)
-        {
-                if(fcb->frame_status & FCB_COMMAND_DONE)
-                        break;
-                mdelay(1);
-        }
-
-        /* Check if GOOD frame Tx'ed */
-        if(!(fcb->frame_status & FCB_COMMAND_DONE) ||
-          fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS))
-        {
-                return LOBE_MEDIA_TEST_FAILED;
-        }
-
-        /* De-allocated Tx FCB and Frame Buffer
-         * The FCB must be de-allocated manually if executing with
-         * interrupts disabled, other wise the ISR (LM_Service_Events)
-         * will de-allocate it when the interrupt occurs.
-         */
-        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
-        smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
-
-        return 0;
-}
-
-static int smctr_send_rpt_addr(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator)
-{
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-               + S_CORRELATOR + S_PHYSICAL_DROP + S_UPSTREAM_NEIGHBOR_ADDRESS
-               + S_ADDRESS_MODIFER + S_GROUP_ADDRESS + S_FUNCTIONAL_ADDRESS))
-               == (FCBlock *)(-1L))
-        {
-                return 0;
-        }
-
-        tmf            = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->vc        = RPT_ADDR;
-        tmf->dc_sc     = (rmf->dc_sc & SC_MASK) << 4;
-        tmf->vl        = 4;
-
-        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ADDR);
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_corr(dev, tsv, correlator);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_phy_drop_num(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_upstream_neighbor_addr(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_addr_mod(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_group_addr(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_funct_addr(dev, tsv);
-
-        tmf->vl += tsv->svl;
-
-        /* Subtract out MVID and MVL which is
-         * include in both vl and MAC_HEADER
-         */
-/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
-        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
-*/
-        tmf->vl = SWAP_BYTES(tmf->vl);
-
-        return smctr_trc_send_packet(dev, fcb, MAC_QUEUE);
-}
-
-static int smctr_send_rpt_attch(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator)
-{
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-               + S_CORRELATOR + S_PRODUCT_INSTANCE_ID + S_FUNCTIONAL_ADDRESS
-               + S_AUTHORIZED_FUNCTION_CLASS + S_AUTHORIZED_ACCESS_PRIORITY))
-               == (FCBlock *)(-1L))
-        {
-                return 0;
-        }
-
-        tmf       = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->vc    = RPT_ATTCH;
-        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
-        tmf->vl    = 4;
-
-        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ATTCH);
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_corr(dev, tsv, correlator);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_product_id(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_funct_addr(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_auth_funct_class(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_access_pri(dev, tsv);
-
-        tmf->vl += tsv->svl;
-
-        /* Subtract out MVID and MVL which is
-         * include in both vl and MAC_HEADER
-         */
-/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
-        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
-*/
-        tmf->vl = SWAP_BYTES(tmf->vl);
-
-        return smctr_trc_send_packet(dev, fcb, MAC_QUEUE);
-}
-
-static int smctr_send_rpt_state(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 correlator)
-{
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-               + S_CORRELATOR + S_RING_STATION_VERSION_NUMBER
-               + S_RING_STATION_STATUS + S_STATION_IDENTIFER))
-               == (FCBlock *)(-1L))
-        {
-                return 0;
-        }
-
-        tmf       = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->vc    = RPT_STATE;
-        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
-        tmf->vl    = 4;
-
-        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_STATE);
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_corr(dev, tsv, correlator);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_ring_station_version(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_ring_station_status(dev, tsv);
-
-        tmf->vl += tsv->svl;
-        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-        smctr_make_station_id(dev, tsv);
-
-        tmf->vl += tsv->svl;
-
-        /* Subtract out MVID and MVL which is
-         * include in both vl and MAC_HEADER
-         */
-/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
-        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
-*/
-        tmf->vl = SWAP_BYTES(tmf->vl);
-
-        return smctr_trc_send_packet(dev, fcb, MAC_QUEUE);
-}
-
-static int smctr_send_rpt_tx_forward(struct net_device *dev,
-        MAC_HEADER *rmf, __u16 tx_fstatus)
-{
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-               + S_TRANSMIT_STATUS_CODE)) == (FCBlock *)(-1L))
-        {
-                return 0;
-        }
-
-        tmf       = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->vc    = RPT_TX_FORWARD;
-        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
-        tmf->vl    = 4;
-
-        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_TX_FORWARD);
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_tx_status_code(dev, tsv, tx_fstatus);
-
-        tmf->vl += tsv->svl;
-
-        /* Subtract out MVID and MVL which is
-         * include in both vl and MAC_HEADER
-         */
-/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
-        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
-*/
-        tmf->vl = SWAP_BYTES(tmf->vl);
-
-        return smctr_trc_send_packet(dev, fcb, MAC_QUEUE);
-}
-
-static int smctr_send_rsp(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 rcode, __u16 correlator)
-{
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-               + S_CORRELATOR + S_RESPONSE_CODE)) == (FCBlock *)(-1L))
-        {
-                return 0;
-        }
-
-        tmf       = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-        tmf->vc    = RSP;
-        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
-        tmf->vl    = 4;
-
-        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RSP);
-
-        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-        smctr_make_corr(dev, tsv, correlator);
-
-        return 0;
-}
-
-static int smctr_send_rq_init(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        MAC_HEADER *tmf;
-        MAC_SUB_VECTOR *tsv;
-        FCBlock *fcb;
-       unsigned int i, count = 0;
-       __u16 fstatus;
-       int err;
-
-        do {
-               if(((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
-                       + S_PRODUCT_INSTANCE_ID + S_UPSTREAM_NEIGHBOR_ADDRESS
-                       + S_RING_STATION_VERSION_NUMBER + S_ADDRESS_MODIFER))
-                       == (FCBlock *)(-1L)))
-                {
-                        return 0;
-                }
-
-                tmf       = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
-                tmf->vc    = RQ_INIT;
-                tmf->dc_sc = DC_RPS | SC_RS;
-                tmf->vl    = 4;
-
-                smctr_make_8025_hdr(dev, NULL, tmf, AC_FC_RQ_INIT);
-
-                tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
-                smctr_make_product_id(dev, tsv);
-
-                tmf->vl += tsv->svl;
-                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-                smctr_make_upstream_neighbor_addr(dev, tsv);
-
-                tmf->vl += tsv->svl;
-                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-                smctr_make_ring_station_version(dev, tsv);
-
-                tmf->vl += tsv->svl;
-                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
-                smctr_make_addr_mod(dev, tsv);
-
-                tmf->vl += tsv->svl;
-
-                /* Subtract out MVID and MVL which is
-                 * include in both vl and MAC_HEADER
-                 */
-/*              fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
-                fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
-*/
-                tmf->vl = SWAP_BYTES(tmf->vl);
-
-                if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
-                        return err;
-
-                /* Wait for Transmit to Complete */
-               for(i = 0; i < 10000; i++) 
-               {
-                       if(fcb->frame_status & FCB_COMMAND_DONE)
-                               break;
-                       mdelay(1);
-               }
-
-                /* Check if GOOD frame Tx'ed */
-                fstatus = fcb->frame_status;
-
-                if(!(fstatus & FCB_COMMAND_DONE))
-                        return HARDWARE_FAILED;
-
-                if(!(fstatus & FCB_TX_STATUS_E))
-                        count++;
-
-                /* De-allocated Tx FCB and Frame Buffer
-                 * The FCB must be de-allocated manually if executing with
-                 * interrupts disabled, other wise the ISR (LM_Service_Events)
-                 * will de-allocate it when the interrupt occurs.
-                 */
-                tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
-                smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
-        } while(count < 4 && ((fstatus & FCB_TX_AC_BITS) ^ FCB_TX_AC_BITS));
-
-       return smctr_join_complete_state(dev);
-}
-
-static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf,
-        __u16 *tx_fstatus)
-{
-        struct net_local *tp = netdev_priv(dev);
-        FCBlock *fcb;
-        unsigned int i;
-       int err;
-
-        /* Check if this is the END POINT of the Transmit Forward Chain. */
-        if(rmf->vl <= 18)
-                return 0;
-
-        /* Allocate Transmit FCB only by requesting 0 bytes
-         * of data buffer.
-         */
-        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, 0)) == (FCBlock *)(-1L))
-                return 0;
-
-        /* Set pointer to Transmit Frame Buffer to the data
-         * portion of the received TX Forward frame, making
-         * sure to skip over the Vector Code (vc) and Vector
-         * length (vl).
-         */
-        fcb->bdb_ptr->trc_data_block_ptr = TRC_POINTER((__u32)rmf 
-               + sizeof(MAC_HEADER) + 2);
-        fcb->bdb_ptr->data_block_ptr     = (__u16 *)((__u32)rmf 
-               + sizeof(MAC_HEADER) + 2);
-
-        fcb->frame_length                = rmf->vl - 4 - 2;
-        fcb->bdb_ptr->buffer_length      = rmf->vl - 4 - 2;
-
-        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
-                return err;
-
-        /* Wait for Transmit to Complete */
-       for(i = 0; i < 10000; i++) 
-       {
-                       if(fcb->frame_status & FCB_COMMAND_DONE)
-                       break;
-               mdelay(1);
-       }
-
-        /* Check if GOOD frame Tx'ed */
-        if(!(fcb->frame_status & FCB_COMMAND_DONE))
-        {
-                if((err = smctr_issue_resume_tx_fcb_cmd(dev, MAC_QUEUE)))
-                        return err;
-
-               for(i = 0; i < 10000; i++) 
-               {
-                       if(fcb->frame_status & FCB_COMMAND_DONE)
-                               break;
-                       mdelay(1);
-               }
-
-                if(!(fcb->frame_status & FCB_COMMAND_DONE))
-                        return HARDWARE_FAILED;
-        }
-
-        *tx_fstatus = fcb->frame_status;
-
-        return A_FRAME_WAS_FORWARDED;
-}
-
-static int smctr_set_auth_access_pri(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(rsv->svl != S_AUTHORIZED_ACCESS_PRIORITY)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        tp->authorized_access_priority = (rsv->svv[0] << 8 | rsv->svv[1]);
-
-        return POSITIVE_ACK;
-}
-
-static int smctr_set_auth_funct_class(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(rsv->svl != S_AUTHORIZED_FUNCTION_CLASS)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        tp->authorized_function_classes = (rsv->svv[0] << 8 | rsv->svv[1]);
-
-        return POSITIVE_ACK;
-}
-
-static int smctr_set_corr(struct net_device *dev, MAC_SUB_VECTOR *rsv,
-        __u16 *correlator)
-{
-        if(rsv->svl != S_CORRELATOR)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        *correlator = (rsv->svv[0] << 8 | rsv->svv[1]);
-
-        return POSITIVE_ACK;
-}
-
-static int smctr_set_error_timer_value(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv)
-{
-       __u16 err_tval;
-       int err;
-
-        if(rsv->svl != S_ERROR_TIMER_VALUE)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        err_tval = (rsv->svv[0] << 8 | rsv->svv[1])*10;
-
-        smctr_issue_write_word_cmd(dev, RW_TER_THRESHOLD, &err_tval);
-
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        return POSITIVE_ACK;
-}
-
-static int smctr_set_frame_forward(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv, __u8 dc_sc)
-{
-        if((rsv->svl < 2) || (rsv->svl > S_FRAME_FORWARD))
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        if((dc_sc & DC_MASK) != DC_CRS)
-        {
-                if(rsv->svl >= 2 && rsv->svl < 20)
-                       return E_TRANSMIT_FORWARD_INVALID;
-
-                if((rsv->svv[0] != 0) || (rsv->svv[1] != 0))
-                        return E_TRANSMIT_FORWARD_INVALID;
-        }
-
-        return POSITIVE_ACK;
-}
-
-static int smctr_set_local_ring_num(struct net_device *dev,
-        MAC_SUB_VECTOR *rsv)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(rsv->svl != S_LOCAL_RING_NUMBER)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        if(tp->ptr_local_ring_num)
-                *(__u16 *)(tp->ptr_local_ring_num) 
-                       = (rsv->svv[0] << 8 | rsv->svv[1]);
-
-        return POSITIVE_ACK;
-}
-
-static unsigned short smctr_set_ctrl_attention(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int ioaddr = dev->base_addr;
-
-        if(tp->bic_type == BIC_585_CHIP)
-                outb((tp->trc_mask | HWR_CA), ioaddr + HWR);
-        else
-        {
-                outb((tp->trc_mask | CSR_CA), ioaddr + CSR);
-                outb(tp->trc_mask, ioaddr + CSR);
-        }
-
-        return 0;
-}
-
-static void smctr_set_multicast_list(struct net_device *dev)
-{
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_set_multicast_list\n", dev->name);
-}
-
-static int smctr_set_page(struct net_device *dev, __u8 *buf)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u8 amask;
-        __u32 tptr;
-
-        tptr = (__u32)buf - (__u32)tp->ram_access;
-        amask = (__u8)((tptr & PR_PAGE_MASK) >> 8);
-        outb(amask, dev->base_addr + PR);
-
-        return 0;
-}
-
-static int smctr_set_phy_drop(struct net_device *dev, MAC_SUB_VECTOR *rsv)
-{
-       int err;
-
-        if(rsv->svl != S_PHYSICAL_DROP)
-                return E_SUB_VECTOR_LENGTH_ERROR;
-
-        smctr_issue_write_byte_cmd(dev, RW_PHYSICAL_DROP_NUMBER, &rsv->svv[0]);
-        if((err = smctr_wait_cmd(dev)))
-                return err;
-
-        return POSITIVE_ACK;
-}
-
-/* Reset the ring speed to the opposite of what it was. This auto-pilot
- * mode requires a complete reset and re-init of the adapter.
- */
-static int smctr_set_ring_speed(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-       int err;
-
-        if(tp->media_type == MEDIA_UTP_16)
-                tp->media_type = MEDIA_UTP_4;
-        else
-                tp->media_type = MEDIA_UTP_16;
-
-        smctr_enable_16bit(dev);
-
-        /* Re-Initialize adapter's internal registers */
-        smctr_reset_adapter(dev);
-
-        if((err = smctr_init_card_real(dev)))
-                return err;
-
-        smctr_enable_bic_int(dev);
-
-        if((err = smctr_issue_enable_int_cmd(dev, TRC_INTERRUPT_ENABLE_MASK)))
-                return err;
-
-        smctr_disable_16bit(dev);
-
-       return 0;
-}
-
-static int smctr_set_rx_look_ahead(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u16 sword, rword;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_set_rx_look_ahead_flag\n", dev->name);
-
-        tp->adapter_flags &= ~(FORCED_16BIT_MODE);
-        tp->adapter_flags |= RX_VALID_LOOKAHEAD;
-
-        if(tp->adapter_bus == BUS_ISA16_TYPE)
-        {
-                sword = *((__u16 *)(tp->ram_access));
-                *((__u16 *)(tp->ram_access)) = 0x1234;
-
-                smctr_disable_16bit(dev);
-                rword = *((__u16 *)(tp->ram_access));
-                smctr_enable_16bit(dev);
-
-                if(rword != 0x1234)
-                        tp->adapter_flags |= FORCED_16BIT_MODE;
-
-                *((__u16 *)(tp->ram_access)) = sword;
-        }
-
-        return 0;
-}
-
-static int smctr_set_trc_reset(int ioaddr)
-{
-        __u8 r;
-
-        r = inb(ioaddr + MSR);
-        outb(MSR_RST | r, ioaddr + MSR);
-
-        return 0;
-}
-
-/*
- * This function can be called if the adapter is busy or not.
- */
-static int smctr_setup_single_cmd(struct net_device *dev,
-        __u16 command, __u16 subcommand)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int err;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_setup_single_cmd\n", dev->name);
-
-        if((err = smctr_wait_while_cbusy(dev)))
-                return err;
-
-        if((err = (unsigned int)smctr_wait_cmd(dev)))
-                return err;
-
-        tp->acb_head->cmd_done_status   = 0;
-        tp->acb_head->cmd               = command;
-        tp->acb_head->subcmd            = subcommand;
-
-        err = smctr_issue_resume_acb_cmd(dev);
-
-        return err;
-}
-
-/*
- * This function can not be called with the adapter busy.
- */
-static int smctr_setup_single_cmd_w_data(struct net_device *dev,
-        __u16 command, __u16 subcommand)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        tp->acb_head->cmd_done_status   = ACB_COMMAND_NOT_DONE;
-        tp->acb_head->cmd               = command;
-        tp->acb_head->subcmd            = subcommand;
-        tp->acb_head->data_offset_lo
-                = (__u16)TRC_POINTER(tp->misc_command_data);
-
-        return smctr_issue_resume_acb_cmd(dev);
-}
-
-static char *smctr_malloc(struct net_device *dev, __u16 size)
-{
-        struct net_local *tp = netdev_priv(dev);
-        char *m;
-
-        m = (char *)(tp->ram_access + tp->sh_mem_used);
-        tp->sh_mem_used += (__u32)size;
-
-        return m;
-}
-
-static int smctr_status_chg(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name);
-
-        switch(tp->status)
-        {
-                case OPEN:
-                        break;
-
-                case CLOSED:
-                        break;
-
-                /* Interrupt driven open() completion. XXX */
-                case INITIALIZED:
-                        tp->group_address_0 = 0;
-                        tp->group_address[0] = 0;
-                        tp->group_address[1] = 0;
-                        tp->functional_address_0 = 0;
-                        tp->functional_address[0] = 0;
-                        tp->functional_address[1] = 0;
-                        smctr_open_tr(dev);
-                        break;
-
-                default:
-                        printk(KERN_INFO "%s: status change unknown %x\n",
-                                dev->name, tp->status);
-                        break;
-        }
-
-        return 0;
-}
-
-static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
-        __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        int err = 0;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_trc_send_packet\n", dev->name);
-
-        fcb->info = FCB_CHAIN_END | FCB_ENABLE_TFS;
-        if(tp->num_tx_fcbs[queue] != 1)
-                fcb->back_ptr->info = FCB_INTERRUPT_ENABLE | FCB_ENABLE_TFS;
-
-        if(tp->tx_queue_status[queue] == NOT_TRANSMITING)
-        {
-                tp->tx_queue_status[queue] = TRANSMITING;
-                err = smctr_issue_resume_tx_fcb_cmd(dev, queue);
-        }
-
-        return err;
-}
-
-static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        __u16 status, err = 0;
-        int cstatus;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_tx_complete\n", dev->name);
-
-        while((status = tp->tx_fcb_end[queue]->frame_status) != SUCCESS)
-        {
-                if(status & 0x7e00 )
-                {
-                        err = HARDWARE_FAILED;
-                        break;
-                }
-
-                if((err = smctr_update_tx_chain(dev, tp->tx_fcb_end[queue],
-                        queue)) != SUCCESS)
-                        break;
-
-                smctr_disable_16bit(dev);
-
-                if(tp->mode_bits & UMAC)
-                {
-                        if(!(status & (FCB_TX_STATUS_AR1 | FCB_TX_STATUS_AR2)))
-                                cstatus = NO_SUCH_DESTINATION;
-                        else
-                        {
-                                if(!(status & (FCB_TX_STATUS_CR1 | FCB_TX_STATUS_CR2)))
-                                        cstatus = DEST_OUT_OF_RESOURCES;
-                                else
-                                {
-                                        if(status & FCB_TX_STATUS_E)
-                                                cstatus = MAX_COLLISIONS;
-                                        else
-                                                cstatus = SUCCESS;
-                                }
-                        }
-                }
-                else
-                        cstatus = SUCCESS;
-
-                if(queue == BUG_QUEUE)
-                        err = SUCCESS;
-
-                smctr_enable_16bit(dev);
-                if(err != SUCCESS)
-                        break;
-        }
-
-        return err;
-}
-
-static unsigned short smctr_tx_move_frame(struct net_device *dev,
-        struct sk_buff *skb, __u8 *pbuff, unsigned int bytes)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int ram_usable;
-        __u32 flen, len, offset = 0;
-        __u8 *frag, *page;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_tx_move_frame\n", dev->name);
-
-        ram_usable = ((unsigned int)tp->ram_usable) << 10;
-        frag       = skb->data;
-        flen       = skb->len;
-
-        while(flen > 0 && bytes > 0)
-        {
-                smctr_set_page(dev, pbuff);
-
-                offset = SMC_PAGE_OFFSET(pbuff);
-
-                if(offset + flen > ram_usable)
-                        len = ram_usable - offset;
-                else
-                        len = flen;
-
-                if(len > bytes)
-                        len = bytes;
-
-                page = (char *) (offset + tp->ram_access);
-                memcpy(page, frag, len);
-
-                flen -=len;
-                bytes -= len;
-                frag += len;
-                pbuff += len;
-        }
-
-        return 0;
-}
-
-/* Update the error statistic counters for this adapter. */
-static int smctr_update_err_stats(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        struct tr_statistics *tstat = &tp->MacStat;
-
-        if(tstat->internal_errors)
-                tstat->internal_errors
-                        += *(tp->misc_command_data + 0) & 0x00ff;
-
-        if(tstat->line_errors)
-                tstat->line_errors += *(tp->misc_command_data + 0) >> 8;
-
-        if(tstat->A_C_errors)
-                tstat->A_C_errors += *(tp->misc_command_data + 1) & 0x00ff;
-
-        if(tstat->burst_errors)
-                tstat->burst_errors += *(tp->misc_command_data + 1) >> 8;
-
-        if(tstat->abort_delimiters)
-                tstat->abort_delimiters += *(tp->misc_command_data + 2) >> 8;
-
-        if(tstat->recv_congest_count)
-                tstat->recv_congest_count
-                        += *(tp->misc_command_data + 3) & 0x00ff;
-
-        if(tstat->lost_frames)
-                tstat->lost_frames
-                        += *(tp->misc_command_data + 3) >> 8;
-
-        if(tstat->frequency_errors)
-                tstat->frequency_errors += *(tp->misc_command_data + 4) & 0x00ff;
-
-        if(tstat->frame_copied_errors)
-                 tstat->frame_copied_errors
-                        += *(tp->misc_command_data + 4) >> 8;
-
-        if(tstat->token_errors)
-                tstat->token_errors += *(tp->misc_command_data + 5) >> 8;
-
-        return 0;
-}
-
-static int smctr_update_rx_chain(struct net_device *dev, __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-        FCBlock *fcb;
-        BDBlock *bdb;
-        __u16 size, len;
-
-        fcb = tp->rx_fcb_curr[queue];
-        len = fcb->frame_length;
-
-        fcb->frame_status = 0;
-        fcb->info = FCB_CHAIN_END;
-        fcb->back_ptr->info = FCB_WARNING;
-
-        tp->rx_fcb_curr[queue] = tp->rx_fcb_curr[queue]->next_ptr;
-
-        /* update RX BDBs */
-        size = (len >> RX_BDB_SIZE_SHIFT);
-        if(len & RX_DATA_BUFFER_SIZE_MASK)
-                size += sizeof(BDBlock);
-        size &= (~RX_BDB_SIZE_MASK);
-
-        /* check if wrap around */
-        bdb = (BDBlock *)((__u32)(tp->rx_bdb_curr[queue]) + (__u32)(size));
-        if((__u32)bdb >= (__u32)tp->rx_bdb_end[queue])
-        {
-                bdb = (BDBlock *)((__u32)(tp->rx_bdb_head[queue])
-                        + (__u32)(bdb) - (__u32)(tp->rx_bdb_end[queue]));
-        }
-
-        bdb->back_ptr->info = BDB_CHAIN_END;
-        tp->rx_bdb_curr[queue]->back_ptr->info = BDB_NOT_CHAIN_END;
-        tp->rx_bdb_curr[queue] = bdb;
-
-        return 0;
-}
-
-static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
-        __u16 queue)
-{
-        struct net_local *tp = netdev_priv(dev);
-
-        if(smctr_debug > 20)
-                printk(KERN_DEBUG "smctr_update_tx_chain\n");
-
-        if(tp->num_tx_fcbs_used[queue] <= 0)
-                return HARDWARE_FAILED;
-        else
-        {
-                if(tp->tx_buff_used[queue] < fcb->memory_alloc)
-                {
-                        tp->tx_buff_used[queue] = 0;
-                        return HARDWARE_FAILED;
-                }
-
-                tp->tx_buff_used[queue] -= fcb->memory_alloc;
-
-                /* if all transmit buffer are cleared
-                 * need to set the tx_buff_curr[] to tx_buff_head[]
-                 * otherwise, tx buffer will be segregate and cannot
-                 * accommodate and buffer greater than (curr - head) and
-                 * (end - curr) since we do not allow wrap around allocation.
-                 */
-                if(tp->tx_buff_used[queue] == 0)
-                        tp->tx_buff_curr[queue] = tp->tx_buff_head[queue];
-
-                tp->num_tx_fcbs_used[queue]--;
-                fcb->frame_status = 0;
-                tp->tx_fcb_end[queue] = fcb->next_ptr;
-               netif_wake_queue(dev);
-                return 0;
-        }
-}
-
-static int smctr_wait_cmd(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int loop_count = 0x20000;
-
-        if(smctr_debug > 10)
-                printk(KERN_DEBUG "%s: smctr_wait_cmd\n", dev->name);
-
-        while(loop_count)
-        {
-                if(tp->acb_head->cmd_done_status & ACB_COMMAND_DONE)
-                        break;
-               udelay(1);
-                loop_count--;
-        }
-
-        if(loop_count == 0)
-                return HARDWARE_FAILED;
-
-        if(tp->acb_head->cmd_done_status & 0xff)
-                return HARDWARE_FAILED;
-
-        return 0;
-}
-
-static int smctr_wait_while_cbusy(struct net_device *dev)
-{
-        struct net_local *tp = netdev_priv(dev);
-        unsigned int timeout = 0x20000;
-        int ioaddr = dev->base_addr;
-        __u8 r;
-
-        if(tp->bic_type == BIC_585_CHIP)
-        {
-                while(timeout)
-                {
-                        r = inb(ioaddr + HWR);
-                        if((r & HWR_CBUSY) == 0)
-                                break;
-                        timeout--;
-                }
-        }
-        else
-        {
-                while(timeout)
-                {
-                        r = inb(ioaddr + CSR);
-                        if((r & CSR_CBUSY) == 0)
-                                break;
-                        timeout--;
-                }
-        }
-
-        if(timeout)
-                return 0;
-        else
-                return HARDWARE_FAILED;
-}
-
-#ifdef MODULE
-
-static struct net_device* dev_smctr[SMCTR_MAX_ADAPTERS];
-static int io[SMCTR_MAX_ADAPTERS];
-static int irq[SMCTR_MAX_ADAPTERS];
-
-MODULE_LICENSE("GPL");
-MODULE_FIRMWARE("tr_smctr.bin");
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param(ringspeed, int, 0);
-
-static struct net_device * __init setup_card(int n)
-{
-       struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-       int err;
-       
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       dev->irq = irq[n];
-       err = smctr_probe1(dev, io[n]);
-       if (err) 
-               goto out;
-               
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
- out1:
-#ifdef CONFIG_MCA_LEGACY
-       { struct net_local *tp = netdev_priv(dev);
-         if (tp->slot_num)
-               mca_mark_as_unused(tp->slot_num);
-       }
-#endif
-       release_region(dev->base_addr, SMCTR_IO_EXTENT);
-       free_irq(dev->irq, dev);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-int __init init_module(void)
-{
-        int i, found = 0;
-       struct net_device *dev;
-
-        for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
-               dev = io[0]? setup_card(i) : smctr_probe(-1);
-               if (!IS_ERR(dev)) {
-                       ++found;
-                       dev_smctr[i] = dev;
-               }
-        }
-
-        return found ? 0 : -ENODEV;
-}
-
-void __exit cleanup_module(void)
-{
-        int i;
-
-        for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
-               struct net_device *dev = dev_smctr[i];
-
-               if (dev) {
-
-                       unregister_netdev(dev);
-#ifdef CONFIG_MCA_LEGACY
-                       { struct net_local *tp = netdev_priv(dev);
-                       if (tp->slot_num)
-                               mca_mark_as_unused(tp->slot_num);
-                       }
-#endif
-                       release_region(dev->base_addr, SMCTR_IO_EXTENT);
-                       if (dev->irq)
-                               free_irq(dev->irq, dev);
-
-                       free_netdev(dev);
-               }
-        }
-}
-#endif /* MODULE */
diff --git a/drivers/net/tokenring/smctr.h b/drivers/net/tokenring/smctr.h
deleted file mode 100644 (file)
index 6e5700a..0000000
+++ /dev/null
@@ -1,1585 +0,0 @@
-/* smctr.h: SMC Token Ring driver header for Linux
- *
- * Authors:
- *  - Jay Schulist <jschlst@samba.org>
- */
-
-#ifndef __LINUX_SMCTR_H
-#define __LINUX_SMCTR_H
-
-#ifdef __KERNEL__
-
-#define MAX_TX_QUEUE 10
-
-#define SMC_HEADER_SIZE 14
-
-#define SMC_PAGE_OFFSET(X)          (((unsigned long)(X) - tp->ram_access) & tp->page_offset_mask)
-
-#define INIT            0x0D
-#define RQ_ATTCH        0x10
-#define RQ_STATE        0x0F
-#define RQ_ADDR         0x0E
-#define CHG_PARM        0x0C
-#define RSP             0x00
-#define TX_FORWARD      0x09
-
-#define AC_FC_DAT      ((3<<13) | 1)
-#define      DAT             0x07
-
-#define RPT_NEW_MON     0x25
-#define RPT_SUA_CHG     0x26
-#define RPT_ACTIVE_ERR  0x28
-#define RPT_NN_INCMP    0x27
-#define RPT_ERROR       0x29
-
-#define RQ_INIT         0x20
-#define RPT_ATTCH       0x24
-#define RPT_STATE       0x23
-#define RPT_ADDR        0x22
-
-#define POSITIVE_ACK                    0x0001
-#define A_FRAME_WAS_FORWARDED           0x8888
-
-#define      GROUP_ADDRESS                   0x2B
-#define      PHYSICAL_DROP                   0x0B
-#define      AUTHORIZED_ACCESS_PRIORITY      0x07
-#define      AUTHORIZED_FUNCTION_CLASS       0x06
-#define      FUNCTIONAL_ADDRESS              0x2C
-#define      RING_STATION_STATUS             0x29
-#define      TRANSMIT_STATUS_CODE            0x2A
-#define      IBM_PASS_SOURCE_ADDR    0x01
-#define      AC_FC_RPT_TX_FORWARD            ((0<<13) | 0)
-#define      AC_FC_RPT_STATE                 ((0<<13) | 0)
-#define      AC_FC_RPT_ADDR                  ((0<<13) | 0)
-#define      CORRELATOR                      0x09
-
-#define POSITIVE_ACK                    0x0001          /*             */
-#define E_MAC_DATA_INCOMPLETE           0x8001          /* not used    */
-#define E_VECTOR_LENGTH_ERROR           0x8002          /*             */
-#define E_UNRECOGNIZED_VECTOR_ID        0x8003          /*             */
-#define E_INAPPROPRIATE_SOURCE_CLASS    0x8004          /*             */
-#define E_SUB_VECTOR_LENGTH_ERROR       0x8005          /*             */
-#define E_TRANSMIT_FORWARD_INVALID      0x8006          /* def. by IBM */
-#define E_MISSING_SUB_VECTOR            0x8007          /*             */
-#define E_SUB_VECTOR_UNKNOWN            0x8008          /*             */
-#define E_MAC_HEADER_TOO_LONG           0x8009          /*             */
-#define E_FUNCTION_DISABLED             0x800A          /* not used    */
-
-#define A_FRAME_WAS_FORWARDED           0x8888          /* used by send_TX_FORWARD */
-
-#define UPSTREAM_NEIGHBOR_ADDRESS       0x02
-#define LOCAL_RING_NUMBER               0x03
-#define ASSIGN_PHYSICAL_DROP            0x04
-#define ERROR_TIMER_VALUE               0x05
-#define AUTHORIZED_FUNCTION_CLASS       0x06
-#define AUTHORIZED_ACCESS_PRIORITY      0x07
-#define CORRELATOR                      0x09
-#define PHYSICAL_DROP                   0x0B
-#define RESPONSE_CODE                   0x20
-#define ADDRESS_MODIFER                 0x21
-#define PRODUCT_INSTANCE_ID             0x22
-#define RING_STATION_VERSION_NUMBER     0x23
-#define WRAP_DATA                       0x26
-#define FRAME_FORWARD                   0x27
-#define STATION_IDENTIFER               0x28
-#define RING_STATION_STATUS             0x29
-#define TRANSMIT_STATUS_CODE            0x2A
-#define GROUP_ADDRESS                   0x2B
-#define FUNCTIONAL_ADDRESS              0x2C
-
-#define F_NO_SUB_VECTORS_FOUND                  0x0000
-#define F_UPSTREAM_NEIGHBOR_ADDRESS             0x0001
-#define F_LOCAL_RING_NUMBER                     0x0002
-#define F_ASSIGN_PHYSICAL_DROP                  0x0004
-#define F_ERROR_TIMER_VALUE                     0x0008
-#define F_AUTHORIZED_FUNCTION_CLASS             0x0010
-#define F_AUTHORIZED_ACCESS_PRIORITY            0x0020
-#define F_CORRELATOR                            0x0040
-#define F_PHYSICAL_DROP                         0x0080
-#define F_RESPONSE_CODE                         0x0100
-#define F_PRODUCT_INSTANCE_ID                   0x0200
-#define F_RING_STATION_VERSION_NUMBER           0x0400
-#define F_STATION_IDENTIFER                     0x0800
-#define F_RING_STATION_STATUS                   0x1000
-#define F_GROUP_ADDRESS                         0x2000
-#define F_FUNCTIONAL_ADDRESS                    0x4000
-#define F_FRAME_FORWARD                         0x8000
-
-#define R_INIT                                  0x00
-#define R_RQ_ATTCH_STATE_ADDR                   0x00
-#define R_CHG_PARM                              0x00
-#define R_TX_FORWARD                            F_FRAME_FORWARD
-
-
-#define      UPSTREAM_NEIGHBOR_ADDRESS       0x02
-#define      ADDRESS_MODIFER                 0x21
-#define      RING_STATION_VERSION_NUMBER     0x23
-#define      PRODUCT_INSTANCE_ID             0x22
-
-#define      RPT_TX_FORWARD  0x2A
-
-#define AC_FC_INIT                      (3<<13) | 0 /*                     */
-#define AC_FC_RQ_INIT                   ((3<<13) | 0) /*                     */
-#define AC_FC_RQ_ATTCH                  (3<<13) | 0 /* DC = SC of rx frame */
-#define AC_FC_RQ_STATE                  (3<<13) | 0 /* DC = SC of rx frame */
-#define AC_FC_RQ_ADDR                   (3<<13) | 0 /* DC = SC of rx frame */
-#define AC_FC_CHG_PARM                  (3<<13) | 0 /*                     */
-#define AC_FC_RSP                       (0<<13) | 0 /* DC = SC of rx frame */
-#define AC_FC_RPT_ATTCH                 (0<<13) | 0
-
-#define S_UPSTREAM_NEIGHBOR_ADDRESS               6 + 2
-#define S_LOCAL_RING_NUMBER                       2 + 2
-#define S_ASSIGN_PHYSICAL_DROP                    4 + 2
-#define S_ERROR_TIMER_VALUE                       2 + 2
-#define S_AUTHORIZED_FUNCTION_CLASS               2 + 2
-#define S_AUTHORIZED_ACCESS_PRIORITY              2 + 2
-#define S_CORRELATOR                              2 + 2
-#define S_PHYSICAL_DROP                           4 + 2
-#define S_RESPONSE_CODE                           4 + 2
-#define S_ADDRESS_MODIFER                         2 + 2
-#define S_PRODUCT_INSTANCE_ID                    18 + 2
-#define S_RING_STATION_VERSION_NUMBER            10 + 2
-#define S_STATION_IDENTIFER                       6 + 2
-#define S_RING_STATION_STATUS                     6 + 2
-#define S_GROUP_ADDRESS                           4 + 2
-#define S_FUNCTIONAL_ADDRESS                      4 + 2
-#define S_FRAME_FORWARD                         252 + 2
-#define S_TRANSMIT_STATUS_CODE                    2 + 2
-
-#define ISB_IMC_RES0                    0x0000  /* */
-#define ISB_IMC_MAC_TYPE_3              0x0001  /* MAC_ARC_INDICATE */
-#define ISB_IMC_MAC_ERROR_COUNTERS      0x0002  /* */
-#define ISB_IMC_RES1                    0x0003  /* */
-#define ISB_IMC_MAC_TYPE_2              0x0004  /* QUE_MAC_INDICATE */
-#define ISB_IMC_TX_FRAME                0x0005  /* */
-#define ISB_IMC_END_OF_TX_QUEUE         0x0006  /* */
-#define ISB_IMC_NON_MAC_RX_RESOURCE     0x0007  /* */
-#define ISB_IMC_MAC_RX_RESOURCE         0x0008  /* */
-#define ISB_IMC_NON_MAC_RX_FRAME        0x0009  /* */
-#define ISB_IMC_MAC_RX_FRAME            0x000A  /* */
-#define ISB_IMC_TRC_FIFO_STATUS         0x000B  /* */
-#define ISB_IMC_COMMAND_STATUS          0x000C  /* */
-#define ISB_IMC_MAC_TYPE_1              0x000D  /* Self Removed */
-#define ISB_IMC_TRC_INTRNL_TST_STATUS   0x000E  /* */
-#define ISB_IMC_RES2                    0x000F  /* */
-
-#define NON_MAC_RX_RESOURCE_BW          0x10    /* shifted right 8 bits */
-#define NON_MAC_RX_RESOURCE_FW          0x20    /* shifted right 8 bits */
-#define NON_MAC_RX_RESOURCE_BE          0x40    /* shifted right 8 bits */
-#define NON_MAC_RX_RESOURCE_FE          0x80    /* shifted right 8 bits */
-#define RAW_NON_MAC_RX_RESOURCE_BW      0x1000  /* */
-#define RAW_NON_MAC_RX_RESOURCE_FW      0x2000  /* */
-#define RAW_NON_MAC_RX_RESOURCE_BE      0x4000  /* */
-#define RAW_NON_MAC_RX_RESOURCE_FE      0x8000  /* */
-
-#define MAC_RX_RESOURCE_BW              0x10    /* shifted right 8 bits */
-#define MAC_RX_RESOURCE_FW              0x20    /* shifted right 8 bits */
-#define MAC_RX_RESOURCE_BE              0x40    /* shifted right 8 bits */
-#define MAC_RX_RESOURCE_FE              0x80    /* shifted right 8 bits */
-#define RAW_MAC_RX_RESOURCE_BW          0x1000  /* */
-#define RAW_MAC_RX_RESOURCE_FW          0x2000  /* */
-#define RAW_MAC_RX_RESOURCE_BE          0x4000  /* */
-#define RAW_MAC_RX_RESOURCE_FE          0x8000  /* */
-
-#define TRC_FIFO_STATUS_TX_UNDERRUN     0x40    /* shifted right 8 bits */
-#define TRC_FIFO_STATUS_RX_OVERRUN      0x80    /* shifted right 8 bits */
-#define RAW_TRC_FIFO_STATUS_TX_UNDERRUN 0x4000  /* */
-#define RAW_TRC_FIFO_STATUS_RX_OVERRUN  0x8000  /* */
-
-#define       CSR_CLRTINT             0x08
-
-#define MSB(X)                  ((__u8)((__u16) X >> 8))
-#define LSB(X)                  ((__u8)((__u16) X &  0xff))
-
-#define AC_FC_LOBE_MEDIA_TEST           ((3<<13) | 0)
-#define S_WRAP_DATA                             248 + 2 /* 500 + 2 */
-#define      WRAP_DATA                       0x26
-#define LOBE_MEDIA_TEST 0x08
-
-/* Destination Class (dc) */
-
-#define DC_MASK         0xF0
-#define DC_RS           0x00
-#define DC_CRS          0x40
-#define DC_RPS          0x50
-#define DC_REM          0x60
-
-/* Source Classes (sc) */
-
-#define SC_MASK         0x0F
-#define SC_RS           0x00
-#define SC_CRS          0x04
-#define SC_RPS          0x05
-#define SC_REM          0x06
-
-#define PR             0x11
-#define PR_PAGE_MASK   0x0C000
-
-#define MICROCHANNEL   0x0008
-#define INTERFACE_CHIP 0x0010
-#define BOARD_16BIT    0x0040
-#define PAGED_RAM      0x0080
-#define WD8115TA       (TOKEN_MEDIA | MICROCHANNEL | INTERFACE_CHIP | PAGED_RAM)
-#define WD8115T                (TOKEN_MEDIA | INTERFACE_CHIP | BOARD_16BIT | PAGED_RAM)
-
-#define BRD_ID_8316    0x50
-
-#define r587_SER       0x001
-#define SER_DIN                0x80
-#define SER_DOUT       0x40
-#define SER_CLK                0x20
-#define SER_ECS                0x10
-#define SER_E806       0x08
-#define SER_PNP                0x04
-#define SER_BIO                0x02
-#define SER_16B                0x01
-
-#define r587_IDR       0x004
-#define IDR_IRQ_MASK   0x0F0
-#define IDR_DCS_MASK   0x007
-#define IDR_RWS                0x008
-
-
-#define r587_BIO       0x003
-#define BIO_ENB                0x080
-#define BIO_MASK       0x03F
-
-#define r587_PCR       0x005
-#define PCR_RAMS       0x040
-
-
-
-#define NUM_ADDR_BITS  8
-
-#define ISA_MAX_ADDRESS                0x00ffffff
-
-#define SMCTR_MAX_ADAPTERS     7
-
-#define MC_TABLE_ENTRIES      16
-
-#define MAXFRAGMENTS          32
-
-#define CHIP_REV_MASK         0x3000
-
-#define MAX_TX_QS             8
-#define NUM_TX_QS_USED        3
-
-#define MAX_RX_QS             2
-#define NUM_RX_QS_USED        2
-
-#define INTEL_DATA_FORMAT      0x4000
-#define INTEL_ADDRESS_POINTER_FORMAT   0x8000
-#define PAGE_POINTER(X)                ((((unsigned long)(X) - tp->ram_access) & tp->page_offset_mask) + tp->ram_access)
-#define SWAP_WORDS(X)          (((X & 0xFFFF) << 16) | (X >> 16))
-
-#define INTERFACE_CHIP          0x0010          /* Soft Config Adapter */
-#define ADVANCED_FEATURES       0x0020          /* Adv. netw. interface features */
-#define BOARD_16BIT             0x0040          /* 16 bit capability */
-#define PAGED_RAM               0x0080          /* Adapter has paged RAM */
-
-#define PAGED_ROM               0x0100          /* Adapter has paged ROM */
-
-#define RAM_SIZE_UNKNOWN        0x0000          /* Unknown RAM size */
-#define RAM_SIZE_0K             0x0001          /* 0K  RAM */
-#define RAM_SIZE_8K             0x0002          /* 8k  RAM */
-#define RAM_SIZE_16K            0x0003          /* 16k RAM */
-#define RAM_SIZE_32K            0x0004          /* 32k RAM */
-#define RAM_SIZE_64K            0x0005          /* 64k RAM */
-#define RAM_SIZE_RESERVED_6     0x0006          /* Reserved RAM size */
-#define RAM_SIZE_RESERVED_7     0x0007          /* Reserved RAM size */
-#define RAM_SIZE_MASK           0x0007          /* Isolates RAM Size */
-
-#define TOKEN_MEDIA           0x0005
-
-#define BID_REG_0       0x00
-#define BID_REG_1       0x01
-#define BID_REG_2       0x02
-#define BID_REG_3       0x03
-#define BID_REG_4       0x04
-#define BID_REG_5       0x05
-#define BID_REG_6       0x06
-#define BID_REG_7       0x07
-#define BID_LAR_0       0x08
-#define BID_LAR_1       0x09
-#define BID_LAR_2       0x0A
-#define BID_LAR_3       0x0B
-#define BID_LAR_4       0x0C
-#define BID_LAR_5       0x0D
-
-#define BID_BOARD_ID_BYTE       0x0E
-#define BID_CHCKSM_BYTE         0x0F
-#define BID_LAR_OFFSET          0x08  
-
-#define BID_MSZ_583_BIT         0x08
-#define BID_SIXTEEN_BIT_BIT     0x01
-
-#define BID_BOARD_REV_MASK      0x1E
-
-#define BID_MEDIA_TYPE_BIT      0x01
-#define BID_SOFT_CONFIG_BIT     0x20
-#define BID_RAM_SIZE_BIT        0x40
-#define BID_BUS_TYPE_BIT        0x80
-
-#define BID_CR          0x10
-
-#define BID_TXP         0x04            /* Transmit Packet Command */
-
-#define BID_TCR_DIFF    0x0D    /* Transmit Configuration Register */
-
-#define BID_TCR_VAL     0x18            /* Value to Test 8390 or 690 */
-#define BID_PS0         0x00            /* Register Page Select 0 */
-#define BID_PS1         0x40            /* Register Page Select 1 */
-#define BID_PS2         0x80            /* Register Page Select 2 */
-#define BID_PS_MASK     0x3F            /* For Masking Off Page Select Bits */
-
-#define BID_EEPROM_0                    0x08
-#define BID_EEPROM_1                    0x09
-#define BID_EEPROM_2                    0x0A
-#define BID_EEPROM_3                    0x0B
-#define BID_EEPROM_4                    0x0C
-#define BID_EEPROM_5                    0x0D
-#define BID_EEPROM_6                    0x0E
-#define BID_EEPROM_7                    0x0F
-
-#define BID_OTHER_BIT                   0x02
-#define BID_ICR_MASK                    0x0C
-#define BID_EAR_MASK                    0x0F
-#define BID_ENGR_PAGE                   0x0A0
-#define BID_RLA                         0x10
-#define BID_EA6                         0x80
-#define BID_RECALL_DONE_MASK            0x10
-#define BID_BID_EEPROM_OVERRIDE         0xFFB0
-#define BID_EXTRA_EEPROM_OVERRIDE       0xFFD0
-#define BID_EEPROM_MEDIA_MASK           0x07
-#define BID_STARLAN_TYPE                0x00
-#define BID_ETHERNET_TYPE               0x01
-#define BID_TP_TYPE                     0x02
-#define BID_EW_TYPE                     0x03
-#define BID_TOKEN_RING_TYPE             0x04
-#define BID_UTP2_TYPE                   0x05
-#define BID_EEPROM_IRQ_MASK             0x18
-#define BID_PRIMARY_IRQ                 0x00
-#define BID_ALTERNATE_IRQ_1             0x08
-#define BID_ALTERNATE_IRQ_2             0x10
-#define BID_ALTERNATE_IRQ_3             0x18
-#define BID_EEPROM_RAM_SIZE_MASK        0xE0
-#define BID_EEPROM_RAM_SIZE_RES1        0x00
-#define BID_EEPROM_RAM_SIZE_RES2        0x20
-#define BID_EEPROM_RAM_SIZE_8K          0x40
-#define BID_EEPROM_RAM_SIZE_16K         0x60
-#define BID_EEPROM_RAM_SIZE_32K         0x80
-#define BID_EEPROM_RAM_SIZE_64K         0xA0
-#define BID_EEPROM_RAM_SIZE_RES3        0xC0
-#define BID_EEPROM_RAM_SIZE_RES4        0xE0
-#define BID_EEPROM_BUS_TYPE_MASK        0x07
-#define BID_EEPROM_BUS_TYPE_AT          0x00
-#define BID_EEPROM_BUS_TYPE_MCA         0x01
-#define BID_EEPROM_BUS_TYPE_EISA        0x02
-#define BID_EEPROM_BUS_TYPE_NEC         0x03
-#define BID_EEPROM_BUS_SIZE_MASK        0x18
-#define BID_EEPROM_BUS_SIZE_8BIT        0x00
-#define BID_EEPROM_BUS_SIZE_16BIT       0x08
-#define BID_EEPROM_BUS_SIZE_32BIT       0x10
-#define BID_EEPROM_BUS_SIZE_64BIT       0x18
-#define BID_EEPROM_BUS_MASTER           0x20
-#define BID_EEPROM_RAM_PAGING           0x40
-#define BID_EEPROM_ROM_PAGING           0x80
-#define BID_EEPROM_PAGING_MASK          0xC0
-#define BID_EEPROM_LOW_COST             0x08
-#define BID_EEPROM_IO_MAPPED            0x10
-#define BID_EEPROM_HMI                  0x01
-#define BID_EEPROM_AUTO_MEDIA_DETECT    0x01
-#define BID_EEPROM_CHIP_REV_MASK        0x0C
-
-#define BID_EEPROM_LAN_ADDR             0x30
-
-#define BID_EEPROM_MEDIA_OPTION         0x54
-#define BID_EEPROM_MEDIA_UTP            0x01
-#define BID_EEPROM_4MB_RING             0x08
-#define BID_EEPROM_16MB_RING            0x10
-#define BID_EEPROM_MEDIA_STP            0x40
-
-#define BID_EEPROM_MISC_DATA            0x56
-#define BID_EEPROM_EARLY_TOKEN_RELEASE  0x02
-
-#define CNFG_ID_8003E           0x6fc0
-#define CNFG_ID_8003S           0x6fc1
-#define CNFG_ID_8003W           0x6fc2
-#define CNFG_ID_8115TRA         0x6ec6
-#define CNFG_ID_8013E           0x61C8
-#define CNFG_ID_8013W           0x61C9
-#define CNFG_ID_BISTRO03E       0xEFE5
-#define CNFG_ID_BISTRO13E       0xEFD5
-#define CNFG_ID_BISTRO13W       0xEFD4
-#define CNFG_MSR_583    0x0
-#define CNFG_ICR_583    0x1
-#define CNFG_IAR_583    0x2
-#define CNFG_BIO_583    0x3
-#define CNFG_EAR_583    0x3
-#define CNFG_IRR_583    0x4
-#define CNFG_LAAR_584   0x5
-#define CNFG_GP2                0x7
-#define CNFG_LAAR_MASK          0x1F
-#define CNFG_LAAR_ZWS           0x20
-#define CNFG_LAAR_L16E          0x40
-#define CNFG_ICR_IR2_584        0x04
-#define CNFG_ICR_MASK       0x08
-#define CNFG_ICR_MSZ        0x08
-#define CNFG_ICR_RLA        0x10
-#define CNFG_ICR_STO        0x80
-#define CNFG_IRR_IRQS           0x60
-#define CNFG_IRR_IEN            0x80
-#define CNFG_IRR_ZWS            0x01
-#define CNFG_GP2_BOOT_NIBBLE    0x0F
-#define CNFG_IRR_OUT2       0x04
-#define CNFG_IRR_OUT1       0x02
-
-#define CNFG_SIZE_8KB           8
-#define CNFG_SIZE_16KB          16
-#define CNFG_SIZE_32KB          32
-#define CNFG_SIZE_64KB          64
-#define CNFG_SIZE_128KB     128
-#define CNFG_SIZE_256KB     256
-#define ROM_DISABLE             0x0
-
-#define CNFG_SLOT_ENABLE_BIT    0x08
-
-#define CNFG_POS_CONTROL_REG    0x096
-#define CNFG_POS_REG0           0x100
-#define CNFG_POS_REG1           0x101
-#define CNFG_POS_REG2           0x102
-#define CNFG_POS_REG3           0x103
-#define CNFG_POS_REG4           0x104
-#define CNFG_POS_REG5           0x105
-
-#define CNFG_ADAPTER_TYPE_MASK  0x0e
-
-#define SLOT_16BIT              0x0008
-#define INTERFACE_5X3_CHIP      0x0000          /* 0000 = 583 or 593 chips */
-#define NIC_690_BIT                     0x0010          /* NIC is 690 */
-#define ALTERNATE_IRQ_BIT       0x0020          /* Alternate IRQ is used */
-#define INTERFACE_584_CHIP      0x0040          /* 0001 = 584 chip */
-#define INTERFACE_594_CHIP      0x0080          /* 0010 = 594 chip */
-#define INTERFACE_585_CHIP      0x0100          /* 0100 = 585/790 chip */
-#define INTERFACE_CHIP_MASK     0x03C0          /* Isolates Intfc Chip Type */
-
-#define BOARD_16BIT             0x0040
-#define NODE_ADDR_CKSUM        0xEE
-#define BRD_ID_8115T           0x04
-
-#define NIC_825_BIT             0x0400          /* TRC 83C825 NIC */
-#define NIC_790_BIT             0x0800          /* NIC is 83C790 Ethernet */
-
-#define CHIP_REV_MASK           0x3000
-
-#define HWR_CBUSY                      0x02
-#define HWR_CA                         0x01
-
-#define MAC_QUEUE                       0
-#define NON_MAC_QUEUE                   1
-#define BUG_QUEUE                       2       /* NO RECEIVE QUEUE, ONLY TX */
-
-#define NUM_MAC_TX_FCBS                 8
-#define NUM_MAC_TX_BDBS                 NUM_MAC_TX_FCBS
-#define NUM_MAC_RX_FCBS                 7
-#define NUM_MAC_RX_BDBS                 8
-
-#define NUM_NON_MAC_TX_FCBS             6
-#define NUM_NON_MAC_TX_BDBS             NUM_NON_MAC_TX_FCBS
-
-#define NUM_NON_MAC_RX_BDBS             0       /* CALCULATED DYNAMICALLY */
-
-#define NUM_BUG_TX_FCBS                 8
-#define NUM_BUG_TX_BDBS                 NUM_BUG_TX_FCBS
-
-#define MAC_TX_BUFFER_MEMORY            1024
-#define NON_MAC_TX_BUFFER_MEMORY        (20 * 1024)
-#define BUG_TX_BUFFER_MEMORY            (NUM_BUG_TX_FCBS * 32)
-
-#define RX_BUFFER_MEMORY                0       /* CALCULATED DYNAMICALLY */
-#define RX_DATA_BUFFER_SIZE             256
-#define RX_BDB_SIZE_SHIFT               3       /* log2(RX_DATA_BUFFER_SIZE)-log2(sizeof(BDBlock)) */
-#define RX_BDB_SIZE_MASK                (sizeof(BDBlock) - 1)
-#define RX_DATA_BUFFER_SIZE_MASK        (RX_DATA_BUFFER_SIZE-1)
-
-#define NUM_OF_INTERRUPTS               0x20
-
-#define NOT_TRANSMITING                 0
-#define TRANSMITING                    1
-
-#define TRC_INTERRUPT_ENABLE_MASK       0x7FF6
-
-#define UCODE_VERSION                   0x58
-
-#define UCODE_SIZE_OFFSET               0x0000  /* WORD */
-#define UCODE_CHECKSUM_OFFSET           0x0002  /* WORD */
-#define UCODE_VERSION_OFFSET            0x0004  /* BYTE */
-
-#define CS_RAM_SIZE                     0X2000
-#define CS_RAM_CHECKSUM_OFFSET          0x1FFE  /* WORD 1FFE(MSB)-1FFF(LSB)*/
-#define CS_RAM_VERSION_OFFSET           0x1FFC  /* WORD 1FFC(MSB)-1FFD(LSB)*/
-
-#define MISC_DATA_SIZE                  128
-#define NUM_OF_ACBS                     1
-
-#define ACB_COMMAND_NOT_DONE            0x0000  /* Init, command not done */
-#define ACB_COMMAND_DONE                0x8000  /* TRC says command done */
-#define ACB_COMMAND_STATUS_MASK         0x00FF  /* low byte is status */
-#define ACB_COMMAND_SUCCESSFUL          0x0000  /* means cmd was successful */
-#define ACB_NOT_CHAIN_END               0x0000  /* tell TRC more CBs in chain */
-#define ACB_CHAIN_END                   0x8000  /* tell TRC last CB in chain */
-#define ACB_COMMAND_NO_INTERRUPT        0x0000  /* tell TRC no INT after CB */
-#define ACB_COMMAND_INTERRUPT           0x2000  /* tell TRC to INT after CB */
-#define ACB_SUB_CMD_NOP                 0x0000
-#define ACB_CMD_HIC_NOP                 0x0080
-#define ACB_CMD_MCT_NOP                 0x0000
-#define ACB_CMD_MCT_TEST                0x0001
-#define ACB_CMD_HIC_TEST                0x0081
-#define ACB_CMD_INSERT                  0x0002
-#define ACB_CMD_REMOVE                  0x0003
-#define ACB_CMD_MCT_WRITE_VALUE         0x0004
-#define ACB_CMD_HIC_WRITE_VALUE         0x0084
-#define ACB_CMD_MCT_READ_VALUE          0x0005
-#define ACB_CMD_HIC_READ_VALUE          0x0085
-#define ACB_CMD_INIT_TX_RX              0x0086
-#define ACB_CMD_INIT_TRC_TIMERS         0x0006
-#define ACB_CMD_READ_TRC_STATUS         0x0007
-#define ACB_CMD_CHANGE_JOIN_STATE       0x0008
-#define ACB_CMD_RESERVED_9              0x0009
-#define ACB_CMD_RESERVED_A              0x000A
-#define ACB_CMD_RESERVED_B              0x000B
-#define ACB_CMD_RESERVED_C              0x000C
-#define ACB_CMD_RESERVED_D              0x000D
-#define ACB_CMD_RESERVED_E              0x000E
-#define ACB_CMD_RESERVED_F              0x000F
-
-#define TRC_MAC_REGISTERS_TEST          0x0000
-#define TRC_INTERNAL_LOOPBACK           0x0001
-#define TRC_TRI_LOOPBACK                0x0002
-#define TRC_INTERNAL_ROM_TEST           0x0003
-#define TRC_LOBE_MEDIA_TEST             0x0004
-#define TRC_ANALOG_TEST                 0x0005
-#define TRC_HOST_INTERFACE_REG_TEST     0x0003
-
-#define TEST_DMA_1                      0x0000
-#define TEST_DMA_2                      0x0001
-#define TEST_MCT_ROM                    0x0002
-#define HIC_INTERNAL_DIAG               0x0003
-
-#define ABORT_TRANSMIT_PRIORITY_0       0x0001
-#define ABORT_TRANSMIT_PRIORITY_1       0x0002
-#define ABORT_TRANSMIT_PRIORITY_2       0x0004
-#define ABORT_TRANSMIT_PRIORITY_3       0x0008
-#define ABORT_TRANSMIT_PRIORITY_4       0x0010
-#define ABORT_TRANSMIT_PRIORITY_5       0x0020
-#define ABORT_TRANSMIT_PRIORITY_6       0x0040
-#define ABORT_TRANSMIT_PRIORITY_7       0x0080
-
-#define TX_PENDING_PRIORITY_0           0x0001
-#define TX_PENDING_PRIORITY_1           0x0002
-#define TX_PENDING_PRIORITY_2           0x0004
-#define TX_PENDING_PRIORITY_3           0x0008
-#define TX_PENDING_PRIORITY_4           0x0010
-#define TX_PENDING_PRIORITY_5           0x0020
-#define TX_PENDING_PRIORITY_6           0x0040
-#define TX_PENDING_PRIORITY_7           0x0080
-
-#define FCB_FRAME_LENGTH                0x100
-#define FCB_COMMAND_DONE                0x8000  /* FCB Word 0 */
-#define FCB_NOT_CHAIN_END               0x0000  /* FCB Word 1 */
-#define FCB_CHAIN_END                   0x8000
-#define FCB_NO_WARNING                  0x0000
-#define FCB_WARNING                     0x4000
-#define FCB_INTERRUPT_DISABLE           0x0000
-#define FCB_INTERRUPT_ENABLE            0x2000
-
-#define FCB_ENABLE_IMA                  0x0008
-#define FCB_ENABLE_TES                  0x0004  /* Guarantee Tx before Int */
-#define FCB_ENABLE_TFS                  0x0002  /* Post Tx Frame Status */
-#define FCB_ENABLE_NTC                  0x0001  /* No Tx CRC */
-
-#define FCB_TX_STATUS_CR2               0x0004
-#define FCB_TX_STATUS_AR2               0x0008
-#define FCB_TX_STATUS_CR1               0x0040
-#define FCB_TX_STATUS_AR1               0x0080
-#define FCB_TX_AC_BITS                  (FCB_TX_STATUS_AR1+FCB_TX_STATUS_AR2+FCB_TX_STATUS_CR1+FCB_TX_STATUS_CR2)
-#define FCB_TX_STATUS_E                 0x0100
-
-#define FCB_RX_STATUS_ANY_ERROR         0x0001
-#define FCB_RX_STATUS_FCS_ERROR         0x0002
-
-#define FCB_RX_STATUS_IA_MATCHED        0x0400
-#define FCB_RX_STATUS_IGA_BSGA_MATCHED  0x0500
-#define FCB_RX_STATUS_FA_MATCHED        0x0600
-#define FCB_RX_STATUS_BA_MATCHED        0x0700
-#define FCB_RX_STATUS_DA_MATCHED        0x0400
-#define FCB_RX_STATUS_SOURCE_ROUTING    0x0800
-
-#define BDB_BUFFER_SIZE                 0x100
-#define BDB_NOT_CHAIN_END               0x0000
-#define BDB_CHAIN_END                   0x8000
-#define BDB_NO_WARNING                  0x0000
-#define BDB_WARNING                     0x4000
-
-#define ERROR_COUNTERS_CHANGED          0x0001
-#define TI_NDIS_RING_STATUS_CHANGED     0x0002
-#define UNA_CHANGED                     0x0004
-#define READY_TO_SEND_RQ_INIT           0x0008
-
-#define SCGB_ADDRESS_POINTER_FORMAT     INTEL_ADDRESS_POINTER_FORMAT
-#define SCGB_DATA_FORMAT                INTEL_DATA_FORMAT
-#define SCGB_MULTI_WORD_CONTROL         0
-#define SCGB_BURST_LENGTH               0x000E  /* DMA Burst Length */
-
-#define SCGB_CONFIG                     (INTEL_ADDRESS_POINTER_FORMAT+INTEL_DATA_FORMAT+SCGB_BURST_LENGTH)
-
-#define ISCP_BLOCK_SIZE                 0x0A
-#define RAM_SIZE                        0x10000
-#define INIT_SYS_CONFIG_PTR_OFFSET      (RAM_SIZE-ISCP_BLOCK_SIZE)
-#define SCGP_BLOCK_OFFSET               0
-
-#define SCLB_NOT_VALID                  0x0000  /* Initially, SCLB not valid */
-#define SCLB_VALID                      0x8000  /* Host tells TRC SCLB valid */
-#define SCLB_PROCESSED                  0x0000  /* TRC says SCLB processed */
-#define SCLB_RESUME_CONTROL_NOT_VALID   0x0000  /* Initially, RC not valid */
-#define SCLB_RESUME_CONTROL_VALID       0x4000  /* Host tells TRC RC valid */
-#define SCLB_IACK_CODE_NOT_VALID        0x0000  /* Initially, IACK not valid */
-#define SCLB_IACK_CODE_VALID            0x2000  /* Host tells TRC IACK valid */
-#define SCLB_CMD_NOP                    0x0000
-#define SCLB_CMD_REMOVE                 0x0001
-#define SCLB_CMD_SUSPEND_ACB_CHAIN      0x0002
-#define SCLB_CMD_SET_INTERRUPT_MASK     0x0003
-#define SCLB_CMD_CLEAR_INTERRUPT_MASK   0x0004
-#define SCLB_CMD_RESERVED_5             0x0005
-#define SCLB_CMD_RESERVED_6             0x0006
-#define SCLB_CMD_RESERVED_7             0x0007
-#define SCLB_CMD_RESERVED_8             0x0008
-#define SCLB_CMD_RESERVED_9             0x0009
-#define SCLB_CMD_RESERVED_A             0x000A
-#define SCLB_CMD_RESERVED_B             0x000B
-#define SCLB_CMD_RESERVED_C             0x000C
-#define SCLB_CMD_RESERVED_D             0x000D
-#define SCLB_CMD_RESERVED_E             0x000E
-#define SCLB_CMD_RESERVED_F             0x000F
-
-#define SCLB_RC_ACB                     0x0001  /* Action Command Block Chain */
-#define SCLB_RC_RES0                    0x0002  /* Always Zero */
-#define SCLB_RC_RES1                    0x0004  /* Always Zero */
-#define SCLB_RC_RES2                    0x0008  /* Always Zero */
-#define SCLB_RC_RX_MAC_FCB              0x0010  /* RX_MAC_FCB Chain */
-#define SCLB_RC_RX_MAC_BDB              0x0020  /* RX_MAC_BDB Chain */
-#define SCLB_RC_RX_NON_MAC_FCB          0x0040  /* RX_NON_MAC_FCB Chain */
-#define SCLB_RC_RX_NON_MAC_BDB          0x0080  /* RX_NON_MAC_BDB Chain */
-#define SCLB_RC_TFCB0                   0x0100  /* TX Priority 0 FCB Chain */
-#define SCLB_RC_TFCB1                   0x0200  /* TX Priority 1 FCB Chain */
-#define SCLB_RC_TFCB2                   0x0400  /* TX Priority 2 FCB Chain */
-#define SCLB_RC_TFCB3                   0x0800  /* TX Priority 3 FCB Chain */
-#define SCLB_RC_TFCB4                   0x1000  /* TX Priority 4 FCB Chain */
-#define SCLB_RC_TFCB5                   0x2000  /* TX Priority 5 FCB Chain */
-#define SCLB_RC_TFCB6                   0x4000  /* TX Priority 6 FCB Chain */
-#define SCLB_RC_TFCB7                   0x8000  /* TX Priority 7 FCB Chain */
-
-#define SCLB_IMC_RES0                   0x0001  /* */
-#define SCLB_IMC_MAC_TYPE_3             0x0002  /* MAC_ARC_INDICATE */
-#define SCLB_IMC_MAC_ERROR_COUNTERS     0x0004  /* */
-#define SCLB_IMC_RES1                   0x0008  /* */
-#define SCLB_IMC_MAC_TYPE_2             0x0010  /* QUE_MAC_INDICATE */
-#define SCLB_IMC_TX_FRAME               0x0020  /* */
-#define SCLB_IMC_END_OF_TX_QUEUE        0x0040  /* */
-#define SCLB_IMC_NON_MAC_RX_RESOURCE    0x0080  /* */
-#define SCLB_IMC_MAC_RX_RESOURCE        0x0100  /* */
-#define SCLB_IMC_NON_MAC_RX_FRAME       0x0200  /* */
-#define SCLB_IMC_MAC_RX_FRAME           0x0400  /* */
-#define SCLB_IMC_TRC_FIFO_STATUS        0x0800  /* */
-#define SCLB_IMC_COMMAND_STATUS         0x1000  /* */
-#define SCLB_IMC_MAC_TYPE_1             0x2000  /* Self Removed */
-#define SCLB_IMC_TRC_INTRNL_TST_STATUS  0x4000  /* */
-#define SCLB_IMC_RES2                   0x8000  /* */
-
-#define DMA_TRIGGER                     0x0004
-#define FREQ_16MB_BIT                   0x0010
-#define THDREN                          0x0020
-#define CFG0_RSV1                       0x0040
-#define CFG0_RSV2                       0x0080
-#define ETREN                           0x0100
-#define RX_OWN_BIT                      0x0200
-#define RXATMAC                         0x0400
-#define PROMISCUOUS_BIT                 0x0800
-#define USETPT                          0x1000
-#define SAVBAD_BIT                      0x2000
-#define ONEQUE                          0x4000
-#define NO_AUTOREMOVE                   0x8000
-
-#define RX_FCB_AREA_8316        0x00000000
-#define RX_BUFF_AREA_8316       0x00000000
-
-#define TRC_POINTER(X)          ((unsigned long)(X) - tp->ram_access)
-#define RX_FCB_TRC_POINTER(X)   ((unsigned long)(X) - tp->ram_access + RX_FCB_AREA_8316)
-#define RX_BUFF_TRC_POINTER(X) ((unsigned long)(X) - tp->ram_access + RX_BUFF_AREA_8316)
-
-// Offset 0: MSR - Memory Select Register
-//
-#define r587_MSR        0x000   // Register Offset
-//#define       MSR_RST         0x080   // LAN Controller Reset
-#define MSR_MENB        0x040   // Shared Memory Enable
-#define MSR_RA18        0x020   // Ram Address bit 18   (583, 584, 587)
-#define MSR_RA17        0x010   // Ram Address bit 17   (583, 584, 585/790)
-#define MSR_RA16        0x008   // Ram Address bit 16   (583, 584, 585/790)
-#define MSR_RA15        0x004   // Ram Address bit 15   (583, 584, 585/790)
-#define MSR_RA14        0x002   // Ram Address bit 14   (583, 584, 585/790)
-#define MSR_RA13        0x001   // Ram Address bit 13   (583, 584, 585/790)
-
-#define MSR_MASK        0x03F   // Mask for Address bits RA18-RA13 (583, 584, 587)
-
-#define MSR                     0x00
-#define IRR                     0x04
-#define HWR                     0x04
-#define LAAR                    0x05
-#define IMCCR                   0x05
-#define LAR0                    0x08
-#define BDID                    0x0E    // Adapter ID byte register offset
-#define CSR                     0x10
-#define PR                      0x11
-
-#define MSR_RST                 0x80
-#define MSR_MEMB                0x40
-#define MSR_0WS                 0x20
-
-#define FORCED_16BIT_MODE       0x0002
-
-#define INTERFRAME_SPACING_16           0x0003  /* 6 bytes */
-#define INTERFRAME_SPACING_4            0x0001  /* 2 bytes */
-#define MULTICAST_ADDRESS_BIT           0x0010
-#define NON_SRC_ROUTING_BIT             0x0020
-
-#define LOOPING_MODE_MASK       0x0007
-
-/*
- * Decode firmware defines.
- */
-#define SWAP_BYTES(X)          ((X & 0xff) << 8) | (X >> 8)
-#define WEIGHT_OFFSET          5
-#define TREE_SIZE_OFFSET       9
-#define TREE_OFFSET            11
-
-/* The Huffman Encoding Tree is constructed of these nodes. */
-typedef struct {
-       __u8    llink;  /* Short version of above node. */
-       __u8    tag;
-       __u8    info;   /* This node is used on decodes. */
-       __u8    rlink;
-} DECODE_TREE_NODE;
-
-#define ROOT   0       /* Branch value. */
-#define LEAF   0       /* Tag field value. */
-#define BRANCH 1       /* Tag field value. */
-
-/*
- * Multicast Table Structure
- */
-typedef struct {
-        __u8    address[6];
-        __u8    instance_count;
-} McTable;
-
-/*
- * Fragment Descriptor Definition
- */
-typedef struct {
-        __u8  *fragment_ptr;
-        __u32   fragment_length;
-} FragmentStructure;
-
-/*
- * Data Buffer Structure Definition
- */
-typedef struct {
-        __u32 fragment_count;
-        FragmentStructure       fragment_list[MAXFRAGMENTS];
-} DataBufferStructure;
-
-#pragma pack(1)
-typedef struct {
-                __u8    IType;
-                __u8    ISubtype;
-} Interrupt_Status_Word;
-
-#pragma pack(1)
-typedef struct BDBlockType {
-                __u16                   info;                   /* 02 */
-                __u32                   trc_next_ptr;           /* 06 */
-                __u32                   trc_data_block_ptr;     /* 10 */
-                __u16                   buffer_length;          /* 12 */
-
-                __u16                   *data_block_ptr;        /* 16 */
-                struct  BDBlockType     *next_ptr;              /* 20 */
-                struct  BDBlockType     *back_ptr;              /* 24 */
-                __u8                    filler[8];              /* 32 */
-} BDBlock;
-
-#pragma pack(1)
-typedef struct FCBlockType {
-                __u16                   frame_status;           /* 02 */
-                __u16                   info;                   /* 04 */
-                __u32                   trc_next_ptr;           /* 08 */
-                __u32                   trc_bdb_ptr;            /* 12 */
-                __u16                   frame_length;           /* 14 */
-
-                BDBlock                 *bdb_ptr;               /* 18 */
-                struct  FCBlockType     *next_ptr;              /* 22 */
-                struct  FCBlockType     *back_ptr;              /* 26 */
-                __u16                   memory_alloc;           /* 28 */
-                __u8                    filler[4];              /* 32 */
-
-} FCBlock;
-
-#pragma pack(1)
-typedef struct SBlockType{
-                __u8                           Internal_Error_Count;
-                __u8                           Line_Error_Count;
-                __u8                           AC_Error_Count;
-                __u8                           Burst_Error_Count;
-                __u8                            RESERVED_COUNTER_0;
-                __u8                            AD_TRANS_Count;
-                __u8                            RCV_Congestion_Count;
-                __u8                            Lost_FR_Error_Count;
-                __u8                            FREQ_Error_Count;
-                __u8                            FR_Copied_Error_Count;
-                __u8                            RESERVED_COUNTER_1;
-                __u8                            Token_Error_Count;
-
-                __u16                           TI_NDIS_Ring_Status;
-                __u16                           BCN_Type;
-                __u16                           Error_Code;
-                __u16                           SA_of_Last_AMP_SMP[3];
-                __u16                           UNA[3];
-                __u16                           Ucode_Version_Number;
-                __u16                           Status_CHG_Indicate;
-                __u16                           RESERVED_STATUS_0;
-} SBlock;
-
-#pragma pack(1)
-typedef struct ACBlockType {
-                __u16                   cmd_done_status;    /* 02 */
-                __u16                   cmd_info;           /* 04 */
-                __u32                   trc_next_ptr;           /* 08 */
-                __u16                   cmd;                /* 10 */
-                __u16                   subcmd;             /* 12 */
-                __u16                   data_offset_lo;         /* 14 */
-                __u16                   data_offset_hi;         /* 16 */
-
-                struct  ACBlockType     *next_ptr;              /* 20 */
-
-                __u8                    filler[12];             /* 32 */
-} ACBlock;
-
-#define NUM_OF_INTERRUPTS               0x20
-
-#pragma pack(1)
-typedef struct {
-                Interrupt_Status_Word   IStatus[NUM_OF_INTERRUPTS];
-} ISBlock;
-
-#pragma pack(1)
-typedef struct {
-                __u16                   valid_command;          /* 02 */
-                __u16                   iack_code;              /* 04 */
-                __u16                   resume_control;         /* 06 */
-                __u16                   int_mask_control;       /* 08 */
-                __u16                   int_mask_state;         /* 10 */
-
-                __u8                    filler[6];              /* 16 */
-} SCLBlock;
-
-#pragma pack(1)
-typedef struct
-{
-                __u16                   config;                 /* 02 */
-                __u32                   trc_sclb_ptr;           /* 06 */
-                __u32                   trc_acb_ptr;            /* 10 */
-                __u32                   trc_isb_ptr;            /* 14 */
-                __u16                   isbsiz;                 /* 16 */
-
-                SCLBlock                *sclb_ptr;              /* 20 */
-                ACBlock                 *acb_ptr;               /* 24 */
-                ISBlock                 *isb_ptr;               /* 28 */
-
-                __u16                   Non_Mac_Rx_Bdbs;        /* 30 DEBUG */
-                __u8                    filler[2];              /* 32 */
-
-} SCGBlock;
-
-#pragma pack(1)
-typedef struct
-{
-       __u32           trc_scgb_ptr;
-       SCGBlock        *scgb_ptr;
-} ISCPBlock;
-#pragma pack()
-
-typedef struct net_local {
-       ISCPBlock       *iscpb_ptr;
-        SCGBlock        *scgb_ptr;
-        SCLBlock        *sclb_ptr;
-        ISBlock         *isb_ptr;
-
-       ACBlock         *acb_head;
-        ACBlock         *acb_curr;
-        ACBlock         *acb_next;
-
-       __u8            adapter_name[12];
-
-       __u16           num_rx_bdbs     [NUM_RX_QS_USED];
-       __u16           num_rx_fcbs     [NUM_RX_QS_USED];
-
-       __u16           num_tx_bdbs     [NUM_TX_QS_USED];
-       __u16           num_tx_fcbs     [NUM_TX_QS_USED];
-
-       __u16           num_of_tx_buffs;
-
-       __u16           tx_buff_size    [NUM_TX_QS_USED];
-       __u16           tx_buff_used    [NUM_TX_QS_USED];
-       __u16           tx_queue_status [NUM_TX_QS_USED];
-
-       FCBlock         *tx_fcb_head[NUM_TX_QS_USED];
-       FCBlock         *tx_fcb_curr[NUM_TX_QS_USED];
-       FCBlock         *tx_fcb_end[NUM_TX_QS_USED];
-       BDBlock         *tx_bdb_head[NUM_TX_QS_USED];
-       __u16           *tx_buff_head[NUM_TX_QS_USED];
-       __u16           *tx_buff_end[NUM_TX_QS_USED];
-       __u16           *tx_buff_curr[NUM_TX_QS_USED];
-       __u16           num_tx_fcbs_used[NUM_TX_QS_USED];
-
-       FCBlock         *rx_fcb_head[NUM_RX_QS_USED];
-       FCBlock         *rx_fcb_curr[NUM_RX_QS_USED];
-       BDBlock         *rx_bdb_head[NUM_RX_QS_USED];
-       BDBlock         *rx_bdb_curr[NUM_RX_QS_USED];
-       BDBlock         *rx_bdb_end[NUM_RX_QS_USED];
-       __u16           *rx_buff_head[NUM_RX_QS_USED];
-       __u16           *rx_buff_end[NUM_RX_QS_USED];
-
-       __u32           *ptr_local_ring_num;
-
-       __u32           sh_mem_used;
-
-       __u16           page_offset_mask;
-
-       __u16           authorized_function_classes;
-       __u16           authorized_access_priority;
-
-        __u16            num_acbs;
-        __u16            num_acbs_used;
-        __u16            acb_pending;
-
-       __u16           current_isb_index;
-
-       __u8            monitor_state;
-       __u8            monitor_state_ready;
-       __u16           ring_status;
-       __u8            ring_status_flags;
-       __u8            state;
-
-       __u8            join_state;
-
-       __u8            slot_num;
-       __u16           pos_id;
-
-       __u32           *ptr_una;
-       __u32           *ptr_bcn_type;
-       __u32           *ptr_tx_fifo_underruns;
-       __u32           *ptr_rx_fifo_underruns;
-       __u32           *ptr_rx_fifo_overruns;
-       __u32           *ptr_tx_fifo_overruns;
-       __u32           *ptr_tx_fcb_overruns;
-       __u32           *ptr_rx_fcb_overruns;
-       __u32           *ptr_tx_bdb_overruns;
-       __u32           *ptr_rx_bdb_overruns;
-
-       __u16           receive_queue_number;
-
-       __u8            rx_fifo_overrun_count;
-       __u8            tx_fifo_overrun_count;
-
-       __u16            adapter_flags;
-       __u16           adapter_flags1;
-       __u16            *misc_command_data;
-       __u16            max_packet_size;
-
-       __u16            config_word0;
-        __u16            config_word1;
-
-       __u8            trc_mask;
-
-       __u16            source_ring_number;
-        __u16            target_ring_number;
-
-       __u16           microcode_version;
-
-       __u16            bic_type;
-        __u16            nic_type;
-        __u16            board_id;
-
-       __u16            rom_size;
-       __u32           rom_base;
-        __u16            ram_size;
-        __u16            ram_usable;
-       __u32           ram_base;
-       __u32           ram_access;
-
-       __u16            extra_info;
-        __u16            mode_bits;
-       __u16           media_menu;
-       __u16           media_type;
-       __u16           adapter_bus;
-
-       __u16           status;
-       __u16            receive_mask;
-
-       __u16            group_address_0;
-        __u16            group_address[2];
-        __u16            functional_address_0;
-        __u16            functional_address[2];
-        __u16            bitwise_group_address[2];
-
-       __u8            cleanup;
-
-       struct sk_buff_head SendSkbQueue;
-        __u16 QueueSkb;
-
-       struct tr_statistics MacStat;   /* MAC statistics structure */
-       
-       spinlock_t      lock;
-} NET_LOCAL;
-
-/************************************
- * SNMP-ON-BOARD Agent Link Structure
- ************************************/
-
-typedef struct {
-        __u8           LnkSigStr[12]; /* signature string "SmcLinkTable" */
-        __u8           LnkDrvTyp;     /* 1=Redbox ODI, 2=ODI DOS, 3=ODI OS/2, 4=NDIS DOS */
-        __u8           LnkFlg;        /* 0 if no agent linked, 1 if agent linked */
-        void           *LnkNfo;       /* routine which returns pointer to NIC info */
-        void           *LnkAgtRcv;    /* pointer to agent receive trap entry */
-        void           *LnkAgtXmt;            /* pointer to agent transmit trap
-entry  */
-void           *LnkGet;                  /* pointer to NIC receive data
-copy routine */
-        void           *LnkSnd;                  /* pointer to NIC send routine
-*/
-        void           *LnkRst;                  /* pointer to NIC driver reset
-routine */
-        void           *LnkMib;                  /* pointer to MIB data base */
-        void           *LnkMibAct;            /* pointer to MIB action routine list */
-        __u16           LnkCntOffset;  /* offset to error counters */
-        __u16           LnkCntNum;     /* number of error counters */
-        __u16           LnkCntSize;    /* size of error counters i.e. 32 = 32 bits */
-        void           *LnkISR;       /* pointer to interrupt vector */
-        __u8           LnkFrmTyp;     /* 1=Ethernet, 2=Token Ring */
-        __u8           LnkDrvVer1 ;   /* driver major version */
-        __u8           LnkDrvVer2 ;   /* driver minor version */
-} AgentLink;
-
-/*
- * Definitions for pcm_card_flags(bit_mapped)
- */
-#define REG_COMPLETE   0x0001
-#define INSERTED       0x0002
-#define PCC_INSERTED   0x0004         /* 1=currently inserted, 0=cur removed */
-
-/*
- * Adapter RAM test patterns
- */
-#define RAM_PATTERN_1  0x55AA
-#define RAM_PATTERN_2  0x9249
-#define RAM_PATTERN_3  0xDB6D
-
-/*
- * definitions for RAM test
- */
-#define ROM_SIGNATURE  0xAA55
-#define MIN_ROM_SIZE   0x2000
-
-/*
- * Return Codes
- */
-#define SUCCESS                 0x0000
-#define ADAPTER_AND_CONFIG      0x0001
-#define ADAPTER_NO_CONFIG       0x0002
-#define NOT_MY_INTERRUPT        0x0003
-#define FRAME_REJECTED          0x0004
-#define EVENTS_DISABLED         0x0005
-#define OUT_OF_RESOURCES        0x0006
-#define INVALID_PARAMETER       0x0007
-#define INVALID_FUNCTION        0x0008
-#define INITIALIZE_FAILED       0x0009
-#define CLOSE_FAILED            0x000A
-#define MAX_COLLISIONS          0x000B
-#define NO_SUCH_DESTINATION     0x000C
-#define BUFFER_TOO_SMALL_ERROR  0x000D
-#define ADAPTER_CLOSED          0x000E
-#define UCODE_NOT_PRESENT       0x000F
-#define FIFO_UNDERRUN           0x0010
-#define DEST_OUT_OF_RESOURCES   0x0011
-#define ADAPTER_NOT_INITIALIZED 0x0012
-#define PENDING                 0x0013
-#define UCODE_PRESENT           0x0014
-#define NOT_INIT_BY_BRIDGE      0x0015
-
-#define OPEN_FAILED             0x0080
-#define HARDWARE_FAILED         0x0081
-#define SELF_TEST_FAILED        0x0082
-#define RAM_TEST_FAILED         0x0083
-#define RAM_CONFLICT            0x0084
-#define ROM_CONFLICT            0x0085
-#define UNKNOWN_ADAPTER         0x0086
-#define CONFIG_ERROR            0x0087
-#define CONFIG_WARNING          0x0088
-#define NO_FIXED_CNFG           0x0089
-#define EEROM_CKSUM_ERROR       0x008A
-#define ROM_SIGNATURE_ERROR     0x008B
-#define ROM_CHECKSUM_ERROR      0x008C
-#define ROM_SIZE_ERROR          0x008D
-#define UNSUPPORTED_NIC_CHIP    0x008E
-#define NIC_REG_ERROR           0x008F
-#define BIC_REG_ERROR           0x0090
-#define MICROCODE_TEST_ERROR    0x0091
-#define LOBE_MEDIA_TEST_FAILED  0x0092
-
-#define ADAPTER_FOUND_LAN_CORRUPT 0x009B
-
-#define ADAPTER_NOT_FOUND       0xFFFF
-
-#define ILLEGAL_FUNCTION        INVALID_FUNCTION
-
-/* Errors */
-#define IO_BASE_INVALID         0x0001
-#define IO_BASE_RANGE           0x0002
-#define IRQ_INVALID             0x0004
-#define IRQ_RANGE               0x0008
-#define RAM_BASE_INVALID        0x0010
-#define RAM_BASE_RANGE          0x0020
-#define RAM_SIZE_RANGE          0x0040
-#define MEDIA_INVALID           0x0800
-
-/* Warnings */
-#define IRQ_MISMATCH            0x0080
-#define RAM_BASE_MISMATCH       0x0100
-#define RAM_SIZE_MISMATCH       0x0200
-#define BUS_MODE_MISMATCH       0x0400
-
-#define RX_CRC_ERROR                            0x01
-#define RX_ALIGNMENT_ERROR              0x02
-#define RX_HW_FAILED                            0x80
-
-/*
- * Definitions for the field RING_STATUS_FLAGS
- */
-#define RING_STATUS_CHANGED                     0X01
-#define MONITOR_STATE_CHANGED                   0X02
-#define JOIN_STATE_CHANGED                      0X04
-
-/*
- * Definitions for the field JOIN_STATE
- */
-#define JS_BYPASS_STATE                         0x00
-#define JS_LOBE_TEST_STATE                      0x01
-#define JS_DETECT_MONITOR_PRESENT_STATE         0x02
-#define JS_AWAIT_NEW_MONITOR_STATE              0x03
-#define JS_DUPLICATE_ADDRESS_TEST_STATE         0x04
-#define JS_NEIGHBOR_NOTIFICATION_STATE          0x05
-#define JS_REQUEST_INITIALIZATION_STATE         0x06
-#define JS_JOIN_COMPLETE_STATE                  0x07
-#define JS_BYPASS_WAIT_STATE                    0x08
-
-/*
- * Definitions for the field MONITOR_STATE
- */
-#define MS_MONITOR_FSM_INACTIVE                 0x00
-#define MS_REPEAT_BEACON_STATE                  0x01
-#define MS_REPEAT_CLAIM_TOKEN_STATE             0x02
-#define MS_TRANSMIT_CLAIM_TOKEN_STATE           0x03
-#define MS_STANDBY_MONITOR_STATE                0x04
-#define MS_TRANSMIT_BEACON_STATE                0x05
-#define MS_ACTIVE_MONITOR_STATE                 0x06
-#define MS_TRANSMIT_RING_PURGE_STATE            0x07
-#define MS_BEACON_TEST_STATE                    0x09
-
-/*
- * Definitions for the bit-field RING_STATUS
- */
-#define SIGNAL_LOSS                             0x8000
-#define HARD_ERROR                              0x4000
-#define SOFT_ERROR                              0x2000
-#define TRANSMIT_BEACON                         0x1000
-#define LOBE_WIRE_FAULT                         0x0800
-#define AUTO_REMOVAL_ERROR                      0x0400
-#define REMOVE_RECEIVED                         0x0100
-#define COUNTER_OVERFLOW                        0x0080
-#define SINGLE_STATION                          0x0040
-#define RING_RECOVERY                           0x0020
-
-/*
- * Definitions for the field BUS_TYPE
- */
-#define AT_BUS                  0x00
-#define MCA_BUS                 0x01
-#define EISA_BUS                0x02
-#define PCI_BUS                 0x03
-#define PCMCIA_BUS              0x04
-
-/*
- * Definitions for adapter_flags
- */
-#define RX_VALID_LOOKAHEAD      0x0001
-#define FORCED_16BIT_MODE       0x0002
-#define ADAPTER_DISABLED        0x0004
-#define TRANSMIT_CHAIN_INT      0x0008
-#define EARLY_RX_FRAME          0x0010
-#define EARLY_TX                0x0020
-#define EARLY_RX_COPY           0x0040
-#define USES_PHYSICAL_ADDR      0x0080         /* Rsvd for DEC PCI and 9232 */
-#define NEEDS_PHYSICAL_ADDR    0x0100          /* Reserved*/
-#define RX_STATUS_PENDING       0x0200
-#define ERX_DISABLED           0x0400          /* EARLY_RX_ENABLE rcv_mask */
-#define ENABLE_TX_PENDING       0x0800
-#define ENABLE_RX_PENDING       0x1000
-#define PERM_CLOSE              0x2000  
-#define IO_MAPPED               0x4000         /* IOmapped bus interface 795 */
-#define ETX_DISABLED            0x8000
-
-
-/*
- * Definitions for adapter_flags1
- */
-#define TX_PHY_RX_VIRT          0x0001 
-#define NEEDS_HOST_RAM          0x0002
-#define NEEDS_MEDIA_TYPE        0x0004
-#define EARLY_RX_DONE           0x0008
-#define PNP_BOOT_BIT            0x0010  /* activates PnP & config on power-up */
-                                        /* clear => regular PnP operation */
-#define PNP_ENABLE              0x0020  /* regular PnP operation clear => */
-                                        /* no PnP, overrides PNP_BOOT_BIT */
-#define SATURN_ENABLE           0x0040
-
-#define ADAPTER_REMOVABLE       0x0080         /* adapter is hot swappable */
-#define TX_PHY                  0x0100  /* Uses physical address for tx bufs */
-#define RX_PHY                  0x0200  /* Uses physical address for rx bufs */
-#define TX_VIRT                 0x0400  /* Uses virtual addr for tx bufs */
-#define RX_VIRT                 0x0800 
-#define NEEDS_SERVICE           0x1000 
-
-/*
- * Adapter Status Codes
- */
-#define OPEN                    0x0001
-#define INITIALIZED             0x0002
-#define CLOSED                  0x0003
-#define FAILED                  0x0005
-#define NOT_INITIALIZED         0x0006
-#define IO_CONFLICT             0x0007
-#define CARD_REMOVED            0x0008
-#define CARD_INSERTED           0x0009
-
-/*
- * Mode Bit Definitions
- */
-#define INTERRUPT_STATUS_BIT    0x8000  /* PC Interrupt Line: 0 = Not Enabled */
-#define BOOT_STATUS_MASK        0x6000  /* Mask to isolate BOOT_STATUS */
-#define BOOT_INHIBIT            0x0000  /* BOOT_STATUS is 'inhibited' */
-#define BOOT_TYPE_1             0x2000  /* Unused BOOT_STATUS value */
-#define BOOT_TYPE_2             0x4000  /* Unused BOOT_STATUS value */
-#define BOOT_TYPE_3             0x6000  /* Unused BOOT_STATUS value */
-#define ZERO_WAIT_STATE_MASK    0x1800  /* Mask to isolate Wait State flags */
-#define ZERO_WAIT_STATE_8_BIT   0x1000  /* 0 = Disabled (Inserts Wait States) */
-#define ZERO_WAIT_STATE_16_BIT  0x0800  /* 0 = Disabled (Inserts Wait States) */
-#define LOOPING_MODE_MASK       0x0007
-#define LOOPBACK_MODE_0         0x0000
-#define LOOPBACK_MODE_1         0x0001
-#define LOOPBACK_MODE_2         0x0002
-#define LOOPBACK_MODE_3         0x0003
-#define LOOPBACK_MODE_4         0x0004
-#define LOOPBACK_MODE_5         0x0005
-#define LOOPBACK_MODE_6         0x0006
-#define LOOPBACK_MODE_7         0x0007
-#define AUTO_MEDIA_DETECT       0x0008
-#define MANUAL_CRC              0x0010
-#define EARLY_TOKEN_REL         0x0020  /* Early Token Release for Token Ring */
-#define UMAC               0x0040 
-#define UTP2_PORT               0x0080  /* For 8216T2, 0=port A, 1=Port B. */
-#define BNC_10BT_INTERFACE      0x0600  /* BNC and UTP current media set */
-#define UTP_INTERFACE           0x0500  /* Ethernet UTP Only. */
-#define BNC_INTERFACE           0x0400
-#define AUI_INTERFACE           0x0300
-#define AUI_10BT_INTERFACE      0x0200
-#define STARLAN_10_INTERFACE    0x0100
-#define INTERFACE_TYPE_MASK     0x0700
-
-/*
- * Media Type Bit Definitions
- *
- * legend:      TP = Twisted Pair
- *              STP = Shielded twisted pair
- *              UTP = Unshielded twisted pair
- */
-
-#define CNFG_MEDIA_TYPE_MASK    0x001e  /* POS Register 3 Mask         */
-
-#define MEDIA_S10               0x0000  /* Ethernet adapter, TP.        */
-#define MEDIA_AUI_UTP           0x0001  /* Ethernet adapter, AUI/UTP media */
-#define MEDIA_BNC               0x0002  /* Ethernet adapter, BNC media. */
-#define MEDIA_AUI               0x0003  /* Ethernet Adapter, AUI media. */
-#define MEDIA_STP_16            0x0004  /* TokenRing adap, 16Mbit STP.  */
-#define MEDIA_STP_4             0x0005  /* TokenRing adap, 4Mbit STP.   */
-#define MEDIA_UTP_16            0x0006  /* TokenRing adap, 16Mbit UTP.  */
-#define MEDIA_UTP_4             0x0007  /* TokenRing adap, 4Mbit UTP.   */
-#define MEDIA_UTP               0x0008  /* Ethernet adapter, UTP media (no AUI)
-*/
-#define MEDIA_BNC_UTP           0x0010  /* Ethernet adapter, BNC/UTP media */
-#define MEDIA_UTPFD             0x0011  /* Ethernet adapter, TP full duplex */
-#define MEDIA_UTPNL             0x0012  /* Ethernet adapter, TP with link integrity test disabled */
-#define MEDIA_AUI_BNC           0x0013  /* Ethernet adapter, AUI/BNC media */
-#define MEDIA_AUI_BNC_UTP       0x0014  /* Ethernet adapter, AUI_BNC/UTP */
-#define MEDIA_UTPA              0x0015  /* Ethernet UTP-10Mbps Ports A */
-#define MEDIA_UTPB              0x0016  /* Ethernet UTP-10Mbps Ports B */
-#define MEDIA_STP_16_UTP_16     0x0017  /* Token Ring STP-16Mbps/UTP-16Mbps */
-#define MEDIA_STP_4_UTP_4       0x0018  /* Token Ring STP-4Mbps/UTP-4Mbps */
-
-#define MEDIA_STP100_UTP100     0x0020  /* Ethernet STP-100Mbps/UTP-100Mbps */
-#define MEDIA_UTP100FD          0x0021  /* Ethernet UTP-100Mbps, full duplex */
-#define MEDIA_UTP100            0x0022  /* Ethernet UTP-100Mbps */
-
-
-#define MEDIA_UNKNOWN           0xFFFF  /* Unknown adapter/media type   */
-
-/*
- * Definitions for the field:
- * media_type2
- */
-#define MEDIA_TYPE_MII              0x0001
-#define MEDIA_TYPE_UTP              0x0002
-#define MEDIA_TYPE_BNC              0x0004
-#define MEDIA_TYPE_AUI              0x0008
-#define MEDIA_TYPE_S10              0x0010
-#define MEDIA_TYPE_AUTO_SENSE       0x1000
-#define MEDIA_TYPE_AUTO_DETECT      0x4000
-#define MEDIA_TYPE_AUTO_NEGOTIATE   0x8000
-
-/*
- * Definitions for the field:
- * line_speed
- */
-#define LINE_SPEED_UNKNOWN          0x0000
-#define LINE_SPEED_4                0x0001
-#define LINE_SPEED_10               0x0002
-#define LINE_SPEED_16               0x0004
-#define LINE_SPEED_100              0x0008
-#define LINE_SPEED_T4               0x0008  /* 100BaseT4 aliased for 9332BVT */
-#define LINE_SPEED_FULL_DUPLEX      0x8000
-
-/*
- * Definitions for the field:
- * bic_type (Bus interface chip type)
- */
-#define BIC_NO_CHIP             0x0000  /* Bus interface chip not implemented */
-#define BIC_583_CHIP            0x0001  /* 83C583 bus interface chip */
-#define BIC_584_CHIP            0x0002  /* 83C584 bus interface chip */
-#define BIC_585_CHIP            0x0003  /* 83C585 bus interface chip */
-#define BIC_593_CHIP            0x0004  /* 83C593 bus interface chip */
-#define BIC_594_CHIP            0x0005  /* 83C594 bus interface chip */
-#define BIC_564_CHIP            0x0006  /* PCMCIA Bus interface chip */
-#define BIC_790_CHIP            0x0007  /* 83C790 bus i-face/Ethernet NIC chip */
-#define BIC_571_CHIP            0x0008  /* 83C571 EISA bus master i-face */
-#define BIC_587_CHIP            0x0009  /* Token Ring AT bus master i-face */
-#define BIC_574_CHIP            0x0010  /* FEAST bus interface chip */
-#define BIC_8432_CHIP           0x0011  /* 8432 bus i-face/Ethernet NIC(DEC PCI) */
-#define BIC_9332_CHIP           0x0012  /* 9332 bus i-face/100Mbps Ether NIC(DEC PCI) */
-#define BIC_8432E_CHIP          0x0013  /* 8432 Enhanced bus iface/Ethernet NIC(DEC) */
-#define BIC_EPIC100_CHIP        0x0014  /* EPIC/100 10/100 Mbps Ethernet BIC/NIC */
-#define BIC_C94_CHIP            0x0015  /* 91C94 bus i-face in PCMCIA mode */
-#define BIC_X8020_CHIP          0x0016  /* Xilinx PCMCIA multi-func i-face */
-
-/*
- * Definitions for the field:
- * nic_type (Bus interface chip type)
- */
-#define NIC_UNK_CHIP            0x0000  /* Unknown NIC chip      */
-#define NIC_8390_CHIP           0x0001  /* DP8390 Ethernet NIC   */
-#define NIC_690_CHIP            0x0002  /* 83C690 Ethernet NIC   */
-#define NIC_825_CHIP            0x0003  /* 83C825 Token Ring NIC */
-/*      #define NIC_???_CHIP    0x0004  */ /* Not used           */
-/*      #define NIC_???_CHIP    0x0005  */ /* Not used           */
-/*      #define NIC_???_CHIP    0x0006  */ /* Not used           */
-#define NIC_790_CHIP            0x0007  /* 83C790 bus i-face/Ethernet NIC chip */
-#define NIC_C100_CHIP           0x0010  /* FEAST 100Mbps Ethernet NIC */
-#define NIC_8432_CHIP           0x0011  /* 8432 bus i-face/Ethernet NIC(DEC PCI) */
-#define NIC_9332_CHIP           0x0012  /* 9332 bus i-face/100Mbps Ether NIC(DEC PCI) */
-#define NIC_8432E_CHIP          0x0013  /* 8432 enhanced bus iface/Ethernet NIC(DEC) */
-#define NIC_EPIC100_CHIP        0x0014   /* EPIC/100 10/100 Mbps Ethernet BIC/NIC */
-#define NIC_C94_CHIP            0x0015  /* 91C94 PC Card with multi func */
-
-/*
- * Definitions for the field:
- * adapter_type The adapter_type field describes the adapter/bus
- *              configuration.
- */
-#define BUS_ISA16_TYPE          0x0001  /* 16 bit adap in 16 bit (E)ISA slot  */
-#define BUS_ISA8_TYPE           0x0002  /* 8/16b adap in 8 bit XT/(E)ISA slot */
-#define BUS_MCA_TYPE            0x0003  /* Micro Channel adapter              */
-
-/*
- * Receive Mask definitions
- */
-#define ACCEPT_MULTICAST                0x0001
-#define ACCEPT_BROADCAST                0x0002
-#define PROMISCUOUS_MODE                0x0004
-#define ACCEPT_SOURCE_ROUTING           0x0008
-#define ACCEPT_ERR_PACKETS              0x0010
-#define ACCEPT_ATT_MAC_FRAMES           0x0020
-#define ACCEPT_MULTI_PROM               0x0040
-#define TRANSMIT_ONLY                   0x0080
-#define ACCEPT_EXT_MAC_FRAMES           0x0100
-#define EARLY_RX_ENABLE                 0x0200
-#define PKT_SIZE_NOT_NEEDED             0x0400
-#define ACCEPT_SOURCE_ROUTING_SPANNING  0x0808
-
-#define ACCEPT_ALL_MAC_FRAMES           0x0120
-
-/*
- * config_mode defs
- */
-#define STORE_EEROM             0x0001  /* Store config in EEROM. */
-#define STORE_REGS              0x0002  /* Store config in register set. */
-
-/*
- * equates for lmac_flags in adapter structure (Ethernet)
- */
-#define         MEM_DISABLE     0x0001
-#define         RX_STATUS_POLL  0x0002
-#define         USE_RE_BIT      0x0004
-/*#define       RESERVED        0x0008 */
-/*#define       RESERVED        0x0010 */
-/*#define       RESERVED        0x0020 */
-/*#define       RESERVED        0x0040 */
-/*#define       RESERVED        0x0080 */
-/*#define       RESERVED        0x0100 */
-/*#define       RESERVED        0x0200 */
-/*#define       RESERVED        0x0400 */
-/*#define       RESERVED        0x0800 */
-/*#define       RESERVED        0x1000 */
-/*#define       RESERVED        0x2000 */
-/*#define       RESERVED        0x4000 */
-/*#define       RESERVED        0x8000 */
-
-/* media_opts & media_set Fields bit defs for Ethernet ... */
-#define         MED_OPT_BNC     0x01
-#define         MED_OPT_UTP     0x02
-#define         MED_OPT_AUI     0x04
-#define         MED_OPT_10MB    0x08
-#define         MED_OPT_100MB   0x10
-#define         MED_OPT_S10     0x20
-
-/* media_opts & media_set Fields bit defs for Token Ring ... */
-#define         MED_OPT_4MB     0x08
-#define         MED_OPT_16MB    0x10
-#define         MED_OPT_STP     0x40
-
-#define MAX_8023_SIZE           1500    /* Max 802.3 size of frame. */
-#define DEFAULT_ERX_VALUE       4       /* Number of 16-byte blocks for 790B early Rx. */
-#define DEFAULT_ETX_VALUE       32      /* Number of bytes for 790B early Tx. */
-#define DEFAULT_TX_RETRIES      3       /* Number of transmit retries */
-#define LPBK_FRAME_SIZE         1024    /* Default loopback frame for Rx calibration test. */
-#define MAX_LOOKAHEAD_SIZE      252     /* Max lookahead size for ethernet. */
-
-#define RW_MAC_STATE                    0x1101
-#define RW_SA_OF_LAST_AMP_OR_SMP        0x2803
-#define RW_PHYSICAL_DROP_NUMBER         0x3B02
-#define RW_UPSTREAM_NEIGHBOR_ADDRESS    0x3E03
-#define RW_PRODUCT_INSTANCE_ID          0x4B09
-
-#define RW_TRC_STATUS_BLOCK             0x5412
-
-#define RW_MAC_ERROR_COUNTERS_NO_CLEAR  0x8006
-#define RW_MAC_ERROR_COUNTER_CLEAR      0x7A06
-#define RW_CONFIG_REGISTER_0            0xA001
-#define RW_CONFIG_REGISTER_1            0xA101
-#define RW_PRESCALE_TIMER_THRESHOLD     0xA201
-#define RW_TPT_THRESHOLD                0xA301
-#define RW_TQP_THRESHOLD                0xA401
-#define RW_TNT_THRESHOLD                0xA501
-#define RW_TBT_THRESHOLD                0xA601
-#define RW_TSM_THRESHOLD                0xA701
-#define RW_TAM_THRESHOLD                0xA801
-#define RW_TBR_THRESHOLD                0xA901
-#define RW_TER_THRESHOLD                0xAA01
-#define RW_TGT_THRESHOLD                0xAB01
-#define RW_THT_THRESHOLD                0xAC01
-#define RW_TRR_THRESHOLD                0xAD01
-#define RW_TVX_THRESHOLD                0xAE01
-#define RW_INDIVIDUAL_MAC_ADDRESS       0xB003
-
-#define RW_INDIVIDUAL_GROUP_ADDRESS     0xB303  /* all of group addr */
-#define RW_INDIVIDUAL_GROUP_ADDR_WORD_0 0xB301  /* 1st word of group addr */
-#define RW_INDIVIDUAL_GROUP_ADDR        0xB402  /* 2nd-3rd word of group addr */
-#define RW_FUNCTIONAL_ADDRESS           0xB603  /* all of functional addr */
-#define RW_FUNCTIONAL_ADDR_WORD_0       0xB601  /* 1st word of func  addr */
-#define RW_FUNCTIONAL_ADDR              0xB702  /* 2nd-3rd word func addr */
-
-#define RW_BIT_SIGNIFICANT_GROUP_ADDR   0xB902
-#define RW_SOURCE_RING_BRIDGE_NUMBER    0xBB01
-#define RW_TARGET_RING_NUMBER           0xBC01
-
-#define RW_HIC_INTERRUPT_MASK           0xC601
-
-#define SOURCE_ROUTING_SPANNING_BITS    0x00C0  /* Spanning Tree Frames */
-#define SOURCE_ROUTING_EXPLORER_BIT     0x0040  /* Explorer and Single Route */
-
-        /* write */
-
-#define CSR_MSK_ALL             0x80    // Bic 587 Only
-#define CSR_MSKTINT             0x20
-#define CSR_MSKCBUSY            0x10
-#define CSR_CLRTINT             0x08
-#define CSR_CLRCBUSY            0x04
-#define CSR_WCSS                0x02
-#define CSR_CA                  0x01
-
-        /* read */
-
-#define CSR_TINT                0x20
-#define CSR_CINT                0x10
-#define CSR_TSTAT               0x08
-#define CSR_CSTAT               0x04
-#define CSR_FAULT               0x02
-#define CSR_CBUSY               0x01
-
-#define LAAR_MEM16ENB           0x80
-#define Zws16                   0x20
-
-#define IRR_IEN                 0x80
-#define Zws8                    0x01
-
-#define IMCCR_EIL               0x04
-
-typedef struct {
-        __u8            ac;                             /* Access Control */
-        __u8            fc;                             /* Frame Control */
-        __u8            da[6];                          /* Dest Addr */
-        __u8            sa[6];                          /* Source Addr */
-
-        __u16            vl;                             /* Vector Length */
-        __u8            dc_sc;                          /* Dest/Source Class */
-        __u8            vc;                             /* Vector Code */
-        } MAC_HEADER;
-
-#define MAX_SUB_VECTOR_INFO     (RX_DATA_BUFFER_SIZE - sizeof(MAC_HEADER) - 2)
-
-typedef struct
-        {
-        __u8            svl;                            /* Sub-vector Length */
-        __u8            svi;                            /* Sub-vector Code */
-        __u8            svv[MAX_SUB_VECTOR_INFO];       /* Sub-vector Info */
-        } MAC_SUB_VECTOR;
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_SMCTR_H */
diff --git a/drivers/net/tokenring/tms380tr.c b/drivers/net/tokenring/tms380tr.c
deleted file mode 100644 (file)
index b5e0855..0000000
+++ /dev/null
@@ -1,2306 +0,0 @@
-/*
- *  tms380tr.c: A network driver library for Texas Instruments TMS380-based
- *              Token Ring Adapters.
- *
- *  Originally sktr.c: Written 1997 by Christoph Goos
- *
- *  A fine result of the Linux Systems Network Architecture Project.
- *  http://www.vanheusden.com/sna/ 
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  The following modules are currently available for card support:
- *     - tmspci (Generic PCI card support)
- *     - abyss (Madge PCI support)
- *      - tmsisa (SysKonnect TR4/16 ISA)
- *
- *  Sources:
- *     - The hardware related parts of this driver are take from
- *       the SysKonnect Token Ring driver for Windows NT.
- *     - I used the IBM Token Ring driver 'ibmtr.c' as a base for this
- *       driver, as well as the 'skeleton.c' driver by Donald Becker.
- *     - Also various other drivers in the linux source tree were taken
- *       as samples for some tasks.
- *      - TI TMS380 Second-Generation Token Ring User's Guide
- *     - TI datasheets for respective chips
- *     - David Hein at Texas Instruments 
- *     - Various Madge employees
- *
- *  Maintainer(s):
- *    JS       Jay Schulist            jschlst@samba.org
- *    CG       Christoph Goos          cgoos@syskonnect.de
- *    AF       Adam Fritzler
- *    MLP       Mike Phillips           phillim@amtrak.com
- *    JF       Jochen Friedrich        jochen@scram.de
- *     
- *  Modification History:
- *     29-Aug-97       CG      Created
- *     04-Apr-98       CG      Fixed problems caused by tok_timer_check
- *     10-Apr-98       CG      Fixed lockups at cable disconnection
- *     27-May-98       JS      Formated to Linux Kernel Format
- *     31-May-98       JS      Hacked in PCI support
- *     16-Jun-98       JS      Modulized for multiple cards with one driver
- *        Sep-99       AF      Renamed to tms380tr (supports more than SK's)
- *      23-Sep-99      AF      Added Compaq and Thomas-Conrad PCI support
- *                             Fixed a bug causing double copies on PCI
- *                             Fixed for new multicast stuff (2.2/2.3)
- *     25-Sep-99       AF      Uped TPL_NUM from 3 to 9
- *                             Removed extraneous 'No free TPL'
- *     22-Dec-99       AF      Added Madge PCI Mk2 support and generalized
- *                             parts of the initilization procedure.
- *     30-Dec-99       AF      Turned tms380tr into a library ala 8390.
- *                             Madge support is provided in the abyss module
- *                             Generic PCI support is in the tmspci module.
- *     30-Nov-00       JF      Updated PCI code to support IO MMU via
- *                             pci_map_static(). Alpha uses this MMU for ISA
- *                             as well.
- *      14-Jan-01      JF      Fix DMA on ifdown/ifup sequences. Some 
- *                             cleanup.
- *     13-Jan-02       JF      Add spinlock to fix race condition.
- *     09-Nov-02       JF      Fixed printks to not SPAM the console during
- *                             normal operation.
- *     30-Dec-02       JF      Removed incorrect __init from 
- *                             tms380tr_init_card.
- *     22-Jul-05       JF      Converted to dma-mapping.
- *                             
- *  To do:
- *    1. Multi/Broadcast packet handling (this may have fixed itself)
- *    2. Write a sktrisa module that includes the old ISA support (done)
- *    3. Allow modules to load their own microcode
- *    4. Speed up the BUD process -- freezing the kernel for 3+sec is
- *         quite unacceptable.
- *    5. Still a few remaining stalls when the cable is unplugged.
- */
-
-#ifdef MODULE
-static const char version[] = "tms380tr.c: v1.10 30/12/2002 by Christoph Goos, Adam Fritzler\n";
-#endif
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/time.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/dma-mapping.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/trdevice.h>
-#include <linux/firmware.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-
-#include "tms380tr.h"          /* Our Stuff */
-
-/* Use 0 for production, 1 for verification, 2 for debug, and
- * 3 for very verbose debug.
- */
-#ifndef TMS380TR_DEBUG
-#define TMS380TR_DEBUG 0
-#endif
-static unsigned int tms380tr_debug = TMS380TR_DEBUG;
-
-/* Index to functions, as function prototypes.
- * Alphabetical by function name.
- */
-
-/* "A" */
-/* "B" */
-static int      tms380tr_bringup_diags(struct net_device *dev);
-/* "C" */
-static void    tms380tr_cancel_tx_queue(struct net_local* tp);
-static int     tms380tr_chipset_init(struct net_device *dev);
-static void    tms380tr_chk_irq(struct net_device *dev);
-static void    tms380tr_chk_outstanding_cmds(struct net_device *dev);
-static void    tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
-static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType);
-int            tms380tr_close(struct net_device *dev);
-static void    tms380tr_cmd_status_irq(struct net_device *dev);
-/* "D" */
-static void    tms380tr_disable_interrupts(struct net_device *dev);
-#if TMS380TR_DEBUG > 0
-static void    tms380tr_dump(unsigned char *Data, int length);
-#endif
-/* "E" */
-static void    tms380tr_enable_interrupts(struct net_device *dev);
-static void    tms380tr_exec_cmd(struct net_device *dev, unsigned short Command);
-static void    tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue);
-/* "F" */
-/* "G" */
-static struct net_device_stats *tms380tr_get_stats(struct net_device *dev);
-/* "H" */
-static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb,
-                                                      struct net_device *dev);
-/* "I" */
-static int     tms380tr_init_adapter(struct net_device *dev);
-static void    tms380tr_init_ipb(struct net_local *tp);
-static void    tms380tr_init_net_local(struct net_device *dev);
-static void    tms380tr_init_opb(struct net_device *dev);
-/* "M" */
-/* "O" */
-int            tms380tr_open(struct net_device *dev);
-static void    tms380tr_open_adapter(struct net_device *dev);
-/* "P" */
-/* "R" */
-static void    tms380tr_rcv_status_irq(struct net_device *dev);
-static int     tms380tr_read_ptr(struct net_device *dev);
-static void    tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
-                       unsigned short Address, int Length);
-static int     tms380tr_reset_adapter(struct net_device *dev);
-static void    tms380tr_reset_interrupt(struct net_device *dev);
-static void    tms380tr_ring_status_irq(struct net_device *dev);
-/* "S" */
-static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb,
-                                             struct net_device *dev);
-static void    tms380tr_set_multicast_list(struct net_device *dev);
-static int     tms380tr_set_mac_address(struct net_device *dev, void *addr);
-/* "T" */
-static void    tms380tr_timer_chk(unsigned long data);
-static void    tms380tr_timer_end_wait(unsigned long data);
-static void    tms380tr_tx_status_irq(struct net_device *dev);
-/* "U" */
-static void    tms380tr_update_rcv_stats(struct net_local *tp,
-                       unsigned char DataPtr[], unsigned int Length);
-/* "W" */
-void           tms380tr_wait(unsigned long time);
-static void    tms380tr_write_rpl_status(RPL *rpl, unsigned int Status);
-static void    tms380tr_write_tpl_status(TPL *tpl, unsigned int Status);
-
-#define SIFREADB(reg) \
-       (((struct net_local *)netdev_priv(dev))->sifreadb(dev, reg))
-#define SIFWRITEB(val, reg) \
-       (((struct net_local *)netdev_priv(dev))->sifwriteb(dev, val, reg))
-#define SIFREADW(reg) \
-       (((struct net_local *)netdev_priv(dev))->sifreadw(dev, reg))
-#define SIFWRITEW(val, reg) \
-       (((struct net_local *)netdev_priv(dev))->sifwritew(dev, val, reg))
-
-
-
-#if 0 /* TMS380TR_DEBUG > 0 */
-static int madgemc_sifprobe(struct net_device *dev)
-{
-        unsigned char old, chk1, chk2;
-       
-       old = SIFREADB(SIFADR);  /* Get the old SIFADR value */
-
-        chk1 = 0;       /* Begin with check value 0 */
-        do {
-               madgemc_setregpage(dev, 0);
-                /* Write new SIFADR value */
-               SIFWRITEB(chk1, SIFADR);
-               chk2 = SIFREADB(SIFADR);
-               if (chk2 != chk1)
-                       return -1;
-               
-               madgemc_setregpage(dev, 1);
-                /* Read, invert and write */
-               chk2 = SIFREADB(SIFADD);
-               if (chk2 != chk1)
-                       return -1;
-
-               madgemc_setregpage(dev, 0);
-                chk2 ^= 0x0FE;
-               SIFWRITEB(chk2, SIFADR);
-
-                /* Read, invert and compare */
-               madgemc_setregpage(dev, 1);
-               chk2 = SIFREADB(SIFADD);
-               madgemc_setregpage(dev, 0);
-                chk2 ^= 0x0FE;
-
-                if(chk1 != chk2)
-                        return -1;    /* No adapter */
-                chk1 -= 2;
-        } while(chk1 != 0);     /* Repeat 128 times (all byte values) */
-
-       madgemc_setregpage(dev, 0); /* sanity */
-        /* Restore the SIFADR value */
-       SIFWRITEB(old, SIFADR);
-
-        return 0;
-}
-#endif
-
-/*
- * Open/initialize the board. This is called sometime after
- * booting when the 'ifconfig' program is run.
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is non-reboot way to recover if something goes wrong.
- */
-int tms380tr_open(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       int err;
-       
-       /* init the spinlock */
-       spin_lock_init(&tp->lock);
-       init_timer(&tp->timer);
-
-       /* Reset the hardware here. Don't forget to set the station address. */
-
-#if defined(CONFIG_ISA) && defined(CONFIG_ISA_DMA_API)
-       if(dev->dma > 0) 
-       {
-               unsigned long flags=claim_dma_lock();
-               disable_dma(dev->dma);
-               set_dma_mode(dev->dma, DMA_MODE_CASCADE);
-               enable_dma(dev->dma);
-               release_dma_lock(flags);
-       }
-#endif
-       
-       err = tms380tr_chipset_init(dev);
-       if(err)
-       {
-               printk(KERN_INFO "%s: Chipset initialization error\n", 
-                       dev->name);
-               return -1;
-       }
-
-       tp->timer.expires       = jiffies + 30*HZ;
-       tp->timer.function      = tms380tr_timer_end_wait;
-       tp->timer.data          = (unsigned long)dev;
-       add_timer(&tp->timer);
-
-       printk(KERN_DEBUG "%s: Adapter RAM size: %dK\n", 
-              dev->name, tms380tr_read_ptr(dev));
-
-       tms380tr_enable_interrupts(dev);
-       tms380tr_open_adapter(dev);
-
-       netif_start_queue(dev);
-       
-       /* Wait for interrupt from hardware. If interrupt does not come,
-        * there will be a timeout from the timer.
-        */
-       tp->Sleeping = 1;
-       interruptible_sleep_on(&tp->wait_for_tok_int);
-       del_timer(&tp->timer);
-
-       /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
-       if(tp->AdapterVirtOpenFlag == 0)
-       {
-               tms380tr_disable_interrupts(dev);
-               return -1;
-       }
-
-       tp->StartTime = jiffies;
-
-       /* Start function control timer */
-       tp->timer.expires       = jiffies + 2*HZ;
-       tp->timer.function      = tms380tr_timer_chk;
-       tp->timer.data          = (unsigned long)dev;
-       add_timer(&tp->timer);
-
-       return 0;
-}
-
-/*
- * Timeout function while waiting for event
- */
-static void tms380tr_timer_end_wait(unsigned long data)
-{
-       struct net_device *dev = (struct net_device*)data;
-       struct net_local *tp = netdev_priv(dev);
-
-       if(tp->Sleeping)
-       {
-               tp->Sleeping = 0;
-               wake_up_interruptible(&tp->wait_for_tok_int);
-       }
-}
-
-/*
- * Initialize the chipset
- */
-static int tms380tr_chipset_init(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       int err;
-
-       tms380tr_init_ipb(tp);
-       tms380tr_init_opb(dev);
-       tms380tr_init_net_local(dev);
-
-       if(tms380tr_debug > 3)
-               printk(KERN_DEBUG "%s: Resetting adapter...\n", dev->name);
-       err = tms380tr_reset_adapter(dev);
-       if(err < 0)
-               return -1;
-
-       if(tms380tr_debug > 3)
-               printk(KERN_DEBUG "%s: Bringup diags...\n", dev->name);
-       err = tms380tr_bringup_diags(dev);
-       if(err < 0)
-               return -1;
-
-       if(tms380tr_debug > 3)
-               printk(KERN_DEBUG "%s: Init adapter...\n", dev->name);
-       err = tms380tr_init_adapter(dev);
-       if(err < 0)
-               return -1;
-
-       if(tms380tr_debug > 3)
-               printk(KERN_DEBUG "%s: Done!\n", dev->name);
-       return 0;
-}
-
-/*
- * Initializes the net_local structure.
- */
-static void tms380tr_init_net_local(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       int i;
-       dma_addr_t dmabuf;
-
-       tp->scb.CMD     = 0;
-       tp->scb.Parm[0] = 0;
-       tp->scb.Parm[1] = 0;
-
-       tp->ssb.STS     = 0;
-       tp->ssb.Parm[0] = 0;
-       tp->ssb.Parm[1] = 0;
-       tp->ssb.Parm[2] = 0;
-
-       tp->CMDqueue    = 0;
-
-       tp->AdapterOpenFlag     = 0;
-       tp->AdapterVirtOpenFlag = 0;
-       tp->ScbInUse            = 0;
-       tp->OpenCommandIssued   = 0;
-       tp->ReOpenInProgress    = 0;
-       tp->HaltInProgress      = 0;
-       tp->TransmitHaltScheduled = 0;
-       tp->LobeWireFaultLogged = 0;
-       tp->LastOpenStatus      = 0;
-       tp->MaxPacketSize       = DEFAULT_PACKET_SIZE;
-
-       /* Create circular chain of transmit lists */
-       for (i = 0; i < TPL_NUM; i++)
-       {
-               tp->Tpl[i].NextTPLAddr = htonl(((char *)(&tp->Tpl[(i+1) % TPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */
-               tp->Tpl[i].Status       = 0;
-               tp->Tpl[i].FrameSize    = 0;
-               tp->Tpl[i].FragList[0].DataCount        = 0;
-               tp->Tpl[i].FragList[0].DataAddr         = 0;
-               tp->Tpl[i].NextTPLPtr   = &tp->Tpl[(i+1) % TPL_NUM];
-               tp->Tpl[i].MData        = NULL;
-               tp->Tpl[i].TPLIndex     = i;
-               tp->Tpl[i].DMABuff      = 0;
-               tp->Tpl[i].BusyFlag     = 0;
-       }
-
-       tp->TplFree = tp->TplBusy = &tp->Tpl[0];
-
-       /* Create circular chain of receive lists */
-       for (i = 0; i < RPL_NUM; i++)
-       {
-               tp->Rpl[i].NextRPLAddr = htonl(((char *)(&tp->Rpl[(i+1) % RPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */
-               tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
-               tp->Rpl[i].FrameSize = 0;
-               tp->Rpl[i].FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize);
-
-               /* Alloc skb and point adapter to data area */
-               tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
-                       tp->Rpl[i].DMABuff = 0;
-
-               /* skb == NULL ? then use local buffer */
-               if(tp->Rpl[i].Skb == NULL)
-               {
-                       tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
-                       tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer);
-                       tp->Rpl[i].MData = tp->LocalRxBuffers[i];
-               }
-               else    /* SKB != NULL */
-               {
-                       tp->Rpl[i].Skb->dev = dev;
-                       skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
-
-                       /* data unreachable for DMA ? then use local buffer */
-                       dmabuf = dma_map_single(tp->pdev, tp->Rpl[i].Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE);
-                       if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
-                       {
-                               tp->Rpl[i].SkbStat = SKB_DATA_COPY;
-                               tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer);
-                               tp->Rpl[i].MData = tp->LocalRxBuffers[i];
-                       }
-                       else    /* DMA directly in skb->data */
-                       {
-                               tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
-                               tp->Rpl[i].FragList[0].DataAddr = htonl(dmabuf);
-                               tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
-                               tp->Rpl[i].DMABuff = dmabuf;
-                       }
-               }
-
-               tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
-               tp->Rpl[i].RPLIndex = i;
-       }
-
-       tp->RplHead = &tp->Rpl[0];
-       tp->RplTail = &tp->Rpl[RPL_NUM-1];
-       tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
-}
-
-/*
- * Initializes the initialisation parameter block.
- */
-static void tms380tr_init_ipb(struct net_local *tp)
-{
-       tp->ipb.Init_Options    = BURST_MODE;
-       tp->ipb.CMD_Status_IV   = 0;
-       tp->ipb.TX_IV           = 0;
-       tp->ipb.RX_IV           = 0;
-       tp->ipb.Ring_Status_IV  = 0;
-       tp->ipb.SCB_Clear_IV    = 0;
-       tp->ipb.Adapter_CHK_IV  = 0;
-       tp->ipb.RX_Burst_Size   = BURST_SIZE;
-       tp->ipb.TX_Burst_Size   = BURST_SIZE;
-       tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
-       tp->ipb.SCB_Addr        = 0;
-       tp->ipb.SSB_Addr        = 0;
-}
-
-/*
- * Initializes the open parameter block.
- */
-static void tms380tr_init_opb(struct net_device *dev)
-{
-       struct net_local *tp;
-       unsigned long Addr;
-       unsigned short RplSize    = RPL_SIZE;
-       unsigned short TplSize    = TPL_SIZE;
-       unsigned short BufferSize = BUFFER_SIZE;
-       int i;
-
-       tp = netdev_priv(dev);
-
-       tp->ocpl.OPENOptions     = 0;
-       tp->ocpl.OPENOptions    |= ENABLE_FULL_DUPLEX_SELECTION;
-       tp->ocpl.FullDuplex      = 0;
-       tp->ocpl.FullDuplex     |= OPEN_FULL_DUPLEX_OFF;
-
-        /* 
-        * Set node address 
-        *
-        * We go ahead and put it in the OPB even though on
-        * most of the generic adapters this isn't required.
-        * Its simpler this way.  -- ASF
-        */
-        for (i=0;i<6;i++)
-                tp->ocpl.NodeAddr[i] = ((unsigned char *)dev->dev_addr)[i];
-
-       tp->ocpl.GroupAddr       = 0;
-       tp->ocpl.FunctAddr       = 0;
-       tp->ocpl.RxListSize      = cpu_to_be16((unsigned short)RplSize);
-       tp->ocpl.TxListSize      = cpu_to_be16((unsigned short)TplSize);
-       tp->ocpl.BufSize         = cpu_to_be16((unsigned short)BufferSize);
-       tp->ocpl.Reserved        = 0;
-       tp->ocpl.TXBufMin        = TX_BUF_MIN;
-       tp->ocpl.TXBufMax        = TX_BUF_MAX;
-
-       Addr = htonl(((char *)tp->ProductID - (char *)tp) + tp->dmabuffer);
-
-       tp->ocpl.ProdIDAddr[0]   = LOWORD(Addr);
-       tp->ocpl.ProdIDAddr[1]   = HIWORD(Addr);
-}
-
-/*
- * Send OPEN command to adapter
- */
-static void tms380tr_open_adapter(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-
-       if(tp->OpenCommandIssued)
-               return;
-
-       tp->OpenCommandIssued = 1;
-       tms380tr_exec_cmd(dev, OC_OPEN);
-}
-
-/*
- * Clear the adapter's interrupt flag. Clear system interrupt enable
- * (SINTEN): disable adapter to system interrupts.
- */
-static void tms380tr_disable_interrupts(struct net_device *dev)
-{
-       SIFWRITEB(0, SIFACL);
-}
-
-/*
- * Set the adapter's interrupt flag. Set system interrupt enable
- * (SINTEN): enable adapter to system interrupts.
- */
-static void tms380tr_enable_interrupts(struct net_device *dev)
-{
-       SIFWRITEB(ACL_SINTEN, SIFACL);
-}
-
-/*
- * Put command in command queue, try to execute it.
- */
-static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command)
-{
-       struct net_local *tp = netdev_priv(dev);
-
-       tp->CMDqueue |= Command;
-       tms380tr_chk_outstanding_cmds(dev);
-}
-
-static void tms380tr_timeout(struct net_device *dev)
-{
-       /*
-        * If we get here, some higher level has decided we are broken.
-        * There should really be a "kick me" function call instead.
-        *
-        * Resetting the token ring adapter takes a long time so just
-        * fake transmission time and go on trying. Our own timeout
-        * routine is in tms380tr_timer_chk()
-        */
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       netif_wake_queue(dev);
-}
-
-/*
- * Gets skb from system, queues it and checks if it can be sent
- */
-static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb,
-                                             struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       netdev_tx_t rc;
-
-       rc = tms380tr_hardware_send_packet(skb, dev);
-       if(tp->TplFree->NextTPLPtr->BusyFlag)
-               netif_stop_queue(dev);
-       return rc;
-}
-
-/*
- * Move frames into adapter tx queue
- */
-static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb,
-                                                      struct net_device *dev)
-{
-       TPL *tpl;
-       short length;
-       unsigned char *buf;
-       unsigned long flags;
-       int i;
-       dma_addr_t dmabuf, newbuf;
-       struct net_local *tp = netdev_priv(dev);
-   
-       /* Try to get a free TPL from the chain.
-        *
-        * NOTE: We *must* always leave one unused TPL in the chain,
-        * because otherwise the adapter might send frames twice.
-        */
-       spin_lock_irqsave(&tp->lock, flags);
-       if(tp->TplFree->NextTPLPtr->BusyFlag)  { /* No free TPL */
-               if (tms380tr_debug > 0)
-                       printk(KERN_DEBUG "%s: No free TPL\n", dev->name);
-               spin_unlock_irqrestore(&tp->lock, flags);
-               return NETDEV_TX_BUSY;
-       }
-
-       dmabuf = 0;
-
-       /* Is buffer reachable for Busmaster-DMA? */
-
-       length  = skb->len;
-       dmabuf = dma_map_single(tp->pdev, skb->data, length, DMA_TO_DEVICE);
-       if(tp->dmalimit && (dmabuf + length > tp->dmalimit)) {
-               /* Copy frame to local buffer */
-               dma_unmap_single(tp->pdev, dmabuf, length, DMA_TO_DEVICE);
-               dmabuf  = 0;
-               i       = tp->TplFree->TPLIndex;
-               buf     = tp->LocalTxBuffers[i];
-               skb_copy_from_linear_data(skb, buf, length);
-               newbuf  = ((char *)buf - (char *)tp) + tp->dmabuffer;
-       }
-       else {
-               /* Send direct from skb->data */
-               newbuf  = dmabuf;
-               buf     = skb->data;
-       }
-       /* Source address in packet? */
-       tms380tr_chk_src_addr(buf, dev->dev_addr);
-       tp->LastSendTime        = jiffies;
-       tpl                     = tp->TplFree;  /* Get the "free" TPL */
-       tpl->BusyFlag           = 1;            /* Mark TPL as busy */
-       tp->TplFree             = tpl->NextTPLPtr;
-    
-       /* Save the skb for delayed return of skb to system */
-       tpl->Skb = skb;
-       tpl->DMABuff = dmabuf;
-       tpl->FragList[0].DataCount = cpu_to_be16((unsigned short)length);
-       tpl->FragList[0].DataAddr  = htonl(newbuf);
-
-       /* Write the data length in the transmit list. */
-       tpl->FrameSize  = cpu_to_be16((unsigned short)length);
-       tpl->MData      = buf;
-
-       /* Transmit the frame and set the status values. */
-       tms380tr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
-                               | TX_END_FRAME | TX_PASS_SRC_ADDR
-                               | TX_FRAME_IRQ);
-
-       /* Let adapter send the frame. */
-       tms380tr_exec_sifcmd(dev, CMD_TX_VALID);
-       spin_unlock_irqrestore(&tp->lock, flags);
-
-       return NETDEV_TX_OK;
-}
-
-/*
- * Write the given value to the 'Status' field of the specified TPL.
- * NOTE: This function should be used whenever the status of any TPL must be
- * modified by the driver, because the compiler may otherwise change the
- * order of instructions such that writing the TPL status may be executed at
- * an undesirable time. When this function is used, the status is always
- * written when the function is called.
- */
-static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status)
-{
-       tpl->Status = Status;
-}
-
-static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
-{
-       unsigned char SRBit;
-
-       if((((unsigned long)frame[8]) & ~0x80) != 0)    /* Compare 4 bytes */
-               return;
-       if((unsigned short)frame[12] != 0)              /* Compare 2 bytes */
-               return;
-
-       SRBit = frame[8] & 0x80;
-       memcpy(&frame[8], hw_addr, 6);
-       frame[8] |= SRBit;
-}
-
-/*
- * The timer routine: Check if adapter still open and working, reopen if not. 
- */
-static void tms380tr_timer_chk(unsigned long data)
-{
-       struct net_device *dev = (struct net_device*)data;
-       struct net_local *tp = netdev_priv(dev);
-
-       if(tp->HaltInProgress)
-               return;
-
-       tms380tr_chk_outstanding_cmds(dev);
-       if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies) &&
-          (tp->TplFree != tp->TplBusy))
-       {
-               /* Anything to send, but stalled too long */
-               tp->LastSendTime = jiffies;
-               tms380tr_exec_cmd(dev, OC_CLOSE);       /* Does reopen automatically */
-       }
-
-       tp->timer.expires = jiffies + 2*HZ;
-       add_timer(&tp->timer);
-
-       if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
-               return;
-       tp->ReOpenInProgress = 1;
-       tms380tr_open_adapter(dev);
-}
-
-/*
- * The typical workload of the driver: Handle the network interface interrupts.
- */
-irqreturn_t tms380tr_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *tp;
-       unsigned short irq_type;
-       int handled = 0;
-
-       tp = netdev_priv(dev);
-
-       irq_type = SIFREADW(SIFSTS);
-
-       while(irq_type & STS_SYSTEM_IRQ) {
-               handled = 1;
-               irq_type &= STS_IRQ_MASK;
-
-               if(!tms380tr_chk_ssb(tp, irq_type)) {
-                       printk(KERN_DEBUG "%s: DATA LATE occurred\n", dev->name);
-                       break;
-               }
-
-               switch(irq_type) {
-               case STS_IRQ_RECEIVE_STATUS:
-                       tms380tr_reset_interrupt(dev);
-                       tms380tr_rcv_status_irq(dev);
-                       break;
-
-               case STS_IRQ_TRANSMIT_STATUS:
-                       /* Check if TRANSMIT.HALT command is complete */
-                       if(tp->ssb.Parm[0] & COMMAND_COMPLETE) {
-                               tp->TransmitCommandActive = 0;
-                                       tp->TransmitHaltScheduled = 0;
-
-                                       /* Issue a new transmit command. */
-                                       tms380tr_exec_cmd(dev, OC_TRANSMIT);
-                               }
-
-                               tms380tr_reset_interrupt(dev);
-                               tms380tr_tx_status_irq(dev);
-                               break;
-
-               case STS_IRQ_COMMAND_STATUS:
-                       /* The SSB contains status of last command
-                        * other than receive/transmit.
-                        */
-                       tms380tr_cmd_status_irq(dev);
-                       break;
-                       
-               case STS_IRQ_SCB_CLEAR:
-                       /* The SCB is free for another command. */
-                       tp->ScbInUse = 0;
-                       tms380tr_chk_outstanding_cmds(dev);
-                       break;
-                       
-               case STS_IRQ_RING_STATUS:
-                       tms380tr_ring_status_irq(dev);
-                       break;
-
-               case STS_IRQ_ADAPTER_CHECK:
-                       tms380tr_chk_irq(dev);
-                       break;
-
-               case STS_IRQ_LLC_STATUS:
-                       printk(KERN_DEBUG "tms380tr: unexpected LLC status IRQ\n");
-                       break;
-                       
-               case STS_IRQ_TIMER:
-                       printk(KERN_DEBUG "tms380tr: unexpected Timer IRQ\n");
-                       break;
-                       
-               case STS_IRQ_RECEIVE_PENDING:
-                       printk(KERN_DEBUG "tms380tr: unexpected Receive Pending IRQ\n");
-                       break;
-                       
-               default:
-                       printk(KERN_DEBUG "Unknown Token Ring IRQ (0x%04x)\n", irq_type);
-                       break;
-               }
-
-               /* Reset system interrupt if not already done. */
-               if(irq_type != STS_IRQ_TRANSMIT_STATUS &&
-                  irq_type != STS_IRQ_RECEIVE_STATUS) {
-                       tms380tr_reset_interrupt(dev);
-               }
-
-               irq_type = SIFREADW(SIFSTS);
-       }
-
-       return IRQ_RETVAL(handled);
-}
-
-/*
- *  Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
- */
-static void tms380tr_reset_interrupt(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       SSB *ssb = &tp->ssb;
-
-       /*
-        * [Workaround for "Data Late"]
-        * Set all fields of the SSB to well-defined values so we can
-        * check if the adapter has written the SSB.
-        */
-
-       ssb->STS        = (unsigned short) -1;
-       ssb->Parm[0]    = (unsigned short) -1;
-       ssb->Parm[1]    = (unsigned short) -1;
-       ssb->Parm[2]    = (unsigned short) -1;
-
-       /* Free SSB by issuing SSB_CLEAR command after reading IRQ code
-        * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
-        */
-       tms380tr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
-}
-
-/*
- * Check if the SSB has actually been written by the adapter.
- */
-static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType)
-{
-       SSB *ssb = &tp->ssb;    /* The address of the SSB. */
-
-       /* C 0 1 2 INTERRUPT CODE
-        * - - - - --------------
-        * 1 1 1 1 TRANSMIT STATUS
-        * 1 1 1 1 RECEIVE STATUS
-        * 1 ? ? 0 COMMAND STATUS
-        * 0 0 0 0 SCB CLEAR
-        * 1 1 0 0 RING STATUS
-        * 0 0 0 0 ADAPTER CHECK
-        *
-        * 0 = SSB field not affected by interrupt
-        * 1 = SSB field is affected by interrupt
-        *
-        * C = SSB ADDRESS +0: COMMAND
-        * 0 = SSB ADDRESS +2: STATUS 0
-        * 1 = SSB ADDRESS +4: STATUS 1
-        * 2 = SSB ADDRESS +6: STATUS 2
-        */
-
-       /* Check if this interrupt does use the SSB. */
-
-       if(IrqType != STS_IRQ_TRANSMIT_STATUS &&
-          IrqType != STS_IRQ_RECEIVE_STATUS &&
-          IrqType != STS_IRQ_COMMAND_STATUS &&
-          IrqType != STS_IRQ_RING_STATUS)
-       {
-               return 1;       /* SSB not involved. */
-       }
-
-       /* Note: All fields of the SSB have been set to all ones (-1) after it
-        * has last been used by the software (see DriverIsr()).
-        *
-        * Check if the affected SSB fields are still unchanged.
-        */
-
-       if(ssb->STS == (unsigned short) -1)
-               return 0;       /* Command field not yet available. */
-       if(IrqType == STS_IRQ_COMMAND_STATUS)
-               return 1;       /* Status fields not always affected. */
-       if(ssb->Parm[0] == (unsigned short) -1)
-               return 0;       /* Status 1 field not yet available. */
-       if(IrqType == STS_IRQ_RING_STATUS)
-               return 1;       /* Status 2 & 3 fields not affected. */
-
-       /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
-       if(ssb->Parm[1] == (unsigned short) -1)
-               return 0;       /* Status 2 field not yet available. */
-       if(ssb->Parm[2] == (unsigned short) -1)
-               return 0;       /* Status 3 field not yet available. */
-
-       return 1;       /* All SSB fields have been written by the adapter. */
-}
-
-/*
- * Evaluates the command results status in the SSB status field.
- */
-static void tms380tr_cmd_status_irq(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned short ssb_cmd, ssb_parm_0;
-       unsigned short ssb_parm_1;
-       char *open_err = "Open error -";
-       char *code_err = "Open code -";
-
-       /* Copy the ssb values to local variables */
-       ssb_cmd    = tp->ssb.STS;
-       ssb_parm_0 = tp->ssb.Parm[0];
-       ssb_parm_1 = tp->ssb.Parm[1];
-
-       if(ssb_cmd == OPEN)
-       {
-               tp->Sleeping = 0;
-               if(!tp->ReOpenInProgress)
-                       wake_up_interruptible(&tp->wait_for_tok_int);
-
-               tp->OpenCommandIssued = 0;
-               tp->ScbInUse = 0;
-
-               if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
-               {
-                       /* Success, the adapter is open. */
-                       tp->LobeWireFaultLogged = 0;
-                       tp->AdapterOpenFlag     = 1;
-                       tp->AdapterVirtOpenFlag = 1;
-                       tp->TransmitCommandActive = 0;
-                       tms380tr_exec_cmd(dev, OC_TRANSMIT);
-                       tms380tr_exec_cmd(dev, OC_RECEIVE);
-
-                       if(tp->ReOpenInProgress)
-                               tp->ReOpenInProgress = 0;
-
-                       return;
-               }
-               else    /* The adapter did not open. */
-               {
-                       if(ssb_parm_0 & NODE_ADDR_ERROR)
-                               printk(KERN_INFO "%s: Node address error\n",
-                                       dev->name);
-                       if(ssb_parm_0 & LIST_SIZE_ERROR)
-                               printk(KERN_INFO "%s: List size error\n",
-                                       dev->name);
-                       if(ssb_parm_0 & BUF_SIZE_ERROR)
-                               printk(KERN_INFO "%s: Buffer size error\n",
-                                       dev->name);
-                       if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
-                               printk(KERN_INFO "%s: Tx buffer count error\n",
-                                       dev->name);
-                       if(ssb_parm_0 & INVALID_OPEN_OPTION)
-                               printk(KERN_INFO "%s: Invalid open option\n",
-                                       dev->name);
-                       if(ssb_parm_0 & OPEN_ERROR)
-                       {
-                               /* Show the open phase. */
-                               switch(ssb_parm_0 & OPEN_PHASES_MASK)
-                               {
-                                       case LOBE_MEDIA_TEST:
-                                               if(!tp->LobeWireFaultLogged)
-                                               {
-                                                       tp->LobeWireFaultLogged = 1;
-                                                       printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err);
-                                               }
-                                               tp->ReOpenInProgress    = 1;
-                                               tp->AdapterOpenFlag     = 0;
-                                               tp->AdapterVirtOpenFlag = 1;
-                                               tms380tr_open_adapter(dev);
-                                               return;
-
-                                       case PHYSICAL_INSERTION:
-                                               printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err);
-                                               break;
-
-                                       case ADDRESS_VERIFICATION:
-                                               printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err);
-                                               break;
-
-                                       case PARTICIPATION_IN_RING_POLL:
-                                               printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err);
-                                               break;
-
-                                       case REQUEST_INITIALISATION:
-                                               printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err);
-                                               break;
-
-                                       case FULLDUPLEX_CHECK:
-                                               printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err);
-                                               break;
-
-                                       default:
-                                               printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err);
-                                               break;
-                               }
-
-                               /* Show the open errors. */
-                               switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
-                               {
-                                       case OPEN_FUNCTION_FAILURE:
-                                               printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_FUNCTION_FAILURE;
-                                               break;
-
-                                       case OPEN_SIGNAL_LOSS:
-                                               printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_SIGNAL_LOSS;
-                                               break;
-
-                                       case OPEN_TIMEOUT:
-                                               printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_TIMEOUT;
-                                               break;
-
-                                       case OPEN_RING_FAILURE:
-                                               printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_RING_FAILURE;
-                                               break;
-
-                                       case OPEN_RING_BEACONING:
-                                               printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_RING_BEACONING;
-                                               break;
-
-                                       case OPEN_DUPLICATE_NODEADDR:
-                                               printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_DUPLICATE_NODEADDR;
-                                               break;
-
-                                       case OPEN_REQUEST_INIT:
-                                               printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_REQUEST_INIT;
-                                               break;
-
-                                       case OPEN_REMOVE_RECEIVED:
-                                               printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_REMOVE_RECEIVED;
-                                               break;
-
-                                       case OPEN_FULLDUPLEX_SET:
-                                               printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_FULLDUPLEX_SET;
-                                               break;
-
-                                       default:
-                                               printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
-                                               tp->LastOpenStatus =
-                                                       OPEN_FUNCTION_FAILURE;
-                                               break;
-                               }
-                       }
-
-                       tp->AdapterOpenFlag     = 0;
-                       tp->AdapterVirtOpenFlag = 0;
-
-                       return;
-               }
-       }
-       else
-       {
-               if(ssb_cmd != READ_ERROR_LOG)
-                       return;
-
-               /* Add values from the error log table to the MAC
-                * statistics counters and update the errorlogtable
-                * memory.
-                */
-               tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
-               tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
-               tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
-               tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
-               tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
-               tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
-               tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
-               tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
-               tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
-               tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
-               tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
-               tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
-               tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
-       }
-}
-
-/*
- * The inverse routine to tms380tr_open().
- */
-int tms380tr_close(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       netif_stop_queue(dev);
-       
-       del_timer(&tp->timer);
-
-       /* Flush the Tx and disable Rx here. */
-
-       tp->HaltInProgress      = 1;
-       tms380tr_exec_cmd(dev, OC_CLOSE);
-       tp->timer.expires       = jiffies + 1*HZ;
-       tp->timer.function      = tms380tr_timer_end_wait;
-       tp->timer.data          = (unsigned long)dev;
-       add_timer(&tp->timer);
-
-       tms380tr_enable_interrupts(dev);
-
-       tp->Sleeping = 1;
-       interruptible_sleep_on(&tp->wait_for_tok_int);
-       tp->TransmitCommandActive = 0;
-    
-       del_timer(&tp->timer);
-       tms380tr_disable_interrupts(dev);
-
-#if defined(CONFIG_ISA) && defined(CONFIG_ISA_DMA_API)
-       if(dev->dma > 0) 
-       {
-               unsigned long flags=claim_dma_lock();
-               disable_dma(dev->dma);
-               release_dma_lock(flags);
-       }
-#endif
-       
-       SIFWRITEW(0xFF00, SIFCMD);
-#if 0
-       if(dev->dma > 0) /* what the? */
-               SIFWRITEB(0xff, POSREG);
-#endif
-       tms380tr_cancel_tx_queue(tp);
-
-       return 0;
-}
-
-/*
- * Get the current statistics. This may be called with the card open
- * or closed.
- */
-static struct net_device_stats *tms380tr_get_stats(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-
-       return (struct net_device_stats *)&tp->MacStat;
-}
-
-/*
- * Set or clear the multicast filter for this adapter.
- */
-static void tms380tr_set_multicast_list(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned int OpenOptions;
-       
-       OpenOptions = tp->ocpl.OPENOptions &
-               ~(PASS_ADAPTER_MAC_FRAMES
-                 | PASS_ATTENTION_FRAMES
-                 | PASS_BEACON_MAC_FRAMES
-                 | COPY_ALL_MAC_FRAMES
-                 | COPY_ALL_NON_MAC_FRAMES);
-       
-       tp->ocpl.FunctAddr = 0;
-       
-       if(dev->flags & IFF_PROMISC)
-               /* Enable promiscuous mode */
-               OpenOptions |= COPY_ALL_NON_MAC_FRAMES |
-                       COPY_ALL_MAC_FRAMES;
-       else
-       {
-               if(dev->flags & IFF_ALLMULTI)
-               {
-                       /* Disable promiscuous mode, use normal mode. */
-                       tp->ocpl.FunctAddr = 0xFFFFFFFF;
-               }
-               else
-               {
-                       struct netdev_hw_addr *ha;
-
-                       netdev_for_each_mc_addr(ha, dev) {
-                               ((char *)(&tp->ocpl.FunctAddr))[0] |=
-                                       ha->addr[2];
-                               ((char *)(&tp->ocpl.FunctAddr))[1] |=
-                                       ha->addr[3];
-                               ((char *)(&tp->ocpl.FunctAddr))[2] |=
-                                       ha->addr[4];
-                               ((char *)(&tp->ocpl.FunctAddr))[3] |=
-                                       ha->addr[5];
-                       }
-               }
-               tms380tr_exec_cmd(dev, OC_SET_FUNCT_ADDR);
-       }
-       
-       tp->ocpl.OPENOptions = OpenOptions;
-       tms380tr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
-}
-
-/*
- * Wait for some time (microseconds)
- */
-void tms380tr_wait(unsigned long time)
-{
-#if 0
-       long tmp;
-       
-       tmp = jiffies + time/(1000000/HZ);
-       do {
-               tmp = schedule_timeout_interruptible(tmp);
-       } while(time_after(tmp, jiffies));
-#else
-       mdelay(time / 1000);
-#endif
-}
-
-/*
- * Write a command value to the SIFCMD register
- */
-static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue)
-{
-       unsigned short cmd;
-       unsigned short SifStsValue;
-       unsigned long loop_counter;
-
-       WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
-       cmd = (unsigned short)WriteValue;
-       loop_counter = 0,5 * 800000;
-       do {
-               SifStsValue = SIFREADW(SIFSTS);
-       } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
-       SIFWRITEW(cmd, SIFCMD);
-}
-
-/*
- * Processes adapter hardware reset, halts adapter and downloads firmware,
- * clears the halt bit.
- */
-static int tms380tr_reset_adapter(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned short *fw_ptr;
-       unsigned short count, c, count2;
-       const struct firmware *fw_entry = NULL;
-
-       if (request_firmware(&fw_entry, "tms380tr.bin", tp->pdev) != 0) {
-               printk(KERN_ALERT "%s: firmware %s is missing, cannot start.\n",
-                       dev->name, "tms380tr.bin");
-               return -1;
-       }
-
-       fw_ptr = (unsigned short *)fw_entry->data;
-       count2 = fw_entry->size / 2;
-
-       /* Hardware adapter reset */
-       SIFWRITEW(ACL_ARESET, SIFACL);
-       tms380tr_wait(40);
-       
-       c = SIFREADW(SIFACL);
-       tms380tr_wait(20);
-
-       if(dev->dma == 0)       /* For PCI adapters */
-       {
-               c &= ~(ACL_NSELOUT0 | ACL_NSELOUT1);    /* Clear bits */
-               if(tp->setnselout)
-                 c |= (*tp->setnselout)(dev);
-       }
-
-       /* In case a command is pending - forget it */
-       tp->ScbInUse = 0;
-
-       c &= ~ACL_ARESET;               /* Clear adapter reset bit */
-       c |=  ACL_CPHALT;               /* Halt adapter CPU, allow download */
-       c |= ACL_BOOT;
-       c |= ACL_SINTEN;
-       c &= ~ACL_PSDMAEN;              /* Clear pseudo dma bit */
-       SIFWRITEW(c, SIFACL);
-       tms380tr_wait(40);
-
-       count = 0;
-       /* Download firmware via DIO interface: */
-       do {
-               if (count2 < 3) continue;
-
-               /* Download first address part */
-               SIFWRITEW(*fw_ptr, SIFADX);
-               fw_ptr++;
-               count2--;
-               /* Download second address part */
-               SIFWRITEW(*fw_ptr, SIFADD);
-               fw_ptr++;
-               count2--;
-
-               if((count = *fw_ptr) != 0)      /* Load loop counter */
-               {
-                       fw_ptr++;       /* Download block data */
-                       count2--;
-                       if (count > count2) continue;
-
-                       for(; count > 0; count--)
-                       {
-                               SIFWRITEW(*fw_ptr, SIFINC);
-                               fw_ptr++;
-                               count2--;
-                       }
-               }
-               else    /* Stop, if last block downloaded */
-               {
-                       c = SIFREADW(SIFACL);
-                       c &= (~ACL_CPHALT | ACL_SINTEN);
-
-                       /* Clear CPHALT and start BUD */
-                       SIFWRITEW(c, SIFACL);
-                       release_firmware(fw_entry);
-                       return 1;
-               }
-       } while(count == 0);
-
-       release_firmware(fw_entry);
-       printk(KERN_INFO "%s: Adapter Download Failed\n", dev->name);
-       return -1;
-}
-
-MODULE_FIRMWARE("tms380tr.bin");
-
-/*
- * Starts bring up diagnostics of token ring adapter and evaluates
- * diagnostic results.
- */
-static int tms380tr_bringup_diags(struct net_device *dev)
-{
-       int loop_cnt, retry_cnt;
-       unsigned short Status;
-
-       tms380tr_wait(HALF_SECOND);
-       tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-       tms380tr_wait(HALF_SECOND);
-
-       retry_cnt = BUD_MAX_RETRIES;    /* maximal number of retrys */
-
-       do {
-               retry_cnt--;
-               if(tms380tr_debug > 3)
-                       printk(KERN_DEBUG "BUD-Status: ");
-               loop_cnt = BUD_MAX_LOOPCNT;     /* maximum: three seconds*/
-               do {                    /* Inspect BUD results */
-                       loop_cnt--;
-                       tms380tr_wait(HALF_SECOND);
-                       Status = SIFREADW(SIFSTS);
-                       Status &= STS_MASK;
-
-                       if(tms380tr_debug > 3)
-                               printk(KERN_DEBUG " %04X\n", Status);
-                       /* BUD successfully completed */
-                       if(Status == STS_INITIALIZE)
-                               return 1;
-               /* Unrecoverable hardware error, BUD not completed? */
-               } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
-                       != (STS_ERROR | STS_TEST)));
-
-               /* Error preventing completion of BUD */
-               if(retry_cnt > 0)
-               {
-                       printk(KERN_INFO "%s: Adapter Software Reset.\n", 
-                               dev->name);
-                       tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-                       tms380tr_wait(HALF_SECOND);
-               }
-       } while(retry_cnt > 0);
-
-       Status = SIFREADW(SIFSTS);
-       
-       printk(KERN_INFO "%s: Hardware error\n", dev->name);
-       /* Hardware error occurred! */
-       Status &= 0x001f;
-       if (Status & 0x0010)
-               printk(KERN_INFO "%s: BUD Error: Timeout\n", dev->name);
-       else if ((Status & 0x000f) > 6)
-               printk(KERN_INFO "%s: BUD Error: Illegal Failure\n", dev->name);
-       else
-               printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", dev->name, Status & 0x000f);
-
-       return -1;
-}
-
-/*
- * Copy initialisation data to adapter memory, beginning at address
- * 1:0A00; Starting DMA test and evaluating result bits.
- */
-static int tms380tr_init_adapter(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-
-       const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
-       const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
-                                               0xC5, 0xD9, 0xC3, 0xD4};
-       void *ptr = (void *)&tp->ipb;
-       unsigned short *ipb_ptr = (unsigned short *)ptr;
-       unsigned char *cb_ptr = (unsigned char *) &tp->scb;
-       unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
-       unsigned short Status;
-       int i, loop_cnt, retry_cnt;
-
-       /* Normalize: byte order low/high, word order high/low! (only IPB!) */
-       tp->ipb.SCB_Addr = SWAPW(((char *)&tp->scb - (char *)tp) + tp->dmabuffer);
-       tp->ipb.SSB_Addr = SWAPW(((char *)&tp->ssb - (char *)tp) + tp->dmabuffer);
-
-       if(tms380tr_debug > 3)
-       {
-               printk(KERN_DEBUG "%s: buffer (real): %lx\n", dev->name, (long) &tp->scb);
-               printk(KERN_DEBUG "%s: buffer (virt): %lx\n", dev->name, (long) ((char *)&tp->scb - (char *)tp) + (long) tp->dmabuffer);
-               printk(KERN_DEBUG "%s: buffer (DMA) : %lx\n", dev->name, (long) tp->dmabuffer);
-               printk(KERN_DEBUG "%s: buffer (tp)  : %lx\n", dev->name, (long) tp);
-       }
-       /* Maximum: three initialization retries */
-       retry_cnt = INIT_MAX_RETRIES;
-
-       do {
-               retry_cnt--;
-
-               /* Transfer initialization block */
-               SIFWRITEW(0x0001, SIFADX);
-
-               /* To address 0001:0A00 of adapter RAM */
-               SIFWRITEW(0x0A00, SIFADD);
-
-               /* Write 11 words to adapter RAM */
-               for(i = 0; i < 11; i++)
-                       SIFWRITEW(ipb_ptr[i], SIFINC);
-
-               /* Execute SCB adapter command */
-               tms380tr_exec_sifcmd(dev, CMD_EXECUTE);
-
-               loop_cnt = INIT_MAX_LOOPCNT;    /* Maximum: 11 seconds */
-
-               /* While remaining retries, no error and not completed */
-               do {
-                       Status = 0;
-                       loop_cnt--;
-                       tms380tr_wait(HALF_SECOND);
-
-                       /* Mask interesting status bits */
-                       Status = SIFREADW(SIFSTS);
-                       Status &= STS_MASK;
-               } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) &&
-                       ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
-
-               if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
-               {
-                       /* Initialization completed without error */
-                       i = 0;
-                       do {    /* Test if contents of SCB is valid */
-                               if(SCB_Test[i] != *(cb_ptr + i))
-                               {
-                                       printk(KERN_INFO "%s: DMA failed\n", dev->name);
-                                       /* DMA data error: wrong data in SCB */
-                                       return -1;
-                               }
-                               i++;
-                       } while(i < 6);
-
-                       i = 0;
-                       do {    /* Test if contents of SSB is valid */
-                               if(SSB_Test[i] != *(sb_ptr + i))
-                                       /* DMA data error: wrong data in SSB */
-                                       return -1;
-                               i++;
-                       } while (i < 8);
-
-                       return 1;       /* Adapter successfully initialized */
-               }
-               else
-               {
-                       if((Status & STS_ERROR) != 0)
-                       {
-                               /* Initialization error occurred */
-                               Status = SIFREADW(SIFSTS);
-                               Status &= STS_ERROR_MASK;
-                               /* ShowInitialisationErrorCode(Status); */
-                               printk(KERN_INFO "%s: Status error: %d\n", dev->name, Status);
-                               return -1; /* Unrecoverable error */
-                       }
-                       else
-                       {
-                               if(retry_cnt > 0)
-                               {
-                                       /* Reset adapter and try init again */
-                                       tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-                                       tms380tr_wait(HALF_SECOND);
-                               }
-                       }
-               }
-       } while(retry_cnt > 0);
-
-       printk(KERN_INFO "%s: Retry exceeded\n", dev->name);
-       return -1;
-}
-
-/*
- * Check for outstanding commands in command queue and tries to execute
- * command immediately. Corresponding command flag in command queue is cleared.
- */
-static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned long Addr = 0;
-
-       if(tp->CMDqueue == 0)
-               return;         /* No command execution */
-
-       /* If SCB in use: no command */
-       if(tp->ScbInUse == 1)
-               return;
-
-       /* Check if adapter is opened, avoiding COMMAND_REJECT
-        * interrupt by the adapter!
-        */
-       if (tp->AdapterOpenFlag == 0) {
-               if (tp->CMDqueue & OC_OPEN) {
-                       /* Execute OPEN command */
-                       tp->CMDqueue ^= OC_OPEN;
-
-                       Addr = htonl(((char *)&tp->ocpl - (char *)tp) + tp->dmabuffer);
-                       tp->scb.Parm[0] = LOWORD(Addr);
-                       tp->scb.Parm[1] = HIWORD(Addr);
-                       tp->scb.CMD = OPEN;
-               } else
-                       /* No OPEN command queued, but adapter closed. Note:
-                        * We'll try to re-open the adapter in DriverPoll()
-                        */
-                       return;         /* No adapter command issued */
-       } else {
-               /* Adapter is open; evaluate command queue: try to execute
-                * outstanding commands (depending on priority!) CLOSE
-                * command queued
-                */
-               if (tp->CMDqueue & OC_CLOSE) {
-                       tp->CMDqueue ^= OC_CLOSE;
-                       tp->AdapterOpenFlag = 0;
-                       tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
-                       tp->scb.Parm[1] = 0; /* but should be set to zero! */
-                       tp->scb.CMD = CLOSE;
-                       if(!tp->HaltInProgress)
-                               tp->CMDqueue |= OC_OPEN; /* re-open adapter */
-                       else
-                               tp->CMDqueue = 0;       /* no more commands */
-               } else if (tp->CMDqueue & OC_RECEIVE) {
-                       tp->CMDqueue ^= OC_RECEIVE;
-                       Addr = htonl(((char *)tp->RplHead - (char *)tp) + tp->dmabuffer);
-                       tp->scb.Parm[0] = LOWORD(Addr);
-                       tp->scb.Parm[1] = HIWORD(Addr);
-                       tp->scb.CMD = RECEIVE;
-               } else if (tp->CMDqueue & OC_TRANSMIT_HALT) {
-                       /* NOTE: TRANSMIT.HALT must be checked
-                        * before TRANSMIT.
-                        */
-                       tp->CMDqueue ^= OC_TRANSMIT_HALT;
-                       tp->scb.CMD = TRANSMIT_HALT;
-
-                       /* Parm[0] and Parm[1] are ignored
-                        * but should be set to zero!
-                        */
-                       tp->scb.Parm[0] = 0;
-                       tp->scb.Parm[1] = 0;
-               } else if (tp->CMDqueue & OC_TRANSMIT) {
-                       /* NOTE: TRANSMIT must be
-                        * checked after TRANSMIT.HALT
-                        */
-                       if (tp->TransmitCommandActive) {
-                               if (!tp->TransmitHaltScheduled) {
-                                       tp->TransmitHaltScheduled = 1;
-                                       tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT);
-                               }
-                               tp->TransmitCommandActive = 0;
-                               return;
-                       }
-
-                       tp->CMDqueue ^= OC_TRANSMIT;
-                       tms380tr_cancel_tx_queue(tp);
-                       Addr = htonl(((char *)tp->TplBusy - (char *)tp) + tp->dmabuffer);
-                       tp->scb.Parm[0] = LOWORD(Addr);
-                       tp->scb.Parm[1] = HIWORD(Addr);
-                       tp->scb.CMD = TRANSMIT;
-                       tp->TransmitCommandActive = 1;
-               } else if (tp->CMDqueue & OC_MODIFY_OPEN_PARMS) {
-                       tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
-                       tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
-                       tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
-                       tp->scb.Parm[1] = 0; /* is ignored but should be zero */
-                       tp->scb.CMD = MODIFY_OPEN_PARMS;
-               } else if (tp->CMDqueue & OC_SET_FUNCT_ADDR) {
-                       tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
-                       tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
-                       tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
-                       tp->scb.CMD = SET_FUNCT_ADDR;
-               } else if (tp->CMDqueue & OC_SET_GROUP_ADDR) {
-                       tp->CMDqueue ^= OC_SET_GROUP_ADDR;
-                       tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
-                       tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
-                       tp->scb.CMD = SET_GROUP_ADDR;
-               } else if (tp->CMDqueue & OC_READ_ERROR_LOG) {
-                       tp->CMDqueue ^= OC_READ_ERROR_LOG;
-                       Addr = htonl(((char *)&tp->errorlogtable - (char *)tp) + tp->dmabuffer);
-                       tp->scb.Parm[0] = LOWORD(Addr);
-                       tp->scb.Parm[1] = HIWORD(Addr);
-                       tp->scb.CMD = READ_ERROR_LOG;
-               } else {
-                       printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
-                       tp->CMDqueue = 0;
-                       return;
-               }
-       }
-
-       tp->ScbInUse = 1;       /* Set semaphore: SCB in use. */
-
-       /* Execute SCB and generate IRQ when done. */
-       tms380tr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
-}
-
-/*
- * IRQ conditions: signal loss on the ring, transmit or receive of beacon
- * frames (disabled if bit 1 of OPEN option is set); report error MAC
- * frame transmit (disabled if bit 2 of OPEN option is set); open or short
- * circuit fault on the lobe is detected; remove MAC frame received;
- * error counter overflow (255); opened adapter is the only station in ring.
- * After some of the IRQs the adapter is closed!
- */
-static void tms380tr_ring_status_irq(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-
-       tp->CurrentRingStatus = be16_to_cpu((unsigned short)tp->ssb.Parm[0]);
-
-       /* First: fill up statistics */
-       if(tp->ssb.Parm[0] & SIGNAL_LOSS)
-       {
-               printk(KERN_INFO "%s: Signal Loss\n", dev->name);
-               tp->MacStat.line_errors++;
-       }
-
-       /* Adapter is closed, but initialized */
-       if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
-       {
-               printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", 
-                       dev->name);
-               tp->MacStat.line_errors++;
-       }
-
-       if(tp->ssb.Parm[0] & RING_RECOVERY)
-               printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
-
-       /* Counter overflow: read error log */
-       if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
-       {
-               printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-               tms380tr_exec_cmd(dev, OC_READ_ERROR_LOG);
-       }
-
-       /* Adapter is closed, but initialized */
-       if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
-               printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", 
-                       dev->name);
-
-       /* Adapter is closed, but initialized */
-       if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
-               printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", 
-                       dev->name);
-
-       if(tp->ssb.Parm[0] & HARD_ERROR)
-               printk(KERN_INFO "%s: Hard Error\n", dev->name);
-
-       if(tp->ssb.Parm[0] & SOFT_ERROR)
-               printk(KERN_INFO "%s: Soft Error\n", dev->name);
-
-       if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
-               printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
-
-       if(tp->ssb.Parm[0] & SINGLE_STATION)
-               printk(KERN_INFO "%s: Single Station\n", dev->name);
-
-       /* Check if adapter has been closed */
-       if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
-       {
-               printk(KERN_INFO "%s: Adapter closed (Reopening)," 
-                       "CurrentRingStat %x\n",
-                       dev->name, tp->CurrentRingStatus);
-               tp->AdapterOpenFlag = 0;
-               tms380tr_open_adapter(dev);
-       }
-}
-
-/*
- * Issued if adapter has encountered an unrecoverable hardware
- * or software error.
- */
-static void tms380tr_chk_irq(struct net_device *dev)
-{
-       int i;
-       unsigned short AdapterCheckBlock[4];
-       struct net_local *tp = netdev_priv(dev);
-
-       tp->AdapterOpenFlag = 0;        /* Adapter closed now */
-
-       /* Page number of adapter memory */
-       SIFWRITEW(0x0001, SIFADX);
-       /* Address offset */
-       SIFWRITEW(CHECKADDR, SIFADR);
-
-       /* Reading 8 byte adapter check block. */
-       for(i = 0; i < 4; i++)
-               AdapterCheckBlock[i] = SIFREADW(SIFINC);
-
-       if(tms380tr_debug > 3)
-       {
-               printk(KERN_DEBUG "%s: AdapterCheckBlock: ", dev->name);
-               for (i = 0; i < 4; i++)
-                       printk("%04X", AdapterCheckBlock[i]);
-               printk("\n");
-       }
-
-       switch(AdapterCheckBlock[0])
-       {
-               case DIO_PARITY:
-                       printk(KERN_INFO "%s: DIO parity error\n", dev->name);
-                       break;
-
-               case DMA_READ_ABORT:
-                       printk(KERN_INFO "%s DMA read operation aborted:\n",
-                               dev->name);
-                       switch (AdapterCheckBlock[1])
-                       {
-                               case 0:
-                                       printk(KERN_INFO "Timeout\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2],
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               case 1:
-                                       printk(KERN_INFO "Parity error\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2], 
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               case 2: 
-                                       printk(KERN_INFO "Bus error\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2], 
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               default:
-                                       printk(KERN_INFO "Unknown error.\n");
-                                       break;
-                       }
-                       break;
-
-               case DMA_WRITE_ABORT:
-                       printk(KERN_INFO "%s: DMA write operation aborted:\n",
-                               dev->name);
-                       switch (AdapterCheckBlock[1])
-                       {
-                               case 0: 
-                                       printk(KERN_INFO "Timeout\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2], 
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               case 1: 
-                                       printk(KERN_INFO "Parity error\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2], 
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               case 2: 
-                                       printk(KERN_INFO "Bus error\n");
-                                       printk(KERN_INFO "Address: %04X %04X\n",
-                                               AdapterCheckBlock[2], 
-                                               AdapterCheckBlock[3]);
-                                       break;
-
-                               default:
-                                       printk(KERN_INFO "Unknown error.\n");
-                                       break;
-                       }
-                       break;
-
-               case ILLEGAL_OP_CODE:
-                       printk(KERN_INFO "%s: Illegal operation code in firmware\n",
-                               dev->name);
-                       /* Parm[0-3]: adapter internal register R13-R15 */
-                       break;
-
-               case PARITY_ERRORS:
-                       printk(KERN_INFO "%s: Adapter internal bus parity error\n",
-                               dev->name);
-                       /* Parm[0-3]: adapter internal register R13-R15 */
-                       break;
-
-               case RAM_DATA_ERROR:
-                       printk(KERN_INFO "%s: RAM data error\n", dev->name);
-                       /* Parm[0-1]: MSW/LSW address of RAM location. */
-                       break;
-
-               case RAM_PARITY_ERROR:
-                       printk(KERN_INFO "%s: RAM parity error\n", dev->name);
-                       /* Parm[0-1]: MSW/LSW address of RAM location. */
-                       break;
-
-               case RING_UNDERRUN:
-                       printk(KERN_INFO "%s: Internal DMA underrun detected\n",
-                               dev->name);
-                       break;
-
-               case INVALID_IRQ:
-                       printk(KERN_INFO "%s: Unrecognized interrupt detected\n",
-                               dev->name);
-                       /* Parm[0-3]: adapter internal register R13-R15 */
-                       break;
-
-               case INVALID_ERROR_IRQ:
-                       printk(KERN_INFO "%s: Unrecognized error interrupt detected\n",
-                               dev->name);
-                       /* Parm[0-3]: adapter internal register R13-R15 */
-                       break;
-
-               case INVALID_XOP:
-                       printk(KERN_INFO "%s: Unrecognized XOP request detected\n",
-                               dev->name);
-                       /* Parm[0-3]: adapter internal register R13-R15 */
-                       break;
-
-               default:
-                       printk(KERN_INFO "%s: Unknown status", dev->name);
-                       break;
-       }
-
-       if(tms380tr_chipset_init(dev) == 1)
-       {
-               /* Restart of firmware successful */
-               tp->AdapterOpenFlag = 1;
-       }
-}
-
-/*
- * Internal adapter pointer to RAM data are copied from adapter into
- * host system.
- */
-static int tms380tr_read_ptr(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned short adapterram;
-
-       tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
-                       ADAPTER_INT_PTRS, 16);
-       tms380tr_read_ram(dev, (unsigned char *)&adapterram,
-                       cpu_to_be16((unsigned short)tp->intptrs.AdapterRAMPtr), 2);
-       return be16_to_cpu(adapterram); 
-}
-
-/*
- * Reads a number of bytes from adapter to system memory.
- */
-static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
-                               unsigned short Address, int Length)
-{
-       int i;
-       unsigned short old_sifadx, old_sifadr, InWord;
-
-       /* Save the current values */
-       old_sifadx = SIFREADW(SIFADX);
-       old_sifadr = SIFREADW(SIFADR);
-
-       /* Page number of adapter memory */
-       SIFWRITEW(0x0001, SIFADX);
-       /* Address offset in adapter RAM */
-        SIFWRITEW(Address, SIFADR);
-
-       /* Copy len byte from adapter memory to system data area. */
-       i = 0;
-       for(;;)
-       {
-               InWord = SIFREADW(SIFINC);
-
-               *(Data + i) = HIBYTE(InWord);   /* Write first byte */
-               if(++i == Length)               /* All is done break */
-                       break;
-
-               *(Data + i) = LOBYTE(InWord);   /* Write second byte */
-               if (++i == Length)              /* All is done break */
-                       break;
-       }
-
-       /* Restore original values */
-       SIFWRITEW(old_sifadx, SIFADX);
-       SIFWRITEW(old_sifadr, SIFADR);
-}
-
-/*
- * Cancel all queued packets in the transmission queue.
- */
-static void tms380tr_cancel_tx_queue(struct net_local* tp)
-{
-       TPL *tpl;
-
-       /*
-        * NOTE: There must not be an active TRANSMIT command pending, when
-        * this function is called.
-        */
-       if(tp->TransmitCommandActive)
-               return;
-
-       for(;;)
-       {
-               tpl = tp->TplBusy;
-               if(!tpl->BusyFlag)
-                       break;
-               /* "Remove" TPL from busy list. */
-               tp->TplBusy = tpl->NextTPLPtr;
-               tms380tr_write_tpl_status(tpl, 0);      /* Clear VALID bit */
-               tpl->BusyFlag = 0;              /* "free" TPL */
-
-               printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
-               if (tpl->DMABuff)
-                       dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE);
-               dev_kfree_skb_any(tpl->Skb);
-       }
-}
-
-/*
- * This function is called whenever a transmit interrupt is generated by the
- * adapter. For a command complete interrupt, it is checked if we have to
- * issue a new transmit command or not.
- */
-static void tms380tr_tx_status_irq(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned char HighByte, HighAc, LowAc;
-       TPL *tpl;
-
-       /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
-        * available, because the CLEAR SSB command has already been issued.
-        *
-        * Process all complete transmissions.
-        */
-
-       for(;;)
-       {
-               tpl = tp->TplBusy;
-               if(!tpl->BusyFlag || (tpl->Status
-                       & (TX_VALID | TX_FRAME_COMPLETE))
-                       != TX_FRAME_COMPLETE)
-               {
-                       break;
-               }
-
-               /* "Remove" TPL from busy list. */
-               tp->TplBusy = tpl->NextTPLPtr ;
-
-               /* Check the transmit status field only for directed frames*/
-               if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
-               {
-                       HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
-                       HighAc   = GET_FRAME_STATUS_HIGH_AC(HighByte);
-                       LowAc    = GET_FRAME_STATUS_LOW_AC(HighByte);
-
-                       if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
-                       {
-                               printk(KERN_DEBUG "%s: (DA=%08lX not recognized)\n",
-                                       dev->name,
-                                       *(unsigned long *)&tpl->MData[2+2]);
-                       }
-                       else
-                       {
-                               if(tms380tr_debug > 3)
-                                       printk(KERN_DEBUG "%s: Directed frame tx'd\n", 
-                                               dev->name);
-                       }
-               }
-               else
-               {
-                       if(!DIRECTED_FRAME(tpl))
-                       {
-                               if(tms380tr_debug > 3)
-                                       printk(KERN_DEBUG "%s: Broadcast frame tx'd\n",
-                                               dev->name);
-                       }
-               }
-
-               tp->MacStat.tx_packets++;
-               if (tpl->DMABuff)
-                       dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE);
-               dev_kfree_skb_irq(tpl->Skb);
-               tpl->BusyFlag = 0;      /* "free" TPL */
-       }
-
-       if(!tp->TplFree->NextTPLPtr->BusyFlag)
-               netif_wake_queue(dev);
-}
-
-/*
- * Called if a frame receive interrupt is generated by the adapter.
- * Check if the frame is valid and indicate it to system.
- */
-static void tms380tr_rcv_status_irq(struct net_device *dev)
-{
-       struct net_local *tp = netdev_priv(dev);
-       unsigned char *ReceiveDataPtr;
-       struct sk_buff *skb;
-       unsigned int Length, Length2;
-       RPL *rpl;
-       RPL *SaveHead;
-       dma_addr_t dmabuf;
-
-       /* NOTE: At this point the SSB from RECEIVE STATUS is no longer
-        * available, because the CLEAR SSB command has already been issued.
-        *
-        * Process all complete receives.
-        */
-
-       for(;;)
-       {
-               rpl = tp->RplHead;
-               if(rpl->Status & RX_VALID)
-                       break;          /* RPL still in use by adapter */
-
-               /* Forward RPLHead pointer to next list. */
-               SaveHead = tp->RplHead;
-               tp->RplHead = rpl->NextRPLPtr;
-
-               /* Get the frame size (Byte swap for Intel).
-                * Do this early (see workaround comment below)
-                */
-               Length = be16_to_cpu(rpl->FrameSize);
-
-               /* Check if the Frame_Start, Frame_End and
-                * Frame_Complete bits are set.
-                */
-               if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
-                       == VALID_SINGLE_BUFFER_FRAME)
-               {
-                       ReceiveDataPtr = rpl->MData;
-
-                       /* Workaround for delayed write of FrameSize on ISA
-                        * (FrameSize is false but valid-bit is reset)
-                        * Frame size is set to zero when the RPL is freed.
-                        * Length2 is there because there have also been
-                        * cases where the FrameSize was partially written
-                        */
-                       Length2 = be16_to_cpu(rpl->FrameSize);
-
-                       if(Length == 0 || Length != Length2)
-                       {
-                               tp->RplHead = SaveHead;
-                               break;  /* Return to tms380tr_interrupt */
-                       }
-                       tms380tr_update_rcv_stats(tp,ReceiveDataPtr,Length);
-                         
-                       if(tms380tr_debug > 3)
-                               printk(KERN_DEBUG "%s: Packet Length %04X (%d)\n",
-                                       dev->name, Length, Length);
-                         
-                       /* Indicate the received frame to system the
-                        * adapter does the Source-Routing padding for 
-                        * us. See: OpenOptions in tms380tr_init_opb()
-                        */
-                       skb = rpl->Skb;
-                       if(rpl->SkbStat == SKB_UNAVAILABLE)
-                       {
-                               /* Try again to allocate skb */
-                               skb = dev_alloc_skb(tp->MaxPacketSize);
-                               if(skb == NULL)
-                               {
-                                       /* Update Stats ?? */
-                               }
-                               else
-                               {
-                                       skb_put(skb, tp->MaxPacketSize);
-                                       rpl->SkbStat    = SKB_DATA_COPY;
-                                       ReceiveDataPtr  = rpl->MData;
-                               }
-                       }
-
-                       if(skb && (rpl->SkbStat == SKB_DATA_COPY ||
-                                  rpl->SkbStat == SKB_DMA_DIRECT))
-                       {
-                               if(rpl->SkbStat == SKB_DATA_COPY)
-                                       skb_copy_to_linear_data(skb, ReceiveDataPtr,
-                                                      Length);
-
-                               /* Deliver frame to system */
-                               rpl->Skb = NULL;
-                               skb_trim(skb,Length);
-                               skb->protocol = tr_type_trans(skb,dev);
-                               netif_rx(skb);
-                       }
-               }
-               else    /* Invalid frame */
-               {
-                       if(rpl->Skb != NULL)
-                               dev_kfree_skb_irq(rpl->Skb);
-
-                       /* Skip list. */
-                       if(rpl->Status & RX_START_FRAME)
-                               /* Frame start bit is set -> overflow. */
-                               tp->MacStat.rx_errors++;
-               }
-               if (rpl->DMABuff)
-                       dma_unmap_single(tp->pdev, rpl->DMABuff, tp->MaxPacketSize, DMA_TO_DEVICE);
-               rpl->DMABuff = 0;
-
-               /* Allocate new skb for rpl */
-               rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
-               /* skb == NULL ? then use local buffer */
-               if(rpl->Skb == NULL)
-               {
-                       rpl->SkbStat = SKB_UNAVAILABLE;
-                       rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer);
-                       rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
-               }
-               else    /* skb != NULL */
-               {
-                       rpl->Skb->dev = dev;
-                       skb_put(rpl->Skb, tp->MaxPacketSize);
-
-                       /* Data unreachable for DMA ? then use local buffer */
-                       dmabuf = dma_map_single(tp->pdev, rpl->Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE);
-                       if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
-                       {
-                               rpl->SkbStat = SKB_DATA_COPY;
-                               rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer);
-                               rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
-                       }
-                       else
-                       {
-                               /* DMA directly in skb->data */
-                               rpl->SkbStat = SKB_DMA_DIRECT;
-                               rpl->FragList[0].DataAddr = htonl(dmabuf);
-                               rpl->MData = rpl->Skb->data;
-                               rpl->DMABuff = dmabuf;
-                       }
-               }
-
-               rpl->FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize);
-               rpl->FrameSize = 0;
-
-               /* Pass the last RPL back to the adapter */
-               tp->RplTail->FrameSize = 0;
-
-               /* Reset the CSTAT field in the list. */
-               tms380tr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
-
-               /* Current RPL becomes last one in list. */
-               tp->RplTail = tp->RplTail->NextRPLPtr;
-
-               /* Inform adapter about RPL valid. */
-               tms380tr_exec_sifcmd(dev, CMD_RX_VALID);
-       }
-}
-
-/*
- * This function should be used whenever the status of any RPL must be
- * modified by the driver, because the compiler may otherwise change the
- * order of instructions such that writing the RPL status may be executed
- * at an undesirable time. When this function is used, the status is
- * always written when the function is called.
- */
-static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status)
-{
-       rpl->Status = Status;
-}
-
-/*
- * The function updates the statistic counters in mac->MacStat.
- * It differtiates between directed and broadcast/multicast ( ==functional)
- * frames.
- */
-static void tms380tr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
-                                       unsigned int Length)
-{
-       tp->MacStat.rx_packets++;
-       tp->MacStat.rx_bytes += Length;
-       
-       /* Test functional bit */
-       if(DataPtr[2] & GROUP_BIT)
-               tp->MacStat.multicast++;
-}
-
-static int tms380tr_set_mac_address(struct net_device *dev, void *addr)
-{
-       struct net_local *tp = netdev_priv(dev);
-       struct sockaddr *saddr = addr;
-       
-       if (tp->AdapterOpenFlag || tp->AdapterVirtOpenFlag) {
-               printk(KERN_WARNING "%s: Cannot set MAC/LAA address while card is open\n", dev->name);
-               return -EIO;
-       }
-       memcpy(dev->dev_addr, saddr->sa_data, dev->addr_len);
-       return 0;
-}
-
-#if TMS380TR_DEBUG > 0
-/*
- * Dump Packet (data)
- */
-static void tms380tr_dump(unsigned char *Data, int length)
-{
-       int i, j;
-
-       for (i = 0, j = 0; i < length / 8; i++, j += 8)
-       {
-               printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-                      Data[j+0],Data[j+1],Data[j+2],Data[j+3],
-                      Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
-       }
-}
-#endif
-
-void tmsdev_term(struct net_device *dev)
-{
-       struct net_local *tp;
-
-       tp = netdev_priv(dev);
-       dma_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local),
-               DMA_BIDIRECTIONAL);
-}
-
-const struct net_device_ops tms380tr_netdev_ops = {
-       .ndo_open               = tms380tr_open,
-       .ndo_stop               = tms380tr_close,
-       .ndo_start_xmit         = tms380tr_send_packet,
-       .ndo_tx_timeout         = tms380tr_timeout,
-       .ndo_get_stats          = tms380tr_get_stats,
-       .ndo_set_rx_mode        = tms380tr_set_multicast_list,
-       .ndo_set_mac_address    = tms380tr_set_mac_address,
-};
-EXPORT_SYMBOL(tms380tr_netdev_ops);
-
-int tmsdev_init(struct net_device *dev, struct device *pdev)
-{
-       struct net_local *tms_local;
-
-       memset(netdev_priv(dev), 0, sizeof(struct net_local));
-       tms_local = netdev_priv(dev);
-       init_waitqueue_head(&tms_local->wait_for_tok_int);
-       if (pdev->dma_mask)
-               tms_local->dmalimit = *pdev->dma_mask;
-       else
-               return -ENOMEM;
-       tms_local->pdev = pdev;
-       tms_local->dmabuffer = dma_map_single(pdev, (void *)tms_local,
-           sizeof(struct net_local), DMA_BIDIRECTIONAL);
-       if (tms_local->dmabuffer + sizeof(struct net_local) > 
-                       tms_local->dmalimit)
-       {
-               printk(KERN_INFO "%s: Memory not accessible for DMA\n",
-                       dev->name);
-               tmsdev_term(dev);
-               return -ENOMEM;
-       }
-       
-       dev->netdev_ops         = &tms380tr_netdev_ops;
-       dev->watchdog_timeo     = HZ;
-
-       return 0;
-}
-
-EXPORT_SYMBOL(tms380tr_open);
-EXPORT_SYMBOL(tms380tr_close);
-EXPORT_SYMBOL(tms380tr_interrupt);
-EXPORT_SYMBOL(tmsdev_init);
-EXPORT_SYMBOL(tmsdev_term);
-EXPORT_SYMBOL(tms380tr_wait);
-
-#ifdef MODULE
-
-static struct module *TMS380_module = NULL;
-
-int init_module(void)
-{
-       printk(KERN_DEBUG "%s", version);
-       
-       TMS380_module = &__this_module;
-       return 0;
-}
-
-void cleanup_module(void)
-{
-       TMS380_module = NULL;
-}
-#endif
-
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/net/tokenring/tms380tr.h b/drivers/net/tokenring/tms380tr.h
deleted file mode 100644 (file)
index e5a617c..0000000
+++ /dev/null
@@ -1,1141 +0,0 @@
-/* 
- * tms380tr.h: TI TMS380 Token Ring driver for Linux
- *
- * Authors:
- * - Christoph Goos <cgoos@syskonnect.de>
- * - Adam Fritzler
- */
-
-#ifndef __LINUX_TMS380TR_H
-#define __LINUX_TMS380TR_H
-
-#ifdef __KERNEL__
-
-#include <linux/interrupt.h>
-
-/* module prototypes */
-extern const struct net_device_ops tms380tr_netdev_ops;
-int tms380tr_open(struct net_device *dev);
-int tms380tr_close(struct net_device *dev);
-irqreturn_t tms380tr_interrupt(int irq, void *dev_id);
-int tmsdev_init(struct net_device *dev, struct device *pdev);
-void tmsdev_term(struct net_device *dev);
-void tms380tr_wait(unsigned long time);
-
-#define TMS380TR_MAX_ADAPTERS 7
-
-#define SEND_TIMEOUT 10*HZ
-
-#define TR_RCF_LONGEST_FRAME_MASK 0x0070
-#define TR_RCF_FRAME4K 0x0030
-
-/*------------------------------------------------------------------*/
-/*  Bit order for adapter communication with DMA                   */
-/*  --------------------------------------------------------------  */
-/*  Bit  8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7|  */
-/*  --------------------------------------------------------------  */
-/*  The bytes in a word must be byte swapped. Also, if a double            */
-/*  word is used for storage, then the words, as well as the bytes, */
-/*  must be swapped.                                               */
-/*  Bit order for adapter communication with DIO                   */
-/*  --------------------------------------------------------------  */
-/*  Bit  0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15|  */
-/*  --------------------------------------------------------------  */
-/*------------------------------------------------------------------*/
-
-/* Swap words of a long.                        */
-#define SWAPW(x) (((x) << 16) | ((x) >> 16))
-
-/* Get the low byte of a word.                      */
-#define LOBYTE(w)       ((unsigned char)(w))
-
-/* Get the high byte of a word.                     */
-#define HIBYTE(w)       ((unsigned char)((unsigned short)(w) >> 8))
-
-/* Get the low word of a long.                      */
-#define LOWORD(l)       ((unsigned short)(l))
-
-/* Get the high word of a long.                     */
-#define HIWORD(l)       ((unsigned short)((unsigned long)(l) >> 16))
-
-
-
-/* Token ring adapter I/O addresses for normal mode. */
-
-/*
- * The SIF registers.  Common to all adapters.
- */
-/* Basic SIF (SRSX = 0) */
-#define SIFDAT                 0x00    /* SIF/DMA data. */
-#define SIFINC                 0x02    /* IO Word data with auto increment. */
-#define SIFINH                 0x03    /* IO Byte data with auto increment. */
-#define SIFADR                 0x04    /* SIF/DMA Address. */
-#define SIFCMD                 0x06    /* SIF Command. */
-#define SIFSTS                 0x06    /* SIF Status. */
-
-/* "Extended" SIF (SRSX = 1) */
-#define SIFACL                 0x08    /* SIF Adapter Control Register. */
-#define SIFADD                 0x0a    /* SIF/DMA Address. -- 0x0a */
-#define SIFADX                 0x0c     /* 0x0c */
-#define DMALEN                 0x0e    /* SIF DMA length. -- 0x0e */
-
-/*
- * POS Registers.  Only for ISA Adapters.
- */
-#define POSREG                 0x10    /* Adapter Program Option Select (POS)
-                                        * Register: base IO address + 16 byte.
-                                        */
-#define POSREG_2               24L     /* only for TR4/16+ adapter
-                                        * base IO address + 24 byte. -- 0x18
-                                        */
-
-/* SIFCMD command codes (high-low) */
-#define CMD_INTERRUPT_ADAPTER   0x8000  /* Cause internal adapter interrupt */
-#define CMD_ADAPTER_RESET      0x4000  /* Hardware reset of adapter */
-#define CMD_SSB_CLEAR          0x2000  /* Acknowledge to adapter to
-                                        * system interrupts.
-                                        */
-#define CMD_EXECUTE            0x1000  /* Execute SCB command */
-#define CMD_SCB_REQUEST                0x0800  /* Request adapter to interrupt
-                                        * system when SCB is available for
-                                        * another command.
-                                        */
-#define CMD_RX_CONTINUE                0x0400  /* Continue receive after odd pointer
-                                        * stop. (odd pointer receive method)
-                                        */
-#define CMD_RX_VALID           0x0200  /* Now actual RPL is valid. */
-#define CMD_TX_VALID           0x0100  /* Now actual TPL is valid. (valid
-                                        * bit receive/transmit method)
-                                        */
-#define CMD_SYSTEM_IRQ         0x0080  /* Adapter-to-attached-system
-                                        * interrupt is reset.
-                                        */
-#define CMD_CLEAR_SYSTEM_IRQ   0x0080  /* Clear SYSTEM_INTERRUPT bit.
-                                        * (write: 1=ignore, 0=reset)
-                                        */
-#define EXEC_SOFT_RESET                0xFF00  /* adapter soft reset. (restart
-                                        * adapter after hardware reset)
-                                        */
-
-
-/* ACL commands (high-low) */
-#define ACL_SWHLDA             0x0800  /* Software hold acknowledge. */
-#define ACL_SWDDIR             0x0400  /* Data transfer direction. */
-#define ACL_SWHRQ              0x0200  /* Pseudo DMA operation. */
-#define ACL_PSDMAEN            0x0100  /* Enable pseudo system DMA. */
-#define ACL_ARESET             0x0080  /* Adapter hardware reset command.
-                                        * (held in reset condition as
-                                        * long as bit is set)
-                                        */
-#define ACL_CPHALT             0x0040  /* Communication processor halt.
-                                        * (can only be set while ACL_ARESET
-                                        * bit is set; prevents adapter
-                                        * processor from executing code while
-                                        * downloading firmware)
-                                        */
-#define ACL_BOOT               0x0020
-#define ACL_SINTEN             0x0008  /* System interrupt enable/disable
-                                        * (1/0): can be written if ACL_ARESET
-                                        * is zero.
-                                        */
-#define ACL_PEN                 0x0004
-
-#define ACL_NSELOUT0            0x0002 
-#define ACL_NSELOUT1            0x0001 /* NSELOUTx have a card-specific
-                                        * meaning for setting ring speed.
-                                        */
-
-#define PS_DMA_MASK            (ACL_SWHRQ | ACL_PSDMAEN)
-
-
-/* SIFSTS register return codes (high-low) */
-#define STS_SYSTEM_IRQ         0x0080  /* Adapter-to-attached-system
-                                        * interrupt is valid.
-                                        */
-#define STS_INITIALIZE         0x0040  /* INITIALIZE status. (ready to
-                                        * initialize)
-                                        */
-#define STS_TEST               0x0020  /* TEST status. (BUD not completed) */
-#define STS_ERROR              0x0010  /* ERROR status. (unrecoverable
-                                        * HW error occurred)
-                                        */
-#define STS_MASK               0x00F0  /* Mask interesting status bits. */
-#define STS_ERROR_MASK         0x000F  /* Get Error Code by masking the
-                                        * interrupt code bits.
-                                        */
-#define ADAPTER_INT_PTRS       0x0A00  /* Address offset of adapter internal
-                                        * pointers 01:0a00 (high-low) have to
-                                        * be read after init and before open.
-                                        */
-
-
-/* Interrupt Codes (only MAC IRQs) */
-#define STS_IRQ_ADAPTER_CHECK  0x0000  /* unrecoverable hardware or
-                                        * software error.
-                                        */ 
-#define STS_IRQ_RING_STATUS    0x0004  /* SSB is updated with ring status. */
-#define STS_IRQ_LLC_STATUS     0x0005  /* Not used in MAC-only microcode */
-#define STS_IRQ_SCB_CLEAR      0x0006  /* SCB clear, following an
-                                        * SCB_REQUEST IRQ.
-                                        */
-#define STS_IRQ_TIMER          0x0007  /* Not normally used in MAC ucode */
-#define STS_IRQ_COMMAND_STATUS 0x0008  /* SSB is updated with command 
-                                        * status.
-                                        */ 
-#define STS_IRQ_RECEIVE_STATUS 0x000A  /* SSB is updated with receive
-                                        * status.
-                                        */
-#define STS_IRQ_TRANSMIT_STATUS        0x000C  /* SSB is updated with transmit
-                                         * status
-                                        */
-#define STS_IRQ_RECEIVE_PENDING        0x000E  /* Not used in MAC-only microcode */
-#define STS_IRQ_MASK           0x000F  /* = STS_ERROR_MASK. */
-
-
-/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */
-#define COMMAND_COMPLETE       0x0080  /* TRANSMIT command completed
-                                         * (avoid this!) issue another transmit
-                                        * to send additional frames.
-                                        */
-#define FRAME_COMPLETE         0x0040  /* Frame has been transmitted;
-                                        * INTERRUPT_FRAME bit was set in the
-                                        * CSTAT request; indication of possibly
-                                        * more than one frame transmissions!
-                                        * SSB.Parm[0-1]: 32 bit pointer to
-                                        * TPL of last frame.
-                                        */
-#define LIST_ERROR             0x0020  /* Error in one of the TPLs that
-                                        * compose the frame; TRANSMIT
-                                        * terminated; Parm[1-2]: 32bit pointer
-                                        * to TPL which starts the error
-                                        * frame; error details in bits 8-13.
-                                        * (14?)
-                                        */
-#define FRAME_SIZE_ERROR       0x8000  /* FRAME_SIZE does not equal the sum of
-                                        * the valid DATA_COUNT fields;
-                                        * FRAME_SIZE less than header plus
-                                        * information field. (15 bytes +
-                                        * routing field) Or if FRAME_SIZE
-                                        * was specified as zero in one list.
-                                        */
-#define TX_THRESHOLD           0x4000  /* FRAME_SIZE greater than (BUFFER_SIZE
-                                        * - 9) * TX_BUF_MAX.
-                                        */
-#define ODD_ADDRESS            0x2000  /* Odd forward pointer value is
-                                        * read on a list without END_FRAME
-                                        * indication.
-                                        */
-#define FRAME_ERROR            0x1000  /* START_FRAME bit (not) anticipated,
-                                        * but (not) set.
-                                        */
-#define ACCESS_PRIORITY_ERROR  0x0800  /* Access priority requested has not
-                                        * been allowed.
-                                        */
-#define UNENABLED_MAC_FRAME    0x0400  /* MAC frame has source class of zero
-                                        * or MAC frame PCF ATTN field is
-                                        * greater than one.
-                                        */
-#define ILLEGAL_FRAME_FORMAT   0x0200  /* Bit 0 or FC field was set to one. */
-
-
-/*
- * Since we need to support some functions even if the adapter is in a
- * CLOSED state, we have a (pseudo-) command queue which holds commands
- * that are outstandig to be executed.
- *
- * Each time a command completes, an interrupt occurs and the next
- * command is executed. The command queue is actually a simple word with 
- * a bit for each outstandig command. Therefore the commands will not be
- * executed in the order they have been queued.
- *
- * The following defines the command code bits and the command queue:
- */
-#define OC_OPEN                        0x0001  /* OPEN command */
-#define OC_TRANSMIT            0x0002  /* TRANSMIT command */
-#define OC_TRANSMIT_HALT       0x0004  /* TRANSMIT_HALT command */
-#define OC_RECEIVE             0x0008  /* RECEIVE command */
-#define OC_CLOSE               0x0010  /* CLOSE command */
-#define OC_SET_GROUP_ADDR      0x0020  /* SET_GROUP_ADDR command */
-#define OC_SET_FUNCT_ADDR      0x0040  /* SET_FUNCT_ADDR command */
-#define OC_READ_ERROR_LOG      0x0080  /* READ_ERROR_LOG command */
-#define OC_READ_ADAPTER                0x0100  /* READ_ADAPTER command */
-#define OC_MODIFY_OPEN_PARMS   0x0400  /* MODIFY_OPEN_PARMS command */
-#define OC_RESTORE_OPEN_PARMS  0x0800  /* RESTORE_OPEN_PARMS command */
-#define OC_SET_FIRST_16_GROUP  0x1000  /* SET_FIRST_16_GROUP command */
-#define OC_SET_BRIDGE_PARMS    0x2000  /* SET_BRIDGE_PARMS command */
-#define OC_CONFIG_BRIDGE_PARMS 0x4000  /* CONFIG_BRIDGE_PARMS command */
-
-#define OPEN                   0x0300  /* C: open command. S: completion. */
-#define TRANSMIT               0x0400  /* C: transmit command. S: completion
-                                        * status. (reject: COMMAND_REJECT if
-                                        * adapter not opened, TRANSMIT already
-                                        * issued or address passed in the SCB
-                                        * not word aligned)
-                                        */
-#define TRANSMIT_HALT          0x0500  /* C: interrupt TX TPL chain; if no
-                                        * TRANSMIT command issued, the command
-                                        * is ignored (completion with TRANSMIT
-                                        * status (0x0400)!)
-                                        */
-#define RECEIVE                        0x0600  /* C: receive command. S: completion
-                                        * status. (reject: COMMAND_REJECT if
-                                        * adapter not opened, RECEIVE already
-                                        * issued or address passed in the SCB 
-                                        * not word aligned)
-                                        */
-#define CLOSE                  0x0700  /* C: close adapter. S: completion.
-                                        * (COMMAND_REJECT if adapter not open)
-                                        */
-#define SET_GROUP_ADDR         0x0800  /* C: alter adapter group address after
-                                        * OPEN. S: completion. (COMMAND_REJECT
-                                        * if adapter not open)
-                                        */
-#define SET_FUNCT_ADDR         0x0900  /* C: alter adapter functional address
-                                        * after OPEN. S: completion.
-                                        * (COMMAND_REJECT if adapter not open)
-                                        */
-#define READ_ERROR_LOG         0x0A00  /* C: read adapter error counters.
-                                        * S: completion. (command ignored
-                                        * if adapter not open!)
-                                        */
-#define READ_ADAPTER           0x0B00  /* C: read data from adapter memory.
-                                        * (important: after init and before
-                                        * open!) S: completion. (ADAPTER_CHECK
-                                        * interrupt if undefined storage area
-                                        * read)
-                                        */
-#define MODIFY_OPEN_PARMS      0x0D00  /* C: modify some adapter operational
-                                        * parameters. (bit correspondend to
-                                        * WRAP_INTERFACE is ignored)
-                                        * S: completion. (reject: 
-                                        * COMMAND_REJECT)
-                                        */
-#define RESTORE_OPEN_PARMS     0x0E00  /* C: modify some adapter operational
-                                        * parameters. (bit correspondend
-                                        * to WRAP_INTERFACE is ignored)
-                                        * S: completion. (reject:
-                                        * COMMAND_REJECT)
-                                        */
-#define SET_FIRST_16_GROUP     0x0F00  /* C: alter the first two bytes in
-                                        * adapter group address.
-                                        * S: completion. (reject:
-                                        * COMMAND_REJECT)
-                                        */
-#define SET_BRIDGE_PARMS       0x1000  /* C: values and conditions for the
-                                        * adapter hardware to use when frames
-                                        * are copied for forwarding.
-                                        * S: completion. (reject:
-                                        * COMMAND_REJECT)
-                                        */
-#define CONFIG_BRIDGE_PARMS    0x1100  /* C: ..
-                                        * S: completion. (reject:
-                                        * COMMAND_REJECT)
-                                        */
-
-#define SPEED_4                        4
-#define SPEED_16               16      /* Default transmission speed  */
-
-
-/* Initialization Parameter Block (IPB); word alignment necessary! */
-#define BURST_SIZE     0x0018  /* Default burst size */
-#define BURST_MODE     0x9F00  /* Burst mode enable */
-#define DMA_RETRIES    0x0505  /* Magic DMA retry number... */
-
-#define CYCLE_TIME     3       /* Default AT-bus cycle time: 500 ns
-                                * (later adapter version: fix  cycle time!)
-                                */
-#define LINE_SPEED_BIT 0x80
-
-/* Macro definition for the wait function. */
-#define ONE_SECOND_TICKS       1000000
-#define HALF_SECOND            (ONE_SECOND_TICKS / 2)
-#define ONE_SECOND             (ONE_SECOND_TICKS)
-#define TWO_SECONDS            (ONE_SECOND_TICKS * 2)
-#define THREE_SECONDS          (ONE_SECOND_TICKS * 3)
-#define FOUR_SECONDS           (ONE_SECOND_TICKS * 4)
-#define FIVE_SECONDS           (ONE_SECOND_TICKS * 5)
-
-#define BUFFER_SIZE            2048    /* Buffers on Adapter */
-
-#pragma pack(1)
-typedef struct {
-       unsigned short Init_Options;    /* Initialize with burst mode;
-                                        * LLC disabled. (MAC only)
-                                        */
-
-       /* Interrupt vectors the adapter places on attached system bus. */
-       u_int8_t  CMD_Status_IV;    /* Interrupt vector: command status. */
-       u_int8_t  TX_IV;            /* Interrupt vector: transmit. */
-       u_int8_t  RX_IV;            /* Interrupt vector: receive. */
-       u_int8_t  Ring_Status_IV;   /* Interrupt vector: ring status. */
-       u_int8_t  SCB_Clear_IV;     /* Interrupt vector: SCB clear. */
-       u_int8_t  Adapter_CHK_IV;   /* Interrupt vector: adapter check. */
-
-       u_int16_t RX_Burst_Size;    /* Max. number of transfer cycles. */
-       u_int16_t TX_Burst_Size;    /* During DMA burst; even value! */
-       u_int16_t DMA_Abort_Thrhld; /* Number of DMA retries. */
-
-       u_int32_t SCB_Addr;   /* SCB address: even, word aligned, high-low */
-       u_int32_t SSB_Addr;   /* SSB address: even, word aligned, high-low */
-} IPB, *IPB_Ptr;
-#pragma pack()
-
-/*
- * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to
- * be reopened)
- */
-#define BUFFER_SIZE    2048            /* Buffers on Adapter. */
-#define TPL_SIZE       8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */
-#define RPL_SIZE       14              /* (with TI firmware v2.26 handling
-                                        * up to nine fragments possible)
-                                        */
-#define TX_BUF_MIN     20              /* ??? (Stephan: calculation with */
-#define TX_BUF_MAX     40              /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? 
-                                        */
-#define DISABLE_EARLY_TOKEN_RELEASE    0x1000
-
-/* OPEN Options (high-low) */
-#define WRAP_INTERFACE         0x0080  /* Inserting omitted for test
-                                        * purposes; transmit data appears
-                                        * as receive data. (useful for
-                                        * testing; change: CLOSE necessary)
-                                        */
-#define DISABLE_HARD_ERROR     0x0040  /* On HARD_ERROR & TRANSMIT_BEACON
-                                        * no RING.STATUS interrupt.
-                                        */
-#define DISABLE_SOFT_ERROR     0x0020  /* On SOFT_ERROR, no RING.STATUS
-                                        * interrupt.
-                                        */
-#define PASS_ADAPTER_MAC_FRAMES        0x0010  /* Passing unsupported MAC frames
-                                        * to system.
-                                        */
-#define PASS_ATTENTION_FRAMES  0x0008  /* All changed attention MAC frames are
-                                        * passed to the system.
-                                        */
-#define PAD_ROUTING_FIELD      0x0004  /* Routing field is padded to 18
-                                        * bytes.
-                                        */
-#define FRAME_HOLD             0x0002  /*Adapter waits for entire frame before
-                                        * initiating DMA transfer; otherwise:
-                                        * DMA transfer initiation if internal
-                                        * buffer filled.
-                                        */
-#define CONTENDER              0x0001  /* Adapter participates in the monitor
-                                        * contention process.
-                                        */
-#define PASS_BEACON_MAC_FRAMES 0x8000  /* Adapter passes beacon MAC frames
-                                        * to the system.
-                                        */
-#define EARLY_TOKEN_RELEASE    0x1000  /* Only valid in 16 Mbps operation;
-                                        * 0 = ETR. (no effect in 4 Mbps
-                                        * operation)
-                                        */
-#define COPY_ALL_MAC_FRAMES    0x0400  /* All MAC frames are copied to
-                                        * the system. (after OPEN: duplicate
-                                        * address test (DAT) MAC frame is 
-                                        * first received frame copied to the
-                                        * system)
-                                        */
-#define COPY_ALL_NON_MAC_FRAMES        0x0200  /* All non MAC frames are copied to
-                                        * the system.
-                                        */
-#define PASS_FIRST_BUF_ONLY    0x0100  /* Passes only first internal buffer
-                                        * of each received frame; FrameSize
-                                        * of RPLs must contain internal
-                                        * BUFFER_SIZE bits for promiscuous mode.
-                                        */
-#define ENABLE_FULL_DUPLEX_SELECTION   0x2000 
-                                       /* Enable the use of full-duplex
-                                        * settings with bits in byte 22 in
-                                        * ocpl. (new feature in firmware
-                                        * version 3.09)
-                                        */
-
-/* Full-duplex settings */
-#define OPEN_FULL_DUPLEX_OFF   0x0000
-#define OPEN_FULL_DUPLEX_ON    0x00c0
-#define OPEN_FULL_DUPLEX_AUTO  0x0080
-
-#define PROD_ID_SIZE   18      /* Length of product ID. */
-
-#define TX_FRAG_NUM    3        /* Number of fragments used in one TPL. */
-#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more
-                                 * fragments following.
-                                 */
-
-/* XXX is there some better way to do this? */
-#define ISA_MAX_ADDRESS        0x00ffffff
-#define PCI_MAX_ADDRESS                0xffffffff
-
-#pragma pack(1)
-typedef struct {
-       u_int16_t OPENOptions;
-       u_int8_t  NodeAddr[6];  /* Adapter node address; use ROM 
-                                * address
-                                */
-       u_int32_t GroupAddr;    /* Multicast: high order
-                                * bytes = 0xC000
-                                */
-       u_int32_t FunctAddr;    /* High order bytes = 0xC000 */
-       __be16 RxListSize;      /* RPL size: 0 (=26), 14, 20 or
-                                * 26 bytes read by the adapter.
-                                * (Depending on the number of 
-                                * fragments/list)
-                                */
-       __be16 TxListSize;      /* TPL size */
-       __be16 BufSize;         /* Is automatically rounded up to the
-                                * nearest nK boundary.
-                                */
-       u_int16_t FullDuplex;
-       u_int16_t Reserved;
-       u_int8_t  TXBufMin;     /* Number of adapter buffers reserved
-                                * for transmission a minimum of 2
-                                * buffers must be allocated.
-                                */
-       u_int8_t  TXBufMax;     /* Maximum number of adapter buffers
-                                * for transmit; a minimum of 2 buffers
-                                * must be available for receive.
-                                * Default: 6
-                                */
-       u_int16_t ProdIDAddr[2];/* Pointer to product ID. */
-} OPB, *OPB_Ptr;
-#pragma pack()
-
-/*
- * SCB: adapter commands enabled by the host system started by writing
- * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO
- * register. (special case: | CMD_SYSTEM_IRQ for initialization)
- */
-#pragma pack(1)
-typedef struct {
-       u_int16_t CMD;          /* Command code */
-       u_int16_t Parm[2];      /* Pointer to Command Parameter Block */
-} SCB; /* System Command Block (32 bit physical address; big endian)*/
-#pragma pack()
-
-/*
- * SSB: adapter command return status can be evaluated after COMMAND_STATUS
- * adapter to system interrupt after reading SSB, the availability of the SSB
- * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR
- * in the SIFCMD IO register.
- */
-#pragma pack(1)
-typedef struct {
-       u_int16_t STS;          /* Status code */
-       u_int16_t Parm[3];      /* Parameter or pointer to Status Parameter
-                                * Block.
-                                */
-} SSB; /* System Status Block (big endian - physical address)  */
-#pragma pack()
-
-typedef struct {
-       unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in
-                                        * address. (BIA)
-                                        */
-       unsigned short SoftwareLevelPtr;/* Pointer to software level data. */
-       unsigned short AdapterAddrPtr;  /* Pointer to adapter addresses. */
-       unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */
-       unsigned short MACBufferPtr;    /* Pointer to MAC buffer. (internal) */
-       unsigned short LLCCountersPtr;  /* Pointer to LLC counters.  */
-       unsigned short SpeedFlagPtr;    /* Pointer to data rate flag.
-                                        * (4/16 Mbps)
-                                        */
-       unsigned short AdapterRAMPtr;   /* Pointer to adapter RAM found. (KB) */
-} INTPTRS;     /* Adapter internal pointers */
-
-#pragma pack(1)
-typedef struct {
-       u_int8_t  Line_Error;           /* Line error: code violation in
-                                        * frame or in a token, or FCS error.
-                                        */
-       u_int8_t  Internal_Error;       /* IBM specific. (Reserved_1) */
-       u_int8_t  Burst_Error;
-       u_int8_t  ARI_FCI_Error;        /* ARI/FCI bit zero in AMP or
-                                        * SMP MAC frame.
-                                        */
-       u_int8_t  AbortDelimeters;      /* IBM specific. (Reserved_2) */
-       u_int8_t  Reserved_3;
-       u_int8_t  Lost_Frame_Error;     /* Receive of end of transmitted
-                                        * frame failed.
-                                        */
-       u_int8_t  Rx_Congest_Error;     /* Adapter in repeat mode has not
-                                        * enough buffer space to copy incoming
-                                        * frame.
-                                        */
-       u_int8_t  Frame_Copied_Error;   /* ARI bit not zero in frame
-                                        * addressed to adapter.
-                                        */
-       u_int8_t  Frequency_Error;      /* IBM specific. (Reserved_4) */
-       u_int8_t  Token_Error;          /* (active only in monitor station) */
-       u_int8_t  Reserved_5;
-       u_int8_t  DMA_Bus_Error;        /* DMA bus errors not exceeding the
-                                        * abort thresholds.
-                                        */
-       u_int8_t  DMA_Parity_Error;     /* DMA parity errors not exceeding
-                                        * the abort thresholds.
-                                        */
-} ERRORTAB;    /* Adapter error counters */
-#pragma pack()
-
-
-/*--------------------- Send and Receive definitions -------------------*/
-#pragma pack(1)
-typedef struct {
-       __be16 DataCount;       /* Value 0, even and odd values are
-                                * permitted; value is unaltered most
-                                * significant bit set: following
-                                * fragments last fragment: most
-                                * significant bit is not evaluated.
-                                * (???)
-                                */
-       __be32 DataAddr;        /* Pointer to frame data fragment;
-                                * even or odd.
-                                */
-} Fragment;
-#pragma pack()
-
-#define MAX_FRAG_NUMBERS    9  /* Maximal number of fragments possible to use
-                                * in one RPL/TPL. (depending on TI firmware 
-                                * version)
-                                */
-
-/*
- * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504
- * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176,
- * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide
- * Page 2-27.
- */
-#define HEADER_SIZE            (1 + 1 + 6 + 6)
-#define SRC_SIZE               18
-#define MIN_DATA_SIZE          516
-#define DEFAULT_DATA_SIZE      4472
-#define MAX_DATA_SIZE          17800
-
-#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE)
-#define MIN_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE)
-#define MAX_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE)
-
-/*
- * Macros to deal with the frame status field.
- */
-#define AC_NOT_RECOGNIZED      0x00
-#define GROUP_BIT              0x80
-#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8))
-#define GET_FRAME_STATUS_HIGH_AC(Fs)     ((unsigned char)(((Fs) & 0xC0) >> 6))
-#define GET_FRAME_STATUS_LOW_AC(Fs)       ((unsigned char)(((Fs) & 0x0C) >> 2))
-#define DIRECTED_FRAME(Context)           (!((Context)->MData[2] & GROUP_BIT))
-
-
-/*--------------------- Send Functions ---------------------------------*/
-/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */
-
-#define TX_VALID               0x0080  /* R: set via TRANSMIT.VALID interrupt.
-                                        * C: always reset to zero!
-                                        */
-#define TX_FRAME_COMPLETE      0x0040  /* R: must be reset to zero.
-                                        * C: set to one.
-                                        */
-#define TX_START_FRAME         0x0020  /* R: start of a frame: 1 
-                                        * C: unchanged.
-                                        */
-#define TX_END_FRAME           0x0010  /* R: end of a frame: 1
-                                        * C: unchanged.
-                                        */
-#define TX_FRAME_IRQ           0x0008  /* R: request interrupt generation
-                                        * after transmission.
-                                        * C: unchanged.
-                                        */
-#define TX_ERROR               0x0004  /* R: reserved.
-                                        * C: set to one if Error occurred.
-                                        */
-#define TX_INTERFRAME_WAIT     0x0004
-#define TX_PASS_CRC            0x0002  /* R: set if CRC value is already
-                                        * calculated. (valid only in
-                                        * FRAME_START TPL)
-                                        * C: unchanged.
-                                        */
-#define TX_PASS_SRC_ADDR       0x0001  /* R: adapter uses explicit frame
-                                        * source address and does not overwrite
-                                        * with the adapter node address.
-                                        * (valid only in FRAME_START TPL)
-                                        *
-                                        * C: unchanged.
-                                        */
-#define TX_STRIP_FS            0xFF00  /* R: reserved.
-                                        * C: if no Transmission Error,
-                                        * field contains copy of FS byte after
-                                        * stripping of frame.
-                                        */
-
-/*
- * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL,
- * but possibly multiple TPLs for one frame) the length of the TPLs has to be
- * initialized in the OPL. (OPEN parameter list)
- */
-#define TPL_NUM                3       /* Number of Transmit Parameter Lists.
-                                * !! MUST BE >= 3 !!
-                                */
-
-#pragma pack(1)
-typedef struct s_TPL TPL;
-
-struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */
-       __be32 NextTPLAddr;             /* Pointer to next TPL in chain; if
-                                        * pointer is odd: this is the last
-                                        * TPL. Pointing to itself can cause
-                                        * problems!
-                                        */
-       volatile u_int16_t Status;      /* Initialized by the adapter:
-                                        * CSTAT_REQUEST important: update least
-                                        * significant bit first! Set by the
-                                        * adapter: CSTAT_COMPLETE status.
-                                        */
-       __be16 FrameSize;               /* Number of bytes to be transmitted
-                                        * as a frame including AC/FC,
-                                        * Destination, Source, Routing field
-                                        * not including CRC, FS, End Delimiter
-                                        * (valid only if START_FRAME bit in 
-                                        * CSTAT nonzero) must not be zero in
-                                        * any list; maximum value: (BUFFER_SIZE
-                                        * - 8) * TX_BUF_MAX sum of DataCount
-                                        * values in FragmentList must equal
-                                        * Frame_Size value in START_FRAME TPL!
-                                        * frame data fragment list.
-                                        */
-
-       /* TPL/RPL size in OPEN parameter list depending on maximal
-        * numbers of fragments used in one parameter list.
-        */
-       Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one
-                                        * TPL actual version of firmware: 9
-                                        * fragments possible.
-                                        */
-#pragma pack()
-
-       /* Special proprietary data and precalculations */
-
-       TPL *NextTPLPtr;                /* Pointer to next TPL in chain. */
-       unsigned char *MData;
-       struct sk_buff *Skb;
-       unsigned char TPLIndex;
-       volatile unsigned char BusyFlag;/* Flag: TPL busy? */
-       dma_addr_t DMABuff;             /* DMA IO bus address from dma_map */
-};
-
-/* ---------------------Receive Functions-------------------------------*
- * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values.
- * (high-low)
- */
-#define RX_VALID               0x0080  /* R: set; tell adapter with
-                                        * RECEIVE.VALID interrupt.
-                                        * C: reset to zero.
-                                        */
-#define RX_FRAME_COMPLETE      0x0040  /* R: must be reset to zero,
-                                        * C: set to one.
-                                        */
-#define RX_START_FRAME         0x0020  /* R: must be reset to zero.
-                                        * C: set to one on the list.
-                                        */
-#define RX_END_FRAME           0x0010  /* R: must be reset to zero.
-                                        * C: set to one on the list
-                                        * that ends the frame.
-                                        */
-#define RX_FRAME_IRQ           0x0008  /* R: request interrupt generation
-                                        * after receive.
-                                        * C: unchanged.
-                                        */
-#define RX_INTERFRAME_WAIT     0x0004  /* R: after receiving a frame:
-                                        * interrupt and wait for a
-                                        * RECEIVE.CONTINUE.
-                                        * C: unchanged.
-                                        */
-#define RX_PASS_CRC            0x0002  /* R: if set, the adapter includes
-                                        * the CRC in data passed. (last four 
-                                        * bytes; valid only if FRAME_START is
-                                        * set)
-                                        * C: set, if CRC is included in
-                                        * received data.
-                                        */
-#define RX_PASS_SRC_ADDR       0x0001  /* R: adapter uses explicit frame
-                                        * source address and does not
-                                        * overwrite with the adapter node
-                                        * address. (valid only if FRAME_START
-                                        * is set)
-                                        * C: unchanged.
-                                        */
-#define RX_RECEIVE_FS          0xFC00  /* R: reserved; must be reset to zero.
-                                        * C: on lists with START_FRAME, field
-                                        * contains frame status field from
-                                        * received frame; otherwise cleared.
-                                        */
-#define RX_ADDR_MATCH          0x0300  /* R: reserved; must be reset to zero.
-                                        * C: address match code mask.
-                                        */ 
-#define RX_STATUS_MASK         0x00FF  /* Mask for receive status bits. */
-
-#define RX_INTERN_ADDR_MATCH    0x0100  /* C: internally address match. */
-#define RX_EXTERN_ADDR_MATCH    0x0200  /* C: externally matched via
-                                        * XMATCH/XFAIL interface.
-                                        */
-#define RX_INTEXT_ADDR_MATCH    0x0300  /* C: internally and externally
-                                        * matched.
-                                        */
-#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */
-
-/* Constants for Command Status Interrupt.
- * COMMAND_REJECT status field bit functions (SSB.Parm[0])
- */
-#define ILLEGAL_COMMAND                0x0080  /* Set if an unknown command
-                                        * is issued to the adapter
-                                        */
-#define ADDRESS_ERROR          0x0040  /* Set if any address field in
-                                        * the SCB is odd. (not word aligned)
-                                        */
-#define ADAPTER_OPEN           0x0020  /* Command issued illegal with
-                                        * open adapter.
-                                        */
-#define ADAPTER_CLOSE          0x0010  /* Command issued illegal with
-                                        * closed adapter.
-                                        */
-#define SAME_COMMAND           0x0008  /* Command issued with same command
-                                        * already executing.
-                                        */
-
-/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */
-#define NODE_ADDR_ERROR                0x0040  /* Wrong address or BIA read
-                                        * zero address.
-                                        */
-#define LIST_SIZE_ERROR                0x0020  /* If List_Size value not in 0,
-                                        * 14, 20, 26.
-                                        */
-#define BUF_SIZE_ERROR         0x0010  /* Not enough available memory for
-                                        * two buffers.
-                                        */
-#define TX_BUF_COUNT_ERROR     0x0004  /* Remaining receive buffers less than
-                                        * two.
-                                        */
-#define OPEN_ERROR             0x0002  /* Error during ring insertion; more
-                                        * information in bits 8-15.
-                                        */
-
-/* Standard return codes */
-#define GOOD_COMPLETION                0x0080  /* =OPEN_SUCCESSFULL */
-#define INVALID_OPEN_OPTION    0x0001  /* OPEN options are not supported by
-                                        * the adapter.
-                                        */
-
-/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB)            */
-#define OPEN_PHASES_MASK            0xF000  /* Check only the bits 8-11. */
-#define LOBE_MEDIA_TEST             0x1000
-#define PHYSICAL_INSERTION          0x2000
-#define ADDRESS_VERIFICATION        0x3000
-#define PARTICIPATION_IN_RING_POLL  0x4000
-#define REQUEST_INITIALISATION      0x5000
-#define FULLDUPLEX_CHECK            0x6000
-
-/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */
-#define OPEN_ERROR_CODES_MASK  0x0F00  /* Check only the bits 12-15. */
-#define OPEN_FUNCTION_FAILURE   0x0100  /* Unable to transmit to itself or
-                                        * frames received before insertion.
-                                        */
-#define OPEN_SIGNAL_LOSS       0x0200  /* Signal loss condition detected at
-                                        * receiver.
-                                        */
-#define OPEN_TIMEOUT           0x0500  /* Insertion timer expired before
-                                        * logical insertion.
-                                        */
-#define OPEN_RING_FAILURE      0x0600  /* Unable to receive own ring purge
-                                        * MAC frames.
-                                        */
-#define OPEN_RING_BEACONING    0x0700  /* Beacon MAC frame received after
-                                        * ring insertion.
-                                        */
-#define OPEN_DUPLICATE_NODEADDR        0x0800  /* Other station in ring found
-                                        * with the same address.
-                                        */
-#define OPEN_REQUEST_INIT      0x0900  /* RPS present but does not respond. */
-#define OPEN_REMOVE_RECEIVED    0x0A00  /* Adapter received a remove adapter
-                                        * MAC frame.
-                                        */
-#define OPEN_FULLDUPLEX_SET    0x0D00  /* Got this with full duplex on when
-                                        * trying to connect to a normal ring.
-                                        */
-
-/* SET_BRIDGE_PARMS return codes: */
-#define BRIDGE_INVALID_MAX_LEN  0x4000  /* MAX_ROUTING_FIELD_LENGTH odd,
-                                        * less than 6 or > 30.
-                                        */
-#define BRIDGE_INVALID_SRC_RING 0x2000  /* SOURCE_RING number zero, too large
-                                        * or = TARGET_RING.
-                                        */
-#define BRIDGE_INVALID_TRG_RING 0x1000  /* TARGET_RING number zero, too large
-                                        * or = SOURCE_RING.
-                                        */
-#define BRIDGE_INVALID_BRDGE_NO 0x0800  /* BRIDGE_NUMBER too large. */
-#define BRIDGE_INVALID_OPTIONS  0x0400  /* Invalid bridge options. */
-#define BRIDGE_DIAGS_FAILED     0x0200  /* Diagnostics of TMS380SRA failed. */
-#define BRIDGE_NO_SRA           0x0100  /* The TMS380SRA does not exist in HW
-                                        * configuration.
-                                        */
-
-/*
- * Bring Up Diagnostics error codes.
- */
-#define BUD_INITIAL_ERROR       0x0
-#define BUD_CHECKSUM_ERROR      0x1
-#define BUD_ADAPTER_RAM_ERROR   0x2
-#define BUD_INSTRUCTION_ERROR   0x3
-#define BUD_CONTEXT_ERROR       0x4
-#define BUD_PROTOCOL_ERROR      0x5
-#define BUD_INTERFACE_ERROR    0x6
-
-/* BUD constants */
-#define BUD_MAX_RETRIES         3
-#define BUD_MAX_LOOPCNT         6
-#define BUD_TIMEOUT             3000
-
-/* Initialization constants */
-#define INIT_MAX_RETRIES        3      /* Maximum three retries. */
-#define INIT_MAX_LOOPCNT        22      /* Maximum loop counts. */
-
-/* RING STATUS field values (high/low) */
-#define SIGNAL_LOSS             0x0080  /* Loss of signal on the ring
-                                        * detected.
-                                        */
-#define HARD_ERROR              0x0040  /* Transmitting or receiving beacon
-                                        * frames.
-                                        */
-#define SOFT_ERROR              0x0020  /* Report error MAC frame
-                                        * transmitted.
-                                        */
-#define TRANSMIT_BEACON         0x0010  /* Transmitting beacon frames on the
-                                        * ring.
-                                        */
-#define LOBE_WIRE_FAULT         0x0008  /* Open or short circuit in the
-                                        * cable to concentrator; adapter
-                                        * closed.
-                                        */
-#define AUTO_REMOVAL_ERROR      0x0004  /* Lobe wrap test failed, deinserted;
-                                        * adapter closed.
-                                        */
-#define REMOVE_RECEIVED         0x0001  /* Received a remove ring station MAC
-                                        * MAC frame request; adapter closed.
-                                        */
-#define COUNTER_OVERFLOW        0x8000  /* Overflow of one of the adapters
-                                        * error counters; READ.ERROR.LOG.
-                                        */
-#define SINGLE_STATION          0x4000  /* Adapter is the only station on the
-                                        * ring.
-                                        */
-#define RING_RECOVERY           0x2000  /* Claim token MAC frames on the ring;
-                                        * reset after ring purge frame.
-                                        */
-
-#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\
-                        REMOVE_RECEIVED)
-
-/* Adapter_check_block.Status field bit assignments: */
-#define DIO_PARITY              0x8000  /* Adapter detects bad parity
-                                        * through direct I/O access.
-                                        */
-#define DMA_READ_ABORT          0x4000  /* Aborting DMA read operation
-                                        * from system Parm[0]: 0=timeout,
-                                        * 1=parity error, 2=bus error;
-                                        * Parm[1]: 32 bit pointer to host
-                                        * system address at failure.
-                                        */
-#define DMA_WRITE_ABORT         0x2000  /* Aborting DMA write operation
-                                        * to system. (parameters analogous to
-                                        * DMA_READ_ABORT)
-                                        */
-#define ILLEGAL_OP_CODE         0x1000  /* Illegal operation code in the
-                                        * the adapters firmware Parm[0]-2:
-                                        * communications processor registers
-                                        * R13-R15.
-                                        */
-#define PARITY_ERRORS           0x0800  /* Adapter detects internal bus
-                                        * parity error.
-                                        */
-#define RAM_DATA_ERROR          0x0080  /* Valid only during RAM testing;
-                                        * RAM data error Parm[0-1]: 32 bit
-                                        * pointer to RAM location.
-                                        */
-#define RAM_PARITY_ERROR        0x0040  /* Valid only during RAM testing;
-                                        * RAM parity error Parm[0-1]: 32 bit
-                                        * pointer to RAM location.
-                                        */
-#define RING_UNDERRUN           0x0020  /* Internal DMA underrun when
-                                        * transmitting onto ring.
-                                        */
-#define INVALID_IRQ             0x0008  /* Unrecognized interrupt generated
-                                        * internal to adapter Parm[0-2]:
-                                        * adapter register R13-R15.
-                                        */
-#define INVALID_ERROR_IRQ       0x0004  /* Unrecognized error interrupt
-                                        * generated Parm[0-2]: adapter register
-                                        * R13-R15.
-                                        */
-#define INVALID_XOP             0x0002  /* Unrecognized XOP request in
-                                        * communication processor Parm[0-2]:
-                                        * adapter register R13-R15.
-                                        */
-#define CHECKADDR               0x05E0  /* Adapter check status information
-                                        * address offset.
-                                        */
-#define ROM_PAGE_0              0x0000  /* Adapter ROM page 0. */
-
-/*
- * RECEIVE.STATUS interrupt result SSB values: (high-low)
- * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0])
- */
-#define RX_COMPLETE             0x0080  /* SSB.Parm[0]; SSB.Parm[1]: 32
-                                        * bit pointer to last RPL.
-                                        */
-#define RX_SUSPENDED            0x0040  /* SSB.Parm[0]; SSB.Parm[1]: 32
-                                        * bit pointer to RPL with odd
-                                        * forward pointer.
-                                        */
-
-/* Valid receive CSTAT: */
-#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \
-                              RX_FRAME_COMPLETE)
-#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \
-                                  RX_FRAME_COMPLETE)
-
-typedef enum SKB_STAT SKB_STAT;
-enum SKB_STAT {
-       SKB_UNAVAILABLE,
-       SKB_DMA_DIRECT,
-       SKB_DATA_COPY
-};
-
-/* Receive Parameter List (RPL) The length of the RPLs has to be initialized 
- * in the OPL. (OPEN parameter list)
- */
-#define RPL_NUM                3
-
-#define RX_FRAG_NUM     1      /* Maximal number of used fragments in one RPL.
-                                * (up to firmware v2.24: 3, now: up to 9)
-                                */
-
-#pragma pack(1)
-typedef struct s_RPL RPL;
-struct s_RPL { /* Receive Parameter List */
-       __be32 NextRPLAddr;             /* Pointer to next RPL in chain
-                                        * (normalized = physical 32 bit
-                                        * address) if pointer is odd: this
-                                        * is last RPL. Pointing to itself can
-                                        * cause problems!
-                                        */
-       volatile u_int16_t Status;      /* Set by creation of Receive Parameter
-                                        * List RECEIVE_CSTAT_COMPLETE set by
-                                        * adapter in lists that start or end
-                                        * a frame.
-                                        */
-       volatile __be16 FrameSize;       /* Number of bytes received as a
-                                        * frame including AC/FC, Destination,
-                                        * Source, Routing field not including 
-                                        * CRC, FS (Frame Status), End Delimiter
-                                        * (valid only if START_FRAME bit in 
-                                        * CSTAT nonzero) must not be zero in
-                                        * any list; maximum value: (BUFFER_SIZE
-                                        * - 8) * TX_BUF_MAX sum of DataCount
-                                        * values in FragmentList must equal
-                                        * Frame_Size value in START_FRAME TPL!
-                                        * frame data fragment list
-                                        */
-
-       /* TPL/RPL size in OPEN parameter list depending on maximal numbers
-        * of fragments used in one parameter list.
-        */
-       Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in
-                                        * one TPL. Actual version of firmware:
-                                        * 9 fragments possible.
-                                        */
-#pragma pack()
-
-       /* Special proprietary data and precalculations. */
-       RPL *NextRPLPtr;        /* Logical pointer to next RPL in chain. */
-       unsigned char *MData;
-       struct sk_buff *Skb;
-       SKB_STAT SkbStat;
-       int RPLIndex;
-       dma_addr_t DMABuff;             /* DMA IO bus address from dma_map */
-};
-
-/* Information that need to be kept for each board. */
-typedef struct net_local {
-#pragma pack(1)
-       IPB ipb;        /* Initialization Parameter Block. */
-       SCB scb;        /* System Command Block: system to adapter 
-                        * communication.
-                        */
-       SSB ssb;        /* System Status Block: adapter to system 
-                        * communication.
-                        */
-       OPB ocpl;       /* Open Options Parameter Block. */
-
-       ERRORTAB errorlogtable; /* Adapter statistic error counters.
-                                * (read from adapter memory)
-                                */
-       unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */
-#pragma pack()
-
-       TPL Tpl[TPL_NUM];
-       TPL *TplFree;
-       TPL *TplBusy;
-       unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE];
-
-       RPL Rpl[RPL_NUM];
-       RPL *RplHead;
-       RPL *RplTail;
-       unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE];
-
-       struct device *pdev;
-       int DataRate;
-       unsigned char ScbInUse;
-       unsigned short CMDqueue;
-
-       unsigned long AdapterOpenFlag:1;
-       unsigned long AdapterVirtOpenFlag:1;
-       unsigned long OpenCommandIssued:1;
-       unsigned long TransmitCommandActive:1;
-       unsigned long TransmitHaltScheduled:1;
-       unsigned long HaltInProgress:1;
-       unsigned long LobeWireFaultLogged:1;
-       unsigned long ReOpenInProgress:1;
-       unsigned long Sleeping:1;
-
-       unsigned long LastOpenStatus;
-       unsigned short CurrentRingStatus;
-       unsigned long MaxPacketSize;
-       
-       unsigned long StartTime;
-       unsigned long LastSendTime;
-
-       struct tr_statistics MacStat;   /* MAC statistics structure */
-
-       unsigned long dmalimit; /* the max DMA address (ie, ISA) */
-       dma_addr_t    dmabuffer; /* the DMA bus address corresponding to
-                                   priv. Might be different from virt_to_bus()
-                                   for architectures with IO MMU (Alpha) */
-
-       struct timer_list timer;
-
-       wait_queue_head_t  wait_for_tok_int;
-
-       INTPTRS intptrs;        /* Internal adapter pointer. Must be read
-                                * before OPEN command.
-                                */
-       unsigned short (*setnselout)(struct net_device *);
-       unsigned short (*sifreadb)(struct net_device *, unsigned short);
-       void (*sifwriteb)(struct net_device *, unsigned short, unsigned short);
-       unsigned short (*sifreadw)(struct net_device *, unsigned short);
-       void (*sifwritew)(struct net_device *, unsigned short, unsigned short);
-
-       spinlock_t lock;                /* SMP protection */
-       void *tmspriv;
-} NET_LOCAL;
-
-#endif /* __KERNEL__ */
-#endif /* __LINUX_TMS380TR_H */
diff --git a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c
deleted file mode 100644 (file)
index 90f3fa4..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *  tmspci.c: A generic network driver for TMS380-based PCI token ring cards.
- *
- *  Written 1999 by Adam Fritzler
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU General Public License, incorporated herein by reference.
- *
- *  This driver module supports the following cards:
- *     - SysKonnect TR4/16(+) PCI      (SK-4590)
- *     - SysKonnect TR4/16 PCI         (SK-4591)
- *      - Compaq TR 4/16 PCI
- *      - Thomas-Conrad TC4048 4/16 PCI 
- *      - 3Com 3C339 Token Link Velocity
- *
- *  Maintainer(s):
- *    AF       Adam Fritzler
- *
- *  Modification History:
- *     30-Dec-99       AF      Split off from the tms380tr driver.
- *     22-Jan-00       AF      Updated to use indirect read/writes
- *     23-Nov-00       JG      New PCI API, cleanups
- *
- *  TODO:
- *     1. See if we can use MMIO instead of port accesses
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include "tms380tr.h"
-
-static char version[] __devinitdata =
-"tmspci.c: v1.02 23/11/2000 by Adam Fritzler\n";
-
-#define TMS_PCI_IO_EXTENT 32
-
-struct card_info {
-       unsigned char nselout[2]; /* NSELOUT vals for 4mb([0]) and 16mb([1]) */
-       char *name;
-};
-
-static struct card_info card_info_table[] = {
-       { {0x03, 0x01}, "Compaq 4/16 TR PCI"},
-       { {0x03, 0x01}, "SK NET TR 4/16 PCI"},
-       { {0x03, 0x01}, "Thomas-Conrad TC4048 PCI 4/16"},
-       { {0x03, 0x01}, "3Com Token Link Velocity"},
-};
-
-static DEFINE_PCI_DEVICE_TABLE(tmspci_pci_tbl) = {
-       { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_TOKENRING, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-       { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_TR, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
-       { PCI_VENDOR_ID_TCONRAD, PCI_DEVICE_ID_TCONRAD_TOKENRING, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
-       { PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C339, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
-       { }                     /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(pci, tmspci_pci_tbl);
-
-MODULE_LICENSE("GPL");
-
-static void tms_pci_read_eeprom(struct net_device *dev);
-static unsigned short tms_pci_setnselout_pins(struct net_device *dev);
-
-static unsigned short tms_pci_sifreadb(struct net_device *dev, unsigned short reg)
-{
-       return inb(dev->base_addr + reg);
-}
-
-static unsigned short tms_pci_sifreadw(struct net_device *dev, unsigned short reg)
-{
-       return inw(dev->base_addr + reg);
-}
-
-static void tms_pci_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outb(val, dev->base_addr + reg);
-}
-
-static void tms_pci_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
-{
-       outw(val, dev->base_addr + reg);
-}
-
-static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_device_id *ent)
-{      
-       static int versionprinted;
-       struct net_device *dev;
-       struct net_local *tp;
-       int ret;
-       unsigned int pci_irq_line;
-       unsigned long pci_ioaddr;
-       struct card_info *cardinfo = &card_info_table[ent->driver_data];
-
-       if (versionprinted++ == 0)
-               printk("%s", version);
-
-       if (pci_enable_device(pdev))
-               return -EIO;
-
-       /* Remove I/O space marker in bit 0. */
-       pci_irq_line = pdev->irq;
-       pci_ioaddr = pci_resource_start (pdev, 0);
-
-       /* At this point we have found a valid card. */
-       dev = alloc_trdev(sizeof(struct net_local));
-       if (!dev)
-               return -ENOMEM;
-
-       if (!request_region(pci_ioaddr, TMS_PCI_IO_EXTENT, dev->name)) {
-               ret = -EBUSY;
-               goto err_out_trdev;
-       }
-
-       dev->base_addr  = pci_ioaddr;
-       dev->irq        = pci_irq_line;
-       dev->dma        = 0;
-
-       dev_info(&pdev->dev, "%s\n", cardinfo->name);
-       dev_info(&pdev->dev, "    IO: %#4lx  IRQ: %d\n", dev->base_addr, dev->irq);
-               
-       tms_pci_read_eeprom(dev);
-
-       dev_info(&pdev->dev, "    Ring Station Address: %pM\n", dev->dev_addr);
-               
-       ret = tmsdev_init(dev, &pdev->dev);
-       if (ret) {
-               dev_info(&pdev->dev, "unable to get memory for dev->priv.\n");
-               goto err_out_region;
-       }
-
-       tp = netdev_priv(dev);
-       tp->setnselout = tms_pci_setnselout_pins;
-               
-       tp->sifreadb = tms_pci_sifreadb;
-       tp->sifreadw = tms_pci_sifreadw;
-       tp->sifwriteb = tms_pci_sifwriteb;
-       tp->sifwritew = tms_pci_sifwritew;
-               
-       memcpy(tp->ProductID, cardinfo->name, PROD_ID_SIZE + 1);
-
-       tp->tmspriv = cardinfo;
-
-       dev->netdev_ops = &tms380tr_netdev_ops;
-
-       ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
-                         dev->name, dev);
-       if (ret)
-               goto err_out_tmsdev;
-
-       pci_set_drvdata(pdev, dev);
-       SET_NETDEV_DEV(dev, &pdev->dev);
-
-       ret = register_netdev(dev);
-       if (ret)
-               goto err_out_irq;
-       
-       return 0;
-
-err_out_irq:
-       free_irq(pdev->irq, dev);
-err_out_tmsdev:
-       pci_set_drvdata(pdev, NULL);
-       tmsdev_term(dev);
-err_out_region:
-       release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
-err_out_trdev:
-       free_netdev(dev);
-       return ret;
-}
-
-/*
- * Reads MAC address from adapter RAM, which should've read it from
- * the onboard ROM.  
- *
- * Calling this on a board that does not support it can be a very
- * dangerous thing.  The Madge board, for instance, will lock your
- * machine hard when this is called.  Luckily, its supported in a
- * separate driver.  --ASF
- */
-static void tms_pci_read_eeprom(struct net_device *dev)
-{
-       int i;
-       
-       /* Address: 0000:0000 */
-       tms_pci_sifwritew(dev, 0, SIFADX);
-       tms_pci_sifwritew(dev, 0, SIFADR);      
-       
-       /* Read six byte MAC address data */
-       dev->addr_len = 6;
-       for(i = 0; i < 6; i++)
-               dev->dev_addr[i] = tms_pci_sifreadw(dev, SIFINC) >> 8;
-}
-
-static unsigned short tms_pci_setnselout_pins(struct net_device *dev)
-{
-       unsigned short val = 0;
-       struct net_local *tp = netdev_priv(dev);
-       struct card_info *cardinfo = tp->tmspriv;
-  
-       if(tp->DataRate == SPEED_4)
-               val |= cardinfo->nselout[0];    /* Set 4Mbps */
-       else
-               val |= cardinfo->nselout[1];    /* Set 16Mbps */
-       return val;
-}
-
-static void __devexit tms_pci_detach (struct pci_dev *pdev)
-{
-       struct net_device *dev = pci_get_drvdata(pdev);
-
-       BUG_ON(!dev);
-       unregister_netdev(dev);
-       release_region(dev->base_addr, TMS_PCI_IO_EXTENT);
-       free_irq(dev->irq, dev);
-       tmsdev_term(dev);
-       free_netdev(dev);
-       pci_set_drvdata(pdev, NULL);
-}
-
-static struct pci_driver tms_pci_driver = {
-       .name           = "tmspci",
-       .id_table       = tmspci_pci_tbl,
-       .probe          = tms_pci_attach,
-       .remove         = __devexit_p(tms_pci_detach),
-};
-
-module_pci_driver(tms_pci_driver);
diff --git a/firmware/3com/3C359.bin.ihex b/firmware/3com/3C359.bin.ihex
deleted file mode 100644 (file)
index 781bac3..0000000
+++ /dev/null
@@ -1,1573 +0,0 @@
-:10000000FE3A0000000000000000000000000000B8
-:1000100000000000000000000000000000000000E0
-:1000200000000000000000000000000000000000D0
-:1000300000000000000000000000000000000000C0
-:1000400000000000000030332F30322F39392031CA
-:10005000373A3133000000000000000000000000CB
-:1000600030313233343536373839414243444546EE
-:10007000000007FF0200FE9F0600007C48000070A1
-:100080008200FFFF8600FFFF8800FFFF9A00FFFF4E
-:10009000FFFF1100C000FFFFFFFF11223344556630
-:1000A00033434F4D20424142451140C000FFFFFF06
-:1000B000FF1122334455665374617274206F6620B9
-:1000C0004C4C43206672616D652E2020546F746124
-:1000D0006C20646174612073697A6520697320788B
-:1000E000787820202042414245E8D201833EF7340F
-:1000F000007521E84100833EF734007517E882005F
-:10010000833EF73400750DE8BF00833EF734007579
-:1001100003E84102C31EB800F08ED833F6B9008060
-:1001200033DBAD03D8E2FB1FB8000083FB00740390
-:10013000B82200A3F734C3FABA5600B0FFEE33C0BA
-:100140008EC033F6B9FF7F833EFF340074088D3EC6
-:100150003061D1EF2BCF268B1C26C704FFFF2683EF
-:100160003CFF751726C704000026833C00750C264B
-:10017000891C4646E2E0B80000EB03B82400A3F770
-:1001800034C3FAB4D79E733A753879367B349FB14D
-:1001900005D2EC732DB040D0E071277925D0E07303
-:1001A000217B1F32C0751B32E49E721674147812C4
-:1001B0007A109FD2EC720BD0E470077505B800007E
-:1001C000EB03B82600A3F734C3FABA5A0033C0EFE2
-:1001D000EFEFEFB000E656B000E654BA5200B801B7
-:1001E00001EFE8CA003C01757FE88300BA5200B80D
-:1001F0000202EFE8B9003C02756EE87A00BA5200DC
-:10020000B80404EFE8A8003C04755DE87100BA5238
-:1002100000B80808EFE897003C08754CE86800BA99
-:100220005200B81010EFE886003C10753BE85F0004
-:10023000BA5200B82020EFE875003C20752AE85635
-:1002400000BA5200B84040EFE864003C407519E83D
-:100250004D00BA5200B88080EFE853003C8075082A
-:10026000E84400B80000EB03B82800A3F734C3BA91
-:100270005A00B80080EFC3BA5A00B80180EFC3BA81
-:100280005A00B80280EFC3BA5A00B80380EFC3BA6D
-:100290005A00B80480EFC3BA5A00B80580EFC3BA59
-:1002A0005A00B80680EFC3BA5A00B80780EFC3B946
-:1002B000FFFFE458E4543C0075034975F7C3FA3274
-:1002C000C0E656E4563C007403E98200B0FFE656EF
-:1002D000E4563CFF7578BA5200B8FFFFEFED3CFFE3
-:1002E000756CB800FFEFED3C007563B0FFE654E4B9
-:1002F000543CFF755932C0E654E4543C00754FB08D
-:100300000FE650E450240F3C0F7543B000E650E474
-:1003100050240F3C0075378CC88EC0BE7000268BF1
-:1003200014268B5C02B80000EFED23C33D0000757E
-:100330001DB8FFFF23C3EF8BC8ED23C33BC1750E70
-:1003400083C60426833CFF75D5B80000EB03B82AAA
-:1003500000A3F734C3FA33C0BF0020B91700F3ABD2
-:10036000BF0030B91700F3ABBF0022B94000F3ABB8
-:10037000BF0032B94000F3ABFC1E8CC88ED833C02E
-:100380008EC0BE9200BF0020B91700F3A4BEA90022
-:10039000BF0022B94000F3A41FC706FB346400BAB3
-:1003A0000800B80F00EFE88201E89B01720DC70654
-:1003B000F7342C00C706F9340400C3BA0A0033C06E
-:1003C000EFE89801E8B501B81700BA9C00EFB80053
-:1003D00010BA9A00EFB81700A90100740140BA8C56
-:1003E00000EFB80018BA8600EFB80C00BA8200EF30
-:1003F000BA0200ED25F9FF0D0200EFBA060033C086
-:10040000EFBA0400B86000EFBA0000B81800EFBA05
-:100410008000B9FFFFEDA901007504E2F8EB3EBAD8
-:100420000A00EDA900407435A90020743033C0EFF4
-:1004300051B9C800E2FE591E061F268B0E023083FA
-:10044000F91775184949BE0220BF0630F3A61F23CD
-:10045000C9750AFF0EFB347412E94DFF1FB82C005A
-:10046000BB0000A3F734891EF934C3C706FB34640C
-:1004700000E8D300720DC706F7342C00C706F93424
-:100480000400C3E8D600E8F300B80300BA8200EF26
-:10049000B84080BA9800EFB80011BA9600EFB840A3
-:1004A00000A90100740140BA9200EFB80019BA8E99
-:1004B00000EFBA0200ED25F9FF0D0600EFBA0600C5
-:1004C00033C0EFBA0000B81800EFBA8000B9FFFFE0
-:1004D000EDA920007504E2F8EB43BA0A00EDA9008B
-:1004E00040743AA90020743533C0EF51B9C800E216
-:1004F000FE591E061F268B0E023283F940751D49D8
-:1005000049BE0222BF0632F3A61F23C9750FFF0E94
-:10051000FB347403E95AFFB80000EB0B1FB82C0042
-:10052000BB0200891EF934A3F734C3BA0200B80035
-:100530009CEFBA0000B80084EF33C0EFBA0A00EFB6
-:10054000BA0E0033C0EFC3BA0A00B9FFFFED2500B1
-:10055000603D00607404E2F5F8C3F9C3B000E656EC
-:10056000B800FFBA5200EFB9FFFFBA5800ED25EF0F
-:10057000007408BA5A0033C0EFE2EFC3BA8000ED4E
-:10058000BA8400EFBA8000EDC30000000000000054
-:10059000C606EC341533C08ED88EC01E8CC8BE4043
-:1005A00054BF60FE8ED8B91000F3A41FC706803672
-:1005B0001035C7068C3630358D063835A33035A357
-:1005C0003235053301A33435C70636355001C70629
-:1005D000843680FEC7068836C0FEC606C2FEFFC649
-:1005E00006933680C606923600C60680FE80C70691
-:1005F00082FE5450C70684FE2B4DE5CEA90200753D
-:1006000008C60681FE23E90500C60681FE22A1F781
-:1006100034A386FEB8483486E0A388FE8D064E34A7
-:1006200086E0A38AFEB8583486E0A38CFEB89C34DA
-:1006300086E0A38EFE8D06200386E0A390FE33C0E5
-:10064000BA7200EF33C0BA7400EFBA7600EFB88028
-:10065000FE86E0BA7200EFE8BF07BA0C01B840406E
-:10066000EFEDBA6A00B80300C1E0080D0300EFB96E
-:100670000A00E89400BA6A00B80300C1E008EFA1DC
-:100680003234A3A233C706A63304008D06A033C1BB
-:10069000E804CD39C7069036FFFFE9E300630D6635
-:1006A0000D660D8A0DE60E75122E0F030F500F60AA
-:1006B0000D600D600DED0FE912600D600D600D60B5
-:1006C0000D600D2210600D600D600D600DFE10605C
-:1006D0000D600D600D600D600D600DAF0F321037B5
-:1006E0000D600D600D600D600D600D600D600D60A2
-:1006F0000D600D600D600D600D600D600D600D6092
-:100700000D640E000F9509600A49BBFFFFBA6A002D
-:10071000EDA900207438803E80FE127531E84A0051
-:10072000A13234A3A233C706A63304008D06A0333A
-:10073000C1E804CD39E82200C706F3344600C706F5
-:10074000F534FFFFC7069036FFFF58E932004B83B0
-:10075000FB0075B983F90075B0C352BA6A00B803DB
-:1007600000C1E0080D0300EF5AC352BA6A00B80393
-:1007700000C1E008EF5AC3000000000000000000C4
-:10078000688007A19036CD358B3624022EFFA43524
-:100790000AFA8A2694368826E834C606943600FB80
-:1007A00022E47501C3F6C420747DF6C40874058084
-:1007B0000E9236048026E834D7C41E8436268B3742
-:1007C00081E6FF0083FE207605B001E9280053068C
-:1007D000D1E62EFF949D06075B268847023CFF74F6
-:1007E000073CFE7511E93B00F6069236087534F6B3
-:1007F00006923604742D80269236F3803E9536009C
-:10080000752126803F057513C60695360026807F24
-:1008100006007407268B4704A29536BA0C01B8402F
-:1008200040EFED8A26E834F6C4107503E95B00F664
-:10083000C4047405800E9236018026E834EBC43E71
-:100840008836268B3583E67F83FE12720826C645DE
-:100850000201E9240083C620D1E62EFF949D06C440
-:100860003E8836268845023CFF750EF60692360114
-:100870007414F606923602750D80269236FCBA0C78
-:1008800001B82020EFED8A26E834F6C408742280EF
-:1008900026E834F7800E923604F606923608741174
-:1008A00080269236F3BA0C01B84040EFED8A26E874
-:1008B00034F6C40474228026E834FB800E9236019C
-:1008C000F606923602751180269236FEBA0C01B8F1
-:1008D0002020EFED8A26E834F6C40174678026E80C
-:1008E00034FE803EE8FF007439803EE8FF04743235
-:1008F000803EE8FF017521E580A90007740ABA9ED1
-:1009000000B80002EFE9EFFFC606E8FF03BA0C01EA
-:10091000B80808EFEDE92800803EE8FF037406E917
-:100920001E00E90000BA1001B80202EFEDE5000D6B
-:100930001800E700E5820D0200E782C606E8FF0422
-:100940008A26E834F6C402740D8026E834FD802639
-:100950009236BFE84F0BFAA0E83408069436C60674
-:10096000E83400FBC3E8E70FC41E84362EFF1601EF
-:100970000726884702E97EFEE82D10C41E84362E25
-:10098000FF16030726884702E96BFE8E0626022E15
-:10099000FF160707C3C3833EF53400740FFF0EF341
-:1009A000347509E8C4FDC706F5340000F606933631
-:1009B000207430A1C2343B06E934A3E934742480A6
-:1009C0003E953600751DF706E63420007412A92006
-:1009D00000740D8326C234DF8326E934DFE9030087
-:1009E000E8DD09BA0601ED8BD081E200C0C1EA0E54
-:1009F00003167434C1E002110672347304FF0674E6
-:100A000034BA0201ED8BD081E200C0C1EA0E0316B8
-:100A10007034C1E00211066E347304FF067034C7EF
-:100A200006A6330400C706AA3300008D06A033C112
-:100A3000E804CD39C39509950965097809950995A3
-:100A4000099107950996098B0995099509950995C5
-:100A500009950995098BC08BC08BC08BC08BC0904A
-:100A6000F6069336207503E9CC008CC0408EC02674
-:100A70008B0E060086E926890E06008CC2C1E204B0
-:100A8000BE0E0026A10400D0E024C08AE0C0EC0421
-:100A90000AC426A2050026A10800A900C07403E923
-:100AA0009E0026F6061000807503E90A0026A016AF
-:100AB00000241F32E403F0803EEC3406725C803E7A
-:100AC00095360075668BFA33DB8EC326891D268822
-:100AD0005D045150C41E8C36B90F0033C0E82109A3
-:100AE00058590BDB7434FE0EE63A26C6078126C63B
-:100AF00047010026C64702FF26C747040000268993
-:100B00004F0A86F2268957062689770826C647099E
-:100B10000026C6470C02E88C09C3FF06EC338CC0E4
-:100B2000488EC0FAE89710FBE9EBFF8CC0488EC0F6
-:100B3000FAE88A10FBC38CC08EC0FAE88010FBC3B1
-:100B4000803E9536007503E9C200BF080026F60610
-:100B5000100080750503FEE90C0026A01600241F76
-:100B600032E403F003FEA095363C007503E99C00D7
-:100B70003C01740B3C0274143C03741DE98D00C6E7
-:100B800006963601E83C017227E98000C6069636D3
-:100B900002E88300721AE97300C606963601E8225D
-:100BA00001720DC606963602E86C007203E95C001D
-:100BB000530650C41E8C36B90B0033C0E8420858A7
-:100BC00026C6078226C64702FF8D06E0FE86C4269B
-:100BD000894706A0963626884708E8C808075B8339
-:100BE00026AD36FEA1AD36E704BA1001B88080EF1D
-:100BF000EDBA1001B80202EFED52BAE000B84110B0
-:100C0000EF5AB89C03CD39C6069536008CC0488E85
-:100C1000C0FAE8A90FFBC31E061F0633C08EC08BA7
-:100C2000F08D3E20F351B10A26837D0C01752A57C1
-:100C300026837D0E007406E82F00E90300E86607AE
-:100C40005F731633C08ED8268B4D128D75208D3E66
-:100C5000E0FEF3A459071FF9C3FEC9740781C7203A
-:100C600001E9C4FF59071FF8C35150535652573377
-:100C7000DB268A5D0E268B4D128D7D205A87D72666
-:100C80008A451487D74232FF80FF087508FECB22C1
-:100C9000DB75EA33DB23DB7406FEC7D0C8730C5068
-:100CA000268A053804587403E90A0049464723C9CF
-:100CB000740AE9D3FF5A5E5B5859F8C35A5E5B5811
-:100CC00059F9C31E061F0633C08EC086CD2BCE8BAE
-:100CD000F78BC133C9803CFF741680F90673093263
-:100CE000C94648742EE9EDFF3D6000730CE923000E
-:100CF000FEC14648741DE9DCFFB810008D3E183473
-:100D000032EDB106F3A67403E908004823C0740766
-:100D1000E9E9FF071FF8C38D36183433C08ED88D2C
-:100D20003EE0FEB81000B9060056F3A45E483D0050
-:100D30000075F3071FF9C3FF06E433C606EB340062
-:100D4000268B450686E0C1E80448068EC0FE06E60E
-:100D50003AFAE8690EFB07B0FFC30000000000008C
-:100D6000B001C3B000C3F6069336207503B004C3C8
-:100D70008B0E973681E18030268B4704257FCF0B81
-:100D8000C1A39736A3E634B000C3F60693362074A9
-:100D900003B003C3268B4708A39736A3E634268AFD
-:100DA0004720A2FD343C017506C706A13600002687
-:100DB0008A4721A2FE34268B470AA31834A358344D
-:100DC000268B470CA31A34A35A34268B470EA31C38
-:100DD00034A35C34C6062A34C0268B4714257FFF13
-:100DE00009062C34268B471625FFFE25FFFC090635
-:100DF0002E34C6060034C0268B4710A30234268B3F
-:100E00004712A304340653E8840A5B073D000075CB
-:100E100007800E923608B0FEC3B90001A1AC33338F
-:100E2000D2F7F9A3AE33914933D2F7E905003BA3DA
-:100E30004634BF003B893E4434BA6800B8E0E0EF76
-:100E4000A1AE33E762A1AE33BA0801EFA14434E7A3
-:100E500064A14434BA0A01EFB800012D04000D006A
-:100E600010E792C33D0000740A26894707E8833AD9
-:100E7000B007C3A1AE332689472BA1443426894746
-:100E80002DA146342689472F800E933620A188361F
-:100E900086E026894708A1843686E02689470AA18C
-:100EA000803686E02689470CB860FE86E0268947B2
-:100EB0000EA0A136268847108B36883626C64402F7
-:100EC000FFE59EA90008740CBA8400ED0D0800EF40
-:100ED000BA8E00EFE50225F9FFE702BA1001B80269
-:100EE00002EFEDB000C3F6069336207503B001C3E0
-:100EF000802693369FE88D0A800E923608B0FEC396
-:100F0000B000C3F6069336207503B004C3C6062AA4
-:100F100034C0268B4706257FFFA32C34268B470839
-:100F200025FFFE25FFFCA32E34CD52B000C3F606EC
-:100F30009336207503B004C3C6060034C0268B4721
-:100F400006A30234268B4708A30434CD52B000C355
-:100F5000F6069336207503B004C3578D7F0651B94A
-:100F6000070033C0F3AB598D7F06A17A34030639ED
-:100F700037268805A1953726884502A180340306C7
-:100F8000763426884507A1C63426884509A1D8337A
-:100F90002688450A33C0A37A34A33937A39537A3EB
-:100FA0008034A37634A3C634A3D8335FB000C3F62D
-:100FB000069336207503B004C3268B4F0483F906CD
-:100FC000741283F904740D83F900740883F90274B0
-:100FD00003B001C3890EE83A8326AB36F9090EAB9C
-:100FE00036E50225F9FF0BC1E702B000C3F6069310
-:100FF00036207503B004C3268B4F0480F9FF7408B4
-:1010000080F9007410B001C3830EAD3602A1AD3675
-:10101000E704E90A008326AD36FDA1AD36E704B04A
-:1010200000C3F6069336207503B004C3E8D504B0B8
-:1010300000C3F6069336807503B001C326837F068E
-:10104000057503E99D00268B5704268B47082681EA
-:101050007F0600807508ED2689470AE99D002683F2
-:101060007F06017504EFE9920026817F06018075F5
-:1010700009EFED2689470AE9810026837F0602757C
-:101080000726214704E9730026817F060280750C3C
-:1010900026214704ED2689470AE95F0026837F065B
-:1010A00003750726094704E9510026817F0603805E
-:1010B000750C26094704ED2689470AE93D00268379
-:1010C0007F0604750726314704E92F0026817F0635
-:1010D0000480750C26314704ED2689470AE91B0078
-:1010E000B001C3FA53268B4F080BC9740C8D1EE058
-:1010F000FEE852FF83C308E2F85BFBB000C3F606CC
-:10110000933680750AF6069336207503B001C38DB9
-:101110003EE0FEE500268905E50226894502A1ADEF
-:101120003626894504E50626894506E508268945CB
-:1011300008E50A2689450AE50E2689450CE5482674
-:1011400089450EE54A26894510E54C26894512A1B8
-:10115000B73626894514E55026894516E552268975
-:101160004518E5542689451AE5562689451CE55853
-:101170002689451EE56226894520E56426894522A3
-:10118000E56626894524E56826894526E56A268997
-:101190004528E56C2689452AE5702689452CE572A7
-:1011A0002689452EE57426894530E576268945321F
-:1011B000E57C26894534E57E26894536E580268905
-:1011C0004538E5822689453AE5862689453CE58805
-:1011D0002689453EE59A26894540E59E2689454271
-:1011E000E5CC26894544E5CE26894546E5D02689C5
-:1011F0004548E5D22689454ABA0001ED1106663414
-:101200007304FF0668342689454CBA0201EDC1E03B
-:101210000211066E347304FF0670342689454EBAF7
-:101220000401ED11066A347304FF066C3426894507
-:1012300050BA0601EDC1E002110672347304FF06D4
-:10124000743426894552BA0801ED26894554BA0AF4
-:1012500001ED26894556BA0C01ED26894558BA0E8E
-:1012600001ED01067A342689455EBA1001ED268922
-:10127000455CB000C3F6069336807407F6069336D5
-:10128000207503B001C326807F06007530803E952F
-:1012900036007452C6069536008326AD36FEA1ADE3
-:1012A00036E704BA1001B88080EFEDBA1001B80239
-:1012B00002EFEDBAE000B80010EFB000C3268B4794
-:1012C000043D000074203D0300771BBA1001B802F2
-:1012D00000EFBAE000B80110EF830EAD3601A1AD0A
-:1012E00036E704B000C3B006C3F606933680750334
-:1012F000B001C326837F0401740A26837F0402742D
-:1013000019B006C326837F060C77F626837F0A6012
-:1013100077EFE81000720BB046C3E84E007203B0DE
-:1013200046C3B000C351B10A8B3E20F326837D0C27
-:10133000027503E90E00FEC9740781C72001E9EBBD
-:10134000FF59F8C3578D7D0E8D7706B91200F3A4AF
-:101350008D7D208D36E0FE268B4D12F3A4FF060115
-:10136000355F26C7450C010059F9C351B10A8D3EBE
-:1013700020F38D36E0FE26837D0C01751B57E82592
-:10138000005F731433C0B92001F3AA26C7450C02CD
-:1013900000FF0E013559F9C3FEC9740781C720014A
-:1013A000E9D3FF59F8C351268B4D128D7D20F3A64A
-:1013B000740359F8C359F9C300000000000000008D
-:1013C000803EEC34067233FF06F03350C41E8C3678
-:1013D000B90F0033C0E82900588126C234DF7F816D
-:1013E00026E934DF7F0BDB741126C6078426C64747
-:1013F00002FF26894706E8AC00C3FF06EA33E9F599
-:10140000FF57268B3F03F9263B7F027416263B7F4E
-:10141000047C2A3D000075138D7F0803F9263B7F6D
-:10142000027C14FF06DE3333DB5FC3268B7F02268C
-:10143000893F03F9E9060026893F26290F26C705BB
-:10144000FFFF26873F26890D8D5D02508BFB83E9C8
-:101450000233C0F3AA58FE0EEC345FC38B7C023B10
-:101460003C742F833DFF750B8D7C08897C02833D86
-:10147000FF741E8A45023C81750C803EEB3400747B
-:101480000533C0E90B008B0D014C028D750283E919
-:1014900002C3803EEC3406720533C0E9F3FFFF0659
-:1014A000EE33E9BEFFF6069236407401C35756513B
-:1014B000528B368C36E8A4FF7503E91A00E91C004C
-:1014C000FE06EC34C43E8036F3A4800E923640BA59
-:1014D0000C01B88080EFED5A595E5FC3FF06E03320
-:1014E000803C81750CFF06E233C606EB3401E9CF80
-:1014F000FF803C847507FF06E633E9C3FFFF06E87B
-:1015000033E9BCFF8D3EE0FEA17234C706723400A1
-:10151000008905A17434C70674340000894502BAF5
-:101520000401ED894504C745060000A16E34C706D5
-:101530006E340000894508A17034C706703400007D
-:1015400089450ABA0001ED89450CC7450E000032F5
-:10155000E4BA0E01EC894510A17E34C7067E340042
-:1015600000894512A18C34C7068C340000894514CB
-:10157000A18A34C7068A340000894516A17C34C785
-:10158000067C340000894518A18834C706883400D9
-:101590000089451AA1CA33C706CA33000089451C11
-:1015A000A17834C7067834000089451EA1C634C727
-:1015B00006C6340000894520C3000000000000007A
-:1015C000FA33C08ED88EC0B8A001C1E8048ED08D89
-:1015D000268000E80001E810EB8B1EF7348B16F92B
-:1015E000348B36FF3433C0B9EFFF8D3E14002BCF60
-:1015F0002BCED1E9F3AB891EF7348916F93483FE7B
-:1016000000740CB9EFFFBF80FE2BCFD1E9F3ABB96B
-:10161000FFFF81E9003B83FE007403E91B00511EBC
-:10162000B800E08ED833F68D3E00D8B9000CF3A593
-:101630001F59BEFFFF81EE00D82BCE81E100FF894C
-:101640000EAC338D062002C1E804A332348ED036AE
-:10165000C7061E00801836C7062200FF7F36C70661
-:101660000A00FFFF36C7061C0080008D06A002C1DD
-:10167000E804A330348ED036C7061E00502836C783
-:10168000060A00FFFF36C7061C008000B8A001C193
-:10169000E804A33434A3F2338ED08D268000B80042
-:1016A00090E7028D3E70018BC7C1E804B903008941
-:1016B000450E894502C705FFFF83C710050100E2FB
-:1016C000EEE85B01E5CEA3B536E82100E84501A1CF
-:1016D00032348CCBCD370E58A900F0740733F6891D
-:1016E00036FF34C38D3630618936FF34C333C08B47
-:1016F000D08BF2B968002E80BCAC17807501EF83E7
-:10170000C20246E2F1B80200E750B95A0033FFC7FF
-:101710000565188C4D0283C704E2F433C08EC08C7B
-:10172000C88ED88D3E80008D369C17B90800E837EA
-:10173000008D3620218D3EC000B90D00E829008DB6
-:101740003E4001B90A00E81F00E84B0E33C08ED8B6
-:10175000C7064E376F17E748E74CB8409CE74AE5A5
-:101760004890B80070E748C3A583C702E2FAC3E512
-:101770004CC35051565752061E33C08ED8E558D12F
-:10178000E073118BF0D1E633C08ED88BB480008328
-:10179000C60BFFE61F075A5F5E5958CF581CE41C62
-:1017A0006C1C8E1AC01F401A441C6518808080FF74
-:1017B00080030280FFFFFFFFFFFFFFFFFFFFFFFF30
-:1017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
-:1017D0008003034380800280420302FF0301030170
-:1017E00001030203FFFFFFFFFFFFFFFF02030103EF
-:1017F00003FF0101FF01FF0101030303FFFFFFFFDF
-:10180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8
-:10181000FFFFFF02B80F00E784B80FF8E782C3B9F3
-:101820000800890EE63A8D0620038BD0C1E804A398
-:1018300090018BC28BD8C1E8048EC005610026A33D
-:101840000000A1303426A3020083C314D1EB268903
-:101850001E080081C21006E2D926C7060000FFFF5D
-:101860008C069201C35051565752061E33C08ED873
-:10187000E75AFF06BE33BAD200EDCF0000000000E9
-:101880008CCBA13034CD37E906EDB83200C3E88CFB
-:1018900001FE06E234E8210175F0E8530E810EAF37
-:1018A0003600C0C706AD366000F706E63480007526
-:1018B0001AF706E63400087409C706AB360B00E9D0
-:1018C0000F00C706AB360300E90600C706AB3611AA
-:1018D0009CC706A9361800F706E6348000750DF798
-:1018E00006B53602007405830EA93620A1A936E795
-:1018F00000A1AB36E702F706E6348000742EE8F26A
-:101900002F33C00D4100E756A1B1360D0010E70896
-:10191000A1B336E70AA1AF36E706B84000E74E3379
-:10192000C0E70EC70626020000E92300C7064E37AF
-:101930003F208E06303426F7060A00008074072602
-:10194000810E08000080C606E03401B80000C3FE26
-:1019500006E134C606E03400A126020BC07401C3C0
-:10196000E80400B80000C3A1A936E7008B1EAB361F
-:1019700083E306E50225F9FF0BC30D1000E702A182
-:10198000AD36E704C3B80A00E784FE06E534C606B0
-:10199000E334018E06303426F7060A00004074074F
-:1019A00026810E08000040C3C7064E376F17FE069B
-:1019B000E434C606E33400C3C3F606183480750D5C
-:1019C000A118340B061A340B061C347501C3A12E62
-:1019D0003425FFFE8B16E73681E200010BC2A32EF1
-:1019E000348D161000BF0000B908008B850034EF5D
-:1019F00083C2108B850234EF83C2108B850434EFD1
-:101A000083C2E283C7064975E2B800008EC0BE00FB
-:101A100034BFB936B91800F3A5B80000C333C08E7F
-:101A2000C08D3EB033B90800F3AB8D3E3E34B903F0
-:101A300000F3ABC300000000000000000000000045
-:101A40005051565752061E33C08ED8E75AFF06BA79
-:101A500033E5560D2000E756BA7A00ED0826943695
-:101A600033C0B10832ED068EC08D3EE0FFF3AA8E82
-:101A700006323426810E0800000207E55625DFFFF6
-:101A8000E756E9F8FC00BD1B101BD91AF31A505198
-:101A9000565752061E33C08ED8E75AFF06B6335348
-:101AA0000651E580A3B4338BD88BC8251000A3ED75
-:101AB000340BC07414FF068034803EFE340074037F
-:101AC000E90600B88000E89D0483E303D1E32EFF1C
-:101AD00097861A59075BE9A4FCBA20008E063C34AD
-:101AE000833E3C34007503E9F000C7063C34000037
-:101AF000E92A00BA10008E063A34833E3A34007563
-:101B000003E9D5FFC7063A340000E81000E9C9FF31
-:101B1000BA10008E063A34C7063A34000026A114E3
-:101B20000026A30C0026A1160026A30E0026C6063A
-:101B30000A0000C1EA0223D1741CBA200026C7069D
-:101B40000E00EA05260B160C002689160C00FF066F
-:101B50008634FF06DC3326A10C00A9003774162654
-:101B6000C6060A0002A900307404FF067A34FF0694
-:101B7000DA33E94900C0EC0783168A340024073CB5
-:101B8000077504FF068C34FF067E34A130348CC305
-:101B90008EC08EDB26830E0800408CD82687061662
-:101BA0000026833E1400FF740A8EC0268C1E00009F
-:101BB000E90500268C1E140033C08ED8C3C38CC028
-:101BC000870692013DFFFF740D8ED88C060000330E
-:101BD000C08ED8E904008C069001E80100C306839A
-:101BE0003E9001FF7429833E3A34007511BA860095
-:101BF000E81E008C063A34833E9001FF7411833E48
-:101C00003C3400750ABA8800E806008C063C3407AC
-:101C1000C3A190018EC026A10800EF26A1000026D6
-:101C2000C7060000FFFFA390013DFFFF7503A392CD
-:101C300001833EED3400740BB81000E784C706ED55
-:101C4000340000C35051565752061E33C08ED8E799
-:101C50005AFF06BC33E925FB5051565752061E3336
-:101C6000C08ED8E75AFF06B033E911FB50515657E2
-:101C700052061E33C08ED8E75AFF06B43306FF065D
-:101C80007634803EFE3400740407E9F0FAB8800030
-:101C9000E8D30207E9E6FA000000000000000000B7
-:101CA000C61D081D911E5D1E731E891E911EA81D56
-:101CB000911E911EAF1EAF1E151D151D911E991F61
-:101CC000000000000000000000040000000200000E
-:101CD00000010010000100400000000000010000B1
-:101CE00007E999FA5051565752061E33C08ED8E76D
-:101CF0005AFF06B2330668F61CE506A3B2338BF032
-:101D000083E61E2EFFA4A01CE50CA980007406E843
-:101D1000A401E506C353E50C8BD8A9010074148314
-:101D20003EE03A00740D8E063834E8BF06C706E080
-:101D30003A0000E5000D1800E700E5020D1100E78C
-:101D4000028BC35BA901007401C38BD0B80008E704
-:101D5000848BC28E06383426A30C008BD0C1E003DE
-:101D60008316883400FF067C3426833E06000A75FD
-:101D7000218BC22540183D4000740C3D00107512A7
-:101D800026FE0E0A00740BF706EF3420007503E9F7
-:101D90005A068CC0268E06020026830E08002026D6
-:101DA000A3120026A31000C3FF06C433E50CA9014B
-:101DB000007501C3A9F0077401C3FF06D433E50021
-:101DC0000D1800E700C3FF06CA33803EA036087531
-:101DD000148E06303426F7060A00000874072681A0
-:101DE0000E08000008E58225FDFFE782E50C50E5BE
-:101DF00080250007A3E43AE58C250080A3E23A5849
-:101E0000A902007525833EE23A00751E833EE43A3E
-:101E1000007517E5080D000425FF04E708E86A01CE
-:101E2000E5820D0200E782E92100E81A06803EE81B
-:101E3000FF00740A803EE8FF047403E90D00C60643
-:101E4000E8FF01BA0C01B80808EFED803E9F3606A6
-:101E50007505830E993640B80001E90901FF06CCEB
-:101E6000338126AF36FFF7A1AF36E706FF06C6344B
-:101E7000E91E00FF06CE33FF0695378126AF36FFF9
-:101E8000EFA1AF36E706E90800FF06D033FF067A78
-:101E900034FF06D233D1E68E0630342E8B84C01C3C
-:101EA00026090608002E8B84C21C09066637C3E586
-:101EB0000CA98000745650E8F00058A9000175077D
-:101EC000FF06C633E90800FF067834FF06C833E58D
-:101ED0008225FDFFE782E86E05BA1001ED803EE83D
-:101EE000FF00740A803EE8FF047403E91D00C60683
-:101EF000E8FF01BA0C01B80808EFEDE90D00C606CD
-:101F0000E8FF03BA0C01B80808EFEDC3A90100749B
-:101F10001CE82C00833EE03A00740F068E0638342D
-:101F2000E8C904C706E03A000007E95D008BD08EDF
-:101F300006383426A30C00E8060068691DE94A004B
-:101F4000A90004740AB80004FF06D833E91700A9F1
-:101F50000001740AFF063937B80001E90800A9102A
-:101F600000B81000741D090666378CC08E06303428
-:101F700026F7060A000001740726810E08000001FA
-:101F80008EC0C3FF06C233E9F8FFE5000D1800E775
-:101F900000E5020D1100E702C358E943FDE5080D15
-:101FA000000425FF04E708E9E0FFE50EA900087535
-:101FB00001C3E9F5FF000000000000000000000080
-:101FC0005051565752061E33C08ED8E75AFF06B8F6
-:101FD00033E548065357FF164E375F5B833E80015B
-:101FE000FF74588E06800126FF0E0800754D26A14D
-:101FF0000000A3800126C7060000FFFF8CC0268ECC
-:1020000006020026810E080080008BD02687061A63
-:102010000026833E1800FF740A8EC0268916000031
-:10202000E905002689161800833E8001FF740C8E96
-:1020300006800126833E08000074B307E93EF7E5F9
-:102040004C90E502A90020740D25FFDF0D0100E78B
-:10205000020D0020E702E50A8BD8A3F43325C3570D
-:102060000D0010E70AF7069B3600807437F7C300AF
-:10207000807406F7C30008745D8126C2347FFFC7F1
-:102080000635370500B88003CD3981269B36FF7FA2
-:10209000C7060F370400F7069B3640007506C706D3
-:1020A0000F370300F7069B360020742AF7C3000899
-:1020B0007424803E9D36067C1DFF069434830E6694
-:1020C00037208E06303426F7060A000001740726F2
-:1020D000810E08000001F7C30020753BF7069A3710
-:1020E0008000740BFF06893733C0E70EE90400FF58
-:1020F000063B37F7069B360020741C80269E36FF71
-:1021000075158E06303426F7060A00000874072677
-:10211000810E08000008C3C300000000000000009A
-:1021200002230223022302230323DD220223FD21B3
-:102130000223A424F32402238D227A23022397244A
-:102140001B247524022302238E25FB8E067E01FBB1
-:1021500026833E0000FF74F2268E060000FA268BCE
-:102160001E080026231E0A0074E58CC08ED0268B24
-:102170002602008C16F23322FF756A26A11C008A03
-:10218000E38ADC22D8750DD0E824F80AC075F2B0D5
-:1021900080E9EDFFD0E824F80AC07502B08032E48F
-:1021A00026A31C00F7C3080075472E8A9FC5252E5D
-:1021B0008BBFC52680C310268E1D268C1E06008B65
-:1021C000160000C7060000FFFF26891583FAFF7579
-:1021D0000A2E8B97CD26262116080033C08ED826CE
-:1021E000891E0400C38ADFB7002E8A9FC525E9E057
-:1021F000FF2683260800F783C310E9DEFF60061E72
-:102200006887256A001F8E06F2338B0E3434390E30
-:10221000F233740E26810E0A00000226810E080099
-:1022200000022689260200A3F2338ED08D2680007C
-:10223000368926020036891E200036C706080000AF
-:1022400000B90400BE00002E8BBCC52636C705FFB2
-:10225000FF36C74502FFFF83C602E2EB8E067E0112
-:10226000368B0E22008CC026833E0000FF268E0691
-:1022700000007407263B0E22007DEA368C06000023
-:102280008EC0268C160000FB36FF2E1E00061E6830
-:102290008B256A001F2609360800F7C600FF740167
-:1022A000C356522E8BB4C52581E6FF002E8BB4C5D4
-:1022B000268CC28EC026C7060000FFFF8EC2268372
-:1022C0003CFF740F8BD0268754028EC226A30000D9
-:1022D000E90700268944022689045A5EC3061E685F
-:1022E0008B256A001F8E06F23326A30A0026892654
-:1022F0000200A134348ED08D2680008C16F233E992
-:102300004DFECF501E525333C08ED826833E04005C
-:10231000FF26C706040000007403E91A00833EE6A6
-:102320003A027613FF06D6338CC08E063234BE4096
-:1023300000683A23E95EFFE884F85B5A1F58CFE84B
-:10234000E10026C606180010268A1E2900881E1BDA
-:102350003726C7060C00FF7F26A10E00E79C26A1AA
-:102360000800E79AE50080FB0874090D18ACE70047
-:10237000071F58CF0D1800E9F4FF501E0633C08E1A
-:10238000D8833EA1360075B7268B3606002EFF9403
-:10239000DC23071F58CFE88A00E5000D1800E7008E
-:1023A000E84900C353F706EF342000752DE58C256E
-:1023B00000708BD8E58C2500703BC374058BD8E981
-:1023C000F2FF3D00307510E50225EFFFE702C7067A
-:1023D000E03AFFFFE90300E812005BC3A323962362
-:1023E000A423A4239623A4239623962326A029007E
-:1023F000A21B3726C7060C00FF7F26A10E00E79C14
-:1024000026A10800E79AE50025FF53268B36060033
-:1024100083E60E2E0B84AD25E700C3061E688B25D0
-:102420006A001F830EEF3420830E9B3608E50025DB
-:10243000EFFF0D0800E700E500A910007501C3E5F6
-:1024400000A9100075F9C350535156061E33C08EB3
-:10245000D8B80500E784E5080D000425FF04E70867
-:10246000E5000D1800E700E5020D1100E7021F0767
-:102470005E595B58C3501E33C08ED8C706EF340078
-:102480000083269B36F7E5000D1800E700E5020DF6
-:102490001100E7021F58CF60061E6887256A001FDB
-:1024A000E816F5C3061E688B256A001F8EC02683BA
-:1024B0003E0A00007403E8430026C7060A00FFFF37
-:1024C000268B1606008E1E8E018CD88BCA833E008A
-:1024D00000FF8E1E0000740A2B16080073EB290EF5
-:1024E000080026890E0800268C1E00008ED88C0657
-:1024F0000000C360061E6887256A001F8EC08BC857
-:102500008E1E8E0126C7060A0000008CD8833E006E
-:1025100000FF74253B0E00008E1E000075ED8ED866
-:1025200026A10000A300003DFFFF74568ED826A10F
-:10253000080001060800E94900268E1E0200BE18A8
-:1025400000833CFF743C390C74198E1CBE00008360
-:102550003E0000FF742C390E000074078E1E000030
-:10256000E9ECFF26A10000890433C98ED93DFFFFA5
-:10257000751083FE18750B268E1E0200812608003A
-:102580007FFF33C08ED8C31F0761CF1F07CF600600
-:102590001E6887256A001FE506251E003D1E007582
-:1025A000F6B90800E558E75A23C0E0F8C300000078
-:1025B000000000000000AC000000A8008C02040035
-:1025C0000008102000FF0E0C0C0A0A0A0A0808086E
-:1025D0000808080808060606060606060606060691
-:1025E00006060606060404040404040404040404A1
-:1025F000040404040404040404040404040404049B
-:1026000004040404040202020202020202020202A0
-:10261000020202020202020202020202020202029A
-:10262000020202020202020202020202020202028A
-:10263000020202020202020202020202020202027A
-:102640000202020202000000000000000000000080
-:10265000000000000000000000000000000000007A
-:10266000000000000000000000000000000000006A
-:10267000000000000000000000000000000000005A
-:10268000000000000000000000000000000000004A
-:10269000000000000000000000000000000000003A
-:1026A000000000000000000000000000000000002A
-:1026B000000000000000000000000000000000001A
-:1026C00000000000001800140010000C00FF7FFF45
-:1026D000BFFFDFFFEFFFF7FFFBFFFDFFFE7FFFBF49
-:1026E000FFDFFFEFFFF7FFFBFFFDFFFEFF00000036
-:1026F000803EE234017603E9A500B80000E74EB958
-:102700002800E2FEC606453702BF3F282E8B45084B
-:10271000E74EB92800E2FE2E8B1DC706B3364011E6
-:10272000C706B1362700C70646370200C706483736
-:102730006400F706B5360200751C2E0B5D0281267B
-:10274000B336FFFEC706B1369C00C7064637080001
-:10275000C70648379001891EB736891EFE33BE2052
-:10276000008BC3E74EB92800E2FE2E8B4504E74EEE
-:10277000B92800E2FEE54E8BCB2E2345062E234DD5
-:10278000063AC174364E75D9803E453700740BC683
-:1027900006453700BF2F28E972FFC606453701F707
-:1027A00006B53602007414E5CE25FDFFE7CEE843FA
-:1027B00000E5CE0D0200E7CEE83900803EE23401AC
-:1027C0007601C3B8EA05E78CFAE812F4FB8D06D06F
-:1027D000398BD8C1E804A338348EC0A1303426A385
-:1027E000020026C7060000FFFF83C318D1EB26892D
-:1027F0001E0800C3E5020D0040E702E5000D0400DD
-:10280000E700B80000E70AE50AA900807514E508AA
-:102810000D0010E708E50A0D0008B90500E70AE217
-:10282000FCC3E5080D0010B90500E708E2FCC3048D
-:102830000C2000010C7EFF000C0200100040000C78
-:10284000C6010000C0F7FF00C002001000400000F9
-:1028500033C08ED88D3E72498D36B037B914008B97
-:102860001E3034895C022E8B45028944062E8B056E
-:1028700089440483C70483C610E2E8C6069E360E68
-:10288000E8FD26688328A1AA02CD35833EA1360043
-:102890007403E93B2733FF8E06A6028B36A4022E73
-:1028A000FFA42E30830E993604C70637370100C6C1
-:1028B00006CA3401E97D19803EA0360874E68026F8
-:1028C0009E36FF751AF7069B3600207412F7069B9A
-:1028D000360300750A830E663710C606A03608E96F
-:1028E000FB01803E9E360275CEC606A03606E9EC98
-:1028F00001C3E9E80126C7060A00000026FF2604F6
-:1029000000A1D1362639061A007522A1D336263900
-:10291000061C007518A1D5362639061E00750E2630
-:10292000F7060C0040007405830E663740810EAF39
-:10293000360010A1AF36E706803E9D36027506CD03
-:1029400034E9A21AC3F7069B361000755426F60622
-:102950000A00FF754C26A0190024C03C4075118068
-:102960003E953600743B26C7060400FFFFE93100A0
-:10297000E8F104F7069B360300742F8BD8B87D036B
-:10298000CD3A8BC3C606A03606F7069B3602007505
-:1029900005C606A03604810E9B36800083269B3632
-:1029A000FCE92301E8871DE933015026A10C00252D
-:1029B00007003D07007503E984003D05007503E944
-:1029C0007C00833EE83A047475833EE83A02746EF4
-:1029D000F706E63418807503E96A00F706E6340066
-:1029E00080743526803E290002752D5156578D364C
-:1029F0003E348D3E2000B90600F3A65F5E59744553
-:102A000026A12000A33E3426A12200A3403426A103
-:102A10002400A34234E92600F706E6340800740BCC
-:102A200026803E1900007403E91300F706E634100F
-:102A300000741226A02800C0E80422C0740726C72C
-:102A4000060400FFFF5823C07403E957FF81269B4B
-:102A500036FFFE83FE067F2426A120003B06D136EA
-:102A6000751A26A122003B06D336751026A1240034
-:102A70003B06D5367506810E9B36000126A1200047
-:102A8000257FFFA3B83426A12200A3BA3426A124AF
-:102A900000A3BC348BC686C4A3C034D1E680FC0935
-:102AA0007403E8AA1C8BC62EFFA4304926A10C0093
-:102AB0003DFF7F740F26FF2604008E063834E8366B
-:102AC00006CD50C3E91600CD34E91100CD34893666
-:102AD0003D37A19D36A33F37C606A0360CE88E00D1
-:102AE000A19F3622E47532F7064C370100752AF6AD
-:102AF000069D3680740788269E36E931003A069D89
-:102B000036A39D3674288BF02EFFA40D2B4429EE9E
-:102B1000421944CD442F455A453A269E367501C385
-:102B200032C086C48BF0A29E362EFFA420498B2E85
-:102B3000993623ED7501C3BF0100BE000085FD7508
-:102B40001A46D1E7E9F6FF2A0029002800270025C8
-:102B50000005000700260006002000F7D7213E9957
-:102B600036D1E62E8BB4472BE94FFFE956FF80267E
-:102B70009E36FF7517F7064C370100750FF6069D58
-:102B800036807408F7066637FFFF7507C706663795
-:102B90000000C3F70641370100750BB87F03CD393C
-:102BA000C7064137010033F6B80040850666377422
-:102BB0002180BC5437FF7404FE84543780BC9634A3
-:102BC000FF7404FE84963431066637833E66370010
-:102BD000740546D1E873D4C3A1F433A90088740BFB
-:102BE000A9001075098B1E4337FFE3E9D700C7061C
-:102BF00035370500C70643371E2CF706F4330008A7
-:102C00007406C7064337102CB88003CD39E9CDFED2
-:102C1000A9000874D9FF0E353775EDE96600A900E3
-:102C20000875CBFF0E353775DF810EC234C000F654
-:102C3000069D36807448810E9B360080F7069B36D1
-:102C40000100741EB87D03CD3A810E9B368000834F
-:102C5000269B36FEC7060F370200C606A03604E9DB
-:102C60007BFE803EA036047507833E0F3701750555
-:102C7000C606A03606C7060F370200E95FFEBE0291
-:102C800000E94AFE80269E36FF753AF6069D36809C
-:102C9000742DF7069B360020752BC606A03606FF5E
-:102CA000069434830E6637208E06303426F7060AE3
-:102CB000000001740726810E08000001E90600BE2D
-:102CC0000400E909FE810EAF360008A1AF36E70621
-:102CD000E50AA90080740E8126AF36FFF7A1AF3652
-:102CE000E706E909FFE9F5FDC70641370000830E55
-:102CF000993602E9E7FD80269E36FF751DF7069B93
-:102D00003600407505830E993608830E993620816A
-:102D1000269B36FFBFB88503CD39E9C0FD803E9EB6
-:102D200036067407803E9E360A7534F6069D368058
-:102D30007506BE0700E996FDC606A03604833E0F61
-:102D40003702741BC7060F370400803E9E36067597
-:102D50000EF7069B3640007506C7060F370300E9DD
-:102D60007BFD803E9D36047512810EC2340040FF0B
-:102D7000069234C606A03606E962FDBE0500E94D9E
-:102D8000FDF6069D36807519830EC23404BE06001A
-:102D9000E93BFD80269E36FF75C5FF063137E90009
-:102DA000008326C234BFC606A03606E92FFDE50A19
-:102DB0005025C3BFE70A5880269E36FF750DA9002F
-:102DC000407508C606A03606E912FDB88303CD3962
-:102DD000C3B87C03CD39F706F43300107509C70674
-:102DE00033370200E9F6FCFF0E33377403E9EDFCDC
-:102DF000FF068E34E8F719830EC23408BE0300E9DB
-:102E0000CCFC0000000000000000000400040405E9
-:102E1000040404000300030300000000000000009D
-:102E20000004000808050808080003000303000068
-:102E3000020404040400000800000A1400001A0040
-:102E40001C001E2000000441060B08C2FFE704031B
-:102E500006040405040604870403060404854EA240
-:102E600004CF04CDC706A2370000C706A63700006E
-:102E700026A12000257FFFA3F53626A12200A3F777
-:102E80003626A12400A3F936E83B198BF0268B0ED9
-:102E90000E002BC883E90EB8018083F9047C51260B
-:102EA0008A542888161C3740268B6C2686CD3BCD4D
-:102EB00086CD890EA43775384032FF268A5C29807A
-:102EC000FB15772580FB0A742080FB01741BB80476
-:102ED000802E3A97022E74072E3A97182E751133CA
-:102EE000C080FB09754F8BF3C326C7060400FFFFA4
-:102EF0005052A1A43786C4263B0626007C32268188
-:102F00003E260000047E298D742A268B1422D2745A
-:102F10001F80E6BF80FE097517C706A23701008033
-:102F2000FA04750C268B4402A3033786C4A3D0345D
-:102F30005A58E9B1FFBD72372E8A872E2E22C074EF
-:102F40001605442E8BF82E8B053E89460083C5025C
-:102F500083C70222E47DEF8D742A83E9047503E9B7
-:102F6000A100268B1422D27503E97C00C706A63780
-:102F70000100BF72378B0583C70280E6BF80E43F44
-:102F800080FE09752280FA04755EC706A23701002B
-:102F9000268B4402A3033786C4A3D03486C4C70655
-:102FA000A6370000E947003BFD7E15268B04A840AC
-:102FB0007406B80780E938FF32C0268B04E92E007A
-:102FC0003AF475B1C745FE000080FE22750D3AD077
-:102FD0007716C706A6370000E913003AD07509C76F
-:102FE00006A6370000E90600B80580E902FF32F6C0
-:102FF00003F22BCAB8058023C97603E964FF740382
-:10300000E9EDFE33C0BF72378B1547473BFD7F1B91
-:10301000F6C6807416F706A63701007406B8088055
-:10302000E9C3FEF6C64074E0B80780E9B8FE7D4209
-:10303000A34544294429B728E228EE2BF228F52895
-:103040000129AC2A4429442944294429442900005F
-:10305000733600000336C535833545350735D23420
-:1030600045340000000000000000000000000000E7
-:103070000000A6380000E03800000000000000005A
-:103080000000000000000000000000000000000040
-:10309000F2330000A6336033FD32BC3277323C326B
-:1030A000FB316A310A31E0E0101010E0E0E0E000AE
-:1030B0000000000000000000000000000000000010
-:1030C000000000000000E000E0E0E0E0E0E0E0E020
-:1030D000E033FF26F6061A0080741B2680261A00AD
-:1030E0007F268B3E260083E71F740B26800E200070
-:1030F0008026013E0E00C3602E8B84A63026A318C6
-:1031000000D1E62EFF94503061C326C7060400C4E8
-:103110002A26C7060E00160026C706060006002649
-:10312000C606190000E8BF05E8980526C706260070
-:10313000000826C60628004026C60629002ABF2AFF
-:103140000026C6050426C645012AA1933733DBA90C
-:1031500040007502B301A900107402B788A90008E5
-:10316000740380CF4426895D02C3830EC2342026B7
-:10317000C70604006B2B26C7060E00300026C706C4
-:1031800006000A0026C7060A00040026C606190023
-:1031900000E86905E82C0526C7062600002226C699
-:1031A0000628006026C606290029BF2A0026C60573
-:1031B0000826C645012D8D7D02BE5437B90300F3A4
-:1031C000A526C6050826C645012E8D7D02BE5A37A6
-:1031D000B90300F3A5E8D405E86405B90600BE54B8
-:1031E000378D2E2C00268B4600290483C60283C50A
-:1031F0000283F90475024545E2EBC326C7060400C5
-:10320000C42A26C7060E00240026C70606000600AC
-:1032100026C606190000E8E404E8A70426C7062627
-:1032200000001626C60628006026C606290028BF0C
-:103230002A00E85B06E87405E80405C326C706040F
-:1032400000C42A26C7060E001A0026C70606000676
-:103250000026C606190000E8A304E8660426C7068F
-:103260002600000C26C60628006026C60629002770
-:10327000BF2A00E82105C326C7060400C42A26C7C2
-:10328000060E00200026C70606000A0026C7060A0A
-:1032900000040026C606190000E84B04E8240426B2
-:1032A000C7062600001226C60628004026C60629A4
-:1032B0000026BF2A00E8F404E88404C326C70604F5
-:1032C00000C42A26C7060E00340026C706060006DC
-:1032D0000026C606190000E80D04E8E60326C70626
-:1032E0002600002626C60628004026C606290025F8
-:1032F000BF2A00E8B604E84604E8FA04C326C70675
-:103300000400C42A26C7060E003800A1A237500BBD
-:10331000C0750726C7060E00340026C7060600063D
-:103320000026C606190000E89903E8A4FD26C74553
-:1033300026002A580BC0750626C745260026A11C64
-:1033400037C1E0042688452826C645292483C72A94
-:10335000E82904E8A004E82205E8F803E80904C322
-:1033600026C7060400C42A26C7060E00320026C758
-:10337000060600060026C606190000E84503E850C8
-:10338000FD26C745260024A11C37C1E00426884538
-:103390002826C645292383C72AE8E003E86C04E809
-:1033A0008A04E89C04C326C7060400C42A26C7066C
-:1033B0000E00340026C7060600060026C6061900C1
-:1033C00000E8FF02E80AFD26C745260026A11C37B3
-:1033D000C1E0042688452826C645292283C72AE855
-:1033E0009A03E8C703E85703E8F803E87804E88A93
-:1033F00004C326C7060400744526C7060E003E0017
-:1034000026C7060600060026C7060A00040026C6D0
-:1034100006190000E8FC02E8A902833E8D37037517
-:10342000019026C7062600003026C6062800502632
-:10343000C606290020BF2A00E8D003E80103E8B54A
-:1034400003E89F03C326C70604006143B9F0008365
-:10345000E90226890E0E0026C7060600020026C6CF
-:103460000619000026C7061A00000026C7061C0021
-:10347000000026C7061E000000E8470283E90E860A
-:10348000CD26890E260086CD26C60628000026C633
-:1034900006290008BF2A0083E90426890D26C645AF
-:1034A00001268D7D0283E902BB0100B830304B75E7
-:1034B00017BB0A008AC4268805B03180C40180FC8D
-:1034C0003A750AB461E90500268805040147497583
-:1034D000DDC326C7060400044526C7060E001200F9
-:1034E00026C7060600060026C606190001E8E50103
-:1034F000E8D00126C7062600000426C606280000DC
-:1035000026C606290007C326C7060400C42A26C704
-:10351000060E00200026C7060600060026C606196D
-:103520000006E80402E89B0126C7062600001226D2
-:10353000C60628000026C606290006BF2A00E86B3A
-:1035400002E8FB01C326C7060400C42A26C7060EEC
-:1035500000200026C7060600060026C6061900053C
-:10356000E8C601E85D0126C7062600001226C60649
-:1035700028000026C606290005BF2A00E82D02E81B
-:10358000BD01C3FF06823426C70604003D4126C79D
-:10359000060E00200026C70606000E0026C60619E5
-:1035A0000004E88401E81B0126C706260000122655
-:1035B000C60628000026C606290004BF2A00E8EB3C
-:1035C00001E87B01C326C7060400674226C7060E32
-:1035D00000200026C7060600080026C606190003BC
-:1035E000E84601E8DD0026C7062600001226C606CA
-:1035F00028000026C606290003BF2A00E8AD01E81E
-:103600003D01C3FF06843426C7060400674226C76F
-:10361000060E00240026C7060600080026C6061966
-:103620000002E80401E89B0026C7062600001626D3
-:10363000C60628000026C606290002BF2A0026C6A4
-:10364000050426C6450101A10F3786E0F6066F374F
-:1036500001750F3906CC3474098BD8B88903CD397C
-:103660008BC3A3CC34268945028D7D04E83D01E857
-:10367000CD00C326C7060400C42A26C7060E001CB8
-:1036800000A1A237500BC0750726C7060E00180010
-:1036900026C7060600060026C606190000E8230015
-:1036A000E82EFA26C74526000E580BC0750626C719
-:1036B0004526000A26C645290083C72AE8BD00E83A
-:1036C000FF00C3565751B90300BED136BF2000F3E7
-:1036D000A5595F5EC3565751B90300BED136BF1A14
-:1036E00000F3A5595F5EC326C7061A00C00026C7AF
-:1036F000061C00000026C7061E000010C326C706D1
-:103700001A00C00026C7061C00000026C7061E00BF
-:103710000008C326C7061A00C00026C7061C000002
-:103720000026C7061E000002C326C7061A00C000F6
-:1037300026C7061C00FFFF26C7061E00FFFFC32684
-:10374000C6050826C64501028D7D02BE0537B903B0
-:1037500000F3A5C326C6050426C6450106A10D37FC
-:10376000268945028D7D04C326C6050426C645016B
-:1037700007A10B372689450283C704C3A1A2370BD3
-:10378000C0741326C6050426C6450109A1033726C1
-:1037900089450283C704C326C6050826C64501021B
-:1037A0008D7D02BE0537B90300F3A5C326C6050605
-:1037B00026C645010B8D7D02BEEF36B90200F3A58A
-:1037C000C326C6050626C6450120A16837268945B9
-:1037D00002A16A3726886505C1E00426884504836E
-:1037E000C706C326C6050426C645012126C74502CD
-:1037F000000083C704C326C6051426C64501228DD2
-:103800007D02BE1F37B90900F3A5C326C6050C26E5
-:10381000C64501238D7D021E0E1F8D364054B9030F
-:1038200000F3A533C0B90200F3AB1FC326C60508D9
-:1038300026C64501288D7D02BED136B90300F3A509
-:10384000C326C6050826C6450129A1C23486E0263E
-:10385000894502A19B362689450426884506268887
-:1038600045078D7D08C326C6050626C645012B8D56
-:103870007D02BEBB36B90200F3A5C326C6050626E7
-:10388000C645012C8D7D02BEE536B90200F3A5C305
-:1038900026C6050426C6450130A1373786E02689AD
-:1038A00045028D7D04C326C7060E001E0026C706EE
-:1038B0000600020026C606190000E86CFEE803FEBA
-:1038C00026C7062600001026C60628003026C60693
-:1038D000290011BF2A00E83500E84500E85500C37B
-:1038E00026C7060E00120026C7060600020026C6DE
-:1038F00006190000E832FEE8C9FD26C706260000CA
-:103900000426C60628003026C606290013C326C68C
-:10391000050426C645010C26C74502000183C704DD
-:10392000C326C6050426C645010E26C74502000269
-:1039300083C704C326C6050426C645012126C745FC
-:1039400002000083C704C300000000000000000064
-:10395000B339C939833AB339B339B3391C3A1C3A4C
-:10396000A3B634A1E936A31137A3D234A1EB36A311
-:103970001337A3D434A1ED36A31537A3D634A10150
-:1039800037A3CE34A1F736A31737A3DC34A1F93619
-:10399000A31937A3DE34F7069B360200750C33C03B
-:1039A000A09E368BF02EFFA45039E90F01BE070010
-:1039B000E919F1F6069D368074F3C606A03602C6F4
-:1039C000066E3708C606703702B88803CD39F6068A
-:1039D0006F3701754AA1D1363A06E93675413A2664
-:1039E000EA36753BA1D3363A06EB3675323A26EC09
-:1039F00036752CA1D5363A06ED3675233A26EE36C5
-:103A0000751DC606703702FE0E6E37750FB8880337
-:103A1000CD3A830E9B3612C606A0360CE9A8F0A15B
-:103A20000537263B0620007540A10737263B0622B6
-:103A3000007536A10937263B062400752CA09E365A
-:103A40003C02750826F6061800087547C6066E374C
-:103A500008FE0E7037751CC606703702E5020D01B0
-:103A60000425EFFFE702E95EF0C606703702C606DE
-:103A70006E3708E50225FFFB0D010025EFFFE70289
-:103A8000E944F0F7069B360001742526F606180077
-:103A90000875ED81269B367FFFB88903CD3AB8843F
-:103AA00003CD3AC606A036068326C234AFE917F026
-:103AB000A101373A260F377FC7E9F7FE83269B36E9
-:103AC000ECE82A0D810E9B368000BBFF7FCD53C6EC
-:103AD00006A03602E9F0EF830E9B3611C606A0362B
-:103AE0000CE9F9EF443B2C3BC72A6B3B443BC72A0C
-:103AF000C72AC72AA3B634810EC2340020F7064174
-:103B0000370100741B8CC3C70641370000B87F0320
-:103B1000CD3A33C08EC0BF5437B90600F3AB8EC365
-:103B200033C0A09E368BF02EFFA4E43AF7069B36F6
-:103B3000000175218326C234BFA1A936E700A19BED
-:103B400036E90900A19B3681269B36FFDFA90020BC
-:103B50007506E96E00E96FEF830E993604C70637E4
-:103B6000370100C606CA3401E95800830E9B36406F
-:103B7000E85800A105373B06E9367537A107373B02
-:103B800006EB36752EA109373B06ED367525FE0E80
-:103B90007137751CB88703CD3A830E993610A15042
-:103BA00037C7065037000009069936C606A0360802
-:103BB000E914EF830E993604C70637370300C606AB
-:103BC000CA3403C606A0360AE9FCEEA1D136263B6C
-:103BD0000620007515A1D336263B0622007512A1DA
-:103BE000D536263B062400750FC38D362000E90B21
-:103BF000008D362200E904008D36240083C402F7CC
-:103C000006E63401007415263A047708720E263A47
-:103C100064017208C606A03606E9ABEEE87C0A8CA1
-:103C2000C03DFFFF741B26C60618001026C70604F9
-:103C300000493C26C70606000C00CD50B94E00E2F4
-:103C4000FEC606A0360AE994EEE97BEE8F3C063DFF
-:103C5000063D063DD23CEA3C063D063DA3B6348116
-:103C600026C234AFDFC7064C370000B88A03CD3A0E
-:103C7000803E9D3604750C803E9E36067405C60651
-:103C80009F360633C0A09E368BF02EFFA44C3CF727
-:103C9000069B360020750E81269B36FFBFB88B032E
-:103CA000CD3AE95400F7069B3600017403E917EE9C
-:103CB000C70637370200C606CA3402830E99360497
-:103CC000830E503704F6069D3680752AE81F0BE9EF
-:103CD0002700F7069B36000175D3C7063737020069
-:103CE000C606CA3402830E993604C606A03600F60C
-:103CF000069D36807403E8DE0A81269B367CFFBB76
-:103D0000FFFFCD53CD54E9BEEDA3B634E8AD01B805
-:103D10008603CD39C7064C3700008126C234AFDF99
-:103D2000F6069D36807434F7069B3600207456F7ED
-:103D3000069B3600017427E83501721CBE004085E1
-:103D400036C23475080936C234FF069234E88B0156
-:103D50007306810E99368000E96CEDE9B500C7065F
-:103D600037370200C606CA3402830E993604830E22
-:103D7000503704803E9E36087403E85A0AE8EF0084
-:103D800072D6E9C8FF803E9E360A7512C606A03676
-:103D900000F7069B3608007402CD54E8390A8126E4
-:103DA0009B36FFBFE8C80072AFB88B03CD39E99CE2
-:103DB000FFF6069E36FF7558A3B634E8FE0081264E
-:103DC000C234FFBFF6069D36807448F7069B360066
-:103DD000207422F7069B3600407508E89100723087
-:103DE000E9220026A10C00A960007524810E663727
-:103DF0000008E9D2ECC7064C370000E871007210E9
-:103E0000B88B03CD39E8D3007306810E9936800054
-:103E1000E9B4EC803E9D3604750C803E9E360674F7
-:103E200046C6069F3606F7069B360001740C803E98
-:103E30009D36087505C6069F360AE8320072D1E83D
-:103E40009900803E9D36087513810E99368000F7E3
-:103E5000069B3600207508B88B03CD39E968ECC69F
-:103E6000069F360AE960ECB88603CD3AE958EC269D
-:103E7000A10C00A9600074088126C234FFBFF9C3F9
-:103E8000F7069B3600407413810E66370008E84A37
-:103E9000007306810E99368000F9C3810E9B3600AF
-:103EA0004080266F37FE81269B367FFFC606A036F0
-:103EB00000F8C3810E99360001E921EC26A120000B
-:103EC000A3FB36A3AA3426A12200A3FD36A3AC345B
-:103ED00026A12400A3FF36A3AE34C3A10537263B99
-:103EE0000620007519A10737263B062200750FA191
-:103EF0000937263B0624007505E80200F8C3511E69
-:103F0000068BC78D362000BF0537B903001E061F7C
-:103F100007F3A58BF88D362000BFA034B90300F35A
-:103F2000A5071F598BF8A10737A3A634A10937A30A
-:103F3000A834F9C3C606B63401E98BEBE887088BD1
-:103F4000F00512002629060E00268B442A263A0682
-:103F50000E00755B26832E0E000280FC277550260E
-:103F60008B442CA9FFFF75478BFE33C026F6453CDA
-:103F7000807406268A453A241F03F826807D450969
-:103F8000752D8CC28E0638348EDA8B0E0E00268983
-:103F90000E0E008D742CBF1800F3A433C08ED826EB
-:103FA000C7060400B53F26C70606000600CD50B878
-:103FB0000680E9EFE926A10C00A39337830E99361A
-:103FC00001E900EB26803E1C00FF752F26803E1E77
-:103FD00000FF752726F7060C004000751BA1D1369F
-:103FE00026A31A00A1D33626A31C00A1D53626A3EA
-:103FF0001E00B80A80E83607E9E2EAFF069034BE00
-:104000000A00C606B63401F6069D36807505830E95
-:10401000C23401E9B6EA803E9D360A750F26A10C2E
-:10402000002507003D04007503E87900A1F33686FA
-:10403000E0E71EA3E33681260B37000381260D3708
-:104040007B7F830E0D3748E81E0026A10C00250754
-:10405000003D0400740926F7060C0020007506B820
-:104060000100E93FE9E95FEAC70641370000B87F90
-:1040700003CD3AA11D37A3C43486E0687F031FA394
-:10408000060033C08ED8A10B37A3B234A10D37A3DD
-:10409000B434A1F336A3C834A1EF36A39C34A1F104
-:1040A00036A39E34C3800E9D3680BE0000E8B40760
-:1040B000B87B03CD3AB87C03CD39C706333702004D
-:1040C000A1E536E72EA1E736E73EB88203CD3AF701
-:1040D000069B3600207503E8FD06A1D336A3EF3614
-:1040E000A39C34A1D536A3F136A39E34C3F6069D16
-:1040F00036807431BE2200E91700F6069D368074C2
-:1041000024BE2300E90A00F6069D36807417BE24FB
-:104110000056E8A8058CC03DFFFF5E7405E8D7EFA8
-:10412000CD50E91FE8E99FE9000000000000000011
-:10413000B88403CD3AB88A03CD39E9F700803EA0B0
-:104140003608752EA9D007752CA1B1360D0004E7ED
-:1041500008E50025FF73E700B88A03CD3AE8C306F7
-:1041600033C0E70EE50A25C317E70ACD54C606A0FB
-:104170003600E968E9BE0400E93FE983269B36BFC3
-:10418000C606713703B88603CD3AB88803CD3AB86E
-:104190008303CD3AB88703CD39810EC2340020E9BC
-:1041A0009200E84906B88703CD39BBFF7FCD53B8ED
-:1041B0008403CD3AB88803CD3AB88B03CD3AB8839F
-:1041C00003CD3AB88603CD3AB88503CD3AC3E500AE
-:1041D00025FF53E700830EC234408326C234EFE844
-:1041E0000C06BBFF7FCD53B88A03CD3AB88503CD0B
-:1041F0003AB88603CD3AB88303CD3AB88703CD3AAF
-:10420000B88B03CD3AB88403CD3AB88903CD3AC30D
-:10421000830EC23450E81804E8D305F6066F370160
-:104220007512B88903CD39833E0F37007506C7066E
-:104230000F370400A19D3680FC087405B88403CDB7
-:1042400039E5020D010825EFFFE702A19D3686E062
-:1042500032E48BF0D1EE33C00D20000906AD36A15B
-:10426000AD36E704E953E8E95AE833C0A01B37D17B
-:10427000E03A06A0367503E9BAFFE960E8C70641EF
-:10428000370000E8C1E1E86A0633C00D4100E75697
-:10429000A1B1360D0010E708E50225F9FF0D030076
-:1042A000E702A1B336E70AA1AF36E706A1AD36E7CC
-:1042B00004E87C03E89F03C7061D3700C8C7060B48
-:1042C000370003C7060D377B7F33C0A39936A39B06
-:1042D00036A39D36A39F36A34C37A3F336A3EF3600
-:1042E000A3F136E882FDC6069F3602E9EFE7E50254
-:1042F0000D018825EFFF0D00400D0004E702E8F2F4
-:1043000005E50A0D4000E70A33C0A38137A38537CE
-:10431000A38337A38737A38937E5000D0084E7001F
-:10432000B88C03CD39B88000CD35C706AA02FFFF8F
-:10433000E50025FF7BE700810E9A378000B87E03F9
-:10434000CD3933C0E70EBE08008E063834E8A7ED3D
-:104350008326EF34DFFF068137CD50830EEF342004
-:10436000C3F7069A378000743DA9D0077410A900DE
-:1043700004741233C0E70EFF068737E9D2FFFF0649
-:104380008537E9CBFFFF068337E9C4FF83269A37D9
-:104390007FA18937030687373D05007F01C3BBFF37
-:1043A0007FCD53E90000E50225FFFB25EFFF0D015E
-:1043B00000E702A183373B0646377F2AA185373BBA
-:1043C0000648377C21A18937030687373D05007FE2
-:1043D00015C6069F3604E50225FFF70D010025EFFF
-:1043E000FFE702E9F7E6BE0100F7069B360300741B
-:1043F0000A83269B36FC830EC23404E9D0E6B87BE0
-:1044000003CD39E5020D016025EFFFE702C706F194
-:10441000342003B88E03CD39C38126C2347FFF8098
-:104420000E6F3701F7069B36030074D2B87B03CDBD
-:104430003AB87D03CD3983269B36EF33C0B08AA2CC
-:104440009F36A29D36C7064C370100C7060F3704BA
-:1044500000F7069B3640007506C7060F370300B805
-:104460008D03CD39E800D5E5020D014025EFFF8B26
-:10447000D8B87C03CD39C706333702008BC30D0093
-:104480002025F9FF0B06E83AE702C3FF0EF1347569
-:1044900001C3E54EA901007512E500A900047505E8
-:1044A0000D0004E700B88E03CD39C3E500A9000470
-:1044B00074F325FFFBE700E9EBFFC606A036048393
-:1044C000269B36FC810E9B368000E910E6B88E03F1
-:1044D000CD3ACD54810EAF360018A1AF36E706B8FD
-:1044E0007B03CD39A1D336A38F37A1D536A391371E
-:1044F000C7068B370200C7068D370200830E993638
-:1045000040E9D9E5803E9F36067515A9D00775ECC0
-:10451000250018750EFF0E8B3775E1C6069F36080D
-:10452000E9BAE5FF0E8D3775D3BE0800E99FE5B8FF
-:104530007B03CD39F7069B3600207408C6069F36EC
-:104540000AE90D00F7069B360040740BB88B03CDCB
-:1045500039810E99368000E983E5B87B03CD39C7F0
-:10456000068B370400C7068D370400810E9936008C
-:1045700002E969E5F6069D3680751BA9D00775EB43
-:10458000A90018750CFF0E8D3775E0E817FBE94C94
-:10459000E5B88203CD39C3FF0E8B3775CEBE090057
-:1045A000E92BE5C7063D370000C7069B360000E84B
-:1045B0003C028126AF36FFE7A1AF36E70681269B96
-:1045C00036FF7FE5020D010025EFFF25FFDFE70243
-:1045D000BBFF7FCD5333C0A39D36A39F36E8500069
-:1045E000E87300B88103CD39C3F7069B3603007426
-:1045F0000DC6069F3602C606A03600E9DFE4830E2C
-:104600009B3610C70699360000E8E702E5560D0212
-:1046100000E756C706A80200008B363D37E8440283
-:10462000C606A0360EE9B5E4000000000000000058
-:1046300006B88A03CD3AB88503CD3AB88603CD3A99
-:10464000B88303CD3AB88703CD3AB88B03CD3AB8D7
-:104650008803CD3A07C306B88803CD3AB87B03CDAB
-:104660003AB88203CD3AB87F03CD3AB87C03CD3A4D
-:10467000B87E03CD3AB88003CD3AB88103CD3AB8BD
-:104680008403CD3AB88903CD3AB87D03CD3AB88DCD
-:1046900003CD3AC7064137000007C3068E063834FB
-:1046A0001F8B0E0E0026890E0E00BE1800BF1800CC
-:1046B000F3A4061E07CD340733C08ED8C326F606F2
-:1046C000200080744433C026A02600241F8BF026CF
-:1046D0008B5C28891E6A37068E0638341FC0E304B7
-:1046E00026885C288BC6B90600BE2000BF1A00F3DE
-:1046F000A48BC883C706F3A426812626001F802624
-:10470000813626000080E9A9FF268B1E2800891E1D
-:104710006A37068E0638341FC0E30426881E280038
-:10472000B90600BE2000BF1A00F3A4E984FF86C4C6
-:10473000A36837E887FFF7066A370F007410803EDA
-:104740009E36007509BE0000E8ACE9CD50C3C350E9
-:10475000560633C026F606200080740626A02600E2
-:10476000241F8BF0268B5C2686FB83EB04744F831F
-:10477000C62A8CC08ED8B9070033C08EC0BF72372E
-:10478000F3AB33C98A0C80F9007503E930003BD9DB
-:104790007303E929002BD98A4401253F0074193D90
-:1047A0000B007D14D1E08BF82E8BBD5C498D74021B
-:1047B00083E902F3A4E9020003F123DB75C433C0EB
-:1047C0008ED8075E58C333C026F6062000807406D4
-:1047D00026A02600241FC3E50A25C3BFE70AB88622
-:1047E00003CD39B88303CD3981269B367CDFB8856C
-:1047F00003CD3AE50225FFF30D010025EFFFE702A7
-:10480000E50025FF53E700A1E73625FFFEA3E736C5
-:10481000E73E83269936CF810EAF360010A1AF3622
-:10482000E706C3E5020D010C25EFFFE702A1E7361D
-:104830000D0001E73EA3E736810E9B360020830E74
-:1048400099362081269B367CBF810EAF360010A1A1
-:10485000AF36E706B88603CD39B88503CD39B883BE
-:1048600003CD3AC30BF67549068E063234803EE01E
-:104870003401751B26893606008E06323426F7066B
-:104880000A000020740726810E0800002007C3805C
-:104890003EE33401751926893606008E0632342629
-:1048A000F7060A000010740726810E0800001007A2
-:1048B000C3E9B4FF50515733C0B906008EC0BFD111
-:1048C00036F3AE5F740C26F6060000C07504F85986
-:1048D00058C3F9E9F9FF8B050B45020B4504C35298
-:1048E00050E506251E003D1E0075F6B80180E75A0A
-:1048F000585AC3E8E9FF50E50225FF7F0D01002566
-:10490000EFFFE7020D0080E702A1AD36E704A1AF9B
-:1049100036E70658C3000000000000000000000059
-:104920002E2BCE4110427B413041A241AF4544295C
-:10493000C72AC72A6039F43A5C3C093DB13D343F8F
-:10494000C72A3C3FC72AC43F16401640ED40FA40F4
-:104950000741C72AC72AC72AC72AD65200000137EB
-:10496000E936F336EF361D370D370B379C370337F3
-:10497000FB36622D4006D12DF401BA4440068C432B
-:104980006400E82CC800D82B0500E9455000974585
-:10499000FA00AE2D04016A420200F62CBC02932DEF
-:1049A000DC051D2D6400A12D1400D73A0807812DC8
-:1049B0006400B33E020030436400C52CF4018B4414
-:1049C00002000000000000000000000000000000E5
-:1049D000803EFD3402740CE82005C706A1360000B5
-:1049E000E99AF8FF06C033E810058B363D37E873C7
-:1049F000FEC3CD34E9E805C706A3360000C706416B
-:104A0000370000E8EDFE33C00D4100E756A1B13696
-:104A10000D0010E708A1B336E70AA1AF36E706A1FB
-:104A2000AD36E704E82B09C7061D3700C8C7060BDB
-:104A3000370003C7060D377B7F33C0A39B36A39D8A
-:104A400036C7064C370100C6069E36FFC706053737
-:104A50000000C70607370000C70609370000A3F3A8
-:104A600036A3EF36A3F136E8FEF5E50225F9FF0D92
-:104A700003000D008825EFFF0D00400D0004E70244
-:104A8000B88F03CD39B88000CD35C706AA02FFFF25
-:104A9000A1A936A3A7360D00A40D0008E700A3A91D
-:104AA00036C706A3360100C706A5360C00833EA50F
-:104AB00036007509C7063D370500E913FFFF0EA54F
-:104AC00036BE1100E82205B89003CD39C3833EA35A
-:104AD000360174D9C3B89003CD3A26A02B00268B9B
-:104AE0001E2C00CD34833EA336017403E9F0043C50
-:104AF0000F751E81FB0002751826A12000A3053743
-:104B000026A12200A3073726A12400A30937E9091B
-:104B100000C7063D370100E9B6FEC706A33602000E
-:104B2000C6069E36FFE8CBFDE81CD933C0A3853707
-:104B3000A38337A38737A38937B89103CD39B880CA
-:104B400000CD35C706AA02FFFFE50025FF53E700A9
-:104B5000810E9A378000B89203CD3933C0E70EBE7C
-:104B600008008E063834E88EE526C70604007D4B23
-:104B70008326EF34DFCD50830EEF3420C3F7069A3F
-:104B80003780007432A9D007740CA90004740E3366
-:104B9000C0E70EE9DAFFFF068537E9D3FFFF06839A
-:104BA00037E9CCFFC7063D370100E936FE83269A78
-:104BB000377FBBFF7FCD53E5000D00ACE700E5027A
-:104BC00025FFFB25EFFF25FFF70D0100E702A1837D
-:104BD000373B0646377FCDA185373B0648377CC437
-:104BE000C706A3360300BE1300E8FD03B89303CD48
-:104BF00039B89403CD39B89603CD39B89503CD397A
-:104C0000BE0600E8E303E9D603833EA3360374013E
-:104C1000C3BE1300E8D203B89403CD39C3B89403DC
-:104C2000CD3A26A02B00268B1E2C00CD34833EA32C
-:104C300036037403E9A8033C0D753E83FB00753908
-:104C4000E5020D0020E702B89303CD3AC706A3366C
-:104C50000400BE0000E80CFCC6069D3680C6069E19
-:104C60003600C70633370200B89A03CD39E8FC0096
-:104C7000C7064C370000E96603C7063D370800E960
-:104C800061FD833EA336037509C7063D370500E97C
-:104C900051FDE94A03833EA336047412833EA336D2
-:104CA00005740BCD34C7063D370700E935FDC7064F
-:104CB000A3360600C6069E36FFB89A03CD3AB899C9
-:104CC00003CD3AB89603CD3AB89703CD39B89803D7
-:104CD000CD39B89B03CD39E918FDCD34833EA336D9
-:104CE000047718833EA336037508F7069B36000148
-:104CF0007509C7063D370100E9E8FCE9E102CD345A
-:104D0000833EA336027709C7063D370100E9D3FC8D
-:104D1000833EA336047705B89603CD39E9C00283F4
-:104D20003EA33603751026A10C00250700503D0454
-:104D3000007503E83600A1F33686E0E71EA3E336EC
-:104D400081260B37000381260D377B7F830E0D37BD
-:104D500048E814F3583D0400740926F7060C0020B7
-:104D6000007506B80100E97A02E986FCA1E536E79C
-:104D70002EA1E736E73EA1D336A39C34A1D536A3B6
-:104D80009E34C326803E1C00FF752F26803E1E00E9
-:104D9000FF752726F7060C004000751BA1D13626AB
-:104DA000A31A00A1D33626A31C00A1D53626A31E24
-:104DB00000B80A80E92C02E938FCFF069034BE0AEC
-:104DC00000C606B63401F6069D36807505830EC210
-:104DD0003401CD34E90CFC833EA336037509C706C4
-:104DE0003D370500E9FCFBE5020D03000D00880DD1
-:104DF00000400D0004E702C706A3360500C6069E64
-:104E000036FFBE0200E8E101B88903CD3AB89A0343
-:104E1000CD3AB89903CD39B89703CD39B89803CDB9
-:104E200039E9BB01833EA33603740A833EA33604EB
-:104E30007403E9AA01BE0600E8AE01B89503CD39B6
-:104E4000E99C01833EA336057403E99201BE02008A
-:104E5000E89601B89903CD39E98401C7060F3705F3
-:104E600000E97B01E50225FFDFE702C706A336075D
-:104E700000C7060F370500E96501E8D504C6069DA1
-:104E80003600C7069B360000C7060F370500C70669
-:104E9000A8020000C7064C370100E50225F9FF0D06
-:104EA00003000D008825EFFF0D00400D0004E70210
-:104EB000E967FCB89A03CD39F706F4330010750999
-:104EC000C70633370200E91601FF0E33377403E9D2
-:104ED0000D01FF068E34830EC23408C7063D37032A
-:104EE00000E9FFFAC35250BAE000B80010EF585A78
-:104EF000C3C7063D370000E9E9FAFAE85404B88070
-:104F0000038EC026C7060400D82BB87F038EC026A8
-:104F1000C7060400E82C33C08EC0A1A736A3A9366B
-:104F2000A1A936E700A1AB36E702C70605370000A6
-:104F3000C70607370000C70609370000C6069D36BA
-:104F400000C6069E36FFC7069B360000C706A3367E
-:104F50000000C7060F370000C706A8020000C706FA
-:104F60004C3701008126AF36FFE7A1AF36E706BB1D
-:104F7000FF7FCD53E87CF9E5560D0200E756FBC3F1
-:104F80008D3EC0538D36F038B90E008B1E303489FB
-:104F90005C022E8B45028944062E8B0589440483CE
-:104FA000C70483C610E2E8B880038EC026C7060493
-:104FB00000E251B87F038EC026C7060400B2523308
-:104FC000C08EC0C706A1360100C7060F370500C353
-:104FD00033FF8E06A6028B36A4022EFFA4A053E850
-:104FE0008CDBC3E848F7E9F6FF8E063834E807E1C2
-:104FF00026C7060400DF4FCD50C326C7060A0000AF
-:105000000026FF260400CD34E9D4FFA1D13626398D
-:10501000061A007522A1D3362639061C007518A180
-:10502000D5362639061E00750E26F7060C00400000
-:105030007405830E663740810EAF360010A1AF367F
-:10504000E706833EA336027505CD34E956FB833E61
-:10505000A3360074B1833EA3360577AA26F6060A66
-:1050600000FF75A2E8FDDD50F6069336207503E9D2
-:105070008C0026A10C002507003D07007503E9768A
-:10508000003D05007503E96E00F706E634188075EB
-:1050900003E96A00F706E6340080743526803E296D
-:1050A0000002752D5156578D363E348D3E2000B985
-:1050B0000600F3A65F5E59754526A12000A33E3485
-:1050C00026A12200A3403426A12400A34234E926CD
-:1050D00000F706E6340800740B26803E19000074C1
-:1050E00003E91300F706E6341000741226A0280026
-:1050F000C0E80422C0740726C7060400FFFF582337
-:10510000C07403E9DDFE81269B36FFFE26A1200048
-:105110003B06D136751A26A122003B06D336751000
-:1051200026A124003B06D5367506810E9B3600016C
-:1051300026A12000257FFFA3B83426A12200A3BA10
-:105140003426A12400A3BC348BC686C4A3C034D1AA
-:10515000E680FC097403E8F6F5A105370B0607376E
-:105160000B060937743E26A120003B06053775174C
-:1051700026A122003B060737750D26A124003B0619
-:1051800009377503E91D0026A02800240F3C03748D
-:105190001B3C00750F833EA336047410F7069B3644
-:1051A000000174082EFF94F853E933FECD34C7068E
-:1051B0003D370100E92CF8833EA336057410833E89
-:1051C000A336017E0983EE162EFF942454C3CD34FA
-:1051D000C326A10C003DFF7F740526FF260400E9CD
-:1051E000FDFDA1F433A90088740BA9001075098B8B
-:1051F0001E4337FFE3E99700C70635370500C706AA
-:1052000043372852F706F43300087406C7064337BD
-:105210001A52B88003CD39E9C5FDA9000874D9FF39
-:105220000E353775EDE93000A9000875CBFF0E3556
-:105230003775DF810EC234C000F6069D3680740FCC
-:10524000810E9B360080C7060F370200E990FDC72C
-:10525000063D370200E98BF780269E36FF7530F653
-:10526000069D36807420FF069434830E6637208EA8
-:1052700006303426F7060A000001740726810E085E
-:10528000000001E90900C7063D370400E954F78131
-:105290000EAF360008A1AF36E706E50AA900807414
-:1052A0000E8126AF36FFF7A1AF36E706E949FFE9E1
-:1052B0002DFDC70641370000BE2900E82BFDE91E81
-:1052C000FDCD34833EA336047709C7063D37010080
-:1052D000E910F7E909FDCD34C3C7069B360000E8A5
-:1052E0000CF58126AF36FFE7A1AF36E70681269B96
-:1052F00036FF7FE5020D010025EFFF25FFDFE70206
-:10530000BBFF7FCD5333C0A39D36A39F36E820F368
-:10531000E843F3830E9B3610C70699360000E8D2A7
-:10532000F5E5560D0200E756C706A8020000BE00CC
-:1053300000E830F5C606A0360EB89C03CD39B8801B
-:1053400000CD35C706AA02FFFFC706A1360100E956
-:10535000A5F606B88F03CD3AB89003CD3AB89103BD
-:10536000CD3AB89203CD3AB89303CD3AB89403CD71
-:105370003AB89503CD3AB89603CD3AB89703CD3AEB
-:10538000B89803CD3AB89903CD3AB89A03CD3AB854
-:105390009B03CD3AB87F03CD3AB88003CD3A07C31B
-:1053A000F749F14EDF4FDF4FDF4FDF4FF851DF4F4F
-:1053B000FA4F0B50D151DF4FDF4FDF4FDF4FDF4F41
-:1053C000E44E0600CD4A0400E44E1900AD4BFA004D
-:1053D000824C0807094C1400244E6400D74DF40198
-:1053E000644EBC027A4EE803434E0200B34EF40111
-:1053F0005B4EF401E54E140006500650954CC15228
-:10540000C152FE4CDA4C0650065006500650B751B9
-:10541000B751B751B751B751B7510650D54A065099
-:105420001D4C0650834D1F4D1F4DED40FA40074166
-:1054300037372E3737202079792F79792F797920CE
-:1054400030312E3930202030322F31372F3939206A
-:10545000000000000000000000000000000000004C
-:10546000000000000000000000000000000000003C
-:10547000000000000000000000000000000000002C
-:10548000000000000000000000000000000000001C
-:10549000000000000000000000000000000000000C
-:1054A00000000000000000000000000000000000FC
-:1054B00000000000000000000000000000000000EC
-:1054C00000000000000000000000000000000000DC
-:1054D00000000000000000000000000000000000CC
-:1054E00000000000000000000000000000000000BC
-:1054F00000000000000000000000000000000000AC
-:10550000000000000000000000000000000000009B
-:10551000000000000000000000000000000000008B
-:10552000000000000000000000000000000000007B
-:10553000000000000000000000000000000000006B
-:10554000000000000000000000000000000000005B
-:10555000000000000000000000000000000000004B
-:10556000000000000000000000000000000000003B
-:10557000000000000000000000000000000000002B
-:10558000000000000000000000000000000000001B
-:10559000000000000000000000000000000000000B
-:1055A00000000000000000000000000000000000FB
-:1055B00000000000000000000000000000000000EB
-:1055C00000000000000000000000000000000000DB
-:1055D00000000000000000000000000000000000CB
-:1055E00000000000000000000000000000000000BB
-:1055F00000000000000000000000000000000000AB
-:10560000000000000000000000000000000000009A
-:10561000000000000000000000000000000000008A
-:10562000000000000000000000000000000000007A
-:10563000000000000000000000000000000000006A
-:10564000000000000000000000000000000000005A
-:10565000000000000000000000000000000000004A
-:10566000000000000000000000000000000000003A
-:10567000000000000000000000000000000000002A
-:10568000000000000000000000000000000000001A
-:10569000000000000000000000000000000000000A
-:1056A00000000000000000000000000000000000FA
-:1056B00000000000000000000000000000000000EA
-:1056C00000000000000000000000000000000000DA
-:1056D00000000000000000000000000000000000CA
-:1056E00000000000000000000000000000000000BA
-:1056F00000000000000000000000000000000000AA
-:105700000000000000000000000000000000000099
-:105710000000000000000000000000000000000089
-:105720000000000000000000000000000000000079
-:105730000000000000000000000000000000000069
-:105740000000000000000000000000000000000059
-:105750000000000000000000000000000000000049
-:105760000000000000000000000000000000000039
-:105770000000000000000000000000000000000029
-:105780000000000000000000000000000000000019
-:105790000000000000000000000000000000000009
-:1057A00000000000000000000000000000000000F9
-:1057B00000000000000000000000000000000000E9
-:1057C00000000000000000000000000000000000D9
-:1057D00000000000000000000000000000000000C9
-:1057E00000000000000000000000000000000000B9
-:1057F00000000000000000000000000000000000A9
-:105800000000000000000000000000000000000098
-:105810000000000000000000000000000000000088
-:105820000000000000000000000000000000000078
-:105830000000000000000000000000000000000068
-:105840000000000000000000000000000000000058
-:105850000000000000000000000000000000000048
-:105860000000000000000000000000000000000038
-:105870000000000000000000000000000000000028
-:105880000000000000000000000000000000000018
-:105890000000000000000000000000000000000008
-:1058A00000000000000000000000000000000000F8
-:1058B00000000000000000000000000000000000E8
-:1058C00000000000000000000000000000000000D8
-:1058D00000000000000000000000000000000000C8
-:1058E00000000000000000000000000000000000B8
-:1058F00000000000000000000000000000000000A8
-:105900000000000000000000000000000000000097
-:105910000000000000000000000000000000000087
-:105920000000000000000000000000000000000077
-:105930000000000000000000000000000000000067
-:105940000000000000000000000000000000000057
-:105950000000000000000000000000000000000047
-:105960000000000000000000000000000000000037
-:105970000000000000000000000000000000000027
-:105980000000000000000000000000000000000017
-:105990000000000000000000000000000000000007
-:1059A00000000000000000000000000000000000F7
-:1059B00000000000000000000000000000000000E7
-:1059C00000000000000000000000000000000000D7
-:1059D00000000000000000000000000000000000C7
-:1059E00000000000000000000000000000000000B7
-:1059F00000000000000000000000000000000000A7
-:105A00000000000000000000000000000000000096
-:105A10000000000000000000000000000000000086
-:105A20000000000000000000000000000000000076
-:105A30000000000000000000000000000000000066
-:105A40000000000000000000000000000000000056
-:105A50000000000000000000000000000000000046
-:105A60000000000000000000000000000000000036
-:105A70000000000000000000000000000000000026
-:105A80000000000000000000000000000000000016
-:105A90000000000000000000000000000000000006
-:105AA00000000000000000000000000000000000F6
-:105AB00000000000000000000000000000000000E6
-:105AC00000000000000000000000000000000000D6
-:105AD00000000000000000000000000000000000C6
-:105AE00000000000000000000000000000000000B6
-:105AF00000000000000000000000000000000000A6
-:105B00000000000000000000000000000000000095
-:105B10000000000000000000000000000000000085
-:105B20000000000000000000000000000000000075
-:105B30000000000000000000000000000000000065
-:105B40000000000000000000000000000000000055
-:105B50000000000000000000000000000000000045
-:105B60000000000000000000000000000000000035
-:105B70000000000000000000000000000000000025
-:105B80000000000000000000000000000000000015
-:105B90000000000000000000000000000000000005
-:105BA00000000000000000000000000000000000F5
-:105BB00000000000000000000000000000000000E5
-:105BC00000000000000000000000000000000000D5
-:105BD00000000000000000000000000000000000C5
-:105BE00000000000000000000000000000000000B5
-:105BF00000000000000000000000000000000000A5
-:105C00000000000000000000000000000000000094
-:105C10000000000000000000000000000000000084
-:105C20000000000000000000000000000000000074
-:105C30000000000000000000000000000000000064
-:105C40000000000000000000000000000000000054
-:105C50000000000000000000000000000000000044
-:105C60000000000000000000000000000000000034
-:105C70000000000000000000000000000000000024
-:105C80000000000000000000000000000000000014
-:105C90000000000000000000000000000000000004
-:105CA00000000000000000000000000000000000F4
-:105CB00000000000000000000000000000000000E4
-:105CC00000000000000000000000000000000000D4
-:105CD00000000000000000000000000000000000C4
-:105CE00000000000000000000000000000000000B4
-:105CF00000000000000000000000000000000000A4
-:105D00000000000000000000000000000000000093
-:105D10000000000000000000000000000000000083
-:105D20000000000000000000000000000000000073
-:105D30000000000000000000000000000000000063
-:105D40000000000000000000000000000000000053
-:105D50000000000000000000000000000000000043
-:105D60000000000000000000000000000000000033
-:105D70000000000000000000000000000000000023
-:105D80000000000000000000000000000000000013
-:105D90000000000000000000000000000000000003
-:105DA00000000000000000000000000000000000F3
-:105DB00000000000000000000000000000000000E3
-:105DC00000000000000000000000000000000000D3
-:105DD00000000000000000000000000000000000C3
-:105DE00000000000000000000000000000000000B3
-:105DF00000000000000000000000000000000000A3
-:105E00000000000000000000000000000000000092
-:105E10000000000000000000000000000000000082
-:105E20000000000000000000000000000000000072
-:105E30000000000000000000000000000000000062
-:105E40000000000000000000000000000000000052
-:105E50000000000000000000000000000000000042
-:105E60000000000000000000000000000000000032
-:105E70000000000000000000000000000000000022
-:105E80000000000000000000000000000000000012
-:105E90000000000000000000000000000000000002
-:105EA00000000000000000000000000000000000F2
-:105EB00000000000000000000000000000000000E2
-:105EC00000000000000000000000000000000000D2
-:105ED00000000000000000000000000000000000C2
-:105EE00000000000000000000000000000000000B2
-:105EF00000000000000000000000000000000000A2
-:105F00000000000000000000000000000000000091
-:105F10000000000000000000000000000000000081
-:105F20000000000000000000000000000000000071
-:105F30000000000000000000000000000000000061
-:105F40000000000000000000000000000000000051
-:105F50000000000000000000000000000000000041
-:105F60000000000000000000000000000000000031
-:105F70000000000000000000000000000000000021
-:105F80000000000000000000000000000000000011
-:105F90000000000000000000000000000000000001
-:105FA00000000000000000000000000000000000F1
-:105FB00000000000000000000000000000000000E1
-:105FC00000000000000000000000000000000000D1
-:105FD00000000000000000000000000000000000C1
-:105FE00000000000000000000000000000000000B1
-:105FF00000000000000000000000000000000000A1
-:106000000000000000000000000000000000000090
-:106010000000000000000000000000000000000080
-:106020000000000000000000000000000000000070
-:106030000000000000000000000000000000000060
-:106040000000000000000000000000000000000050
-:106050000000000000000000000000000000000040
-:106060000000000000000000000000000000000030
-:106070000000000000000000000000000000000020
-:106080000000000000000000000000000000000010
-:106090000000000000000000000000000000000000
-:1060A00000000000000000000000000000000000F0
-:1060B00000000000000000000000000000000000E0
-:1060C00000000000000000000000000000000000D0
-:1060D00000000000000000000000000000000000C0
-:1060E00000000000000000000000000000000000B0
-:1060F00000000000000000000000000000000000A0
-:10610000000000000000000000000000000000008F
-:10611000000000000000000000000000000000007F
-:1061200090EAC01500000000000000000000130607
-:00000001FF
-/*
- * The firmware this driver downloads into the tokenring card is a
- * separate program and is not GPL'd source code, even though the Linux
- * side driver and the routine that loads this data into the card are.
- *
- * This firmware is licensed to you strictly for use in conjunction
- * with the use of 3Com 3C359 TokenRing adapters. There is no
- * waranty expressed or implied about its fitness for any purpose.
- */
-
-/* 3c359_microcode.mac: 3Com 3C359 Tokenring microcode.
- *
- * Notes:
- *  - Loaded from xl_init upon adapter initialization.
- *
- * Available from 3Com as part of their standard 3C359 driver.
- */
index 0d15a3d..344713b 100644 (file)
@@ -26,7 +26,6 @@ fw-shipped- += acenic/tg1.bin
 else
 acenic-objs := acenic/tg1.bin acenic/tg2.bin
 endif
-fw-shipped-$(CONFIG_3C359) += 3com/3C359.bin
 fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs)
 fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
                                         adaptec/starfire_tx.bin
@@ -86,7 +85,6 @@ fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \
                                         qlogic/12160.bin
 fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin
 fw-shipped-$(CONFIG_INFINIBAND_QIB) += qlogic/sd7220.fw
-fw-shipped-$(CONFIG_SMCTR) += tr_smctr.bin
 fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp
 fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \
                                     ess/maestro3_assp_minisrc.fw
index 182ecb6..8388f02 100644 (file)
@@ -88,18 +88,6 @@ Licence: Allegedly GPLv2+, but no source visible. Marked:
   QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
   Copyright (C) 2001 Qlogic Corporation (www.qlogic.com)
 
---------------------------------------------------------------------------
-Driver: smctr -- SMC ISA/MCA Token Ring adapter
-
-File: tr_smctr.bin
-Info: MCT.BIN v6.3C1 03/01/95
-
-Original licence info:
-
- * This firmware is licensed to you strictly for use in conjunction
- * with the use of SMC TokenRing adapters. There is no waranty
- * expressed or implied about its fitness for any purpose.
-
 --------------------------------------------------------------------------
 
 Driver: kaweth -- USB KLSI KL5USB101-based Ethernet device
@@ -567,32 +555,6 @@ Found in hex form in kernel source.
 
 --------------------------------------------------------------------------
 
-Driver: 3C359 - 3Com 3C359 Token Link Velocity XL adapter
-
-File: 3com/3C359.bin
-
-Licence:
-/*
- * The firmware this driver downloads into the tokenring card is a
- * separate program and is not GPL'd source code, even though the Linux
- * side driver and the routine that loads this data into the card are.
- *
- * This firmware is licensed to you strictly for use in conjunction
- * with the use of 3Com 3C359 TokenRing adapters. There is no
- * waranty expressed or implied about its fitness for any purpose.
- */
-/* 3c359_microcode.mac: 3Com 3C359 Tokenring microcode.
- *
- * Notes:
- *  - Loaded from xl_init upon adapter initialization.
- *
- * Available from 3Com as part of their standard 3C359 driver.
- */
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
 Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter
 
 File: cis/LA-PCM.cis
diff --git a/firmware/tr_smctr.bin.ihex b/firmware/tr_smctr.bin.ihex
deleted file mode 100644 (file)
index 6797451..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-:10000000BC1D123B63B4E900001F000101000205A2
-:10001000010006030100040901000A070100080BA2
-:1000200001000C000000000F0100100D01000E1374
-:10003000010014110100120000050015010016193D
-:1000400001001A1701001800000E00000001000056
-:100050000004001B01001C0000070000000F00004E
-:10006000000B001D01001E0000080000000200003F
-:10007000000C000000060000000D0000000300005E
-:10008000000A00000009000478C6BC0194049380B3
-:10009000C84062E9DA1C2C1555555555555555582B
-:1000A0000BE9E5D595C19D77CEBBA06E1C05F67713
-:1000B000C602FA9670E81DC0170E02FA587DC05F9E
-:1000C00072CEECA4C384907A30CD8D7919E76C247C
-:1000D000279C08390738A84A4CEA4D989B244CC005
-:1000E00026D3E7545A4DF24C0C13234990326EA498
-:1000F000DF9371137726E126F8260C4C12260809A7
-:10010000828260A9307936B0B2A8A772648F9B331F
-:1001100033F9B839D51173AA75265D2651932A494A
-:1001200094C99589BC4DC89B809BA099064C862696
-:10013000589BA49B9937626C679B3330BF366661CE
-:10014000BF36ECC5BD66825A5031D59D9818293C02
-:1001500098864C17263E2CB8693B492EB408431AA2
-:10016000A4F9B351F110F343CD086F6379B3330EA3
-:100170001398499804DA7CE05279310C982E4DACF2
-:100180002C8414EE4CFE675EE49A7529D7A9353AA3
-:10019000945BD59B58B4AF7566AF14A9EF40952515
-:1001A00008B9AD42FCD8D98C330E1398661E45AC05
-:1001B000B00C42D3CCA61262DEB4B180497DA2DE7F
-:1001C000B418C02484E654F5834601681A630CC64B
-:1001D0001264FA4C351C2C0EAAAAAAAAAAAAAAAA88
-:1001E000AAAAAAAAAAADD70270E04CF3A1C1D5C0B1
-:1001F0003CB96939604E58770267933C99E4CF382F
-:100200001C972E401B903146A35E0E88346A35E061
-:10021000E8AA351AA9F51546A3EA7D4AA351AA9F73
-:100220007054A6572EB4CDC8A30CC1DAC6E1CB7A60
-:10023000D41C68FFCF55A8C02D851117442A300B58
-:100240004A88C24DB520D5260169516952195260BC
-:100250001695168296549805A545F3DD6AF9281877
-:10026000EF003030514E445D12D143E6126F9EBA1A
-:10027000CCDF25031DE006060A30CCA9EB2D008655
-:10028000A612654F56D665495F3DE837C940C77825
-:100290000181828C33184980AE40C518059C6D18C9
-:1002A000660EF3A0C61262DEF504B4AC6BC61991FB
-:1002B0007305482E72948073A1C8473666642F3642
-:1002C0006664079902918E72D10F9D063173A0C3A7
-:1002D000516A1A20BF3A0C2C7387435E600223FCDC
-:1002E000E0D635EF9EF5EF92818EF0030305186698
-:1002F00045CC0B482E700A4039D0E4239B3332178B
-:100300009B333203CC8548C73814A5CE297ED280D2
-:10031000A1A8B448882FCE830B1CE1D0D7980488BD
-:1003200087CE963173A58FF38358D7BE7B82AF9269
-:10033000818EF0030305186645CC1520B9C8290045
-:10034000E743908E6CCCC85E6CCCC80F3205231C82
-:10035000E450D45A17882FCE8310F9D023173A04CB
-:1003600035E600221639C3A3FCE0D635E0BFF41809
-:10037000F22D4D43516E5A221F30D417E74191732D
-:1003800005482E776900E743908E6CCCC85E6CCC34
-:10039000C80F3205231CEF4C4E0604C99E0BFF41CB
-:1003A0008F22D4D43516E5A221F35A82FCE8322EEE
-:1003B00060A905CE1348073A1C8473666642F3664B
-:1003C000664079902918E70A989C0A9EB5125C7CD1
-:1003D000C3318B982A7CD3ED38E9D34E74ED499E16
-:1003E0000BFF418F22D4D43516E5A22DEB45338F78
-:1003F000FCF7A05F25031DE40E060A30CC0CF3EBDE
-:1004000040DE61A870920A00E1241E00E1241E0073
-:10041000E1241E00E1241E00E1241E010F982A0B96
-:10042000F3A0C8B9A2A4173A6900E743908E7548B3
-:100430005E706901E6005231CC1814A5CC09829493
-:10044000730CA091F525CC070684849F30A2A47D6F
-:100450005075A665014A8EB4CCC435547566A49710
-:100460007A895053138019E3495C6DCEA940350653
-:1004700078D25706F1B32A8D972362925D69991C51
-:100480006A36E6CD46126F9EE1ABE4A30CC0DEAC4B
-:10049000D40D281BD012A500F84BAD332806A0DEE2
-:1004A00014973A895DC00DE30690925D699866B92C
-:1004B0001995E4A8CF9D331849BE7B86AF928C3343
-:1004C00024140CF4832421C270BFF418F22D4D4380
-:1004D000516E5A221F32A82FCE8322E605A4173A66
-:1004E0006900E743908E75485E706901E642A46337
-:1004F0009802294B9A2978E9405313818132678207
-:10050000FFD063C8B5350D45AE50087CE0D05F9D87
-:100510000645CC01A4173A6900E743908E75485E02
-:10052000706901E659A463981C52973B30528E7D46
-:100530002A091F51EBA4A40AB99487AEC531380229
-:10054000FFD063C8B5350D45AE50087CEA20BF3AF0
-:100550000C8B9A16905CE9A4039D0E4239D5217943
-:1005600095480F300A918E60EB297300095404CA34
-:1005700082655265E4CA226572650932E099724C5F
-:10058000C4E00BFF418F22D4D43516B94021F38A41
-:1005900082FCE8322E60A905CE9A4039D0E4239D32
-:1005A00052179954619901E640A4639804B1849864
-:1005B00018EF2D0305313802FFD063C8B5350D455E
-:1005C000B968887CE0505F9D0645CC81482E713427
-:1005D0008F48014815210521E90A5203CE5A4639B0
-:1005E000CF478E60AB1AF35343EB3524B81B30076B
-:1005F000098A742F7E41741E1D0D874649D595D1F9
-:10060000D5D5BBA94E829D053A0A7414E829D0427B
-:10061000745BCE50C40745BCE20C40745BCE8304CF
-:10062000F9954D13635E6F313BA08BA2C5398D7870
-:100630003A22A0006BC1D1546016D991A2E7438C35
-:1006400024DC1CE05117396B3BCC4B422E6B50BF66
-:100650003636654F7A185525789823E7503EF38152
-:100660004C026D3E7153AF78A9D4A629B1BCD9997B
-:10067000B28E628F222E7516B0B2AB23281654525A
-:1006800031BCD999B28E6619022E7516502CA9C8A4
-:10069000C6F520D3E47F4F9C0AD6167F90EE4CEB34
-:1006A000CFE288BA2F4286AEBDE5A7529F93637909
-:1006B000EB3308F9945247CD99256F3A0C13E65560
-:1006C000344C5A4DB52395A548115A0A4395AC2C84
-:1006D000BA240549B1BCCAA7726C6BC5BDE83169C3
-:1006E000525D0612653EB1504C7D4FAC0A300B3660
-:1006F0006411738A838E75129F7BD29958EE822E75
-:1007000077A0E39D5D4FBC2A532953DE9324BAB3EF
-:1007100036AA4AC679D4B9DE625A11735050BF372F
-:10072000366F1323BA0C24CEBDE2A752B28E6B6093
-:10073000622E751330ACA059CA646379B333651C5B
-:10074000CC32045CEA2CA059DF231BD4835247DD52
-:100750007996D49EB3524BA25A1A8D5D7B82A752D2
-:10076000B28E6619022E7516502C8C321D7B8EA708
-:1007700052B1BCD9999804DA7CE2ACFE6619022E1B
-:100780006550BF336664FE7418864C1726D6165221
-:100790003918DE7ACCC23E651491F36649086E833F
-:1007A0000933AF31ED0D9D0612622A318D6DE7419F
-:1007B000827CCAA68987092E29B1AF1039D66497E1
-:1007C000301D42759344028C24D27AB350F68905C9
-:1007D000435E6198C02C92253C8B2489490549E7EA
-:1007E0000CB98498B7AD3344AE5A5186609F38A98E
-:1007F000A26C6BC48EF45E49461262DEB4CD215CFD
-:10080000B4A30CC13E7229A26C6BC6126247F0E819
-:10081000C33204354092A4828810927CCBD42FA49A
-:1008200002118498B7AD3344AE5A5186609F38A9FF
-:10083000A26C6BC48EF45E494408493E65EA17D247
-:100840000108C24C5BD699A42B9694619827CE459B
-:10085000344D8D78810927CCBD12286C58AFB6F382
-:10086000A0C13E655344D8D7928E7D4BC2FA612613
-:10087000063AB36B030549E70CB96F5A66955CB449
-:10088000A30CC13E7029A26EA4DF9371137726E1F9
-:1008900026F826C6BC9473F92F0BE9849818EACC85
-:1008A000EC0C15279C32FF3D56AF928B7AD335D591
-:1008B000CB4A30CC13E7029A26C6BC947341979179
-:1008C000F483CE0420628B0516498C24C0C7569051
-:1008D000C0C15279C32E5BD5A672D294FAAD58C866
-:1008E000FA9F54B3324BB954A651866B79D0609FAE
-:1008F0003205344D8D7A4D1E7AB35100A93D59A869
-:100900007B4482A1AF4A8D52A95241494F3A2E40B1
-:10091000A49950BE90085279C32E61262DEB4CD07D
-:1009200015CB4A30CC13E7029A26C6BC48FE1D25DB
-:1009300046A954A920A4A79D1720524CA85F48049B
-:100940002309316F5A6680AE5A5186609F3814D1A0
-:100950003635E4A79D1720524CA2450D8B15F49116
-:10096000DE8BC928C24C5BD699A95CB4A30CD6F324
-:10097000A0C13E640A689B1AF16D4CAA92E03694BD
-:10098000709B297813AEB3AA85D44375093AC9EB95
-:100990003524B81B328E13487E4EFD40FD40FD408D
-:1009A000FD40FD40FC13F421F917458A300B335FFD
-:1009B00083A22A300B335F83A2A8C02DB32070928C
-:1009C000139ADE741827CCAA689B1AF70745518042
-:1009D0005B66470738A823E751113FE0E8854601E9
-:1009E0006D990612654F7A2024BAB33215257BAD76
-:1009F0003378AE0E73D047CEA730CC44FF83A2A885
-:100A0000C02CD991C1D11518059B3208BA2C518040
-:100A100059B3207092E29889FDBCEE1890FC8BA22D
-:100A2000C52B0D783A22A561AF074551805B66441E
-:100A30009EB3524B83ADC709BE1F9F74655D0A17F5
-:100A40007CABA0C24C3849122E384907A30CC13EDA
-:100A5000655344D8D7ADE700324B9B33344A03008B
-:100A60009D25CE8324B819998C02124BA199D8C028
-:100A7000274973CFF93CF47CE79804E92E7F39E3EA
-:100A80004F4653C06013A4B9E53C03DE8F9CF300CE
-:100A90009C6FCF3E85F9A336021E6038923E631AE2
-:100AA000109FCF181092BCD0A40CDCC00F9C9734C0
-:100AB00062B6E7F3F3A5CF1842341CC2CAFA8E68B7
-:100AC0005206AF3CA30DBF9E50E1D173CAE03AFC81
-:100AD000C1091A1E6A5C5B8E634E7773CC6167DD59
-:100AE000E66C48D1F31B24695108D4421BF467D14A
-:100AF000804E2FD08CD83009C21E801C46013A4748
-:100B0000D031A106013A7F4630211804E95E8429DC
-:100B100000C027CDD0007C9804F92E84628C027D21
-:100B2000BA3E7E4C027D2E8C61083009F41D0165B1
-:100B300073009F51D085201804FABD194618C027AC
-:100B4000DFD194384C027D174657013009F5FA0180
-:100B50000906013E87A14B88C027DC740D39D300FC
-:100B60009F73D030B39804FBBD06C483009F47D069
-:100B70003648CC0271BF3F9A17E63F0821E692A49F
-:100B80008F9A1031A7F310B184AF3AACDCF773F24F
-:100B90005CC62ADB9E7E7E97310863D0737B43A8B8
-:100BA000E63D34EAF3E315BF9F185F45CFE89F5F4A
-:100BB0009A5B03D0F3D3CE371CD00FBB9E68783B33
-:100BC000BCCA31E8F9A20212A27351086FD1F346F0
-:100BD0000138BF40FC23009C21E84951804E91F42C
-:100BE000210319804E9FD0216306013A568C02746E
-:100BF000FE75495E63D34A54423513A7D1804E95A2
-:100C0000E81E9A4C027CDD1BB9E6013E4BA062A3B4
-:100C1000009F6E8CFCF3009F4BA04218CC027D0716
-:100C200043DA13009F51D03D349804FABD1C628C06
-:100C3000027DFD1C6173009F45D1F44E6013EBF4FF
-:100C400025B033009F43D1A79C1804FB8E8403E991
-:100C5000804FB9E843C13009F77A0A319804FA3E67
-:100C6000844041804E82E7418709230423009D058B
-:100C7000CE961C248C108C0274173A043849182123
-:100C80001804E82E7450E12460846013A0B9D411D4
-:100C9000C248C108C0274173A82384918211804EA5
-:100CA00082E7528E12460846013A0B9D401C248C66
-:100CB000108C0274173A090E12460846013A0B9836
-:100CC0006A1C24B0E11804E82E6B50E1258708C0A7
-:100CD000274173054384961C23009D05CCAA1C2440
-:100CE000B0E11804E82E70687092C3846013E54484
-:100CF000F9409D05CE5A1C24B0E11804F9D13E708C
-:100D000027CF13E5442CA042CB89F2213A0B9C0A51
-:100D10001C24B0E11804F9D10B3810B3C4213936C2
-:100D20005C42C8842B79D061C2741524BAD331E5F2
-:100D300059082908E066634295128100290BC151C8
-:100D400024B81999902290B418A0914101414141D1
-:100D50005283CA4028682908BA16109C990B5694E9
-:100D600090521574C0271A2AD29025D3009D28AB23
-:100D70004A42174C0270D4842E9804E12A42174C40
-:100D8000027082904BA60138514842E9804E15A46A
-:100D90002174C0270FA412E9804E82AC80ACA0ACB5
-:100DA000A959E5644565CAC84ACE0ACE4ACE95918E
-:100DB000959495932925C0CCCC88A4975636647217
-:100DC00090548A9C4508B9B766129309C9B2748ECB
-:100DD000BA6013E5348EBA6013E4748EBA6013E51A
-:100DE000691D74C027CA291D74C027CED225D3001F
-:100DF0009F38A44BA6013E5E912E9804F915225D02
-:100E00003009F3E912E9804F905225D3009DC5487F
-:100E100025D3009C45CECD09C9B21A44BA6013E768
-:100E2000348974C0271C27B79C80C2D776599B93FE
-:100E30000C64C31D1BF4454BC7C63A37E8814BC74A
-:100E4000C63A37E8914BC7C632618EB3BCC34A225B
-:100E5000E6B5249771C987B431AE73A2CF39D25D9C
-:100E6000044442C0D6DE710616BBDBCE830C64C3DD
-:100E70001D311304F9954D133293635E6614CC292A
-:100E80002A5330A6614CC299853A72CCC299850624
-:100E90001BB30A661414249985330A08B186614C81
-:100EA000C2842168733B30A661414EA5985330AC93
-:100EB0005976614CC2B08DD6614CC2B02CF6614CF3
-:100EC000C2B18CA5985330AC0F24CC2998560F286A
-:100ED0006615921A1985330ACA850CC2998565C3AD
-:100EE000D985330ACE7086614CC2B397710C993B99
-:100EF000CC83580BEA779D064ABE047460E0D14E5D
-:100F0000384C3EEE3EEE3EEE3EEE30BBCAE11F7781
-:100F10001F771F771F7727708FBB800E11F771F730
-:100F20007C6F3CB33602FB8DE655707F2D246955EE
-:100F30004F58A9231F54F78A95252B750CCCAC5616
-:100F400051CC51E445CEA21239C0A0AF566A497FB8
-:100F5000028C09F80BEBAF56766752B28E69A71177
-:100F600073A8B1BCCAA0A936502C98E70AF566A4AC
-:100F700097E25A3027BAF7834EA5330A66158DE6F5
-:100F80005539D2A7AC546016701B728E628F222E18
-:100F9000751602FB8DE60A953D62A300B701B553B5
-:100FA000DE2A5494ADD43332B15947314791173AC0
-:100FB0008848E702B017DC679D4B8DE752AA7BD4C7
-:100FC000AA92BDD699BC5602FB8CF36666C6F36640
-:100FD0006662992AF8186870B08A0D5555555552B1
-:100FE00032E1405C380BEA9B87017DC05F7017DC03
-:100FF00005F5DC9B017D614D80BEA77982A21F5063
-:10100000152A8F8B1CE5A5138458E702915405021D
-:101010004BBD221A947F9C1AC05F421A21D180597D
-:10102000C06D1C2C0A83555555555555555555556C
-:1010300055541CB85C6E179C2F385E70E7B85E7014
-:10104000BCE179C2F385E70BCE179C299C299C292A
-:101050009C230F5814EE357726219305C9B017D27B
-:101060001D188A219305C9B017D187AC0A740FAE39
-:10107000F55A82A3E43A3114BBD7599974A21930B6
-:101080005C9B017D187AC0A740F843D4638925D0C2
-:1010900010D61C6A10F5558925D151661F51F5915E
-:1010A000492E8915986AA3E08A9465640E1317384F
-:1010B000A8864C1726C05F461EB028631F087A8C8E
-:1010C0007124BA021AD00D421EAAB124BA2A2D31B7
-:1010D000F51F587492E8875A6352DEF451694A3E0C
-:1010E00009694650F0E131730545BD598D8B4A7C45
-:1010F000D3ED38E9D34E74ED443260B93602FA5B71
-:10110000DE8A2D29D0E121F5A39221F219305C9BD2
-:10111000017D21F5A0C6016701B445CEA51239D4E1
-:101120001C05F440A1C2C3506AAAAAAAAAAAAAAAE4
-:10113000AAAAAAAAAAAA81AF869F191BE781F3656A
-:10114000F280BE7017DFDF380BEB0DC380BEA70F38
-:10115000954F5A94C02CD8B1A7CE5A1173A83AC251
-:10116000CCB63017DC6F35A9804DA7CE2A1879C5CB
-:1011700049DE61A822E75033F9986408B99542FC2A
-:10118000CCD9953D62A248D448E70288B9C1A0E312
-:101190009D4E62E6CCC66BCE8310C982E4DAC2C82B
-:1011A0001EC3B93602FAA9EB4E3030FA0DF0A9EBA6
-:1011B00040B90FAA7AD2C2C8FAA7AD410A47D53DB5
-:1011C00068ACF1F54F5A97547D4FA8AA551F11737B
-:1011D0005AB017DE5D59A925D0552A46BCB822AEB3
-:1011E00045293E14FAE19994CA4ABE3DD699925DCA
-:1011F0001517C8D7DC15178A401F0A9EACC9654968
-:101200005C1D10684A3E5BDE83169580BE91745863
-:10121000A4007C38E7563017DF75A6649745209DFB
-:10122000035F70545E291DF0A9EACC865495C1D1A4
-:1012300006830FAA7BD0654945BDE962D291DF04E0
-:101240005D16291C7D4FAC1A471AA9F5676653280D
-:10125000B7BD2C5A523BE3DD59A925D1A8AC086B88
-:10126000EE08ABC5202F854F566675495C1C181DCE
-:1012700081C26405F080BE355CD017C255F0957C04
-:10128000255F080BE1017C7BAB3524BA1055931A1E
-:10129000FB822AF148D7C2A7AB31B2A4AC639D4A06
-:1012A0008D7C7BAB3524BA1054308D7DC11578AC64
-:1012B0006F5A94601AE379D4AA4F854F5666D54980
-:1012C00058C73A9549F045D1629486BC1D13D29017
-:1012D000FFCF7A83F25031DE006060A11735A85F3E
-:1012E0009B1B3707441A300B380DBC1CE0D047CE8F
-:1012F000A0AA7AA1986A92953D6831805B80DAA9AC
-:10130000EF41952516F7A58B4AC679B333602FAA0E
-:101310009EB15180599ECAA7AC0A300B67B2ADD5B9
-:10132000DA925D17A300B32D956E08A958A1173A5C
-:101330008B017D54F78E9525081CE05602FBC1D128
-:10134000151805926B3C1D1228C02CA56C11701746
-:10135000B2384D80BEE02FB4EC4AEDB39E02FB8064
-:10136000BEE02FB139933E6DE710609F32A9A26CA9
-:1013700005F440E60A953D6A2300B380DAA7D62A31
-:10138000030D7017D22E76294FBC54A6516F7A5890
-:10139000B4AC05F48BA2F40E350D492EB4CC18A5CF
-:1013A000C8F84A9723E1052E47C28A5C8F85697287
-:1013B0003E1F4AC3551F5643328CA35E60A845CEDC
-:1013C0000D602FA3849DD8F017D22E0E1B2384D836
-:1013D0000BEB89F380BEE02FBB3985DF2203E701E9
-:1013E0007DC05F7017D11738145BD6A2740D4B7A8D
-:1013F000B33196946BCC3523D749481573290F5DCB
-:101400008AC05F4D79843580BE881CC3529F59685D
-:10141000C02CE036AA7BCD4A92BEF3814A7D5B594F
-:1014200094CA1C24EEC780BE881CC3529F5968C052
-:101430002CE036AA7BCD4A92BEF38143849C7B3854
-:101440000BEBAF70D4EA53009B4F9C5430F38A945B
-:10145000FAB6B3299422E61A85F9B05993F9D2C4A1
-:101460003260B936B0B390D977261C2722E896B4FB
-:1014700023EA9EB511805965862073968D79AD5803
-:101480000BE917448A4A07D77A82A190FAEF0154F0
-:10149000BA50D4591E2CE9F38A99856B0B23159702
-:1014A00072611730D42C738748AA028125DE910D12
-:1014B0004AC05F7ED280A53EB2D0C86B80BE881C79
-:1014C000EA0917441A371A917458A371AF074454A4
-:1014D0006E35E0E8AA640F90FAD06300B380DA2C8E
-:1014E000738748AA028125DE910D4AC05F48BA275A
-:1014F000A300B701B74F9CB46BCC3516F566632DCE
-:10150000291EBA4A40AB99487AEC508B9C0822FCC1
-:10151000F9B2553D62A92351239C0A3C730D445CEA
-:10152000E15071CEA11FE7156B0B25ED0B93602FDA
-:10153000AA9EAC3665495F7A2050087FEF3914497E
-:10154000011181046040CC59C0AD23EB41B081F260
-:101550003A41AA5043E4D48654A087C152CA9301A9
-:1015600032549D2402000052AF1646A7916708B47A
-:101570000451F16519B46E2DC0AD490092571B742A
-:10158000455F2351B7440A1006A36E8B6B081F19E1
-:10159000D1E680828054042A4591A9E459C22D01E4
-:1015A000140450D3FC558461D980512FE21F465F4B
-:1015B00040E020154ABC591A9E459C22D01148CBC8
-:1015C000E81408015415E2C8D4F22CE116808A46CA
-:1015D0005F527CD9A8F888D05A3CD25C5B80DAA7ED
-:1015E000D65A0886A45D17A0C3522E88A8221F537E
-:1015F000EADACCA650E127763C05F54FAB6B329981
-:1016000043849C7B380BE927ACD492E00EDA384D4A
-:1016100080BEE67D50BA51AE66EFBCDC7B871E0211
-:10162000FA93E6CD47C443CD0F349DA300B05501D6
-:10163000AE038404CE01D0E17002800E89E9221F3E
-:10164000E0E896B011F4C2CE036A442DC06D48059F
-:10165000B80DA300B776D5DEB150DC7D77BC54BAA7
-:10166000527F5814340F9AF381580BEAEF581460E4
-:1016700016A56C2EF7814BA56F7D5DEEB52E95807E
-:10168000BEF073BD047CEAFEEB4CDE2953DD6A54E8
-:1016900094A9EA0A8C02D64C3C05F400EACD56AF78
-:1016A000C047D29C8D29CAE02FAEBD75999D4AF9DD
-:1016B000EF517C940C77801818292AF8E0E8AA30BA
-:1016C0000B2A987C1D1151805954C351F51B3324AA
-:1016D000BB82A5195C1D1028C02C9AC7C1D1228CD1
-:1016E00002C994645C0CD68E13602FB80BEA30E309
-:1016F000C05F48DC780BE800E3C05F6C38D52E355E
-:101700004F5A8A61AA9F561B32994642C8010C451E
-:10171000CEA517E6C6CEA9EB151646A24738144348
-:101720002622E73D602FAA9EB512E07F017DE3E708
-:101730000293F995445CE5A0E39D4A7F9C54A9EB94
-:10174000510546B9FCC01B222E64542FCD46CCA7B0
-:10175000D586CCA65055C645CE5A0E39D4A7F9C564
-:101760004A9EB5118059C06DCFE600D9117322A1F0
-:101770007E6A36653EAC366532B017DD3E72D27990
-:10178000310C982E4C20732A8FF38AADE741827C6E
-:10179000CAA689B5859FB0F017D51F5454251AA83D
-:1017A000FF2A946511D74944D5CCA055D8AE0E88F0
-:1017B0001460164D6322E07286384D80BEE02FB86B
-:1017C0000BEE02FB8138F017D7D71E02FAFAE3C0FE
-:1017D0005F4C85900218C85B80DA300B701B4C227E
-:1017E000D34C33038C2E4C4326D0F56366D095A79B
-:1017F000CE45330AD61642386EE4CEBD592CD2AB54
-:10180000BA949DE61AB017D54F5A8B091A88B9C5F4
-:10181000424730D43216728865BD599925A5602F8C
-:10182000B860F308B74A1A8FAB0D994651AF38A884
-:101830008E9065135218A054B1422E61A848E72D2E
-:1018400016F7A805A5602FA475D251357328157613
-:101850002B83A20518059358C8B806286384D80BB3
-:10186000EE02FB80BEE02FA043A7017D4CE3C05FEA
-:101870007017DC05F4642DC06D1805B80DA5BD6AA0
-:101880002386AA9EB511A46AA3EA8A8D23E117389C
-:101890003469719845A6986A3EAC36651946BCE233
-:1018A000A23A41944D48628152C516F7A88B4A541A
-:1018B000F5A88C02DC06D1039CB4A9EE0A95252A72
-:1018C0007AAD46016701B5D7AC0A300B6C4935E6F5
-:1018D000B567F3006C88B99150BF311B32A7B86867
-:1018E00095257BAD3378A7CD3ED38E9D34E74ED47E
-:1018F00022E706848E60A8FF38AB839C2A08F9D4BF
-:101900002063BC1A060AC05F4642DC06D1805B80B9
-:10191000DA22E61A848E72D16F5A80871AAA7AD494
-:1019200048C8D547D5152323E11738348CBA4B7BEB
-:10193000D402D28C22DC06D51F561B328CA35E71DA
-:10194000511D20CA26A43140A962B017DF9EF4B70A
-:10195000C940C778018182B83839491C26C05F70F8
-:1019600017D4ABE12AF84ABE12AF8F974FCBA7012D
-:101970007DDA80AA91647F4A81D522C8FE828025C3
-:1019800048B23EBBDC352E9407E88A9C03E24BA5A7
-:1019900077ABB332E94BBD598684977A04BA53E1E9
-:1019A00032EF50D4E63553EB029CC7D77AB330D22E
-:1019B0005DEA02E9445D1628C02CE0369174455971
-:1019C00018D54FAC0AC435308B38692BBD5998698E
-:1019D0002EF512E958674AEF50D58E3E1CA4B0CEC2
-:1019E00093216E1A481FA22AC30D577AB30D092EF0
-:1019F000F4435D288B832092384D80BEE02FAC17D6
-:101A000049B3A582E93EE93674E02FA6CE9C05F4E1
-:101A1000C22C8C52577AD48D48FAEF50D5AE35533C
-:101A2000EB028621AAEF56661A4BBD44BA50C4E9B0
-:101A300053EB028681F5DEA1A8621F5DFEA25D293F
-:101A400077A86A618D40FD11530C6AA7D60530C78F
-:101A5000D77FA9574A5DEB481B0C7C8B9D8A53EFBF
-:101A60006694CA54F5A0C6016E036A9F5676653225
-:101A70008B7BD2C5A5602FAA7D65A300B701B4C832
-:101A80005A078FED01D527916701B48B9C541C73C5
-:101A9000A8845CC150BF365660AB8C8B9C541C73C1
-:101AA000A8845CC150BF36566C05F553D6A2300BE6
-:101AB000295B19FCF69445CF150BF33CB32A7AC584
-:101AC0004601648A31239C0A5DEA34332E95C7CEE1
-:101AD0002A4FE65020B9310C9BEF391445CE45070B
-:101AE0001CEA4687AB1B3684A75EAC966752B017DC
-:101AF000DCFE7B4A22E78A85F99E59977A8D0CCBCA
-:101B0000A527F3A0443260B937DE72288B9C8A0E79
-:101B100039D48C05F7E7B82AF92818EF0030305788
-:101B200007440A508FF07391411F3A9045C0BB188B
-:101B3000E13602FBFB9E02FAEEE7F5CF017D105C79
-:101B4000F017D105CF017D53EB2D1805B80DA64236
-:101B5000DC06D31735A88B9C0A0E39D40CFE7B4AC1
-:101B600022E6550BF331B3602FBC7CE2A4FE655135
-:101B70001738141C73A819FCF69445CCAA17E66311
-:101B8000660AB8CC85A158F6A23548487F4A89959F
-:101B90002121FD0502549E45910E3C05F507405557
-:101BA00048523E86A07548523EB5004A9C006BC71D
-:101BB000CE4527F32A843735DEA0AB231AAEF58352
-:101BC0005918D743DE2AD094EBDE053A959FCCC353
-:101BD0002045CCAA17E666CC43264FE741222E705B
-:101BE0006838E753E02FABBC12D2E9580BEAA7AD37
-:101BF00045A11FC05F7839C8A08F9D481C24EEC73F
-:101C000080BEBAF56D6649770D4EA53009B4F9C5A9
-:101C1000430F38A93F9D02FBCE4511739141C73A4E
-:101C2000919FCF69445CF150BF33CB32A7AC549045
-:101C30008D448E702977A8D0CCBA56B0B29D8C86D0
-:101C40004C172677261C271C249E2361BE8E124F1C
-:101C500011871CEA5C05F5D7B86A752977AB0D9931
-:101C600074A54F72A0AA4AC6F36666C63982AF75DC
-:101C7000A66F146BCE05707396823E7528E13AA765
-:101C8000AD44601652B61D7AB6B324BB86A75298EF
-:101C900004DA7CE2A1879C55F79CB5AC2C9533B94E
-:101CA0003105D953D6A2300B295B022E615A17E6B3
-:101CB0009CB32A7AC54021A891CE0527F3A5886454
-:101CC000C172654F58140C8D7EF381445CEF41C79F
-:101CD0003ABE02FAA9EACECCA92953D6A24647DDDC
-:101CE0007AC0A30086E29B29788B810998709B2992
-:101CF000795DD972ED94BCB976133B2A5DB29795A4
-:101D00002ED94BCA7D5B5994CA1C24EEC794BCC023
-:101D100026D3E7150C3CE2ACFE7B4A22E78A85F924
-:101D20009E59977A8D0CCBA527F3A0417262193783
-:101D3000DE70288B9C8A0E39D48D0F56366D094E75
-:101D4000BD592CCEA56B0B22D99DC9B297BEF3818C
-:101D50004A7D65A300938F672978C24DC1D1068261
-:101D600031AF07383411F3A82A9EA8661AA4A54FEC
-:101D70005A0C118FAA7BD0654945BDE962D2B19E4C
-:101D80006CCCC6198709C38E75411F3AA513D5556A
-:101D900055555555555555555555555555555555F3
-:101DA00055555555555555555555555555555555E3
-:0E1DB00055555555555555555555555ACC90C8
-:00000001FF
index 3c9b616..b738f2d 100644 (file)
@@ -186,7 +186,6 @@ header-y += if_pppox.h
 header-y += if_slip.h
 header-y += if_strip.h
 header-y += if_team.h
-header-y += if_tr.h
 header-y += if_tun.h
 header-y += if_tunnel.h
 header-y += if_vlan.h
diff --git a/include/linux/ibmtr.h b/include/linux/ibmtr.h
deleted file mode 100644 (file)
index 06695b7..0000000
+++ /dev/null
@@ -1,373 +0,0 @@
-#ifndef __LINUX_IBMTR_H__
-#define __LINUX_IBMTR_H__
-
-/* Definitions for an IBM Token Ring card. */
-/* This file is distributed under the GNU GPL   */
-
-/* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */
-
-#define TR_RETRY_INTERVAL      (30*HZ) /* 500 on PC = 5 s */
-#define TR_RST_TIME            (msecs_to_jiffies(50))  /* 5 on PC = 50 ms */
-#define TR_BUSY_INTERVAL       (msecs_to_jiffies(200)) /* 5 on PC = 200 ms */
-#define TR_SPIN_INTERVAL       (3*HZ)  /* 3 seconds before init timeout */
-
-#define TR_ISA 1
-#define TR_MCA 2
-#define TR_ISAPNP 3
-#define NOTOK 0
-
-#define IBMTR_SHARED_RAM_SIZE 0x10000
-#define IBMTR_IO_EXTENT 4
-#define IBMTR_MAX_ADAPTERS 4
-
-#define CHANNEL_ID      0X1F30
-#define AIP             0X1F00
-#define AIPADAPTYPE     0X1FA0
-#define AIPDATARATE     0X1FA2
-#define AIPEARLYTOKEN   0X1FA4
-#define AIPAVAILSHRAM   0X1FA6
-#define AIPSHRAMPAGE    0X1FA8
-#define AIP4MBDHB       0X1FAA
-#define AIP16MBDHB      0X1FAC
-#define AIPFID         0X1FBA
-
-#define ADAPTRESET      0x1     /* Control Adapter reset (add to base) */
-#define ADAPTRESETREL   0x2     /* Release Adapter from reset ( """)  */
-#define ADAPTINTREL    0x3     /* Adapter interrupt release */
-
-#define GLOBAL_INT_ENABLE 0x02f0
-
-/* MMIO bits 0-4 select register */
-#define RRR_EVEN       0x00 /* Shared RAM relocation registers - even and odd */
-/* Used to set the starting address of shared RAM  */
-/* Bits 1 through 7 of this register map to bits 13 through 19 of the shared
-   RAM address.*/
-/* ie: 0x02 sets RAM address to ...ato!  issy su wazzoo !! GODZILLA!!! */
-#define RRR_ODD         0x01
-/* Bits 2 and 3 of this register can be read to determine shared RAM size */
-/* 00 for 8k, 01 for 16k, 10 for 32k, 11 for 64k  */
-#define WRBR_EVEN       0x02    /* Write region base registers - even and odd */
-#define WRBR_ODD        0x03
-#define WWOR_EVEN       0x04    /* Write window open registers - even and odd */
-#define WWOR_ODD        0x05
-#define WWCR_EVEN       0x06   /* Write window close registers - even and odd */
-#define WWCR_ODD        0x07
-
-/* Interrupt status registers - PC system  - even and odd */
-#define ISRP_EVEN       0x08
-
-#define TCR_INT    0x10    /* Bit 4 - Timer interrupt.  The TVR_EVEN timer has
-                                                                   expired. */
-#define ERR_INT           0x08    /* Bit 3 - Error interrupt.  The adapter has had an
-                                                            internal error. */
-#define ACCESS_INT 0x04    /* Bit 2 - Access interrupt.  You have attempted to
-                                     write to an invalid area of shared RAM
-                                     or an invalid register within the MMIO. */
-/* In addition, the following bits within ISRP_EVEN can be turned on or off   */
-/* by you to control the interrupt processing:   */
-#define INT_ENABLE 0x40 /* Bit 6 - Interrupt enable.  If 0, no interrupts will
-                                   occur.  If 1, interrupts will occur normally.
-                                                         Normally set to 1.  */
-/* Bit 0 - Primary or alternate adapter.  Set to zero if this adapter is the
-               primary adapter, 1 if this adapter is the alternate adapter. */
-
-
-#define ISRP_ODD        0x09
-
-#define ADAP_CHK_INT 0x40 /* Bit 6 - Adapter check.  the adapter has
-                             encountered a serious problem and has closed
-                             itself.  Whoa.  */
-#define SRB_RESP_INT 0x20 /* Bit 5 - SRB response.  The adapter has accepted
-                             an SRB request and set the return code within
-                             the SRB. */
-#define ASB_FREE_INT 0x10 /* Bit 4 - ASB free.  The adapter has read the ASB
-                             and this area can be safely reused. This interrupt
-                             is only used if your application has set the ASB
-                             free request bit in ISRA_ODD or if an error was
-                             detected in your response. */
-#define ARB_CMD_INT  0x08 /* Bit 3 - ARB command.  The adapter has given you a
-                             command for action.  The command is located in the
-                             ARB area of shared memory. */
-#define SSB_RESP_INT 0x04 /* Bit 2 - SSB response.  The adapter has posted a
-                             response to your SRB (the response is located in
-                             the SSB area of shared memory). */
-/* Bit 1 - Bridge frame forward complete. */
-
-
-
-#define ISRA_EVEN 0x0A /*Interrupt status registers - adapter  - even and odd */
-/* Bit 7 - Internal parity error (on adapter's internal bus) */
-/* Bit 6 - Timer interrupt pending */
-/* Bit 5 - Access interrupt (attempt by adapter to access illegal address) */
-/* Bit 4 - Adapter microcode problem (microcode dead-man timer expired) */
-/* Bit 3 - Adapter processor check status */
-/* Bit 2 - Reserved */
-/* Bit 1 - Adapter hardware interrupt mask (prevents internal interrupts) */
-/* Bit 0 - Adapter software interrupt mask (prevents internal software ints) */
-
-#define ISRA_ODD        0x0B
-#define CMD_IN_SRB  0x20 /* Bit 5  - Indicates that you have placed a new
-                           command in the SRB and are ready for the adapter to
-                           process the command. */
-#define RESP_IN_ASB 0x10 /* Bit 4 - Indicates that you have placed a response
-                            (an ASB) in the shared RAM which is available for
-                            the adapter's use. */
-/* Bit 3 - Indicates that you are ready to put an SRB in the shared RAM, but
-       that a previous command is still pending.  The adapter will then
-       interrupt you when the previous command is completed */
-/* Bit 2 - Indicates that you are ready to put an ASB in the shared RAM, but
-       that a previous ASB is still pending.  The adapter will then interrupt
-       you when the previous ASB is copied.  */
-#define ARB_FREE 0x2
-#define SSB_FREE 0x1
-
-#define TCR_EVEN        0x0C    /* Timer control registers - even and odd */
-#define TCR_ODD         0x0D
-#define TVR_EVEN        0x0E    /* Timer value registers - even and odd */
-#define TVR_ODD         0x0F
-#define SRPR_EVEN       0x18    /* Shared RAM paging registers - even and odd */
-#define SRPR_ENABLE_PAGING 0xc0
-#define SRPR_ODD        0x19   /* Not used. */
-#define TOKREAD         0x60
-#define TOKOR           0x40
-#define TOKAND          0x20
-#define TOKWRITE        0x00
-
-/* MMIO bits 5-6 select operation */
-/* 00 is used to write to a register */
-/* 01 is used to bitwise AND a byte with a register */
-/* 10 is used to bitwise OR a byte with a register  */
-/* 11 is used to read from a register */
-
-/* MMIO bits 7-8 select area of interest.. see below */
-/* 00 selects attachment control area. */
-/* 01 is reserved. */
-/* 10 selects adapter identification area A containing the adapter encoded
-       address. */
-/* 11 selects the adapter identification area B containing test patterns. */
-
-#define PCCHANNELID 5049434F3631313039393020
-#define MCCHANNELID 4D4152533633583435313820
-
-#define ACA_OFFSET 0x1e00
-#define ACA_SET 0x40
-#define ACA_RESET 0x20
-#define ACA_RW 0x00
-
-#ifdef ENABLE_PAGING
-#define SET_PAGE(x) (writeb((x), ti->mmio + ACA_OFFSET+ ACA_RW + SRPR_EVEN))
-#else
-#define SET_PAGE(x)
-#endif
-
-/* do_tok_int possible values */
-#define FIRST_INT 1
-#define NOT_FIRST 2
-
-typedef enum { CLOSED, OPEN } open_state;
-//staic const char *printstate[] = { "CLOSED","OPEN"};
-
-struct tok_info {
-       unsigned char irq;
-       void __iomem *mmio;
-       unsigned char hw_address[32];
-       unsigned char adapter_type;
-       unsigned char data_rate;
-       unsigned char token_release;
-       unsigned char avail_shared_ram;
-       unsigned char shared_ram_paging;
-        unsigned char turbo;
-       unsigned short dhb_size4mb;
-       unsigned short rbuf_len4;
-       unsigned short rbuf_cnt4;
-       unsigned short maxmtu4;
-       unsigned short dhb_size16mb;
-       unsigned short rbuf_len16;
-       unsigned short rbuf_cnt16;
-       unsigned short maxmtu16;
-       /* Additions by David Morris       */
-       unsigned char do_tok_int;
-       wait_queue_head_t wait_for_reset;
-       unsigned char sram_base;
-       /* Additions by Peter De Schrijver */
-       unsigned char page_mask;          /* mask to select RAM page to Map*/
-       unsigned char mapped_ram_size;    /* size of RAM page */
-       __u32 sram_phys;          /* Shared memory base address */
-       void __iomem *sram_virt;          /* Shared memory base address */
-       void __iomem *init_srb;   /* Initial System Request Block address */
-       void __iomem *srb;                /* System Request Block address */
-       void __iomem *ssb;                /* System Status Block address */
-       void __iomem *arb;                /* Adapter Request Block address */
-       void __iomem *asb;                /* Adapter Status Block address */
-        __u8  init_srb_page;
-        __u8  srb_page;
-        __u8  ssb_page;
-        __u8  arb_page;
-        __u8  asb_page;
-       unsigned short exsap_station_id;
-       unsigned short global_int_enable;
-       struct sk_buff *current_skb;
-
-       unsigned char auto_speedsave;
-       open_state                      open_status, sap_status;
-       enum {MANUAL, AUTOMATIC}        open_mode;
-       enum {FAIL, RESTART, REOPEN}    open_action;
-       enum {NO, YES}                  open_failure;
-       unsigned char readlog_pending;
-       unsigned short adapter_int_enable; /* Adapter-specific int enable */
-        struct timer_list tr_timer;
-       unsigned char ring_speed;
-       spinlock_t lock;                /* SMP protection */
-};
-
-/* token ring adapter commands */
-#define DIR_INTERRUPT          0x00 /* struct srb_interrupt */
-#define DIR_MOD_OPEN_PARAMS    0x01
-#define DIR_OPEN_ADAPTER       0x03 /* struct dir_open_adapter */
-#define DIR_CLOSE_ADAPTER      0x04
-#define DIR_SET_GRP_ADDR       0x06
-#define DIR_SET_FUNC_ADDR      0x07 /* struct srb_set_funct_addr */
-#define DIR_READ_LOG           0x08 /* struct srb_read_log */
-#define DLC_OPEN_SAP           0x15 /* struct dlc_open_sap */
-#define DLC_CLOSE_SAP          0x16
-#define DATA_LOST              0x20 /* struct asb_rec */
-#define REC_DATA               0x81 /* struct arb_rec_req */
-#define XMIT_DATA_REQ          0x82 /* struct arb_xmit_req */
-#define DLC_STATUS             0x83 /* struct arb_dlc_status */
-#define RING_STAT_CHANGE       0x84 /* struct dlc_open_sap ??? */
-
-/* DIR_OPEN_ADAPTER options */
-#define OPEN_PASS_BCON_MAC 0x0100
-#define NUM_RCV_BUF 2
-#define RCV_BUF_LEN 1024
-#define DHB_LENGTH 2048
-#define NUM_DHB 2
-#define DLC_MAX_SAP 2
-#define DLC_MAX_STA 1
-
-/* DLC_OPEN_SAP options */
-#define MAX_I_FIELD 0x0088
-#define SAP_OPEN_IND_SAP 0x04
-#define SAP_OPEN_PRIORITY 0x20
-#define SAP_OPEN_STATION_CNT 0x1
-#define XMIT_DIR_FRAME 0x0A
-#define XMIT_UI_FRAME  0x0d
-#define XMIT_XID_CMD   0x0e
-#define XMIT_TEST_CMD  0x11
-
-/* srb close return code */
-#define SIGNAL_LOSS  0x8000
-#define HARD_ERROR   0x4000
-#define XMIT_BEACON  0x1000
-#define LOBE_FAULT   0x0800
-#define AUTO_REMOVAL 0x0400
-#define REMOVE_RECV  0x0100
-#define LOG_OVERFLOW 0x0080
-#define RING_RECOVER 0x0020
-
-struct srb_init_response {
-       unsigned char command;
-       unsigned char init_status;
-       unsigned char init_status_2;
-       unsigned char reserved[3];
-       __u16 bring_up_code;
-       __u16 encoded_address;
-       __u16 level_address;
-       __u16 adapter_address;
-       __u16 parms_address;
-       __u16 mac_address;
-};
-
-struct dir_open_adapter {
-       unsigned char command;
-       char reserved[7];
-       __u16 open_options;
-       unsigned char node_address[6];
-       unsigned char group_address[4];
-       unsigned char funct_address[4];
-       __u16 num_rcv_buf;
-       __u16 rcv_buf_len;
-       __u16 dhb_length;
-       unsigned char num_dhb;
-       char reserved2;
-       unsigned char dlc_max_sap;
-       unsigned char dlc_max_sta;
-       unsigned char dlc_max_gsap;
-       unsigned char dlc_max_gmem;
-       unsigned char dlc_t1_tick_1;
-       unsigned char dlc_t2_tick_1;
-       unsigned char dlc_ti_tick_1;
-       unsigned char dlc_t1_tick_2;
-       unsigned char dlc_t2_tick_2;
-       unsigned char dlc_ti_tick_2;
-       unsigned char product_id[18];
-};
-
-struct dlc_open_sap {
-       unsigned char command;
-       unsigned char reserved1;
-       unsigned char ret_code;
-       unsigned char reserved2;
-       __u16 station_id;
-       unsigned char timer_t1;
-       unsigned char timer_t2;
-       unsigned char timer_ti;
-       unsigned char maxout;
-       unsigned char maxin;
-       unsigned char maxout_incr;
-       unsigned char max_retry_count;
-       unsigned char gsap_max_mem;
-       __u16 max_i_field;
-       unsigned char sap_value;
-       unsigned char sap_options;
-       unsigned char station_count;
-       unsigned char sap_gsap_mem;
-       unsigned char gsap[0];
-};
-
-struct srb_xmit {
-       unsigned char command;
-       unsigned char cmd_corr;
-       unsigned char ret_code;
-       unsigned char reserved1;
-       __u16 station_id;
-};
-
-struct arb_rec_req {
-       unsigned char command;
-       unsigned char reserved1[3];
-       __u16 station_id;
-       __u16 rec_buf_addr;
-       unsigned char lan_hdr_len;
-       unsigned char dlc_hdr_len;
-       __u16 frame_len;
-       unsigned char msg_type;
-};
-
-struct asb_rec {
-       unsigned char command;
-       unsigned char reserved1;
-       unsigned char ret_code;
-       unsigned char reserved2;
-       __u16 station_id;
-       __u16 rec_buf_addr;
-};
-
-struct rec_buf {
-       unsigned char reserved1[2];
-       __u16 buf_ptr;
-       unsigned char reserved2;
-       unsigned char receive_fs;
-       __u16 buf_len;
-       unsigned char data[0];
-};
-
-struct srb_set_funct_addr {
-       unsigned char command;
-       unsigned char reserved1;
-       unsigned char ret_code;
-       unsigned char reserved2[3];
-       unsigned char funct_address[4];
-};
-
-#endif
diff --git a/include/linux/if_tr.h b/include/linux/if_tr.h
deleted file mode 100644 (file)
index fc23aeb..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * INET                An implementation of the TCP/IP protocol suite for the LINUX
- *             operating system.  INET is implemented using the  BSD Socket
- *             interface as the means of communication with the user level.
- *
- *             Global definitions for the Token-Ring IEEE 802.5 interface.
- *
- * Version:    @(#)if_tr.h     0.0     07/11/94
- *
- * Author:     Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *             Donald Becker, <becker@super.org>
- *             Peter De Schrijver, <stud11@cc4.kuleuven.ac.be>
- *
- *             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; either version
- *             2 of the License, or (at your option) any later version.
- */
-#ifndef _LINUX_IF_TR_H
-#define _LINUX_IF_TR_H
-
-#include <linux/types.h>
-#include <asm/byteorder.h>     /* For __be16 */
-
-/* IEEE 802.5 Token-Ring magic constants.  The frame sizes omit the preamble
-   and FCS/CRC (frame check sequence). */
-#define TR_ALEN                6               /* Octets in one token-ring addr */
-#define TR_HLEN        (sizeof(struct trh_hdr)+sizeof(struct trllc))
-#define AC             0x10
-#define LLC_FRAME      0x40
-
-/* LLC and SNAP constants */
-#define EXTENDED_SAP   0xAA
-#define UI_CMD         0x03
-
-/* This is an Token-Ring frame header. */
-struct trh_hdr {
-       __u8  ac;                       /* access control field */
-       __u8  fc;                       /* frame control field */
-       __u8  daddr[TR_ALEN];           /* destination address */
-       __u8  saddr[TR_ALEN];           /* source address */
-       __be16 rcf;                     /* route control field */
-       __be16 rseg[8];                 /* routing registers */
-};
-
-#ifdef __KERNEL__
-#include <linux/skbuff.h>
-
-static inline struct trh_hdr *tr_hdr(const struct sk_buff *skb)
-{
-       return (struct trh_hdr *)skb_mac_header(skb);
-}
-#endif
-
-/* This is an Token-Ring LLC structure */
-struct trllc {
-       __u8  dsap;                     /* destination SAP */
-       __u8  ssap;                     /* source SAP */
-       __u8  llc;                      /* LLC control field */
-       __u8  protid[3];                /* protocol id */
-       __be16 ethertype;               /* ether type field */
-};
-
-/* Token-Ring statistics collection data. */
-struct tr_statistics {
-       unsigned long rx_packets;       /* total packets received       */
-       unsigned long tx_packets;       /* total packets transmitted    */
-       unsigned long rx_bytes;         /* total bytes received         */
-       unsigned long tx_bytes;         /* total bytes transmitted      */
-       unsigned long rx_errors;        /* bad packets received         */
-       unsigned long tx_errors;        /* packet transmit problems     */
-       unsigned long rx_dropped;       /* no space in linux buffers    */
-       unsigned long tx_dropped;       /* no space available in linux  */
-       unsigned long multicast;        /* multicast packets received   */
-       unsigned long transmit_collision;
-
-       /* detailed Token-Ring errors. See IBM Token-Ring Network
-          Architecture for more info */
-
-       unsigned long line_errors;
-       unsigned long internal_errors;
-       unsigned long burst_errors;
-       unsigned long A_C_errors;
-       unsigned long abort_delimiters;
-       unsigned long lost_frames;
-       unsigned long recv_congest_count;
-       unsigned long frame_copied_errors;
-       unsigned long frequency_errors;
-       unsigned long token_errors;
-       unsigned long dummy1;
-};
-
-/* source routing stuff */
-#define TR_RII                         0x80
-#define TR_RCF_DIR_BIT                 0x80
-#define TR_RCF_LEN_MASK        0x1f00
-#define TR_RCF_BROADCAST       0x8000  /* all-routes broadcast */
-#define TR_RCF_LIMITED_BROADCAST 0xC000        /* single-route broadcast */
-#define TR_RCF_FRAME2K                 0x20
-#define TR_RCF_BROADCAST_MASK  0xC000
-#define TR_MAXRIFLEN           18
-
-#endif /* _LINUX_IF_TR_H */
diff --git a/include/linux/trdevice.h b/include/linux/trdevice.h
deleted file mode 100644 (file)
index bfc84a7..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * INET                An implementation of the TCP/IP protocol suite for the LINUX
- *             operating system.  NET  is implemented using the  BSD Socket
- *             interface as the means of communication with the user level.
- *
- *             Definitions for the Token-ring handlers.
- *
- * Version:    @(#)eth.h       1.0.4   05/13/93
- *
- * Authors:    Ross Biro
- *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *
- *             Relocated to include/linux where it belongs by Alan Cox 
- *                                                     <gw4pts@gw4pts.ampr.org>
- *
- *             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; either version
- *             2 of the License, or (at your option) any later version.
- *
- *     WARNING: This move may well be temporary. This file will get merged with others RSN.
- *
- */
-#ifndef _LINUX_TRDEVICE_H
-#define _LINUX_TRDEVICE_H
-
-
-#include <linux/if_tr.h>
-
-#ifdef __KERNEL__
-extern __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev);
-extern void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, struct net_device *dev);
-extern struct net_device *alloc_trdev(int sizeof_priv);
-
-#endif
-
-#endif /* _LINUX_TRDEVICE_H */
index 7893d67..a30d6e3 100644 (file)
@@ -4,7 +4,6 @@
 
 # Check the p8022 selections against net/core/Makefile.
 obj-$(CONFIG_LLC)      += p8022.o psnap.o
-obj-$(CONFIG_TR)       += p8022.o psnap.o tr.o
 obj-$(CONFIG_NET_FC)   +=                 fc.o
 obj-$(CONFIG_FDDI)     +=                 fddi.o
 obj-$(CONFIG_HIPPI)    +=                 hippi.o
diff --git a/net/802/tr.c b/net/802/tr.c
deleted file mode 100644 (file)
index 175243b..0000000
+++ /dev/null
@@ -1,669 +0,0 @@
-/*
- * NET3:       Token ring device handling subroutines
- *
- *             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; either version
- *             2 of the License, or (at your option) any later version.
- *
- * Fixes:       3 Feb 97 Paul Norton <pnorton@cts.com> Minor routing fixes.
- *              Added rif table to /proc/net/tr_rif and rif timeout to
- *              /proc/sys/net/token-ring/rif_timeout.
- *              22 Jun 98 Paul Norton <p.norton@computer.org> Rearranged
- *              tr_header and tr_type_trans to handle passing IPX SNAP and
- *              802.2 through the correct layers. Eliminated tr_reformat.
- *
- */
-
-#include <asm/uaccess.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/jiffies.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/skbuff.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/net.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/init.h>
-#include <linux/sysctl.h>
-#include <linux/slab.h>
-#include <net/arp.h>
-#include <net/net_namespace.h>
-
-static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev);
-static void rif_check_expire(unsigned long dummy);
-
-#define TR_SR_DEBUG 0
-
-/*
- *     Each RIF entry we learn is kept this way
- */
-
-struct rif_cache {
-       unsigned char addr[TR_ALEN];
-       int iface;
-       __be16 rcf;
-       __be16 rseg[8];
-       struct rif_cache *next;
-       unsigned long last_used;
-       unsigned char local_ring;
-};
-
-#define RIF_TABLE_SIZE 32
-
-/*
- *     We hash the RIF cache 32 ways. We do after all have to look it
- *     up a lot.
- */
-
-static struct rif_cache *rif_table[RIF_TABLE_SIZE];
-
-static DEFINE_SPINLOCK(rif_lock);
-
-
-/*
- *     Garbage disposal timer.
- */
-
-static struct timer_list rif_timer;
-
-static int sysctl_tr_rif_timeout = 60*10*HZ;
-
-static inline unsigned long rif_hash(const unsigned char *addr)
-{
-       unsigned long x;
-
-       x = addr[0];
-       x = (x << 2) ^ addr[1];
-       x = (x << 2) ^ addr[2];
-       x = (x << 2) ^ addr[3];
-       x = (x << 2) ^ addr[4];
-       x = (x << 2) ^ addr[5];
-
-       x ^= x >> 8;
-
-       return x & (RIF_TABLE_SIZE - 1);
-}
-
-/*
- *     Put the headers on a token ring packet. Token ring source routing
- *     makes this a little more exciting than on ethernet.
- */
-
-static int tr_header(struct sk_buff *skb, struct net_device *dev,
-                    unsigned short type,
-                    const void *daddr, const void *saddr, unsigned int len)
-{
-       struct trh_hdr *trh;
-       int hdr_len;
-
-       /*
-        * Add the 802.2 SNAP header if IP as the IPv4/IPv6 code calls
-        * dev->hard_header directly.
-        */
-       if (type == ETH_P_IP || type == ETH_P_IPV6 || type == ETH_P_ARP)
-       {
-               struct trllc *trllc;
-
-               hdr_len = sizeof(struct trh_hdr) + sizeof(struct trllc);
-               trh = (struct trh_hdr *)skb_push(skb, hdr_len);
-               trllc = (struct trllc *)(trh+1);
-               trllc->dsap = trllc->ssap = EXTENDED_SAP;
-               trllc->llc = UI_CMD;
-               trllc->protid[0] = trllc->protid[1] = trllc->protid[2] = 0x00;
-               trllc->ethertype = htons(type);
-       }
-       else
-       {
-               hdr_len = sizeof(struct trh_hdr);
-               trh = (struct trh_hdr *)skb_push(skb, hdr_len);
-       }
-
-       trh->ac=AC;
-       trh->fc=LLC_FRAME;
-
-       if(saddr)
-               memcpy(trh->saddr,saddr,dev->addr_len);
-       else
-               memcpy(trh->saddr,dev->dev_addr,dev->addr_len);
-
-       /*
-        *      Build the destination and then source route the frame
-        */
-
-       if(daddr)
-       {
-               memcpy(trh->daddr,daddr,dev->addr_len);
-               tr_source_route(skb, trh, dev);
-               return hdr_len;
-       }
-
-       return -hdr_len;
-}
-
-/*
- *     A neighbour discovery of some species (eg arp) has completed. We
- *     can now send the packet.
- */
-
-static int tr_rebuild_header(struct sk_buff *skb)
-{
-       struct trh_hdr *trh=(struct trh_hdr *)skb->data;
-       struct trllc *trllc=(struct trllc *)(skb->data+sizeof(struct trh_hdr));
-       struct net_device *dev = skb->dev;
-
-       /*
-        *      FIXME: We don't yet support IPv6 over token rings
-        */
-
-       if(trllc->ethertype != htons(ETH_P_IP)) {
-               printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(trllc->ethertype));
-               return 0;
-       }
-
-#ifdef CONFIG_INET
-       if(arp_find(trh->daddr, skb)) {
-                       return 1;
-       }
-       else
-#endif
-       {
-               tr_source_route(skb,trh,dev);
-               return 0;
-       }
-}
-
-/*
- *     Some of this is a bit hackish. We intercept RIF information
- *     used for source routing. We also grab IP directly and don't feed
- *     it via SNAP.
- */
-
-__be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
-{
-
-       struct trh_hdr *trh;
-       struct trllc *trllc;
-       unsigned int riflen=0;
-
-       skb->dev = dev;
-       skb_reset_mac_header(skb);
-       trh = tr_hdr(skb);
-
-       if(trh->saddr[0] & TR_RII)
-               riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
-
-       trllc = (struct trllc *)(skb->data+sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
-
-       skb_pull(skb,sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
-
-       if(*trh->daddr & 0x80)
-       {
-               if(!memcmp(trh->daddr,dev->broadcast,TR_ALEN))
-                       skb->pkt_type=PACKET_BROADCAST;
-               else
-                       skb->pkt_type=PACKET_MULTICAST;
-       }
-       else if ( (trh->daddr[0] & 0x01) && (trh->daddr[1] & 0x00) && (trh->daddr[2] & 0x5E))
-       {
-               skb->pkt_type=PACKET_MULTICAST;
-       }
-       else if(dev->flags & IFF_PROMISC)
-       {
-               if(memcmp(trh->daddr, dev->dev_addr, TR_ALEN))
-                       skb->pkt_type=PACKET_OTHERHOST;
-       }
-
-       if ((skb->pkt_type != PACKET_BROADCAST) &&
-           (skb->pkt_type != PACKET_MULTICAST))
-               tr_add_rif_info(trh,dev) ;
-
-       /*
-        * Strip the SNAP header from ARP packets since we don't
-        * pass them through to the 802.2/SNAP layers.
-        */
-
-       if (trllc->dsap == EXTENDED_SAP &&
-           (trllc->ethertype == htons(ETH_P_IP) ||
-            trllc->ethertype == htons(ETH_P_IPV6) ||
-            trllc->ethertype == htons(ETH_P_ARP)))
-       {
-               skb_pull(skb, sizeof(struct trllc));
-               return trllc->ethertype;
-       }
-
-       return htons(ETH_P_TR_802_2);
-}
-
-/*
- *     We try to do source routing...
- */
-
-void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,
-                    struct net_device *dev)
-{
-       int slack;
-       unsigned int hash;
-       struct rif_cache *entry;
-       unsigned char *olddata;
-       unsigned long flags;
-       static const unsigned char mcast_func_addr[]
-               = {0xC0,0x00,0x00,0x04,0x00,0x00};
-
-       spin_lock_irqsave(&rif_lock, flags);
-
-       /*
-        *      Broadcasts are single route as stated in RFC 1042
-        */
-       if( (!memcmp(&(trh->daddr[0]),&(dev->broadcast[0]),TR_ALEN)) ||
-           (!memcmp(&(trh->daddr[0]),&(mcast_func_addr[0]), TR_ALEN))  )
-       {
-               trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)
-                              | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
-               trh->saddr[0]|=TR_RII;
-       }
-       else
-       {
-               hash = rif_hash(trh->daddr);
-               /*
-                *      Walk the hash table and look for an entry
-                */
-               for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->daddr[0]),TR_ALEN);entry=entry->next);
-
-               /*
-                *      If we found an entry we can route the frame.
-                */
-               if(entry)
-               {
-#if TR_SR_DEBUG
-printk("source routing for %pM\n", trh->daddr);
-#endif
-                       if(!entry->local_ring && (ntohs(entry->rcf) & TR_RCF_LEN_MASK) >> 8)
-                       {
-                               trh->rcf=entry->rcf;
-                               memcpy(&trh->rseg[0],&entry->rseg[0],8*sizeof(unsigned short));
-                               trh->rcf^=htons(TR_RCF_DIR_BIT);
-                               trh->rcf&=htons(0x1fff);        /* Issam Chehab <ichehab@madge1.demon.co.uk> */
-
-                               trh->saddr[0]|=TR_RII;
-#if TR_SR_DEBUG
-                               printk("entry found with rcf %04x\n", entry->rcf);
-                       }
-                       else
-                       {
-                               printk("entry found but without rcf length, local=%02x\n", entry->local_ring);
-#endif
-                       }
-                       entry->last_used=jiffies;
-               }
-               else
-               {
-                       /*
-                        *      Without the information we simply have to shout
-                        *      on the wire. The replies should rapidly clean this
-                        *      situation up.
-                        */
-                       trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)
-                                      | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
-                       trh->saddr[0]|=TR_RII;
-#if TR_SR_DEBUG
-                       printk("no entry in rif table found - broadcasting frame\n");
-#endif
-               }
-       }
-
-       /* Compress the RIF here so we don't have to do it in the driver(s) */
-       if (!(trh->saddr[0] & 0x80))
-               slack = 18;
-       else
-               slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8);
-       olddata = skb->data;
-       spin_unlock_irqrestore(&rif_lock, flags);
-
-       skb_pull(skb, slack);
-       memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack);
-}
-
-/*
- *     We have learned some new RIF information for our source
- *     routing.
- */
-
-static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
-{
-       unsigned int hash, rii_p = 0;
-       unsigned long flags;
-       struct rif_cache *entry;
-       unsigned char saddr0;
-
-       spin_lock_irqsave(&rif_lock, flags);
-       saddr0 = trh->saddr[0];
-
-       /*
-        *      Firstly see if the entry exists
-        */
-
-       if(trh->saddr[0] & TR_RII)
-       {
-               trh->saddr[0]&=0x7f;
-               if (((ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8) > 2)
-               {
-                       rii_p = 1;
-               }
-       }
-
-       hash = rif_hash(trh->saddr);
-       for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);entry=entry->next);
-
-       if(entry==NULL)
-       {
-#if TR_SR_DEBUG
-               printk("adding rif_entry: addr:%pM rcf:%04X\n",
-                      trh->saddr, ntohs(trh->rcf));
-#endif
-               /*
-                *      Allocate our new entry. A failure to allocate loses
-                *      use the information. This is harmless.
-                *
-                *      FIXME: We ought to keep some kind of cache size
-                *      limiting and adjust the timers to suit.
-                */
-               entry=kmalloc(sizeof(struct rif_cache),GFP_ATOMIC);
-
-               if(!entry)
-               {
-                       printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n");
-                       spin_unlock_irqrestore(&rif_lock, flags);
-                       return;
-               }
-
-               memcpy(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);
-               entry->iface = dev->ifindex;
-               entry->next=rif_table[hash];
-               entry->last_used=jiffies;
-               rif_table[hash]=entry;
-
-               if (rii_p)
-               {
-                       entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
-                       memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
-                       entry->local_ring = 0;
-               }
-               else
-               {
-                       entry->local_ring = 1;
-               }
-       }
-       else    /* Y. Tahara added */
-       {
-               /*
-                *      Update existing entries
-                */
-               if (!entry->local_ring)
-                   if (entry->rcf != (trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK)) &&
-                        !(trh->rcf & htons(TR_RCF_BROADCAST_MASK)))
-                   {
-#if TR_SR_DEBUG
-printk("updating rif_entry: addr:%pM rcf:%04X\n",
-               trh->saddr, ntohs(trh->rcf));
-#endif
-                           entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
-                           memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
-                   }
-               entry->last_used=jiffies;
-       }
-       trh->saddr[0]=saddr0; /* put the routing indicator back for tcpdump */
-       spin_unlock_irqrestore(&rif_lock, flags);
-}
-
-/*
- *     Scan the cache with a timer and see what we need to throw out.
- */
-
-static void rif_check_expire(unsigned long dummy)
-{
-       int i;
-       unsigned long flags, next_interval = jiffies + sysctl_tr_rif_timeout/2;
-
-       spin_lock_irqsave(&rif_lock, flags);
-
-       for(i =0; i < RIF_TABLE_SIZE; i++) {
-               struct rif_cache *entry, **pentry;
-
-               pentry = rif_table+i;
-               while((entry=*pentry) != NULL) {
-                       unsigned long expires
-                               = entry->last_used + sysctl_tr_rif_timeout;
-
-                       if (time_before_eq(expires, jiffies)) {
-                               *pentry = entry->next;
-                               kfree(entry);
-                       } else {
-                               pentry = &entry->next;
-
-                               if (time_before(expires, next_interval))
-                                       next_interval = expires;
-                       }
-               }
-       }
-
-       spin_unlock_irqrestore(&rif_lock, flags);
-
-       mod_timer(&rif_timer, next_interval);
-
-}
-
-/*
- *     Generate the /proc/net information for the token ring RIF
- *     routing.
- */
-
-#ifdef CONFIG_PROC_FS
-
-static struct rif_cache *rif_get_idx(loff_t pos)
-{
-       int i;
-       struct rif_cache *entry;
-       loff_t off = 0;
-
-       for(i = 0; i < RIF_TABLE_SIZE; i++)
-               for(entry = rif_table[i]; entry; entry = entry->next) {
-                       if (off == pos)
-                               return entry;
-                       ++off;
-               }
-
-       return NULL;
-}
-
-static void *rif_seq_start(struct seq_file *seq, loff_t *pos)
-       __acquires(&rif_lock)
-{
-       spin_lock_irq(&rif_lock);
-
-       return *pos ? rif_get_idx(*pos - 1) : SEQ_START_TOKEN;
-}
-
-static void *rif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
-       int i;
-       struct rif_cache *ent = v;
-
-       ++*pos;
-
-       if (v == SEQ_START_TOKEN) {
-               i = -1;
-               goto scan;
-       }
-
-       if (ent->next)
-               return ent->next;
-
-       i = rif_hash(ent->addr);
- scan:
-       while (++i < RIF_TABLE_SIZE) {
-               if ((ent = rif_table[i]) != NULL)
-                       return ent;
-       }
-       return NULL;
-}
-
-static void rif_seq_stop(struct seq_file *seq, void *v)
-       __releases(&rif_lock)
-{
-       spin_unlock_irq(&rif_lock);
-}
-
-static int rif_seq_show(struct seq_file *seq, void *v)
-{
-       int j, rcf_len, segment, brdgnmb;
-       struct rif_cache *entry = v;
-
-       if (v == SEQ_START_TOKEN)
-               seq_puts(seq,
-                    "if     TR address       TTL   rcf   routing segments\n");
-       else {
-               struct net_device *dev = dev_get_by_index(&init_net, entry->iface);
-               long ttl = (long) (entry->last_used + sysctl_tr_rif_timeout)
-                               - (long) jiffies;
-
-               seq_printf(seq, "%s %pM %7li ",
-                          dev?dev->name:"?",
-                          entry->addr,
-                          ttl/HZ);
-
-                       if (entry->local_ring)
-                               seq_puts(seq, "local\n");
-                       else {
-
-                               seq_printf(seq, "%04X", ntohs(entry->rcf));
-                               rcf_len = ((ntohs(entry->rcf) & TR_RCF_LEN_MASK)>>8)-2;
-                               if (rcf_len)
-                                       rcf_len >>= 1;
-                               for(j = 1; j < rcf_len; j++) {
-                                       if(j==1) {
-                                               segment=ntohs(entry->rseg[j-1])>>4;
-                                               seq_printf(seq,"  %03X",segment);
-                                       }
-
-                                       segment=ntohs(entry->rseg[j])>>4;
-                                       brdgnmb=ntohs(entry->rseg[j-1])&0x00f;
-                                       seq_printf(seq,"-%01X-%03X",brdgnmb,segment);
-                               }
-                               seq_putc(seq, '\n');
-                       }
-
-               if (dev)
-                       dev_put(dev);
-               }
-       return 0;
-}
-
-
-static const struct seq_operations rif_seq_ops = {
-       .start = rif_seq_start,
-       .next  = rif_seq_next,
-       .stop  = rif_seq_stop,
-       .show  = rif_seq_show,
-};
-
-static int rif_seq_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &rif_seq_ops);
-}
-
-static const struct file_operations rif_seq_fops = {
-       .owner   = THIS_MODULE,
-       .open    = rif_seq_open,
-       .read    = seq_read,
-       .llseek  = seq_lseek,
-       .release = seq_release,
-};
-
-#endif
-
-static const struct header_ops tr_header_ops = {
-       .create = tr_header,
-       .rebuild= tr_rebuild_header,
-};
-
-static void tr_setup(struct net_device *dev)
-{
-       /*
-        *      Configure and register
-        */
-
-       dev->header_ops = &tr_header_ops;
-
-       dev->hard_header_len    = TR_HLEN;
-       dev->mtu                = 2000;
-       dev->addr_len           = TR_ALEN;
-       dev->tx_queue_len       = 100;  /* Long queues on tr */
-
-       memset(dev->broadcast,0xFF, TR_ALEN);
-
-       /* New-style flags. */
-       dev->flags              = IFF_BROADCAST | IFF_MULTICAST ;
-}
-
-/**
- * alloc_trdev - Register token ring device
- * @sizeof_priv: Size of additional driver-private structure to be allocated
- *     for this token ring device
- *
- * Fill in the fields of the device structure with token ring-generic values.
- *
- * Constructs a new net device, complete with a private data area of
- * size @sizeof_priv.  A 32-byte (not bit) alignment is enforced for
- * this private data area.
- */
-struct net_device *alloc_trdev(int sizeof_priv)
-{
-       return alloc_netdev(sizeof_priv, "tr%d", tr_setup);
-}
-
-#ifdef CONFIG_SYSCTL
-static struct ctl_table tr_table[] = {
-       {
-               .procname       = "rif_timeout",
-               .data           = &sysctl_tr_rif_timeout,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec
-       },
-       { },
-};
-#endif
-
-/*
- *     Called during bootup.  We don't actually have to initialise
- *     too much for this.
- */
-
-static int __init rif_init(void)
-{
-       rif_timer.expires  = jiffies + sysctl_tr_rif_timeout;
-       setup_timer(&rif_timer, rif_check_expire, 0);
-       add_timer(&rif_timer);
-#ifdef CONFIG_SYSCTL
-       register_net_sysctl(&init_net, "net/token-ring", tr_table);
-#endif
-       proc_net_fops_create(&init_net, "tr_rif", S_IRUGO, &rif_seq_fops);
-       return 0;
-}
-
-module_init(rif_init);
-
-EXPORT_SYMBOL(tr_type_trans);
-EXPORT_SYMBOL(alloc_trdev);
-
-MODULE_LICENSE("GPL");