Import 1.3.171.3.17
authorLinus Torvalds<torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:10:09 +0000 (23 15:10 -0500)
committerLinus Torvalds<torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:10:09 +0000 (23 15:10 -0500)
77 files changed:
CREDITS
Makefile
drivers/block/Makefile
drivers/char/Makefile
drivers/net/3c503.c
drivers/net/3c505.c
drivers/net/3c507.c
drivers/net/8390.c
drivers/net/CONFIG
drivers/net/Makefile
drivers/net/README.modules[new file with mode: 0644]
drivers/net/ac3200.c
drivers/net/apricot.c
drivers/net/at1700.c
drivers/net/de600.c
drivers/net/de620.c
drivers/net/e2100.c
drivers/net/eepro.c
drivers/net/eql.c
drivers/net/hp-plus.c
drivers/net/hp.c
drivers/net/ibmtr.c
drivers/net/ne.c
drivers/net/plip.c
drivers/net/slip.c
drivers/net/smc-ultra.c
drivers/net/tulip.c
drivers/net/wavelan.c
drivers/net/wd.c
drivers/pci/pci.c
fs/proc/array.c
fs/proc/base.c
fs/proc/inode.c
fs/proc/net.c
fs/proc/root.c
fs/proc/scsi.c
include/linux/etherdevice.h
include/linux/ioctl.h
include/linux/netdevice.h
include/linux/pci.h
include/linux/proc_fs.h
include/linux/socket.h
include/net/arp.h
include/net/ax25.h
include/net/ip.h
include/net/rarp.h
include/net/route.h
kernel/ksyms.c
kernel/module.c
net/802/Makefile
net/Makefile
net/appletalk/Makefile
net/appletalk/ddp.c
net/ax25/Makefile
net/ax25/af_ax25.c
net/ax25/ax25_route.c
net/core/Makefile
net/core/datagram.c
net/core/dev.c
net/ethernet/Makefile
net/ipv4/Makefile
net/ipv4/af_inet.c
net/ipv4/arp.c
net/ipv4/ip.c
net/ipv4/ip_fw.c
net/ipv4/proc.c
net/ipv4/rarp.c
net/ipv4/route.c
net/ipv4/tcp.c
net/ipx/Makefile
net/ipx/af_ipx.c
net/netrom/Makefile
net/netrom/af_netrom.c
net/netrom/nr_route.c
net/socket.c
net/unix/Makefile
net/unix/af_unix.c

index 3c03062..6da5b71 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -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
index 3e3d828..46dfe98 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6+1,6 @@
 VERSION = 1
 PATCHLEVEL = 3
-SUBLEVEL = 16
+SUBLEVEL = 17
 
 ARCH = i386
 
@@ -214,6+214,7 @@ modules_install:
        }; \
        \
        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; \
        \
index 434de42..0f4089b 100644 (file)
@@ -27,7+27,7 @@ ifdef CONFIG_BLK_DEV_FD
 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 @@ block.a: $(OBJS)
        $(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)
index cae4efe..a940b3e 100644 (file)
@@ -100,10+100,13 @@ modules:
 
 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
index 7be8356..4f0d846 100644 (file)
 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 @@ el2_block_input(struct device *dev, int count, char *buf, int ring_offset)
     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 */
 \f
 /*
  * Local variables:
index 34f66ce..da1de43 100644 (file)
  *                     
  */
 
+#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 @@ elp_open (struct device *dev)
        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 @@ elp_close (struct device *dev)
         */
        irq2dev_map[dev->irq] = 0;
 
+#ifdef MODULE
+       MOD_DEC_USE_COUNT;
+#endif
+
        return 0;
 }
 
@@ -1444,3+1457,33 @@ elplus_probe (struct device *dev)
        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 */
index 05cd8c4..2635fd5 100644 (file)
 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 @@ el16_open(struct device *dev)
        dev->tbusy = 0;
        dev->interrupt = 0;
        dev->start = 1;
+
+#ifdef MODULE
+       MOD_INC_USE_COUNT;
+#endif
+
        return 0;
 }
 
@@ -631,6+642,10 @@ el16_close(struct device *dev)
 
        /* Update the statistics here. */
 
+#ifdef MODULE
+       MOD_DEC_USE_COUNT;
+#endif
+
        return 0;
 }
 
@@ -868,6+883,36 @@ el16_rx(struct device *dev)
        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 */
 \f
 /*
  * Local variables:
index b3aa338..85fc5d7 100644 (file)
@@ -84,7+84,12 @@ static const char *version =
 #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 @@ int ethdev_init(struct device *dev)
                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. */
