diff -u --recursive --new-file v1.3.16/linux/CREDITS linux/CREDITS
--- v1.3.16/linux/CREDITS	Thu Jul 27 10:13:16 1995
+++ linux/CREDITS	Wed Aug  9 09:52:25 1995
@@ -9,7 +9,10 @@
 
 M: Matti Aarnio
 E: mea@utu.fi
-D: Dynamicized network socket allocations, LILO for AHA1542
+D: LILO for AHA1542, modularized several of drivers/net/,
+D: dynamic SLIP devices, dynamic /proc/net/, true size /proc/ksyms,
+D: and other hacks..
+D: Documenting various parts of network subsystem (kernel side)
 
 N: Werner Almesberger
 E: almesber@bernina.ethz.ch
diff -u --recursive --new-file v1.3.16/linux/Makefile linux/Makefile
--- v1.3.16/linux/Makefile	Tue Aug  8 12:31:32 1995
+++ linux/Makefile	Wed Aug  9 09:53:53 1995
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 3
-SUBLEVEL = 16
+SUBLEVEL = 17
 
 ARCH = i386
 
@@ -214,6 +214,7 @@
 	}; \
 	\
 	if [ -f NET_MODULES  ]; then inst_mod NET_MODULES  net;  fi; \
+	if [ -f IPV4_MODULES ]; then inst_mod IPV4_MODULES ipv4; fi; \
 	if [ -f SCSI_MODULES ]; then inst_mod SCSI_MODULES scsi; fi; \
 	if [ -f FS_MODULES   ]; then inst_mod FS_MODULES   fs;   fi; \
 	\
diff -u --recursive --new-file v1.3.16/linux/drivers/block/Makefile linux/drivers/block/Makefile
--- v1.3.16/linux/drivers/block/Makefile	Mon Jul 31 15:58:59 1995
+++ linux/drivers/block/Makefile	Wed Aug  9 09:52:26 1995
@@ -27,7 +27,7 @@
 OBJS := $(OBJS) floppy.o
 SRCS := $(SRCS) floppy.c
 else
-BLOCK_MODULE_OBJS := $(MODULES) floppy.o
+BLOCK_MODULE_OBJS := $(BLOCK_MODULE_OBJS) floppy.o
 endif
 
 ifdef CONFIG_AZTCD
@@ -137,10 +137,13 @@
 	$(AR) rcs block.a $(OBJS)
 	sync
 
+ifdef BLOCK_MODULE_OBJS
 dep:
 	$(CPP) -M $(SRCS) > .depend
-ifdef BLOCK_MODULE_OBJS
 	$(CPP) -M -DMODULE $(BLOCK_MODULE_OBJS:.o=.c) >> .depend
+else
+dep:
+	$(CPP) -M $(SRCS) > .depend
 endif
 
 modules: $(BLOCK_MODULE_OBJS)
diff -u --recursive --new-file v1.3.16/linux/drivers/char/Makefile linux/drivers/char/Makefile
--- v1.3.16/linux/drivers/char/Makefile	Tue Jul 25 18:21:21 1995
+++ linux/drivers/char/Makefile	Wed Aug  9 09:52:26 1995
@@ -100,10 +100,13 @@
 
 endif
 
+ifdef MODULES
 dep: uni_hash_tbl.h
 	$(CPP) -M $(SRCS) > .depend
-ifdef MODULES
 	$(CPP) -M -DMODULE $(MODULES:.o=.c) >> .depend
+else
+dep: uni_hash_tbl.h
+	$(CPP) -M $(SRCS) > .depend
 endif
 
 conmakehash: conmakehash.c
diff -u --recursive --new-file v1.3.16/linux/drivers/net/3c503.c linux/drivers/net/3c503.c
--- v1.3.16/linux/drivers/net/3c503.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/3c503.c	Wed Aug  9 09:52:26 1995
@@ -25,6 +25,12 @@
 static const char *version =
     "3c503.c:v1.10 9/23/93  Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -459,6 +465,53 @@
     outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
     return 0;
 }
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device el2_drv =
+{"3c503", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, el2_probe };
+       
+static struct device el2pio_drv =
+{"3c503pio", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, el2_pio_probe };
+
+int io = 0;
+int irq = 0;
+
+static int no_pio = 1;
+int init_module(void)
+{
+	int rc1, rc2;
+	el2_drv.base_addr = io;
+	el2_drv.irq       = irq;
+	el2pio_drv.base_addr = io;
+	el2pio_drv.irq       = irq;
+
+	rc2 = 0;
+	no_pio = 1;
+	rc1 = register_netdev(&el2_drv);
+	if (rc1 != 0) {
+	    rc2 = register_netdev(&el2pio_drv);
+	    no_pio = 0;
+	}
+
+	if (rc1 != 0 && rc2 != 0)
+		return -EIO;
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("3c503: device busy, remove delayed\n");
+	else {
+	    if (no_pio) {
+		unregister_netdev(&el2_drv);
+	    } else {
+		unregister_netdev(&el2pio_drv);
+	    }
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/3c505.c linux/drivers/net/3c505.c
--- v1.3.16/linux/drivers/net/3c505.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/3c505.c	Wed Aug  9 09:52:26 1995
@@ -33,6 +33,11 @@
  *                     
  */
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/string.h>
@@ -917,6 +922,10 @@
 	if (elp_debug >= 3)
 		printk("%s: start receive command sent\n", dev->name);
 
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
 	return 0;			/* Always succeed */
 }
 
@@ -1146,6 +1155,10 @@
 	 */
 	irq2dev_map[dev->irq] = 0;
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -1444,3 +1457,33 @@
 	elp_init(dev);
 	return 0;
 }
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_3c505 = {
+	"        " /*"3c505"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, elplus_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_3c505.base_addr = io;
+	dev_3c505.irq       = irq;
+	if (register_netdev(&dev_3c505) != 0) {
+		printk("3c505: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("3c505: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_3c505);
+	}
+}
+#endif /* MODULE */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/3c507.c linux/drivers/net/3c507.c
--- v1.3.16/linux/drivers/net/3c507.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/3c507.c	Wed Aug  9 09:52:26 1995
@@ -26,6 +26,12 @@
 static const char *version =
 	"3c507.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/config.h>
 
 /*
@@ -440,6 +446,11 @@
 	dev->tbusy = 0;
 	dev->interrupt = 0;
 	dev->start = 1;
+
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -631,6 +642,10 @@
 
 	/* Update the statistics here. */
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -868,6 +883,36 @@
 	lp->rx_head = rx_head;
 	lp->rx_tail = rx_tail;
 }
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_3c507 = {
+	"        " /*"3c507"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, el16_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_3c507.base_addr = io;
+	dev_3c507.irq       = irq;
+	if (register_netdev(&dev_3c507) != 0) {
+		printk("3c507: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("3c507: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_3c507);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/8390.c linux/drivers/net/8390.c
--- v1.3.16/linux/drivers/net/8390.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/8390.c	Wed Aug  9 09:52:26 1995
@@ -84,7 +84,12 @@
 #ifdef EI_DEBUG
 int ei_debug = EI_DEBUG;
 #else
-int ei_debug = 1;
+int ei_debug = 0;
+#endif
+#ifdef EI_NOPINGPONG
+static int ei_pingpong = 0;
+#else
+static int ei_pingpong = 1;
 #endif
 
 /* Max number of packets received at one Intr.
@@ -594,9 +599,7 @@
 		dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
 		memset(dev->priv, 0, sizeof(struct ei_device));
 		ei_local = (struct ei_device *)dev->priv;
-#ifndef NO_PINGPONG
-		ei_local->pingpong = 1;
-#endif
+		ei_local->pingpong = ei_pingpong;
     }
     
     /* The open call may be overridden by the card-specific code. */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/CONFIG linux/drivers/net/CONFIG
--- v1.3.16/linux/drivers/net/CONFIG	Thu Jun 29 19:02:41 1995
+++ linux/drivers/net/CONFIG	Wed Aug  9 09:52:26 1995
@@ -16,7 +16,8 @@
 #			used.  Usually pointless under Linux.
 #	show_all_SAPROM  Show the entire address PROM, not just the
 #			ethernet address, during boot.
-#	rw_bugfix	Patch an obscure bug with a version of the 8390.
+#	CONFIG_NE_RW_BUGFIX  Patch an obscure bug with a version of the 8390.
+#	CONFIG_NE_SANITY ??
 #  CONFIG_HPLAN		The HP-LAN driver (for 8390-based boards only).
 #	rw_bugfix	Fix the same obscure bug.
 #  CONFIG_EL2		The 3c503 EtherLink II driver
diff -u --recursive --new-file v1.3.16/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v1.3.16/linux/drivers/net/Makefile	Tue Jul 18 16:28:57 1995
+++ linux/drivers/net/Makefile	Wed Aug  9 09:52:26 1995
@@ -30,6 +30,8 @@
 
 ifdef CONFIG_IBMTR
 NETDRV_OBJS := $(NETDRV_OBJS) ibmtr.o
+else
+MODULES := $(MODULES) ibmtr.o
 endif
 
 ifdef CONFIG_SK_G16
@@ -38,6 +40,8 @@
 
 ifdef CONFIG_NET_IPIP
 NETDRV_OBJS := $(NETDRV_OBJS) tunnel.o
+else
+MODULES := $(MODULES) tunnel.o
 endif
 
 ifdef CONFIG_HP100
@@ -49,6 +53,8 @@
 ifdef CONFIG_WD80x3
 NETDRV_OBJS := $(NETDRV_OBJS) wd.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) wd.o
 endif
 wd.o:	wd.c CONFIG
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(WD_OPTS) -c $<
@@ -56,6 +62,8 @@
 ifdef CONFIG_EL2
 NETDRV_OBJS := $(NETDRV_OBJS) 3c503.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) 3c503.o
 endif
 3c503.o:	3c503.c CONFIG
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(EL2_OPTS) -c $<
@@ -63,6 +71,8 @@
 ifdef CONFIG_NE2000
 NETDRV_OBJS := $(NETDRV_OBJS) ne.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) ne.o
 endif
 ne.o:	ne.c CONFIG
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(NE_OPTS) -c $<
@@ -70,6 +80,8 @@
 ifdef CONFIG_HPLAN
 NETDRV_OBJS := $(NETDRV_OBJS) hp.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) hp.o
 endif
 hp.o:	hp.c CONFIG
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(HP_OPTS) -c $<
@@ -77,16 +89,22 @@
 ifdef CONFIG_HPLAN_PLUS
 NETDRV_OBJS := $(NETDRV_OBJS) hp-plus.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) hp-plus.o
 endif
 
 ifdef CONFIG_ULTRA
 NETDRV_OBJS := $(NETDRV_OBJS) smc-ultra.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) smc-ultra.o
 endif
 
 ifdef CONFIG_E2100
 NETDRV_OBJS := $(NETDRV_OBJS) e2100.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) e2100.o
 endif
 
 ifdef CONFIG_PLIP
@@ -114,7 +132,7 @@
 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<
 
 ifdef CONFIG_DE650
-NETDRV_OBJS := $(NETDRV_OBJS) de650.o
+ETDRV_OBJS := $(NETDRV_OBJS) de650.o
 CONFIG_8390 = CONFIG_8390
 endif
 
@@ -156,6 +174,8 @@
 
 ifdef CONFIG_AT1700
 NETDRV_OBJS := $(NETDRV_OBJS) at1700.o
+else
+MODULES := $(MODULES) at1700.o
 endif
 
 ifdef CONFIG_EL1
@@ -166,6 +186,8 @@
 
 ifdef CONFIG_EL16
 NETDRV_OBJS := $(NETDRV_OBJS) 3c507.o
+else
+MODULES ;= $(MODULES 3c507.o
 endif
 
 ifdef CONFIG_EL3
@@ -234,6 +256,8 @@
 
 ifdef CONFIG_ELPLUS
 NETDRV_OBJS := $(NETDRV_OBJS) 3c505.o
+else
+MODULES := $(MODULES) 3c505.o
 endif
 3c505.o: 3c505.c CONFIG
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(ELP_OPTS) -c $<
@@ -241,6 +265,8 @@
 ifdef CONFIG_AC3200
 NETDRV_OBJS := $(NETDRV_OBJS) ac3200.o
 CONFIG_8390 = CONFIG_8390
+else
+MODULES := $(MODULES) ac3200.o
 endif
 
 ifdef CONFIG_APRICOT
@@ -251,6 +277,8 @@
 
 ifdef CONFIG_DEC_ELCP
 NETDRV_OBJS := $(NETDRV_OBJS) tulip.o
+else
+MODULES := $(MODULES) tulip.o
 endif
 
 ifdef CONFIG_ARCNET
@@ -277,9 +305,12 @@
 else
 MODULES := 8390.o $(MODULES)
 endif
+8390.o: 8390.c 8390.h CONFIG
 
 ifdef CONFIG_EQUALIZER
 NETDRV_OBJS := $(NETDRV_OBJS) eql.o
+else
+MODULES := $(MODULES) eql.o
 endif
 
 net.a: $(NETDRV_OBJS)
@@ -289,10 +320,13 @@
 clean:
 	rm -f core *.o *.a *.s
 
+ifdef MODULES
 dep:
 	$(CPP) -M $(NETDRV_OBJS:.o=.c) > .depend
-ifdef MODULES
 	$(CPP) -M -DMODULE $(MODULES:.o=.c) >> .depend
+else
+dep:
+	$(CPP) -M $(NETDRV_OBJS:.o=.c) > .depend
 endif
 
 tar:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/README.modules linux/drivers/net/README.modules
--- v1.3.16/linux/drivers/net/README.modules	Thu Jan  1 02:00:00 1970
+++ linux/drivers/net/README.modules	Wed Aug  9 09:52:26 1995
@@ -0,0 +1,231 @@
+Wed 2-Aug-95  <matti.aarnio@utu.fi>
+
+		Linux network driver modules
+
+	This is a potpourri of INSMOD-time(*) configuration
+	options (if exist) and their default values of various
+	modules on Linux network drivers collection.
+
+	Do NOT mistake this to "README.modules" at the top-level
+	directory!
+
+	--------------------------
+	(*)	"INSMOD-time" means when you load module with
+		/sbin/insmod  you can feed it optional parameters.
+		See "man insmod".
+	--------------------------
+
+
+3c501.c:
+	io  = 0x280	IO base address
+	irq = 5		IRQ
+	(Probes ports:	0x280, 0x300)
+
+3c503.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x300, 0x310, 0x330, 0x350, 0x250, 0x280, 0x2A0, 0x2E0)
+
+3c505.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x300, 0x280, 0x310)
+
+3c507.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x300, 0x320, 0x340, 0x280)
+
+3c509.c:
+	No parameters (autoprobes)
+	(EISA, and MCA probes in addition to ISA-probes;
+	 ISA probing via PCMCIA AutoConfig (or similar)
+	 via port 0x100.)
+
+8390.c:
+	ei_debug = 0
+	ei_pingpong = 1	  (If no Rx/Tx PINGPONG is desired, set to zero)
+
+ac3200.c:
+	io = 0
+	irq = 0
+	(EISA probing..)
+
+apricot.c:
+	io = 0x300  (Can't be altered!)
+	irq = 10
+
+arcnet.c:
+	io = 0
+	irqnum = 0
+	shmem = 0
+	num = 0
+	(When probing, looks at the following possible addresses:
+	 Suggested ones:
+		0x300, 0x2E0, 0x2F0, 0x2D0
+	 Other ones:
+		0x200, 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x270,
+		0x280, 0x290, 0x2A0, 0x2B0, 0x2C0,
+		       0x310, 0x320, 0x330, 0x340, 0x350, 0x360, 0x370,
+		0x380, 0x390, 0x3A0,			  0x3E0, 0x3F0  )
+
+at1700.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300)
+
+atp.c: *Not modularized*
+	(Probes ports: 0x378, 0x278, 0x3BC;
+	 fixed IRQs: 5 and 7			)
+
+
+auto_irq.c: *Static kernel component*
+
+
+de4x5.c:
+	io = 0x000b
+	irq = 10
+	is_not_dec = 0  -- For SMC card using DEC 21140 set this to 1
+	(EISA, and PCI probing)
+
+de600.c:
+	de600_debug = 0
+	(On port 0x378, irq 7 -- lpt1;  compile time configurable)
+
+de620.c:
+	bnc = 0, utp = 0  <-- Force media by setting either.
+	io = 0x378	(also compile-time configurable)
+	irq = 7
+
+depca.c:
+	io = 0x200
+	irq = 7
+	(Probes ports:	ISA:  0x300, 0x200;
+			EISA: 0x0c00		)
+
+dummy.c:
+	No options
+
+e2100.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x300, 0x280, 0x380, 0x220)
+
+eepro.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0x360)
+
+eexpress.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x300, 0x270, 0x320, 0x340)
+
+eql.c:
+	(No parameters)
+
+ewrk3.c:
+	io = 0x300
+	irq = 5
+	(With module no autoprobing!
+	 On EISA-bus does EISA probing.
+	 Static linkage probes ports on ISA bus:
+		0x100, 0x120, 0x140, 0x160, 0x180, 0x1A0, 0x1C0,
+		0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0,
+		0x300,        0x340, 0x360, 0x380, 0x3A0, 0x3C0)
+
+hp-plus.c:
+	io = 0
+	irq = 0
+	(Probes ports: 0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340)
+
+hp.c:
+	io = 0
+	irq = 0
+	ne8390_rw_bugfix = 0
+	(Probes ports: 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240)
+
+hp100.c:
+	hp100_port = 0 (IO-base address)
+	(Does EISA-probing, if on EISA-slot;
+	 On ISA-bus probes all ports from 0x100 thru to 0x3E0
+	 in increments of 0x020)
+
+ibmtr.c:
+	io = 0
+	(Probes ports: 0xA20, 0xA24 -- Ok, 0x220, 0x224, but IBM style..)
+
+lance.c: *Not modularized*
+	(PCI, and ISA probing; "CONFIG_PCI" needed for PCI support)
+	(Probes ISA ports: 0x300, 0x320, 0x340, 0x360)
+
+loopback.c: *Static kernel component*
+
+ne.c:
+	io = 0
+	irq = 0
+	config_ne_sanity = 0
+	ne8390_rw_bugfix = 0;
+	(Probes ports: 0x300, 0x280, 0x320, 0x340, 0x360)
+
+net_init.c: *Static kernel component*
+
+ni52.c: *Not modularized*
+	(Probes ports:	0x300, 0x280, 0x360, 0x320, 0x340
+		mems:	0xD0000, 0xD2000, 0xC8000, 0xCA000,
+			0xD4000, 0xD6000, 0xD8000 )
+
+ni65.c: *Not modularized*  **16MB MEMORY BARRIER BUG**
+	(Probes ports:	0x300, 0x320, 0x340, 0x360)
+
+pi2.c:	*Not modularized* (well, NON-STANDARD modularization!)
+	Only one card supported at this time.
+	(Probes ports: 0x380, 0x300, 0x320, 0x340, 0x360, 0x3A0)
+
+plip.c:
+	No options; goes to IO=0x278, IRQ=2
+
+ppp.c:
+	No options (ppp-2.2+ has some, this is based on non-dynamic
+	version from ppp-2.1.2d)
+
+seeq8005.c: *Not modularized*
+	(Probes ports: 0x300, 0x320, 0x340, 0x360)
+
+sk_g16.c: *Not modularized*
+	(Probes ports: 0x100, 0x180, 0x208, 0x220m 0x288, 0x320, 0x328, 0x390)
+
+skeleton.c: *Skeleton*
+
+slhc.c:
+	No configuration parameters
+
+slip.c:
+	slip_maxdev = 256 (default value from SL_NRUNIT on slip.h)
+
+
+smc-ultra.c:
+	io = 0
+	irq = 0
+	(Probes ports:	0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380)
+
+tulip.c: *Partial modularization*
+	(init-time memory allocation makes problems..)
+
+tunnel.c:
+	No insmod parameters
+
+wavelan.c:
+	io = 0x390	(Settable, but change not recommended)
+	irq = 0		(Not honoured, if changed..)
+
+wd.c:
+	io = 0
+	irq = 0
+	mem = 0		(Force shared-memory on address 0xC8000, or whatever..)
+	(Probes ports:	0x300, 0x280, 0x380, 0x240,
+	 uses AUTOIRQ)
+
+znet.c: *Not modularized*
+	(Only one device on  Zenith Z-Note (notebook?) systems,
+	 configuration information from (EE)PROM)
diff -u --recursive --new-file v1.3.16/linux/drivers/net/ac3200.c linux/drivers/net/ac3200.c
--- v1.3.16/linux/drivers/net/ac3200.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/ac3200.c	Wed Aug  9 09:52:26 1995
@@ -17,6 +17,10 @@
 static const char *version =
 	"ac3200.c:v1.01 7/1/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -189,6 +193,7 @@
 
 static int ac_open(struct device *dev)
 {
+	int rc;
 #ifdef notyet
 	/* Someday we may enable the IRQ and shared memory here. */
 	int ioaddr = dev->base_addr;
@@ -197,7 +202,14 @@
 		return -EAGAIN;
 #endif
 
-	return ei_open(dev);
+	rc = ei_open(dev);
+	if (rc != 0) return rc;
+
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
+	return 0;
 }
 
 static void ac_reset_8390(struct device *dev)
