bk://gkernel.bkbits.net/netdev-2.6
jgarzik@redhat.com|ChangeSet|20040514223413|39033 jgarzik

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/05/14 21:37:15-07:00 akpm@bix.(none) 
#   Merge bk://gkernel.bkbits.net/netdev-2.6
#   into bix.(none):/usr/src/bk-netdev
# 
# drivers/net/Makefile
#   2004/05/14 21:37:12-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# drivers/net/Kconfig
#   2004/05/14 21:37:12-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/14 21:36:21-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-netdev
# 
# drivers/net/8139too.c
#   2004/05/14 21:36:18-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/14 14:10:10-04:00 jgarzik@redhat.com 
#   [netdrvr] remove rcpci driver, for Red Creek Hardware VPNs
#   
#   Pete Popov, the author says
#   
#   This driver is obsolete and broken in 2.4 (and I'm pretty sure in 2.6).
#   The hardware has not been available for a while. I wrote the driver
#   for 2.2 but after I left RedCreek (which went out of business),
#   someone in the community updated it to 2.4, but I don't think that
#   person even had the hardware to test it so the driver remained broken
#   in 2.4. So my recommendation is that it's really time to remove this
#   driver from the kernel tree. Just my opinion but I thought I'd share
#   it with you.
#   [...]
#   I can't imagine that there are any users because 2.4 was broken last
#   time I checked (admittedly that was a year ago).
# 
# drivers/net/Makefile
#   2004/05/14 14:08:27-04:00 jgarzik@redhat.com +0 -3
#   [netdrvr] remove rcpci driver, for Red Creek Hardware VPNs
#   
#   Pete Popov, the author says
#   
#   This driver is obsolete and broken in 2.4 (and I'm pretty sure in 2.6).
#   The hardware has not been available for a while. I wrote the driver
#   for 2.2 but after I left RedCreek (which went out of business),
#   someone in the community updated it to 2.4, but I don't think that
#   person even had the hardware to test it so the driver remained broken
#   in 2.4. So my recommendation is that it's really time to remove this
#   driver from the kernel tree. Just my opinion but I thought I'd share
#   it with you.
#   [...]
#   I can't imagine that there are any users because 2.4 was broken last
#   time I checked (admittedly that was a year ago).
# 
# drivers/net/Kconfig
#   2004/05/14 14:08:27-04:00 jgarzik@redhat.com +0 -10
#   [netdrvr] remove rcpci driver, for Red Creek Hardware VPNs
#   
#   Pete Popov, the author says
#   
#   This driver is obsolete and broken in 2.4 (and I'm pretty sure in 2.6).
#   The hardware has not been available for a while. I wrote the driver
#   for 2.2 but after I left RedCreek (which went out of business),
#   someone in the community updated it to 2.4, but I don't think that
#   person even had the hardware to test it so the driver remained broken
#   in 2.4. So my recommendation is that it's really time to remove this
#   driver from the kernel tree. Just my opinion but I thought I'd share
#   it with you.
#   [...]
#   I can't imagine that there are any users because 2.4 was broken last
#   time I checked (admittedly that was a year ago).
# 
# BitKeeper/deleted/.del-rcpci45.c~835bf68187aa024c
#   2004/05/14 13:45:40-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/rcpci45.c
# 
# BitKeeper/deleted/.del-rclanmtl.h~8817c7ee4b998a86
#   2004/05/14 13:45:40-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/rclanmtl.h
# 
# BitKeeper/deleted/.del-rclanmtl.c~29677cb1f1e8c94
#   2004/05/14 13:45:40-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/rclanmtl.c
# 
# BitKeeper/deleted/.del-rcif.h~4592b9fa074f7f4
#   2004/05/14 13:45:40-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/rcif.h
# 
# ChangeSet
#   2004/05/14 13:28:03-04:00 hch@lst.de 
#   [netdrvr wan] remove comx driver
#   
#   the drivers have been broken since pre-2.4.0, like referencing a symbol
#   that was made procfs-internal in 2.3.x, haven't received maintainer
#   updates for about the same period and MOD_{INC,DEC}_USE_COUNT usage that
#   pretty much unfixable (inside warts of _horrible_ procfs abuse).
# 
# drivers/net/wan/Makefile
#   2004/05/14 13:26:19-04:00 hch@lst.de +0 -8
#   [netdrvr wan] remove comx driver
#   
#   the drivers have been broken since pre-2.4.0, like referencing a symbol
#   that was made procfs-internal in 2.3.x, haven't received maintainer
#   updates for about the same period and MOD_{INC,DEC}_USE_COUNT usage that
#   pretty much unfixable (inside warts of _horrible_ procfs abuse).
# 
# drivers/net/wan/Kconfig
#   2004/05/14 13:26:19-04:00 hch@lst.de +0 -113
#   [netdrvr wan] remove comx driver
#   
#   the drivers have been broken since pre-2.4.0, like referencing a symbol
#   that was made procfs-internal in 2.3.x, haven't received maintainer
#   updates for about the same period and MOD_{INC,DEC}_USE_COUNT usage that
#   pretty much unfixable (inside warts of _horrible_ procfs abuse).
# 
# BitKeeper/deleted/.del-comxhw.h~6b76e46436247886
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comxhw.h
# 
# BitKeeper/deleted/.del-comx.h~af3561d319f35c94
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx.h
# 
# BitKeeper/deleted/.del-comx.c~fc2ba0c33f9a9544
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx.c
# 
# BitKeeper/deleted/.del-comx-proto-ppp.c~a73732d78d29937c
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-proto-ppp.c
# 
# BitKeeper/deleted/.del-comx-proto-lapb.c~c752dbedec6c7bfe
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-proto-lapb.c
# 
# BitKeeper/deleted/.del-comx-proto-fr.c~37dfa3e616a11ce9
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-proto-fr.c
# 
# BitKeeper/deleted/.del-comx-hw-munich.c~a3e4363f14137edb
#   2004/05/14 13:25:03-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-hw-munich.c
# 
# BitKeeper/deleted/.del-comx-hw-mixcom.c~a865aecdd553123b
#   2004/05/14 13:25:02-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-hw-mixcom.c
# 
# BitKeeper/deleted/.del-comx-hw-locomx.c~31fef1823d490470
#   2004/05/14 13:25:02-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-hw-locomx.c
# 
# BitKeeper/deleted/.del-comx-hw-comx.c~ffe17568e39e2f57
#   2004/05/14 13:25:02-04:00 jgarzik@redhat.com +0 -0
#   Delete: drivers/net/wan/comx-hw-comx.c
# 
# ChangeSet
#   2004/05/11 16:49:58-07:00 akpm@bix.(none) 
#   Merge bk://gkernel.bkbits.net/netdev-2.6
#   into bix.(none):/usr/src/bk-netdev
# 
# drivers/net/8139too.c
#   2004/05/11 16:49:55-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/11 16:49:05-07:00 akpm@bix.(none) 
#   Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-netdev
# 
# drivers/net/8139too.c
#   2004/05/11 16:49:01-07:00 akpm@bix.(none) +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/10 21:11:08-04:00 jgarzik@redhat.com 
#   Merge redhat.com:/spare/repo/linux-2.6
#   into redhat.com:/spare/repo/netdev-2.6/ALL
# 
# drivers/net/8139too.c
#   2004/05/10 21:11:04-04:00 jgarzik@redhat.com +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/21 23:30:47-04:00 romieu@fr.zoreil.com 
#   [PATCH] epic100: code removal in irq handler
#   
#   The loop in the irq handler is not needed any more as the high frequency
#   events have been deferred due to napi usage.
# 
# drivers/net/epic100.c
#   2004/04/19 18:37:16-04:00 romieu@fr.zoreil.com +52 -64
#   2.6.6-rc1-mm1 - code removal in the epic100 irq handler
# 
# ChangeSet
#   2004/04/21 23:30:40-04:00 romieu@fr.zoreil.com 
#   [PATCH] epic100: spin_unlock_irqrestore avoidance
#   
#   This patch avoids to duplicate a spin_unlock:
#   - it is mostly an artifact due to wild goto;
#   - it makes the generated code smaller.
# 
# drivers/net/epic100.c
#   2004/04/19 18:37:05-04:00 romieu@fr.zoreil.com +16 -10
#   2.6.6-rc1-mm1 - spin_unlock_irqrestore avoidance in epic100
# 
# ChangeSet
#   2004/04/21 20:40:33-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #11: cleanup and coding style
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:35-04:00 vda@port.imtp.ilyichevsk.odessa.ua +22 -26
#   2.6 fealnx.c #11: cleanup and coding style
# 
# ChangeSet
#   2004/04/21 20:40:25-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #10: replace local delay functions with udelay
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:32-04:00 vda@port.imtp.ilyichevsk.odessa.ua +6 -43
#   2.6 fealnx.c #10: replace local delay functions with udelay
# 
# ChangeSet
#   2004/04/21 20:40:18-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #9: fix locking for set_rx_mode
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:30-04:00 vda@port.imtp.ilyichevsk.odessa.ua +16 -2
#   2.6 fealnx.c #9: fix locking for set_rx_mode
# 
# ChangeSet
#   2004/04/21 20:40:10-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #8: rework error handling
#   
#   Add reset timer, fire it 1/2 sec after 'Too much work in interrupt'
#   Move reset code from tx_timeout into two separate routines:
#   reset_and_disable_rxtx() and enable_rxtx()
#   New function reset_tx_descriptors(): clean up tx ring
#   after tx_timeout. tx_timeout now does:
#       reset_and_disable_rxtx()
#       reset_tx_descriptors()
#       enable_rxtx()
#       netif_wake_queue()
#   Absense of netif_wake_queue() call was probably the cause of
#   tx_timeout() stalling all future tx.
#   Remove stop_nic_tx(), not used anymore
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:59-04:00 vda@port.imtp.ilyichevsk.odessa.ua +142 -41
#   2.6 fealnx.c #8: rework error handling
# 
# ChangeSet
#   2004/04/21 20:40:03-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #7: Garzik fix (IIRC): add locking to tx_timeout
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:55-04:00 vda@port.imtp.ilyichevsk.odessa.ua +8 -3
#   2.6 fealnx.c #7: Garzik fix (IIRC): add locking to tx_timeout
# 
# ChangeSet
#   2004/04/21 20:39:55-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #6: Francois' fixes for low memory handling; remove free_one_rx_descriptor (not used anymore)
# 
# drivers/net/fealnx.c
#   2004/04/05 15:54:52-04:00 vda@port.imtp.ilyichevsk.odessa.ua +26 -47
#   2.6 fealnx.c #6: Francois' fixes for low memory handling; remove free_one_rx_descriptor (not used anymore)
# 
# ChangeSet
#   2004/04/21 20:39:48-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #5: introduce stop_nic_rxtx(), use it where makes sense
# 
# drivers/net/fealnx.c
#   2004/04/05 14:16:24-04:00 vda@port.imtp.ilyichevsk.odessa.ua +15 -6
#   2.6 fealnx.c #5: introduce stop_nic_rxtx(), use it where makes sense
# 
# ChangeSet
#   2004/04/21 20:39:40-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #4: stop doing stop_nic_rx/writel(np->crvalue) in reset_rx_descriptors
#   
#   this can inadvertently (re)enable tx and/or rx.
# 
# drivers/net/fealnx.c
#   2004/04/05 11:16:51-04:00 vda@port.imtp.ilyichevsk.odessa.ua +8 -4
#   2.6 fealnx.c #4: stop doing stop_nic_rx/writel(np->crvalue) in reset_rx_descriptors
# 
# ChangeSet
#   2004/04/21 20:39:33-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #3: fix pointer substraction bug
# 
# drivers/net/fealnx.c
#   2004/04/05 11:08:07-04:00 vda@port.imtp.ilyichevsk.odessa.ua +5 -5
#   2.6 fealnx.c #3: fix pointer substraction bug
# 
# ChangeSet
#   2004/04/21 20:39:25-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #2: add 'static'; fix wrapped comment
# 
# drivers/net/fealnx.c
#   2004/04/05 11:01:53-04:00 vda@port.imtp.ilyichevsk.odessa.ua +6 -9
#   2.6 fealnx.c #2: add 'static'; fix wrapped comment
# 
# ChangeSet
#   2004/04/21 20:39:18-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #1: replace magic constants with enums
# 
# drivers/net/fealnx.c
#   2004/04/05 10:58:48-04:00 vda@port.imtp.ilyichevsk.odessa.ua +42 -33
#   2.6 fealnx.c #1: replace magic constants with enums
# 
# ChangeSet
#   2004/04/21 20:39:10-04:00 vda@port.imtp.ilyichevsk.odessa.ua 
#   [PATCH] fealnx #0: replace dev->base_addr with ioaddr
# 
# drivers/net/fealnx.c
#   2004/04/05 10:23:40-04:00 vda@port.imtp.ilyichevsk.odessa.ua +8 -10
#   2.6 fealnx.c #0: replace dev->base_addr with ioaddr
# 
# ChangeSet
#   2004/04/21 08:29:19-04:00 jgarzik@redhat.com 
#   Merge redhat.com:/spare/repo/netdev-2.6/8139too
#   into redhat.com:/spare/repo/netdev-2.6/ALL
# 
# drivers/net/8139too.c
#   2004/04/21 08:29:16-04:00 jgarzik@redhat.com +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/04/21 08:24:06-04:00 jgarzik@redhat.com 
#   [netdrvr e1000] Eliminate code duplicating ethtool_op_xxx helpers
# 
# drivers/net/e1000/e1000_ethtool.c
#   2004/04/21 08:24:01-04:00 jgarzik@redhat.com +4 -33
#   [netdrvr e1000] Eliminate code duplicating ethtool_op_xxx helpers
# 
# ChangeSet
#   2004/04/21 08:19:08-04:00 jgarzik@redhat.com 
#   Manual merge of e1000 upstream changes.
# 
# drivers/net/e1000/e1000_ethtool.c
#   2004/04/21 08:19:04-04:00 jgarzik@redhat.com +0 -3
#   Manual merge of e1000 upstream changes.
# 
# ChangeSet
#   2004/04/19 12:33:23-04:00 shemminger@osdl.org 
#   [PATCH] e1000 ethtool_ops support
#   
#   Okay, here is a first cut at ethtool ops integration for e1000.
#   
#   It has been touch tested for the basic operations on a card on
#   a lab machine.  Please review before including in the 2.6.6 kernel.
# 
# drivers/net/e1000/e1000_main.c
#   2004/04/16 11:50:02-04:00 shemminger@osdl.org +7 -28
#   e1000 ethtool_ops support
# 
# drivers/net/e1000/e1000_ethtool.c
#   2004/04/16 11:50:02-04:00 shemminger@osdl.org +234 -382
#   e1000 ethtool_ops support
# 
# ChangeSet
#   2004/04/06 08:01:31-04:00 hch@lst.de 
#   [PATCH] convert acenic to pci_driver API
# 
# drivers/net/acenic.c
#   2004/04/06 04:01:26-04:00 hch@lst.de +257 -313
#   [PATCH] convert acenic to pci_driver API
# 
# ChangeSet
#   2004/04/06 08:01:18-04:00 hch@lst.de 
#   [PATCH] kill acient compat cruft from acenic
#   
#   Kills lots of really old cruft and adds a little cruft to actually
#   make the driver work with recent 2.4 again.
# 
# drivers/net/acenic.c
#   2004/04/06 03:59:41-04:00 hch@lst.de +4 -225
#   [PATCH] kill acient compat cruft from acenic
#   
#   Kills lots of really old cruft and adds a little cruft to actually
#   make the driver work with recent 2.4 again.
# 
# ChangeSet
#   2004/03/25 23:52:21-05:00 romieu@fr.zoreil.com 
#   [netdrvr epic100] napi fixes
#   
#   Multiple invocation of __netif_rx_schedule() in epic_interrupt() while
#   epic_poll loops over __netif_rx_complete() leads to serious device
#   refcount leak.
# 
# drivers/net/epic100.c
#   2004/03/25 23:52:16-05:00 romieu@fr.zoreil.com +18 -15
#   [netdrvr epic100] napi fixes
#   
#   Multiple invocation of __netif_rx_schedule() in epic_interrupt() while
#   epic_poll loops over __netif_rx_complete() leads to serious device
#   refcount leak.
# 
# ChangeSet
#   2004/03/22 19:07:18-05:00 romieu@fr.zoreil.com 
#   [netdrvr epic100] napi 3/3 - transmit path
# 
# drivers/net/epic100.c
#   2004/03/22 18:18:40-05:00 romieu@fr.zoreil.com +9 -11
#   2.6.5-rc2 - epic100 napi
# 
# ChangeSet
#   2004/03/22 19:07:11-05:00 romieu@fr.zoreil.com 
#   [netdrvr epic100] napi 2/3 - receive path
# 
# drivers/net/epic100.c
#   2004/03/22 18:18:33-05:00 romieu@fr.zoreil.com +116 -21
#   2.6.5-rc2 - epic100 napi
# 
# ChangeSet
#   2004/03/22 19:07:03-05:00 romieu@fr.zoreil.com 
#   [netdrvr epic100] napi 1/3 - just shuffle some code around
#   
#   Isolate the classical TX part of epic_interrupt. Innocent code shuffling.
# 
# drivers/net/epic100.c
#   2004/03/22 16:53:18-05:00 romieu@fr.zoreil.com +76 -61
#   2.6.5-rc2 - epic100 napi
# 
# ChangeSet
#   2004/03/22 19:06:56-05:00 romieu@fr.zoreil.com 
#   [netdrvr epic100] minor cleanups
#   
#   - extra pci_disable_device() to balance invocation of pci_enable_device()
#     in epic_init_one() (-> error path + epic_remove_one());
#   - lazy return status in epic_init_one(), tsss...;
#   - memory dedicated to Rx descriptors was not freed after failure of
#     register_netdev() in epic_init_one();
#   - use of epic_pause() in epic_close() offers a small window for a late
#     interruption just before the final free_irq(). Let's close the window to
#     avoid two epic_rx() threads racing with each other.
# 
# drivers/net/epic100.c
#   2004/03/22 16:53:16-05:00 romieu@fr.zoreil.com +40 -19
#   2.6.5-rc2 - epic100 fixup
# 
diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig
--- a/drivers/net/Kconfig	Sun May 16 01:43:16 2004
+++ b/drivers/net/Kconfig	Sun May 16 01:43:16 2004
@@ -2487,16 +2487,6 @@
 	  To compile this driver as a module, choose M here: the module
 	  will be called iph5526.
 
-config RCPCI
-	tristate "Red Creek Hardware VPN (EXPERIMENTAL)"
-	depends on NETDEVICES && EXPERIMENTAL && PCI && !64BIT
-	help
-	  This is a driver for hardware which provides a Virtual Private
-	  Network (VPN). Say Y if you have it.
-
-	  To compile this driver as a module, choose M here: the module
-	  will be called rcpci.
-
 config SHAPER
 	tristate "Traffic Shaper (EXPERIMENTAL)"
 	depends on NETDEVICES && EXPERIMENTAL
diff -Nru a/drivers/net/Makefile b/drivers/net/Makefile
--- a/drivers/net/Makefile	Sun May 16 01:43:16 2004
+++ b/drivers/net/Makefile	Sun May 16 01:43:16 2004
@@ -2,8 +2,6 @@
 # Makefile for the Linux network (ethercard) device drivers.
 #
 
-rcpci-objs	:=	rcpci45.o rclanmtl.o
-
 ifeq ($(CONFIG_ISDN_PPP),y)
   obj-$(CONFIG_ISDN) += slhc.o
 endif
@@ -32,7 +30,6 @@
 obj-$(CONFIG_OAKNET) += oaknet.o 8390.o
 
 obj-$(CONFIG_DGRS) += dgrs.o
-obj-$(CONFIG_RCPCI) += rcpci.o
 obj-$(CONFIG_VORTEX) += 3c59x.o
 obj-$(CONFIG_TYPHOON) += typhoon.o
 obj-$(CONFIG_NE2K_PCI) += ne2k-pci.o 8390.o
diff -Nru a/drivers/net/acenic.c b/drivers/net/acenic.c
--- a/drivers/net/acenic.c	Sun May 16 01:43:16 2004
+++ b/drivers/net/acenic.c	Sun May 16 01:43:16 2004
@@ -131,7 +131,6 @@
 #define PCI_DEVICE_ID_SGI_ACENIC	0x0009
 #endif
 
-#if LINUX_VERSION_CODE >= 0x20400
 static struct pci_device_id acenic_pci_tbl[] = {
 	{ PCI_VENDOR_ID_ALTEON, PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE,
 	  PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, },
@@ -156,37 +155,6 @@
 	{ }
 };
 MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
-#endif
-
-
-#ifndef MODULE_LICENSE
-#define MODULE_LICENSE(a)
-#endif
-
-#ifndef wmb
-#define wmb()	mb()
-#endif
-
-#ifndef __exit
-#define __exit
-#endif
-
-#ifndef __devinit
-#define __devinit	__init
-#endif
-
-#ifndef SMP_CACHE_BYTES
-#define SMP_CACHE_BYTES	L1_CACHE_BYTES
-#endif
-
-#ifndef SET_MODULE_OWNER
-#define SET_MODULE_OWNER(dev)		do{} while(0)
-#define ACE_MOD_INC_USE_COUNT		MOD_INC_USE_COUNT
-#define ACE_MOD_DEC_USE_COUNT		MOD_DEC_USE_COUNT
-#else
-#define ACE_MOD_INC_USE_COUNT		do{} while(0)
-#define ACE_MOD_DEC_USE_COUNT		do{} while(0)
-#endif
 
 #ifndef SET_NETDEV_DEV
 #define SET_NETDEV_DEV(net, pdev)	do{} while(0)
@@ -198,151 +166,8 @@
 #define ace_sync_irq(irq)	synchronize_irq()
 #endif
 
-#if LINUX_VERSION_CODE < 0x2051e
-#define local_irq_save(flags)		do{__save_flags(flags) ; \
-					   __cli();} while(0)
-#define local_irq_restore(flags)	__restore_flags(flags)
-#endif
-
-#if (LINUX_VERSION_CODE < 0x02030d)
-#define pci_resource_start(dev, bar)	dev->base_address[bar]
-#elif (LINUX_VERSION_CODE < 0x02032c)
-#define pci_resource_start(dev, bar)	dev->resource[bar].start
-#endif
-
-#if (LINUX_VERSION_CODE < 0x02030e)
-#define net_device device
-#endif
-
-
-#if (LINUX_VERSION_CODE < 0x02032a)
-typedef u32 dma_addr_t;
-
-static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
-					 dma_addr_t *dma_handle)
-{
-	void *virt_ptr;
-
-	virt_ptr = kmalloc(size, GFP_KERNEL);
-	if (!virt_ptr)
-		return NULL;
-	*dma_handle = virt_to_bus(virt_ptr);
-	return virt_ptr;
-}
-
-#define pci_free_consistent(cookie, size, ptr, dma_ptr)	kfree(ptr)
-#define pci_map_page(cookie, page, off, size, dir)	\
-	virt_to_bus(page_address(page)+(off))
-#define pci_unmap_page(cookie, address, size, dir)
-#define pci_set_dma_mask(dev, mask)		\
-	(((u64)(mask) & 0xffffffff00000000) == 0 ? 0 : -EIO)
-#define pci_dma_supported(dev, mask)		\
-	(((u64)(mask) & 0xffffffff00000000) == 0 ? 1 : 0)
-
-#elif (LINUX_VERSION_CODE < 0x02040d)
-
-/*
- * 2.4.13 introduced pci_map_page()/pci_unmap_page() - for 2.4.12 and prior,
- * fall back on pci_map_single()/pci_unnmap_single().
- *
- * We are guaranteed that the page is mapped at this point since
- * pci_map_page() is only used upon valid struct skb's.
- */
-static inline dma_addr_t
-pci_map_page(struct pci_dev *cookie, struct page *page, unsigned long off,
-	     size_t size, int dir)
-{
-	void *page_virt;
-
-	page_virt = page_address(page);
-	if (!page_virt)
-		BUG();
-	return pci_map_single(cookie, (page_virt + off), size, dir);
-}
-#define pci_unmap_page(cookie, dma_addr, size, dir)	\
-	pci_unmap_single(cookie, dma_addr, size, dir)
-#endif
-
-#if (LINUX_VERSION_CODE < 0x020412)
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-#define pci_unmap_addr(PTR, ADDR_NAME)		0
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)	do{} while(0)
-#define pci_unmap_len(PTR, LEN_NAME)		0
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)	do{} while(0)
-#endif
-
-
-#if (LINUX_VERSION_CODE < 0x02032b)
-/*
- * SoftNet
- *
- * For pre-softnet kernels we need to tell the upper layer not to
- * re-enter start_xmit() while we are in there. However softnet
- * guarantees not to enter while we are in there so there is no need
- * to do the netif_stop_queue() dance unless the transmit queue really
- * gets stuck. This should also improve performance according to tests
- * done by Aman Singla.
- */
-#define dev_kfree_skb_irq(a)			dev_kfree_skb(a)
-#define netif_wake_queue(dev)			clear_bit(0, &dev->tbusy)
-#define netif_stop_queue(dev)			set_bit(0, &dev->tbusy)
-#define late_stop_netif_stop_queue(dev)		do{} while(0)
-#define early_stop_netif_stop_queue(dev)	test_and_set_bit(0,&dev->tbusy)
-#define early_stop_netif_wake_queue(dev)	netif_wake_queue(dev)
-
-static inline void netif_start_queue(struct net_device *dev)
-{
-	dev->tbusy = 0;
-	dev->interrupt = 0;
-	dev->start = 1;
-}
-
-#define ace_mark_net_bh()			mark_bh(NET_BH)
-#define netif_queue_stopped(dev)		dev->tbusy
-#define netif_running(dev)			dev->start
-#define ace_if_down(dev)			do{dev->start = 0;} while(0)
-
-#define tasklet_struct				tq_struct
-static inline void tasklet_schedule(struct tasklet_struct *tasklet)
-{
-	queue_task(tasklet, &tq_immediate);
-	mark_bh(IMMEDIATE_BH);
-}
-
-static inline void tasklet_init(struct tasklet_struct *tasklet,
-				void (*func)(unsigned long),
-				unsigned long data)
-{
-	tasklet->next = NULL;
-	tasklet->sync = 0;
-	tasklet->routine = (void (*)(void *))func;
-	tasklet->data = (void *)data;
-}
-#define tasklet_kill(tasklet)			do{} while(0)
-#else
-#define late_stop_netif_stop_queue(dev)		netif_stop_queue(dev)
-#define early_stop_netif_stop_queue(dev)	0
-#define early_stop_netif_wake_queue(dev)	do{} while(0)
-#define ace_mark_net_bh()			do{} while(0)
-#define ace_if_down(dev)			do{} while(0)
-#endif
-
-#if (LINUX_VERSION_CODE >= 0x02031b)
-#define NEW_NETINIT
-#define ACE_PROBE_ARG				void
-#else
-#define ACE_PROBE_ARG				struct net_device *dev
-#endif
-
-#ifndef min_t
-#define min_t(type,a,b)	(((a)<(b))?(a):(b))
-#endif
-
-#ifndef ARCH_HAS_PREFETCHW
-#ifndef prefetchw
-#define prefetchw(x)				do{} while(0)
-#endif
+#ifndef offset_in_page
+#define offset_in_page(ptr)	((unsigned long)(ptr) & ~PAGE_MASK)
 #endif
 
 #define ACE_MAX_MOD_PARMS	8
@@ -595,407 +420,323 @@
 static int tx_ratio[ACE_MAX_MOD_PARMS];
 static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1};
 
+MODULE_AUTHOR("Jes Sorensen <jes@trained-monkey.org>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver");
+MODULE_PARM(link, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(max_tx_desc, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(rx_coal_tick, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(max_rx_desc, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(tx_ratio, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM_DESC(link, "AceNIC/3C985/NetGear link state");
+MODULE_PARM_DESC(trace, "AceNIC/3C985/NetGear firmware trace level");
+MODULE_PARM_DESC(tx_coal_tick, "AceNIC/3C985/GA620 max clock ticks to wait from first tx descriptor arrives");
+MODULE_PARM_DESC(max_tx_desc, "AceNIC/3C985/GA620 max number of transmit descriptors to wait");
+MODULE_PARM_DESC(rx_coal_tick, "AceNIC/3C985/GA620 max clock ticks to wait from first rx descriptor arrives");
+MODULE_PARM_DESC(max_rx_desc, "AceNIC/3C985/GA620 max number of receive descriptors to wait");
+MODULE_PARM_DESC(tx_ratio, "AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)");
+
+
 static char version[] __initdata = 
   "acenic.c: v0.92 08/05/2002  Jes Sorensen, linux-acenic@SunSITE.dk\n"
   "                            http://home.cern.ch/~jes/gige/acenic.html\n";
 
-static struct net_device *root_dev;
-
-static int probed __initdata = 0;
-
-
-int __devinit acenic_probe (ACE_PROBE_ARG)
+static int __devinit acenic_probe_one(struct pci_dev *pdev,
+		const struct pci_device_id *id)
 {
-#ifdef NEW_NETINIT
 	struct net_device *dev;
-#endif
 	struct ace_private *ap;
-	struct pci_dev *pdev = NULL;
-	int boards_found = 0;
-	int version_disp;
-
-	if (probed)
-		return -ENODEV;
-	probed++;
-
-	version_disp = 0;
-
-	while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET<<8, pdev))) {
-
-		if (!((pdev->vendor == PCI_VENDOR_ID_ALTEON) &&
-		      ((pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE) ||
-		       (pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_COPPER)))&&
-		    !((pdev->vendor == PCI_VENDOR_ID_3COM) &&
-		      (pdev->device == PCI_DEVICE_ID_3COM_3C985)) &&
-		    !((pdev->vendor == PCI_VENDOR_ID_NETGEAR) &&
-		      ((pdev->device == PCI_DEVICE_ID_NETGEAR_GA620) || 
-		       (pdev->device == PCI_DEVICE_ID_NETGEAR_GA620T))) &&
-		/*
-		 * Farallon used the DEC vendor ID on their cards by
-		 * mistake for a while
-		 */
-		    !((pdev->vendor == PCI_VENDOR_ID_DEC) &&
-		      (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX)) &&
-		    !((pdev->vendor == PCI_VENDOR_ID_ALTEON) &&
-		      (pdev->device == PCI_DEVICE_ID_FARALLON_PN9100T)) &&
-		    !((pdev->vendor == PCI_VENDOR_ID_SGI) &&
-		      (pdev->device == PCI_DEVICE_ID_SGI_ACENIC)))
-			continue;
-
-		dev = alloc_etherdev(sizeof(struct ace_private));
-		if (dev == NULL) {
-			printk(KERN_ERR "acenic: Unable to allocate "
-			       "net_device structure!\n");
-			break;
-		}
+	static int boards_found;
 
-		SET_MODULE_OWNER(dev);
-		SET_NETDEV_DEV(dev, &pdev->dev);
+	dev = alloc_etherdev(sizeof(struct ace_private));
+	if (dev == NULL) {
+		printk(KERN_ERR "acenic: Unable to allocate "
+		       "net_device structure!\n");
+		return -ENOMEM;
+	}
+
+	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
-		ap = dev->priv;
-		ap->pdev = pdev;
+	ap = dev->priv;
+	ap->pdev = pdev;
 
-		dev->open = &ace_open;
-		dev->hard_start_xmit = &ace_start_xmit;
-		dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
+	dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
 #if ACENIC_DO_VLAN
-		dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-		dev->vlan_rx_register = ace_vlan_rx_register;
-		dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid;
-#endif
-		if (1) {
-			static void ace_watchdog(struct net_device *dev);
-			dev->tx_timeout = &ace_watchdog;
-			dev->watchdog_timeo = 5*HZ;
-		}
-		dev->stop = &ace_close;
-		dev->get_stats = &ace_get_stats;
-		dev->set_multicast_list = &ace_set_multicast_list;
-		dev->do_ioctl = &ace_ioctl;
-		dev->set_mac_address = &ace_set_mac_addr;
-		dev->change_mtu = &ace_change_mtu;
+	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+	dev->vlan_rx_register = ace_vlan_rx_register;
+	dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid;
+#endif
+	if (1) {
+		static void ace_watchdog(struct net_device *dev);
+		dev->tx_timeout = &ace_watchdog;
+		dev->watchdog_timeo = 5*HZ;
+	}
 
-		/* display version info if adapter is found */
-		if (!version_disp)
-		{
-			/* set display flag to TRUE so that */
-			/* we only display this string ONCE */
-			version_disp = 1;
-			printk(version);
-		}
+	dev->open = &ace_open;
+	dev->stop = &ace_close;
+	dev->hard_start_xmit = &ace_start_xmit;
+	dev->get_stats = &ace_get_stats;
+	dev->set_multicast_list = &ace_set_multicast_list;
+	dev->do_ioctl = &ace_ioctl;
+	dev->set_mac_address = &ace_set_mac_addr;
+	dev->change_mtu = &ace_change_mtu;
 
-		if (pci_enable_device(pdev)) {
-			free_netdev(dev);
-			continue;
-		}
+	/* we only display this string ONCE */
+	if (!boards_found)
+		printk(version);
 
-		/*
-		 * Enable master mode before we start playing with the
-		 * pci_command word since pci_set_master() will modify
-		 * it.
-		 */
-		pci_set_master(pdev);
+	if (pci_enable_device(pdev))
+		goto fail_free_netdev;
 
-		pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command);
+	/*
+	 * Enable master mode before we start playing with the
+	 * pci_command word since pci_set_master() will modify
+	 * it.
+	 */
+	pci_set_master(pdev);
 
-		/* OpenFirmware on Mac's does not set this - DOH.. */ 
-		if (!(ap->pci_command & PCI_COMMAND_MEMORY)) {
-			printk(KERN_INFO "%s: Enabling PCI Memory Mapped "
-			       "access - was not enabled by BIOS/Firmware\n",
-			       dev->name);
-			ap->pci_command = ap->pci_command | PCI_COMMAND_MEMORY;
-			pci_write_config_word(ap->pdev, PCI_COMMAND,
-					      ap->pci_command);
-			wmb();
-		}
+	pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command);
 
-		pci_read_config_byte(pdev, PCI_LATENCY_TIMER,
-				     &ap->pci_latency);
-		if (ap->pci_latency <= 0x40) {
-			ap->pci_latency = 0x40;
-			pci_write_config_byte(pdev, PCI_LATENCY_TIMER,
-					      ap->pci_latency);
-		}
+	/* OpenFirmware on Mac's does not set this - DOH.. */ 
+	if (!(ap->pci_command & PCI_COMMAND_MEMORY)) {
+		printk(KERN_INFO "%s: Enabling PCI Memory Mapped "
+		       "access - was not enabled by BIOS/Firmware\n",
+		       dev->name);
+		ap->pci_command = ap->pci_command | PCI_COMMAND_MEMORY;
+		pci_write_config_word(ap->pdev, PCI_COMMAND,
+				      ap->pci_command);
+		wmb();
+	}
 
-		/*
-		 * Remap the regs into kernel space - this is abuse of
-		 * dev->base_addr since it was means for I/O port
-		 * addresses but who gives a damn.
-		 */
-		dev->base_addr = pci_resource_start(pdev, 0);
-		ap->regs = (struct ace_regs *)ioremap(dev->base_addr, 0x4000);
-		if (!ap->regs) {
-			printk(KERN_ERR "%s:  Unable to map I/O register, "
-			       "AceNIC %i will be disabled.\n",
-			       dev->name, boards_found);
-			break;
-		}
+	pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &ap->pci_latency);
+	if (ap->pci_latency <= 0x40) {
+		ap->pci_latency = 0x40;
+		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, ap->pci_latency);
+	}
 
-		switch(pdev->vendor) {
-		case PCI_VENDOR_ID_ALTEON:
-			if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9100T) {
-				strncpy(ap->name, "Farallon PN9100-T "
-					"Gigabit Ethernet", sizeof (ap->name));
-				printk(KERN_INFO "%s: Farallon PN9100-T ",
-				       dev->name);
-			} else {
-				strncpy(ap->name, "AceNIC Gigabit Ethernet",
-					sizeof (ap->name));
-				printk(KERN_INFO "%s: Alteon AceNIC ",
-				       dev->name);
-			}
-			break;
-		case PCI_VENDOR_ID_3COM:
-			strncpy(ap->name, "3Com 3C985 Gigabit Ethernet",
-				sizeof (ap->name));
-			printk(KERN_INFO "%s: 3Com 3C985 ", dev->name);
-			break;
-		case PCI_VENDOR_ID_NETGEAR:
-			strncpy(ap->name, "NetGear GA620 Gigabit Ethernet",
-				sizeof (ap->name));
-			printk(KERN_INFO "%s: NetGear GA620 ", dev->name);
-			break;
-		case PCI_VENDOR_ID_DEC:
-			if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) {
-				strncpy(ap->name, "Farallon PN9000-SX "
-					"Gigabit Ethernet", sizeof (ap->name));
-				printk(KERN_INFO "%s: Farallon PN9000-SX ",
-				       dev->name);
-				break;
-			}
-		case PCI_VENDOR_ID_SGI:
-			strncpy(ap->name, "SGI AceNIC Gigabit Ethernet",
+	/*
+	 * Remap the regs into kernel space - this is abuse of
+	 * dev->base_addr since it was means for I/O port
+	 * addresses but who gives a damn.
+	 */
+	dev->base_addr = pci_resource_start(pdev, 0);
+	ap->regs = (struct ace_regs *)ioremap(dev->base_addr, 0x4000);
+	if (!ap->regs) {
+		printk(KERN_ERR "%s:  Unable to map I/O register, "
+		       "AceNIC %i will be disabled.\n",
+		       dev->name, boards_found);
+		goto fail_free_netdev;
+	}
+
+	switch(pdev->vendor) {
+	case PCI_VENDOR_ID_ALTEON:
+		if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9100T) {
+			strncpy(ap->name, "Farallon PN9100-T "
+				"Gigabit Ethernet", sizeof (ap->name));
+			printk(KERN_INFO "%s: Farallon PN9100-T ",
+			       dev->name);
+		} else {
+			strncpy(ap->name, "AceNIC Gigabit Ethernet",
 				sizeof (ap->name));
-			printk(KERN_INFO "%s: SGI AceNIC ", dev->name);
-			break;
-		default:
- 			strncpy(ap->name, "Unknown AceNIC based Gigabit "
-				"Ethernet", sizeof (ap->name));
-			printk(KERN_INFO "%s: Unknown AceNIC ", dev->name);
+			printk(KERN_INFO "%s: Alteon AceNIC ",
+			       dev->name);
+		}
+		break;
+	case PCI_VENDOR_ID_3COM:
+		strncpy(ap->name, "3Com 3C985 Gigabit Ethernet",
+			sizeof (ap->name));
+		printk(KERN_INFO "%s: 3Com 3C985 ", dev->name);
+		break;
+	case PCI_VENDOR_ID_NETGEAR:
+		strncpy(ap->name, "NetGear GA620 Gigabit Ethernet",
+			sizeof (ap->name));
+		printk(KERN_INFO "%s: NetGear GA620 ", dev->name);
+		break;
+	case PCI_VENDOR_ID_DEC:
+		if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) {
+			strncpy(ap->name, "Farallon PN9000-SX "
+				"Gigabit Ethernet", sizeof (ap->name));
+			printk(KERN_INFO "%s: Farallon PN9000-SX ",
+			       dev->name);
 			break;
 		}
-		ap->name [sizeof (ap->name) - 1] = '\0';
-		printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr);
+	case PCI_VENDOR_ID_SGI:
+		strncpy(ap->name, "SGI AceNIC Gigabit Ethernet",
+			sizeof (ap->name));
+		printk(KERN_INFO "%s: SGI AceNIC ", dev->name);
+		break;
+	default:
+ 		strncpy(ap->name, "Unknown AceNIC based Gigabit "
+			"Ethernet", sizeof (ap->name));
+		printk(KERN_INFO "%s: Unknown AceNIC ", dev->name);
+		break;
+	}
+
+	ap->name [sizeof (ap->name) - 1] = '\0';
+	printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr);
 #ifdef __sparc__
-		printk("irq %s\n", __irq_itoa(pdev->irq));
+	printk("irq %s\n", __irq_itoa(pdev->irq));
 #else
-		printk("irq %i\n", pdev->irq);
+	printk("irq %i\n", pdev->irq);
 #endif
 
 #ifdef CONFIG_ACENIC_OMIT_TIGON_I
-		if ((readl(&ap->regs->HostCtrl) >> 28) == 4) {
-			printk(KERN_ERR "%s: Driver compiled without Tigon I"
-			       " support - NIC disabled\n", dev->name);
-			ace_init_cleanup(dev);
-			free_netdev(dev);
-			continue;
-		}
+	if ((readl(&ap->regs->HostCtrl) >> 28) == 4) {
+		printk(KERN_ERR "%s: Driver compiled without Tigon I"
+		       " support - NIC disabled\n", dev->name);
+		goto fail_uninit;
+	}
 #endif
 
-		if (ace_allocate_descriptors(dev)) {
-			/*
-			 * ace_allocate_descriptors() calls
-			 * ace_init_cleanup() on error.
-			 */
-			free_netdev(dev);
-			continue;
-		}
+	if (ace_allocate_descriptors(dev))
+		goto fail_free_netdev;
 
 #ifdef MODULE
-		if (boards_found >= ACE_MAX_MOD_PARMS)
-			ap->board_idx = BOARD_IDX_OVERFLOW;
-		else
-			ap->board_idx = boards_found;
+	if (boards_found >= ACE_MAX_MOD_PARMS)
+		ap->board_idx = BOARD_IDX_OVERFLOW;
+	else
+		ap->board_idx = boards_found;
 #else
-		ap->board_idx = BOARD_IDX_STATIC;
+	ap->board_idx = BOARD_IDX_STATIC;
 #endif
 
-		if (ace_init(dev)) {
-			/*
-			 * ace_init() calls ace_init_cleanup() on error.
-			 */
-			free_netdev(dev);
-			continue;
-		}
+	if (ace_init(dev))
+		goto fail_free_netdev;
 
-		if (register_netdev(dev)) {
-			printk(KERN_ERR "acenic: device registration failed\n");
-			ace_init_cleanup(dev);
-			free_netdev(dev);
-			continue;
-		}
-
-		if (ap->pci_using_dac)
-			dev->features |= NETIF_F_HIGHDMA;
-
-		boards_found++;
+	if (register_netdev(dev)) {
+		printk(KERN_ERR "acenic: device registration failed\n");
+		goto fail_uninit;
 	}
 
-	/*
-	 * If we're at this point we're going through ace_probe() for
-	 * the first time.  Return success (0) if we've initialized 1
-	 * or more boards. Otherwise, return failure (-ENODEV).
-	 */
-
-	if (boards_found > 0)
-		return 0;
-	else
-		return -ENODEV;
-}
+	if (ap->pci_using_dac)
+		dev->features |= NETIF_F_HIGHDMA;
 
+	pci_set_drvdata(pdev, dev);
 
-#ifdef MODULE
-MODULE_AUTHOR("Jes Sorensen <jes@trained-monkey.org>");
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver");
-MODULE_PARM(link, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(max_tx_desc, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(rx_coal_tick, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(max_rx_desc, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(tx_ratio, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM_DESC(link, "AceNIC/3C985/NetGear link state");
-MODULE_PARM_DESC(trace, "AceNIC/3C985/NetGear firmware trace level");
-MODULE_PARM_DESC(tx_coal_tick, "AceNIC/3C985/GA620 max clock ticks to wait from first tx descriptor arrives");
-MODULE_PARM_DESC(max_tx_desc, "AceNIC/3C985/GA620 max number of transmit descriptors to wait");
-MODULE_PARM_DESC(rx_coal_tick, "AceNIC/3C985/GA620 max clock ticks to wait from first rx descriptor arrives");
-MODULE_PARM_DESC(max_rx_desc, "AceNIC/3C985/GA620 max number of receive descriptors to wait");
-MODULE_PARM_DESC(tx_ratio, "AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)");
-#endif
+	boards_found++;
+	return 0;
 
+ fail_uninit:
+	ace_init_cleanup(dev);
+ fail_free_netdev:
+	free_netdev(dev);
+	return -ENODEV;
+}
 
-static void __exit ace_module_cleanup(void)
+static void __devexit acenic_remove_one(struct pci_dev *pdev)
 {
-	struct ace_private *ap;
-	struct ace_regs *regs;
-	struct net_device *next;
+	struct net_device *dev = pci_get_drvdata(pdev);
+	struct ace_private *ap = dev->priv;
+	struct ace_regs *regs = ap->regs;
 	short i;
 
-	while (root_dev) {
-		ap = root_dev->priv;
-		next = ap->next;
-		unregister_netdev(root_dev);
-
-		regs = ap->regs;
+	unregister_netdev(dev);
 
-		writel(readl(&regs->CpuCtrl) | CPU_HALT, &regs->CpuCtrl);
-		if (ap->version >= 2)
-			writel(readl(&regs->CpuBCtrl) | CPU_HALT,
-			       &regs->CpuBCtrl);
-		/*
-		 * This clears any pending interrupts
-		 */
-		writel(1, &regs->Mb0Lo);
-		readl(&regs->CpuCtrl);	/* flush */
+	writel(readl(&regs->CpuCtrl) | CPU_HALT, &regs->CpuCtrl);
+	if (ap->version >= 2)
+		writel(readl(&regs->CpuBCtrl) | CPU_HALT, &regs->CpuBCtrl);
+	
+	/*
+	 * This clears any pending interrupts
+	 */
+	writel(1, &regs->Mb0Lo);
+	readl(&regs->CpuCtrl);	/* flush */
 
-		/*
-		 * Make sure no other CPUs are processing interrupts
-		 * on the card before the buffers are being released.
-		 * Otherwise one might experience some `interesting'
-		 * effects.
-		 *
-		 * Then release the RX buffers - jumbo buffers were
-		 * already released in ace_close().
-		 */
-		ace_sync_irq(root_dev->irq);
+	/*
+	 * Make sure no other CPUs are processing interrupts
+	 * on the card before the buffers are being released.
+	 * Otherwise one might experience some `interesting'
+	 * effects.
+	 *
+	 * Then release the RX buffers - jumbo buffers were
+	 * already released in ace_close().
+	 */
+	ace_sync_irq(dev->irq);
 
-		for (i = 0; i < RX_STD_RING_ENTRIES; i++) {
-			struct sk_buff *skb = ap->skb->rx_std_skbuff[i].skb;
+	for (i = 0; i < RX_STD_RING_ENTRIES; i++) {
+		struct sk_buff *skb = ap->skb->rx_std_skbuff[i].skb;
 
-			if (skb) {
-				struct ring_info *ringp;
-				dma_addr_t mapping;
+		if (skb) {
+			struct ring_info *ringp;
+			dma_addr_t mapping;
 
-				ringp = &ap->skb->rx_std_skbuff[i];
-				mapping = pci_unmap_addr(ringp, mapping);
-				pci_unmap_page(ap->pdev, mapping,
-					       ACE_STD_BUFSIZE - (2 + 16),
-					       PCI_DMA_FROMDEVICE);
+			ringp = &ap->skb->rx_std_skbuff[i];
+			mapping = pci_unmap_addr(ringp, mapping);
+			pci_unmap_page(ap->pdev, mapping,
+				       ACE_STD_BUFSIZE - (2 + 16),
+				       PCI_DMA_FROMDEVICE);
 
-				ap->rx_std_ring[i].size = 0;
-				ap->skb->rx_std_skbuff[i].skb = NULL;
-				dev_kfree_skb(skb);
-			}
-		}
-		if (ap->version >= 2) {
-			for (i = 0; i < RX_MINI_RING_ENTRIES; i++) {
-				struct sk_buff *skb = ap->skb->rx_mini_skbuff[i].skb;
-
-				if (skb) {
-					struct ring_info *ringp;
-					dma_addr_t mapping;
-
-					ringp = &ap->skb->rx_mini_skbuff[i];
-					mapping = pci_unmap_addr(ringp,mapping);
-					pci_unmap_page(ap->pdev, mapping,
-						       ACE_MINI_BUFSIZE - (2 + 16),
-						       PCI_DMA_FROMDEVICE);
-
-					ap->rx_mini_ring[i].size = 0;
-					ap->skb->rx_mini_skbuff[i].skb = NULL;
-					dev_kfree_skb(skb);
-				}
-			}
+			ap->rx_std_ring[i].size = 0;
+			ap->skb->rx_std_skbuff[i].skb = NULL;
+			dev_kfree_skb(skb);
 		}
-		for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) {
-			struct sk_buff *skb = ap->skb->rx_jumbo_skbuff[i].skb;
+	}
+
+	if (ap->version >= 2) {
+		for (i = 0; i < RX_MINI_RING_ENTRIES; i++) {
+			struct sk_buff *skb = ap->skb->rx_mini_skbuff[i].skb;
+
 			if (skb) {
 				struct ring_info *ringp;
 				dma_addr_t mapping;
 
-				ringp = &ap->skb->rx_jumbo_skbuff[i];
-				mapping = pci_unmap_addr(ringp, mapping);
+				ringp = &ap->skb->rx_mini_skbuff[i];
+				mapping = pci_unmap_addr(ringp,mapping);
 				pci_unmap_page(ap->pdev, mapping,
-					       ACE_JUMBO_BUFSIZE - (2 + 16),
+					       ACE_MINI_BUFSIZE - (2 + 16),
 					       PCI_DMA_FROMDEVICE);
 
-				ap->rx_jumbo_ring[i].size = 0;
-				ap->skb->rx_jumbo_skbuff[i].skb = NULL;
+				ap->rx_mini_ring[i].size = 0;
+				ap->skb->rx_mini_skbuff[i].skb = NULL;
 				dev_kfree_skb(skb);
 			}
 		}
-
-		ace_init_cleanup(root_dev);
-		free_netdev(root_dev);
-		root_dev = next;
 	}
-}
 
+	for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) {
+		struct sk_buff *skb = ap->skb->rx_jumbo_skbuff[i].skb;
+		if (skb) {
+			struct ring_info *ringp;
+			dma_addr_t mapping;
 
-int __init ace_module_init(void)
-{
-	int status;
+			ringp = &ap->skb->rx_jumbo_skbuff[i];
+			mapping = pci_unmap_addr(ringp, mapping);
+			pci_unmap_page(ap->pdev, mapping,
+				       ACE_JUMBO_BUFSIZE - (2 + 16),
+				       PCI_DMA_FROMDEVICE);
 
-	root_dev = NULL;
+			ap->rx_jumbo_ring[i].size = 0;
+			ap->skb->rx_jumbo_skbuff[i].skb = NULL;
+			dev_kfree_skb(skb);
+		}
+	}
 
-#ifdef NEW_NETINIT
-	status = acenic_probe();
-#else
-	status = acenic_probe(NULL);
-#endif
-	return status;
+	ace_init_cleanup(dev);
+	free_netdev(dev);
 }
 
+static struct pci_driver acenic_pci_driver = {
+	.name		= "acenic",
+	.id_table	= acenic_pci_tbl,
+	.probe		= acenic_probe_one,
+	.remove		= __devexit_p(acenic_remove_one),
+};
 
-#if (LINUX_VERSION_CODE < 0x02032a)
-#ifdef MODULE
-int init_module(void)
+static int __init acenic_init(void)
 {
-	return ace_module_init();
+	return pci_module_init(&acenic_pci_driver);
 }
 
-
-void cleanup_module(void)
+static void __exit acenic_exit(void)
 {
-	ace_module_cleanup();
+	pci_unregister_driver(&acenic_pci_driver);
 }
-#endif
-#else
-module_init(ace_module_init);
-module_exit(ace_module_cleanup);
-#endif
 
+module_init(acenic_init);
+module_exit(acenic_exit);
 
 static void ace_free_descriptors(struct net_device *dev)
 {
@@ -1462,13 +1203,6 @@
 	} else
 		dev->irq = pdev->irq;
 
-	/*
-	 * Register the device here to be able to catch allocated
-	 * interrupt handlers in case the firmware doesn't come up.
-	 */
-	ap->next = root_dev;
-	root_dev = dev;
-
 #ifdef INDEX_DEBUG
 	spin_lock_init(&ap->debug_lock);
 	ap->last_tx = ACE_TX_RING_ENTRIES(ap) - 1;
@@ -2642,8 +2376,6 @@
 
 	netif_start_queue(dev);
 
-	ACE_MOD_INC_USE_COUNT;
-
 	/*
 	 * Setup the bottom half rx ring refill handler
 	 */
@@ -2660,8 +2392,6 @@
 	unsigned long flags;
 	short i;
 
-	ace_if_down(dev);
-
 	/*
 	 * Without (or before) releasing irq and stopping hardware, this
 	 * is an absolute non-sense, by the way. It will be reset instantly
@@ -2733,7 +2463,6 @@
 	ace_unmask_irq(dev);
 	local_irq_restore(flags);
 
-	ACE_MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -2789,12 +2518,6 @@
 	struct ace_regs *regs = ap->regs;
 	struct tx_desc *desc;
 	u32 idx, flagsize;
-
- 	/*
-	 * This only happens with pre-softnet, ie. 2.2.x kernels.
- 	 */
-	if (early_stop_netif_stop_queue(dev))
- 		return 1;
 
 restart:
 	idx = ap->tx_prd;
diff -Nru a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c
--- a/drivers/net/e1000/e1000_ethtool.c	Sun May 16 01:43:16 2004
+++ b/drivers/net/e1000/e1000_ethtool.c	Sun May 16 01:43:16 2004
@@ -53,7 +53,7 @@
 
 #define E1000_STAT(m) sizeof(((struct e1000_adapter *)0)->m), \
 		      offsetof(struct e1000_adapter, m)
-static struct e1000_stats e1000_gstrings_stats[] = {
+static const struct e1000_stats e1000_gstrings_stats[] = {
 	{ "rx_packets", E1000_STAT(net_stats.rx_packets) },
 	{ "tx_packets", E1000_STAT(net_stats.tx_packets) },
 	{ "rx_bytes", E1000_STAT(net_stats.rx_bytes) },
@@ -100,9 +100,10 @@
 };
 #define E1000_TEST_LEN sizeof(e1000_gstrings_test) / ETH_GSTRING_LEN
 
-static void
-e1000_ethtool_gset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
+static int
+e1000_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
 
 	if(hw->media_type == e1000_media_type_copper) {
@@ -169,11 +170,13 @@
 	}
 
 	ecmd->autoneg = (hw->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE);
+	return 0;
 }
 
 static int
-e1000_ethtool_sset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
+e1000_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
 
 	if(ecmd->autoneg == AUTONEG_ENABLE) {
@@ -195,10 +198,11 @@
 	return 0;
 }
 
-static int
-e1000_ethtool_gpause(struct e1000_adapter *adapter,
+static void
+e1000_get_pauseparam(struct net_device *netdev,
                      struct ethtool_pauseparam *epause)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
 	
 	epause->autoneg = 
@@ -212,14 +216,13 @@
 		epause->rx_pause = 1;
 		epause->tx_pause = 1;
 	}
-	
-	return 0;
 }
 
 static int
-e1000_ethtool_spause(struct e1000_adapter *adapter,
+e1000_set_pauseparam(struct net_device *netdev,
                      struct ethtool_pauseparam *epause)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
 	
 	adapter->fc_autoneg = epause->autoneg;
@@ -248,28 +251,95 @@
 	return 0;
 }
 
+static u32
+e1000_get_rx_csum(struct net_device *netdev)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+	return adapter->rx_csum;
+}
+
+static int
+e1000_set_rx_csum(struct net_device *netdev, u32 data)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+
+	adapter->rx_csum = data;
+	if(netif_running(netdev)) {
+		e1000_down(adapter);
+		e1000_up(adapter);
+	} else
+		e1000_reset(adapter);
+	return 0;
+}
+
+static u32
+e1000_get_tx_csum(struct net_device *netdev)
+{
+	return (netdev->features & NETIF_F_HW_CSUM) != 0;
+}
+
+static int
+e1000_set_tx_csum(struct net_device *netdev, u32 data)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+
+	if(adapter->hw.mac_type < e1000_82543)
+		return data ? -EINVAL : 0;
+
+	if (data)
+		netdev->features |= NETIF_F_HW_CSUM;
+	else
+		netdev->features &= ~NETIF_F_HW_CSUM;
+	return 0;
+}
+
+static int
+e1000_set_tso(struct net_device *netdev, u32 data)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+
+	if (adapter->hw.mac_type < e1000_82544 ||
+	     adapter->hw.mac_type == e1000_82547)
+		return data ? -EINVAL : 0;
+		
+	if (data)
+		netdev->features |= NETIF_F_TSO;
+	else
+		netdev->features &= ~NETIF_F_TSO;
+	return 0;
+}
+
+
 static void
-e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter,
-                       struct ethtool_drvinfo *drvinfo)
+e1000_get_drvinfo(struct net_device *dev, 
+		  struct ethtool_drvinfo *drvinfo)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
+
 	strncpy(drvinfo->driver,  e1000_driver_name, 32);
 	strncpy(drvinfo->version, e1000_driver_version, 32);
 	strncpy(drvinfo->fw_version, "N/A", 32);
 	strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
-	drvinfo->n_stats = E1000_STATS_LEN;
-	drvinfo->testinfo_len = E1000_TEST_LEN;
+}
+
+static int
+e1000_get_regs_len(struct net_device *dev)
+{
 #define E1000_REGS_LEN 32
-	drvinfo->regdump_len  = E1000_REGS_LEN * sizeof(uint32_t);
-	drvinfo->eedump_len = adapter->hw.eeprom.word_size * 2;
+	return E1000_REGS_LEN * sizeof(uint32_t);
 }
 
 static void
-e1000_ethtool_gregs(struct e1000_adapter *adapter,
-                    struct ethtool_regs *regs, uint32_t *regs_buff)
+e1000_get_regs(struct net_device *dev,
+	       struct ethtool_regs *regs, void *p)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
+	u32 *regs_buff = p;
 	uint16_t phy_data;
 
+	memset(p, 0, E1000_REGS_LEN * sizeof(uint32_t));
+
 	regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id;
 
 	regs_buff[0]  = E1000_READ_REG(hw, CTRL);
@@ -342,30 +412,36 @@
 	e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
 	regs_buff[24] = (uint32_t)phy_data;  /* phy local receiver status */
 	regs_buff[25] = regs_buff[24];  /* phy remote receiver status */
+}
 
-	return;
+static int
+e1000_get_eeprom_len(struct net_device *dev)
+{
+	struct e1000_adapter *adapter = netdev_priv(dev);
+
+	return adapter->hw.eeprom.word_size * 2;
 }
 
 static int
-e1000_ethtool_geeprom(struct e1000_adapter *adapter,
-                      struct ethtool_eeprom *eeprom, uint16_t *eeprom_buff)
+e1000_get_eeprom(struct net_device *dev,
+		 struct ethtool_eeprom *eeprom, u8 *bytes)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
+	uint16_t *eeprom_buff = (uint16_t *) bytes;
 	int first_word, last_word;
 	int ret_val = 0;
 	uint16_t i;
 
-	if(eeprom->len == 0) {
-		ret_val = -EINVAL;
-		goto geeprom_error;
-	}
+	if(eeprom->len == 0) 
+		return  -EINVAL;
 
 	eeprom->magic = hw->vendor_id | (hw->device_id << 16);
 
-	if(eeprom->offset > eeprom->offset + eeprom->len) {
-		ret_val = -EINVAL;
-		goto geeprom_error;
-	}
+	if(eeprom->offset > eeprom->offset + eeprom->len) 
+		return -EINVAL;
+
+	memset(bytes, 0, adapter->hw.eeprom.word_size*2);
 
 	if((eeprom->offset + eeprom->len) > (hw->eeprom.word_size * 2))
 		eeprom->len = ((hw->eeprom.word_size * 2) - eeprom->offset);
@@ -388,14 +464,14 @@
 	for (i = 0; i < last_word - first_word + 1; i++)
 		le16_to_cpus(&eeprom_buff[i]);
 
-geeprom_error:
 	return ret_val;
 }
 
 static int
-e1000_ethtool_seeprom(struct e1000_adapter *adapter,
-                      struct ethtool_eeprom *eeprom, void *user_data)
+e1000_set_eeprom(struct net_device *netdev,
+		 struct ethtool_eeprom *eeprom, u8 *bytes)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
 	uint16_t *eeprom_buff;
 	void *ptr;
@@ -439,11 +515,7 @@
 	for (i = 0; i < last_word - first_word + 1; i++)
 		le16_to_cpus(&eeprom_buff[i]);
 
-	if((ret_val != 0) || copy_from_user(ptr, user_data, eeprom->len)) {
-		ret_val = -EFAULT;
-		goto seeprom_error;
-	}
-
+	memcpy(ptr, bytes, eeprom->len);
 	for (i = 0; i < last_word - first_word + 1; i++)
 		eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
 
@@ -454,15 +526,15 @@
 	if((ret_val == 0) && first_word <= EEPROM_CHECKSUM_REG)
 		e1000_update_eeprom_checksum(hw);
 
-seeprom_error:
 	kfree(eeprom_buff);
 	return ret_val;
 }
 
-static int
-e1000_ethtool_gring(struct e1000_adapter *adapter,
+static void
+e1000_get_ringparam(struct net_device *netdev,
                     struct ethtool_ringparam *ring)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 	e1000_mac_type mac_type = adapter->hw.mac_type;
 	struct e1000_desc_ring *txdr = &adapter->tx_ring;
 	struct e1000_desc_ring *rxdr = &adapter->rx_ring;
@@ -477,13 +549,12 @@
 	ring->tx_pending = txdr->count;
 	ring->rx_mini_pending = 0;
 	ring->rx_jumbo_pending = 0;
-
-	return 0;
 }
+
 static int 
-e1000_ethtool_sring(struct e1000_adapter *adapter,
-                    struct ethtool_ringparam *ring)
+e1000_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 	int err;
 	e1000_mac_type mac_type = adapter->hw.mac_type;
 	struct e1000_desc_ring *txdr = &adapter->tx_ring;
@@ -806,8 +877,6 @@
 		kfree(txdr->buffer_info);
 	if(rxdr->buffer_info)
 		kfree(rxdr->buffer_info);
-
-	return;
 }
 
 static int
@@ -939,8 +1008,6 @@
 	e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC);
 	e1000_write_phy_reg(&adapter->hw, 29, 0x001A);
 	e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0);
-
-	return;
 }
 
 static void
@@ -1257,11 +1324,19 @@
 	return *data;
 }
 
+
 static int
-e1000_ethtool_test(struct e1000_adapter *adapter,
-		   struct ethtool_test *eth_test, uint64_t *data)
+e1000_diag_test_count(struct net_device *dev)
 {
-	boolean_t if_running = netif_running(adapter->netdev);
+	return E1000_TEST_LEN;
+}
+
+static void 
+e1000_diag_test(struct net_device *netdev,
+		struct ethtool_test *eth_test, u64 *data)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+	boolean_t if_running = netif_running(netdev);
 
 	if(eth_test->flags == ETH_TEST_FL_OFFLINE) {
 		/* Offline tests */
@@ -1305,12 +1380,12 @@
 		data[2] = 0;
 		data[3] = 0;
 	}
-	return 0;
 }
 
 static void
-e1000_ethtool_gwol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
+e1000_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
 
 	switch(adapter->hw.device_id) {
@@ -1348,10 +1423,10 @@
 		return;
 	}
 }
-
 static int
-e1000_ethtool_swol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
+e1000_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
+	struct e1000_adapter *adapter = netdev_priv(dev);
 	struct e1000_hw *hw = &adapter->hw;
 
 	switch(adapter->hw.device_id) {
@@ -1408,8 +1483,13 @@
 }
 
 static int
-e1000_ethtool_led_blink(struct e1000_adapter *adapter, struct ethtool_value *id)
+e1000_phys_id(struct net_device *netdev, u32 data)
 {
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+
+	if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
+		data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
+
 	if(!adapter->blink_timer.function) {
 		init_timer(&adapter->blink_timer);
 		adapter->blink_timer.function = e1000_led_blink_callback;
@@ -1420,11 +1500,7 @@
 	mod_timer(&adapter->blink_timer, jiffies);
 
 	set_current_state(TASK_INTERRUPTIBLE);
-	if(id->data)
-		schedule_timeout(id->data * HZ);
-	else
-		schedule_timeout(MAX_SCHEDULE_TIMEOUT);
-
+	schedule_timeout(data * HZ);
 	del_timer_sync(&adapter->blink_timer);
 	e1000_led_off(&adapter->hw);
 	clear_bit(E1000_LED_ON, &adapter->led_status);
@@ -1433,345 +1509,89 @@
 	return 0;
 }
 
-int
-e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr)
+static int
+e1000_nway_reset(struct net_device *netdev)
 {
-	struct e1000_adapter *adapter = netdev->priv;
-	void *addr = ifr->ifr_data;
-	uint32_t cmd;
-
-	if(get_user(cmd, (uint32_t *) addr))
-		return -EFAULT;
-
-	switch(cmd) {
-	case ETHTOOL_GSET: {
-		struct ethtool_cmd ecmd = {ETHTOOL_GSET};
-		e1000_ethtool_gset(adapter, &ecmd);
-		if(copy_to_user(addr, &ecmd, sizeof(ecmd)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_SSET: {
-		struct ethtool_cmd ecmd;
-		if(copy_from_user(&ecmd, addr, sizeof(ecmd)))
-			return -EFAULT;
-		return e1000_ethtool_sset(adapter, &ecmd);
-	}
-	case ETHTOOL_GDRVINFO: {
-		struct ethtool_drvinfo drvinfo = {ETHTOOL_GDRVINFO};
-		e1000_ethtool_gdrvinfo(adapter, &drvinfo);
-		if(copy_to_user(addr, &drvinfo, sizeof(drvinfo)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_GSTRINGS: {
-		struct ethtool_gstrings gstrings = { ETHTOOL_GSTRINGS };
-		char *strings = NULL;
-		int err = 0;
-
-		if(copy_from_user(&gstrings, addr, sizeof(gstrings)))
-			return -EFAULT;
-		switch(gstrings.string_set) {
-		case ETH_SS_TEST:
-			gstrings.len = E1000_TEST_LEN;
-			strings = kmalloc(E1000_TEST_LEN * ETH_GSTRING_LEN,
-					  GFP_KERNEL);
-			if(!strings)
-				return -ENOMEM;
-			memcpy(strings, e1000_gstrings_test, E1000_TEST_LEN *
-			       ETH_GSTRING_LEN);
-			break;
-		case ETH_SS_STATS: {
-			int i;
-			gstrings.len = E1000_STATS_LEN;
-			strings = kmalloc(E1000_STATS_LEN * ETH_GSTRING_LEN,
-					  GFP_KERNEL);
-			if(!strings)
-				return -ENOMEM;
-			for(i=0; i < E1000_STATS_LEN; i++) {
-				memcpy(&strings[i * ETH_GSTRING_LEN],
-				       e1000_gstrings_stats[i].stat_string,
-				       ETH_GSTRING_LEN);
-			}
-			break;
-		}
-		default:
-			return -EOPNOTSUPP;
-		}
-		if(copy_to_user(addr, &gstrings, sizeof(gstrings)))
-			err = -EFAULT;
-		addr += offsetof(struct ethtool_gstrings, data);
-		if(!err && copy_to_user(addr, strings,
-		   gstrings.len * ETH_GSTRING_LEN))
-			err = -EFAULT;
-
-		kfree(strings);
-		return err;
-	}
-	case ETHTOOL_GREGS: {
-		struct ethtool_regs regs = {ETHTOOL_GREGS};
-		uint32_t regs_buff[E1000_REGS_LEN];
-
-		if(copy_from_user(&regs, addr, sizeof(regs)))
-			return -EFAULT;
-		memset(regs_buff, 0, sizeof(regs_buff));
-		if (regs.len > E1000_REGS_LEN)
-			regs.len = E1000_REGS_LEN;
-		e1000_ethtool_gregs(adapter, &regs, regs_buff);
-		if(copy_to_user(addr, &regs, sizeof(regs)))
-			return -EFAULT;
-
-		addr += offsetof(struct ethtool_regs, data);
-		if(copy_to_user(addr, regs_buff, regs.len))
-			return -EFAULT;
-
-		return 0;
-	}
-	case ETHTOOL_NWAY_RST: {
-		if(netif_running(netdev)) {
-			e1000_down(adapter);
-			e1000_up(adapter);
-		}
-		return 0;
-	}
-	case ETHTOOL_PHYS_ID: {
-		struct ethtool_value id;
-		if(copy_from_user(&id, addr, sizeof(id)))
-			return -EFAULT;
-		return e1000_ethtool_led_blink(adapter, &id);
-	}
-	case ETHTOOL_GLINK: {
-		struct ethtool_value link = {ETHTOOL_GLINK};
-		link.data = netif_carrier_ok(netdev);
-		if(copy_to_user(addr, &link, sizeof(link)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_GWOL: {
-		struct ethtool_wolinfo wol = {ETHTOOL_GWOL};
-		e1000_ethtool_gwol(adapter, &wol);
-		if(copy_to_user(addr, &wol, sizeof(wol)) != 0)
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_SWOL: {
-		struct ethtool_wolinfo wol;
-		if(copy_from_user(&wol, addr, sizeof(wol)) != 0)
-			return -EFAULT;
-		return e1000_ethtool_swol(adapter, &wol);
-	}
-	case ETHTOOL_GEEPROM: {
-		struct ethtool_eeprom eeprom = {ETHTOOL_GEEPROM};
-		struct e1000_hw *hw = &adapter->hw;
-		uint16_t *eeprom_buff;
-		void *ptr;
-		int err = 0;
-
-		if(copy_from_user(&eeprom, addr, sizeof(eeprom)))
-			return -EFAULT;
-
-		eeprom_buff = kmalloc(hw->eeprom.word_size * 2, GFP_KERNEL);
-
-		if(!eeprom_buff)
-			return -ENOMEM;
-
-		if((err = e1000_ethtool_geeprom(adapter, &eeprom,
-						eeprom_buff)))
-			goto err_geeprom_ioctl;
-
-		if(copy_to_user(addr, &eeprom, sizeof(eeprom))) {
-			err = -EFAULT;
-			goto err_geeprom_ioctl;
-		}
-
-		addr += offsetof(struct ethtool_eeprom, data);
-		ptr = ((void *)eeprom_buff) + (eeprom.offset & 1);
-
-		if(copy_to_user(addr, ptr, eeprom.len))
-			err = -EFAULT;
-
-err_geeprom_ioctl:
-		kfree(eeprom_buff);
-		return err;
-	}
-	case ETHTOOL_SEEPROM: {
-		struct ethtool_eeprom eeprom;
-
-		if(copy_from_user(&eeprom, addr, sizeof(eeprom)))
-			return -EFAULT;
-
-		addr += offsetof(struct ethtool_eeprom, data);
-		return e1000_ethtool_seeprom(adapter, &eeprom, addr);
-	}
-	case ETHTOOL_GRINGPARAM: {
-		struct ethtool_ringparam ering = {ETHTOOL_GRINGPARAM};
-		e1000_ethtool_gring(adapter, &ering);
-		if(copy_to_user(addr, &ering, sizeof(ering)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_SRINGPARAM: {
-		struct ethtool_ringparam ering;
-		if(copy_from_user(&ering, addr, sizeof(ering)))
-			return -EFAULT;
-		return e1000_ethtool_sring(adapter, &ering);
-	}
-	case ETHTOOL_GPAUSEPARAM: {
-		struct ethtool_pauseparam epause = {ETHTOOL_GPAUSEPARAM};
-		e1000_ethtool_gpause(adapter, &epause);
-		if(copy_to_user(addr, &epause, sizeof(epause)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_SPAUSEPARAM: {
-		struct ethtool_pauseparam epause;
-		if(copy_from_user(&epause, addr, sizeof(epause)))
-			return -EFAULT;
-		return e1000_ethtool_spause(adapter, &epause);
-	}
-	case ETHTOOL_GSTATS: {
-		struct {
-			struct ethtool_stats eth_stats;
-			uint64_t data[E1000_STATS_LEN];
-		} stats = { {ETHTOOL_GSTATS, E1000_STATS_LEN} };
-		int i;
-
-		e1000_update_stats(adapter);
-		for(i = 0; i < E1000_STATS_LEN; i++)
-			stats.data[i] = (e1000_gstrings_stats[i].sizeof_stat ==
-					sizeof(uint64_t)) ?
-				*(uint64_t *)((char *)adapter +
-					e1000_gstrings_stats[i].stat_offset) :
-				*(uint32_t *)((char *)adapter +
-					e1000_gstrings_stats[i].stat_offset);
-		if(copy_to_user(addr, &stats, sizeof(stats)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_TEST: {
-		struct {
-			struct ethtool_test eth_test;
-			uint64_t data[E1000_TEST_LEN];
-		} test = { {ETHTOOL_TEST} };
-		int err;
-
-		if(copy_from_user(&test.eth_test, addr, sizeof(test.eth_test)))
-			return -EFAULT;
-
-		test.eth_test.len = E1000_TEST_LEN;
-
-		if((err = e1000_ethtool_test(adapter, &test.eth_test,
-					     test.data)))
-			return err;
-
-		if(copy_to_user(addr, &test, sizeof(test)) != 0)
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_GRXCSUM: {
-		struct ethtool_value edata = { ETHTOOL_GRXCSUM };
-
-		edata.data = adapter->rx_csum;
-		if (copy_to_user(addr, &edata, sizeof(edata)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_SRXCSUM: {
-		struct ethtool_value edata;
-
-		if (copy_from_user(&edata, addr, sizeof(edata)))
-			return -EFAULT;
-		adapter->rx_csum = edata.data;
-		if(netif_running(netdev)) {
-			e1000_down(adapter);
-			e1000_up(adapter);
-		} else
-			e1000_reset(adapter);
-		return 0;
-	}
-	case ETHTOOL_GTXCSUM: {
-		struct ethtool_value edata = { ETHTOOL_GTXCSUM };
+	struct e1000_adapter *adapter = netdev_priv(netdev);
 
-		edata.data =
-			(netdev->features & NETIF_F_HW_CSUM) != 0;
-		if (copy_to_user(addr, &edata, sizeof(edata)))
-			return -EFAULT;
-		return 0;
+	if(netif_running(netdev)) {
+		e1000_down(adapter);
+		e1000_up(adapter);
 	}
-	case ETHTOOL_STXCSUM: {
-		struct ethtool_value edata;
-
-		if (copy_from_user(&edata, addr, sizeof(edata)))
-			return -EFAULT;
-
-		if(adapter->hw.mac_type < e1000_82543) {
-			if (edata.data != 0)
-				return -EINVAL;
-			return 0;
-		}
+	return 0;
+}
 
-		if (edata.data)
-			netdev->features |= NETIF_F_HW_CSUM;
-		else
-			netdev->features &= ~NETIF_F_HW_CSUM;
+static int
+e1000_get_stats_count(struct net_device *dev)
+{
+	return E1000_STATS_LEN;
+}
 
-		return 0;
-	}
-	case ETHTOOL_GSG: {
-		struct ethtool_value edata = { ETHTOOL_GSG };
+static void
+e1000_get_ethtool_stats(struct net_device *netdev,
+			struct ethtool_stats *stats, u64 *data)
+{
+	struct e1000_adapter *adapter = netdev_priv(netdev);
+	int i;
 
-		edata.data =
-			(netdev->features & NETIF_F_SG) != 0;
-		if (copy_to_user(addr, &edata, sizeof(edata)))
-			return -EFAULT;
-		return 0;
+	e1000_update_stats(adapter);
+	for(i = 0; i < E1000_STATS_LEN; i++) {
+		char *p = (char *) adapter + e1000_gstrings_stats[i].stat_offset;
+		data[i] = (e1000_gstrings_stats[i].sizeof_stat == sizeof(uint64_t)) 
+			? *(uint64_t *)p : *(uint32_t *)p;
 	}
-	case ETHTOOL_SSG: {
-		struct ethtool_value edata;
-
-		if (copy_from_user(&edata, addr, sizeof(edata)))
-			return -EFAULT;
-
-		if (edata.data)
-			netdev->features |= NETIF_F_SG;
-		else
-			netdev->features &= ~NETIF_F_SG;
+}
 
-		return 0;
-	}
-#ifdef NETIF_F_TSO
-	case ETHTOOL_GTSO: {
-		struct ethtool_value edata = { ETHTOOL_GTSO };
-
-		edata.data = (netdev->features & NETIF_F_TSO) != 0;
-		if (copy_to_user(addr, &edata, sizeof(edata)))
-			return -EFAULT;
-		return 0;
-	}
-	case ETHTOOL_STSO: {
-		struct ethtool_value edata;
+static void
+e1000_get_strings(struct net_device *netdev, u32 string_set, u8 *data)
+{
+	int i;
 
-		if (copy_from_user(&edata, addr, sizeof(edata)))
-			return -EFAULT;
+	switch(string_set) {
+	case ETH_SS_TEST:
+		memcpy(data, e1000_gstrings_test, E1000_TEST_LEN * ETH_GSTRING_LEN);
+		break;
 
-		if ((adapter->hw.mac_type < e1000_82544) ||
-		    (adapter->hw.mac_type == e1000_82547)) {
-			if (edata.data != 0)
-				return -EINVAL;
-			return 0;
+	case ETH_SS_STATS:
+		for(i=0; i < E1000_STATS_LEN; i++) {
+			memcpy(data + i * ETH_GSTRING_LEN,
+			       e1000_gstrings_stats[i].stat_string,
+			       ETH_GSTRING_LEN);
 		}
-
-		if (edata.data)
-			netdev->features |= NETIF_F_TSO;
-		else
-			netdev->features &= ~NETIF_F_TSO;
-
-		return 0;
-	}
-#endif
-	default:
-		return -EOPNOTSUPP;
+		break;
 	}
 }
 
 
+struct ethtool_ops e1000_ethtool_ops = {
+	.get_settings		= e1000_get_settings,
+	.set_settings		= e1000_set_settings,
+	.get_drvinfo		= e1000_get_drvinfo,
+	.get_regs_len		= e1000_get_regs_len,
+	.get_regs		= e1000_get_regs,
+	.get_wol		= e1000_get_wol,
+	.set_wol		= e1000_set_wol,
+	.nway_reset		= e1000_nway_reset,
+	.get_link		= ethtool_op_get_link,
+	.get_eeprom_len		= e1000_get_eeprom_len,
+	.get_eeprom		= e1000_get_eeprom,
+	.set_eeprom		= e1000_set_eeprom,
+	.get_ringparam		= e1000_get_ringparam,
+	.set_ringparam		= e1000_set_ringparam,
+	.get_pauseparam		= e1000_get_pauseparam,
+	.set_pauseparam		= e1000_set_pauseparam,
+	.get_rx_csum		= e1000_get_rx_csum,
+	.set_rx_csum		= e1000_set_rx_csum,
+	.get_tx_csum		= e1000_get_tx_csum,
+	.set_tx_csum		= e1000_set_tx_csum,
+	.get_sg			= ethtool_op_get_sg,
+	.set_sg			= ethtool_op_set_sg,
+	.get_tso		= ethtool_op_get_tso,
+	.set_tso		= e1000_set_tso,
+	.self_test_count	= e1000_diag_test_count,
+	.self_test		= e1000_diag_test,
+	.get_strings		= e1000_get_strings,
+	.phys_id		= e1000_phys_id,
+	.get_stats_count	= e1000_get_stats_count,
+	.get_ethtool_stats	= e1000_get_ethtool_stats,
+};
diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
--- a/drivers/net/e1000/e1000_main.c	Sun May 16 01:43:16 2004
+++ b/drivers/net/e1000/e1000_main.c	Sun May 16 01:43:16 2004
@@ -167,9 +167,9 @@
 static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter);
 #endif
 static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter);
-static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
-static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
-			   int cmd);
+
+static int e1000_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
+extern struct ethtool_ops e1000_ethtool_ops;
 static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
 static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
 static inline void e1000_rx_checksum(struct e1000_adapter *adapter,
@@ -206,7 +206,6 @@
 /* Exported from other modules */
 
 extern void e1000_check_options(struct e1000_adapter *adapter);
-extern int e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr);
 
 static struct pci_driver e1000_driver = {
 	.name     = e1000_driver_name,
@@ -445,7 +444,8 @@
 	netdev->set_multicast_list = &e1000_set_multi;
 	netdev->set_mac_address = &e1000_set_mac;
 	netdev->change_mtu = &e1000_change_mtu;
-	netdev->do_ioctl = &e1000_ioctl;
+	netdev->do_ioctl = &e1000_do_ioctl;
+	SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops);
 	netdev->tx_timeout = &e1000_tx_timeout;
 	netdev->watchdog_timeo = 5 * HZ;
 #ifdef CONFIG_E1000_NAPI
@@ -2498,37 +2498,16 @@
 		adapter->smartspeed = 0;
 }
 
-/**
- * e1000_ioctl -
- * @netdev:
- * @ifreq:
- * @cmd:
- **/
-
-static int
-e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
-{
-	switch (cmd) {
-	case SIOCGMIIPHY:
-	case SIOCGMIIREG:
-	case SIOCSMIIREG:
-		return e1000_mii_ioctl(netdev, ifr, cmd);
-	case SIOCETHTOOL:
-		return e1000_ethtool_ioctl(netdev, ifr);
-	default:
-		return -EOPNOTSUPP;
-	}
-}
 
 /**
- * e1000_mii_ioctl -
+ * e1000_do_ioctl -
  * @netdev:
  * @ifreq:
  * @cmd:
  **/
 
 static int
-e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
+e1000_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 {
 	struct e1000_adapter *adapter = netdev->priv;
 	struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data;
diff -Nru a/drivers/net/epic100.c b/drivers/net/epic100.c
--- a/drivers/net/epic100.c	Sun May 16 01:43:16 2004
+++ b/drivers/net/epic100.c	Sun May 16 01:43:16 2004
@@ -77,8 +77,6 @@
    These may be modified when a driver module is loaded.*/
 
 static int debug = 1;			/* 1 normal messages, 0 quiet .. 7 verbose. */
-/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
-static int max_interrupt_work = 32;
 
 /* Used to pass the full-duplex flag, etc. */
 #define MAX_UNITS 8		/* More are supported, limit only on options */
@@ -96,9 +94,9 @@
    Making the Tx ring too large decreases the effectiveness of channel
    bonding and packet priority.
    There are no ill effects from too-large receive rings. */
-#define TX_RING_SIZE	16
-#define TX_QUEUE_LEN	10		/* Limit ring entries actually used.  */
-#define RX_RING_SIZE	32
+#define TX_RING_SIZE	256
+#define TX_QUEUE_LEN	240		/* Limit ring entries actually used.  */
+#define RX_RING_SIZE	256
 #define TX_TOTAL_SIZE	TX_RING_SIZE*sizeof(struct epic_tx_desc)
 #define RX_TOTAL_SIZE	RX_RING_SIZE*sizeof(struct epic_rx_desc)
 
@@ -155,12 +153,10 @@
 MODULE_LICENSE("GPL");
 
 MODULE_PARM(debug, "i");
-MODULE_PARM(max_interrupt_work, "i");
 MODULE_PARM(rx_copybreak, "i");
 MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
 MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
 MODULE_PARM_DESC(debug, "EPIC/100 debug level (0-5)");
-MODULE_PARM_DESC(max_interrupt_work, "EPIC/100 maximum events handled per interrupt");
 MODULE_PARM_DESC(options, "EPIC/100: Bits 0-3: media type, bit 4: full duplex");
 MODULE_PARM_DESC(rx_copybreak, "EPIC/100 copy breakpoint for copy-only-tiny-frames");
 MODULE_PARM_DESC(full_duplex, "EPIC/100 full duplex setting(s) (1)");
@@ -292,6 +288,12 @@
 	StopTxDMA=0x20, StopRxDMA=0x40, RestartTx=0x80,
 };
 
+#define EpicRemoved	0xffffffff	/* Chip failed or removed (CardBus) */
+
+#define EpicNapiEvent	(TxEmpty | TxDone | \
+			 RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull)
+#define EpicNormalEvent	(0x0000ffff & ~EpicNapiEvent)
+
 static u16 media2miictl[16] = {
 	0, 0x0C00, 0x0C00, 0x2000,  0x0100, 0x2100, 0, 0,
 	0, 0, 0, 0,  0, 0, 0, 0 };
@@ -330,9 +332,12 @@
 
 	/* Ring pointers. */
 	spinlock_t lock;				/* Group with Tx control cache line. */
+	spinlock_t napi_lock;
+	unsigned int reschedule_in_poll;
 	unsigned int cur_tx, dirty_tx;
 
 	unsigned int cur_rx, dirty_rx;
+	u32 irq_mask;
 	unsigned int rx_buf_sz;				/* Based on MTU+slack. */
 
 	struct pci_dev *pci_dev;			/* PCI bus location. */
@@ -359,7 +364,8 @@
 static void epic_tx_timeout(struct net_device *dev);
 static void epic_init_ring(struct net_device *dev);
 static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static int epic_rx(struct net_device *dev);
+static int epic_rx(struct net_device *dev, int budget);
+static int epic_poll(struct net_device *dev, int *budget);
 static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
 static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static struct ethtool_ops netdev_ethtool_ops;
@@ -378,7 +384,7 @@
 	int irq;
 	struct net_device *dev;
 	struct epic_private *ep;
-	int i, option = 0, duplex = 0;
+	int i, ret, option = 0, duplex = 0;
 	void *ring_space;
 	dma_addr_t ring_dma;
 
@@ -392,29 +398,33 @@
 	
 	card_idx++;
 	
-	i = pci_enable_device(pdev);
-	if (i)
-		return i;
+	ret = pci_enable_device(pdev);
+	if (ret)
+		goto out;
 	irq = pdev->irq;
 
 	if (pci_resource_len(pdev, 0) < pci_id_tbl[chip_idx].io_size) {
 		printk (KERN_ERR "card %d: no PCI region space\n", card_idx);
-		return -ENODEV;
+		ret = -ENODEV;
+		goto err_out_disable;
 	}
 	
 	pci_set_master(pdev);
 
+	ret = pci_request_regions(pdev, DRV_NAME);
+	if (ret < 0)
+		goto err_out_disable;
+
+	ret = -ENOMEM;
+
 	dev = alloc_etherdev(sizeof (*ep));
 	if (!dev) {
 		printk (KERN_ERR "card %d: no memory for eth device\n", card_idx);
-		return -ENOMEM;
+		goto err_out_free_res;
 	}
 	SET_MODULE_OWNER(dev);
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
-	if (pci_request_regions(pdev, DRV_NAME))
-		goto err_out_free_netdev;
-
 #ifdef USE_IO_OPS
 	ioaddr = pci_resource_start (pdev, 0);
 #else
@@ -422,7 +432,7 @@
 	ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1));
 	if (!ioaddr) {
 		printk (KERN_ERR DRV_NAME " %d: ioremap failed\n", card_idx);
-		goto err_out_free_res;
+		goto err_out_free_netdev;
 	}
 #endif
 
@@ -459,7 +469,9 @@
 	dev->base_addr = ioaddr;
 	dev->irq = irq;
 
-	spin_lock_init (&ep->lock);
+	spin_lock_init(&ep->lock);
+	spin_lock_init(&ep->napi_lock);
+	ep->reschedule_in_poll = 0;
 
 	/* Bring the chip out of low-power mode. */
 	outl(0x4200, ioaddr + GENCTL);
@@ -489,6 +501,9 @@
 	ep->pci_dev = pdev;
 	ep->chip_id = chip_idx;
 	ep->chip_flags = pci_id_tbl[chip_idx].drv_flags;
+	ep->irq_mask = 
+		(ep->chip_flags & TYPE2_INTR ?  PCIBusErr175 : PCIBusErr170)
+		 | CntFull | TxUnderrun | EpicNapiEvent;
 
 	/* Find the connected MII xcvrs.
 	   Doing this in open() would allow detecting external xcvrs later, but
@@ -543,10 +558,12 @@
 	dev->ethtool_ops = &netdev_ethtool_ops;
 	dev->watchdog_timeo = TX_TIMEOUT;
 	dev->tx_timeout = &epic_tx_timeout;
+	dev->poll = epic_poll;
+	dev->weight = 64;
 
-	i = register_netdev(dev);
-	if (i)
-		goto err_out_unmap_tx;
+	ret = register_netdev(dev);
+	if (ret < 0)
+		goto err_out_unmap_rx;
 
 	printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ",
 		   dev->name, pci_id_tbl[chip_idx].name, ioaddr, dev->irq);
@@ -554,19 +571,24 @@
 		printk("%2.2x:", dev->dev_addr[i]);
 	printk("%2.2x.\n", dev->dev_addr[i]);
 
-	return 0;
+out:
+	return ret;
 
+err_out_unmap_rx:
+	pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma);
 err_out_unmap_tx:
 	pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma);
 err_out_iounmap:
 #ifndef USE_IO_OPS
 	iounmap(ioaddr);
-err_out_free_res:
-#endif
-	pci_release_regions(pdev);
 err_out_free_netdev:
+#endif
 	free_netdev(dev);
-	return -ENODEV;
+err_out_free_res:
+	pci_release_regions(pdev);
+err_out_disable:
+	pci_disable_device(pdev);
+	goto out;
 }
 
 /* Serial EEPROM section. */
@@ -592,6 +614,38 @@
 #define EE_READ256_CMD	(6 << 8)
 #define EE_ERASE_CMD	(7 << 6)
 
+static void epic_disable_int(struct net_device *dev, struct epic_private *ep)
+{
+	long ioaddr = dev->base_addr;
+
+	outl(0x00000000, ioaddr + INTMASK);
+}
+
+static inline void __epic_pci_commit(long ioaddr)
+{
+#ifndef USE_IO_OPS
+	inl(ioaddr + INTMASK);
+#endif
+}
+
+static inline void epic_napi_irq_off(struct net_device *dev,
+				     struct epic_private *ep)
+{
+	long ioaddr = dev->base_addr;
+
+	outl(ep->irq_mask & ~EpicNapiEvent, ioaddr + INTMASK);
+	__epic_pci_commit(ioaddr);
+}
+
+static inline void epic_napi_irq_on(struct net_device *dev,
+				    struct epic_private *ep)
+{
+	long ioaddr = dev->base_addr;
+
+	/* No need to commit possible posted write */
+	outl(ep->irq_mask | EpicNapiEvent, ioaddr + INTMASK);
+}
+
 static int __devinit read_eeprom(long ioaddr, int location)
 {
 	int i;
@@ -752,9 +806,8 @@
 
 	/* Enable interrupts by setting the interrupt mask. */
 	outl((ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
-		 | CntFull | TxUnderrun | TxDone | TxEmpty
-		 | RxError | RxOverflow | RxFull | RxHeader | RxDone,
-		 ioaddr + INTMASK);
+		 | CntFull | TxUnderrun 
+		 | RxError | RxHeader | EpicNapiEvent, ioaddr + INTMASK);
 
 	if (debug > 1)
 		printk(KERN_DEBUG "%s: epic_open() ioaddr %lx IRQ %d status %4.4x "
@@ -795,7 +848,7 @@
 	}
 
 	/* Remove the packets on the Rx queue. */
-	epic_rx(dev);
+	epic_rx(dev, RX_RING_SIZE);
 }
 
 static void epic_restart(struct net_device *dev)
@@ -841,9 +894,9 @@
 
 	/* Enable interrupts by setting the interrupt mask. */
 	outl((ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170)
-		 | CntFull | TxUnderrun | TxDone | TxEmpty
-		 | RxError | RxOverflow | RxFull | RxHeader | RxDone,
-		 ioaddr + INTMASK);
+		 | CntFull | TxUnderrun
+		 | RxError | RxHeader | EpicNapiEvent, ioaddr + INTMASK);
+
 	printk(KERN_DEBUG "%s: epic_restart() done, cmd status %4.4x, ctl %4.4x"
 		   " interrupt %4.4x.\n",
 		   dev->name, (int)inl(ioaddr + COMMAND), (int)inl(ioaddr + GENCTL),
@@ -929,7 +982,6 @@
 	int i;
 
 	ep->tx_full = 0;
-	ep->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
 	ep->dirty_tx = ep->cur_tx = 0;
 	ep->cur_rx = ep->dirty_rx = 0;
 	ep->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
@@ -1029,6 +1081,76 @@
 	return 0;
 }
 
+static void epic_tx_error(struct net_device *dev, struct epic_private *ep,
+			  int status)
+{
+	struct net_device_stats *stats = &ep->stats;
+
+#ifndef final_version
+	/* There was an major error, log it. */
+	if (debug > 1)
+		printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
+		       dev->name, status);
+#endif
+	stats->tx_errors++;
+	if (status & 0x1050)
+		stats->tx_aborted_errors++;
+	if (status & 0x0008)
+		stats->tx_carrier_errors++;
+	if (status & 0x0040)
+		stats->tx_window_errors++;
+	if (status & 0x0010)
+		stats->tx_fifo_errors++;
+}
+
+static void epic_tx(struct net_device *dev, struct epic_private *ep)
+{
+	unsigned int dirty_tx, cur_tx;
+
+	/*
+	 * Note: if this lock becomes a problem we can narrow the locked
+	 * region at the cost of occasionally grabbing the lock more times.
+	 */
+	cur_tx = ep->cur_tx;
+	for (dirty_tx = ep->dirty_tx; cur_tx - dirty_tx > 0; dirty_tx++) {
+		struct sk_buff *skb;
+		int entry = dirty_tx % TX_RING_SIZE;
+		int txstatus = le32_to_cpu(ep->tx_ring[entry].txstatus);
+
+		if (txstatus & DescOwn)
+			break;	/* It still hasn't been Txed */
+
+		if (likely(txstatus & 0x0001)) {
+			ep->stats.collisions += (txstatus >> 8) & 15;
+			ep->stats.tx_packets++;
+			ep->stats.tx_bytes += ep->tx_skbuff[entry]->len;
+		} else
+			epic_tx_error(dev, ep, txstatus);
+
+		/* Free the original skb. */
+		skb = ep->tx_skbuff[entry];
+		pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr, 
+				 skb->len, PCI_DMA_TODEVICE);
+		dev_kfree_skb_irq(skb);
+		ep->tx_skbuff[entry] = 0;
+	}
+
+#ifndef final_version
+	if (cur_tx - dirty_tx > TX_RING_SIZE) {
+		printk(KERN_WARNING
+		       "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
+		       dev->name, dirty_tx, cur_tx, ep->tx_full);
+		dirty_tx += TX_RING_SIZE;
+	}
+#endif
+	ep->dirty_tx = dirty_tx;
+	if (ep->tx_full && cur_tx - dirty_tx < TX_QUEUE_LEN - 4) {
+		/* The ring is no longer full, allow new TX entries. */
+		ep->tx_full = 0;
+		netif_wake_queue(dev);
+	}
+}
+
 /* The interrupt handler does all of the Rx thread work and cleans up
    after the Tx thread. */
 static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
@@ -1036,135 +1158,71 @@
 	struct net_device *dev = dev_instance;
 	struct epic_private *ep = dev->priv;
 	long ioaddr = dev->base_addr;
-	int status, boguscnt = max_interrupt_work;
 	unsigned int handled = 0;
+	int status;
 
-	do {
-		status = inl(ioaddr + INTSTAT);
-		/* Acknowledge all of the current interrupt sources ASAP. */
-		outl(status & 0x00007fff, ioaddr + INTSTAT);
-
-		if (debug > 4)
-			printk(KERN_DEBUG "%s: Interrupt, status=%#8.8x new "
-				   "intstat=%#8.8x.\n",
-				   dev->name, status, (int)inl(ioaddr + INTSTAT));
-
-		if ((status & IntrSummary) == 0)
-			break;
-		handled = 1;
+	status = inl(ioaddr + INTSTAT);
+	/* Acknowledge all of the current interrupt sources ASAP. */
+	outl(status & EpicNormalEvent, ioaddr + INTSTAT);
 
-		if (status & (RxDone | RxStarted | RxEarlyWarn | RxOverflow))
-			epic_rx(dev);
+	if (debug > 4) {
+		printk(KERN_DEBUG "%s: Interrupt, status=%#8.8x new "
+				   "intstat=%#8.8x.\n", dev->name, status,
+				   (int)inl(ioaddr + INTSTAT));
+	}
 
-		if (status & (TxEmpty | TxDone)) {
-			unsigned int dirty_tx, cur_tx;
+	if ((status & IntrSummary) == 0)
+		goto out;
 
-			/* Note: if this lock becomes a problem we can narrow the locked
-			   region at the cost of occasionally grabbing the lock more
-			   times. */
-			spin_lock(&ep->lock);
-			cur_tx = ep->cur_tx;
-			dirty_tx = ep->dirty_tx;
-			for (; cur_tx - dirty_tx > 0; dirty_tx++) {
-				struct sk_buff *skb;
-				int entry = dirty_tx % TX_RING_SIZE;
-				int txstatus = le32_to_cpu(ep->tx_ring[entry].txstatus);
+	handled = 1;
 
-				if (txstatus & DescOwn)
-					break;			/* It still hasn't been Txed */
+	if ((status & EpicNapiEvent) && !ep->reschedule_in_poll) {
+		spin_lock(&ep->napi_lock);
+		if (netif_rx_schedule_prep(dev)) {
+			epic_napi_irq_off(dev, ep);
+			__netif_rx_schedule(dev);
+		} else
+			ep->reschedule_in_poll++;
+		spin_unlock(&ep->napi_lock);
+	}
+	status &= ~EpicNapiEvent;
 
-				if ( ! (txstatus & 0x0001)) {
-					/* There was an major error, log it. */
-#ifndef final_version
-					if (debug > 1)
-						printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
-							   dev->name, txstatus);
-#endif
-					ep->stats.tx_errors++;
-					if (txstatus & 0x1050) ep->stats.tx_aborted_errors++;
-					if (txstatus & 0x0008) ep->stats.tx_carrier_errors++;
-					if (txstatus & 0x0040) ep->stats.tx_window_errors++;
-					if (txstatus & 0x0010) ep->stats.tx_fifo_errors++;
-				} else {
-					ep->stats.collisions += (txstatus >> 8) & 15;
-					ep->stats.tx_packets++;
-					ep->stats.tx_bytes += ep->tx_skbuff[entry]->len;
-				}
-
-				/* Free the original skb. */
-				skb = ep->tx_skbuff[entry];
-				pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr, 
-						 skb->len, PCI_DMA_TODEVICE);
-				dev_kfree_skb_irq(skb);
-				ep->tx_skbuff[entry] = 0;
-			}
+	/* Check uncommon events all at once. */
+	if (status & (CntFull | TxUnderrun | PCIBusErr170 | PCIBusErr175)) {
+		if (status == EpicRemoved)
+			goto out;
 
-#ifndef final_version
-			if (cur_tx - dirty_tx > TX_RING_SIZE) {
-				printk(KERN_WARNING "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
-					   dev->name, dirty_tx, cur_tx, ep->tx_full);
-				dirty_tx += TX_RING_SIZE;
-			}
-#endif
-			ep->dirty_tx = dirty_tx;
-			if (ep->tx_full
-				&& cur_tx - dirty_tx < TX_QUEUE_LEN - 4) {
-				/* The ring is no longer full, allow new TX entries. */
-				ep->tx_full = 0;
-				spin_unlock(&ep->lock);
-				netif_wake_queue(dev);
-			} else
-				spin_unlock(&ep->lock);
-		}
+		/* Always update the error counts to avoid overhead later. */
+		ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
+		ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
+		ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
 
-		/* Check uncommon events all at once. */
-		if (status & (CntFull | TxUnderrun | RxOverflow | RxFull |
-					  PCIBusErr170 | PCIBusErr175)) {
-			if (status == 0xffffffff) /* Chip failed or removed (CardBus). */
-				break;
-			/* Always update the error counts to avoid overhead later. */
-			ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
-			ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
-			ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
-
-			if (status & TxUnderrun) { /* Tx FIFO underflow. */
-				ep->stats.tx_fifo_errors++;
-				outl(ep->tx_threshold += 128, ioaddr + TxThresh);
-				/* Restart the transmit process. */
-				outl(RestartTx, ioaddr + COMMAND);
-			}
-			if (status & RxOverflow) {		/* Missed a Rx frame. */
-				ep->stats.rx_errors++;
-			}
-			if (status & (RxOverflow | RxFull))
-				outw(RxQueued, ioaddr + COMMAND);
-			if (status & PCIBusErr170) {
-				printk(KERN_ERR "%s: PCI Bus Error!  EPIC status %4.4x.\n",
-					   dev->name, status);
-				epic_pause(dev);
-				epic_restart(dev);
-			}
-			/* Clear all error sources. */
-			outl(status & 0x7f18, ioaddr + INTSTAT);
+		if (status & TxUnderrun) { /* Tx FIFO underflow. */
+			ep->stats.tx_fifo_errors++;
+			outl(ep->tx_threshold += 128, ioaddr + TxThresh);
+			/* Restart the transmit process. */
+			outl(RestartTx, ioaddr + COMMAND);
 		}
-		if (--boguscnt < 0) {
-			printk(KERN_ERR "%s: Too much work at interrupt, "
-				   "IntrStatus=0x%8.8x.\n",
-				   dev->name, status);
-			/* Clear all interrupt sources. */
-			outl(0x0001ffff, ioaddr + INTSTAT);
-			break;
+		if (status & PCIBusErr170) {
+			printk(KERN_ERR "%s: PCI Bus Error! status %4.4x.\n",
+					 dev->name, status);
+			epic_pause(dev);
+			epic_restart(dev);
 		}
-	} while (1);
+		/* Clear all error sources. */
+		outl(status & 0x7f18, ioaddr + INTSTAT);
+	}
 
-	if (debug > 3)
-		printk(KERN_DEBUG "%s: exiting interrupt, intr_status=%#4.4x.\n",
-			   dev->name, status);
+out:
+	if (debug > 3) {
+		printk(KERN_DEBUG "%s: exit interrupt, intr_status=%#4.4x.\n",
+				   dev->name, status);
+	}
 
 	return IRQ_RETVAL(handled);
 }
 
-static int epic_rx(struct net_device *dev)
+static int epic_rx(struct net_device *dev, int budget)
 {
 	struct epic_private *ep = dev->priv;
 	int entry = ep->cur_rx % RX_RING_SIZE;
@@ -1174,6 +1232,10 @@
 	if (debug > 4)
 		printk(KERN_DEBUG " In epic_rx(), entry %d %8.8x.\n", entry,
 			   ep->rx_ring[entry].rxstatus);
+
+	if (rx_work_limit > budget)
+		rx_work_limit = budget;
+
 	/* If we own the next entry, it's a new packet. Send it up. */
 	while ((ep->rx_ring[entry].rxstatus & cpu_to_le32(DescOwn)) == 0) {
 		int status = le32_to_cpu(ep->rx_ring[entry].rxstatus);
@@ -1234,7 +1296,7 @@
 				ep->rx_skbuff[entry] = NULL;
 			}
 			skb->protocol = eth_type_trans(skb, dev);
-			netif_rx(skb);
+			netif_receive_skb(skb);
 			dev->last_rx = jiffies;
 			ep->stats.rx_packets++;
 			ep->stats.rx_bytes += pkt_len;
@@ -1262,6 +1324,65 @@
 	return work_done;
 }
 
+static void epic_rx_err(struct net_device *dev, struct epic_private *ep)
+{
+	long ioaddr = dev->base_addr;
+	int status;
+
+	status = inl(ioaddr + INTSTAT);
+
+	if (status == EpicRemoved)
+		return;
+	if (status & RxOverflow) 	/* Missed a Rx frame. */
+		ep->stats.rx_errors++;
+	if (status & (RxOverflow | RxFull))
+		outw(RxQueued, ioaddr + COMMAND);
+}
+
+static int epic_poll(struct net_device *dev, int *budget)
+{
+	struct epic_private *ep = dev->priv;
+	int work_done, orig_budget;
+	long ioaddr = dev->base_addr;
+
+	orig_budget = (*budget > dev->quota) ? dev->quota : *budget;
+
+rx_action:
+
+	epic_tx(dev, ep);
+
+	work_done = epic_rx(dev, *budget);
+
+	epic_rx_err(dev, ep);
+
+	*budget -= work_done;
+	dev->quota -= work_done;
+
+	if (netif_running(dev) && (work_done < orig_budget)) {
+		unsigned long flags;
+		int more;
+
+		/* A bit baroque but it avoids a (space hungry) spin_unlock */
+
+		spin_lock_irqsave(&ep->napi_lock, flags);
+
+		more = ep->reschedule_in_poll;
+		if (!more) {
+			__netif_rx_complete(dev);
+			outl(EpicNapiEvent, ioaddr + INTSTAT);
+			epic_napi_irq_on(dev, ep);
+		} else
+			ep->reschedule_in_poll--;
+
+		spin_unlock_irqrestore(&ep->napi_lock, flags);
+
+		if (more)
+			goto rx_action;
+	}
+
+	return (work_done >= orig_budget);
+}
+
 static int epic_close(struct net_device *dev)
 {
 	long ioaddr = dev->base_addr;
@@ -1276,9 +1397,13 @@
 			   dev->name, (int)inl(ioaddr + INTSTAT));
 
 	del_timer_sync(&ep->timer);
-	epic_pause(dev);
+
+	epic_disable_int(dev, ep);
+
 	free_irq(dev->irq, dev);
 
+	epic_pause(dev);
+
 	/* Free all the skbuffs in the Rx queue. */
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		skb = ep->rx_skbuff[i];
@@ -1476,6 +1601,7 @@
 #endif
 	pci_release_regions(pdev);
 	free_netdev(dev);
+	pci_disable_device(pdev);
 	pci_set_drvdata(pdev, NULL);
 	/* pci_power_off(pdev, -1); */
 }
diff -Nru a/drivers/net/fealnx.c b/drivers/net/fealnx.c
--- a/drivers/net/fealnx.c	Sun May 16 01:43:16 2004
+++ b/drivers/net/fealnx.c	Sun May 16 01:43:16 2004
@@ -84,6 +84,7 @@
 #include <linux/mii.h>
 #include <linux/ethtool.h>
 #include <linux/crc32.h>
+#include <linux/delay.h>
 
 #include <asm/processor.h>	/* Processor type for cache alignment. */
 #include <asm/bitops.h>
@@ -233,15 +234,29 @@
 	RxErr = 0x00000002,	/* receive error */
 };
 
-/* Bits in the NetworkConfig register. */
+/* Bits in the NetworkConfig register, W for writing, R for reading */
+/* FIXME: some names are invented by me. Marked with (name?) */
+/* If you have docs and know bit names, please fix 'em */
 enum rx_mode_bits {
-	RxModeMask = 0xe0,
-	PROM = 0x80,		/* promiscuous mode */
-	AB = 0x40,		/* accept broadcast */
-	AM = 0x20,		/* accept mutlicast */
-	ARP = 0x08,		/* receive runt pkt */
-	ALP = 0x04,		/* receive long pkt */
-	SEP = 0x02,		/* receive error pkt */
+	CR_W_ENH	= 0x02000000,	/* enhanced mode (name?) */
+	CR_W_FD		= 0x00100000,	/* full duplex */
+	CR_W_PS10	= 0x00080000,	/* 10 mbit */
+	CR_W_TXEN	= 0x00040000,	/* tx enable (name?) */
+	CR_W_PS1000	= 0x00010000,	/* 1000 mbit */
+     /* CR_W_RXBURSTMASK= 0x00000e00, Im unsure about this */
+	CR_W_RXMODEMASK	= 0x000000e0,
+	CR_W_PROM	= 0x00000080,	/* promiscuous mode */
+	CR_W_AB		= 0x00000040,	/* accept broadcast */
+	CR_W_AM		= 0x00000020,	/* accept mutlicast */
+	CR_W_ARP	= 0x00000008,	/* receive runt pkt */
+	CR_W_ALP	= 0x00000004,	/* receive long pkt */
+	CR_W_SEP	= 0x00000002,	/* receive error pkt */
+	CR_W_RXEN	= 0x00000001,	/* rx enable (unicast?) (name?) */
+
+	CR_R_TXSTOP	= 0x04000000,	/* tx stopped (name?) */
+	CR_R_FD		= 0x00100000,	/* full duplex detected */
+	CR_R_PS10	= 0x00080000,	/* 10 mbit detected */
+	CR_R_RXSTOP	= 0x00008000,	/* rx stopped (name?) */
 };
 
 /* The Tulip Rx and Tx buffer descriptors. */
@@ -375,10 +390,7 @@
 #define LXT1000_Full    0x200
 // 89/12/29 add, for phy specific status register, levelone phy, (end)
 
-/* for 3-in-1 case */
-#define PS10            0x00080000
-#define FD              0x00100000
-#define PS1000          0x00010000
+/* for 3-in-1 case, BMCRSR register */
 #define LinkIsUp2	0x00040000
 
 /* for PHY */
@@ -400,6 +412,12 @@
 	/* Media monitoring timer. */
 	struct timer_list timer;
 
+	/* Reset timer */
+	struct timer_list reset_timer;
+	int reset_timer_armed;
+	unsigned long crvalue_sv;
+	unsigned long imrvalue_sv;
+
 	/* Frequently used values: keep some adjacent for cache effect. */
 	int flags;
 	struct pci_dev *pci_dev;
@@ -435,49 +453,44 @@
 static void getlinktype(struct net_device *dev);
 static void getlinkstatus(struct net_device *dev);
 static void netdev_timer(unsigned long data);
+static void reset_timer(unsigned long data);
 static void tx_timeout(struct net_device *dev);
 static void init_ring(struct net_device *dev);
 static int start_tx(struct sk_buff *skb, struct net_device *dev);
 static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs);
 static int netdev_rx(struct net_device *dev);
 static void set_rx_mode(struct net_device *dev);
+static void __set_rx_mode(struct net_device *dev);
 static struct net_device_stats *get_stats(struct net_device *dev);
 static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static struct ethtool_ops netdev_ethtool_ops;
 static int netdev_close(struct net_device *dev);
 static void reset_rx_descriptors(struct net_device *dev);
+static void reset_tx_descriptors(struct net_device *dev);
 
-void stop_nic_tx(long ioaddr, long crvalue)
+static void stop_nic_rx(long ioaddr, long crvalue)
 {
-	writel(crvalue & (~0x40000), ioaddr + TCRRCR);
-
-	/* wait for tx stop */
-	{
-		int i = 0, delay = 0x1000;
-
-		while ((!(readl(ioaddr + TCRRCR) & 0x04000000)) && (i < delay)) {
-			++i;
-		}
+	int delay = 0x1000;
+	writel(crvalue & ~(CR_W_RXEN), ioaddr + TCRRCR);
+	while (--delay) {
+		if ( (readl(ioaddr + TCRRCR) & CR_R_RXSTOP) == CR_R_RXSTOP)
+			break;
 	}
 }
 
 
-void stop_nic_rx(long ioaddr, long crvalue)
+static void stop_nic_rxtx(long ioaddr, long crvalue)
 {
-	writel(crvalue & (~0x1), ioaddr + TCRRCR);
-
-	/* wait for rx stop */
-	{
-		int i = 0, delay = 0x1000;
-
-		while ((!(readl(ioaddr + TCRRCR) & 0x00008000)) && (i < delay)) {
-			++i;
-		}
+	int delay = 0x1000;
+	writel(crvalue & ~(CR_W_RXEN+CR_W_TXEN), ioaddr + TCRRCR);
+	while (--delay) {
+		if ( (readl(ioaddr + TCRRCR) & (CR_R_RXSTOP+CR_R_TXSTOP))
+					    == (CR_R_RXSTOP+CR_R_TXSTOP) )
+			break;
 	}
 }
 
 
-
 static int __devinit fealnx_init_one(struct pci_dev *pdev,
 				     const struct pci_device_id *ent)
 {
@@ -495,7 +508,7 @@
 #ifndef MODULE
 	static int printed_version;
 	if (!printed_version++)
-		printk (version);
+		printk(version);
 #endif
 	
 	card_idx++;
@@ -622,7 +635,7 @@
 		np->phys[0] = 32;
 /* 89/6/23 add, (begin) */
 		/* get phy type */
-		if (readl(dev->base_addr + PHYIDENTIFIER) == MysonPHYID)
+		if (readl(ioaddr + PHYIDENTIFIER) == MysonPHYID)
 			np->PHYType = MysonPHY;
 		else
 			np->PHYType = OtherPHY;
@@ -657,7 +670,7 @@
 		if (np->flags == HAS_MII_XCVR)
 			mdio_write(dev, np->phys[0], MII_ADVERTISE, ADVERTISE_FULL);
 		else
-			writel(ADVERTISE_FULL, dev->base_addr + ANARANLPAR);
+			writel(ADVERTISE_FULL, ioaddr + ANARANLPAR);
 		np->mii.force_media = 1;
 	}
 
@@ -669,7 +682,7 @@
 	dev->set_multicast_list = &set_rx_mode;
 	dev->do_ioctl = &mii_ioctl;
 	dev->ethtool_ops = &netdev_ethtool_ops;
-	dev->tx_timeout = tx_timeout;
+	dev->tx_timeout = &tx_timeout;
 	dev->watchdog_timeo = TX_TIMEOUT;
 	
 	err = register_netdev(dev);
@@ -699,6 +712,7 @@
 	return err;
 }
 
+
 static void __devexit fealnx_remove_one(struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
@@ -721,42 +735,6 @@
 		printk(KERN_ERR "fealnx: remove for unknown device\n");
 }
 
-unsigned int m80x_read_tick(void)
-/* function: Reads the Timer tick count register which decrements by 2 from  */
-/*           65536 to 0 every 1/36.414 of a second. Each 2 decrements of the *//*           count represents 838 nsec's.                                    */
-/* input   : none.                                                           */
-/* output  : none.                                                           */
-{
-	unsigned char tmp;
-	int value;
-
-	writeb((char) 0x06, 0x43);	// Command 8254 to latch T0's count
-
-	// now read the count.
-	tmp = (unsigned char) readb(0x40);
-	value = ((int) tmp) << 8;
-	tmp = (unsigned char) readb(0x40);
-	value |= (((int) tmp) & 0xff);
-	return (value);
-}
-
-
-void m80x_delay(unsigned int interval)
-/* function: to wait for a specified time.                                   */
-/* input   : interval ... the specified time.                                */
-/* output  : none.                                                           */
-{
-	unsigned int interval1, interval2, i = 0;
-
-	interval1 = m80x_read_tick();	// get initial value
-	do {
-		interval2 = m80x_read_tick();
-		if (interval1 < interval2)
-			interval1 = interval2;
-		++i;
-	} while (((interval1 - interval2) < (ushort) interval) && (i < 65535));
-}
-
 
 static ulong m80x_send_cmd_to_phy(long miiport, int opcode, int phyad, int regad)
 {
@@ -796,7 +774,7 @@
 		/* high MDC */
 		miir |= MASK_MIIR_MII_MDC;
 		writel(miir, miiport);
-		m80x_delay(30);
+		udelay(30);
 
 		/* next */
 		mask >>= 1;
@@ -831,7 +809,7 @@
 		/* high MDC, and wait */
 		miir |= MASK_MIIR_MII_MDC;
 		writel(miir, miiport);
-		m80x_delay((int) 30);
+		udelay(30);
 
 		/* next */
 		mask >>= 1;
@@ -873,8 +851,6 @@
 	/* low MDC */
 	miir &= ~MASK_MIIR_MII_MDC;
 	writel(miir, miiport);
-
-	return;
 }
 
 
@@ -949,7 +925,7 @@
 	np->imrvalue = TUNF | CNTOVF | RBU | TI | RI;
 	if (np->pci_dev->device == 0x891) {
 		np->bcrvalue |= 0x200;	/* set PROG bit */
-		np->crvalue |= 0x02000000;	/* set enhanced bit */
+		np->crvalue |= CR_W_ENH;	/* set enhanced bit */
 		np->imrvalue |= ETI;
 	}
 	writel(np->bcrvalue, ioaddr + BCR);
@@ -957,7 +933,7 @@
 	if (dev->if_port == 0)
 		dev->if_port = np->default_port;
 
-	writel(0, dev->base_addr + RXPDR);
+	writel(0, ioaddr + RXPDR);
 // 89/9/1 modify,
 //   np->crvalue = 0x00e40001;    /* tx store and forward, tx/rx enable */
 	np->crvalue |= 0x00e40001;	/* tx store and forward, tx/rx enable */
@@ -965,7 +941,7 @@
 	getlinkstatus(dev);
 	if (np->linkok)
 		getlinktype(dev);
-	set_rx_mode(dev);
+	__set_rx_mode(dev);
 
 	netif_start_queue(dev);
 
@@ -985,6 +961,11 @@
 	/* timer handler */
 	add_timer(&np->timer);
 
+	init_timer(&np->reset_timer);
+	np->reset_timer.data = (unsigned long) dev;
+	np->reset_timer.function = &reset_timer;
+	np->reset_timer_armed = 0;
+
 	return 0;
 }
 
@@ -1005,8 +986,7 @@
 				np->linkok = 1;
 				return;
 			}
-			// delay
-			m80x_delay(100);
+			udelay(100);
 		}
 	} else {
 		for (i = 0; i < DelayTime; ++i) {
@@ -1014,8 +994,7 @@
 				np->linkok = 1;
 				return;
 			}
-			// delay
-			m80x_delay(100);
+			udelay(100);
 		}
 	}
 }
@@ -1026,11 +1005,11 @@
 	struct netdev_private *np = dev->priv;
 
 	if (np->PHYType == MysonPHY) {	/* 3-in-1 case */
-		if (readl(dev->base_addr + TCRRCR) & FD)
+		if (readl(dev->base_addr + TCRRCR) & CR_R_FD)
 			np->duplexmode = 2;	/* full duplex */
 		else
 			np->duplexmode = 1;	/* half duplex */
-		if (readl(dev->base_addr + TCRRCR) & PS10)
+		if (readl(dev->base_addr + TCRRCR) & CR_R_PS10)
 			np->line_speed = 1;	/* 10M */
 		else
 			np->line_speed = 2;	/* 100M */
@@ -1112,19 +1091,18 @@
 			else
 				np->line_speed = 1;	/* 10M */
 		}
-		// chage crvalue
-		// np->crvalue&=(~PS10)&(~FD);
-		np->crvalue &= (~PS10) & (~FD) & (~PS1000);
+		np->crvalue &= (~CR_W_PS10) & (~CR_W_FD) & (~CR_W_PS1000);
 		if (np->line_speed == 1)
-			np->crvalue |= PS10;
+			np->crvalue |= CR_W_PS10;
 		else if (np->line_speed == 3)
-			np->crvalue |= PS1000;
+			np->crvalue |= CR_W_PS1000;
 		if (np->duplexmode == 2)
-			np->crvalue |= FD;
+			np->crvalue |= CR_W_FD;
 	}
 }
 
 
+/* Take lock before calling this */
 static void allocate_rx_buffers(struct net_device *dev)
 {
 	struct netdev_private *np = dev->priv;
@@ -1134,15 +1112,17 @@
 		struct sk_buff *skb;
 
 		skb = dev_alloc_skb(np->rx_buf_sz);
-		np->lack_rxbuf->skbuff = skb;
-
 		if (skb == NULL)
 			break;	/* Better luck next round. */
 
+		while (np->lack_rxbuf->skbuff)
+			np->lack_rxbuf = np->lack_rxbuf->next_desc_logical;
+
 		skb->dev = dev;	/* Mark as being used by this device. */
+		np->lack_rxbuf->skbuff = skb;
 		np->lack_rxbuf->buffer = pci_map_single(np->pci_dev, skb->tail,
 			np->rx_buf_sz, PCI_DMA_FROMDEVICE);
-		np->lack_rxbuf = np->lack_rxbuf->next_desc_logical;
+		np->lack_rxbuf->status = RXOWN;
 		++np->really_rx_count;
 	}
 }
@@ -1153,22 +1133,23 @@
 	struct net_device *dev = (struct net_device *) data;
 	struct netdev_private *np = dev->priv;
 	long ioaddr = dev->base_addr;
-	int next_tick = 10 * HZ;
 	int old_crvalue = np->crvalue;
 	unsigned int old_linkok = np->linkok;
+	unsigned long flags;
 
 	if (debug)
 		printk(KERN_DEBUG "%s: Media selection timer tick, status %8.8x "
 		       "config %8.8x.\n", dev->name, readl(ioaddr + ISR),
 		       readl(ioaddr + TCRRCR));
 
+	spin_lock_irqsave(&np->lock, flags);
+
 	if (np->flags == HAS_MII_XCVR) {
 		getlinkstatus(dev);
 		if ((old_linkok == 0) && (np->linkok == 1)) {	/* we need to detect the media type again */
 			getlinktype(dev);
 			if (np->crvalue != old_crvalue) {
-				stop_nic_tx(ioaddr, np->crvalue);
-				stop_nic_rx(ioaddr, np->crvalue & (~0x40000));
+				stop_nic_rxtx(ioaddr, np->crvalue);
 				writel(np->crvalue, ioaddr + TCRRCR);
 			}
 		}
@@ -1176,69 +1157,120 @@
 
 	allocate_rx_buffers(dev);
 
-	np->timer.expires = RUN_AT(next_tick);
+	spin_unlock_irqrestore(&np->lock, flags);
+
+	np->timer.expires = RUN_AT(10 * HZ);
 	add_timer(&np->timer);
 }
 
 
-static void tx_timeout(struct net_device *dev)
+/* Take lock before calling */
+/* Reset chip and disable rx, tx and interrupts */
+static void reset_and_disable_rxtx(struct net_device *dev)
 {
-	struct netdev_private *np = dev->priv;
 	long ioaddr = dev->base_addr;
-	int i;
-
-	printk(KERN_WARNING "%s: Transmit timed out, status %8.8x,"
-	       " resetting...\n", dev->name, readl(ioaddr + ISR));
-
-	{
-
-		printk(KERN_DEBUG "  Rx ring %p: ", np->rx_ring);
-		for (i = 0; i < RX_RING_SIZE; i++)
-			printk(" %8.8x", (unsigned int) np->rx_ring[i].status);
-		printk("\n" KERN_DEBUG "  Tx ring %p: ", np->tx_ring);
-		for (i = 0; i < TX_RING_SIZE; i++)
-			printk(" %4.4x", np->tx_ring[i].status);
-		printk("\n");
-	}
-
-	/* Reinit. Gross */
+	int delay=51;
 
 	/* Reset the chip's Tx and Rx processes. */
-	stop_nic_tx(ioaddr, 0);
-	reset_rx_descriptors(dev);
+	stop_nic_rxtx(ioaddr, 0);
 
 	/* Disable interrupts by clearing the interrupt mask. */
-	writel(0x0000, ioaddr + IMR);
+	writel(0, ioaddr + IMR);
 
 	/* Reset the chip to erase previous misconfiguration. */
 	writel(0x00000001, ioaddr + BCR);
 
 	/* Ueimor: wait for 50 PCI cycles (and flush posted writes btw). 
-	   We surely wait too long (address+data phase). Who cares ? */
-	for (i = 0; i < 50; i++) {
+	   We surely wait too long (address+data phase). Who cares? */
+	while (--delay) {
 		readl(ioaddr + BCR);
 		rmb();
 	}
+}
+
+
+/* Take lock before calling */
+/* Restore chip after reset */
+static void enable_rxtx(struct net_device *dev)
+{
+	struct netdev_private *np = dev->priv;
+	long ioaddr = dev->base_addr;
 
-	writel((np->cur_tx - np->tx_ring)*sizeof(struct fealnx_desc) +
-		np->tx_ring_dma, ioaddr + TXLBA);
-	writel((np->cur_rx - np->rx_ring)*sizeof(struct fealnx_desc) +
-		np->rx_ring_dma, ioaddr + RXLBA);
+	reset_rx_descriptors(dev);
+
+	writel(np->tx_ring_dma + ((char*)np->cur_tx - (char*)np->tx_ring),
+		ioaddr + TXLBA);
+	writel(np->rx_ring_dma + ((char*)np->cur_rx - (char*)np->rx_ring),
+		ioaddr + RXLBA);
 
 	writel(np->bcrvalue, ioaddr + BCR);
 
-	writel(0, dev->base_addr + RXPDR);
-	set_rx_mode(dev);
+	writel(0, ioaddr + RXPDR);
+	__set_rx_mode(dev); /* changes np->crvalue, writes it into TCRRCR */
+
 	/* Clear and Enable interrupts by setting the interrupt mask. */
 	writel(FBE | TUNF | CNTOVF | RBU | TI | RI, ioaddr + ISR);
 	writel(np->imrvalue, ioaddr + IMR);
 
-	writel(0, dev->base_addr + TXPDR);
+	writel(0, ioaddr + TXPDR);
+}
+
+
+static void reset_timer(unsigned long data)
+{
+	struct net_device *dev = (struct net_device *) data;
+	struct netdev_private *np = dev->priv;
+	unsigned long flags;
+
+	printk(KERN_WARNING "%s: resetting tx and rx machinery\n", dev->name);
+
+	spin_lock_irqsave(&np->lock, flags);
+	np->crvalue = np->crvalue_sv;
+	np->imrvalue = np->imrvalue_sv;
+
+	reset_and_disable_rxtx(dev);
+	/* works for me without this:
+	reset_tx_descriptors(dev); */
+	enable_rxtx(dev);
+	netif_start_queue(dev); /* FIXME: or netif_wake_queue(dev); ? */
+		
+	np->reset_timer_armed = 0;
+
+	spin_unlock_irqrestore(&np->lock, flags);
+}
+
+
+static void tx_timeout(struct net_device *dev)
+{
+	struct netdev_private *np = dev->priv;
+	long ioaddr = dev->base_addr;
+	unsigned long flags;
+	int i;
+
+	printk(KERN_WARNING "%s: Transmit timed out, status %8.8x,"
+	       " resetting...\n", dev->name, readl(ioaddr + ISR));
+
+	{
+		printk(KERN_DEBUG "  Rx ring %p: ", np->rx_ring);
+		for (i = 0; i < RX_RING_SIZE; i++)
+			printk(" %8.8x", (unsigned int) np->rx_ring[i].status);
+		printk("\n" KERN_DEBUG "  Tx ring %p: ", np->tx_ring);
+		for (i = 0; i < TX_RING_SIZE; i++)
+			printk(" %4.4x", np->tx_ring[i].status);
+		printk("\n");
+	}
+	
+	spin_lock_irqsave(&np->lock, flags);
+
+	reset_and_disable_rxtx(dev);
+	reset_tx_descriptors(dev);
+	enable_rxtx(dev);
+
+	spin_unlock_irqrestore(&np->lock, flags);
 
 	dev->trans_start = jiffies;
 	np->stats.tx_errors++;
-
-	return;
+	netif_wake_queue(dev); /* or .._start_.. ?? */
 }
 
 
@@ -1251,7 +1283,7 @@
 	/* initialize rx variables */
 	np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
 	np->cur_rx = &np->rx_ring[0];
-	np->lack_rxbuf = NULL;
+	np->lack_rxbuf = np->rx_ring;
 	np->really_rx_count = 0;
 
 	/* initial rx descriptors. */
@@ -1294,6 +1326,7 @@
 
 	for (i = 0; i < TX_RING_SIZE; i++) {
 		np->tx_ring[i].status = 0;
+		/* do we need np->tx_ring[i].control = XXX; ?? */
 		np->tx_ring[i].next_desc = np->tx_ring_dma +
 			(i + 1)*sizeof(struct fealnx_desc);
 		np->tx_ring[i].next_desc_logical = &np->tx_ring[i + 1];
@@ -1341,7 +1374,7 @@
 		np->cur_tx_copy->control |= (BPT << TBSShift);	/* buffer size */
 
 		/* for the last descriptor */
-		next = (struct fealnx *) np->cur_tx_copy.next_desc_logical;
+		next = np->cur_tx_copy->next_desc_logical;
 		next->skbuff = skb;
 		next->control = TXIC | TXLD | CRCEnable | PADEnable;
 		next->control |= (skb->len << PKTSShift);	/* pkt size */
@@ -1383,35 +1416,59 @@
 }
 
 
-void free_one_rx_descriptor(struct netdev_private *np)
+/* Take lock before calling */
+/* Chip probably hosed tx ring. Clean up. */
+static void reset_tx_descriptors(struct net_device *dev)
 {
-	if (np->really_rx_count == RX_RING_SIZE)
-		np->cur_rx->status = RXOWN;
-	else {
-		np->lack_rxbuf->skbuff = np->cur_rx->skbuff;
-		np->lack_rxbuf->buffer = np->cur_rx->buffer;
-		np->lack_rxbuf->status = RXOWN;
-		++np->really_rx_count;
-		np->lack_rxbuf = np->lack_rxbuf->next_desc_logical;
+	struct netdev_private *np = dev->priv;
+	struct fealnx_desc *cur;
+	int i;
+
+	/* initialize tx variables */
+	np->cur_tx = &np->tx_ring[0];
+	np->cur_tx_copy = &np->tx_ring[0];
+	np->really_tx_count = 0;
+	np->free_tx_count = TX_RING_SIZE;
+
+	for (i = 0; i < TX_RING_SIZE; i++) {
+		cur = &np->tx_ring[i];
+		if (cur->skbuff) {
+			pci_unmap_single(np->pci_dev, cur->buffer,
+				cur->skbuff->len, PCI_DMA_TODEVICE);
+			dev_kfree_skb(cur->skbuff);
+			/* or dev_kfree_skb_irq(cur->skbuff); ? */
+			cur->skbuff = NULL;
+		}
+		cur->status = 0;
+		cur->control = 0;	/* needed? */
+		/* probably not needed. We do it for purely paranoid reasons */
+		cur->next_desc = np->tx_ring_dma +
+			(i + 1)*sizeof(struct fealnx_desc);
+		cur->next_desc_logical = &np->tx_ring[i + 1];
 	}
-	np->cur_rx = np->cur_rx->next_desc_logical;
+	/* for the last tx descriptor */
+	np->tx_ring[TX_RING_SIZE - 1].next_desc = np->tx_ring_dma;
+	np->tx_ring[TX_RING_SIZE - 1].next_desc_logical = &np->tx_ring[0];
 }
 
 
-void reset_rx_descriptors(struct net_device *dev)
+/* Take lock and stop rx before calling this */
+static void reset_rx_descriptors(struct net_device *dev)
 {
 	struct netdev_private *np = dev->priv;
-
-	stop_nic_rx(dev->base_addr, np->crvalue);
-
-	while (!(np->cur_rx->status & RXOWN))
-		free_one_rx_descriptor(np);
+	struct fealnx_desc *cur = np->cur_rx;
+	int i;
 
 	allocate_rx_buffers(dev);
 
-	writel(np->rx_ring_dma + (np->cur_rx - np->rx_ring),
+	for (i = 0; i < RX_RING_SIZE; i++) {
+		if (cur->skbuff)
+			cur->status = RXOWN;
+		cur = cur->next_desc_logical;
+	}
+
+	writel(np->rx_ring_dma + ((char*)np->cur_rx - (char*)np->rx_ring),
 		dev->base_addr + RXLBA);
-	writel(np->crvalue, dev->base_addr + TCRRCR);
 }
 
 
@@ -1421,16 +1478,14 @@
 {
 	struct net_device *dev = (struct net_device *) dev_instance;
 	struct netdev_private *np = dev->priv;
-	long ioaddr, boguscnt = max_interrupt_work;
+	long ioaddr = dev->base_addr;
+	long boguscnt = max_interrupt_work;
 	unsigned int num_tx = 0;
 	int handled = 0;
 
 	spin_lock(&np->lock);
 
-	writel(0, dev->base_addr + IMR);
-
-	ioaddr = dev->base_addr;
-	np = dev->priv;
+	writel(0, ioaddr + IMR);
 
 	do {
 		u32 intr_status = readl(ioaddr + ISR);
@@ -1471,8 +1526,11 @@
 		if (intr_status & (RI | RBU)) {
 			if (intr_status & RI)
 				netdev_rx(dev);
-			else
+			else {
+				stop_nic_rx(ioaddr, np->crvalue);
 				reset_rx_descriptors(dev);
+				writel(np->crvalue, ioaddr + TCRRCR);
+			}				
 		}
 
 		while (np->really_tx_count) {
@@ -1490,7 +1548,7 @@
 			if (tx_status & TXOWN)
 				break;
 
-			if (!(np->crvalue & 0x02000000)) {
+			if (!(np->crvalue & CR_W_ENH)) {
 				if (tx_status & (CSL | LC | EC | UDF | HF)) {
 					np->stats.tx_errors++;
 					if (tx_status & EC)
@@ -1539,7 +1597,7 @@
 			netif_wake_queue(dev);
 
 		/* read transmit status for enhanced mode only */
-		if (np->crvalue & 0x02000000) {
+		if (np->crvalue & CR_W_ENH) {
 			long data;
 
 			data = readl(ioaddr + TSR);
@@ -1552,6 +1610,20 @@
 		if (--boguscnt < 0) {
 			printk(KERN_WARNING "%s: Too much work at interrupt, "
 			       "status=0x%4.4x.\n", dev->name, intr_status);
+			if (!np->reset_timer_armed) {
+				np->reset_timer_armed = 1;
+				np->reset_timer.expires = RUN_AT(HZ/2);
+				add_timer(&np->reset_timer);
+				stop_nic_rxtx(ioaddr, 0);
+				netif_stop_queue(dev);
+				/* or netif_tx_disable(dev); ?? */
+				/* Prevent other paths from enabling tx,rx,intrs */
+				np->crvalue_sv = np->crvalue;
+				np->imrvalue_sv = np->imrvalue;
+				np->crvalue &= ~(CR_W_TXEN | CR_W_RXEN); /* or simply = 0? */
+				np->imrvalue = 0;
+			}
+
 			break;
 		}
 	} while (1);
@@ -1580,9 +1652,10 @@
 static int netdev_rx(struct net_device *dev)
 {
 	struct netdev_private *np = dev->priv;
+	long ioaddr = dev->base_addr;
 
 	/* If EOP is set on the next entry, it's a new packet. Send it up. */
-	while (!(np->cur_rx->status & RXOWN)) {
+	while (!(np->cur_rx->status & RXOWN) && np->cur_rx->skbuff) {
 		s32 rx_status = np->cur_rx->status;
 
 		if (np->really_rx_count == 0)
@@ -1634,11 +1707,20 @@
 					np->stats.rx_length_errors++;
 
 					/* free all rx descriptors related this long pkt */
-					for (i = 0; i < desno; ++i)
-						free_one_rx_descriptor(np);
+					for (i = 0; i < desno; ++i) {
+						if (!np->cur_rx->skbuff) {
+							printk(KERN_DEBUG
+								"%s: I'm scared\n", dev->name);
+							break;
+						}
+						np->cur_rx->status = RXOWN;
+						np->cur_rx = np->cur_rx->next_desc_logical;
+					}
 					continue;
-				} else {	/* something error, need to reset this chip */
+				} else {        /* rx error, need to reset this chip */
+					stop_nic_rx(ioaddr, np->crvalue);
 					reset_rx_descriptors(dev);
+					writel(np->crvalue, ioaddr + TCRRCR);
 				}
 				break;	/* exit the while loop */
 			}
@@ -1685,8 +1767,6 @@
 						 PCI_DMA_FROMDEVICE);
 				skb_put(skb = np->cur_rx->skbuff, pkt_len);
 				np->cur_rx->skbuff = NULL;
-				if (np->really_rx_count == RX_RING_SIZE)
-					np->lack_rxbuf = np->cur_rx;
 				--np->really_rx_count;
 			}
 			skb->protocol = eth_type_trans(skb, dev);
@@ -1696,24 +1776,7 @@
 			np->stats.rx_bytes += pkt_len;
 		}
 
-		if (np->cur_rx->skbuff == NULL) {
-			struct sk_buff *skb;
-
-			skb = dev_alloc_skb(np->rx_buf_sz);
-
-			if (skb != NULL) {
-				skb->dev = dev;	/* Mark as being used by this device. */
-				np->cur_rx->buffer = pci_map_single(np->pci_dev,
-								    skb->tail,
-								    np->rx_buf_sz,
-								    PCI_DMA_FROMDEVICE);
-				np->cur_rx->skbuff = skb;
-				++np->really_rx_count;
-			}
-		}
-
-		if (np->cur_rx->skbuff != NULL)
-			free_one_rx_descriptor(np);
+		np->cur_rx = np->cur_rx->next_desc_logical;
 	}			/* end of while loop */
 
 	/*  allocate skb for rx buffers */
@@ -1737,8 +1800,21 @@
 	return &np->stats;
 }
 
+
+/* for dev->set_multicast_list */
 static void set_rx_mode(struct net_device *dev)
 {
+	spinlock_t *lp = &((struct netdev_private *)dev->priv)->lock;
+	unsigned long flags;
+	spin_lock_irqsave(lp, flags);
+	__set_rx_mode(dev);
+	spin_unlock_irqrestore(&lp, flags);
+}
+
+
+/* Take lock before calling */
+static void __set_rx_mode(struct net_device *dev)
+{
 	struct netdev_private *np = dev->priv;
 	long ioaddr = dev->base_addr;
 	u32 mc_filter[2];	/* Multicast hash filter */
@@ -1748,12 +1824,12 @@
 		/* Unconditionally log net taps. */
 		printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
 		memset(mc_filter, 0xff, sizeof(mc_filter));
-		rx_mode = PROM | AB | AM;
+		rx_mode = CR_W_PROM | CR_W_AB | CR_W_AM;
 	} else if ((dev->mc_count > multicast_filter_limit)
 		   || (dev->flags & IFF_ALLMULTI)) {
 		/* Too many to match, or accept all multicasts. */
 		memset(mc_filter, 0xff, sizeof(mc_filter));
-		rx_mode = AB | AM;
+		rx_mode = CR_W_AB | CR_W_AM;
 	} else {
 		struct dev_mc_list *mclist;
 		int i;
@@ -1765,26 +1841,25 @@
 			bit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F;
 			mc_filter[bit >> 5] |= (1 << bit);
 		}
-		rx_mode = AB | AM;
+		rx_mode = CR_W_AB | CR_W_AM;
 	}
 
-	stop_nic_tx(ioaddr, np->crvalue);
-	stop_nic_rx(ioaddr, np->crvalue & (~0x40000));
+	stop_nic_rxtx(ioaddr, np->crvalue);
 
 	writel(mc_filter[0], ioaddr + MAR0);
 	writel(mc_filter[1], ioaddr + MAR1);
-	np->crvalue &= ~RxModeMask;
+	np->crvalue &= ~CR_W_RXMODEMASK;
 	np->crvalue |= rx_mode;
 	writel(np->crvalue, ioaddr + TCRRCR);
 }
 
-static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
+static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
 	struct netdev_private *np = dev->priv;
 
-	strcpy (info->driver, DRV_NAME);
-	strcpy (info->version, DRV_VERSION);
-	strcpy (info->bus_info, pci_name(np->pci_dev));
+	strcpy(info->driver, DRV_NAME);
+	strcpy(info->version, DRV_VERSION);
+	strcpy(info->bus_info, pci_name(np->pci_dev));
 }
 
 static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
@@ -1874,10 +1949,10 @@
 	writel(0x0000, ioaddr + IMR);
 
 	/* Stop the chip's Tx and Rx processes. */
-	stop_nic_tx(ioaddr, 0);
-	stop_nic_rx(ioaddr, 0);
+	stop_nic_rxtx(ioaddr, 0);
 
 	del_timer_sync(&np->timer);
+	del_timer_sync(&np->reset_timer);
 
 	free_irq(dev->irq, dev);
 
@@ -1928,7 +2003,7 @@
 {
 /* when a module, this is printed whether or not devices are found in probe */
 #ifdef MODULE
-	printk (version);
+	printk(version);
 #endif
 
 	return pci_module_init(&fealnx_driver);
diff -Nru a/drivers/net/rcif.h b/drivers/net/rcif.h
--- a/drivers/net/rcif.h	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,292 +0,0 @@
-/*
-** *************************************************************************
-**
-**
-**     R C I F . H
-**
-**
-**  RedCreek InterFace include file.
-**
-**  ---------------------------------------------------------------------
-**  ---     Copyright (c) 1998-1999, RedCreek Communications Inc.     ---
-**  ---                   All rights reserved.                        ---
-**  ---------------------------------------------------------------------
-**
-** File Description:
-**
-** Header file private ioctl commands.
-**
-**
-**  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.
-
-**  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., 675 Mass Ave, Cambridge, MA 02139, USA.
-** *************************************************************************
-*/
-
-#ifndef RCIF_H
-#define RCIF_H
-
-/* The following protocol revision # should be incremented every time
-   a new protocol or new structures are used in this file. */
-int USER_PROTOCOL_REV = 2;	/* used to track different protocol revisions */
-
-/* define a single TCB & buffer */
-typedef struct {		/* a single buffer */
-	U32 context;		/* context */
-	U32 scount;		/* segment count */
-	U32 size;		/* segment size */
-	U32 addr;		/* segment physical address */
-} __attribute__ ((packed))
-    singleB, *psingleB;
-typedef struct {		/* a single TCB */
-	/*
-	   **  +-----------------------+
-	   **  |         1             |  one buffer in the TCB
-	   **  +-----------------------+
-	   **  |  <user's Context>     |  user's buffer reference
-	   **  +-----------------------+
-	   **  |         1             |  one segment buffer
-	   **  +-----------------------+                            _
-	   **  |    <buffer size>      |  size                       \ 
-	   **  +-----------------------+                              \ segment descriptor
-	   **  |  <physical address>   |  physical address of buffer  /
-	   **  +-----------------------+                            _/
-	 */
-	U32 bcount;		/* buffer count */
-	singleB b;		/* buffer */
-
-} __attribute__ ((packed))
-    singleTCB, *psingleTCB;
-
-/*
-   When adding new entries, please add all 5 related changes, since 
-   it helps keep everything consistent:
-      1) User structure entry
-      2) User data entry
-      3) Structure short-cut entry
-      4) Data short-cut entry
-      5) Command identifier entry
-
-   For Example ("GETSPEED"):
-      1) struct  RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed;
-      2) struct  RCgetspeed_tag *getspeed;
-      3) #define RCUS_GETSPEED  data.RCgetspeed;
-      4) #define RCUD_GETSPEED  _RC_user_data.getspeed
-      5) #define RCUC_GETSPEED  0x02
-  
-   Notes for the "GETSPEED" entry, above:
-      1) RCgetspeed      - RC{name}
-         RCgetspeed_tag  - RC{name}_tag
-         LinkSpeedCode   - create any structure format desired (not too large,
-                           since memory will be unioned with all other entries)
-      2) RCgetspeed_tag  - RC{name}_tag chosen in #1
-         getspeed        - arbitrary name (ptr to structure in #1)
-      3) RCUS_GETSPEED   - RCUS_{NAME}   ("NAME" & "name" do not have to the same)
-         data.RCgetspeed - data.RC{name}  ("RC{name}" from #1)
-      4) RCUD_GETSPEED   - _RC_user_data.getspeed  ("getspeed" from #2)
-      5) RCUC_GETSPEED   - unique hex identifier entry.
-*/
-
-typedef struct RC_user_tag RCuser_struct;
-
-/* 1) User structure entry */
-struct RC_user_tag {
-	int cmd;
-	union {
-		/* GETINFO structure */
-		struct RCgetinfo_tag {
-			unsigned long int mem_start;
-			unsigned long int mem_end;
-			unsigned long int base_addr;
-			unsigned char irq;
-			unsigned char dma;
-			unsigned char port;
-		} RCgetinfo;	/* <---- RCgetinfo */
-
-		/* GETSPEED structure */
-		struct RCgetspeed_tag {
-			U32 LinkSpeedCode;
-		} RCgetspeed;	/* <---- RCgetspeed */
-
-		/* SETSPEED structure */
-		struct RCsetspeed_tag {
-			U16 LinkSpeedCode;
-		} RCsetspeed;	/* <---- RCsetspeed */
-
-		/* GETPROM structure */
-		struct RCgetprom_tag {
-			U32 PromMode;
-		} RCgetprom;	/* <---- RCgetprom */
-
-		/* SETPROM structure */
-		struct RCsetprom_tag {
-			U16 PromMode;
-		} RCsetprom;	/* <---- RCsetprom */
-
-		/* GETBROADCAST structure */
-		struct RCgetbroadcast_tag {
-			U32 BroadcastMode;
-		} RCgetbroadcast;	/* <---- RCgetbroadcast */
-
-		/* SETBROADCAST structure */
-		struct RCsetbroadcast_tag {
-			U16 BroadcastMode;
-		} RCsetbroadcast;	/* <---- RCsetbroadcast */
-
-		/* GETFIRMWAREVER structure */
-#define FirmStringLen 80
-		struct RCgetfwver_tag {
-			U8 FirmString[FirmStringLen];
-		} RCgetfwver;	/* <---- RCgetfwver */
-
-		/* GETIPANDMASK structure */
-		struct RCgetipnmask_tag {
-			U32 IpAddr;
-			U32 NetMask;
-		} RCgetipandmask;	/* <---- RCgetipandmask */
-
-		/* SETIPANDMASK structure */
-		struct RCsetipnmask_tag {
-			U32 IpAddr;
-			U32 NetMask;
-		} RCsetipandmask;	/* <---- RCsetipandmask */
-
-		/* GETMAC structure */
-#define MAC_SIZE 10
-		struct RCgetmac_tag {
-			U8 mac[MAC_SIZE];
-		} RCgetmac;	/* <---- RCgetmac */
-
-		/* SETMAC structure */
-		struct RCsetmac_tag {
-			U8 mac[MAC_SIZE];
-		} RCsetmac;	/* <---- RCsetmac */
-
-		/* GETLINKSTATUS structure */
-		struct RCgetlnkstatus_tag {
-			U32 ReturnStatus;
-		} RCgetlnkstatus;	/* <---- RCgetlnkstatus */
-
-		/* GETLINKSTATISTICS structure */
-		struct RCgetlinkstats_tag {
-			RCLINKSTATS StatsReturn;
-		} RCgetlinkstats;	/* <---- RCgetlinkstats */
-
-		/* DEFAULT structure (when no command was recognized) */
-		struct RCdefault_tag {
-			int rc;
-		} RCdefault;	/* <---- RCdefault */
-
-	} data;
-
-};				/* struct RC_user_tag { ... } */
-
-/* 2) User data entry */
-/* RCUD = RedCreek User Data */
-union RC_user_data_tag {	/* structure tags used are taken from RC_user_tag structure above */
-	struct RCgetinfo_tag *getinfo;
-	struct RCgetspeed_tag *getspeed;
-	struct RCgetprom_tag *getprom;
-	struct RCgetbroadcast_tag *getbroadcast;
-	struct RCgetfwver_tag *getfwver;
-	struct RCgetipnmask_tag *getipandmask;
-	struct RCgetmac_tag *getmac;
-	struct RCgetlnkstatus_tag *getlinkstatus;
-	struct RCgetlinkstats_tag *getlinkstatistics;
-	struct RCdefault_tag *rcdefault;
-	struct RCsetspeed_tag *setspeed;
-	struct RCsetprom_tag *setprom;
-	struct RCsetbroadcast_tag *setbroadcast;
-	struct RCsetipnmask_tag *setipandmask;
-	struct RCsetmac_tag *setmac;
-} _RC_user_data;		/* declare as a global, so the defines below will work */
-
-/* 3) Structure short-cut entry */
-/* define structure short-cuts *//* structure names are taken from RC_user_tag structure above */
-#define RCUS_GETINFO           data.RCgetinfo;
-#define RCUS_GETSPEED          data.RCgetspeed;
-#define RCUS_GETPROM           data.RCgetprom;
-#define RCUS_GETBROADCAST      data.RCgetbroadcast;
-#define RCUS_GETFWVER          data.RCgetfwver;
-#define RCUS_GETIPANDMASK      data.RCgetipandmask;
-#define RCUS_GETMAC            data.RCgetmac;
-#define RCUS_GETLINKSTATUS     data.RCgetlnkstatus;
-#define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;
-#define RCUS_DEFAULT           data.RCdefault;
-#define RCUS_SETSPEED          data.RCsetspeed;
-#define RCUS_SETPROM           data.RCsetprom;
-#define RCUS_SETBROADCAST      data.RCsetbroadcast;
-#define RCUS_SETIPANDMASK      data.RCsetipandmask;
-#define RCUS_SETMAC            data.RCsetmac;
-
-/* 4) Data short-cut entry */
-/* define data short-cuts *//* pointer names are from RC_user_data_tag union (just below RC_user_tag) */
-#define RCUD_GETINFO           _RC_user_data.getinfo
-#define RCUD_GETSPEED          _RC_user_data.getspeed
-#define RCUD_GETPROM           _RC_user_data.getprom
-#define RCUD_GETBROADCAST      _RC_user_data.getbroadcast
-#define RCUD_GETFWVER          _RC_user_data.getfwver
-#define RCUD_GETIPANDMASK      _RC_user_data.getipandmask
-#define RCUD_GETMAC            _RC_user_data.getmac
-#define RCUD_GETLINKSTATUS     _RC_user_data.getlinkstatus
-#define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics
-#define RCUD_DEFAULT           _RC_user_data.rcdefault
-#define RCUD_SETSPEED          _RC_user_data.setspeed
-#define RCUD_SETPROM           _RC_user_data.setprom
-#define RCUD_SETBROADCAST      _RC_user_data.setbroadcast
-#define RCUD_SETIPANDMASK      _RC_user_data.setipandmask
-#define RCUD_SETMAC            _RC_user_data.setmac
-
-/* 5) Command identifier entry */
-/* define command identifiers */
-#define RCUC_GETINFO            0x01
-#define RCUC_GETSPEED           0x02
-#define RCUC_GETFWVER           0x03
-#define RCUC_GETIPANDMASK       0x04
-#define RCUC_GETMAC             0x05
-#define RCUC_GETLINKSTATUS      0x06
-#define RCUC_GETLINKSTATISTICS  0x07
-#define RCUC_GETPROM            0x14
-#define RCUC_GETBROADCAST       0x15
-#define RCUC_DEFAULT            0xff
-#define RCUC_SETSPEED           0x08
-#define RCUC_SETIPANDMASK       0x09
-#define RCUC_SETMAC             0x0a
-#define RCUC_SETPROM            0x16
-#define RCUC_SETBROADCAST       0x17
-
-/* define ioctl commands to use, when talking to RC 45/PCI driver */
-#define RCU_PROTOCOL_REV         SIOCDEVPRIVATE
-#define RCU_COMMAND              SIOCDEVPRIVATE+1
-
-/*
-   Intended use for the above defines is shown below (GETINFO, as this example):
-
-      RCuser_struct RCuser;           // declare RCuser structure
-      struct ifreq ifr;               // declare an interface request structure
-
-      RCuser.cmd = RCUC_GETINFO;           // set user command to GETINFO
-      ifr->ifr_data = (caddr_t) &RCuser;   // set point to user structure
-
-      sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);   // get a socket
-      ioctl(sock, RCU_COMMAND, &ifr);                  // do ioctl on socket
-
-      RCUD_GETINFO = &RCuser.RCUS_GETINFO;   // set data pointer for GETINFO
-
-      // print results
-      printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n",
-              RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end,
-              RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);
-*/
-
-#endif				/* RCIF_H */
diff -Nru a/drivers/net/rclanmtl.c b/drivers/net/rclanmtl.c
--- a/drivers/net/rclanmtl.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,2029 +0,0 @@
-/*
-** *************************************************************************
-**
-**
-**     R C L A N M T L . C             $Revision: 6 $
-**
-**
-**  RedCreek I2O LAN Message Transport Layer program module.
-**
-**  ---------------------------------------------------------------------
-**  ---     Copyright (c) 1997-1999, RedCreek Communications Inc.     ---
-**  ---                   All rights reserved.                        ---
-**  ---------------------------------------------------------------------
-**
-**  File Description:
-**
-**  Host side I2O (Intelligent I/O) LAN message transport layer.
-**
-**  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.
-
-**  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., 675 Mass Ave, Cambridge, MA 02139, USA.
-**
-** 1998-1999, LAN API was modified and enhanced by Alice Hennessy.
-**
-** Sometime in 1997, LAN API was written from scratch by Wendell Nichols.
-** *************************************************************************
-*/
-
-#define DEBUG 1
-
-#define RC_LINUX_MODULE
-#include "rclanmtl.h"
-
- /* RedCreek LAN device Target ID */
-#define RC_LAN_TARGET_ID  0x10
- /* RedCreek's OSM default LAN receive Initiator */
-#define DEFAULT_RECV_INIT_CONTEXT  0xA17
-
-/*
-** I2O message structures
-*/
-
-#define    I2O_TID_SZ                                  12
-#define    I2O_FUNCTION_SZ                             8
-
-/* Transaction Reply Lists (TRL) Control Word structure */
-
-#define    I2O_TRL_FLAGS_SINGLE_FIXED_LENGTH           0x00
-#define    I2O_TRL_FLAGS_SINGLE_VARIABLE_LENGTH        0x40
-#define    I2O_TRL_FLAGS_MULTIPLE_FIXED_LENGTH         0x80
-
-/* LAN Class specific functions */
-
-#define    I2O_LAN_PACKET_SEND                         0x3B
-#define    I2O_LAN_SDU_SEND                            0x3D
-#define    I2O_LAN_RECEIVE_POST                        0x3E
-#define    I2O_LAN_RESET                               0x35
-#define    I2O_LAN_SHUTDOWN                            0x37
-
-/* Private Class specfic function */
-#define    I2O_PRIVATE                                 0xFF
-
-/*  I2O Executive Function Codes.  */
-
-#define    I2O_EXEC_ADAPTER_ASSIGN                     0xB3
-#define    I2O_EXEC_ADAPTER_READ                       0xB2
-#define    I2O_EXEC_ADAPTER_RELEASE                    0xB5
-#define    I2O_EXEC_BIOS_INFO_SET                      0xA5
-#define    I2O_EXEC_BOOT_DEVICE_SET                    0xA7
-#define    I2O_EXEC_CONFIG_VALIDATE                    0xBB
-#define    I2O_EXEC_CONN_SETUP                         0xCA
-#define    I2O_EXEC_DEVICE_ASSIGN                      0xB7
-#define    I2O_EXEC_DEVICE_RELEASE                     0xB9
-#define    I2O_EXEC_HRT_GET                            0xA8
-#define    I2O_EXEC_IOP_CLEAR                          0xBE
-#define    I2O_EXEC_IOP_CONNECT                        0xC9
-#define    I2O_EXEC_IOP_RESET                          0xBD
-#define    I2O_EXEC_LCT_NOTIFY                         0xA2
-#define    I2O_EXEC_OUTBOUND_INIT                      0xA1
-#define    I2O_EXEC_PATH_ENABLE                        0xD3
-#define    I2O_EXEC_PATH_QUIESCE                       0xC5
-#define    I2O_EXEC_PATH_RESET                         0xD7
-#define    I2O_EXEC_STATIC_MF_CREATE                   0xDD
-#define    I2O_EXEC_STATIC_MF_RELEASE                  0xDF
-#define    I2O_EXEC_STATUS_GET                         0xA0
-#define    I2O_EXEC_SW_DOWNLOAD                        0xA9
-#define    I2O_EXEC_SW_UPLOAD                          0xAB
-#define    I2O_EXEC_SW_REMOVE                          0xAD
-#define    I2O_EXEC_SYS_ENABLE                         0xD1
-#define    I2O_EXEC_SYS_MODIFY                         0xC1
-#define    I2O_EXEC_SYS_QUIESCE                        0xC3
-#define    I2O_EXEC_SYS_TAB_SET                        0xA3
-
- /* Init Outbound Q status */
-#define    I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS          0x01
-#define    I2O_EXEC_OUTBOUND_INIT_REJECTED             0x02
-#define    I2O_EXEC_OUTBOUND_INIT_FAILED               0x03
-#define    I2O_EXEC_OUTBOUND_INIT_COMPLETE             0x04
-
-#define    I2O_UTIL_NOP                                0x00
-
-/* I2O Get Status State values */
-
-#define    I2O_IOP_STATE_INITIALIZING                  0x01
-#define    I2O_IOP_STATE_RESET                         0x02
-#define    I2O_IOP_STATE_HOLD                          0x04
-#define    I2O_IOP_STATE_READY                         0x05
-#define    I2O_IOP_STATE_OPERATIONAL                   0x08
-#define    I2O_IOP_STATE_FAILED                        0x10
-#define    I2O_IOP_STATE_FAULTED                       0x11
-
-/* Defines for Request Status Codes:  Table 3-1 Reply Status Codes.  */
-
-#define    I2O_REPLY_STATUS_SUCCESS                    0x00
-#define    I2O_REPLY_STATUS_ABORT_DIRTY                0x01
-#define    I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER     0x02
-#define    I2O_REPLY_STATUS_ABORT_PARTIAL_TRANSFER     0x03
-#define    I2O_REPLY_STATUS_ERROR_DIRTY                0x04
-#define    I2O_REPLY_STATUS_ERROR_NO_DATA_TRANSFER     0x05
-#define    I2O_REPLY_STATUS_ERROR_PARTIAL_TRANSFER     0x06
-#define    I2O_REPLY_STATUS_PROCESS_ABORT_DIRTY        0x07
-#define    I2O_REPLY_STATUS_PROCESS_ABORT_NO_DATA_TRANSFER   0x08
-#define    I2O_REPLY_STATUS_PROCESS_ABORT_PARTIAL_TRANSFER   0x09
-#define    I2O_REPLY_STATUS_TRANSACTION_ERROR          0x0A
-#define    I2O_REPLY_STATUS_PROGRESS_REPORT            0x80
-
-/* DetailedStatusCode defines for ALL messages: Table 3-2 Detailed Status Codes.*/
-
-#define    I2O_DETAIL_STATUS_SUCCESS                        0x0000
-#define    I2O_DETAIL_STATUS_BAD_KEY                        0x0001
-#define    I2O_DETAIL_STATUS_CHAIN_BUFFER_TOO_LARGE         0x0002
-#define    I2O_DETAIL_STATUS_DEVICE_BUSY                    0x0003
-#define    I2O_DETAIL_STATUS_DEVICE_LOCKED                  0x0004
-#define    I2O_DETAIL_STATUS_DEVICE_NOT_AVAILABLE           0x0005
-#define    I2O_DETAIL_STATUS_DEVICE_RESET                   0x0006
-#define    I2O_DETAIL_STATUS_INAPPROPRIATE_FUNCTION         0x0007
-#define    I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_HARD     0x0008
-#define    I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_SOFT     0x0009
-#define    I2O_DETAIL_STATUS_INVALID_INITIATOR_ADDRESS      0x000A
-#define    I2O_DETAIL_STATUS_INVALID_MESSAGE_FLAGS          0x000B
-#define    I2O_DETAIL_STATUS_INVALID_OFFSET                 0x000C
-#define    I2O_DETAIL_STATUS_INVALID_PARAMETER              0x000D
-#define    I2O_DETAIL_STATUS_INVALID_REQUEST                0x000E
-#define    I2O_DETAIL_STATUS_INVALID_TARGET_ADDRESS         0x000F
-#define    I2O_DETAIL_STATUS_MESSAGE_TOO_LARGE              0x0010
-#define    I2O_DETAIL_STATUS_MESSAGE_TOO_SMALL              0x0011
-#define    I2O_DETAIL_STATUS_MISSING_PARAMETER              0x0012
-#define    I2O_DETAIL_STATUS_NO_SUCH_PAGE                   0x0013
-#define    I2O_DETAIL_STATUS_REPLY_BUFFER_FULL              0x0014
-#define    I2O_DETAIL_STATUS_TCL_ERROR                      0x0015
-#define    I2O_DETAIL_STATUS_TIMEOUT                        0x0016
-#define    I2O_DETAIL_STATUS_UNKNOWN_ERROR                  0x0017
-#define    I2O_DETAIL_STATUS_UNKNOWN_FUNCTION               0x0018
-#define    I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION           0x0019
-#define    I2O_DETAIL_STATUS_UNSUPPORTED_VERSION            0x001A
-
- /* I2O msg header defines for VersionOffset */
-#define I2OMSGVER_1_5   0x0001
-#define SGL_OFFSET_0    I2OMSGVER_1_5
-#define SGL_OFFSET_4    (0x0040 | I2OMSGVER_1_5)
-#define TRL_OFFSET_5    (0x0050 | I2OMSGVER_1_5)
-#define TRL_OFFSET_6    (0x0060 | I2OMSGVER_1_5)
-
- /* I2O msg header defines for MsgFlags */
-#define MSG_STATIC      0x0100
-#define MSG_64BIT_CNTXT 0x0200
-#define MSG_MULTI_TRANS 0x1000
-#define MSG_FAIL        0x2000
-#define MSG_LAST        0x4000
-#define MSG_REPLY       0x8000
-
-  /* normal LAN request message MsgFlags and VersionOffset (0x1041) */
-#define LAN_MSG_REQST  (MSG_MULTI_TRANS | SGL_OFFSET_4)
-
- /* minimum size msg */
-#define THREE_WORD_MSG_SIZE 0x00030000
-#define FOUR_WORD_MSG_SIZE  0x00040000
-#define FIVE_WORD_MSG_SIZE  0x00050000
-#define SIX_WORD_MSG_SIZE   0x00060000
-#define SEVEN_WORD_MSG_SIZE 0x00070000
-#define EIGHT_WORD_MSG_SIZE 0x00080000
-#define NINE_WORD_MSG_SIZE  0x00090000
-
-/* Special TID Assignments */
-
-#define I2O_IOP_TID   0
-#define I2O_HOST_TID  0xB91
-
- /* RedCreek I2O private message codes */
-#define RC_PRIVATE_GET_MAC_ADDR     0x0001/**/	/* OBSOLETE */
-#define RC_PRIVATE_SET_MAC_ADDR     0x0002
-#define RC_PRIVATE_GET_NIC_STATS    0x0003
-#define RC_PRIVATE_GET_LINK_STATUS  0x0004
-#define RC_PRIVATE_SET_LINK_SPEED   0x0005
-#define RC_PRIVATE_SET_IP_AND_MASK  0x0006
-/* #define RC_PRIVATE_GET_IP_AND_MASK  0x0007 *//* OBSOLETE */
-#define RC_PRIVATE_GET_LINK_SPEED   0x0008
-#define RC_PRIVATE_GET_FIRMWARE_REV 0x0009
-/* #define RC_PRIVATE_GET_MAC_ADDR     0x000A */
-#define RC_PRIVATE_GET_IP_AND_MASK  0x000B
-#define RC_PRIVATE_DEBUG_MSG        0x000C
-#define RC_PRIVATE_REPORT_DRIVER_CAPABILITY  0x000D
-#define RC_PRIVATE_SET_PROMISCUOUS_MODE  0x000e
-#define RC_PRIVATE_GET_PROMISCUOUS_MODE  0x000f
-#define RC_PRIVATE_SET_BROADCAST_MODE    0x0010
-#define RC_PRIVATE_GET_BROADCAST_MODE    0x0011
-
-#define RC_PRIVATE_REBOOT           0x00FF
-
-/* I2O message header */
-typedef struct _I2O_MESSAGE_FRAME {
-	U8 VersionOffset;
-	U8 MsgFlags;
-	U16 MessageSize;
-	BF TargetAddress:I2O_TID_SZ;
-	BF InitiatorAddress:I2O_TID_SZ;
-	BF Function:I2O_FUNCTION_SZ;
-	U32 InitiatorContext;
-	/* SGL[] */
-} I2O_MESSAGE_FRAME, *PI2O_MESSAGE_FRAME;
-
- /* assumed a 16K minus 256 byte space for outbound queue message frames */
-#define MSG_FRAME_SIZE  512
-#define NMBR_MSG_FRAMES 30
-
- /* 
-    ** in reserved space right after PAB in host memory is area for returning
-    ** values from card 
-  */
-
-/*
-** typedef NICSTAT
-**
-** Data structure for NIC statistics retruned from PCI card.  Data copied from
-** here to user allocated RCLINKSTATS (see rclanmtl.h) structure.
-*/
-typedef struct tag_NicStat {
-	unsigned long TX_good;
-	unsigned long TX_maxcol;
-	unsigned long TX_latecol;
-	unsigned long TX_urun;
-	unsigned long TX_crs;	/* lost carrier sense */
-	unsigned long TX_def;	/* transmit deferred */
-	unsigned long TX_singlecol;	/* single collisions */
-	unsigned long TX_multcol;
-	unsigned long TX_totcol;
-	unsigned long Rcv_good;
-	unsigned long Rcv_CRCerr;
-	unsigned long Rcv_alignerr;
-	unsigned long Rcv_reserr;	/* rnr'd pkts */
-	unsigned long Rcv_orun;
-	unsigned long Rcv_cdt;
-	unsigned long Rcv_runt;
-	unsigned long dump_status;	/* last field directly from the chip */
-} NICSTAT, *P_NICSTAT;
-
-#define DUMP_DONE   0x0000A005	/* completed statistical dump */
-#define DUMP_CLEAR  0x0000A007	/* completed stat dump and clear counters */
-
-static volatile int msgFlag;
-
-/* local function prototypes */
-static void ProcessOutboundI2OMsg (PPAB pPab, U32 phyMsgAddr);
-static int FillI2OMsgSGLFromTCB (PU32 pMsg, PRCTCB pXmitCntrlBlock);
-static int GetI2OStatus (PPAB pPab);
-static int SendI2OOutboundQInitMsg (PPAB pPab);
-static int SendEnableSysMsg (PPAB pPab);
-
-/*
-** =========================================================================
-** RCInitI2OMsgLayer()
-**
-** Initialize the RedCreek I2O Module and adapter.
-**
-** Inputs:  dev - the devices net_device struct
-**          TransmitCallbackFunction - address of transmit callback function
-**          ReceiveCallbackFunction  - address of receive  callback function
-**
-** private message block is allocated by user.  It must be in locked pages.
-** p_msgbuf and p_phymsgbuf point to the same location.  Must be contigous
-** memory block of a minimum of 16K byte and long word aligned.
-** =========================================================================
-*/
-RC_RETURN
-RCInitI2OMsgLayer (struct net_device *dev,
-		   PFNTXCALLBACK TransmitCallbackFunction,
-		   PFNRXCALLBACK ReceiveCallbackFunction,
-		   PFNCALLBACK RebootCallbackFunction)
-{
-	int result;
-	PPAB pPab;
-	U32 pciBaseAddr = dev->base_addr;
-	PDPA pDpa = dev->priv;
-	PU8 p_msgbuf = pDpa->msgbuf;
-	PU8 p_phymsgbuf = (PU8) pDpa->msgbuf_dma;
-
-	dprintk
-	    ("InitI2O: Adapter:0x%04ux ATU:0x%08ulx msgbuf:%p phymsgbuf:0x%08ulx\n"
-	     "TransmitCallbackFunction:0x%08ulx  ReceiveCallbackFunction:0x%08ulx\n",
-	     pDpa->id, pciBaseAddr, p_msgbuf, (u32) p_phymsgbuf,
-	     (u32) TransmitCallbackFunction, (u32) ReceiveCallbackFunction);
-
-	/* Check if this interface already initialized - if so, shut it down */
-	if (pDpa->pPab != NULL) {
-		printk (KERN_WARNING
-			"(rcpci45 driver:) pDpa->pPab [%d] != NULL\n",
-			pDpa->id);
-/*          RCResetLANCard(pDpa->id, 0, (PU32)NULL, (PFNCALLBACK)NULL); */
-		pDpa->pPab = NULL;
-	}
-
-	/* store adapter instance values in adapter block.
-	 * Adapter block is at beginning of message buffer */
-
-	pPab = kmalloc (sizeof (*pPab), GFP_KERNEL);
-	if (!pPab) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) RCInitI2OMsgLayer: Could not allocate memory for PAB struct!\n");
-		result = RC_RTN_MALLOC_ERROR;
-		goto err_out;
-	}
-
-	memset (pPab, 0, sizeof (*pPab));
-	pDpa->pPab = pPab;
-	pPab->p_atu = (PATU) pciBaseAddr;
-	pPab->pPci45LinBaseAddr = (PU8) pciBaseAddr;
-
-	/* Set outbound message frame addr */
-	pPab->outMsgBlockPhyAddr = (U32) p_phymsgbuf;
-	pPab->pLinOutMsgBlock = (PU8) p_msgbuf;
-
-	/* store callback function addresses */
-	pPab->pTransCallbackFunc = TransmitCallbackFunction;
-	pPab->pRecvCallbackFunc = ReceiveCallbackFunction;
-	pPab->pRebootCallbackFunc = RebootCallbackFunction;
-	pPab->pCallbackFunc = (PFNCALLBACK) NULL;
-
-	/*
-	   ** Initialize I2O IOP
-	 */
-	result = GetI2OStatus (pPab);
-
-	if (result != RC_RTN_NO_ERROR)
-		goto err_out_dealloc;
-
-	if (pPab->IOPState == I2O_IOP_STATE_OPERATIONAL) {
-		printk (KERN_INFO
-			"(rcpci45 driver:) pPab->IOPState == op: resetting adapter\n");
-		RCResetLANCard (dev, 0, (PU32) NULL, (PFNCALLBACK) NULL);
-	}
-
-	result = SendI2OOutboundQInitMsg (pPab);
-
-	if (result != RC_RTN_NO_ERROR)
-		goto err_out_dealloc;
-
-	result = SendEnableSysMsg (pPab);
-
-	if (result != RC_RTN_NO_ERROR)
-		goto err_out_dealloc;
-
-	return RC_RTN_NO_ERROR;
-
-      err_out_dealloc:
-	kfree (pPab);
-      err_out:
-	return result;
-}
-
-/*
-** =========================================================================
-** Disable and Enable I2O interrupts.  I2O interrupts are enabled at Init time
-** but can be disabled and re-enabled through these two function calls.
-** Packets will still be put into any posted received buffers and packets will
-** be sent through RCI2OSendPacket() functions.  Disabling I2O interrupts
-** will prevent hardware interrupt to host even though the outbound I2O msg
-** queue is not emtpy.
-** =========================================================================
-*/
-#define i960_OUT_POST_Q_INT_BIT        0x0008	/* bit set masks interrupts */
-
-RC_RETURN
-RCDisableI2OInterrupts (struct net_device * dev)
-{
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	pPab->p_atu->OutIntMask |= i960_OUT_POST_Q_INT_BIT;
-
-	return RC_RTN_NO_ERROR;
-}
-
-RC_RETURN
-RCEnableI2OInterrupts (struct net_device * dev)
-{
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	pPab->p_atu->OutIntMask &= ~i960_OUT_POST_Q_INT_BIT;
-
-	return RC_RTN_NO_ERROR;
-
-}
-
-/*
-** =========================================================================
-** RCI2OSendPacket()
-** =========================================================================
-*/
-RC_RETURN
-RCI2OSendPacket (struct net_device * dev, U32 InitiatorContext,
-		 PRCTCB pTransCtrlBlock)
-{
-	U32 msgOffset;
-	PU32 pMsg;
-	int size;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	dprintk ("RCI2OSendPacket()...\n");
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	/* get Inbound free Q entry - reading from In Q gets free Q entry */
-	/* offset to Msg Frame in PCI msg block */
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("RCI2OSendPacket(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	size = FillI2OMsgSGLFromTCB (pMsg + 4, pTransCtrlBlock);
-
-	if (size == -1) {	/* error processing TCB - send NOP msg */
-		dprintk ("RCI2OSendPacket(): Error Rrocess TCB!\n");
-		pMsg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0;
-		pMsg[1] =
-		    I2O_UTIL_NOP << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-		return RC_RTN_TCB_ERROR;
-	} else {		/* send over msg header */
-
-		pMsg[0] = (size + 4) << 16 | LAN_MSG_REQST;	/* send over message size and flags */
-		pMsg[1] =
-		    I2O_LAN_PACKET_SEND << 24 | I2O_HOST_TID << 12 |
-		    RC_LAN_TARGET_ID;
-		pMsg[2] = InitiatorContext;
-		pMsg[3] = 0;	/* batch reply */
-		/* post to Inbound Post Q */
-		pPab->p_atu->InQueue = msgOffset;
-		return RC_RTN_NO_ERROR;
-	}
-}
-
-/*
-** =========================================================================
-** RCI2OPostRecvBuffer()
-**
-** inputs:  pBufrCntrlBlock - pointer to buffer control block
-**
-** returns TRUE if successful in sending message, else FALSE.
-** =========================================================================
-*/
-RC_RETURN
-RCPostRecvBuffers (struct net_device * dev, PRCTCB pTransCtrlBlock)
-{
-	U32 msgOffset;
-	PU32 pMsg;
-	int size;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	dprintk ("RCPostRecvBuffers()...\n");
-
-	/* search for DeviceHandle */
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	/* get Inbound free Q entry - reading from In Q gets free Q entry */
-	/* offset to Msg Frame in PCI msg block */
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("RCPostRecvBuffers(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	size = FillI2OMsgSGLFromTCB (pMsg + 4, pTransCtrlBlock);
-
-	if (size == -1) {	/* error prcessing TCB - send 3 DWORD private msg == NOP */
-		dprintk
-		    ("RCPostRecvBuffers(): Error Processing TCB! size = %d\n",
-		     size);
-		pMsg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0;
-		pMsg[1] =
-		    I2O_UTIL_NOP << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-		/* post to Post Q */
-		pPab->p_atu->InQueue = msgOffset;
-		return RC_RTN_TCB_ERROR;
-	} else {		/* send over size msg header */
-
-		pMsg[0] = (size + 4) << 16 | LAN_MSG_REQST;	/* send over message size and flags */
-		pMsg[1] =
-		    I2O_LAN_RECEIVE_POST << 24 | I2O_HOST_TID << 12 |
-		    RC_LAN_TARGET_ID;
-		pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-		pMsg[3] = *(PU32) pTransCtrlBlock;	/* number of packet buffers */
-		/* post to Post Q */
-		pPab->p_atu->InQueue = msgOffset;
-		return RC_RTN_NO_ERROR;
-	}
-}
-
-/*
-** =========================================================================
-** RCProcI2OMsgQ()
-**
-** Process I2O outbound message queue until empty.
-** =========================================================================
-*/
-irqreturn_t
-RCProcI2OMsgQ (struct net_device *dev)
-{
-	U32 phyAddrMsg;
-	PU8 p8Msg;
-	PU32 p32;
-	U16 count;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	unsigned char debug_msg[20];
-
-	if (pPab == NULL)
-		return IRQ_NONE;
-
-	phyAddrMsg = pPab->p_atu->OutQueue;
-
-	while (phyAddrMsg != 0xFFFFFFFF) {
-		p8Msg =
-		    pPab->pLinOutMsgBlock + (phyAddrMsg -
-					     pPab->outMsgBlockPhyAddr);
-		p32 = (PU32) p8Msg;
-
-		dprintk ("msg: 0x%x  0x%x \n", p8Msg[7], p32[5]);
-
-		/* Send Packet Reply Msg */
-		if (I2O_LAN_PACKET_SEND == p8Msg[7]) {	/* function code byte */
-			count = *(PU16) (p8Msg + 2);
-			count -= p8Msg[0] >> 4;
-			/* status, count, context[], adapter */
-			(*pPab->pTransCallbackFunc) (p8Msg[19], count, p32 + 5,
-						     dev);
-		} else if (I2O_LAN_RECEIVE_POST == p8Msg[7]) {	/* Receive Packet Reply Msg */
-			dprintk
-			    ("I2O_RECV_REPLY pPab:0x%08ulx p8Msg:0x%08ulx p32:0x%08ulx\n",
-			     (u32) pPab, (u32) p8Msg, (u32) p32);
-			dprintk ("msg: 0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[0], p32[1], p32[2], p32[3]);
-			dprintk ("     0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[4], p32[5], p32[6], p32[7]);
-			dprintk ("     0x%08ulx:0X%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[8], p32[9], p32[10], p32[11]);
-			/*  status, count, buckets remaining, packetParmBlock, adapter */
-			(*pPab->pRecvCallbackFunc) (p8Msg[19], p8Msg[12],
-						    p32[5], p32 + 6, dev);
-		} else if (I2O_LAN_RESET == p8Msg[7]
-			   || I2O_LAN_SHUTDOWN == p8Msg[7])
-			if (pPab->pCallbackFunc)
-				(*pPab->pCallbackFunc) (p8Msg[19], 0, 0, dev);
-			else
-				pPab->pCallbackFunc = (PFNCALLBACK) 1;
-		else if (I2O_PRIVATE == p8Msg[7]) {
-			dprintk ("i2o private 0x%x, 0x%x \n", p8Msg[7], p32[5]);
-			switch (p32[5]) {
-			case RC_PRIVATE_DEBUG_MSG:
-				msgFlag = 1;
-				dprintk ("Received I2O_PRIVATE msg\n");
-				debug_msg[15] = (p32[6] & 0xff000000) >> 24;
-				debug_msg[14] = (p32[6] & 0x00ff0000) >> 16;
-				debug_msg[13] = (p32[6] & 0x0000ff00) >> 8;
-				debug_msg[12] = (p32[6] & 0x000000ff);
-
-				debug_msg[11] = (p32[7] & 0xff000000) >> 24;
-				debug_msg[10] = (p32[7] & 0x00ff0000) >> 16;
-				debug_msg[9] = (p32[7] & 0x0000ff00) >> 8;
-				debug_msg[8] = (p32[7] & 0x000000ff);
-
-				debug_msg[7] = (p32[8] & 0xff000000) >> 24;
-				debug_msg[6] = (p32[8] & 0x00ff0000) >> 16;
-				debug_msg[5] = (p32[8] & 0x0000ff00) >> 8;
-				debug_msg[4] = (p32[8] & 0x000000ff);
-
-				debug_msg[3] = (p32[9] & 0xff000000) >> 24;
-				debug_msg[2] = (p32[9] & 0x00ff0000) >> 16;
-				debug_msg[1] = (p32[9] & 0x0000ff00) >> 8;
-				debug_msg[0] = (p32[9] & 0x000000ff);
-
-				debug_msg[16] = '\0';
-				dprintk ("%s", debug_msg);
-				break;
-			case RC_PRIVATE_REBOOT:
-				dprintk ("Adapter reboot initiated...\n");
-				if (pPab->pRebootCallbackFunc)
-					(*pPab->pRebootCallbackFunc) (0, 0, 0,
-								      dev);
-				break;
-			default:
-				printk (KERN_WARNING
-					"(rcpci45 driver:) Unknown private I2O msg received: 0x%x\n",
-					p32[5]);
-				break;
-			}
-		}
-
-		/* 
-		   ** Process other Msg's
-		 */
-		else
-			ProcessOutboundI2OMsg (pPab, phyAddrMsg);
-
-		/* return MFA to outbound free Q */
-		pPab->p_atu->OutQueue = phyAddrMsg;
-
-		/* any more msgs? */
-		phyAddrMsg = pPab->p_atu->OutQueue;
-	}
-
-	return IRQ_HANDLED;
-}
-
-/*
-** =========================================================================
-**  Returns LAN interface statistical counters to space provided by caller at
-**  StatsReturnAddr.  Returns 0 if success, else RC_RETURN code.
-**  This function will call the WaitCallback function provided by
-**  user while waiting for card to respond.
-** =========================================================================
-*/
-RC_RETURN
-RCGetLinkStatistics (struct net_device *dev,
-		     P_RCLINKSTATS StatsReturnAddr,
-		     PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset;
-	volatile U32 timeout;
-	volatile PU32 pMsg;
-	volatile PU32 p32, pReturnAddr;
-	P_NICSTAT pStats;
-	int i;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-/*dprintk("Get82558Stats() StatsReturnAddr:0x%08ulx\n", StatsReturnAddr); */
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("Get8255XStats(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-/*dprintk("Get82558Stats - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
-/*dprintk("Get82558Stats - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
-
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = 0x112;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_NIC_STATS;
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	p32 = (PU32) pPab->outMsgBlockPhyAddr;
-	pStats = (P_NICSTAT) pPab->pLinOutMsgBlock;
-	pStats->dump_status = 0xFFFFFFFF;
-
-	/* post to Inbound Post Q */
-	pPab->p_atu->InQueue = msgOffset;
-
-	timeout = 100000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);
-
-		if (pStats->dump_status != 0xFFFFFFFF)
-			break;
-
-		if (!timeout--) {
-			dprintk
-			    ("RCGet82558Stats() Timeout waiting for NIC statistics\n");
-			return RC_RTN_MSG_REPLY_TIMEOUT;
-		}
-	}
-
-	pReturnAddr = (PU32) StatsReturnAddr;
-
-	/* copy Nic stats to user's structure */
-	for (i = 0; i < (int) sizeof (RCLINKSTATS) / 4; i++)
-		pReturnAddr[i] = p32[i];
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** Get82558LinkStatus()
-** =========================================================================
-*/
-RC_RETURN
-RCGetLinkStatus (struct net_device * dev, PU32 ReturnAddr,
-		 PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset;
-	volatile U32 timeout;
-	volatile PU32 pMsg;
-	volatile PU32 p32;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	dprintk ("Get82558LinkStatus() ReturnPhysAddr:0x%08ulx\n",
-		 (u32) ReturnAddr);
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("Get82558LinkStatus(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-/*dprintk("Get82558LinkStatus - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
-/*dprintk("Get82558LinkStatus - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
-
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = 0x112;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_LINK_STATUS;
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	p32 = (PU32) pPab->pLinOutMsgBlock;
-	*p32 = 0xFFFFFFFF;
-
-	/* post to Inbound Post Q */
-	pPab->p_atu->InQueue = msgOffset;
-
-	timeout = 100000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);
-
-		if (*p32 != 0xFFFFFFFF)
-			break;
-
-		if (!timeout--) {
-			dprintk ("Timeout waiting for link status\n");
-			return RC_RTN_MSG_REPLY_TIMEOUT;
-		}
-	}
-
-	*ReturnAddr = *p32;	/* 1 = up 0 = down */
-
-	return RC_RTN_NO_ERROR;
-
-}
-
-/*
-** =========================================================================
-** RCGetMAC()
-**
-** get the MAC address the adapter is listening for in non-promiscous mode.
-** MAC address is in media format.
-** =========================================================================
-*/
-RC_RETURN
-RCGetMAC (struct net_device * dev, PFNWAITCALLBACK WaitCallback)
-{
-	unsigned timeout;
-	U32 off;
-	PU8 mac = dev->dev_addr;
-	PU32 p;
-	U32 temp[2];
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	PATU p_atu;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	p_atu = pPab->p_atu;
-
-	p_atu->EtherMacLow = 0;	/* first zero return data */
-	p_atu->EtherMacHi = 0;
-
-	off = p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	p = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	dprintk ("RCGetMAC: p_atu 0x%08x, off 0x%08x, p 0x%08x\n",
-		 (uint) p_atu, (uint) off, (uint) p);
-	/* setup private message */
-	p[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0;
-	p[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	p[2] = 0;		/* initiator context */
-	p[3] = 0x218;		/* transaction context */
-	p[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_MAC_ADDR;
-
-	p_atu->InQueue = off;	/* send it to the I2O device */
-	dprintk ("RCGetMAC: p_atu 0x%08x, off 0x%08x, p 0x%08x\n",
-		 (uint) p_atu, (uint) off, (uint) p);
-
-	/* wait for the rcpci45 board to update the info */
-	timeout = 1000000;
-	while (0 == p_atu->EtherMacLow) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);
-
-		if (!timeout--) {
-			printk ("rc_getmac: Timeout\n");
-			return RC_RTN_MSG_REPLY_TIMEOUT;
-		}
-	}
-
-	/* read the mac address  */
-	temp[0] = p_atu->EtherMacLow;
-	temp[1] = p_atu->EtherMacHi;
-	memcpy ((char *) mac, (char *) temp, 6);
-
-	dprintk ("rc_getmac: 0x%x\n", (u32) mac);
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCSetMAC()
-**
-** set MAC address the adapter is listening for in non-promiscous mode.
-** MAC address is in media format.
-** =========================================================================
-*/
-RC_RETURN
-RCSetMAC (struct net_device * dev, PU8 mac)
-{
-	U32 off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_MAC_ADDR;
-	pMsg[5] = *(unsigned *) mac;	/* first four bytes */
-	pMsg[6] = *(unsigned *) (mac + 4);	/* last two bytes */
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCSetLinkSpeed()
-**
-** set ethernet link speed. 
-** input: speedControl - determines action to take as follows
-**          0 = reset and auto-negotiate (NWay)
-**          1 = Full Duplex 100BaseT
-**          2 = Half duplex 100BaseT
-**          3 = Full Duplex  10BaseT
-**          4 = Half duplex  10BaseT
-**          all other values are ignore (do nothing)
-** =========================================================================
-*/
-RC_RETURN
-RCSetLinkSpeed (struct net_device * dev, U16 LinkSpeedCode)
-{
-	U32 off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_LINK_SPEED;
-	pMsg[5] = LinkSpeedCode;	/* link speed code */
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCSetPromiscuousMode()
-**
-** Defined values for Mode:
-**  0 - turn off promiscuous mode
-**  1 - turn on  promiscuous mode
-**
-** =========================================================================
-*/
-RC_RETURN
-RCSetPromiscuousMode (struct net_device * dev, U16 Mode)
-{
-	U32 off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_PROMISCUOUS_MODE;
-	pMsg[5] = Mode;		/* promiscuous mode setting */
-
-	pPab->p_atu->InQueue = off;	/* send it to the device */
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCGetPromiscuousMode()
-**
-** get promiscuous mode setting
-**
-** Possible return values placed in pMode:
-**  0 = promisuous mode not set
-**  1 = promisuous mode is set
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetPromiscuousMode (struct net_device * dev, PU32 pMode,
-		      PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	volatile PU32 p32;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		printk (KERN_WARNING
-			"(rcpci45 driver:) RCGetLinkSpeed(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0xff;
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_PROMISCUOUS_MODE;
-	/* phys address to return status - area right after PAB */
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	/* post to Inbound Post Q */
-
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] != 0xff)
-			break;
-
-		if (!timeout--) {
-			dprintk
-			    ("Timeout waiting for promiscuous mode from adapter\n");
-			dprintk ("0x%8x\n", p32[0]);
-			return RC_RTN_NO_LINK_SPEED;
-		}
-	}
-
-	/* get mode */
-	*pMode = (U8) ((volatile PU8) p32)[0] & 0x0f;
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCSetBroadcastMode()
-**
-** Defined values for Mode:
-**  0 - turn off promiscuous mode
-**  1 - turn on  promiscuous mode
-**
-** =========================================================================
-*/
-RC_RETURN
-RCSetBroadcastMode (struct net_device * dev, U16 Mode)
-{
-	U32 off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_BROADCAST_MODE;
-	pMsg[5] = Mode;		/* promiscuous mode setting */
-
-	pPab->p_atu->InQueue = off;	/* send it to the device */
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCGetBroadcastMode()
-**
-** get promiscuous mode setting
-**
-** Possible return values placed in pMode:
-**  0 = promisuous mode not set
-**  1 = promisuous mode is set
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetBroadcastMode (struct net_device * dev, PU32 pMode,
-		    PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	volatile PU32 p32;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		printk (KERN_WARNING
-			"(rcpci45 driver:) RCGetLinkSpeed(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0xff;
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_BROADCAST_MODE;
-	/* phys address to return status - area right after PAB */
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	/* post to Inbound Post Q */
-
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] != 0xff)
-			break;
-
-		if (!timeout--) {
-			printk (KERN_WARNING
-				"(rcpci45 driver:) Timeout waiting for promiscuous mode from adapter\n");
-			printk (KERN_WARNING "(rcpci45 driver:) 0x%8x\n",
-				p32[0]);
-			return RC_RTN_NO_LINK_SPEED;
-		}
-	}
-
-	/* get mode */
-	*pMode = (U8) ((volatile PU8) p32)[0] & 0x0f;
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCGetLinkSpeed()
-**
-** get ethernet link speed. 
-**
-** 0 = Unknown
-** 1 = Full Duplex 100BaseT
-** 2 = Half duplex 100BaseT
-** 3 = Full Duplex  10BaseT
-** 4 = Half duplex  10BaseT
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetLinkSpeed (struct net_device * dev, PU32 pLinkSpeedCode,
-		PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	volatile PU32 p32;
-	U8 IOPLinkSpeed;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		printk (KERN_WARNING
-			"(rcpci45 driver:) RCGetLinkSpeed(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0xff;
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_LINK_SPEED;
-	/* phys address to return status - area right after PAB */
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	/* post to Inbound Post Q */
-
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] != 0xff)
-			break;
-
-		if (!timeout--) {
-			dprintk ("Timeout waiting for link speed from IOP\n");
-			dprintk ("0x%8x\n", p32[0]);
-			return RC_RTN_NO_LINK_SPEED;
-		}
-	}
-
-	/* get Link speed */
-	IOPLinkSpeed = (U8) ((volatile PU8) p32)[0] & 0x0f;
-
-	*pLinkSpeedCode = IOPLinkSpeed;
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCReportDriverCapability(struct net_device *dev, U32 capability)
-**
-** Currently defined bits:
-** WARM_REBOOT_CAPABLE   0x01
-**
-** =========================================================================
-*/
-RC_RETURN
-RCReportDriverCapability (struct net_device * dev, U32 capability)
-{
-	U32 off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] =
-	    RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_REPORT_DRIVER_CAPABILITY;
-	pMsg[5] = capability;
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCGetFirmwareVer()
-**
-** Return firmware version in the form "SoftwareVersion : Bt BootVersion"
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetFirmwareVer (struct net_device * dev, PU8 pFirmString,
-		  PFNWAITCALLBACK WaitCallback)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	volatile PU32 p32;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	msgOffset = pPab->p_atu->InQueue;
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("RCGetFirmwareVer(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0xff;
-
-	/* setup private message */
-	pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_FIRMWARE_REV;
-	/* phys address to return status - area right after PAB */
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	/* post to Inbound Post Q */
-
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] != 0xff)
-			break;
-
-		if (!timeout--) {
-			dprintk ("Timeout waiting for link speed from IOP\n");
-			return RC_RTN_NO_FIRM_VER;
-		}
-	}
-
-	strcpy (pFirmString, (PU8) p32);
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCResetLANCard()
-**
-** ResourceFlags indicates whether to return buffer resource explicitly
-** to host or keep and reuse.
-** CallbackFunction (if not NULL) is the function to be called when 
-** reset is complete.
-** If CallbackFunction is NULL, ReturnAddr will have a 1 placed in it when
-** reset is done (if not NULL).
-**
-** =========================================================================
-*/
-RC_RETURN
-RCResetLANCard (struct net_device * dev, U16 ResourceFlags, PU32 ReturnAddr,
-		PFNCALLBACK CallbackFunction)
-{
-	unsigned long off;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	long timeout = 0;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pPab->pCallbackFunc = CallbackFunction;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup message */
-	pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_LAN_RESET << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = ResourceFlags << 16;	/* resource flags */
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-
-	if (CallbackFunction == (PFNCALLBACK) NULL) {
-		/* call RCProcI2OMsgQ() until something in pPab->pCallbackFunc
-		   or until timer goes off */
-		while (pPab->pCallbackFunc == (PFNCALLBACK) NULL) {
-			RCProcI2OMsgQ (dev);
-			udelay (1000);	/* please don't hog the bus!!! */
-			timeout++;
-			if (timeout > 10000) {
-				break;
-			}
-		}
-		if (ReturnAddr != (PU32) NULL)
-			*ReturnAddr = (U32) pPab->pCallbackFunc;
-	}
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCResetIOP()
-**
-** Send StatusGet Msg, wait for results return directly to buffer.
-**
-** =========================================================================
-*/
-RC_RETURN
-RCResetIOP (struct net_device * dev)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	volatile PU32 p32;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	pMsg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_EXEC_IOP_RESET << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
-	pMsg[2] = 0;		/* universal context */
-	pMsg[3] = 0;		/* universal context */
-	pMsg[4] = 0;		/* universal context */
-	pMsg[5] = 0;		/* universal context */
-	/* phys address to return status - area right after PAB */
-	pMsg[6] = pPab->outMsgBlockPhyAddr;
-	pMsg[7] = 0;
-	pMsg[8] = 1;		/*  return 1 byte */
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0;
-	p32[1] = 0;
-
-	/* post to Inbound Post Q */
-
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] || p32[1])
-			break;
-
-		if (!timeout--) {
-			dprintk ("RCResetIOP timeout\n");
-			return RC_RTN_MSG_REPLY_TIMEOUT;
-		}
-	}
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCShutdownLANCard()
-**
-** ResourceFlags indicates whether to return buffer resource explicitly
-** to host or keep and reuse.
-** CallbackFunction (if not NULL) is the function to be called when 
-** shutdown is complete.
-** If CallbackFunction is NULL, ReturnAddr will have a 1 placed in it when
-** shutdown is done (if not NULL).
-**
-** =========================================================================
-*/
-RC_RETURN
-RCShutdownLANCard (struct net_device * dev, U16 ResourceFlags,
-		   PU32 ReturnAddr, PFNCALLBACK CallbackFunction)
-{
-	volatile PU32 pMsg;
-	U32 off;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	long timeout = 0;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pPab->pCallbackFunc = CallbackFunction;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup message */
-	pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] =
-	    I2O_LAN_SHUTDOWN << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = ResourceFlags << 16;	/* resource flags */
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-
-	if (CallbackFunction == (PFNCALLBACK) NULL) {
-		/* call RCProcI2OMsgQ() until something in pPab->pCallbackFunc
-		   or until timer goes off */
-		while (pPab->pCallbackFunc == (PFNCALLBACK) NULL) {
-			RCProcI2OMsgQ (dev);
-			udelay (1000);	/* please don't hog the bus!!! */
-			timeout++;
-			if (timeout > 10000) {
-				printk (KERN_WARNING
-					"(rcpci45 driver:) RCShutdownLANCard(): timeout\n");
-				break;
-			}
-		}
-		if (ReturnAddr != (PU32) NULL)
-			*ReturnAddr = (U32) pPab->pCallbackFunc;
-	}
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** RCSetRavlinIPandMask()
-**
-** Set the Ravlin 45/PCI cards IP address and network mask.
-**
-** IP address and mask must be in network byte order.
-** For example, IP address 1.2.3.4 and mask 255.255.255.0 would be
-** 0x04030201 and 0x00FFFFFF on a little endian machine.
-**
-** =========================================================================
-*/
-RC_RETURN
-RCSetRavlinIPandMask (struct net_device * dev, U32 ipAddr, U32 netMask)
-{
-	volatile PU32 pMsg;
-	U32 off;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	off = pPab->p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	/* setup private message */
-	pMsg[0] = SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x219;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_IP_AND_MASK;
-	pMsg[5] = ipAddr;
-	pMsg[6] = netMask;
-
-	pPab->p_atu->InQueue = off;	/* send it to the I2O device */
-	return RC_RTN_NO_ERROR;
-
-}
-
-/*
-** =========================================================================
-** RCGetRavlinIPandMask()
-**
-** get the IP address and MASK from the card
-** 
-** =========================================================================
-*/
-RC_RETURN
-RCGetRavlinIPandMask (struct net_device * dev, PU32 pIpAddr, PU32 pNetMask,
-		      PFNWAITCALLBACK WaitCallback)
-{
-	unsigned timeout;
-	U32 off;
-	PU32 pMsg, p32;
-	PPAB pPab = ((PDPA) dev->priv)->pPab;
-	PATU p_atu;
-
-	dprintk
-	    ("RCGetRavlinIPandMask: pIpAddr is 0x%08ulx, *IpAddr is 0x%08ulx\n",
-	     (u32) pIpAddr, *pIpAddr);
-
-	if (pPab == NULL)
-		return RC_RTN_ADPTR_NOT_REGISTERED;
-
-	p_atu = pPab->p_atu;
-	off = p_atu->InQueue;	/* get addresss of message */
-
-	if (0xFFFFFFFF == off)
-		return RC_RTN_FREE_Q_EMPTY;
-
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	*p32 = 0xFFFFFFFF;
-
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + off);
-
-	dprintk
-	    ("RCGetRavlinIPandMask: p_atu 0x%08ulx, off 0x%08ulx, p32 0x%08ulx\n",
-	     (u32) p_atu, off, (u32) p32);
-	/* setup private message */
-	pMsg[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
-	pMsg[2] = 0;		/* initiator context */
-	pMsg[3] = 0x218;	/* transaction context */
-	pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_IP_AND_MASK;
-	pMsg[5] = pPab->outMsgBlockPhyAddr;
-
-	p_atu->InQueue = off;	/* send it to the I2O device */
-	dprintk
-	    ("RCGetRavlinIPandMask: p_atu 0x%08ulx, off 0x%08ulx, p32 0x%08ulx\n",
-	     (u32) p_atu, off, (u32) p32);
-
-	/* wait for the rcpci45 board to update the info */
-	timeout = 100000;
-	while (0xffffffff == *p32) {
-		if (WaitCallback)
-			(*WaitCallback) ();
-
-		udelay (10);
-
-		if (!timeout--) {
-			dprintk ("RCGetRavlinIPandMask: Timeout\n");
-			return RC_RTN_MSG_REPLY_TIMEOUT;
-		}
-	}
-
-	dprintk
-	    ("RCGetRavlinIPandMask: after time out\np32[0] (IpAddr) 0x%08ulx, p32[1] (IPmask) 0x%08ulx\n",
-	     p32[0], p32[1]);
-
-	/* send IP and mask to user's space  */
-	*pIpAddr = p32[0];
-	*pNetMask = p32[1];
-
-	dprintk
-	    ("RCGetRavlinIPandMask: pIpAddr is 0x%08ulx, *IpAddr is 0x%08ulx\n",
-	     (u32) pIpAddr, *pIpAddr);
-
-	return RC_RTN_NO_ERROR;
-}
-
-/* 
-** /////////////////////////////////////////////////////////////////////////
-** /////////////////////////////////////////////////////////////////////////
-**
-**                        local functions
-**
-** /////////////////////////////////////////////////////////////////////////
-** /////////////////////////////////////////////////////////////////////////
-*/
-
-/*
-** =========================================================================
-** SendI2OOutboundQInitMsg()
-**
-** =========================================================================
-*/
-static int
-SendI2OOutboundQInitMsg (PPAB pPab)
-{
-	U32 msgOffset, timeout, phyOutQFrames, i;
-	volatile PU32 pMsg;
-	volatile PU32 p32;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("SendI2OOutboundQInitMsg(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	dprintk
-	    ("SendI2OOutboundQInitMsg - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n",
-	     (u32) pMsg, msgOffset);
-
-	pMsg[0] = EIGHT_WORD_MSG_SIZE | TRL_OFFSET_6;
-	pMsg[1] =
-	    I2O_EXEC_OUTBOUND_INIT << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = 0x106;	/* transaction context */
-	pMsg[4] = 4096;		/* Host page frame size */
-	pMsg[5] = MSG_FRAME_SIZE << 16 | 0x80;	/* outbound msg frame size and Initcode */
-	pMsg[6] = 0xD0000004;	/* simple sgl element LE, EOB */
-	/* phys address to return status - area right after PAB */
-	pMsg[7] = pPab->outMsgBlockPhyAddr;
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0;
-
-	/* post to Inbound Post Q */
-	pPab->p_atu->InQueue = msgOffset;
-
-	/* wait for response */
-	timeout = 100000;
-	while (1) {
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0])
-			break;
-
-		if (!timeout--) {
-			dprintk
-			    ("Timeout wait for InitOutQ InPrgress status from IOP\n");
-			return RC_RTN_NO_I2O_STATUS;
-		}
-	}
-
-	timeout = 100000;
-	while (1) {
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] == I2O_EXEC_OUTBOUND_INIT_COMPLETE)
-			break;
-
-		if (!timeout--) {
-			dprintk
-			    ("Timeout wait for InitOutQ Complete status from IOP\n");
-			return RC_RTN_NO_I2O_STATUS;
-		}
-	}
-
-	/* load PCI outbound free Q with MF physical addresses */
-	phyOutQFrames = pPab->outMsgBlockPhyAddr;
-
-	for (i = 0; i < NMBR_MSG_FRAMES; i++) {
-		pPab->p_atu->OutQueue = phyOutQFrames;
-		phyOutQFrames += MSG_FRAME_SIZE;
-	}
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** GetI2OStatus()
-**
-** Send StatusGet Msg, wait for results return directly to buffer.
-**
-** =========================================================================
-*/
-static int
-GetI2OStatus (PPAB pPab)
-{
-	U32 msgOffset, timeout;
-	PU32 pMsg;
-	volatile PU32 p32;
-
-	msgOffset = pPab->p_atu->InQueue;
-	dprintk ("GetI2OStatus: msg offset = 0x%x\n", msgOffset);
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("GetI2OStatus(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	pMsg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_EXEC_STATUS_GET << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
-	pMsg[2] = 0;		/* universal context */
-	pMsg[3] = 0;		/* universal context */
-	pMsg[4] = 0;		/* universal context */
-	pMsg[5] = 0;		/* universal context */
-	/* phys address to return status - area right after PAB */
-	pMsg[6] = pPab->outMsgBlockPhyAddr;
-	pMsg[7] = 0;
-	pMsg[8] = 88;		/*  return 88 bytes */
-
-	/* virtual pointer to return buffer - clear first two dwords */
-	p32 = (volatile PU32) pPab->pLinOutMsgBlock;
-	p32[0] = 0;
-	p32[1] = 0;
-
-	dprintk
-	    ("GetI2OStatus - pMsg:0x%08ulx, msgOffset:0x%08ulx, [1]:0x%08ulx, [6]:0x%08ulx\n",
-	     (u32) pMsg, msgOffset, pMsg[1], pMsg[6]);
-
-	/* post to Inbound Post Q */
-	pPab->p_atu->InQueue = msgOffset;
-
-	dprintk ("Return status to p32 = 0x%08ulx\n", (u32) p32);
-
-	/* wait for response */
-	timeout = 1000000;
-	while (1) {
-		udelay (10);	/* please don't hog the bus!!! */
-
-		if (p32[0] && p32[1])
-			break;
-
-		if (!timeout--) {
-			dprintk ("Timeout waiting for status from IOP\n");
-			dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[0], p32[1], p32[2], p32[3]);
-			dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[4], p32[5], p32[6], p32[7]);
-			dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-				 p32[8], p32[9], p32[10], p32[11]);
-			return RC_RTN_NO_I2O_STATUS;
-		}
-	}
-
-	dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n", p32[0], p32[1],
-		 p32[2], p32[3]);
-	dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n", p32[4], p32[5],
-		 p32[6], p32[7]);
-	dprintk ("0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n", p32[8], p32[9],
-		 p32[10], p32[11]);
-	/* get IOP state */
-	pPab->IOPState = ((volatile PU8) p32)[10];
-	pPab->InboundMFrameSize = ((volatile PU16) p32)[6];
-
-	dprintk ("IOP state 0x%02x InFrameSize = 0x%04x\n",
-		 pPab->IOPState, pPab->InboundMFrameSize);
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** SendEnableSysMsg()
-**
-**
-** =========================================================================
-*/
-static int
-SendEnableSysMsg (PPAB pPab)
-{
-	U32 msgOffset;
-	volatile PU32 pMsg;
-
-	msgOffset = pPab->p_atu->InQueue;
-
-	if (msgOffset == 0xFFFFFFFF) {
-		dprintk ("SendEnableSysMsg(): Inbound Free Q empty!\n");
-		return RC_RTN_FREE_Q_EMPTY;
-	}
-
-	/* calc virtual address of msg - virtual already mapped to physical */
-	pMsg = (PU32) (pPab->pPci45LinBaseAddr + msgOffset);
-
-	dprintk
-	    ("SendEnableSysMsg - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n",
-	     (u32) pMsg, msgOffset);
-
-	pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
-	pMsg[1] = I2O_EXEC_SYS_ENABLE << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
-	pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
-	pMsg[3] = 0x110;	/* transaction context */
-	pMsg[4] = 0x50657465;	/*  RedCreek Private */
-
-	/* post to Inbound Post Q */
-	pPab->p_atu->InQueue = msgOffset;
-
-	return RC_RTN_NO_ERROR;
-}
-
-/*
-** =========================================================================
-** FillI2OMsgFromTCB()
-**
-** inputs   pMsgU32 - virtual pointer (mapped to physical) of message frame
-**          pXmitCntrlBlock - pointer to caller buffer control block.
-**
-** fills in LAN SGL after Transaction Control Word or Bucket Count.
-** =========================================================================
-*/
-static int
-FillI2OMsgSGLFromTCB (PU32 pMsgFrame, PRCTCB pTransCtrlBlock)
-{
-	unsigned int nmbrBuffers, nmbrSeg, nmbrDwords, context, flags;
-	PU32 pTCB, pMsg;
-
-	/* SGL element flags */
-#define EOB        0x40000000
-#define LE         0x80000000
-#define SIMPLE_SGL 0x10000000
-#define BC_PRESENT 0x01000000
-
-	pTCB = (PU32) pTransCtrlBlock;
-	pMsg = pMsgFrame;
-	nmbrDwords = 0;
-
-	dprintk ("FillI2OMsgSGLFromTCBX\n");
-	dprintk ("TCB  0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n",
-		 pTCB[0], pTCB[1], pTCB[2], pTCB[3], pTCB[4]);
-	dprintk ("pTCB 0x%08ulx, pMsg 0x%08ulx\n", (u32) pTCB, (u32) pMsg);
-
-	nmbrBuffers = *pTCB++;
-
-	if (!nmbrBuffers) {
-		return -1;
-	}
-
-	do {
-		context = *pTCB++;	/* buffer tag (context) */
-		nmbrSeg = *pTCB++;	/* number of segments */
-
-		if (!nmbrSeg) {
-			return -1;
-		}
-
-		flags = SIMPLE_SGL | BC_PRESENT;
-
-		if (1 == nmbrSeg) {
-			flags |= EOB;
-
-			if (1 == nmbrBuffers)
-				flags |= LE;
-		}
-
-		/* 1st SGL buffer element has context */
-		pMsg[0] = pTCB[0] | flags;	/* send over count (segment size) */
-		pMsg[1] = context;
-		pMsg[2] = pTCB[1];	/* send buffer segment physical address */
-		nmbrDwords += 3;
-		pMsg += 3;
-		pTCB += 2;
-
-		if (--nmbrSeg) {
-			do {
-				flags = SIMPLE_SGL;
-
-				if (1 == nmbrSeg) {
-					flags |= EOB;
-
-					if (1 == nmbrBuffers)
-						flags |= LE;
-				}
-
-				pMsg[0] = pTCB[0] | flags;	/* send over count */
-				pMsg[1] = pTCB[1];	/* send buffer segment physical address */
-				nmbrDwords += 2;
-				pTCB += 2;
-				pMsg += 2;
-
-			} while (--nmbrSeg);
-		}
-
-	} while (--nmbrBuffers);
-
-	return nmbrDwords;
-}
-
-/*
-** =========================================================================
-** ProcessOutboundI2OMsg()
-**
-** process I2O reply message
-** * change to msg structure *
-** =========================================================================
-*/
-static void
-ProcessOutboundI2OMsg (PPAB pPab, U32 phyAddrMsg)
-{
-	PU8 p8Msg;
-	PU32 p32;
-/*      U16 count; */
-
-	p8Msg = pPab->pLinOutMsgBlock + (phyAddrMsg - pPab->outMsgBlockPhyAddr);
-	p32 = (PU32) p8Msg;
-
-	dprintk
-	    ("VXD: ProcessOutboundI2OMsg - pPab 0x%08ulx, phyAdr 0x%08ulx, linAdr 0x%08ulx\n",
-	     (u32) pPab, phyAddrMsg, (u32) p8Msg);
-	dprintk ("msg :0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n", p32[0], p32[1],
-		 p32[2], p32[3]);
-	dprintk ("msg :0x%08ulx:0x%08ulx:0x%08ulx:0x%08ulx\n", p32[4], p32[5],
-		 p32[6], p32[7]);
-
-	if (p32[4] >> 24 != I2O_REPLY_STATUS_SUCCESS) {
-		dprintk ("Message reply status not success\n");
-		return;
-	}
-
-	switch (p8Msg[7]) {	/* function code byte */
-	case I2O_EXEC_SYS_TAB_SET:
-		msgFlag = 1;
-		dprintk ("Received I2O_EXEC_SYS_TAB_SET reply\n");
-		break;
-
-	case I2O_EXEC_HRT_GET:
-		msgFlag = 1;
-		dprintk ("Received I2O_EXEC_HRT_GET reply\n");
-		break;
-
-	case I2O_EXEC_LCT_NOTIFY:
-		msgFlag = 1;
-		dprintk ("Received I2O_EXEC_LCT_NOTIFY reply\n");
-		break;
-
-	case I2O_EXEC_SYS_ENABLE:
-		msgFlag = 1;
-		dprintk ("Received I2O_EXEC_SYS_ENABLE reply\n");
-		break;
-
-	default:
-		dprintk ("Received UNKNOWN reply\n");
-		break;
-	}
-}
diff -Nru a/drivers/net/rclanmtl.h b/drivers/net/rclanmtl.h
--- a/drivers/net/rclanmtl.h	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,701 +0,0 @@
-/*
-** *************************************************************************
-**
-**
-**     R C L A N M T L . H             $Revision: 6 $
-**
-**
-**  RedCreek I2O LAN Message Transport Layer header file.
-**
-**  ---------------------------------------------------------------------
-**  ---     Copyright (c) 1997-1999, RedCreek Communications Inc.     ---
-**  ---                   All rights reserved.                        ---
-**  ---------------------------------------------------------------------
-**
-**  File Description:
-**
-**  Header file for host I2O (Intelligent I/O) LAN message transport layer 
-**  API and data types.
-**
-**  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.
-
-**  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., 675 Mass Ave, Cambridge, MA 02139, USA.
-**
-** *************************************************************************
-*/
-
-#ifndef RCLANMTL_H
-#define RCLANMTL_H
-
-/* Linux specific includes */
-#include <asm/types.h>
-#ifdef RC_LINUX_MODULE		/* linux modules need non-library version of string functions */
-#include <linux/string.h>
-#else
-#include <string.h>
-#endif
-#include <linux/delay.h>	/* for udelay() */
-
-#include <linux/netdevice.h>
-#include <linux/if_ether.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-
-#include <asm/io.h>
-
-/* Debug stuff. Define for debug output */
-#undef RCDEBUG
-
-#ifdef RCDEBUG
-#define dprintk(args...) printk(KERN_DEBUG "rc: " args)
-#else
-#define dprintk(args...) { }
-#endif
-
-/* Typedefs */
-
- /* scalar data types */
-typedef __u8 U8;
-typedef __u16 U16;
-typedef __u32 U32;
-typedef __u8 *PU8;
-typedef __u16 *PU16;
-typedef __u32 *PU32;
-typedef unsigned long BF;
-typedef int RC_RETURN;
-
- /* 
-    ** type PFNWAITCALLBACK
-    **
-    ** pointer to void function - type used for WaitCallback in some functions 
-  */
-typedef void (*PFNWAITCALLBACK) (void);	/* void argument avoids compiler complaint */
-
- /*
-    ** type PFNTXCALLBACK 
-    **
-    ** Pointer to user's transmit callback function.  This user function is
-    ** called from RCProcI2OMsgQ() when packet have been transmitted from buffers
-    ** given in the RCI2OSendPacket() function.  BufferContext is a pointer to
-    ** an array of 32 bit context values.  These are the values the user assigned
-    ** and passed in the TCB to the RCI2OSendPacket() function.  PcktCount
-    ** indicates the number of buffer context values in the BufferContext[] array.
-    ** The User's TransmitCallbackFunction should recover (put back in free queue)
-    ** the packet buffers associated with the buffer context values.
-  */
-typedef void (*PFNTXCALLBACK) (U32 Status,
-			       U16 PcktCount,
-			       PU32 BufferContext, struct net_device *);
-
- /* 
-    ** type PFNRXCALLBACK 
-    **
-    ** Pointer to user's receive callback function.  This user function
-    ** is called from RCProcI2OMsgQ() when packets have been received into
-    ** previously posted packet buffers throught the RCPostRecvBuffers() function.
-    ** The received callback function should process the Packet Descriptor Block
-    ** pointed to by PacketDescBlock. See Packet Decription Block below.
-  */
-typedef void (*PFNRXCALLBACK) (U32 Status,
-			       U8 PktCount,
-			       U32 BucketsRemain,
-			       PU32 PacketDescBlock, struct net_device *);
-
- /* 
-    ** type PFNCALLBACK 
-    **
-    ** Pointer to user's generic callback function.  This user function
-    ** can be passed to LANReset or LANShutdown and is called when the 
-    ** the reset or shutdown is complete.
-    ** Param1 and Param2 are invalid for LANReset and LANShutdown.
-  */
-typedef void (*PFNCALLBACK) (U32 Status,
-			     U32 Param1, U32 Param2, struct net_device * dev);
-
-/*
-**  Message Unit CSR definitions for RedCreek PCI45 board
-*/
-typedef struct tag_rcatu {
-	volatile unsigned long APICRegSel;	/* APIC Register Select */
-	volatile unsigned long reserved0;
-	volatile unsigned long APICWinReg;	/* APIC Window Register */
-	volatile unsigned long reserved1;
-	volatile unsigned long InMsgReg0;	/* inbound message register 0 */
-	volatile unsigned long InMsgReg1;	/* inbound message register 1 */
-	volatile unsigned long OutMsgReg0;	/* outbound message register 0 */
-	volatile unsigned long OutMsgReg1;	/* outbound message register 1 */
-	volatile unsigned long InDoorReg;	/* inbound doorbell register */
-	volatile unsigned long InIntStat;	/* inbound interrupt status register */
-	volatile unsigned long InIntMask;	/* inbound interrupt mask register */
-	volatile unsigned long OutDoorReg;	/* outbound doorbell register */
-	volatile unsigned long OutIntStat;	/* outbound interrupt status register */
-	volatile unsigned long OutIntMask;	/* outbound interrupt mask register */
-	volatile unsigned long reserved2;
-	volatile unsigned long reserved3;
-	volatile unsigned long InQueue;	/* inbound queue port */
-	volatile unsigned long OutQueue;	/* outbound queue port */
-	volatile unsigned long reserved4;
-	volatile unsigned long reserver5;
-	/* RedCreek extension */
-	volatile unsigned long EtherMacLow;
-	volatile unsigned long EtherMacHi;
-	volatile unsigned long IPaddr;
-	volatile unsigned long IPmask;
-} *PATU;
-
- /* 
-    ** typedef PAB
-    **
-    ** PCI Adapter Block - holds instance specific information.
-  */
-typedef struct {
-	PATU p_atu;		/* ptr to  ATU register block */
-	PU8 pPci45LinBaseAddr;
-	PU8 pLinOutMsgBlock;
-	U32 outMsgBlockPhyAddr;
-	PFNTXCALLBACK pTransCallbackFunc;
-	PFNRXCALLBACK pRecvCallbackFunc;
-	PFNCALLBACK pRebootCallbackFunc;
-	PFNCALLBACK pCallbackFunc;
-	U16 IOPState;
-	U16 InboundMFrameSize;
-} *PPAB;
-
-/*
- * Driver Private Area, DPA.
- */
-typedef struct {
-	U8 id;			/* the AdapterID */
-
-	/* These two field are basically for the RCioctl function.
-	 * I could not determine if they could be avoided. (RAA)*/
-	U32 pci_addr;		/* the pci address of the adapter */
-	U32 pci_addr_len;
-
-	struct pci_dev *pci_dev;
-	struct timer_list timer;	/*  timer */
-	struct net_device_stats stats;	/* the statistics structure */
-	unsigned long numOutRcvBuffers;	/* number of outstanding receive buffers */
-	unsigned char shutdown;
-	unsigned char reboot;
-	unsigned char nexus;
-	PU8 msgbuf;		/* Pointer to Lan Api Private Area */
-	dma_addr_t msgbuf_dma;
-	PPAB pPab;		/* Pointer to the PCI Adapter Block */
-} *PDPA;
-
-/* PCI/45 Configuration space values */
-#define RC_PCI45_VENDOR_ID  0x4916
-#define RC_PCI45_DEVICE_ID  0x1960
-
- /* RedCreek API function return values */
-#define RC_RTN_NO_ERROR             0
-#define RC_RTN_I2O_NOT_INIT         1
-#define RC_RTN_FREE_Q_EMPTY         2
-#define RC_RTN_TCB_ERROR            3
-#define RC_RTN_TRANSACTION_ERROR    4
-#define RC_RTN_ADAPTER_ALREADY_INIT 5
-#define RC_RTN_MALLOC_ERROR         6
-#define RC_RTN_ADPTR_NOT_REGISTERED 7
-#define RC_RTN_MSG_REPLY_TIMEOUT    8
-#define RC_RTN_NO_I2O_STATUS        9
-#define RC_RTN_NO_FIRM_VER         10
-#define RC_RTN_NO_LINK_SPEED       11
-
-/* Driver capability flags */
-#define WARM_REBOOT_CAPABLE      0x01
-
-/*
-** Status - Transmit and Receive callback status word 
-**
-** A 32 bit Status is returned to the TX and RX callback functions.  This value
-** contains both the reply status and the detailed status as follows:
-**
-**  32    24     16            0
-**  +------+------+------------+
-**  | Reply|      |  Detailed  |
-**  |Status|   0  |   Status   |
-**  +------+------+------------+
-**
-** Reply Status and Detailed Status of zero indicates No Errors.
-*/
- /* reply message status defines */
-#define    I2O_REPLY_STATUS_SUCCESS                    0x00
-#define    I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER     0x02
-#define    I2O_REPLY_STATUS_TRANSACTION_ERROR          0x0A
-
-/* DetailedStatusCode defines */
-#define    I2O_LAN_DSC_SUCCESS                         0x0000
-#define    I2O_LAN_DSC_DEVICE_FAILURE                  0x0001
-#define    I2O_LAN_DSC_DESTINATION_NOT_FOUND           0x0002
-#define    I2O_LAN_DSC_TRANSMIT_ERROR                  0x0003
-#define    I2O_LAN_DSC_TRANSMIT_ABORTED                0x0004
-#define    I2O_LAN_DSC_RECEIVE_ERROR                   0x0005
-#define    I2O_LAN_DSC_RECEIVE_ABORTED                 0x0006
-#define    I2O_LAN_DSC_DMA_ERROR                       0x0007
-#define    I2O_LAN_DSC_BAD_PACKET_DETECTED             0x0008
-#define    I2O_LAN_DSC_OUT_OF_MEMORY                   0x0009
-#define    I2O_LAN_DSC_BUCKET_OVERRUN                  0x000A
-#define    I2O_LAN_DSC_IOP_INTERNAL_ERROR              0x000B
-#define    I2O_LAN_DSC_CANCELED                        0x000C
-#define    I2O_LAN_DSC_INVALID_TRANSACTION_CONTEXT     0x000D
-#define    I2O_LAN_DSC_DESTINATION_ADDRESS_DETECTED    0x000E
-#define    I2O_LAN_DSC_DESTINATION_ADDRESS_OMITTED     0x000F
-#define    I2O_LAN_DSC_PARTIAL_PACKET_RETURNED         0x0010
-
-/*
-** Packet Description Block   (Received packets)
-**
-** A pointer to this block structure is returned to the ReceiveCallback 
-** function.  It contains the list of packet buffers which have either been
-** filled with a packet or returned to host due to a LANReset function. 
-** Currently there will only be one packet per receive bucket (buffer) posted. 
-**
-**   32   24               0     
-**  +-----------------------+  -\
-**  |   Buffer 1 Context    |    \
-**  +-----------------------+     \
-**  |      0xC0000000       |     / First Bucket Descriptor
-**  +-----+-----------------+    /
-**  |  0  | packet 1 length |   / 
-**  +-----------------------+  -\
-**  |   Buffer 2 Context    |    \
-**  +-----------------------+     \
-**  |      0xC0000000       |     / Second Bucket Descriptor
-**  +-----+-----------------+    /
-**  |  0  | packet 2 length |   / 
-**  +-----+-----------------+  -
-**  |         ...           |  ----- more bucket descriptors
-**  +-----------------------+  -\
-**  |   Buffer n Context    |    \
-**  +-----------------------+     \
-**  |      0xC0000000       |     / Last Bucket Descriptor
-**  +-----+-----------------+    /
-**  |  0  | packet n length |   / 
-**  +-----+-----------------+  -
-**
-** Buffer Context values are those given to adapter in the TCB on calls to
-** RCPostRecvBuffers().
-**  
-*/
-
-/*
-** Transaction Control Block (TCB) structure
-**
-** A structure like this is filled in by the user and passed by reference to 
-** RCI2OSendPacket() and RCPostRecvBuffers() functions.  Minimum size is five
-** 32-bit words for one buffer with one segment descriptor.  
-** MAX_NMBR_POST_BUFFERS_PER_MSG defines the maximum single segment buffers
-** that can be described in a given TCB.
-**
-**   32                    0
-**  +-----------------------+
-**  |   Buffer Count        |  Number of buffers in the TCB
-**  +-----------------------+
-**  |   Buffer 1 Context    |  first buffer reference
-**  +-----------------------+
-**  |   Buffer 1 Seg Count  |  number of segments in buffer
-**  +-----------------------+
-**  |   Buffer 1 Seg Desc 1 |  first segment descriptor (size, physical address)
-**  +-----------------------+
-**  |         ...           |  more segment descriptors (size, physical address)
-**  +-----------------------+
-**  |   Buffer 1 Seg Desc n |  last segment descriptor (size, physical address)
-**  +-----------------------+
-**  |   Buffer 2 Context    |  second buffer reference
-**  +-----------------------+
-**  |   Buffer 2 Seg Count  |  number of segments in buffer
-**  +-----------------------+
-**  |   Buffer 2 Seg Desc 1 |  segment descriptor (size, physical address)
-**  +-----------------------+
-**  |         ...           |  more segment descriptors (size, physical address)
-**  +-----------------------+
-**  |   Buffer 2 Seg Desc n |
-**  +-----------------------+
-**  |         ...           |  more buffer descriptor blocks ...
-**  +-----------------------+
-**  |   Buffer n Context    |
-**  +-----------------------+
-**  |   Buffer n Seg Count  |
-**  +-----------------------+
-**  |   Buffer n Seg Desc 1 |
-**  +-----------------------+
-**  |         ...           |
-**  +-----------------------+
-**  |   Buffer n Seg Desc n |
-**  +-----------------------+
-**
-**
-** A TCB for one contigous packet buffer would look like the following:
-**
-**   32                    0
-**  +-----------------------+
-**  |         1             |  one buffer in the TCB
-**  +-----------------------+
-**  |  <user's Context>     |  user's buffer reference
-**  +-----------------------+
-**  |         1             |  one segment buffer
-**  +-----------------------+                            _
-**  |    <buffer size>      |  size                       \ 
-**  +-----------------------+                              \ segment descriptor
-**  |  <physical address>   |  physical address of buffer  /
-**  +-----------------------+                            _/
-**
-*/
-
- /* Buffer Segment Descriptor */
-typedef struct {
-	U32 size;
-	U32 phyAddress;
-} BSD, *PBSD;
-
-typedef PU32 PRCTCB;
-/*
-** -------------------------------------------------------------------------
-** Exported functions comprising the API to the LAN I2O message transport layer
-** -------------------------------------------------------------------------
-*/
-
- /*
-    ** InitRCI2OMsgLayer()
-    ** 
-    ** Called once prior to using the I2O LAN message transport layer.  User 
-    ** provides both the physical and virual address of a locked page buffer 
-    ** that is used as a private buffer for the RedCreek I2O message
-    ** transport layer.  This buffer must be a contigous memory block of a 
-    ** minimum of 16K bytes and long word aligned.  The user also must provide
-    ** the base address of the RedCreek PCI adapter assigned by BIOS or operating
-    ** system.  
-    **
-    ** Inputs:  dev - the net_device struct for the device.
-    **          TransmitCallbackFunction - address of user's TX callback function
-    **          ReceiveCallbackFunction  - address of user's RX callback function
-    **          RebootCallbackFunction  - address of user's reboot callback function
-    **
-  */
-RC_RETURN RCInitI2OMsgLayer (struct net_device *dev,
-			     PFNTXCALLBACK TransmitCallbackFunction,
-			     PFNRXCALLBACK ReceiveCallbackFunction,
-			     PFNCALLBACK RebootCallbackFunction);
-
- /*
-    ** RCSetRavlinIPandMask()
-    **
-    ** Set the Ravlin 45/PCI cards IP address and network mask.
-    **
-    ** IP address and mask must be in network byte order.
-    ** For example, IP address 1.2.3.4 and mask 255.255.255.0 would be
-    ** 0x04030201 and 0x00FFFFFF on a little endian machine.
-    **
-  */
-RC_RETURN RCSetRavlinIPandMask (struct net_device *dev, U32 ipAddr,
-				U32 netMask);
-
-/*
-** =========================================================================
-** RCGetRavlinIPandMask()
-**
-** get the IP address and MASK from the card
-** 
-** =========================================================================
-*/
-RC_RETURN
-RCGetRavlinIPandMask (struct net_device *dev, PU32 pIpAddr, PU32 pNetMask,
-		      PFNWAITCALLBACK WaitCallback);
-
- /* 
-    ** RCProcI2OMsgQ()
-    ** 
-    ** Called from user's polling loop or Interrupt Service Routine for a PCI 
-    ** interrupt from the RedCreek PCI adapter.  User responsible for determining
-    ** and hooking the PCI interrupt. This function will call the registered
-    ** callback functions, TransmitCallbackFunction or ReceiveCallbackFunction,
-    ** if a TX or RX transaction has completed.
-  */
-irqreturn_t RCProcI2OMsgQ (struct net_device *dev);
-
- /*
-    ** Disable and Enable I2O interrupts.  I2O interrupts are enabled at Init time
-    ** but can be disabled and re-enabled through these two function calls.
-    ** Packets will still be put into any posted received buffers and packets will
-    ** be sent through RCI2OSendPacket() functions.  Disabling I2O interrupts
-    ** will prevent hardware interrupt to host even though the outbound I2O msg
-    ** queue is not emtpy.
-  */
-RC_RETURN RCEnableI2OInterrupts (struct net_device *dev);
-RC_RETURN RCDisableI2OInterrupts (struct net_device *dev);
-
- /* 
-    ** RCPostRecvBuffers()
-    ** 
-    ** Post user's page locked buffers for use by the PCI adapter to
-    ** return ethernet packets received from the LAN.  Transaction Control Block,
-    ** provided by user, contains buffer descriptor(s) which includes a buffer
-    ** context number along with buffer size and physical address.  See TCB above.
-    ** The buffer context and actual packet length are returned to the 
-    ** ReceiveCallbackFunction when packets have been received.  Buffers posted
-    ** to the RedCreek adapter are considered owned by the adapter until the
-    ** context is return to user through the ReceiveCallbackFunction.
-  */
-RC_RETURN RCPostRecvBuffers (struct net_device *dev,
-			     PRCTCB pTransactionCtrlBlock);
-#define MAX_NMBR_POST_BUFFERS_PER_MSG 32
-
- /*
-    ** RCI2OSendPacket()
-    ** 
-    ** Send user's ethernet packet from a locked page buffer.  
-    ** Packet must have full MAC header, however without a CRC.  
-    ** Initiator context is a user provided value that is returned 
-    ** to the TransmitCallbackFunction when packet buffer is free.
-    ** Transmit buffer are considered owned by the adapter until context's
-    ** returned to user through the TransmitCallbackFunction.
-  */
-RC_RETURN RCI2OSendPacket (struct net_device *dev,
-			   U32 context, PRCTCB pTransactionCtrlBlock);
-
- /* Ethernet Link Statistics structure */
-typedef struct tag_RC_link_stats {
-	U32 TX_good;		/* good transmit frames */
-	U32 TX_maxcol;		/* frames not TX due to MAX collisions */
-	U32 TX_latecol;		/* frames not TX due to late collisions */
-	U32 TX_urun;		/* frames not TX due to DMA underrun */
-	U32 TX_crs;		/* frames TX with lost carrier sense */
-	U32 TX_def;		/* frames deferred due to activity on link */
-	U32 TX_singlecol;	/* frames TX with one and only on collision */
-	U32 TX_multcol;		/* frames TX with more than one collision */
-	U32 TX_totcol;		/* total collisions detected during TX */
-	U32 Rcv_good;		/* good frames received */
-	U32 Rcv_CRCerr;		/* frames RX and discarded with CRC errors */
-	U32 Rcv_alignerr;	/* frames RX with alignment and CRC errors */
-	U32 Rcv_reserr;		/* good frames discarded due to no RX buffer */
-	U32 Rcv_orun;		/* RX frames lost due to FIFO overrun */
-	U32 Rcv_cdt;		/* RX frames with collision during RX */
-	U32 Rcv_runt;		/* RX frames shorter than 64 bytes */
-} RCLINKSTATS, *P_RCLINKSTATS;
-
- /*
-    ** RCGetLinkStatistics()
-    **
-    ** Returns link statistics in user's structure at address StatsReturnAddr
-    ** If given, not NULL, the function WaitCallback is called during the wait
-    ** loop while waiting for the adapter to respond.
-  */
-RC_RETURN RCGetLinkStatistics (struct net_device *dev,
-			       P_RCLINKSTATS StatsReturnAddr,
-			       PFNWAITCALLBACK WaitCallback);
-
- /*
-    ** RCGetLinkStatus()
-    **
-    ** Return link status, up or down, to user's location addressed by ReturnAddr.
-    ** If given, not NULL, the function WaitCallback is called during the wait
-    ** loop while waiting for the adapter to respond.
-  */
-RC_RETURN RCGetLinkStatus (struct net_device *dev,
-			   PU32 pReturnStatus, PFNWAITCALLBACK WaitCallback);
-
- /* Link Status defines - value returned in pReturnStatus */
-#define RC_LAN_LINK_STATUS_DOWN     0
-#define RC_LAN_LINK_STATUS_UP       1
-
- /*
-    ** RCGetMAC()
-    **
-    ** Get the current MAC address assigned to user.  RedCreek Ravlin 45/PCI 
-    ** has two MAC addresses.  One which is private to the PCI Card, and 
-    ** another MAC which is given to the user as its link layer MAC address. The
-    ** adapter runs in promiscous mode because of the dual address requirement.
-    ** The MAC address is returned to the unsigned char array pointer to by mac.
-  */
-RC_RETURN RCGetMAC (struct net_device *dev, PFNWAITCALLBACK WaitCallback);
-
- /*
-    ** RCSetMAC()
-    **
-    ** Set a new user port MAC address.  This address will be returned on
-    ** subsequent RCGetMAC() calls.
-  */
-RC_RETURN RCSetMAC (struct net_device *dev, PU8 mac);
-
- /*
-    ** RCSetLinkSpeed()
-    **
-    ** set adapter's link speed based on given input code.
-  */
-RC_RETURN RCSetLinkSpeed (struct net_device *dev, U16 LinkSpeedCode);
- /* Set link speed codes */
-#define LNK_SPD_AUTO_NEG_NWAY   0
-#define LNK_SPD_100MB_FULL      1
-#define LNK_SPD_100MB_HALF      2
-#define LNK_SPD_10MB_FULL       3
-#define LNK_SPD_10MB_HALF       4
-
- /*
-    ** RCGetLinkSpeed()
-    **
-    ** Return link speed code.
-  */
- /* Return link speed codes */
-#define LNK_SPD_UNKNOWN         0
-#define LNK_SPD_100MB_FULL      1
-#define LNK_SPD_100MB_HALF      2
-#define LNK_SPD_10MB_FULL       3
-#define LNK_SPD_10MB_HALF       4
-
-RC_RETURN
-RCGetLinkSpeed (struct net_device *dev, PU32 pLinkSpeedCode,
-		PFNWAITCALLBACK WaitCallback);
-/*
-** =========================================================================
-** RCSetPromiscuousMode(struct net_device *dev, U16 Mode)
-**
-** Defined values for Mode:
-**  0 - turn off promiscuous mode
-**  1 - turn on  promiscuous mode
-**
-** =========================================================================
-*/
-#define PROMISCUOUS_MODE_OFF 0
-#define PROMISCUOUS_MODE_ON  1
-RC_RETURN RCSetPromiscuousMode (struct net_device *dev, U16 Mode);
-/*
-** =========================================================================
-** RCGetPromiscuousMode(struct net_device *dev, PU32 pMode, PFNWAITCALLBACK WaitCallback)
-**
-** get promiscuous mode setting
-**
-** Possible return values placed in pMode:
-**  0 = promisuous mode not set
-**  1 = promisuous mode is set
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetPromiscuousMode (struct net_device *dev, PU32 pMode,
-		      PFNWAITCALLBACK WaitCallback);
-
-/*
-** =========================================================================
-** RCSetBroadcastMode(struct net_device *dev, U16 Mode)
-**
-** Defined values for Mode:
-**  0 - turn off promiscuous mode
-**  1 - turn on  promiscuous mode
-**
-** =========================================================================
-*/
-#define BROADCAST_MODE_OFF 0
-#define BROADCAST_MODE_ON  1
-RC_RETURN RCSetBroadcastMode (struct net_device *dev, U16 Mode);
-/*
-** =========================================================================
-** RCGetBroadcastMode(struct net_device *dev, PU32 pMode, PFNWAITCALLBACK WaitCallback)
-**
-** get broadcast mode setting
-**
-** Possible return values placed in pMode:
-**  0 = broadcast mode not set
-**  1 = broadcast mode is set
-**
-** =========================================================================
-*/
-RC_RETURN
-RCGetBroadcastMode (struct net_device *dev, PU32 pMode,
-		    PFNWAITCALLBACK WaitCallback);
-/*
-** =========================================================================
-** RCReportDriverCapability(struct net_device *dev, U32 capability)
-**
-** Currently defined bits:
-** WARM_REBOOT_CAPABLE   0x01
-**
-** =========================================================================
-*/
-RC_RETURN RCReportDriverCapability (struct net_device *dev, U32 capability);
-
-/*
-** RCGetFirmwareVer()
-**
-** Return firmware version in the form "SoftwareVersion : Bt BootVersion"
-**
-** WARNING: user's space pointed to by pFirmString should be at least 60 bytes.
-*/
-RC_RETURN
-RCGetFirmwareVer (struct net_device *dev, PU8 pFirmString,
-		  PFNWAITCALLBACK WaitCallback);
-
-/*
-** ----------------------------------------------
-** LAN adapter Reset and Shutdown functions
-** ----------------------------------------------
-*/
- /* resource flag bit assignments for RCResetLANCard() & RCShutdownLANCard() */
-#define RC_RESOURCE_RETURN_POSTED_RX_BUCKETS  0x0001
-#define RC_RESOURCE_RETURN_PEND_TX_BUFFERS    0x0002
-
- /*
-    ** RCResetLANCard()
-    **
-    ** Reset LAN card operation.  Causes a software reset of the ethernet
-    ** controller and restarts the command and receive units. Depending on 
-    ** the ResourceFlags given, the buffers are either returned to the
-    ** host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER and
-    ** detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
-    ** posted after issuing this) OR the buffers are kept and reused by
-    ** the ethernet controller. If CallbackFunction is not NULL, the function
-    ** will be called when the reset is complete.  If the CallbackFunction is
-    ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset 
-    ** to complete (please disable I2O interrupts during this method).
-    ** Any outstanding transmit or receive buffers that are complete will be
-    ** returned via the normal reply messages before the requested resource
-    ** buffers are returned.
-    ** A call to RCPostRecvBuffers() is needed to return the ethernet to full
-    ** operation if the receive buffers were returned during LANReset.
-    ** Note: The IOP status is not affected by a LAN reset.
-  */
-RC_RETURN RCResetLANCard (struct net_device *dev, U16 ResourceFlags,
-			  PU32 ReturnAddr, PFNCALLBACK CallbackFunction);
-
- /*
-    ** RCShutdownLANCard()
-    **
-    ** Shutdown LAN card operation and put into an idle (suspended) state.
-    ** The LAN card is restarted with RCResetLANCard() function.
-    ** Depending on the ResourceFlags given, the buffers are either returned 
-    ** to the host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 
-    ** and detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
-    ** posted after issuing this) OR the buffers are kept and reused by
-    ** the ethernet controller. If CallbackFunction is not NULL, the function
-    ** will be called when the reset is complete.  If the CallbackFunction is
-    ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset 
-    ** to complete (please disable I2O interrupts during this method).
-    ** Any outstanding transmit or receive buffers that are complete will be
-    ** returned via the normal reply messages before the requested resource
-    ** buffers are returned.
-    ** Note: The IOP status is not affected by a LAN shutdown.
-  */
-RC_RETURN
-RCShutdownLANCard (struct net_device *dev, U16 ResourceFlags, PU32 ReturnAddr,
-		   PFNCALLBACK CallbackFunction);
-
- /*
-    ** RCResetIOP();
-    **     Initializes IOPState to I2O_IOP_STATE_RESET.
-    **     Stops access to outbound message Q.
-    **     Discards any outstanding transmit or posted receive buffers.
-    **     Clears outbound message Q. 
-  */
-RC_RETURN RCResetIOP (struct net_device *dev);
-
-#endif				/* RCLANMTL_H */
diff -Nru a/drivers/net/rcpci45.c b/drivers/net/rcpci45.c
--- a/drivers/net/rcpci45.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1049 +0,0 @@
-/* 
-**
-**  RCpci45.c  
-**
-**
-**
-**  ---------------------------------------------------------------------
-**  ---     Copyright (c) 1998, 1999, RedCreek Communications Inc.    ---
-**  ---                   All rights reserved.                        ---
-**  ---------------------------------------------------------------------
-**
-** Written by Pete Popov and Brian Moyle.
-**
-** Known Problems
-** 
-** None known at this time.
-**
-**  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.
-
-**  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., 675 Mass Ave, Cambridge, MA 02139, USA.
-**
-**  Francois Romieu, Apr 2003: Converted to pci DMA mapping API.
-**
-**  Pete Popov, Oct 2001: Fixed a few bugs to make the driver functional
-**  again. Note that this card is not supported or manufactured by 
-**  RedCreek anymore.
-**   
-**  Rasmus Andersen, December 2000: Converted to new PCI API and general
-**  cleanup.
-**
-**  Pete Popov, January 11,99: Fixed a couple of 2.1.x problems 
-**  (virt_to_bus() not called), tested it under 2.2pre5 (as a module), and 
-**  added a #define(s) to enable the use of the same file for both, the 2.0.x 
-**  kernels as well as the 2.1.x.
-**
-**  Ported to 2.1.x by Alan Cox 1998/12/9. 
-**
-**  Sometime in mid 1998, written by Pete Popov and Brian Moyle.
-**
-***************************************************************************/
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/in.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/pci.h>
-#include <linux/timer.h>
-
-#include <asm/irq.h>		/* For NR_IRQS only. */
-#include <asm/bitops.h>
-#include <asm/uaccess.h>
-
-static char version[] __initdata =
-    "RedCreek Communications PCI linux driver version 2.21\n";
-
-#define RC_LINUX_MODULE
-#include "rclanmtl.h"
-#include "rcif.h"
-
-#define RUN_AT(x) (jiffies + (x))
-
-#define NEW_MULTICAST
-
-#define MAX_ETHER_SIZE        1520
-#define MAX_NMBR_RCV_BUFFERS    96
-#define RC_POSTED_BUFFERS_LOW_MARK MAX_NMBR_RCV_BUFFERS-16
-#define BD_SIZE 3		/* Bucket Descriptor size */
-#define BD_LEN_OFFSET 2		/* Bucket Descriptor offset to length field */
-
-/* RedCreek LAN device Target ID */
-#define RC_LAN_TARGET_ID  0x10
-/* RedCreek's OSM default LAN receive Initiator */
-#define DEFAULT_RECV_INIT_CONTEXT  0xA17
-
-/* minimum msg buffer size needed by the card 
- * Note that the size of this buffer is hard code in the
- * ipsec card's firmware. Thus, the size MUST be a minimum
- * of 16K. Otherwise the card will end up using memory
- * that does not belong to it.
- */
-#define MSG_BUF_SIZE  16384
-
-/* 2003/04/20: I don't know about the hardware ability but the driver won't
- * play safe with 64 bit addressing and DAC without NETIF_F_HIGHDMA doesn't
- * really make sense anyway. Let's play safe - romieu.
- */
-#define RCPCI45_DMA_MASK	((u64) 0xffffffff)
-
-static U32 DriverControlWord;
-
-static void rc_timer (unsigned long);
-
-static int RCopen (struct net_device *);
-static int RC_xmit_packet (struct sk_buff *, struct net_device *);
-static irqreturn_t RCinterrupt (int, void *, struct pt_regs *);
-static int RCclose (struct net_device *dev);
-static struct net_device_stats *RCget_stats (struct net_device *);
-static int RCioctl (struct net_device *, struct ifreq *, int);
-static int RCconfig (struct net_device *, struct ifmap *);
-static void RCxmit_callback (U32, U16, PU32, struct net_device *);
-static void RCrecv_callback (U32, U8, U32, PU32, struct net_device *);
-static void RCreset_callback (U32, U32, U32, struct net_device *);
-static void RCreboot_callback (U32, U32, U32, struct net_device *);
-static int RC_allocate_and_post_buffers (struct net_device *, int);
-
-static struct pci_device_id rcpci45_pci_table[] = {
-	{ PCI_VENDOR_ID_REDCREEK, PCI_DEVICE_ID_RC45, PCI_ANY_ID, PCI_ANY_ID,},
-	{}
-};
-MODULE_DEVICE_TABLE (pci, rcpci45_pci_table);
-MODULE_LICENSE("GPL");
-
-static void __devexit
-rcpci45_remove_one (struct pci_dev *pdev)
-{
-	struct net_device *dev = pci_get_drvdata (pdev);
-	PDPA pDpa = dev->priv;
-
-	RCResetIOP (dev);
-	unregister_netdev (dev);
-	free_irq (dev->irq, dev);
-	iounmap ((void *) dev->base_addr);
-	pci_release_regions (pdev);
-	pci_free_consistent (pdev, MSG_BUF_SIZE, pDpa->msgbuf,
-			     pDpa->msgbuf_dma);
-	if (pDpa->pPab)
-		kfree (pDpa->pPab);
-	free_netdev (dev);
-	pci_set_drvdata (pdev, NULL);
-}
-
-static int
-rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
-{
-	unsigned long *vaddr;
-	PDPA pDpa;
-	int error;
-	static int card_idx = -1;
-	struct net_device *dev;
-	unsigned long pci_start, pci_len;
-
-	card_idx++;
-
-	/* 
-	 * Allocate and fill new device structure. 
-	 * We need enough for struct net_device plus DPA plus the LAN 
-	 * API private area, which requires a minimum of 16KB.  The top 
-	 * of the allocated area will be assigned to struct net_device; 
-	 * the next chunk will be assigned to DPA; and finally, the rest 
-	 * will be assigned to the LAN API layer.
-	 */
-
-	dev = alloc_etherdev(sizeof(*pDpa));
-	if (!dev) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) alloc_etherdev alloc failed\n");
-		error = -ENOMEM;
-		goto err_out;
-	}
-
-	SET_MODULE_OWNER(dev);
-	SET_NETDEV_DEV(dev, &pdev->dev);
-
-	error = pci_enable_device (pdev);
-	if (error) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) %d: pci enable device error\n",
-			card_idx);
-		goto err_out;
-	}
-	pci_start = pci_resource_start (pdev, 0);
-	pci_len = pci_resource_len (pdev, 0);
-	printk("pci_start %lx pci_len %lx\n", pci_start, pci_len);
-
-	pci_set_drvdata (pdev, dev);
-
-	pDpa = dev->priv;
-	pDpa->id = card_idx;
-	pDpa->pci_dev = pdev;
-	pDpa->pci_addr = pci_start;
-
-	if (!pci_start || !(pci_resource_flags (pdev, 0) & IORESOURCE_MEM)) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) No PCI mem resources! Aborting\n");
-		error = -EBUSY;
-		goto err_out_free_dev;
-	}
-
-	/*
-	 * pDpa->msgbuf is where the card will dma the I2O 
-	 * messages. Thus, we need contiguous physical pages of memory.
-	 * 2003/04/20:  pci_alloc_consistent() provides well over the needed
-	 * alignment on a 256 bytes boundary for the LAN API private area.
-	 * Thus it isn't needed anymore to align it by hand.
-         */
-	pDpa->msgbuf = pci_alloc_consistent (pdev, MSG_BUF_SIZE,
-					     &pDpa->msgbuf_dma);
-	if (!pDpa->msgbuf) {
-		printk (KERN_ERR "(rcpci45 driver:) \
-			Could not allocate %d byte memory for the \
-				private msgbuf!\n", MSG_BUF_SIZE);
-		error = -ENOMEM;
-		goto err_out_free_dev;
-	}
-
-	/* The adapter is accessible through memory-access read/write, not
-	 * I/O read/write.  Thus, we need to map it to some virtual address
-	 * area in order to access the registers as normal memory.
-	 */
-	error = pci_request_regions (pdev, dev->name);
-	if (error)
-		goto err_out_free_msgbuf;
-
-	error = pci_set_dma_mask (pdev, RCPCI45_DMA_MASK);
-	if (error) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) pci_set_dma_mask failed!\n");
-		goto err_out_free_region;
-	}
-
-	vaddr = (ulong *) ioremap (pci_start, pci_len);
-	if (!vaddr) {
-		printk (KERN_ERR
-			"(rcpci45 driver:) \
-			Unable to remap address range from %lu to %lu\n",
-			pci_start, pci_start + pci_len);
-		error = -EIO;
-		goto err_out_free_region;
-	}
-
-	dev->base_addr = (unsigned long) vaddr;
-	dev->irq = pdev->irq;
-	dev->open = &RCopen;
-	dev->hard_start_xmit = &RC_xmit_packet;
-	dev->stop = &RCclose;
-	dev->get_stats = &RCget_stats;
-	dev->do_ioctl = &RCioctl;
-	dev->set_config = &RCconfig;
-
-	if ((error = register_netdev(dev)))
-		goto err_out_iounmap;
-
-	return 0;		/* success */
-
-err_out_iounmap:
-	iounmap((void *) dev->base_addr);
-err_out_free_region:
-	pci_release_regions (pdev);
-err_out_free_msgbuf:
-	pci_free_consistent (pdev, MSG_BUF_SIZE, pDpa->msgbuf,
-			     pDpa->msgbuf_dma);
-err_out_free_dev:
-	free_netdev (dev);
-err_out:
-	card_idx--;
-	return error;
-}
-
-static struct pci_driver rcpci45_driver = {
-	.name		= "rcpci45",
-	.id_table	= rcpci45_pci_table,
-	.probe		= rcpci45_init_one,
-	.remove		= __devexit_p(rcpci45_remove_one),
-};
-
-static int __init
-rcpci_init_module (void)
-{
-	int rc = pci_module_init (&rcpci45_driver);
-	if (!rc)
-		printk (KERN_ERR "%s", version);
-	return rc;
-}
-
-static int
-RCopen (struct net_device *dev)
-{
-	int post_buffers = MAX_NMBR_RCV_BUFFERS;
-	PDPA pDpa = dev->priv;
-	int count = 0;
-	int requested = 0;
-	int error;
-
-	if (pDpa->nexus) {
-		/* This is not the first time RCopen is called.  Thus,
-		 * the interface was previously opened and later closed
-		 * by RCclose().  RCclose() does a Shutdown; to wake up
-		 * the adapter, a reset is mandatory before we can post
-		 * receive buffers.  However, if the adapter initiated 
-		 * a reboot while the interface was closed -- and interrupts
-		 * were turned off -- we need will need to reinitialize
-		 * the adapter, rather than simply waking it up.  
-		 */
-		printk (KERN_INFO "Waking up adapter...\n");
-		RCResetLANCard (dev, 0, 0, 0);
-	} else {
-		pDpa->nexus = 1;
-		/* 
-		 * RCInitI2OMsgLayer is done only once, unless the
-		 * adapter was sent a warm reboot
-		 */
-		error = RCInitI2OMsgLayer (dev, (PFNTXCALLBACK) RCxmit_callback,
-					   (PFNRXCALLBACK) RCrecv_callback,
-					   (PFNCALLBACK) RCreboot_callback);
-		if (error) {
-			printk (KERN_ERR "%s: Unable to init msg layer (%x)\n",
-					dev->name, error);
-			goto err_out;
-		}
-		if ((error = RCGetMAC (dev, NULL))) {
-			printk (KERN_ERR "%s: Unable to get adapter MAC\n",
-					dev->name);
-			goto err_out;
-		}
-	}
-
-	/* Request a shared interrupt line. */
-	error = request_irq (dev->irq, RCinterrupt, SA_SHIRQ, dev->name, dev);
-	if (error) {
-		printk (KERN_ERR "%s: unable to get IRQ %d\n", 
-				dev->name, dev->irq);
-		goto err_out;
-	}
-
-	DriverControlWord |= WARM_REBOOT_CAPABLE;
-	RCReportDriverCapability (dev, DriverControlWord);
-
-	printk (KERN_INFO "%s: RedCreek Communications IPSEC VPN adapter\n",
-		dev->name);
-
-	RCEnableI2OInterrupts (dev);
-
-	while (post_buffers) {
-		if (post_buffers > MAX_NMBR_POST_BUFFERS_PER_MSG)
-			requested = MAX_NMBR_POST_BUFFERS_PER_MSG;
-		else
-			requested = post_buffers;
-		count = RC_allocate_and_post_buffers (dev, requested);
-
-		if (count < requested) {
-			/*
-			 * Check to see if we were able to post 
-			 * any buffers at all.
-			 */
-			if (post_buffers == MAX_NMBR_RCV_BUFFERS) {
-				printk (KERN_ERR "%s: \
-					unable to allocate any buffers\n", 
-						dev->name);
-				goto err_out_free_irq;
-			}
-			printk (KERN_WARNING "%s: \
-			unable to allocate all requested buffers\n", dev->name);
-			break;	/* we'll try to post more buffers later */
-		} else
-			post_buffers -= count;
-	}
-	pDpa->numOutRcvBuffers = MAX_NMBR_RCV_BUFFERS - post_buffers;
-	pDpa->shutdown = 0;	/* just in case */
-	netif_start_queue (dev);
-	return 0;
-
-err_out_free_irq:
-	free_irq (dev->irq, dev);
-err_out:
-	return error;
-}
-
-static int
-RC_xmit_packet (struct sk_buff *skb, struct net_device *dev)
-{
-
-	PDPA pDpa = dev->priv;
-	singleTCB tcb;
-	psingleTCB ptcb = &tcb;
-	RC_RETURN status = 0;
-
-	netif_stop_queue (dev);
-
-	if (pDpa->shutdown || pDpa->reboot) {
-		printk ("RC_xmit_packet: tbusy!\n");
-		return 1;
-	}
-
-	/*
-	 * The user is free to reuse the TCB after RCI2OSendPacket() 
-	 * returns, since the function copies the necessary info into its 
-	 * own private space.  Thus, our TCB can be a local structure.  
-	 * The skb, on the other hand, will be freed up in our interrupt 
-	 * handler.
-	 */
-
-	ptcb->bcount = 1;
-
-	/* 
-	 * we'll get the context when the adapter interrupts us to tell us that
-	 * the transmission is done. At that time, we can free skb.
-	 */
-	ptcb->b.context = (U32) skb;
-	ptcb->b.scount = 1;
-	ptcb->b.size = skb->len;
-	ptcb->b.addr = pci_map_single(pDpa->pci_dev, skb->data, skb->len,
-				      PCI_DMA_TODEVICE);
-
-	if ((status = RCI2OSendPacket (dev, (U32) NULL, (PRCTCB) ptcb))
-	    != RC_RTN_NO_ERROR) {
-		printk ("%s: send error 0x%x\n", dev->name, (uint) status);
-		return 1;
-	} else {
-		dev->trans_start = jiffies;
-		netif_wake_queue (dev);
-	}
-	/*
-	 * That's it!
-	 */
-	return 0;
-}
-
-/*
- * RCxmit_callback()
- *
- * The transmit callback routine. It's called by RCProcI2OMsgQ()
- * because the adapter is done with one or more transmit buffers and
- * it's returning them to us, or we asked the adapter to return the
- * outstanding transmit buffers by calling RCResetLANCard() with 
- * RC_RESOURCE_RETURN_PEND_TX_BUFFERS flag. 
- * All we need to do is free the buffers.
- */
-static void
-RCxmit_callback (U32 Status,
-		 U16 PcktCount, PU32 BufferContext, struct net_device *dev)
-{
-	struct sk_buff *skb;
-	PDPA pDpa = dev->priv;
-
-	if (!pDpa) {
-		printk (KERN_ERR "%s: Fatal Error in xmit callback, !pDpa\n",
-				dev->name);
-		return;
-	}
-
-	if (Status != I2O_REPLY_STATUS_SUCCESS)
-		printk (KERN_INFO "%s: xmit_callback: Status = 0x%x\n", 
-				dev->name, (uint) Status);
-	if (pDpa->shutdown || pDpa->reboot)
-		printk (KERN_INFO "%s: xmit callback: shutdown||reboot\n",
-				dev->name);
-
-	while (PcktCount--) {
-		skb = (struct sk_buff *) (BufferContext[0]);
-		BufferContext++;
-		pci_unmap_single(pDpa->pci_dev, BufferContext[1], skb->len,
-				 PCI_DMA_TODEVICE);
-		dev_kfree_skb_irq (skb);
-	}
-	netif_wake_queue (dev);
-}
-
-static void
-RCreset_callback (U32 Status, U32 p1, U32 p2, struct net_device *dev)
-{
-	PDPA pDpa = dev->priv;
-
-	printk ("RCreset_callback Status 0x%x\n", (uint) Status);
-	/*
-	 * Check to see why we were called.
-	 */
-	if (pDpa->shutdown) {
-		printk (KERN_INFO "%s: shutting down interface\n",
-				dev->name);
-		pDpa->shutdown = 0;
-		pDpa->reboot = 0;
-	} else if (pDpa->reboot) {
-		printk (KERN_INFO "%s: reboot, shutdown adapter\n",
-				dev->name);
-		/*
-		 * We don't set any of the flags in RCShutdownLANCard()
-		 * and we don't pass a callback routine to it.
-		 * The adapter will have already initiated the reboot by
-		 * the time the function returns.
-		 */
-		RCDisableI2OInterrupts (dev);
-		RCShutdownLANCard (dev, 0, 0, 0);
-		printk (KERN_INFO "%s: scheduling timer...\n", dev->name);
-		init_timer (&pDpa->timer);
-		pDpa->timer.expires = RUN_AT ((40 * HZ) / 10);	/* 4 sec. */
-		pDpa->timer.data = (unsigned long) dev;
-		pDpa->timer.function = &rc_timer;	/* timer handler */
-		add_timer (&pDpa->timer);
-	}
-}
-
-static void
-RCreboot_callback (U32 Status, U32 p1, U32 p2, struct net_device *dev)
-{
-	PDPA pDpa = dev->priv;
-
-	printk (KERN_INFO "%s: reboot: rcv buffers outstanding = %d\n",
-		 dev->name, (uint) pDpa->numOutRcvBuffers);
-
-	if (pDpa->shutdown) {
-		printk (KERN_INFO "%s: skip reboot, shutdown initiated\n",
-				dev->name);
-		return;
-	}
-	pDpa->reboot = 1;
-	/*
-	 * OK, we reset the adapter and ask it to return all
-	 * outstanding transmit buffers as well as the posted
-	 * receive buffers.  When the adapter is done returning
-	 * those buffers, it will call our RCreset_callback() 
-	 * routine.  In that routine, we'll call RCShutdownLANCard()
-	 * to tell the adapter that it's OK to start the reboot and
-	 * schedule a timer callback routine to execute 3 seconds 
-	 * later; this routine will reinitialize the adapter at that time.
-	 */
-	RCResetLANCard (dev, RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
-			RC_RESOURCE_RETURN_PEND_TX_BUFFERS, 0,
-			(PFNCALLBACK) RCreset_callback);
-}
-
-/*
- * RCrecv_callback()
- * 
- * The receive packet callback routine.  This is called by
- * RCProcI2OMsgQ() after the adapter posts buffers which have been
- * filled (one ethernet packet per buffer).
- */
-static void
-RCrecv_callback (U32 Status,
-		 U8 PktCount,
-		 U32 BucketsRemain,
-		 PU32 PacketDescBlock, struct net_device *dev)
-{
-
-	U32 len, count;
-	PDPA pDpa = dev->priv;
-	struct sk_buff *skb;
-	singleTCB tcb;
-	psingleTCB ptcb = &tcb;
-
-	ptcb->bcount = 1;
-
-	if ((pDpa->shutdown || pDpa->reboot) && !Status)
-		printk (KERN_INFO "%s: shutdown||reboot && !Status (%d)\n",
-				dev->name, PktCount);
-
-	if ((Status != I2O_REPLY_STATUS_SUCCESS) || pDpa->shutdown) {
-		/*
-		 * Free whatever buffers the adapter returned, but don't
-		 * pass them to the kernel.
-		 */
-
-		if (!pDpa->shutdown && !pDpa->reboot)
-			printk (KERN_INFO "%s: recv error status = 0x%x\n",
-					dev->name, (uint) Status);
-		else
-			printk (KERN_DEBUG "%s: Returning %d buffs stat 0x%x\n",
-					dev->name, PktCount, (uint) Status);
-		/*
-		 * TO DO: check the nature of the failure and put the 
-		 * adapter in failed mode if it's a hard failure.  
-		 * Send a reset to the adapter and free all outstanding memory.
-		 */
-		if (PacketDescBlock) {
-			while (PktCount--) {
-				skb = (struct sk_buff *) PacketDescBlock[0];
-				dev_kfree_skb (skb);
-				pDpa->numOutRcvBuffers--;
-				/* point to next context field */
-				PacketDescBlock += BD_SIZE;
-			}
-		}
-		return;
-	} else {
-		while (PktCount--) {
-			skb = (struct sk_buff *) PacketDescBlock[0];
-			len = PacketDescBlock[2];
-			skb->dev = dev;
-			skb_put (skb, len);	/* adjust length and tail */
-			skb->protocol = eth_type_trans (skb, dev);
-			netif_rx (skb);	/* send the packet to the kernel */
-			dev->last_rx = jiffies;
-			pDpa->numOutRcvBuffers--;	
-			/* point to next context field */
-			PacketDescBlock += BD_SIZE;
-		}
-	}
-
-	/*
-	 * Replenish the posted receive buffers. 
-	 * DO NOT replenish buffers if the driver has already
-	 * initiated a reboot or shutdown!
-	 */
-
-	if (!pDpa->shutdown && !pDpa->reboot) {
-		count = RC_allocate_and_post_buffers (dev,
-						      MAX_NMBR_RCV_BUFFERS -
-						      pDpa->numOutRcvBuffers);
-		pDpa->numOutRcvBuffers += count;
-	}
-
-}
-
-/*
- * RCinterrupt()
- * 
- * Interrupt handler. 
- * This routine sets up a couple of pointers and calls
- * RCProcI2OMsgQ(), which in turn process the message and
- * calls one of our callback functions.
- */
-static irqreturn_t
-RCinterrupt (int irq, void *dev_id, struct pt_regs *regs)
-{
-
-	PDPA pDpa;
-	struct net_device *dev = dev_id;
-
-	pDpa = dev->priv;
-
-	if (pDpa->shutdown)
-		printk (KERN_DEBUG "%s: shutdown, service irq\n",
-				dev->name);
-
-	return RCProcI2OMsgQ (dev);
-}
-
-#define REBOOT_REINIT_RETRY_LIMIT 4
-static void
-rc_timer (unsigned long data)
-{
-	struct net_device *dev = (struct net_device *) data;
-	PDPA pDpa = dev->priv;
-	int init_status;
-	static int retry;
-	int post_buffers = MAX_NMBR_RCV_BUFFERS;
-	int count = 0;
-	int requested = 0;
-
-	if (pDpa->reboot) {
-		init_status =
-		    RCInitI2OMsgLayer (dev, (PFNTXCALLBACK) RCxmit_callback,
-				       (PFNRXCALLBACK) RCrecv_callback,
-				       (PFNCALLBACK) RCreboot_callback);
-
-		switch (init_status) {
-		case RC_RTN_NO_ERROR:
-
-			pDpa->reboot = 0;
-			pDpa->shutdown = 0;	/* just in case */
-			RCReportDriverCapability (dev, DriverControlWord);
-			RCEnableI2OInterrupts (dev);
-
-
-			if (!(dev->flags & IFF_UP)) {
-				retry = 0;
-				return;
-			}
-			while (post_buffers) {
-				if (post_buffers > 
-						MAX_NMBR_POST_BUFFERS_PER_MSG)
-					requested = 
-						MAX_NMBR_POST_BUFFERS_PER_MSG;
-				else
-					requested = post_buffers;
-				count =
-				    RC_allocate_and_post_buffers (dev,
-								  requested);
-				post_buffers -= count;
-				if (count < requested)
-					break;
-			}
-			pDpa->numOutRcvBuffers =
-			    MAX_NMBR_RCV_BUFFERS - post_buffers;
-			printk ("Initialization done.\n");
-			netif_wake_queue (dev);
-			retry = 0;
-			return;
-		case RC_RTN_FREE_Q_EMPTY:
-			retry++;
-			printk (KERN_WARNING "%s inbound free q empty\n",
-					dev->name);
-			break;
-		default:
-			retry++;
-			printk (KERN_WARNING "%s bad stat after reboot: %d\n",
-					dev->name, init_status);
-			break;
-		}
-
-		if (retry > REBOOT_REINIT_RETRY_LIMIT) {
-			printk (KERN_WARNING "%s unable to reinitialize adapter after reboot\n", dev->name);
-			printk (KERN_WARNING "%s shutting down interface\n", dev->name);
-			RCDisableI2OInterrupts (dev);
-			dev->flags &= ~IFF_UP;
-		} else {
-			printk (KERN_INFO "%s: rescheduling timer...\n",
-					dev->name);
-			init_timer (&pDpa->timer);
-			pDpa->timer.expires = RUN_AT ((40 * HZ) / 10);
-			pDpa->timer.data = (unsigned long) dev;
-			pDpa->timer.function = &rc_timer;
-			add_timer (&pDpa->timer);
-		}
-	} else
-		printk (KERN_WARNING "%s: unexpected timer irq\n", dev->name);
-}
-
-static int
-RCclose (struct net_device *dev)
-{
-	PDPA pDpa = dev->priv;
-
-	printk("RCclose\n");
-	netif_stop_queue (dev);
-
-	if (pDpa->reboot) {
-		printk (KERN_INFO "%s skipping reset -- adapter already in reboot mode\n", dev->name);
-		dev->flags &= ~IFF_UP;
-		pDpa->shutdown = 1;
-		return 0;
-	}
-
-	pDpa->shutdown = 1;
-
-	/*
-	 * We can't allow the driver to be unloaded until the adapter returns
-	 * all posted receive buffers.  It doesn't hurt to tell the adapter
-	 * to return all posted receive buffers and outstanding xmit buffers,
-	 * even if there are none.
-	 */
-
-	RCShutdownLANCard (dev, RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
-			   RC_RESOURCE_RETURN_PEND_TX_BUFFERS, 0,
-			   (PFNCALLBACK) RCreset_callback);
-
-	dev->flags &= ~IFF_UP;
-	return 0;
-}
-
-static struct net_device_stats *
-RCget_stats (struct net_device *dev)
-{
-	RCLINKSTATS RCstats;
-
-	PDPA pDpa = dev->priv;
-
-	if (!pDpa) {
-		return 0;
-	} else if (!(dev->flags & IFF_UP)) {
-		return 0;
-	}
-
-	memset (&RCstats, 0, sizeof (RCLINKSTATS));
-	if ((RCGetLinkStatistics (dev, &RCstats, (void *) 0)) ==
-	    RC_RTN_NO_ERROR) {
-
-		/* total packets received    */
-		pDpa->stats.rx_packets = RCstats.Rcv_good
-		/* total packets transmitted    */;
-		pDpa->stats.tx_packets = RCstats.TX_good;
-
-		pDpa->stats.rx_errors = RCstats.Rcv_CRCerr + 
-			RCstats.Rcv_alignerr + RCstats.Rcv_reserr + 
-			RCstats.Rcv_orun + RCstats.Rcv_cdt + RCstats.Rcv_runt;
-
-		pDpa->stats.tx_errors = RCstats.TX_urun + RCstats.TX_crs + 
-			RCstats.TX_def + RCstats.TX_totcol;
-
-		/*
-		 * This needs improvement.
-		 */
-		pDpa->stats.rx_dropped = 0; /* no space in linux buffers   */
-		pDpa->stats.tx_dropped = 0; /* no space available in linux */
-		pDpa->stats.multicast = 0;  /* multicast packets received  */
-		pDpa->stats.collisions = RCstats.TX_totcol;
-
-		/* detailed rx_errors: */
-		pDpa->stats.rx_length_errors = 0;
-		pDpa->stats.rx_over_errors = RCstats.Rcv_orun;
-		pDpa->stats.rx_crc_errors = RCstats.Rcv_CRCerr;
-		pDpa->stats.rx_frame_errors = 0;
-		pDpa->stats.rx_fifo_errors = 0;	
-		pDpa->stats.rx_missed_errors = 0;
-
-		/* detailed tx_errors */
-		pDpa->stats.tx_aborted_errors = 0;
-		pDpa->stats.tx_carrier_errors = 0;
-		pDpa->stats.tx_fifo_errors = 0;
-		pDpa->stats.tx_heartbeat_errors = 0;
-		pDpa->stats.tx_window_errors = 0;
-
-		return ((struct net_device_stats *) &(pDpa->stats));
-	}
-	return 0;
-}
-
-static int
-RCioctl (struct net_device *dev, struct ifreq *rq, int cmd)
-{
-	RCuser_struct RCuser;
-	PDPA pDpa = dev->priv;
-
-	if (!capable (CAP_NET_ADMIN))
-		return -EPERM;
-
-	switch (cmd) {
-
-	case RCU_PROTOCOL_REV:
-		/*
-		 * Assign user protocol revision, to tell user-level
-		 * controller program whether or not it's in sync.
-		 */
-		rq->ifr_ifru.ifru_data = (caddr_t) USER_PROTOCOL_REV;
-		break;
-
-	case RCU_COMMAND:
-		{
-			if (copy_from_user
-			    (&RCuser, rq->ifr_data, sizeof (RCuser)))
-				return -EFAULT;
-
-			dprintk ("RCioctl: RCuser_cmd = 0x%x\n", RCuser.cmd);
-
-			switch (RCuser.cmd) {
-			case RCUC_GETFWVER:
-				RCUD_GETFWVER = &RCuser.RCUS_GETFWVER;
-				RCGetFirmwareVer (dev,
-						  (PU8) & RCUD_GETFWVER->
-						  FirmString, NULL);
-				break;
-			case RCUC_GETINFO:
-				RCUD_GETINFO = &RCuser.RCUS_GETINFO;
-				RCUD_GETINFO->mem_start = dev->base_addr;
-				RCUD_GETINFO->mem_end =
-				    dev->base_addr + pDpa->pci_addr_len;
-				RCUD_GETINFO->base_addr = pDpa->pci_addr;
-				RCUD_GETINFO->irq = dev->irq;
-				break;
-			case RCUC_GETIPANDMASK:
-				RCUD_GETIPANDMASK = &RCuser.RCUS_GETIPANDMASK;
-				RCGetRavlinIPandMask (dev,
-						      (PU32) &
-						      RCUD_GETIPANDMASK->IpAddr,
-						      (PU32) &
-						      RCUD_GETIPANDMASK->
-						      NetMask, NULL);
-				break;
-			case RCUC_GETLINKSTATISTICS:
-				RCUD_GETLINKSTATISTICS =
-				    &RCuser.RCUS_GETLINKSTATISTICS;
-				RCGetLinkStatistics (dev,
-						     (P_RCLINKSTATS) &
-						     RCUD_GETLINKSTATISTICS->
-						     StatsReturn, NULL);
-				break;
-			case RCUC_GETLINKSTATUS:
-				RCUD_GETLINKSTATUS = &RCuser.RCUS_GETLINKSTATUS;
-				RCGetLinkStatus (dev,
-						 (PU32) & RCUD_GETLINKSTATUS->
-						 ReturnStatus, NULL);
-				break;
-			case RCUC_GETMAC:
-				RCUD_GETMAC = &RCuser.RCUS_GETMAC;
-				RCGetMAC (dev, NULL);
-				memcpy(RCUD_GETMAC, dev->dev_addr, 8);
-				break;
-			case RCUC_GETPROM:
-				RCUD_GETPROM = &RCuser.RCUS_GETPROM;
-				RCGetPromiscuousMode (dev,
-						      (PU32) & RCUD_GETPROM->
-						      PromMode, NULL);
-				break;
-			case RCUC_GETBROADCAST:
-				RCUD_GETBROADCAST = &RCuser.RCUS_GETBROADCAST;
-				RCGetBroadcastMode (dev,
-						    (PU32) & RCUD_GETBROADCAST->
-						    BroadcastMode, NULL);
-				break;
-			case RCUC_GETSPEED:
-				if (!(dev->flags & IFF_UP)) {
-					return -ENODATA;
-				}
-				RCUD_GETSPEED = &RCuser.RCUS_GETSPEED;
-				RCGetLinkSpeed (dev,
-						(PU32) & RCUD_GETSPEED->
-						LinkSpeedCode, NULL);
-				break;
-			case RCUC_SETIPANDMASK:
-				RCUD_SETIPANDMASK = &RCuser.RCUS_SETIPANDMASK;
-				RCSetRavlinIPandMask (dev,
-						      (U32) RCUD_SETIPANDMASK->
-						      IpAddr,
-						      (U32) RCUD_SETIPANDMASK->
-						      NetMask);
-				break;
-			case RCUC_SETMAC:
-				RCSetMAC (dev, (PU8) & RCUD_SETMAC->mac);
-				break;
-			case RCUC_SETSPEED:
-				RCUD_SETSPEED = &RCuser.RCUS_SETSPEED;
-				RCSetLinkSpeed (dev,
-						(U16) RCUD_SETSPEED->
-						LinkSpeedCode);
-				break;
-			case RCUC_SETPROM:
-				RCUD_SETPROM = &RCuser.RCUS_SETPROM;
-				RCSetPromiscuousMode (dev,
-						      (U16) RCUD_SETPROM->
-						      PromMode);
-				break;
-			case RCUC_SETBROADCAST:
-				RCUD_SETBROADCAST = &RCuser.RCUS_SETBROADCAST;
-				RCSetBroadcastMode (dev,
-						    (U16) RCUD_SETBROADCAST->
-						    BroadcastMode);
-				break;
-			default:
-				RCUD_DEFAULT = &RCuser.RCUS_DEFAULT;
-				RCUD_DEFAULT->rc = 0x11223344;
-				break;
-			}
-			if (copy_to_user (rq->ifr_data, &RCuser, 
-						sizeof (RCuser)))
-				return -EFAULT;
-			break;
-		}		/* RCU_COMMAND */
-
-	default:
-		rq->ifr_ifru.ifru_data = (caddr_t) 0x12345678;
-		return -EINVAL;
-	}
-	return 0;
-}
-
-static int
-RCconfig (struct net_device *dev, struct ifmap *map)
-{
-	/*
-	 * To be completed ...
-	 */
-	return 0;
-	if (dev->flags & IFF_UP)	/* can't act on a running interface */
-		return -EBUSY;
-
-	/* Don't allow changing the I/O address */
-	if (map->base_addr != dev->base_addr) {
-		printk (KERN_WARNING "%s Change I/O address not implemented\n",
-				dev->name);
-		return -EOPNOTSUPP;
-	}
-	return 0;
-}
-
-static void __exit
-rcpci_cleanup_module (void)
-{
-	pci_unregister_driver (&rcpci45_driver);
-}
-
-module_init (rcpci_init_module);
-module_exit (rcpci_cleanup_module);
-
-static int
-RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
-{
-
-	int i;
-	PU32 p;
-	psingleB pB;
-	struct sk_buff *skb;
-	PDPA pDpa = dev->priv;
-	RC_RETURN status;
-	U32 res = 0;
-
-	if (!numBuffers)
-		return 0;
-	else if (numBuffers > MAX_NMBR_POST_BUFFERS_PER_MSG) {
-		printk (KERN_ERR "%s: Too many buffers requested!\n",
-				dev->name);
-		numBuffers = 32;
-	}
-
-	p = (PU32) kmalloc (sizeof (U32) + numBuffers * sizeof (singleB),
-			    GFP_DMA | GFP_ATOMIC);
-
-	if (!p) {
-		printk (KERN_WARNING "%s unable to allocate TCB\n",
-				dev->name);
-		goto out;
-	}
-
-	p[0] = 0;		/* Buffer Count */
-	pB = (psingleB) ((U32) p + sizeof (U32));/* point to the first buffer */
-
-	for (i = 0; i < numBuffers; i++) {
-		skb = dev_alloc_skb (MAX_ETHER_SIZE + 2);
-		if (!skb) {
-			printk (KERN_WARNING 
-					"%s: unable to allocate enough skbs!\n",
-					dev->name);
-			goto err_out_unmap;
-		}
-		skb_reserve (skb, 2);	/* Align IP on 16 byte boundaries */
-		pB->context = (U32) skb;
-		pB->scount = 1;	/* segment count */
-		pB->size = MAX_ETHER_SIZE;
-		pB->addr = pci_map_single(pDpa->pci_dev, skb->data, 
-					  MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
-		p[0]++;
-		pB++;
-	}
-
-	if ((status = RCPostRecvBuffers (dev, (PRCTCB) p)) != RC_RTN_NO_ERROR) {
-		printk (KERN_WARNING "%s: Post buffer failed, error 0x%x\n",
-				dev->name, status);
-		goto err_out_unmap;
-	}
-out_free:
-	res = p[0];
-	kfree (p);
-out:
-	return (res);		/* return the number of posted buffers */
-
-err_out_unmap:
-	for (; p[0] > 0; p[0]--) {
-		--pB;
-		skb = (struct sk_buff *) pB->context;
-		pci_unmap_single(pDpa->pci_dev, pB->addr, MAX_ETHER_SIZE,
-				 PCI_DMA_FROMDEVICE);
-		dev_kfree_skb (skb);
-	}
-	goto out_free;
-}
diff -Nru a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig
--- a/drivers/net/wan/Kconfig	Sun May 16 01:43:16 2004
+++ b/drivers/net/wan/Kconfig	Sun May 16 01:43:16 2004
@@ -57,119 +57,6 @@
 	  The driver will be compiled as a module: the
 	  module will be called cosa.
 
-#
-# COMX drivers
-#
-# Not updated to 2.6.
-config COMX
-	tristate "MultiGate (COMX) synchronous serial boards support"
-	depends on WAN && (ISA || PCI) && BROKEN
-	---help---
-	  Drivers for the PC synchronous serial adapters by
-	  ITConsult-Pro Co, Hungary.
-
-	  Read <file:Documentation/networking/comx.txt> for help on configuring
-	  and using COMX interfaces. Further info on these cards can be found
-	  at <http://www.itc.hu/> or <info@itc.hu>.
-
-	  Say Y if you want to use any board from the MultiGate (COMX)
-	  family, you must also say Y to "/proc file system support"
-	  (CONFIG_PROC_FS) in order to use these drivers.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called comx.
-
-config COMX_HW_COMX
-	tristate "Support for COMX/CMX/HiCOMX boards"
-	depends on COMX
-	help
-	  Driver for the 'CMX', 'COMX' and 'HiCOMX' boards.
-
-	  You will need additional firmware to use these cards, which are
-	  downloadable from <ftp://ftp.itc.hu/>.
-
-	  Say Y if you have a board like this.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called comx-hw-comx.
-
-config COMX_HW_LOCOMX
-	tristate "Support for LoCOMX board"
-	depends on COMX
-	help
-	  Driver for the 'LoCOMX' board.
-
-	  Say Y if you have a board like this.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called comx-hw-locomx.
-
-config COMX_HW_MIXCOM
-	tristate "Support for MixCOM board"
-	depends on COMX
-	---help---
-	  Driver for the 'MixCOM' board.
-
-	  If you want to use the watchdog device on this card, you should
-	  select it in the Watchdog Cards section of the Character Devices
-	  configuration. The ISDN interface of this card is Teles 16.3
-	  compatible, you should enable it in the ISDN configuration menu. The
-	  driver for the flash ROM of this card is available separately on
-	  <ftp://ftp.itc.hu/>.
-
-	  Say Y if you have a board like this.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called comx-hw-mixcom.
-
-config COMX_HW_MUNICH
-	tristate "Support for MUNICH based boards: SliceCOM, PCICOM (WelCOM)"
-	depends on COMX
-	---help---
-	  Driver for the 'SliceCOM' (channelized E1) and 'PciCOM' (X21) boards.
-
-	  Read <file:Documentation/networking/slicecom.txt> for help on
-	  configuring and using SliceCOM interfaces. Further info on these
-	  cards can be found at <http://www.itc.hu> or <info@itc.hu>.
-
-	  Say Y if you have a board like this.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called comx-hw-munich.
-
-config COMX_PROTO_PPP
-	tristate "Support for HDLC and syncPPP protocols on MultiGate boards"
-	depends on COMX
-	help
-	  Cisco-HDLC and synchronous PPP protocol driver.
-
-	  Say Y if you want to use either protocol.
-
-	  To compile this as a module, choose M here: the
-	  module will be called comx-proto-ppp.
-
-config COMX_PROTO_LAPB
-	tristate "Support for LAPB protocol on MultiGate boards"
-	depends on WAN && (COMX!=n && LAPB=m && LAPB || LAPB=y && COMX)
-	help
-	  LAPB protocol driver.
-
-	  Say Y if you want to use this protocol.
-
-	  To compile this as a module, choose M here: the
-	  module will be called comx-proto-lapb.
-
-config COMX_PROTO_FR
-	tristate "Support for Frame Relay on MultiGate boards"
-	depends on COMX
-	help
-	  Frame Relay protocol driver.
-
-	  Say Y if you want to use this protocol.
-
-	  To compile this as a module, choose M here: the
-	  module will be called comx-proto-fr.
-
 config DSCC4
 	tristate "Etinc PCISYNC serial board support"
 	depends on WAN && PCI && m
diff -Nru a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile
--- a/drivers/net/wan/Makefile	Sun May 16 01:43:16 2004
+++ b/drivers/net/wan/Makefile	Sun May 16 01:43:16 2004
@@ -32,14 +32,6 @@
 
 obj-$(CONFIG_HOSTESS_SV11)	+= z85230.o	syncppp.o	hostess_sv11.o
 obj-$(CONFIG_SEALEVEL_4021)	+= z85230.o	syncppp.o	sealevel.o
-obj-$(CONFIG_COMX)		+= 				comx.o
-obj-$(CONFIG_COMX_HW_COMX)	+= 				comx-hw-comx.o
-obj-$(CONFIG_COMX_HW_LOCOMX)	+= z85230.o	syncppp.o	comx-hw-locomx.o
-obj-$(CONFIG_COMX_HW_MIXCOM)	+=				comx-hw-mixcom.o
-obj-$(CONFIG_COMX_HW_MUNICH)	+=				comx-hw-munich.o
-obj-$(CONFIG_COMX_PROTO_PPP)	+=		syncppp.o	comx-proto-ppp.o
-obj-$(CONFIG_COMX_PROTO_LAPB)	+=				comx-proto-lapb.o
-obj-$(CONFIG_COMX_PROTO_FR)	+=				comx-proto-fr.o
 obj-$(CONFIG_COSA)		+=		syncppp.o	cosa.o
 obj-$(CONFIG_FARSYNC)		+=		syncppp.o	farsync.o
 obj-$(CONFIG_DSCC4)             +=				dscc4.o
diff -Nru a/drivers/net/wan/comx-hw-comx.c b/drivers/net/wan/comx-hw-comx.c
--- a/drivers/net/wan/comx-hw-comx.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1450 +0,0 @@
-/*
- * Hardware-level driver for the COMX and HICOMX cards
- * for Linux kernel 2.2.X
- *
- * Original authors:  Arpad Bakay <bakay.arpad@synergon.hu>,
- *                    Peter Bajan <bajan.peter@synergon.hu>,
- * Rewritten by: Tivadar Szemethy <tiv@itc.hu>
- * Currently maintained by: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1995-2000 ITConsult-Pro Co. <info@itc.hu>
- *
- * Contributors:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 0.86
- * Daniele Bellucci         <bellucda@tiscali.it>   - 0.87
- *
- * 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.
- *
- * Version 0.80 (99/06/11):
- *		- port back to kernel, add support builtin driver 
- *		- cleaned up the source code a bit
- *
- * Version 0.81 (99/06/22):
- *		- cleaned up the board load functions, no more long reset
- *		  timeouts
- *		- lower modem lines on close
- *		- some interrupt handling fixes
- *
- * Version 0.82 (99/08/24):
- *		- fix multiple board support
- *
- * Version 0.83 (99/11/30):
- *		- interrupt handling and locking fixes during initalization
- *		- really fix multiple board support
- * 
- * Version 0.84 (99/12/02):
- *		- some workarounds for problematic hardware/firmware
- *
- * Version 0.85 (00/01/14):
- *		- some additional workarounds :/
- *		- printk cleanups
- * Version 0.86 (00/08/15):
- * 		- resource release on failure at COMX_init
- *
- * Version 0.87 (03/07/09)
- *              - audit copy_from_user in comxhw_write_proc
- */
-
-#define VERSION "0.87"
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#include "comx.h"
-#include "comxhw.h"
-
-MODULE_AUTHOR("Gergely Madarasz <gorgo@itc.hu>, Tivadar Szemethy <tiv@itc.hu>, Arpad Bakay");
-MODULE_DESCRIPTION("Hardware-level driver for the COMX and HICOMX adapters\n");
-MODULE_LICENSE("GPL");
-
-#define	COMX_readw(dev, offset)	(readw(dev->mem_start + offset + \
-	(unsigned int)(((struct comx_privdata *)\
-	((struct comx_channel *)dev->priv)->HW_privdata)->channel) \
-	* COMX_CHANNEL_OFFSET))
-
-#define COMX_WRITE(dev, offset, value)	(writew(value, dev->mem_start + offset \
-	+ (unsigned int)(((struct comx_privdata *) \
-	((struct comx_channel *)dev->priv)->HW_privdata)->channel) \
-	* COMX_CHANNEL_OFFSET))
-
-#define COMX_CMD(dev, cmd)	(COMX_WRITE(dev, OFF_A_L2_CMD, cmd))
-
-struct comx_firmware {
-	int	len;
-	unsigned char *data;
-};
-
-struct comx_privdata {
-	struct comx_firmware *firmware;
-	u16	clock;
-	char	channel;		// channel no.
-	int	memory_size;
-	short	io_extent;
-	u_long	histogram[5];
-};
-
-static struct net_device *memory_used[(COMX_MEM_MAX - COMX_MEM_MIN) / 0x10000];
-extern struct comx_hardware hicomx_hw;
-extern struct comx_hardware comx_hw;
-extern struct comx_hardware cmx_hw;
-
-static irqreturn_t COMX_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-
-static void COMX_board_on(struct net_device *dev)
-{
-	outb_p( (byte) (((dev->mem_start & 0xf0000) >> 16) | 
-	    COMX_ENABLE_BOARD_IT | COMX_ENABLE_BOARD_MEM), dev->base_addr);
-}
-
-static void COMX_board_off(struct net_device *dev)
-{
-	outb_p( (byte) (((dev->mem_start & 0xf0000) >> 16) | 
-	   COMX_ENABLE_BOARD_IT), dev->base_addr);
-}
-
-static void HICOMX_board_on(struct net_device *dev)
-{
-	outb_p( (byte) (((dev->mem_start & 0xf0000) >> 12) | 
-	   HICOMX_ENABLE_BOARD_MEM), dev->base_addr);
-}
-
-static void HICOMX_board_off(struct net_device *dev)
-{
-	outb_p( (byte) (((dev->mem_start & 0xf0000) >> 12) | 
-	   HICOMX_DISABLE_BOARD_MEM), dev->base_addr);
-}
-
-static void COMX_set_clock(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-
-	COMX_WRITE(dev, OFF_A_L1_CLKINI, hw->clock);
-}
-
-static struct net_device *COMX_access_board(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct net_device *ret;
-	int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16;
-	unsigned long flags;
-
-
-	save_flags(flags); cli();
-	
-	ret = memory_used[mempos];
-
-	if(ret == dev) {
-		goto out;
-	}
-
-	memory_used[mempos] = dev;
-
-	if (!ch->twin || ret != ch->twin) {
-		if (ret) ((struct comx_channel *)ret->priv)->HW_board_off(ret);
-		ch->HW_board_on(dev);
-	}
-out:
-	restore_flags(flags);
-	return ret;
-}
-
-static void COMX_release_board(struct net_device *dev, struct net_device *savep)
-{
-	unsigned long flags;
-	int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16;
-	struct comx_channel *ch = dev->priv;
-
-	save_flags(flags); cli();
-
-	if (memory_used[mempos] == savep) {
-		goto out;
-	}
-
-	memory_used[mempos] = savep;
-	if (!ch->twin || ch->twin != savep) {
-		ch->HW_board_off(dev);
-		if (savep) ((struct comx_channel*)savep->priv)->HW_board_on(savep);
-	}
-out:
-	restore_flags(flags);
-}
-
-static int COMX_txe(struct net_device *dev) 
-{
-	struct net_device *savep;
-	struct comx_channel *ch = dev->priv;
-	int rc = 0;
-
-	savep = ch->HW_access_board(dev);
-	if (COMX_readw(dev,OFF_A_L2_LINKUP) == LINKUP_READY) {
-		rc = COMX_readw(dev,OFF_A_L2_TxEMPTY);
-	} 
-	ch->HW_release_board(dev,savep);
-	if(rc==0xffff) {
-		printk(KERN_ERR "%s, OFF_A_L2_TxEMPTY is %d\n",dev->name, rc);
-	}
-	return rc;
-}
-
-static int COMX_send_packet(struct net_device *dev, struct sk_buff *skb)
-{
-	struct net_device *savep;
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	int ret = FRAME_DROPPED;
-	word tmp;
-
-	savep = ch->HW_access_board(dev);	
-
-	if (ch->debug_flags & DEBUG_HW_TX) {
-		comx_debug_bytes(dev, skb->data, skb->len,"COMX_send packet");
-	}
-
-	if (skb->len > COMX_MAX_TX_SIZE) {
-		ret=FRAME_DROPPED;
-		goto out;
-	}
-
-	tmp=COMX_readw(dev, OFF_A_L2_TxEMPTY);
-	if ((ch->line_status & LINE_UP) && tmp==1) {
-		int lensave = skb->len;
-		int dest = COMX_readw(dev, OFF_A_L2_TxBUFP);
-		word *data = (word *)skb->data;
-
-		if(dest==0xffff) {
-			printk(KERN_ERR "%s: OFF_A_L2_TxBUFP is %d\n", dev->name, dest);
-			ret=FRAME_DROPPED;
-			goto out;
-		}
-					
-		writew((unsigned short)skb->len, dev->mem_start + dest);
-		dest += 2;
-		while (skb->len > 1) {
-			writew(*data++, dev->mem_start + dest);
-			dest += 2; skb->len -= 2;
-		}
-		if (skb->len == 1) {
-			writew(*((byte *)data), dev->mem_start + dest);
-		}
-		writew(0, dev->mem_start + (int)hw->channel * 
-		   COMX_CHANNEL_OFFSET + OFF_A_L2_TxEMPTY);
-		ch->stats.tx_packets++;	
-		ch->stats.tx_bytes += lensave; 
-		ret = FRAME_ACCEPTED;
-	} else {
-		ch->stats.tx_dropped++;
-		printk(KERN_INFO "%s: frame dropped\n",dev->name);
-		if(tmp) {
-			printk(KERN_ERR "%s: OFF_A_L2_TxEMPTY is %d\n",dev->name,tmp);
-		}
-	}
-	
-out:
-	ch->HW_release_board(dev, savep);
-	dev_kfree_skb(skb);
-	return ret;
-}
-
-static inline int comx_read_buffer(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-	word rbuf_offs;
-	struct sk_buff *skb;
-	word len;
-	int i=0;
-	word *writeptr;
-
-	i = 0;
-	rbuf_offs = COMX_readw(dev, OFF_A_L2_RxBUFP);
-	if(rbuf_offs == 0xffff) {
-		printk(KERN_ERR "%s: OFF_A_L2_RxBUFP is %d\n",dev->name,rbuf_offs);
-		return 0;
-	}
-	len = readw(dev->mem_start + rbuf_offs);
-	if(len > COMX_MAX_RX_SIZE) {
-		printk(KERN_ERR "%s: packet length is %d\n",dev->name,len);
-		return 0;
-	}
-	if ((skb = dev_alloc_skb(len + 16)) == NULL) {
-		ch->stats.rx_dropped++;
-		COMX_WRITE(dev, OFF_A_L2_DAV, 0);
-		return 0;
-	}
-	rbuf_offs += 2;
-	skb_reserve(skb, 16);
-	skb_put(skb, len);
-	skb->dev = dev;
-	writeptr = (word *)skb->data;
-	while (i < len) {
-		*writeptr++ = readw(dev->mem_start + rbuf_offs);
-		rbuf_offs += 2; 
-		i += 2;
-	}
-	COMX_WRITE(dev, OFF_A_L2_DAV, 0);
-	ch->stats.rx_packets++;
-	ch->stats.rx_bytes += len;
-	if (ch->debug_flags & DEBUG_HW_RX) {
-		comx_debug_skb(dev, skb, "COMX_interrupt receiving");
-	}
-	ch->LINE_rx(dev, skb);
-	return 1;
-}
-
-static inline char comx_line_change(struct net_device *dev, char linestat)
-{
-	struct comx_channel *ch=dev->priv;
-	char idle=1;
-	
-	
-	if (linestat & LINE_UP) { /* Vonal fol */
-		if (ch->lineup_delay) {
-			if (!test_and_set_bit(0, &ch->lineup_pending)) {
-				ch->lineup_timer.function = comx_lineup_func;
-				ch->lineup_timer.data = (unsigned long)dev;
-				ch->lineup_timer.expires = jiffies +
-					HZ*ch->lineup_delay;
-				add_timer(&ch->lineup_timer);
-				idle=0;
-			}
-		} else {
-			idle=0;
-			ch->LINE_status(dev, ch->line_status |= LINE_UP);
-		}
-	} else { /* Vonal le */
-		idle=0;
-		if (test_and_clear_bit(0, &ch->lineup_pending)) {
-			del_timer(&ch->lineup_timer);
-		} else {
-			ch->line_status &= ~LINE_UP;
-			if (ch->LINE_status) {
-				ch->LINE_status(dev, ch->line_status);
-			}
-		}
-	}
-	return idle;
-}
-
-
-
-static irqreturn_t COMX_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-	struct net_device *dev = dev_id;
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct net_device *interrupted;
-	unsigned long jiffs;
-	char idle = 0;
-	int count = 0;
-	word tmp;
-
-	if (dev == NULL) {
-		printk(KERN_ERR "COMX_interrupt: irq %d for unknown device\n", irq);
-		return IRQ_NONE;
-	}
-
-	jiffs = jiffies;
-
-	interrupted = ch->HW_access_board(dev);
-
-	while (!idle && count < 5000) {
-		char channel = 0;
-		idle = 1;
-
-		while (channel < 2) {
-			char linestat = 0;
-			char buffers_emptied = 0;
-
-			if (channel == 1) {
-				if (ch->twin) {
-					dev = ch->twin;
-					ch = dev->priv;
-					hw = ch->HW_privdata;
-				} else {
-					break;
-				}
-			} else {
-				COMX_WRITE(dev, OFF_A_L1_REPENA, 
-				    COMX_readw(dev, OFF_A_L1_REPENA) & 0xFF00);
-			}
-			channel++;
-
-			if ((ch->init_status & (HW_OPEN | LINE_OPEN)) != 
-			   (HW_OPEN | LINE_OPEN)) {
-				continue;
-			}
-	
-			/* Collect stats */
-			tmp = COMX_readw(dev, OFF_A_L1_ABOREC);
-			COMX_WRITE(dev, OFF_A_L1_ABOREC, 0);
-			if(tmp==0xffff) {
-				printk(KERN_ERR "%s: OFF_A_L1_ABOREC is %d\n",dev->name,tmp);
-				break;
-			} else {
-				ch->stats.rx_missed_errors += (tmp >> 8) & 0xff;
-				ch->stats.rx_over_errors += tmp & 0xff;
-			}
-			tmp = COMX_readw(dev, OFF_A_L1_CRCREC);
-			COMX_WRITE(dev, OFF_A_L1_CRCREC, 0);
-			if(tmp==0xffff) {
-				printk(KERN_ERR "%s: OFF_A_L1_CRCREC is %d\n",dev->name,tmp);
-				break;
-			} else {
-				ch->stats.rx_crc_errors += (tmp >> 8) & 0xff;
-				ch->stats.rx_missed_errors += tmp & 0xff;
-			}
-			
-			if ((ch->line_status & LINE_UP) && ch->LINE_rx) {
-				tmp=COMX_readw(dev, OFF_A_L2_DAV); 
-				while (tmp==1) {
-					idle=0;
-					buffers_emptied+=comx_read_buffer(dev);
-					tmp=COMX_readw(dev, OFF_A_L2_DAV); 
-				}
-				if(tmp) {
-					printk(KERN_ERR "%s: OFF_A_L2_DAV is %d\n", dev->name, tmp);
-					break;
-				}
-			}
-
-			tmp=COMX_readw(dev, OFF_A_L2_TxEMPTY);
-			if (tmp==1 && ch->LINE_tx) {
-				ch->LINE_tx(dev);
-			} 
-			if(tmp==0xffff) {
-				printk(KERN_ERR "%s: OFF_A_L2_TxEMPTY is %d\n", dev->name, tmp);
-				break;
-			}
-
-			if (COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) {
-				linestat &= ~LINE_UP;
-			} else {
-				linestat |= LINE_UP;
-			}
-
-			if ((linestat & LINE_UP) != (ch->line_status & LINE_UP)) {
-				ch->stats.tx_carrier_errors++;
-				idle &= comx_line_change(dev,linestat);
-			}
-				
-			hw->histogram[(int)buffers_emptied]++;
-		}
-		count++;
-	}
-
-	if(count==5000) {
-		printk(KERN_WARNING "%s: interrupt stuck\n",dev->name);
-	}
-
-	ch->HW_release_board(dev, interrupted);
-	return IRQ_HANDLED;
-}
-
-static int COMX_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-	unsigned long jiffs;
-	int twin_open=0;
-	int retval;
-	struct net_device *savep;
-
-	if (!dev->base_addr || !dev->irq || !dev->mem_start) {
-		return -ENODEV;
-	}
-
-	if (ch->twin && (((struct comx_channel *)(ch->twin->priv))->init_status & HW_OPEN)) {
-		twin_open=1;
-	}
-
-	if (!twin_open) {
-		if (!request_region(dev->base_addr, hw->io_extent, dev->name)) {
-			return -EAGAIN;
-		}
-		if (request_irq(dev->irq, COMX_interrupt, 0, dev->name, 
-		   (void *)dev)) {
-			printk(KERN_ERR "comx-hw-comx: unable to obtain irq %d\n", dev->irq);
-			release_region(dev->base_addr, hw->io_extent);
-			return -EAGAIN;
-		}
-		ch->init_status |= IRQ_ALLOCATED;
-		if (!ch->HW_load_board || ch->HW_load_board(dev)) {
-			ch->init_status &= ~IRQ_ALLOCATED;
-			retval=-ENODEV;
-			goto error;
-		}
-	}
-
-	savep = ch->HW_access_board(dev);
-	COMX_WRITE(dev, OFF_A_L2_LINKUP, 0);
-
-	if (ch->HW_set_clock) {
-		ch->HW_set_clock(dev);
-	}
-
-	COMX_CMD(dev, COMX_CMD_INIT); 
-	jiffs = jiffies;
-	while (COMX_readw(dev, OFF_A_L2_LINKUP) != 1 && time_before(jiffies, jiffs + HZ)) {
-		schedule_timeout(1);
-	}
-	
-	if (time_after_eq(jiffies, jiffs + HZ)) {
-		printk(KERN_ERR "%s: board timeout on INIT command\n", dev->name);
-		ch->HW_release_board(dev, savep);
-		retval=-EIO;
-		goto error;
-	}
-	udelay(1000);
-
-	COMX_CMD(dev, COMX_CMD_OPEN);
-
-	jiffs = jiffies;
-	while (COMX_readw(dev, OFF_A_L2_LINKUP) != 3 && time_before(jiffies, jiffs + HZ)) {
-		schedule_timeout(1);
-	}
-	
-	if (time_after_eq(jiffies, jiffs + HZ)) {
-		printk(KERN_ERR "%s: board timeout on OPEN command\n", dev->name);
-		ch->HW_release_board(dev, savep);
-		retval=-EIO;
-		goto error;
-	}
-	
-	ch->init_status |= HW_OPEN;
-	
-	/* Ez eleg ciki, de ilyen a rendszer */
-	if (COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) {
-		ch->line_status &= ~LINE_UP;
-	} else {
-		ch->line_status |= LINE_UP;
-	}
-	
-	if (ch->LINE_status) {
-		ch->LINE_status(dev, ch->line_status);
-	}
-
-	ch->HW_release_board(dev, savep);
-
-	for ( ; procfile ; procfile = procfile->next) {
-		if (strcmp(procfile->name, FILENAME_IRQ) == 0 
-		    || strcmp(procfile->name, FILENAME_IO) == 0
-		    || strcmp(procfile->name, FILENAME_MEMADDR) == 0
-		    || strcmp(procfile->name, FILENAME_CHANNEL) == 0
-		    || strcmp(procfile->name, FILENAME_FIRMWARE) == 0
-		    || strcmp(procfile->name, FILENAME_CLOCK) == 0) {
-			procfile->mode = S_IFREG | 0444;
-		
-		}
-	}	
-	
-	return 0;	
-
-error:
-	if(!twin_open) {
-		release_region(dev->base_addr, hw->io_extent);
-		free_irq(dev->irq, (void *)dev);
-	}
-	return retval;
-
-}
-
-static int COMX_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct comx_channel *twin_ch;
-	struct net_device *savep;
-
-	savep = ch->HW_access_board(dev);
-
-	COMX_CMD(dev, COMX_CMD_CLOSE);
-	udelay(1000);
-	COMX_CMD(dev, COMX_CMD_EXIT);
-
-	ch->HW_release_board(dev, savep);
-
-	if (ch->init_status & IRQ_ALLOCATED) {
-		free_irq(dev->irq, (void *)dev);
-		ch->init_status &= ~IRQ_ALLOCATED;
-	}
-	release_region(dev->base_addr, hw->io_extent);
-
-	if (ch->twin && (twin_ch = ch->twin->priv) && 
-	    (twin_ch->init_status & HW_OPEN)) {
-		/* Pass the irq to the twin */
-		if (request_irq(dev->irq, COMX_interrupt, 0, ch->twin->name, 
-		   (void *)ch->twin) == 0) {
-			twin_ch->init_status |= IRQ_ALLOCATED;
-		}
-	}
-
-	for ( ; procfile ; procfile = procfile->next) {
-		if (strcmp(procfile->name, FILENAME_IRQ) == 0 
-		    || strcmp(procfile->name, FILENAME_IO) == 0
-		    || strcmp(procfile->name, FILENAME_MEMADDR) == 0
-		    || strcmp(procfile->name, FILENAME_CHANNEL) == 0
-		    || strcmp(procfile->name, FILENAME_FIRMWARE) == 0
-		    || strcmp(procfile->name, FILENAME_CLOCK) == 0) {
-			procfile->mode = S_IFREG | 0644;
-		}
-	}
-	
-	ch->init_status &= ~HW_OPEN;
-	return 0;
-}
-
-static int COMX_statistics(struct net_device *dev, char *page)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct net_device *savep;
-	int len = 0;
-
-	savep = ch->HW_access_board(dev);
-
-	len += sprintf(page + len, "Board data: %s %s %s %s\nPBUFOVR: %02x, "
-		"MODSTAT: %02x, LINKUP: %02x, DAV: %02x\nRxBUFP: %02x, "
-		"TxEMPTY: %02x, TxBUFP: %02x\n",
-		(ch->init_status & HW_OPEN) ? "HW_OPEN" : "",
-		(ch->init_status & LINE_OPEN) ? "LINE_OPEN" : "",
-		(ch->init_status & FW_LOADED) ? "FW_LOADED" : "",
-		(ch->init_status & IRQ_ALLOCATED) ? "IRQ_ALLOCATED" : "",
-		COMX_readw(dev, OFF_A_L1_PBUFOVR) & 0xff,
-		(COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) & 0xff,
-		COMX_readw(dev, OFF_A_L2_LINKUP) & 0xff,
-		COMX_readw(dev, OFF_A_L2_DAV) & 0xff,
-		COMX_readw(dev, OFF_A_L2_RxBUFP) & 0xff,
-		COMX_readw(dev, OFF_A_L2_TxEMPTY) & 0xff,
-		COMX_readw(dev, OFF_A_L2_TxBUFP) & 0xff);
-
-	len += sprintf(page + len, "hist[0]: %8lu hist[1]: %8lu hist[2]: %8lu\n"
-		"hist[3]: %8lu hist[4]: %8lu\n",hw->histogram[0],hw->histogram[1],
-		hw->histogram[2],hw->histogram[3],hw->histogram[4]);
-
-	ch->HW_release_board(dev, savep);
-
-	return len;
-}
-
-static int COMX_load_board(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct comx_firmware *fw = hw->firmware;
-	word board_segment = dev->mem_start >> 16;
-	int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16;
-	unsigned long flags;
-	unsigned char id1, id2;
-	struct net_device *saved;
-	int retval;
-	int loopcount;
-	int len;
-	byte *COMX_address;
-
-	if (!fw || !fw->len) {
-		struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL;
-		struct comx_privdata *twin_hw;
-
-		if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) {
-			return -EAGAIN;
-		}
-
-		if (!(fw = twin_hw->firmware) || !fw->len) {
-			return -EAGAIN;
-		}
-	}
-
-	id1 = fw->data[OFF_FW_L1_ID]; 
-	id2 = fw->data[OFF_FW_L1_ID + 1];
-
-	if (id1 != FW_L1_ID_1 || id2 != FW_L1_ID_2_COMX) {
-		printk(KERN_ERR "%s: incorrect firmware, load aborted\n", 
-			dev->name);
-		return -EAGAIN;
-	}
-
-	printk(KERN_INFO "%s: Loading COMX Layer 1 firmware %s\n", dev->name, 
-		(char *)(fw->data + OFF_FW_L1_ID + 2));
-
-	id1 = fw->data[OFF_FW_L2_ID]; 
-	id2 = fw->data[OFF_FW_L2_ID + 1];
-	if (id1 == FW_L2_ID_1 && (id2 == 0xc0 || id2 == 0xc1 || id2 == 0xc2)) {
-		printk(KERN_INFO "with Layer 2 code %s\n", 
-			(char *)(fw->data + OFF_FW_L2_ID + 2));
-	}
-
-	outb_p(board_segment | COMX_BOARD_RESET, dev->base_addr);
-	/* 10 usec should be enough here */
-	udelay(100);
-
-	save_flags(flags); cli();
-	saved=memory_used[mempos];
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_off(saved);
-	}
-	memory_used[mempos]=dev;
-
-	outb_p(board_segment | COMX_ENABLE_BOARD_MEM, dev->base_addr);
-
-	writeb(0, dev->mem_start + COMX_JAIL_OFFSET);	
-
-	loopcount=0;
-	while(loopcount++ < 10000 && 
-	    readb(dev->mem_start + COMX_JAIL_OFFSET) != COMX_JAIL_VALUE) {
-		udelay(100);
-	}	
-	
-	if (readb(dev->mem_start + COMX_JAIL_OFFSET) != COMX_JAIL_VALUE) {
-		printk(KERN_ERR "%s: Can't reset board, JAIL value is %02x\n",
-			dev->name, readb(dev->mem_start + COMX_JAIL_OFFSET));
-		retval=-ENODEV;
-		goto out;
-	}
-
-	writeb(0x55, dev->mem_start + 0x18ff);
-	
-	loopcount=0;
-	while(loopcount++ < 10000 && readb(dev->mem_start + 0x18ff) != 0) {
-		udelay(100);
-	}
-
-	if(readb(dev->mem_start + 0x18ff) != 0) {
-		printk(KERN_ERR "%s: Can't reset board, reset timeout\n",
-			dev->name);
-		retval=-ENODEV;
-		goto out;
-	}		
-
-	len = 0;
-	COMX_address = (byte *)dev->mem_start;
-	while (fw->len > len) {
-		writeb(fw->data[len++], COMX_address++);
-	}
-
-	len = 0;
-	COMX_address = (byte *)dev->mem_start;
-	while (len != fw->len && readb(COMX_address++) == fw->data[len]) {
-		len++;
-	}
-
-	if (len != fw->len) {
-		printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x "
-			"instead of 0x%02x\n", dev->name, len, 
-			readb(COMX_address - 1), fw->data[len]);
-		retval=-EAGAIN;
-		goto out;
-	}
-
-	writeb(0, dev->mem_start + COMX_JAIL_OFFSET);
-
-	loopcount = 0;
-	while ( loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) {
-		udelay(100);
-	}
-
-	if (COMX_readw(dev, OFF_A_L2_LINKUP) != 1) {
-		printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n",
-			dev->name, COMX_readw(dev, OFF_A_L2_LINKUP));
-		retval=-EAGAIN;
-		goto out;
-	}
-
-
-	ch->init_status |= FW_LOADED;
-	retval=0;
-
-out: 
-	outb_p(board_segment | COMX_DISABLE_ALL, dev->base_addr);
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_on(saved);
-	}
-	memory_used[mempos]=saved;
-	restore_flags(flags);
-	return retval;
-}
-
-static int CMX_load_board(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct comx_firmware *fw = hw->firmware;
-	word board_segment = dev->mem_start >> 16;
-	int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16;
-	#if 0
-	unsigned char id1, id2;
-	#endif
-	struct net_device *saved;
-	unsigned long flags;
-	int retval;
-	int loopcount;
-	int len;
-	byte *COMX_address;
-
-	if (!fw || !fw->len) {
-		struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL;
-		struct comx_privdata *twin_hw;
-
-		if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) {
-			return -EAGAIN;
-		}
-
-		if (!(fw = twin_hw->firmware) || !fw->len) {
-			return -EAGAIN;
-		}
-	}
-
-	/* Ide kell olyat tenni, hogy ellenorizze az ID-t */
-
-	if (inb_p(dev->base_addr) != CMX_ID_BYTE) {
-		printk(KERN_ERR "%s: CMX id byte is invalid(%02x)\n", dev->name,
-			inb_p(dev->base_addr));
-		return -ENODEV;
-	}
-
-	printk(KERN_INFO "%s: Loading CMX Layer 1 firmware %s\n", dev->name, 
-		(char *)(fw->data + OFF_FW_L1_ID + 2));
-
-	save_flags(flags); cli();
-	saved=memory_used[mempos];
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_off(saved);
-	}
-	memory_used[mempos]=dev;
-	
-	outb_p(board_segment | COMX_ENABLE_BOARD_MEM | COMX_BOARD_RESET, 
-		dev->base_addr);
-
-	len = 0;
-	COMX_address = (byte *)dev->mem_start;
-	while (fw->len > len) {
-		writeb(fw->data[len++], COMX_address++);
-	}
-
-	len = 0;
-	COMX_address = (byte *)dev->mem_start;
-	while (len != fw->len && readb(COMX_address++) == fw->data[len]) {
-		len++;
-	}
-
-	outb_p(board_segment | COMX_ENABLE_BOARD_MEM, dev->base_addr);
-
-	if (len != fw->len) {
-		printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x "
-			"instead of 0x%02x\n", dev->name, len, 
-			readb(COMX_address - 1), fw->data[len]);
-		retval=-EAGAIN;
-		goto out;
-	}
-
-	loopcount=0;
-	while( loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) {
-		udelay(100);
-	}
-
-	if (COMX_readw(dev, OFF_A_L2_LINKUP) != 1) {
-		printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n",
-			dev->name, COMX_readw(dev, OFF_A_L2_LINKUP));
-		retval=-EAGAIN;
-		goto out;
-	}
-
-	ch->init_status |= FW_LOADED;
-	retval=0;
-
-out: 
-	outb_p(board_segment | COMX_DISABLE_ALL, dev->base_addr);
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_on(saved);
-	}
-	memory_used[mempos]=saved;
-	restore_flags(flags);
-	return retval;
-}
-
-static int HICOMX_load_board(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	struct comx_firmware *fw = hw->firmware;
-	word board_segment = dev->mem_start >> 12;
-	int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16;
-	struct net_device *saved;
-	unsigned char id1, id2;
-	unsigned long flags;
-	int retval;
-	int loopcount;
-	int len;
-	word *HICOMX_address;
-	char id = 1;
-
-	if (!fw || !fw->len) {
-		struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL;
-		struct comx_privdata *twin_hw;
-
-		if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) {
-			return -EAGAIN;
-		}
-
-		if (!(fw = twin_hw->firmware) || !fw->len) {
-			return -EAGAIN;
-		}
-	}
-
-	while (id != 4) {
-		if (inb_p(dev->base_addr + id++) != HICOMX_ID_BYTE) {
-			break;
-		}
-	}
-
-	if (id != 4) {
-		printk(KERN_ERR "%s: can't find HICOMX at 0x%04x, id[%d] = %02x\n",
-			dev->name, (unsigned int)dev->base_addr, id - 1,
-			inb_p(dev->base_addr + id - 1));
-		return -1;	
-	}
-
-	id1 = fw->data[OFF_FW_L1_ID]; 
-	id2 = fw->data[OFF_FW_L1_ID + 1];
-	if (id1 != FW_L1_ID_1 || id2 != FW_L1_ID_2_HICOMX) {
-		printk(KERN_ERR "%s: incorrect firmware, load aborted\n", dev->name);
-		return -EAGAIN;
-	}
-
-	printk(KERN_INFO "%s: Loading HICOMX Layer 1 firmware %s\n", dev->name, 
-		(char *)(fw->data + OFF_FW_L1_ID + 2));
-
-	id1 = fw->data[OFF_FW_L2_ID]; 
-	id2 = fw->data[OFF_FW_L2_ID + 1];
-	if (id1 == FW_L2_ID_1 && (id2 == 0xc0 || id2 == 0xc1 || id2 == 0xc2)) {
-		printk(KERN_INFO "with Layer 2 code %s\n", 
-			(char *)(fw->data + OFF_FW_L2_ID + 2));
-	}
-
-	outb_p(board_segment | HICOMX_BOARD_RESET, dev->base_addr);
-	udelay(10);	
-
-	save_flags(flags); cli();
-	saved=memory_used[mempos];
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_off(saved);
-	}
-	memory_used[mempos]=dev;
-
-	outb_p(board_segment | HICOMX_ENABLE_BOARD_MEM, dev->base_addr);
-	outb_p(HICOMX_PRG_MEM, dev->base_addr + 1);
-
-	len = 0;
-	HICOMX_address = (word *)dev->mem_start;
-	while (fw->len > len) {
-		writeb(fw->data[len++], HICOMX_address++);
-	}
-
-	len = 0;
-	HICOMX_address = (word *)dev->mem_start;
-	while (len != fw->len && (readw(HICOMX_address++) & 0xff) == fw->data[len]) {
-		len++;
-	}
-
-	if (len != fw->len) {
-		printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x "
-			"instead of 0x%02x\n", dev->name, len, 
-			readw(HICOMX_address - 1) & 0xff, fw->data[len]);
-		retval=-EAGAIN;
-		goto out;
-	}
-
-	outb_p(board_segment | HICOMX_BOARD_RESET, dev->base_addr);
-	outb_p(HICOMX_DATA_MEM, dev->base_addr + 1);
-
-	outb_p(board_segment | HICOMX_ENABLE_BOARD_MEM, dev->base_addr);
-
-	loopcount=0;
-	while(loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1) {
-		udelay(100);
-	}
-
-	if ( COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) {
-		printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n",
-			dev->name, COMX_readw(dev, OFF_A_L2_LINKUP));
-		retval=-EAGAIN;
-		goto out;
-	}
-
-	ch->init_status |= FW_LOADED;
-	retval=0;
-
-out:
-	outb_p(board_segment | HICOMX_DISABLE_ALL, dev->base_addr);
-	outb_p(HICOMX_DATA_MEM, dev->base_addr + 1);
-
-	if(saved) {
-		((struct comx_channel *)saved->priv)->HW_board_on(saved);
-	}
-	memory_used[mempos]=saved;
-	restore_flags(flags);
-	return retval;
-}
-
-static struct net_device *comx_twin_check(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *procfile = ch->procdir->parent->subdir;
-	struct comx_privdata *hw = ch->HW_privdata;
-
-	struct net_device *twin;
-	struct comx_channel *ch_twin;
-	struct comx_privdata *hw_twin;
-
-
-	for ( ; procfile ; procfile = procfile->next) {
-	
-		if(!S_ISDIR(procfile->mode)) {
-			continue;
-		}
-	
-		twin=procfile->data;
-		ch_twin=twin->priv;
-		hw_twin=ch_twin->HW_privdata;
-
-
-		if (twin != dev && dev->irq && dev->base_addr && dev->mem_start &&
-		   dev->irq == twin->irq && dev->base_addr == twin->base_addr &&
-	  	   dev->mem_start == twin->mem_start &&
-		   hw->channel == (1 - hw_twin->channel) &&
-		   ch->hardware == ch_twin->hardware) {
-		   	return twin;
-		}
-	}
-	return NULL;
-}
-
-static int comxhw_write_proc(struct file *file, const char *buffer, 
-	u_long count, void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = entry->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	char *page;
-
-
-	if(ch->init_status & HW_OPEN) {
-		return -EAGAIN;	
-	}
-	
-	if (strcmp(FILENAME_FIRMWARE, entry->name) != 0) {
-		if (!(page = (char *)__get_free_page(GFP_KERNEL))) {
-			return -ENOMEM;
-		}
-		if(copy_from_user(page, buffer, count = (min_t(int, count, PAGE_SIZE))))
-		{
-			count = -EFAULT;
-			goto out;
-		}
-		if (page[count-1] == '\n')
-			page[count-1] = '\0';
-		else if (count < PAGE_SIZE)
-			page[count] = '\0';
-		else if (page[count]) {
- 			count = -EINVAL;
-			goto out;
-		}
-		page[count]=0;	/* Null terminate */
-	} else {
-		byte *tmp;
-
-		if (!hw->firmware) {
-			if ((hw->firmware = kmalloc(sizeof(struct comx_firmware), 
-			    GFP_KERNEL)) == NULL) {
-			    	return -ENOMEM;
-			}
-			hw->firmware->len = 0;
-			hw->firmware->data = NULL;
-		}
-		
-		if ((tmp = kmalloc(count + file->f_pos, GFP_KERNEL)) == NULL) {
-			return -ENOMEM;
-		}
-		
-		/* Ha nem 0 a fpos, akkor meglevo file-t irunk. Gyenge trukk. */
-		if (hw->firmware && hw->firmware->len && file->f_pos 
-		    && hw->firmware->len < count + file->f_pos) {
-			memcpy(tmp, hw->firmware->data, hw->firmware->len);
-		}
-		if (hw->firmware->data) {
-			kfree(hw->firmware->data);
-		}
-		if (copy_from_user(tmp + file->f_pos, buffer, count))
-			return -EFAULT;
-		hw->firmware->len = entry->size = file->f_pos + count;
-		hw->firmware->data = tmp;
-		file->f_pos += count;
-		return count;
-	}
-
-	if (strcmp(entry->name, FILENAME_CHANNEL) == 0) {
-		hw->channel = simple_strtoul(page, NULL, 0);
-		if (hw->channel >= MAX_CHANNELNO) {
-			printk(KERN_ERR "Invalid channel number\n");
-			hw->channel = 0;
-		}
-		if ((ch->twin = comx_twin_check(dev)) != NULL) {
-			struct comx_channel *twin_ch = ch->twin->priv;
-			twin_ch->twin = dev;
-		}
-	} else if (strcmp(entry->name, FILENAME_IRQ) == 0) {
-		dev->irq = simple_strtoul(page, NULL, 0);
-		if (dev->irq == 2) {
-			dev->irq = 9;
-		}
-		if (dev->irq < 3 || dev->irq > 15) {
-			printk(KERN_ERR "comxhw: Invalid irq number\n");
-			dev->irq = 0;
-		}
-		if ((ch->twin = comx_twin_check(dev)) != NULL) {
-			struct comx_channel *twin_ch = ch->twin->priv;
-			twin_ch->twin = dev;
-		}
-	} else if (strcmp(entry->name, FILENAME_IO) == 0) {
-		dev->base_addr = simple_strtoul(page, NULL, 0);
-		if ((dev->base_addr & 3) != 0 || dev->base_addr < 0x300 
-		   || dev->base_addr > 0x3fc) {
-			printk(KERN_ERR "Invalid io value\n");
-			dev->base_addr = 0;
-		}
-		if ((ch->twin = comx_twin_check(dev)) != NULL) {
-			struct comx_channel *twin_ch = ch->twin->priv;
-
-			twin_ch->twin = dev;
-		}
-	} else if (strcmp(entry->name, FILENAME_MEMADDR) == 0) {
-		dev->mem_start = simple_strtoul(page, NULL, 0);
-		if (dev->mem_start <= 0xf000 && dev->mem_start >= 0xa000) {
-			dev->mem_start *= 16;
-		}
-		if ((dev->mem_start & 0xfff) != 0 || dev->mem_start < COMX_MEM_MIN
-		    || dev->mem_start + hw->memory_size > COMX_MEM_MAX) {
-			printk(KERN_ERR "Invalid memory page\n");
-			dev->mem_start = 0;
-		}
-		dev->mem_end = dev->mem_start + hw->memory_size;
-		if ((ch->twin = comx_twin_check(dev)) != NULL) {
-			struct comx_channel *twin_ch = ch->twin->priv;
-
-			twin_ch->twin = dev;
-		}
-	} else if (strcmp(entry->name, FILENAME_CLOCK) == 0) {
-		if (strncmp("ext", page, 3) == 0) {
-			hw->clock = 0;
-		} else {
-			int kbps;
-
-			kbps = simple_strtoul(page, NULL, 0);
-			hw->clock = kbps ? COMX_CLOCK_CONST/kbps : 0;
-		}
-	}
-out:
-	free_page((unsigned long)page);
-	return count;
-}
-
-static int comxhw_read_proc(char *page, char **start, off_t off, int count,
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-	int len = 0;
-
-
-	if (strcmp(file->name, FILENAME_IO) == 0) {
-		len = sprintf(page, "0x%03x\n", (unsigned int)dev->base_addr);
-	} else if (strcmp(file->name, FILENAME_IRQ) == 0) {
-		len = sprintf(page, "0x%02x\n", dev->irq == 9 ? 2 : dev->irq);
-	} else if (strcmp(file->name, FILENAME_CHANNEL) == 0) {
-		len = sprintf(page, "%01d\n", hw->channel);
-	} else if (strcmp(file->name, FILENAME_MEMADDR) == 0) {
-		len = sprintf(page, "0x%05x\n", (unsigned int)dev->mem_start);
-	} else if (strcmp(file->name, FILENAME_TWIN) == 0) {
-		len = sprintf(page, "%s\n", ch->twin ? ch->twin->name : "none");
-	} else if (strcmp(file->name, FILENAME_CLOCK) == 0) {
-		if (hw->clock) {
-			len = sprintf(page, "%-8d\n", COMX_CLOCK_CONST/hw->clock);
-		} else {
-			len = sprintf(page, "external\n");
-		}
-	} else if (strcmp(file->name, FILENAME_FIRMWARE) == 0) {
-		len = min_t(int, FILE_PAGESIZE,
-			  min_t(int, count, 
-			      hw->firmware ?
-			      (hw->firmware->len - off) : 0));
-		if (len < 0) {
-			len = 0;
-		}
-		*start = hw->firmware ? (hw->firmware->data + off) : NULL;
-		if (off + len >= (hw->firmware ? hw->firmware->len : 0) || len == 0) {
-			*eof = 1;
-		}
-		return len;
-	}	
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) {
-		*eof = 1;
-	}
-	return min_t(int, count, len - off);
-}
-
-/* Called on echo comx >boardtype */
-static int COMX_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw;
-	struct proc_dir_entry *new_file;
-
-	if ((ch->HW_privdata = kmalloc(sizeof(struct comx_privdata), 
-	    GFP_KERNEL)) == NULL) {
-	    	return -ENOMEM;
-	}
-	memset(hw = ch->HW_privdata, 0, sizeof(struct comx_privdata));
-
-	if (ch->hardware == &comx_hw || ch->hardware == &cmx_hw) {
-		hw->memory_size = COMX_MEMORY_SIZE;
-		hw->io_extent = COMX_IO_EXTENT;
-		dev->base_addr = COMX_DEFAULT_IO;
-		dev->irq = COMX_DEFAULT_IRQ;
-		dev->mem_start = COMX_DEFAULT_MEMADDR;
-		dev->mem_end = COMX_DEFAULT_MEMADDR + COMX_MEMORY_SIZE;
-	} else if (ch->hardware == &hicomx_hw) {
-		hw->memory_size = HICOMX_MEMORY_SIZE;
-		hw->io_extent = HICOMX_IO_EXTENT;
-		dev->base_addr = HICOMX_DEFAULT_IO;
-		dev->irq = HICOMX_DEFAULT_IRQ;
-		dev->mem_start = HICOMX_DEFAULT_MEMADDR;
-		dev->mem_end = HICOMX_DEFAULT_MEMADDR + HICOMX_MEMORY_SIZE;
-	} else {
-		printk(KERN_ERR "SERIOUS INTERNAL ERROR in %s, line %d\n", __FILE__, __LINE__);
-	}
-
-	if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, ch->procdir))
-	    == NULL) {
-	    goto cleanup_HW_privdata;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = &comxhw_write_proc;
-	new_file->size = 6;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, ch->procdir))
-	    == NULL) {
-	    goto cleanup_filename_io;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = &comxhw_write_proc;
-	new_file->size = 5;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_CHANNEL, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-	    goto cleanup_filename_irq;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = &comxhw_write_proc;
-	new_file->size = 2;		// Ezt tudjuk
-	new_file->nlink = 1;
-
-	if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw) {
-		if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, 
-		   ch->procdir)) == NULL) {
-		    goto cleanup_filename_channel;
-		}
-		new_file->data = (void *)new_file;
-		new_file->read_proc = &comxhw_read_proc;
-		new_file->write_proc = &comxhw_write_proc;
-		new_file->size = 9;
-		new_file->nlink = 1;
-	}
-
-	if ((new_file = create_proc_entry(FILENAME_MEMADDR, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		    goto cleanup_filename_clock;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = &comxhw_write_proc;
-	new_file->size = 8;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_TWIN, S_IFREG | 0444, 
-	    ch->procdir)) == NULL) {
-		    goto cleanup_filename_memaddr;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = NULL;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_FIRMWARE, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		    goto cleanup_filename_twin;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &comxhw_read_proc;
-	new_file->write_proc = &comxhw_write_proc;
-	new_file->nlink = 1;
-
-	if (ch->hardware == &comx_hw) {
-		ch->HW_board_on = COMX_board_on;
-		ch->HW_board_off = COMX_board_off;
-		ch->HW_load_board = COMX_load_board;
-	} else if (ch->hardware == &cmx_hw) {
-		ch->HW_board_on = COMX_board_on;
-		ch->HW_board_off = COMX_board_off;
-		ch->HW_load_board = CMX_load_board;
-		ch->HW_set_clock = COMX_set_clock;
-	} else if (ch->hardware == &hicomx_hw) {
-		ch->HW_board_on = HICOMX_board_on;
-		ch->HW_board_off = HICOMX_board_off;
-		ch->HW_load_board = HICOMX_load_board;
-		ch->HW_set_clock = COMX_set_clock;
-	} else {
-		printk(KERN_ERR "SERIOUS INTERNAL ERROR in %s, line %d\n", __FILE__, __LINE__);
-	}
-
-	ch->HW_access_board = COMX_access_board;
-	ch->HW_release_board = COMX_release_board;
-	ch->HW_txe = COMX_txe;
-	ch->HW_open = COMX_open;
-	ch->HW_close = COMX_close;
-	ch->HW_send_packet = COMX_send_packet;
-	ch->HW_statistics = COMX_statistics;
-
-	if ((ch->twin = comx_twin_check(dev)) != NULL) {
-		struct comx_channel *twin_ch = ch->twin->priv;
-
-		twin_ch->twin = dev;
-	}
-
-	MOD_INC_USE_COUNT;
-	return 0;
-
-cleanup_filename_twin:
-	remove_proc_entry(FILENAME_TWIN, ch->procdir);
-cleanup_filename_memaddr:
-	remove_proc_entry(FILENAME_MEMADDR, ch->procdir);
-cleanup_filename_clock:
-	if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw)
-		remove_proc_entry(FILENAME_CLOCK, ch->procdir);
-cleanup_filename_channel:
-	remove_proc_entry(FILENAME_CHANNEL, ch->procdir);
-cleanup_filename_irq:
-	remove_proc_entry(FILENAME_IRQ, ch->procdir);
-cleanup_filename_io:
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-cleanup_HW_privdata:
-	kfree(ch->HW_privdata);
-	return -EIO;
-}
-
-/* Called on echo valami >boardtype */
-static int COMX_exit(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_privdata *hw = ch->HW_privdata;
-
-	if (hw->firmware) {
-		if (hw->firmware->data) kfree(hw->firmware->data);
-		kfree(hw->firmware);
-	} if (ch->twin) {
-		struct comx_channel *twin_ch = ch->twin->priv;
-
-		twin_ch->twin = NULL;
-	}
-	
-	kfree(ch->HW_privdata);
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-	remove_proc_entry(FILENAME_IRQ, ch->procdir);
-	remove_proc_entry(FILENAME_CHANNEL, ch->procdir);
-	remove_proc_entry(FILENAME_MEMADDR, ch->procdir);
-	remove_proc_entry(FILENAME_FIRMWARE, ch->procdir);
-	remove_proc_entry(FILENAME_TWIN, ch->procdir);
-	if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw) {
-		remove_proc_entry(FILENAME_CLOCK, ch->procdir);
-	}
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int COMX_dump(struct net_device *dev)
-{
-	printk(KERN_INFO "%s: COMX_dump called, why ?\n", dev->name);
-	return 0;
-}
-
-static struct comx_hardware comx_hw = {
-	"comx",
-	VERSION,
-	COMX_init,
-	COMX_exit,
-	COMX_dump,
-	NULL
-};
-
-static struct comx_hardware cmx_hw = {
-	"cmx",
-	VERSION,
-	COMX_init,
-	COMX_exit,
-	COMX_dump,
-	NULL
-};
-
-static struct comx_hardware hicomx_hw = {
-	"hicomx",
-	VERSION,
-	COMX_init,
-	COMX_exit,
-	COMX_dump,
-	NULL
-};
-
-static int __init comx_hw_comx_init(void)
-{
-	comx_register_hardware(&comx_hw);
-	comx_register_hardware(&cmx_hw);
-	comx_register_hardware(&hicomx_hw);
-	return 0;
-}
-
-static void __exit comx_hw_comx_exit(void)
-{
-	comx_unregister_hardware("comx");
-	comx_unregister_hardware("cmx");
-	comx_unregister_hardware("hicomx");
-}
-
-module_init(comx_hw_comx_init);
-module_exit(comx_hw_comx_exit);
diff -Nru a/drivers/net/wan/comx-hw-locomx.c b/drivers/net/wan/comx-hw-locomx.c
--- a/drivers/net/wan/comx-hw-locomx.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,496 +0,0 @@
-/*
- * Hardware driver for the LoCOMX card, using the generic z85230
- * functions
- *
- * Author: Gergely Madarasz <gorgo@itc.hu>
- *
- * Based on skeleton code and old LoCOMX driver by Tivadar Szemethy <tiv@itc.hu> 
- * and the hostess_sv11 driver
- *
- * Contributors:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br> (0.14)
- *
- * Copyright (C) 1999 ITConsult-Pro Co. <info@itc.hu>
- *
- * 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.
- *
- * Version 0.10 (99/06/17):
- *		- rewritten for the z85230 layer
- *
- * Version 0.11 (99/06/21):
- *		- some printk's fixed
- *		- get rid of a memory leak (it was impossible though :))
- * 
- * Version 0.12 (99/07/07):
- *		- check CTS for modem lines, not DCD (which is always high
- *		  in case of this board)
- * Version 0.13 (99/07/08):
- *		- Fix the transmitter status check
- *		- Handle the net device statistics better
- * Version 0.14 (00/08/15):
- * 		- resource release on failure at LOCOMX_init
- */
-
-#define VERSION "0.14"
-
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-
-#include <asm/types.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#include "comx.h"
-#include "z85230.h"
-
-MODULE_AUTHOR("Gergely Madarasz <gorgo@itc.hu>");
-MODULE_DESCRIPTION("Hardware driver for the LoCOMX board");
-MODULE_LICENSE("GPL");
-
-#define RX_DMA 3
-#define TX_DMA 1
-#define LOCOMX_ID 0x33
-#define LOCOMX_IO_EXTENT 8
-#define LOCOMX_DEFAULT_IO 0x368
-#define LOCOMX_DEFAULT_IRQ 7
-
-u8 z8530_locomx[] = {
-	11,     TCRTxCP,
-	14,     DTRREQ,
-	255
-};
-
-struct locomx_data {
-	int	io_extent;
-	struct	z8530_dev board;
-	struct timer_list status_timer;
-};
-
-static int LOCOMX_txe(struct net_device *dev)
-{
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw = ch->HW_privdata;
-
-	return (!hw->board.chanA.tx_next_skb);
-}
-
-
-static void locomx_rx(struct z8530_channel *c, struct sk_buff *skb)
-{
-	struct net_device *dev = c->netdevice;
-	struct comx_channel *ch = netdev_priv(dev);
-	
-	if (ch->debug_flags & DEBUG_HW_RX) {
-		comx_debug_skb(dev, skb, "locomx_rx receiving");
-	}
-	ch->LINE_rx(dev,skb);
-}
-
-static int LOCOMX_send_packet(struct net_device *dev, struct sk_buff *skb) 
-{
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw = ch->HW_privdata;
-
-	if (ch->debug_flags & DEBUG_HW_TX) {
-		comx_debug_bytes(dev, skb->data, skb->len, "LOCOMX_send_packet");
-	}
-
-	if (!(ch->line_status & LINE_UP)) {
-		return FRAME_DROPPED;
-	}
-
-	if(z8530_queue_xmit(&hw->board.chanA,skb)) {
-		printk(KERN_WARNING "%s: FRAME_DROPPED\n",dev->name);
-		return FRAME_DROPPED;
-	}
-
-	if (ch->debug_flags & DEBUG_HW_TX) {
-		comx_debug(dev, "%s: LOCOMX_send_packet was successful\n\n", dev->name);
-	}
-
-	if(!hw->board.chanA.tx_next_skb) {
-		return FRAME_QUEUED;
-	} else {
-		return FRAME_ACCEPTED;
-	}
-}
-
-static void locomx_status_timerfun(unsigned long d)
-{
-	struct net_device *dev = (struct net_device *)d;
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw = ch->HW_privdata;
-
-	if(!(ch->line_status & LINE_UP) &&
-	    (hw->board.chanA.status & CTS)) {
-		ch->LINE_status(dev, ch->line_status | LINE_UP);
-	}
-	if((ch->line_status & LINE_UP) &&
-	    !(hw->board.chanA.status & CTS)) {
-		ch->LINE_status(dev, ch->line_status & ~LINE_UP);
-	}
-	mod_timer(&hw->status_timer,jiffies + ch->lineup_delay * HZ);
-}
-
-
-static int LOCOMX_open(struct net_device *dev)
-{
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw = ch->HW_privdata;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-	unsigned long flags;
-	int ret;
-
-	if (!dev->base_addr || !dev->irq) {
-		return -ENODEV;
-	}
-
-	if (!request_region(dev->base_addr, hw->io_extent, dev->name)) {
-		return -EAGAIN;
-	}
-
-	hw->board.chanA.ctrlio=dev->base_addr + 5;
-	hw->board.chanA.dataio=dev->base_addr + 7;
-	
-	hw->board.irq=dev->irq;
-	hw->board.chanA.netdevice=dev;
-	hw->board.chanA.dev=&hw->board;
-	hw->board.name=dev->name;
-	hw->board.chanA.txdma=TX_DMA;
-	hw->board.chanA.rxdma=RX_DMA;
-	hw->board.chanA.irqs=&z8530_nop;
-	hw->board.chanB.irqs=&z8530_nop;
-
-	if(request_irq(dev->irq, z8530_interrupt, SA_INTERRUPT, 
-	    dev->name, &hw->board)) {
-		printk(KERN_ERR "%s: unable to obtain irq %d\n", dev->name, 
-			dev->irq);
-		ret=-EAGAIN;
-		goto irq_fail;
-	}
-	if(request_dma(TX_DMA,"LoCOMX (TX)")) {
-		printk(KERN_ERR "%s: unable to obtain TX DMA (DMA channel %d)\n", 
-			dev->name, TX_DMA);
-		ret=-EAGAIN;
-		goto dma1_fail;
-	}
-
-	if(request_dma(RX_DMA,"LoCOMX (RX)")) {
-		printk(KERN_ERR "%s: unable to obtain RX DMA (DMA channel %d)\n", 
-			dev->name, RX_DMA);
-		ret=-EAGAIN;
-		goto dma2_fail;
-	}
-	
-	save_flags(flags); 
-	cli();
-
-	if(z8530_init(&hw->board)!=0)
-	{
-		printk(KERN_ERR "%s: Z8530 device not found.\n",dev->name);
-		ret=-ENODEV;
-		goto z8530_fail;
-	}
-
-	hw->board.chanA.dcdcheck=CTS;
-
-	z8530_channel_load(&hw->board.chanA, z8530_hdlc_kilostream_85230);
-	z8530_channel_load(&hw->board.chanA, z8530_locomx);
-	z8530_channel_load(&hw->board.chanB, z8530_dead_port);
-
-	z8530_describe(&hw->board, "I/O", dev->base_addr);
-
-	if((ret=z8530_sync_dma_open(dev, &hw->board.chanA))!=0) {
-		goto z8530_fail;
-	}
-
-	restore_flags(flags);
-
-
-	hw->board.active=1;
-	hw->board.chanA.rx_function=locomx_rx;
-
-	ch->init_status |= HW_OPEN;
-	if (hw->board.chanA.status & DCD) {
-		ch->line_status |= LINE_UP;
-	} else {
-		ch->line_status &= ~LINE_UP;
-	}
-
-	comx_status(dev, ch->line_status);
-
-	init_timer(&hw->status_timer);
-	hw->status_timer.function=locomx_status_timerfun;
-	hw->status_timer.data=(unsigned long)dev;
-	hw->status_timer.expires=jiffies + ch->lineup_delay * HZ;
-	add_timer(&hw->status_timer);
-
-	for (; procfile ; procfile = procfile->next) {
-		if (strcmp(procfile->name, FILENAME_IO) == 0 ||
-		     strcmp(procfile->name, FILENAME_IRQ) == 0) {
-			procfile->mode = S_IFREG |  0444;
-		}
-	}
-	return 0;
-
-z8530_fail:
-	restore_flags(flags);
-	free_dma(RX_DMA);
-dma2_fail:
-	free_dma(TX_DMA);
-dma1_fail:
-	free_irq(dev->irq, &hw->board);
-irq_fail:
-	release_region(dev->base_addr, hw->io_extent);
-	return ret;
-}
-
-static int LOCOMX_close(struct net_device *dev)
-{
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw = ch->HW_privdata;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-
-	hw->board.chanA.rx_function=z8530_null_rx;
-	netif_stop_queue(dev);
-	z8530_sync_dma_close(dev, &hw->board.chanA);
-
-	z8530_shutdown(&hw->board);
-
-	del_timer(&hw->status_timer);
-	free_dma(RX_DMA);
-	free_dma(TX_DMA);
-	free_irq(dev->irq,&hw->board);
-	release_region(dev->base_addr,8);
-
-	for (; procfile ; procfile = procfile->next) {
-		if (strcmp(procfile->name, FILENAME_IO) == 0 ||
-		    strcmp(procfile->name, FILENAME_IRQ) == 0) {
-			procfile->mode = S_IFREG |  0644;
-		}
-	}
-
-	ch->init_status &= ~HW_OPEN;
-	return 0;
-}
-
-static int LOCOMX_statistics(struct net_device *dev,char *page)
-{
-	int len = 0;
-
-	len += sprintf(page + len, "Hello\n");
-
-	return len;
-}
-
-static int LOCOMX_dump(struct net_device *dev) {
-	printk(KERN_INFO "LOCOMX_dump called\n");
-	return(-1);
-}
-
-static int locomx_read_proc(char *page, char **start, off_t off, int count,
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	int len = 0;
-
-	if (strcmp(file->name, FILENAME_IO) == 0) {
-		len = sprintf(page, "0x%x\n", (unsigned int)dev->base_addr);
-	} else if (strcmp(file->name, FILENAME_IRQ) == 0) {
-		len = sprintf(page, "%d\n", (unsigned int)dev->irq);
-	} else {
-		printk(KERN_ERR "hw_read_proc: internal error, filename %s\n", 
-			file->name);
-		return -EBADF;
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) {
-		*eof = 1;
-	}
-	return min_t(int, count, len - off);
-}
-
-static int locomx_write_proc(struct file *file, const char *buffer,
-	u_long count, void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = (struct net_device *)entry->parent->data;
-	int val;
-	char *page;
-
-	if (!(page = (char *)__get_free_page(GFP_KERNEL))) {
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(page, buffer, count = min_t(unsigned long, count, PAGE_SIZE))) {
-		free_page((unsigned long)page);
-		return -EBADF;
-	}
-	if (*(page + count - 1) == '\n') {
-		*(page + count - 1) = 0;
-	}
-
-	if (strcmp(entry->name, FILENAME_IO) == 0) {
-		val = simple_strtoul(page, NULL, 0);
-		if (val != 0x360 && val != 0x368 && val != 0x370 && 
-		   val != 0x378) {
-			printk(KERN_ERR "LoCOMX: incorrect io address!\n");	
-		} else {
-			dev->base_addr = val;
-		}
-	} else if (strcmp(entry->name, FILENAME_IRQ) == 0) {
-		val = simple_strtoul(page, NULL, 0);
-		if (val != 3 && val != 4 && val != 5 && val != 6 && val != 7) {
-			printk(KERN_ERR "LoCOMX: incorrect irq value!\n");
-		} else {
-			dev->irq = val;
-		}	
-	} else {
-		printk(KERN_ERR "locomx_write_proc: internal error, filename %s\n", 
-			entry->name);
-		free_page((unsigned long)page);
-		return -EBADF;
-	}
-
-	free_page((unsigned long)page);
-	return count;
-}
-
-
-
-static int LOCOMX_init(struct net_device *dev) 
-{
-	struct comx_channel *ch = netdev_priv(dev);
-	struct locomx_data *hw;
-	struct proc_dir_entry *new_file;
-
-	/* Alloc data for private structure */
-	if ((ch->HW_privdata = kmalloc(sizeof(struct locomx_data), 
-	   GFP_KERNEL)) == NULL) {
-	   	return -ENOMEM;
-	}
-
-	memset(hw = ch->HW_privdata, 0, sizeof(struct locomx_data));
-	hw->io_extent = LOCOMX_IO_EXTENT;
-
-	/* Register /proc files */
-	if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_HW_privdata;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &locomx_read_proc;
-	new_file->write_proc = &locomx_write_proc;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, 
-	    ch->procdir)) == NULL)  {
-		goto cleanup_filename_io;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &locomx_read_proc;
-	new_file->write_proc = &locomx_write_proc;
-	new_file->nlink = 1;
-
-/* 	No clock yet */
-/*
-	if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		return -EIO;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &locomx_read_proc;
-	new_file->write_proc = &locomx_write_proc;
-	new_file->nlink = 1;
-*/
-
-	ch->HW_access_board = NULL;
-	ch->HW_release_board = NULL;
-	ch->HW_txe = LOCOMX_txe;
-	ch->HW_open = LOCOMX_open;
-	ch->HW_close = LOCOMX_close;
-	ch->HW_send_packet = LOCOMX_send_packet;
-	ch->HW_statistics = LOCOMX_statistics;
-	ch->HW_set_clock = NULL;
-
-	ch->current_stats = &hw->board.chanA.stats;
-	memcpy(ch->current_stats, &ch->stats, sizeof(struct net_device_stats));
-
-	dev->base_addr = LOCOMX_DEFAULT_IO;
-	dev->irq = LOCOMX_DEFAULT_IRQ;
-	
-	
-	/* O.K. Count one more user on this module */
-	MOD_INC_USE_COUNT;
-	return 0;
-cleanup_filename_io:
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-cleanup_HW_privdata:
-	kfree(ch->HW_privdata);
-	return -EIO;
-}
-
-
-static int LOCOMX_exit(struct net_device *dev)
-{
-	struct comx_channel *ch = netdev_priv(dev);
-
-	ch->HW_access_board = NULL;
-	ch->HW_release_board = NULL;
-	ch->HW_txe = NULL;
-	ch->HW_open = NULL;
-	ch->HW_close = NULL;
-	ch->HW_send_packet = NULL;
-	ch->HW_statistics = NULL;
-	ch->HW_set_clock = NULL;
-	memcpy(&ch->stats, ch->current_stats, sizeof(struct net_device_stats));
-	ch->current_stats = &ch->stats;
-
-	kfree(ch->HW_privdata);
-
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-	remove_proc_entry(FILENAME_IRQ, ch->procdir);
-//	remove_proc_entry(FILENAME_CLOCK, ch->procdir);
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static struct comx_hardware locomx_hw = {
-	"locomx",
-	VERSION,
-	LOCOMX_init, 
-	LOCOMX_exit,
-	LOCOMX_dump,
-	NULL
-};
-	
-static int __init comx_hw_locomx_init(void)
-{
-	comx_register_hardware(&locomx_hw);
-	return 0;
-}
-
-static void __exit comx_hw_locomx_exit(void)
-{
-	comx_unregister_hardware("locomx");
-}
-
-module_init(comx_hw_locomx_init);
-module_exit(comx_hw_locomx_exit);
diff -Nru a/drivers/net/wan/comx-hw-mixcom.c b/drivers/net/wan/comx-hw-mixcom.c
--- a/drivers/net/wan/comx-hw-mixcom.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,960 +0,0 @@
-/* 
- * Hardware driver for the MixCom synchronous serial board 
- *
- * Author: Gergely Madarasz <gorgo@itc.hu>
- *
- * based on skeleton driver code and a preliminary hscx driver by 
- * Tivadar Szemethy <tiv@itc.hu>
- *
- * Copyright (C) 1998-1999 ITConsult-Pro Co. <info@itc.hu>
- *
- * Contributors:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br> (0.65)
- *
- * 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.
- *
- * Version 0.60 (99/06/11):
- *		- ported to the kernel, now works as builtin code
- *
- * Version 0.61 (99/06/11):
- *		- recognize the one-channel MixCOM card (id byte = 0x13)
- *		- printk fixes
- * 
- * Version 0.62 (99/07/15):
- *		- fixes according to the new hw docs 
- *		- report line status when open
- *
- * Version 0.63 (99/09/21):
- *		- line status report fixes
- *
- * Version 0.64 (99/12/01):
- *		- some more cosmetical fixes
- *
- * Version 0.65 (00/08/15)
- *		- resource release on failure at MIXCOM_init
- */
-
-#define VERSION "0.65"
-
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-
-#include <asm/types.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#include "comx.h"
-#include "mixcom.h"
-#include "hscx.h"
-
-MODULE_AUTHOR("Gergely Madarasz <gorgo@itc.hu>");
-MODULE_DESCRIPTION("Hardware-level driver for the serial port of the MixCom board");
-MODULE_LICENSE("GPL");
-
-#define MIXCOM_DATA(d) ((struct mixcom_privdata *)(COMX_CHANNEL(d)-> \
-	HW_privdata))
-
-#define MIXCOM_BOARD_BASE(d) (d->base_addr - MIXCOM_SERIAL_OFFSET - \
-	(1 - MIXCOM_DATA(d)->channel) * MIXCOM_CHANNEL_OFFSET)
-
-#define MIXCOM_DEV_BASE(port,channel) (port + MIXCOM_SERIAL_OFFSET + \
-	(1 - channel) * MIXCOM_CHANNEL_OFFSET)
-
-/* Values used to set the IRQ line */
-static unsigned char mixcom_set_irq[]={0xFF, 0xFF, 0xFF, 0x0, 0xFF, 0x2, 0x4, 0x6, 0xFF, 0xFF, 0x8, 0xA, 0xC, 0xFF, 0xE, 0xFF};
-
-static unsigned char* hscx_versions[]={"A1", NULL, "A2", NULL, "A3", "2.1"};
-
-struct mixcom_privdata {
-	u16	clock;
-	char	channel;
-	long	txbusy;
-	struct sk_buff *sending;
-	unsigned tx_ptr;
-	struct sk_buff *recving;
-	unsigned rx_ptr;
-	unsigned char status;
-	char	card_has_status;
-};
-
-static inline void wr_hscx(struct net_device *dev, int reg, unsigned char val) 
-{
-	outb(val, dev->base_addr + reg);
-}
-
-static inline unsigned char rd_hscx(struct net_device *dev, int reg)
-{
-	return inb(dev->base_addr + reg);
-}
-
-static inline void hscx_cmd(struct net_device *dev, int cmd)
-{
-	unsigned long jiffs = jiffies;
-	unsigned char cec;
-	unsigned delay = 0;
-
-	while ((cec = (rd_hscx(dev, HSCX_STAR) & HSCX_CEC) != 0) && 
-	    time_before(jiffies, jiffs + HZ)) {
-		udelay(1);
-		if (++delay > (100000 / HZ)) break;
-	}
-	if (cec) {
-		printk(KERN_WARNING "%s: CEC stuck, probably no clock!\n",dev->name);
-	} else {
-		wr_hscx(dev, HSCX_CMDR, cmd);
-	}
-}
-
-static inline void hscx_fill_fifo(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	register word to_send = hw->sending->len - hw->tx_ptr;
-
-
-	outsb(dev->base_addr + HSCX_FIFO,
-        	&(hw->sending->data[hw->tx_ptr]), min_t(unsigned int, to_send, 32));
-	if (to_send <= 32) {
-        	hscx_cmd(dev, HSCX_XTF | HSCX_XME);
-	        kfree_skb(hw->sending);
-        	hw->sending = NULL; 
-        	hw->tx_ptr = 0;
-        } else {
-	        hscx_cmd(dev, HSCX_XTF);
-        	hw->tx_ptr += 32;
-        }
-}
-
-static inline void hscx_empty_fifo(struct net_device *dev, int cnt)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-
-	if (hw->recving == NULL) {
-        	if (!(hw->recving = dev_alloc_skb(HSCX_MTU + 16))) {
-	                ch->stats.rx_dropped++;
-        	        hscx_cmd(dev, HSCX_RHR);
-                } else {
-	                skb_reserve(hw->recving, 16);
-        	        skb_put(hw->recving, HSCX_MTU);
-                }
-	        hw->rx_ptr = 0;
-        }
-	if (cnt > 32 || !cnt || hw->recving == NULL) {
-        	printk(KERN_ERR "hscx_empty_fifo: cnt is %d, hw->recving %p\n",
-		        cnt, (void *)hw->recving);
-	        return;
-        }
-        
-	insb(dev->base_addr + HSCX_FIFO, &(hw->recving->data[hw->rx_ptr]),cnt);
-	hw->rx_ptr += cnt;
-	hscx_cmd(dev, HSCX_RMC);
-}
-
-
-static int MIXCOM_txe(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-
-	return !test_bit(0, &hw->txbusy);
-}
-
-static int mixcom_probe(struct net_device *dev)
-{
-	unsigned long flags;
-	int id, vstr, ret=0;
-
-	save_flags(flags); cli();
-
-	id=inb_p(MIXCOM_BOARD_BASE(dev) + MIXCOM_ID_OFFSET) & 0x7f;
-
- 	if (id != MIXCOM_ID ) {
-		ret=-ENODEV;
-		printk(KERN_WARNING "%s: no MixCOM board found at 0x%04lx\n",dev->name, dev->base_addr);
-		goto out;
-	}
-
-	vstr=inb_p(dev->base_addr + HSCX_VSTR) & 0x0f;
-	if(vstr>=sizeof(hscx_versions)/sizeof(char*) || 
-	    hscx_versions[vstr]==NULL) {
-		printk(KERN_WARNING "%s: board found but no HSCX chip detected at 0x%4lx (vstr = 0x%1x)\n",dev->name,dev->base_addr,vstr);
-		ret = -ENODEV;
-	} else {
-		printk(KERN_INFO "%s: HSCX chip version %s\n",dev->name,hscx_versions[vstr]);
-		ret = 0;
-	}
-
-out:
-
-	restore_flags(flags);
-	return ret;
-}
-
-#if 0
-static void MIXCOM_set_clock(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-
-	if (hw->clock) {
-		;
-	} else {
-		;
-	}
-}
-#endif
-
-static void mixcom_board_on(struct net_device *dev)
-{
-	outb_p(MIXCOM_OFF , MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET);
-	udelay(1000);
-	outb_p(mixcom_set_irq[dev->irq] | MIXCOM_ON, 
-		MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET);
-	udelay(1000);
-}
-
-static void mixcom_board_off(struct net_device *dev)
-{
-	outb_p(MIXCOM_OFF , MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET);
-	udelay(1000);
-}
-
-static void mixcom_off(struct net_device *dev)
-{
-	wr_hscx(dev, HSCX_CCR1, 0x0);
-}
-
-static void mixcom_on(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	wr_hscx(dev, HSCX_CCR1, HSCX_PU | HSCX_ODS | HSCX_ITF); // power up, push-pull
-	wr_hscx(dev, HSCX_CCR2, HSCX_CIE /* | HSCX_RIE */ );
-	wr_hscx(dev, HSCX_MODE, HSCX_TRANS | HSCX_ADM8 | HSCX_RAC | HSCX_RTS );
-	wr_hscx(dev, HSCX_RLCR, HSCX_RC | 47); // 1504 bytes
-	wr_hscx(dev, HSCX_MASK, HSCX_RSC | HSCX_TIN );
-	hscx_cmd(dev, HSCX_XRES | HSCX_RHR);
-
-	if (ch->HW_set_clock) ch->HW_set_clock(dev);
-
-}
-
-static int MIXCOM_send_packet(struct net_device *dev, struct sk_buff *skb) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	unsigned long flags;
-
-	if (ch->debug_flags & DEBUG_HW_TX) {
-		comx_debug_bytes(dev, skb->data, skb->len, "MIXCOM_send_packet");
-	}
-
-	if (!(ch->line_status & LINE_UP)) {
-		return FRAME_DROPPED;
-	}
-
-	if (skb->len > HSCX_MTU) {
-		ch->stats.tx_errors++;	
-		return FRAME_ERROR;
-	}
-
-	save_flags(flags); cli();
-
-	if (test_and_set_bit(0, &hw->txbusy)) {
-		printk(KERN_ERR "%s: transmitter called while busy... dropping frame (length %d)\n", dev->name, skb->len);
-		restore_flags(flags);
-		return FRAME_DROPPED;
-	}
-
-
-	hw->sending = skb;
-	hw->tx_ptr = 0;
-	hw->txbusy = 1;
-//	atomic_inc(&skb->users);	// save it
-	hscx_fill_fifo(dev);
-	restore_flags(flags);
-
-	ch->stats.tx_packets++;
-	ch->stats.tx_bytes += skb->len; 
-
-	if (ch->debug_flags & DEBUG_HW_TX) {
-		comx_debug(dev, "MIXCOM_send_packet was successful\n\n");
-	}
-
-	return FRAME_ACCEPTED;
-}
-
-static inline void mixcom_receive_frame(struct net_device *dev) 
-{
-	struct comx_channel *ch=dev->priv;
-	struct mixcom_privdata *hw=ch->HW_privdata;
-	register byte rsta;
-	register word length;
-
-	rsta = rd_hscx(dev, HSCX_RSTA) & (HSCX_VFR | HSCX_RDO | 
-		HSCX_CRC | HSCX_RAB);
-	length = ((rd_hscx(dev, HSCX_RBCH) & 0x0f) << 8) | 
-		rd_hscx(dev, HSCX_RBCL);
-
-	if ( length > hw->rx_ptr ) {
-		hscx_empty_fifo(dev, length - hw->rx_ptr);
-	}
-	
-	if (!(rsta & HSCX_VFR)) {
-		ch->stats.rx_length_errors++;
-	}
-	if (rsta & HSCX_RDO) {
-		ch->stats.rx_over_errors++;
-	}
-	if (!(rsta & HSCX_CRC)) {
-		ch->stats.rx_crc_errors++;
-	}
-	if (rsta & HSCX_RAB) {
-		ch->stats.rx_frame_errors++;
-	}
-	ch->stats.rx_packets++; 
-	ch->stats.rx_bytes += length;
-
-	if (rsta == (HSCX_VFR | HSCX_CRC) && hw->recving) {
-		skb_trim(hw->recving, hw->rx_ptr - 1);
-		if (ch->debug_flags & DEBUG_HW_RX) {
-			comx_debug_skb(dev, hw->recving,
-				"MIXCOM_interrupt receiving");
-		}
-		hw->recving->dev = dev;
-		if (ch->LINE_rx) {
-			ch->LINE_rx(dev, hw->recving);
-		}
-	}
-	else if(hw->recving) {
-		kfree_skb(hw->recving);
-	}
-	hw->recving = NULL; 
-	hw->rx_ptr = 0;
-}
-
-
-static inline void mixcom_extended_interrupt(struct net_device *dev) 
-{
-	struct comx_channel *ch=dev->priv;
-	struct mixcom_privdata *hw=ch->HW_privdata;
-	register byte exir;
-
-	exir = rd_hscx(dev, HSCX_EXIR) & (HSCX_XDU | HSCX_RFO | HSCX_CSC );
-
-	if (exir & HSCX_RFO) {
-		ch->stats.rx_over_errors++;
-		if (hw->rx_ptr) {
-			kfree_skb(hw->recving);
-			hw->recving = NULL; hw->rx_ptr = 0;
-		}
-		printk(KERN_ERR "MIXCOM: rx overrun\n");
-		hscx_cmd(dev, HSCX_RHR);
-	}
-
-	if (exir & HSCX_XDU) { // xmit underrun
-		ch->stats.tx_errors++;
-		ch->stats.tx_aborted_errors++;
-		if (hw->tx_ptr) {
-			kfree_skb(hw->sending);
-			hw->sending = NULL; 
-			hw->tx_ptr = 0;
-		}
-		hscx_cmd(dev, HSCX_XRES);
-		clear_bit(0, &hw->txbusy);
-		if (ch->LINE_tx) {
-			ch->LINE_tx(dev);
-		}
-		printk(KERN_ERR "MIXCOM: tx underrun\n");
-	}
-
-	if (exir & HSCX_CSC) {        
-		ch->stats.tx_carrier_errors++;
-		if ((rd_hscx(dev, HSCX_STAR) & HSCX_CTS) == 0) { // Vonal le
-			if (test_and_clear_bit(0, &ch->lineup_pending)) {
-               			del_timer(&ch->lineup_timer);
-			} else if (ch->line_status & LINE_UP) {
-        		       	ch->line_status &= ~LINE_UP;
-                		if (ch->LINE_status) {
-                      			ch->LINE_status(dev,ch->line_status);
-                      		}
-		      	}
-		}
-		if (!(ch->line_status & LINE_UP) && (rd_hscx(dev, HSCX_STAR) & 
-		    HSCX_CTS)) { // Vonal fol
-			if (!test_and_set_bit(0,&ch->lineup_pending)) {
-				ch->lineup_timer.function = comx_lineup_func;
-	        	        ch->lineup_timer.data = (unsigned long)dev;
-        	        	ch->lineup_timer.expires = jiffies + HZ * 
-        	        		ch->lineup_delay;
-	                	add_timer(&ch->lineup_timer);
-		                hscx_cmd(dev, HSCX_XRES);
-        		        clear_bit(0, &hw->txbusy);
-                		if (hw->sending) {
-					kfree_skb(hw->sending);
-				}
-				hw->sending=NULL;
-				hw->tx_ptr = 0;
-			}
-		}
-	}
-}
-
-
-static irqreturn_t MIXCOM_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-	unsigned long flags;
-	struct net_device *dev = (struct net_device *)dev_id;
-	struct comx_channel *ch, *twin_ch;
-	struct mixcom_privdata *hw, *twin_hw;
-	register unsigned char ista;
-
-	if (dev==NULL) {
-		printk(KERN_ERR "comx_interrupt: irq %d for unknown device\n",irq);
-		return IRQ_NONE;
-	}
-
-	ch = dev->priv; 
-	hw = ch->HW_privdata;
-
-	save_flags(flags); cli(); 
-
-	while((ista = (rd_hscx(dev, HSCX_ISTA) & (HSCX_RME | HSCX_RPF | 
-	    HSCX_XPR | HSCX_EXB | HSCX_EXA | HSCX_ICA)))) {
-		register byte ista2 = 0;
-
-		if (ista & HSCX_RME) {
-			mixcom_receive_frame(dev);
-		}
-		if (ista & HSCX_RPF) {
-			hscx_empty_fifo(dev, 32);
-		}
-		if (ista & HSCX_XPR) {
-			if (hw->tx_ptr) {
-				hscx_fill_fifo(dev);
-			} else {
-				clear_bit(0, &hw->txbusy);
-               			ch->LINE_tx(dev);
-			}
-		}
-		
-		if (ista & HSCX_EXB) {
-			mixcom_extended_interrupt(dev);
-		}
-		
-		if ((ista & HSCX_EXA) && ch->twin)  {
-			mixcom_extended_interrupt(ch->twin);
-		}
-	
-		if ((ista & HSCX_ICA) && ch->twin &&
-		    (ista2 = rd_hscx(ch->twin, HSCX_ISTA) &
-		    (HSCX_RME | HSCX_RPF | HSCX_XPR ))) {
-			if (ista2 & HSCX_RME) {
-				mixcom_receive_frame(ch->twin);
-			}
-			if (ista2 & HSCX_RPF) {
-				hscx_empty_fifo(ch->twin, 32);
-			}
-			if (ista2 & HSCX_XPR) {
-				twin_ch=ch->twin->priv;
-				twin_hw=twin_ch->HW_privdata;
-				if (twin_hw->tx_ptr) {
-					hscx_fill_fifo(ch->twin);
-				} else {
-					clear_bit(0, &twin_hw->txbusy);
-					ch->LINE_tx(ch->twin);
-				}
-			}
-		}
-	}
-
-	restore_flags(flags);
-	return IRQ_HANDLED;
-}
-
-static int MIXCOM_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-	unsigned long flags; 
-	int ret = -ENODEV;
-
-	if (!dev->base_addr || !dev->irq)
-		goto err_ret;
-
-
-	if(hw->channel==1) {
-		if(!TWIN(dev) || !(COMX_CHANNEL(TWIN(dev))->init_status & 
-		    IRQ_ALLOCATED)) {
-			printk(KERN_ERR "%s: channel 0 not yet initialized\n",dev->name);
-			ret = -EAGAIN;
-			goto err_ret;
-		}
-	}
-
-
-	/* Is our hw present at all ? Not checking for channel 0 if it is already 
-	   open */
-	if(hw->channel!=0 || !(ch->init_status & IRQ_ALLOCATED)) {
-		if (!request_region(dev->base_addr, MIXCOM_IO_EXTENT, dev->name)) {
-			ret = -EAGAIN;
-			goto err_ret;
-		}
-		if (mixcom_probe(dev)) {
-			ret = -ENODEV;
-			goto err_release_region;
-		}
-	}
-
-	if(hw->channel==0 && !(ch->init_status & IRQ_ALLOCATED)) {
-		if (request_irq(dev->irq, MIXCOM_interrupt, 0, 
-		    dev->name, (void *)dev)) {
-			printk(KERN_ERR "MIXCOM: unable to obtain irq %d\n", dev->irq);
-			ret = -EAGAIN;
-			goto err_release_region;
-		}
-	}
-
-	save_flags(flags); cli();
-
-	if(hw->channel==0 && !(ch->init_status & IRQ_ALLOCATED)) {
-		ch->init_status|=IRQ_ALLOCATED;
-		mixcom_board_on(dev);
-	}
-
-	mixcom_on(dev);
-
-
-	hw->status=inb(MIXCOM_BOARD_BASE(dev) + MIXCOM_STATUS_OFFSET);
-	if(hw->status != 0xff) {
-		printk(KERN_DEBUG "%s: board has status register, good\n", dev->name);
-		hw->card_has_status=1;
-	}
-
-	hw->txbusy = 0;
-	ch->init_status |= HW_OPEN;
-	
-	if (rd_hscx(dev, HSCX_STAR) & HSCX_CTS) {
-		ch->line_status |= LINE_UP;
-	} else {
-		ch->line_status &= ~LINE_UP;
-	}
-
-	restore_flags(flags);
-
-	ch->LINE_status(dev, ch->line_status);
-
-	for (; procfile ; procfile = procfile->next) {
-		if (strcmp(procfile->name, FILENAME_IO) == 0 ||
-		    strcmp(procfile->name, FILENAME_CHANNEL) == 0 ||
-		    strcmp(procfile->name, FILENAME_CLOCK) == 0 ||
-		    strcmp(procfile->name, FILENAME_IRQ) == 0) {
-			procfile->mode = S_IFREG |  0444;
-		}
-	}
-
-	return 0;
-	
-err_release_region:
-	release_region(dev->base_addr, MIXCOM_IO_EXTENT);
-err_ret:
-	return ret;
-}
-
-static int MIXCOM_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	struct proc_dir_entry *procfile = ch->procdir->subdir;
-	unsigned long flags;
-
-
-	save_flags(flags); cli();
-
-	mixcom_off(dev);
-
-	/* This is channel 0, twin is not open, we can safely turn off everything */
-	if(hw->channel==0 && (!(TWIN(dev)) || 
-	    !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN))) {
-		mixcom_board_off(dev);
-		free_irq(dev->irq, dev);
-		release_region(dev->base_addr, MIXCOM_IO_EXTENT);
-		ch->init_status &= ~IRQ_ALLOCATED;
-	}
-
-	/* This is channel 1, channel 0 has already been shutdown, we can release
-	   this one too */
-	if(hw->channel==1 && !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN)) {
-		if(COMX_CHANNEL(TWIN(dev))->init_status & IRQ_ALLOCATED) {
-			mixcom_board_off(TWIN(dev));
-			free_irq(TWIN(dev)->irq, TWIN(dev));
-			release_region(TWIN(dev)->base_addr, MIXCOM_IO_EXTENT);
-			COMX_CHANNEL(TWIN(dev))->init_status &= ~IRQ_ALLOCATED;
-		}
-	}
-
-	/* the ioports for channel 1 can be safely released */
-	if(hw->channel==1) {
-		release_region(dev->base_addr, MIXCOM_IO_EXTENT);
-	}
-
-	restore_flags(flags);
-
-	/* If we don't hold any hardware open */
-	if(!(ch->init_status & IRQ_ALLOCATED)) {
-		for (; procfile ; procfile = procfile->next) {
-			if (strcmp(procfile->name, FILENAME_IO) == 0 ||
-			    strcmp(procfile->name, FILENAME_CHANNEL) == 0 ||
-			    strcmp(procfile->name, FILENAME_CLOCK) == 0 ||
-			    strcmp(procfile->name, FILENAME_IRQ) == 0) {
-				procfile->mode = S_IFREG |  0644;
-			}
-		}
-	}
-
-	/* channel 0 was only waiting for us to close channel 1 
-	   close it completely */
-   
-	if(hw->channel==1 && !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN)) {
-		for (procfile=COMX_CHANNEL(TWIN(dev))->procdir->subdir; 
-		    procfile ; procfile = procfile->next) {
-			if (strcmp(procfile->name, FILENAME_IO) == 0 ||
-			    strcmp(procfile->name, FILENAME_CHANNEL) == 0 ||
-			    strcmp(procfile->name, FILENAME_CLOCK) == 0 ||
-			    strcmp(procfile->name, FILENAME_IRQ) == 0) {
-				procfile->mode = S_IFREG |  0644;
-			}
-		}
-	}
-	
-	ch->init_status &= ~HW_OPEN;
-	return 0;
-}
-
-static int MIXCOM_statistics(struct net_device *dev,char *page)
-{
-	struct comx_channel *ch = dev->priv;
-	// struct mixcom_privdata *hw = ch->HW_privdata;
-	int len = 0;
-
-	if(ch->init_status && IRQ_ALLOCATED) {
-		len += sprintf(page + len, "Mixcom board: hardware open\n");
-	}
-
-	return len;
-}
-
-static int MIXCOM_dump(struct net_device *dev) {
-	return 0;
-}
-
-static int mixcom_read_proc(char *page, char **start, off_t off, int count,
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	int len = 0;
-
-	if (strcmp(file->name, FILENAME_IO) == 0) {
-		len = sprintf(page, "0x%x\n", 
-			(unsigned int)MIXCOM_BOARD_BASE(dev));
-	} else if (strcmp(file->name, FILENAME_IRQ) == 0) {
-		len = sprintf(page, "%d\n", (unsigned int)dev->irq);
-	} else if (strcmp(file->name, FILENAME_CLOCK) == 0) {
-		if (hw->clock) len = sprintf(page, "%d\n", hw->clock);
-			else len = sprintf(page, "external\n");
-	} else if (strcmp(file->name, FILENAME_CHANNEL) == 0) {
-		len = sprintf(page, "%01d\n", hw->channel);
-	} else if (strcmp(file->name, FILENAME_TWIN) == 0) {
-		if (ch->twin) {
-			len = sprintf(page, "%s\n",ch->twin->name);
-		} else {
-			len = sprintf(page, "none\n");
-		}
-	} else {
-		printk(KERN_ERR "mixcom_read_proc: internal error, filename %s\n", file->name);
-		return -EBADF;
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-	*start = page + off;
-	if (count >= len - off) *eof = 1;
-	return min_t(int, count, len - off);
-}
-
-
-static struct net_device *mixcom_twin_check(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *procfile = ch->procdir->parent->subdir;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-
-	struct net_device *twin;
-	struct comx_channel *ch_twin;
-	struct mixcom_privdata *hw_twin;
-
-
-	for ( ; procfile ; procfile = procfile->next) {
-		if(!S_ISDIR(procfile->mode)) continue;
-                
-        	twin = procfile->data;
-	        ch_twin = twin->priv;
-        	hw_twin = ch_twin->HW_privdata;
-
-
-	        if (twin != dev && dev->irq && dev->base_addr && 
-        	    dev->irq == twin->irq && 
-        	    ch->hardware == ch_twin->hardware &&
-		    dev->base_addr == twin->base_addr + 
-		    (1-2*hw->channel)*MIXCOM_CHANNEL_OFFSET &&
-		    hw->channel == (1 - hw_twin->channel)) {
-	        	if  (!TWIN(twin) || TWIN(twin)==dev) {
-	        		return twin;
-	        	}
-		}
-        }
-	return NULL;
-}
-
-
-static void setup_twin(struct net_device* dev) 
-{
-
-	if(TWIN(dev) && TWIN(TWIN(dev))) {
-		TWIN(TWIN(dev))=NULL;
-	}
-	if ((TWIN(dev) = mixcom_twin_check(dev)) != NULL) {
-		if (TWIN(TWIN(dev)) && TWIN(TWIN(dev)) != dev) {
-			TWIN(dev)=NULL;
-		} else {
-			TWIN(TWIN(dev))=dev;
-		}
-	}	
-}
-
-static int mixcom_write_proc(struct file *file, const char *buffer,
-	u_long count, void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = (struct net_device *)entry->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-	char *page;
-	int value;
-
-	if (!(page = (char *)__get_free_page(GFP_KERNEL))) {
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(page, buffer, count = min_t(unsigned long, count, PAGE_SIZE))) {
-		free_page((unsigned long)page);
-		return -EFAULT;
-	}
-	if (*(page + count - 1) == '\n') {
-		*(page + count - 1) = 0;
-	}
-
-	if (strcmp(entry->name, FILENAME_IO) == 0) {
-		value = simple_strtoul(page, NULL, 0);
-		if (value != 0x180 && value != 0x280 && value != 0x380) {
-			printk(KERN_ERR "MIXCOM: incorrect io address!\n");
-		} else {
-			dev->base_addr = MIXCOM_DEV_BASE(value,hw->channel);
-		}
-	} else if (strcmp(entry->name, FILENAME_IRQ) == 0) {
-		value = simple_strtoul(page, NULL, 0); 
-		if (value < 0 || value > 15 || mixcom_set_irq[value]==0xFF) {
-			printk(KERN_ERR "MIXCOM: incorrect irq value!\n");
-		} else {
-			dev->irq = value;	
-		}
-	} else if (strcmp(entry->name, FILENAME_CLOCK) == 0) {
-		if (strncmp("ext", page, 3) == 0) {
-			hw->clock = 0;
-		} else {
-			int kbps;
-
-			kbps = simple_strtoul(page, NULL, 0);
-			if (!kbps) {
-				hw->clock = 0;
-			} else {
-				hw->clock = kbps;
-			}
-			if (hw->clock < 32 || hw->clock > 2000) {
-				hw->clock = 0;
-				printk(KERN_ERR "MIXCOM: invalid clock rate!\n");
-			}
-		}
-		if (ch->init_status & HW_OPEN && ch->HW_set_clock) {
-			ch->HW_set_clock(dev);
-		}
-	} else if (strcmp(entry->name, FILENAME_CHANNEL) == 0) {
-		value = simple_strtoul(page, NULL, 0);
-        	if (value > 2) {
-                	printk(KERN_ERR "Invalid channel number\n");
-	        } else {
-        		dev->base_addr+=(hw->channel - value) * MIXCOM_CHANNEL_OFFSET;
-	        	hw->channel = value;
-		}	        
-	} else {
-		printk(KERN_ERR "hw_read_proc: internal error, filename %s\n", 
-			entry->name);
-		return -EBADF;
-	}
-
-	setup_twin(dev);
-
-	free_page((unsigned long)page);
-	return count;
-}
-
-static int MIXCOM_init(struct net_device *dev) {
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw;
-	struct proc_dir_entry *new_file;
-
-	if ((ch->HW_privdata = kmalloc(sizeof(struct mixcom_privdata), 
-	    GFP_KERNEL)) == NULL) {
-	    	return -ENOMEM;
-	}
-
-	memset(hw = ch->HW_privdata, 0, sizeof(struct mixcom_privdata));
-
-	if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_HW_privdata;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &mixcom_read_proc;
-	new_file->write_proc = &mixcom_write_proc;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-	    	goto cleanup_filename_io;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &mixcom_read_proc;
-	new_file->write_proc = &mixcom_write_proc;
-	new_file->nlink = 1;
-
-#if 0
-	if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-	    	return -EIO;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &mixcom_read_proc;
-	new_file->write_proc = &mixcom_write_proc;
-	new_file->nlink = 1;
-#endif
-
-	if ((new_file = create_proc_entry(FILENAME_CHANNEL, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-	    	goto cleanup_filename_irq;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &mixcom_read_proc;
-	new_file->write_proc = &mixcom_write_proc;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_TWIN, S_IFREG | 0444, 
-	    ch->procdir)) == NULL) {
-	    	goto cleanup_filename_channel;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &mixcom_read_proc;
-	new_file->write_proc = &mixcom_write_proc;
-	new_file->nlink = 1;
-
-	setup_twin(dev);
-
-	/* Fill in ch_struct hw specific pointers */
-	ch->HW_access_board = NULL;
-	ch->HW_release_board = NULL;
-	ch->HW_txe = MIXCOM_txe;
-	ch->HW_open = MIXCOM_open;
-	ch->HW_close = MIXCOM_close;
-	ch->HW_send_packet = MIXCOM_send_packet;
-	ch->HW_statistics = MIXCOM_statistics;
-	ch->HW_set_clock = NULL;
-
-	dev->base_addr = MIXCOM_DEV_BASE(MIXCOM_DEFAULT_IO,0);
-	dev->irq = MIXCOM_DEFAULT_IRQ;
-
-	MOD_INC_USE_COUNT;
-	return 0;
-cleanup_filename_channel:
-	remove_proc_entry(FILENAME_CHANNEL, ch->procdir);
-cleanup_filename_irq:
-	remove_proc_entry(FILENAME_IRQ, ch->procdir);
-cleanup_filename_io:
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-cleanup_HW_privdata:
-	kfree(ch->HW_privdata);
-	return -EIO;
-}
-
-static int MIXCOM_exit(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct mixcom_privdata *hw = ch->HW_privdata;
-
-	if(hw->channel==0 && TWIN(dev)) {
-		return -EBUSY;
-	}
-
-	if(hw->channel==1 && TWIN(dev)) {
-		TWIN(TWIN(dev))=NULL;
-	}
-
-	kfree(ch->HW_privdata);
-	remove_proc_entry(FILENAME_IO, ch->procdir);
-	remove_proc_entry(FILENAME_IRQ, ch->procdir);
-#if 0
-	remove_proc_entry(FILENAME_CLOCK, ch->procdir);
-#endif
-	remove_proc_entry(FILENAME_CHANNEL, ch->procdir);
-	remove_proc_entry(FILENAME_TWIN, ch->procdir);
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static struct comx_hardware mixcomhw = {
-	"mixcom",
-	VERSION,
-	MIXCOM_init, 
-	MIXCOM_exit,
-	MIXCOM_dump,
-	NULL
-};
-	
-static int __init comx_hw_mixcom_init(void)
-{
-	return comx_register_hardware(&mixcomhw);
-}
-
-static void __exit comx_hw_mixcom_exit(void)
-{
-	comx_unregister_hardware("mixcom");
-}
-
-module_init(comx_hw_mixcom_init);
-module_exit(comx_hw_mixcom_exit);
diff -Nru a/drivers/net/wan/comx-hw-munich.c b/drivers/net/wan/comx-hw-munich.c
--- a/drivers/net/wan/comx-hw-munich.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,2854 +0,0 @@
-/*
- * Hardware-level driver for the SliceCOM board for Linux kernels 2.4.X
- *
- * Current maintainer / latest changes: Pasztor Szilard <don@itc.hu>
- *
- * Original author: Bartok Istvan <bartoki@itc.hu>
- * Based on skeleton by Tivadar Szemethy <tiv@itc.hu>
- *
- * 0.51:
- *      - port for 2.4.x
- *	- clean up some code, make it more portable
- *	- busted direct hardware access through mapped memory
- *	- fix a possible race
- *	- prevent procfs buffer overflow
- *
- * 0.50:
- *	- support for the pcicom board, lots of rearrangements
- *	- handle modem status lines
- *
- * 0.50a:
- *	- fix for falc version 1.0
- *
- * 0.50b: T&t
- *	- fix for bad localbus
- */
-
-#define VERSION		"0.51"
-#define VERSIONSTR	"SliceCOM v" VERSION ", 2002/01/07\n"
-
-#include <linux/config.h>
-#include <linux/ctype.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-
-#include <asm/delay.h>
-#include <asm/types.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#define COMX_NEW
-
-#ifndef COMX_NEW
-#include "../include/comx.h"
-#include "../include/munich32x.h"
-#include "../include/falc-lh.h"
-#else
-#include "comx.h"
-#include "munich32x.h"
-#include "falc-lh.h"
-#endif
-
-MODULE_AUTHOR("Bartok Istvan <bartoki@itc.hu>, Gergely Madarasz <gorgo@itc.hu>, Szilard Pasztor <don@itc.hu>");
-MODULE_DESCRIPTION("Hardware-level driver for the SliceCOM and PciCOM (WelCOM) adapters");
-MODULE_LICENSE("GPL");
-/*
- *	TODO: az ilyenek a comxhw.h -ban szoktak lenni, idovel menjenek majd oda:
- */
-
-#define FILENAME_BOARDNUM	"boardnum"	/* /proc/comx/comx0.1/boardnum          */
-#define FILENAME_TIMESLOTS	"timeslots"	/* /proc/comx/comx0.1/timeslots         */
-#define FILENAME_FRAMING	"framing"	/* /proc/comx/comx0.1/framing           */
-#define FILENAME_LINECODE	"linecode"	/* /proc/comx/comx0.1/linecode          */
-#define FILENAME_CLOCK_SOURCE	"clock_source"	/* /proc/comx/comx0.1/clock_source      */
-#define FILENAME_LOOPBACK	"loopback"	/* /proc/comx/comx0.1/loopback          */
-#define FILENAME_REG		"reg"		/* /proc/comx/comx0.1/reg               */
-#define FILENAME_LBIREG		"lbireg"	/* /proc/comx/comx0.1/lbireg            */
-
-#define SLICECOM_BOARDNUM_DEFAULT	0
-
-#define SLICECOM_FRAMING_CRC4		1
-#define SLICECOM_FRAMING_NO_CRC4	2
-#define SLICECOM_FRAMING_DEFAULT	SLICECOM_FRAMING_CRC4
-
-#define SLICECOM_LINECODE_HDB3		1
-#define SLICECOM_LINECODE_AMI		2
-#define SLICECOM_LINECODE_DEFAULT	SLICECOM_LINECODE_HDB3
-
-#define SLICECOM_CLOCK_SOURCE_LINE	1
-#define SLICECOM_CLOCK_SOURCE_INTERNAL	2
-#define SLICECOM_CLOCK_SOURCE_DEFAULT	SLICECOM_CLOCK_SOURCE_LINE
-
-#define SLICECOM_LOOPBACK_NONE		1
-#define SLICECOM_LOOPBACK_LOCAL		2
-#define SLICECOM_LOOPBACK_REMOTE	3
-#define SLICECOM_LOOPBACK_DEFAULT	SLICECOM_LOOPBACK_NONE
-
-#define MUNICH_VIRT(addr) (void *)(&bar1[addr])
-
-struct slicecom_stringtable
-{
-    char *name;
-    int value;
-};
-
-/* A convention: keep "default" the last not NULL when reading from /proc,
-   "error" is an indication that something went wrong, we have an undefined value */
-
-struct slicecom_stringtable slicecom_framings[] =
-{
-    {"crc4", SLICECOM_FRAMING_CRC4},
-    {"no-crc4", SLICECOM_FRAMING_NO_CRC4},
-    {"default", SLICECOM_FRAMING_DEFAULT},
-    {"error", 0}
-};
-
-struct slicecom_stringtable slicecom_linecodes[] =
-{
-    {"hdb3", SLICECOM_LINECODE_HDB3},
-    {"ami", SLICECOM_LINECODE_AMI},
-    {"default", SLICECOM_LINECODE_DEFAULT},
-    {"error", 0}
-};
-
-struct slicecom_stringtable slicecom_clock_sources[] =
-{
-    {"line", SLICECOM_CLOCK_SOURCE_LINE},
-    {"internal", SLICECOM_CLOCK_SOURCE_INTERNAL},
-    {"default", SLICECOM_CLOCK_SOURCE_DEFAULT},
-    {"error", 0}
-};
-
-struct slicecom_stringtable slicecom_loopbacks[] =
-{
-    {"none", SLICECOM_LOOPBACK_NONE},
-    {"local", SLICECOM_LOOPBACK_LOCAL},
-    {"remote", SLICECOM_LOOPBACK_REMOTE},
-    {"default", SLICECOM_LOOPBACK_DEFAULT},
-    {"error", 0}
-};
-
-/*
- *	Some tunable values...
- *
- *	Note: when tuning values which change the length of text in
- *	/proc/comx/comx[n]/status, keep in mind that it must be shorter then
- *	PAGESIZE !
- */
-
-#define MAX_BOARDS	4	/* ezzel 4 kartya lehet a gepben: 0..3          */
-#define RX_DESC_MAX	8	/* Rx ring size, must be >= 4                   */
-#define TX_DESC_MAX	4	/* Tx ring size, must be >= 2                   */
-				/* a sokkal hosszabb Tx ring mar ronthatja a nem-FIFO packet    */
-				/* schedulerek (fair queueing, stb.) hatekonysagat.             */
-#define MAX_WORK	10	/* TOD: update the info max. ennyi-1 esemenyt dolgoz fel egy interrupt hivasnal */
-
-/*
- *	These are tunable too, but don't touch them without fully understanding what is happening
- */
-
-#define UDELAY		20	/* We wait UDELAY usecs with disabled interrupts before and     */
-				/* after each command to avoid writing into each other's        */
-				/* ccb->action_spec. A _send_packet nem var, mert azt az        */
-				/* _interrupt()-bol is meghivhatja a LINE_tx()                  */
-
-/*
- *	Just to avoid warnings about implicit declarations:
- */
-
-static int MUNICH_close(struct net_device *dev);
-static struct comx_hardware slicecomhw;
-static struct comx_hardware pcicomhw;
-
-static unsigned long flags;
-static spinlock_t mister_lock = SPIN_LOCK_UNLOCKED;
-
-typedef volatile struct		/* Time Slot Assignment */
-{
-    u32 rxfillmask:8,		// ----------------------------+------+
-				//                             |      |
-      rxchannel:5,		// ----------------------+---+ |      |
-      rti:1,			// ---------------------+|   | |      |
-      res2:2,			// -------------------++||   | |      |
-				//                    ||||   | |      |
-      txfillmask:8,		// ----------+------+ ||||   | |      |
-				//           |      | ||||   | |      |
-      txchannel:5,		// ----+---+ |      | ||||   | |      |
-      tti:1,			// ---+|   | |      | ||||   | |      |
-      res1:2;			// -++||   | |      | ||||   | |      |
-				//   3          2          1
-    				//  10987654 32109876 54321098 76543210
-} timeslot_spec_t;
-
-typedef volatile struct		/* Receive Descriptor */
-{
-    u32 zero1:16, no:13, hi:1, hold:1, zero2:1;
-
-    u32 next;
-    u32 data;
-
-    u32 zero3:8, status:8, bno:13, zero4:1, c:1, fe:1;
-} rx_desc_t;
-
-typedef volatile struct		/* Transmit Descriptor */
-{
-    u32 fnum:11, csm:1, no13:1, zero1:2, v110:1, no:13, hi:1, hold:1, fe:1;
-
-    u32 next;
-    u32 data;
-
-} tx_desc_t;
-
-typedef volatile struct		/* Channel Specification */
-{
-    u32 iftf:1, mode:2, fa:1, trv:2, crc:1, inv:1, cs:1, tflag:7, ra:1, ro:1,
-	th:1, ta:1, to:1, ti:1, ri:1, nitbs:1, fit:1, fir:1, re:1, te:1, ch:1,
-	ifc:1, sfe:1, fe2:1;
-
-    u32 frda;
-    u32 ftda;
-
-    u32 itbs:6, zero1:26;
-
-} channel_spec_t;
-
-typedef volatile struct		/* Configuration Control Block */
-{
-    u32 action_spec;
-    u32 reserved1;
-    u32 reserved2;
-    timeslot_spec_t timeslot_spec[32];
-    channel_spec_t channel_spec[32];
-    u32 current_rx_desc[32];
-    u32 current_tx_desc[32];
-    u32 csa;			/* Control Start Address. CSA = *CCBA; CCB = *CSA */
-				/* MUNICH does it like: CCB = *( *CCBA )          */
-} munich_ccb_t;
-
-typedef volatile struct		/* Entry in the interrupt queue */
-{
-    u32 all;
-} munich_intq_t;
-
-#define MUNICH_INTQLEN	63	/* Rx/Tx Interrupt Queue Length
-				   (not the real len, but the TIQL/RIQL value)  */
-#define MUNICH_INTQMAX	( 16*(MUNICH_INTQLEN+1) )	/* Rx/Tx/Periph Interrupt Queue size in munich_intq_t's */
-#define MUNICH_INTQSIZE	( 4*MUNICH_INTQMAX )	/* Rx/Tx/Periph Interrupt Queue size in bytes           */
-
-#define MUNICH_PIQLEN	4	/* Peripheral Interrupt Queue Length. Unlike the RIQL/TIQL, */
-#define MUNICH_PIQMAX	( 4*MUNICH_PIQLEN )	/* PIQL register needs it like this                     */
-#define MUNICH_PIQSIZE	( 4*MUNICH_PIQMAX )
-
-typedef volatile u32 vol_u32;	/* TOD: ezek megszunnek ha atirom readw()/writew()-re - kész */
-typedef volatile u8 vol_u8;
-
-typedef volatile struct		/* counters of E1-errors and errored seconds, see rfc2495 */
-{
-    /* use here only unsigned ints, we depend on it when calculating the sum for the last N intervals */
-
-    unsigned line_code_violations,	/* AMI: bipolar violations, HDB3: hdb3 violations                       */
-      path_code_violations,	/* FAS errors and CRC4 errors                                                   */
-      e_bit_errors,		/* E-Bit Errors (the remote side received from us with CRC4-error) */
-      slip_secs,		/* number of seconds with (receive) Controlled Slip(s)          */
-      fr_loss_secs,		/* number of seconds an Out Of Frame defect was detected                */
-      line_err_secs,		/* number of seconds with one or more Line Code Violations              */
-      degraded_mins,		/* Degraded Minute - the estimated error rate is >1E-6, but <1E-3       */
-      errored_secs,		/* Errored Second - at least one of these happened:
-				   - Path Code Violation
-				   - Out Of Frame defect
-				   - Slip
-				   - receiving AIS
-				   - not incremented during an Unavailable Second                       */
-      bursty_err_secs,		/* Bursty Errored Second: (rfc2495 says it does not apply to E1)
-				   - Path Code Violations >1, but <320
-				   - not a Severely Errored Second
-				   - no AIS
-				   - not incremented during an Unavailabla Second                       */
-      severely_err_secs,	/* Severely Errored Second:
-				   - CRC4: >=832 Path COde Violations || >0 Out Of Frame defects
-				   - noCRC4: >=2048 Line Code Violations
-				   - not incremented during an Unavailable Second                       */
-      unavail_secs;		/* number of Unavailable Seconds. Unavailable state is said after:
-				   - 10 contiguous Severely Errored Seconds
-				   - or RAI || AIS || LOF || LOS 
-				   - (any) loopback has been set                                                */
-
-    /*
-     * we do not strictly comply to the rfc: we do not retroactively reduce errored_secs,
-     * bursty_err_secs, severely_err_secs when 'unavailable state' is reached
-     */
-
-} e1_stats_t;
-
-typedef volatile struct		/* ezek board-adatok, nem lehetnek a slicecom_privdata -ban     */
-{
-    int use_count;		/* num. of interfaces using the board                           */
-    int irq;			/* a kartya irq-ja. belemasoljuk a dev->irq -kba is, de csak hogy       */
-    /* szebb legyen az ifconfig outputja                            */
-    /* ha != 0, az azt jelenti hogy az az irq most nekunk sikeresen */
-    /* le van foglalva                                              */
-    struct pci_dev *pci;	/* a kartya PCI strukturaja. NULL, ha nincs kartya              */
-    u32 *bar1;			/* pci->base_address[0] ioremap()-ed by munich_probe(),         */
-    /* on x86 can be used both as a bus or virtual address.         */
-    /* These are the Munich's registers                             */
-    u8 *lbi;			/* pci->base_address[1] ioremap()-ed by munich_probe(),         */
-    /* this is a 256-byte range, the start of the LBI on the board  */
-    munich_ccb_t *ccb;		/* virtual address of CCB                                       */
-    munich_intq_t *tiq;		/* Tx Interrupt Queue                                           */
-    munich_intq_t *riq;		/* Rx Interrupt Queue                                           */
-    munich_intq_t *piq;		/* Peripheral Interrupt Queue (FALC interrupts arrive here)     */
-    int tiq_ptr,		/* A 'current' helyek a tiq/riq/piq -ban.                       */
-      riq_ptr,			/* amikor feldolgoztam az interruptokat, a legelso ures         */
-      piq_ptr;			/* interrupt_information szora mutatnak.                        */
-    struct net_device *twins[32];	/* MUNICH channel -> network interface assignment       */
-
-    unsigned long lastcheck;	/* When were the Rx rings last checked. Time in jiffies         */
-
-    struct timer_list modemline_timer;
-    char isx21;
-    char lineup;
-    char framing;		/* a beallitasok tarolasa                               */
-    char linecode;
-    char clock_source;
-    char loopback;
-
-    char devname[30];		/* what to show in /proc/interrupts                     */
-    unsigned histogram[MAX_WORK];	/* number of processed events in the interrupt loop     */
-    unsigned stat_pri_races;	/* number of special events, we try to handle them      */
-    unsigned stat_pti_races;
-    unsigned stat_pri_races_missed;	/* when it can not be handled, because of MAX_WORK      */
-    unsigned stat_pti_races_missed;
-
-#define SLICECOM_BOARD_INTERVALS_SIZE	97
-    e1_stats_t intervals[SLICECOM_BOARD_INTERVALS_SIZE];	/* E1 line statistics           */
-    unsigned current_interval;	/* pointer to the current interval                      */
-    unsigned elapsed_seconds;	/* elapsed seconds from the start of the current interval */
-    unsigned ses_seconds;	/* counter of contiguous Severely Errored Seconds       */
-    unsigned is_unavailable;	/* set to 1 after 10 contiguous Severely Errored Seconds */
-    unsigned no_ses_seconds;	/* contiguous Severely Error -free seconds in unavail state */
-
-    unsigned deg_elapsed_seconds;	/* for counting the 'Degraded Mins'                     */
-    unsigned deg_cumulated_errors;
-
-    struct module *owner;	/* pointer to our module to avoid module load races */
-} munich_board_t;
-
-struct slicecom_privdata
-{
-    int busy;			/* transmitter busy - number of packets in the Tx ring  */
-    int channel;		/* Munich logical channel ('channel-group' in Cisco)    */
-    unsigned boardnum;
-    u32 timeslots;		/* i-th bit means i-th timeslot is our                  */
-
-    int tx_ring_hist[TX_DESC_MAX];	/* histogram: number of packets in Tx ring when _send_packet is called  */
-
-    tx_desc_t tx_desc[TX_DESC_MAX];	/* the ring of Tx descriptors                           */
-    u8 tx_data[TX_DESC_MAX][TXBUFFER_SIZE];	/* buffers for data to transmit                 */
-    int tx_desc_ptr;		/* hanyadik descriptornal tartunk a beirassal   */
-    /* ahol ez all, oda irtunk utoljara                     */
-
-    rx_desc_t rx_desc[RX_DESC_MAX];	/* the ring of Rx descriptors                           */
-    u8 rx_data[RX_DESC_MAX][RXBUFFER_SIZE];	/* buffers for received data                            */
-    int rx_desc_ptr;		/* hanyadik descriptornal tartunk az olvasassal */
-
-    int rafutott;
-};
-
-static u32 reg, reg_ertek;	/* why static: don't write stack trash into regs if strtoul() fails */
-static u32 lbireg;
-static u8 lbireg_ertek;		/* why static: don't write stack trash into regs if strtoul() fails */
-
-static munich_board_t slicecom_boards[MAX_BOARDS];
-static munich_board_t pcicom_boards[MAX_BOARDS];
-
-/*
- * Reprogram Idle Channel Registers in the FALC - send special code in not used channels
- * Should be called from the open and close, when the timeslot assignment changes
- */
-
-void rework_idle_channels(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    munich_board_t *board = slicecom_boards + hw->boardnum;
-    munich_ccb_t *ccb = board->ccb;
-
-    u8 *lbi = board->lbi;
-    int i, j, tmp;
-
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    for (i = 0; i < 4; i++)
-    {
-	tmp = 0xFF;
-	for (j = 0; j < 8; j++)
-	    if (ccb->timeslot_spec[8 * i + j].tti == 0) tmp ^= (0x80 >> j);
-	writeb(tmp, lbi + 0x30 + i);
-    }
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * Set PCM framing - /proc/comx/comx0/framing
- */
-
-void slicecom_set_framing(int boardnum, int value)
-{
-    u8 *lbi = slicecom_boards[boardnum].lbi;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    slicecom_boards[boardnum].framing = value;
-    switch (value)
-    {
-	case SLICECOM_FRAMING_CRC4:
-	    writeb(readb(lbi + FMR1) | 8, lbi + FMR1);
-	    writeb((readb(lbi + FMR2) & 0x3f) | 0x80, lbi + FMR2);
-	    break;
-	case SLICECOM_FRAMING_NO_CRC4:
-	    writeb(readb(lbi + FMR1) & 0xf7, lbi + FMR1);
-	    writeb(readb(lbi + FMR2) & 0x3f, lbi + FMR2);
-	    break;
-	default:
-	    printk("slicecom: board %d: unhandled " FILENAME_FRAMING
-		   " value %d\n", boardnum, value);
-    }
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * Set PCM linecode - /proc/comx/comx0/linecode
- */
-
-void slicecom_set_linecode(int boardnum, int value)
-{
-    u8 *lbi = slicecom_boards[boardnum].lbi;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    slicecom_boards[boardnum].linecode = value;
-    switch (value)
-    {
-	case SLICECOM_LINECODE_HDB3:
-	    writeb(readb(lbi + FMR0) | 0xf0, lbi + FMR0);
-	    break;
-	case SLICECOM_LINECODE_AMI:
-	    writeb((readb(lbi + FMR0) & 0x0f) | 0xa0, lbi + FMR0);
-	    break;
-	default:
-	    printk("slicecom: board %d: unhandled " FILENAME_LINECODE
-		   " value %d\n", boardnum, value);
-    }
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * Set PCM clock source - /proc/comx/comx0/clock_source
- */
-
-void slicecom_set_clock_source(int boardnum, int value)
-{
-    u8 *lbi = slicecom_boards[boardnum].lbi;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    slicecom_boards[boardnum].clock_source = value;
-    switch (value)
-    {
-	case SLICECOM_CLOCK_SOURCE_LINE:
-	    writeb(readb(lbi + LIM0) & ~1, lbi + LIM0);
-	    break;
-	case SLICECOM_CLOCK_SOURCE_INTERNAL:
-	    writeb(readb(lbi + LIM0) | 1, lbi + LIM0);
-	    break;
-	default:
-	    printk("slicecom: board %d: unhandled " FILENAME_CLOCK_SOURCE
-		   " value %d\n", boardnum, value);
-    }
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * Set loopbacks - /proc/comx/comx0/loopback
- */
-
-void slicecom_set_loopback(int boardnum, int value)
-{
-    u8 *lbi = slicecom_boards[boardnum].lbi;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    slicecom_boards[boardnum].loopback = value;
-    switch (value)
-    {
-	case SLICECOM_LOOPBACK_NONE:
-	    writeb(readb(lbi + LIM0) & ~2, lbi + LIM0);	/* Local Loop OFF  */
-	    writeb(readb(lbi + LIM1) & ~2, lbi + LIM1);	/* Remote Loop OFF */
-	    break;
-	case SLICECOM_LOOPBACK_LOCAL:
-	    writeb(readb(lbi + LIM1) & ~2, lbi + LIM1);	/* Remote Loop OFF */
-	    writeb(readb(lbi + LIM0) | 2, lbi + LIM0);	/* Local Loop ON   */
-	    break;
-	case SLICECOM_LOOPBACK_REMOTE:
-	    writeb(readb(lbi + LIM0) & ~2, lbi + LIM0);	/* Local Loop OFF  */
-	    writeb(readb(lbi + LIM1) | 2, lbi + LIM1);	/* Remote Loop ON  */
-	    break;
-	default:
-	    printk("slicecom: board %d: unhandled " FILENAME_LOOPBACK
-		   " value %d\n", boardnum, value);
-    }
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * Update E1 line status LEDs on the adapter
- */
-
-void slicecom_update_leds(munich_board_t * board)
-{
-    u32 *bar1 = board->bar1;
-    u8 *lbi = board->lbi;
-    u8 frs0;
-    u32 leds;
-    int i;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    leds = 0;
-    frs0 = readb(lbi + FRS0);	/* FRS0 bits described on page 137 */
-
-    if (!(frs0 & 0xa0))
-    {
-	leds |= 0x2000;		/* Green LED: Input signal seems to be OK, no LOS, no LFA       */
-	if (frs0 & 0x10)
-	    leds |= 0x8000;	/* Red LED: Receiving Remote Alarm                                      */
-    }
-    writel(leds, MUNICH_VIRT(GPDATA));
-
-    if (leds == 0x2000 && !board->lineup)
-    {				/* line up */
-	board->lineup = 1;
-	for (i = 0; i < 32; i++)
-	{
-	    if (board->twins[i] && (board->twins[i]->flags & IFF_RUNNING))
-	    {
-		struct comx_channel *ch = board->twins[i]->priv;
-
-		if (!test_and_set_bit(0, &ch->lineup_pending))
-		{
-		    ch->lineup_timer.function = comx_lineup_func;
-		    ch->lineup_timer.data = (unsigned long)board->twins[i];
-		    ch->lineup_timer.expires = jiffies + HZ * ch->lineup_delay;
-		    add_timer(&ch->lineup_timer);
-		}
-	    }
-	}
-    }
-    else if (leds != 0x2000 && board->lineup)
-    {				/* line down */
-	board->lineup = 0;
-	for (i = 0; i < 32; i++)
-	    if (board->twins[i] && (board->twins[i]->flags & IFF_RUNNING))
-	    {
-		struct comx_channel *ch = board->twins[i]->priv;
-
-		if (test_and_clear_bit(0, &ch->lineup_pending))
-		    del_timer(&ch->lineup_timer);
-		else if (ch->line_status & LINE_UP)
-		{
-		    ch->line_status &= ~LINE_UP;
-		    if (ch->LINE_status)
-			ch->LINE_status(board->twins[i], ch->line_status);
-		}
-	    }
-    }
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-/*
- * This function gets called every second when the FALC issues the interrupt.
- * Hardware counters contain error counts for last 1-second time interval.
- * We add them to the global counters here.
- * Read rfc2495 to understand this.
- */
-
-void slicecom_update_line_counters(munich_board_t * board)
-{
-    e1_stats_t *curr_int = &board->intervals[board->current_interval];
-
-    u8 *lbi = board->lbi;
-
-    unsigned framing_errors, code_violations, path_code_violations, crc4_errors,
-	e_bit_errors;
-    unsigned slip_detected,	/* this one has logical value, not the number of slips! */
-      out_of_frame_defect,	/* logical value        */
-      ais_defect,		/* logical value        */
-      errored_sec, bursty_err_sec, severely_err_sec = 0, failure_sec;
-    u8 isr2, isr3, isr5, frs0;
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    isr2 = readb(lbi + ISR2);	/* ISR0-5 described on page 156     */
-    isr3 = readb(lbi + ISR3);
-    isr5 = readb(lbi + ISR5);
-    frs0 = readb(lbi + FRS0);	/* FRS0 described on page 137       */
-
-    /* Error Events: */
-
-    code_violations = readb(lbi + CVCL) + (readb(lbi + CVCH) << 8);
-    framing_errors = readb(lbi + FECL) + (readb(lbi + FECH) << 8);
-    crc4_errors = readb(lbi + CEC1L) + (readb(lbi + CEC1H) << 8);
-    e_bit_errors = readb(lbi + EBCL) + (readb(lbi + EBCH) << 8);
-    slip_detected = isr3 & (ISR3_RSN | ISR3_RSP);
-
-    path_code_violations = framing_errors + crc4_errors;
-
-    curr_int->line_code_violations += code_violations;
-    curr_int->path_code_violations += path_code_violations;
-    curr_int->e_bit_errors += e_bit_errors;
-
-    /* Performance Defects: */
-
-    /* there was an LFA in the last second, but maybe disappeared: */
-    out_of_frame_defect = (isr2 & ISR2_LFA) || (frs0 & FRS0_LFA);
-
-    /* there was an AIS in the last second, but maybe disappeared: */
-    ais_defect = (isr2 & ISR2_AIS) || (frs0 & FRS0_AIS);
-
-    /* Performance Parameters: */
-
-    if (out_of_frame_defect)
-	curr_int->fr_loss_secs++;
-    if (code_violations)
-	curr_int->line_err_secs++;
-
-    errored_sec = ((board->framing == SLICECOM_FRAMING_NO_CRC4) &&
-		   (code_violations)) || path_code_violations ||
-	out_of_frame_defect || slip_detected || ais_defect;
-
-    bursty_err_sec = !out_of_frame_defect && !ais_defect &&
-	(path_code_violations > 1) && (path_code_violations < 320);
-
-    switch (board->framing)
-    {
-	case SLICECOM_FRAMING_CRC4:
-	    severely_err_sec = out_of_frame_defect ||
-		(path_code_violations >= 832);
-	    break;
-	case SLICECOM_FRAMING_NO_CRC4:
-	    severely_err_sec = (code_violations >= 2048);
-	    break;
-    }
-
-    /*
-     * failure_sec: true if there was a condition leading to a failure
-     * (and leading to unavailable state) in this second:
-     */
-
-    failure_sec = (isr2 & ISR2_RA) || (frs0 & FRS0_RRA)	/* Remote/Far End/Distant Alarm Failure */
-	|| ais_defect || out_of_frame_defect	/* AIS or LOF Failure                           */
-	|| (isr2 & ISR2_LOS) || (frs0 & FRS0_LOS)	/* Loss Of Signal Failure                       */
-	|| (board->loopback != SLICECOM_LOOPBACK_NONE);	/* Loopback has been set                        */
-
-    if (board->is_unavailable)
-    {
-	if (severely_err_sec)
-	    board->no_ses_seconds = 0;
-	else
-	    board->no_ses_seconds++;
-
-	if ((board->no_ses_seconds >= 10) && !failure_sec)
-	{
-	    board->is_unavailable = 0;
-	    board->ses_seconds = 0;
-	    board->no_ses_seconds = 0;
-	}
-    }
-    else
-    {
-	if (severely_err_sec)
-	    board->ses_seconds++;
-	else
-	    board->ses_seconds = 0;
-
-	if ((board->ses_seconds >= 10) || failure_sec)
-	{
-	    board->is_unavailable = 1;
-	    board->ses_seconds = 0;
-	    board->no_ses_seconds = 0;
-	}
-    }
-
-    if (board->is_unavailable)
-	curr_int->unavail_secs++;
-    else
-    {
-	if (slip_detected)
-	    curr_int->slip_secs++;
-	curr_int->errored_secs += errored_sec;
-	curr_int->bursty_err_secs += bursty_err_sec;
-	curr_int->severely_err_secs += severely_err_sec;
-    }
-
-    /* the RFC does not say clearly which errors to count here, we try to count bit errors */
-
-    if (!board->is_unavailable && !severely_err_sec)
-    {
-	board->deg_cumulated_errors += code_violations;
-	board->deg_elapsed_seconds++;
-	if (board->deg_elapsed_seconds >= 60)
-	{
-	    if (board->deg_cumulated_errors >= 123)
-		curr_int->degraded_mins++;
-	    board->deg_cumulated_errors = 0;
-	    board->deg_elapsed_seconds = 0;
-	}
-
-    }
-
-    board->elapsed_seconds++;
-    if (board->elapsed_seconds >= 900)
-    {
-	board->current_interval =
-	    (board->current_interval + 1) % SLICECOM_BOARD_INTERVALS_SIZE;
-	memset((void *)&board->intervals[board->current_interval], 0,
-	       sizeof(e1_stats_t));
-	board->elapsed_seconds = 0;
-    }
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-}
-
-static void pcicom_modemline(unsigned long b)
-{
-    munich_board_t *board = (munich_board_t *) b;
-    struct net_device *dev = board->twins[0];
-    struct comx_channel *ch = netdev_priv(dev);
-    unsigned long regs;
-
-    regs = readl((void *)(&board->bar1[GPDATA]));
-    if ((ch->line_status & LINE_UP) && (regs & 0x0800))
-    {
-	ch->line_status &= ~LINE_UP;
-	board->lineup = 0;
-	if (ch->LINE_status)
-	{
-	    ch->LINE_status(dev, ch->line_status);
-	}
-    }
-
-    if (!(ch->line_status & LINE_UP) && !(regs & 0x0800))
-    {
-	ch->line_status |= LINE_UP;
-	board->lineup = 1;
-	if (ch->LINE_status)
-	{
-	    ch->LINE_status(dev, ch->line_status);
-	}
-    }
-
-    mod_timer((struct timer_list *)&board->modemline_timer, jiffies + HZ);
-}
-
-/* 
- * Is it possible to transmit ?
- * Called (may be called) by the protocol layer 
- */
-
-static int MUNICH_txe(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-
-    return (hw->busy < TX_DESC_MAX - 1);
-}
-
-/* 
- * Hw probe function. Detects all the boards in the system,
- * and fills up slicecom_boards[] and pcicom_boards[]
- * Returns 0 on success.
- * We do not disable interrupts!
- */
-static int munich_probe(void)
-{
-    struct pci_dev *pci;
-    int boardnum;
-    int slicecom_boardnum;
-    int pcicom_boardnum;
-    u32 *bar1;
-    u8 *lbi;
-    munich_board_t *board;
-
-    for (boardnum = 0; boardnum < MAX_BOARDS; boardnum++)
-    {
-	pcicom_boards[boardnum].pci = 0;
-	pcicom_boards[boardnum].bar1 = 0;
-	pcicom_boards[boardnum].lbi = 0;
-	slicecom_boards[boardnum].pci = 0;
-	slicecom_boards[boardnum].bar1 = 0;
-	slicecom_boards[boardnum].lbi = 0;
-    }
-
-    pci = NULL;
-    board = NULL;
-    slicecom_boardnum = 0;
-    pcicom_boardnum = 0;
-
-    for (boardnum = 0;
-	boardnum < MAX_BOARDS && (pci = pci_find_device(PCI_VENDOR_ID_SIEMENS,
-	PCI_DEVICE_ID_SIEMENS_MUNICH32X, pci)); boardnum++)
-    {
-	if (pci_enable_device(pci))
-	    continue;
-
-	printk("munich_probe: munich chip found, IRQ %d\n", pci->irq);
-
-	bar1 = ioremap_nocache(pci->resource[0].start, 0x100);
-	lbi = ioremap_nocache(pci->resource[1].start, 0x100);
-
-	if (bar1 && lbi)
-	{
-	    pci_write_config_dword(pci, MUNICH_PCI_PCIRES, 0xe0000);
-	    set_current_state(TASK_UNINTERRUPTIBLE);
-	    schedule_timeout(1);
-	    pci_write_config_dword(pci, MUNICH_PCI_PCIRES, 0);
-	    set_current_state(TASK_UNINTERRUPTIBLE);
-	    schedule_timeout(1);
-	    /* check the type of the card */
-	    writel(LREG0_MAGIC, MUNICH_VIRT(LREG0));
-	    writel(LREG1_MAGIC, MUNICH_VIRT(LREG1));
-	    writel(LREG2_MAGIC, MUNICH_VIRT(LREG2));
-	    writel(LREG3_MAGIC, MUNICH_VIRT(LREG3));
-	    writel(LREG4_MAGIC, MUNICH_VIRT(LREG4));
-	    writel(LREG5_MAGIC, MUNICH_VIRT(LREG5));
-	    writel(LCONF_MAGIC2,MUNICH_VIRT(LCONF));	/* enable the DMSM */
-
-	    if ((readb(lbi + VSTR) == 0x13) || (readb(lbi + VSTR) == 0x10))
-	    {
-		board = slicecom_boards + slicecom_boardnum;
-		sprintf((char *)board->devname, "slicecom%d",
-			slicecom_boardnum);
-		board->isx21 = 0;
-		slicecom_boardnum++;
-	    }
-	    else if ((readb(lbi + VSTR) == 0x6) || (readb(lbi + GIS) == 0x6))
-	    {
-		board = pcicom_boards + pcicom_boardnum;
-		sprintf((char *)board->devname, "pcicom%d", pcicom_boardnum);
-		board->isx21 = 1;
-		pcicom_boardnum++;
-	    }
-	    if (board)
-	    {
-		printk("munich_probe: %s board found\n", board->devname);
-		writel(LCONF_MAGIC1, MUNICH_VIRT(LCONF));	/* reset the DMSM */
-		board->pci = pci;
-		board->bar1 = bar1;
-		board->lbi = lbi;
-		board->framing = SLICECOM_FRAMING_DEFAULT;
-		board->linecode = SLICECOM_LINECODE_DEFAULT;
-		board->clock_source = SLICECOM_CLOCK_SOURCE_DEFAULT;
-		board->loopback = SLICECOM_LOOPBACK_DEFAULT;
-		board->owner = THIS_MODULE;
-	    }
-	    else
-	    {
-		printk("munich_probe: Board error, VSTR: %02X\n",
-		       readb(lbi + VSTR));
-		iounmap((void *)bar1);
-		iounmap((void *)lbi);
-	    }
-	}
-	else
-	{
-	    printk("munich_probe: ioremap() failed, not enabling this board!\n");
-	    /* .pci = NULL, so the MUNICH_open will not try to open it            */
-	    if (bar1) iounmap((void *)bar1);
-	    if (lbi) iounmap((void *)lbi);
-	}
-    }
-
-    if (!pci && !boardnum)
-    {
-	printk("munich_probe: no PCI present!\n");
-	return -ENODEV;
-    }
-
-    if (pcicom_boardnum + slicecom_boardnum == 0)
-    {
-	printk
-	    ("munich_probe: Couldn't find any munich board: vendor:device %x:%x not found\n",
-	     PCI_VENDOR_ID_SIEMENS, PCI_DEVICE_ID_SIEMENS_MUNICH32X);
-	return -ENODEV;
-    }
-
-    /* Found some */
-    if (pcicom_boardnum)
-	printk("%d pcicom board(s) found.\n", pcicom_boardnum);
-    if (slicecom_boardnum)
-	printk("%d slicecom board(s) found.\n", slicecom_boardnum);
-
-    return 0;
-}
-
-/* 
- * Reset the hardware. Get called only from within this module if needed.
- */
-#if 0
-static int slicecom_reset(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-
-    printk("slicecom_reset: resetting the hardware\n");
-
-    /* Begin to reset the hardware */
-
-    if (ch->HW_set_clock)
-	ch->HW_set_clock(dev);
-
-    /* And finish it */
-
-    return 0;
-}
-#endif
-
-/* 
- * Transmit a packet. 
- * Called by the protocol layer
- * Return values:	
- *	FRAME_ACCEPTED:	frame is being transmited, transmitter is busy
- *	FRAME_QUEUED:	frame is being transmitted, there's more room in
- *				the transmitter for additional packet(s)
- *	FRAME_ERROR:
- *	FRAME_DROPPED:	there was some error
- */
-
-static int MUNICH_send_packet(struct net_device *dev, struct sk_buff *skb)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-
-    /* Send it to the debug facility too if needed: */
-
-    if (ch->debug_flags & DEBUG_HW_TX)
-	comx_debug_bytes(dev, skb->data, skb->len, "MUNICH_send_packet");
-
-    /* If the line is inactive, don't accept: */
-
-    /* TODO: atgondolni hogy mi is legyen itt */
-    /* if (!(ch->line_status & LINE_UP)) return FRAME_DROPPED; */
-
-    /* More check, to be sure: */
-
-    if (skb->len > TXBUFFER_SIZE)
-    {
-	ch->stats.tx_errors++;
-	kfree_skb(skb);
-	return FRAME_ERROR;
-    }
-
-    /* Maybe you have to disable irq's while programming the hw: */
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    /* And more check: */
-
-    if (hw->busy >= TX_DESC_MAX - 1)
-    {
-	printk(KERN_ERR
-	       "%s: Transmitter called while busy... dropping frame, busy = %d\n",
-	       dev->name, hw->busy);
-	spin_unlock_irqrestore(&mister_lock, flags);
-	kfree_skb(skb);
-	return FRAME_DROPPED;
-    }
-
-    if (hw->busy >= 0)
-	hw->tx_ring_hist[hw->busy]++;
-    /* DELL: */
-    else
-	printk("slicecom: %s: FATAL: busy = %d\n", dev->name, hw->busy);
-
-//              /* DEL: */
-//      printk("slicecom: %s: _send_packet called, busy = %d\n", dev->name, hw->busy );
-
-    /* Packet can go, update stats: */
-
-    ch->stats.tx_packets++;
-    ch->stats.tx_bytes += skb->len;
-
-    /* Pass the packet to the HW:                   */
-    /* Step forward with the transmit descriptors:  */
-
-    hw->tx_desc_ptr = (hw->tx_desc_ptr + 1) % TX_DESC_MAX;
-
-    memcpy(&(hw->tx_data[hw->tx_desc_ptr][0]), skb->data, skb->len);
-    hw->tx_desc[hw->tx_desc_ptr].no = skb->len;
-
-    /* We don't issue any command, just step with the HOLD bit      */
-
-    hw->tx_desc[hw->tx_desc_ptr].hold = 1;
-    hw->tx_desc[(hw->tx_desc_ptr + TX_DESC_MAX - 1) % TX_DESC_MAX].hold = 0;
-
-#ifdef COMX_NEW
-    dev_kfree_skb(skb);
-#endif
-    /* csomag kerult a Tx ringbe: */
-
-    hw->busy++;
-
-    /* Report it: */
-
-    if (ch->debug_flags & DEBUG_HW_TX)
-	comx_debug(dev, "%s: MUNICH_send_packet was successful\n\n", dev->name);
-
-    if (hw->busy >= TX_DESC_MAX - 1)
-    {
-	spin_unlock_irqrestore(&mister_lock, flags);
-	return FRAME_ACCEPTED;
-    }
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    /* All done */
-
-    return FRAME_QUEUED;
-}
-
-/*
- * Interrupt handler routine.
- * Called by the Linux kernel.
- * BEWARE! The interrupts are enabled on the call!
- */
-static irqreturn_t MUNICH_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-    struct sk_buff *skb;
-    int length;
-    int rx_status;
-    int work;			/* hany esemenyt kezeltem mar le                                */
-    u32 *bar1;
-    u8 *lbi;
-    u32 stat,			/* az esemenyek, amiket a ebben a loop korben le kell meg kezelni       */
-      race_stat = 0,		/* race eseten ebben uzenek magamnak hogy mit kell meg lekezelni        */
-      ack;			/* ezt fogom a vegen a STAT-ba irni, kiveszek belole 1-1 bitet ha       */
-
-    /* az adott dolgot nem kell ack-olni mert volt vele munkam, es  */
-    /* legjobb ha visszaterek ide megegyszer                        */
-    munich_intq_t int_info;
-
-    struct net_device *dev;
-    struct comx_channel *ch;
-    struct slicecom_privdata *hw;
-    munich_board_t *board = (munich_board_t *) dev_id;
-    int channel;
-
-    //      , boardnum = (int)dev_id;
-
-    // board = munich_boards + boardnum;
-    bar1 = board->bar1;
-    lbi = board->lbi;
-
-    //      Do not uncomment this under heavy load! :->
-    //      printk("MUNICH_interrupt: masked STAT=0x%08x, tiq=0x%08x, riq=0x%08x, piq=0x%08x\n", stat, board->tiq[0].all, board->riq[0].all, board->piq[0].all );
-
-    for (work = 0; (stat = (race_stat | (readl(MUNICH_VIRT(STAT)) & ~STAT_NOT_HANDLED_BY_INTERRUPT))) && (work < MAX_WORK - 1); work++)
-    {
-	ack = stat & (STAT_PRI | STAT_PTI | STAT_LBII);
-
-	/* Handle the interrupt information in the Rx queue. We don't really trust      */
-	/* info from this queue, because it can be overflowed, so later check           */
-	/* every Rx ring for received packets. But there are some errors which can't    */
-	/* be counted from the Rx rings, so we parse it.                                        */
-
-	int_info = board->riq[board->riq_ptr];
-	if (int_info.all & 0xF0000000)	/* ha ez nem 0, akkor itt interrupt_info van                    */
-	{
-	    ack &= ~STAT_PRI;	/* don't ack the interrupt, we had some work to do              */
-
-	    channel = PCM_INT_CHANNEL(int_info.all);
-	    dev = board->twins[channel];
-
-	    if (dev == NULL)
-	    {
-		printk
-		    ("MUNICH_interrupt: got an Rx interrupt info for NULL device "
-		     "%s.twins[%d], int_info = 0x%08x\n", board->devname,
-		     channel, int_info.all);
-		goto go_for_next_interrupt;
-	    }
-
-	    ch = netdev_priv(dev);
-	    hw = (struct slicecom_privdata *)ch->HW_privdata;
-
-	    //      printk("Rx STAT=0x%08x int_info=0x%08x rx_desc_ptr=%d rx_desc.status=0x%01x\n",
-	    //              stat, int_info.all, hw->rx_desc_ptr, hw->rx_desc[ hw->rx_desc_ptr ].status );
-
-	    if (int_info.all & PCM_INT_HI)
-		printk("SliceCOM: %s: Host Initiated interrupt\n", dev->name);
-	    if (int_info.all & PCM_INT_IFC)
-		printk("SliceCOM: %s: Idle/Flag Change\n", dev->name);
-	    /* TOD: jo ez az Idle/Flag Change valamire? - azonnal latszik belole hogy mikor ad a masik oldal */
-	    /* TOD: ilyen IT most nem is jon, mert ki van maszkolva az interrupt, biztosan kell ez? */
-
-	    if (int_info.all & PCM_INT_FO)
-		/* Internal buffer (RB) overrun */
-		ch->stats.rx_over_errors++;	/* TOD: Ez azt jelenti hogy a belso RB nem volt hozzaferheto, es ezert kihagyott valamit. De nem csak csomag lehetett, hanem esemeny, stb. is. lasd page 247. Ezzel a 'cat status'-hoz igazodok, de a netdevice.h szerint nem egyertelmu hogy ide ez kellene. Nem lehet hogy rx_missed ? */
-		/* DE: nem gotozok sehova, elvileg jo igy */
-		/* kesobb meg visszaterek az FO-ra, ha packet-FO volt. Keresd a "packet-FO"-t. */
-	    if (int_info.all & PCM_INT_FI)	/* frame received, but we do not trust the int_info queue       */
-		if (int_info.all & PCM_INT_SF)
-		{		/* Short Frame: rovidebb mint a CRC */
-		    /* "rovidebb mint CRC+2byte" vizsgalat a "CRC+2"-nel */
-		    ch->stats.rx_length_errors++;	/* TOD: noveljem? ne noveljem? */
-		    goto go_for_next_interrupt;
-		}
-
-	    go_for_next_interrupt:	/* One step in the interrupt queue */
-	    board->riq[board->riq_ptr].all = 0;	/* megjelolom hogy itt meg nem jart a hw */
-	    board->riq_ptr = (board->riq_ptr + 1) % MUNICH_INTQMAX;
-
-	}
-
-	/* Check every Rx ring for incomed packets: */
-
-	for (channel = 0; channel < 32; channel++)
-	{
-	    dev = board->twins[channel];
-
-	    if (dev != NULL)
-	    {
-		ch = netdev_priv(dev);
-		hw = (struct slicecom_privdata *)ch->HW_privdata;
-
-		rx_status = hw->rx_desc[hw->rx_desc_ptr].status;
-
-		if (!(rx_status & 0x80))	/* mar jart itt a hardver */
-		{
-		    ack &= ~STAT_PRI;	/* Don't ack, we had some work          */
-
-		    /* Ez most egy kicsit zuros, mert itt mar nem latom az int_infot        */
-		    if (rx_status & RX_STATUS_ROF)
-			ch->stats.rx_over_errors++;	/* TOD: 'cat status'-hoz igazodok */
-
-		    if (rx_status & RX_STATUS_RA)
-			/* Abort received or issued on channel  */
-			ch->stats.rx_frame_errors++;	/* or HOLD bit in the descriptor                */
-			/* TOD: 'cat status'-hoz igazodok */
-
-		    if (rx_status & RX_STATUS_LFD)
-		    {		/* Long Frame (longer then MFL in the MODE1) */
-			ch->stats.rx_length_errors++;
-			goto go_for_next_frame;
-		    }
-
-		    if (rx_status & RX_STATUS_NOB)
-		    {		/* Not n*8 bits long frame - frame alignment */
-			ch->stats.rx_frame_errors++;	/* ez viszont nem igazodik a 'cat status'-hoz */
-			goto go_for_next_frame;
-		    }
-
-		    if (rx_status & RX_STATUS_CRCO)
-		    {		/* CRC error */
-			ch->stats.rx_crc_errors++;
-			goto go_for_next_frame;
-		    }
-
-		    if (rx_status & RX_STATUS_SF)
-		    {		/* Short Frame: rovidebb mint CRC+2byte */
-			ch->stats.rx_errors++;	/* The HW does not set PCI_INT_ERR bit for this one, see page 246 */
-			ch->stats.rx_length_errors++;
-			goto go_for_next_frame;
-		    }
-
-		    if (rx_status != 0)
-		    {
-			printk("SliceCOM: %s: unhandled rx_status: 0x%02x\n",
-			       dev->name, rx_status);
-			goto go_for_next_frame;
-		    }
-
-		    /* frame received without errors: */
-
-		    length = hw->rx_desc[hw->rx_desc_ptr].bno;
-		    ch->stats.rx_packets++;	/* Count only 'good' packets */
-		    ch->stats.rx_bytes += length;
-
-		    /* Allocate a larger skb and reserve the heading for efficiency: */
-
-		    if ((skb = dev_alloc_skb(length + 16)) == NULL)
-		    {
-			ch->stats.rx_dropped++;
-			goto go_for_next_frame;
-		    }
-
-		    /* Do bookkeeping: */
-
-		    skb_reserve(skb, 16);
-		    skb_put(skb, length);
-		    skb->dev = dev;
-
-		    /* Now copy the data into the buffer: */
-
-		    memcpy(skb->data, &(hw->rx_data[hw->rx_desc_ptr][0]), length);
-
-		    /* DEL: UGLY HACK!!!! */
-		    if (*((int *)skb->data) == 0x02000000 &&
-			*(((int *)skb->data) + 1) == 0x3580008f)
-		    {
-			printk("%s: swapping hack\n", dev->name);
-			*((int *)skb->data) = 0x3580008f;
-			*(((int *)skb->data) + 1) = 0x02000000;
-		    }
-
-		    if (ch->debug_flags & DEBUG_HW_RX)
-			comx_debug_skb(dev, skb, "MUNICH_interrupt receiving");
-
-		    /* Pass it to the protocol entity: */
-
-		    ch->LINE_rx(dev, skb);
-
-		    go_for_next_frame:
-		    /* DEL: rafutott-e a HOLD bitre -detektalas */
-		    {
-			if( ((rx_desc_t*)phys_to_virt(board->ccb->current_rx_desc[channel]))->hold
-			    && ((rx_desc_t*)phys_to_virt(board->ccb->current_rx_desc[channel]))->status != 0xff)
-			    hw->rafutott++;	/* rafutott: hanyszor volt olyan hogy a current descriptoron HOLD bit volt, es a hw mar befejezte az irast (azaz a hw rafutott a HOLD bitre) */
-		    }
-
-		    //      if( jiffies % 2 )               /* DELL: okozzunk egy kis Rx ring slipet :) */
-		    //      {
-		    /* Step forward with the receive descriptors: */
-		    /* if you change this, change the copy of it below too! Search for: "RxSlip" */
-		    hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 1) % RX_DESC_MAX].hold = 1;
-		    hw->rx_desc[hw->rx_desc_ptr].status = 0xFF;	/* megjelolom hogy itt meg nem jart a hw */
-		    hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 2) % RX_DESC_MAX].hold = 0;
-		    hw->rx_desc_ptr = (hw->rx_desc_ptr + 1) % RX_DESC_MAX;
-		    //      }
-		}
-	    }
-	}
-
-	stat &= ~STAT_PRI;
-
-//      }
-
-//      if( stat & STAT_PTI )   /* TOD: primko megvalositas: mindig csak egy esemenyt dolgozok fel, */
-	/* es nem torlom a STAT-ot, ezert ujra visszajon ide a rendszer. Amikor */
-	/* jon interrupt, de nincs mit feldolgozni, akkor torlom a STAT-ot.     */
-	/* 'needs a rewrite', de elso megoldasnak jo lesz                       */
-//              {
-	int_info = board->tiq[board->tiq_ptr];
-	if (int_info.all & 0xF0000000)	/* ha ez nem 0, akkor itt interrupt_info van    */
-	{
-	    ack &= ~STAT_PTI;	/* don't ack the interrupt, we had some work to do      */
-
-	    channel = PCM_INT_CHANNEL(int_info.all);
-	    dev = board->twins[channel];
-
-	    if (dev == NULL)
-	    {
-		printk("MUNICH_interrupt: got a Tx interrupt for NULL device "
-		       "%s.twins[%d], int_info = 0x%08x\n",
-		       board->isx21 ? "pcicom" : "slicecom", channel, int_info.all);
-		goto go_for_next_tx_interrupt;
-	    }
-
-	    ch = netdev_priv(dev);
-	    hw = (struct slicecom_privdata *)ch->HW_privdata;
-
-	    //      printk("Tx STAT=0x%08x int_info=0x%08x tiq_ptr=%d\n", stat, int_info.all, board->tiq_ptr );
-
-	    if (int_info.all & PCM_INT_FE2)
-	    {			/* "Tx available"                               */
-		/* do nothing */
-	    }
-	    else if (int_info.all & PCM_INT_FO)
-	    {			/* Internal buffer (RB) overrun */
-		ch->stats.rx_over_errors++;
-	    }
-	    else
-	    {
-		printk("slicecom: %s: unhandled Tx int_info: 0x%08x\n",
-		       dev->name, int_info.all);
-	    }
-
-	    go_for_next_tx_interrupt:
-	    board->tiq[board->tiq_ptr].all = 0;
-	    board->tiq_ptr = (board->tiq_ptr + 1) % MUNICH_INTQMAX;
-	}
-
-	/* Check every Tx ring for incoming packets: */
-
-	for (channel = 0; channel < 32; channel++)
-	{
-	    dev = board->twins[channel];
-
-	    if (dev != NULL)
-	    {
-		int newbusy;
-
-		ch = netdev_priv(dev);
-		hw = (struct slicecom_privdata *)ch->HW_privdata;
-
-		/* We don't trust the "Tx available" info from the TIQ, but check        */
-		/* every ring if there is some free room                                        */
-
-		if (ch->init_status && netif_running(dev))
-		{
-		    newbusy = ( TX_DESC_MAX + (& hw->tx_desc[ hw->tx_desc_ptr ]) -
-			(tx_desc_t*)phys_to_virt(board->ccb->current_tx_desc[ hw->channel ]) ) % TX_DESC_MAX;
-
-		    if(newbusy < 0)
-		    {
-			printk("slicecom: %s: FATAL: fresly computed busy = %d, HW: 0x%p, SW: 0x%p\n",
-			dev->name, newbusy,
-			phys_to_virt(board->ccb->current_tx_desc[hw->channel]),
-			& hw->tx_desc[hw->tx_desc_ptr]);
-		    }
-
-		    /* Fogyott valami a Tx ringbol? */
-
-		    if (newbusy < hw->busy)
-		    {
-			// ack &= ~STAT_PTI;                            /* Don't ack, we had some work  */
-			hw->busy = newbusy;
-			if (ch->LINE_tx)
-			    ch->LINE_tx(dev);	/* Report it to protocol driver */
-		    }
-		    else if (newbusy > hw->busy)
-			printk("slicecom: %s: newbusy > hw->busy, this should not happen!\n", dev->name);
-		}
-	    }
-	}
-	stat &= ~STAT_PTI;
-
-	int_info = board->piq[board->piq_ptr];
-	if (int_info.all & 0xF0000000)	/* ha ez nem 0, akkor itt interrupt_info van            */
-	{
-	    ack &= ~STAT_LBII;	/* don't ack the interrupt, we had some work to do      */
-
-	    /* We do not really use (yet) the interrupt info from this queue, */
-
-	    // printk("slicecom: %s: LBI Interrupt event: %08x\n", board->devname, int_info.all);
-
-	    if (!board->isx21)
-	    {
-		slicecom_update_leds(board);
-		slicecom_update_line_counters(board);
-	    }
-
-	    goto go_for_next_lbi_interrupt;	/* To avoid warning about unused label  */
-
-	    go_for_next_lbi_interrupt:	/* One step in the interrupt queue */
-	    board->piq[board->piq_ptr].all = 0;	/* megjelolom hogy itt meg nem jart a hw        */
-	    board->piq_ptr = (board->piq_ptr + 1) % MUNICH_PIQMAX;
-	}
-	stat &= ~STAT_LBII;
-
-	writel(ack, MUNICH_VIRT(STAT));
-
-	if (stat & STAT_TSPA)
-	{
-	    //      printk("slicecom: %s: PCM TSP Asynchronous\n", board->devname);
-	    writel(STAT_TSPA, MUNICH_VIRT(STAT));
-	    stat &= ~STAT_TSPA;
-	}
-
-	if (stat & STAT_RSPA)
-	{
-	    //      printk("slicecom: %s: PCM RSP Asynchronous\n", board->devname);
-	    writel(STAT_RSPA, MUNICH_VIRT(STAT));
-	    stat &= ~STAT_RSPA;
-	}
-	if (stat)
-	{
-	    printk("MUNICH_interrupt: unhandled interrupt, STAT=0x%08x\n",
-		   stat);
-	    writel(stat, MUNICH_VIRT(STAT));	/* ha valamit megsem kezeltunk le, azert ack-ot kuldunk neki */
-	}
-
-    }
-    board->histogram[work]++;
-
-    /* We can miss these if we reach the MAX_WORK   */
-    /* Count it to see how often it happens         */
-
-    if (race_stat & STAT_PRI)
-	board->stat_pri_races_missed++;
-    if (race_stat & STAT_PTI)
-	board->stat_pti_races_missed++;
-    return IRQ_HANDLED;
-}
-
-/* 
- * Hardware open routine.
- * Called by comx (upper) layer when the user wants to bring up the interface
- * with ifconfig.
- * Initializes hardware, allocates resources etc.
- * Returns 0 on OK, or standard error value on error.
- */
-
-static int MUNICH_open(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    struct proc_dir_entry *procfile = ch->procdir->subdir;
-    munich_board_t *board;
-    munich_ccb_t *ccb;
-
-    u32 *bar1;
-    u8 *lbi;
-    u32 stat;
-    unsigned long flags, jiffs;
-
-    int i, channel;
-    u32 timeslots = hw->timeslots;
-
-    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    bar1 = board->bar1;
-    lbi = board->lbi;
-
-    /* TODO: a timeslotok ellenorzese kell majd ide .. hat, biztos? mar a write_proc-ban is
-       ellenorzom valamennyire.
-       if (!dev->io || !dev->irq) return -ENODEV;
-     */
-
-    if (!board->pci)
-    {
-	printk("MUNICH_open: no %s board with boardnum = %d\n",
-	       ch->hardware->name, hw->boardnum);
-	return -ENODEV;
-    }
-
-    spin_lock_irqsave(&mister_lock, flags);
-    /* lock the section to avoid race with multiple opens and make sure
-       that no interrupts get called while this lock is active */
-
-    if (board->use_count == 0)	/* bring up the board if it was unused                  */
-	/* if fails, frees allocated resources and returns.     */
-	/* TOD: is it safe? nem kellene resetelni a kartyat?    */
-    {
-	printk("MUNICH_open: %s: bringing up board\n", board->devname);
-
-	/* Clean up the board's static struct if messed: */
-
-	for (i = 0; i < 32; i++)
-	    board->twins[i] = NULL;
-	for (i = 0; i < MAX_WORK; i++)
-	    board->histogram[i] = 0;
-
-	board->lineup = 0;
-
-	/* Allocate CCB: */
-        board->ccb = kmalloc(sizeof(munich_ccb_t), GFP_KERNEL);
-	if (board->ccb == NULL)
-	{
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -ENOMEM;
-	}
-	memset((void *)board->ccb, 0, sizeof(munich_ccb_t));
-	board->ccb->csa = virt_to_phys(board->ccb);
-	ccb = board->ccb;
-	for (i = 0; i < 32; i++)
-	{
-	    ccb->timeslot_spec[i].tti = 1;
-	    ccb->timeslot_spec[i].rti = 1;
-	}
-
-	/* Interrupt queues: */
-
-	board->tiq = kmalloc(MUNICH_INTQSIZE, GFP_KERNEL);
-	if (board->tiq == NULL)
-	{
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -ENOMEM;
-	}
-	memset((void *)board->tiq, 0, MUNICH_INTQSIZE);
-
-	board->riq = kmalloc(MUNICH_INTQSIZE, GFP_KERNEL);
-	if (board->riq == NULL)
-	{
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -ENOMEM;
-	}
-	memset((void *)board->riq, 0, MUNICH_INTQSIZE);
-
-	board->piq = kmalloc(MUNICH_PIQSIZE, GFP_KERNEL);
-	if (board->piq == NULL)
-	{
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -ENOMEM;
-	}
-	memset((void *)board->piq, 0, MUNICH_PIQSIZE);
-
-	board->tiq_ptr = 0;
-	board->riq_ptr = 0;
-	board->piq_ptr = 0;
-
-	/* Request irq: */
-
-	board->irq = 0;
-
-	/* (char*) cast to avoid warning about discarding volatile:             */
-	if (request_irq(board->pci->irq, MUNICH_interrupt, 0,
-	    (char *)board->devname, (void *)board))
-	{
-	    printk("MUNICH_open: %s: unable to obtain irq %d\n", board->devname,
-		   board->pci->irq);
-	    /* TOD: free other resources (a sok malloc feljebb)                     */
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -EAGAIN;
-	}
-	board->irq = board->pci->irq;	/* csak akkor legyen != 0, ha tenyleg le van foglalva nekunk */
-
-	/* Programming device: */
-
-	/* Reset the board like a power-on: */
-	/* TOD:
-	   - It is not a real power-on: if a DMA transaction fails with master abort, the board
-	   stays in half-dead state.
-	   - It doesn't reset the FALC line driver */
-
-	pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0xe0000);
-	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(1);
-	pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0);
-	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(1);
-
-        writel(virt_to_phys(&ccb->csa), MUNICH_VIRT(CCBA));
-        writel(virt_to_phys( board->tiq ), MUNICH_VIRT(TIQBA));
-        writel(MUNICH_INTQLEN, MUNICH_VIRT(TIQL));
-        writel(virt_to_phys( board->riq ), MUNICH_VIRT(RIQBA));
-        writel(MUNICH_INTQLEN, MUNICH_VIRT(RIQL));
-        writel(virt_to_phys( board->piq ), MUNICH_VIRT(PIQBA));
-        writel(MUNICH_PIQLEN, MUNICH_VIRT(PIQL));
-        
-	/* Put the magic values into the registers: */
-
-	writel(MODE1_MAGIC, MUNICH_VIRT(MODE1));
-	writel(MODE2_MAGIC, MUNICH_VIRT(MODE2));
-
-	writel(LREG0_MAGIC, MUNICH_VIRT(LREG0));
-	writel(LREG1_MAGIC, MUNICH_VIRT(LREG1));
-	writel(LREG2_MAGIC, MUNICH_VIRT(LREG2));
-	writel(LREG3_MAGIC, MUNICH_VIRT(LREG3));
-	writel(LREG4_MAGIC, MUNICH_VIRT(LREG4));
-	writel(LREG5_MAGIC, MUNICH_VIRT(LREG5));
-
-	writel(LCONF_MAGIC1, MUNICH_VIRT(LCONF));	/* reset the DMSM */
-	writel(LCONF_MAGIC2, MUNICH_VIRT(LCONF));	/* enable the DMSM */
-
-	writel(~0, MUNICH_VIRT(TXPOLL));
-	writel(board->isx21 ? 0x1400 : 0xa000, MUNICH_VIRT(GPDIR));
-
-	if (readl(MUNICH_VIRT(STAT))) writel(readl(MUNICH_VIRT(STAT)), MUNICH_VIRT(STAT));
-
-	ccb->action_spec = CCB_ACTIONSPEC_RES | CCB_ACTIONSPEC_IA;
-	writel(CMD_ARPCM, MUNICH_VIRT(CMD));	/* Start the PCM core reset */
-	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(1);
-
-	stat = 0;		/* Wait for the action to complete max. 1 second */
-	jiffs = jiffies;
-	while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ))
-	{
-	    set_current_state(TASK_UNINTERRUPTIBLE);
-	    schedule_timeout(1);
-	}
-
-	if (stat & STAT_PCMF)
-	{
-	    printk(KERN_ERR
-		   "MUNICH_open: %s: Initial ARPCM failed. STAT=0x%08x\n",
-		   board->devname, stat);
-	    writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT));
-	    free_irq(board->irq, (void *)board);	/* TOD: free other resources too *//* maybe shut down hw? */
-	    board->irq = 0;
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -EAGAIN;
-	}
-	else if (!(stat & STAT_PCMA))
-	{
-	    printk(KERN_ERR
-		   "MUNICH_open: %s: Initial ARPCM timeout. STAT=0x%08x\n",
-		   board->devname, stat);
-	    free_irq(board->irq, (void *)board);	/* TOD: free other resources too *//* maybe shut off the hw? */
-	    board->irq = 0;
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -EIO;
-	}
-
-	writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT));	/* Acknowledge */
-
-	if (board->isx21) writel(0, MUNICH_VIRT(GPDATA));
-
-	printk("MUNICH_open: %s: succesful HW-open took %ld jiffies\n",
-	       board->devname, jiffies - jiffs);
-
-	/* Set up the FALC hanging on the Local Bus: */
-
-	if (!board->isx21)
-	{
-	    writeb(0x0e, lbi + FMR1);
-	    writeb(0, lbi + LIM0);
-	    writeb(0xb0, lbi + LIM1);	/* TODO: input threshold */
-	    writeb(0xf7, lbi + XPM0);
-	    writeb(0x02, lbi + XPM1);
-	    writeb(0x00, lbi + XPM2);
-	    writeb(0xf0, lbi + FMR0);
-	    writeb(0x80, lbi + PCD);
-	    writeb(0x80, lbi + PCR);
-	    writeb(0x00, lbi + LIM2);
-	    writeb(0x07, lbi + XC0);
-	    writeb(0x3d, lbi + XC1);
-	    writeb(0x05, lbi + RC0);
-	    writeb(0x00, lbi + RC1);
-	    writeb(0x83, lbi + FMR2);
-	    writeb(0x9f, lbi + XSW);
-	    writeb(0x0f, lbi + XSP);
-	    writeb(0x00, lbi + TSWM);
-	    writeb(0xe0, lbi + MODE);
-	    writeb(0xff, lbi + IDLE);	/* Idle Code to send in unused timeslots        */
-	    writeb(0x83, lbi + IPC);	/* interrupt query line mode: Push/pull output, active high     */
-	    writeb(0xbf, lbi + IMR3);	/* send an interrupt every second               */
-
-	    slicecom_set_framing(hw->boardnum, board->framing);
-	    slicecom_set_linecode(hw->boardnum, board->linecode);
-	    slicecom_set_clock_source(hw->boardnum, board->clock_source);
-	    slicecom_set_loopback(hw->boardnum, board->loopback);
-
-	    memset((void *)board->intervals, 0, sizeof(board->intervals));
-	    board->current_interval = 0;
-	    board->elapsed_seconds = 0;
-	    board->ses_seconds = 0;
-	    board->is_unavailable = 0;
-	    board->no_ses_seconds = 0;
-	    board->deg_elapsed_seconds = 0;
-	    board->deg_cumulated_errors = 0;
-	}
-
-	/* Enable the interrupts last                                                   */
-	/* These interrupts will be enabled. We do not need the others. */
-
-	writel(readl(MUNICH_VIRT(IMASK)) & ~(STAT_PTI | STAT_PRI | STAT_LBII | STAT_TSPA | STAT_RSPA), MUNICH_VIRT(IMASK));
-    }
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    dev->irq = board->irq;	/* hogy szep legyen az ifconfig outputja */
-    ccb = board->ccb;		/* TODO: ez igy csunya egy kicsit hogy benn is meg kinn is beletoltom :( */
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    /* Check if the selected timeslots aren't used already */
-
-    for (i = 0; i < 32; i++)
-	if (((1 << i) & timeslots) && !ccb->timeslot_spec[i].tti)
-	{
-	    printk("MUNICH_open: %s: timeslot %d already used by %s\n",
-		   dev->name, i, board->twins[ccb->timeslot_spec[i].txchannel]->name);
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -EBUSY;	/* TODO: lehet hogy valami mas errno kellene? */
-	}
-
-    /* find a free channel: */
-    /* TODO: ugly, rewrite it  */
-
-    for (channel = 0; channel <= 32; channel++)
-    {
-	if (channel == 32)
-	{			/* not found a free one */
-	    printk
-		("MUNICH_open: %s: FATAL: can not find a free channel - this should not happen!\n",
-		 dev->name);
-	    spin_unlock_irqrestore(&mister_lock, flags);
-	    return -ENODEV;
-	}
-	if (board->twins[channel] == NULL)
-	    break;		/* found the first free one */
-    }
-
-    board->lastcheck = jiffies;	/* avoid checking uninitialized hardware channel */
-
-    /* Open the channel. If fails, calls MUNICH_close() to properly free resources and stop the HW */
-
-    hw->channel = channel;
-    board->twins[channel] = dev;
-
-    board->use_count++;		/* meg nem nyitottuk meg a csatornat, de a twins-ben
-				   mar elfoglaltunk egyet, es ha a _close-t akarjuk hivni, akkor ez kell. */
-    for (i = 0; i < 32; i++)
-	if ((1 << i) & timeslots)
-	{
-	    ccb->timeslot_spec[i].tti = 0;
-	    ccb->timeslot_spec[i].txchannel = channel;
-	    ccb->timeslot_spec[i].txfillmask = ~0;
-
-	    ccb->timeslot_spec[i].rti = 0;
-	    ccb->timeslot_spec[i].rxchannel = channel;
-	    ccb->timeslot_spec[i].rxfillmask = ~0;
-	}
-
-    if (!board->isx21) rework_idle_channels(dev);
-
-    memset((void *)&(hw->tx_desc), 0, TX_DESC_MAX * sizeof(tx_desc_t));
-    memset((void *)&(hw->rx_desc), 0, RX_DESC_MAX * sizeof(rx_desc_t));
-
-    for (i = 0; i < TX_DESC_MAX; i++)
-    {
-	hw->tx_desc[i].fe = 1;
-	hw->tx_desc[i].fnum = 2;
-                hw->tx_desc[i].data     = virt_to_phys( & (hw->tx_data[i][0]) );
-                hw->tx_desc[i].next     = virt_to_phys( & (hw->tx_desc[ (i+1) % TX_DESC_MAX ]) );
-
-    }
-    hw->tx_desc_ptr = 0;	/* we will send an initial packet so it is correct: "oda irtunk utoljara" */
-    hw->busy = 0;
-    hw->tx_desc[hw->tx_desc_ptr].hold = 1;
-    hw->tx_desc[hw->tx_desc_ptr].no = 1;	/* TOD: inkabb csak 0 hosszut kuldjunk ki az initkor? */
-
-    for (i = 0; i < RX_DESC_MAX; i++)
-    {
-	hw->rx_desc[i].no = RXBUFFER_SIZE;
-	hw->rx_desc[i].data = virt_to_phys(&(hw->rx_data[i][0]));
-	hw->rx_desc[i].next = virt_to_phys(&(hw->rx_desc[(i+1) % RX_DESC_MAX]));
-	hw->rx_desc[i].status = 0xFF;
-    }
-    hw->rx_desc_ptr = 0;
-
-    hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 2) % RX_DESC_MAX].hold = 1;
-
-    memset((void *)&ccb->channel_spec[channel], 0, sizeof(channel_spec_t));
-
-    ccb->channel_spec[channel].ti = 0;	/* Transmit off */
-    ccb->channel_spec[channel].to = 1;
-    ccb->channel_spec[channel].ta = 0;
-
-    ccb->channel_spec[channel].th = 1;	/* Transmit hold        */
-
-    ccb->channel_spec[channel].ri = 0;	/* Receive off  */
-    ccb->channel_spec[channel].ro = 1;
-    ccb->channel_spec[channel].ra = 0;
-
-    ccb->channel_spec[channel].mode = 3;	/* HDLC */
-
-    ccb->action_spec = CCB_ACTIONSPEC_IN | (channel << 8);
-    writel(CMD_ARPCM, MUNICH_VIRT(CMD));
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    stat = 0;
-    jiffs = jiffies;
-    while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ))
-    {
-	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(1);
-    }
-
-    if (stat & STAT_PCMF)
-    {
-	printk(KERN_ERR "MUNICH_open: %s: %s channel %d off failed\n",
-	       dev->name, board->devname, channel);
-	writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT));
-	MUNICH_close(dev);
-	return -EAGAIN;
-    }
-    else if (!(stat & STAT_PCMA))
-    {
-	printk(KERN_ERR "MUNICH_open: %s: %s channel %d off timeout\n",
-	       dev->name, board->devname, channel);
-	MUNICH_close(dev);
-	return -EIO;
-    }
-
-    writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT));
-    //      printk("MUNICH_open: %s: succesful channel off took %ld jiffies\n", board->devname, jiffies-jiffs);
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    ccb->channel_spec[channel].ifc = 1;	/* 1 .. 'Idle/Flag change' interrupt letiltva   */
-    ccb->channel_spec[channel].fit = 1;
-    ccb->channel_spec[channel].nitbs = 1;
-    ccb->channel_spec[channel].itbs = 2;
-
-    /* TODOO: lehet hogy jo lenne igy, de utana kellene nezni hogy nem okoz-e fragmentaciot */
-    //      ccb->channel_spec[channel].itbs = 2 * number_of_timeslots;
-    //      printk("open: %s: number_of_timeslots: %d\n", dev->name, number_of_timeslots);
-
-    ccb->channel_spec[channel].mode = 3;	/* HDLC */
-    ccb->channel_spec[channel].ftda = virt_to_phys(&(hw->tx_desc));
-    ccb->channel_spec[channel].frda = virt_to_phys(&(hw->rx_desc[0]));
-
-    ccb->channel_spec[channel].ti = 1;	/* Transmit init        */
-    ccb->channel_spec[channel].to = 0;
-    ccb->channel_spec[channel].ta = 1;
-
-    ccb->channel_spec[channel].th = 0;
-
-    ccb->channel_spec[channel].ri = 1;	/* Receive init */
-    ccb->channel_spec[channel].ro = 0;
-    ccb->channel_spec[channel].ra = 1;
-
-    ccb->action_spec = CCB_ACTIONSPEC_ICO | (channel << 8);
-    writel(CMD_ARPCM, MUNICH_VIRT(CMD));	/* Start the channel init */
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    stat = 0;			/* Wait for the action to complete max. 1 second */
-    jiffs = jiffies;
-    while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ))
-    {
-	set_current_state(TASK_UNINTERRUPTIBLE);
-        schedule_timeout(1);
-    }
-
-    if (stat & STAT_PCMF)
-    {
-	printk(KERN_ERR "MUNICH_open: %s: channel open ARPCM failed\n",
-	       board->devname);
-	writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT));
-	MUNICH_close(dev);
-	return -EAGAIN;
-    }
-    else if (!(stat & STAT_PCMA))
-    {
-	printk(KERN_ERR "MUNICH_open: %s: channel open ARPCM timeout\n",
-	       board->devname);
-	MUNICH_close(dev);
-	return -EIO;
-    }
-
-    writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT));
-    //      printk("MUNICH_open: %s: succesful channel open took %ld jiffies\n", board->devname, jiffies-jiffs);
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    ccb->channel_spec[channel].nitbs = 0;	/* once ITBS defined, these must be 0   */
-    ccb->channel_spec[channel].itbs = 0;
-
-    if (board->isx21)
-    {
-	init_timer(&board->modemline_timer);
-	board->modemline_timer.data = (unsigned long)board;
-	board->modemline_timer.function = pcicom_modemline;
-	board->modemline_timer.expires = jiffies + HZ;
-	add_timer((struct timer_list *)&board->modemline_timer);
-    }
-
-    /* It is done. Declare that we're open: */
-    hw->busy = 0;		/* It may be 1 if the frame at Tx init already ended, but it is not     */
-    /* a real problem: we compute hw->busy on every interrupt                       */
-    hw->rafutott = 0;
-    ch->init_status |= HW_OPEN;
-
-    /* Initialize line state: */
-    if (board->lineup)
-	ch->line_status |= LINE_UP;
-    else
-	ch->line_status &= ~LINE_UP;
-
-    /* Remove w attribute from /proc files associated to hw parameters:
-       no write when the device is open */
-
-    for (; procfile; procfile = procfile->next)
-	if (strcmp(procfile->name, FILENAME_BOARDNUM) == 0 ||
-	    strcmp(procfile->name, FILENAME_TIMESLOTS) == 0)
-	    procfile->mode = S_IFREG | 0444;
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    return 0;
-}
-
-/*
- * Hardware close routine.
- * Called by comx (upper) layer when the user wants to bring down the interface
- * with ifconfig.
- * We also call it from MUNICH_open, if the open fails.
- * Brings down hardware, frees resources, stops receiver
- * Returns 0 on OK, or standard error value on error.
- */
-
-static int MUNICH_close(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    struct proc_dir_entry *procfile = ch->procdir->subdir;
-    munich_board_t *board;
-    munich_ccb_t *ccb;
-
-    u32 *bar1;
-    u32 timeslots = hw->timeslots;
-    int stat, i, channel = hw->channel;
-    unsigned long jiffs;
-
-    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    ccb = board->ccb;
-    bar1 = board->bar1;
-
-    if (board->isx21)
-	del_timer((struct timer_list *)&board->modemline_timer);
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    /* Disable receiver for the channel: */
-
-    for (i = 0; i < 32; i++)
-	if ((1 << i) & timeslots)
-	{
-	    ccb->timeslot_spec[i].tti = 1;
-	    ccb->timeslot_spec[i].txfillmask = 0;	/* just to be double-sure :) */
-
-	    ccb->timeslot_spec[i].rti = 1;
-	    ccb->timeslot_spec[i].rxfillmask = 0;
-	}
-
-    if (!board->isx21) rework_idle_channels(dev);
-
-    ccb->channel_spec[channel].ti = 0;	/* Receive off, Transmit off */
-    ccb->channel_spec[channel].to = 1;
-    ccb->channel_spec[channel].ta = 0;
-    ccb->channel_spec[channel].th = 1;
-
-    ccb->channel_spec[channel].ri = 0;
-    ccb->channel_spec[channel].ro = 1;
-    ccb->channel_spec[channel].ra = 0;
-
-    board->twins[channel] = NULL;
-
-    ccb->action_spec = CCB_ACTIONSPEC_IN | (channel << 8);
-    writel(CMD_ARPCM, MUNICH_VIRT(CMD));
-    set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(1);
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    stat = 0;
-    jiffs = jiffies;
-    while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ))
-    {
-	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(1);
-    }
-
-    if (stat & STAT_PCMF)
-    {
-	printk(KERN_ERR
-	       "MUNICH_close: %s: FATAL: channel off ARPCM failed, not closing!\n",
-	       dev->name);
-	writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT));
-	/* If we return success, the privdata (and the descriptor list) will be freed */
-	return -EIO;
-    }
-    else if (!(stat & STAT_PCMA))
-	printk(KERN_ERR "MUNICH_close: %s: channel off ARPCM timeout\n",
-	       board->devname);
-
-    writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT));
-    //      printk("MUNICH_close: %s: channel off took %ld jiffies\n", board->devname, jiffies-jiffs);
-
-    spin_lock_irqsave(&mister_lock, flags);
-
-    if (board->use_count) board->use_count--;
-
-    if (!board->use_count)	/* we were the last user of the board */
-    {
-	printk("MUNICH_close: bringing down board %s\n", board->devname);
-
-	/* program down the board: */
-
-	writel(0x0000FF7F, MUNICH_VIRT(IMASK));	/* do not send any interrupts */
-	writel(0, MUNICH_VIRT(CMD));	/* stop the timer if someone started it */
-	writel(~0U, MUNICH_VIRT(STAT));	/* if an interrupt came between the cli()-sti(), quiet it */
-	if (ch->hardware == &pcicomhw)
-	    writel(0x1400, MUNICH_VIRT(GPDATA));
-
-	/* Put the board into 'reset' state: */
-	pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0xe0000);
-
-	/* Free irq and other resources: */
-	if (board->irq)
-	    free_irq(board->irq, (void *)board);	/* Ha nem inicializalta magat, akkor meg nincs irq */
-	board->irq = 0;
-
-	/* Free CCB and the interrupt queues */
-	if (board->ccb) kfree((void *)board->ccb);
-	if (board->tiq) kfree((void *)board->tiq);
-	if (board->riq) kfree((void *)board->riq);
-	if (board->piq) kfree((void *)board->piq);
-	board->ccb = NULL;
-	board->tiq = board->riq = board->piq = NULL;
-    }
-
-    /* Enable setting of hw parameters */
-    for (; procfile; procfile = procfile->next)
-	if (strcmp(procfile->name, FILENAME_BOARDNUM) == 0 ||
-	    strcmp(procfile->name, FILENAME_TIMESLOTS) == 0)
-	    procfile->mode = S_IFREG | 0644;
-
-    /* We're not open anymore */
-    ch->init_status &= ~HW_OPEN;
-
-    spin_unlock_irqrestore(&mister_lock, flags);
-
-    return 0;
-}
-
-/* 
- * Give (textual) status information.
- * The text it returns will be a part of what appears when the user does a
- * cat /proc/comx/comx[n]/status 
- * Don't write more than PAGESIZE.
- * Return value: number of bytes written (length of the string, incl. 0)
- */
-
-static int MUNICH_minden(struct net_device *dev, char *page)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    munich_board_t *board;
-    struct net_device *devp;
-
-    u8 *lbi;
-    e1_stats_t *curr_int, *prev_int;
-    e1_stats_t last4, last96;	/* sum of last 4, resp. last 96 intervals               */
-    unsigned *sump,		/* running pointer for the sum data                     */
-     *p;			/* running pointer for the interval data                */
-
-    int len = 0;
-    u8 frs0, frs1;
-    u8 fmr2;
-    int i, j;
-    u32 timeslots;
-
-    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    lbi = board->lbi;
-    curr_int = &board->intervals[board->current_interval];
-    prev_int =
-	&board->
-	intervals[(board->current_interval + SLICECOM_BOARD_INTERVALS_SIZE -
-		   1) % SLICECOM_BOARD_INTERVALS_SIZE];
-
-    if (!board->isx21)
-    {
-	frs0 = readb(lbi + FRS0);
-	fmr2 = readb(lbi + FMR2);
-	len += scnprintf(page + len, PAGE_SIZE - len, "Controller status:\n");
-	if (frs0 == 0)
-	    len += scnprintf(page + len, PAGE_SIZE - len, "\tNo alarms\n");
-	else
-	{
-	    if (frs0 & FRS0_LOS)
-	            len += scnprintf(page + len, PAGE_SIZE - len, "\tLoss Of Signal\n");
-	    else
-	    {
-		if (frs0 & FRS0_AIS)
-		    len += scnprintf(page + len, PAGE_SIZE - len,
-				 "\tAlarm Indication Signal\n");
-		else
-		{
-		    if (frs0 & FRS0_AUXP)
-			len += scnprintf(page + len, PAGE_SIZE - len,
-				     "\tAuxiliary Pattern Indication\n");
-		    if (frs0 & FRS0_LFA)
-			len += scnprintf(page + len, PAGE_SIZE - len,
-				     "\tLoss of Frame Alignment\n");
-		    else
-		    {
-			if (frs0 & FRS0_RRA)
-			    len += scnprintf(page + len, PAGE_SIZE - len,
-					 "\tReceive Remote Alarm\n");
-
-			/* You can't set this framing with the /proc interface, but it  */
-			/* may be good to have here this alarm if you set it by hand:   */
-
-			if ((board->framing == SLICECOM_FRAMING_CRC4) &&
-			    (frs0 & FRS0_LMFA))
-			    len += scnprintf(page + len, PAGE_SIZE - len,
-					 "\tLoss of CRC4 Multiframe Alignment\n");
-
-			if (((fmr2 & 0xc0) == 0xc0) && (frs0 & FRS0_NMF))
-			    len += scnprintf(page + len, PAGE_SIZE - len,
-				 "\tNo CRC4 Multiframe alignment Found after 400 msec\n");
-		    }
-		}
-	    }
-	}
-
-	frs1 = readb(lbi + FRS1);
-	if (FRS1_XLS & frs1)
-	    len += scnprintf(page + len, PAGE_SIZE - len,
-		 "\tTransmit Line Short\n");
-
-	/* debug Rx ring: DEL: - vagy meghagyni, de akkor legyen kicsit altalanosabb */
-    }
-
-    len += scnprintf(page + len, PAGE_SIZE - len, "Rx ring:\n");
-    len += scnprintf(page + len, PAGE_SIZE - len, "\trafutott: %d\n", hw->rafutott);
-    len += scnprintf(page + len, PAGE_SIZE - len,
-		 "\tlastcheck: %ld, jiffies: %ld\n", board->lastcheck, jiffies);
-    len += scnprintf(page + len, PAGE_SIZE - len, "\tbase: %08x\n",
-	(u32) virt_to_phys(&hw->rx_desc[0]));
-    len += scnprintf(page + len, PAGE_SIZE - len, "\trx_desc_ptr: %d\n",
-		 hw->rx_desc_ptr);
-    len += scnprintf(page + len, PAGE_SIZE - len, "\trx_desc_ptr: %08x\n",
-	(u32) virt_to_phys(&hw->rx_desc[hw->rx_desc_ptr]));
-    len += scnprintf(page + len, PAGE_SIZE - len, "\thw_curr_ptr: %08x\n",
-		 board->ccb->current_rx_desc[hw->channel]);
-
-    for (i = 0; i < RX_DESC_MAX; i++)
-	len += scnprintf(page + len, PAGE_SIZE - len, "\t%08x %08x %08x %08x\n",
-		     *((u32 *) & hw->rx_desc[i] + 0),
-		     *((u32 *) & hw->rx_desc[i] + 1),
-		     *((u32 *) & hw->rx_desc[i] + 2),
-		     *((u32 *) & hw->rx_desc[i] + 3));
-
-    if (!board->isx21)
-    {
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "Interfaces using this board: (channel-group, interface, timeslots)\n");
-	for (i = 0; i < 32; i++)
-	{
-	    devp = board->twins[i];
-	    if (devp != NULL)
-	    {
-		timeslots =
-		    ((struct slicecom_privdata *)((struct comx_channel *)devp->
-						  priv)->HW_privdata)->
-		    timeslots;
-		len += scnprintf(page + len, PAGE_SIZE - len, "\t%2d %s: ", i,
-			     devp->name);
-		for (j = 0; j < 32; j++)
-		    if ((1 << j) & timeslots)
-			len += scnprintf(page + len, PAGE_SIZE - len, "%d ", j);
-		len += scnprintf(page + len, PAGE_SIZE - len, "\n");
-	    }
-	}
-    }
-
-    len += scnprintf(page + len, PAGE_SIZE - len, "Interrupt work histogram:\n");
-    for (i = 0; i < MAX_WORK; i++)
-	len += scnprintf(page + len, PAGE_SIZE - len, "hist[%2d]: %8u%c", i,
-		     board->histogram[i], (i &&
-					   ((i + 1) % 4 == 0 ||
-					    i == MAX_WORK - 1)) ? '\n' : ' ');
-
-    len += scnprintf(page + len, PAGE_SIZE - len, "Tx ring histogram:\n");
-    for (i = 0; i < TX_DESC_MAX; i++)
-	len += scnprintf(page + len, PAGE_SIZE - len, "hist[%2d]: %8u%c", i,
-		     hw->tx_ring_hist[i], (i &&
-					   ((i + 1) % 4 == 0 ||
-					    i ==
-					    TX_DESC_MAX - 1)) ? '\n' : ' ');
-
-    if (!board->isx21)
-    {
-
-	memset((void *)&last4, 0, sizeof(last4));
-	memset((void *)&last96, 0, sizeof(last96));
-
-	/* Calculate the sum of last 4 intervals: */
-
-	for (i = 1; i <= 4; i++)
-	{
-	    p = (unsigned *)&board->intervals[(board->current_interval +
-			   SLICECOM_BOARD_INTERVALS_SIZE -
-			   i) % SLICECOM_BOARD_INTERVALS_SIZE];
-	    sump = (unsigned *)&last4;
-	    for (j = 0; j < (sizeof(e1_stats_t) / sizeof(unsigned)); j++)
-		sump[j] += p[j];
-	}
-
-	/* Calculate the sum of last 96 intervals: */
-
-	for (i = 1; i <= 96; i++)
-	{
-	    p = (unsigned *)&board->intervals[(board->current_interval +
-			   SLICECOM_BOARD_INTERVALS_SIZE -
-			   i) % SLICECOM_BOARD_INTERVALS_SIZE];
-	    sump = (unsigned *)&last96;
-	    for (j = 0; j < (sizeof(e1_stats_t) / sizeof(unsigned)); j++)
-		sump[j] += p[j];
-	}
-
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "Data in current interval (%d seconds elapsed):\n",
-		     board->elapsed_seconds);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n",
-		     curr_int->line_code_violations,
-		     curr_int->path_code_violations, curr_int->e_bit_errors);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n",
-		     curr_int->slip_secs, curr_int->fr_loss_secs,
-		     curr_int->line_err_secs, curr_int->degraded_mins);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n",
-		     curr_int->errored_secs, curr_int->bursty_err_secs,
-		     curr_int->severely_err_secs, curr_int->unavail_secs);
-
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "Data in Interval 1 (15 minutes):\n");
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n",
-		     prev_int->line_code_violations,
-		     prev_int->path_code_violations, prev_int->e_bit_errors);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n",
-		     prev_int->slip_secs, prev_int->fr_loss_secs,
-		     prev_int->line_err_secs, prev_int->degraded_mins);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n",
-		     prev_int->errored_secs, prev_int->bursty_err_secs,
-		     prev_int->severely_err_secs, prev_int->unavail_secs);
-
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "Data in last 4 intervals (1 hour):\n");
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n",
-		     last4.line_code_violations, last4.path_code_violations,
-		     last4.e_bit_errors);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n",
-		     last4.slip_secs, last4.fr_loss_secs, last4.line_err_secs,
-		     last4.degraded_mins);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n",
-		     last4.errored_secs, last4.bursty_err_secs,
-		     last4.severely_err_secs, last4.unavail_secs);
-
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "Data in last 96 intervals (24 hours):\n");
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n",
-		     last96.line_code_violations, last96.path_code_violations,
-		     last96.e_bit_errors);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n",
-		     last96.slip_secs, last96.fr_loss_secs,
-		     last96.line_err_secs, last96.degraded_mins);
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "   %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n",
-		     last96.errored_secs, last96.bursty_err_secs,
-		     last96.severely_err_secs, last96.unavail_secs);
-
-    }
-
-//      len +=scnprintf( page + len, PAGE_SIZE - len, "Special events:\n" );
-//      len +=scnprintf( page + len, PAGE_SIZE - len, "\tstat_pri/missed: %u / %u\n", board->stat_pri_races, board->stat_pri_races_missed );
-//      len +=scnprintf( page + len, PAGE_SIZE - len, "\tstat_pti/missed: %u / %u\n", board->stat_pti_races, board->stat_pti_races_missed );
-    return len;
-}
-
-/*
- * Memory dump function. Not used currently.
- */
-static int BOARD_dump(struct net_device *dev)
-{
-    printk
-	("BOARD_dump() requested. It is unimplemented, it should not be called\n");
-    return (-1);
-}
-
-/* 
- * /proc file read function for the files registered by this module.
- * This function is called by the procfs implementation when a user
- * wants to read from a file registered by this module.
- * page is the workspace, start should point to the real start of data,
- * off is the file offset, data points to the file's proc_dir_entry
- * structure.
- * Returns the number of bytes copied to the request buffer.
- */
-
-static int munich_read_proc(char *page, char **start, off_t off, int count,
-			    int *eof, void *data)
-{
-    struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-    struct net_device *dev = file->parent->data;
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    munich_board_t *board;
-
-    int len = 0, i;
-    u32 timeslots = hw->timeslots;
-
-    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    if (!strcmp(file->name, FILENAME_BOARDNUM))
-	len = sprintf(page, "%d\n", hw->boardnum);
-    else if (!strcmp(file->name, FILENAME_TIMESLOTS))
-    {
-	for (i = 0; i < 32; i++)
-	    if ((1 << i) & timeslots)
-		len += scnprintf(page + len, PAGE_SIZE - len, "%d ", i);
-	len += scnprintf(page + len, PAGE_SIZE - len, "\n");
-    }
-    else if (!strcmp(file->name, FILENAME_FRAMING))
-    {
-	i = 0;
-	while (slicecom_framings[i].value &&
-	       slicecom_framings[i].value != board->framing)
-	    i++;
-	len += scnprintf(page + len, PAGE_SIZE - len, "%s\n",
-		     slicecom_framings[i].name);
-    }
-    else if (!strcmp(file->name, FILENAME_LINECODE))
-    {
-	i = 0;
-	while (slicecom_linecodes[i].value &&
-	       slicecom_linecodes[i].value != board->linecode)
-	    i++;
-	len += scnprintf(page + len, PAGE_SIZE - len, "%s\n",
-		     slicecom_linecodes[i].name);
-    }
-    else if (!strcmp(file->name, FILENAME_CLOCK_SOURCE))
-    {
-	i = 0;
-	while (slicecom_clock_sources[i].value &&
-	       slicecom_clock_sources[i].value != board->clock_source)
-	    i++;
-	len +=
-	    scnprintf(page + len, PAGE_SIZE - len, "%s\n",
-		     slicecom_clock_sources[i].name);
-    }
-    else if (!strcmp(file->name, FILENAME_LOOPBACK))
-    {
-	i = 0;
-	while (slicecom_loopbacks[i].value &&
-	       slicecom_loopbacks[i].value != board->loopback)
-	    i++;
-	len += scnprintf(page + len, PAGE_SIZE - len, "%s\n",
-		     slicecom_loopbacks[i].name);
-    }
-    /* We set permissions to write-only for REG and LBIREG, but root can read them anyway: */
-    else if (!strcmp(file->name, FILENAME_REG))
-    {
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "%s: " FILENAME_REG ": write-only file\n", dev->name);
-    }
-    else if (!strcmp(file->name, FILENAME_LBIREG))
-    {
-	len += scnprintf(page + len, PAGE_SIZE - len,
-		     "%s: " FILENAME_LBIREG ": write-only file\n", dev->name);
-    }
-    else
-    {
-	printk("slicecom_read_proc: internal error, filename %s\n", file->name);
-	return -EBADF;
-    }
-    /* file handling administration: count eof status, offset, start address
-       and count: */
-
-    if (off >= len)
-    {
-	*eof = 1;
-	return 0;
-    }
-
-    *start = page + off;
-    if (count >= len - off)
-	*eof = 1;
-    return min((off_t) count, (off_t) len - off);
-}
-
-/* 
- * Write function for /proc files registered by us.
- * See the comment on read function above.
- * Beware! buffer is in userspace!!!
- * Returns the number of bytes written
- */
-
-static int munich_write_proc(struct file *file, const char *buffer,
-			     u_long count, void *data)
-{
-    struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-    struct net_device *dev = (struct net_device *)entry->parent->data;
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw = ch->HW_privdata;
-    munich_board_t *board;
-
-    unsigned long ts, tmp_boardnum;
-
-    u32 tmp_timeslots = 0;
-    char *page, *p;
-    int i;
-
-    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    /* Paranoia checking: */
-
-    if (PDE(file->f_dentry->d_inode) != entry)
-    {
-	printk(KERN_ERR "munich_write_proc: file <-> data internal error\n");
-	return -EIO;
-    }
-
-    /* Request tmp buffer */
-    if (!(page = (char *)__get_free_page(GFP_KERNEL)))
-	return -ENOMEM;
-
-    /* Copy user data and cut trailing \n */
-    if (copy_from_user(page, buffer, count = min(count, PAGE_SIZE))) {
-	    free_page((unsigned long)page);
-	    return -EFAULT;
-    }
-    if (*(page + count - 1) == '\n')
-	*(page + count - 1) = 0;
-    *(page + PAGE_SIZE - 1) = 0;
-
-    if (!strcmp(entry->name, FILENAME_BOARDNUM))
-    {
-	tmp_boardnum = simple_strtoul(page, NULL, 0);
-	if (0 <= tmp_boardnum && tmp_boardnum < MAX_BOARDS)
-	    hw->boardnum = tmp_boardnum;
-	else
-	{
-	    printk("%s: " FILENAME_BOARDNUM " range is 0...%d\n", dev->name,
-		   MAX_BOARDS - 1);
-	    free_page((unsigned long)page);
-	    return -EINVAL;
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_TIMESLOTS))
-    {
-	p = page;
-	while (*p)
-	{
-	    if (isspace(*p))
-		p++;
-	    else
-	    {
-		ts = simple_strtoul(p, &p, 10);	/* base = 10: Don't read 09 as an octal number */
-		/* ts = 0 ha nem tudta beolvasni a stringet, erre egy kicsit epitek itt: */
-		if (0 <= ts && ts < 32)
-		{
-		    tmp_timeslots |= (1 << ts);
-		}
-		else
-		{
-		    printk("%s: " FILENAME_TIMESLOTS " range is 1...31\n",
-			   dev->name);
-		    free_page((unsigned long)page);
-		    return -EINVAL;
-		}
-	    }
-	}
-	hw->timeslots = tmp_timeslots;
-    }
-    else if (!strcmp(entry->name, FILENAME_FRAMING))
-    {
-	i = 0;
-	while (slicecom_framings[i].value &&
-	       strncmp(slicecom_framings[i].name, page,
-		       strlen(slicecom_framings[i].name)))
-	    i++;
-	if (!slicecom_framings[i].value)
-	{
-	    printk("slicecom: %s: Invalid " FILENAME_FRAMING " '%s'\n",
-		   dev->name, page);
-	    free_page((unsigned long)page);
-	    return -EINVAL;
-	}
-	else
-	{			/*
-				 * If somebody says:
-				 *      echo >boardnum  0
-				 *      echo >framing   no-crc4
-				 *      echo >boardnum  1
-				 * - when the framing was set, hw->boardnum was 0, so it would set the framing for board 0
-				 * Workaround: allow to set it only if interface is administrative UP
-				 */
-	    if (netif_running(dev))
-		slicecom_set_framing(hw->boardnum, slicecom_framings[i].value);
-	    else
-	    {
-		printk("%s: " FILENAME_FRAMING
-		       " can not be set while the interface is DOWN\n",
-		       dev->name);
-		free_page((unsigned long)page);
-		return -EINVAL;
-	    }
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_LINECODE))
-    {
-	i = 0;
-	while (slicecom_linecodes[i].value &&
-	       strncmp(slicecom_linecodes[i].name, page,
-		       strlen(slicecom_linecodes[i].name)))
-	    i++;
-	if (!slicecom_linecodes[i].value)
-	{
-	    printk("slicecom: %s: Invalid " FILENAME_LINECODE " '%s'\n",
-		   dev->name, page);
-	    free_page((unsigned long)page);
-	    return -EINVAL;
-	}
-	else
-	{			/*
-				 * Allow to set it only if interface is administrative UP,
-				 * for the same reason as FILENAME_FRAMING
-				 */
-	    if (netif_running(dev))
-		slicecom_set_linecode(hw->boardnum,
-				      slicecom_linecodes[i].value);
-	    else
-	    {
-		printk("%s: " FILENAME_LINECODE
-		       " can not be set while the interface is DOWN\n",
-		       dev->name);
-		free_page((unsigned long)page);
-		return -EINVAL;
-	    }
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_CLOCK_SOURCE))
-    {
-	i = 0;
-	while (slicecom_clock_sources[i].value &&
-	       strncmp(slicecom_clock_sources[i].name, page,
-		       strlen(slicecom_clock_sources[i].name)))
-	    i++;
-	if (!slicecom_clock_sources[i].value)
-	{
-	    printk("%s: Invalid " FILENAME_CLOCK_SOURCE " '%s'\n", dev->name,
-		   page);
-	    free_page((unsigned long)page);
-	    return -EINVAL;
-	}
-	else
-	{			/*
-				 * Allow to set it only if interface is administrative UP,
-				 * for the same reason as FILENAME_FRAMING
-				 */
-	    if (netif_running(dev))
-		slicecom_set_clock_source(hw->boardnum,
-					  slicecom_clock_sources[i].value);
-	    else
-	    {
-		printk("%s: " FILENAME_CLOCK_SOURCE
-		       " can not be set while the interface is DOWN\n",
-		       dev->name);
-		free_page((unsigned long)page);
-		return -EINVAL;
-	    }
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_LOOPBACK))
-    {
-	i = 0;
-	while (slicecom_loopbacks[i].value &&
-	       strncmp(slicecom_loopbacks[i].name, page,
-		       strlen(slicecom_loopbacks[i].name)))
-	    i++;
-	if (!slicecom_loopbacks[i].value)
-	{
-	    printk("%s: Invalid " FILENAME_LOOPBACK " '%s'\n", dev->name, page);
-	    free_page((unsigned long)page);
-	    return -EINVAL;
-	}
-	else
-	{			/*
-				 * Allow to set it only if interface is administrative UP,
-				 * for the same reason as FILENAME_FRAMING
-				 */
-	    if (netif_running(dev))
-		slicecom_set_loopback(hw->boardnum,
-				      slicecom_loopbacks[i].value);
-	    else
-	    {
-		printk("%s: " FILENAME_LOOPBACK
-		       " can not be set while the interface is DOWN\n",
-		       dev->name);
-		free_page((unsigned long)page);
-		return -EINVAL;
-	    }
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_REG))
-    {				/* DEL: 'reg' csak tmp */
-	char *p;
-	u32 *bar1 = board->bar1;
-
-	reg = simple_strtoul(page, &p, 0);
-	reg_ertek = simple_strtoul(p + 1, NULL, 0);
-
-	if (reg < 0x100)
-	{
-	    printk("reg(0x%02x) := 0x%08x  jiff: %lu\n", reg, reg_ertek, jiffies);
-	    writel(reg_ertek, MUNICH_VIRT(reg >> 2));
-	}
-	else
-	{
-	    printk("reg(0x%02x) is 0x%08x  jiff: %lu\n", reg - 0x100,
-		   readl(MUNICH_VIRT((reg - 0x100) >> 2)), jiffies);
-	}
-    }
-    else if (!strcmp(entry->name, FILENAME_LBIREG))
-    {				/* DEL: 'lbireg' csak tmp */
-	char *p;
-	u8 *lbi = board->lbi;
-
-	lbireg = simple_strtoul(page, &p, 0);
-	lbireg_ertek = simple_strtoul(p + 1, NULL, 0);
-
-	if (lbireg < 0x100)
-	{
-	    printk("lbireg(0x%02x) := 0x%02x  jiff: %lu\n", lbireg,
-		   lbireg_ertek, jiffies);
-	    writeb(lbireg_ertek, lbi + lbireg);
-	}
-	else
-	    printk("lbireg(0x%02x) is 0x%02x  jiff: %lu\n", lbireg - 0x100,
-		   readb(lbi + lbireg - 0x100), jiffies);
-    }
-    else
-    {
-	printk(KERN_ERR "munich_write_proc: internal error, filename %s\n",
-	       entry->name);
-	free_page((unsigned long)page);
-	return -EBADF;
-    }
-
-    /* Don't forget to free the workspace */
-    free_page((unsigned long)page);
-    return count;
-}
-
-/* 
- * Boardtype init function.
- * Called by the comx (upper) layer, when you set boardtype.
- * Allocates resources associated to using munich board for this device,
- * initializes ch_struct pointers etc.
- * Returns 0 on success and standard error codes on error.
- */
-
-static int init_escape(struct comx_channel *ch)
-{
-    kfree(ch->HW_privdata);
-    return -EIO;
-}
-
-static int BOARD_init(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-    struct slicecom_privdata *hw;
-    struct proc_dir_entry *new_file;
-
-    /* Alloc data for private structure */
-    if ((ch->HW_privdata =
-	kmalloc(sizeof(struct slicecom_privdata), GFP_KERNEL)) == NULL)
-        return -ENOMEM;
-        
-    memset(hw = ch->HW_privdata, 0, sizeof(struct slicecom_privdata));
-
-    /* Register /proc files */
-    if ((new_file = create_proc_entry(FILENAME_BOARDNUM, S_IFREG | 0644,
-			   ch->procdir)) == NULL)
-	return init_escape(ch);
-    new_file->data = (void *)new_file;
-    new_file->read_proc = &munich_read_proc;
-    new_file->write_proc = &munich_write_proc;
-//      new_file->proc_iops = &comx_normal_inode_ops;
-    new_file->nlink = 1;
-
-    if (ch->hardware == &slicecomhw)
-    {
-	if ((new_file = create_proc_entry(FILENAME_TIMESLOTS, S_IFREG | 0644,
-			       ch->procdir)) == NULL)
-	    return init_escape(ch);
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &munich_read_proc;
-	new_file->write_proc = &munich_write_proc;
-//              new_file->proc_iops = &comx_normal_inode_ops;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_FRAMING, S_IFREG | 0644,
-			       ch->procdir)) == NULL)
-	    return init_escape(ch);
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &munich_read_proc;
-	new_file->write_proc = &munich_write_proc;
-//              new_file->proc_iops = &comx_normal_inode_ops;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_LINECODE, S_IFREG | 0644,
-			       ch->procdir)) == NULL)
-	    return init_escape(ch);
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &munich_read_proc;
-	new_file->write_proc = &munich_write_proc;
-//              new_file->proc_iops = &comx_normal_inode_ops;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_CLOCK_SOURCE, S_IFREG | 0644,
-			       ch->procdir)) == NULL)
-	    return init_escape(ch);
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &munich_read_proc;
-	new_file->write_proc = &munich_write_proc;
-//              new_file->proc_iops = &comx_normal_inode_ops;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_LOOPBACK, S_IFREG | 0644,
-			       ch->procdir)) == NULL)
-	    return init_escape(ch);
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &munich_read_proc;
-	new_file->write_proc = &munich_write_proc;
-//              new_file->proc_iops = &comx_normal_inode_ops;
-	new_file->nlink = 1;
-    }
-
-    /* DEL: ez itt csak fejlesztesi celokra!! */
-    if ((new_file = create_proc_entry(FILENAME_REG, S_IFREG | 0200, ch->procdir)) == NULL)
-	return init_escape(ch);
-    new_file->data = (void *)new_file;
-    new_file->read_proc = &munich_read_proc;
-    new_file->write_proc = &munich_write_proc;
-//      new_file->proc_iops = &comx_normal_inode_ops;
-    new_file->nlink = 1;
-
-    /* DEL: ez itt csak fejlesztesi celokra!! */
-    if ((new_file = create_proc_entry(FILENAME_LBIREG, S_IFREG | 0200,
-			   ch->procdir)) == NULL)
-	return init_escape(ch);
-    new_file->data = (void *)new_file;
-    new_file->read_proc = &munich_read_proc;
-    new_file->write_proc = &munich_write_proc;
-//      new_file->proc_iops = &comx_normal_inode_ops;
-    new_file->nlink = 1;
-
-    /* Fill in ch_struct hw specific pointers: */
-
-    ch->HW_txe = MUNICH_txe;
-    ch->HW_open = MUNICH_open;
-    ch->HW_close = MUNICH_close;
-    ch->HW_send_packet = MUNICH_send_packet;
-#ifndef COMX_NEW
-    ch->HW_minden = MUNICH_minden;
-#else
-    ch->HW_statistics = MUNICH_minden;
-#endif
-
-    hw->boardnum = SLICECOM_BOARDNUM_DEFAULT;
-    hw->timeslots = ch->hardware == &pcicomhw ?  0xffffffff : 2;
-
-    /* O.K. Count one more user on this module */
-    MOD_INC_USE_COUNT;
-    return 0;
-}
-
-/* 
- * Boardtype exit function.
- * Called by the comx (upper) layer, when you clear boardtype from munich.
- * Frees resources associated to using munich board for this device,
- * resets ch_struct pointers etc.
- */
-static int BOARD_exit(struct net_device *dev)
-{
-    struct comx_channel *ch = netdev_priv(dev);
-
-    /* Free private data area */
-//    board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards);
-
-    kfree(ch->HW_privdata);
-    /* Remove /proc files */
-    remove_proc_entry(FILENAME_BOARDNUM, ch->procdir);
-    if (ch->hardware == &slicecomhw)
-    {
-	remove_proc_entry(FILENAME_TIMESLOTS, ch->procdir);
-	remove_proc_entry(FILENAME_FRAMING, ch->procdir);
-	remove_proc_entry(FILENAME_LINECODE, ch->procdir);
-	remove_proc_entry(FILENAME_CLOCK_SOURCE, ch->procdir);
-	remove_proc_entry(FILENAME_LOOPBACK, ch->procdir);
-    }
-    remove_proc_entry(FILENAME_REG, ch->procdir);
-    remove_proc_entry(FILENAME_LBIREG, ch->procdir);
-
-    /* Minus one user for the module accounting */
-    MOD_DEC_USE_COUNT;
-    return 0;
-}
-
-static struct comx_hardware slicecomhw =
-{
-    "slicecom",
-#ifdef COMX_NEW
-    VERSION,
-#endif
-    BOARD_init,
-    BOARD_exit,
-    BOARD_dump,
-    NULL
-};
-
-static struct comx_hardware pcicomhw =
-{
-    "pcicom",
-#ifdef COMX_NEW
-    VERSION,
-#endif
-    BOARD_init,
-    BOARD_exit,
-    BOARD_dump,
-    NULL
-};
-
-/* Module management */
-
-static int __init init_mister(void)
-{
-    printk(VERSIONSTR);
-    comx_register_hardware(&slicecomhw);
-    comx_register_hardware(&pcicomhw);
-    return munich_probe();
-}
-
-static void __exit cleanup_mister(void)
-{
-    int i;
-
-    comx_unregister_hardware("slicecom");
-    comx_unregister_hardware("pcicom");
-
-    for (i = 0; i < MAX_BOARDS; i++)
-    {
-	if (slicecom_boards[i].bar1)
-	    iounmap((void *)slicecom_boards[i].bar1);
-	if (slicecom_boards[i].lbi)
-	    iounmap((void *)slicecom_boards[i].lbi);
-	if (pcicom_boards[i].bar1)
-	    iounmap((void *)pcicom_boards[i].bar1);
-	if (pcicom_boards[i].lbi)
-	    iounmap((void *)pcicom_boards[i].lbi);
-    }
-}
-
-module_init(init_mister);
-module_exit(cleanup_mister);
diff -Nru a/drivers/net/wan/comx-proto-fr.c b/drivers/net/wan/comx-proto-fr.c
--- a/drivers/net/wan/comx-proto-fr.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1014 +0,0 @@
-/*
- * Frame-relay protocol module for the COMX driver 
- * for Linux 2.2.X
- *
- * Original author: Tivadar Szemethy <tiv@itc.hu>
- * Maintainer: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1998-1999 ITConsult-Pro Co. <info@itc.hu>
- * 
- * Contributors:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br> (0.73)
- *
- * 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.
- *
- * Version 0.70 (99/06/14):
- *		- cleaned up the source code a bit
- *		- ported back to kernel, now works as builtin code 
- *
- * Version 0.71 (99/06/25):
- *		- use skb priorities and queues for sending keepalive
- * 		- use device queues for slave->master data transmit
- *		- set IFF_RUNNING only line protocol up
- *		- fixes on slave device flags
- * 
- * Version 0.72 (99/07/09):
- *		- handle slave tbusy with master tbusy (should be fixed)
- *		- fix the keepalive timer addition/deletion
- *
- * Version 0.73 (00/08/15)
- * 		- resource release on failure at fr_master_init and
- *		  fr_slave_init 		  
- */
-
-#define VERSION "0.73"
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/jiffies.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/if_arp.h>
-#include <linux/inetdevice.h>
-#include <linux/pkt_sched.h>
-#include <linux/init.h>
-
-#include <asm/uaccess.h>
-
-#include "comx.h"
-#include "comxhw.h"
-
-MODULE_AUTHOR("Author: Tivadar Szemethy <tiv@itc.hu>");
-MODULE_DESCRIPTION("Frame Relay protocol implementation for the COMX drivers"
-	"for Linux kernel 2.4.X");
-MODULE_LICENSE("GPL");
-
-#define	FRAD_UI		0x03
-#define	NLPID_IP	0xcc
-#define	NLPID_Q933_LMI	0x08
-#define	NLPID_CISCO_LMI	0x09	
-#define Q933_ENQ	0x75
-#define	Q933_LINESTAT	0x51
-#define	Q933_COUNTERS	0x53
-
-#define	MAXALIVECNT	3		/* No. of failures */
-
-struct fr_data {
-	u16	dlci;
-	struct	net_device *master;
-	char	keepa_pend;
-	char	keepa_freq;
-	char	keepalivecnt, keeploopcnt;
-	struct	timer_list keepa_timer;
-	u8	local_cnt, remote_cnt;
-};
-
-static struct comx_protocol fr_master_protocol;
-static struct comx_protocol fr_slave_protocol;
-static struct comx_hardware fr_dlci;
-
-static void fr_keepalive_send(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct sk_buff *skb;
-	u8 *fr_packet;
-	
-	skb=alloc_skb(dev->hard_header_len + 13, GFP_ATOMIC);
-	
-	if(skb==NULL)
-		return;
-               
-        skb_reserve(skb, dev->hard_header_len);
-        
-        fr_packet=(u8*)skb_put(skb, 13);
-                 
-	fr_packet[0] = (fr->dlci & (1024 - 15)) >> 2;
-	fr_packet[1] = (fr->dlci & 15) << 4 | 1;	// EA bit 1
-	fr_packet[2] = FRAD_UI;
-	fr_packet[3] = NLPID_Q933_LMI;
-	fr_packet[4] = 0;
-	fr_packet[5] = Q933_ENQ;
-	fr_packet[6] = Q933_LINESTAT;
-	fr_packet[7] = 0x01;
-	fr_packet[8] = 0x01;
-	fr_packet[9] = Q933_COUNTERS;
-	fr_packet[10] = 0x02;
-	fr_packet[11] = ++fr->local_cnt;
-	fr_packet[12] = fr->remote_cnt;
-
-	skb->dev = dev;
-	skb->priority = TC_PRIO_CONTROL;
-	dev_queue_xmit(skb);
-}
-
-static void fr_keepalive_timerfun(unsigned long d) 
-{
-	struct net_device *dev = (struct net_device *)d;
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-	struct net_device *sdev;
-
-	if (ch->init_status & LINE_OPEN) {
-		if (fr->keepalivecnt == MAXALIVECNT) {
-			comx_status(dev, ch->line_status & ~PROTO_UP);
-			dev->flags &= ~IFF_RUNNING;
-			for (; dir ; dir = dir->next) {
-				if(!S_ISDIR(dir->mode)) {
-				    continue;
-				}
-	
-				if ((sdev = dir->data) && (sch = sdev->priv) && 
-				    (sdev->type == ARPHRD_DLCI) && 
-				    (sfr = sch->LINE_privdata) 
-				    && (sfr->master == dev) && 
-				    (sdev->flags & IFF_UP)) {
-					sdev->flags &= ~IFF_RUNNING;
-					comx_status(sdev, 
-						sch->line_status & ~PROTO_UP);
-				}
-			}
-		}
-		if (fr->keepalivecnt <= MAXALIVECNT) {
-			++fr->keepalivecnt;
-		}
-		fr_keepalive_send(dev);
-	}
-	mod_timer(&fr->keepa_timer, jiffies + HZ * fr->keepa_freq);
-}
-
-static void fr_rx_lmi(struct net_device *dev, struct sk_buff *skb, 
-	u16 dlci, u8 nlpid) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-	struct net_device *sdev;
-
-	if (dlci != fr->dlci || nlpid != NLPID_Q933_LMI || !fr->keepa_freq) {
-		return;
-	}
-
-	fr->remote_cnt = skb->data[7];
-	if (skb->data[8] == fr->local_cnt) { // keepalive UP!
-		fr->keepalivecnt = 0;
-		if ((ch->line_status & LINE_UP) && 
-		    !(ch->line_status & PROTO_UP)) {
-			comx_status(dev, ch->line_status |= PROTO_UP);
-			dev->flags |= IFF_RUNNING;
-			for (; dir ; dir = dir->next) {
-				if(!S_ISDIR(dir->mode)) {
-				    continue;
-				}
-	
-				if ((sdev = dir->data) && (sch = sdev->priv) && 
-				    (sdev->type == ARPHRD_DLCI) && 
-				    (sfr = sch->LINE_privdata) 
-				    && (sfr->master == dev) && 
-				    (sdev->flags & IFF_UP)) {
-					sdev->flags |= IFF_RUNNING;
-					comx_status(sdev, 
-						sch->line_status | PROTO_UP);
-				}
-			}
-		}
-	}
-}
-
-static void fr_set_keepalive(struct net_device *dev, int keepa) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-
-	if (!keepa && fr->keepa_freq) { // switch off
-		fr->keepa_freq = 0;
-		if (ch->line_status & LINE_UP) {
-			comx_status(dev, ch->line_status | PROTO_UP);
-			dev->flags |= IFF_RUNNING;
-			del_timer(&fr->keepa_timer);
-		}
-		return;
-	}
-
-	if (keepa) { // bekapcs
-		if(fr->keepa_freq && (ch->line_status & LINE_UP)) {
-			del_timer(&fr->keepa_timer);
-		}
-		fr->keepa_freq = keepa;
-		fr->local_cnt = fr->remote_cnt = 0;
-		init_timer(&fr->keepa_timer);
-		fr->keepa_timer.expires = jiffies + HZ;
-		fr->keepa_timer.function = fr_keepalive_timerfun;
-		fr->keepa_timer.data = (unsigned long)dev;
-		ch->line_status &= ~(PROTO_UP | PROTO_LOOP);
-		dev->flags &= ~IFF_RUNNING;
-		comx_status(dev, ch->line_status);
-		if(ch->line_status & LINE_UP) {
-			add_timer(&fr->keepa_timer);
-		}
-	}
-}
-
-static void fr_rx(struct net_device *dev, struct sk_buff *skb) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-	struct net_device *sdev = dev;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-	u16 dlci;
-	u8 nlpid;
-
-	if(skb->len <= 4 || skb->data[2] != FRAD_UI) {
-		kfree_skb(skb);
-		return;
-	}
-
-	/* Itt majd ki kell talalni, melyik slave kapja a csomagot */
-	dlci = ((skb->data[0] & 0xfc) << 2) | ((skb->data[1] & 0xf0) >> 4);
-	if ((nlpid = skb->data[3]) == 0) { // Optional padding 
-		nlpid = skb->data[4];
-		skb_pull(skb, 1);
-	}
-	skb_pull(skb, 4);	/* DLCI and header throw away */
-
-	if (ch->debug_flags & DEBUG_COMX_DLCI) {
-		comx_debug(dev, "Frame received, DLCI: %d, NLPID: 0x%02x\n", 
-			dlci, nlpid);
-		comx_debug_skb(dev, skb, "Contents");
-	}
-
-	/* Megkeressuk, kihez tartozik */
-	for (; dir ; dir = dir->next) {
-		if(!S_ISDIR(dir->mode)) {
-			continue;
-		}
-		if ((sdev = dir->data) && (sch = sdev->priv) && 
-		    (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) &&
-		    (sfr->master == dev) && (sfr->dlci == dlci)) {
-			skb->dev = sdev;	
-			if (ch->debug_flags & DEBUG_COMX_DLCI) {
-				comx_debug(dev, "Passing it to %s\n",sdev->name);
-			}
-			if (dev != sdev) {
-				sch->stats.rx_packets++;
-				sch->stats.rx_bytes += skb->len;
-			}
-			break;
-		}
-	}
-	switch(nlpid) {
-		case NLPID_IP:
-			skb->protocol = htons(ETH_P_IP);
-			skb->mac.raw = skb->data;
-			comx_rx(sdev, skb);
-			break;
-		case NLPID_Q933_LMI:
-			fr_rx_lmi(dev, skb, dlci, nlpid);
-		default:
-			kfree_skb(skb);
-			break;
-	}
-}
-
-static int fr_tx(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-	struct net_device *sdev;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-	int cnt = 1;
-
-	/* Ha minden igaz, 2 helyen fog allni a tbusy: a masternel, 
-	   es annal a slave-nel aki eppen kuldott.
-	   Egy helyen akkor all, ha a master kuldott.
-	   Ez megint jo lesz majd, ha utemezni akarunk */
-	   
-	/* This should be fixed, the slave tbusy should be set when 
-	   the masters queue is full and reset when not */
-
-	for (; dir ; dir = dir->next) {
-		if(!S_ISDIR(dir->mode)) {
-		    continue;
-		}
-		if ((sdev = dir->data) && (sch = sdev->priv) && 
-		    (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) &&
-		    (sfr->master == dev) && (netif_queue_stopped(sdev))) {
-		    	netif_wake_queue(sdev);
-			cnt++;
-		}
-	}
-
-	netif_wake_queue(dev);
-	return 0;
-}
-
-static void fr_status(struct net_device *dev, unsigned short status)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-	struct net_device *sdev;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-
-	if (status & LINE_UP) {
-		if (!fr->keepa_freq) {
-			status |= PROTO_UP;
-		}
-	} else {
-		status &= ~(PROTO_UP | PROTO_LOOP);
-	}
-
-	if (dev == fr->master && fr->keepa_freq) {
-		if (status & LINE_UP) {
-			fr->keepa_timer.expires = jiffies + HZ;
-			add_timer(&fr->keepa_timer);
-			fr->keepalivecnt = MAXALIVECNT + 1;
-			fr->keeploopcnt = 0;
-		} else {
-			del_timer(&fr->keepa_timer);
-		}
-	}
-		
-	/* Itt a status valtozast vegig kell vinni az osszes slave-n */
-	for (; dir ; dir = dir->next) {
-		if(!S_ISDIR(dir->mode)) {
-		    continue;
-		}
-	
-		if ((sdev = dir->data) && (sch = sdev->priv) && 
-		    (sdev->type == ARPHRD_FRAD || sdev->type == ARPHRD_DLCI) && 
-		    (sfr = sch->LINE_privdata) && (sfr->master == dev)) {
-			if(status & LINE_UP) {
-				netif_wake_queue(sdev);
-			}
-			comx_status(sdev, status);
-			if(status & (PROTO_UP | PROTO_LOOP)) {
-				dev->flags |= IFF_RUNNING;
-			} else {
-				dev->flags &= ~IFF_RUNNING;
-			}
-		}
-	}
-}
-
-static int fr_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct proc_dir_entry *comxdir = ch->procdir;
-	struct comx_channel *mch;
-
-	if (!(ch->init_status & HW_OPEN)) {
-		return -ENODEV;
-	}
-
-	if ((ch->hardware == &fr_dlci && ch->protocol != &fr_slave_protocol) ||
-	    (ch->protocol == &fr_slave_protocol && ch->hardware != &fr_dlci)) {
-		printk(KERN_ERR "Trying to open an improperly set FR interface, giving up\n");
-		return -EINVAL;
-	}
-
-	if (!fr->master) {
-		return -ENODEV;
-	}
-	mch = fr->master->priv;
-	if (fr->master != dev && (!(mch->init_status & LINE_OPEN) 
-	   || (mch->protocol != &fr_master_protocol))) {
-		printk(KERN_ERR "Master %s is inactive, or incorrectly set up, "
-			"unable to open %s\n", fr->master->name, dev->name);
-		return -ENODEV;
-	}
-
-	ch->init_status |= LINE_OPEN;
-	ch->line_status &= ~(PROTO_UP | PROTO_LOOP);
-	dev->flags &= ~IFF_RUNNING;
-
-	if (fr->master == dev) {
-		if (fr->keepa_freq) {
-			fr->keepa_timer.function = fr_keepalive_timerfun;
-			fr->keepa_timer.data = (unsigned long)dev;
-			add_timer(&fr->keepa_timer);
-		} else {
-			if (ch->line_status & LINE_UP) {
-				ch->line_status |= PROTO_UP;
-				dev->flags |= IFF_RUNNING;
-			}
-		}
-	} else {
-		ch->line_status = mch->line_status;
-		if(fr->master->flags & IFF_RUNNING) {
-			dev->flags |= IFF_RUNNING;
-		}
-	}
-
-	for (; comxdir ; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_DLCI) == 0 ||
-		   strcmp(comxdir->name, FILENAME_MASTER) == 0 ||
-		   strcmp(comxdir->name, FILENAME_KEEPALIVE) == 0) {
-			comxdir->mode = S_IFREG | 0444;
-		}
-	}
-//	comx_status(dev, ch->line_status);
-	return 0;
-}
-
-static int fr_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct proc_dir_entry *comxdir = ch->procdir;
-
-	if (fr->master == dev) { // Ha master 
-		struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-		struct net_device *sdev = dev;
-		struct comx_channel *sch;
-		struct fr_data *sfr;
-
-		if (!(ch->init_status & HW_OPEN)) {
-			return -ENODEV;
-		}
-
-		if (fr->keepa_freq) {
-			del_timer(&fr->keepa_timer);
-		}
-		
-		for (; dir ; dir = dir->next) {
-			if(!S_ISDIR(dir->mode)) {
-				continue;
-			}
-			if ((sdev = dir->data) && (sch = sdev->priv) && 
-			    (sdev->type == ARPHRD_DLCI) && 
-			    (sfr = sch->LINE_privdata) &&
-			    (sfr->master == dev) && 
-			    (sch->init_status & LINE_OPEN)) {
-				dev_close(sdev);
-			}
-		}
-	}
-
-	ch->init_status &= ~LINE_OPEN;
-	ch->line_status &= ~(PROTO_UP | PROTO_LOOP);
-	dev->flags &= ~IFF_RUNNING;
-
-	for (; comxdir ; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_DLCI) == 0 ||
-		    strcmp(comxdir->name, FILENAME_MASTER) == 0 ||
-		    strcmp(comxdir->name, FILENAME_KEEPALIVE) == 0) {
-			comxdir->mode = S_IFREG | 0444;
-		}
-	}
-
-	return 0;
-}
-
-static int fr_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct comx_channel *sch, *mch;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct fr_data *sfr;
-	struct net_device *sdev;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-
-	if (!fr->master) {
-		printk(KERN_ERR "BUG: fr_xmit without a master!!! dev: %s\n", dev->name);
-		return 0;
-	}
-
-	mch = fr->master->priv;
-
-	/* Ennek majd a slave utemezeskor lesz igazan jelentosege */
-	if (ch->debug_flags & DEBUG_COMX_DLCI) {
-		comx_debug_skb(dev, skb, "Sending frame");
-	}
-
-	if (dev != fr->master) {
-		struct sk_buff *newskb=skb_clone(skb, GFP_ATOMIC);
-		if (!newskb)
-			return -ENOMEM;
-		newskb->dev=fr->master;
-		dev_queue_xmit(newskb);
-		ch->stats.tx_bytes += skb->len;
-		ch->stats.tx_packets++;
-		dev_kfree_skb(skb);
-	} else {
-		netif_stop_queue(dev);
-		for (; dir ; dir = dir->next) {
-			if(!S_ISDIR(dir->mode)) {
-			    continue;
-			}
-			if ((sdev = dir->data) && (sch = sdev->priv) && 
-			    (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) &&
-			    (sfr->master == dev) && (netif_queue_stopped(sdev))) {
-				netif_stop_queue(sdev);
-			}
-		}
-		 	
-		switch(mch->HW_send_packet(dev, skb)) {
-			case FRAME_QUEUED:
-				netif_wake_queue(dev);
-				break;
-			case FRAME_ACCEPTED:
-			case FRAME_DROPPED:
-				break;
-			case FRAME_ERROR:
-				printk(KERN_ERR "%s: Transmit frame error (len %d)\n", 
-					dev->name, skb->len);
-				break;
-		}
-	}
-	return 0;
-}
-
-static int fr_header(struct sk_buff *skb, struct net_device *dev, 
-	unsigned short type, void *daddr, void *saddr, unsigned len) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-
-	skb_push(skb, dev->hard_header_len);	  
-	/* Put in DLCI */
-	skb->data[0] = (fr->dlci & (1024 - 15)) >> 2;
-	skb->data[1] = (fr->dlci & 15) << 4 | 1;	// EA bit 1
-	skb->data[2] = FRAD_UI;
-	skb->data[3] = NLPID_IP;
-
-	return dev->hard_header_len;  
-}
-
-static int fr_statistics(struct net_device *dev, char *page) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	int len = 0;
-
-	if (fr->master == dev) {
-		struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-		struct net_device *sdev;
-		struct comx_channel *sch;
-		struct fr_data *sfr;
-		int slaves = 0;
-
-		len += sprintf(page + len, 
-			"This is a Frame Relay master device\nSlaves: ");
-		for (; dir ; dir = dir->next) {
-			if(!S_ISDIR(dir->mode)) {
-				continue;
-			}
-			if ((sdev = dir->data) && (sch = sdev->priv) && 
-			    (sdev->type == ARPHRD_DLCI) &&
-			    (sfr = sch->LINE_privdata) && 
-			    (sfr->master == dev) && (sdev != dev)) {
-				slaves++;
-				len += sprintf(page + len, "%s ", sdev->name);
-			}
-		}
-		len += sprintf(page + len, "%s\n", slaves ? "" : "(none)");
-		if (fr->keepa_freq) {
-			len += sprintf(page + len, "Line keepalive (value %d) "
-				"status %s [%d]\n", fr->keepa_freq, 
-				ch->line_status & PROTO_LOOP ? "LOOP" :
-				ch->line_status & PROTO_UP ? "UP" : "DOWN", 
-				fr->keepalivecnt);
-		} else {
-			len += sprintf(page + len, "Line keepalive protocol "
-				"is not set\n");
-		}
-	} else {		// if slave
-		len += sprintf(page + len, 
-			"This is a Frame Relay slave device, master: %s\n",
-			fr->master ? fr->master->name : "(not set)");
-	}
-	return len;
-}
-
-static int fr_read_proc(char *page, char **start, off_t off, int count,
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = NULL;
-	int len = 0;
-
-	if (ch) {
-		fr = ch->LINE_privdata;
-	}
-
-	if (strcmp(file->name, FILENAME_DLCI) == 0) {
-		len = sprintf(page, "%04d\n", fr->dlci);
-	} else if (strcmp(file->name, FILENAME_MASTER) == 0) {
-		len = sprintf(page, "%-9s\n", fr->master ? fr->master->name :
-			"(none)");
-	} else if (strcmp(file->name, FILENAME_KEEPALIVE) == 0) {
-		len = fr->keepa_freq ? sprintf(page, "% 3d\n", fr->keepa_freq) 
-			: sprintf(page, "off\n");
-	} else {
-		printk(KERN_ERR "comxfr: internal error, filename %s\n", file->name);
-		return -EBADF;
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) *eof = 1;
-	return min_t(int, count, len - off);
-}
-
-static int fr_write_proc(struct file *file, const char *buffer, 
-	u_long count, void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = entry->parent->data;
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = NULL; 
-	char *page;
-
-	if (ch) {
-		fr = ch->LINE_privdata;
-	}
-
-	if (!(page = (char *)__get_free_page(GFP_KERNEL))) {
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(page, buffer, count)) {
-		free_page((unsigned long)page);
-		return -EFAULT;
-	}
-	if (*(page + count - 1) == '\n') {
-		*(page + count - 1) = 0;
-	}
-
-	if (strcmp(entry->name, FILENAME_DLCI) == 0) {
-		u16 dlci_new = simple_strtoul(page, NULL, 10);
-
-		if (dlci_new > 1023) {
-			printk(KERN_ERR "Invalid DLCI value\n");
-		}
-		else fr->dlci = dlci_new;
-	} else if (strcmp(entry->name, FILENAME_MASTER) == 0) {
-		struct net_device *new_master = dev_get_by_name(page);
-
-		if (new_master && new_master->type == ARPHRD_FRAD) {
-			struct comx_channel *sch = new_master->priv;
-			struct fr_data *sfr = sch->LINE_privdata;
-
-			if (sfr && sfr->master == new_master) {
-				if(fr->master)
-					dev_put(fr->master);
-				fr->master = new_master;
-				/* Megorokli a master statuszat */
-				ch->line_status = sch->line_status;
-			}
-		}
-	} else if (strcmp(entry->name, FILENAME_KEEPALIVE) == 0) {
-		int keepa_new = -1;
-
-		if (strcmp(page, KEEPALIVE_OFF) == 0) {
-			keepa_new = 0;
-		} else {
-			keepa_new = simple_strtoul(page, NULL, 10);
-		}
-
-		if (keepa_new < 0 || keepa_new > 100) {
-			printk(KERN_ERR "invalid keepalive\n");
-		} else {
-			if (fr->keepa_freq && keepa_new != fr->keepa_freq) {
-				fr_set_keepalive(dev, 0);
-			}
-			if (keepa_new) {
-				fr_set_keepalive(dev, keepa_new);
-			}
-		}
-	} else {
-		printk(KERN_ERR "comxfr_write_proc: internal error, filename %s\n", 
-			entry->name);
-		count = -EBADF;
-	}
-
-	free_page((unsigned long)page);
-	return count;
-}
-
-static int fr_exit(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-	struct net_device *sdev = dev;
-	struct comx_channel *sch;
-	struct fr_data *sfr;
-	struct proc_dir_entry *dir = ch->procdir->parent->subdir;
-
-	/* Ha lezarunk egy master-t, le kell kattintani a slave-eket is */
-	if (fr->master && fr->master == dev) {
-		for (; dir ; dir = dir->next) {
-			if(!S_ISDIR(dir->mode)) {
-				continue;
-			}
-			if ((sdev = dir->data) && (sch = sdev->priv) && 
-			    (sdev->type == ARPHRD_DLCI) && 
-			    (sfr = sch->LINE_privdata) && (sfr->master == dev)) {
-				dev_close(sdev);
-				sfr->master = NULL;
-			}
-		}
-	}
-	dev->flags		= 0;
-	dev->type		= 0;
-	dev->mtu		= 0;
-	dev->hard_header_len    = 0;
-
-	ch->LINE_rx	= NULL;
-	ch->LINE_tx	= NULL;
-	ch->LINE_status = NULL;
-	ch->LINE_open	= NULL;
-	ch->LINE_close	= NULL;
-	ch->LINE_xmit	= NULL;
-	ch->LINE_header	= NULL;
-	ch->LINE_rebuild_header	= NULL;
-	ch->LINE_statistics = NULL;
-
-	ch->LINE_status = 0;
-
-	if (fr->master != dev) { // if not master, remove dlci
-		if(fr->master)
-			dev_put(fr->master);
-		remove_proc_entry(FILENAME_DLCI, ch->procdir);
-		remove_proc_entry(FILENAME_MASTER, ch->procdir);
-	} else {
-		if (fr->keepa_freq) {
-			fr_set_keepalive(dev, 0);
-		}
-		remove_proc_entry(FILENAME_KEEPALIVE, ch->procdir);
-		remove_proc_entry(FILENAME_DLCI, ch->procdir);
-	}
-
-	kfree(fr);
-	ch->LINE_privdata = NULL;
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int fr_master_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr;
-	struct proc_dir_entry *new_file;
-
-	if ((fr = ch->LINE_privdata = kmalloc(sizeof(struct fr_data), 
-	    GFP_KERNEL)) == NULL) {
-		return -ENOMEM;
-	}
-	memset(fr, 0, sizeof(struct fr_data));
-	fr->master = dev;	// this means master
-	fr->dlci = 0;		// let's say default
-
-	dev->flags	= IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
-	dev->type	= ARPHRD_FRAD;
-	dev->mtu	= 1500;
-	dev->hard_header_len    = 4;		
-	dev->addr_len	= 0;
-
-	ch->LINE_rx	= fr_rx;
-	ch->LINE_tx	= fr_tx;
-	ch->LINE_status = fr_status;
-	ch->LINE_open	= fr_open;
-	ch->LINE_close	= fr_close;
-	ch->LINE_xmit	= fr_xmit;
-	ch->LINE_header	= fr_header;
-	ch->LINE_rebuild_header	= NULL;
-	ch->LINE_statistics = fr_statistics;
-
-	if ((new_file = create_proc_entry(FILENAME_DLCI, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_LINE_privdata;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &fr_read_proc;
-	new_file->write_proc = &fr_write_proc;
-	new_file->size = 5;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_KEEPALIVE, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_filename_dlci;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &fr_read_proc;
-	new_file->write_proc = &fr_write_proc;
-	new_file->size = 4;
-	new_file->nlink = 1;
-
-	fr_set_keepalive(dev, 0);
-
-	MOD_INC_USE_COUNT;
-	return 0;
-cleanup_filename_dlci:
-	 remove_proc_entry(FILENAME_DLCI, ch->procdir);
-cleanup_LINE_privdata:
-	kfree(fr);
-	return -EIO;
-}
-
-static int fr_slave_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr;
-	struct proc_dir_entry *new_file;
-
-	if ((fr = ch->LINE_privdata = kmalloc(sizeof(struct fr_data), 
-	    GFP_KERNEL)) == NULL) {
-		return -ENOMEM;
-	}
-	memset(fr, 0, sizeof(struct fr_data));
-
-	dev->flags	= IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
-	dev->type	= ARPHRD_DLCI;
-	dev->mtu	= 1500;
-	dev->hard_header_len    = 4;		
-	dev->addr_len	= 0;
-
-	ch->LINE_rx	= fr_rx;
-	ch->LINE_tx	= fr_tx;
-	ch->LINE_status = fr_status;
-	ch->LINE_open	= fr_open;
-	ch->LINE_close	= fr_close;
-	ch->LINE_xmit	= fr_xmit;
-	ch->LINE_header	= fr_header;
-	ch->LINE_rebuild_header	= NULL;
-	ch->LINE_statistics = fr_statistics;
-
-	if ((new_file = create_proc_entry(FILENAME_DLCI, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_LINE_privdata;
-	}
-	
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &fr_read_proc;
-	new_file->write_proc = &fr_write_proc;
-	new_file->size = 5;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_MASTER, S_IFREG | 0644, 
-	    ch->procdir)) == NULL) {
-		goto cleanup_filename_dlci;
-	}
-	new_file->data = (void *)new_file;
-	new_file->read_proc = &fr_read_proc;
-	new_file->write_proc = &fr_write_proc;
-	new_file->size = 10;
-	new_file->nlink = 1;
-	MOD_INC_USE_COUNT;
-	return 0;
-cleanup_filename_dlci:
-         remove_proc_entry(FILENAME_DLCI, ch->procdir);
-cleanup_LINE_privdata:
-	kfree(fr);
-	return -EIO;
-}
-
-static int dlci_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	ch->init_status |= HW_OPEN;
-
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int dlci_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	ch->init_status &= ~HW_OPEN;
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int dlci_txe(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct fr_data *fr = ch->LINE_privdata;
-
-	if (!fr->master) {
-		return 0;
-	}
-
-	ch = fr->master->priv;
-	fr = ch->LINE_privdata;
-	return ch->HW_txe(fr->master);
-}
-
-static int dlci_statistics(struct net_device *dev, char *page) 
-{
-	return 0;
-}
-
-static int dlci_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	ch->HW_open = dlci_open;
-	ch->HW_close = dlci_close;
-	ch->HW_txe = dlci_txe;
-	ch->HW_statistics = dlci_statistics;
-
-	/* Nincs egyeb hw info, mert ugyis a fr->master-bol fog minden kiderulni */
-
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int dlci_exit(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	ch->HW_open = NULL;
-	ch->HW_close = NULL;
-	ch->HW_txe = NULL;
-	ch->HW_statistics = NULL;
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int dlci_dump(struct net_device *dev)
-{
-	printk(KERN_INFO "dlci_dump %s, HOGY MI ???\n", dev->name);
-	return -1;
-}
-
-static struct comx_protocol fr_master_protocol = {
-	.name		= "frad", 
-	.version	= VERSION,
-	.encap_type	= ARPHRD_FRAD, 
-	.line_init	= fr_master_init, 
-	.line_exit	= fr_exit, 
-};
-
-static struct comx_protocol fr_slave_protocol = {
-	.name		= "ietf-ip", 
-	.version	= VERSION,
-	.encap_type	= ARPHRD_DLCI, 
-	.line_init	= fr_slave_init, 
-	.line_exit	= fr_exit, 
-};
-
-static struct comx_hardware fr_dlci = { 
-	.name		= "dlci", 
-	.version	= VERSION,
-	.hw_init	= dlci_init, 
-	.hw_exit	= dlci_exit, 
-	.hw_dump	= dlci_dump, 
-};
-
-static int __init comx_proto_fr_init(void)
-{
-	int ret; 
-
-	if ((ret = comx_register_hardware(&fr_dlci))) {
-		return ret;
-	}
-	if ((ret = comx_register_protocol(&fr_master_protocol))) {
-		return ret;
-	}
-	return comx_register_protocol(&fr_slave_protocol);
-}
-
-static void __exit comx_proto_fr_exit(void)
-{
-	comx_unregister_hardware(fr_dlci.name);
-	comx_unregister_protocol(fr_master_protocol.name);
-	comx_unregister_protocol(fr_slave_protocol.name);
-}
-
-module_init(comx_proto_fr_init);
-module_exit(comx_proto_fr_exit);
diff -Nru a/drivers/net/wan/comx-proto-lapb.c b/drivers/net/wan/comx-proto-lapb.c
--- a/drivers/net/wan/comx-proto-lapb.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,551 +0,0 @@
-/*
- * LAPB protocol module for the COMX driver 
- * for Linux kernel 2.2.X
- *
- * Original author: Tivadar Szemethy <tiv@itc.hu>
- * Maintainer: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1997-1999 (C) ITConsult-Pro Co. <info@itc.hu>
- *
- * 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.
- *
- * Version 0.80 (99/06/14):
- *		- cleaned up the source code a bit
- *		- ported back to kernel, now works as non-module
- *
- * Changed      (00/10/29, Henner Eisen):
- * 		- comx_rx() / comxlapb_data_indication() return status.
- * 
- */
-
-#define VERSION "0.80"
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/if_arp.h>
-#include <linux/inetdevice.h>
-#include <asm/uaccess.h>
-#include <linux/lapb.h>
-#include <linux/init.h>
-
-#include	"comx.h"
-#include	"comxhw.h"
-
-static struct proc_dir_entry *create_comxlapb_proc_entry(char *name, int mode,
-	int size, struct proc_dir_entry *dir);
-
-static void comxlapb_rx(struct net_device *dev, struct sk_buff *skb) 
-{
-	if (!dev || !dev->priv) {
-		dev_kfree_skb(skb);
-	} else {
-		lapb_data_received(dev, skb);
-	}
-}
-
-static int comxlapb_tx(struct net_device *dev) 
-{
-	netif_wake_queue(dev);
-	return 0;
-}
-
-static int comxlapb_header(struct sk_buff *skb, struct net_device *dev, 
-	unsigned short type, void *daddr, void *saddr, unsigned len) 
-{
-	return dev->hard_header_len;  
-}
-
-static void comxlapb_status(struct net_device *dev, unsigned short status)
-{
-	struct comx_channel *ch;
-
-	if (!dev || !(ch = dev->priv)) {
-		return;
-	}
-	if (status & LINE_UP) {
-		netif_wake_queue(dev);
-	}
-	comx_status(dev, status);
-}
-
-static int comxlapb_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	int err = 0;
-
-	if (!(ch->init_status & HW_OPEN)) {
-		return -ENODEV;
-	}
-
-	err = lapb_connect_request(dev);
-
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(dev, "%s: lapb opened, error code: %d\n", 
-			dev->name, err);
-	}
-
-	if (!err) {
-		ch->init_status |= LINE_OPEN;
-		MOD_INC_USE_COUNT;
-	}
-	return err;
-}
-
-static int comxlapb_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	if (!(ch->init_status & HW_OPEN)) {
-		return -ENODEV;
-	}
-
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(dev, "%s: lapb closed\n", dev->name);
-	}
-
-	lapb_disconnect_request(dev);
-
-	ch->init_status &= ~LINE_OPEN;
-	ch->line_status &= ~PROTO_UP;
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int comxlapb_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct sk_buff *skb2;
-
-	if (!dev || !(ch = dev->priv) || !(dev->flags & (IFF_UP | IFF_RUNNING))) {
-		return -ENODEV;
-	}
-
-	if (dev->type == ARPHRD_X25) { // first byte tells what to do 
-		switch(skb->data[0]) {
-			case 0x00:	
-				break;	// transmit
-			case 0x01:	
-				lapb_connect_request(dev);
-				kfree_skb(skb);
-				return 0;
-			case 0x02:	
-				lapb_disconnect_request(dev);
-			default:
-				kfree_skb(skb);
-				return 0;
-		}
-		skb_pull(skb,1);
-	}
-
-	netif_stop_queue(dev);
-	
-	if ((skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) {
-		lapb_data_request(dev, skb2);
-	}
-
-	return FRAME_ACCEPTED;
-}
-
-static int comxlapb_statistics(struct net_device *dev, char *page) 
-{
-	struct lapb_parms_struct parms;
-	int len = 0;
-
-	len += sprintf(page + len, "Line status: ");
-	if (lapb_getparms(dev, &parms) != LAPB_OK) {
-		len += sprintf(page + len, "not initialized\n");
-		return len;
-	}
-	len += sprintf(page + len, "%s (%s), T1: %d/%d, T2: %d/%d, N2: %d/%d, "
-		"window: %d\n", parms.mode & LAPB_DCE ? "DCE" : "DTE", 
-		parms.mode & LAPB_EXTENDED ? "EXTENDED" : "STANDARD",
-		parms.t1timer, parms.t1, parms.t2timer, parms.t2, 
-		parms.n2count, parms.n2, parms.window);
-
-	return len;
-}
-
-static int comxlapb_read_proc(char *page, char **start, off_t off, int count,
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	struct lapb_parms_struct parms;
-	int len = 0;
-
-	if (lapb_getparms(dev, &parms)) {
-		return -ENODEV;
-	}
-
-	if (strcmp(file->name, FILENAME_T1) == 0) {
-		len += sprintf(page + len, "%02u / %02u\n", 
-			parms.t1timer, parms.t1);
-	} else if (strcmp(file->name, FILENAME_T2) == 0) {
-		len += sprintf(page + len, "%02u / %02u\n", 
-			parms.t2timer, parms.t2);
-	} else if (strcmp(file->name, FILENAME_N2) == 0) {
-		len += sprintf(page + len, "%02u / %02u\n", 
-			parms.n2count, parms.n2);
-	} else if (strcmp(file->name, FILENAME_WINDOW) == 0) {
-		len += sprintf(page + len, "%u\n", parms.window);
-	} else if (strcmp(file->name, FILENAME_MODE) == 0) {
-		len += sprintf(page + len, "%s, %s\n", 
-			parms.mode & LAPB_DCE ? "DCE" : "DTE",
-			parms.mode & LAPB_EXTENDED ? "EXTENDED" : "STANDARD");
-	} else {
-		printk(KERN_ERR "comxlapb: internal error, filename %s\n", file->name);
-		return -EBADF;
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) {
-		*eof = 1;
-	}
-	return min_t(int, count, len - off);
-}
-
-static int comxlapb_write_proc(struct file *file, const char *buffer, 
-	u_long count, void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = entry->parent->data;
-	struct lapb_parms_struct parms;
-	unsigned long parm;
-	char *page;
-
-	if (lapb_getparms(dev, &parms)) {
-		return -ENODEV;
-	}
-
-	if (!(page = (char *)__get_free_page(GFP_KERNEL))) {
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(page, buffer, count)) {
-		free_page((unsigned long)page);
-		return -EFAULT;
-	}
-	if (*(page + count - 1) == '\n') {
-		*(page + count - 1) = 0;
-	}
-
-	if (strcmp(entry->name, FILENAME_T1) == 0) {
-		parm=simple_strtoul(page,NULL,10);
-		if (parm > 0 && parm < 100) {
-			parms.t1=parm;
-			lapb_setparms(dev, &parms);
-		}
-	} else if (strcmp(entry->name, FILENAME_T2) == 0) {
-		parm=simple_strtoul(page, NULL, 10);
-		if (parm > 0 && parm < 100) {
-			parms.t2=parm;
-			lapb_setparms(dev, &parms);
-		}
-	} else if (strcmp(entry->name, FILENAME_N2) == 0) {
-		parm=simple_strtoul(page, NULL, 10);
-		if (parm > 0 && parm < 100) {
-			parms.n2=parm;
-			lapb_setparms(dev, &parms);
-		}
-	} else if (strcmp(entry->name, FILENAME_WINDOW) == 0) {
-		parms.window = simple_strtoul(page, NULL, 10);
-		lapb_setparms(dev, &parms);
-	} else if (strcmp(entry->name, FILENAME_MODE) == 0) {
-		if (comx_strcasecmp(page, "dte") == 0) {
-			parms.mode &= ~(LAPB_DCE | LAPB_DTE); 
-			parms.mode |= LAPB_DTE;
-		} else if (comx_strcasecmp(page, "dce") == 0) {
-			parms.mode &= ~(LAPB_DTE | LAPB_DCE); 
-			parms.mode |= LAPB_DCE;
-		} else if (comx_strcasecmp(page, "std") == 0 || 
-		    comx_strcasecmp(page, "standard") == 0) {
-			parms.mode &= ~LAPB_EXTENDED; 
-			parms.mode |= LAPB_STANDARD;
-		} else if (comx_strcasecmp(page, "ext") == 0 || 
-		    comx_strcasecmp(page, "extended") == 0) {
-			parms.mode &= ~LAPB_STANDARD; 
-			parms.mode |= LAPB_EXTENDED;
-		}
-		lapb_setparms(dev, &parms);
-	} else {
-		printk(KERN_ERR "comxlapb_write_proc: internal error, filename %s\n", 
-			entry->name);
-		return -EBADF;
-	}
-
-	free_page((unsigned long)page);
-	return count;
-}
-
-static void comxlapb_connected(struct net_device *dev, int reason)
-{
-	struct comx_channel *ch = dev->priv; 
-	struct proc_dir_entry *comxdir = ch->procdir->subdir;
-
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(ch->dev, "%s: lapb connected, reason: %d\n", 
-			ch->dev->name, reason);
-	}
-
-	if (ch->dev->type == ARPHRD_X25) {
-		unsigned char *p;
-		struct sk_buff *skb;
-
-		if ((skb = dev_alloc_skb(1)) == NULL) {
-			printk(KERN_ERR "comxlapb: out of memory!\n");
-			return;
-		}
-		p = skb_put(skb,1);
-		*p = 0x01;		// link established
-		skb->dev = ch->dev;
-		skb->protocol = htons(ETH_P_X25);
-		skb->mac.raw = skb->data;
-		skb->pkt_type = PACKET_HOST;
-
-		netif_rx(skb);
-		ch->dev->last_rx = jiffies;
-	}
-
-	for (; comxdir; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_MODE) == 0) {
-			comxdir->mode = S_IFREG | 0444;
-		}
-	}
-
-
-	ch->line_status |= PROTO_UP;
-	comx_status(ch->dev, ch->line_status);
-}
-
-static void comxlapb_disconnected(struct net_device *dev, int reason)
-{
-	struct comx_channel *ch = dev->priv; 
-	struct proc_dir_entry *comxdir = ch->procdir->subdir;
-
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(ch->dev, "%s: lapb disconnected, reason: %d\n", 
-			ch->dev->name, reason);
-	}
-
-	if (ch->dev->type == ARPHRD_X25) {
-		unsigned char *p;
-		struct sk_buff *skb;
-
-		if ((skb = dev_alloc_skb(1)) == NULL) {
-			printk(KERN_ERR "comxlapb: out of memory!\n");
-			return;
-		}
-		p = skb_put(skb,1);
-		*p = 0x02;		// link disconnected
-		skb->dev = ch->dev;
-		skb->protocol = htons(ETH_P_X25);
-		skb->mac.raw = skb->data;
-		skb->pkt_type = PACKET_HOST;
-
-		netif_rx(skb);
-		ch->dev->last_rx = jiffies;
-	}
-
-	for (; comxdir; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_MODE) == 0) {
-			comxdir->mode = S_IFREG | 0644;
-		}
-	}
-	
-	ch->line_status &= ~PROTO_UP;
-	comx_status(ch->dev, ch->line_status);
-}
-
-static int comxlapb_data_indication(struct net_device *dev, struct sk_buff *skb)
-{
-	struct comx_channel *ch = dev->priv; 
-
-	if (ch->dev->type == ARPHRD_X25) {
-		skb_push(skb, 1);
-
-		if (skb_cow(skb, 1))
-			return NET_RX_DROP;
-
-		skb->data[0] = 0;	// indicate data for X25
-		skb->protocol = htons(ETH_P_X25);
-	} else {
-		skb->protocol = htons(ETH_P_IP);
-	}
-
-	skb->dev = ch->dev;
-	skb->mac.raw = skb->data;
-	return comx_rx(ch->dev, skb);
-}
-
-static void comxlapb_data_transmit(struct net_device *dev, struct sk_buff *skb)
-{
-	struct comx_channel *ch = dev->priv; 
-
-	if (ch->HW_send_packet) {
-		ch->HW_send_packet(ch->dev, skb);
-	}
-}
-
-static int comxlapb_exit(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-
-	dev->flags		= 0;
-	dev->type		= 0;
-	dev->mtu		= 0;
-	dev->hard_header_len    = 0;
-
-	ch->LINE_rx	= NULL;
-	ch->LINE_tx	= NULL;
-	ch->LINE_status = NULL;
-	ch->LINE_open	= NULL;
-	ch->LINE_close	= NULL;
-	ch->LINE_xmit	= NULL;
-	ch->LINE_header	= NULL;
-	ch->LINE_statistics = NULL;
-
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(dev, "%s: unregistering lapb\n", dev->name);
-	}
-	lapb_unregister(dev);
-
-	remove_proc_entry(FILENAME_T1, ch->procdir);
-	remove_proc_entry(FILENAME_T2, ch->procdir);
-	remove_proc_entry(FILENAME_N2, ch->procdir);
-	remove_proc_entry(FILENAME_MODE, ch->procdir);
-	remove_proc_entry(FILENAME_WINDOW, ch->procdir);
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int comxlapb_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct lapb_register_struct lapbreg;
-
-	dev->mtu		= 1500;
-	dev->hard_header_len    = 4;
-	dev->addr_len		= 0;
-
-	ch->LINE_rx	= comxlapb_rx;
-	ch->LINE_tx	= comxlapb_tx;
-	ch->LINE_status = comxlapb_status;
-	ch->LINE_open	= comxlapb_open;
-	ch->LINE_close	= comxlapb_close;
-	ch->LINE_xmit	= comxlapb_xmit;
-	ch->LINE_header	= comxlapb_header;
-	ch->LINE_statistics = comxlapb_statistics;
-
-	lapbreg.connect_confirmation = comxlapb_connected;
-	lapbreg.connect_indication = comxlapb_connected;
-	lapbreg.disconnect_confirmation = comxlapb_disconnected;
-	lapbreg.disconnect_indication = comxlapb_disconnected;
-	lapbreg.data_indication = comxlapb_data_indication;
-	lapbreg.data_transmit = comxlapb_data_transmit;
-	if (lapb_register(dev, &lapbreg)) {
-		return -ENOMEM;
-	}
-	if (ch->debug_flags & DEBUG_COMX_LAPB) {
-		comx_debug(dev, "%s: lapb registered\n", dev->name);
-	}
-
-	if (!create_comxlapb_proc_entry(FILENAME_T1, 0644, 8, ch->procdir)) {
-		return -ENOMEM;
-	}
-	if (!create_comxlapb_proc_entry(FILENAME_T2, 0644, 8, ch->procdir)) {
-		return -ENOMEM;
-	}
-	if (!create_comxlapb_proc_entry(FILENAME_N2, 0644, 8, ch->procdir)) {
-		return -ENOMEM;
-	}
-	if (!create_comxlapb_proc_entry(FILENAME_MODE, 0644, 14, ch->procdir)) {
-		return -ENOMEM;
-	}
-	if (!create_comxlapb_proc_entry(FILENAME_WINDOW, 0644, 0, ch->procdir)) {
-		return -ENOMEM;
-	}
-
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int comxlapb_init_lapb(struct net_device *dev) 
-{
-	dev->flags	= IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
-	dev->type	= ARPHRD_LAPB;
-
-	return(comxlapb_init(dev));
-}
-
-static int comxlapb_init_x25(struct net_device *dev)
-{
-	dev->flags		= IFF_NOARP;
-	dev->type		= ARPHRD_X25;
-
-	return(comxlapb_init(dev));
-}
-
-static struct proc_dir_entry *create_comxlapb_proc_entry(char *name, int mode,
-	int size, struct proc_dir_entry *dir)
-{
-	struct proc_dir_entry *new_file;
-
-	if ((new_file = create_proc_entry(name, S_IFREG | mode, dir)) != NULL) {
-		new_file->data = (void *)new_file;
-		new_file->read_proc = &comxlapb_read_proc;
-		new_file->write_proc = &comxlapb_write_proc;
-		new_file->size = size;
-		new_file->nlink = 1;
-	}
-	return(new_file);
-}
-
-static struct comx_protocol comxlapb_protocol = {
-	"lapb", 
-	VERSION,
-	ARPHRD_LAPB, 
-	comxlapb_init_lapb, 
-	comxlapb_exit, 
-	NULL 
-};
-
-static struct comx_protocol comx25_protocol = {
-	"x25", 
-	VERSION,
-	ARPHRD_X25, 
-	comxlapb_init_x25, 
-	comxlapb_exit, 
-	NULL 
-};
-
-static int __init comx_proto_lapb_init(void)
-{
-	int ret;
-
-	if ((ret = comx_register_protocol(&comxlapb_protocol)) != 0) {
-		return ret;
-	}
-	return comx_register_protocol(&comx25_protocol);
-}
-
-static void __exit comx_proto_lapb_exit(void)
-{
-	comx_unregister_protocol(comxlapb_protocol.name);
-	comx_unregister_protocol(comx25_protocol.name);
-}
-
-module_init(comx_proto_lapb_init);
-module_exit(comx_proto_lapb_exit);
-
-MODULE_LICENSE("GPL");
diff -Nru a/drivers/net/wan/comx-proto-ppp.c b/drivers/net/wan/comx-proto-ppp.c
--- a/drivers/net/wan/comx-proto-ppp.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,269 +0,0 @@
-/*
- * Synchronous PPP / Cisco-HDLC driver for the COMX boards
- *
- * Author: Gergely Madarasz <gorgo@itc.hu>
- *
- * based on skeleton code by Tivadar Szemethy <tiv@itc.hu>
- *
- * Copyright (C) 1999 ITConsult-Pro Co. <info@itc.hu>
- *
- * 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.
- *
- *
- * Version 0.10 (99/06/10):
- *		- written the first code :)
- *
- * Version 0.20 (99/06/16):
- *		- added hdlc protocol 
- *		- protocol up is IFF_RUNNING
- *
- * Version 0.21 (99/07/15):
- *		- some small fixes with the line status
- *
- * Version 0.22 (99/08/05):
- *		- don't test IFF_RUNNING but the pp_link_state of the sppp
- * 
- * Version 0.23 (99/12/02):
- *		- tbusy fixes
- *
- */
-
-#define VERSION "0.23"
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/jiffies.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/if_arp.h>
-#include <linux/inetdevice.h>
-#include <asm/uaccess.h>
-#include <linux/init.h>
-
-#include <net/syncppp.h>
-#include	"comx.h"
-
-MODULE_AUTHOR("Author: Gergely Madarasz <gorgo@itc.hu>");
-MODULE_DESCRIPTION("Cisco-HDLC / Synchronous PPP driver for the COMX sync serial boards");
-MODULE_LICENSE("GPL");
-
-static struct comx_protocol syncppp_protocol;
-static struct comx_protocol hdlc_protocol;
-
-struct syncppp_data {
-	struct timer_list status_timer;
-};
-
-static void syncppp_status_timerfun(unsigned long d) {
-	struct net_device *dev=(struct net_device *)d;
-	struct comx_channel *ch=dev->priv;
-	struct syncppp_data *spch=ch->LINE_privdata;
-	struct sppp *sp = (struct sppp *)sppp_of(dev);
-        
-	if(!(ch->line_status & PROTO_UP) && 
-	    (sp->pp_link_state==SPPP_LINK_UP)) {
-    		comx_status(dev, ch->line_status | PROTO_UP);
-	}
-	if((ch->line_status & PROTO_UP) &&
-	    (sp->pp_link_state==SPPP_LINK_DOWN)) {
-	    	comx_status(dev, ch->line_status & ~PROTO_UP);
-	}
-	mod_timer(&spch->status_timer,jiffies + HZ*3);
-}
-
-static int syncppp_tx(struct net_device *dev) 
-{
-	struct comx_channel *ch=dev->priv;
-	
-	if(ch->line_status & LINE_UP) {
-		netif_wake_queue(dev);
-	}
-	return 0;
-}
-
-static void syncppp_status(struct net_device *dev, unsigned short status)
-{
-	status &= ~(PROTO_UP | PROTO_LOOP);
-	if(status & LINE_UP) {
-		netif_wake_queue(dev);
-		sppp_open(dev);
-	} else 	{
-		/* Line went down */
-		netif_stop_queue(dev);
-		sppp_close(dev);
-	}
-	comx_status(dev, status);
-}
-
-static int syncppp_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct syncppp_data *spch = ch->LINE_privdata;
-
-	if (!(ch->init_status & HW_OPEN)) return -ENODEV;
-
-	ch->init_status |= LINE_OPEN;
-	ch->line_status &= ~(PROTO_UP | PROTO_LOOP);
-
-	if(ch->line_status & LINE_UP) {
-		sppp_open(dev);
-	}
-
-	init_timer(&spch->status_timer);
-	spch->status_timer.function=syncppp_status_timerfun;
-	spch->status_timer.data=(unsigned long)dev;
-	spch->status_timer.expires=jiffies + HZ*3;
-	add_timer(&spch->status_timer);
-	
-	return 0;
-}
-
-static int syncppp_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct syncppp_data *spch = ch->LINE_privdata;
-
-	if (!(ch->init_status & HW_OPEN)) return -ENODEV;
-	del_timer(&spch->status_timer);
-	
-	sppp_close(dev);
-
-	ch->init_status &= ~LINE_OPEN;
-	ch->line_status &= ~(PROTO_UP | PROTO_LOOP);
-
-	return 0;
-}
-
-static int syncppp_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	netif_stop_queue(dev);
-	switch(ch->HW_send_packet(dev, skb)) {
-		case FRAME_QUEUED:
-			netif_wake_queue(dev);
-			break;
-		case FRAME_ACCEPTED:
-		case FRAME_DROPPED:
-			break;
-		case FRAME_ERROR:
-			printk(KERN_ERR "%s: Transmit frame error (len %d)\n", 
-				dev->name, skb->len);
-		break;
-	}
-	return 0;
-}
-
-
-static int syncppp_statistics(struct net_device *dev, char *page) 
-{
-	int len = 0;
-
-	len += sprintf(page + len, " ");
-	return len;
-}
-
-
-static int syncppp_exit(struct net_device *dev) 
-{
-	struct comx_channel *ch = dev->priv;
-
-	sppp_detach(dev);
-
-	dev->flags = 0;
-	dev->type = 0;
-	dev->mtu = 0;
-
-	ch->LINE_rx = NULL;
-	ch->LINE_tx = NULL;
-	ch->LINE_status = NULL;
-	ch->LINE_open = NULL;
-	ch->LINE_close = NULL;
-	ch->LINE_xmit = NULL;
-	ch->LINE_header	= NULL;
-	ch->LINE_rebuild_header	= NULL;
-	ch->LINE_statistics = NULL;
-
-	kfree(ch->LINE_privdata);
-	ch->LINE_privdata = NULL;
-
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
-static int syncppp_init(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct ppp_device *pppdev = (struct ppp_device *)ch->if_ptr;
-
-	ch->LINE_privdata = kmalloc(sizeof(struct syncppp_data), GFP_KERNEL);
-	if (!ch->LINE_privdata)
-		return -ENOMEM;
-
-	pppdev->dev = dev;
-	sppp_attach(pppdev);
-
-	if(ch->protocol == &hdlc_protocol) {
-		pppdev->sppp.pp_flags |= PP_CISCO;
-		dev->type = ARPHRD_HDLC;
-	} else {
-		pppdev->sppp.pp_flags &= ~PP_CISCO;
-		dev->type = ARPHRD_PPP;
-	}
-
-	ch->LINE_rx = sppp_input;
-	ch->LINE_tx = syncppp_tx;
-	ch->LINE_status = syncppp_status;
-	ch->LINE_open = syncppp_open;
-	ch->LINE_close = syncppp_close;
-	ch->LINE_xmit = syncppp_xmit;
-	ch->LINE_header	= NULL;
-	ch->LINE_statistics = syncppp_statistics;
-
-
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static struct comx_protocol syncppp_protocol = {
-	"ppp", 
-	VERSION,
-	ARPHRD_PPP, 
-	syncppp_init, 
-	syncppp_exit, 
-	NULL 
-};
-
-static struct comx_protocol hdlc_protocol = {
-	"hdlc", 
-	VERSION,
-	ARPHRD_PPP, 
-	syncppp_init, 
-	syncppp_exit, 
-	NULL 
-};
-
-static int __init comx_proto_ppp_init(void)
-{
-	int ret;
-
-	ret = comx_register_protocol(&hdlc_protocol);
-	if (!ret) {
-		ret = comx_register_protocol(&syncppp_protocol);
-		if (ret)
-			comx_unregister_protocol(hdlc_protocol.name);
-	}
-	return ret;
-}
-
-static void __exit comx_proto_ppp_exit(void)
-{
-	comx_unregister_protocol(syncppp_protocol.name);
-	comx_unregister_protocol(hdlc_protocol.name);
-}
-
-module_init(comx_proto_ppp_init);
-module_exit(comx_proto_ppp_exit);
diff -Nru a/drivers/net/wan/comx.c b/drivers/net/wan/comx.c
--- a/drivers/net/wan/comx.c	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1128 +0,0 @@
-/*
- * Device driver framework for the COMX line of synchronous serial boards
- * 
- * for Linux kernel 2.2.X / 2.4.X
- *
- * Original authors:  Arpad Bakay <bakay.arpad@synergon.hu>,
- *                    Peter Bajan <bajan.peter@synergon.hu>,
- * Previous maintainer: Tivadar Szemethy <tiv@itc.hu>
- * Current maintainer: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1995-1999 ITConsult-Pro Co.
- *
- * Contributors:
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br> (0.85)
- *
- * 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.
- *
- * Version 0.80 (99/06/11):
- *		- clean up source code (playing a bit of indent)
- *		- port back to kernel, add support for non-module versions
- *		- add support for board resets when channel protocol is down
- *		- reset the device structure after protocol exit
- *		  the syncppp driver needs it
- *		- add support for /proc/comx/protocols and 
- *		  /proc/comx/boardtypes
- *
- * Version 0.81 (99/06/21):
- *		- comment out the board reset support code, the locomx
- *		  driver seems not buggy now
- *		- printk() levels fixed
- *
- * Version 0.82 (99/07/08):
- *		- Handle stats correctly if the lowlevel driver is
- *		  is not a comx one (locomx - z85230)
- *
- * Version 0.83 (99/07/15):
- *		- reset line_status when interface is down
- *
- * Version 0.84 (99/12/01):
- *		- comx_status should not check for IFF_UP (to report
- *		  line status from dev->open())
- *
- * Version 0.85 (00/08/15):
- * 		- resource release on failure in comx_mkdir
- * 		- fix return value on failure at comx_write_proc
- *
- * Changed      (00/10/29, Henner Eisen):
- * 		- comx_rx() / comxlapb_data_indication() return status.
- */
-
-#define VERSION "0.85"
-
-#include <linux/config.h>
-#include <linux/module.h>
-
-#include <linux/types.h>
-#include <linux/jiffies.h>
-#include <linux/netdevice.h>
-#include <linux/proc_fs.h>
-#include <asm/uaccess.h>
-#include <linux/ctype.h>
-#include <linux/init.h>
-#include <linux/smp_lock.h>
-
-#ifdef CONFIG_KMOD
-#include <linux/kmod.h>
-#endif
-
-#ifndef CONFIG_PROC_FS
-#error For now, COMX really needs the /proc filesystem
-#endif
-
-#include <net/syncppp.h>
-#include "comx.h"
-
-MODULE_AUTHOR("Gergely Madarasz <gorgo@itc.hu>");
-MODULE_DESCRIPTION("Common code for the COMX synchronous serial adapters");
-MODULE_LICENSE("GPL");
-
-static struct comx_hardware *comx_channels = NULL;
-static struct comx_protocol *comx_lines = NULL;
-
-static int comx_mkdir(struct inode *, struct dentry *, int);
-static int comx_rmdir(struct inode *, struct dentry *);
-static struct dentry *comx_lookup(struct inode *, struct dentry *, struct nameidata *);
-
-static struct inode_operations comx_root_inode_ops = {
-	.lookup = comx_lookup,
-	.mkdir = comx_mkdir,
-	.rmdir = comx_rmdir,
-};
-
-static int comx_delete_dentry(struct dentry *dentry);
-static struct proc_dir_entry *create_comx_proc_entry(char *name, int mode,
-	int size, struct proc_dir_entry *dir);
-
-static struct dentry_operations comx_dentry_operations = {
-	.d_delete	= comx_delete_dentry,
-};
-
-
-static struct proc_dir_entry * comx_root_dir;
-
-struct comx_debugflags_struct	comx_debugflags[] = {
-	{ "comx_rx",		DEBUG_COMX_RX		},
-	{ "comx_tx", 		DEBUG_COMX_TX		},
-	{ "hw_tx",		DEBUG_HW_TX		},
-	{ "hw_rx", 		DEBUG_HW_RX		},
-	{ "hdlc_keepalive",	DEBUG_HDLC_KEEPALIVE	},
-	{ "comxppp",		DEBUG_COMX_PPP		},
-	{ "comxlapb",		DEBUG_COMX_LAPB		},
-	{ "dlci",		DEBUG_COMX_DLCI		},
-	{ NULL,			0			} 
-};
-
-
-int comx_debug(struct net_device *dev, char *fmt, ...)
-{
-	struct comx_channel *ch = dev->priv;
-	char *page,*str;
-	va_list args;
-	int len;
-
-	if (!ch->debug_area) return 0;
-
-	if (!(page = (char *)__get_free_page(GFP_ATOMIC))) return -ENOMEM;
-
-	va_start(args, fmt);
-	len = vsprintf(str = page, fmt, args);
-	va_end(args);
-
-	if (len >= PAGE_SIZE) {
-		printk(KERN_ERR "comx_debug: PANIC! len = %d !!!\n", len);
-		free_page((unsigned long)page);
-		return -EINVAL;
-	}
-
-	while (len) {
-		int to_copy;
-		int free = (ch->debug_start - ch->debug_end + ch->debug_size) 
-			% ch->debug_size;
-
-		to_copy = min_t(int, free ? free : ch->debug_size, 
-			      min_t(int, ch->debug_size - ch->debug_end, len));
-		memcpy(ch->debug_area + ch->debug_end, str, to_copy);
-		str += to_copy;
-		len -= to_copy;
-		ch->debug_end = (ch->debug_end + to_copy) % ch->debug_size;
-		if (ch->debug_start == ch->debug_end) // Full ? push start away
-			ch->debug_start = (ch->debug_start + len + 1) % 
-					ch->debug_size;
-		ch->debug_file->size = (ch->debug_end - ch->debug_start +
-					ch->debug_size) % ch->debug_size;
-	} 
-
-	free_page((unsigned long)page);
-	return 0;
-}
-
-int comx_debug_skb(struct net_device *dev, struct sk_buff *skb, char *msg)
-{
-	struct comx_channel *ch = dev->priv;
-
-	if (!ch->debug_area) return 0;
-	if (!skb) comx_debug(dev, "%s: %s NULL skb\n\n", dev->name, msg);
-	if (!skb->len) comx_debug(dev, "%s: %s empty skb\n\n", dev->name, msg);
-
-	return comx_debug_bytes(dev, skb->data, skb->len, msg);
-}
-
-int comx_debug_bytes(struct net_device *dev, unsigned char *bytes, int len, 
-		char *msg)
-{
-	int pos = 0;
-	struct comx_channel *ch = dev->priv;
-
-	if (!ch->debug_area) return 0;
-
-	comx_debug(dev, "%s: %s len %d\n", dev->name, msg, len);
-
-	while (pos != len) {
-		char line[80];
-		int i = 0;
-
-		memset(line, 0, 80);
-		sprintf(line,"%04d ", pos);
-		do {
-			sprintf(line + 5 + (pos % 16) * 3, "%02x", bytes[pos]);
-			sprintf(line + 60 + (pos % 16), "%c", 
-				isprint(bytes[pos]) ? bytes[pos] : '.');
-			pos++;
-		} while (pos != len && pos % 16);
-
-		while ( i++ != 78 ) if (line[i] == 0) line[i] = ' ';
-		line[77] = '\n';
-		line[78] = 0;
-	
-		comx_debug(dev, "%s", line);
-	}
-	comx_debug(dev, "\n");
-	return 0;
-}
-
-static void comx_loadavg_timerfun(unsigned long d)
-{
-	struct net_device *dev = (struct net_device *)d;
-	struct comx_channel *ch = dev->priv;
-
-	ch->avg_bytes[ch->loadavg_counter] = ch->current_stats->rx_bytes;
-	ch->avg_bytes[ch->loadavg_counter + ch->loadavg_size] = 
-		ch->current_stats->tx_bytes;
-
-	ch->loadavg_counter = (ch->loadavg_counter + 1) % ch->loadavg_size;
-
-	mod_timer(&ch->loadavg_timer,jiffies + HZ * ch->loadavg[0]);
-}
-
-#if 0
-static void comx_reset_timerfun(unsigned long d)
-{ 
-	struct net_device *dev = (struct net_device *)d;
-	struct comx_channel *ch = dev->priv;
-
-	if(!(ch->line_status & (PROTO_LOOP | PROTO_UP))) {
-		if(test_and_set_bit(0,&ch->reset_pending) && ch->HW_reset) {
-			ch->HW_reset(dev);
-		}
-	}
-
-	mod_timer(&ch->reset_timer, jiffies + HZ * ch->reset_timeout);
-}
-#endif                                            
-
-static int comx_open(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *comxdir = ch->procdir->subdir;
-	int ret=0;
-
-	if (!ch->protocol || !ch->hardware) return -ENODEV;
-
-	if ((ret = ch->HW_open(dev))) return ret;
-	if ((ret = ch->LINE_open(dev))) { 
-		ch->HW_close(dev); 
-		return ret; 
-	};
-
-	for (; comxdir ; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_HARDWARE) == 0 ||
-		   strcmp(comxdir->name, FILENAME_PROTOCOL) == 0)
-			comxdir->mode = S_IFREG | 0444;
-	}
-
-#if 0
-	ch->reset_pending = 1;
-	ch->reset_timeout = 30;
-	ch->reset_timer.function = comx_reset_timerfun;
-	ch->reset_timer.data = (unsigned long)dev;
-	ch->reset_timer.expires = jiffies + HZ * ch->reset_timeout;
-	add_timer(&ch->reset_timer);
-#endif
-
-	return 0;
-}
-
-static int comx_close(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	struct proc_dir_entry *comxdir = ch->procdir->subdir;
-	int ret = -ENODEV;
-
-	if (test_and_clear_bit(0, &ch->lineup_pending)) {
-		del_timer(&ch->lineup_timer);
-	}
-
-#if 0	
-	del_timer(&ch->reset_timer);
-#endif
-
-	if (ch->init_status & LINE_OPEN && ch->protocol && ch->LINE_close) {
-		ret = ch->LINE_close(dev);
-	}
-
-	if (ret) return ret;
-
-	if (ch->init_status & HW_OPEN && ch->hardware && ch->HW_close) {
-		ret = ch->HW_close(dev);
-	}
-	
-	ch->line_status=0;
-
-	for (; comxdir ; comxdir = comxdir->next) {
-		if (strcmp(comxdir->name, FILENAME_HARDWARE) == 0 ||
-		    strcmp(comxdir->name, FILENAME_PROTOCOL) == 0)
-			comxdir->mode = S_IFREG | 0644;
-	}
-
-	return ret;
-}
-
-void comx_status(struct net_device *dev, int status)
-{
-	struct comx_channel *ch = dev->priv;
-
-#if 0
-	if(status & (PROTO_UP | PROTO_LOOP)) {
-		clear_bit(0,&ch->reset_pending);
-	}
-#endif
-
-	printk(KERN_NOTICE "Interface %s: modem status %s, line protocol %s\n",
-		    dev->name, status & LINE_UP ? "UP" : "DOWN", 
-		    status & PROTO_LOOP ? "LOOP" : status & PROTO_UP ? 
-		    "UP" : "DOWN");
-	
-	ch->line_status = status;
-}
-
-static int comx_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-	int rc;
-
-	if (skb->len > dev->mtu + dev->hard_header_len) {
-		printk(KERN_ERR "comx_xmit: %s: skb->len %d > dev->mtu %d\n", dev->name,
-		(int)skb->len, dev->mtu);
-	}
-	
-	if (ch->debug_flags & DEBUG_COMX_TX) {
-		comx_debug_skb(dev, skb, "comx_xmit skb");
-	}
-	
-	rc=ch->LINE_xmit(skb, dev);
-//	if (!rc) dev_kfree_skb(skb);
-
-	return rc;
-}
-
-static int comx_header(struct sk_buff *skb, struct net_device *dev, 
-	unsigned short type, void *daddr, void *saddr, unsigned len) 
-{
-	struct comx_channel *ch = dev->priv;
-
-	if (ch->LINE_header) {
-		return (ch->LINE_header(skb, dev, type, daddr, saddr, len));
-	} else {
-		return 0;
-	}
-}
-
-static int comx_rebuild_header(struct sk_buff *skb) 
-{
-	struct net_device *dev = skb->dev;
-	struct comx_channel *ch = dev->priv;
-
-	if (ch->LINE_rebuild_header) {
-		return(ch->LINE_rebuild_header(skb));
-	} else {
-		return 0;
-	}
-}
-
-int comx_rx(struct net_device *dev, struct sk_buff *skb)
-{
-	struct comx_channel *ch = dev->priv;
-
-	if (ch->debug_flags & DEBUG_COMX_RX) {
-		comx_debug_skb(dev, skb, "comx_rx skb");
-	}
-	if (skb) {
-		netif_rx(skb);
-		dev->last_rx = jiffies;
-	}
-	return 0;
-}
-
-static struct net_device_stats *comx_stats(struct net_device *dev)
-{
-	struct comx_channel *ch = dev->priv;
-
-	return ch->current_stats;
-}
-
-void comx_lineup_func(unsigned long d)
-{
-	struct net_device *dev = (struct net_device *)d;
-	struct comx_channel *ch = dev->priv;
-
-	del_timer(&ch->lineup_timer);
-	clear_bit(0, &ch->lineup_pending);
-
-	if (ch->LINE_status) {
-		ch->LINE_status(dev, ch->line_status |= LINE_UP);
-	}
-}
-
-#define LOADAVG(avg, off) (int) \
-	((ch->avg_bytes[(ch->loadavg_counter - 1 + ch->loadavg_size * 2) \
-	% ch->loadavg_size + off] -  ch->avg_bytes[(ch->loadavg_counter - 1 \
-		- ch->loadavg[avg] / ch->loadavg[0] + ch->loadavg_size * 2) \
-		% ch->loadavg_size + off]) / ch->loadavg[avg] * 8)
-
-static int comx_statistics(struct net_device *dev, char *page)
-{
-	struct comx_channel *ch = dev->priv;
-	int len = 0;
-	int tmp;
-	int i = 0;
-	char tmpstr[20];
-	int tmpstrlen = 0;
-
-	len += sprintf(page + len, "Interface administrative status is %s, "
-		"modem status is %s, protocol is %s\n", 
-		dev->flags & IFF_UP ? "UP" : "DOWN",
-		ch->line_status & LINE_UP ? "UP" : "DOWN",
-		ch->line_status & PROTO_LOOP ? "LOOP" : 
-		ch->line_status & PROTO_UP ? "UP" : "DOWN");
-	len += sprintf(page + len, "Modem status changes: %lu, Transmitter status "
-		"is %s, tbusy: %d\n", ch->current_stats->tx_carrier_errors, ch->HW_txe ? 
-		ch->HW_txe(dev) ? "IDLE" : "BUSY" : "NOT READY", netif_running(dev));
-	len += sprintf(page + len, "Interface load (input): %d / %d / %d bits/s (",
-		LOADAVG(0,0), LOADAVG(1, 0), LOADAVG(2, 0));
-	tmpstr[0] = 0;
-	for (i=0; i != 3; i++) {
-		char tf;
-
-		tf = ch->loadavg[i] % 60 == 0 && 
-			ch->loadavg[i] / 60 > 0 ? 'm' : 's';
-		tmpstrlen += sprintf(tmpstr + tmpstrlen, "%d%c%s", 
-			ch->loadavg[i] / (tf == 'm' ? 60 : 1), tf, 
-			i == 2 ? ")\n" : "/");
-	}
-	len += sprintf(page + len, 
-		"%s              (output): %d / %d / %d bits/s (%s", tmpstr, 
-		LOADAVG(0,ch->loadavg_size), LOADAVG(1, ch->loadavg_size), 
-		LOADAVG(2, ch->loadavg_size), tmpstr);
-
-	len += sprintf(page + len, "Debug flags: ");
-	tmp = len; i = 0;
-	while (comx_debugflags[i].name) {
-		if (ch->debug_flags & comx_debugflags[i].value) 
-			len += sprintf(page + len, "%s ", 
-				comx_debugflags[i].name);
-		i++;
-	}
-	len += sprintf(page + len, "%s\n", tmp == len ? "none" : "");
-
-	len += sprintf(page + len, "RX errors: len: %lu, overrun: %lu, crc: %lu, "
-		"aborts: %lu\n           buffer overrun: %lu, pbuffer overrun: %lu\n"
-		"TX errors: underrun: %lu\n",
-		ch->current_stats->rx_length_errors, ch->current_stats->rx_over_errors, 
-		ch->current_stats->rx_crc_errors, ch->current_stats->rx_frame_errors, 
-		ch->current_stats->rx_missed_errors, ch->current_stats->rx_fifo_errors,
-		ch->current_stats->tx_fifo_errors);
-
-	if (ch->LINE_statistics && (ch->init_status & LINE_OPEN)) {
-		len += ch->LINE_statistics(dev, page + len);
-	} else {
-		len += sprintf(page+len, "Line status: driver not initialized\n");
-	}
-	if (ch->HW_statistics && (ch->init_status & HW_OPEN)) {
-		len += ch->HW_statistics(dev, page + len);
-	} else {
-		len += sprintf(page+len, "Board status: driver not initialized\n");
-	}
-
-	return len;
-}
-
-static int comx_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{
-	struct comx_channel *ch = dev->priv;
-
-	if (ch->LINE_ioctl) {
-		return(ch->LINE_ioctl(dev, ifr, cmd));
-	}
-	return -EINVAL;
-}
-
-static void comx_reset_dev(struct net_device *dev)
-{
-	dev->open = comx_open;
-	dev->stop = comx_close;
-	dev->hard_start_xmit = comx_xmit;
-	dev->hard_header = comx_header;
-	dev->rebuild_header = comx_rebuild_header;
-	dev->get_stats = comx_stats;
-	dev->do_ioctl = comx_ioctl;
-	dev->change_mtu = NULL;
-	dev->tx_queue_len = 20;
-	dev->flags = IFF_NOARP;
-}
-
-static int comx_init_dev(struct net_device *dev)
-{
-	struct comx_channel *ch;
-
-	if ((ch = kmalloc(sizeof(struct comx_channel), GFP_KERNEL)) == NULL) {
-		return -ENOMEM;
-	}
-	memset(ch, 0, sizeof(struct comx_channel));
-
-	ch->loadavg[0] = 5;
-	ch->loadavg[1] = 300;
-	ch->loadavg[2] = 900;
-	ch->loadavg_size = ch->loadavg[2] / ch->loadavg[0] + 1; 
-	if ((ch->avg_bytes = kmalloc(ch->loadavg_size * 
-		sizeof(unsigned long) * 2, GFP_KERNEL)) == NULL) {
-		kfree(ch);
-		return -ENOMEM;
-	}
-
-	memset(ch->avg_bytes, 0, ch->loadavg_size * sizeof(unsigned long) * 2);
-	ch->loadavg_counter = 0;
-	ch->loadavg_timer.function = comx_loadavg_timerfun;
-	ch->loadavg_timer.data = (unsigned long)dev;
-	ch->loadavg_timer.expires = jiffies + HZ * ch->loadavg[0];
-	add_timer(&ch->loadavg_timer);
-
-	dev->priv = (void *)ch;
-	ch->dev = dev;
-	ch->line_status &= ~LINE_UP;
-
-	ch->current_stats = &ch->stats;
-
-	comx_reset_dev(dev);
-	return 0;
-}
-
-static int comx_read_proc(char *page, char **start, off_t off, int count, 
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct net_device *dev = file->parent->data;
-	struct comx_channel *ch = dev->priv;
-	int len = 0;
-
-	if (strcmp(file->name, FILENAME_STATUS) == 0) {
-		len = comx_statistics(dev, page);
-	} else if (strcmp(file->name, FILENAME_HARDWARE) == 0) {
-		len = sprintf(page, "%s\n", ch->hardware ? 
-			ch->hardware->name : HWNAME_NONE);
-	} else if (strcmp(file->name, FILENAME_PROTOCOL) == 0) {
-		len = sprintf(page, "%s\n", ch->protocol ? 
-			ch->protocol->name : PROTONAME_NONE);
-	} else if (strcmp(file->name, FILENAME_LINEUPDELAY) == 0) {
-		len = sprintf(page, "%01d\n", ch->lineup_delay);
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) {
-		*eof = 1;
-	}
-	return min_t(int, count, len - off);
-}
-
-
-static int comx_root_read_proc(char *page, char **start, off_t off, int count, 
-	int *eof, void *data)
-{
-	struct proc_dir_entry *file = (struct proc_dir_entry *)data;
-	struct comx_hardware *hw;
-	struct comx_protocol *line;
-
-	int len = 0;
-
-	if (strcmp(file->name, FILENAME_HARDWARELIST) == 0) {
-		for(hw=comx_channels;hw;hw=hw->next) 
-			len+=sprintf(page+len, "%s\n", hw->name);
-	} else if (strcmp(file->name, FILENAME_PROTOCOLLIST) == 0) {
-		for(line=comx_lines;line;line=line->next)
-			len+=sprintf(page+len, "%s\n", line->name);
-	}
-
-	if (off >= len) {
-		*eof = 1;
-		return 0;
-	}
-
-	*start = page + off;
-	if (count >= len - off) {
-		*eof = 1;
-	}
-	return min_t(int, count, len - off);
-}
-
-
-
-static int comx_write_proc(struct file *file, const char *buffer, u_long count,
-	void *data)
-{
-	struct proc_dir_entry *entry = (struct proc_dir_entry *)data;
-	struct net_device *dev = (struct net_device *)entry->parent->data;
-	struct comx_channel *ch = dev->priv;
-	char *page;
-	struct comx_hardware *hw = comx_channels;
-	struct comx_protocol *line = comx_lines;
-	int ret=0;
-
-	if (count > PAGE_SIZE) {
-		printk(KERN_ERR "count is %lu > %d!!!\n", count, (int)PAGE_SIZE);
-		return -ENOSPC;
-	}
-
-	if (!(page = (char *)__get_free_page(GFP_KERNEL))) return -ENOMEM;
-
-	if(copy_from_user(page, buffer, count))
-	{
-		count = -EFAULT;
-		goto out;
-	}
-
-	if (page[count-1] == '\n')
-		page[count-1] = '\0';
-	else if (count < PAGE_SIZE)
-		page[count] = '\0';
-	else if (page[count]) {
-		count = -EINVAL;
-		goto out;
-	}
-
-	if (strcmp(entry->name, FILENAME_DEBUG) == 0) {
-		int i;
-		int ret = 0;
-
-		if ((i = simple_strtoul(page, NULL, 10)) != 0) {
-			unsigned long flags;
-
-			save_flags(flags); cli();
-			if (ch->debug_area) kfree(ch->debug_area);
-			if ((ch->debug_area = kmalloc(ch->debug_size = i, 
-				GFP_KERNEL)) == NULL) {
-				ret = -ENOMEM;
-			}
-			ch->debug_start = ch->debug_end = 0;
-			restore_flags(flags);
-			free_page((unsigned long)page);
-			return ret ? ret : count;
-		}
-		
-		if (*page != '+' && *page != '-') {
-			free_page((unsigned long)page);
-			return -EINVAL;
-		}
-		while (comx_debugflags[i].value && 
-			strncmp(comx_debugflags[i].name, page + 1, 
-			strlen(comx_debugflags[i].name))) {
-			i++;
-		}
-	
-		if (comx_debugflags[i].value == 0) {
-			printk(KERN_ERR "Invalid debug option\n");
-			free_page((unsigned long)page);
-			return -EINVAL;
-		}
-		if (*page == '+') {
-			ch->debug_flags |= comx_debugflags[i].value;
-		} else {
-			ch->debug_flags &= ~comx_debugflags[i].value;
-		}
-	} else if (strcmp(entry->name, FILENAME_HARDWARE) == 0) {
-		if(strlen(page)>10) {
-			free_page((unsigned long)page);
-			return -EINVAL;
-		}
-		while (hw) { 
-			if (strcmp(hw->name, page) == 0) {
-				break;
-			} else {
-				hw = hw->next;
-			}
-		}
-#ifdef CONFIG_KMOD
-		if(!hw && comx_strcasecmp(HWNAME_NONE,page) != 0){
-			request_module("comx-hw-%s",page);
-		}		
-		hw=comx_channels;
-		while (hw) {
-			if (comx_strcasecmp(hw->name, page) == 0) {
-				break;
-			} else {
-				hw = hw->next;
-			}
-		}
-#endif
-
-		if (comx_strcasecmp(HWNAME_NONE, page) != 0 && !hw)  {
-			free_page((unsigned long)page);
-			return -ENODEV;
-		}
-		if (ch->init_status & HW_OPEN) {
-			free_page((unsigned long)page);
-			return -EBUSY;
-		}
-		if (ch->hardware && ch->hardware->hw_exit && 
-		   (ret=ch->hardware->hw_exit(dev))) {
-			free_page((unsigned long)page);
-			return ret;
-		}
-		ch->hardware = hw;
-		entry->size = strlen(page) + 1;
-		if (hw && hw->hw_init) hw->hw_init(dev);
-	} else if (strcmp(entry->name, FILENAME_PROTOCOL) == 0) {
-		if(strlen(page)>10) {
-			free_page((unsigned long)page);
-			return -EINVAL;
-		}
-		while (line) {
-			if (comx_strcasecmp(line->name, page) == 0) {
-				break;
-			} else {
-				line = line->next;
-			}
-		}
-#ifdef CONFIG_KMOD
-		if(!line && comx_strcasecmp(PROTONAME_NONE, page) != 0) {
-			request_module("comx-proto-%s",page);
-		}		
-		line=comx_lines;
-		while (line) {
-			if (comx_strcasecmp(line->name, page) == 0) {
-				break;
-			} else {
-				line = line->next;
-			}
-		}
-#endif
-		
-		if (comx_strcasecmp(PROTONAME_NONE, page) != 0 && !line) {
-			free_page((unsigned long)page);
-			return -ENODEV;
-		}
-		
-		if (ch->init_status & LINE_OPEN) {
-			free_page((unsigned long)page);
-			return -EBUSY;
-		}
-		
-		if (ch->protocol && ch->protocol->line_exit && 
-		    (ret=ch->protocol->line_exit(dev))) {
-			free_page((unsigned long)page);
-			return ret;
-		}
-		ch->protocol = line;
-		entry->size = strlen(page) + 1;
-		comx_reset_dev(dev);
-		if (line && line->line_init) line->line_init(dev);
-	} else if (strcmp(entry->name, FILENAME_LINEUPDELAY) == 0) {
-		int i;
-
-		if ((i = simple_strtoul(page, NULL, 10)) != 0) {
-			if (i >=0 && i < 10) { 
-				ch->lineup_delay = i; 
-			} else {
-				printk(KERN_ERR "comx: invalid lineup_delay value\n");
-			}
-		}
-	}
-out:
-	free_page((unsigned long)page);
-	return count;
-}
-
-static int comx_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-{
-	struct proc_dir_entry *new_dir, *debug_file;
-	struct net_device *dev;
-	struct comx_channel *ch;
-	int ret = -EIO;
-
-	if ((dev = kmalloc(sizeof(struct net_device), GFP_KERNEL)) == NULL) {
-		return -ENOMEM;
-	}
-	memset(dev, 0, sizeof(struct net_device));
-
-	lock_kernel();
-	if ((new_dir = create_proc_entry(dentry->d_name.name, mode | S_IFDIR, 
-		comx_root_dir)) == NULL) {
-		goto cleanup_dev;
-	}
-
-	new_dir->nlink = 2;
-	new_dir->data = NULL; // ide jon majd a struct dev
-
-	/* Ezek kellenek */
-	if (!create_comx_proc_entry(FILENAME_HARDWARE, 0644, 
-	    strlen(HWNAME_NONE) + 1, new_dir)) {
-		goto cleanup_new_dir;
-	}
-	if (!create_comx_proc_entry(FILENAME_PROTOCOL, 0644, 
-	    strlen(PROTONAME_NONE) + 1, new_dir)) {
-		goto cleanup_filename_hardware;
-	}
-	if (!create_comx_proc_entry(FILENAME_STATUS, 0444, 0, new_dir)) {
-		goto cleanup_filename_protocol;
-	}
-	if (!create_comx_proc_entry(FILENAME_LINEUPDELAY, 0644, 2, new_dir)) {
-		goto cleanup_filename_status;
-	}
-
-	if ((debug_file = create_proc_entry(FILENAME_DEBUG, 
-	    S_IFREG | 0644, new_dir)) == NULL) {
-		goto cleanup_filename_lineupdelay;
-	}
-	debug_file->data = (void *)debug_file; 
-	debug_file->read_proc = NULL; // see below
-	debug_file->write_proc = &comx_write_proc;
-	debug_file->nlink = 1;
-
-	strcpy(dev->name, (char *)new_dir->name);
-	dev->init = comx_init_dev;
-
-	if (register_netdevice(dev)) {
-		goto cleanup_filename_debug;
-	}
-	ch = dev->priv;
-	if((ch->if_ptr = (void *)kmalloc(sizeof(struct ppp_device), 
-				 GFP_KERNEL)) == NULL) {
-		goto cleanup_register;
-	}
-	memset(ch->if_ptr, 0, sizeof(struct ppp_device));
-	ch->debug_file = debug_file; 
-	ch->procdir = new_dir;
-	new_dir->data = dev;
-
-	ch->debug_start = ch->debug_end = 0;
-	if ((ch->debug_area = kmalloc(ch->debug_size = DEFAULT_DEBUG_SIZE, 
-	    GFP_KERNEL)) == NULL) {
-		ret = -ENOMEM;
-		goto cleanup_if_ptr;
-	}
-
-	ch->lineup_delay = DEFAULT_LINEUP_DELAY;
-
-	MOD_INC_USE_COUNT;
-	unlock_kernel();
-	return 0;
-cleanup_if_ptr:
-	kfree(ch->if_ptr);
-cleanup_register:
-	unregister_netdevice(dev);
-cleanup_filename_debug:
-	remove_proc_entry(FILENAME_DEBUG, new_dir);
-cleanup_filename_lineupdelay:
-	remove_proc_entry(FILENAME_LINEUPDELAY, new_dir);
-cleanup_filename_status:
-	remove_proc_entry(FILENAME_STATUS, new_dir);
-cleanup_filename_protocol:
-	remove_proc_entry(FILENAME_PROTOCOL, new_dir);
-cleanup_filename_hardware:
-	remove_proc_entry(FILENAME_HARDWARE, new_dir);
-cleanup_new_dir:
-	remove_proc_entry(dentry->d_name.name, comx_root_dir);
-cleanup_dev:
-	kfree(dev);
-	unlock_kernel();
-	return ret;
-}
-
-static int comx_rmdir(struct inode *dir, struct dentry *dentry)
-{
-	struct proc_dir_entry *entry = PDE(dentry->d_inode);
-	struct net_device *dev;
-	struct comx_channel *ch;
-	int ret;
-
-	lock_kernel();
-	dev = entry->data;
-	ch = dev->priv;
-	if (dev->flags & IFF_UP) {
-		printk(KERN_ERR "%s: down interface before removing it\n", dev->name);
-		unlock_kernel();
-		return -EBUSY;
-	}
-
-	if (ch->protocol && ch->protocol->line_exit && 
-	    (ret=ch->protocol->line_exit(dev))) {
-		unlock_kernel();
-		return ret;
-	}
-	if (ch->hardware && ch->hardware->hw_exit && 
-	   (ret=ch->hardware->hw_exit(dev))) { 
-		if(ch->protocol && ch->protocol->line_init) {
-			ch->protocol->line_init(dev);
-		}
-		unlock_kernel();
-		return ret;
-	}
-	ch->protocol = NULL;
-	ch->hardware = NULL;
-
-	del_timer(&ch->loadavg_timer);
-	kfree(ch->avg_bytes);
-
-	unregister_netdev(dev);
-	if (ch->debug_area) {
-		kfree(ch->debug_area);
-	}
-	if (dev->priv) {
-		kfree(dev->priv);
-	}
-	free_netdev(dev);
-
-	remove_proc_entry(FILENAME_DEBUG, entry);
-	remove_proc_entry(FILENAME_LINEUPDELAY, entry);
-	remove_proc_entry(FILENAME_STATUS, entry);
-	remove_proc_entry(FILENAME_HARDWARE, entry);
-	remove_proc_entry(FILENAME_PROTOCOL, entry);
-	remove_proc_entry(dentry->d_name.name, comx_root_dir);
-
-	MOD_DEC_USE_COUNT;
-	unlock_kernel();
-	return 0;
-}
-
-static struct dentry *comx_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
-{
-	struct proc_dir_entry *de;
-	struct inode *inode = NULL;
-
-	lock_kernel();
-	if ((de = PDE(dir)) != NULL) {
-		for (de = de->subdir ; de ; de = de->next) {
-			if ((de->namelen == dentry->d_name.len) &&
-			    (memcmp(dentry->d_name.name, de->name, 
-			    de->namelen) == 0))	{
-			 	if ((inode = proc_get_inode(dir->i_sb, 
-			 	    de->low_ino, de)) == NULL) { 
-			 		printk(KERN_ERR "COMX: lookup error\n"); 
-					unlock_kernel();
-			 		return ERR_PTR(-EINVAL); 
-			 	}
-				break;
-			}
-		}
-	}
-	unlock_kernel();
-	dentry->d_op = &comx_dentry_operations;
-	d_add(dentry, inode);
-	return NULL;
-}
-
-int comx_strcasecmp(const char *cs, const char *ct)
-{
-	register signed char __res;
-
-	while (1) {
-		if ((__res = toupper(*cs) - toupper(*ct++)) != 0 || !*cs++) {
-			break;
-		}
-	}
-	return __res;
-}
-
-static int comx_delete_dentry(struct dentry *dentry)
-{
-	return 1;
-}
-
-static struct proc_dir_entry *create_comx_proc_entry(char *name, int mode,
-	int size, struct proc_dir_entry *dir)
-{
-	struct proc_dir_entry *new_file;
-
-	if ((new_file = create_proc_entry(name, S_IFREG | mode, dir)) != NULL) {
-		new_file->data = (void *)new_file;
-		new_file->read_proc = &comx_read_proc;
-		new_file->write_proc = &comx_write_proc;
-		new_file->size = size;
-		new_file->nlink = 1;
-	}
-	return(new_file);
-}
-
-int comx_register_hardware(struct comx_hardware *comx_hw)
-{
-	struct comx_hardware *hw = comx_channels;
-
-	if (!hw) {
-		comx_channels = comx_hw;
-	} else {
-		while (hw->next != NULL && strcmp(comx_hw->name, hw->name) != 0) {
-			hw = hw->next;
-		}
-		if (strcmp(comx_hw->name, hw->name) == 0) {
-			return -1;
-		}
-		hw->next = comx_hw;
-	}
-
-	printk(KERN_INFO "COMX: driver for hardware type %s, version %s\n", comx_hw->name, comx_hw->version);
-	return 0;
-}
-
-int comx_unregister_hardware(char *name)
-{
-	struct comx_hardware *hw = comx_channels;
-
-	if (!hw) {
-		return -1;
-	}
-
-	if (strcmp(hw->name, name) == 0) {
-		comx_channels = comx_channels->next;
-		return 0;
-	}
-
-	while (hw->next != NULL && strcmp(hw->next->name,name) != 0) {
-		hw = hw->next;
-	}
-
-	if (hw->next != NULL && strcmp(hw->next->name, name) == 0) {
-		hw->next = hw->next->next;
-		return 0;
-	}
-	return -1;
-}
-
-int comx_register_protocol(struct comx_protocol *comx_line)
-{
-	struct comx_protocol *pr = comx_lines;
-
-	if (!pr) {
-		comx_lines = comx_line;
-	} else {
-		while (pr->next != NULL && strcmp(comx_line->name, pr->name) !=0) {
-			pr = pr->next;
-		}
-		if (strcmp(comx_line->name, pr->name) == 0) {
-			return -1;
-		}
-		pr->next = comx_line;
-	}
-
-	printk(KERN_INFO "COMX: driver for protocol type %s, version %s\n", comx_line->name, comx_line->version);
-	return 0;
-}
-
-int comx_unregister_protocol(char *name)
-{
-	struct comx_protocol *pr = comx_lines;
-
-	if (!pr) {
-		return -1;
-	}
-
-	if (strcmp(pr->name, name) == 0) {
-		comx_lines = comx_lines->next;
-		return 0;
-	}
-
-	while (pr->next != NULL && strcmp(pr->next->name,name) != 0) {
-		pr = pr->next;
-	}
-
-	if (pr->next != NULL && strcmp(pr->next->name, name) == 0) {
-		pr->next = pr->next->next;
-		return 0;
-	}
-	return -1;
-}
-
-static int __init comx_init(void)
-{
-	struct proc_dir_entry *new_file;
-
-	comx_root_dir = create_proc_entry("comx", 
-		S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO, &proc_root);
-	if (!comx_root_dir)
-		return -ENOMEM;
-	comx_root_dir->proc_iops = &comx_root_inode_ops;
-
-	if ((new_file = create_proc_entry(FILENAME_HARDWARELIST, 
-	   S_IFREG | 0444, comx_root_dir)) == NULL) {
-		return -ENOMEM;
-	}
-	
-	new_file->data = new_file;
-	new_file->read_proc = &comx_root_read_proc;
-	new_file->write_proc = NULL;
-	new_file->nlink = 1;
-
-	if ((new_file = create_proc_entry(FILENAME_PROTOCOLLIST, 
-	   S_IFREG | 0444, comx_root_dir)) == NULL) {
-		return -ENOMEM;
-	}
-	
-	new_file->data = new_file;
-	new_file->read_proc = &comx_root_read_proc;
-	new_file->write_proc = NULL;
-	new_file->nlink = 1;
-
-
-	printk(KERN_INFO "COMX: driver version %s (C) 1995-1999 ITConsult-Pro Co. <info@itc.hu>\n", 
-		VERSION);
-	return 0;
-}
-
-static void __exit comx_exit(void)
-{
-	remove_proc_entry(FILENAME_HARDWARELIST, comx_root_dir);
-	remove_proc_entry(FILENAME_PROTOCOLLIST, comx_root_dir);
-	remove_proc_entry(comx_root_dir->name, &proc_root);
-}
-
-module_init(comx_init);
-module_exit(comx_exit);
-
-EXPORT_SYMBOL(comx_register_hardware);
-EXPORT_SYMBOL(comx_unregister_hardware);
-EXPORT_SYMBOL(comx_register_protocol);
-EXPORT_SYMBOL(comx_unregister_protocol);
-EXPORT_SYMBOL(comx_debug_skb);
-EXPORT_SYMBOL(comx_debug_bytes);
-EXPORT_SYMBOL(comx_debug);
-EXPORT_SYMBOL(comx_lineup_func);
-EXPORT_SYMBOL(comx_status);
-EXPORT_SYMBOL(comx_rx);
-EXPORT_SYMBOL(comx_strcasecmp);
-EXPORT_SYMBOL(comx_root_dir);
diff -Nru a/drivers/net/wan/comx.h b/drivers/net/wan/comx.h
--- a/drivers/net/wan/comx.h	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,232 +0,0 @@
-/*
- * General definitions for the COMX driver 
- * 
- * Original authors:  Arpad Bakay <bakay.arpad@synergon.hu>,
- *                    Peter Bajan <bajan.peter@synergon.hu>,
- * Previous maintainer: Tivadar Szemethy <tiv@itc.hu>
- * Currently maintained by: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1995-1999 ITConsult-Pro Co. <info@itc.hu>
- *
- * 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.
- *
- *
- * net_device_stats:
- *	rx_length_errors	rec_len < 4 || rec_len > 2000
- *	rx_over_errors		receive overrun (OVR)
- *	rx_crc_errors		rx crc error
- *	rx_frame_errors		aborts rec'd (ABO)
- *	rx_fifo_errors		status fifo overrun (PBUFOVR)
- *	rx_missed_errors	receive buffer overrun (BUFOVR)
- *	tx_aborted_errors	?
- *	tx_carrier_errors	modem line status changes
- *	tx_fifo_errors		tx underrun (locomx)
- */
-#include <linux/config.h>
-
-struct comx_protocol {
-	char	*name;
-	char	*version;
-	unsigned short encap_type;
-	int	(*line_init)(struct net_device *dev);
-	int	(*line_exit)(struct net_device *dev);
-	struct comx_protocol *next;
-	};
-
-struct comx_hardware {
-	char *name; 
-	char *version;
-	int	(*hw_init)(struct net_device *dev);
-	int	(*hw_exit)(struct net_device *dev);
-	int	(*hw_dump)(struct net_device *dev);
-	struct comx_hardware *next;
-	};
-
-struct comx_channel {
-	void		*if_ptr;	// General purpose pointer
-	struct net_device 	*dev;		// Where we belong to
-	struct net_device	*twin;		// On dual-port cards
-	struct proc_dir_entry *procdir;	// the directory
-
-	unsigned char	init_status;
-	unsigned char	line_status;
-
-	struct timer_list lineup_timer;	// against line jitter
-	long int	lineup_pending;
-	unsigned char	lineup_delay;
-
-#if 0
-	struct timer_list reset_timer; // for board resetting
-	long		reset_pending;
-	int		reset_timeout;
-#endif
-
-	struct net_device_stats	stats;	
-	struct net_device_stats *current_stats;
-#if 0
-	unsigned long	board_resets;
-#endif
-	unsigned long 	*avg_bytes;
-	int		loadavg_counter, loadavg_size;
-	int		loadavg[3];
-	struct timer_list loadavg_timer;
-	int		debug_flags;
-	char 		*debug_area;
-	int		debug_start, debug_end, debug_size;
-	struct proc_dir_entry *debug_file;
-#ifdef	CONFIG_COMX_DEBUG_RAW
-	char		*raw;
-	int		raw_len;
-#endif
-	// LINE specific	
-	struct comx_protocol *protocol;
-	void		(*LINE_rx)(struct net_device *dev, struct sk_buff *skb);
-	int		(*LINE_tx)(struct net_device *dev);
-	void		(*LINE_status)(struct net_device *dev, u_short status);
-	int		(*LINE_open)(struct net_device *dev);
-	int		(*LINE_close)(struct net_device *dev);
-	int		(*LINE_xmit)(struct sk_buff *skb, struct net_device *dev);
-	int		(*LINE_header)(struct sk_buff *skb, struct net_device *dev,
-				u_short type,void *daddr, void *saddr, 
-				unsigned len);
-	int		(*LINE_rebuild_header)(struct sk_buff *skb);
-	int		(*LINE_statistics)(struct net_device *dev, char *page);
-	int		(*LINE_parameter_check)(struct net_device *dev);
-	int		(*LINE_ioctl)(struct net_device *dev, struct ifreq *ifr,
-				int cmd);
-	void		(*LINE_mod_use)(int);
-	void *		LINE_privdata;
-
-	// HW specific
-
-	struct comx_hardware *hardware;
-	void	(*HW_board_on)(struct net_device *dev);
-	void	(*HW_board_off)(struct net_device *dev);
-	struct net_device *(*HW_access_board)(struct net_device *dev);
-	void	(*HW_release_board)(struct net_device *dev, struct net_device *savep);
-	int	(*HW_txe)(struct net_device *dev);
-	int	(*HW_open)(struct net_device *dev);
-	int	(*HW_close)(struct net_device *dev);
-	int	(*HW_send_packet)(struct net_device *dev,struct sk_buff *skb);
-	int	(*HW_statistics)(struct net_device *dev, char *page);
-#if 0
-	int	(*HW_reset)(struct net_device *dev, char *page);
-#endif
-	int	(*HW_load_board)(struct net_device *dev);
-	void	(*HW_set_clock)(struct net_device *dev);
-	void	*HW_privdata;
-	};
-
-struct comx_debugflags_struct {
-	char *name;
-	int  value;
-	};
-
-#define	COMX_ROOT_DIR_NAME	"comx"
-
-#define	FILENAME_HARDWARE	"boardtype"
-#define FILENAME_HARDWARELIST	"boardtypes"
-#define FILENAME_PROTOCOL	"protocol"
-#define FILENAME_PROTOCOLLIST	"protocols"
-#define FILENAME_DEBUG		"debug"
-#define FILENAME_CLOCK		"clock"
-#define	FILENAME_STATUS		"status"
-#define	FILENAME_IO		"io"
-#define FILENAME_IRQ		"irq"
-#define	FILENAME_KEEPALIVE	"keepalive"
-#define FILENAME_LINEUPDELAY	"lineup_delay"
-#define FILENAME_CHANNEL	"channel"
-#define FILENAME_FIRMWARE	"firmware"
-#define FILENAME_MEMADDR	"memaddr"
-#define	FILENAME_TWIN		"twin"
-#define FILENAME_T1		"t1"
-#define FILENAME_T2		"t2"
-#define FILENAME_N2		"n2"
-#define FILENAME_WINDOW		"window"
-#define FILENAME_MODE		"mode"
-#define	FILENAME_DLCI		"dlci"
-#define	FILENAME_MASTER		"master"
-#ifdef	CONFIG_COMX_DEBUG_RAW
-#define	FILENAME_RAW		"raw"
-#endif
-
-#define PROTONAME_NONE		"none"
-#define HWNAME_NONE		"none"
-#define KEEPALIVE_OFF		"off"
-
-#define FRAME_ACCEPTED		0		/* sending and xmitter busy */
-#define FRAME_DROPPED		1
-#define FRAME_ERROR		2		/* xmitter error */
-#define	FRAME_QUEUED		3		/* sending but more can come */
-
-#define	LINE_UP			1		/* Modem UP */
-#define PROTO_UP		2
-#define PROTO_LOOP		4
-
-#define	HW_OPEN			1
-#define	LINE_OPEN		2
-#define FW_LOADED		4
-#define IRQ_ALLOCATED		8
-
-#define DEBUG_COMX_RX		2
-#define	DEBUG_COMX_TX		4
-#define	DEBUG_HW_TX		16
-#define	DEBUG_HW_RX		32
-#define	DEBUG_HDLC_KEEPALIVE	64
-#define	DEBUG_COMX_PPP		128
-#define DEBUG_COMX_LAPB		256
-#define	DEBUG_COMX_DLCI		512
-
-#define	DEBUG_PAGESIZE		3072
-#define DEFAULT_DEBUG_SIZE	4096
-#define	DEFAULT_LINEUP_DELAY	1
-#define	FILE_PAGESIZE		3072
-
-#ifndef	COMX_PPP_MAJOR
-#define	COMX_PPP_MAJOR		88
-#endif
-
-
-#define COMX_CHANNEL(dev) ((struct comx_channel*)dev->priv)
-
-#define TWIN(dev) (COMX_CHANNEL(dev)->twin)
-
-
-#ifndef byte
-typedef u8	byte;
-#endif
-#ifndef word
-typedef u16	word;
-#endif
-
-#ifndef	SEEK_SET
-#define	SEEK_SET	0
-#endif
-#ifndef	SEEK_CUR
-#define	SEEK_CUR	1
-#endif
-#ifndef	SEEK_END
-#define	SEEK_END	2
-#endif
-
-extern struct proc_dir_entry * comx_root_dir;
-
-extern int	comx_register_hardware(struct comx_hardware *comx_hw);
-extern int	comx_unregister_hardware(char *name);
-extern int	comx_register_protocol(struct comx_protocol *comx_line);
-extern int	comx_unregister_protocol(char *name);
-
-extern int	comx_rx(struct net_device *dev, struct sk_buff *skb);
-extern void	comx_status(struct net_device *dev, int status);
-extern void	comx_lineup_func(unsigned long d);
-
-extern int	comx_debug(struct net_device *dev, char *fmt, ...);
-extern int	comx_debug_skb(struct net_device *dev, struct sk_buff *skb, char *msg);
-extern int	comx_debug_bytes(struct net_device *dev, unsigned char *bytes, int len,
-		char *msg);
-extern int	comx_strcasecmp(const char *cs, const char *ct);
-
-extern struct inode_operations comx_normal_inode_ops;
diff -Nru a/drivers/net/wan/comxhw.h b/drivers/net/wan/comxhw.h
--- a/drivers/net/wan/comxhw.h	Sun May 16 01:43:16 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,113 +0,0 @@
-/*
- * Defines for comxhw.c
- *
- * Original authors:  Arpad Bakay <bakay.arpad@synergon.hu>,
- *                    Peter Bajan <bajan.peter@synergon.hu>,
- * Previous maintainer: Tivadar Szemethy <tiv@itc.hu>
- * Current maintainer: Gergely Madarasz <gorgo@itc.hu>
- *
- * Copyright (C) 1995-1999 ITConsult-Pro Co. <info@itc.hu>
- *
- * 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.
- *
- */
-
-#define	LOCOMX_IO_EXTENT	8
-#define COMX_IO_EXTENT		4
-#define	HICOMX_IO_EXTENT	16
-
-#define COMX_MAX_TX_SIZE	1600
-#define COMX_MAX_RX_SIZE	2048
-
-#define COMX_JAIL_OFFSET	0xffff
-#define COMX_JAIL_VALUE		0xfe
-#define	COMX_MEMORY_SIZE	65536
-#define HICOMX_MEMORY_SIZE	16384
-#define COMX_MEM_MIN		0xa0000
-#define COMX_MEM_MAX		0xf0000
-
-#define	COMX_DEFAULT_IO		0x360
-#define	COMX_DEFAULT_IRQ	10
-#define	COMX_DEFAULT_MEMADDR	0xd0000
-#define	HICOMX_DEFAULT_IO	0x320
-#define	HICOMX_DEFAULT_IRQ	10
-#define	HICOMX_DEFAULT_MEMADDR	0xd0000
-#define	LOCOMX_DEFAULT_IO	0x368
-#define	LOCOMX_DEFAULT_IRQ	7
-
-#define MAX_CHANNELNO		2
-
-#define	COMX_CHANNEL_OFFSET	0x2000
-
-#define COMX_ENABLE_BOARD_IT    0x40
-#define COMX_BOARD_RESET       	0x20
-#define COMX_ENABLE_BOARD_MEM   0x10
-#define COMX_DISABLE_BOARD_MEM  0
-#define COMX_DISABLE_ALL	0x00
-
-#define HICOMX_DISABLE_ALL	0x00
-#define HICOMX_ENABLE_BOARD_MEM	0x02
-#define HICOMX_DISABLE_BOARD_MEM 0x0
-#define HICOMX_BOARD_RESET	0x01
-#define HICOMX_PRG_MEM		4
-#define HICOMX_DATA_MEM		0
-#define HICOMX_ID_BYTE		0x55
-
-#define CMX_ID_BYTE		0x31
-#define COMX_CLOCK_CONST	8000
-
-#define	LINKUP_READY		3
-
-#define	OFF_FW_L1_ID	0x01e	 /* ID bytes */
-#define OFF_FW_L2_ID	0x1006
-#define	FW_L1_ID_1	0xab
-#define FW_L1_ID_2_COMX		0xc0
-#define FW_L1_ID_2_HICOMX	0xc1
-#define	FW_L2_ID_1	0xab
-
-#define OFF_A_L2_CMD     0x130   /* command register for L2 */
-#define OFF_A_L2_CMDPAR  0x131   /* command parameter byte */
-#define OFF_A_L1_STATB   0x122   /* stat. block for L1 */
-#define OFF_A_L1_ABOREC  0x122   /* receive ABORT counter */
-#define OFF_A_L1_OVERRUN 0x123   /* receive overrun counter */
-#define OFF_A_L1_CRCREC  0x124   /* CRC error counter */
-#define OFF_A_L1_BUFFOVR 0x125   /* buffer overrun counter */
-#define OFF_A_L1_PBUFOVR 0x126   /* priority buffer overrun counter */
-#define OFF_A_L1_MODSTAT 0x127   /* current state of modem ctrl lines */
-#define OFF_A_L1_STATE   0x127   /* end of stat. block for L1 */
-#define OFF_A_L1_TXPC    0x128   /* Tx counter for the PC */
-#define OFF_A_L1_TXZ80   0x129   /* Tx counter for the Z80 */
-#define OFF_A_L1_RXPC    0x12a   /* Rx counter for the PC */
-#define OFF_A_L1_RXZ80   0x12b   /* Rx counter for the Z80 */
-#define OFF_A_L1_REPENA  0x12c   /* IT rep disable */
-#define OFF_A_L1_CHNR    0x12d   /* L1 channel logical number */
-#define OFF_A_L1_CLKINI  0x12e   /* Timer Const */
-#define OFF_A_L2_LINKUP	 0x132	 /* Linkup byte */
-#define OFF_A_L2_DAV	 0x134   /* Rx DAV */
-#define OFF_A_L2_RxBUFP  0x136	 /* Rx buff relative to membase */
-#define OFF_A_L2_TxEMPTY 0x138   /* Tx Empty */
-#define OFF_A_L2_TxBUFP  0x13a   /* Tx Buf */
-#define OFF_A_L2_NBUFFS	 0x144	 /* Number of buffers to fetch */
-
-#define OFF_A_L2_SABMREC 0x164	 /* LAPB no. of SABMs received */
-#define OFF_A_L2_SABMSENT 0x165	 /* LAPB no. of SABMs sent */
-#define OFF_A_L2_REJREC  0x166	 /* LAPB no. of REJs received */
-#define OFF_A_L2_REJSENT 0x167	 /* LAPB no. of REJs sent */
-#define OFF_A_L2_FRMRREC 0x168	 /* LAPB no. of FRMRs received */
-#define OFF_A_L2_FRMRSENT 0x169	 /* LAPB no. of FRMRs sent */
-#define OFF_A_L2_PROTERR 0x16A	 /* LAPB no. of protocol errors rec'd */
-#define OFF_A_L2_LONGREC 0x16B	 /* LAPB no. of long frames */
-#define OFF_A_L2_INVNR   0x16C	 /* LAPB no. of invalid N(R)s rec'd */
-#define OFF_A_L2_UNDEFFR 0x16D	 /* LAPB no. of invalid frames */
-
-#define	OFF_A_L2_T1	0x174	 /* T1 timer */
-#define	OFF_A_L2_ADDR	0x176	 /* DCE = 1, DTE = 3 */
-
-#define	COMX_CMD_INIT	1
-#define COMX_CMD_EXIT	2
-#define COMX_CMD_OPEN	16
-#define COMX_CMD_CLOSE	17
-
