From f2b311c0233381042f19321b1d3bbb537ce79769 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:10:09 -0500 Subject: [PATCH] Import 1.3.17 --- CREDITS | 5 +- Makefile | 3 +- drivers/block/Makefile | 7 +- drivers/char/Makefile | 5 +- drivers/net/3c503.c | 53 ++++++ drivers/net/3c505.c | 43 +++++ drivers/net/3c507.c | 45 +++++ drivers/net/8390.c | 11 +- drivers/net/CONFIG | 3 +- drivers/net/Makefile | 38 ++++- drivers/net/README.modules | 231 ++++++++++++++++++++++++++ drivers/net/ac3200.c | 48 +++++- drivers/net/apricot.c | 5 + drivers/net/at1700.c | 43 +++++ drivers/net/de600.c | 7 + drivers/net/de620.c | 196 +++++++++++----------- drivers/net/e2100.c | 47 +++++- drivers/net/eepro.c | 6 + drivers/net/eql.c | 41 ++++- drivers/net/hp-plus.c | 37 ++++- drivers/net/hp.c | 64 ++++++-- drivers/net/ibmtr.c | 44 +++++ drivers/net/ne.c | 99 +++++++---- drivers/net/plip.c | 3 + drivers/net/slip.c | 2 +- drivers/net/smc-ultra.c | 53 +++++- drivers/net/tulip.c | 50 ++++++ drivers/net/wavelan.c | 17 +- drivers/net/wd.c | 49 +++++- drivers/pci/pci.c | 5 +- fs/proc/array.c | 43 +++-- fs/proc/base.c | 24 +-- fs/proc/inode.c | 10 +- fs/proc/net.c | 316 +++++++++--------------------------- fs/proc/root.c | 46 +++--- fs/proc/scsi.c | 8 +- include/linux/etherdevice.h | 2 +- include/linux/ioctl.h | 3 +- include/linux/netdevice.h | 2 +- include/linux/pci.h | 7 + include/linux/proc_fs.h | 31 +--- include/linux/socket.h | 3 + include/net/arp.h | 2 +- include/net/ax25.h | 6 +- include/net/ip.h | 2 +- include/net/rarp.h | 6 +- include/net/route.h | 2 +- kernel/ksyms.c | 16 +- kernel/module.c | 50 ++++-- net/802/Makefile | 1 + net/Makefile | 4 +- net/appletalk/Makefile | 2 +- net/appletalk/ddp.c | 12 +- net/ax25/Makefile | 1 + net/ax25/af_ax25.c | 10 +- net/ax25/ax25_route.c | 4 +- net/core/Makefile | 1 + net/core/datagram.c | 12 +- net/core/dev.c | 7 +- net/ethernet/Makefile | 1 + net/ipv4/Makefile | 34 +++- net/ipv4/af_inet.c | 35 +++- net/ipv4/arp.c | 6 +- net/ipv4/ip.c | 9 +- net/ipv4/ip_fw.c | 41 ++++- net/ipv4/proc.c | 28 ++-- net/ipv4/rarp.c | 86 ++++++++-- net/ipv4/route.c | 2 +- net/ipv4/tcp.c | 4 +- net/ipx/Makefile | 1 + net/ipx/af_ipx.c | 18 +- net/netrom/Makefile | 1 + net/netrom/af_netrom.c | 11 +- net/netrom/nr_route.c | 6 +- net/socket.c | 6 +- net/unix/Makefile | 1 + net/unix/af_unix.c | 24 ++- 77 files changed, 1614 insertions(+), 593 deletions(-) create mode 100644 drivers/net/README.modules diff --git a/CREDITS b/CREDITS index 3c0306282e05..6da5b710f605 100644 --- 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 diff --git a/Makefile b/Makefile index 3e3d828d8cc7..46dfe983777a 100644 --- 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; \ \ diff --git a/drivers/block/Makefile b/drivers/block/Makefile index 434de423afee..0f4089b6a612 100644 --- a/drivers/block/Makefile +++ b/drivers/block/Makefile @@ -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) diff --git a/drivers/char/Makefile b/drivers/char/Makefile index cae4efeaa873..a940b3e06039 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -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 diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c index 7be835695865..4f0d846072a0 100644 --- a/drivers/net/3c503.c +++ b/drivers/net/3c503.c @@ -25,6 +25,12 @@ static const char *version = "3c503.c:v1.10 9/23/93 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; + +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c index 34f66cee20d6..da1de430e3be 100644 --- a/drivers/net/3c505.c +++ b/drivers/net/3c505.c @@ -33,6 +33,11 @@ * */ +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ diff --git a/drivers/net/3c507.c b/drivers/net/3c507.c index 05cd8c4c7dd7..2635fd51caa6 100644 --- a/drivers/net/3c507.c +++ b/drivers/net/3c507.c @@ -26,6 +26,12 @@ static const char *version = "3c507.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; + +#ifdef MODULE +#include +#include +#endif + #include /* @@ -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 */ /* * Local variables: diff --git a/drivers/net/8390.c b/drivers/net/8390.c index b3aa33805bee..85fc5d751bf5 100644 --- a/drivers/net/8390.c +++ b/drivers/net/8390.c @@ -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. */ diff --git a/drivers/net/CONFIG b/drivers/net/CONFIG index a91a16230bd1..57d9c05d55c3 100644 --- a/drivers/net/CONFIG +++ b/drivers/net/CONFIG @@ -16,7 +16,8 @@ # used. Usually pointless under Linux. # show_all_SAPROM Show the entire address PROM, not just the # ethernet address, during boot. -# rw_bugfix Patch an obscure bug with a version of the 8390. +# CONFIG_NE_RW_BUGFIX Patch an obscure bug with a version of the 8390. +# CONFIG_NE_SANITY ?? # CONFIG_HPLAN The HP-LAN driver (for 8390-based boards only). # rw_bugfix Fix the same obscure bug. # CONFIG_EL2 The 3c503 EtherLink II driver diff --git a/drivers/net/Makefile b/drivers/net/Makefile index a1aadadb6162..43f5dc4f8991 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -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 index 000000000000..d5e53cd94c20 --- /dev/null +++ b/drivers/net/README.modules @@ -0,0 +1,231 @@ +Wed 2-Aug-95 + + Linux network driver modules + + This is a potpourri of INSMOD-time(*) configuration + options (if exist) and their default values of various + modules on Linux network drivers collection. + + Do NOT mistake this to "README.modules" at the top-level + directory! + + -------------------------- + (*) "INSMOD-time" means when you load module with + /sbin/insmod you can feed it optional parameters. + See "man insmod". + -------------------------- + + +3c501.c: + io = 0x280 IO base address + irq = 5 IRQ + (Probes ports: 0x280, 0x300) + +3c503.c: + io = 0 + irq = 0 + (Probes ports: 0x300, 0x310, 0x330, 0x350, 0x250, 0x280, 0x2A0, 0x2E0) + +3c505.c: + io = 0 + irq = 0 + (Probes ports: 0x300, 0x280, 0x310) + +3c507.c: + io = 0 + irq = 0 + (Probes ports: 0x300, 0x320, 0x340, 0x280) + +3c509.c: + No parameters (autoprobes) + (EISA, and MCA probes in addition to ISA-probes; + ISA probing via PCMCIA AutoConfig (or similar) + via port 0x100.) + +8390.c: + ei_debug = 0 + ei_pingpong = 1 (If no Rx/Tx PINGPONG is desired, set to zero) + +ac3200.c: + io = 0 + irq = 0 + (EISA probing..) + +apricot.c: + io = 0x300 (Can't be altered!) + irq = 10 + +arcnet.c: + io = 0 + irqnum = 0 + shmem = 0 + num = 0 + (When probing, looks at the following possible addresses: + Suggested ones: + 0x300, 0x2E0, 0x2F0, 0x2D0 + Other ones: + 0x200, 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x270, + 0x280, 0x290, 0x2A0, 0x2B0, 0x2C0, + 0x310, 0x320, 0x330, 0x340, 0x350, 0x360, 0x370, + 0x380, 0x390, 0x3A0, 0x3E0, 0x3F0 ) + +at1700.c: + io = 0 + irq = 0 + (Probes ports: 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300) + +atp.c: *Not modularized* + (Probes ports: 0x378, 0x278, 0x3BC; + fixed IRQs: 5 and 7 ) + + +auto_irq.c: *Static kernel component* + + +de4x5.c: + io = 0x000b + irq = 10 + is_not_dec = 0 -- For SMC card using DEC 21140 set this to 1 + (EISA, and PCI probing) + +de600.c: + de600_debug = 0 + (On port 0x378, irq 7 -- lpt1; compile time configurable) + +de620.c: + bnc = 0, utp = 0 <-- Force media by setting either. + io = 0x378 (also compile-time configurable) + irq = 7 + +depca.c: + io = 0x200 + irq = 7 + (Probes ports: ISA: 0x300, 0x200; + EISA: 0x0c00 ) + +dummy.c: + No options + +e2100.c: + io = 0 + irq = 0 + (Probes ports: 0x300, 0x280, 0x380, 0x220) + +eepro.c: + io = 0 + irq = 0 + (Probes ports: 0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0x360) + +eexpress.c: + io = 0 + irq = 0 + (Probes ports: 0x300, 0x270, 0x320, 0x340) + +eql.c: + (No parameters) + +ewrk3.c: + io = 0x300 + irq = 5 + (With module no autoprobing! + On EISA-bus does EISA probing. + Static linkage probes ports on ISA bus: + 0x100, 0x120, 0x140, 0x160, 0x180, 0x1A0, 0x1C0, + 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, + 0x300, 0x340, 0x360, 0x380, 0x3A0, 0x3C0) + +hp-plus.c: + io = 0 + irq = 0 + (Probes ports: 0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340) + +hp.c: + io = 0 + irq = 0 + ne8390_rw_bugfix = 0 + (Probes ports: 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240) + +hp100.c: + hp100_port = 0 (IO-base address) + (Does EISA-probing, if on EISA-slot; + On ISA-bus probes all ports from 0x100 thru to 0x3E0 + in increments of 0x020) + +ibmtr.c: + io = 0 + (Probes ports: 0xA20, 0xA24 -- Ok, 0x220, 0x224, but IBM style..) + +lance.c: *Not modularized* + (PCI, and ISA probing; "CONFIG_PCI" needed for PCI support) + (Probes ISA ports: 0x300, 0x320, 0x340, 0x360) + +loopback.c: *Static kernel component* + +ne.c: + io = 0 + irq = 0 + config_ne_sanity = 0 + ne8390_rw_bugfix = 0; + (Probes ports: 0x300, 0x280, 0x320, 0x340, 0x360) + +net_init.c: *Static kernel component* + +ni52.c: *Not modularized* + (Probes ports: 0x300, 0x280, 0x360, 0x320, 0x340 + mems: 0xD0000, 0xD2000, 0xC8000, 0xCA000, + 0xD4000, 0xD6000, 0xD8000 ) + +ni65.c: *Not modularized* **16MB MEMORY BARRIER BUG** + (Probes ports: 0x300, 0x320, 0x340, 0x360) + +pi2.c: *Not modularized* (well, NON-STANDARD modularization!) + Only one card supported at this time. + (Probes ports: 0x380, 0x300, 0x320, 0x340, 0x360, 0x3A0) + +plip.c: + No options; goes to IO=0x278, IRQ=2 + +ppp.c: + No options (ppp-2.2+ has some, this is based on non-dynamic + version from ppp-2.1.2d) + +seeq8005.c: *Not modularized* + (Probes ports: 0x300, 0x320, 0x340, 0x360) + +sk_g16.c: *Not modularized* + (Probes ports: 0x100, 0x180, 0x208, 0x220m 0x288, 0x320, 0x328, 0x390) + +skeleton.c: *Skeleton* + +slhc.c: + No configuration parameters + +slip.c: + slip_maxdev = 256 (default value from SL_NRUNIT on slip.h) + + +smc-ultra.c: + io = 0 + irq = 0 + (Probes ports: 0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380) + +tulip.c: *Partial modularization* + (init-time memory allocation makes problems..) + +tunnel.c: + No insmod parameters + +wavelan.c: + io = 0x390 (Settable, but change not recommended) + irq = 0 (Not honoured, if changed..) + +wd.c: + io = 0 + irq = 0 + mem = 0 (Force shared-memory on address 0xC8000, or whatever..) + (Probes ports: 0x300, 0x280, 0x380, 0x240, + uses AUTOIRQ) + +znet.c: *Not modularized* + (Only one device on Zenith Z-Note (notebook?) systems, + configuration information from (EE)PROM) diff --git a/drivers/net/ac3200.c b/drivers/net/ac3200.c index 7de4322cf799..13b9472916f6 100644 --- a/drivers/net/ac3200.c +++ b/drivers/net/ac3200.c @@ -17,6 +17,10 @@ static const char *version = "ac3200.c:v1.01 7/1/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#ifdef MODULE +#include +#include +#endif #include #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/apricot.c b/drivers/net/apricot.c index 9f24e9c936fd..c9aad24f7dd7 100644 --- a/drivers/net/apricot.c +++ b/drivers/net/apricot.c @@ -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; diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c index da01976de2e4..192736622004 100644 --- a/drivers/net/at1700.c +++ b/drivers/net/at1700.c @@ -31,6 +31,11 @@ static const char *version = "at1700.c:v1.12 1/18/95 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#ifdef MODULE +#include +#include +#endif + #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/de600.c b/drivers/net/de600.c index 292eed31ce2a..24b24dfe83ac 100644 --- a/drivers/net/de600.c +++ b/drivers/net/de600.c @@ -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: + */ diff --git a/drivers/net/de620.c b/drivers/net/de620.c index 636baafc92e7..b409c8fe6894 100644 --- a/drivers/net/de620.c +++ b/drivers/net/de620.c @@ -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 */ @@ -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: */ diff --git a/drivers/net/e2100.c b/drivers/net/e2100.c index 6f421209f875..33ba4277c6b9 100644 --- a/drivers/net/e2100.c +++ b/drivers/net/e2100.c @@ -34,6 +34,11 @@ static const char *version = "e2100.c:v1.01 7/21/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c index a79a495692af..9ed8b79135b1 100644 --- a/drivers/net/eepro.c +++ b/drivers/net/eepro.c @@ -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; diff --git a/drivers/net/eql.c b/drivers/net/eql.c index 2d4684a15e82..5f0fff618655 100644 --- a/drivers/net/eql.c +++ b/drivers/net/eql.c @@ -19,8 +19,6 @@ static const char *version = "Equalizer: $Revision: 3.12 $ $Date: 1995/01/19 $ Simon Janes (simon@ncm.com)\n"; -#include - /* * Sources: * skeleton.c by Donald Becker. @@ -104,6 +102,12 @@ static const char *version = * */ +#ifdef MODULE +#include +#include +#endif + +#include #include #include #include @@ -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; } @@ -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" diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c index 5c5db743854d..3c1de0eab2bc 100644 --- a/drivers/net/hp-plus.c +++ b/drivers/net/hp-plus.c @@ -21,6 +21,11 @@ static const char *version = "hp-plus.c:v1.10 9/24/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#ifdef MODULE +#include +#include +#endif + #include /* Important -- this inlines word moves. */ #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/hp.c b/drivers/net/hp.c index 68de711b2846..d50bcf06e157 100644 --- a/drivers/net/hp.c +++ b/drivers/net/hp.c @@ -21,6 +21,12 @@ static const char *version = "hp.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; + +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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; + /* 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 */ /* * Local variables: diff --git a/drivers/net/ibmtr.c b/drivers/net/ibmtr.c index f2ca91ee65db..15612efb890a 100644 --- a/drivers/net/ibmtr.c +++ b/drivers/net/ibmtr.c @@ -30,6 +30,11 @@ active adapter is identified. */ +#ifdef MODULE +#include +#include +#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 */ diff --git a/drivers/net/ne.c b/drivers/net/ne.c index 762cd9b9d3d3..b20dc1109dc5 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -29,6 +29,12 @@ static const char *version = "ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; + +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ /* * Local variables: diff --git a/drivers/net/plip.c b/drivers/net/plip.c index 360735212acc..cc8441ddac3f 100644 --- a/drivers/net/plip.c +++ b/drivers/net/plip.c @@ -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 */ diff --git a/drivers/net/slip.c b/drivers/net/slip.c index 467628d91186..51ef3cc1eeac 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c @@ -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) diff --git a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c index 741a71e20046..88bbaf986050 100644 --- a/drivers/net/smc-ultra.c +++ b/drivers/net/smc-ultra.c @@ -40,6 +40,12 @@ static const char *version = "smc-ultra.c:v1.12 1/18/95 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; + +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ /* diff --git a/drivers/net/tulip.c b/drivers/net/tulip.c index ecc183bb910d..cba998df6344 100644 --- a/drivers/net/tulip.c +++ b/drivers/net/tulip.c @@ -16,6 +16,11 @@ static char *version = "tulip.c:v0.05 1/20/95 becker@cesdis.gsfc.nasa.gov\n"; +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -167,6 +172,7 @@ static int set_mac_address(struct device *dev, void *addr); +#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 */ /* * Local variables: diff --git a/drivers/net/wavelan.c b/drivers/net/wavelan.c index 423693c23009..96abffdddac4 100644 --- a/drivers/net/wavelan.c +++ b/drivers/net/wavelan.c @@ -31,6 +31,7 @@ #include #include #include +#include #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; diff --git a/drivers/net/wd.c b/drivers/net/wd.c index fc1ada53a28a..490d92ac1615 100644 --- a/drivers/net/wd.c +++ b/drivers/net/wd.c @@ -20,6 +20,11 @@ static const char *version = "wd.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#ifdef MODULE +#include +#include +#endif + #include #include #include @@ -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 */ /* diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 10cb736f3932..548053033d01 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -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") }; diff --git a/fs/proc/array.c b/fs/proc/array.c index fb23a6706f4e..7671e47cfe56 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -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; } diff --git a/fs/proc/base.c b/fs/proc/base.c index 25dd82fe9c25..cba04c06a664 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -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]))) diff --git a/fs/proc/inode.c b/fs/proc/inode.c index aa1f17a97efa..0dda2abb860b 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -18,6 +18,7 @@ #include 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)) { diff --git a/fs/proc/net.c b/fs/proc/net.c index f4068fb99814..56bcfe58dd29 100644 --- a/fs/proc/net.c +++ b/fs/proc/net.c @@ -43,54 +43,6 @@ 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 */ @@ -125,68 +77,65 @@ struct inode_operations proc_net_inode_operations = { NULL /* permission */ }; -static struct proc_dir_entry net_dir[] = { - { PROC_NET, 1, "." }, - { PROC_ROOT_INO, 2, ".." }, - { PROC_NET_UNIX, 4, "unix" }, -#ifdef CONFIG_INET - { PROC_NET_ARP, 3, "arp" }, - { PROC_NET_ROUTE, 5, "route" }, - { PROC_NET_DEV, 3, "dev" }, - { PROC_NET_RAW, 3, "raw" }, - { PROC_NET_TCP, 3, "tcp" }, - { PROC_NET_UDP, 3, "udp" }, - { PROC_NET_SNMP, 4, "snmp" }, - { PROC_NET_SOCKSTAT, 8, "sockstat" }, -#ifdef CONFIG_INET_RARP - { PROC_NET_RARP, 4, "rarp"}, -#endif -#ifdef CONFIG_IP_MULTICAST - { PROC_NET_IGMP, 4, "igmp"}, -#endif -#ifdef CONFIG_IP_FIREWALL - { PROC_NET_IPFWFWD, 10, "ip_forward"}, - { PROC_NET_IPFWBLK, 8, "ip_block"}, -#endif -#ifdef CONFIG_IP_MASQUERADE - { PROC_NET_IPMSQHST, 13, "ip_masquerade"}, -#endif -#ifdef CONFIG_IP_ACCT - { PROC_NET_IPACCT, 7, "ip_acct"}, -#endif -#if defined(CONFIG_WAVELAN) - { PROC_NET_WAVELAN, 7, "wavelan" }, -#endif /* defined(CONFIG_WAVELAN) */ -#endif /* CONFIG_INET */ -#ifdef CONFIG_IPX - { PROC_NET_IPX_ROUTE, 9, "ipx_route" }, - { PROC_NET_IPX, 3, "ipx" }, - { PROC_NET_IPX_INTERFACE, 13, "ipx_interface" }, -#endif /* CONFIG_IPX */ -#ifdef CONFIG_AX25 - { PROC_NET_AX25_ROUTE, 10, "ax25_route" }, - { PROC_NET_AX25, 4, "ax25" }, - { PROC_NET_AX25_CALLS, 10, "ax25_calls" }, -#ifdef CONFIG_NETROM - { PROC_NET_NR_NODES, 8, "nr_nodes" }, - { PROC_NET_NR_NEIGH, 8, "nr_neigh" }, - { PROC_NET_NR, 2, "nr" }, -#endif /* CONFIG_NETROM */ -#endif /* CONFIG_AX25 */ -#ifdef CONFIG_ATALK - { PROC_NET_ATALK, 9, "appletalk" }, - { PROC_NET_AT_ROUTE, 11,"atalk_route" }, - { PROC_NET_ATIF, 11,"atalk_iface" }, -#endif /* CONFIG_ATALK */ - { 0, 0, NULL } +#define NR_MAX_PROC_NET_DIR 100 +static struct proc_dir_entry *net_dir[NR_MAX_PROC_NET_DIR] = { + NULL, }; -#define NR_NET_DIRENTRY ((sizeof (net_dir))/(sizeof (net_dir[0])) - 1) +static int nr_net_direntry = 0; + +int proc_net_register(struct proc_dir_entry *dp) +{ + int i; + + for (i = 0; net_dir[i] != NULL; ++i ) ; + + if (i >= NR_MAX_PROC_NET_DIR) + return -ENOMEM; + + net_dir[i] = dp; + net_dir[i+1] = NULL; /* Just make sure.. */ + ++nr_net_direntry; + return i; +} + +int proc_net_unregister(int ino) +{ + int i; + for (i = 0; net_dir[i] != NULL && i < nr_net_direntry; ++i) + if (net_dir[i]->low_ino == ino) { + for ( ; net_dir[i] != NULL; ++i ) + net_dir[i] = net_dir[i+1]; + --nr_net_direntry; + return 0; + } + return -ENOENT; +} + +static int dir_get_info(char * a, char ** b, off_t d, int e, int f) +{ + return -EISDIR; +} + +void proc_net_init(void) +{ + static struct proc_dir_entry + nd_thisdir = { PROC_NET, dir_get_info, 1, "." }, + nd_rootdir = { PROC_ROOT_INO, dir_get_info, 1, ".." }; + static int already = 0; + + if (already) return; + already = 1; + + proc_net_register(&nd_thisdir); + proc_net_register(&nd_rootdir); +} + static int proc_lookupnet(struct inode * dir,const char * name, int len, - struct inode ** result) + struct inode ** result) { - struct proc_dir_entry *de; + struct proc_dir_entry **de; *result = NULL; if (!dir) @@ -195,10 +144,10 @@ static int proc_lookupnet(struct inode * dir,const char * name, int len, iput(dir); return -ENOENT; } - for (de = net_dir ; de->name ; de++) { - if (!proc_match(len, name, de)) + for (de = net_dir ; (*de)->name ; de++) { + if (!proc_match(len, name, *de)) continue; - *result = iget(dir->i_sb, de->low_ino); + *result = iget(dir->i_sb, (*de)->low_ino); iput(dir); if (!*result) return -ENOENT; @@ -217,8 +166,8 @@ static int proc_readnetdir(struct inode * inode, struct file * filp, if (!inode || !S_ISDIR(inode->i_mode)) return -EBADF; ino = inode->i_ino; - while (((unsigned) filp->f_pos) < NR_NET_DIRENTRY) { - de = net_dir + filp->f_pos; + while (((unsigned) filp->f_pos) < nr_net_direntry) { + de = net_dir[filp->f_pos]; if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino) < 0) break; filp->f_pos++; @@ -233,142 +182,36 @@ 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 i; int copied=0; char *start; + struct proc_dir_entry * dp; if (count < 0) return -EINVAL; + ino = inode->i_ino; + for (i = 0; ;i++) { + if (i >= NR_MAX_PROC_NET_DIR || (dp = net_dir[i]) == NULL) + return -EBADF; + if (dp->low_ino == ino) + break; + } if (!(page = (char*) __get_free_page(GFP_KERNEL))) return -ENOMEM; - ino = inode->i_ino; - while(bytes>0) + while (bytes>0) { - thistime=bytes; - if(bytes>PROC_BLOCK_SIZE) + int length, thistime=bytes; + if (bytes > PROC_BLOCK_SIZE) thistime=PROC_BLOCK_SIZE; - switch (ino) - { - case PROC_NET_UNIX: - length = unix_get_info(page,&start,file->f_pos,thistime); - break; -#ifdef CONFIG_INET - case PROC_NET_SOCKSTAT: - length = afinet_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_ARP: - length = arp_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_ROUTE: - length = rt_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_DEV: - length = dev_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_RAW: - length = raw_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_TCP: - length = tcp_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_UDP: - length = udp_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_SNMP: - length = snmp_get_info(page, &start, file->f_pos,thistime); - break; -#ifdef CONFIG_IP_MULTICAST - case PROC_NET_IGMP: - length = ip_mc_procinfo(page, &start, file->f_pos,thistime); - break; -#endif -#ifdef CONFIG_IP_FIREWALL - case PROC_NET_IPFWFWD: - length = ip_fw_fwd_procinfo(page, &start, file->f_pos, - thistime, (file->f_flags & O_ACCMODE) == O_RDWR); - break; - case PROC_NET_IPFWBLK: - length = ip_fw_blk_procinfo(page, &start, file->f_pos, - thistime, (file->f_flags & O_ACCMODE) == O_RDWR); - break; -#endif -#ifdef CONFIG_IP_ACCT - case PROC_NET_IPACCT: - length = ip_acct_procinfo(page, &start, file->f_pos, - thistime, (file->f_flags & O_ACCMODE) == O_RDWR); - break; -#endif -#ifdef CONFIG_IP_MASQUERADE - case PROC_NET_IPMSQHST: - length = ip_msqhst_procinfo(page, &start, file->f_pos,thistime); - break; -#endif -#ifdef CONFIG_INET_RARP - case PROC_NET_RARP: - length = rarp_get_info(page,&start,file->f_pos,thistime); - break; -#endif /* CONFIG_INET_RARP */ -#if defined(CONFIG_WAVELAN) - case PROC_NET_WAVELAN: - length = wavelan_get_info(page, &start, file->f_pos, thistime); - break; -#endif /* defined(CONFIG_WAVELAN) */ -#endif /* CONFIG_INET */ -#ifdef CONFIG_IPX - case PROC_NET_IPX_INTERFACE: - length = ipx_get_interface_info(page, &start, file->f_pos, thistime); - break; - case PROC_NET_IPX_ROUTE: - length = ipx_rt_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_IPX: - length = ipx_get_info(page,&start,file->f_pos,thistime); - break; -#endif /* CONFIG_IPX */ -#ifdef CONFIG_ATALK - case PROC_NET_ATALK: - length = atalk_get_info(page, &start, file->f_pos, thistime); - break; - case PROC_NET_AT_ROUTE: - length = atalk_rt_get_info(page, &start, file->f_pos, thistime); - break; - case PROC_NET_ATIF: - length = atalk_if_get_info(page, &start, file->f_pos, thistime); - break; -#endif /* CONFIG_ATALK */ -#ifdef CONFIG_AX25 - case PROC_NET_AX25_ROUTE: - length = ax25_rt_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_AX25: - length = ax25_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_AX25_CALLS: - length = ax25_cs_get_info(page,&start,file->f_pos,thistime); - break; -#ifdef CONFIG_NETROM - case PROC_NET_NR_NODES: - length = nr_nodes_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_NR_NEIGH: - length = nr_neigh_get_info(page,&start,file->f_pos,thistime); - break; - case PROC_NET_NR: - length = nr_get_info(page,&start,file->f_pos,thistime); - break; -#endif /* CONFIG_NETROM */ -#endif /* CONFIG_AX25 */ + length = dp->get_info(page, &start, + file->f_pos, + thistime, + (file->f_flags & O_ACCMODE) == O_RDWR); - 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 @@ -381,13 +224,12 @@ static int proc_readnet(struct inode * inode, struct file * file, * Copy the bytes */ memcpy_tofs(buf+copied, start, length); - file->f_pos+=length; /* Move down the file */ - bytes-=length; - copied+=length; - if(lengthf_pos += length; /* Move down the file */ + bytes -= length; + copied += length; + if (length /* for PAGE_SIZE */ /* ioctl command encoding: 32 bits total, command in lower 16 bits, * size of the parameter structure in the lower 14 bits of the @@ -23,7 +24,7 @@ #define IOC_INOUT (IOC_IN | IOC_OUT) /* both */ #define IOCSIZE_MASK 0x3fff0000 /* size (max 16k-1 bytes) */ #define IOCSIZE_SHIFT 16 /* how to get the size */ -#define IOCSIZE_MAX ((PAGE_SIZE-1)&(IOCSIZE_MASK >> IOC_SHIFT)) +#define IOCSIZE_MAX ((PAGE_SIZE-1)&(IOCSIZE_MASK >> IOCSIZE_SHIFT)) #define IOCCMD_MASK 0x0000ffff /* command code */ #define IOCCMD_SHIFT 0 #define IOCPARM_MASK IOCCMD_MASK diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 25f31303498e..0d6103d3816c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -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); diff --git a/include/linux/pci.h b/include/linux/pci.h index 978128f55ec2..55ae04155fdd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -272,6 +272,7 @@ #define PCI_VENDOR_ID_SMC 0x1042 #define PCI_DEVICE_ID_SMC_37C665 0x1000 +#define PCI_DEVICE_ID_SMC_37C922 0x1001 #define PCI_VENDOR_ID_ATI 0x1002 #define PCI_DEVICE_ID_ATI_M32 0x4158 @@ -404,6 +405,12 @@ #define PCI_VENDOR_ID_HP 0x103c #define PCI_DEVICE_ID_HP_J2585A 0x1030 +#define PCI_VENDOR_ID_TEKRAM 0x1de1 +#define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 + +#define PCI_VENDOR_ID_MUTECH 0x1159 +#define PCI_DEVICE_ID_MUTECH_MV1000 0x0001 + /* * The PCI interface treats multi-function devices as independent * devices. The slot/function address of each device is encoded diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index bda8127f2b64..560e55b76905 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -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; diff --git a/include/linux/socket.h b/include/linux/socket.h index 9ff308ee4182..a0efebca6736 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -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 diff --git a/include/net/arp.h b/include/net/arp.h index ea5c2f9f9622..293e7c6a5d32 100644 --- a/include/net/arp.h +++ b/include/net/arp.h @@ -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, diff --git a/include/net/ax25.h b/include/net/ax25.h index 83558f44bca1..47353145dd15 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h @@ -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); diff --git a/include/net/ip.h b/include/net/ip.h index 3f5f828b8f98..cd33fd883f65 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -43,7 +43,7 @@ #ifdef CONFIG_IP_MULTICAST extern void ip_mc_dropsocket(struct sock *); extern void ip_mc_dropdevice(struct device *dev); -extern int ip_mc_procinfo(char *, char **, off_t, int); +extern int ip_mc_procinfo(char *, char **, off_t, int, int); #endif diff --git a/include/net/rarp.h b/include/net/rarp.h index 02ee7784f0bf..7bfb08ef1f36 100644 --- a/include/net/rarp.h +++ b/include/net/rarp.h @@ -3,12 +3,10 @@ #define _RARP_H extern int rarp_ioctl(unsigned int cmd, void *arg); -extern int rarp_rcv(struct sk_buff *skb, - struct device *dev, - struct packet_type *pt); extern int rarp_get_info(char *buffer, char **start, off_t offset, - int length); + int length, + int dummy); #endif /* _RARP_H */ diff --git a/include/net/route.h b/include/net/route.h index abe6a8ff4941..424c5862ac86 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -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; diff --git a/kernel/ksyms.c b/kernel/ksyms.c index c894df3272a7..cde576f731c2 100644 --- a/kernel/ksyms.c +++ b/kernel/ksyms.c @@ -44,6 +44,7 @@ #include #include #include +#include #if defined(CONFIG_PPP) || defined(CONFIG_SLIP) #include "../drivers/net/slhc.h" #endif @@ -65,7 +66,7 @@ extern char *get_options(char *str, int *ints); extern void set_device_ro(int dev,int flag); extern struct file_operations * get_blkfops(unsigned int); - + extern void *sys_call_table; #ifdef CONFIG_FTAPE @@ -94,6 +95,7 @@ extern 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), @@ -446,6 +456,10 @@ struct symbol_table symbol_table = { X(msdos_unlink), X(msdos_unlink_umsdos), X(msdos_write_inode), +#endif +#ifdef CONFIG_PROC_FS + X(proc_net_register), + X(proc_net_unregister), #endif /******************************************************** * Do not add anything below this line, diff --git a/kernel/module.c b/kernel/module.c index 4890cabf36ad..48c61f250397 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -34,6 +34,10 @@ * and finally: reducing the number of entries in ksyms.c * since every subsystem should now be able to decide and * control exactly what symbols it wants to export, locally! + * + * On 1-Aug-95: 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; } /* diff --git a/net/802/Makefile b/net/802/Makefile index 2665a0629387..4874ff482f6e 100644 --- a/net/802/Makefile +++ b/net/802/Makefile @@ -45,5 +45,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/Makefile b/net/Makefile index c697659f29a2..ab3e4f34c20a 100644 --- a/net/Makefile +++ b/net/Makefile @@ -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 diff --git a/net/appletalk/Makefile b/net/appletalk/Makefile index bb67941c2d14..0dcc291f3445 100644 --- a/net/appletalk/Makefile +++ b/net/appletalk/Makefile @@ -24,6 +24,6 @@ dep: tar: tar -cvf /dev/f1 . - +modules: include $(TOPDIR)/Rules.make diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index b96d2885d18c..947a24db39e1 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -49,6 +49,7 @@ #include #include #include +#include #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 diff --git a/net/ax25/Makefile b/net/ax25/Makefile index a913138e8218..bb900ef3e753 100644 --- a/net/ax25/Makefile +++ b/net/ax25/Makefile @@ -30,5 +30,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index b3546395497a..e462dd3672a1 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -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"); } diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c index dd90bebd50bc..871f7314c5bb 100644 --- a/net/ax25/ax25_route.c +++ b/net/ax25/ax25_route.c @@ -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; diff --git a/net/core/Makefile b/net/core/Makefile index 4613297c7c5e..3f7e70a067ec 100644 --- a/net/core/Makefile +++ b/net/core/Makefile @@ -33,5 +33,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/core/datagram.c b/net/core/datagram.c index 3fa9a6ac43a2..fbf40d5b5437 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -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) { diff --git a/net/core/dev.c b/net/core/dev.c index e20835ad591d..24cc6f872036 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -69,7 +69,7 @@ #include #include #include - +#include /* * 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" }); + } diff --git a/net/ethernet/Makefile b/net/ethernet/Makefile index 5333cf15b1db..35822c99acf3 100644 --- a/net/ethernet/Makefile +++ b/net/ethernet/Makefile @@ -47,5 +47,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index 0ae8cde2f0ee..22f0912de762 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile @@ -12,20 +12,22 @@ .s.o: $(AS) -o $*.o $< -OBJS := utils.o route.o proc.o timer.o protocol.o packet.o \ +IPV4_OBJS := utils.o route.o proc.o timer.o protocol.o packet.o \ arp.o ip.o raw.o icmp.o tcp.o udp.o devinet.o af_inet.o \ igmp.o ip_fw.o ipip.o -ifdef CONFIG_INET_RARP - -OBJS := $(OBJS) rarp.o +MODULES := +ifdef CONFIG_INET_RARP +IPV4_OBJS := $(IPV4_OBJS) rarp.o +else +MODULES := $(MODULES) rarp.o endif ifdef CONFIG_INET -ipv4.o: $(OBJS) - $(LD) -r -o ipv4.o $(OBJS) +ipv4.o: $(IPV4_OBJS) + $(LD) -r -o ipv4.o $(IPV4_OBJS) else @@ -34,11 +36,29 @@ 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 diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index bd03ca50998f..e4a49f5eb623 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -65,6 +65,7 @@ #include #include #include +#include #include #include @@ -87,7 +88,13 @@ #define min(a,b) ((a)<(b)?(a):(b)) extern struct proto packet_prot; +extern int raw_get_info(char *, char **, off_t, int, int); +extern int snmp_get_info(char *, char **, off_t, int, int); +extern int afinet_get_info(char *, char **, off_t, int, int); +extern int tcp_get_info(char *, char **, off_t, int, int); +extern int udp_get_info(char *, char **, off_t, int, int); +int (*rarp_ioctl_hook)(int,void*) = NULL; /* * See if a socket number is in use. @@ -496,8 +503,8 @@ 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" }); +} diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 96281531fb13..0d80fd2ed70f 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -84,6 +84,7 @@ #include #endif #endif +#include /* @@ -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" }); } diff --git a/net/ipv4/ip.c b/net/ipv4/ip.c index c9fbc17ffd26..720e8f805db1 100644 --- a/net/ipv4/ip.c +++ b/net/ipv4/ip.c @@ -125,6 +125,7 @@ #include #include #include +#include #include #include @@ -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 } diff --git a/net/ipv4/ip_fw.c b/net/ipv4/ip_fw.c index 2bfbe4ff71c9..380297212384 100644 --- a/net/ipv4/ip_fw.c +++ b/net/ipv4/ip_fw.c @@ -83,6 +83,7 @@ #include #include #include +#include /* * 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 +} diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index e61dc0e43e24..f86380f3c568 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c @@ -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; } - diff --git a/net/ipv4/rarp.c b/net/ipv4/rarp.c index 9cc86b335d83..2603c5cdea40 100644 --- a/net/ipv4/rarp.c +++ b/net/ipv4/rarp.c @@ -31,12 +31,18 @@ * */ +#include + +#ifdef MODULE +#include +#include +#endif + #include #include #include #include #include -#include #include #include #include @@ -59,8 +65,11 @@ #ifdef CONFIG_AX25 #include #endif +#include + +#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 diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 16fe5002082c..de36085974e2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -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; diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 58491e421244..02ce3082715f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -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; diff --git a/net/ipx/Makefile b/net/ipx/Makefile index ca3101c21296..b3247af96624 100644 --- a/net/ipx/Makefile +++ b/net/ipx/Makefile @@ -25,5 +25,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 26d8aa1ce27c..6d266aaf6e2e 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c @@ -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"); diff --git a/net/netrom/Makefile b/net/netrom/Makefile index 3fc5397dcec9..1eb61059eae6 100644 --- a/net/netrom/Makefile +++ b/net/netrom/Makefile @@ -30,5 +30,6 @@ dep: tar: tar -cvf /dev/f1 . +modules: include $(TOPDIR)/Rules.make diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 5c6b0db383f1..fa56bdf1670d 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -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 diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 2cfd0c2543eb..b386479128f9 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -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; diff --git a/net/socket.c b/net/socket.c index a644878cb343..4c6fc0439830 100644 --- a/net/socket.c +++ b/net/socket.c @@ -62,6 +62,7 @@ #include #include #include +#include #include #include @@ -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(); diff --git a/net/unix/Makefile b/net/unix/Makefile index f42d996ab018..da17c0d443f8 100644 --- a/net/unix/Makefile +++ b/net/unix/Makefile @@ -22,6 +22,7 @@ unix.o: $(OBJS) dep: $(CPP) -M *.c > .depend +modules: tar: tar -cvf /dev/f1 . diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index e8fdd26ea84f..70bfc7a7417a 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -39,6 +39,7 @@ #include #include #include +#include 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: + */ -- 2.39.5