@@ -260,9 +272,43 @@
 
 	NS8390_init(dev, 0);
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_ac3200 = {
+	"        " /*"ac3200"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ac3200_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_ac3200.base_addr = io;
+	dev_ac3200.irq       = irq;
+	if (register_netdev(&dev_ac3200) != 0) {
+		printk("ac3200: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("ac3200: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_ac3200);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/apricot.c linux/drivers/net/apricot.c
--- v1.3.16/linux/drivers/net/apricot.c	Wed Aug  2 13:21:02 1995
+++ linux/drivers/net/apricot.c	Wed Aug  9 09:52:26 1995
@@ -1020,9 +1020,14 @@
   0x300, 10,
   0, 0, 0, NULL, apricot_probe };
 
+int io = 0x300;
+int irq = 10;
+
 int
 init_module(void)
 {
+  dev_apricot.base_addr = io;
+  dev_apricot.irq       = irq;
   if (register_netdev(&dev_apricot) != 0)
     return -EIO;
   return 0;
diff -u --recursive --new-file v1.3.16/linux/drivers/net/at1700.c linux/drivers/net/at1700.c
--- v1.3.16/linux/drivers/net/at1700.c	Tue Aug  8 12:31:35 1995
+++ linux/drivers/net/at1700.c	Wed Aug  9 09:52:26 1995
@@ -31,6 +31,11 @@
 static const char *version =
 	"at1700.c:v1.12 1/18/95  Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/config.h>
 
 #include <linux/kernel.h>
@@ -356,6 +361,10 @@
 	dev->interrupt = 0;
 	dev->start = 1;
 
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -584,6 +593,10 @@
 	/* Power-down the chip.  Green, green, green! */
 	outb(0x00, ioaddr + CONFIG_1);
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -616,6 +629,36 @@
 	} else
 		outb(2, ioaddr + RX_MODE);	/* Disable promiscuous, use normal mode */
 }
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_at1700 = {
+	"        " /*"at1700"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, at1700_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_at1700.base_addr = io;
+	dev_at1700.irq       = irq;
+	if (register_netdev(&dev_at1700) != 0) {
+		printk("at1700: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("at1700: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_at1700);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/de600.c linux/drivers/net/de600.c
--- v1.3.16/linux/drivers/net/de600.c	Wed Aug  2 13:21:03 1995
+++ linux/drivers/net/de600.c	Wed Aug  9 09:52:26 1995
@@ -849,3 +849,10 @@
 	release_region(DE600_IO, 3);
 }
 #endif /* MODULE */
+/*
+ * Local variables:
+ *  kernel-compile-command: "gcc -D__KERNEL__ -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
+ *  module-compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
+ *  compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
+ * End:
+ */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/de620.c linux/drivers/net/de620.c
--- v1.3.16/linux/drivers/net/de620.c	Wed Aug  2 13:21:03 1995
+++ linux/drivers/net/de620.c	Wed Aug  9 09:52:27 1995
@@ -100,7 +100,7 @@
 #define COUNT_LOOPS
  */
 #endif
-static int bnc, utp;
+static int bnc = 0, utp = 0;
 /*
  * Force media with insmod:
  *	insmod de620.o bnc=1
@@ -151,9 +151,9 @@
 #define DE620_IRQ	7
 #endif
 
-#define DATA_PORT	(DE620_IO)
-#define STATUS_PORT	(DE620_IO + 1)
-#define COMMAND_PORT	(DE620_IO + 2)
+#define DATA_PORT	(dev->base_addr)
+#define STATUS_PORT	(dev->base_addr + 1)
+#define COMMAND_PORT	(dev->base_addr + 2)
 
 #define RUNT 60		/* Too small Ethernet packet */
 #define GIANT 1514	/* largest legal size packet, no fcs */
@@ -189,7 +189,7 @@
 /* Initialization */
 static int	adapter_init(struct device *);
 int		de620_probe(struct device *);
-static int	read_eeprom(void);
+static int	read_eeprom(struct device *);
 
 
 /*
@@ -221,15 +221,15 @@
  * Convenience macros/functions for D-Link DE-620 adapter *
  *                                                        *
  **********************************************************/
-#define de620_tx_buffs() (inb(STATUS_PORT) & (TXBF0 | TXBF1))
-#define de620_flip_ds() NIC_Cmd ^= DS0 | DS1; outb(NIC_Cmd, COMMAND_PORT);
+#define de620_tx_buffs(dd) (inb(STATUS_PORT) & (TXBF0 | TXBF1))
+#define de620_flip_ds(dd) NIC_Cmd ^= DS0 | DS1; outb(NIC_Cmd, COMMAND_PORT);
 
 /* Check for ready-status, and return a nibble (high 4 bits) for data input */
 #ifdef COUNT_LOOPS
 static int tot_cnt;
 #endif
 static inline byte
-de620_ready(void)
+de620_ready(struct device *dev)
 {
 	byte value;
 	register short int cnt = 0;
@@ -244,42 +244,42 @@
 }
 
 static inline void
-de620_send_command(byte cmd)
+de620_send_command(struct device *dev, byte cmd)
 {
-	de620_ready();
+	de620_ready(dev);
 	if (cmd == W_DUMMY)
 		outb(NIC_Cmd, COMMAND_PORT);
 
 	outb(cmd, DATA_PORT);
 
 	outb(NIC_Cmd ^ CS0, COMMAND_PORT);
-	de620_ready();
+	de620_ready(dev);
 	outb(NIC_Cmd, COMMAND_PORT);
 }
 
 static inline void
-de620_put_byte(byte value)
+de620_put_byte(struct device *dev, byte value)
 {
 	/* The de620_ready() makes 7 loops, on the average, on a DX2/66 */
-	de620_ready();
+	de620_ready(dev);
 	outb(value, DATA_PORT);
-	de620_flip_ds();
+	de620_flip_ds(dev);
 }
 
 static inline byte
-de620_read_byte(void)
+de620_read_byte(struct device *dev)
 {
 	byte value;
 
 	/* The de620_ready() makes 7 loops, on the average, on a DX2/66 */
-	value = de620_ready(); /* High nibble */
-	de620_flip_ds();
-	value |= de620_ready() >> 4; /* Low nibble */
+	value = de620_ready(dev); /* High nibble */
+	de620_flip_ds(dev);
+	value |= de620_ready(dev) >> 4; /* Low nibble */
 	return value;
 }
 
 static inline void
-de620_write_block(byte *buffer, int count)
+de620_write_block(struct device *dev, byte *buffer, int count)
 {
 #ifndef LOWSPEED
 	byte uflip = NIC_Cmd ^ (DS0 | DS1);
@@ -296,9 +296,9 @@
 #endif /* COUNT_LOOPS */
 	/* No further optimization useful, the limit is in the adapter. */
 	for ( ; count > 0; --count, ++buffer) {
-		de620_put_byte(*buffer);
+		de620_put_byte(dev,*buffer);
 	}
-	de620_send_command(W_DUMMY);
+	de620_send_command(dev,W_DUMMY);
 #ifdef COUNT_LOOPS
 	/* trial debug output: loops per byte in de620_ready() */
 	printk("WRITE(%d)\n", tot_cnt/((bytes?bytes:1)));
@@ -310,12 +310,12 @@
 		outb(*buffer++, DATA_PORT);
 		outb(dflip, COMMAND_PORT);
 	}
-	de620_send_command(W_DUMMY);
+	de620_send_command(dev,W_DUMMY);
 #endif /* LOWSPEED */
 }
 
 static inline void
-de620_read_block(byte *data, int count)
+de620_read_block(struct device *dev, byte *data, int count)
 {
 #ifndef LOWSPEED
 	byte value;
@@ -332,8 +332,8 @@
 #ifdef LOWSPEED
 	/* No further optimization useful, the limit is in the adapter. */
 	while (count-- > 0) {
-		*data++ = de620_read_byte();
-		de620_flip_ds();
+		*data++ = de620_read_byte(dev);
+		de620_flip_ds(dev);
 	}
 #ifdef COUNT_LOOPS
 	/* trial debug output: loops per byte in de620_ready() */
@@ -350,47 +350,47 @@
 }
 
 static inline void
-de620_set_delay(void)
+de620_set_delay(struct device *dev)
 {
-	de620_ready();
+	de620_ready(dev);
 	outb(W_DFR, DATA_PORT);
 	outb(NIC_Cmd ^ CS0, COMMAND_PORT);
 
-	de620_ready();
+	de620_ready(dev);
 #ifdef LOWSPEED
 	outb(WRITE_DELAY, DATA_PORT);
 #else
 	outb(0, DATA_PORT);
 #endif
-	de620_flip_ds();
+	de620_flip_ds(dev);
 
-	de620_ready();
+	de620_ready(dev);
 #ifdef LOWSPEED
 	outb(READ_DELAY, DATA_PORT);
 #else
 	outb(0, DATA_PORT);
 #endif
-	de620_flip_ds();
+	de620_flip_ds(dev);
 }
 
 static inline void
-de620_set_register(byte reg, byte value)
+de620_set_register(struct device *dev, byte reg, byte value)
 {
-	de620_ready();
+	de620_ready(dev);
 	outb(reg, DATA_PORT);
 	outb(NIC_Cmd ^ CS0, COMMAND_PORT);
 
-	de620_put_byte(value);
+	de620_put_byte(dev, value);
 }
 
 static inline byte
-de620_get_register(byte reg)
+de620_get_register(struct device *dev, byte reg)
 {
 	byte value;
 
-	de620_send_command(reg);
-	value = de620_read_byte();
-	de620_send_command(W_DUMMY);
+	de620_send_command(dev,reg);
+	value = de620_read_byte(dev);
+	de620_send_command(dev,W_DUMMY);
 
 	return value;
 }
@@ -432,7 +432,7 @@
 de620_close(struct device *dev)
 {
 	/* disable recv */
-	de620_set_register(W_TCR, RXOFF);
+	de620_set_register(dev, W_TCR, RXOFF);
 
 	free_irq(DE620_IRQ);
 	irq2dev_map[DE620_IRQ] = NULL;
@@ -469,10 +469,10 @@
 de620_set_multicast_list(struct device *dev, int num_addrs, void *addrs)
 {
 	if (num_addrs) { /* Enable promiscuous mode */
-		de620_set_register(W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
+		de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
 	}
 	else { /* Disable promiscuous mode, use normal mode */
-		de620_set_register(W_TCR, TCR_DEF);
+		de620_set_register(dev, W_TCR, TCR_DEF);
 	}
 }
 
@@ -501,7 +501,7 @@
 		return 0;
 	}
 
-	using_txbuf = de620_tx_buffs(); /* Peek at the adapter */
+	using_txbuf = de620_tx_buffs(dev); /* Peek at the adapter */
 	dev->tbusy = (using_txbuf == (TXBF0 | TXBF1)); /* Boolean! */
 
 	if (dev->tbusy) {	/* Do timeouts, to avoid hangs. */
@@ -537,12 +537,12 @@
 	switch (using_txbuf) {
 	default: /* both are free: use TXBF0 */
 	case TXBF1: /* use TXBF0 */
-		de620_send_command(W_CR | RW0);
+		de620_send_command(dev,W_CR | RW0);
 		using_txbuf |= TXBF0;
 		break;
 
 	case TXBF0: /* use TXBF1 */
-		de620_send_command(W_CR | RW1);
+		de620_send_command(dev,W_CR | RW1);
 		using_txbuf |= TXBF1;
 		break;
 
@@ -552,7 +552,7 @@
 		return 1;
 		break;
 	}
-	de620_write_block(buffer, len);
+	de620_write_block(dev, buffer, len);
 
 	dev->trans_start = jiffies;
 	dev->tbusy = (using_txbuf == (TXBF0 | TXBF1)); /* Boolean! */
@@ -589,7 +589,7 @@
 	dev->interrupt = 1;
 
 	/* Read the status register (_not_ the status port) */
-	irq_status = de620_get_register(R_STS);
+	irq_status = de620_get_register(dev, R_STS);
 
 	PRINTK(("de620_interrupt (%2.2X)\n", irq_status));
 
@@ -601,7 +601,7 @@
 		while (again && (++bogus_count < 100));
 	}
 
-	dev->tbusy = (de620_tx_buffs() == (TXBF0 | TXBF1)); /* Boolean! */
+	dev->tbusy = (de620_tx_buffs(dev) == (TXBF0 | TXBF1)); /* Boolean! */
 
 	dev->interrupt = 0;
 	sti();
@@ -632,12 +632,12 @@
 	PRINTK(("de620_rx_intr: next_rx_page = %d\n", next_rx_page));
 
 	/* Tell the adapter that we are going to read data, and from where */
-	de620_send_command(W_CR | RRN);
-	de620_set_register(W_RSA1, next_rx_page);
-	de620_set_register(W_RSA0, 0);
+	de620_send_command(dev, W_CR | RRN);
+	de620_set_register(dev, W_RSA1, next_rx_page);
+	de620_set_register(dev, W_RSA0, 0);
 
 	/* Deep breath, and away we goooooo */
-	de620_read_block((byte *)&header_buf, sizeof(struct header_buf));
+	de620_read_block(dev, (byte *)&header_buf, sizeof(struct header_buf));
 	PRINTK(("page status=0x%02x, nextpage=%d, packetsize=%d\n",
 	header_buf.status, header_buf.Rx_NextPage, header_buf.Rx_ByteCount));
 
@@ -666,8 +666,8 @@
 		/* Naah, we'll skip this packet. Probably bogus data as well */
 		printk("%s: Page link out of sync! Restoring...\n", dev->name);
 		next_rx_page = header_buf.Rx_NextPage; /* at least a try... */
-		de620_send_command(W_DUMMY);
-		de620_set_register(W_NPRF, next_rx_page);
+		de620_send_command(dev, W_DUMMY);
+		de620_set_register(dev, W_NPRF, next_rx_page);
 		((struct netstats *)(dev->priv))->rx_over_errors++;
 		return 0;
 	}
@@ -691,7 +691,7 @@
 			/* skb->data points to the start of sk_buff data area */
 			buffer = skb_put(skb,size);
 			/* copy the packet into the buffer */
-			de620_read_block(buffer, size);
+			de620_read_block(dev, buffer, size);
 			PRINTK(("Read %d bytes\n", size));
 			skb->protocol=eth_type_trans(skb,dev);
 			netif_rx(skb); /* deliver it "upstairs" */
@@ -702,8 +702,8 @@
 
 	/* Let's peek ahead to see if we have read the last current packet */
 	/* NOTE! We're _not_ checking the 'EMPTY'-flag! This seems better... */
-	curr_page = de620_get_register(R_CPR);
-	de620_set_register(W_NPRF, next_rx_page);
+	curr_page = de620_get_register(dev, R_CPR);
+	de620_set_register(dev, W_NPRF, next_rx_page);
 	PRINTK(("next_rx_page=%d CPR=%d\n", next_rx_page, curr_page));
 
 	return (next_rx_page != curr_page); /* That was slightly tricky... */
@@ -734,19 +734,19 @@
 	if (bnc)
 		EIPRegister = NCTL0;
 
-	de620_send_command(W_CR | RNOP | CLEAR);
-	de620_send_command(W_CR | RNOP);
+	de620_send_command(dev, W_CR | RNOP | CLEAR);
+	de620_send_command(dev, W_CR | RNOP);
 
-	de620_set_register(W_SCR, SCR_DEF);
+	de620_set_register(dev, W_SCR, SCR_DEF);
 	/* disable recv to wait init */
-	de620_set_register(W_TCR, RXOFF);
+	de620_set_register(dev, W_TCR, RXOFF);
 
 	/* Set the node ID in the adapter */
 	for (i = 0; i < 6; ++i) { /* W_PARn = 0xaa + n */
-		de620_set_register(W_PAR0 + i, dev->dev_addr[i]);
+		de620_set_register(dev, W_PAR0 + i, dev->dev_addr[i]);
 	}
 
-	de620_set_register(W_EIP, EIPRegister);
+	de620_set_register(dev, W_EIP, EIPRegister);
 
 	next_rx_page = first_rx_page = DE620_RX_START_PAGE;
 	if (nic_data.RAM_Size)
@@ -754,12 +754,12 @@
 	else /* 64k RAM */
 		last_rx_page = 255;
 