index a91a162..57d9c05 100644 (file)
 #                      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
index a1aadad..43f5dc4 100644 (file)
@@ -30,6+30,8 @@ endif
 
 ifdef CONFIG_IBMTR
 NETDRV_OBJS := $(NETDRV_OBJS) ibmtr.o
+else
+MODULES := $(MODULES) ibmtr.o
 endif
 
 ifdef CONFIG_SK_G16
@@ -38,6+40,8 @@ endif
 
 ifdef CONFIG_NET_IPIP
 NETDRV_OBJS := $(NETDRV_OBJS) tunnel.o
+else
+MODULES := $(MODULES) tunnel.o
 endif
 
 ifdef CONFIG_HP100
@@ -49,6+53,8 @@ endif
 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 @@ wd.o: wd.c CONFIG
 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 @@ endif
 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 @@ ne.o: ne.c CONFIG
 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 @@ hp.o:       hp.c CONFIG
 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 @@ slip.o:     slip.c CONFIG
        $(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 @@ endif
 
 ifdef CONFIG_AT1700
 NETDRV_OBJS := $(NETDRV_OBJS) at1700.o
+else
+MODULES := $(MODULES) at1700.o
 endif
 
 ifdef CONFIG_EL1
@@ -166,6+186,8 @@ endif
 
 ifdef CONFIG_EL16
 NETDRV_OBJS := $(NETDRV_OBJS) 3c507.o
+else
+MODULES ;= $(MODULES 3c507.o
 endif
 
 ifdef CONFIG_EL3
@@ -234,6+256,8 @@ endif
 
 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 @@ endif
 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 @@ endif
 
 ifdef CONFIG_DEC_ELCP
 NETDRV_OBJS := $(NETDRV_OBJS) tulip.o
+else
+MODULES := $(MODULES) tulip.o
 endif
 
 ifdef CONFIG_ARCNET
@@ -277,9+305,12 @@ NETDRV_OBJS := $(NETDRV_OBJS) 8390.o
 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 @@ net.a: $(NETDRV_OBJS)
 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 --git a/drivers/net/README.modules b/drivers/net/README.modules
new file mode 100644 (file)
index 0000000..d5e53cd
--- /dev/null
@@ -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)
index 7de4322..13b9472 100644 (file)
 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_probe1(int ioaddr, struct device *dev)
 
 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 @@ static int ac_open(struct device *dev)
                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 @@ static int ac_close_card(struct device *dev)
 
        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 */
 \f
 /*
  * Local variables:
index 9f24e9c..c9aad24 100644 (file)
@@ -1020,9+1020,14 @@ static struct device dev_apricot = {
   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;
index da01976..1927366 100644 (file)
 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 @@ static int net_open(struct device *dev)
        dev->interrupt = 0;
        dev->start = 1;
 
+#ifdef MODULE
+       MOD_INC_USE_COUNT;
+#endif
+
        return 0;
 }
 
@@ -584,6+593,10 @@ static int net_close(struct device *dev)
        /* 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 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs)
        } 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 */
 \f
 /*
  * Local variables:
index 292eed3..24b24df 100644 (file)
@@ -849,3+849,10 @@ cleanup_module(void)
        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:
+ */
index 636baaf..b409c8f 100644 (file)
@@ -100,7+100,7 @@ static const char *version =
 #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 @@ typedef unsigned char byte;
 #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 @@ static int  de620_rx_intr(struct device *);
 /* 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 @@ static struct nic {
  * 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 @@ de620_ready(void)
 }
 
 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 @@ de620_write_block(byte *buffer, int count)
 #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 @@ de620_write_block(byte *buffer, int count)
                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 @@ de620_read_block(byte *data, int count)
 #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 @@ de620_read_block(byte *data, int count)
 }
 
 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 @@ static int
 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 @@ static void
 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 @@ de620_start_xmit(struct sk_buff *skb, struct device *dev)
                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 @@ de620_start_xmit(struct sk_buff *skb, struct device *dev)
        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 @@ de620_start_xmit(struct sk_buff *skb, struct device *dev)
                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 @@ de620_interrupt(int irq, struct pt_regs *regs)
        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 @@ de620_interrupt(int irq, struct pt_regs *regs)
                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 @@ de620_rx_intr(struct device *dev)
        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 @@ de620_rx_intr(struct device *dev)
                /* 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 @@ de620_rx_intr(struct device *dev)
                        /* 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 @@ de620_rx_intr(struct device *dev)
 
        /* 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 @@ adapter_init(struct device *dev)
        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 @@ adapter_init(struct device *dev)
        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 @@ adapter_init(struct device *dev)
         /* 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 @@ adapter_init(struct device *dev)
        }
 
        /* 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 @@ de620_probe(struct device *dev)
 
        /* 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 @@ de620_probe(struct device *dev)
  *
  * 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 @@ ReadAWord(int from)
        /* 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 @@ ReadAWord(int from)
                        /* 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 @@ ReadAWord(int from)
                /* 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 @@ read_eeprom(void)
  */
 #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 @@ void
 cleanup_module(void)
 {
        unregister_netdev(&de620_dev);
-       release_region(DE620_IO, 3);
+       release_region(de620_dev.base_addr, 3);
 }
 #endif /* MODULE */
 \f
@@ -1004,4+1009,11 @@ cleanup_module(void)
  *     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:
  */
index 6f42120..33ba427 100644 (file)
 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 @@ static int
 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 @@ e21_open(struct device *dev)
        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 @@ e21_close(struct device *dev)
           really bad things happen if it isn't. */
        mem_off(ioaddr);
 
+#ifdef MODULE
+       MOD_DEC_USE_COUNT;
+#endif
+
        return 0;
 }
 