-	de620_set_register(W_SPR, first_rx_page); /* Start Page Register */
-	de620_set_register(W_EPR, last_rx_page);  /* End Page Register */
-	de620_set_register(W_CPR, first_rx_page); /* Current Page Register */
-	de620_send_command(W_NPR | first_rx_page); /* Next Page Register */
-	de620_send_command(W_DUMMY);
-	de620_set_delay();
+	de620_set_register(dev, W_SPR, first_rx_page); /* Start Page Register*/
+	de620_set_register(dev, W_EPR, last_rx_page);  /* End Page Register */
+	de620_set_register(dev, W_CPR, first_rx_page);/*Current Page Register*/
+	de620_send_command(dev, W_NPR | first_rx_page); /* Next Page Register*/
+	de620_send_command(dev, W_DUMMY);
+	de620_set_delay(dev);
 
 	/* Final sanity check: Anybody out there? */
 	/* Let's hope some bits from the statusregister make a good check */
@@ -768,7 +768,7 @@
         /* success:   X     0      0       X      0       0        X     X  */
         /* ignore:   EEDI                RXGOOD                   COLS  LNKS*/
 
-	if (((i = de620_get_register(R_STS)) & CHECK_MASK) != CHECK_OK) {
+	if (((i = de620_get_register(dev, R_STS)) & CHECK_MASK) != CHECK_OK) {
 		printk("Something has happened to the DE-620!  Please check it"
 #ifdef SHUTDOWN_WHEN_LOST
 			" and do a new ifconfig"
@@ -788,7 +788,7 @@
 	}
 
 	/* All OK, go ahead... */
-	de620_set_register(W_TCR, TCR_DEF);
+	de620_set_register(dev, W_TCR, TCR_DEF);
 
 	return 0; /* all ok */
 }
@@ -816,13 +816,13 @@
 
 	/* Initially, configure basic nibble mode, so we can read the EEPROM */
 	NIC_Cmd = DEF_NIC_CMD;
-	de620_set_register(W_EIP, EIPRegister);
+	de620_set_register(dev, W_EIP, EIPRegister);
 
 	/* Anybody out there? */
-	de620_set_register(W_CPR, checkbyte);
-	checkbyte = de620_get_register(R_CPR);
+	de620_set_register(dev, W_CPR, checkbyte);
+	checkbyte = de620_get_register(dev, R_CPR);
 
-	if ((checkbyte != 0xa5) || (read_eeprom() != 0)) {
+	if ((checkbyte != 0xa5) || (read_eeprom(dev) != 0)) {
 		printk(" not identified in the printer port\n");
 		return ENODEV;
 	}
@@ -888,10 +888,10 @@
  *
  * Note: Bitwise serial I/O to/from the EEPROM vi the status _register_!
  */
-#define sendit(data) de620_set_register(W_EIP, data | EIPRegister);
+#define sendit(dev,data) de620_set_register(dev, W_EIP, data | EIPRegister);
 
 static unsigned short
-ReadAWord(int from)
+ReadAWord(struct device *dev, int from)
 {
 	unsigned short data;
 	int nbits;
@@ -899,7 +899,7 @@
 	/* cs   [__~~] SET SEND STATE */
 	/* di   [____]                */
 	/* sck  [_~~_]                */
-	sendit(0); sendit(1); sendit(5); sendit(4);
+	sendit(dev, 0); sendit(dev, 1); sendit(dev, 5); sendit(dev, 4);
 
 	/* Send the 9-bit address from where we want to read the 16-bit word */
 	for (nbits = 9; nbits > 0; --nbits, from <<= 1) {
@@ -907,13 +907,13 @@
 			/* cs    [~~~~] SEND 1 */
 			/* di    [~~~~]        */
 			/* sck   [_~~_]        */
-			sendit(6); sendit(7); sendit(7); sendit(6);
+			sendit(dev, 6); sendit(dev, 7); sendit(dev, 7); sendit(dev, 6);
 		}
 		else {
 			/* cs    [~~~~] SEND 0 */
 			/* di    [____]        */
 			/* sck   [_~~_]        */
-			sendit(4); sendit(5); sendit(5); sendit(4);
+			sendit(dev, 4); sendit(dev, 5); sendit(dev, 5); sendit(dev, 4);
 		}
 	}
 
@@ -922,49 +922,49 @@
 		/* cs    [~~~~] SEND 0 */
 		/* di    [____]        */
 		/* sck   [_~~_]        */
-		sendit(4); sendit(5); sendit(5); sendit(4);
-		data = (data << 1) | ((de620_get_register(R_STS) & EEDI) >> 7);
+		sendit(dev, 4); sendit(dev, 5); sendit(dev, 5); sendit(dev, 4);
+		data = (data << 1) | ((de620_get_register(dev, R_STS) & EEDI) >> 7);
 	}
 	/* cs    [____] RESET SEND STATE */
 	/* di    [____]                  */
 	/* sck   [_~~_]                  */
-	sendit(0); sendit(1); sendit(1); sendit(0);
+	sendit(dev, 0); sendit(dev, 1); sendit(dev, 1); sendit(dev, 0);
 
 	return data;
 }
 
 static int
-read_eeprom(void)
+read_eeprom(struct device *dev)
 {
 	unsigned short wrd;
 
 	/* D-Link Ethernet addresses are in the series  00:80:c8:7X:XX:XX:XX */
-	wrd = ReadAWord(0x1aa);	/* bytes 0 + 1 of NodeID */
+	wrd = ReadAWord(dev, 0x1aa);	/* bytes 0 + 1 of NodeID */
 	if (wrd != htons(0x0080)) /* Valid D-Link ether sequence? */
 		return -1; /* Nope, not a DE-620 */
 	nic_data.NodeID[0] = wrd & 0xff;
 	nic_data.NodeID[1] = wrd >> 8;
 
-	wrd = ReadAWord(0x1ab);	/* bytes 2 + 3 of NodeID */
+	wrd = ReadAWord(dev, 0x1ab);	/* bytes 2 + 3 of NodeID */
 	if ((wrd & 0xff) != 0xc8) /* Valid D-Link ether sequence? */
 		return -1; /* Nope, not a DE-620 */
 	nic_data.NodeID[2] = wrd & 0xff;
 	nic_data.NodeID[3] = wrd >> 8;
 
-	wrd = ReadAWord(0x1ac);	/* bytes 4 + 5 of NodeID */
+	wrd = ReadAWord(dev, 0x1ac);	/* bytes 4 + 5 of NodeID */
 	nic_data.NodeID[4] = wrd & 0xff;
 	nic_data.NodeID[5] = wrd >> 8;
 
-	wrd = ReadAWord(0x1ad);	/* RAM size in pages (256 bytes). 0 = 64k */
+	wrd = ReadAWord(dev, 0x1ad);	/* RAM size in pages (256 bytes). 0 = 64k */
 	nic_data.RAM_Size = (wrd >> 8);
 
-	wrd = ReadAWord(0x1ae);	/* hardware model (CT = 3) */
+	wrd = ReadAWord(dev, 0x1ae);	/* hardware model (CT = 3) */
 	nic_data.Model = (wrd & 0xff);
 
-	wrd = ReadAWord(0x1af); /* media (indicates BNC/UTP) */
+	wrd = ReadAWord(dev, 0x1af); /* media (indicates BNC/UTP) */
 	nic_data.Media = (wrd & 0xff);
 
-	wrd = ReadAWord(0x1a8); /* System Configuration Register */
+	wrd = ReadAWord(dev, 0x1a8); /* System Configuration Register */
 	nic_data.SCR = (wrd >> 8);
 
 	return 0; /* no errors */
@@ -977,13 +977,18 @@
  */
 #ifdef MODULE
 char kernel_version[] = UTS_RELEASE;
-static char nullname[8];
+static char nullname[8] = "";
 static struct device de620_dev = {
 	nullname, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, de620_probe };
 
+int de620_io  = DE620_IO;
+int de620_irq = DE620_IRQ;
+
 int
 init_module(void)
 {
+	de620_dev.base_addr = de620_io;
+	de620_dev.irq       = de620_irq;
 	if (register_netdev(&de620_dev) != 0)
 		return -EIO;
 	return 0;
@@ -993,7 +998,7 @@
 cleanup_module(void)
 {
 	unregister_netdev(&de620_dev);
-	release_region(DE620_IO, 3);
+	release_region(de620_dev.base_addr, 3);
 }
 #endif /* MODULE */
 
@@ -1004,4 +1009,11 @@
  *	gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 \
  *	 -fomit-frame-pointer -m486 \
  *	-I/usr/src/linux/include -I../../net/inet -c de620.c
+*/
+/*
+ * Local variables:
+ *  kernel-compile-command: "gcc -D__KERNEL__ -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
+ *  module-compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
+ *  compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
+ * End:
  */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/e2100.c linux/drivers/net/e2100.c
--- v1.3.16/linux/drivers/net/e2100.c	Wed Aug  2 13:21:03 1995
+++ linux/drivers/net/e2100.c	Wed Aug  9 09:52:27 1995
@@ -34,6 +34,11 @@
 static const char *version =
 	"e2100.c:v1.01 7/21/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -233,6 +238,7 @@
 e21_open(struct device *dev)
 {
 	short ioaddr = dev->base_addr;
+	int rc;
 
 	if (request_irq(dev->irq, ei_interrupt, 0, "e2100")) {
 		return EBUSY;
@@ -248,7 +254,12 @@
 	inb(ioaddr + E21_MEM_BASE);
 	outb(0, ioaddr + E21_ASIC + ((dev->mem_start >> 17) & 7));
 
-	return ei_open(dev);
+	rc = ei_open(dev);
+	if (rc != 0) return rc;
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+	return 0;
 }
 
 static void
@@ -331,6 +342,10 @@
 	   really bad things happen if it isn't. */
 	mem_off(ioaddr);
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
 
@@ -339,6 +354,36 @@
 {"e21", e21_probe1, E21_IO_EXTENT, e21_probe_list};
 #endif
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_e2100 = {
+	"        " /*"e2100"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, e2100_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_e2100.base_addr = io;
+	dev_e2100.irq       = irq;
+	if (register_netdev(&dev_e2100) != 0) {
+		printk("e2100: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("e2100: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_e2100);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/eepro.c linux/drivers/net/eepro.c
--- v1.3.16/linux/drivers/net/eepro.c	Wed Aug  2 13:21:03 1995
+++ linux/drivers/net/eepro.c	Wed Aug  9 09:52:27 1995
@@ -1137,9 +1137,15 @@
 static struct device dev_eepro = {
 	"        " /*"eepro"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, eepro_probe };
 
+int io = 0;
+int irq = 0;
+
 int
 init_module(void)
 {
+	dev_eepro.base_addr = io;
+	dev_eepro.irq       = irq;
+
 	if (register_netdev(&dev_eepro) != 0)
 		return -EIO;
 	return 0;
diff -u --recursive --new-file v1.3.16/linux/drivers/net/eql.c linux/drivers/net/eql.c
--- v1.3.16/linux/drivers/net/eql.c	Wed Aug  2 13:21:03 1995
+++ linux/drivers/net/eql.c	Wed Aug  9 09:52:27 1995
@@ -19,8 +19,6 @@
 static const char *version = 
 	"Equalizer: $Revision: 3.12 $ $Date: 1995/01/19 $ Simon Janes (simon@ncm.com)\n";
 
-#include <linux/config.h>
-
 /*
  * Sources:
  *   skeleton.c by Donald Becker.
@@ -104,6 +102,12 @@
  *
  */
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
+#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/types.h>
@@ -283,6 +287,9 @@
 	eql->timer_on = 1;
 	add_timer (&eql->timer);
 
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
 	return 0;
       }
   return 1;
@@ -307,6 +314,10 @@
 
   eql_delete_slave_queue (eql->queue);
 
+#ifdef MODULE
+  MOD_DEC_USE_COUNT;
+#endif
+
   return 0;
 }
 
@@ -1164,6 +1175,32 @@
       add_timer (&eql->timer);
     }
 }
+
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_eql = {
+	"eql", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, eql_init };
+
+int init_module(void)
+{
+	if (register_netdev(&dev_eql) != 0) {
+		printk("eql: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("eql: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_eql);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local Variables: 
diff -u --recursive --new-file v1.3.16/linux/drivers/net/hp-plus.c linux/drivers/net/hp-plus.c
--- v1.3.16/linux/drivers/net/hp-plus.c	Wed Aug  2 13:21:04 1995
+++ linux/drivers/net/hp-plus.c	Wed Aug  9 09:52:27 1995
@@ -21,6 +21,11 @@
 static const char *version =
 "hp-plus.c:v1.10 9/24/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/string.h>		/* Important -- this inlines word moves. */
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -92,7 +97,7 @@
 	EnableIRQ = 4, FakeIntr = 8, BootROMEnb = 0x10, IOEnb = 0x20,
 	MemEnable = 0x40, ZeroWait = 0x80, MemDisable = 0x1000, };
 
-int hpplus_probe(struct device *dev);
+int hp_plus_probe(struct device *dev);
 int hpp_probe1(struct device *dev, int ioaddr);
 
 static void hpp_reset_8390(struct device *dev);
@@ -362,6 +367,36 @@
 	return;
 }
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_hp = {
+	"        " /*"hp"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, hp_plus_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_hp.base_addr = io;
+	dev_hp.irq       = irq;
+	if (register_netdev(&dev_hp) != 0) {
+		printk("hp: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("hp: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_hp);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/hp.c linux/drivers/net/hp.c
--- v1.3.16/linux/drivers/net/hp.c	Wed Aug  2 13:21:04 1995
+++ linux/drivers/net/hp.c	Wed Aug  9 09:52:27 1995
@@ -21,6 +21,12 @@
 static const char *version =
 	"hp.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -66,6 +72,9 @@
 /* My default is IRQ5	   0  1	 2  3  4  5  6	7  8  9 10 11 */
 static char irqmap[16] = { 0, 0, 4, 6, 8,10, 0,14, 0, 4, 2,12,0,0,0,0};
 
+/* NE2000, et.al. bug-fix code */
+static int ne8390_rw_bugfix = 0;
+
 
 /*	Probe for an HP LAN adaptor.
 	Also initialize the card and fill in STATION_ADDR with the station
@@ -266,18 +275,19 @@
 	/* We should already be in page 0, but to be safe... */
 	outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base);
 
-#ifdef ei8390_bug
-	/* Handle the read-before-write bug the same way as the
-	   Crynwr packet driver -- the NatSemi method doesn't work. */
-	outb_p(0x42, nic_base + EN0_RCNTLO);
-	outb_p(0,	nic_base + EN0_RCNTHI);
-	outb_p(0xff, nic_base + EN0_RSARLO);
-	outb_p(0x00, nic_base + EN0_RSARHI);
-	outb_p(E8390_RREAD+E8390_START, EN_CMD);
-	/* Make certain that the dummy read has occurred. */
-	inb_p(0x61);
-	inb_p(0x61);
-#endif
+	if (ne8390_rw_bugfix) {
+		/* Handle the read-before-write bug the same way as the
+		   Crynwr packet driver -- the NatSemi method doesn't work. */
+		outb_p(0x42, nic_base + EN0_RCNTLO);
+		outb_p(0,	nic_base + EN0_RCNTHI);
+		outb_p(0xff, nic_base + EN0_RSARLO);
+		outb_p(0x00, nic_base + EN0_RSARHI);
+#define NE_CMD	 	0x00
+		outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
+		/* Make certain that the dummy read has occurred. */
+		inb_p(0x61);
+		inb_p(0x61);
+	}
 
 	outb_p(count & 0xff, nic_base + EN0_RCNTLO);
 	outb_p(count >> 8,	 nic_base + EN0_RCNTHI);
@@ -318,6 +328,36 @@
 	return;
 }
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_hp = {
+	"        " /*"hp"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, hp_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_hp.base_addr = io;
+	dev_hp.irq       = irq;
+	if (register_netdev(&dev_hp) != 0) {
+		printk("hp: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("hp: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_hp);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/ibmtr.c linux/drivers/net/ibmtr.c
--- v1.3.16/linux/drivers/net/ibmtr.c	Tue Aug  8 12:31:36 1995
+++ linux/drivers/net/ibmtr.c	Wed Aug  9 09:52:27 1995
@@ -30,6 +30,11 @@
       active adapter is identified.
 */
 	
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #define NO_AUTODETECT 1
 #undef NO_AUTODETECT
 #undef ENABLE_PAGING
@@ -483,6 +488,11 @@
       dev->start=1;
       /*  NEED to see smem size *AND* reset high 512 bytes if
           needed */
+
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
       return 0;
    }
 	else 
@@ -505,6 +515,10 @@
 
 	if(close_adapter->ret_code)
 		DPRINTK("close adapter failed: %02X\n",close_adapter->ret_code);
+
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
 	
 	return 0;
 }
@@ -1181,3 +1195,33 @@
   toki=(struct tok_info *) dev->priv;
   return (struct enet_statistics *) &toki->tr_stats;
 }
+
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_ibmtr = {
+	"        " /*"ibmtr"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, tok_probe };
+
+int io = 0;
+
+int init_module(void)
+{
+	dev_ibmtr.base_addr = io;
+	dev_ibmtr.irq       = 0;
+	if (register_netdev(&dev_ibmtr) != 0) {
+		printk("ibmtr: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("ibmtr: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_ibmtr);
+	}
+}
+#endif /* MODULE */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/ne.c linux/drivers/net/ne.c
--- v1.3.16/linux/drivers/net/ne.c	Wed Aug  2 13:21:04 1995
+++ linux/drivers/net/ne.c	Wed Aug  9 09:52:27 1995
@@ -29,6 +29,12 @@
 static const char *version =
     "ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -45,9 +51,19 @@
 
 /* Do we perform extra sanity checks on stuff ? */
 /* #define CONFIG_NE_SANITY */
+#ifdef CONFIG_NE_SANITY
+static int config_ne_sanity = 1;
+#else
+static int config_ne_sanity = 0;
+#endif
 
 /* Do we implement the read before write bugfix ? */
 /* #define CONFIG_NE_RW_BUGFIX */
+#ifdef CONFIG_NE_RW_BUGFIX
+static int ne8390_rw_bugfix = 1;
+#else
+static int ne8390_rw_bugfix = 0;
+#endif
 
 /* ---- No user-serviceable parts below ---- */
 
@@ -371,10 +387,9 @@
 static int
 ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
 {
-#ifdef CONFIG_NE_SANITY
-    int xfer_count = count;
-#endif
     int nic_base = dev->base_addr;
+    /* CONFIG_NE_SANITY */
+    int xfer_count = count;
 
     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
     if (ei_status.dmaing) {
@@ -396,9 +411,8 @@
       insw(NE_BASE + NE_DATAPORT,buf,count>>1);
       if (count & 0x01) {
 	buf[count-1] = inb(NE_BASE + NE_DATAPORT);
-#ifdef CONFIG_NE_SANITY
+	/* CONFIG_NE_SANITY */
 	xfer_count++;
-#endif
       }
     } else {
 	insb(NE_BASE + NE_DATAPORT, buf, count);
@@ -408,8 +422,8 @@
        been encountering problems so it is still here.  If you see
        this message you either 1) have a slightly incompatible clone
        or 2) have noise/speed problems with your bus. */
-#ifdef CONFIG_NE_SANITY
-    if (ei_debug > 1) {		/* DMA termination address check... */
+    if (config_ne_sanity &&
+	ei_debug > 1) {		/* DMA termination address check... */
 	int addr, tries = 20;
 	do {
 	    /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
@@ -425,7 +439,6 @@
 		   "%#4.4x (expected) vs. %#4.4x (actual).\n",
 		   dev->name, ring_offset + xfer_count, addr);
     }
-#endif
     outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */
     ei_status.dmaing &= ~0x01;
     return ring_offset + count;
@@ -435,11 +448,10 @@
 ne_block_output(struct device *dev, int count,
 		const unsigned char *buf, const int start_page)
 {
-#ifdef CONFIG_NE_SANITY
-    int retries = 0;
-#endif
     int nic_base = NE_BASE;
     unsigned long dma_start;
+    /* CONFIG_NE_SANITY */
+    int retries = 0;
 
     /* Round the count up for word writes.  Do we need to do this?
        What effect will an odd byte count have on the 8390?
@@ -460,25 +472,23 @@
     /* We should already be in page 0, but to be safe... */
     outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
 
-#ifdef CONFIG_NE_SANITY
  retry:
-#endif
 
-#ifdef CONFIG_NE_RW_BUGFIX 
-    /* Handle the read-before-write bug the same way as the
-       Crynwr packet driver -- the NatSemi method doesn't work.
-       Actually this doesn't always work either, but if you have
-       problems with your NEx000 this is better than nothing! */
-    outb_p(0x42, nic_base + EN0_RCNTLO);
-    outb_p(0x00,   nic_base + EN0_RCNTHI);
-    outb_p(0x42, nic_base + EN0_RSARLO);
-    outb_p(0x00, nic_base + EN0_RSARHI);
-    outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
-    /* Make certain that the dummy read has occurred. */
-    SLOW_DOWN_IO;
-    SLOW_DOWN_IO;
-    SLOW_DOWN_IO;
-#endif  /* rw_bugfix */
+    if (ne8390_rw_bugfix) { 
+	/* Handle the read-before-write bug the same way as the
+	   Crynwr packet driver -- the NatSemi method doesn't work.
+	   Actually this doesn't always work either, but if you have
+	   problems with your NEx000 this is better than nothing! */
+	outb_p(0x42, nic_base + EN0_RCNTLO);
+	outb_p(0x00,   nic_base + EN0_RCNTHI);
+	outb_p(0x42, nic_base + EN0_RSARLO);
+	outb_p(0x00, nic_base + EN0_RSARHI);
+	outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
+	/* Make certain that the dummy read has occurred. */
+	SLOW_DOWN_IO;
+	SLOW_DOWN_IO;
+	SLOW_DOWN_IO;
+    }
 
     outb_p(ENISR_RDC, nic_base + EN0_ISR);
 
@@ -497,10 +507,10 @@
 
     dma_start = jiffies;
 
-#ifdef CONFIG_NE_SANITY
     /* This was for the ALPHA version only, but enough people have
        been encountering problems so it is still here. */
-    if (ei_debug > 1) {		/* DMA termination address check... */
+    if (config_ne_sanity &&
+	ei_debug > 1) {		/* DMA termination address check... */
 	int addr, tries = 20;
 	do {
 	    int high = inb_p(nic_base + EN0_RSARHI);
@@ -517,7 +527,6 @@
 		goto retry;
 	}
     }
-#endif
 
     while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
 	if (jiffies - dma_start > 2*HZ/100) {		/* 20ms */
@@ -532,6 +541,34 @@
     return;
 }
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_ne2000 = {
+	"        " /*"ne2000"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ne_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_ne2000.base_addr = io;
+	dev_ne2000.irq       = irq;
+	if (register_netdev(&dev_ne2000) != 0)
+		return -EIO;
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("ne2000: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_ne2000);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/plip.c linux/drivers/net/plip.c
--- v1.3.16/linux/drivers/net/plip.c	Wed Aug  2 13:21:04 1995
+++ linux/drivers/net/plip.c	Wed Aug  9 09:52:27 1995
@@ -470,7 +470,9 @@
 		return OK;
 
 	case PLIP_NB_2:
+		break;
 	}
+	return TIMEOUT; /* XX: ?? */
 }
 
 /* PLIP_RECEIVE_PACKET --- receive a packet */
@@ -632,6 +634,7 @@
 		*ns_p = PLIP_NB_BEGIN;
 		return OK;
 	}
+	return TIMEOUT;
 }
 
 /* PLIP_SEND_PACKET --- send a packet */
diff -u --recursive --new-file v1.3.16/linux/drivers/net/slip.c linux/drivers/net/slip.c
--- v1.3.16/linux/drivers/net/slip.c	Tue Aug  8 12:31:37 1995
+++ linux/drivers/net/slip.c	Wed Aug  9 09:52:27 1995
@@ -1120,7 +1120,7 @@
 
 /* Initialize SLIP control device -- register SLIP line discipline */
 #ifdef MODULE
-static int slip_init_ctrl_dev()
+static int slip_init_ctrl_dev(void)
 #else	/* !MODULE */
 int
 slip_init_ctrl_dev(struct device *dummy)
diff -u --recursive --new-file v1.3.16/linux/drivers/net/smc-ultra.c linux/drivers/net/smc-ultra.c
--- v1.3.16/linux/drivers/net/smc-ultra.c	Wed Aug  2 13:21:05 1995
+++ linux/drivers/net/smc-ultra.c	Wed Aug  9 09:52:27 1995
@@ -40,6 +40,12 @@
 static const char *version =
 	"smc-ultra.c:v1.12 1/18/95 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -133,6 +139,8 @@
 
 	if (dev == NULL)
 		dev = init_etherdev(0, sizeof(struct ei_device), 0);
+	if (dev == NULL) /* Still.. */
+		return ENOMEM; /* Out of memory ?? */
 
 	model_name = (idreg & 0xF0) == 0x20 ? "SMC Ultra" : "SMC EtherEZ";
 
@@ -171,7 +179,7 @@
 
 
 	/* OK, we are certain this is going to work.  Setup the device. */
-	request_region(ioaddr, 32, model_name);
+	request_region(ioaddr, ULTRA_IO_EXTENT, model_name);
 
 	/* The 8390 isn't at the base address, so fake the offset */
 	dev->base_addr = ioaddr+ULTRA_NIC_OFFSET;
@@ -215,6 +223,7 @@
 ultra_open(struct device *dev)
 {
 	int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */
+	int rc;
 
 	if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name))
 		return -EAGAIN;
@@ -222,7 +231,12 @@
 	outb(ULTRA_MEMENB, ioaddr);	/* Enable memory, 16 bit mode. */
 	outb(0x80, ioaddr + 5);
 	outb(0x01, ioaddr + 6);		/* Enable interrupts and memory. */
-	return ei_open(dev);
+	rc = ei_open(dev);
+	if (rc != 0) return rc;
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+	return 0;
 }
 
 static void
@@ -302,8 +316,43 @@
 	/* We should someday disable shared memory and change to 8-bit mode
 	   "just in case"... */
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
+
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_ultra = {
+	"        " /*"smc-ultra"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ultra_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_ultra.base_addr = io;
+	dev_ultra.irq       = irq;
+	if (register_netdev(&dev_ultra) != 0) {
+		printk("smc-ultra: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("smc-ultra: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_ultra);
+	}
+}
+#endif /* MODULE */
 
 
 /*
diff -u --recursive --new-file v1.3.16/linux/drivers/net/tulip.c linux/drivers/net/tulip.c
--- v1.3.16/linux/drivers/net/tulip.c	Fri Jul  7 08:54:48 1995
+++ linux/drivers/net/tulip.c	Wed Aug  9 09:52:28 1995
@@ -16,6 +16,11 @@
 
 static char *version = "tulip.c:v0.05 1/20/95 becker@cesdis.gsfc.nasa.gov\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -167,6 +172,7 @@
 
 
 
+#ifndef MODULE
 /* This 21040 probe is unlike most other board probes.  We can use memory
    efficiently by allocating a large contiguous region and dividing it
    ourselves.  This is done by having the initialization occur before
@@ -199,6 +205,14 @@
 
 	return mem_start;
 }
+#endif
+#ifdef MODULE
+static int tulip_probe(struct device *dev)
+{
+	printk("tulip: This driver does not yet install properly from module!\n");
+	return -1;
+}
+#endif
 
 unsigned long tulip_probe1(unsigned long mem_start, int ioaddr, int irq)
 {
@@ -341,6 +355,9 @@
 		printk("%s: Done tulip_open(), CSR0 %8.8x, CSR13 %8.8x.\n",
 			   dev->name, inl(ioaddr + CSR0), inl(ioaddr + CSR13));
 	}
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
 	return 0;
 }
 
@@ -654,6 +671,9 @@
 	free_irq(dev->irq);
 	irq2dev_map[dev->irq] = 0;
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
 	return 0;
 }
 
@@ -727,6 +747,36 @@
 	return 0;
 }
 
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_tulip = {
+	"        " /*"tulip"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, tulip_probe };
+
+int io = 0;
+int irq = 0;
+
+int init_module(void)
+{
+	dev_tulip.base_addr = io;
+	dev_tulip.irq       = irq;
+	if (register_netdev(&dev_tulip) != 0) {
+		printk("tulip: register_netdev() returned non-zero.\n");
+		return -EIO;
+	}
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("tulip: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_tulip);
+	}
+}
+#endif /* MODULE */
 
 /*
  * Local variables:
diff -u --recursive --new-file v1.3.16/linux/drivers/net/wavelan.c linux/drivers/net/wavelan.c
--- v1.3.16/linux/drivers/net/wavelan.c	Wed Aug  2 13:21:05 1995
+++ linux/drivers/net/wavelan.c	Wed Aug  9 13:49:11 1995
@@ -31,6 +31,7 @@
 #include	<linux/skbuff.h>
 #include	<linux/malloc.h>
 #include	<linux/timer.h>
+#include	<linux/proc_fs.h>
 #define	STRUCT_CHECK	1
 #include	"i82586.h"
 #include	"wavelan.h"
@@ -84,6 +85,7 @@
 static int		wavelan_close(device *);
 static en_stats		*wavelan_get_stats(device *);
 static void		wavelan_set_multicast_list(device *, int, void *);
+static int		wavelan_get_info(char*, char**, off_t, int, int);
 
 /*
  * Other forward declarations.
@@ -836,6 +838,10 @@
 		{
 			if (wavelan_debug > 0)
 				printk("%s: <-wavelan_probe(): 0\n", dev->name);
+			proc_net_register(&(struct proc_dir_entry)
+					  { PROC_NET_WAVELAN, wavelan_get_info,
+					      7, "wavelan" });
+
 			return 0;
 		}
 	}
@@ -2108,8 +2114,8 @@
 	);
 }
 
-int
-wavelan_get_info(char *buffer, char **start, off_t offset, int length)
+static int
+wavelan_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	int		len;
 	off_t		begin;
@@ -2170,11 +2176,17 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, wavelan_probe
 };
 
+int io = 0x390; /* Default from above.. */
+int irq = 0;
+
 int
 init_module(void)
 {
+	dev_wavelan.base_addr = io;
+	dev_wavelan.irq       = irq;
 	if (register_netdev(&dev_wavelan) != 0)
 		return -EIO;
+
 	return 0;
 }
 
@@ -2185,6 +2197,7 @@
 		printk("wavelan: device busy, remove delayed\n");
 	else
 	{
+		proc_net_unregister(PROC_NET_WAVELAN);
 		unregister_netdev(&dev_wavelan);
 		kfree_s(dev_wavelan.priv, sizeof(struct net_local));
 		dev_wavelan.priv = NULL;
diff -u --recursive --new-file v1.3.16/linux/drivers/net/wd.c linux/drivers/net/wd.c
--- v1.3.16/linux/drivers/net/wd.c	Wed Aug  2 13:21:05 1995
+++ linux/drivers/net/wd.c	Wed Aug  9 09:52:28 1995
@@ -20,6 +20,11 @@
 static const char *version =
 	"wd.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
 
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -275,6 +280,7 @@
 wd_open(struct device *dev)
 {
   int ioaddr = dev->base_addr - WD_NIC_OFFSET; /* WD_CMDREG */
+  int rc;
 
   /* Map in the shared memory. Always set register 0 last to remain
 	 compatible with very old boards. */
@@ -285,7 +291,12 @@
 	  outb(ei_status.reg5, ioaddr+WD_CMDREG5);
   outb(ei_status.reg0, ioaddr); /* WD_CMDREG */
 
-  return ei_open(dev);
+  rc = ei_open(dev);
+  if (rc != 0) return rc;
+#ifdef MODULE
+  MOD_INC_USE_COUNT;
+#endif
+  return 0;
 }
 
 static void
@@ -376,8 +387,44 @@
 	/* And disable the shared memory. */
 	outb(ei_status.reg0 & ~WD_MEMENB, wd_cmdreg);
 
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
 	return 0;
 }
+
+
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+static struct device dev_wd80x3 = {
+	"        " /*"wd80x3"*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, wd_probe };
+
+int io = 0;
+int irq = 0;
+int mem = 0;
+
+int init_module(void)
+{
+	dev_wd80x3.base_addr = io;
+	dev_wd80x3.irq       = irq;
+	dev_wd80x3.mem_start = mem;
+	if (register_netdev(&dev_wd80x3) != 0)
+		return -EIO;
+	return 0;
+}
+
+void
+cleanup_module(void)
+{
+	if (MOD_IN_USE)
+		printk("wd80x3: device busy, remove delayed\n");
+	else
+	{
+		unregister_netdev(&dev_wd80x3);
+	}
+}
+#endif /* MODULE */
 
 
 /*
diff -u --recursive --new-file v1.3.16/linux/drivers/pci/pci.c linux/drivers/pci/pci.c
--- v1.3.16/linux/drivers/pci/pci.c	Tue Aug  8 12:31:37 1995
+++ linux/drivers/pci/pci.c	Wed Aug  9 12:50:04 1995
@@ -78,6 +78,7 @@
 	DEVICE( INTEL,		INTEL_7116,	"SAA7116"),
 	DEVICE( INTEL,		INTEL_82865,	"82865"),
 	DEVICE( SMC,		SMC_37C665,	"FDC 37C665"),
+	DEVICE( SMC,		SMC_37C922,	"FDC 37C922"),
 	DEVICE( ATI,		ATI_M32,	"Mach 32"),
 	DEVICE( ATI,		ATI_M64,	"Mach 64"),
 	DEVICE( WEITEK,		WEITEK_P9000,	"P9000"),
@@ -138,7 +139,9 @@
 	DEVICE( QLOGIC,		QLOGIC_ISP1022,	"ISP1022"),
 	DEVICE( X,		X_AGX016,	"ITT AGX016"),
 	DEVICE( VORTEX,		VORTEX_GDT,	"GDT 6000b"),
-	DEVICE( HP,		HP_J2585A,	"J2585A")
+	DEVICE( HP,		HP_J2585A,	"J2585A"),
+	DEVICE( MUTECH,		MUTECH_MV1000,	"MV-1000"),
+	DEVICE( TEKRAM,		TEKRAM_DC290,	"DC-290")
 };
 
 
diff -u --recursive --new-file v1.3.16/linux/fs/proc/array.c linux/fs/proc/array.c
--- v1.3.16/linux/fs/proc/array.c	Wed Aug  2 13:21:15 1995
+++ linux/fs/proc/array.c	Wed Aug  9 09:52:28 1995
@@ -696,13 +696,13 @@
 extern int get_module_list(char *);
 extern int get_device_list(char *);
 extern int get_filesystem_list(char *);
-extern int get_ksyms_list(char *);
+extern int get_ksyms_list(char *, char **, off_t, int);
 extern int get_irq_list(char *);
 extern int get_dma_list(char *);
 extern int get_cpuinfo(char *);
 extern int get_pci_list(char*);
 
-static int get_root_array(char * page, int type)
+static int get_root_array(char * page, int type, char **start, off_t offset, int length)
 {
 	switch (type) {
 		case PROC_LOADAVG:
@@ -746,7 +746,7 @@
 			return get_filesystem_list(page);
 
 		case PROC_KSYMS:
-			return get_ksyms_list(page);
+			return get_ksyms_list(page, start, offset, length);
 
 		case PROC_DMA:
 			return get_dma_list(page);
@@ -773,42 +773,57 @@
 }
 
 
-static inline int fill_array(char * page, int pid, int type)
+static inline int fill_array(char * page, int pid, int type, char **start, off_t offset, int length)
 {
 	if (pid)
 		return get_process_array(page, pid, type);
-	return get_root_array(page, type);
+	return get_root_array(page, type, start, offset, length);
 }
 
+#define PROC_BLOCK_SIZE	(3*1024)		/* 4K page size but our output routines use some slack for overruns */
+
 static int array_read(struct inode * inode, struct file * file,char * buf, int count)
 {
 	unsigned long page;
+	char *start;
 	int length;
 	int end;
 	unsigned int type, pid;
 
 	if (count < 0)
 		return -EINVAL;
+	if (count > PROC_BLOCK_SIZE)
+		count = PROC_BLOCK_SIZE;
 	if (!(page = __get_free_page(GFP_KERNEL)))
 		return -ENOMEM;
 	type = inode->i_ino;
 	pid = type >> 16;
 	type &= 0x0000ffff;
-	length = fill_array((char *) page, pid, type);
+	start = NULL;
+	length = fill_array((char *) page, pid, type,
+			    &start, file->f_pos, count);
 	if (length < 0) {
 		free_page(page);
 		return length;
 	}
-	if (file->f_pos >= length) {
-		free_page(page);
-		return 0;
+	if (start != NULL) {
+		/* We have had block-adjusting processing! */
+		memcpy_tofs(buf, start, length);
+		file->f_pos += length;
+		count = length;
+	} else {
+		/* Static 4kB (or whatever) block capacity */
+		if (file->f_pos >= length) {
+			free_page(page);
+			return 0;
+		}
+		if (count + file->f_pos > length)
+			count = length - file->f_pos;
+		end = count + file->f_pos;
+		memcpy_tofs(buf, (char *) page + file->f_pos, count);
+		file->f_pos = end;
 	}
-	if (count + file->f_pos > length)
-		count = length - file->f_pos;
-	end = count + file->f_pos;
-	memcpy_tofs(buf, (char *) page + file->f_pos, count);
 	free_page(page);
-	file->f_pos = end;
 	return count;
 }
 
diff -u --recursive --new-file v1.3.16/linux/fs/proc/base.c linux/fs/proc/base.c
--- v1.3.16/linux/fs/proc/base.c	Sat Jun 10 19:28:16 1995
+++ linux/fs/proc/base.c	Wed Aug  9 09:52:28 1995
@@ -51,18 +51,18 @@
 };
 
 static struct proc_dir_entry base_dir[] = {
-	{ PROC_PID_INO,		1, "." },
-	{ PROC_ROOT_INO,	2, ".." },
-	{ PROC_PID_MEM,		3, "mem" },
-	{ PROC_PID_CWD,		3, "cwd" },
-	{ PROC_PID_ROOT,	4, "root" },
-	{ PROC_PID_EXE,		3, "exe" },
-	{ PROC_PID_FD,		2, "fd" },
-	{ PROC_PID_ENVIRON,	7, "environ" },
-	{ PROC_PID_CMDLINE,	7, "cmdline" },
-	{ PROC_PID_STAT,	4, "stat" },
-	{ PROC_PID_STATM,	5, "statm" },
-	{ PROC_PID_MAPS,	4, "maps" }
+	{ PROC_PID_INO,		NULL,	1, "." },
+	{ PROC_ROOT_INO,	NULL,	2, ".." },
+	{ PROC_PID_MEM,		NULL,	3, "mem" },
+	{ PROC_PID_CWD,		NULL,	3, "cwd" },
+	{ PROC_PID_ROOT,	NULL,	4, "root" },
+	{ PROC_PID_EXE,		NULL,	3, "exe" },
+	{ PROC_PID_FD,		NULL,	2, "fd" },
+	{ PROC_PID_ENVIRON,	NULL,	7, "environ" },
+	{ PROC_PID_CMDLINE,	NULL,	7, "cmdline" },
+	{ PROC_PID_STAT,	NULL,	4, "stat" },
+	{ PROC_PID_STATM,	NULL,	5, "statm" },
+	{ PROC_PID_MAPS,	NULL,	4, "maps" }
 };
 
 #define NR_BASE_DIRENTRY ((sizeof (base_dir))/(sizeof (base_dir[0])))
diff -u --recursive --new-file v1.3.16/linux/fs/proc/inode.c linux/fs/proc/inode.c
--- v1.3.16/linux/fs/proc/inode.c	Wed Aug  2 13:21:15 1995
+++ linux/fs/proc/inode.c	Wed Aug  9 09:52:28 1995
@@ -18,6 +18,7 @@
 #include <asm/segment.h>
 
 extern unsigned long prof_len;
+extern void proc_net_init(void);
 
 void proc_put_inode(struct inode *inode)
 {
@@ -90,6 +91,7 @@
 		return NULL;
 	}
 	parse_options(data, &s->s_mounted->i_uid, &s->s_mounted->i_gid);
+	proc_net_init();
 	return s;
 }
 
@@ -141,22 +143,22 @@
 		return;
 	}
 