@@ -339,6+354,36 @@ struct netdev_entry e21_drv =
 {"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 */
 \f
 /*
  * Local variables:
index a79a495..9ed8b79 100644 (file)
@@ -1137,9+1137,15 @@ char kernel_version[] = UTS_RELEASE;
 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;
index 2d4684a..5f0fff6 100644 (file)
 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 @@ static const char *version =
  *
  */
 
+#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_open(struct device *dev)
        eql->timer_on = 1;
        add_timer (&eql->timer);
 
+#ifdef MODULE
+       MOD_INC_USE_COUNT;
+#endif
        return 0;
       }
   return 1;
@@ -307,6+314,10 @@ eql_close(struct device *dev)
 
   eql_delete_slave_queue (eql->queue);
 
+#ifdef MODULE
+  MOD_DEC_USE_COUNT;
+#endif
+
   return 0;
 }
 \f
@@ -1165,6+1176,32 @@ eql_timer(unsigned long param)
     }
 }
 
+#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: 
  * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c eql.c"
index 5c5db74..3c1de0e 100644 (file)
 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 @@ enum HP_Option {
        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 @@ hpp_mem_block_output(struct device *dev, int count,
        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 */
 \f
 /*
  * Local variables:
index 68de711..d50bcf0 100644 (file)
 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 @@ static void hp_init_card(struct device *dev);
 /* 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;
+
 \f
 /*     Probe for an HP LAN adaptor.
        Also initialize the card and fill in STATION_ADDR with the station
@@ -266,18+275,19 @@ hp_block_output(struct device *dev, int count,
        /* 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 @@ hp_init_card(struct device *dev)
        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 */
 \f
 /*
  * Local variables:
index f2ca91e..15612ef 100644 (file)
       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 @@ static int tok_open(struct device *dev) {
       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 @@ static int tok_close(struct device *dev) {
 
        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 @@ static struct enet_statistics * tok_get_stats(struct device *dev) {
   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 */
index 762cd9b..b20dc11 100644 (file)
 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 @@ static const char *version =
 
 /* 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 @@ ne_reset_8390(struct device *dev)
 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 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
       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 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
        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 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
                   "%#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 @@ static void
 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 @@ ne_block_output(struct device *dev, int count,
     /* 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 @@ ne_block_output(struct device *dev, int count,
 
     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 @@ ne_block_output(struct device *dev, int count,
                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 @@ ne_block_output(struct device *dev, int count,
     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 */
 \f
 /*
  * Local variables:
index 3607352..cc8441d 100644 (file)
@@ -470,7+470,9 @@ plip_receive(unsigned short nibble_timeout, unsigned short status_addr,
                return OK;
 
        case PLIP_NB_2:
+               break;
        }
+       return TIMEOUT; /* XX: ?? */
 }
 
 /* PLIP_RECEIVE_PACKET --- receive a packet */
@@ -632,6+634,7 @@ plip_send(unsigned short nibble_timeout, unsigned short data_addr,
                *ns_p = PLIP_NB_BEGIN;
                return OK;
        }
+       return TIMEOUT;
 }
 
 /* PLIP_SEND_PACKET --- send a packet */