-#ifdef CONFIG_IP_ACCT
+/* #ifdef CONFIG_IP_ACCT */
 	/* this file may be opened R/W by root to reset the accounting */
 	if (ino == PROC_NET_IPACCT) {
 		inode->i_mode = S_IFREG | S_IRUGO | S_IWUSR;
 		inode->i_op = &proc_net_inode_operations;
 		return;
 	}
-#endif
-#ifdef CONFIG_IP_FIREWALL
+/* #endif */
+/* #ifdef CONFIG_IP_FIREWALL */
 	/* these files may be opened R/W by root to reset the counters */
 	if ((ino == PROC_NET_IPFWFWD) || (ino == PROC_NET_IPFWBLK)) {
 		inode->i_mode = S_IFREG | S_IRUGO | S_IWUSR;
 		inode->i_op = &proc_net_inode_operations;
 		return;
 	}
-#endif
+/* #endif */
 
 	/* other files within /proc/net */
 	if ((ino >= PROC_NET_UNIX) && (ino < PROC_NET_LAST)) {
diff -u --recursive --new-file v1.3.16/linux/fs/proc/net.c linux/fs/proc/net.c
--- v1.3.16/linux/fs/proc/net.c	Fri Jun 30 16:22:30 1995
+++ linux/fs/proc/net.c	Wed Aug  9 13:49:11 1995
@@ -43,54 +43,6 @@
 			   void *, filldir_t filldir);
 static int proc_lookupnet(struct inode *,const char *,int,struct inode **);
 
-/* the get_*_info() functions are in the net code, and are configured
-   in via the standard mechanism... */
-extern int unix_get_info(char *, char **, off_t, int);
-#ifdef CONFIG_INET
-extern int tcp_get_info(char *, char **, off_t, int);
-extern int udp_get_info(char *, char **, off_t, int);
-extern int raw_get_info(char *, char **, off_t, int);
-extern int arp_get_info(char *, char **, off_t, int);
-extern int rarp_get_info(char *, char **, off_t, int);
-extern int dev_get_info(char *, char **, off_t, int);
-extern int rt_get_info(char *, char **, off_t, int);
-extern int snmp_get_info(char *, char **, off_t, int);
-extern int afinet_get_info(char *, char **, off_t, int);
-#if	defined(CONFIG_WAVELAN)
-extern int wavelan_get_info(char *, char **, off_t, int);
-#endif	/* defined(CONFIG_WAVELAN) */
-#ifdef CONFIG_IP_ACCT
-extern int ip_acct_procinfo(char *, char **, off_t, int, int);
-#endif /* CONFIG_IP_ACCT */
-#ifdef CONFIG_IP_FIREWALL
-extern int ip_fw_blk_procinfo(char *, char **, off_t, int, int);
-extern int ip_fw_fwd_procinfo(char *, char **, off_t, int, int);
-#endif /* CONFIG_IP_FIREWALL */
-extern int ip_msqhst_procinfo(char *, char **, off_t, int);
-extern int ip_mc_procinfo(char *, char **, off_t, int);
-#endif /* CONFIG_INET */
-#ifdef CONFIG_IPX
-extern int ipx_get_info(char *, char **, off_t, int);
-extern int ipx_rt_get_info(char *, char **, off_t, int);
-extern int ipx_get_interface_info(char *, char **, off_t , int);
-#endif /* CONFIG_IPX */
-#ifdef CONFIG_AX25
-extern int ax25_get_info(char *, char **, off_t, int);
-extern int ax25_rt_get_info(char *, char **, off_t, int);
-extern int ax25_cs_get_info(char *, char **, off_t, int);
-#ifdef CONFIG_NETROM
-extern int nr_get_info(char *, char **, off_t, int);
-extern int nr_nodes_get_info(char *, char **, off_t, int);
-extern int nr_neigh_get_info(char *, char **, off_t, int);
-#endif /* CONFIG_NETROM */
-#endif /* CONFIG_AX25 */
-#ifdef CONFIG_ATALK
-extern int atalk_get_info(char *, char **, off_t, int);
-extern int atalk_rt_get_info(char *, char **, off_t, int);
-extern int atalk_if_get_info(char *, char **, off_t, int);
-#endif
-
-
 static struct file_operations proc_net_operations = {
 	NULL,			/* lseek - default */
 	proc_readnet,		/* read - bad */
@@ -125,68 +77,65 @@
 	NULL			/* permission */
 };
 
-static struct proc_dir_entry net_dir[] = {
-	{ PROC_NET,		1, "." },
-	{ PROC_ROOT_INO,	2, ".." },
-	{ PROC_NET_UNIX,	4, "unix" },
-#ifdef CONFIG_INET
-	{ PROC_NET_ARP,		3, "arp" },
-	{ PROC_NET_ROUTE,	5, "route" },
-	{ PROC_NET_DEV,		3, "dev" },
-	{ PROC_NET_RAW,		3, "raw" },
-	{ PROC_NET_TCP,		3, "tcp" },
-	{ PROC_NET_UDP,		3, "udp" },
-	{ PROC_NET_SNMP,	4, "snmp" },
-	{ PROC_NET_SOCKSTAT,	8, "sockstat" },
-#ifdef CONFIG_INET_RARP
-	{ PROC_NET_RARP,	4, "rarp"},
-#endif
-#ifdef CONFIG_IP_MULTICAST
-	{ PROC_NET_IGMP,	4, "igmp"},
-#endif
-#ifdef CONFIG_IP_FIREWALL
-	{ PROC_NET_IPFWFWD,	10, "ip_forward"},
-	{ PROC_NET_IPFWBLK,	8,  "ip_block"},
-#endif
-#ifdef CONFIG_IP_MASQUERADE
-	{ PROC_NET_IPMSQHST,	13, "ip_masquerade"},
-#endif
-#ifdef CONFIG_IP_ACCT
-	{ PROC_NET_IPACCT,	7,  "ip_acct"},
-#endif
-#if	defined(CONFIG_WAVELAN)
-	{ PROC_NET_WAVELAN,	7, "wavelan" },
-#endif	/* defined(CONFIG_WAVELAN) */
-#endif	/* CONFIG_INET */
-#ifdef CONFIG_IPX
-	{ PROC_NET_IPX_ROUTE,	9, "ipx_route" },
-	{ PROC_NET_IPX,		3, "ipx" },
-	{ PROC_NET_IPX_INTERFACE, 13, "ipx_interface" },
-#endif /* CONFIG_IPX */
-#ifdef CONFIG_AX25
-	{ PROC_NET_AX25_ROUTE,	10, "ax25_route" },
-	{ PROC_NET_AX25,	4, "ax25" },
-	{ PROC_NET_AX25_CALLS,	10, "ax25_calls" },
-#ifdef CONFIG_NETROM
-	{ PROC_NET_NR_NODES,	8, "nr_nodes" },
-	{ PROC_NET_NR_NEIGH,	8, "nr_neigh" },
-	{ PROC_NET_NR,		2, "nr" },
-#endif /* CONFIG_NETROM */
-#endif /* CONFIG_AX25 */
-#ifdef CONFIG_ATALK
-	{ PROC_NET_ATALK,	9, "appletalk" },
-	{ PROC_NET_AT_ROUTE,	11,"atalk_route" },
-	{ PROC_NET_ATIF,	11,"atalk_iface" },
-#endif /* CONFIG_ATALK */
-	{ 0, 0, NULL }
+#define NR_MAX_PROC_NET_DIR 100
+static struct proc_dir_entry *net_dir[NR_MAX_PROC_NET_DIR] = {
+	NULL,
 };
 
-#define NR_NET_DIRENTRY ((sizeof (net_dir))/(sizeof (net_dir[0])) - 1)
+static int nr_net_direntry = 0;
+
+int proc_net_register(struct proc_dir_entry *dp)
+{
+	int i;
+
+	for (i = 0; net_dir[i] != NULL; ++i ) ;
+
+	if (i >= NR_MAX_PROC_NET_DIR)
+	  return -ENOMEM;
+
+	net_dir[i] = dp;
+	net_dir[i+1] = NULL; /* Just make sure.. */
+	++nr_net_direntry;
+	return i;
+}
+
+int proc_net_unregister(int ino)
+{
+	int i;
+	for (i = 0; net_dir[i] != NULL && i < nr_net_direntry; ++i)
+	  if (net_dir[i]->low_ino == ino) {
+	    for ( ; net_dir[i] != NULL; ++i )
+	      net_dir[i] = net_dir[i+1];
+	    --nr_net_direntry;
+	    return 0;
+	  }
+	return -ENOENT;
+}
+
+static int dir_get_info(char * a, char ** b, off_t d, int e, int f)
+{
+	return -EISDIR;
+}
+
+void proc_net_init(void)
+{
+	static struct proc_dir_entry
+	  nd_thisdir = { PROC_NET, dir_get_info, 1, "." },
+	  nd_rootdir = { PROC_ROOT_INO, dir_get_info, 1, ".." };
+	static int already = 0;
+
+	if (already) return;
+	already = 1;
+
+	proc_net_register(&nd_thisdir);
+	proc_net_register(&nd_rootdir);
+}
+
 
 static int proc_lookupnet(struct inode * dir,const char * name, int len,
-	struct inode ** result)
+			  struct inode ** result)
 {
-	struct proc_dir_entry *de;
+	struct proc_dir_entry **de;
 
 	*result = NULL;
 	if (!dir)
@@ -195,10 +144,10 @@
 		iput(dir);
 		return -ENOENT;
 	}
-	for (de = net_dir ; de->name ; de++) {
-		if (!proc_match(len, name, de))
+	for (de = net_dir ; (*de)->name ; de++) {
+		if (!proc_match(len, name, *de))
 			continue;
-		*result = iget(dir->i_sb, de->low_ino);
+		*result = iget(dir->i_sb, (*de)->low_ino);
 		iput(dir);
 		if (!*result)
 			return -ENOENT;
@@ -217,8 +166,8 @@
 	if (!inode || !S_ISDIR(inode->i_mode))
 		return -EBADF;
 	ino = inode->i_ino;
-	while (((unsigned) filp->f_pos) < NR_NET_DIRENTRY) {
-		de = net_dir + filp->f_pos;
+	while (((unsigned) filp->f_pos) < nr_net_direntry) {
+		de = net_dir[filp->f_pos];
 		if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino) < 0)
 			break;
 		filp->f_pos++;
@@ -233,142 +182,36 @@
 			char * buf, int count)
 {
 	char * page;
-	int length;
 	unsigned int ino;
 	int bytes=count;
-	int thistime;
+	int i;
 	int copied=0;
 	char *start;
+	struct proc_dir_entry * dp;
 
 	if (count < 0)
 		return -EINVAL;
+	ino = inode->i_ino;
+	for (i = 0; ;i++) {
+		if (i >= NR_MAX_PROC_NET_DIR || (dp = net_dir[i]) == NULL)
+			return -EBADF;
+		if (dp->low_ino == ino)
+			break;
+	}
 	if (!(page = (char*) __get_free_page(GFP_KERNEL)))
 		return -ENOMEM;
-	ino = inode->i_ino;
 
-	while(bytes>0)
+	while (bytes>0)
 	{
-		thistime=bytes;
-		if(bytes>PROC_BLOCK_SIZE)
+		int length, thistime=bytes;
+		if (bytes > PROC_BLOCK_SIZE)
 			thistime=PROC_BLOCK_SIZE;
 
-		switch (ino) 
-		{
-			case PROC_NET_UNIX:
-				length = unix_get_info(page,&start,file->f_pos,thistime);
-				break;
-#ifdef CONFIG_INET
-			case PROC_NET_SOCKSTAT:
-				length = afinet_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_ARP:
-				length = arp_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_ROUTE:
-				length = rt_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_DEV:
-				length = dev_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_RAW:
-				length = raw_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_TCP:
-				length = tcp_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_UDP:
-				length = udp_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_SNMP:
-				length = snmp_get_info(page, &start, file->f_pos,thistime);
-				break;
-#ifdef CONFIG_IP_MULTICAST
-			case PROC_NET_IGMP:
-				length = ip_mc_procinfo(page, &start, file->f_pos,thistime);
-				break;
-#endif
-#ifdef CONFIG_IP_FIREWALL
-			case PROC_NET_IPFWFWD:
-				length = ip_fw_fwd_procinfo(page, &start, file->f_pos,
-					thistime, (file->f_flags & O_ACCMODE) == O_RDWR);
-				break;
-			case PROC_NET_IPFWBLK:
-				length = ip_fw_blk_procinfo(page, &start, file->f_pos,
-					thistime, (file->f_flags & O_ACCMODE) == O_RDWR);
-				break;
-#endif
-#ifdef CONFIG_IP_ACCT
-			case PROC_NET_IPACCT:
-				length = ip_acct_procinfo(page, &start, file->f_pos,
-					thistime, (file->f_flags & O_ACCMODE) == O_RDWR);
-				break;
-#endif
-#ifdef CONFIG_IP_MASQUERADE
-			case PROC_NET_IPMSQHST:
-				length = ip_msqhst_procinfo(page, &start, file->f_pos,thistime);
-				break;
-#endif
-#ifdef CONFIG_INET_RARP				
-			case PROC_NET_RARP:
-				length = rarp_get_info(page,&start,file->f_pos,thistime);
-				break;
-#endif /* CONFIG_INET_RARP */				
-#if	defined(CONFIG_WAVELAN)
-			case PROC_NET_WAVELAN:
-				length = wavelan_get_info(page, &start, file->f_pos, thistime);
-				break;
-#endif	/* defined(CONFIG_WAVELAN) */
-#endif /* CONFIG_INET */
-#ifdef CONFIG_IPX
-			case PROC_NET_IPX_INTERFACE:
-				length = ipx_get_interface_info(page, &start, file->f_pos, thistime);
-				break;
-			case PROC_NET_IPX_ROUTE:
-				length = ipx_rt_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_IPX:
-				length = ipx_get_info(page,&start,file->f_pos,thistime);
-				break;
-#endif /* CONFIG_IPX */
-#ifdef CONFIG_ATALK
-			case PROC_NET_ATALK:
-				length = atalk_get_info(page, &start, file->f_pos, thistime);
-				break;
-			case PROC_NET_AT_ROUTE:
-				length = atalk_rt_get_info(page, &start, file->f_pos, thistime);
-				break;
-			case PROC_NET_ATIF:
-				length = atalk_if_get_info(page, &start, file->f_pos, thistime);
-				break;
-#endif /* CONFIG_ATALK */
-#ifdef CONFIG_AX25
-			case PROC_NET_AX25_ROUTE:
-				length = ax25_rt_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_AX25:
-				length = ax25_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_AX25_CALLS:
-				length = ax25_cs_get_info(page,&start,file->f_pos,thistime);
-				break;
-#ifdef CONFIG_NETROM
-			case PROC_NET_NR_NODES:
-				length = nr_nodes_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_NR_NEIGH:
-				length = nr_neigh_get_info(page,&start,file->f_pos,thistime);
-				break;
-			case PROC_NET_NR:
-				length = nr_get_info(page,&start,file->f_pos,thistime);
-				break;
-#endif /* CONFIG_NETROM */
-#endif /* CONFIG_AX25 */
-
-			default:
-				free_page((unsigned long) page);
-				return -EBADF;
-		}
-		
+		length = dp->get_info(page, &start,
+				      file->f_pos,
+				      thistime,
+				      (file->f_flags & O_ACCMODE) == O_RDWR);
+
 		/*
  		 *	We have been given a non page aligned block of
 		 *	the data we asked for + a bit. We have been given
@@ -381,13 +224,12 @@
  		 *	Copy the bytes
 		 */
 		memcpy_tofs(buf+copied, start, length);
-		file->f_pos+=length;	/* Move down the file */
-		bytes-=length;
-		copied+=length;
-		if(length<thistime)
+		file->f_pos += length;	/* Move down the file */
+		bytes  -= length;
+		copied += length;
+		if (length<thistime)
 			break;	/* End of file */
 	}
 	free_page((unsigned long) page);
 	return copied;
-
 }
diff -u --recursive --new-file v1.3.16/linux/fs/proc/root.c linux/fs/proc/root.c
--- v1.3.16/linux/fs/proc/root.c	Thu Jun 29 19:02:54 1995
+++ linux/fs/proc/root.c	Wed Aug  9 09:52:28 1995
@@ -52,34 +52,34 @@
 };
 
 static struct proc_dir_entry root_dir[] = {
-	{ PROC_ROOT_INO,	1, "." },
-	{ PROC_ROOT_INO,	2, ".." },
-	{ PROC_LOADAVG,		7, "loadavg" },
-	{ PROC_UPTIME,		6, "uptime" },
-	{ PROC_MEMINFO,		7, "meminfo" },
-	{ PROC_KMSG,		4, "kmsg" },
-	{ PROC_VERSION,		7, "version" },
+	{ PROC_ROOT_INO,	NULL,	1, "." },
+	{ PROC_ROOT_INO,	NULL,	2, ".." },
+	{ PROC_LOADAVG,		NULL,	7, "loadavg" },
+	{ PROC_UPTIME,		NULL,	6, "uptime" },
+	{ PROC_MEMINFO,		NULL,	7, "meminfo" },
+	{ PROC_KMSG,		NULL,	4, "kmsg" },
+	{ PROC_VERSION,		NULL,	7, "version" },
 #ifdef CONFIG_PCI
-	{ PROC_PCI,             3, "pci"  },
+	{ PROC_PCI,             NULL,	3, "pci"  },
 #endif
-	{ PROC_CPUINFO,		7, "cpuinfo" },
-	{ PROC_SELF,		4, "self" },	/* will change inode # */
-	{ PROC_NET,		3, "net" },
-   	{ PROC_SCSI,	        4, "scsi" },
+	{ PROC_CPUINFO,		NULL,	7, "cpuinfo" },
+	{ PROC_SELF,		NULL,	4, "self" },	/* will change inode # */
+	{ PROC_NET,		NULL,	3, "net" },
+   	{ PROC_SCSI,	        NULL,	4, "scsi" },
 #ifdef CONFIG_DEBUG_MALLOC
-	{ PROC_MALLOC,		6, "malloc" },
+	{ PROC_MALLOC,		NULL,	6, "malloc" },
 #endif
-	{ PROC_KCORE,		5, "kcore" },
-   	{ PROC_MODULES,		7, "modules" },
-   	{ PROC_STAT,		4, "stat" },
-   	{ PROC_DEVICES,		7, "devices" },
-	{ PROC_INTERRUPTS,	10,"interrupts" },
-   	{ PROC_FILESYSTEMS,	11,"filesystems" },
-   	{ PROC_KSYMS,		5, "ksyms" },
-   	{ PROC_DMA,		3, "dma" },
-	{ PROC_IOPORTS,		7, "ioports"},
+	{ PROC_KCORE,		NULL,	5, "kcore" },
+   	{ PROC_MODULES,		NULL,	7, "modules" },
+   	{ PROC_STAT,		NULL,	4, "stat" },
+   	{ PROC_DEVICES,		NULL,	7, "devices" },
+	{ PROC_INTERRUPTS,	NULL,	10,"interrupts" },
+   	{ PROC_FILESYSTEMS,	NULL,	11,"filesystems" },
+   	{ PROC_KSYMS,		NULL,	5, "ksyms" },
+   	{ PROC_DMA,		NULL,	3, "dma" },
+	{ PROC_IOPORTS,		NULL,	7, "ioports"},
 #ifdef CONFIG_PROFILE
-	{ PROC_PROFILE,		7, "profile"},
+	{ PROC_PROFILE,		NULL,	7, "profile"},
 #endif
 };
 
diff -u --recursive --new-file v1.3.16/linux/fs/proc/scsi.c linux/fs/proc/scsi.c
--- v1.3.16/linux/fs/proc/scsi.c	Wed Aug  2 13:21:15 1995
+++ linux/fs/proc/scsi.c	Wed Aug  9 10:39:06 1995
@@ -84,10 +84,10 @@
 struct proc_dir_entry scsi_hba_dir[(PROC_SCSI_LAST - PROC_SCSI_FILE) * 4]; 
 
 static struct proc_dir_entry scsi_dir2[] = {
-    { PROC_SCSI,		 1, "." },
-    { PROC_ROOT_INO,		 2, ".." },
-    { PROC_SCSI_NOT_PRESENT,	11, "not.present" },
-    { 0, 0, NULL }
+    { PROC_SCSI,		NULL,	 1, "." },
+    { PROC_ROOT_INO,		NULL,	 2, ".." },
+    { PROC_SCSI_NOT_PRESENT,	NULL,	11, "not.present" },
+    { 0,			NULL,	 0, NULL }
 };
 
 inline static uint count_dir_entries(uint inode, uint *num)
diff -u --recursive --new-file v1.3.16/linux/include/linux/etherdevice.h linux/include/linux/etherdevice.h
--- v1.3.16/linux/include/linux/etherdevice.h	Tue Aug  8 12:31:41 1995
+++ linux/include/linux/etherdevice.h	Wed Aug  9 09:52:28 1995
@@ -37,7 +37,7 @@
 extern void 		eth_header_cache(struct device *dev, struct sock *sk, unsigned long saddr, unsigned long daddr);
 extern void		eth_copy_and_sum(struct sk_buff *dest,
 				unsigned char *src, int length, int base);
-
+extern struct device	* init_etherdev(struct device *, int, unsigned long*);
 
 #endif
 
diff -u --recursive --new-file v1.3.16/linux/include/linux/ioctl.h linux/include/linux/ioctl.h
--- v1.3.16/linux/include/linux/ioctl.h	Fri Jun 16 22:02:55 1995
+++ linux/include/linux/ioctl.h	Wed Aug  9 09:52:25 1995
@@ -6,6 +6,7 @@
 #ifndef _LINUX_IOCTL_H
 #define _LINUX_IOCTL_H
 
+#include <asm/page.h>		/* for PAGE_SIZE */
 
 /* ioctl command encoding: 32 bits total, command in lower 16 bits,
  * size of the parameter structure in the lower 14 bits of the
@@ -23,7 +24,7 @@
 #define IOC_INOUT	(IOC_IN | IOC_OUT)	/* both */
 #define IOCSIZE_MASK	0x3fff0000	/* size (max 16k-1 bytes) */
 #define IOCSIZE_SHIFT	16		/* how to get the size */
-#define IOCSIZE_MAX	((PAGE_SIZE-1)&(IOCSIZE_MASK >> IOC_SHIFT))
+#define IOCSIZE_MAX	((PAGE_SIZE-1)&(IOCSIZE_MASK >> IOCSIZE_SHIFT))
 #define IOCCMD_MASK	0x0000ffff	/* command code */
 #define IOCCMD_SHIFT	0
 #define IOCPARM_MASK IOCCMD_MASK
diff -u --recursive --new-file v1.3.16/linux/include/linux/netdevice.h linux/include/linux/netdevice.h
--- v1.3.16/linux/include/linux/netdevice.h	Tue Aug  8 12:31:42 1995
+++ linux/include/linux/netdevice.h	Wed Aug  9 09:52:28 1995
@@ -210,7 +210,7 @@
 extern int		in_net_bh(void);
 extern void		net_bh(void *tmp);
 extern void		dev_tint(struct device *dev);
-extern int		dev_get_info(char *buffer, char **start, off_t offset, int length);
+extern int		dev_get_info(char *buffer, char **start, off_t offset, int length, int dummy);
 extern int		dev_ioctl(unsigned int cmd, void *);
 
 extern void		dev_init(void);
diff -u --recursive --new-file v1.3.16/linux/include/linux/pci.h linux/include/linux/pci.h
--- v1.3.16/linux/include/linux/pci.h	Tue Aug  8 12:31:42 1995
+++ linux/include/linux/pci.h	Wed Aug  9 13:04:09 1995
@@ -272,6 +272,7 @@
 
 #define PCI_VENDOR_ID_SMC		0x1042
 #define PCI_DEVICE_ID_SMC_37C665	0x1000
+#define PCI_DEVICE_ID_SMC_37C922	0x1001
 
 #define PCI_VENDOR_ID_ATI		0x1002
 #define PCI_DEVICE_ID_ATI_M32		0x4158
@@ -403,6 +404,12 @@
 
 #define PCI_VENDOR_ID_HP		0x103c
 #define PCI_DEVICE_ID_HP_J2585A		0x1030
+
+#define PCI_VENDOR_ID_TEKRAM		0x1de1
+#define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
+
+#define PCI_VENDOR_ID_MUTECH		0x1159
+#define PCI_DEVICE_ID_MUTECH_MV1000	0x0001
 
 /*
  * The PCI interface treats multi-function devices as independent
diff -u --recursive --new-file v1.3.16/linux/include/linux/proc_fs.h linux/include/linux/proc_fs.h
--- v1.3.16/linux/include/linux/proc_fs.h	Wed Aug  2 13:21:16 1995
+++ linux/include/linux/proc_fs.h	Wed Aug  9 09:52:28 1995
@@ -8,6 +8,10 @@
  * The proc filesystem constants/structures
  */
 
+/*
+ * We always define these enumerators
+ */
+
 enum root_directory_inos {
 	PROC_ROOT_INO = 1,
 	PROC_LOADAVG,
@@ -20,9 +24,7 @@
 	PROC_SELF,	/* will change inode # */
 	PROC_NET,
         PROC_SCSI,
-#ifdef CONFIG_DEBUG_MALLOC
 	PROC_MALLOC,
-#endif
 	PROC_KCORE,
 	PROC_MODULES,
 	PROC_STAT,
@@ -55,7 +57,6 @@
 
 enum net_directory_inos {
 	PROC_NET_UNIX = 128,
-#ifdef CONFIG_INET
 	PROC_NET_ARP,
 	PROC_NET_ROUTE,
 	PROC_NET_DEV,
@@ -63,46 +64,25 @@
 	PROC_NET_TCP,
 	PROC_NET_UDP,
 	PROC_NET_SNMP,
-#ifdef CONFIG_INET_RARP
 	PROC_NET_RARP,
-#endif
-#ifdef CONFIG_IP_MULTICAST
 	PROC_NET_IGMP,
-#endif
-#ifdef CONFIG_IP_FIREWALL
 	PROC_NET_IPFWFWD,
 	PROC_NET_IPFWBLK,
-#endif
-#ifdef CONFIG_IP_ACCT
 	PROC_NET_IPACCT,
-#endif
-#ifdef CONFIG_IP_MASQUERADE
 	PROC_NET_IPMSQHST,
-#endif
-#if	defined(CONFIG_WAVELAN)
 	PROC_NET_WAVELAN,
-#endif	/* defined(CONFIG_WAVELAN) */
-#endif
-#ifdef CONFIG_IPX
 	PROC_NET_IPX_INTERFACE,
 	PROC_NET_IPX_ROUTE,
 	PROC_NET_IPX,
-#endif
-#ifdef CONFIG_ATALK
 	PROC_NET_ATALK,
 	PROC_NET_AT_ROUTE,
 	PROC_NET_ATIF,
-#endif
-#ifdef CONFIG_AX25
 	PROC_NET_AX25_ROUTE,
 	PROC_NET_AX25,
 	PROC_NET_AX25_CALLS,
-#ifdef CONFIG_NETROM
 	PROC_NET_NR_NODES,
 	PROC_NET_NR_NEIGH,
 	PROC_NET_NR,
-#endif
-#endif
 	PROC_NET_SOCKSTAT,
 	PROC_NET_LAST
 };
@@ -138,6 +118,7 @@
 
 struct proc_dir_entry {
 	unsigned short low_ino;
+	int (*get_info)(char *, char **, off_t, int, int);
 	unsigned short namelen;
 	const char * name;
 };
@@ -149,6 +130,8 @@
 extern void proc_read_inode(struct inode *);
 extern void proc_write_inode(struct inode *);
 extern int proc_match(int, const char *, struct proc_dir_entry *);
+extern int proc_net_register(struct proc_dir_entry *);
+extern int proc_net_unregister(int);
 
 extern struct inode_operations proc_root_inode_operations;
 extern struct inode_operations proc_base_inode_operations;
diff -u --recursive --new-file v1.3.16/linux/include/linux/socket.h linux/include/linux/socket.h
--- v1.3.16/linux/include/linux/socket.h	Tue Aug  8 12:31:42 1995
+++ linux/include/linux/socket.h	Wed Aug  9 12:00:05 1995
@@ -64,6 +64,9 @@
 
 #define PF_MAX		AF_MAX
 
+/* Maximum queue length specificable by listen.  */
+#define SOMAXCONN	128
+
 /* Flags we can use with send/ and recv. */
 #define MSG_OOB		1
 #define MSG_PEEK	2
diff -u --recursive --new-file v1.3.16/linux/include/net/arp.h linux/include/net/arp.h
--- v1.3.16/linux/include/net/arp.h	Fri Jul  7 08:54:55 1995
+++ linux/include/net/arp.h	Wed Aug  9 09:52:28 1995
@@ -10,7 +10,7 @@
 extern int	arp_query(unsigned char *haddr, u32 paddr, unsigned short type);
 extern int	arp_find(unsigned char *haddr, u32 paddr,
 		struct device *dev, u32 saddr, struct sk_buff *skb);
-extern int	arp_get_info(char *buffer, char **start, off_t origin, int length);
+extern int	arp_get_info(char *buffer, char **start, off_t origin, int length, int dummy);
 extern int	arp_ioctl(unsigned int cmd, void *arg);
 extern void     arp_send(int type, int ptype, u32 dest_ip, 
 			 struct device *dev, u32 src_ip, 
diff -u --recursive --new-file v1.3.16/linux/include/net/ax25.h linux/include/net/ax25.h
--- v1.3.16/linux/include/net/ax25.h	Mon Jul 31 15:59:03 1995
+++ linux/include/net/ax25.h	Wed Aug  9 09:52:28 1995
@@ -152,7 +152,7 @@
 extern int  ax25_encapsulate(struct sk_buff *, struct device *, unsigned short,
 	void *, void *, unsigned int);
 extern int  ax25_rebuild_header(unsigned char *, struct device *, unsigned long, struct sk_buff *);
-extern int  ax25_get_info(char *, char **, off_t, int);
+extern int  ax25_get_info(char *, char **, off_t, int, int);
 extern ax25_uid_assoc *ax25_uid_list;
 extern int  ax25_uid_policy;
 extern ax25_address *ax25_findbyuid(uid_t);
@@ -176,8 +176,8 @@
 
 /* ax25_route.c */
 extern void ax25_rt_rx_frame(ax25_address *, struct device *);
-extern int  ax25_rt_get_info(char *, char **, off_t, int);
-extern int  ax25_cs_get_info(char *, char **, off_t, int);
+extern int  ax25_rt_get_info(char *, char **, off_t, int, int);
+extern int  ax25_cs_get_info(char *, char **, off_t, int, int);
 extern int  ax25_rt_autobind(ax25_cb *, ax25_address *);
 extern void ax25_rt_device_down(struct device *);
 extern void ax25_ip_mode_set(ax25_address *, struct device *, char);
diff -u --recursive --new-file v1.3.16/linux/include/net/ip.h linux/include/net/ip.h
--- v1.3.16/linux/include/net/ip.h	Wed Aug  2 13:21:16 1995
+++ linux/include/net/ip.h	Wed Aug  9 09:52:29 1995
@@ -43,7 +43,7 @@
 #ifdef CONFIG_IP_MULTICAST
 extern void		ip_mc_dropsocket(struct sock *);
 extern void		ip_mc_dropdevice(struct device *dev);
-extern int		ip_mc_procinfo(char *, char **, off_t, int);
+extern int		ip_mc_procinfo(char *, char **, off_t, int, int);
 #endif
  
 
diff -u --recursive --new-file v1.3.16/linux/include/net/rarp.h linux/include/net/rarp.h
--- v1.3.16/linux/include/net/rarp.h	Tue Jun  6 11:22:18 1995
+++ linux/include/net/rarp.h	Wed Aug  9 09:52:29 1995
@@ -3,12 +3,10 @@
 #define _RARP_H
 
 extern int rarp_ioctl(unsigned int cmd, void *arg);
-extern int rarp_rcv(struct sk_buff *skb, 
-		    struct device *dev, 
-		    struct packet_type *pt);
 extern int rarp_get_info(char *buffer, 
 			 char **start, 
 			 off_t offset, 
-			 int length);
+			 int length,
+			 int dummy);
 #endif	/* _RARP_H */
 
diff -u --recursive --new-file v1.3.16/linux/include/net/route.h linux/include/net/route.h
--- v1.3.16/linux/include/net/route.h	Fri Jul  7 08:54:55 1995
+++ linux/include/net/route.h	Wed Aug  9 09:52:29 1995
@@ -48,7 +48,7 @@
 			       unsigned long gw, struct device *dev, unsigned short mss, unsigned long window, unsigned short irtt, unsigned char metric);
 extern struct rtable	*ip_rt_route(unsigned long daddr, struct options *opt, unsigned long *src_addr);
 extern struct rtable 	*ip_rt_local(unsigned long daddr, struct options *opt, unsigned long *src_addr);
-extern int		rt_get_info(char * buffer, char **start, off_t offset, int length);
+extern int		rt_get_info(char * buffer, char **start, off_t offset, int length, int dummy);
 extern int		ip_rt_ioctl(unsigned int cmd, void *arg);
 
 extern unsigned long	rt_stamp;
diff -u --recursive --new-file v1.3.16/linux/kernel/ksyms.c linux/kernel/ksyms.c
--- v1.3.16/linux/kernel/ksyms.c	Tue Aug  8 12:31:42 1995
+++ linux/kernel/ksyms.c	Wed Aug  9 09:52:29 1995
@@ -44,6 +44,7 @@
 #include <net/protocol.h>
 #include <net/arp.h>
 #include <net/tcp.h>
+#include <net/route.h>
 #if defined(CONFIG_PPP) || defined(CONFIG_SLIP)
 #include "../drivers/net/slhc.h"
 #endif
@@ -65,7 +66,7 @@
 extern char *get_options(char *str, int *ints);
 extern void set_device_ro(int dev,int flag);
 extern struct file_operations * get_blkfops(unsigned int);
-  
+
 extern void *sys_call_table;
 
 #ifdef CONFIG_FTAPE
@@ -94,6 +95,7 @@
 extern int sys_tz;
 extern int request_dma(unsigned int dmanr, char * deviceID);
 extern void free_dma(unsigned int dmanr);
+extern int (*rarp_ioctl_hook)(int,void*);
 
 extern int close_fp(struct file *filp);
 extern void (* iABI_hook)(struct pt_regs * regs);
@@ -247,6 +249,10 @@
 	X(timer_table),
  	X(intr_count),
 
+	/* autoirq from  drivers/net/auto_irq.c */
+	X(autoirq_setup),
+	X(autoirq_report),
+
 	/* dma handling */
 	X(request_dma),
 	X(free_dma),
@@ -306,6 +312,10 @@
 #ifdef CONFIG_INET	
 	X(inet_add_protocol),
 	X(inet_del_protocol),
+	X(rarp_ioctl_hook),
+	X(init_etherdev),
+	X(ip_rt_route),
+	X(arp_send),
 #if defined(CONFIG_PPP) || defined(CONFIG_SLIP)
     	/* VJ header compression */
 	X(slhc_init),
@@ -446,6 +456,10 @@
 	X(msdos_unlink),
 	X(msdos_unlink_umsdos),
 	X(msdos_write_inode),