index 467628d..51ef3cc 100644 (file)
@@ -1120,7+1120,7 @@ static int sl_open_dev(struct device *dev)
 
 /* 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)
index 741a71e..88bbaf9 100644 (file)
 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 @@ int ultra_probe1(struct device *dev, int ioaddr)
 
        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 @@ int ultra_probe1(struct device *dev, int ioaddr)
 
 
        /* 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 @@ static int
 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 @@ ultra_open(struct device *dev)
        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 @@ ultra_close_card(struct device *dev)
        /* 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 */
 \f
 
 /*
index ecc183b..cba998d 100644 (file)
 
 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 @@ static int set_mac_address(struct device *dev, void *addr);
 
 \f
 
+#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 @@ unsigned long dec21040_init(unsigned long mem_start, unsigned long mem_end)
 
        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 @@ tulip_open(struct device *dev)
                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 @@ tulip_close(struct device *dev)
        free_irq(dev->irq);
        irq2dev_map[dev->irq] = 0;
 
+#ifdef MODULE
+       MOD_DEC_USE_COUNT;
+#endif
        return 0;
 }
 
@@ -727,6+747,36 @@ set_mac_address(struct device *dev, void *addr)
        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 */
 \f
 /*
  * Local variables:
index 423693c..96abffd 100644 (file)
 #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 void           wavelan_interrupt(int, struct pt_regs *);
 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 @@ wavelan_probe(device *dev)
                {
                        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 @@ sprintf_stats(char *buffer, device *dev)
        );
 }
 
-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 @@ static struct device    dev_wavelan             =
        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 @@ cleanup_module(void)
                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;
index fc1ada5..490d92a 100644 (file)
 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 @@ static int
 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 @@ wd_open(struct device *dev)
          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 @@ wd_close_card(struct device *dev)
        /* 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 */
 \f
 
 /*
index 10cb736..5480530 100644 (file)
@@ -78,6+78,7 @@ struct pci_dev_info dev_info[] = {
        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 @@ struct pci_dev_info dev_info[] = {
        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")
 };
 
 
index fb23a67..7671e47 100644 (file)
@@ -696,13+696,13 @@ static int read_maps (int pid, struct file * file, char * buf, int count)
 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 @@ static int get_root_array(char * page, int type)
                        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 int get_process_array(char * page, int pid, int type)
 }
 
 
-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;
 }
 
index 25dd82f..cba04c0 100644 (file)
@@ -51,18+51,18 @@ struct inode_operations proc_base_inode_operations = {
 };
 
 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])))
index aa1f17a..0dda2ab 100644 (file)
 #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 @@ struct super_block *proc_read_super(struct super_block *s,void *data,
                return NULL;
        }
        parse_options(data, &s->s_mounted->i_uid, &s->s_mounted->i_gid);
+       proc_net_init();
        return s;
 }
 
@@ -141,22+143,22 @@ void proc_read_inode(struct inode * inode)
                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)) {
dissimilarity index 65%
index f4068fb..56bcfe5 100644 (file)
-/*
- *  linux/fs/proc/net.c
- *
- *  Copyright (C) 1991, 1992 Linus Torvalds
- *
- *  gjh 3/'93 heim@peanuts.informatik.uni-tuebingen.de (Gerald J. Heim)
- *            most of this file is stolen from base.c
- *            it works, but you shouldn't use it as a guideline
- *            for new proc-fs entries. once i'll make it better.
- * fvk 3/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
- *           cleaned up the whole thing, moved "net" specific code to
- *           the NET kernel layer (where it belonged in the first place).
- * Michael K. Johnson (johnsonm@stolaf.edu) 3/93
- *            Added support from my previous inet.c.  Cleaned things up
- *            quite a bit, modularized the code.
- * fvk 4/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
- *           Renamed "route_get_info()" to "rt_get_info()" for consistency.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 4/94
- *           Dusted off the code and added IPX. Fixed the 4K limit.
- * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
- *           /proc/net/snmp.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95
- *           Added Appletalk slots
- *
- *  proc net directory handling functions
- */
-#include <linux/autoconf.h>
-
-#include <asm/segment.h>
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/config.h>
-#include <linux/mm.h>
-
-/* forward references */
-static int proc_readnet(struct inode * inode, struct file * file,
-                        char * buf, int count);
-static int proc_readnetdir(struct inode *, struct file *,
-                          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 */
-       NULL,                   /* write - bad */
-       proc_readnetdir,        /* readdir */
-       NULL,                   /* select - default */
-       NULL,                   /* ioctl - default */
-       NULL,                   /* mmap */
-       NULL,                   /* no special open code */
-       NULL,                   /* no special release code */
-       NULL                    /* can't fsync */
-};
-
-/*
- * proc directories can do almost nothing..
- */
-struct inode_operations proc_net_inode_operations = {
-       &proc_net_operations,   /* default net directory file-ops */
-       NULL,                   /* create */
-       proc_lookupnet,         /* lookup */
-       NULL,                   /* link */
-       NULL,                   /* unlink */
-       NULL,                   /* symlink */
-       NULL,                   /* mkdir */
-       NULL,                   /* rmdir */
-       NULL,                   /* mknod */
-       NULL,                   /* rename */
-       NULL,                   /* readlink */
-       NULL,                   /* follow_link */
-       NULL,                   /* bmap */
-       NULL,                   /* truncate */
-       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_NET_DIRENTRY ((sizeof (net_dir))/(sizeof (net_dir[0])) - 1)
-
-static int proc_lookupnet(struct inode * dir,const char * name, int len,
-       struct inode ** result)
-{
-       struct proc_dir_entry *de;
-
-       *result = NULL;
-       if (!dir)
-               return -ENOENT;
-       if (!S_ISDIR(dir->i_mode)) {
-               iput(dir);
-               return -ENOENT;
-       }
-       for (de = net_dir ; de->name ; de++) {
-               if (!proc_match(len, name, de))
-                       continue;
-               *result = iget(dir->i_sb, de->low_ino);
-               iput(dir);
-               if (!*result)
-                       return -ENOENT;
-               return 0;
-       }
-       iput(dir);
-       return -ENOENT;
-}
-
-static int proc_readnetdir(struct inode * inode, struct file * filp,
-       void * dirent, filldir_t filldir)
-{
-       struct proc_dir_entry * de;
-       unsigned int ino;
-
-       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;
-               if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino) < 0)
-                       break;
-               filp->f_pos++;
-       }
-       return 0;
-}
-
-
-#define PROC_BLOCK_SIZE        (3*1024)                /* 4K page size but our output routines use some slack for overruns */
-
-static int proc_readnet(struct inode * inode, struct file * file,
-                       char * buf, int count)
-{
-       char * page;
-       int length;
-       unsigned int ino;
-       int bytes=count;
-       int thistime;
-       int copied=0;
-       char *start;
-
-       if (count < 0)
-               return -EINVAL;
-       if (!(page = (char*) __get_free_page(GFP_KERNEL)))
-               return -ENOMEM;
-       ino = inode->i_ino;
-
-       while(bytes>0)
-       {
-               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;
-               }
-               
-               /*
-                *      We have been given a non page aligned block of
-                *      the data we asked for + a bit. We have been given
-                *      the start pointer and we know the length.. 
-                */
-
-               if (length <= 0)
-                       break;
-               /*
-                *      Copy the bytes
-                */
-               memcpy_tofs(buf+copied, start, length);
-               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;
-
-}
+/*
+ *  linux/fs/proc/net.c
+ *
+ *  Copyright (C) 1991, 1992 Linus Torvalds
+ *
+ *  gjh 3/'93 heim@peanuts.informatik.uni-tuebingen.de (Gerald J. Heim)
+ *            most of this file is stolen from base.c
+ *            it works, but you shouldn't use it as a guideline
+ *            for new proc-fs entries. once i'll make it better.
+ * fvk 3/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
+ *           cleaned up the whole thing, moved "net" specific code to
+ *           the NET kernel layer (where it belonged in the first place).
+ * Michael K. Johnson (johnsonm@stolaf.edu) 3/93
+ *            Added support from my previous inet.c.  Cleaned things up
+ *            quite a bit, modularized the code.
+ * fvk 4/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
+ *           Renamed "route_get_info()" to "rt_get_info()" for consistency.
+ * Alan Cox (gw4pts@gw4pts.ampr.org) 4/94
+ *           Dusted off the code and added IPX. Fixed the 4K limit.
+ * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
+ *           /proc/net/snmp.
+ * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95
+ *           Added Appletalk slots
+ *
+ *  proc net directory handling functions
+ */
+#include <linux/autoconf.h>
+
+#include <asm/segment.h>
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/proc_fs.h>
+#include <linux/stat.h>
+#include <linux/fcntl.h>
+#include <linux/config.h>
+#include <linux/mm.h>
+
+/* forward references */
+static int proc_readnet(struct inode * inode, struct file * file,
+                        char * buf, int count);
+static int proc_readnetdir(struct inode *, struct file *,
+                          void *, filldir_t filldir);
+static int proc_lookupnet(struct inode *,const char *,int,struct inode **);
+
+static struct file_operations proc_net_operations = {
+       NULL,                   /* lseek - default */
+       proc_readnet,           /* read - bad */
+       NULL,                   /* write - bad */
+       proc_readnetdir,        /* readdir */
+       NULL,                   /* select - default */
+       NULL,                   /* ioctl - default */
+       NULL,                   /* mmap */
+       NULL,                   /* no special open code */
+       NULL,                   /* no special release code */
+       NULL                    /* can't fsync */
+};
+
+/*
+ * proc directories can do almost nothing..
+ */
+struct inode_operations proc_net_inode_operations = {
+       &proc_net_operations,   /* default net directory file-ops */
+       NULL,                   /* create */
+       proc_lookupnet,         /* lookup */
+       NULL,                   /* link */
+       NULL,                   /* unlink */
+       NULL,                   /* symlink */
+       NULL,                   /* mkdir */
+       NULL,                   /* rmdir */
+       NULL,                   /* mknod */
+       NULL,                   /* rename */
+       NULL,                   /* readlink */
+       NULL,                   /* follow_link */
+       NULL,                   /* bmap */
+       NULL,                   /* truncate */
+       NULL                    /* permission */
+};
+
+#define NR_MAX_PROC_NET_DIR 100
+static struct proc_dir_entry *net_dir[NR_MAX_PROC_NET_DIR] = {
+       NULL,
+};
+
+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 proc_dir_entry **de;
+
+       *result = NULL;
+       if (!dir)
+               return -ENOENT;
+       if (!S_ISDIR(dir->i_mode)) {
+               iput(dir);
+               return -ENOENT;
+       }
+       for (de = net_dir ; (*de)->name ; de++) {
+               if (!proc_match(len, name, *de))
+                       continue;
+               *result = iget(dir->i_sb, (*de)->low_ino);
+               iput(dir);
+               if (!*result)
+                       return -ENOENT;
+               return 0;
+       }
+       iput(dir);
+       return -ENOENT;
+}
+
+static int proc_readnetdir(struct inode * inode, struct file * filp,
+       void * dirent, filldir_t filldir)
+{
+       struct proc_dir_entry * de;
+       unsigned int ino;
+
+       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];
+               if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino) < 0)
+                       break;
+               filp->f_pos++;
+       }
+       return 0;
+}
+
+
+#define PROC_BLOCK_SIZE        (3*1024)                /* 4K page size but our output routines use some slack for overruns */
+
+static int proc_readnet(struct inode * inode, struct file * file,
+                       char * buf, int count)
+{
+       char * page;
+       unsigned int ino;
+       int bytes=count;
+       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;
+
+       while (bytes>0)
+       {
+               int length, thistime=bytes;
+               if (bytes > PROC_BLOCK_SIZE)
+                       thistime=PROC_BLOCK_SIZE;
+
+               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
+                *      the start pointer and we know the length.. 
+                */
+
+               if (length <= 0)
+                       break;
+               /*
+                *      Copy the bytes
+                */
+               memcpy_tofs(buf+copied, start, length);
+               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;
+}
index a69af1c..4cfc9de 100644 (file)
@@ -52,34+52,34 @@ struct inode_operations proc_root_inode_operations = {
 };
 
 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
 };
 