+#endif
+#ifdef CONFIG_PROC_FS
+	X(proc_net_register),
+	X(proc_net_unregister),
 #endif
 	/********************************************************
 	 * Do not add anything below this line,
diff -u --recursive --new-file v1.3.16/linux/kernel/module.c linux/kernel/module.c
--- v1.3.16/linux/kernel/module.c	Wed Aug  2 13:21:17 1995
+++ linux/kernel/module.c	Wed Aug  9 09:52:29 1995
@@ -34,6 +34,10 @@
  *	  and finally: reducing the number of entries in ksyms.c
  *	  since every subsystem should now be able to decide and
  *	  control exactly what symbols it wants to export, locally!
+ *
+ * On 1-Aug-95:  <Matti.Aarnio@utu.fi>  altered code to use same style as
+ *		 do  /proc/net/XXX  "files".  Namely allow more than 4kB
+ *		 (or what the block size if) output.
  */
 
 #ifdef DEBUG_MODULE
@@ -53,11 +57,12 @@
 
 static int module_init_flag = 0; /* Hmm... */
 
+extern struct symbol_table symbol_table; /* in kernel/ksyms.c */
+
 /*
  * Called at boot time
  */
 void init_modules(void) {
-	extern struct symbol_table symbol_table; /* in kernel/ksyms.c */
 	struct internal_symbol *sym;
 	int i;
 
@@ -570,40 +575,51 @@
 /*
  * Called by the /proc file system to return a current list of ksyms.
  */
-int get_ksyms_list(char *buf)
+int get_ksyms_list(char *buf, char **start, off_t offset, int length)
 {
 	struct module *mp;
 	struct internal_symbol *sym;
 	int i;
 	char *p = buf;
+	int len     = 0;	/* code from  net/ipv4/proc.c */
+	off_t pos   = 0;
+	off_t begin = 0;
 
 	for (mp = module_list; mp; mp = mp->next) {
 		if ((mp->state == MOD_RUNNING) &&
-			(mp->symtab != NULL) && (mp->symtab->n_symbols > 0)) {
+		    (mp->symtab != NULL) &&
+		    (mp->symtab->n_symbols > 0)) {
 			for (i = mp->symtab->n_symbols,
 				sym = mp->symtab->symbol;
 				i > 0; --i, ++sym) {
 
-				if (p - buf > 4096 - 100) {
-					strcat(p, "...\n");
-					p += strlen(p);
-					return p - buf; /* avoid overflowing buffer */
-				}
-
+				p = buf + len;
 				if (mp->name[0]) {
-					sprintf(p, "%08lx %s\t[%s]\n",
-						(long)sym->addr, sym->name, mp->name);
+					len += sprintf(p, "%08lx %s\t[%s]\n",
+						       (long)sym->addr,
+						       sym->name, mp->name);
+				} else {
+					len += sprintf(p, "%08lx %s\n",
+						       (long)sym->addr,
+						       sym->name);
 				}
-				else {
-					sprintf(p, "%08lx %s\n",
-						(long)sym->addr, sym->name);
+				pos = begin + len;
+				if (pos < offset) {
+					len   = 0;
+					begin = pos;
 				}
-				p += strlen(p);
+				pos = begin + len;
+				if (pos > offset+length)
+					goto leave_the_loop;
 			}
 		}
 	}
-
-	return p - buf;
+    leave_the_loop:
+	*start = buf + (offset - begin);
+	len -= (offset - begin);
+	if (len > length)
+		len = length;
+	return len;
 }
 
 /*
diff -u --recursive --new-file v1.3.16/linux/net/802/Makefile linux/net/802/Makefile
--- v1.3.16/linux/net/802/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/802/Makefile	Wed Aug  9 09:52:29 1995
@@ -45,5 +45,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/Makefile linux/net/Makefile
--- v1.3.16/linux/net/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/Makefile	Wed Aug  9 09:52:29 1995
@@ -31,6 +31,8 @@
 		$(CPP) -M *.c > .depend
 		set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i dep; done
 
-modules:
+modules: dummy
+	set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i modules; done
+
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/appletalk/Makefile linux/net/appletalk/Makefile
--- v1.3.16/linux/net/appletalk/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/appletalk/Makefile	Wed Aug  9 09:52:29 1995
@@ -24,6 +24,6 @@
 
 tar:
 		tar -cvf /dev/f1 .
-
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/appletalk/ddp.c linux/net/appletalk/ddp.c
--- v1.3.16/linux/net/appletalk/ddp.c	Tue Aug  8 12:31:43 1995
+++ linux/net/appletalk/ddp.c	Wed Aug  9 09:52:29 1995
@@ -49,6 +49,7 @@
 #include <net/psnap.h>
 #include <net/sock.h>
 #include <linux/atalk.h>
+#include <linux/proc_fs.h>
 
 #ifdef CONFIG_ATALK
 
@@ -1858,11 +1859,18 @@
 {
 	static char ddp_snap_id[]={0x08,0x00,0x07,0x80,0x9B};
 	(void) sock_register(atalk_proto_ops.family, &atalk_proto_ops);
-	if((ddp_dl=register_snap_client(ddp_snap_id, atalk_rcv))==NULL)
+	if ((ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv)) == NULL)
 		printk("Unable to register DDP with SNAP.\n");
 	register_netdevice_notifier(&ddp_notifier);
 	aarp_proto_init();
+
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_ATALK,	atalk_get_info,		9, "appletalk" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_AT_ROUTE,	atalk_rt_get_info,	11,"atalk_route" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_ATIF,	atalk_if_get_info,	11,"atalk_iface" });
+
 	printk("Appletalk BETA 0.11 for Linux NET3.030\n");
-	
 }
 #endif
diff -u --recursive --new-file v1.3.16/linux/net/ax25/Makefile linux/net/ax25/Makefile
--- v1.3.16/linux/net/ax25/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/ax25/Makefile	Wed Aug  9 09:52:29 1995
@@ -30,5 +30,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/ax25/af_ax25.c linux/net/ax25/af_ax25.c
--- v1.3.16/linux/net/ax25/af_ax25.c	Wed Aug  2 13:21:17 1995
+++ linux/net/ax25/af_ax25.c	Wed Aug  9 09:52:29 1995
@@ -1906,7 +1906,7 @@
 	return(0);
 }
 
-int ax25_get_info(char *buffer, char **start, off_t offset, int length)
+int ax25_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	ax25_cb *ax25;
 	struct device *dev;
@@ -2029,6 +2029,14 @@
 	bpq_packet_type.type  = htons(ETH_P_BPQ);
 	dev_add_pack(&bpq_packet_type);
 	register_netdevice_notifier(&ax25_dev_notifier);
+			  
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_AX25_ROUTE,	ax25_rt_get_info,	10, "ax25_route" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_AX25,	ax25_get_info,		4, "ax25" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_AX25_CALLS,	ax25_cs_get_info,	10, "ax25_calls" });
+
 	printk("GW4PTS/G4KLX AX.25 for Linux. Version 0.30 ALPHA for Linux NET3.030 (Linux 1.3.0)\n");
 }
 
diff -u --recursive --new-file v1.3.16/linux/net/ax25/ax25_route.c linux/net/ax25/ax25_route.c
--- v1.3.16/linux/net/ax25/ax25_route.c	Mon Jul 31 15:59:04 1995
+++ linux/net/ax25/ax25_route.c	Wed Aug  9 09:52:29 1995
@@ -136,7 +136,7 @@
 	}
 }
 
-int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length)
+int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	struct ax25_route *ax25_rt;
 	int len     = 0;
@@ -189,7 +189,7 @@
 	return len;
 } 
 
-int ax25_cs_get_info(char *buffer, char **start, off_t offset, int length)
+int ax25_cs_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	ax25_uid_assoc *pt;
 	int len     = 0;
diff -u --recursive --new-file v1.3.16/linux/net/core/Makefile linux/net/core/Makefile
--- v1.3.16/linux/net/core/Makefile	Tue Aug  8 12:31:43 1995
+++ linux/net/core/Makefile	Wed Aug  9 09:52:29 1995
@@ -33,5 +33,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/core/datagram.c linux/net/core/datagram.c
--- v1.3.16/linux/net/core/datagram.c	Thu Jul 13 16:20:21 1995
+++ linux/net/core/datagram.c	Wed Aug  9 14:04:28 1995
@@ -179,12 +179,16 @@
 	switch(sel_type)
 	{
 		case SEL_IN:
+			if (sk->err)
+				return 1;
+			if (sk->shutdown & RCV_SHUTDOWN)
+				return 1;
 			if (sk->type==SOCK_SEQPACKET && sk->state==TCP_CLOSE)
 			{
 				/* Connection closed: Wake up */
 				return(1);
 			}
-			if (skb_peek(&sk->receive_queue) != NULL || sk->err != 0)
+			if (skb_peek(&sk->receive_queue) != NULL)
 			{	/* This appears to be consistent
 				   with other stacks */
 				return(1);
@@ -192,10 +196,14 @@
 			return(0);
 
 		case SEL_OUT:
+			if (sk->err)
+				return 1;
+			if (sk->shutdown & SEND_SHUTDOWN)
+				return 1;
 			if (sk->type==SOCK_SEQPACKET && sk->state==TCP_SYN_SENT)
 			{
 				/* Connection still in progress */
-				return(0);
+				break;
 			}
 			if (sk->prot && sk->prot->wspace(sk) >= MIN_WRITE_SPACE)
 			{
diff -u --recursive --new-file v1.3.16/linux/net/core/dev.c linux/net/core/dev.c
--- v1.3.16/linux/net/core/dev.c	Wed Aug  2 13:21:17 1995
+++ linux/net/core/dev.c	Wed Aug  9 09:52:29 1995
@@ -69,7 +69,7 @@
 #include <linux/skbuff.h>
 #include <net/sock.h>
 #include <net/arp.h>
-
+#include <linux/proc_fs.h>
 
 /*
  *	The list of packet types we will receive (as opposed to discard)
@@ -901,7 +901,7 @@
  *	to create /proc/net/dev
  */
  
-int dev_get_info(char *buffer, char **start, off_t offset, int length)
+int dev_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	int len=0;
 	off_t begin=0;
@@ -1320,5 +1320,8 @@
 			dev2 = dev;
 		}
 	}
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_DEV,		dev_get_info,	3, "dev" });
+
 }
 
diff -u --recursive --new-file v1.3.16/linux/net/ethernet/Makefile linux/net/ethernet/Makefile
--- v1.3.16/linux/net/ethernet/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/ethernet/Makefile	Wed Aug  9 09:52:29 1995
@@ -47,5 +47,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/Makefile linux/net/ipv4/Makefile
--- v1.3.16/linux/net/ipv4/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/ipv4/Makefile	Wed Aug  9 09:52:29 1995
@@ -12,20 +12,22 @@
 .s.o:
 	$(AS) -o $*.o $<
 
-OBJS	:= utils.o route.o proc.o timer.o protocol.o packet.o \
+IPV4_OBJS	:= utils.o route.o proc.o timer.o protocol.o packet.o \
 		   arp.o ip.o raw.o icmp.o tcp.o udp.o devinet.o af_inet.o \
 		   igmp.o ip_fw.o ipip.o
 
-ifdef CONFIG_INET_RARP
-
-OBJS	:= $(OBJS) rarp.o
+MODULES	:=
 
+ifdef CONFIG_INET_RARP
+IPV4_OBJS := $(IPV4_OBJS) rarp.o
+else
+MODULES := $(MODULES) rarp.o
 endif
 
 ifdef CONFIG_INET
 
-ipv4.o:		$(OBJS)
-		$(LD) -r -o ipv4.o $(OBJS)
+ipv4.o:		$(IPV4_OBJS)
+		$(LD) -r -o ipv4.o $(IPV4_OBJS)
 
 else
 
@@ -34,11 +36,29 @@
 
 endif
 
+ifdef MODULES
 dep:
-		$(CPP) -M *.c > .depend
+		$(CPP) -M $(IPV4_OBJS:.o=.c) > .depend
+		$(CPP) -M -DMODULE $(MODULES:.o=.c) >> .depend
+else
+dep:
+		$(CPP) -M $(IPV4_OBJS:.o=.c) > .depend
+endif
 
 tar:
 		tar -cvf /dev/f1 .
 
+ifdef MODULES
+
+modules: $(MODULES)
+	echo $(MODULES) > ../../modules/IPV4_MODULES
+	cd ../../modules; \
+		for i in $(MODULES); do ln -sf ../net/ipv4/$$i .; done
+
+else
+
+modules:
+
+endif
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/af_inet.c linux/net/ipv4/af_inet.c
--- v1.3.16/linux/net/ipv4/af_inet.c	Wed Aug  2 13:21:17 1995
+++ linux/net/ipv4/af_inet.c	Wed Aug  9 12:00:39 1995
@@ -65,6 +65,7 @@
 #include <linux/fcntl.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
+#include <linux/proc_fs.h>
 
 #include <asm/segment.h>
 #include <asm/system.h>
@@ -87,7 +88,13 @@
 #define min(a,b)	((a)<(b)?(a):(b))
 
 extern struct proto packet_prot;
+extern int raw_get_info(char *, char **, off_t, int, int);
+extern int snmp_get_info(char *, char **, off_t, int, int);
+extern int afinet_get_info(char *, char **, off_t, int, int);
+extern int tcp_get_info(char *, char **, off_t, int, int);
+extern int udp_get_info(char *, char **, off_t, int, int);
 
+int (*rarp_ioctl_hook)(int,void*) = NULL;
 
 /*
  *	See if a socket number is in use.
@@ -496,8 +503,8 @@
 	 */
 	if ((unsigned) backlog == 0)	/* BSDism */
 		backlog = 1;
-	if ((unsigned) backlog > 128)
-		backlog = 128;
+	if ((unsigned) backlog > SOMAXCONN)
+		backlog = SOMAXCONN;
 	sk->max_ack_backlog = backlog;
 	if (sk->state != TCP_LISTEN)
 	{
@@ -1322,12 +1329,11 @@
 		case SIOCGARP:
 		case SIOCSARP:
 			return(arp_ioctl(cmd,(void *) arg));
-#ifdef CONFIG_INET_RARP			
 		case SIOCDRARP:
 		case SIOCGRARP:
 		case SIOCSRARP:
-			return(rarp_ioctl(cmd,(void *) arg));
-#endif
+			if (rarp_ioctl_hook != NULL)
+				return(rarp_ioctl_hook(cmd,(void *) arg));
 		case SIOCGIFCONF:
 		case SIOCGIFFLAGS:
 		case SIOCSIFFLAGS:
@@ -1594,5 +1600,22 @@
   	 *	Set the IP module up
   	 */
 	ip_init();
-}
 
+#ifdef CONFIG_INET_RARP
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_RARP,	rarp_get_info,		4, "rarp"});
+	rarp_ioctl_hook = rarp_ioctl;
+#endif
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_RAW,		raw_get_info,		3, "raw" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_SNMP,	snmp_get_info,		4, "snmp" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_SOCKSTAT,	afinet_get_info,	8, "sockstat" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_TCP,		tcp_get_info,		3, "tcp" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_UDP,		udp_get_info,		3, "udp" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_ROUTE,	rt_get_info,		5, "route" });
+}
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/arp.c linux/net/ipv4/arp.c
--- v1.3.16/linux/net/ipv4/arp.c	Wed Aug  2 13:21:17 1995
+++ linux/net/ipv4/arp.c	Wed Aug  9 09:52:29 1995
@@ -84,6 +84,7 @@
 #include <net/netrom.h>
 #endif
 #endif
+#include <linux/proc_fs.h>
 
 
 /*
@@ -1039,7 +1040,7 @@
 
 #define HBUFFERLEN 30
 
-int arp_get_info(char *buffer, char **start, off_t offset, int length)
+int arp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	int len=0;
 	off_t begin=0;
@@ -1455,5 +1456,8 @@
 	add_timer(&arp_timer);
 	/* Register for device down reports */
 	register_netdevice_notifier(&arp_dev_notifier);
+
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_ARP,		arp_get_info,	3, "arp" });
 }
 
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/ip.c linux/net/ipv4/ip.c
--- v1.3.16/linux/net/ipv4/ip.c	Tue Aug  8 12:31:43 1995
+++ linux/net/ipv4/ip.c	Wed Aug  9 10:39:47 1995
@@ -125,6 +125,7 @@
 #include <linux/inet.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/proc_fs.h>
 
 #include <net/snmp.h>
 #include <net/ip.h>
@@ -1958,7 +1959,7 @@
  *	read.
  */
  
-int ip_mc_procinfo(char *buffer, char **start, off_t offset, int length)
+int ip_mc_procinfo(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	off_t pos=0, begin=0;
 	struct ip_mc_list *im;
@@ -2810,9 +2811,15 @@
 
 	/* So we flush routes when a device is downed */	
 	register_netdevice_notifier(&ip_rt_notifier);
+
 /*	ip_raw_init();
 	ip_packet_init();
 	ip_tcp_init();
 	ip_udp_init();*/
+
+#ifdef CONFIG_IP_MULTICAST
+	proc_net_register(&(struct proc_dir_entry)
+			  { PROC_NET_IGMP,  ip_mc_procinfo,  4,  "igmp"});
+#endif
 }
 
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/ip_fw.c linux/net/ipv4/ip_fw.c
--- v1.3.16/linux/net/ipv4/ip_fw.c	Tue Aug  8 12:31:43 1995
+++ linux/net/ipv4/ip_fw.c	Wed Aug  9 09:52:30 1995
@@ -83,6 +83,7 @@
 #include <net/icmp.h>
 #include <linux/ip_fw.h>
 #include <net/checksum.h>
+#include <linux/proc_fs.h>
 
 /*
  *	Implement IP packet firewall
@@ -1394,7 +1395,7 @@
 #if defined(CONFIG_IP_FIREWALL) || defined(CONFIG_IP_ACCT)
 
 static int ip_chain_procinfo(int stage, char *buffer, char **start,
-		off_t offset, int length, int reset)
+			     off_t offset, int length, int reset)
 {
 	off_t pos=0, begin=0;
 	struct ip_fw *i;
@@ -1471,29 +1472,36 @@
 
 #ifdef CONFIG_IP_ACCT
 
-int ip_acct_procinfo(char *buffer, char **start, off_t offset, int length, int reset)
+static int ip_acct_procinfo(char *buffer, char **start, off_t offset,
+			    int length, int reset)
 {
-	return ip_chain_procinfo(IP_INFO_ACCT, buffer,start,offset,length,reset);
+	return ip_chain_procinfo(IP_INFO_ACCT, buffer,start, offset,length,
+				 reset);
 }
 
 #endif
 
 #ifdef CONFIG_IP_FIREWALL
 
-int ip_fw_blk_procinfo(char *buffer, char **start, off_t offset, int length, int reset)
+static int ip_fw_blk_procinfo(char *buffer, char **start, off_t offset,
+			      int length, int reset)
 {
-	return ip_chain_procinfo(IP_INFO_BLK, buffer,start,offset,length,reset);
+	return ip_chain_procinfo(IP_INFO_BLK, buffer,start,offset,length,
+				 reset);
 }
 
-int ip_fw_fwd_procinfo(char *buffer, char **start, off_t offset, int length, int reset)
+static int ip_fw_fwd_procinfo(char *buffer, char **start, off_t offset,
+			      int length, int reset)
 {
-	return ip_chain_procinfo(IP_INFO_FWD, buffer,start,offset,length,reset);
+	return ip_chain_procinfo(IP_INFO_FWD, buffer,start,offset,length,
+				 reset);
 }
 #endif
 
 #ifdef CONFIG_IP_MASQUERADE
 
-int ip_msqhst_procinfo(char *buffer, char **start, off_t offset, int length)
+static int ip_msqhst_procinfo(char *buffer, char **start, off_t offset,
+			      int length)
 {
 	off_t pos=0, begin=0;
 	struct ip_masq *ms;
@@ -1539,3 +1547,20 @@
   
 #endif
 
+void ip_fw_init(void)
+{
+#ifdef CONFIG_IP_ACCT
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPACCT,	ip_acct_procinfo,	7,  "ip_acct"});
+#endif
+#ifdef CONFIG_IP_FIREWALL
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPFWBLK,	ip_fw_blk_procinfo,	8,  "ip_block"});
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPFWFWD,	ip_fw_fwd_procinfo,	10, "ip_forward"});
+#endif
+#ifdef CONFIG_IP_MASQUERADE
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPMSQHST,	ip_msqhst_procinfo,	13, "ip_masquerade"});
+#endif
+}
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/proc.c linux/net/ipv4/proc.c
--- v1.3.16/linux/net/ipv4/proc.c	Mon Jul 31 15:59:04 1995
+++ linux/net/ipv4/proc.c	Wed Aug  9 09:52:30 1995
@@ -71,11 +71,12 @@
 	off_t begin=0;
   
 	s_array = pro->sock_array;
-	len+=sprintf(buffer, "sl  local_address rem_address   st tx_queue rx_queue tr tm->when uid\n");
+	len += sprintf(buffer, "sl  local_address rem_address   st tx_queue rx_queue tr tm->when uid\n");
 /*
- *	This was very pretty but didn't work when a socket is destroyed at the wrong moment
- *	(eg a syn recv socket getting a reset), or a memory timer destroy. Instead of playing
- *	with timers we just concede defeat and cli().
+ *	This was very pretty but didn't work when a socket is destroyed
+ *	at the wrong moment (eg a syn recv socket getting a reset), or
+ *	a memory timer destroy. Instead of playing with timers we just
+ *	concede defeat and cli().
  */
 	for(i = 0; i < SOCK_ARRAY_SIZE; i++) 
 	{
@@ -107,7 +108,7 @@
 			    timer_active=timer_active2;
 			    timer_expires=sp->timer.expires;
 			}
-			len+=sprintf(buffer+len, "%2d: %08lX:%04X %08lX:%04X %02X %08lX:%08lX %02X:%08lX %08X %d %d\n",
+			len += sprintf(buffer+len, "%2d: %08lX:%04X %08lX:%04X %02X %08lX:%08lX %02X:%08lX %08X %d %d\n",
 				i, src, srcp, dest, destp, sp->state, 
 				format==0?sp->write_seq-sp->rcv_ack_seq:sp->rmem_alloc, 
 				format==0?sp->acked_seq-sp->copied_seq:sp->wmem_alloc,
@@ -131,8 +132,10 @@
 			if(pos>offset+length)
 				break;
 		}
-		sti();	/* We only turn interrupts back on for a moment, but because the interrupt queues anything built up
-			   before this will clear before we jump back and cli, so it's not as bad as it looks */
+		sti();	/* We only turn interrupts back on for a moment,
+			   but because the interrupt queues anything built
+			   up before this will clear before we jump back
+			   and cli(), so it's not as bad as it looks */
 		if(pos>offset+length)
 			break;
 	}
@@ -144,19 +147,19 @@
 } 
 
 
-int tcp_get_info(char *buffer, char **start, off_t offset, int length)
+int tcp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	return get__netinfo(&tcp_prot, buffer,0, start, offset, length);
 }
 
 
-int udp_get_info(char *buffer, char **start, off_t offset, int length)
+int udp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	return get__netinfo(&udp_prot, buffer,1, start, offset, length);
 }
 
 
-int raw_get_info(char *buffer, char **start, off_t offset, int length)
+int raw_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	return get__netinfo(&raw_prot, buffer,1, start, offset, length);
 }
@@ -165,7 +168,7 @@
 /*
  *	Report socket allocation statistics [mea@utu.fi]
  */
-int afinet_get_info(char *buffer, char **start, off_t offset, int length)
+int afinet_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	/* From  net/socket.c  */
 	extern int socket_get_info(char *, char **, off_t, int);
@@ -194,7 +197,7 @@
  *	Called from the PROCfs module. This outputs /proc/net/snmp.
  */
  
-int snmp_get_info(char *buffer, char **start, off_t offset, int length)
+int snmp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	extern struct tcp_mib tcp_statistics;
 	extern struct udp_mib udp_statistics;
@@ -265,4 +268,3 @@
 		len = length;
 	return len;
 }
-
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/rarp.c linux/net/ipv4/rarp.c
--- v1.3.16/linux/net/ipv4/rarp.c	Tue Aug  8 12:31:44 1995
+++ linux/net/ipv4/rarp.c	Wed Aug  9 09:52:30 1995
@@ -31,12 +31,18 @@
  *
  */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
-#include <linux/config.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/errno.h>
@@ -59,8 +65,11 @@
 #ifdef CONFIG_AX25
 #include <net/ax25.h>
 #endif
+#include <linux/proc_fs.h>
+
+#if	defined(CONFIG_INET_RARP) || defined(MODULE)
 
-#ifdef CONFIG_INET_RARP
+extern int (*rarp_ioctl_hook)(unsigned int,void*);
 
 /*
  *	This structure defines the RARP mapping cache. As long as we make 
@@ -79,6 +88,7 @@
 
 struct rarp_table *rarp_tables = NULL;
 
+static int rarp_rcv(struct sk_buff *, struct device *, struct packet_type *);
 
 static struct packet_type rarp_packet_type =
 {
@@ -170,7 +180,7 @@
 	0
 };
  
-static void rarp_init (void)
+static void rarp_init_pkt (void)
 {
 	/* Register the packet type */
 	rarp_packet_type.type=htons(ETH_P_RARP);
@@ -184,7 +194,7 @@
  *	"overhead" time isn't that high...
  */
 
-int rarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
+static int rarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
 {
 /*
  *	We shouldn't use this type conversion. Check later.
@@ -226,12 +236,12 @@
 		(rarp->ar_pro != htons(ETH_P_IP) && dev->type != ARPHRD_AX25)
 		|| rarp->ar_pln != 4)
 	{
-	/*
-	 *	This packet is not for us. Remove it. 
-	 */
-	kfree_skb(skb, FREE_READ);
-	return 0;
-}
+		/*
+		 *	This packet is not for us. Remove it. 
+		 */
+		kfree_skb(skb, FREE_READ);
+		return 0;
+	}
   
 /*
  *	Extract variable width fields
@@ -346,9 +356,9 @@
 			sti();
 			return -ENOMEM;
 		}
-		if(initflag)
+		if (initflag)
 		{
-			rarp_init();
+			rarp_init_pkt();
 			initflag=0;
 		}
 
@@ -468,7 +478,7 @@
 	return 0;
 }
 
-int rarp_get_info(char *buffer, char **start, off_t offset, int length)
+int rarp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	int len=0;
 	off_t begin=0;
@@ -477,7 +487,7 @@
 	struct rarp_table *entry;
 	char ipbuffer[20];
 	unsigned long netip;
-	if(initflag)
+	if (initflag)
 	{
 		size = sprintf(buffer,"RARP disabled until entries added to cache.\n");
 		pos+=size;
@@ -525,11 +535,51 @@
 		sti();
 	}      
 
-	*start=buffer+(offset-begin);	/* Start of wanted data */
-	len-=(offset-begin);		/* Start slop */
-	if(len>length)
-		len=length;		        /* Ending slop */
+	*start = buffer+(offset-begin);	/* Start of wanted data */
+	len   -= (offset-begin);	/* Start slop */
+	if (len>length)
+		len = length;		/* Ending slop */
 	return len;
+}
+
+void
+rarp_init(void)
+{
+	proc_net_register(&(struct proc_dir_entry)
+			  { PROC_NET_RARP, rarp_get_info, 4, "rarp"});
+	rarp_ioctl_hook = rarp_ioctl;
+}
+
+
+#endif
+#ifdef MODULE
+char kernel_version[] = UTS_RELEASE;
+
+int init_module(void)
+{
+	rarp_init();
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	if (MOD_IN_USE)
+	  ;
+	else {
+		struct rarp_table *rt, *rt_next;
+		proc_net_unregister(PROC_NET_RARP);
+		rarp_ioctl_hook = NULL;
+		cli();
+		/* Destroy the RARP-table */
+		rt = rarp_tables;
+		rarp_tables = NULL;
+		sti();
+		/* ... and free it. */
+		for ( ; rt != NULL; rt = rt_next) {
+			rt_next = rt->next;
+			rarp_release_entry(rt);
+		}
+	}
 }
 
 #endif
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/route.c linux/net/ipv4/route.c
--- v1.3.16/linux/net/ipv4/route.c	Thu Jul 13 16:20:22 1995
+++ linux/net/ipv4/route.c	Wed Aug  9 09:52:30 1995
@@ -510,7 +510,7 @@
  *	Called from the PROCfs module. This outputs /proc/net/route.
  */
  
-int rt_get_info(char *buffer, char **start, off_t offset, int length)
+int rt_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	struct rtable *r;
 	int len=0;
diff -u --recursive --new-file v1.3.16/linux/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- v1.3.16/linux/net/ipv4/tcp.c	Wed Aug  2 13:21:18 1995
+++ linux/net/ipv4/tcp.c	Wed Aug  9 13:09:51 1995
@@ -4964,7 +4964,7 @@
 		 *	Recover the buffer pointers
 		 */
 		 
-	    	iph = (struct iphdr *)(skb->data + skb->dev->hard_header_len);
+	    	iph = (struct iphdr *)skb->ip_hdr;
 	    	th = (struct tcphdr *)(((char *)iph) +(iph->ihl << 2));
 
 		/*
@@ -4973,7 +4973,7 @@
 		 
 	    	buff = sk->prot->wmalloc(sk, win_size + th->doff * 4 + 
 				     (iph->ihl << 2) +
-				     skb->dev->hard_header_len + 15, 
+				     sk->prot->max_header + 15, 
 				     1, GFP_ATOMIC);
 	    	if ( buff == NULL )
 	    		return;
diff -u --recursive --new-file v1.3.16/linux/net/ipx/Makefile linux/net/ipx/Makefile
--- v1.3.16/linux/net/ipx/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/ipx/Makefile	Wed Aug  9 09:52:30 1995
@@ -25,5 +25,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/ipx/af_ipx.c linux/net/ipx/af_ipx.c
--- v1.3.16/linux/net/ipx/af_ipx.c	Wed Aug  2 13:21:18 1995
+++ linux/net/ipx/af_ipx.c	Wed Aug  9 09:52:30 1995
@@ -1123,8 +1123,8 @@
 }
 
 /* Called from proc fs */
-int 
-ipx_get_interface_info(char *buffer, char **start, off_t offset, int length)
+static int ipx_interface_get_info(char *buffer, char **start, off_t offset,
+				  int length, int dummy)
 {
 	ipx_interface *i;
 	int len=0;
@@ -1166,8 +1166,8 @@
 	return len;
 }
 
-int 
-ipx_get_info(char *buffer, char **start, off_t offset, int length)
+static int ipx_get_info(char *buffer, char **start, off_t offset,
+			int length, int dummy)
 {
 	ipx_socket *s;
 	ipx_interface *i;
@@ -1223,7 +1223,8 @@
 	return len;
 }
 
-int ipx_rt_get_info(char *buffer, char **start, off_t offset, int length)
+static int ipx_rt_get_info(char *buffer, char **start, off_t offset,
+			   int length, int dummy)
 {
 	ipx_route *rt;
 	int len=0;
@@ -1966,6 +1967,13 @@
 		printk("IPX: Unable to register with SNAP\n");
 	
 	register_netdevice_notifier(&ipx_dev_notifier);
+
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPX,		ipx_get_info,	3, "ipx" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPX_INTERFACE, ipx_interface_get_info, 13,"ipx_interface"});
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_IPX_ROUTE,	ipx_rt_get_info 9, "ipx_route" });
 		
 	printk("Swansea University Computer Society IPX 0.31 for NET3.030\n");
 	printk("IPX Portions Copyright (c) 1995 Caldera, Inc.\n");
diff -u --recursive --new-file v1.3.16/linux/net/netrom/Makefile linux/net/netrom/Makefile
--- v1.3.16/linux/net/netrom/Makefile	Tue Jul 11 10:03:00 1995
+++ linux/net/netrom/Makefile	Wed Aug  9 09:52:30 1995
@@ -30,5 +30,6 @@
 tar:
 		tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v1.3.16/linux/net/netrom/af_netrom.c linux/net/netrom/af_netrom.c
--- v1.3.16/linux/net/netrom/af_netrom.c	Wed Aug  2 13:21:18 1995
+++ linux/net/netrom/af_netrom.c	Wed Aug  9 09:52:30 1995
@@ -1284,7 +1284,8 @@
 	return(0);
 }
 
-int nr_get_info(char *buffer, char **start, off_t offset, int length)
+static int nr_get_info(char *buffer, char **start, off_t offset,
+		       int length, int dummy)
 {
 	struct sock *s;
 	struct device *dev;
@@ -1388,6 +1389,14 @@
 	nr_default.busy_delay = NR_DEFAULT_T4;
 	nr_default.tries      = NR_DEFAULT_N2;
 	nr_default.window     = NR_DEFAULT_WINDOW;
+
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_NR,		nr_get_info,		2, "nr" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_NR_NEIGH,	nr_neigh_get_info,	8, "nr_neigh" });
+proc_net_register(&(struct proc_dir_entry)
+	{ PROC_NET_NR_NODES,	nr_nodes_get_info,	8, "nr_nodes" });
+
 }
 
 #endif
diff -u --recursive --new-file v1.3.16/linux/net/netrom/nr_route.c linux/net/netrom/nr_route.c
--- v1.3.16/linux/net/netrom/nr_route.c	Wed Aug  2 13:21:18 1995
+++ linux/net/netrom/nr_route.c	Wed Aug  9 09:52:30 1995
@@ -693,7 +693,8 @@
 	return 1;
 }
 
-int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
+int nr_nodes_get_info(char *buffer, char **start, off_t offset,
+		      int length, int dummy)
 {
 	struct nr_node *nr_node;
 	int len     = 0;
@@ -742,7 +743,8 @@
 	return(len);
 } 
 
-int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
+int nr_neigh_get_info(char *buffer, char **start, off_t offset,
+		      int length, int dummy)
 {
 	struct nr_neigh *nr_neigh;
 	int len     = 0;
diff -u --recursive --new-file v1.3.16/linux/net/socket.c linux/net/socket.c
--- v1.3.16/linux/net/socket.c	Tue Aug  8 12:31:44 1995
+++ linux/net/socket.c	Wed Aug  9 09:52:30 1995
@@ -62,6 +62,7 @@
 #include <linux/net.h>
 #include <linux/interrupt.h>
 #include <linux/netdevice.h>
+#include <linux/proc_fs.h>
 
 #include <asm/system.h>
 #include <asm/segment.h>
@@ -78,6 +79,9 @@
 static int sock_ioctl(struct inode *inode, struct file *file,
 		      unsigned int cmd, unsigned long arg);
 static int sock_fasync(struct inode *inode, struct file *filp, int on);
+
+extern int proc_net_register(struct proc_dir_entry *);
+extern int proc_net_unregister(int);
 		   
 
 
@@ -1330,7 +1334,7 @@
 	{
 		if (pops[i] == NULL) 
 			continue;
-		if(pops[i]->family == family)
+		if (pops[i]->family == family)
 		{
 			pops[i]=NULL;
 			sti();
diff -u --recursive --new-file v1.3.16/linux/net/unix/Makefile linux/net/unix/Makefile
--- v1.3.16/linux/net/unix/Makefile	Tue Aug  8 12:31:44 1995
+++ linux/net/unix/Makefile	Wed Aug  9 09:52:30 1995
@@ -22,6 +22,7 @@
 dep:
 		$(CPP) -M *.c > .depend
 
+modules:
 tar:
 		tar -cvf /dev/f1 .
 
diff -u --recursive --new-file v1.3.16/linux/net/unix/af_unix.c linux/net/unix/af_unix.c
--- v1.3.16/linux/net/unix/af_unix.c	Tue Aug  8 12:31:44 1995
+++ linux/net/unix/af_unix.c	Wed Aug  9 14:29:51 1995
@@ -39,6 +39,7 @@
 #include <net/sock.h>
 #include <net/tcp.h>
 #include <net/af_unix.h>
+#include <linux/proc_fs.h>
 
 static unix_socket *volatile unix_socket_list=NULL;
 
@@ -724,7 +725,7 @@
 		err=sk->err;
 		sk->err=0;
 		sti();
-		return -sk->err;
+		return -err;
 	}
 	
 /*	printk("get rcv sem\n");*/
@@ -750,12 +751,12 @@
 			if(skb==NULL)
 			{
 				up(&sk->protinfo.af_unix.readsem);
-				if(sk->shutdown&RCV_SHUTDOWN)
+				if(sk->shutdown & RCV_SHUTDOWN)
+					return copied;
+				if(copied)
 					return copied;
 				if(noblock)
 				{
-					if(copied)
-						return copied;
 					return -EAGAIN;
 				}
 				interruptible_sleep_on(sk->sleep);
@@ -882,9 +883,7 @@
 	return(0);
 }
 
-/* Exported for procfs. */
-
-int unix_get_info(char *buffer, char **start, off_t offset, int length)
+static int unix_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	off_t pos=0;
 	off_t begin=0;
@@ -937,7 +936,9 @@
 	iov.iov_base=ubuf;
 	iov.iov_len=size;
 	msg.msg_name=(void *)sa;
-	msg.msg_namelen=get_user(addr_len);
+	msg.msg_namelen=0;
+	if (addr_len)
+		msg.msg_namelen = *addr_len;
 	msg.msg_accrights=NULL;
 	msg.msg_iov=&iov;
 	msg.msg_iovlen=1;
@@ -1013,4 +1014,11 @@
 {
 	printk("NET3: Unix domain sockets 0.07 BETA for Linux NET3.030.\n");
 	sock_register(unix_proto_ops.family, &unix_proto_ops);
+	proc_net_register(&(struct proc_dir_entry)
+			  { PROC_NET_UNIX,  unix_get_info,  4,  "unix" });
 }
+/*
+ * Local variables:
+ *  compile-command: "gcc -g -D__KERNEL__ -Wall -O6 -I/usr/src/linux/include -c af_unix.c"
+ * End:
+ */