index adaf40a..cacff85 100644 (file)
@@ -84,10+84,10 @@ struct proc_dir_entry scsi_dir[PROC_SCSI_FILE - PROC_SCSI_SCSI + 3];
 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)
index 07dcc56..9ad69a1 100644 (file)
@@ -37,7+37,7 @@ extern unsigned short eth_type_trans(struct sk_buff *skb, struct device *dev);
 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
 
index 5641cd0..12bb269 100644 (file)
@@ -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
 #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
index 25f3130..0d6103d 100644 (file)
@@ -210,7+210,7 @@ extern void         dev_transmit(void);
 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);
index 978128f..55ae041 100644 (file)
 
 #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
 #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
  * devices.  The slot/function address of each device is encoded
index bda8127..560e55b 100644 (file)
@@ -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 @@ enum root_directory_inos {
        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 pid_subdirectory_inos {
 
 enum net_directory_inos {
        PROC_NET_UNIX = 128,
-#ifdef CONFIG_INET
        PROC_NET_ARP,
        PROC_NET_ROUTE,
        PROC_NET_DEV,
@@ -63,46+64,25 @@ enum net_directory_inos {
        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 @@ enum scsi_directory_inos {
 
 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_statfs(struct super_block *, struct statfs *, int);
 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;
index 9ff308e..a0efebc 100644 (file)
@@ -64,6+64,9 @@ struct msghdr
 
 #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
index ea5c2f9..293e7c6 100644 (file)
@@ -10,7+10,7 @@ extern int    arp_rcv(struct sk_buff *skb, struct device *dev,
 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, 
index 83558f4..4735314 100644 (file)
@@ -152,7+152,7 @@ extern struct device *ax25rtr_get_dev(ax25_address *);
 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 @@ extern void ax25_check_need_response(ax25_cb *, int, int);
 
 /* 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);
index 3f5f828..cd33fd8 100644 (file)
 #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
  
 
index 02ee778..7bfb08e 100644 (file)
 #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 */
 
index abe6a8f..424c586 100644 (file)
@@ -48,7+48,7 @@ extern void           ip_rt_add(short flags, unsigned long addr, unsigned long mask,
                               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;
index c894df3..cde576f 100644 (file)
 #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
 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 struct proc_dir_entry scsi_hba_dir[];
 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 @@ struct symbol_table symbol_table = {
        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 @@ struct symbol_table symbol_table = {
 #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),
@@ -447,6+457,10 @@ struct symbol_table symbol_table = {
        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,
         * as the stacked modules depend on this!
index 4890cab..48c61f2 100644 (file)
  *       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 free_modules( void);
 
 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 @@ int get_module_list(char *buf)
 /*
  * 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;
 }
 
 /*
index 2665a06..4874ff4 100644 (file)
@@ -45,5+45,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index c697659..ab3e4f3 100644 (file)
@@ -31,6+31,8 @@ dep:
                $(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
index bb67941..0dcc291 100644 (file)
@@ -24,6+24,6 @@ dep:
 
 tar:
                tar -cvf /dev/f1 .
-
+modules:
 
 include $(TOPDIR)/Rules.make
index b96d288..947a24d 100644 (file)
 #include <net/psnap.h>
 #include <net/sock.h>
 #include <linux/atalk.h>
+#include <linux/proc_fs.h>
 
 #ifdef CONFIG_ATALK
 
@@ -1858,11+1859,18 @@ void atalk_proto_init(struct net_proto *pro)
 {
        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
index a913138..bb900ef 100644 (file)
@@ -30,5+30,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index b354639..e462dd3 100644 (file)
@@ -1906,7+1906,7 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        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 @@ void ax25_proto_init(struct net_proto *pro)
        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");
 }
 
index dd90beb..871f731 100644 (file)
@@ -136,7+136,7 @@ void ax25_rt_device_down(struct device *dev)
        }
 }
 
-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 @@ int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length)
        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;
index 4613297..3f7e70a 100644 (file)
@@ -33,5+33,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index 3fa9a6a..fbf40d5 100644 (file)
@@ -179,12+179,16 @@ int datagram_select(struct sock *sk, int sel_type, select_table *wait)
        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 @@ int datagram_select(struct sock *sk, int sel_type, select_table *wait)
                        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)
                        {
index e20835a..24cc6f8 100644 (file)
 #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 @@ static int sprintf_stats(char *buffer, struct device *dev)
  *     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 @@ void dev_init(void)
                        dev2 = dev;
                }
        }
+proc_net_register(&(struct proc_dir_entry)
+       { PROC_NET_DEV,         dev_get_info,   3, "dev" });
+
 }
 
index 5333cf1..35822c9 100644 (file)
@@ -47,5+47,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index 0ae8cde..22f0912 100644 (file)
 .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 @@ ipv4.o:
 
 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
index bd03ca5..e4a49f5 100644 (file)
 #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>
 #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 @@ static int inet_listen(struct socket *sock, int backlog)
         */
        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 @@ static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                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 @@ void inet_proto_init(struct net_proto *pro)
         *      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" });
+}
index 9628153..0d80fd2 100644 (file)
 #include <net/netrom.h>
 #endif
 #endif
+#include <linux/proc_fs.h>
 
 
 /*
@@ -1039,7+1040,7 @@ int arp_find(unsigned char *haddr, u32 paddr, struct device *dev,
 
 #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 @@ void arp_init (void)
        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" });
 }
 
index c9fbc17..720e8f8 100644 (file)
 #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 @@ void ip_queue_xmit(struct sock *sk, struct device *dev,
  *     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 @@ void ip_init(void)
 
        /* 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
 }
 
index 2bfbe4f..3802972 100644 (file)
 #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 @@ int ip_fw_ctl(int stage, void *m, int len)
 #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 @@ static int ip_chain_procinfo(int stage, char *buffer, char **start,
 
 #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 @@ int ip_msqhst_procinfo(char *buffer, char **start, off_t offset, int length)
   
 #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
+}
index e61dc0e..f86380f 100644 (file)
@@ -71,11+71,12 @@ get__netinfo(struct proto *pro, char *buffer, int format, char **start, off_t of
        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 @@ get__netinfo(struct proto *pro, char *buffer, int format, char **start, off_t of
                            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 @@ get__netinfo(struct proto *pro, char *buffer, int format, char **start, off_t of
                        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 @@ get__netinfo(struct proto *pro, char *buffer, int format, char **start, off_t of
 } 
 
 
-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 @@ int raw_get_info(char *buffer, char **start, off_t offset, int length)
 /*
  *     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 @@ int afinet_get_info(char *buffer, char **start, off_t offset, int length)
  *     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 @@ int snmp_get_info(char *buffer, char **start, off_t offset, int length)
                len = length;
        return len;
 }
-
index 9cc86b3..2603c5c 100644 (file)
  *
  */
 
+#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>
 #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
 
 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 @@ static struct notifier_block rarp_dev_notifier={
        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 @@ static void rarp_init (void)
  *     "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 @@ int rarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
                (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 @@ static int rarp_req_set(struct arpreq *req)
                        sti();
                        return -ENOMEM;
                }
-               if(initflag)
+               if (initflag)
                {
-                       rarp_init();
+                       rarp_init_pkt();
                        initflag=0;
                }
 
@@ -468,7+478,7 @@ int rarp_ioctl(unsigned int cmd, void *arg)
        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 @@ int rarp_get_info(char *buffer, char **start, off_t offset, int length)
        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 @@ int rarp_get_info(char *buffer, char **start, off_t offset, int length)
                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
index 16fe500..de36085 100644 (file)
@@ -510,7+510,7 @@ static int rt_kill(struct rtentry *r)
  *     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;
index 58491e4..02ce308 100644 (file)
@@ -4964,7+4964,7 @@ static void tcp_write_wakeup(struct sock *sk)
                 *      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 @@ static void tcp_write_wakeup(struct sock *sk)
                 
                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;
index ca3101c..b3247af 100644 (file)
@@ -25,5+25,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index 26d8aa1..6d266aa 100644 (file)
@@ -1123,8+1123,8 @@ ipx_device_name(ipx_interface *intrfc)
 }
 
 /* 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 @@ ipx_get_interface_info(char *buffer, char **start, off_t offset, int length)
        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 @@ ipx_get_info(char *buffer, char **start, off_t offset, int length)
        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 @@ void ipx_proto_init(struct net_proto *pro)
                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");
index 3fc5397..1eb6105 100644 (file)
@@ -30,5+30,6 @@ dep:
 tar:
                tar -cvf /dev/f1 .
 
+modules:
 
 include $(TOPDIR)/Rules.make
index 5c6b0db..fa56bdf 100644 (file)
@@ -1284,7+1284,8 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        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 @@ void nr_proto_init(struct net_proto *pro)
        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
index 2cfd0c2..b386479 100644 (file)
@@ -693,7+693,8 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
        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 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
        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;
index a644878..4c6fc04 100644 (file)
 #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_select(struct inode *inode, struct file *file, int which, select
 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 @@ int sock_unregister(int family)
        {
                if (pops[i] == NULL) 
                        continue;
-               if(pops[i]->family == family)
+               if (pops[i]->family == family)
                {
                        pops[i]=NULL;
                        sti();
index f42d996..da17c0d 100644 (file)
@@ -22,6+22,7 @@ unix.o:       $(OBJS)
 dep:
                $(CPP) -M *.c > .depend
 
+modules:
 tar:
                tar -cvf /dev/f1 .
 
index e8fdd26..70bfc7a 100644 (file)
 #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 @@ static int unix_recvmsg(struct socket *sock, struct msghdr *msg, int size, int n
                err=sk->err;
                sk->err=0;
                sti();
-               return -sk->err;
+               return -err;
        }
        
 /*     printk("get rcv sem\n");*/
@@ -750,12+751,12 @@ static int unix_recvmsg(struct socket *sock, struct msghdr *msg, int size, int n
                        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 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        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 @@ static int unix_recvfrom(struct socket *sock, void *ubuf, int size, int noblock,
        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 @@ void unix_proto_init(struct net_proto *pro)
 {
        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:
+ */
close