diff -u --recursive --new-file v1.3.24/linux/CREDITS linux/CREDITS
--- v1.3.24/linux/CREDITS	Sun Sep  3 12:26:47 1995
+++ linux/CREDITS	Fri Sep  8 07:42:57 1995
@@ -7,7 +7,7 @@
 			Linus
 ----------
 
-M: Matti Aarnio
+N: Matti Aarnio
 E: mea@utu.fi
 D: LILO for AHA1542, modularized several of drivers/net/,
 D: dynamic SLIP devices, dynamic /proc/net/, true size /proc/ksyms,
@@ -15,8 +15,13 @@
 D: Documenting various parts of network subsystem (kernel side)
 
 N: Werner Almesberger
-E: almesber@bernina.ethz.ch
+E: werner.almesberger@lrc.di.epfl.ch
 D: dosfs, LILO, some fd features, various other hacks here and there
+S: Ecole Polytechnique Federale de Lausanne
+S: DI-LRC
+S: INR (Ecublens)
+S: CH-1015 Lausanne
+S: Switzerland
 
 N: H. Peter Anvin
 E: Peter.Anvin@linux.org 
@@ -672,6 +677,13 @@
 S: Reinholdstrasse 14
 S: D-37083 Goettingen
 S: Germany
+
+N: David Mosberger-Tang
+E: davidm@azstarnet.com
+D: Linux/Alpha
+S: 2552 E. Copper Street
+S: Tucson, AZ 85716-2406
+S: USA
 
 N: Ian A. Murdock
 E: imurdock@gnu.ai.mit.edu
diff -u --recursive --new-file v1.3.24/linux/Documentation/networking/arcnet-hardware.txt linux/Documentation/networking/arcnet-hardware.txt
--- v1.3.24/linux/Documentation/networking/arcnet-hardware.txt	Thu Jan  1 02:00:00 1970
+++ linux/Documentation/networking/arcnet-hardware.txt	Fri Sep  8 07:42:57 1995
@@ -0,0 +1,2103 @@
+
+-----------------------------------------------------------------------------
+This file is a supplement to README.arcnet.  Please read that for general
+driver configuration help.
+-----------------------------------------------------------------------------
+
+Because so many people (myself included) seem to have obtained ARCnet cards
+without manuals, this file contains a quick introduction to ARCnet hardware,
+some cabling tips, and a listing of all jumper settings I can find. Please
+e-mail apenwarr@foxnet.net with any settings for your particular card, or
+any other information you have!
+
+
+INTRODUCTION TO ARCNET
+----------------------
+
+ARCnet is a network type which works in a way similar to popular "ethernet"
+networks but which is also different in some very important ways.
+
+First of all, you can get ARCnet cards in two speeds: 2.5Mbps (slower than
+ethernet) and 100Mbps (faster than ethernet).  The two hardware types, as
+far as I'm aware, are not compatible and so you cannot wire a 100Mbps card
+to a 2.5Mbps card, and so on.  From what I hear, my driver does work with
+100Mbps cards, but I haven't been able to verify this myself, since I only
+have the 2.5Mbps variety.
+
+You also cannot connect an ARCnet card to any kind of ethernet card and
+expect it to work.  
+
+There are two "types" of ARCnet - STAR topology and BUS topology.  This
+refers to how the cards are meant to be wired together.  According to all
+available documentation, you can only connect STAR cards to STAR cards and
+BUS cards to BUS cards.  That makes sense, right?  Well, it's not quite
+true; see below under "Cabling."
+
+Once you get past these little stumbling blocks, ARCnet is actually quite a
+well-designed standard.  It uses something called "modified token passing"
+which makes it completely incompatible with so-called "Token Ring" cards,
+but which makes transfers much more reliable than with ethernet.  In fact,
+ARCnet will guarantee that a packet arrives safely at the destination, and
+even if it can't possibly be delivered properly (ie. because of a cable
+break) it will at least tell the sender about it.
+
+In addition, all known ARCnet cards have an (almost) identical programming
+interface.  This means that with one "arcnet" driver you can support any
+card; whereas, with ethernet, each manufacturer uses what is sometimes a
+completely different programming interface, leading to a lot of different,
+sometimes very similar, ethernet drivers.  Of course, always using the same
+programming interface also means that when high-performance hardware
+facilities like PCI busmastering DMA appear, it's hard to take advantage of
+them.
+
+One thing that makes ARCnet cards difficult to program for, however, is the
+limit on their packet sizes; standard ARCnet can only send packets that are
+up to 508 bytes in length.  This is smaller than the internet "bare minimum"
+of 576 bytes, let alone the ethernet MTU of 1500.  To compensate, an extra
+level of encapsulation is defined by RFC1201 called "packet splitting" which
+allows "virtual packets" to grow as large as 64K each, although they are
+generally kept down to the ethernet-style 1500 bytes.
+
+
+CABLING ARCNET NETWORKS
+-----------------------
+ - Information in this section is from several contributors, including:
+ 	Stephen A. Wood <saw@hallc1.cebaf.gov>
+ 	John Paul Morrison <jmorriso@bogomips.ee.ubc.ca>
+ 	Joachim Koenig <jojo@repas.de>
+ 	Vojtech Pavlik <vpav4328@Diana.troja.mff.cuni.cz>
+
+ - I, Avery Pennarun, tried to arrange it into something that makes sense
+   when all put together.  All mistakes, then, are most likely my fault.
+   Bug me about them.
+
+Ideally, according to documentation, ARCnet networks should be connected
+with 93 Ohm cables with 93 Ohm resistors as terminators.  I use TV cable and
+no resistors to connect two STAR cards.  Blah.  Your mileage may vary.
+
+Here's some more specific information about cables, sent in by Joachim
+Koenig (slight touchups by me):
+
+	The following cables are valid for ARCnet:
+		RG-62  93 Ohm  up to 610 m
+		RG-59/U 75 Ohm up to 457 m
+		RG-11/U 75 Ohm up to 533 m
+		IBM Typ 1 150 Ohm up to 200 m
+		IBM Typ 3 100 Ohm up to 100 m
+		
+So you can see that while 93 Ohms is ideal, you can still go half a
+kilometer with 75 Ohm TV cable.
+
+The above applies to all known ARCnet cards.  Specific to STAR cards,
+though, Stephen A. Wood has some information:
+
+	When I bought my two cards at a garage sale, they came with little
+	box with four BNC connectors on the outside.  The shields of the
+	four connectors are all grounded together, and the center conductors
+	were connected by the following resistor network.
+
+	              |
+	              |
+        	      R
+	              |
+	         ---R-+-R---
+	              | 
+	              R
+	              |
+	              |
+
+	Where R is 47 Ohms.  A little math shows that if you terminate three
+	of the outputs with 90 ohms (A cable or a terminator), the remaining
+	input sees 90 Ohms.  Therefore this box is impedance matched to 90
+	Ohm cable.  So this box can be used to connect 2 to 4 nodes
+	together.
+
+If you really use your imagination, you can see how the above diagram kind
+of looks like a "star."  John Paul Morrison makes a few notes about the
+above:
+
+	The "little box with four BNC connectors on the outside" is an
+	Arcnet passive hub. They're worth about $5 (just so you don't get
+	ripped off).
+
+	I don't have specs at my fingertips. Basically, don't use too many
+	passive hubs (or none at all, apparently passive hubs are A Bad
+	Thing.  On the other hand, they're a really cheap way to do things.)
+
+	Arcnet active hubs are available; they are analogous to Ethernet
+	twisted pair hubs. You can plug either a single station or a passive
+	hub into each port on the active hub. If you plug in a passive hub,
+	that lets you connect three more stations.
+	
+According to Vojtech Pavlik, there shouldn't be more than one passive hub
+between two "active ends", an active end being an active hub or an ARCnet
+card.
+	
+As for BUS cards, they're even easier (for more than two cards, anyway; you
+can't get much simpler than direct-connecting two STAR cards with a TV
+cable).  They work just like Thinnet ethernet; it looks like this:
+
+	R------+------+------+------R
+	       |      |      |
+	       NODE   NODE   NODE
+
+Where R is the terminator as usual, and '+' represents a T connector.
+
+Okay, then, what if you have a combination of BUS cards and STAR cards?  You
+probably can't do ANY combination you want, but Vojtech Pavlik explains what
+works for him (WARNING: I, Avery, haven't tried anything this weird myself):
+
+	All that I need is to terminate each end with a STAR card. I think I
+	can even connect the cards like this:
+
+	STAR------+-----+-----STAR
+	         BUS   BUS
+
+	Where "-" stands for coax, "+" for T connector, "STAR" for star-type
+	arcnet card and BUS for bus-type arcnet cards. I think there will be
+	no terminators necessary.
+
+He also explains (I paraphrase slightly here):
+
+	R-+----------STAR
+	 BUS
+ 
+	In this case, I have to terminate the end with the bus card
+	using a terminator. ("R" - terminator, "+" - T connector "-" - coax,
+	everything other is probably clear)
+	
+	[...]
+ 
+	And _MAYBE_ you can do even more complicated and insane combinations 
+	when just thinking of the STAR card as a BUS one with an inside 
+	installed terminator. (STAR cards are NOT bus ones with terminator, 
+	but I believe that they electrically act like them). 
+
+And finally, he gives a shortcut for BUS users that are low on supplies:
+
+	When you have really short cables (about four meters in total) and have lack
+	of terminators or T's you can leave one of the terminators out .... or put
+	it in the middle like this:
+ 
+	BUS-----T-----BUS
+        	R
+ 
+	It's ugly, but it works.
+	
+I don't pretend to understand what's happening there, but then again, I
+don't have BUS cards either.
+
+
+
+SETTING THE JUMPERS
+-------------------
+
+All ARCnet cards should have a total of four or five different settings:
+
+  - the I/O address:  this is the "port" your ARCnet card is on.  Probed
+    values, as of v0.14, are only from 0x200 through 0x3F0. (If your card
+    has additional ones, which is possible, please tell me.) This should not
+    be the same as any other device on your system.  According to a doc I
+    got from Novell, MS Windows prefers values of 0x300 or more, eating
+    netconnections on my system otherwise.
+	- Avery's favourite: 0x300.
+
+  - the IRQ:  on 8-bit cards, it might be 2 (9), 3, 4, 5, or 7.
+             on 16-bit cards, it might be 2 (9), 3, 4, 5, 7, or 10-15.  Make
+    sure this is different from any other card on your system.  Note that
+    IRQ2 is the same as IRQ9, as far as Linux is concerned.
+	- Avery's favourite: IRQ2.
+
+  - the memory address:  Unlike most cards, ARCnets use "shared memory" for
+    copying buffers around.  Make SURE it doesn't conflict with any other
+    used memory in your system!
+	A0000		- VGA graphics memory (ok if you don't have VGA)
+        B0000		- Monochrome text mode
+        C0000		\  One of these is your VGA BIOS - usually C0000.
+        E0000		/
+        F0000		- System BIOS
+
+    Anything less than 0xA0000 is, well, a BAD idea since it isn't above
+    640k.
+	- Avery's favourite: 0xD0000
+
+  - the station address:  Every ARCnet card has its own "unique" network
+    address from 0 to 255.  Unlike ethernet, you can set this address
+    yourself with a jumper.  Since it's only 8 bits, you can only have 254
+    ARCnet cards on a network.  DON'T use 0 or 255, since these are
+    reserved. (although neat stuff will probably happen if you DO use them). 
+    By the way, if you haven't already guessed, don't set this the same as
+    any other ARCnet on your network!
+	- Avery's favourite:  3 and 4.  Not that it matters.
+	
+  - There may be ETS1 and ETS2 settings.  These may or may not make a
+    difference, but are used to change the delays used when powering up
+    a computer on the network.  This is only necessary when wiring VERY
+    long range ARCnet networks, on the order of 4km or so; in any case,
+    the only real requirement here is that all cards on the network with
+    ETS1 and ETS2 jumpers have them in the same position.
+
+
+Here's the all the jumper information I could obtain for individual card
+types.  Unfortunately, there is a lot of duplicated information here. 
+Someday, I may get around to actually organizing it.  Until then... too much
+is better than too little, I say :)
+
+The model # is listed right above specifics for that card, so you should be
+able to use your text viewer's "search" function to find the entry you want. 
+
+If your model isn't listed, and has different settings, PLEASE PLEASE tell
+me.  I had to figure mine out without the manual, and it WASN'T FUN!
+
+Even if your ARCnet model isn't listed, but has the same jumpers as another
+model that is, please e-mail me to say so.
+
+Cards Listed in this file (in this order, mostly):
+
+	Manufacturer	Model #		Bits
+	------------	-------		----
+	SMC		PC100		8
+	SMC		PC110		8
+	SMC		PC120		8
+	SMC		PC130		8
+	SMC		PC270E		8
+	SMC		PC500		16
+	SMC		PC500Longboard	16
+	SMC		PC550Longboard	16
+	SMC		PC600		16
+	SMC?		LCS-8830-T	16?
+	Puredata	PDI507		16
+	CNet Tech	CN120-Series	8
+	CNet Tech	CN160-Series	16
+	No Name		--		8/16
+	No Name		Taiwan R.O.C(?)	8
+	Tiara		Tiara Lancard(?)
+	
+
+** SMC = Standard Microsystems Corp.
+** CNet Tech = CNet Technology, Inc.
+
+
+Unclassified Stuff
+------------------
+  - Please send any other information you can find.
+  
+  - And some unknowns (other info is welcome!):
+     From: root@ultraworld.xs4all.nl (Timo Hilbrink)
+     To: apenwarr@foxnet.net (Avery Pennarun)
+     Date: Wed, 26 Oct 1994 02:10:32 +0000 (GMT)
+     Reply-To: timoh@xs4all.nl
+
+     [...parts deleted...]
+
+     About the jumpers: On my PC130 there is one more jumper, located near the
+     cable-connector and it's for changing to star or bus topology; 
+     closed: star - open: bus
+     On the PC500 are some more jumper-pins, one block labled with RX,PDN,TXI
+     and another with ALE,LA17,LA18,LA19 these are undocumented..
+
+     [...more parts deleted...]
+
+     --- CUT ---
+
+
+** Standard Microsystems Corp (SMC) **
+PC100, PC110, PC120, PC130 (8-bit cards)
+PC500, PC600 (16-bit cards)
+---------------------------------
+  - mainly from Avery Pennarun <apenwarr@foxnet.net>.  Values depicted are
+    from Avery's setup.
+  - special thanks to Timo Hilbrink <timoh@xs4all.nl> for noting that PC120,
+    130, 500, and 600 all have the same switches as Avery's PC100. 
+    PC500/600 have several extra, undocumented pins though. (?)
+  - PC110 settings were verified by Stephen A. Wood <saw@cebaf.gov>
+  - On the other hand, John Edward Bauer <jbauer@badlands.NoDak.edu> said
+    the PC110 settings are all wrong.  In his case, you need to switch all
+    the 1's with 0's.  If you're having problems, try that.
+  - Also, the JP- and S-numbers probably don't match your card exactly.  Try
+    to find jumpers/switches with the same number of settings - it's
+    probably more reliable.
+  
+
+     JP5		       [|]    :    :    :    :
+(IRQ Setting)		      IRQ2  IRQ3 IRQ4 IRQ5 IRQ7
+		Put exactly one jumper on exactly one set of pins.
+
+                          1  2   3  4  5  6   7  8  9 10
+     S1                /----------------------------------\
+(I/O and Memory        |  1  1 * 0  0  0  0 * 1  1  0  1  |
+ addresses)            \----------------------------------/
+                          |--|   |--------|   |--------|
+                          (a)       (b)           (m)
+
+		a: The first digit of the I/O address.
+			Setting		Value
+			-------		-----
+			00		0
+			01		1
+			10		2
+			11		3
+
+		b: The second digit of the I/O address.
+			Setting		Value
+			-------		-----
+			0000		0
+			0001		1
+			0010		2
+			...		...
+			1110		E
+			1111		F
+
+		The I/O address is in the form ab0.  For example, if
+		a is 0x2 and b is 0xE, the address will be 0x2E0.
+
+		DO NOT SET THIS LESS THAN 0x200!!!!!
+
+
+		m: The first digit of the memory address.
+			Setting		Value
+			-------		-----
+			0000		0
+			0001		1
+			0010		2
+			...		...
+			1110		E
+			1111		F
+
+		The memory address is in the form m0000.  For example, if
+		m is D, the address will be 0xD0000.
+
+		DO NOT SET THIS TO C0000, F0000, OR LESS THAN A0000!
+
+                          1  2  3  4  5  6  7  8
+     S2                /--------------------------\
+(Station Address)      |  1  1  0  0  0  0  0  0  |
+                       \--------------------------/
+
+			Setting		Value
+			-------		-----
+			00000000	00
+			10000000	01
+			01000000	02
+			...
+			01111111	FE
+			11111111	FF
+
+		Note that this is binary with the digits reversed!
+
+		DO NOT SET THIS TO 0 OR 255 (0xFF)!
+
+
+*****************************************************************************
+
+** Standard Microsystems Corp (SMC) **
+PC130E/PC270E (8-bit cards)
+---------------------------
+  - from Juergen Seifert <seifert@htwm.de>
+
+
+STANDARD MICROSYSTEMS CORPORATION (SMC) ARCNET(R)-PC130E/PC270E
+===============================================================
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the following Original SMC Manual 
+
+             "Configuration Guide for
+             ARCNET(R)-PC130E/PC270
+            Network Controller Boards
+                Pub. # 900.044A
+                   June, 1989"
+
+ARCNET is a registered trademark of the Datapoint Corporation
+SMC is a registered trademark of the Standard Microsystems Corporation  
+
+The PC130E is an enhanced version of the PC130 board, is equipped with a 
+standard BNC female connector for connection to RG-62/U coax cable.
+Since this board is designed both for point-to-point connection in star
+networks and for connection to bus networks, it is downwardly compatible 
+with all the other standard boards designed for coax networks (that is,
+the PC120, PC110 and PC100 star topology boards and the PC220, PC210 and 
+PC200 bus topology boards).
+
+The PC270E is an enhanced version of the PC260 board, is equipped with two 
+modular RJ11-type jacks for connection to twisted pair wiring.
+It can be used in a star or a daisy-chained network.
+
+
+         8 7 6 5 4 3 2 1
+    ________________________________________________________________
+   |   |       S1        |                                          |
+   |   |_________________|                                          |
+   |    Offs|Base |I/O Addr                                         |
+   |     RAM Addr |                                              ___|
+   |         ___  ___                                       CR3 |___|
+   |        |   \/   |                                      CR4 |___|
+   |        |  PROM  |                                           ___|
+   |        |        |                                        N |   | 8
+   |        | SOCKET |                                        o |   | 7
+   |        |________|                                        d |   | 6
+   |                   ___________________                    e |   | 5
+   |                  |                   |                   A | S | 4
+   |       |oo| EXT2  |                   |                   d | 2 | 3
+   |       |oo| EXT1  |       SMC         |                   d |   | 2
+   |       |oo| ROM   |      90C63        |                   r |___| 1
+   |       |oo| IRQ7  |                   |               |o|  _____|
+   |       |oo| IRQ5  |                   |               |o| | J1  |
+   |       |oo| IRQ4  |                   |              STAR |_____|
+   |       |oo| IRQ3  |                   |                   | J2  |
+   |       |oo| IRQ2  |___________________|                   |_____|
+   |___                                               ______________|
+       |                                             |
+       |_____________________________________________|
+
+Legend:
+
+SMC 90C63	ARCNET Controller / Transceiver /Logic
+S1	1-3:	I/O Base Address Select
+	4-6:	Memory Base Address Select
+	7-8:	RAM Offset Select
+S2	1-8:	Node ID Select
+EXT		Extended Timeout Select
+ROM		ROM Enable Select
+STAR		Selected - Star Topology	(PC130E only)
+		Deselected - Bus Topology	(PC130E only)
+CR3/CR4		Diagnostic LEDs
+J1		BNC RG62/U Connector		(PC130E only)
+J1		6-position Telephone Jack	(PC270E only)
+J2		6-position Telephone Jack	(PC270E only)
+
+Setting one of the switches to Off/Open means "1", On/Closed means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in group S2 are used to set the node ID.
+Each node attached to the network must have an unique node ID which
+must be diffrent from 0.
+Switch 1 serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+    Switch | Value
+    -------|-------
+      1    |   1
+      2    |   2
+      3    |   4
+      4    |   8
+      5    |  16
+      6    |  32
+      7    |  64
+      8    | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   8 7 6 5 4 3 2 1 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The first three switches in switch group S1 are used to select one
+of eight possible I/O Base addresses using the followig table
+
+
+   Switch | Hex I/O
+   1 2 3  | Address
+   -------|--------
+   0 0 0  |  260
+   0 0 1  |  290
+   0 1 0  |  2E0  (Manufactor's default)
+   0 1 1  |  2F0
+   1 0 0  |  300
+   1 0 1  |  350
+   1 1 0  |  380
+   1 1 1  |  3E0
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The memory buffer requires 2K of a 16K block of RAM. The base of this
+16K block can be located in any of eight positions.
+Switches 4-6 of switch group S1 select the Base of the 16K block.
+Within that 16K address space, the buffer may be assigned any one of four 
+positions, determined by the offset, switches 7 and 8 of group S1.
+
+   Switch     | Hex RAM | Hex ROM
+   4 5 6  7 8 | Address | Address *)
+   -----------|---------|-----------
+   0 0 0  0 0 |  C0000  |  C2000
+   0 0 0  0 1 |  C0800  |  C2000
+   0 0 0  1 0 |  C1000  |  C2000
+   0 0 0  1 1 |  C1800  |  C2000
+              |         |
+   0 0 1  0 0 |  C4000  |  C6000
+   0 0 1  0 1 |  C4800  |  C6000
+   0 0 1  1 0 |  C5000  |  C6000
+   0 0 1  1 1 |  C5800  |  C6000
+              |         |
+   0 1 0  0 0 |  CC000  |  CE000
+   0 1 0  0 1 |  CC800  |  CE000
+   0 1 0  1 0 |  CD000  |  CE000
+   0 1 0  1 1 |  CD800  |  CE000
+              |         |
+   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
+   0 1 1  0 1 |  D0800  |  D2000
+   0 1 1  1 0 |  D1000  |  D2000
+   0 1 1  1 1 |  D1800  |  D2000
+              |         |
+   1 0 0  0 0 |  D4000  |  D6000
+   1 0 0  0 1 |  D4800  |  D6000
+   1 0 0  1 0 |  D5000  |  D6000
+   1 0 0  1 1 |  D5800  |  D6000
+              |         |
+   1 0 1  0 0 |  D8000  |  DA000
+   1 0 1  0 1 |  D8800  |  DA000
+   1 0 1  1 0 |  D9000  |  DA000
+   1 0 1  1 1 |  D9800  |  DA000
+              |         |
+   1 1 0  0 0 |  DC000  |  DE000
+   1 1 0  0 1 |  DC800  |  DE000
+   1 1 0  1 0 |  DD000  |  DE000
+   1 1 0  1 1 |  DD800  |  DE000
+              |         |
+   1 1 1  0 0 |  E0000  |  E2000
+   1 1 1  0 1 |  E0800  |  E2000
+   1 1 1  1 0 |  E1000  |  E2000
+   1 1 1  1 1 |  E1800  |  E2000
+  
+*) To enable the 8K Boot PROM install the jumper ROM.
+   The default is jumper ROM not installed.
+
+
+Setting the Timeouts and Interrupt
+----------------------------------
+
+The jumpers labeled EXT1 and EXT2 are used to determine the timeout 
+parameters. These two jumpers are normally left open.
+Refer to the COM9026 Data Sheet for alternate configurations.
+
+To select a hardware interrupt level set one (only one!) of the jumpers
+IRQ2, IRQ3, IRQ4, IRQ5, IRQ7. The Manufactor's default is IRQ2.
+ 
+
+Configuring the PC130E for Star or Bus Topology
+-----------------------------------------------
+
+The single jumper labeled STAR is used to configure the PC130E board for 
+star or bus topology.
+When the jumper is installed, the board may be used in a star network, when 
+it is removed, the board can be used in a bus topology.
+
+
+Diagnostic LEDs
+---------------
+
+Two diagnostic LEDs are visible on the rear bracket of the board.
+The green LED monitors the network activity: the red one shows the
+board activity:
+
+ Green  | Status               Red      | Status
+ -------|-------------------   ---------|-------------------
+  on    | normal activity      flash/on | data transfer
+  blink | reconfiguration      off      | no data transfer;
+  off   | defectiv board or             | incorect memory or
+        | node ID is zero               | I/O address
+
+
+*****************************************************************************
+
+** Standard Microsystems Corp (SMC) **
+PC500/PC550 Long Board (16-bit cards)
+-------------------------------------
+  - from Juergen Seifert <seifert@htwm.de>
+
+
+STANDARD MICROSYSTEMS CORPORATION (SMC) ARCNET-PC500/PC550 Long Board
+=====================================================================
+
+Note: There is another Version of the PC500 called Short Version, which 
+      is different in hard- and software! The most important differences
+      are:
+      - The long board has no Shared memory
+      - On the long board the selection of the interrupt is done by binary
+        coded switch, on the short board directly by jumper.
+
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the following Original SMC Manual 
+
+             "Configuration Guide for
+             SMC ARCNET-PC500/PC550
+         Series Network Controller Boards
+             Pub. # 900.033 Rev. A
+                November, 1989"
+
+ARCNET is a registered trademark of the Datapoint Corporation
+SMC is a registered trademark of the Standard Microsystems Corporation  
+
+The PC500 is equipped with a standard BNC female connector for connection
+to RG-62/U coax cable.
+The board is designed both for point-to-point connection in star networks
+and for connection to bus networks.
+
+The PC550 is equipped with two modular RJ11-type jacks for connection
+to twisted pair wiring.
+It can be used in a star or a daisy-chained network.
+
+       1 
+       0 9 8 7 6 5 4 3 2 1     6 5 4 3 2 1
+    ____________________________________________________________________
+   < |         SW1         | |     SW2     |                            |
+   > |_____________________| |_____________|                            |
+   <   IRQ    |I/O Addr                                                 |
+   >                                                                 ___|
+   <                                                            CR4 |___|
+   >                                                            CR3 |___|
+   <                                                                 ___|
+   >                                                              N |   | 8
+   <                                                              o |   | 7
+   >                                                              d | S | 6
+   <                                                              e | W | 5
+   >                                                              A | 3 | 4
+   <                                                              d |   | 3
+   >                                                              d |   | 2
+   <                                                              r |___| 1
+   >                                                        |o|    _____|
+   <                                                        |o|   | J1  |
+   >  3 1                                                   JP6   |_____|
+   < |o|o| JP2                                                    | J2  |
+   > |o|o|                                                        |_____|
+   <  4 2__                                               ______________|
+   >    |  |                                             |
+   <____|  |_____________________________________________|
+
+Legend:
+
+SW1	1-6:	I/O Base Address Select
+	7-10:	Interrupt Select
+SW2	1-6:	Reserved for Future Use
+SW3	1-8:	Node ID Select
+JP2	1-4:	Extended Timeout Select
+JP6		Selected - Star Topology	(PC500 only)
+		Deselected - Bus Topology	(PC500 only)
+CR3	Green	Monitors Network Activity
+CR4	Red	Monitors Board Activity
+J1		BNC RG62/U Connector		(PC500 only)
+J1		6-position Telephone Jack	(PC550 only)
+J2		6-position Telephone Jack	(PC550 only)
+
+Setting one of the switches to Off/Open means "1", On/Closed means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in group SW3 are used to set the node ID. Each node
+attached to the network must have an unique node ID which must be 
+diffrent from 0.
+Switch 1 serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+    Switch | Value
+    -------|-------
+      1    |   1
+      2    |   2
+      3    |   4
+      4    |   8
+      5    |  16
+      6    |  32
+      7    |  64
+      8    | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   8 7 6 5 4 3 2 1 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255 
+
+
+Setting the I/O Base Address
+----------------------------
+
+The first six switches in switch group SW1 are used to select one
+of 32 possible I/O Base addresses using the followig table
+
+   Switch       | Hex I/O
+   6 5  4 3 2 1 | Address
+   -------------|--------
+   0 1  0 0 0 0 |  200
+   0 1  0 0 0 1 |  210
+   0 1  0 0 1 0 |  220
+   0 1  0 0 1 1 |  230
+   0 1  0 1 0 0 |  240
+   0 1  0 1 0 1 |  250
+   0 1  0 1 1 0 |  260
+   0 1  0 1 1 1 |  270
+   0 1  1 0 0 0 |  280
+   0 1  1 0 0 1 |  290
+   0 1  1 0 1 0 |  2A0
+   0 1  1 0 1 1 |  2B0
+   0 1  1 1 0 0 |  2C0
+   0 1  1 1 0 1 |  2D0
+   0 1  1 1 1 0 |  2E0 (Manufactor's default)
+   0 1  1 1 1 1 |  2F0
+   1 1  0 0 0 0 |  300
+   1 1  0 0 0 1 |  310
+   1 1  0 0 1 0 |  320
+   1 1  0 0 1 1 |  330
+   1 1  0 1 0 0 |  340
+   1 1  0 1 0 1 |  350
+   1 1  0 1 1 0 |  360
+   1 1  0 1 1 1 |  370
+   1 1  1 0 0 0 |  380
+   1 1  1 0 0 1 |  390
+   1 1  1 0 1 0 |  3A0
+   1 1  1 0 1 1 |  3B0
+   1 1  1 1 0 0 |  3C0
+   1 1  1 1 0 1 |  3D0
+   1 1  1 1 1 0 |  3E0
+   1 1  1 1 1 1 |  3F0
+
+
+Setting the Interrupt
+---------------------
+
+Switches seven through ten of switch group SW1 are used to select the 
+interrupt level. The interrupt level is binary coded, so selections 
+from 0 to 15 would be possible, but only the following eight values will
+be supported: 3, 4, 5, 7, 9, 10, 11, 12.
+
+   Switch   | IRQ
+   10 9 8 7 | 
+   ---------|-------- 
+    0 0 1 1 |  3
+    0 1 0 0 |  4
+    0 1 0 1 |  5
+    0 1 1 1 |  7
+    1 0 0 1 |  9 (=2) (default)
+    1 0 1 0 | 10
+    1 0 1 1 | 11
+    1 1 0 0 | 12
+
+
+Setting the Timeouts 
+--------------------
+
+The two jumpers JP2 (1-4) are used to determine the timeout parameters. 
+These two jumpers are normally left open.
+Refer to the COM9026 Data Sheet for alternate configurations.
+
+
+Configuring the PC500 for Star or Bus Topology
+----------------------------------------------
+
+The single jumper labeled JP6 is used to configure the PC500 board for 
+star or bus topology.
+When the jumper is installed, the board may be used in a star network, when 
+it is removed, the board can be used in a bus topology.
+
+
+Diagnostic LEDs
+---------------
+
+Two diagnostic LEDs are visible on the rear bracket of the board.
+The green LED monitors the network activity: the red one shows the
+board activity:
+
+ Green  | Status               Red      | Status
+ -------|-------------------   ---------|-------------------
+  on    | normal activity      flash/on | data transfer
+  blink | reconfiguration      off      | no data transfer;
+  off   | defectiv board or             | incorect memory or
+        | node ID is zero               | I/O address
+
+
+*****************************************************************************
+
+** Possibly SMC **
+LCS-8830-T (16-bit card)
+------------------------
+	- from Mathias Katzer <mkatzer@HRZ.Uni-Bielefeld.DE>
+	
+This is a LCS-8830-T made by SMC, I think ('SMC' only appears on one PLCC,
+nowhere else, not even on the few xeroxed sheets from the manual).
+
+SMC Arcnet Board Type LCS-8830-T
+
+   ------------------------------------
+  |                                    |
+  |              JP3 88  8 JP2         |
+  |       #####      | \               |
+  |       #####    ET1 ET2          ###|
+  |                              8  ###|
+  |  U3   SW 1                  JP0 ###|  Phone Jacks
+  |  --                             ###|
+  | |  |                               |
+  | |  |   SW2                         |
+  | |  |                               |
+  | |  |  #####                        |
+  |  --   #####                       ####  BNC Connector 
+  |                                   ####
+  |   888888 JP1                       |
+  |   234567                           |
+   --                           -------
+     |||||||||||||||||||||||||||
+      --------------------------
+
+
+SW1: DIP-Switches for Station Address
+SW2: DIP-Switches for Memory Base and I/O Base addresses
+
+JP0: If closed, internal termination on (default open)
+JP1: IRQ Jumpers
+JP2: Boot-ROM enabled if closed
+JP3: Jumpers for respsonse timeout
+ 
+U3: Boot-ROM Socket          
+
+
+ET1 ET2     Response Time     Idle Time    Reconfiguration Time
+
+               78                86               840
+ X            285               316              1680
+     X        563               624              1680
+ X   X       1130              1237              1680
+
+(X means closed jumper)
+
+(DIP-Switch downwards means "0")
+
+The station address is binary-coded with SW1.
+
+The I/O base address is coded with DIP-Switches 6,7 and 8 of SW2:
+
+Switches        Base
+678             Address
+000		260-26f
+100		290-29f
+010		2e0-2ef
+110		2f0-2ff
+001		300-30f
+101		350-35f
+011		380-38f
+111 		3e0-3ef
+
+
+DIP Switches 1-5 of SW2 encode the RAM and ROM Adress Range:
+
+Switches        Ram           Rom
+12345           Adress Range  Address Range
+00000		C:0000-C:07ff	C:2000-C:3fff
+10000		C:0800-C:0fff
+01000		C:1000-C:17ff
+11000		C:1800-C:1fff
+00100		C:4000-C:47ff	C:6000-C:7fff
+10100		C:4800-C:4fff
+01100		C:5000-C:57ff 
+11100		C:5800-C:5fff
+00010		C:C000-C:C7ff	C:E000-C:ffff
+10010		C:C800-C:Cfff
+01010		C:D000-C:D7ff
+11010		C:D800-C:Dfff
+00110		D:0000-D:07ff	D:2000-D:3fff
+10110		D:0800-D:0fff
+01110		D:1000-D:17ff
+11110		D:1800-D:1fff
+00001		D:4000-D:47ff	D:6000-D:7fff
+10001		D:4800-D:4fff
+01001		D:5000-D:57ff
+11001		D:5800-D:5fff
+00101		D:8000-D:87ff	D:A000-D:bfff
+10101		D:8800-D:8fff
+01101		D:9000-D:97ff
+11101		D:9800-D:9fff 
+00011		D:C000-D:c7ff	D:E000-D:ffff
+10011		D:C800-D:cfff
+01011		D:D000-D:d7ff
+11011		D:D800-D:dfff
+00111		E:0000-E:07ff	E:2000-E:3fff
+10111		E:0800-E:0fff
+01111		E:1000-E:17ff
+11111		E:1800-E:1fff
+
+
+*****************************************************************************
+
+** PureData Corp **
+PDI507 (16-bit card)
+--------------------
+	- from Mark Rejhon <mdrejhon@magi.com> (slight modifications by
+	  Avery)
+	- Send questions/suggestions/etc about this text to Mark.
+
+Jumpers:
+
+	There is a jumper array at the bottom of the card, near the edge
+        connector.  This array is labelled J1.  They control the IRQs and
+        something else.  Put only one jumper on the IRQ pins.
+
+	IRQ2    - Use IRQ 2 (same as IRQ 9 as far as software is concerned)
+	IRQ3	- Use IRQ 3 (used by COM2 or COM4 serial port if either exists)
+	IRQ4	- Use IRQ 4 (used by COM1 or COM3 serial port if either exists)
+	IRQ5	- Use IRQ 5 (used by LPT2 parallel port if one exists)
+	IRQ6	- Use IRQ 6 (used by Floppy Disk Controller if one exists)
+	IRQ7	- Use IRQ 7 (used by LPT1 parallel port if one exists)
+
+[Avery's note:  This "unknown" set of two jumpers appears to be on all
+ARCnet cards by SMC as well.  Putting jumpers on them seems to affect the
+status register, but only for the two "reserved" bits, ETS1 and ETS2.  Any
+further information is welcome.]
+
+	ET1	- What is this?  (Not tested, no jumper put on it)
+	ET2	- What is this?  (Not tested, no jumper put on it)
+
+	There is a J2 jumper on two pins.  A jumper should be put on them,
+        since it was already there when I got the card.  I don't know what
+        this jumper is for though.
+
+	There is a two-jumper array for J3.  I don't know what it is for,
+        but there were already two jumpers on it when I got the card.  It's
+        a six pin grid in a two-by-three fashion.  The jumpers were
+        configured as follows:
+
+	   .-------.
+	 o | o   o |
+	   :-------:    ------> Accessible end of card with connectors
+	 o | o   o |             in this direction ------->
+	   `-------'
+
+	There is also a J4 jumper on two pins.  A jumper should be put on
+        them, since it was already there when I got the card.  I don't know
+        what this jumper is for though.
+
+
+DIP Switches:
+
+	The dipswitches accessible on the accessible end of the card while
+        it is installed, is used to set the arcnet address.  There are 8
+        switches.  Use an address from 1 to 254.
+
+	Switch No.
+	12345678	Arcnet address
+	-----------------------------------------
+	00000000	FF  	(Don't use this!)
+	00000001	FE
+	00000010	FD
+	....
+	11111101	2	
+	11111110	1
+	11111111	0	(Don't use this!)
+
+	There is another dipswitch array of 8 switches at the top of the
+        card.  There are five labelled MS0-MS4 which seem to control the
+        memory address, and another three labelled IO0-IO2 which seem to
+        control the base I/O address of the card.
+
+	This was difficult to test by trial and error, and the I/O addresses
+        are in a weird order.  This was tested by setting the DIP switches,
+        rebooting the computer, and attempting to load ARCETHER at various
+        addresses (mostly between 0x200 and 0x400).  The address that caused
+        the red transmit LED to blink, is the one that I thought works.
+
+	Also, the address 0x3D0 seem to have a special meaning, since the
+        ARCETHER packet driver loaded fine, but without the red LED
+        blinking.  I don't know what 0x3D0 is for though.  I recommend using
+        an address of 0x300 since Windows may not like addresses below
+        0x300.
+
+	IO Switch No.
+	210             I/O address
+	-------------------------------
+	111             0x260
+	110             0x290
+	101             0x2E0
+	100             0x2F0
+	011             0x300
+	010             0x350
+	001             0x380
+	000             0x3E0
+
+	The memory switches set a reserved address space of 0x1000 bytes
+        (0x100 segment units, or 4k).  For example if I set an address of
+        0xD000, it will use up addresses 0xD000 to 0xD100.
+
+	The memory switches were tested by booting using QEMM386 stealth,
+        and using LOADHI to see what address automatically became excluded
+        from the upper memory regions, and then attempting to load ARCETHER
+        using these addresses.
+
+	I recommend using an arcnet memory address of 0xD000, and putting
+        the EMS page frame at 0xC000 while using QEMM stealth mode.  That
+        way, you get contiguous high memory from 0xD100 almost all the way
+        the end of the megabyte.
+
+	Memory Switch 0 (MS0) didn't seem to work properly when set to OFF
+        on my card.  It could be malfunctioning on my card.  Experiment with
+        it ON first, and if it doesn't work, set it to OFF.  (It may be a
+        modifier for the 0x200 bit?)
+
+	MS Switch No.
+	43210           Memory address
+	--------------------------------
+	00001           0xE100  (guessed - was not detected by QEMM)
+	00011           0xE000  (guessed - was not detected by QEMM)
+	00101           0xDD00
+	00111           0xDC00
+	01001           0xD900
+	01011           0xD800
+	01101           0xD500
+	01111           0xD400
+	10001           0xD100
+	10011           0xD000
+	10101           0xCD00
+	10111           0xCC00
+	11001           0xC900 (guessed - crashes tested system)
+	11011           0xC800 (guessed - crashes tested system)
+	11101           0xC500 (guessed - crashes tested system)
+	11111           0xC400 (guessed - crashes tested system)
+	
+	
+*****************************************************************************
+
+** CNet Technology Inc. **
+120 Series (8-bit cards)
+------------------------
+  - from Juergen Seifert <seifert@htwm.de>
+
+
+CNET TECHNOLOGY INC. (CNet) ARCNET 120A SERIES
+==============================================
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the following Original CNet Manual 
+
+              "ARCNET
+            USER'S MANUAL 
+                for
+               CN120A
+               CN120AB
+               CN120TP
+               CN120ST
+               CN120SBT
+             P/N:12-01-0007
+             Revision 3.00"
+
+ARCNET is a registered trademark of the Datapoint Corporation
+
+P/N 120A   ARCNET 8 bit XT/AT Star
+P/N 120AB  ARCNET 8 bit XT/AT Bus
+P/N 120TP  ARCNET 8 bit XT/AT Twisted Pair
+P/N 120ST  ARCNET 8 bit XT/AT Star, Twisted Pair
+P/N 120SBT ARCNET 8 bit XT/AT Star, Bus, Twisted Pair
+
+    __________________________________________________________________
+   |                                                                  |
+   |                                                               ___|
+   |                                                          LED |___|
+   |                                                               ___|
+   |                                                            N |   | ID7
+   |                                                            o |   | ID6
+   |                                                            d | S | ID5
+   |                                                            e | W | ID4
+   |                     ___________________                    A | 2 | ID3
+   |                    |                   |                   d |   | ID2
+   |                    |                   |  1 2 3 4 5 6 7 8  d |   | ID1
+   |                    |                   | _________________ r |___| ID0
+   |                    |      90C65        ||       SW1       |  ____|
+   |  JP 8 7            |                   ||_________________| |    |
+   |    |o|o|  JP1      |                   |                    | J2 |
+   |    |o|o|  |oo|     |                   |         JP 1 1 1   |    |
+   |   ______________   |                   |            0 1 2   |____|
+   |  |  PROM        |  |___________________|           |o|o|o|  _____|
+   |  >  SOCKET      |  JP 6 5 4 3 2                    |o|o|o| | J1  |
+   |  |______________|    |o|o|o|o|o|                   |o|o|o| |_____|
+   |_____                 |o|o|o|o|o|                   ______________|
+         |                                             |
+         |_____________________________________________|
+
+Legend:
+
+90C65       ARCNET Probe
+S1  1-5:    Base Memory Address Select
+    6-8:    Base I/O Address Select
+S2  1-8:    Node ID Select (ID0-ID7)
+JP1     ROM Enable Select
+JP2     IRQ2
+JP3     IRQ3
+JP4     IRQ4
+JP5     IRQ5
+JP6     IRQ7
+JP7/JP8     ET1, ET2 Timeout Parameters
+JP10/JP11   Coax / Twisted Pair Select  (CN120ST/SBT only)
+JP12        Terminator Select       (CN120AB/ST/SBT only)
+J1      BNC RG62/U Connector        (all except CN120TP)
+J2      Two 6-position Telephone Jack   (CN120TP/ST/SBT only)
+
+Setting one of the switches to Off means "1", On means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in SW2 are used to set the node ID. Each node attached
+to the network must have an unique node ID which must be diffrent from 0.
+Switch 1 (ID0) serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+   Switch | Label | Value
+   -------|-------|-------
+     1    | ID0   |   1
+     2    | ID1   |   2
+     3    | ID2   |   4
+     4    | ID3   |   8
+     5    | ID4   |  16
+     6    | ID5   |  32
+     7    | ID6   |  64
+     8    | ID7   | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   8 7 6 5 4 3 2 1 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The last three switches in switch block SW1 are used to select one
+of eight possible I/O Base addresses using the followig table
+
+
+   Switch      | Hex I/O
+    6   7   8  | Address
+   ------------|--------
+   ON  ON  ON  |  260
+   OFF ON  ON  |  290
+   ON  OFF ON  |  2E0  (Manufactor's default)
+   OFF OFF ON  |  2F0
+   ON  ON  OFF |  300
+   OFF ON  OFF |  350
+   ON  OFF OFF |  380
+   OFF OFF OFF |  3E0
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The memory buffer (RAM) requires 2K. The base of this buffer can be 
+located in any of eight positions. The address of the Boot Prom is
+memory base + 8K or memory base + 0x2000.
+Switches 1-5 of switch block SW1 select the Memory Base address.
+
+   Switch              | Hex RAM | Hex ROM
+    1   2   3   4   5  | Address | Address *)
+   --------------------|---------|-----------
+   ON  ON  ON  ON  ON  |  C0000  |  C2000
+   ON  ON  OFF ON  ON  |  C4000  |  C6000
+   ON  ON  ON  OFF ON  |  CC000  |  CE000
+   ON  ON  OFF OFF ON  |  D0000  |  D2000  (Manufactor's default)
+   ON  ON  ON  ON  OFF |  D4000  |  D6000
+   ON  ON  OFF ON  OFF |  D8000  |  DA000
+   ON  ON  ON  OFF OFF |  DC000  |  DE000
+   ON  ON  OFF OFF OFF |  E0000  |  E2000
+  
+*) To enable the Boot ROM install the jumper JP1
+
+Note: Since the switches 1 and 2 are always set to ON it may be possible
+      that they can be used to add an offset of 2K, 4K or 6K to the base
+      address, but this feature is not documented in the manual and I
+      haven't testet it yet.
+
+
+Setting the Interrupt Line
+--------------------------
+
+To select a hardware interrupt level install one (only one!) of the jumpers
+JP2, JP3, JP4, JP5, JP6. JP2 is the default.
+
+   Jumper | IRQ     
+   -------|-----
+     2    |  2
+     3    |  3
+     4    |  4
+     5    |  5
+     6    |  7
+
+
+Setting the Internal Terminator on CN120AB/TP/SBT
+--------------------------------------------------
+
+The jumper JP12 is used to enable the internal terminator. 
+
+                         -----
+       0                |  0  |     
+     -----   ON         |     |  ON
+    |  0  |             |  0  |
+    |     |  OFF         -----   OFF
+    |  0  |                0
+     -----
+   Terminator          Terminator 
+    disabled            enabled
+  
+
+Selecting the Connector Type on CN120ST/SBT
+-------------------------------------------
+
+     JP10    JP11        JP10    JP11
+                         -----   -----
+       0       0        |  0  | |  0  |       
+     -----   -----      |     | |     |
+    |  0  | |  0  |     |  0  | |  0  |
+    |     | |     |      -----   -----
+    |  0  | |  0  |        0       0 
+     -----   -----
+     Coaxial Cable       Twisted Pair Cable 
+       (Default)
+
+
+Setting the Timeout Parameters
+------------------------------
+
+The jumpers labeled EXT1 and EXT2 are used to determine the timeout 
+parameters. These two jumpers are normally left open.
+
+
+
+*****************************************************************************
+
+** CNet Technology Inc. **
+160 Series (16-bit cards)
+-------------------------
+  - from Juergen Seifert <seifert@htwm.de>
+
+CNET TECHNOLOGY INC. (CNet) ARCNET 160A SERIES
+==============================================
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the following Original CNet Manual 
+
+              "ARCNET
+            USER'S MANUAL 
+                for
+               CN160A
+               CN160AB
+               CN160TP
+             P/N:12-01-0006
+             Revision 3.00"
+
+ARCNET is a registered trademark of the Datapoint Corporation
+
+P/N 160A   ARCNET 16 bit XT/AT Star
+P/N 160AB  ARCNET 16 bit XT/AT Bus
+P/N 160TP  ARCNET 16 bit XT/AT Twisted Pair
+
+   ___________________________________________________________________
+  <                             _________________________          ___|
+  >               |oo| JP2     |                         |    LED |___|
+  <               |oo| JP1     |        9026             |    LED |___|
+  >                            |_________________________|         ___|
+  <                                                             N |   | ID7
+  >                                                      1      o |   | ID6
+  <                                    1 2 3 4 5 6 7 8 9 0      d | S | ID5
+  >         _______________           _____________________     e | W | ID4
+  <        |     PROM      |         |         SW1         |    A | 2 | ID3
+  >        >    SOCKET     |         |_____________________|    d |   | ID2
+  <        |_______________|          | IO-Base   | MEM   |     d |   | ID1
+  >                                                             r |___| ID0
+  <                                                               ____|
+  >                                                              |    |
+  <                                                              | J1 |
+  >                                                              |    |
+  <                                                              |____|
+  >                            1 1 1 1                                |
+  <  3 4 5 6 7      JP     8 9 0 1 2 3                                |
+  > |o|o|o|o|o|           |o|o|o|o|o|o|                               |
+  < |o|o|o|o|o| __        |o|o|o|o|o|o|                    ___________|
+  >            |  |                                       |
+  <____________|  |_______________________________________|
+
+Legend:
+
+9026            ARCNET Probe
+SW1 1-6:    Base I/O Address Select
+    7-10:   Base Memory Address Select
+SW2 1-8:    Node ID Select (ID0-ID7)
+JP1/JP2     ET1, ET2 Timeout Parameters
+JP3-JP13    Interrupt Select
+J1      BNC RG62/U Connector        (CN160A/AB only)
+J1      Two 6-position Telephone Jack   (CN160TP only)
+LED
+
+Setting one of the switches to Off means "1", On means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in SW2 are used to set the node ID. Each node attached
+to the network must have an unique node ID which must be diffrent from 0.
+Switch 1 (ID0) serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+   Switch | Label | Value
+   -------|-------|-------
+     1    | ID0   |   1
+     2    | ID1   |   2
+     3    | ID2   |   4
+     4    | ID3   |   8
+     5    | ID4   |  16
+     6    | ID5   |  32
+     7    | ID6   |  64
+     8    | ID7   | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   8 7 6 5 4 3 2 1 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The first six switches in switch block SW1 are used to select the I/O Base
+address using the followig table:
+
+             Switch        | Hex I/O
+    1   2   3   4   5   6  | Address
+   ------------------------|--------
+   OFF ON  ON  OFF OFF ON  |  260
+   OFF ON  OFF ON  ON  OFF |  290
+   OFF ON  OFF OFF OFF ON  |  2E0  (Manufactor's default)
+   OFF ON  OFF OFF OFF OFF |  2F0
+   OFF OFF ON  ON  ON  ON  |  300
+   OFF OFF ON  OFF ON  OFF |  350
+   OFF OFF OFF ON  ON  ON  |  380
+   OFF OFF OFF OFF OFF ON  |  3E0
+
+Note: Other IO-Base addresses seem to be selectable, but only the above
+      combinations are documented.
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The switches 7-10 of switch block SW1 are used to select the Memory
+Base address of the RAM (2K) and the PROM.
+
+   Switch          | Hex RAM | Hex ROM
+    7   8   9  10  | Address | Address
+   ----------------|---------|-----------
+   OFF OFF ON  ON  |  C0000  |  C8000
+   OFF OFF ON  OFF |  D0000  |  D8000 (Default)
+   OFF OFF OFF ON  |  E0000  |  E8000
+
+Note: Other MEM-Base addresses seem to be selectable, but only the above
+      combinations are documented.
+
+
+Setting the Interrupt Line
+--------------------------
+
+To select a hardware interrupt level install one (only one!) of the jumpers
+JP3 through JP13 using the following table:
+
+   Jumper | IRQ     
+   -------|-----------------
+     3    |  14
+     4    |  15
+     5    |  12
+     6    |  11
+     7    |  10
+     8    |   3
+     9    |   4
+    10    |   5
+    11    |   6
+    12    |   7
+    13    |   2 (=9) Default!
+
+Note:  - Do not use JP11=IRQ6, it may conflict with your Floppy Disk
+         Controler
+       - Use JP3=IRQ14 only, if you don't have an IDE-, MFM-, or RLL-
+         Hard Disk, it may conflict with their controlers
+
+
+Setting the Timeout Parameters
+------------------------------
+
+The jumpers labeled JP1 and JP2 are used to determine the timeout
+parameters. These two jumpers are normally left open.
+
+
+*****************************************************************************
+
+** No Name **
+8-bit cards, 16-bit cards
+-------------------------
+  - from Juergen Seifert <seifert@htwm.de>
+  
+NONAME 8-BIT ARCNET
+===================
+
+I have named this ARCnet card "NONAME", since there is no name of any
+manufactor on the Installation manual nor on the shipping box. The only
+hint to the existence of a manufactor at all is written into cupper,
+it is "Made in Taiwan"
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the Original
+                    "ARCnet Installation Manual"
+
+
+    ________________________________________________________________
+   | |STAR| BUS| T/P|                                               |
+   | |____|____|____|                                               |
+   |                            _____________________               |
+   |                           |                     |              |
+   |                           |                     |              |
+   |                           |                     |              |
+   |                           |        SMC          |              |
+   |                           |                     |              |
+   |                           |       COM90C65      |              |
+   |                           |                     |              |
+   |                           |                     |              |
+   |                           |__________-__________|              |
+   |                                                           _____|
+   |      _______________                                     |  CN |
+   |     | PROM          |                                    |_____|
+   |     > SOCKET        |                                          |
+   |     |_______________|         1 2 3 4 5 6 7 8  1 2 3 4 5 6 7 8 |
+   |                               _______________  _______________ |
+   |           |o|o|o|o|o|o|o|o|  |      SW1      ||      SW2      ||
+   |           |o|o|o|o|o|o|o|o|  |_______________||_______________||
+   |___         2 3 4 5 7 E E R        Node ID       IOB__|__MEM____|
+       |        \ IRQ   / T T O                      |
+       |__________________1_2_M______________________|
+
+Legend:
+
+COM90C65:       Arcnet Probe
+S1  1-8:    Node ID Select
+S2  1-3:    I/O Base Address Select
+    4-6:    Memory Base Address Select
+    7-8:    RAM Offset Select
+ET1, ET2    Extended Timeout Select
+ROM     ROM Enable Select
+CN              RG62 Coax Connector
+STAR| BUS | T/P Three fields for placing a sign (colored circle)
+                indicating the topologie of the card
+
+Setting one of the switches to Off means "1", On means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in group SW1 are used to set the node ID.
+Each node attached to the network must have an unique node ID which
+must be diffrent from 0.
+Switch 8 serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+    Switch | Value
+    -------|-------
+      8    |   1
+      7    |   2
+      6    |   4
+      5    |   8
+      4    |  16
+      3    |  32
+      2    |  64
+      1    | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   1 2 3 4 5 6 7 8 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The first three switches in switch group SW2 are used to select one
+of eight possible I/O Base addresses using the followig table
+
+   Switch      | Hex I/O
+    1   2   3  | Address
+   ------------|--------
+   ON  ON  ON  |  260
+   ON  ON  OFF |  290
+   ON  OFF ON  |  2E0  (Manufactor's default)
+   ON  OFF OFF |  2F0
+   OFF ON  ON  |  300
+   OFF ON  OFF |  350
+   OFF OFF ON  |  380
+   OFF OFF OFF |  3E0
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The memory buffer requires 2K of a 16K block of RAM. The base of this
+16K block can be located in any of eight positions.
+Switches 4-6 of switch group SW2 select the Base of the 16K block.
+Within that 16K address space, the buffer may be assigned any one of four
+positions, determined by the offset, switches 7 and 8 of group SW2.
+
+   Switch     | Hex RAM | Hex ROM
+   4 5 6  7 8 | Address | Address *)
+   -----------|---------|-----------
+   0 0 0  0 0 |  C0000  |  C2000
+   0 0 0  0 1 |  C0800  |  C2000
+   0 0 0  1 0 |  C1000  |  C2000
+   0 0 0  1 1 |  C1800  |  C2000
+              |         |
+   0 0 1  0 0 |  C4000  |  C6000
+   0 0 1  0 1 |  C4800  |  C6000
+   0 0 1  1 0 |  C5000  |  C6000
+   0 0 1  1 1 |  C5800  |  C6000
+              |         |
+   0 1 0  0 0 |  CC000  |  CE000
+   0 1 0  0 1 |  CC800  |  CE000
+   0 1 0  1 0 |  CD000  |  CE000
+   0 1 0  1 1 |  CD800  |  CE000
+              |         |
+   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
+   0 1 1  0 1 |  D0800  |  D2000
+   0 1 1  1 0 |  D1000  |  D2000
+   0 1 1  1 1 |  D1800  |  D2000
+              |         |
+   1 0 0  0 0 |  D4000  |  D6000
+   1 0 0  0 1 |  D4800  |  D6000
+   1 0 0  1 0 |  D5000  |  D6000
+   1 0 0  1 1 |  D5800  |  D6000
+              |         |
+   1 0 1  0 0 |  D8000  |  DA000
+   1 0 1  0 1 |  D8800  |  DA000
+   1 0 1  1 0 |  D9000  |  DA000
+   1 0 1  1 1 |  D9800  |  DA000
+              |         |
+   1 1 0  0 0 |  DC000  |  DE000
+   1 1 0  0 1 |  DC800  |  DE000
+   1 1 0  1 0 |  DD000  |  DE000
+   1 1 0  1 1 |  DD800  |  DE000
+              |         |
+   1 1 1  0 0 |  E0000  |  E2000
+   1 1 1  0 1 |  E0800  |  E2000
+   1 1 1  1 0 |  E1000  |  E2000
+   1 1 1  1 1 |  E1800  |  E2000
+  
+*) To enable the 8K Boot PROM install the jumper ROM.
+   The default is jumper ROM not installed.
+
+
+Setting Interrupt Request Lines (IRQ)
+-------------------------------------
+
+To select a hardware interrupt level set one (only one!) of the jumpers
+IRQ2, IRQ3, IRQ4, IRQ5 or IRQ7. The Manufactor's default is IRQ2.
+ 
+
+Setting the Timeouts
+--------------------
+
+The two jumpers labeled ET1 and ET2 are used to determine the timeout
+parameters (respons and reconfiguration time). Every node in a network
+must be set to the same timeout values.
+
+   ET1 ET2 | Response Time (us) | Reconfiguration Time (ms)
+   --------|--------------------|--------------------------
+   Off Off |        78          |          840   (Default)
+   Off On  |       285          |         1680
+   On  Off |       563          |         1680
+   On  On  |      1130          |         1680
+
+On means jumper installed, Off means jumper not installed
+
+
+NONAME 16-BIT ARCNET
+====================
+
+The manual of my 8-Bit NONAME ARCnet Card contains another description
+of a 16-Bit Coax / Twisted Pair Card. This description is incomplete,
+because there are missing two pages in the manual booklet. (The table
+of contents reports pages ... 2-9, 2-11, 2-12, 3-1, ... but inside
+the booklet there is a diffrent way of counting ... 2-9, 2-10, A-1,
+(empty page), 3-1, ..., 3-18, A-1 (again), A-2)
+Also the picture of the board layout is not as good as the picture of
+8-Bit card, because there isn't any letter like "SW1" written to the
+picture.
+Should somebody have such a board, please feel free to complete this
+description or to send a mail to me!
+
+This description has been written by Juergen Seifert <seifert@htwm.de>
+using information from the Original
+                    "ARCnet Installation Manual"
+
+
+   ___________________________________________________________________
+  <                    _________________  _________________           |
+  >                   |       SW?       ||      SW?        |          |
+  <                   |_________________||_________________|          |
+  >                       ____________________                        |
+  <                      |                    |                       |
+  >                      |                    |                       |
+  <                      |                    |                       |
+  >                      |                    |                       |
+  <                      |                    |                       |
+  >                      |                    |                       |
+  <                      |                    |                       |
+  >                      |____________________|                       |
+  <                                                               ____|
+  >                       ____________________                   |    |
+  <                      |                    |                  | J1 |
+  >                      |                    <                  |    |
+  <                      |____________________|  ? ? ? ? ? ?     |____|
+  >                                             |o|o|o|o|o|o|         |
+  <                                             |o|o|o|o|o|o|         |
+  >                                                                   |
+  <             __                                         ___________|
+  >            |  |                                       |
+  <____________|  |_______________________________________|
+
+
+Setting one of the switches to Off means "1", On means "0".
+
+
+Setting the Node ID
+-------------------
+
+The eight switches in group SW2 are used to set the node ID.
+Each node attached to the network must have an unique node ID which
+must be diffrent from 0.
+Switch 8 serves as the least significant bit (LSB).
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+    Switch | Value
+    -------|-------
+      8    |   1
+      7    |   2
+      6    |   4
+      5    |   8
+      4    |  16
+      3    |  32
+      2    |  64
+      1    | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   1 2 3 4 5 6 7 8 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The first three switches in switch group SW1 are used to select one
+of eight possible I/O Base addresses using the followig table
+
+   Switch      | Hex I/O
+    3   2   1  | Address
+   ------------|--------
+   ON  ON  ON  |  260
+   ON  ON  OFF |  290
+   ON  OFF ON  |  2E0  (Manufactor's default)
+   ON  OFF OFF |  2F0
+   OFF ON  ON  |  300
+   OFF ON  OFF |  350
+   OFF OFF ON  |  380
+   OFF OFF OFF |  3E0
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The memory buffer requires 2K of a 16K block of RAM. The base of this
+16K block can be located in any of eight positions.
+Switches 6-8 of switch group SW1 select the Base of the 16K block.
+Within that 16K address space, the buffer may be assigned any one of four
+positions, determined by the offset, switches 4 and 5 of group SW1.
+
+   Switch     | Hex RAM | Hex ROM
+   8 7 6  5 4 | Address | Address
+   -----------|---------|-----------
+   0 0 0  0 0 |  C0000  |  C2000
+   0 0 0  0 1 |  C0800  |  C2000
+   0 0 0  1 0 |  C1000  |  C2000
+   0 0 0  1 1 |  C1800  |  C2000
+              |         |
+   0 0 1  0 0 |  C4000  |  C6000
+   0 0 1  0 1 |  C4800  |  C6000
+   0 0 1  1 0 |  C5000  |  C6000
+   0 0 1  1 1 |  C5800  |  C6000
+              |         |
+   0 1 0  0 0 |  CC000  |  CE000
+   0 1 0  0 1 |  CC800  |  CE000
+   0 1 0  1 0 |  CD000  |  CE000
+   0 1 0  1 1 |  CD800  |  CE000
+              |         |
+   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
+   0 1 1  0 1 |  D0800  |  D2000
+   0 1 1  1 0 |  D1000  |  D2000
+   0 1 1  1 1 |  D1800  |  D2000
+              |         |
+   1 0 0  0 0 |  D4000  |  D6000
+   1 0 0  0 1 |  D4800  |  D6000
+   1 0 0  1 0 |  D5000  |  D6000
+   1 0 0  1 1 |  D5800  |  D6000
+              |         |
+   1 0 1  0 0 |  D8000  |  DA000
+   1 0 1  0 1 |  D8800  |  DA000
+   1 0 1  1 0 |  D9000  |  DA000
+   1 0 1  1 1 |  D9800  |  DA000
+              |         |
+   1 1 0  0 0 |  DC000  |  DE000
+   1 1 0  0 1 |  DC800  |  DE000
+   1 1 0  1 0 |  DD000  |  DE000
+   1 1 0  1 1 |  DD800  |  DE000
+              |         |
+   1 1 1  0 0 |  E0000  |  E2000
+   1 1 1  0 1 |  E0800  |  E2000
+   1 1 1  1 0 |  E1000  |  E2000
+   1 1 1  1 1 |  E1800  |  E2000
+  
+
+Setting Interrupt Request Lines (IRQ)
+-------------------------------------
+
+??????????????????????????????????????
+
+
+Setting the Timeouts
+--------------------
+
+??????????????????????????????????????
+
+
+*****************************************************************************
+
+** No Name **
+8-bit cards ("Made in Taiwan R.O.C.")
+-----------
+ - from Vojtech Pavlik <vpav4328@diana.troja.mff.cuni.cz>
+
+I have named this ARCnet card "NONAME", since I got only the card with
+no manual at all and the only text identifying the manufacturer is 
+"MADE IN TAIWAN R.O.C" printed on the card.
+
+This description was written by Vojtech Pavlik 
+(vpav4328@diana.troja.mff.cuni.cz) using parts of the ARCNET-jumpers 
+README file from Linux kernel 1.2.2. 
+
+          ____________________________________________________________
+         |                 1 2 3 4 5 6 7 8                            |
+         | |o|o| JP1       o|o|o|o|o|o|o|o| ON                        |
+         |  +              o|o|o|o|o|o|o|o|                        ___|
+         |  _____________  o|o|o|o|o|o|o|o| OFF         _____     |   | ID7
+         | |             | SW1                         |     |    |   | ID6
+         | > RAM (2k)    |        ____________________ |  H  |    | S | ID5
+         | |_____________|       |                    ||  y  |    | W | ID4
+         |                       |                    ||  b  |    | 2 | ID3
+         |                       |                    ||  r  |    |   | ID2
+         |                       |                    ||  i  |    |   | ID1
+         |                       |       90C65        ||  d  |    |___| ID0
+         |      SW3              |                    ||     |        |      
+         | |o|o|o|o|o|o|o|o| ON  |                    ||  I  |        |
+         | |o|o|o|o|o|o|o|o|     |                    ||  C  |        |
+         | |o|o|o|o|o|o|o|o| OFF |____________________||     |   _____|
+         |  1 2 3 4 5 6 7 8                            |     |  |     |___
+         |  ______________                             |     |  | BNC |___|
+         | |              |                            |_____|  |_____|
+         | > EPROM SOCKET |                                           |
+         | |______________|                                           |
+         |                                              ______________|
+         |                                             |
+         |_____________________________________________|
+
+Legend:
+
+90C65       ARCNET Chip 
+SW1 1-5:    Base Memory Address Select
+    6-8:    Base I/O Address Select
+SW2 1-8:    Node ID Select (ID0-ID7)
+SW3 1-5:    IRQ Select   
+    6-7:    Extra Timeout
+    8  :    Rom Enable   
+JP1         Led connector
+BNC         Coax connector
+
+Although the jumpers SW1 and SW3 are marked SW, not JP, they are jumpers, not 
+switches.
+
+Setting the jumpers to ON means connecting the upper two pins, off the bottom 
+two - or - in case of IRQ setting, connecting none of them at all.
+
+Setting the Node ID
+-------------------
+
+The eight switches in SW2 are used to set the node ID. Each node attached
+to the network must have an unique node ID which must be diffrent from 0.
+Switch 1 (ID0) serves as the least significant bit (LSB).
+
+Setting one of the switches to Off means "1", On means "0".
+
+The node ID is the sum of the values of all switches set to "1"  
+These values are:
+
+   Switch | Label | Value
+   -------|-------|-------
+     1    | ID0   |   1
+     2    | ID1   |   2
+     3    | ID2   |   4
+     4    | ID3   |   8
+     5    | ID4   |  16
+     6    | ID5   |  32
+     7    | ID6   |  64
+     8    | ID7   | 128
+
+Some Examples:
+
+    Switch         | Hex     | Decimal 
+   8 7 6 5 4 3 2 1 | Node ID | Node ID
+   ----------------|---------|---------
+   0 0 0 0 0 0 0 0 |    not allowed
+   0 0 0 0 0 0 0 1 |    1    |    1 
+   0 0 0 0 0 0 1 0 |    2    |    2
+   0 0 0 0 0 0 1 1 |    3    |    3
+       . . .       |         |
+   0 1 0 1 0 1 0 1 |   55    |   85
+       . . .       |         |
+   1 0 1 0 1 0 1 0 |   AA    |  170
+       . . .       |         |  
+   1 1 1 1 1 1 0 1 |   FD    |  253
+   1 1 1 1 1 1 1 0 |   FE    |  254
+   1 1 1 1 1 1 1 1 |   FF    |  255
+
+
+Setting the I/O Base Address
+----------------------------
+
+The last three switches in switch block SW1 are used to select one
+of eight possible I/O Base addresses using the followig table
+
+
+   Switch      | Hex I/O
+    6   7   8  | Address
+   ------------|--------
+   ON  ON  ON  |  260
+   OFF ON  ON  |  290
+   ON  OFF ON  |  2E0  (Manufactor's default)
+   OFF OFF ON  |  2F0
+   ON  ON  OFF |  300
+   OFF ON  OFF |  350
+   ON  OFF OFF |  380
+   OFF OFF OFF |  3E0
+
+
+Setting the Base Memory (RAM) buffer Address
+--------------------------------------------
+
+The memory buffer (RAM) requires 2K. The base of this buffer can be 
+located in any of eight positions. The address of the Boot Prom is
+memory base + 0x2000.
+Jumpers 3-5 of jumper block SW1 select the Memory Base address.
+
+   Switch              | Hex RAM | Hex ROM
+    1   2   3   4   5  | Address | Address *)
+   --------------------|---------|-----------
+   ON  ON  ON  ON  ON  |  C0000  |  C2000
+   ON  ON  OFF ON  ON  |  C4000  |  C6000
+   ON  ON  ON  OFF ON  |  CC000  |  CE000
+   ON  ON  OFF OFF ON  |  D0000  |  D2000  (Manufactor's default)
+   ON  ON  ON  ON  OFF |  D4000  |  D6000
+   ON  ON  OFF ON  OFF |  D8000  |  DA000
+   ON  ON  ON  OFF OFF |  DC000  |  DE000
+   ON  ON  OFF OFF OFF |  E0000  |  E2000
+  
+*) To enable the Boot ROM set the jumper 8 of jumper block SW3 to position ON.
+
+The jumpers 1 and 2 probably add 0x0800, 0x1000 and 0x1800 to RAM addres.
+
+Setting the Interrupt Line
+--------------------------
+
+Jumpers 1-5 of the jumper block SW3 controll the IRQ level.
+
+    Jumper              |  IRQ
+    1   2   3   4   5   |
+   ----------------------------
+    ON  OFF OFF OFF OFF |  2
+    OFF ON  OFF OFF OFF |  3
+    OFF OFF ON  OFF OFF |  4
+    OFF OFF OFF ON  OFF |  5
+    OFF OFF OFF OFF ON  |  7
+
+
+Setting the Timeout Parameters
+------------------------------
+
+The jumpers 6-7 of the jumper block SW3 are used to determine the timeout 
+parameters. These two jumpers are normally left in the OFF position.
+
+
+*****************************************************************************
+** Tiara **
+(model unknown)
+-------------------------
+  - from Christoph Lameter <clameter@netcom.com>
+  
+
+Here is information about my card as far as I could figure it out:
+----------------------------------------------- tiara
+Tiara LanCard of Tiara Computer Systems.
+
++----------------------------------------------+
+!           ! Transmitter Unit !               !
+!           +------------------+             -------
+!          MEM                              Coax Connector
+!  ROM    7654321 <- I/O                     -------
+!  :  :   +--------+                           !
+!  :  :   ! 90C66LJ!                         +++
+!  :  :   !        !                         !D  Switch to set
+!  :  :   !        !                         !I  the Nodenumber
+!  :  :   +--------+                         !P
+!                                            !++
+!         234567 <- IRQ                      !
++------------!!!!!!!!!!!!!!!!!!!!!!!!--------+
+             !!!!!!!!!!!!!!!!!!!!!!!!
+
+0 = Jumper Installed
+1 = Open
+
+Top Jumper line Bit 7 = Rom Enable 654=Memory location 321=I/O
+
+Settings for Memory Location (Top Jumper Line)
+456     Address selected
+000	C0000
+001     C4000
+010     CC000
+011     D0000
+100     D4000
+101     D8000
+110     DC000     
+111     E0000
+
+Settings for I/O Address (Top Jumper Line)
+123     Port
+000	260
+001	290
+010	2E0
+011	2F0
+100	300
+101	350
+110	380
+111	3E0
+
+Settings for IRQ Selection (Lower Jumper Line)
+234567
+011111 IRQ 2
+101111 IRQ 3
+110111 IRQ 4
+111011 IRQ 5
+111110 IRQ 7
+
+*****************************************************************************
+
+
+Other Cards
+-----------
+
+I have no information on other models of ARCnet cards at the moment.  Please
+send any and all info to:
+	apenwarr@foxnet.net
+
+Thanks.
diff -u --recursive --new-file v1.3.24/linux/Documentation/networking/arcnet-jumpers.txt linux/Documentation/networking/arcnet-jumpers.txt
--- v1.3.24/linux/Documentation/networking/arcnet-jumpers.txt	Sun Sep  3 12:26:48 1995
+++ linux/Documentation/networking/arcnet-jumpers.txt	Thu Jan  1 02:00:00 1970
@@ -1,1911 +0,0 @@
-
------------------------------------------------------------------------------
-This file is a supplement to README.arcnet.  Please read that for general
-driver configuration help.
------------------------------------------------------------------------------
-
-Because so many people (myself included) seem to have obtained ARCnet cards
-without manuals, this will be a quick listing of all jumper settings I can
-find.  Please e-mail apenwarr@foxnet.net with any settings for
-your particular card.
-
-Even if your ARCnet model isn't listed, but has the same jumpers, please
-e-mail me to say so.
-
-If your model isn't listed, and has different settings, PLEASE PLEASE tell
-me.  I had to figure mine out without the manual, and it WASN'T FUN!
-
-Cards Listed in this file (in this order, mostly):
-
-	Manufacturer	Model #		Bits
-	------------	-------		----
-	SMC		PC100		8
-	SMC		PC110		8
-	SMC		PC120		8
-	SMC		PC130		8
-	SMC		PC270E		8
-	SMC		PC500		16
-	SMC		PC500Longboard	16
-	SMC		PC550Longboard	16
-	SMC		PC600		16
-	SMC?		LCS-8830-T	16?
-	Puredata	PDI507		16
-	CNet Tech	CN120-Series	8
-	CNet Tech	CN160-Series	16
-	No Name		--		8/16
-	No Name		Taiwan R.O.C(?)	8
-	Tiara		Tiara Lancard(?)
-	
-
-** SMC = Standard Microsystems Corp.
-** CNet Tech = CNet Technology, Inc.
-
-The model # is listed right above specifics for that card.  Don't forget to
-read "quick briefing" first, since it applies to all ARCnets.
-
-
-Unclassified Stuff
-------------------
-  - Please send any other information you can find.
-  
-  - And some unknowns (other info is welcome!):
-     From: root@ultraworld.xs4all.nl (Timo Hilbrink)
-     To: apenwarr@foxnet.net (Avery Pennarun)
-     Date: Wed, 26 Oct 1994 02:10:32 +0000 (GMT)
-     Reply-To: timoh@xs4all.nl
-
-     [...parts deleted...]
-
-     About the jumpers: On my PC130 there is one more jumper, located near the
-     cable-connector and it's for changing to star or bus topology; 
-     closed: star - open: bus
-     On the PC500 are some more jumper-pins, one block labled with RX,PDN,TXI
-     and another with ALE,LA17,LA18,LA19 these are undocumented..
-
-     [...more parts deleted...]
-
-     --- CUT ---
-
-
-Quick Briefing:
----------------
-
-All ARCnet cards should have a total of four different settings:
-
-  - the I/O address:  this is the "port" your ARCnet card is on.  Probed
-    values, as of v0.14, are only from 0x200 through 0x3F0. (If your card
-    has additional ones, which is possible, please tell me.) This should not
-    be the same as any other device on your system.  According to a doc I
-    got from Novell, MS Windows prefers values of 0x300 or more, eating
-    netconnections on my system otherwise.
-	- Avery's favourite: 0x300.
-
-  - the IRQ:  on 8-bit cards, it might be 2 (9), 3, 4, 5, or 7.
-             on 16-bit cards, it might be 2 (9), 3, 4, 5, 7, or 10-15.  Make
-    sure this is different from any other card on your system.  Note that
-    IRQ2 is the same as IRQ9, as far as Linux is concerned.
-	- Avery's favourite: IRQ2.
-
-  - the memory address:  Unlike most cards, ARCnets use "shared memory" for
-    copying buffers around.  Make SURE it doesn't conflict with any other
-    used memory in your system!
-	A0000		- VGA graphics memory (ok if you don't have VGA)
-        B0000		- Monochrome text mode
-        C0000		\  One of these is your VGA BIOS - usually C0000.
-        E0000		/
-        F0000		- System BIOS
-
-    Anything less than 0xA0000 is, well, a BAD idea since it isn't above
-    640k.
-	- Avery's favourite: 0xD0000
-
-  - the station address:  Every ARCnet card has its own "unique" network
-    address from 0 to 255.  Unlike ethernet, you can set this address
-    yourself.  Since it's only 8 bits, you can only have 254 ARCnet cards on
-    a network.  DON'T use 0 or 255, since these are reserved. (although neat
-    stuff will probably happen if you DO use them).  By the way, if you
-    haven't already guessed, don't set this the same as any other ARCnet on
-    your network!
-	- Avery's favourite:  3 and 4.  Not that it matters.
-
-
-** Standard Microsystems Corp (SMC) **
-PC100, PC110, PC120, PC130 (8-bit cards)
-PC500, PC600 (16-bit cards)
----------------------------------
-  - mainly from Avery Pennarun <apenwarr@foxnet.net>.  Values depicted are
-    from Avery's setup.
-  - special thanks to Timo Hilbrink <timoh@xs4all.nl> for noting that PC120,
-    130, 500, and 600 all have the same switches as Avery's PC100. 
-    PC500/600 have several extra, undocumented pins though. (?)
-  - PC110 settings were verified by Stephen A. Wood <saw@cebaf.gov>
-  - On the other hand, John Edward Bauer <jbauer@badlands.NoDak.edu> said
-    the PC110 settings are all wrong.  In his case, you need to switch all
-    the 1's with 0's.  If you're having problems, try that.
-  - Also, the JP- and S-numbers probably don't match your card exactly.  Try
-    to find jumpers/switches with the same number of settings - it's
-    probably more reliable.
-  
-
-     JP5		       [|]    :    :    :    :
-(IRQ Setting)		      IRQ2  IRQ3 IRQ4 IRQ5 IRQ7
-		Put exactly one jumper on exactly one set of pins.
-
-                          1  2   3  4  5  6   7  8  9 10
-     S1                /----------------------------------\
-(I/O and Memory        |  1  1 * 0  0  0  0 * 1  1  0  1  |
- addresses)            \----------------------------------/
-                          |--|   |--------|   |--------|
-                          (a)       (b)           (m)
-
-		a: The first digit of the I/O address.
-			Setting		Value
-			-------		-----
-			00		0
-			01		1
-			10		2
-			11		3
-
-		b: The second digit of the I/O address.
-			Setting		Value
-			-------		-----
-			0000		0
-			0001		1
-			0010		2
-			...		...
-			1110		E
-			1111		F
-
-		The I/O address is in the form ab0.  For example, if
-		a is 0x2 and b is 0xE, the address will be 0x2E0.
-
-		DO NOT SET THIS LESS THAN 0x200!!!!!
-
-
-		m: The first digit of the memory address.
-			Setting		Value
-			-------		-----
-			0000		0
-			0001		1
-			0010		2
-			...		...
-			1110		E
-			1111		F
-
-		The memory address is in the form m0000.  For example, if
-		m is D, the address will be 0xD0000.
-
-		DO NOT SET THIS TO C0000, F0000, OR LESS THAN A0000!
-
-                          1  2  3  4  5  6  7  8
-     S2                /--------------------------\
-(Station Address)      |  1  1  0  0  0  0  0  0  |
-                       \--------------------------/
-
-			Setting		Value
-			-------		-----
-			00000000	00
-			10000000	01
-			01000000	02
-			...
-			01111111	FE
-			11111111	FF
-
-		Note that this is binary with the digits reversed!
-
-		DO NOT SET THIS TO 0 OR 255 (0xFF)!
-
-
-*****************************************************************************
-
-** Standard Microsystems Corp (SMC) **
-PC130E/PC270E (8-bit cards)
----------------------------
-  - from Juergen Seifert <seifert@htwm.de>
-
-
-STANDARD MICROSYSTEMS CORPORATION (SMC) ARCNET(R)-PC130E/PC270E
-===============================================================
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the following Original SMC Manual 
-
-             "Configuration Guide for
-             ARCNET(R)-PC130E/PC270
-            Network Controller Boards
-                Pub. # 900.044A
-                   June, 1989"
-
-ARCNET is a registered trademark of the Datapoint Corporation
-SMC is a registered trademark of the Standard Microsystems Corporation  
-
-The PC130E is an enhanced version of the PC130 board, is equipped with a 
-standard BNC female connector for connection to RG-62/U coax cable.
-Since this board is designed both for point-to-point connection in star
-networks and for connection to bus networks, it is downwardly compatible 
-with all the other standard boards designed for coax networks (that is,
-the PC120, PC110 and PC100 star topology boards and the PC220, PC210 and 
-PC200 bus topology boards).
-
-The PC270E is an enhanced version of the PC260 board, is equipped with two 
-modular RJ11-type jacks for connection to twisted pair wiring.
-It can be used in a star or a daisy-chained network.
-
-
-         8 7 6 5 4 3 2 1
-    ________________________________________________________________
-   |   |       S1        |                                          |
-   |   |_________________|                                          |
-   |    Offs|Base |I/O Addr                                         |
-   |     RAM Addr |                                              ___|
-   |         ___  ___                                       CR3 |___|
-   |        |   \/   |                                      CR4 |___|
-   |        |  PROM  |                                           ___|
-   |        |        |                                        N |   | 8
-   |        | SOCKET |                                        o |   | 7
-   |        |________|                                        d |   | 6
-   |                   ___________________                    e |   | 5
-   |                  |                   |                   A | S | 4
-   |       |oo| EXT2  |                   |                   d | 2 | 3
-   |       |oo| EXT1  |       SMC         |                   d |   | 2
-   |       |oo| ROM   |      90C63        |                   r |___| 1
-   |       |oo| IRQ7  |                   |               |o|  _____|
-   |       |oo| IRQ5  |                   |               |o| | J1  |
-   |       |oo| IRQ4  |                   |              STAR |_____|
-   |       |oo| IRQ3  |                   |                   | J2  |
-   |       |oo| IRQ2  |___________________|                   |_____|
-   |___                                               ______________|
-       |                                             |
-       |_____________________________________________|
-
-Legend:
-
-SMC 90C63	ARCNET Controller / Transceiver /Logic
-S1	1-3:	I/O Base Address Select
-	4-6:	Memory Base Address Select
-	7-8:	RAM Offset Select
-S2	1-8:	Node ID Select
-EXT		Extended Timeout Select
-ROM		ROM Enable Select
-STAR		Selected - Star Topology	(PC130E only)
-		Deselected - Bus Topology	(PC130E only)
-CR3/CR4		Diagnostic LEDs
-J1		BNC RG62/U Connector		(PC130E only)
-J1		6-position Telephone Jack	(PC270E only)
-J2		6-position Telephone Jack	(PC270E only)
-
-Setting one of the switches to Off/Open means "1", On/Closed means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in group S2 are used to set the node ID.
-Each node attached to the network must have an unique node ID which
-must be diffrent from 0.
-Switch 1 serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-    Switch | Value
-    -------|-------
-      1    |   1
-      2    |   2
-      3    |   4
-      4    |   8
-      5    |  16
-      6    |  32
-      7    |  64
-      8    | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   8 7 6 5 4 3 2 1 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The first three switches in switch group S1 are used to select one
-of eight possible I/O Base addresses using the followig table
-
-
-   Switch | Hex I/O
-   1 2 3  | Address
-   -------|--------
-   0 0 0  |  260
-   0 0 1  |  290
-   0 1 0  |  2E0  (Manufactor's default)
-   0 1 1  |  2F0
-   1 0 0  |  300
-   1 0 1  |  350
-   1 1 0  |  380
-   1 1 1  |  3E0
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The memory buffer requires 2K of a 16K block of RAM. The base of this
-16K block can be located in any of eight positions.
-Switches 4-6 of switch group S1 select the Base of the 16K block.
-Within that 16K address space, the buffer may be assigned any one of four 
-positions, determined by the offset, switches 7 and 8 of group S1.
-
-   Switch     | Hex RAM | Hex ROM
-   4 5 6  7 8 | Address | Address *)
-   -----------|---------|-----------
-   0 0 0  0 0 |  C0000  |  C2000
-   0 0 0  0 1 |  C0800  |  C2000
-   0 0 0  1 0 |  C1000  |  C2000
-   0 0 0  1 1 |  C1800  |  C2000
-              |         |
-   0 0 1  0 0 |  C4000  |  C6000
-   0 0 1  0 1 |  C4800  |  C6000
-   0 0 1  1 0 |  C5000  |  C6000
-   0 0 1  1 1 |  C5800  |  C6000
-              |         |
-   0 1 0  0 0 |  CC000  |  CE000
-   0 1 0  0 1 |  CC800  |  CE000
-   0 1 0  1 0 |  CD000  |  CE000
-   0 1 0  1 1 |  CD800  |  CE000
-              |         |
-   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
-   0 1 1  0 1 |  D0800  |  D2000
-   0 1 1  1 0 |  D1000  |  D2000
-   0 1 1  1 1 |  D1800  |  D2000
-              |         |
-   1 0 0  0 0 |  D4000  |  D6000
-   1 0 0  0 1 |  D4800  |  D6000
-   1 0 0  1 0 |  D5000  |  D6000
-   1 0 0  1 1 |  D5800  |  D6000
-              |         |
-   1 0 1  0 0 |  D8000  |  DA000
-   1 0 1  0 1 |  D8800  |  DA000
-   1 0 1  1 0 |  D9000  |  DA000
-   1 0 1  1 1 |  D9800  |  DA000
-              |         |
-   1 1 0  0 0 |  DC000  |  DE000
-   1 1 0  0 1 |  DC800  |  DE000
-   1 1 0  1 0 |  DD000  |  DE000
-   1 1 0  1 1 |  DD800  |  DE000
-              |         |
-   1 1 1  0 0 |  E0000  |  E2000
-   1 1 1  0 1 |  E0800  |  E2000
-   1 1 1  1 0 |  E1000  |  E2000
-   1 1 1  1 1 |  E1800  |  E2000
-  
-*) To enable the 8K Boot PROM install the jumper ROM.
-   The default is jumper ROM not installed.
-
-
-Setting the Timeouts and Interrupt
-----------------------------------
-
-The jumpers labeled EXT1 and EXT2 are used to determine the timeout 
-parameters. These two jumpers are normally left open.
-Refer to the COM9026 Data Sheet for alternate configurations.
-
-To select a hardware interrupt level set one (only one!) of the jumpers
-IRQ2, IRQ3, IRQ4, IRQ5, IRQ7. The Manufactor's default is IRQ2.
- 
-
-Configuring the PC130E for Star or Bus Topology
------------------------------------------------
-
-The single jumper labeled STAR is used to configure the PC130E board for 
-star or bus topology.
-When the jumper is installed, the board may be used in a star network, when 
-it is removed, the board can be used in a bus topology.
-
-
-Diagnostic LEDs
----------------
-
-Two diagnostic LEDs are visible on the rear bracket of the board.
-The green LED monitors the network activity: the red one shows the
-board activity:
-
- Green  | Status               Red      | Status
- -------|-------------------   ---------|-------------------
-  on    | normal activity      flash/on | data transfer
-  blink | reconfiguration      off      | no data transfer;
-  off   | defectiv board or             | incorect memory or
-        | node ID is zero               | I/O address
-
-
-*****************************************************************************
-
-** Standard Microsystems Corp (SMC) **
-PC500/PC550 Long Board (16-bit cards)
--------------------------------------
-  - from Juergen Seifert <seifert@htwm.de>
-
-
-STANDARD MICROSYSTEMS CORPORATION (SMC) ARCNET-PC500/PC550 Long Board
-=====================================================================
-
-Note: There is another Version of the PC500 called Short Version, which 
-      is different in hard- and software! The most important differences
-      are:
-      - The long board has no Shared memory
-      - On the long board the selection of the interrupt is done by binary
-        coded switch, on the short board directly by jumper.
-
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the following Original SMC Manual 
-
-             "Configuration Guide for
-             SMC ARCNET-PC500/PC550
-         Series Network Controller Boards
-             Pub. # 900.033 Rev. A
-                November, 1989"
-
-ARCNET is a registered trademark of the Datapoint Corporation
-SMC is a registered trademark of the Standard Microsystems Corporation  
-
-The PC500 is equipped with a standard BNC female connector for connection
-to RG-62/U coax cable.
-The board is designed both for point-to-point connection in star networks
-and for connection to bus networks.
-
-The PC550 is equipped with two modular RJ11-type jacks for connection
-to twisted pair wiring.
-It can be used in a star or a daisy-chained network.
-
-       1 
-       0 9 8 7 6 5 4 3 2 1     6 5 4 3 2 1
-    ____________________________________________________________________
-   < |         SW1         | |     SW2     |                            |
-   > |_____________________| |_____________|                            |
-   <   IRQ    |I/O Addr                                                 |
-   >                                                                 ___|
-   <                                                            CR4 |___|
-   >                                                            CR3 |___|
-   <                                                                 ___|
-   >                                                              N |   | 8
-   <                                                              o |   | 7
-   >                                                              d | S | 6
-   <                                                              e | W | 5
-   >                                                              A | 3 | 4
-   <                                                              d |   | 3
-   >                                                              d |   | 2
-   <                                                              r |___| 1
-   >                                                        |o|    _____|
-   <                                                        |o|   | J1  |
-   >  3 1                                                   JP6   |_____|
-   < |o|o| JP2                                                    | J2  |
-   > |o|o|                                                        |_____|
-   <  4 2__                                               ______________|
-   >    |  |                                             |
-   <____|  |_____________________________________________|
-
-Legend:
-
-SW1	1-6:	I/O Base Address Select
-	7-10:	Interrupt Select
-SW2	1-6:	Reserved for Future Use
-SW3	1-8:	Node ID Select
-JP2	1-4:	Extended Timeout Select
-JP6		Selected - Star Topology	(PC500 only)
-		Deselected - Bus Topology	(PC500 only)
-CR3	Green	Monitors Network Activity
-CR4	Red	Monitors Board Activity
-J1		BNC RG62/U Connector		(PC500 only)
-J1		6-position Telephone Jack	(PC550 only)
-J2		6-position Telephone Jack	(PC550 only)
-
-Setting one of the switches to Off/Open means "1", On/Closed means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in group SW3 are used to set the node ID. Each node
-attached to the network must have an unique node ID which must be 
-diffrent from 0.
-Switch 1 serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-    Switch | Value
-    -------|-------
-      1    |   1
-      2    |   2
-      3    |   4
-      4    |   8
-      5    |  16
-      6    |  32
-      7    |  64
-      8    | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   8 7 6 5 4 3 2 1 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255 
-
-
-Setting the I/O Base Address
-----------------------------
-
-The first six switches in switch group SW1 are used to select one
-of 32 possible I/O Base addresses using the followig table
-
-   Switch       | Hex I/O
-   6 5  4 3 2 1 | Address
-   -------------|--------
-   0 1  0 0 0 0 |  200
-   0 1  0 0 0 1 |  210
-   0 1  0 0 1 0 |  220
-   0 1  0 0 1 1 |  230
-   0 1  0 1 0 0 |  240
-   0 1  0 1 0 1 |  250
-   0 1  0 1 1 0 |  260
-   0 1  0 1 1 1 |  270
-   0 1  1 0 0 0 |  280
-   0 1  1 0 0 1 |  290
-   0 1  1 0 1 0 |  2A0
-   0 1  1 0 1 1 |  2B0
-   0 1  1 1 0 0 |  2C0
-   0 1  1 1 0 1 |  2D0
-   0 1  1 1 1 0 |  2E0 (Manufactor's default)
-   0 1  1 1 1 1 |  2F0
-   1 1  0 0 0 0 |  300
-   1 1  0 0 0 1 |  310
-   1 1  0 0 1 0 |  320
-   1 1  0 0 1 1 |  330
-   1 1  0 1 0 0 |  340
-   1 1  0 1 0 1 |  350
-   1 1  0 1 1 0 |  360
-   1 1  0 1 1 1 |  370
-   1 1  1 0 0 0 |  380
-   1 1  1 0 0 1 |  390
-   1 1  1 0 1 0 |  3A0
-   1 1  1 0 1 1 |  3B0
-   1 1  1 1 0 0 |  3C0
-   1 1  1 1 0 1 |  3D0
-   1 1  1 1 1 0 |  3E0
-   1 1  1 1 1 1 |  3F0
-
-
-Setting the Interrupt
----------------------
-
-Switches seven through ten of switch group SW1 are used to select the 
-interrupt level. The interrupt level is binary coded, so selections 
-from 0 to 15 would be possible, but only the following eight values will
-be supported: 3, 4, 5, 7, 9, 10, 11, 12.
-
-   Switch   | IRQ
-   10 9 8 7 | 
-   ---------|-------- 
-    0 0 1 1 |  3
-    0 1 0 0 |  4
-    0 1 0 1 |  5
-    0 1 1 1 |  7
-    1 0 0 1 |  9 (=2) (default)
-    1 0 1 0 | 10
-    1 0 1 1 | 11
-    1 1 0 0 | 12
-
-
-Setting the Timeouts 
---------------------
-
-The two jumpers JP2 (1-4) are used to determine the timeout parameters. 
-These two jumpers are normally left open.
-Refer to the COM9026 Data Sheet for alternate configurations.
-
-
-Configuring the PC500 for Star or Bus Topology
-----------------------------------------------
-
-The single jumper labeled JP6 is used to configure the PC500 board for 
-star or bus topology.
-When the jumper is installed, the board may be used in a star network, when 
-it is removed, the board can be used in a bus topology.
-
-
-Diagnostic LEDs
----------------
-
-Two diagnostic LEDs are visible on the rear bracket of the board.
-The green LED monitors the network activity: the red one shows the
-board activity:
-
- Green  | Status               Red      | Status
- -------|-------------------   ---------|-------------------
-  on    | normal activity      flash/on | data transfer
-  blink | reconfiguration      off      | no data transfer;
-  off   | defectiv board or             | incorect memory or
-        | node ID is zero               | I/O address
-
-
-*****************************************************************************
-
-** Possibly SMC **
-LCS-8830-T (16-bit card)
-------------------------
-	- from Mathias Katzer <mkatzer@HRZ.Uni-Bielefeld.DE>
-	
-This is a LCS-8830-T made by SMC, I think ('SMC' only appears on one PLCC,
-nowhere else, not even on the few xeroxed sheets from the manual).
-
-SMC Arcnet Board Type LCS-8830-T
-
-   ------------------------------------
-  |                                    |
-  |              JP3 88  8 JP2         |
-  |       #####      | \               |
-  |       #####    ET1 ET2          ###|
-  |                              8  ###|
-  |  U3   SW 1                  JP0 ###|  Phone Jacks
-  |  --                             ###|
-  | |  |                               |
-  | |  |   SW2                         |
-  | |  |                               |
-  | |  |  #####                        |
-  |  --   #####                       ####  BNC Connector 
-  |                                   ####
-  |   888888 JP1                       |
-  |   234567                           |
-   --                           -------
-     |||||||||||||||||||||||||||
-      --------------------------
-
-
-SW1: DIP-Switches for Station Address
-SW2: DIP-Switches for Memory Base and I/O Base addresses
-
-JP0: If closed, internal termination on (default open)
-JP1: IRQ Jumpers
-JP2: Boot-ROM enabled if closed
-JP3: Jumpers for respsonse timeout
- 
-U3: Boot-ROM Socket          
-
-
-ET1 ET2     Response Time     Idle Time    Reconfiguration Time
-
-               78                86               840
- X            285               316              1680
-     X        563               624              1680
- X   X       1130              1237              1680
-
-(X means closed jumper)
-
-(DIP-Switch downwards means "0")
-
-The station address is binary-coded with SW1.
-
-The I/O base address is coded with DIP-Switches 6,7 and 8 of SW2:
-
-Switches        Base
-678             Address
-000		260-26f
-100		290-29f
-010		2e0-2ef
-110		2f0-2ff
-001		300-30f
-101		350-35f
-011		380-38f
-111 		3e0-3ef
-
-
-DIP Switches 1-5 of SW2 encode the RAM and ROM Adress Range:
-
-Switches        Ram           Rom
-12345           Adress Range  Address Range
-00000		C:0000-C:07ff	C:2000-C:3fff
-10000		C:0800-C:0fff
-01000		C:1000-C:17ff
-11000		C:1800-C:1fff
-00100		C:4000-C:47ff	C:6000-C:7fff
-10100		C:4800-C:4fff
-01100		C:5000-C:57ff 
-11100		C:5800-C:5fff
-00010		C:C000-C:C7ff	C:E000-C:ffff
-10010		C:C800-C:Cfff
-01010		C:D000-C:D7ff
-11010		C:D800-C:Dfff
-00110		D:0000-D:07ff	D:2000-D:3fff
-10110		D:0800-D:0fff
-01110		D:1000-D:17ff
-11110		D:1800-D:1fff
-00001		D:4000-D:47ff	D:6000-D:7fff
-10001		D:4800-D:4fff
-01001		D:5000-D:57ff
-11001		D:5800-D:5fff
-00101		D:8000-D:87ff	D:A000-D:bfff
-10101		D:8800-D:8fff
-01101		D:9000-D:97ff
-11101		D:9800-D:9fff 
-00011		D:C000-D:c7ff	D:E000-D:ffff
-10011		D:C800-D:cfff
-01011		D:D000-D:d7ff
-11011		D:D800-D:dfff
-00111		E:0000-E:07ff	E:2000-E:3fff
-10111		E:0800-E:0fff
-01111		E:1000-E:17ff
-11111		E:1800-E:1fff
-
-
-*****************************************************************************
-
-** PureData Corp **
-PDI507 (16-bit card)
---------------------
-	- from Mark Rejhon <mdrejhon@magi.com> (slight modifications by
-	  Avery)
-	- Send questions/suggestions/etc about this text to Mark.
-
-Jumpers:
-
-	There is a jumper array at the bottom of the card, near the edge
-        connector.  This array is labelled J1.  They control the IRQs and
-        something else.  Put only one jumper on the IRQ pins.
-
-	IRQ2    - Use IRQ 2 (same as IRQ 9 as far as software is concerned)
-	IRQ3	- Use IRQ 3 (used by COM2 or COM4 serial port if either exists)
-	IRQ4	- Use IRQ 4 (used by COM1 or COM3 serial port if either exists)
-	IRQ5	- Use IRQ 5 (used by LPT2 parallel port if one exists)
-	IRQ6	- Use IRQ 6 (used by Floppy Disk Controller if one exists)
-	IRQ7	- Use IRQ 7 (used by LPT1 parallel port if one exists)
-
-[Avery's note:  This "unknown" set of two jumpers appears to be on all
-ARCnet cards by SMC as well.  Putting jumpers on them seems to affect the
-status register, but only for the two "reserved" bits, ETS1 and ETS2.  Any
-further information is welcome.]
-
-	ET1	- What is this?  (Not tested, no jumper put on it)
-	ET2	- What is this?  (Not tested, no jumper put on it)
-
-	There is a J2 jumper on two pins.  A jumper should be put on them,
-        since it was already there when I got the card.  I don't know what
-        this jumper is for though.
-
-	There is a two-jumper array for J3.  I don't know what it is for,
-        but there were already two jumpers on it when I got the card.  It's
-        a six pin grid in a two-by-three fashion.  The jumpers were
-        configured as follows:
-
-	   .-------.
-	 o | o   o |
-	   :-------:    ------> Accessible end of card with connectors
-	 o | o   o |             in this direction ------->
-	   `-------'
-
-	There is also a J4 jumper on two pins.  A jumper should be put on
-        them, since it was already there when I got the card.  I don't know
-        what this jumper is for though.
-
-
-DIP Switches:
-
-	The dipswitches accessible on the accessible end of the card while
-        it is installed, is used to set the arcnet address.  There are 8
-        switches.  Use an address from 1 to 254.
-
-	Switch No.
-	12345678	Arcnet address
-	-----------------------------------------
-	00000000	FF  	(Don't use this!)
-	00000001	FE
-	00000010	FD
-	....
-	11111101	2	
-	11111110	1
-	11111111	0	(Don't use this!)
-
-	There is another dipswitch array of 8 switches at the top of the
-        card.  There are five labelled MS0-MS4 which seem to control the
-        memory address, and another three labelled IO0-IO2 which seem to
-        control the base I/O address of the card.
-
-	This was difficult to test by trial and error, and the I/O addresses
-        are in a weird order.  This was tested by setting the DIP switches,
-        rebooting the computer, and attempting to load ARCETHER at various
-        addresses (mostly between 0x200 and 0x400).  The address that caused
-        the red transmit LED to blink, is the one that I thought works.
-
-	Also, the address 0x3D0 seem to have a special meaning, since the
-        ARCETHER packet driver loaded fine, but without the red LED
-        blinking.  I don't know what 0x3D0 is for though.  I recommend using
-        an address of 0x300 since Windows may not like addresses below
-        0x300.
-
-	IO Switch No.
-	210             I/O address
-	-------------------------------
-	111             0x260
-	110             0x290
-	101             0x2E0
-	100             0x2F0
-	011             0x300
-	010             0x350
-	001             0x380
-	000             0x3E0
-
-	The memory switches set a reserved address space of 0x1000 bytes
-        (0x100 segment units, or 4k).  For example if I set an address of
-        0xD000, it will use up addresses 0xD000 to 0xD100.
-
-	The memory switches were tested by booting using QEMM386 stealth,
-        and using LOADHI to see what address automatically became excluded
-        from the upper memory regions, and then attempting to load ARCETHER
-        using these addresses.
-
-	I recommend using an arcnet memory address of 0xD000, and putting
-        the EMS page frame at 0xC000 while using QEMM stealth mode.  That
-        way, you get contiguous high memory from 0xD100 almost all the way
-        the end of the megabyte.
-
-	Memory Switch 0 (MS0) didn't seem to work properly when set to OFF
-        on my card.  It could be malfunctioning on my card.  Experiment with
-        it ON first, and if it doesn't work, set it to OFF.  (It may be a
-        modifier for the 0x200 bit?)
-
-	MS Switch No.
-	43210           Memory address
-	--------------------------------
-	00001           0xE100  (guessed - was not detected by QEMM)
-	00011           0xE000  (guessed - was not detected by QEMM)
-	00101           0xDD00
-	00111           0xDC00
-	01001           0xD900
-	01011           0xD800
-	01101           0xD500
-	01111           0xD400
-	10001           0xD100
-	10011           0xD000
-	10101           0xCD00
-	10111           0xCC00
-	11001           0xC900 (guessed - crashes tested system)
-	11011           0xC800 (guessed - crashes tested system)
-	11101           0xC500 (guessed - crashes tested system)
-	11111           0xC400 (guessed - crashes tested system)
-	
-	
-*****************************************************************************
-
-** CNet Technology Inc. **
-120 Series (8-bit cards)
-------------------------
-  - from Juergen Seifert <seifert@htwm.de>
-
-
-CNET TECHNOLOGY INC. (CNet) ARCNET 120A SERIES
-==============================================
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the following Original CNet Manual 
-
-              "ARCNET
-            USER'S MANUAL 
-                for
-               CN120A
-               CN120AB
-               CN120TP
-               CN120ST
-               CN120SBT
-             P/N:12-01-0007
-             Revision 3.00"
-
-ARCNET is a registered trademark of the Datapoint Corporation
-
-P/N 120A   ARCNET 8 bit XT/AT Star
-P/N 120AB  ARCNET 8 bit XT/AT Bus
-P/N 120TP  ARCNET 8 bit XT/AT Twisted Pair
-P/N 120ST  ARCNET 8 bit XT/AT Star, Twisted Pair
-P/N 120SBT ARCNET 8 bit XT/AT Star, Bus, Twisted Pair
-
-    __________________________________________________________________
-   |                                                                  |
-   |                                                               ___|
-   |                                                          LED |___|
-   |                                                               ___|
-   |                                                            N |   | ID7
-   |                                                            o |   | ID6
-   |                                                            d | S | ID5
-   |                                                            e | W | ID4
-   |                     ___________________                    A | 2 | ID3
-   |                    |                   |                   d |   | ID2
-   |                    |                   |  1 2 3 4 5 6 7 8  d |   | ID1
-   |                    |                   | _________________ r |___| ID0
-   |                    |      90C65        ||       SW1       |  ____|
-   |  JP 8 7            |                   ||_________________| |    |
-   |    |o|o|  JP1      |                   |                    | J2 |
-   |    |o|o|  |oo|     |                   |         JP 1 1 1   |    |
-   |   ______________   |                   |            0 1 2   |____|
-   |  |  PROM        |  |___________________|           |o|o|o|  _____|
-   |  >  SOCKET      |  JP 6 5 4 3 2                    |o|o|o| | J1  |
-   |  |______________|    |o|o|o|o|o|                   |o|o|o| |_____|
-   |_____                 |o|o|o|o|o|                   ______________|
-         |                                             |
-         |_____________________________________________|
-
-Legend:
-
-90C65       ARCNET Probe
-S1  1-5:    Base Memory Address Select
-    6-8:    Base I/O Address Select
-S2  1-8:    Node ID Select (ID0-ID7)
-JP1     ROM Enable Select
-JP2     IRQ2
-JP3     IRQ3
-JP4     IRQ4
-JP5     IRQ5
-JP6     IRQ7
-JP7/JP8     ET1, ET2 Timeout Parameters
-JP10/JP11   Coax / Twisted Pair Select  (CN120ST/SBT only)
-JP12        Terminator Select       (CN120AB/ST/SBT only)
-J1      BNC RG62/U Connector        (all except CN120TP)
-J2      Two 6-position Telephone Jack   (CN120TP/ST/SBT only)
-
-Setting one of the switches to Off means "1", On means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in SW2 are used to set the node ID. Each node attached
-to the network must have an unique node ID which must be diffrent from 0.
-Switch 1 (ID0) serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-   Switch | Label | Value
-   -------|-------|-------
-     1    | ID0   |   1
-     2    | ID1   |   2
-     3    | ID2   |   4
-     4    | ID3   |   8
-     5    | ID4   |  16
-     6    | ID5   |  32
-     7    | ID6   |  64
-     8    | ID7   | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   8 7 6 5 4 3 2 1 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The last three switches in switch block SW1 are used to select one
-of eight possible I/O Base addresses using the followig table
-
-
-   Switch      | Hex I/O
-    6   7   8  | Address
-   ------------|--------
-   ON  ON  ON  |  260
-   OFF ON  ON  |  290
-   ON  OFF ON  |  2E0  (Manufactor's default)
-   OFF OFF ON  |  2F0
-   ON  ON  OFF |  300
-   OFF ON  OFF |  350
-   ON  OFF OFF |  380
-   OFF OFF OFF |  3E0
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The memory buffer (RAM) requires 2K. The base of this buffer can be 
-located in any of eight positions. The address of the Boot Prom is
-memory base + 8K or memory base + 0x2000.
-Switches 1-5 of switch block SW1 select the Memory Base address.
-
-   Switch              | Hex RAM | Hex ROM
-    1   2   3   4   5  | Address | Address *)
-   --------------------|---------|-----------
-   ON  ON  ON  ON  ON  |  C0000  |  C2000
-   ON  ON  OFF ON  ON  |  C4000  |  C6000
-   ON  ON  ON  OFF ON  |  CC000  |  CE000
-   ON  ON  OFF OFF ON  |  D0000  |  D2000  (Manufactor's default)
-   ON  ON  ON  ON  OFF |  D4000  |  D6000
-   ON  ON  OFF ON  OFF |  D8000  |  DA000
-   ON  ON  ON  OFF OFF |  DC000  |  DE000
-   ON  ON  OFF OFF OFF |  E0000  |  E2000
-  
-*) To enable the Boot ROM install the jumper JP1
-
-Note: Since the switches 1 and 2 are always set to ON it may be possible
-      that they can be used to add an offset of 2K, 4K or 6K to the base
-      address, but this feature is not documented in the manual and I
-      haven't testet it yet.
-
-
-Setting the Interrupt Line
---------------------------
-
-To select a hardware interrupt level install one (only one!) of the jumpers
-JP2, JP3, JP4, JP5, JP6. JP2 is the default.
-
-   Jumper | IRQ     
-   -------|-----
-     2    |  2
-     3    |  3
-     4    |  4
-     5    |  5
-     6    |  7
-
-
-Setting the Internal Terminator on CN120AB/TP/SBT
---------------------------------------------------
-
-The jumper JP12 is used to enable the internal terminator. 
-
-                         -----
-       0                |  0  |     
-     -----   ON         |     |  ON
-    |  0  |             |  0  |
-    |     |  OFF         -----   OFF
-    |  0  |                0
-     -----
-   Terminator          Terminator 
-    disabled            enabled
-  
-
-Selecting the Connector Type on CN120ST/SBT
--------------------------------------------
-
-     JP10    JP11        JP10    JP11
-                         -----   -----
-       0       0        |  0  | |  0  |       
-     -----   -----      |     | |     |
-    |  0  | |  0  |     |  0  | |  0  |
-    |     | |     |      -----   -----
-    |  0  | |  0  |        0       0 
-     -----   -----
-     Coaxial Cable       Twisted Pair Cable 
-       (Default)
-
-
-Setting the Timeout Parameters
-------------------------------
-
-The jumpers labeled EXT1 and EXT2 are used to determine the timeout 
-parameters. These two jumpers are normally left open.
-
-
-
-*****************************************************************************
-
-** CNet Technology Inc. **
-160 Series (16-bit cards)
--------------------------
-  - from Juergen Seifert <seifert@htwm.de>
-
-CNET TECHNOLOGY INC. (CNet) ARCNET 160A SERIES
-==============================================
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the following Original CNet Manual 
-
-              "ARCNET
-            USER'S MANUAL 
-                for
-               CN160A
-               CN160AB
-               CN160TP
-             P/N:12-01-0006
-             Revision 3.00"
-
-ARCNET is a registered trademark of the Datapoint Corporation
-
-P/N 160A   ARCNET 16 bit XT/AT Star
-P/N 160AB  ARCNET 16 bit XT/AT Bus
-P/N 160TP  ARCNET 16 bit XT/AT Twisted Pair
-
-   ___________________________________________________________________
-  <                             _________________________          ___|
-  >               |oo| JP2     |                         |    LED |___|
-  <               |oo| JP1     |        9026             |    LED |___|
-  >                            |_________________________|         ___|
-  <                                                             N |   | ID7
-  >                                                      1      o |   | ID6
-  <                                    1 2 3 4 5 6 7 8 9 0      d | S | ID5
-  >         _______________           _____________________     e | W | ID4
-  <        |     PROM      |         |         SW1         |    A | 2 | ID3
-  >        >    SOCKET     |         |_____________________|    d |   | ID2
-  <        |_______________|          | IO-Base   | MEM   |     d |   | ID1
-  >                                                             r |___| ID0
-  <                                                               ____|
-  >                                                              |    |
-  <                                                              | J1 |
-  >                                                              |    |
-  <                                                              |____|
-  >                            1 1 1 1                                |
-  <  3 4 5 6 7      JP     8 9 0 1 2 3                                |
-  > |o|o|o|o|o|           |o|o|o|o|o|o|                               |
-  < |o|o|o|o|o| __        |o|o|o|o|o|o|                    ___________|
-  >            |  |                                       |
-  <____________|  |_______________________________________|
-
-Legend:
-
-9026            ARCNET Probe
-SW1 1-6:    Base I/O Address Select
-    7-10:   Base Memory Address Select
-SW2 1-8:    Node ID Select (ID0-ID7)
-JP1/JP2     ET1, ET2 Timeout Parameters
-JP3-JP13    Interrupt Select
-J1      BNC RG62/U Connector        (CN160A/AB only)
-J1      Two 6-position Telephone Jack   (CN160TP only)
-LED
-
-Setting one of the switches to Off means "1", On means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in SW2 are used to set the node ID. Each node attached
-to the network must have an unique node ID which must be diffrent from 0.
-Switch 1 (ID0) serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-   Switch | Label | Value
-   -------|-------|-------
-     1    | ID0   |   1
-     2    | ID1   |   2
-     3    | ID2   |   4
-     4    | ID3   |   8
-     5    | ID4   |  16
-     6    | ID5   |  32
-     7    | ID6   |  64
-     8    | ID7   | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   8 7 6 5 4 3 2 1 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The first six switches in switch block SW1 are used to select the I/O Base
-address using the followig table:
-
-             Switch        | Hex I/O
-    1   2   3   4   5   6  | Address
-   ------------------------|--------
-   OFF ON  ON  OFF OFF ON  |  260
-   OFF ON  OFF ON  ON  OFF |  290
-   OFF ON  OFF OFF OFF ON  |  2E0  (Manufactor's default)
-   OFF ON  OFF OFF OFF OFF |  2F0
-   OFF OFF ON  ON  ON  ON  |  300
-   OFF OFF ON  OFF ON  OFF |  350
-   OFF OFF OFF ON  ON  ON  |  380
-   OFF OFF OFF OFF OFF ON  |  3E0
-
-Note: Other IO-Base addresses seem to be selectable, but only the above
-      combinations are documented.
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The switches 7-10 of switch block SW1 are used to select the Memory
-Base address of the RAM (2K) and the PROM.
-
-   Switch          | Hex RAM | Hex ROM
-    7   8   9  10  | Address | Address
-   ----------------|---------|-----------
-   OFF OFF ON  ON  |  C0000  |  C8000
-   OFF OFF ON  OFF |  D0000  |  D8000 (Default)
-   OFF OFF OFF ON  |  E0000  |  E8000
-
-Note: Other MEM-Base addresses seem to be selectable, but only the above
-      combinations are documented.
-
-
-Setting the Interrupt Line
---------------------------
-
-To select a hardware interrupt level install one (only one!) of the jumpers
-JP3 through JP13 using the following table:
-
-   Jumper | IRQ     
-   -------|-----------------
-     3    |  14
-     4    |  15
-     5    |  12
-     6    |  11
-     7    |  10
-     8    |   3
-     9    |   4
-    10    |   5
-    11    |   6
-    12    |   7
-    13    |   2 (=9) Default!
-
-Note:  - Do not use JP11=IRQ6, it may conflict with your Floppy Disk
-         Controler
-       - Use JP3=IRQ14 only, if you don't have an IDE-, MFM-, or RLL-
-         Hard Disk, it may conflict with their controlers
-
-
-Setting the Timeout Parameters
-------------------------------
-
-The jumpers labeled JP1 and JP2 are used to determine the timeout
-parameters. These two jumpers are normally left open.
-
-
-*****************************************************************************
-
-** No Name **
-8-bit cards, 16-bit cards
--------------------------
-  - from Juergen Seifert <seifert@htwm.de>
-  
-NONAME 8-BIT ARCNET
-===================
-
-I have named this ARCnet card "NONAME", since there is no name of any
-manufactor on the Installation manual nor on the shipping box. The only
-hint to the existence of a manufactor at all is written into cupper,
-it is "Made in Taiwan"
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the Original
-                    "ARCnet Installation Manual"
-
-
-    ________________________________________________________________
-   | |STAR| BUS| T/P|                                               |
-   | |____|____|____|                                               |
-   |                            _____________________               |
-   |                           |                     |              |
-   |                           |                     |              |
-   |                           |                     |              |
-   |                           |        SMC          |              |
-   |                           |                     |              |
-   |                           |       COM90C65      |              |
-   |                           |                     |              |
-   |                           |                     |              |
-   |                           |__________-__________|              |
-   |                                                           _____|
-   |      _______________                                     |  CN |
-   |     | PROM          |                                    |_____|
-   |     > SOCKET        |                                          |
-   |     |_______________|         1 2 3 4 5 6 7 8  1 2 3 4 5 6 7 8 |
-   |                               _______________  _______________ |
-   |           |o|o|o|o|o|o|o|o|  |      SW1      ||      SW2      ||
-   |           |o|o|o|o|o|o|o|o|  |_______________||_______________||
-   |___         2 3 4 5 7 E E R        Node ID       IOB__|__MEM____|
-       |        \ IRQ   / T T O                      |
-       |__________________1_2_M______________________|
-
-Legend:
-
-COM90C65:       Arcnet Probe
-S1  1-8:    Node ID Select
-S2  1-3:    I/O Base Address Select
-    4-6:    Memory Base Address Select
-    7-8:    RAM Offset Select
-ET1, ET2    Extended Timeout Select
-ROM     ROM Enable Select
-CN              RG62 Coax Connector
-STAR| BUS | T/P Three fields for placing a sign (colored circle)
-                indicating the topologie of the card
-
-Setting one of the switches to Off means "1", On means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in group SW1 are used to set the node ID.
-Each node attached to the network must have an unique node ID which
-must be diffrent from 0.
-Switch 8 serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-    Switch | Value
-    -------|-------
-      8    |   1
-      7    |   2
-      6    |   4
-      5    |   8
-      4    |  16
-      3    |  32
-      2    |  64
-      1    | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   1 2 3 4 5 6 7 8 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The first three switches in switch group SW2 are used to select one
-of eight possible I/O Base addresses using the followig table
-
-   Switch      | Hex I/O
-    1   2   3  | Address
-   ------------|--------
-   ON  ON  ON  |  260
-   ON  ON  OFF |  290
-   ON  OFF ON  |  2E0  (Manufactor's default)
-   ON  OFF OFF |  2F0
-   OFF ON  ON  |  300
-   OFF ON  OFF |  350
-   OFF OFF ON  |  380
-   OFF OFF OFF |  3E0
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The memory buffer requires 2K of a 16K block of RAM. The base of this
-16K block can be located in any of eight positions.
-Switches 4-6 of switch group SW2 select the Base of the 16K block.
-Within that 16K address space, the buffer may be assigned any one of four
-positions, determined by the offset, switches 7 and 8 of group SW2.
-
-   Switch     | Hex RAM | Hex ROM
-   4 5 6  7 8 | Address | Address *)
-   -----------|---------|-----------
-   0 0 0  0 0 |  C0000  |  C2000
-   0 0 0  0 1 |  C0800  |  C2000
-   0 0 0  1 0 |  C1000  |  C2000
-   0 0 0  1 1 |  C1800  |  C2000
-              |         |
-   0 0 1  0 0 |  C4000  |  C6000
-   0 0 1  0 1 |  C4800  |  C6000
-   0 0 1  1 0 |  C5000  |  C6000
-   0 0 1  1 1 |  C5800  |  C6000
-              |         |
-   0 1 0  0 0 |  CC000  |  CE000
-   0 1 0  0 1 |  CC800  |  CE000
-   0 1 0  1 0 |  CD000  |  CE000
-   0 1 0  1 1 |  CD800  |  CE000
-              |         |
-   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
-   0 1 1  0 1 |  D0800  |  D2000
-   0 1 1  1 0 |  D1000  |  D2000
-   0 1 1  1 1 |  D1800  |  D2000
-              |         |
-   1 0 0  0 0 |  D4000  |  D6000
-   1 0 0  0 1 |  D4800  |  D6000
-   1 0 0  1 0 |  D5000  |  D6000
-   1 0 0  1 1 |  D5800  |  D6000
-              |         |
-   1 0 1  0 0 |  D8000  |  DA000
-   1 0 1  0 1 |  D8800  |  DA000
-   1 0 1  1 0 |  D9000  |  DA000
-   1 0 1  1 1 |  D9800  |  DA000
-              |         |
-   1 1 0  0 0 |  DC000  |  DE000
-   1 1 0  0 1 |  DC800  |  DE000
-   1 1 0  1 0 |  DD000  |  DE000
-   1 1 0  1 1 |  DD800  |  DE000
-              |         |
-   1 1 1  0 0 |  E0000  |  E2000
-   1 1 1  0 1 |  E0800  |  E2000
-   1 1 1  1 0 |  E1000  |  E2000
-   1 1 1  1 1 |  E1800  |  E2000
-  
-*) To enable the 8K Boot PROM install the jumper ROM.
-   The default is jumper ROM not installed.
-
-
-Setting Interrupt Request Lines (IRQ)
--------------------------------------
-
-To select a hardware interrupt level set one (only one!) of the jumpers
-IRQ2, IRQ3, IRQ4, IRQ5 or IRQ7. The Manufactor's default is IRQ2.
- 
-
-Setting the Timeouts
---------------------
-
-The two jumpers labeled ET1 and ET2 are used to determine the timeout
-parameters (respons and reconfiguration time). Every node in a network
-must be set to the same timeout values.
-
-   ET1 ET2 | Response Time (us) | Reconfiguration Time (ms)
-   --------|--------------------|--------------------------
-   Off Off |        78          |          840   (Default)
-   Off On  |       285          |         1680
-   On  Off |       563          |         1680
-   On  On  |      1130          |         1680
-
-On means jumper installed, Off means jumper not installed
-
-
-NONAME 16-BIT ARCNET
-====================
-
-The manual of my 8-Bit NONAME ARCnet Card contains another description
-of a 16-Bit Coax / Twisted Pair Card. This description is incomplete,
-because there are missing two pages in the manual booklet. (The table
-of contents reports pages ... 2-9, 2-11, 2-12, 3-1, ... but inside
-the booklet there is a diffrent way of counting ... 2-9, 2-10, A-1,
-(empty page), 3-1, ..., 3-18, A-1 (again), A-2)
-Also the picture of the board layout is not as good as the picture of
-8-Bit card, because there isn't any letter like "SW1" written to the
-picture.
-Should somebody have such a board, please feel free to complete this
-description or to send a mail to me!
-
-This description has been written by Juergen Seifert <seifert@htwm.de>
-using information from the Original
-                    "ARCnet Installation Manual"
-
-
-   ___________________________________________________________________
-  <                    _________________  _________________           |
-  >                   |       SW?       ||      SW?        |          |
-  <                   |_________________||_________________|          |
-  >                       ____________________                        |
-  <                      |                    |                       |
-  >                      |                    |                       |
-  <                      |                    |                       |
-  >                      |                    |                       |
-  <                      |                    |                       |
-  >                      |                    |                       |
-  <                      |                    |                       |
-  >                      |____________________|                       |
-  <                                                               ____|
-  >                       ____________________                   |    |
-  <                      |                    |                  | J1 |
-  >                      |                    <                  |    |
-  <                      |____________________|  ? ? ? ? ? ?     |____|
-  >                                             |o|o|o|o|o|o|         |
-  <                                             |o|o|o|o|o|o|         |
-  >                                                                   |
-  <             __                                         ___________|
-  >            |  |                                       |
-  <____________|  |_______________________________________|
-
-
-Setting one of the switches to Off means "1", On means "0".
-
-
-Setting the Node ID
--------------------
-
-The eight switches in group SW2 are used to set the node ID.
-Each node attached to the network must have an unique node ID which
-must be diffrent from 0.
-Switch 8 serves as the least significant bit (LSB).
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-    Switch | Value
-    -------|-------
-      8    |   1
-      7    |   2
-      6    |   4
-      5    |   8
-      4    |  16
-      3    |  32
-      2    |  64
-      1    | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   1 2 3 4 5 6 7 8 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The first three switches in switch group SW1 are used to select one
-of eight possible I/O Base addresses using the followig table
-
-   Switch      | Hex I/O
-    3   2   1  | Address
-   ------------|--------
-   ON  ON  ON  |  260
-   ON  ON  OFF |  290
-   ON  OFF ON  |  2E0  (Manufactor's default)
-   ON  OFF OFF |  2F0
-   OFF ON  ON  |  300
-   OFF ON  OFF |  350
-   OFF OFF ON  |  380
-   OFF OFF OFF |  3E0
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The memory buffer requires 2K of a 16K block of RAM. The base of this
-16K block can be located in any of eight positions.
-Switches 6-8 of switch group SW1 select the Base of the 16K block.
-Within that 16K address space, the buffer may be assigned any one of four
-positions, determined by the offset, switches 4 and 5 of group SW1.
-
-   Switch     | Hex RAM | Hex ROM
-   8 7 6  5 4 | Address | Address
-   -----------|---------|-----------
-   0 0 0  0 0 |  C0000  |  C2000
-   0 0 0  0 1 |  C0800  |  C2000
-   0 0 0  1 0 |  C1000  |  C2000
-   0 0 0  1 1 |  C1800  |  C2000
-              |         |
-   0 0 1  0 0 |  C4000  |  C6000
-   0 0 1  0 1 |  C4800  |  C6000
-   0 0 1  1 0 |  C5000  |  C6000
-   0 0 1  1 1 |  C5800  |  C6000
-              |         |
-   0 1 0  0 0 |  CC000  |  CE000
-   0 1 0  0 1 |  CC800  |  CE000
-   0 1 0  1 0 |  CD000  |  CE000
-   0 1 0  1 1 |  CD800  |  CE000
-              |         |
-   0 1 1  0 0 |  D0000  |  D2000  (Manufactor's default)
-   0 1 1  0 1 |  D0800  |  D2000
-   0 1 1  1 0 |  D1000  |  D2000
-   0 1 1  1 1 |  D1800  |  D2000
-              |         |
-   1 0 0  0 0 |  D4000  |  D6000
-   1 0 0  0 1 |  D4800  |  D6000
-   1 0 0  1 0 |  D5000  |  D6000
-   1 0 0  1 1 |  D5800  |  D6000
-              |         |
-   1 0 1  0 0 |  D8000  |  DA000
-   1 0 1  0 1 |  D8800  |  DA000
-   1 0 1  1 0 |  D9000  |  DA000
-   1 0 1  1 1 |  D9800  |  DA000
-              |         |
-   1 1 0  0 0 |  DC000  |  DE000
-   1 1 0  0 1 |  DC800  |  DE000
-   1 1 0  1 0 |  DD000  |  DE000
-   1 1 0  1 1 |  DD800  |  DE000
-              |         |
-   1 1 1  0 0 |  E0000  |  E2000
-   1 1 1  0 1 |  E0800  |  E2000
-   1 1 1  1 0 |  E1000  |  E2000
-   1 1 1  1 1 |  E1800  |  E2000
-  
-
-Setting Interrupt Request Lines (IRQ)
--------------------------------------
-
-??????????????????????????????????????
-
-
-Setting the Timeouts
---------------------
-
-??????????????????????????????????????
-
-
-*****************************************************************************
-
-** No Name **
-8-bit cards ("Made in Taiwan R.O.C.")
------------
- - from Vojtech Pavlik <vpav4328@diana.troja.mff.cuni.cz>
-
-I have named this ARCnet card "NONAME", since I got only the card with
-no manual at all and the only text identifying the manufacturer is 
-"MADE IN TAIWAN R.O.C" printed on the card.
-
-This description was written by Vojtech Pavlik 
-(vpav4328@diana.troja.mff.cuni.cz) using parts of the ARCNET-jumpers 
-README file from Linux kernel 1.2.2. 
-
-          ____________________________________________________________
-         |                 1 2 3 4 5 6 7 8                            |
-         | |o|o| JP1       o|o|o|o|o|o|o|o| ON                        |
-         |  +              o|o|o|o|o|o|o|o|                        ___|
-         |  _____________  o|o|o|o|o|o|o|o| OFF         _____     |   | ID7
-         | |             | SW1                         |     |    |   | ID6
-         | > RAM (2k)    |        ____________________ |  H  |    | S | ID5
-         | |_____________|       |                    ||  y  |    | W | ID4
-         |                       |                    ||  b  |    | 2 | ID3
-         |                       |                    ||  r  |    |   | ID2
-         |                       |                    ||  i  |    |   | ID1
-         |                       |       90C65        ||  d  |    |___| ID0
-         |      SW3              |                    ||     |        |      
-         | |o|o|o|o|o|o|o|o| ON  |                    ||  I  |        |
-         | |o|o|o|o|o|o|o|o|     |                    ||  C  |        |
-         | |o|o|o|o|o|o|o|o| OFF |____________________||     |   _____|
-         |  1 2 3 4 5 6 7 8                            |     |  |     |___
-         |  ______________                             |     |  | BNC |___|
-         | |              |                            |_____|  |_____|
-         | > EPROM SOCKET |                                           |
-         | |______________|                                           |
-         |                                              ______________|
-         |                                             |
-         |_____________________________________________|
-
-Legend:
-
-90C65       ARCNET Chip 
-SW1 1-5:    Base Memory Address Select
-    6-8:    Base I/O Address Select
-SW2 1-8:    Node ID Select (ID0-ID7)
-SW3 1-5:    IRQ Select   
-    6-7:    Extra Timeout
-    8  :    Rom Enable   
-JP1         Led connector
-BNC         Coax connector
-
-Although the jumpers SW1 and SW3 are marked SW, not JP, they are jumpers, not 
-switches.
-
-Setting the jumpers to ON means connecting the upper two pins, off the bottom 
-two - or - in case of IRQ setting, connecting none of them at all.
-
-Setting the Node ID
--------------------
-
-The eight switches in SW2 are used to set the node ID. Each node attached
-to the network must have an unique node ID which must be diffrent from 0.
-Switch 1 (ID0) serves as the least significant bit (LSB).
-
-Setting one of the switches to Off means "1", On means "0".
-
-The node ID is the sum of the values of all switches set to "1"  
-These values are:
-
-   Switch | Label | Value
-   -------|-------|-------
-     1    | ID0   |   1
-     2    | ID1   |   2
-     3    | ID2   |   4
-     4    | ID3   |   8
-     5    | ID4   |  16
-     6    | ID5   |  32
-     7    | ID6   |  64
-     8    | ID7   | 128
-
-Some Examples:
-
-    Switch         | Hex     | Decimal 
-   8 7 6 5 4 3 2 1 | Node ID | Node ID
-   ----------------|---------|---------
-   0 0 0 0 0 0 0 0 |    not allowed
-   0 0 0 0 0 0 0 1 |    1    |    1 
-   0 0 0 0 0 0 1 0 |    2    |    2
-   0 0 0 0 0 0 1 1 |    3    |    3
-       . . .       |         |
-   0 1 0 1 0 1 0 1 |   55    |   85
-       . . .       |         |
-   1 0 1 0 1 0 1 0 |   AA    |  170
-       . . .       |         |  
-   1 1 1 1 1 1 0 1 |   FD    |  253
-   1 1 1 1 1 1 1 0 |   FE    |  254
-   1 1 1 1 1 1 1 1 |   FF    |  255
-
-
-Setting the I/O Base Address
-----------------------------
-
-The last three switches in switch block SW1 are used to select one
-of eight possible I/O Base addresses using the followig table
-
-
-   Switch      | Hex I/O
-    6   7   8  | Address
-   ------------|--------
-   ON  ON  ON  |  260
-   OFF ON  ON  |  290
-   ON  OFF ON  |  2E0  (Manufactor's default)
-   OFF OFF ON  |  2F0
-   ON  ON  OFF |  300
-   OFF ON  OFF |  350
-   ON  OFF OFF |  380
-   OFF OFF OFF |  3E0
-
-
-Setting the Base Memory (RAM) buffer Address
---------------------------------------------
-
-The memory buffer (RAM) requires 2K. The base of this buffer can be 
-located in any of eight positions. The address of the Boot Prom is
-memory base + 0x2000.
-Jumpers 3-5 of jumper block SW1 select the Memory Base address.
-
-   Switch              | Hex RAM | Hex ROM
-    1   2   3   4   5  | Address | Address *)
-   --------------------|---------|-----------
-   ON  ON  ON  ON  ON  |  C0000  |  C2000
-   ON  ON  OFF ON  ON  |  C4000  |  C6000
-   ON  ON  ON  OFF ON  |  CC000  |  CE000
-   ON  ON  OFF OFF ON  |  D0000  |  D2000  (Manufactor's default)
-   ON  ON  ON  ON  OFF |  D4000  |  D6000
-   ON  ON  OFF ON  OFF |  D8000  |  DA000
-   ON  ON  ON  OFF OFF |  DC000  |  DE000
-   ON  ON  OFF OFF OFF |  E0000  |  E2000
-  
-*) To enable the Boot ROM set the jumper 8 of jumper block SW3 to position ON.
-
-The jumpers 1 and 2 probably add 0x0800, 0x1000 and 0x1800 to RAM addres.
-
-Setting the Interrupt Line
---------------------------
-
-Jumpers 1-5 of the jumper block SW3 controll the IRQ level.
-
-    Jumper              |  IRQ
-    1   2   3   4   5   |
-   ----------------------------
-    ON  OFF OFF OFF OFF |  2
-    OFF ON  OFF OFF OFF |  3
-    OFF OFF ON  OFF OFF |  4
-    OFF OFF OFF ON  OFF |  5
-    OFF OFF OFF OFF ON  |  7
-
-
-Setting the Timeout Parameters
-------------------------------
-
-The jumpers 6-7 of the jumper block SW3 are used to determine the timeout 
-parameters. These two jumpers are normally left in the OFF position.
-
-
-*****************************************************************************
-** Tiara **
-(model unknown)
--------------------------
-  - from Christoph Lameter <clameter@netcom.com>
-  
-
-Here is information about my card as far as I could figure it out:
------------------------------------------------ tiara
-Tiara LanCard of Tiara Computer Systems.
-
-+----------------------------------------------+
-!           ! Transmitter Unit !               !
-!           +------------------+             -------
-!          MEM                              Coax Connector
-!  ROM    7654321 <- I/O                     -------
-!  :  :   +--------+                           !
-!  :  :   ! 90C66LJ!                         +++
-!  :  :   !        !                         !D  Switch to set
-!  :  :   !        !                         !I  the Nodenumber
-!  :  :   +--------+                         !P
-!                                            !++
-!         234567 <- IRQ                      !
-+------------!!!!!!!!!!!!!!!!!!!!!!!!--------+
-             !!!!!!!!!!!!!!!!!!!!!!!!
-
-0 = Jumper Installed
-1 = Open
-
-Top Jumper line Bit 7 = Rom Enable 654=Memory location 321=I/O
-
-Settings for Memory Location (Top Jumper Line)
-456     Address selected
-000	C0000
-001     C4000
-010     CC000
-011     D0000
-100     D4000
-101     D8000
-110     DC000     
-111     E0000
-
-Settings for I/O Address (Top Jumper Line)
-123     Port
-000	260
-001	290
-010	2E0
-011	2F0
-100	300
-101	350
-110	380
-111	3E0
-
-Settings for IRQ Selection (Lower Jumper Line)
-234567
-011111 IRQ 2
-101111 IRQ 3
-110111 IRQ 4
-111011 IRQ 5
-111110 IRQ 7
-
-*****************************************************************************
-
-
-Other Cards
------------
-
-I have no information on other models of ARCnet cards at the moment.  Please
-send any and all info to:
-	apenwarr@foxnet.net
-
-Thanks.
diff -u --recursive --new-file v1.3.24/linux/Documentation/networking/arcnet.txt linux/Documentation/networking/arcnet.txt
--- v1.3.24/linux/Documentation/networking/arcnet.txt	Sun Sep  3 12:26:48 1995
+++ linux/Documentation/networking/arcnet.txt	Fri Sep  8 07:42:57 1995
@@ -1,15 +1,15 @@
 
 ----------------------------------------------------------------------------
-NOTE:  See also README.arcnet-jumpers in this directory for jumper-setting
-information if you're like many of us and didn't happen to get a manual with
-your ARCnet card.
+NOTE:  See also README.arcnet-hardware in this directory for jumper-setting
+and cabling information if you're like many of us and didn't happen to get a
+manual with your ARCnet card.
 ----------------------------------------------------------------------------
 
 Since no one seems to listen to me otherwise, perhaps a poem will get your
 attention:
-			This is alpha software
+			This is scary software
 			If it works I DO CARE.
-			
+
 Hmm, I think I'm allowed to call that a poem, even though it's only two
 lines.  Hey, I'm in Computer Science, not English.  Give me a break.
 
@@ -24,26 +24,32 @@
 
 (hey, that was even better than my original poem... this is getting bad!)
 
-Anyway, enough complaining.  Let's get started:
 
----------------------------------------------------------------------------
-			
-These are the ARCnet drivers for Linux.
+--------
+WARNING:
+--------
 
-We're now back to more ALPHA releases after the 1.01 release which made it
-into Linux 1.2.2, so please be careful, and send all possible
-success/failure reports to me.  If I don't know when/if/how it works, I
-won't be able to answer people's questions.  Do we want that?  Of course
-not.
+If you don't e-mail me about your success/failure soon, I may be forced to
+start SINGING.  And we don't want that, do we?
 
-Once again:  DO send me success reports!  I want to know if this is working!
 (You know, it might be argued that I'm pushing this point a little too much. 
 If you think so, why not flame me in a quick little e-mail?  Please also
 include the type of card(s) you're using, software, size of network, and
 whether it's working or not.)
 
-My e-mail address is:
-	apenwarr@foxnet.net
+My e-mail address is: apenwarr@foxnet.net
+
+
+---------------------------------------------------------------------------
+
+			
+These are the ARCnet drivers for Linux.
+
+This new "stable" release has come from many months of on-and-off effort
+from me (Avery Pennarun), many bug reports from users, and in particular a
+lot of input and coding from Tomasz Motylewski.  (I've held off on Tomasz'
+latest patches - but his all-new RFC1051 support is here and waiting for the
+next ALPHA release!)
 
 
 Where do I discuss these drivers?
@@ -62,38 +68,44 @@
 Send all bug (or success) reports to me or to the list.
 
 The people on linux-net@vger.rutgers.edu have also been known to be very
-helpful! :)
+helpful, especially when we're talking about ALPHA Linux kernels that may or
+may not work right in the first place.
 
 
 Other Drivers and Info
 ----------------------
 
-Also, SMC (one of the companies that makes ARCnet cards) has a WorldWideWeb
-site you might be interested in, which includes several drivers for various
-cards including ARCnet.  Try:
+You can try my ARCNET page on the World Wide Web at:
+	http://www.foxnet.net/~apenwarr/arcnet/
+
+Also, SMC (one of the companies that makes ARCnet cards) has a WWW site you
+might be interested in, which includes several drivers for various cards
+including ARCnet.  Try:
 	http://www.smc.com/
 	
 Performance Technologies makes various network software that supports
-ARCnet.
+ARCnet:
 	http://www.perftech.com/ or ftp to ftp.perftech.com.
 	
 Novell makes a networking stack for DOS which includes ARCnet drivers.  Try
 ftp'ing to ftp.novell.com.
 
 You can get the Crynwr packet driver collection (including arcether.com, the
-one you'll want for arcnet cards) from oak.oakland.edu:/simtel/msdos/pktdrvr.
-It won't work perfectly on a 386+ without patches, though, and also doesn't
-like several cards.  Mail me if you want a fixed version.  (Ahem:  I may or
-may not have a 100% fixed version by the time I get your mail!)
+one you'll want to use with arcnet cards) from
+oak.oakland.edu:/simtel/msdos/pktdrvr. It won't work perfectly on a 386+
+without patches, though, and also doesn't like several cards.  Mail me if
+you want a fixed version.  (Ahem: I may or may not have a 100% fixed version
+by the time I get your mail!)
 
 
 Loadable Module Support
 -----------------------
 
-This is a available starting with 0.42 ALPHA.
+Configure and rebuild Linux.  When asked, answer 'n' to "arcnet support" if
+you want to use the loadable module.
 
-Configure and rebuild Linux.  When asked, say NO to "arcnet support" if you
-want loadable module support.
+Actually, with Linux 1.3.24 and higher, you should answer 'm' to build the
+module.
 
 	make config
 	make dep
@@ -101,10 +113,6 @@
 	make zImage
 	make modules
 	
-	
-Booting into your "ARCnet" Kernel
----------------------------------
-
 If you're using a loadable module, you need to use insmod to load the
 module, and you need to specify various characteristics of your card on the
 command line.  For example:
@@ -113,9 +121,14 @@
 You can also add a num=1, num=2 etc for additional arcnet cards that will
 use arc1, arc2 etc for their device names (instead of the default, arc0).
 	
-Otherwise the driver will load and probe for your card automatically.
-	
-Now go read the NET-2-HOWTO and ETHERNET-HOWTO for Linux; they should be
+
+Using the Driver
+----------------
+
+If you build your kernel with ARCnet support included, it should probe for
+your card automatically when you boot.
+
+Go read the NET-2-HOWTO and ETHERNET-HOWTO for Linux; they should be
 available where you picked up this driver.  Think of your ARCnet as a
 souped-up (or down, as the case may be) ethernet card.
 
@@ -145,34 +158,199 @@
 LAN Manager and Windows for Workgroups: These programs use protocols that
         are incompatible with the internet standard.  They try to pretend
         the cards are ethernet, and confuse everyone else on the network. 
-        However, v1.93 ALPHA and later of the Linux ARCnet driver support
-        this protocol via the 'arc0e' device.  After setting up arc0 as
-        usual, ifconfig and set up routes to your ethernet-encap hosts
-        through arc0e.  There may be non-Microsoft products that support
-        this protocol as well, so it was changed in 1.93 ALPHA from arc0w
-        to arc0e.
+        
+        However, v2.00 of the Linux ARCnet driver supports this protocol via
+        the 'arc0e' device.  See the section on "Multiprotocol Support" for
+	more information.
         
 	Using the freeware Samba server and clients for Linux, you can now
 	interface quite nicely with TCP/IP-based WfWg or Lan Manager
-	networks.  In addition, the Linux host can be used as a router
-	between the standard and WfWg protocols, so hosts that could
-	previously never talk to each other should now be able to.
-
-        This feature is still in early testing, so please e-mail with any
-	comments/questions you might have.
+	networks.
 	
+Windows 95: Tools are included with Win95 that let you use either the LANMAN
+	style network drivers (NDIS) or Novell drivers (ODI) to handle your
+	ARCnet packets.  If you use ODI, you'll need to use the 'arc0'
+	device with Linux.  If you use NDIS, then try the 'arc0e' device. 
+	See the "Multiprotocol Support" section below if you need arc0e,
+	you're completely insane, and/or you need to build some kind of
+	hybrid network that uses both encapsulation types.
+
 OS2: Has not been tested.  The "correct" solution would be to buy either of
 	IBM's "TCP/IP for OS/2" or "Warp Connect" packages.  However,
 	ftp.microsoft.com also has a freeware Lan Manager for OS/2 client
-	which should use the same protocol as WfWg does.  This has not been
-	tested, however.  Please mail me with any results.
-        
+	which should use the same protocol as WfWg does.  I had no luck
+	installing it under Warp, however.  Please mail me with any results.
+
 NetBSD/AmiTCP: These use an old version of the Internet standard ARCnet
-	protocol which is incompatible with the Linux driver at present. 
-	Work to support these is underway and should be available in a
-	standard release soon.
+	protocol (RFC1051) which is incompatible with the Linux driver at
+	present.  Work to support these is underway and should be available
+	in an ALPHA release very soon.
+	
+
+Using Multiprotocol ARCnet
+--------------------------
+
+The ARCnet driver v2.00 supports two protocols, each on its own "virtual
+network device":
+	arc0  - RFC1201 protocol, the official internet standard which just
+		happens to be 100% compatible with Novell's TRXNET driver. 
+		Version 1.00 of the ARCnet driver _only_ supported this
+		protocol.  arc0 is the faster of the two protocols, and
+		allows larger packets to be used because it supports RFC1201
+		"packet splitting" operations.  Unless you have a specific
+		need to use a different protocol, I highly suggest that you
+		stick with this one.
+		
+	arc0e - "Ethernet-Encapsulation" which sends packets over ARCnet
+		that are actually a lot like Ethernet packets, including the
+		6-byte hardware addresses.  This protocol is compatible with
+		Microsoft's NDIS ARCnet driver, like the one in WfWg and
+		LANMAN.  Because the MTU of 493 is actually smaller than the
+		one "required" by TCP/IP (576), there is a chance that some
+		network operations will not work properly.  The Linux TCP/IP
+		layer can compensate in most cases, however, by
+		automatically fragmenting the TCP/IP packets to make them
+		fit.  arc0e also works slightly more slowly than arc0, for
+		reasons yet to be determined.  (Probably it's the smaller
+		MTU that does it)
+
+The arc0e device is created automatically when you first 'ifconfig' the arc0
+device.  To actually use arc0e, though, you need to 'ifconfig' it as well. 
+There are a number of ways you can set up your network then:
+
+
+1. Single Protocol.
+
+   This is the simplest way to configure your network: use just one of the
+   two available protocols.  As mentioned above, it's a good idea to use
+   only arc0 unless you have a good reason (like some other software, ie.
+   WfWg, that only works with arc0e).
+   
+   If you need only arc0, then the following commands should get you going:
+   	ifconfig arc0 MY.IP.ADD.RESS
+   	route add MY.IP.ADD.RESS arc0
+   	route add SUB.NET.ADD.RESS arc0
+   	[etc]
+   	
+   If you need arc0e (and only arc0e), it's a little different:
+   	ifconfig arc0 up     /* the IP address doesn't matter on arc0 */
+   	ifconfig arc0e MY.IP.ADD.RESS
+   	route add MY.IP.ADD.RESS arc0e
+   	route add SUB.NET.ADD.RESS arc0e
+
+
+2. More than one protocol on the same wire.
+
+   Now things start getting confusing.  To even try it, you may need to be
+   partly crazy.  Here's what *I* did.  :)
+
+   I have three computers on my home network; two Linux boxes (which prefer
+   RFC1201 protocol), and one XT that can't run Linux but runs the free
+   Microsoft LANMAN Client instead.
+   
+   Worse, one of the Linux computers (freedom) also has a modem and acts as
+   a router to my information provider.  The other Linux box (insight) also
+   has its own IP address and needs to use freedom as its default gateway. 
+   The XT (patience), however, does not have its own internet IP address and
+   so I assigned it one on a "private subnet" (as defined by RFC1597).
+   
+   To start with, take a simple network with just insight and freedom. 
+   Insight needs to:
+   	- talk to freedom via RFC1201 (arc0) protocol, because I like it
+	  more and it's faster.
+	- use freedom as its internet gateway.
+	
+   That's pretty easy to do.  Set up insight like this:
+   	ifconfig arc0 insight
+   	route add insight arc0
+   	route add freedom arc0	/* I would use the subnet here (like I said
+					to to in "single protocol" above),
+   					but the rest of the subnet
+   					unfortunately lies across the PPP
+   					link on freedom, which confuses
+   					things. */
+   	route add default gw freedom
+   	
+   And freedom gets configured like so:
+   	ifconfig arc0 freedom
+   	route add freedom arc0
+   	route add insight arc0
+   	/* and default gateway is configured by PPP */
+   	
+   Great, now insight talks to freedom directly on arc0, and sends packets
+   to the internet through freedom.  If you didn't know how to do the above,
+   you should probably stop reading this section now because it only gets
+   worse.
+
+   Now, how do I add patience into the network?  It will be using LANMAN
+   Client, which means I need the arc0e device.  It needs to be able to talk
+   to both insight and freedom, and also use freedom as a gateway to the
+   internet.  (Recall that patience has a "private IP address" which won't
+   work on the internet; that's okay, I configured Linux IP masquerading on
+   freedom for this subnet).
+   
+   So patience (necessarily; I don't have another IP number from my
+   provider) has an IP address on a different subnet than freedom and
+   insight, but needs to use freedom as an internet gateway.  Worse, most
+   DOS networking programs, including LANMAN, have braindead networking
+   schemes that rely completely on the netmask and a 'default gateway' to
+   determine how to route packets.  This means that to get to freedom or
+   insight, patience WILL send through its default gateway, regardless of
+   the fact that both freedom and insight (courtesy of the arc0e device)
+   could understand a direct transmission.
+   
+   I compensate by giving freedom an extra IP address - aliased 'gatekeeper'
+   - that is on my private subnet, the same subnet that patience is on.  I
+   then define gatekeeper to be the default gateway for patience.
+   
+   To configure freedom (in addition to the commands above):
+   	ifconfig arc0e gatekeeper
+   	route add gatekeeper arc0e
+   	route add patience arc0e
+   
+   This way, freedom will send all packets for patience through arc0e,
+   giving its IP address as gatekeeper (on the private subnet).  When it
+   talks to insight or the internet, it will use its "freedom" internet IP
+   address.
+   
+   You will notice that we haven't configured the arc0e device on insight. 
+   This would work, but is not really necessary, and would require me to
+   assign insight another special IP number from my private subnet.  Since
+   both insight and patience are using freedom as their default gateway, the
+   two can already talk to each other.
+   
+   It's quite fortunate that I set things up like this the first time
+   through (cough cough) because it's really handy when I boot insight into
+   DOS.  There, it runs the Novell ODI protocol stack, which only works with
+   RFC1201 ARCnet.  In this mode it would be impossible for insight to
+   communicate directly with patience, since the Novell stack is
+   incompatible with Microsoft's Ethernet-Encap.  Without changing any
+   settings on freedom or patience, I simply set freedom as the default
+   gateway for insight (now in DOS, remember) and all the forwarding happens
+   "automagically" between the two hosts that would normally not be able to
+   communicate at all.
+   
+   For those who like diagrams, I have created two "virtual subnets" on the
+   same physical ARCnet wire.  You can picture it like this:
+   
+                                                    
+          [RFC1201 NETWORK]                   [ETHER-ENCAP NETWORK]
+      (registered internet subnet)           (RFC1597 private subnet)
+  
+                             (IP Masquerade)
+          /---------------\         *            /---------------\
+          |               |         *            |               |
+          |               +-Freedom-*-Gatekeeper-+               |
+          |               |    |    *            |               |
+          \-------+-------/    |                 \-------+-------/
+                  |            |                         |
+               Insight         |                      Patience
+                           (Internet)
+                        
 
 
+
+                                                    
 It works: what now?
 -------------------
 
@@ -221,12 +399,15 @@
 	ifconfig arc0 down metric 1xxx
 	/etc/rc.d/rc.inet1
 where "xxx" is the debug level you want.  For example, "metric 1015" would put
-you at debug level 15.  Debug level 7 is currently the default.
+you at debug level 15.  Debug level 3 is currently the default.
 
 Note that the debug level is (as of v1.90 ALPHA) a binary combination of
 different debug flags; so debug level 7 is really 1+2+4 or
 D_NORMAL+D_INIT+D_EXTRA.  To reach D_DURING, you would add 8 to this,
 resulting in debug level 15.
+
+If you don't understand that, you probably don't want to know anyway. 
+E-mail me about your problem.
 
 
 I want to send money: what now?
diff -u --recursive --new-file v1.3.24/linux/Documentation/networking/z8530drv.txt linux/Documentation/networking/z8530drv.txt
--- v1.3.24/linux/Documentation/networking/z8530drv.txt	Thu Jan  1 02:00:00 1970
+++ linux/Documentation/networking/z8530drv.txt	Fri Sep  8 08:02:05 1995
@@ -0,0 +1,953 @@
+// 950824: note -- I will upload the new version 1.9 to ftp.ucsd.edu
+//         as soon as possible... 
+//
+// ******
+// ****** The driver has a  n e w  MAJOR number (34) now! ******
+// ******
+//
+// please remake /dev/sc*:
+//
+// mknod /dev/sc1 c 34 0
+// mknod /dev/sc2 c 34 1
+// mknod /dev/sc3 c 34 2
+// mknod /dev/sc4 c 34 3
+//
+// (and so on...)
+//
+// -dl1bke-
+
+This is a subset of the documentation. To use this driver you MUST have the
+full package from:
+
+Internet:
+=========
+
+ftp.ucsd.edu:/hamradio/packet/tcpip/incoming/z8530drv-1.9.dl1bke.tar.gz
+
+[
+  if you can't find it there, try:
+  .../tcpip/linux/z8530drv-1.9.dl1bke.tar.gz
+
+]
+
+and various mirrors (i.e. nic.switch.ch)
+
+AX.25 BBS
+=========
+
+UNIX @ DB0ACH.#NRW.DEU.EU, subject: Z8530D19.Pxx/Pyy
+
+(AX.25 call: DB0ACH-8)
+
+and various BBS that received the file through AUTO7P or 7PSERV
+with the filename Z8530D19.TGZ
+
+
+---------------------------------------------------------------------------
+
+
+	 SCC.C - Linux driver for Z8530 based HDLC cards for AX.25      
+
+   ********************************************************************
+
+        (c) 1994 by Joerg Reuter DL1BKE
+
+        portions (c) 1994 Hans Alblas PE1AYX
+        and      (c) 1993 Guido ten Dolle PE1NNZ
+
+        for the complete copyright notice see >> Copying.Z8530DRV <<
+
+   ******************************************************************** 
+
+
+0. Installation of the package
+==============================
+
+Run SCC-Install. If one (or more) of the patches fails PLEASE consult 
+chapter 2 (and READ IT of course!)
+
+
+
+1. Initialization and attachment of the channels
+================================================
+
+To use the driver, 3 steps must be performed:
+
+     1. Global initialization of the driver in the kernel
+     2. Setup of parameters with sccinit
+     2. Attachment of each channel in the packet software
+
+The global initialization is needed to reset all SCCs and to 
+install a common interrupt handler.  Also, the hardware addresses 
+of the chips are defined in this step.  In the second step, each 
+channel is set up for the intended use.
+
+
+
+1.1. Initialization
+===================
+
+Initialization of the hardware is performed by setting the defines and
+variables in the file "/linux/drivers/char/scc_config.h". You can change 
+a number of parameters.
+
+
+
+################################################################################################
+# For OptoSCC card e.g:
+#
+
+int     Nchips       = 2        ; /* number of chips */
+io_port Vector_Latch = 0x168    ; /* addr. of INTACK-Latch (0 for poll mode)
+*/
+int     Ivec         = 9        ; /* interrupt vector */
+long    Clock        = 4915200  ; /* frequency of the scc clock */
+char    Pclk         = 1        ; /* use PCLK (1) or RTxC (0) */
+char    Board        = PA0HZP   ; /* what type of SCC card do you use? */
+int     Option       = 0        ; /* command for extra hardware */
+io_port Special_Port = 0        ; /* port address for special hardware */
+                                  /* (for EAGLE, PC100, PRIMUS, DRSI) */
+
+                        /*      ^  never remove the semicolon !! */
+
+
+/*                      Channel    A      B         Chip        */
+/*                               ============     ========      */
+/* Control ports:                                               */
+
+io_port SCC_ctrl[MAXSCC * 2] =  {0x152, 0x150,  /* ...one...    */
+                                 0x156, 0x154,  /* ...two...    */
+                                     0,     0,  /* ...three...  */
+                                     0,     0}; /* ...four...   */
+			
+
+/* Data ports:							*/
+
+io_port SCC_data[MAXSCC * 2] =  {0x153, 0x151,	/* ...one...	*/
+				 0x157, 0x155,	/* ...two...	*/
+				     0,     0,	/* ...three...	*/
+				     0,     0};	/* ...four...	*/
+
+
+/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
+
+/*					      Chip	*/
+/*				            ========   	*/
+int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
+				 0,  	/* ...two...	*/
+				 0,  	/* ...three...	*/
+				 0};	/* ...four...	*/
+
+/* some useful #defines. You might need them or not */
+
+#define VERBOSE_BOOTMSG 1
+#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
+#undef  SCC_LDELAY		/* slow it even a bit more down */
+#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
+
+
+/*********** END OF CONFIGURATION PARAMETERS ********************************************/
+
+
+
+
+################################################################################################
+# For Baycom (U)SCC card e.g:
+#
+
+int     Nchips	     = 2	; /* number of chips */
+io_port Vector_Latch = 0	; /* addr. of INTACK-Latch (0 for poll mode) */
+int     Ivec	     = 7	; /* interrupt vector */
+long    Clock	     = 4915200	; /* frequency of the scc clock */
+char	Board	     = BAYCOM	; /* what type of SCC card do you use? */
+int	Option	     = 0	; /* command for extra hardware */
+io_port Special_Port = 0	; /* port address for special hardware */
+				  /* (for EAGLE, PC100, PRIMUS, DRSI) */
+
+			/*      ^  never remove the semicolon !! */
+			
+
+
+/* 			Channel    A      B	    Chip	*/
+/*			         ============	  ========	*/
+/* Control ports:						*/
+
+io_port SCC_ctrl[MAXSCC * 2] = 	{0x304, 0x305,  /* ...one... 	*/
+				 0x306, 0x307,  /* ...two...	*/
+				     0,     0,  /* ...three...	*/
+				     0,     0}; /* ...four...	*/
+
+/* Data ports:							*/
+
+io_port SCC_data[MAXSCC * 2] =  {0x300, 0x301,	/* ...one...	*/
+				 0x302, 0x303,	/* ...two...	*/
+				     0,     0,	/* ...three...	*/
+				     0,     0};	/* ...four...	*/
+
+
+/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
+
+/*					      Chip	*/
+/*				            ========   	*/
+int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
+				 0,  	/* ...two...	*/
+				 0,  	/* ...three...	*/
+				 0};	/* ...four...	*/
+
+/* some useful #defines. You might need them or not */
+
+#define VERBOSE_BOOTMSG 1
+#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
+#undef  SCC_LDELAY		/* slow it even a bit more down */
+#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
+
+After you changed a parameter you have to recompile a new kernel image file.
+
+The channel number ranges from 0 to (2 * Nchips) - 1,
+where Nchips is the number of chips.
+
+The crystal clock is specified as 4.9152 MHz.  Other frequencies 
+can be used, and this parameter should be adjusted accordingly.
+
+
+You can define your scc type with Board
+
+   SCC type                 value
+   ---------------------------------
+   PA0HZP SCC card          PA0HZP
+   EAGLE card               EAGLE
+   PC100 card               PC100
+   PRIMUS-PC (DG9BL) card   PRIMUS
+   BayCom (U)SCC card       BAYCOM
+
+
+NOTE:
+=====
+
+If you only know the parameters for the PE1CHL driver for DOS,
+run gencfg. It will generate the correct port addresses (I hope).
+Its parameters are exactly the same as the ones you use with
+the "attach scc" command in net, except that the string "init" must 
+not appear. Example:
+
+gencfg 2 0x150 4 2 0 1 0x168 9 4915200 
+
+will print a short form of scc_config.h for the OptoSCC to stdout. 
+("short" <=> few comments).
+
+gencfg 2 0x300 2 4 5 -4 0 7 4915200 0x10
+
+does the same for the BayCom USCC card. I my opinion it is much easier
+to edit scc_config.h... 
+
+
+1.2 initializing the driver on bootup
+=====================================
+
+
+To setup a number parameters you must run /sbin/sccinit from one
+of your rc.*-files. This has to be done BEFORE the start of
+NET or the ax25attach. Sccinit reads the file /etc/z8530drv.rc
+and sets the MODEM and KISS parameters. A sample file is
+delivered with this package. Change it to your needs:
+
+Each channel definition is divided into three sections. An
+example for /dev/sc1:
+
+# DEVICE
+
+device /dev/sc1		# the device for the following params
+
+# MODEM
+
+speed 1200		# the default baudrate
+clock dpll		# clock source: 
+			# 	dpll     = normal halfduplex operation
+			# 	external = MODEM provides own Rx/Tx clock
+			#	divider  = use fullduplex divider if
+			#		   installed (1)
+mode nrzi		# HDLC encoding mode
+			#	nrzi = 1k2 MODEM, G3RUH 9k6 MODEM
+			#	nrz  = DF9IC 9k6 MODEM
+# KISS (Layer 1)
+
+txdelay 36              # (see chapter 1.4)
+persist 64
+slot    8
+tail    8
+fulldup 0
+wait    12
+min     3
+maxkey  7
+idle    3
+maxdef  120
+group   0
+txoff   off
+softdcd on                   
+slip    off
+
+The order WITHIN these sections is unimportant. The order OF these
+sections IS important. The MODEM parameters are set with the first
+recognized KISS paramer...
+
+Please note that you can initialize the board only once after boot. 
+You can change all paramters but "mode" and "clock" later with the
+Sccparam program or through KISS. Just to avoid securety holes... 
+
+(1) this divider is usually mounted on the SCC-PBC (PA0HZP) or not
+    present at all (BayCom). It feeds back the output of the DPLL 
+    (digital pll) as transmit clock. Using this mode without a divider 
+    installed will normally result in keying the transceiver until 
+    maxkey expires --- of course without sending anything (useful).
+
+
+1.3. Attach commands
+====================
+
+When the linux has startup, the SCC driver has been initialized,
+you can attach the channels in your packet software. This is done
+by open the scc devices by using the attach asy command.
+The SCC-drivers emulates the scc devices as serial asy ports,
+this means e.g. that the baudrate can be set in the attach command.
+
+
+Example Wampes:
+
+#############################################################################################
+# Wampes device attach
+# NOTE: Interfacename and the device must be the same!!
+# Usage: attach asy 0 0 slip|vjslip|ax25ui|ax25i|nrs|kissui <label> 0 <mtu> <speed> [ip_addr]
+#
+attach asy 0 0 kissi sc1 256 256 1200    # Attach SCC channel 1 in 1200 baud
+attach asy 0 0 kissi sc2 256 256 1200    # Attach SCC channel 2 in 1200 baud
+attach asy 0 0 kissui sc3 256 256 38400  # Attach SCC channel 3 in 38400 baud
+attach asy 0 0 kissui sc4 256 256 9600   # Attach SCC channel 4 in 9600 baud
+#                ^
+#                 for WAMPES 921229 use here: ax25
+#
+
+Example JNOS:
+
+############################################
+# JNOS device attach
+#
+#attach asy sc1 0 ax25 sc1 256 256 1200
+#attach asy sc2 0 ax25 sc2 256 256 1200
+#attach asy sc3 0 ax25 sc3 256 256 300
+#attach asy sc4 0 ax25 sc4 256 256 4800
+#
+#
+
+
+It allows AX.25 communication without a TNC.  Only a MODEM is
+needed. The parameters have the same meaning as in KISS mode.
+In fact, the AX.25 mode is emulating an extended KISS TNC, so
+the same commands can be used to set the parameters of the
+interface (see below).
+
+To be able to run fullduplex using an SCC in AX.25 mode, an 
+external divider must be available, that divides the baudrate 
+generator clock available on the TRxC pin by 32, and puts the 
+resulting signal on the RTxC pint of the same channel of the SCC.  
+Such a divider is not necessary for normal CSMA packet radio 
+operation, but interrupt overhead is slightly reduced if you 
+still install it.  
+
+
+
+1.4. Displaying SCC Parameters:
+===============================
+
+Once a SCC channel has been attached, the parameter settings and 
+some statistic information can be shown using the param program:
+
+dl1bke-u:~$ sccstat /dev/sc1
+
+Parameters:
+
+speed       : 1200 baud
+txdelay     : 36
+persist     : 255
+slottime    : 0
+txtail      : 8
+fulldup     : 1
+waittime    : 12
+mintime     : 3 sec
+maxkeyup    : 7 sec
+idletime    : 3 sec
+maxdefer    : 120 sec
+group       : 0x00
+txoff       : off
+softdcd     : on
+SLIP        : off
+
+Status:
+
+HDLC                  Z8530           Interrupts         Queues
+-----------------------------------------------------------------------
+Sent       :     273  RxOver :     0  RxInts :   125074  RxQueue :    0
+Received   :    1095  TxUnder:     0  TxInts :     4684  TxQueue :    0
+RxErrors   :    1591                  ExInts :    11776
+KissErrors :       0                  SpInts :     1503  NoSpace :    0
+Tx State   :    idle
+
+Memory allocated:
+
+Total  :    1
+RxAlloc:    0
+TxAlloc:    1
+
+
+The status info shown is:
+
+Sent		- number of frames transmitted
+Received	- number of frames received
+RxErrors	- number of receive errors (CRC, ABORT)
+KissErrors	- number of KISS errors (should be zero...)
+Tx State	- status of the Tx interrupt handler: idle/busy/active/tail (2)
+RxOver		- number of receiver overruns
+TxUnder		- number of transmitter underruns     
+RxInts		- number of receiver interrupts
+TxInts		- number of transmitter interrupts
+EpInts		- number of receiver special condition interrupts
+SpInts		- number of external/status interrupts
+RxQueue		- number of received packets enqueued for this channel
+TxQueue		- number of packets enqueued for Tx
+NoSpace		- number of times the receiver buffer pool was found empty
+
+
+An overrun is abnormal. If lots of these occur, the product of
+baudrate and number of interfaces is too high for the processing
+power of you computer. If "Space" errors occur, specify a higher
+number of buffers in the "scc.h" file.
+
+
+1.5 Setting Parameters
+======================
+
+
+The setting of parameters of the emulated KISS TNC is done in the 
+same way in the SCC driver. You can change parameters by using
+the command param in NET or NOS
+
+     param <iface> <paramname> <value>
+
+or use the program "sccparam":
+
+     sccparam <device> <paramname> <decimal-|hexadecimal value>
+
+You can change the following parameters:
+
+param	    : value
+------------------------
+speed       : 1200
+txdelay     : 36
+persist     : 255
+slottime    : 0
+txtail      : 8
+fulldup     : 1
+waittime    : 12
+mintime     : 3
+maxkeyup    : 7
+idletime    : 3
+maxdefer    : 120
+group       : 0x00
+txoff       : off
+softdcd     : on
+SLIP        : off
+
+
+The parameters have the following meaning:
+
+speed:
+     The baudrate on this channel in bits/sec
+
+     Example: sccparam /dev/sc4 speed 9600
+
+txdelay:
+     The delay (in units of 10ms) after keying of the 
+     transmitter, until the first byte is sent. This is usually 
+     called "TXDELAY" in a TNC.  When 0 is specified, the driver 
+     will just wait until the CTS signal is asserted. This 
+     assumes the presence of a timer or other circuitry in the 
+     MODEM and/or transmitter, that asserts CTS when the 
+     transmitter is ready for data.
+     A normal value of this parameter is 30-36.
+
+     Example: sccparam /dev/sc1 txd 20
+
+persist:
+     This is the probability that the transmitter will be keyed 
+     when the channel is found to be free.  It is a value from 0 
+     to 255, and the probability is (value+1)/256.  The value 
+     should be somewhere near 50-60, and should be lowered when 
+     the channel is used more heavily.
+
+     Example: sccparam /dev/sc3 persist 20
+
+slottime:
+     This is the time between samples of the channel. It is 
+     expressed in units of 10ms.  About 200-300 ms (value 20-30) 
+     seems to be a good value.
+
+     Example: sccparam /dev/sc1 slot 20
+
+tail:
+     The time the transmitter will remain keyed after the last 
+     byte of a packet has been transferred to the SCC. This is 
+     necessary because the CRC and a flag still have to leave the 
+     SCC before the transmitter is keyed down. The value depends 
+     on the baudrate selected.  A few character times should be 
+     sufficient, e.g. 40ms at 1200 baud. (value 4)
+     The value of this parameter is in 10ms units.
+
+     Example: sccparam /dev/sc3 4
+
+full:
+     The full-duplex mode switch. This can be one of the folowing 
+     values:
+
+     0:   The interface will operate in CSMA mode (the normal 
+          half-duplex packet radio operation)
+     1:   Fullduplex mode, i.e. the transmitter will be keyed at 
+          any time, without checking the received carrier.  It 
+          will be unkeyed when there are no packets to be sent.
+     2:   Like 1, but the transmitter will remain keyed, also 
+          when there are no packets to be sent.  Flags will be 
+          sent in that case, until a timeout (parameter 10) 
+          occurs.
+
+     Example: sccparam /dev/sc1 fulldup off
+
+wait:
+     The initial waittime before any transmit attempt, after the 
+     frame has been queue for transmit.  This is the length of 
+     the first slot in CSMA mode.  In fullduplex modes it is
+     set to 0 for maximum performance.
+     The value of this parameter is in 10ms units. 
+
+     Example: sccparam /dev/sc2 wait 4
+
+maxkey:
+     The maximal time the transmitter will be keyed to send 
+     packets, in seconds.  This can be useful on busy CSMA 
+     channels, to avoid "getting a bad reputation" when you are 
+     generating a lot of traffic.  After the specified time has 
+     elapsed, no new frame will be started. Instead, the trans-
+     mitter will be switched off for a specified time (parameter 
+     min), and then the selected algorithm for keyup will be 
+     started again.
+     The value 0 as well as "off" will disable this feature, 
+     and allow infinite transmission time. 
+
+     Example: sccparam /dev/sc1 maxk 20
+
+min:
+     This is the time the transmitter will be switched off when 
+     the maximum transmission time is exceeded.
+
+     Example: sccparam /dev/sc4 min 10
+
+idle
+     This parameter specifies the maximum idle time in fullduplex 
+     2 mode, in seconds.  When no frames have been sent for this 
+     time, the transmitter will be keyed down.  A value of 0 is
+     has same result as the fullduplex mode 1. This parameter
+     can be disabled.
+
+     Example: sccparam /dev/sc3 idle off	# transmit forever
+
+maxdefer
+     This is the maximum time (in seconds) to wait for a free channel
+     to send. When this timer expires the transmitter will be keyed 
+     IMMEDIATLY. If you love to get trouble with other users you
+     should set this to a very low value ;-)
+
+     Example: sccparam /dev/sc1 maxdefer 240	# 2 minutes
+
+
+txoff:
+     When this parameter has the value 0, the transmission of packets
+     is enable. Otherwise it is disabled.
+
+     Example: sccparam /dev/sc3 txoff on
+
+group:
+     It is possible to build special radio equipment to use more than 
+     one frequency on the same bad, e.g. using several receivers and 
+     only one transmitter that can be switched between frequencies.
+     Also, you can connect several radios that are active on the same 
+     band.  In these cases, it is not possible, or not a good idea, to 
+     transmit on more than one frequency.  The SCC driver provides a 
+     method to lock transmitters on different interfaces, using the 
+     "param <interface> group <x>" command.  This will only work when 
+     you are using CSMA mode (parameter full = 0).
+     The number <x> must be 0 if you want no group restrictions, and 
+     can be computed as follows to create restricted groups:
+     <x> is the sum of some OCTAL numbers:
+
+     200  This transmitter will only be keyed when all other 
+          transmitters in the group are off.
+     100  This transmitter will only be keyed when the carrier 
+          detect of all other interfaces in the group is off.
+     0xx  A byte that can be used to define different groups.  
+          Interfaces are in the same group, when the logical AND 
+          between their xx values is nonzero.
+
+     Examples:
+     When 2 interfaces use group 201, their transmitters will never be 
+     keyed at the same time.
+     When 2 interfaces use group 101, the transmitters will only key 
+     when both channels are clear at the same time.  When group 301, 
+     the transmitters will not be keyed at the same time.
+
+     Don't forget to convert the octal numbers into decimal before
+     you set the parameter.
+
+     Example: (to be written)
+
+softdcd:
+     use a software dcd instead of the real one... Useful for a very
+     slow squelch.
+
+     Example: sccparam /dev/sc1 soft on
+
+
+slip:
+     use slip encoding instead of kiss
+
+     Example: sccparam /dev/sc2 slip on
+
+
+
+2. Problems
+===========
+
+We are poking around in somebody else's code, so everything may change
+from one patchlevel to another... If the patches fail, try the
+following:
+
+2.1 /linux/drivers/char/Makefile
+================================
+
+Add "scc.o" to the definition of OBJS and "scc.c" to SRCS
+
+
+2.2 /linux/include/linux/tty_driver.h
+=====================================
+
+add the following DEFINE:
+
+#define TTY_DRIVER_TYPE_SCC 0x0005
+
+
+2.3 /linux/drivers/char/tty_io.c
+================================
+
+in tty_init() add the line
+
+	kmem_start=scc_init(kmem_start);
+
+just before "return kmem_start".
+
+2.4 /linux/arch/i386/config.in
+==============================
+
+somewhere in that file add:
+
+	comment 'Z8530 SCC driver for Amateur Packet Radio'
+	bool 'KISS emulator for Z8530 based HDLC cards' CONFIG_SCC y
+	comment ''
+  
+
+
+2.5 Other problems
+==================
+
+If you have tx-problems with your BayCom USCC card please check
+the manufacturer of the 8530. SGS chips have a slightly
+different timing. Try Zilog... I have no information if this
+driver works with baudrates higher than 1200 baud. A solution is
+to write to register 8 instead to the data port, but this won't
+work with the ESCC chips *SIGH!*
+
+I got reports that the driver has problems on some 386-based systems.
+(i.e. Amstrad) Those systems have a bogus AT bus timing which will
+lead to delayed answers on interrupts. You can recognize these
+problems by looking at the output of Sccstat for the suspected
+port. See if it shows under- and overruns you own such a system.
+Perhaps it will help if you simplify the scc_isr() function a bit.
+You'll find a slightly faster version in the files scc_isr_intack
+or scc_isr_novec.
+
+
+Delayed processing of received data: This depends on
+
+- the kernel version
+
+- kernel profiling compiled or not
+
+- the rather slow receiver in tty_io.c
+
+- a high interrupt load
+
+- a high load of the maching --- running X, Xmorph, XV and Povray,
+  while compiling the kernel... hmm ... even with 32 MB RAM ...  ;-)
+
+- NET's speed itself.
+
+
+Kernel panics (based on excerpts from /linux/README)
+
+
+- if a bug results in a message like
+
+	unable to handle kernel paging request at address C0000010
+	Oops: 0002
+	EIP:   0010:XXXXXXXX
+	eax: xxxxxxxx   ebx: xxxxxxxx   ecx: xxxxxxxx   edx: xxxxxxxx
+	esi: xxxxxxxx   edi: xxxxxxxx   ebp: xxxxxxxx
+	ds: xxxx  es: xxxx  fs: xxxx  gs: xxxx
+	Pid: xx, process nr: xx
+	xx xx xx xx xx xx xx xx xx xx
+
+  or similar kernel debugging information on your screen or in your
+  system log, please duplicate it *exactly*.  The dump may look
+  incomprehensible to you, but it does contain information that may
+  help debugging the problem.  The text above the dump is also
+  important: it tells something about why the kernel dumped code (in
+  the above example it's due to a bad kernel pointer)
+
+- in debugging dumps like the above, please look up what the EIP value 
+  means.  The hex value as such doesn't help me or anybody else very much: 
+  it will depend on your particular kernel setup.  What you should do is 
+  take the hex value from the EIP line (ignore the "0010:"), and look it up 
+  in the kernel namelist to see which kernel function contains the offending 
+  address.
+
+  To find out the kernel function name, you'll need to 
+
+         less /linux/System.map
+
+  This will give you a list of kernel addresses sorted in ascending
+  order, from which it is simple to find the function that contains the
+  offending address.  Note that the address given by the kernel
+  debugging messages will not necessarily match exactly with the
+  function addresses (in fact, that is very unlikely), so you can't
+  just 'grep' the list: the list will, however, give you the starting
+  point of each kernel function, so by looking for the function that
+  has a starting address lower than the one you are searching for but
+  is followed by a function with a higher address you will find the one
+  you want.  In fact, it may be [IS!] a good idea to include a bit of
+  "context" in your problem report, giving a few lines around the
+  interesting one. 
+
+  I included a small program which does this for you. Just call
+
+         grep_eip /linux/System.map address
+
+  for example: grep_eip /linux/System.map 182f98
+
+- alternately, you can use gdb on a running kernel. (read-only; i.e. you
+  cannot change values or set break points.) To do this, first compile the
+  kernel with -g; edit arch/i386/Makefile appropriately, then do a "make
+  clean". You'll also need to enable CONFIG_PROC_FS (via "make config").
+
+  After you've rebooted with the new kernel, do "gdb vmlinux /proc/kcore".
+  You can now use all the usual gdb commands. The command to look up the
+  point where your system crashed is "l *0xXXXXXXXX". (Replace the XXXes
+  with the EIP value.)
+
+  gdb'ing a non-running kernel currently fails because gdb (wrongly)
+  disregards the starting offset for which the kernel is compiled.
+
+
+
+If you can't solve a problem, send me
+
+- a description of the problem,
+- information on your hardware (computer system, scc board, modem)
+- your kernel version
+- the output of sccstat /dev/sc# ("#" is the No. of the channel)
+- the settings of "speed", "clock" and "mode" for that channel
+  in /etc/z8530drv.rc
+- your scc_config.h
+
+
+And always remember: 
+The 1.1.* kernel series is for alpha tests -- use at your own risk ;-)
+The 1.2.* series should run reliable. This driver perhaps NOT!
+The 1.3.* kernel series is for alpha tests again... you get the idea!
+
+------------
+
+Example scc_config.h
+
+#include <linux/scc.h>
+
+/********* CONFIGURATION PARAMATERES; PLEASE CHANGE THIS TO YOUR OWN SITUATION **********/
+
+/* SCC hardware parameters */
+
+/* use the following board types: 
+ *
+ *	PA0HZP		OptoSCC (PA0HZP)
+ *	EAGLE         	EAGLE
+ *	PC100         	PC100 
+ *	PRIMUS        	PRIMUS-PC (DG9BL)
+ *	DRSI          	DRSI PC*Packet
+ *	BAYCOM        	BayCom (U)SCC
+ *	
+ */
+
+int     Nchips	     = 2	; /* number of chips */
+io_port Vector_Latch = 0	; /* addr. of INTACK-Latch (0 for poll mode) */
+int     Ivec	     = 7	; /* interrupt vector */
+long    Clock	     = 4915200	; /* frequency of the scc clock */
+char	Board	     = BAYCOM	; /* what type of SCC card do you use? */
+int	Option	     = 0	; /* command for extra hardware */
+io_port Special_Port = 0	; /* port address for special hardware */
+				  /* (for EAGLE, PC100, PRIMUS, DRSI) */
+
+			/*      ^  never remove the semicolon !! */
+			
+
+
+/* 			Channel    A      B	    Chip	*/
+/*			         ============	  ========	*/
+/* Control ports:						*/
+
+io_port SCC_ctrl[MAXSCC * 2] = 	{0x304, 0x305,  /* ...one... 	*/
+				 0x306, 0x307,  /* ...two...	*/
+				     0,     0,  /* ...three...	*/
+				     0,     0}; /* ...four...	*/
+
+/* Data ports:							*/
+
+io_port SCC_data[MAXSCC * 2] =  {0x300, 0x301,	/* ...one...	*/
+				 0x302, 0x303,	/* ...two...	*/
+				     0,     0,	/* ...three...	*/
+				     0,     0};	/* ...four...	*/
+
+
+/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
+
+/*					      Chip	*/
+/*				            ========   	*/
+int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
+				 0,  	/* ...two...	*/
+				 0,  	/* ...three...	*/
+				 0};	/* ...four...	*/
+
+/* some useful #defines. You might need them or not */
+
+#define VERBOSE_BOOTMSG 1
+#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
+#undef  SCC_LDELAY		/* slow it even a bit more down */
+#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
+
+
+/* The external clocking, nrz and fullduplex divider configuration is gone */
+/* you can set these parameters in /etc/z8530drv.rc and initialize the  */
+/* driver with sccinit */
+
+---------
+
+I still can't test the DRSI board, but this configuration derived from
+the PE1CHL SCC driver configuration should work:
+
+An example of scc_config.h for 
+
+One DRSI board installed:
+=========================
+
+/* gencfg 1 0x300 0x10 2 0 1 0 7 4915200 */
+
+/* file generated by $Id: gencfg.c,v 1.2 1994/11/29 21:42:24 JReuter Exp JReuter $ */
+
+#include <linux/scc.h>
+
+int     Nchips	     = 1;
+io_port Vector_Latch = 0x0;
+int     Ivec	     = 7;
+long    Clock	     = 4915200;
+char	Board	     = PA0HZP;
+int	Option	     = 0;
+io_port Special_Port = 0x0;
+
+io_port SCC_ctrl[MAXSCC * 2] =
+{0x302, 0x300, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+
+io_port SCC_data[MAXSCC * 2] =
+{0x303, 0x301, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+
+/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
+
+/*					      Chip	*/
+/*				            ========   	*/
+int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
+				 0,  	/* ...two...	*/
+				 0,  	/* ...three...	*/
+				 0};	/* ...four...	*/
+
+#define VERBOSE_BOOTMSG 1
+#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
+#undef  SCC_LDELAY		/* slow it even a bit more down */
+#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
+
+
+
+Two boards installed:
+=====================
+
+/* file generated by $Id: gencfg.c,v 1.2 1994/11/29 21:42:24 JReuter Exp JReuter $ */
+
+#include <linux/scc.h>
+
+int     Nchips	     = 2;
+io_port Vector_Latch = 0x0;
+int     Ivec	     = 7;
+long    Clock	     = 4915200;
+char	Board	     = PA0HZP;
+int	Option	     = 0;
+io_port Special_Port = 0x0;
+
+io_port SCC_ctrl[MAXSCC * 2] =
+{0x302, 0x300, 0x312, 0x310, 0x0, 0x0, 0x0, 0x0};
+
+io_port SCC_data[MAXSCC * 2] =
+{0x303, 0x301, 0x313, 0x311, 0x0, 0x0, 0x0, 0x0};
+
+/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
+
+/*					      Chip	*/
+/*				            ========   	*/
+int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
+				 0,  	/* ...two...	*/
+				 0,  	/* ...three...	*/
+				 0};	/* ...four...	*/
+
+#define VERBOSE_BOOTMSG 1
+#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
+#undef  SCC_LDELAY		/* slow it even a bit more down */
+#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
+
+
+
+
+
+*****************
+
+You  m u s t  use "clock dpll" in /etc/z8530drv.rc for operation, 
+the on-board baudrate generator is not supported.
+
+*****************
+(mni tnx to Mike Bilow)
+
+ 
+...an many thanks to Linus Torvalds and Alan Cox for including the driver
+   in the LinuX standard distribution...
+
+Joerg Reuter	ampr-net: dl1bke@db0pra.ampr.org
+		AX-25   : DL1BKE @ DB0ACH.#NRW.DEU.EU
+		Internet: jreuter@lykos.tng.oche.de
diff -u --recursive --new-file v1.3.24/linux/Makefile linux/Makefile
--- v1.3.24/linux/Makefile	Thu Sep  7 17:17:16 1995
+++ linux/Makefile	Thu Sep  7 17:16:43 1995
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 3
-SUBLEVEL = 24
+SUBLEVEL = 25
 
 ARCH = i386
 
diff -u --recursive --new-file v1.3.24/linux/Rules.make linux/Rules.make
--- v1.3.24/linux/Rules.make	Mon Aug 28 14:52:17 1995
+++ linux/Rules.make	Fri Sep  8 16:12:09 1995
@@ -69,7 +69,9 @@
 fastdep: dummy
 	if [ -n "$(wildcard *.[chS])" ]; then \
 	awk -f $(TOPDIR)/scripts/depend.awk *.[chS] > .depend; fi
+ifdef ALL_SUB_DIRS
 	set -e; for i in $(ALL_SUB_DIRS); do $(MAKE) -C $$i fastdep; done
+endif
 
 #
 # A rule to make subdirectories
diff -u --recursive --new-file v1.3.24/linux/arch/alpha/boot/Makefile linux/arch/alpha/boot/Makefile
--- v1.3.24/linux/arch/alpha/boot/Makefile	Sun Sep  3 12:26:48 1995
+++ linux/arch/alpha/boot/Makefile	Fri Sep  8 16:12:09 1995
@@ -32,8 +32,9 @@
 	gzip -fv vmlinux
 
 vmlinux: tools/build $(TOPDIR)/vmlinux
-	cp $(TOPDIR)/vmlinux vmlinux
-	quickstrip vmlinux
+	tools/build -v $(TOPDIR)/vmlinux > vmlinux
+#	cp $(TOPDIR)/vmlinux vmlinux
+#	quickstrip vmlinux
 
 tools/lxboot: tools/build
 	tools/build > tools/lxboot
diff -u --recursive --new-file v1.3.24/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v1.3.24/linux/arch/alpha/config.in	Sun Sep  3 12:26:48 1995
+++ linux/arch/alpha/config.in	Fri Sep  8 16:12:09 1995
@@ -2,13 +2,14 @@
 # For a description of the syntax of this configuration file,
 # see the Configure script.
 #
+
 comment 'General setup'
 
-bool 'Normal floppy disk support' CONFIG_BLK_DEV_FD y
+tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD y
 bool 'Normal (MFM/RLL) disk and IDE disk/cdrom support' CONFIG_ST506 n
 if [ "$CONFIG_ST506" = "y" ]; then
   comment 'Please see drivers/block/README.ide for help/info on IDE drives'
-  bool '   Use old (reliable) disk-only driver for primary i/f' CONFIG_BLK_DEV_HD n
+  bool '   Use old disk-only driver for primary i/f' CONFIG_BLK_DEV_HD n
   if [ "$CONFIG_BLK_DEV_HD" = "y" ]; then
     bool '   Include new IDE driver for secondary i/f support' CONFIG_BLK_DEV_IDE n
   else
@@ -41,10 +42,13 @@
 fi
 
 if [ "$CONFIG_PCI" = "y" ]; then
- bool 'PCI bridge optimisation (experimental)' CONFIG_PCI_OPTIMIZE n
+  bool '   PCI bridge optimisation (experimental)' CONFIG_PCI_OPTIMIZE n
+  if [ "$CONFIG_BLK_DEV_IDE" = "y" ]; then
+    bool '   PCI Triton IDE Bus Master DMA support' CONFIG_BLK_DEV_TRITON y
+  fi
 fi
 bool 'System V IPC' CONFIG_SYSVIPC y
-bool 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF n
+tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF n
 
 comment 'Loadable module support'
 bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS n
@@ -57,17 +61,21 @@
 bool 'IP: multicasting' CONFIG_IP_MULTICAST n
 bool 'IP: firewalling' CONFIG_IP_FIREWALL n
 bool 'IP: accounting' CONFIG_IP_ACCT n
-bool 'IP: tunneling' CONFIG_NET_IPIP n
+tristate 'IP: tunneling' CONFIG_NET_IPIP n
 if [ "$CONFIG_IP_FORWARD" = "y" -a "$CONFIG_IP_FIREWALL" = "y" ]; then
   bool 'IP: firewall packet logging' CONFIG_IP_FIREWALL_VERBOSE y
   bool 'IP: masquerading (ALPHA)' CONFIG_IP_MASQUERADE n
 fi
+if [ "$CONFIG_IP_FORWARD" = "y" -a "$CONFIG_IP_MULTICAST" = "y" -a "$CONFIG_NET_IPIP" = "y" ]; then
+  bool 'IP: multicast routing(in progress)' CONFIG_IP_MROUTE n
+fi
 comment '(it is safe to leave these untouched)'
 bool 'IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP n
-bool 'IP: Reverse ARP' CONFIG_INET_RARP n
+tristate 'IP: Reverse ARP' CONFIG_INET_RARP n
 bool 'IP: Assume subnets are local' CONFIG_INET_SNARL y
 bool 'IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF n
 bool 'IP: Drop source routed frames' CONFIG_IP_NOSR y
+bool 'IP: Allow large windows (not recommended if <16Mb of memory)' CONFIG_SKB_LARGE y
 fi
 bool 'The IPX protocol' CONFIG_IPX n
 bool 'Appletalk DDP' CONFIG_ATALK n
@@ -79,7 +87,7 @@
 
 comment 'SCSI support'
 
-bool 'SCSI support?' CONFIG_SCSI y
+bool 'SCSI support' CONFIG_SCSI y
 
 if [ "$CONFIG_SCSI" = "n" ]; then
 
@@ -89,10 +97,10 @@
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
-bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
-bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR y
-bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
+tristate 'SCSI disk support' CONFIG_BLK_DEV_SD y
+tristate 'SCSI tape support' CONFIG_CHR_DEV_ST n
+tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR y
+tristate 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
@@ -100,28 +108,28 @@
 
 comment 'SCSI low-level drivers'
 
-bool 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X n
-bool 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 n
-bool 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 y
-bool 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX n
-bool 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n
-bool 'EATA-DMA (DPT, NEC, ATT, Olivetti) support' CONFIG_SCSI_EATA_DMA n
-bool 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO n
-bool 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n
-bool 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN n
+tristate 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X n
+tristate 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 n
+tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 y
+tristate 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX n
+tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n
+tristate 'EATA-DMA (DPT, NEC, ATT, Olivetti) support' CONFIG_SCSI_EATA_DMA n
+tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO n
+tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n
+tristate 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN n
 bool 'Generic NCR5380 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 n
 if [ "$CONFIG_PCI" = "y" ]; then
-  bool 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx n
+  tristate 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx n
 fi
-bool 'Always IN2000 SCSI support (test release)' CONFIG_SCSI_IN2000 n
+tristate 'Always IN2000 SCSI support (test release)' CONFIG_SCSI_IN2000 n
 bool 'PAS16 SCSI support' CONFIG_SCSI_PAS16 n
-bool 'QLOGIC SCSI support' CONFIG_SCSI_QLOGIC n
-bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE n
+tristate 'QLOGIC SCSI support' CONFIG_SCSI_QLOGIC n
+tristate 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE n
 bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n
-bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n
-bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n
-#bool 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n
-#bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n
+tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n
+tristate '7000FASST SCSI support' CONFIG_SCSI_7000FASST n
+tristate 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n
+#tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n
 fi
 
 
@@ -129,73 +137,77 @@
 
 comment 'Network device support'
 
-bool 'Network device support?' CONFIG_NETDEVICES y
+bool 'Network device support' CONFIG_NETDEVICES y
 if [ "$CONFIG_NETDEVICES" = "n" ]; then
 
 comment 'Skipping network driver configuration options...'
 
 else
-bool 'Dummy net driver support' CONFIG_DUMMY n
-bool 'SLIP (serial line) support' CONFIG_SLIP n
-if [ "$CONFIG_SLIP" = "y" ]; then
+tristate 'Dummy net driver support' CONFIG_DUMMY n
+tristate 'SLIP (serial line) support' CONFIG_SLIP n
+if [ "$CONFIG_SLIP" != "n" ]; then
   bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED y
 fi
-bool 'PPP (point-to-point) support' CONFIG_PPP n
-if [ "$CONFIG_PPP" = "y" ]; then
+tristate 'PPP (point-to-point) support' CONFIG_PPP n
+if [ "$CONFIG_PPP" != "n" ]; then
   bool ' 16 channels instead of 4' CONFIG_PPP_LOTS n
 fi
 if [ "$CONFIG_AX25" = "y" ]; then
 	bool 'Z8530 SCC kiss emulation driver for AX.25' CONFIG_SCC y
+else
+	bool 'Z8530 SCC kiss emulation driver for AX.25' CONFIG_SCC n
 fi
-bool 'PLIP (parallel port) support' CONFIG_PLIP n
-bool 'EQL (serial line load balancing) support' CONFIG_EQUALIZER n
+tristate 'PLIP (parallel port) support' CONFIG_PLIP n
+tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER n
 bool 'Do you want to be offered ALPHA test drivers' CONFIG_NET_ALPHA n
 bool 'Western Digital/SMC cards' CONFIG_NET_VENDOR_SMC n
 if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then
-	bool 'WD80*3 support' CONFIG_WD80x3 n
-	bool 'SMC Ultra support' CONFIG_ULTRA n
+	tristate 'WD80*3 support' CONFIG_WD80x3 n
+	tristate 'SMC Ultra support' CONFIG_ULTRA n
 fi
 bool 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE n
 bool '3COM cards' CONFIG_NET_VENDOR_3COM n
 if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then
-	bool '3c501 support' CONFIG_EL1 n
-	bool '3c503 support' CONFIG_EL2 n
+	tristate '3c501 support' CONFIG_EL1 n
+	tristate '3c503 support' CONFIG_EL2 n
 	if [ "$CONFIG_NET_ALPHA" = "y" ]; then
-		bool '3c505 support' CONFIG_ELPLUS n
-		bool '3c507 support' CONFIG_EL16 n
+		tristate '3c505 support' CONFIG_ELPLUS n
+		tristate '3c507 support' CONFIG_EL16 n
 	fi
-	bool '3c509/3c579 support' CONFIG_EL3 y
+	tristate '3c509/3c579 support' CONFIG_EL3 y
 fi
 bool 'Other ISA cards' CONFIG_NET_ISA y
 if [ "$CONFIG_NET_ISA" = "y" ]; then
-	bool 'Arcnet support' CONFIG_ARCNET n
-	bool 'Cabletron E21xx support' CONFIG_E2100 n
-	bool 'DEPCA support' CONFIG_DEPCA y
-	bool 'EtherWorks 3 support' CONFIG_EWRK3 n
+	tristate 'Arcnet support' CONFIG_ARCNET n
+	tristate 'Cabletron E21xx support' CONFIG_E2100 n
+	tristate 'DEPCA support' CONFIG_DEPCA y
+	tristate 'EtherWorks 3 support' CONFIG_EWRK3 n
 	if [ "$CONFIG_NET_ALPHA" = "y" ]; then
-		bool 'AT1700 support' CONFIG_AT1700 n
-#		bool 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n
-		bool 'EtherExpress support' CONFIG_EEXPRESS n
+		bool 'SEEQ8005 support' CONFIG_SEEQ8005 n
+		tristate 'AT1700 support' CONFIG_AT1700 n
+		tristate 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n
+		tristate 'EtherExpress support' CONFIG_EEXPRESS n
 		bool 'NI5210 support' CONFIG_NI52 n
 		bool 'NI6510 support' CONFIG_NI65 n
-		bool 'WaveLAN support' CONFIG_WAVELAN n
-	fi
-	bool 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n
-	bool 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n
-	bool 'NE2000/NE1000 support' CONFIG_NE2000 n
-	if [ "$CONFIG_AX25" = "y" ]; then
-		bool 'Ottawa PI and PI/2 support' CONFIG_PI y
+		if [ "$CONFIG_AX25" = "y" ]; then
+			bool 'Ottawa PI and PI/2 support' CONFIG_PI y
+		fi
+		tristate 'WaveLAN support' CONFIG_WAVELAN n
 	fi
+	tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n
+	tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n
+	tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100 n
+	tristate 'NE2000/NE1000 support' CONFIG_NE2000 n
 	bool 'SK_G16 support' CONFIG_SK_G16 n
 fi
 bool 'EISA, VLB, PCI and on board controllers' CONFIG_NET_EISA n
 if [ "$CONFIG_NET_EISA" = "y" ]; then
 	if [ "$CONFIG_NET_ALPHA" = "y" ]; then
-		bool 'Ansel Communications EISA 3200 support' CONFIG_AC3200 n
+		tristate 'Ansel Communications EISA 3200 support' CONFIG_AC3200 n
 	fi
-	bool 'Apricot Xen-II on board ethernet' CONFIG_APRICOT n
-	bool 'DE425, DE434, DE435 support' CONFIG_DE4X5 n
-#	bool 'DEC 21040 PCI support' CONFIG_DEC_ELCP n
+	tristate 'Apricot Xen-II on board ethernet' CONFIG_APRICOT n
+	tristate 'DE425, DE434, DE435, DE500 support' CONFIG_DE4X5 n
+#	tristate 'DEC 21040 PCI support' CONFIG_DEC_ELCP n
 #	bool 'LPL T100V 100Mbs support' CONFIG_LPL_T100 n
 #	bool 'PCnet32 (32 bit VLB and PCI LANCE) support' CONFIG_PCNET32 n
 	bool 'Zenith Z-Note support' CONFIG_ZNET y
@@ -203,66 +215,71 @@
 bool 'Pocket and portable adaptors' CONFIG_NET_POCKET n
 if [ "$CONFIG_NET_POCKET" = "y" ]; then
 	bool 'AT-LAN-TEC/RealTek pocket adaptor support' CONFIG_ATP n
-	bool 'D-Link DE600 pocket adaptor support' CONFIG_DE600 n
-	bool 'D-Link DE620 pocket adaptor support' CONFIG_DE620 n
+	tristate 'D-Link DE600 pocket adaptor support' CONFIG_DE600 n
+	tristate 'D-Link DE620 pocket adaptor support' CONFIG_DE620 n
 #	bool 'Silicom pocket adaptor support' CONFIG_SILICOM_PEA n
 #	bool 'WaveLAN PCMCIA support' CONFIG_WaveLAN n
 #	bool '3 Com 3c589 PCMCIA support' CONFIG_3C589 n
 fi
 bool 'Token Ring driver support' CONFIG_TR n
 if [ "$CONFIG_TR" = "y" ]; then
-	bool 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR y
+	tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR y
 fi
 fi
 fi
 
 comment 'CD-ROM drivers (not for SCSI or IDE/ATAPI drives)'
 
-bool 'Sony CDU31A/CDU33A CDROM driver support' CONFIG_CDU31A n
-bool 'Mitsumi (not IDE/ATAPI) CDROM driver support' CONFIG_MCD n
-bool 'Matsushita/Panasonic CDROM driver support' CONFIG_SBPCD n
-if [ "$CONFIG_SBPCD" = "y" ]; then
-  bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n
-  if [ "$CONFIG_SBPCD2" = "y" ]; then
-    bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n
-    if [ "$CONFIG_SBPCD3" = "y" ]; then
-      bool 'Matsushita/Panasonic fourth CDROM controller support' CONFIG_SBPCD4 n
+bool 'Support non-SCSI/IDE/ATAPI drives' CONFIG_CD_NO_IDESCSI n
+if [ "$CONFIG_CD_NO_IDESCSI" = "y" ]; then
+  tristate 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A n
+  tristate 'Standard Mitsumi [no XA/Multisession] CDROM support' CONFIG_MCD n
+  tristate 'Experimental Mitsumi [XA/MultiSession] support' CONFIG_MCDX n
+  tristate 'Matsushita/Panasonic CDROM support' CONFIG_SBPCD n
+  if [ "$CONFIG_SBPCD" = "y" ]; then
+    bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n
+    if [ "$CONFIG_SBPCD2" = "y" ]; then
+      bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n
+      if [ "$CONFIG_SBPCD3" = "y" ]; then
+        bool 'Matsushita/Panasonic fourth CDROM controller support' CONFIG_SBPCD4 n
+      fi
     fi
   fi
+  tristate 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n
+  tristate 'Sony CDU535 CDROM support' CONFIG_CDU535 n
+  tristate 'Goldstar R420 CDROM support' CONFIG_GSCD n
+  tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n
+  tristate 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n
+  bool 'Experimental Sanyo H94A CDROM support' CONFIG_SJCD n
 fi
-bool 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n
-bool 'Sony CDU535 CDROM driver support' CONFIG_CDU535 n
 
 comment 'Filesystems'
 
-bool 'Standard (minix) fs support' CONFIG_MINIX_FS y
+tristate 'Standard (minix) fs support' CONFIG_MINIX_FS y
 bool 'Extended fs support' CONFIG_EXT_FS n
 bool 'Second extended fs support' CONFIG_EXT2_FS y
-bool 'xiafs filesystem support' CONFIG_XIA_FS n
-bool 'msdos fs support' CONFIG_MSDOS_FS y
-if [ "$CONFIG_MSDOS_FS" = "y" ]; then
-bool 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n
+tristate 'xiafs filesystem support' CONFIG_XIA_FS n
+tristate 'msdos fs support' CONFIG_MSDOS_FS y
+if [ "$CONFIG_MSDOS_FS" != "n" ]; then
+  tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n
 fi
 bool '/proc filesystem support' CONFIG_PROC_FS y
 if [ "$CONFIG_INET" = "y" ]; then
-bool 'NFS filesystem support' CONFIG_NFS_FS y
-fi
-if [ "$CONFIG_BLK_DEV_SR" = "y" -o "$CONFIG_CDU31A" = "y" -o "$CONFIG_MCD" = "y" -o "$CONFIG_SBPCD" = "y" -o "$CONFIG_BLK_DEV_IDECD" = "y" -o "$CONFIG_AZTCD" = "y" -o "$CONFIG_CDU535" = "y" ]; then
-	bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS y
-else
-	bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS n
+  tristate 'NFS filesystem support' CONFIG_NFS_FS y
 fi
-bool 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS n
-bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
+tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS y
+tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS n
+tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
+tristate 'SMB filesystem (to mount WfW shares etc..) support' CONFIG_SMB_FS n
 
 comment 'character devices'
 
 bool 'Cyclades async mux support' CONFIG_CYCLADES n
-bool 'Parallel printer support' CONFIG_PRINTER n
+tristate 'Parallel printer support' CONFIG_PRINTER n
 bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
 bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE y
 if [ "$CONFIG_PSMOUSE" = "y" ]; then
-bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y
+  bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y
 fi
 bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n
 bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n
@@ -270,7 +287,7 @@
 
 bool 'QIC-02 tape support' CONFIG_QIC02_TAPE n
 if [ "$CONFIG_QIC02_TAPE" = "y" ]; then
-bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF y
+  bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF y
 if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then
 
 comment '>>> Edit configuration parameters in ./include/linux/tpqic02.h!'
@@ -285,7 +302,7 @@
 
 bool 'QIC-117 tape support' CONFIG_FTAPE n
 if [ "$CONFIG_FTAPE" = "y" ]; then
-int ' number of ftape buffers' NR_FTAPE_BUFFERS 3
+  int ' number of ftape buffers' NR_FTAPE_BUFFERS 3
 fi
 
 comment 'Sound'
diff -u --recursive --new-file v1.3.24/linux/arch/i386/config.in linux/arch/i386/config.in
--- v1.3.24/linux/arch/i386/config.in	Thu Sep  7 17:17:16 1995
+++ linux/arch/i386/config.in	Fri Sep  8 16:12:09 1995
@@ -187,7 +187,7 @@
 	fi
 	tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n
 	tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n
-	tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100 y
+	tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100 n
 	tristate 'NE2000/NE1000 support' CONFIG_NE2000 y
 	bool 'SK_G16 support' CONFIG_SK_G16 n
 fi
@@ -221,25 +221,28 @@
 
 comment 'CD-ROM drivers (not for SCSI or IDE/ATAPI drives)'
 
-tristate 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A n
-tristate 'Standard Mitsumi [no XA/Multisession] CDROM support' CONFIG_MCD n
-tristate 'Experimental Mitsumi [XA/MultiSession] support' CONFIG_MCDX n
-tristate 'Matsushita/Panasonic CDROM support' CONFIG_SBPCD n
-if [ "$CONFIG_SBPCD" != "n" ]; then
-  bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n
-  if [ "$CONFIG_SBPCD2" = "y" ]; then
-    bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n
-    if [ "$CONFIG_SBPCD3" = "y" ]; then
-      bool 'Matsushita/Panasonic fourth CDROM controller support' CONFIG_SBPCD4 n
+bool 'Support non-SCSI/IDE/ATAPI drives' CONFIG_CD_NO_IDESCSI n
+if [ "$CONFIG_CD_NO_IDESCSI" = "y" ]; then
+  tristate 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A n
+  tristate 'Standard Mitsumi [no XA/Multisession] CDROM support' CONFIG_MCD n
+  tristate 'Experimental Mitsumi [XA/MultiSession] support' CONFIG_MCDX n
+  tristate 'Matsushita/Panasonic CDROM support' CONFIG_SBPCD n
+  if [ "$CONFIG_SBPCD" = "y" ]; then
+    bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n
+    if [ "$CONFIG_SBPCD2" = "y" ]; then
+      bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n
+      if [ "$CONFIG_SBPCD3" = "y" ]; then
+        bool 'Matsushita/Panasonic fourth CDROM controller support' CONFIG_SBPCD4 n
+      fi
     fi
   fi
+  tristate 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n
+  tristate 'Sony CDU535 CDROM support' CONFIG_CDU535 n
+  tristate 'Goldstar R420 CDROM support' CONFIG_GSCD n
+  tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n
+  tristate 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n
+  bool 'Experimental Sanyo H94A CDROM support' CONFIG_SJCD n
 fi
-tristate 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n
-tristate 'Sony CDU535 CDROM support' CONFIG_CDU535 n
-tristate 'Goldstar R420 CDROM support' CONFIG_GSCD n
-tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n
-tristate 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n
-bool 'Experimental Sanyo H94A CDROM support' CONFIG_SJCD n
 
 comment 'Filesystems'
 
diff -u --recursive --new-file v1.3.24/linux/arch/i386/kernel/bios32.c linux/arch/i386/kernel/bios32.c
--- v1.3.24/linux/arch/i386/kernel/bios32.c	Wed Aug  2 13:20:58 1995
+++ linux/arch/i386/kernel/bios32.c	Thu Sep  7 17:11:48 1995
@@ -452,6 +452,3 @@
 #endif
 	return memory_start;
 }
-
-
-
diff -u --recursive --new-file v1.3.24/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
--- v1.3.24/linux/arch/i386/kernel/process.c	Sun Sep  3 12:26:49 1995
+++ linux/arch/i386/kernel/process.c	Fri Sep  8 11:23:46 1995
@@ -232,16 +232,12 @@
 	dump->u_tsize = ((unsigned long) current->mm->end_code) >> 12;
 	dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> 12;
 	dump->u_dsize -= dump->u_tsize;
-	if (verify_area(VERIFY_READ, (void *) dump->u_tsize, dump->u_dsize) < 0)
-		dump->u_dsize = 0;
 	dump->u_ssize = 0;
 	for (i = 0; i < 8; i++)
 		dump->u_debugreg[i] = current->debugreg[i];  
 
 	if (dump->start_stack < TASK_SIZE) {
 		dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> 12;
-		if (verify_area(VERIFY_READ, (void *) dump->start_stack, dump->u_ssize) < 0)
-			dump->u_ssize = 0;
 	}
 
 	dump->regs = *regs;
diff -u --recursive --new-file v1.3.24/linux/arch/i386/kernel/ptrace.c linux/arch/i386/kernel/ptrace.c
--- v1.3.24/linux/arch/i386/kernel/ptrace.c	Thu Sep  7 17:17:16 1995
+++ linux/arch/i386/kernel/ptrace.c	Thu Sep  7 17:54:27 1995
@@ -480,6 +480,8 @@
 		case PTRACE_KILL: {
 			long tmp;
 
+			if (child->state == TASK_ZOMBIE)	/* already dead */
+				return 0;
 			wake_up_process(child);
 			child->exit_code = SIGKILL;
 	/* make sure the single step bit is not set. */
diff -u --recursive --new-file v1.3.24/linux/drivers/block/sonycd535.c linux/drivers/block/sonycd535.c
--- v1.3.24/linux/drivers/block/sonycd535.c	Fri Jul  7 08:54:46 1995
+++ linux/drivers/block/sonycd535.c	Thu Sep  7 17:11:48 1995
@@ -1659,12 +1659,32 @@
 #else /* MODULE */
 				sony_toc = (struct s535_sony_toc *)
 					kmalloc(sizeof *sony_toc, GFP_KERNEL);
+				if (sony_toc == NULL)
+					return -ENOMEM;
 				last_sony_subcode = (struct s535_sony_subcode *)
 					kmalloc(sizeof *last_sony_subcode, GFP_KERNEL);
+				if (last_sony_subcode == NULL) {
+					kfree(sony_toc);
+					return -ENOMEM;
+				}
 				sony_buffer = (Byte **)
 					kmalloc(4 * sony_buffer_sectors, GFP_KERNEL);
-				for (i = 0; i < sony_buffer_sectors; i++)
+				if (sony_buffer == NULL) {
+					kfree(sony_toc);
+					kfree(last_sony_subcode);
+					return -ENOMEM;
+				}
+				for (i = 0; i < sony_buffer_sectors; i++) {
 					sony_buffer[i] = (Byte *)kmalloc(2048, GFP_KERNEL);
+					if (sony_buffer[i] == NULL) {
+						while (--i>=0)
+							kfree(sony_buffer[i]);
+						kfree(sony_buffer);
+						kfree(sony_toc);
+						kfree(last_sony_subcode);
+						return -ENOMEM;
+					}
+				}
 #endif /* MODULE */
 				initialized = 1;
 			}
diff -u --recursive --new-file v1.3.24/linux/drivers/char/README.scc linux/drivers/char/README.scc
--- v1.3.24/linux/drivers/char/README.scc	Sun Sep  3 12:26:52 1995
+++ linux/drivers/char/README.scc	Fri Sep  8 08:02:05 1995
@@ -1,950 +1,41 @@
 // 950824: note -- I will upload the new version 1.9 to ftp.ucsd.edu
 //         as soon as possible... 
 //
-// ****** The driver has it's own MAJOR number (22) now! ******
+// ******
+// ****** The driver has a  n e w  MAJOR number (34) now! ******
+// ******
 //
 // please remake /dev/sc*:
 //
-// mknod /dev/sc1 c 22 0
-// mknod /dev/sc2 c 22 1
-// mknod /dev/sc3 c 22 2
-// mknod /dev/sc4 c 22 3
+// mknod /dev/sc1 c 34 0
+// mknod /dev/sc2 c 34 1
+// mknod /dev/sc3 c 34 2
+// mknod /dev/sc4 c 34 3
 //
 // (and so on...)
 //
 // -dl1bke-
 
-This is a subset of the documentation. To use this driver you MUST have the
-full package from:
 
-Internet:
-=========
+You will find subset of the documentation in
 
-ftp.ucsd.edu:/hamradio/packet/tcpip/incoming/z8530drv-1.9.dl1bke.tar.gz
+                 linux/Documentation/networking/z8530drv.txt
+
+
+To use this driver you MUST have the full package from
+
+ftp.ucsd.edu:/hamradio/packet/tcpip/incoming/z8530drv-1.9a.dl1bke.tar.gz
 
 [
   if you can't find it there, try:
-  .../tcpip/linux/z8530drv-1.9.dl1bke.tar.gz
+  .../tcpip/linux/z8530drv-1.9a.dl1bke.tar.gz
 
 ]
 
 and various mirrors (i.e. nic.switch.ch)
 
-AX.25 BBS
-=========
-
-UNIX @ DB0ACH.#NRW.DEU.EU, subject: Z8530D19.Pxx/Pyy
-
-(AX.25 call: DB0ACH-8)
-
-and various BBS that received the file through AUTO7P or 7PSERV
-with the filename Z8530D19.TGZ
-
-
----------------------------------------------------------------------------
-
-
-	 SCC.C - Linux driver for Z8530 based HDLC cards for AX.25      
-
-   ********************************************************************
-
-        (c) 1994 by Joerg Reuter DL1BKE
-
-        portions (c) 1994 Hans Alblas PE1AYX
-        and      (c) 1993 Guido ten Dolle PE1NNZ
-
-        for the complete copyright notice see >> Copying.Z8530DRV <<
-
-   ******************************************************************** 
-
-
-0. Installation of the package
-==============================
-
-Run SCC-Install. If one (or more) of the patches fails PLEASE consult 
-chapter 2 (and READ IT of course!)
-
-
-
-1. Initialization and attachment of the channels
-================================================
-
-To use the driver, 3 steps must be performed:
-
-     1. Global initialization of the driver in the kernel
-     2. Setup of parameters with sccinit
-     2. Attachment of each channel in the packet software
-
-The global initialization is needed to reset all SCCs and to 
-install a common interrupt handler.  Also, the hardware addresses 
-of the chips are defined in this step.  In the second step, each 
-channel is set up for the intended use.
-
-
-
-1.1. Initialization
-===================
-
-Initialization of the hardware is performed by setting the defines and
-variables in the file "/linux/drivers/char/scc_config.h". You can change 
-a number of parameters.
-
-
-
-################################################################################################
-# For OptoSCC card e.g:
-#
-
-int     Nchips       = 2        ; /* number of chips */
-io_port Vector_Latch = 0x168    ; /* addr. of INTACK-Latch (0 for poll mode)
-*/
-int     Ivec         = 9        ; /* interrupt vector */
-long    Clock        = 4915200  ; /* frequency of the scc clock */
-char    Pclk         = 1        ; /* use PCLK (1) or RTxC (0) */
-char    Board        = PA0HZP   ; /* what type of SCC card do you use? */
-int     Option       = 0        ; /* command for extra hardware */
-io_port Special_Port = 0        ; /* port address for special hardware */
-                                  /* (for EAGLE, PC100, PRIMUS, DRSI) */
-
-                        /*      ^  never remove the semicolon !! */
-
-
-/*                      Channel    A      B         Chip        */
-/*                               ============     ========      */
-/* Control ports:                                               */
-
-io_port SCC_ctrl[MAXSCC * 2] =  {0x152, 0x150,  /* ...one...    */
-                                 0x156, 0x154,  /* ...two...    */
-                                     0,     0,  /* ...three...  */
-                                     0,     0}; /* ...four...   */
-			
-
-/* Data ports:							*/
-
-io_port SCC_data[MAXSCC * 2] =  {0x153, 0x151,	/* ...one...	*/
-				 0x157, 0x155,	/* ...two...	*/
-				     0,     0,	/* ...three...	*/
-				     0,     0};	/* ...four...	*/
-
-
-/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
-
-/*					      Chip	*/
-/*				            ========   	*/
-int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
-				 0,  	/* ...two...	*/
-				 0,  	/* ...three...	*/
-				 0};	/* ...four...	*/
-
-/* some useful #defines. You might need them or not */
-
-#define VERBOSE_BOOTMSG 1
-#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
-#undef  SCC_LDELAY		/* slow it even a bit more down */
-#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
-
-
-/*********** END OF CONFIGURATION PARAMETERS ********************************************/
-
-
-
-
-################################################################################################
-# For Baycom (U)SCC card e.g:
-#
-
-int     Nchips	     = 2	; /* number of chips */
-io_port Vector_Latch = 0	; /* addr. of INTACK-Latch (0 for poll mode) */
-int     Ivec	     = 7	; /* interrupt vector */
-long    Clock	     = 4915200	; /* frequency of the scc clock */
-char	Board	     = BAYCOM	; /* what type of SCC card do you use? */
-int	Option	     = 0	; /* command for extra hardware */
-io_port Special_Port = 0	; /* port address for special hardware */
-				  /* (for EAGLE, PC100, PRIMUS, DRSI) */
-
-			/*      ^  never remove the semicolon !! */
-			
-
-
-/* 			Channel    A      B	    Chip	*/
-/*			         ============	  ========	*/
-/* Control ports:						*/
-
-io_port SCC_ctrl[MAXSCC * 2] = 	{0x304, 0x305,  /* ...one... 	*/
-				 0x306, 0x307,  /* ...two...	*/
-				     0,     0,  /* ...three...	*/
-				     0,     0}; /* ...four...	*/
-
-/* Data ports:							*/
-
-io_port SCC_data[MAXSCC * 2] =  {0x300, 0x301,	/* ...one...	*/
-				 0x302, 0x303,	/* ...two...	*/
-				     0,     0,	/* ...three...	*/
-				     0,     0};	/* ...four...	*/
-
-
-/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
-
-/*					      Chip	*/
-/*				            ========   	*/
-int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
-				 0,  	/* ...two...	*/
-				 0,  	/* ...three...	*/
-				 0};	/* ...four...	*/
-
-/* some useful #defines. You might need them or not */
-
-#define VERBOSE_BOOTMSG 1
-#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
-#undef  SCC_LDELAY		/* slow it even a bit more down */
-#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
-
-After you changed a parameter you have to recompile a new kernel image file.
-
-The channel number ranges from 0 to (2 * Nchips) - 1,
-where Nchips is the number of chips.
-
-The crystal clock is specified as 4.9152 MHz.  Other frequencies 
-can be used, and this parameter should be adjusted accordingly.
-
-
-You can define your scc type with Board
-
-   SCC type                 value
-   ---------------------------------
-   PA0HZP SCC card          PA0HZP
-   EAGLE card               EAGLE
-   PC100 card               PC100
-   PRIMUS-PC (DG9BL) card   PRIMUS
-   BayCom (U)SCC card       BAYCOM
-
-
-NOTE:
-=====
-
-If you only know the parameters for the PE1CHL driver for DOS,
-run gencfg. It will generate the correct port addresses (I hope).
-Its parameters are exactly the same as the ones you use with
-the "attach scc" command in net, except that the string "init" must 
-not appear. Example:
-
-gencfg 2 0x150 4 2 0 1 0x168 9 4915200 
-
-will print a short form of scc_config.h for the OptoSCC to stdout. 
-("short" <=> few comments).
-
-gencfg 2 0x300 2 4 5 -4 0 7 4915200 0x10
-
-does the same for the BayCom USCC card. I my opinion it is much easier
-to edit scc_config.h... 
-
-
-1.2 initializing the driver on bootup
-=====================================
-
-
-To setup a number parameters you must run /sbin/sccinit from one
-of your rc.*-files. This has to be done BEFORE the start of
-NET or the ax25attach. Sccinit reads the file /etc/z8530drv.rc
-and sets the MODEM and KISS parameters. A sample file is
-delivered with this package. Change it to your needs:
-
-Each channel definition is divided into three sections. An
-example for /dev/sc1:
-
-# DEVICE
-
-device /dev/sc1		# the device for the following params
-
-# MODEM
-
-speed 1200		# the default baudrate
-clock dpll		# clock source: 
-			# 	dpll     = normal halfduplex operation
-			# 	external = MODEM provides own Rx/Tx clock
-			#	divider  = use fullduplex divider if
-			#		   installed (1)
-mode nrzi		# HDLC encoding mode
-			#	nrzi = 1k2 MODEM, G3RUH 9k6 MODEM
-			#	nrz  = DF9IC 9k6 MODEM
-# KISS (Layer 1)
-
-txdelay 36              # (see chapter 1.4)
-persist 64
-slot    8
-tail    8
-fulldup 0
-wait    12
-min     3
-maxkey  7
-idle    3
-maxdef  120
-group   0
-txoff   off
-softdcd on                   
-slip    off
-
-The order WITHIN these sections is unimportant. The order OF these
-sections IS important. The MODEM parameters are set with the first
-recognized KISS paramer...
-
-Please note that you can initialize the board only once after boot. 
-You can change all paramters but "mode" and "clock" later with the
-Sccparam program or through KISS. Just to avoid securety holes... 
-
-(1) this divider is usually mounted on the SCC-PBC (PA0HZP) or not
-    present at all (BayCom). It feeds back the output of the DPLL 
-    (digital pll) as transmit clock. Using this mode without a divider 
-    installed will normally result in keying the transceiver until 
-    maxkey expires --- of course without sending anything (useful).
-
-
-1.3. Attach commands
-====================
-
-When the linux has startup, the SCC driver has been initialized,
-you can attach the channels in your packet software. This is done
-by open the scc devices by using the attach asy command.
-The SCC-drivers emulates the scc devices as serial asy ports,
-this means e.g. that the baudrate can be set in the attach command.
-
-
-Example Wampes:
-
-#############################################################################################
-# Wampes device attach
-# NOTE: Interfacename and the device must be the same!!
-# Usage: attach asy 0 0 slip|vjslip|ax25ui|ax25i|nrs|kissui <label> 0 <mtu> <speed> [ip_addr]
-#
-attach asy 0 0 kissi sc1 256 256 1200    # Attach SCC channel 1 in 1200 baud
-attach asy 0 0 kissi sc2 256 256 1200    # Attach SCC channel 2 in 1200 baud
-attach asy 0 0 kissui sc3 256 256 38400  # Attach SCC channel 3 in 38400 baud
-attach asy 0 0 kissui sc4 256 256 9600   # Attach SCC channel 4 in 9600 baud
-#                ^
-#                 for WAMPES 921229 use here: ax25
-#
-
-Example JNOS:
-
-############################################
-# JNOS device attach
-#
-#attach asy sc1 0 ax25 sc1 256 256 1200
-#attach asy sc2 0 ax25 sc2 256 256 1200
-#attach asy sc3 0 ax25 sc3 256 256 300
-#attach asy sc4 0 ax25 sc4 256 256 4800
-#
-#
-
-
-It allows AX.25 communication without a TNC.  Only a MODEM is
-needed. The parameters have the same meaning as in KISS mode.
-In fact, the AX.25 mode is emulating an extended KISS TNC, so
-the same commands can be used to set the parameters of the
-interface (see below).
-
-To be able to run fullduplex using an SCC in AX.25 mode, an 
-external divider must be available, that divides the baudrate 
-generator clock available on the TRxC pin by 32, and puts the 
-resulting signal on the RTxC pint of the same channel of the SCC.  
-Such a divider is not necessary for normal CSMA packet radio 
-operation, but interrupt overhead is slightly reduced if you 
-still install it.  
-
-
-
-1.4. Displaying SCC Parameters:
-===============================
-
-Once a SCC channel has been attached, the parameter settings and 
-some statistic information can be shown using the param program:
-
-dl1bke-u:~$ sccstat /dev/sc1
-
-Parameters:
-
-speed       : 1200 baud
-txdelay     : 36
-persist     : 255
-slottime    : 0
-txtail      : 8
-fulldup     : 1
-waittime    : 12
-mintime     : 3 sec
-maxkeyup    : 7 sec
-idletime    : 3 sec
-maxdefer    : 120 sec
-group       : 0x00
-txoff       : off
-softdcd     : on
-SLIP        : off
-
-Status:
-
-HDLC                  Z8530           Interrupts         Queues
------------------------------------------------------------------------
-Sent       :     273  RxOver :     0  RxInts :   125074  RxQueue :    0
-Received   :    1095  TxUnder:     0  TxInts :     4684  TxQueue :    0
-RxErrors   :    1591                  ExInts :    11776
-KissErrors :       0                  SpInts :     1503  NoSpace :    0
-Tx State   :    idle
-
-Memory allocated:
-
-Total  :    1
-RxAlloc:    0
-TxAlloc:    1
-
-
-The status info shown is:
-
-Sent		- number of frames transmitted
-Received	- number of frames received
-RxErrors	- number of receive errors (CRC, ABORT)
-KissErrors	- number of KISS errors (should be zero...)
-Tx State	- status of the Tx interrupt handler: idle/busy/active/tail (2)
-RxOver		- number of receiver overruns
-TxUnder		- number of transmitter underruns     
-RxInts		- number of receiver interrupts
-TxInts		- number of transmitter interrupts
-EpInts		- number of receiver special condition interrupts
-SpInts		- number of external/status interrupts
-RxQueue		- number of received packets enqueued for this channel
-TxQueue		- number of packets enqueued for Tx
-NoSpace		- number of times the receiver buffer pool was found empty
-
-
-An overrun is abnormal. If lots of these occur, the product of
-baudrate and number of interfaces is too high for the processing
-power of you computer. If "Space" errors occur, specify a higher
-number of buffers in the "scc.h" file.
-
-
-1.5 Setting Parameters
-======================
-
-
-The setting of parameters of the emulated KISS TNC is done in the 
-same way in the SCC driver. You can change parameters by using
-the command param in NET or NOS
-
-     param <iface> <paramname> <value>
-
-or use the program "sccparam":
-
-     sccparam <device> <paramname> <decimal-|hexadecimal value>
-
-You can change the following parameters:
-
-param	    : value
-------------------------
-speed       : 1200
-txdelay     : 36
-persist     : 255
-slottime    : 0
-txtail      : 8
-fulldup     : 1
-waittime    : 12
-mintime     : 3
-maxkeyup    : 7
-idletime    : 3
-maxdefer    : 120
-group       : 0x00
-txoff       : off
-softdcd     : on
-SLIP        : off
-
-
-The parameters have the following meaning:
-
-speed:
-     The baudrate on this channel in bits/sec
-
-     Example: sccparam /dev/sc4 speed 9600
-
-txdelay:
-     The delay (in units of 10ms) after keying of the 
-     transmitter, until the first byte is sent. This is usually 
-     called "TXDELAY" in a TNC.  When 0 is specified, the driver 
-     will just wait until the CTS signal is asserted. This 
-     assumes the presence of a timer or other circuitry in the 
-     MODEM and/or transmitter, that asserts CTS when the 
-     transmitter is ready for data.
-     A normal value of this parameter is 30-36.
-
-     Example: sccparam /dev/sc1 txd 20
-
-persist:
-     This is the probability that the transmitter will be keyed 
-     when the channel is found to be free.  It is a value from 0 
-     to 255, and the probability is (value+1)/256.  The value 
-     should be somewhere near 50-60, and should be lowered when 
-     the channel is used more heavily.
-
-     Example: sccparam /dev/sc3 persist 20
-
-slottime:
-     This is the time between samples of the channel. It is 
-     expressed in units of 10ms.  About 200-300 ms (value 20-30) 
-     seems to be a good value.
-
-     Example: sccparam /dev/sc1 slot 20
-
-tail:
-     The time the transmitter will remain keyed after the last 
-     byte of a packet has been transferred to the SCC. This is 
-     necessary because the CRC and a flag still have to leave the 
-     SCC before the transmitter is keyed down. The value depends 
-     on the baudrate selected.  A few character times should be 
-     sufficient, e.g. 40ms at 1200 baud. (value 4)
-     The value of this parameter is in 10ms units.
-
-     Example: sccparam /dev/sc3 4
-
-full:
-     The full-duplex mode switch. This can be one of the folowing 
-     values:
-
-     0:   The interface will operate in CSMA mode (the normal 
-          half-duplex packet radio operation)
-     1:   Fullduplex mode, i.e. the transmitter will be keyed at 
-          any time, without checking the received carrier.  It 
-          will be unkeyed when there are no packets to be sent.
-     2:   Like 1, but the transmitter will remain keyed, also 
-          when there are no packets to be sent.  Flags will be 
-          sent in that case, until a timeout (parameter 10) 
-          occurs.
-
-     Example: sccparam /dev/sc1 fulldup off
-
-wait:
-     The initial waittime before any transmit attempt, after the 
-     frame has been queue for transmit.  This is the length of 
-     the first slot in CSMA mode.  In fullduplex modes it is
-     set to 0 for maximum performance.
-     The value of this parameter is in 10ms units. 
-
-     Example: sccparam /dev/sc2 wait 4
-
-maxkey:
-     The maximal time the transmitter will be keyed to send 
-     packets, in seconds.  This can be useful on busy CSMA 
-     channels, to avoid "getting a bad reputation" when you are 
-     generating a lot of traffic.  After the specified time has 
-     elapsed, no new frame will be started. Instead, the trans-
-     mitter will be switched off for a specified time (parameter 
-     min), and then the selected algorithm for keyup will be 
-     started again.
-     The value 0 as well as "off" will disable this feature, 
-     and allow infinite transmission time. 
-
-     Example: sccparam /dev/sc1 maxk 20
-
-min:
-     This is the time the transmitter will be switched off when 
-     the maximum transmission time is exceeded.
-
-     Example: sccparam /dev/sc4 min 10
-
-idle
-     This parameter specifies the maximum idle time in fullduplex 
-     2 mode, in seconds.  When no frames have been sent for this 
-     time, the transmitter will be keyed down.  A value of 0 is
-     has same result as the fullduplex mode 1. This parameter
-     can be disabled.
-
-     Example: sccparam /dev/sc3 idle off	# transmit forever
-
-maxdefer
-     This is the maximum time (in seconds) to wait for a free channel
-     to send. When this timer expires the transmitter will be keyed 
-     IMMEDIATLY. If you love to get trouble with other users you
-     should set this to a very low value ;-)
-
-     Example: sccparam /dev/sc1 maxdefer 240	# 2 minutes
-
-
-txoff:
-     When this parameter has the value 0, the transmission of packets
-     is enable. Otherwise it is disabled.
-
-     Example: sccparam /dev/sc3 txoff on
-
-group:
-     It is possible to build special radio equipment to use more than 
-     one frequency on the same bad, e.g. using several receivers and 
-     only one transmitter that can be switched between frequencies.
-     Also, you can connect several radios that are active on the same 
-     band.  In these cases, it is not possible, or not a good idea, to 
-     transmit on more than one frequency.  The SCC driver provides a 
-     method to lock transmitters on different interfaces, using the 
-     "param <interface> group <x>" command.  This will only work when 
-     you are using CSMA mode (parameter full = 0).
-     The number <x> must be 0 if you want no group restrictions, and 
-     can be computed as follows to create restricted groups:
-     <x> is the sum of some OCTAL numbers:
-
-     200  This transmitter will only be keyed when all other 
-          transmitters in the group are off.
-     100  This transmitter will only be keyed when the carrier 
-          detect of all other interfaces in the group is off.
-     0xx  A byte that can be used to define different groups.  
-          Interfaces are in the same group, when the logical AND 
-          between their xx values is nonzero.
-
-     Examples:
-     When 2 interfaces use group 201, their transmitters will never be 
-     keyed at the same time.
-     When 2 interfaces use group 101, the transmitters will only key 
-     when both channels are clear at the same time.  When group 301, 
-     the transmitters will not be keyed at the same time.
-
-     Don't forget to convert the octal numbers into decimal before
-     you set the parameter.
-
-     Example: (to be written)
-
-softdcd:
-     use a software dcd instead of the real one... Useful for a very
-     slow squelch.
-
-     Example: sccparam /dev/sc1 soft on
-
-
-slip:
-     use slip encoding instead of kiss
-
-     Example: sccparam /dev/sc2 slip on
-
-
-
-2. Problems
-===========
-
-We are poking around in somebody else's code, so everything may change
-from one patchlevel to another... If the patches fail, try the
-following:
-
-2.1 /linux/drivers/char/Makefile
-================================
-
-Add "scc.o" to the definition of OBJS and "scc.c" to SRCS
-
-
-2.2 /linux/include/linux/tty_driver.h
-=====================================
-
-add the following DEFINE:
-
-#define TTY_DRIVER_TYPE_SCC 0x0005
-
-
-2.3 /linux/drivers/char/tty_io.c
-================================
-
-in tty_init() add the line
-
-	kmem_start=scc_init(kmem_start);
-
-just before "return kmem_start".
-
-2.4 /linux/arch/i386/config.in
-==============================
-
-somewhere in that file add:
-
-	comment 'Z8530 SCC driver for Amateur Packet Radio'
-	bool 'KISS emulator for Z8530 based HDLC cards' CONFIG_SCC y
-	comment ''
-  
-
-
-2.5 Other problems
-==================
-
-If you have tx-problems with your BayCom USCC card please check
-the manufacturer of the 8530. SGS chips have a slightly
-different timing. Try Zilog... I have no information if this
-driver works with baudrates higher than 1200 baud. A solution is
-to write to register 8 instead to the data port, but this won't
-work with the ESCC chips *SIGH!*
-
-I got reports that the driver has problems on some 386-based systems.
-(i.e. Amstrad) Those systems have a bogus AT bus timing which will
-lead to delayed answers on interrupts. You can recognize these
-problems by looking at the output of Sccstat for the suspected
-port. See if it shows under- and overruns you own such a system.
-Perhaps it will help if you simplify the scc_isr() function a bit.
-You'll find a slightly faster version in the files scc_isr_intack
-or scc_isr_novec.
-
-
-Delayed processing of received data: This depends on
-
-- the kernel version
-
-- kernel profiling compiled or not
-
-- the rather slow receiver in tty_io.c
-
-- a high interrupt load
-
-- a high load of the maching --- running X, Xmorph, XV and Povray,
-  while compiling the kernel... hmm ... even with 32 MB RAM ...  ;-)
-
-- NET's speed itself.
-
-
-Kernel panics (based on excerpts from /linux/README)
-
-
-- if a bug results in a message like
-
-	unable to handle kernel paging request at address C0000010
-	Oops: 0002
-	EIP:   0010:XXXXXXXX
-	eax: xxxxxxxx   ebx: xxxxxxxx   ecx: xxxxxxxx   edx: xxxxxxxx
-	esi: xxxxxxxx   edi: xxxxxxxx   ebp: xxxxxxxx
-	ds: xxxx  es: xxxx  fs: xxxx  gs: xxxx
-	Pid: xx, process nr: xx
-	xx xx xx xx xx xx xx xx xx xx
-
-  or similar kernel debugging information on your screen or in your
-  system log, please duplicate it *exactly*.  The dump may look
-  incomprehensible to you, but it does contain information that may
-  help debugging the problem.  The text above the dump is also
-  important: it tells something about why the kernel dumped code (in
-  the above example it's due to a bad kernel pointer)
-
-- in debugging dumps like the above, please look up what the EIP value 
-  means.  The hex value as such doesn't help me or anybody else very much: 
-  it will depend on your particular kernel setup.  What you should do is 
-  take the hex value from the EIP line (ignore the "0010:"), and look it up 
-  in the kernel namelist to see which kernel function contains the offending 
-  address.
-
-  To find out the kernel function name, you'll need to 
-
-         less /linux/System.map
-
-  This will give you a list of kernel addresses sorted in ascending
-  order, from which it is simple to find the function that contains the
-  offending address.  Note that the address given by the kernel
-  debugging messages will not necessarily match exactly with the
-  function addresses (in fact, that is very unlikely), so you can't
-  just 'grep' the list: the list will, however, give you the starting
-  point of each kernel function, so by looking for the function that
-  has a starting address lower than the one you are searching for but
-  is followed by a function with a higher address you will find the one
-  you want.  In fact, it may be [IS!] a good idea to include a bit of
-  "context" in your problem report, giving a few lines around the
-  interesting one. 
-
-  I included a small program which does this for you. Just call
-
-         grep_eip /linux/System.map address
-
-  for example: grep_eip /linux/System.map 182f98
-
-- alternately, you can use gdb on a running kernel. (read-only; i.e. you
-  cannot change values or set break points.) To do this, first compile the
-  kernel with -g; edit arch/i386/Makefile appropriately, then do a "make
-  clean". You'll also need to enable CONFIG_PROC_FS (via "make config").
-
-  After you've rebooted with the new kernel, do "gdb vmlinux /proc/kcore".
-  You can now use all the usual gdb commands. The command to look up the
-  point where your system crashed is "l *0xXXXXXXXX". (Replace the XXXes
-  with the EIP value.)
-
-  gdb'ing a non-running kernel currently fails because gdb (wrongly)
-  disregards the starting offset for which the kernel is compiled.
-
-
-
-If you can't solve a problem, send me
-
-- a description of the problem,
-- information on your hardware (computer system, scc board, modem)
-- your kernel version
-- the output of sccstat /dev/sc# ("#" is the No. of the channel)
-- the settings of "speed", "clock" and "mode" for that channel
-  in /etc/z8530drv.rc
-- your scc_config.h
-
-
-And always remember: 
-The 1.1.* kernel series is for alpha tests -- use at your own risk ;-)
-The 1.2.* series should run reliable. This driver perhaps NOT!
-The 1.3.* kernel series is for alpha tests again... you get the idea!
-
-------------
-
-Example scc_config.h
-
-#include <linux/scc.h>
-
-/********* CONFIGURATION PARAMATERES; PLEASE CHANGE THIS TO YOUR OWN SITUATION **********/
-
-/* SCC hardware parameters */
-
-/* use the following board types: 
- *
- *	PA0HZP		OptoSCC (PA0HZP)
- *	EAGLE         	EAGLE
- *	PC100         	PC100 
- *	PRIMUS        	PRIMUS-PC (DG9BL)
- *	DRSI          	DRSI PC*Packet
- *	BAYCOM        	BayCom (U)SCC
- *	
- */
-
-int     Nchips	     = 2	; /* number of chips */
-io_port Vector_Latch = 0	; /* addr. of INTACK-Latch (0 for poll mode) */
-int     Ivec	     = 7	; /* interrupt vector */
-long    Clock	     = 4915200	; /* frequency of the scc clock */
-char	Board	     = BAYCOM	; /* what type of SCC card do you use? */
-int	Option	     = 0	; /* command for extra hardware */
-io_port Special_Port = 0	; /* port address for special hardware */
-				  /* (for EAGLE, PC100, PRIMUS, DRSI) */
-
-			/*      ^  never remove the semicolon !! */
-			
-
-
-/* 			Channel    A      B	    Chip	*/
-/*			         ============	  ========	*/
-/* Control ports:						*/
-
-io_port SCC_ctrl[MAXSCC * 2] = 	{0x304, 0x305,  /* ...one... 	*/
-				 0x306, 0x307,  /* ...two...	*/
-				     0,     0,  /* ...three...	*/
-				     0,     0}; /* ...four...	*/
-
-/* Data ports:							*/
-
-io_port SCC_data[MAXSCC * 2] =  {0x300, 0x301,	/* ...one...	*/
-				 0x302, 0x303,	/* ...two...	*/
-				     0,     0,	/* ...three...	*/
-				     0,     0};	/* ...four...	*/
-
-
-/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
-
-/*					      Chip	*/
-/*				            ========   	*/
-int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
-				 0,  	/* ...two...	*/
-				 0,  	/* ...three...	*/
-				 0};	/* ...four...	*/
-
-/* some useful #defines. You might need them or not */
-
-#define VERBOSE_BOOTMSG 1
-#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
-#undef  SCC_LDELAY		/* slow it even a bit more down */
-#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
-
-
-/* The external clocking, nrz and fullduplex divider configuration is gone */
-/* you can set these parameters in /etc/z8530drv.rc and initialize the  */
-/* driver with sccinit */
-
----------
-
-I still can't test the DRSI board, but this configuration derived from
-the PE1CHL SCC driver configuration should work:
-
-An example of scc_config.h for 
-
-One DRSI board installed:
-=========================
-
-/* gencfg 1 0x300 0x10 2 0 1 0 7 4915200 */
-
-/* file generated by $Id: gencfg.c,v 1.2 1994/11/29 21:42:24 JReuter Exp JReuter $ */
-
-#include <linux/scc.h>
-
-int     Nchips	     = 1;
-io_port Vector_Latch = 0x0;
-int     Ivec	     = 7;
-long    Clock	     = 4915200;
-char	Board	     = PA0HZP;
-int	Option	     = 0;
-io_port Special_Port = 0x0;
-
-io_port SCC_ctrl[MAXSCC * 2] =
-{0x302, 0x300, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-
-io_port SCC_data[MAXSCC * 2] =
-{0x303, 0x301, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-
-/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
-
-/*					      Chip	*/
-/*				            ========   	*/
-int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
-				 0,  	/* ...two...	*/
-				 0,  	/* ...three...	*/
-				 0};	/* ...four...	*/
-
-#define VERBOSE_BOOTMSG 1
-#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
-#undef  SCC_LDELAY		/* slow it even a bit more down */
-#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
-
-
-
-Two boards installed:
-=====================
-
-/* file generated by $Id: gencfg.c,v 1.2 1994/11/29 21:42:24 JReuter Exp JReuter $ */
-
-#include <linux/scc.h>
-
-int     Nchips	     = 2;
-io_port Vector_Latch = 0x0;
-int     Ivec	     = 7;
-long    Clock	     = 4915200;
-char	Board	     = PA0HZP;
-int	Option	     = 0;
-io_port Special_Port = 0x0;
-
-io_port SCC_ctrl[MAXSCC * 2] =
-{0x302, 0x300, 0x312, 0x310, 0x0, 0x0, 0x0, 0x0};
-
-io_port SCC_data[MAXSCC * 2] =
-{0x303, 0x301, 0x313, 0x311, 0x0, 0x0, 0x0, 0x0};
-
-/* set to '1' if you have and want ESCC chip (8580/85180/85280) support */
-
-/*					      Chip	*/
-/*				            ========   	*/
-int SCC_Enhanced[MAXSCC] =	{0,	/* ...one...	*/
-				 0,  	/* ...two...	*/
-				 0,  	/* ...three...	*/
-				 0};	/* ...four...	*/
-
-#define VERBOSE_BOOTMSG 1
-#undef  SCC_DELAY		/* perhaps a 486DX2 is a *bit* too fast */
-#undef  SCC_LDELAY		/* slow it even a bit more down */
-#undef  DONT_CHECK		/* don't look if the SCCs you specified are available */
-
-
-
-
-
-*****************
-
-You  m u s t  use "clock dpll" in /etc/z8530drv.rc for operation, 
-the on-board baudrate generator is not supported.
-
-*****************
-(mni tnx to Mike Bilow)
-
- 
-...an many thanks to Linus Torvalds and Alan Cox for including the driver
-   in the LinuX standard distribution...
+The package includes the utilities necessary to initialize and
+control the driver.
 
 Joerg Reuter	ampr-net: dl1bke@db0pra.ampr.org
 		AX-25   : DL1BKE @ DB0ACH.#NRW.DEU.EU
diff -u --recursive --new-file v1.3.24/linux/drivers/char/cyclades.c linux/drivers/char/cyclades.c
--- v1.3.24/linux/drivers/char/cyclades.c	Sun Sep  3 12:26:52 1995
+++ linux/drivers/char/cyclades.c	Sat Sep  9 09:36:08 1995
@@ -1,11 +1,17 @@
 static char rcsid[] =
-"$Revision: 1.36.1.4 $$Date: 1995/03/29 06:14:14 $";
+"$Revision: 1.36.3.2 $$Date: 1995/09/08 22:07:14 $";
 /*
- *  linux/kernel/cyclades.c
+ *  linux/drivers/char/cyclades.c
  *
- * Maintained by Marcio Saito (cyclades@netcom.com) and
+ * This file contains the driver for the Cyclades Cyclom-Y multiport
+ * serial boards.
+ *
+ * Maintained by Marcio Saito (marcio@cyclades.com) and
  * Randolph Bentson (bentson@grieg.seaslug.org)
  *
+ * For Technical support and installation problems, please send e-mail
+ * to support@cyclades.com.
+ *
  * Much of the design and some of the code came from serial.c
  * which was copyright (C) 1991, 1992  Linus Torvalds.  It was
  * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
@@ -18,6 +24,19 @@
  *   int  cy_open(struct tty_struct *tty, struct file *filp);
  *
  * $Log: cyclades.c,v $
+ * Revision 1.36.3.2  1995/09/08  22:07:14  bentson
+ * remove printk from ISR; fix typo
+ *
+ * Revision 1.36.3.1  1995/09/01  12:00:42  marcio
+ * Minor fixes in the PCI board support. PCI function calls in
+ * conditional compilation (CONFIG_PCI). Thanks to Jim Duncan
+ * <duncan@okay.com>. "bad serial count" message removed.
+ *
+ * Revision 1.36.3  1995/08/22  09:19:42  marcio
+ * Cyclom-Y/PCI support added. Changes in the cy_init routine and
+ * board initialization. Changes in the boot messages. The driver
+ * supports up to 4 boards and 64 ports by default.
+ *
  * Revision 1.36.1.4  1995/03/29  06:14:14  bentson
  * disambiguate between Cyclom-16Y and Cyclom-32Ye;
  *
@@ -224,6 +243,12 @@
 #include <asm/segment.h>
 #include <asm/bitops.h>
 
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/bios32.h>
+#include <linux/pci.h>
+
 #define small_delay(x) for(j=0;j<x;j++)k++;
 
 
@@ -258,28 +283,48 @@
 static int cy_wild_int_mask;
 static unsigned char *intr_base_addr;
 
-/* This is the per-card data structure containing a card's base
-   address.  Here are declarations for some common addresses.
-   Add entries to match your configuration (there are sixty-
-   four possible from 0x80000 to 0xFE000) */
-struct cyclades_card cy_card[] = {
- /* BASE_ADDR */
-    {0xD0000},
-    {0xD2000},
-    {0xD4000},
-    {0xD6000},
-    {0xD8000},
-    {0xDA000},
-    {0xDC000},
-    {0xDE000}
+
+/* This is the address lockup table. The driver will probe for Cyclom-Y/ISA
+   boards at all addresses in here. If you want the driver to probe addresses
+   in a different address, add it to this table.
+   If the driver is probing some other board and causing problems, remove the
+   address from this table.  */
+
+static unsigned char *cy_isa_addresses[] = {
+	(unsigned char *) 0xD0000,
+	(unsigned char *) 0xD2000,
+	(unsigned char *) 0xD4000,
+	(unsigned char *) 0xD6000,
+	(unsigned char *) 0xD8000,
+	(unsigned char *) 0xDA000,
+	(unsigned char *) 0xDC000,
+	(unsigned char *) 0xDE000,
 };
+#define	NR_ISA_ADDRESSES	(sizeof(cy_isa_addresses)/sizeof(unsigned char *))
+
+/* This is the per-card data structure containing address, irq, number of
+   channels, etc. This driver supports a maximum of NR_CARDS cards. If
+   you need to install more boards, change this constant in the definition
+   bellow. No other change is necesary to support more boards. */
 
-#define NR_CARDS        (sizeof(cy_card)/sizeof(struct cyclades_card))
+#define NR_CARDS	4
+
+static struct cyclades_card cy_card[NR_CARDS];
+
+/* This is the per-channel data structure containing pointers, flags
+   and variables for the port. This driver supports a maximum of NR_PORTS.
+   If the total number of ports is larger than NR_PORTS, change this
+   constant in the definition bellow. No other change is necessary to
+   support more boards/ports. */
+
+#define NR_PORTS        64
+
+static struct cyclades_port cy_port[NR_PORTS];
 
 /*  The Cyclom-Ye has placed the sequential chips in non-sequential
  *  address order.  This look-up table overcomes that problem.
  */
-int cy_chip_offset [] =
+static int cy_chip_offset [] =
     { 0x0000,
       0x0400,
       0x0800,
@@ -290,43 +335,16 @@
       0x0E00
     };
 
-/* This is the per-port data structure */
-struct cyclades_port cy_port[] = {
-      /* CARD#  */
-        {-1 },      /* ttyC0 */
-        {-1 },      /* ttyC1 */
-        {-1 },      /* ttyC2 */
-        {-1 },      /* ttyC3 */
-        {-1 },      /* ttyC4 */
-        {-1 },      /* ttyC5 */
-        {-1 },      /* ttyC6 */
-        {-1 },      /* ttyC7 */
-        {-1 },      /* ttyC8 */
-        {-1 },      /* ttyC9 */
-        {-1 },      /* ttyC10 */
-        {-1 },      /* ttyC11 */
-        {-1 },      /* ttyC12 */
-        {-1 },      /* ttyC13 */
-        {-1 },      /* ttyC14 */
-        {-1 },      /* ttyC15 */
-        {-1 },      /* ttyC16 */
-        {-1 },      /* ttyC17 */
-        {-1 },      /* ttyC18 */
-        {-1 },      /* ttyC19 */
-        {-1 },      /* ttyC20 */
-        {-1 },      /* ttyC21 */
-        {-1 },      /* ttyC22 */
-        {-1 },      /* ttyC23 */
-        {-1 },      /* ttyC24 */
-        {-1 },      /* ttyC25 */
-        {-1 },      /* ttyC26 */
-        {-1 },      /* ttyC27 */
-        {-1 },      /* ttyC28 */
-        {-1 },      /* ttyC29 */
-        {-1 },      /* ttyC30 */
-        {-1 }       /* ttyC31 */
-};
-#define NR_PORTS        (sizeof(cy_port)/sizeof(struct cyclades_port))
+/* PCI related definitions */
+
+static unsigned short	cy_pci_nboard = 0;
+static unsigned short	cy_isa_nboard = 0;
+static unsigned short	cy_nboard = 0;
+
+int			cy_detect_isa(void);
+int			cy_detect_pci(void);
+
+static int		cy_next_channel = 0;	/* next minor available */
 
 static int serial_refcount;
 
@@ -334,10 +352,10 @@
 static struct termios *serial_termios[NR_PORTS];
 static struct termios *serial_termios_locked[NR_PORTS];
 
-
 /* This is the per-irq data structure,
-               it maps an irq to the corresponding card */
-struct cyclades_card * IRQ_cards[16];
+   it maps an irq to the corresponding card */
+
+struct cyclades_card	*IRQ_cards[16];
 
 
 /*
@@ -392,7 +410,6 @@
 #endif
 
 
-
 static inline int
 serial_paranoia_check(struct cyclades_port *info,
 			dev_t device, const char *routine)
@@ -456,7 +473,7 @@
    didn't finish within the time limit.
  */
 u_short
-write_cy_cmd(u_char *base_addr, u_char cmd)
+write_cy_cmd(u_char *base_addr, u_char cmd, int index)
 {
   unsigned long flags;
   volatile int  i;
@@ -464,20 +481,20 @@
     save_flags(flags); cli();
 	/* Check to see that the previous command has completed */
 	for(i = 0 ; i < 100 ; i++){
-	    if (base_addr[CyCCR] == 0){
+	    if (base_addr[CyCCR<<index] == 0){
 		break;
 	    }
 	    udelay(10L);
 	}
 	/* if the CCR never cleared, the previous command
 	    didn't finish within the "reasonable time" */
-	if ( i == 10 ) {
+	if ( i == 100 ) {
 	    restore_flags(flags);
 	    return (-1);
 	}
 
 	/* Issue the new command */
-	base_addr[CyCCR] = cmd;
+	base_addr[CyCCR<<index] = cmd;
     restore_flags(flags);
     return(0);
 } /* write_cy_cmd */
@@ -492,7 +509,7 @@
   struct cyclades_card *cinfo;
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned char *base_addr;
-  int chip,channel;
+  int chip,channel,index;
   unsigned long flags;
 
 #ifdef SERIAL_DEBUG_OTHER
@@ -503,15 +520,16 @@
 	return;
 	
     cinfo = &cy_card[info->card];
+    index = cinfo->bus_index;
     channel = info->line - cinfo->first_line;
     chip = channel>>2;
     channel &= 0x03;
     base_addr = (unsigned char*)
-                   (cy_card[info->card].base_addr + cy_chip_offset[chip]);
+                   (cy_card[info->card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-        base_addr[CyCAR] = (u_char)(channel & 0x0003); /* index channel */
-        base_addr[CySRER] &= ~CyTxMpty;
+        base_addr[CyCAR<<index] = (u_char)(channel & 0x0003); /* index channel */
+        base_addr[CySRER<<index] &= ~CyTxMpty;
     restore_flags(flags);
 
     return;
@@ -523,7 +541,7 @@
   struct cyclades_card *cinfo;
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned char *base_addr;
-  int chip,channel;
+  int chip,channel,index;
   unsigned long flags;
 
 #ifdef SERIAL_DEBUG_OTHER
@@ -534,15 +552,16 @@
 	return;
 	
     cinfo = &cy_card[info->card];
+    index = cinfo->bus_index;
     channel = info->line - cinfo->first_line;
     chip = channel>>2;
     channel &= 0x03;
     base_addr = (unsigned char*)
-                   (cy_card[info->card].base_addr + cy_chip_offset[chip]);
+                   (cy_card[info->card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-        base_addr[CyCAR] = (u_char)(channel & 0x0003);
-        base_addr[CySRER] |= CyTxMpty;
+        base_addr[CyCAR<<index] = (u_char)(channel & 0x0003);
+        base_addr[CySRER<<index] |= CyTxMpty;
     restore_flags(flags);
 
     return;
@@ -572,8 +591,26 @@
 static void
 cy_probe(int irq, struct pt_regs *regs)
 {
+  int save_xir, save_car;
+  int index = 0;	/* probing interrupts is only for ISA */
+
     cy_irq_triggered = irq;
     cy_triggered |= 1 << irq;
+
+	if(intr_base_addr[CySVRR<<index] != 0) {
+	    save_xir = (u_char) intr_base_addr[CyTIR<<index];
+	    save_car = intr_base_addr[CyCAR<<index];
+	    if ((save_xir & 0x3) != 0){
+		SP("channel ");
+		CP2(save_xir);
+		SP(" requesting unexpected interrupt\n");
+	    }
+	    intr_base_addr[CyCAR<<index] = (save_xir & 0x3);
+	    intr_base_addr[CySRER<<index] &= ~CyTxMpty;
+	    intr_base_addr[CyTIR<<index] = (save_xir & 0x3f);
+	    intr_base_addr[CyCAR<<index] = (save_car);
+	    *(intr_base_addr + (Cy_ClrIntr<<index)) = 0; /* Cy_ClrIntr is 0x1800 */
+	}
     return;
 } /* cy_probe */
 
@@ -592,10 +629,9 @@
   int chip;
   int save_xir, channel, save_car;
   char data;
-  volatile char vdata;
   int char_count;
   int outch;
-  int i,j;
+  int i,j,index;
   int too_many;
   int had_work;
   int mdm_change;
@@ -605,6 +641,9 @@
         return; /* spurious interrupt */
     }
 
+    card_base_addr = (unsigned char *)cinfo->base_addr;
+    index = cinfo->bus_index;
+
     /* This loop checks all chips in the card.  Make a note whenever
        _any_ chip had some work to do, as this is considered an
        indication that there will be more to do.  Only when no chip
@@ -614,9 +653,9 @@
         had_work = 0;
         for ( chip = 0 ; chip < cinfo->num_chips ; chip ++) {
 	    base_addr = (unsigned char *)
-	                   (cinfo->base_addr + cy_chip_offset[chip]);
+	                   (cinfo->base_addr + (cy_chip_offset[chip]<<index));
             too_many = 0;
-            while ( (status = base_addr[CySVRR]) != 0x00) {
+            while ( (status = base_addr[CySVRR<<index]) != 0x00) {
                 had_work++;
                 /* The purpose of the following test is to ensure that
                    no chip can monopolize the driver.  This forces the
@@ -627,32 +666,31 @@
                     break;
                 }
                 if (status & CySRReceive) {      /* reception interrupt */
-
                     /* determine the channel and change to that context */
-                    save_xir = (u_char) base_addr[CyRIR];
+                    save_xir = (u_char) base_addr[CyRIR<<index];
                     channel = (u_short ) (save_xir & CyIRChannel);
                     i = channel + chip * 4 + cinfo->first_line;
                     info = &cy_port[i];
                     info->last_active = jiffies;
-                    save_car = base_addr[CyCAR];
-                    base_addr[CyCAR] = save_xir;
+                    save_car = base_addr[CyCAR<<index];
+                    base_addr[CyCAR<<index] = save_xir;
 
                     /* if there is nowhere to put the data, discard it */
                     if(info->tty == 0){
-                        j = (base_addr[CyRIVR] & CyIVRMask);
+                        j = (base_addr[CyRIVR<<index] & CyIVRMask);
                         if ( j == CyIVRRxEx ) { /* exception */
-                            data = base_addr[CyRDSR];
+                            data = base_addr[CyRDSR<<index];
                         } else { /* normal character reception */
-                            char_count = base_addr[CyRDCR];
+                            char_count = base_addr[CyRDCR<<index];
                             while(char_count--){
-                                data = base_addr[CyRDSR];
+                                data = base_addr[CyRDSR<<index];
                             }
                         }
                     }else{ /* there is an open port for this data */
                         tty = info->tty;
-                        j = (base_addr[CyRIVR] & CyIVRMask);
+                        j = (base_addr[CyRIVR<<index] & CyIVRMask);
                         if ( j == CyIVRRxEx ) { /* exception */
-                            data = base_addr[CyRDSR];
+                            data = base_addr[CyRDSR<<index];
                             if(data & info->ignore_status_mask){
                                 continue;
                             }
@@ -663,7 +701,7 @@
 					*tty->flip.flag_buf_ptr++ =
 								TTY_BREAK;
 					*tty->flip.char_buf_ptr++ =
-							base_addr[CyRDSR];
+							base_addr[CyRDSR<<index];
 					if (info->flags & ASYNC_SAK){
 					    do_SAK(tty);
 					}
@@ -671,12 +709,12 @@
 					*tty->flip.flag_buf_ptr++ =
 								TTY_FRAME;
 					*tty->flip.char_buf_ptr++ =
-							base_addr[CyRDSR];
+							base_addr[CyRDSR<<index];
 				    }else if(data & CyPARITY){
 					*tty->flip.flag_buf_ptr++ =
 								TTY_PARITY;
 					*tty->flip.char_buf_ptr++ =
-							base_addr[CyRDSR];
+							base_addr[CyRDSR<<index];
 				    }else if(data & CyOVERRUN){
 					*tty->flip.flag_buf_ptr++ =
 								TTY_OVERRUN;
@@ -690,7 +728,7 @@
 					    *tty->flip.flag_buf_ptr++ =
 					                         TTY_NORMAL;
 					    *tty->flip.char_buf_ptr++ =
-							base_addr[CyRDSR];
+							base_addr[CyRDSR<<index];
 					}
 				    /* These two conditions may imply */
 				    /* a normal read should be done. */
@@ -710,7 +748,7 @@
                             }
                         } else { /* normal character reception */
                             /* load # characters available from the chip */
-                            char_count = base_addr[CyRDCR];
+                            char_count = base_addr[CyRDCR<<index];
 
 #ifdef CYCLOM_ENABLE_MONITORING
 			    ++info->mon.int_count;
@@ -724,7 +762,7 @@
                                         break;
                                 }
 				tty->flip.count++;
-                                data = base_addr[CyRDSR];
+                                data = base_addr[CyRDSR<<index];
 				*tty->flip.flag_buf_ptr++ = TTY_NORMAL;
 				*tty->flip.char_buf_ptr++ = data;
 #ifdef CYCLOM_16Y_HACK
@@ -735,8 +773,8 @@
                         queue_task_irq_off(&tty->flip.tqueue, &tq_timer);
                     }
                     /* end of service */
-                    base_addr[CyRIR] = (save_xir & 0x3f);
-                    base_addr[CyCAR] = (save_car);
+                    base_addr[CyRIR<<index] = (save_xir & 0x3f);
+                    base_addr[CyCAR<<index] = (save_car);
                 }
 
 
@@ -745,21 +783,21 @@
                         we know we can always stuff a dozen characters. */
 
                     /* determine the channel and change to that context */
-                    save_xir = (u_char) base_addr[CyTIR];
+                    save_xir = (u_char) base_addr[CyTIR<<index];
                     channel = (u_short ) (save_xir & CyIRChannel);
                     i = channel + chip * 4 + cinfo->first_line;
-                    save_car = base_addr[CyCAR];
-                    base_addr[CyCAR] = save_xir;
+                    save_car = base_addr[CyCAR<<index];
+                    base_addr[CyCAR<<index] = save_xir;
 
                     /* validate the port number (as configured and open) */
                     if( (i < 0) || (NR_PORTS <= i) ){
-                        base_addr[CySRER] &= ~CyTxMpty;
+                        base_addr[CySRER<<index] &= ~CyTxMpty;
                         goto txend;
                     }
                     info = &cy_port[i];
                     info->last_active = jiffies;
                     if(info->tty == 0){
-                        base_addr[CySRER] &= ~CyTxMpty;
+                        base_addr[CySRER<<index] &= ~CyTxMpty;
                         goto txdone;
                     }
 
@@ -769,7 +807,7 @@
 
                     if(info->x_char) { /* send special char */
                         outch = info->x_char;
-                        base_addr[CyTDR] = outch;
+                        base_addr[CyTDR<<index] = outch;
                         char_count--;
                         info->x_char = 0;
                     }
@@ -783,28 +821,28 @@
 			    so the delay is duration * 200/HZ, and thus a
 			    break can run from 1/100 sec to about 5/4 sec.
 			 */
-			base_addr[CyTDR] = 0; /* start break */
-			base_addr[CyTDR] = 0x81;
-			base_addr[CyTDR] = 0; /* delay a bit */
-			base_addr[CyTDR] = 0x82;
-			base_addr[CyTDR] = info->x_break*200/HZ;
-			base_addr[CyTDR] = 0; /* terminate break */
-			base_addr[CyTDR] = 0x83;
+			base_addr[CyTDR<<index] = 0; /* start break */
+			base_addr[CyTDR<<index] = 0x81;
+			base_addr[CyTDR<<index] = 0; /* delay a bit */
+			base_addr[CyTDR<<index] = 0x82;
+			base_addr[CyTDR<<index] = info->x_break*200/HZ;
+			base_addr[CyTDR<<index] = 0; /* terminate break */
+			base_addr[CyTDR<<index] = 0x83;
 			char_count -= 7;
 			info->x_break = 0;
 		    }
 
                     while (char_count-- > 0){
                         if (!info->xmit_cnt){
-			    base_addr[CySRER] &= ~CyTxMpty;
+			    base_addr[CySRER<<index] &= ~CyTxMpty;
 			    goto txdone;
                         }
 			if (info->xmit_buf == 0){
-			    base_addr[CySRER] &= ~CyTxMpty;
+			    base_addr[CySRER<<index] &= ~CyTxMpty;
 			    goto txdone;
 			}
 			if (info->tty->stopped || info->tty->hw_stopped){
-			    base_addr[CySRER] &= ~CyTxMpty;
+			    base_addr[CySRER<<index] &= ~CyTxMpty;
 			    goto txdone;
 			}
                         /* Because the Embedded Transmit Commands have been
@@ -823,14 +861,14 @@
 			    info->xmit_cnt--;
 			    info->xmit_tail = (info->xmit_tail + 1)
 						      & (PAGE_SIZE - 1);
-			    base_addr[CyTDR] = outch;
+			    base_addr[CyTDR<<index] = outch;
                         }else{
                             if(char_count > 1){
 				info->xmit_cnt--;
 				info->xmit_tail = (info->xmit_tail + 1)
 							  & (PAGE_SIZE - 1);
-				base_addr[CyTDR] = outch;
-				base_addr[CyTDR] = 0;
+				base_addr[CyTDR<<index] = outch;
+				base_addr[CyTDR<<index] = 0;
 				char_count--;
                             }else{
                             }
@@ -844,22 +882,22 @@
 
         txend:
                     /* end of service */
-                    base_addr[CyTIR] = (save_xir & 0x3f);
-                    base_addr[CyCAR] = (save_car);
+                    base_addr[CyTIR<<index] = (save_xir & 0x3f);
+                    base_addr[CyCAR<<index] = (save_car);
                 }
 
                 if (status & CySRModem) {        /* modem interrupt */
 
                     /* determine the channel and change to that context */
-                    save_xir = (u_char) base_addr[CyMIR];
+                    save_xir = (u_char) base_addr[CyMIR<<index];
                     channel = (u_short ) (save_xir & CyIRChannel);
                     info = &cy_port[channel + chip * 4 + cinfo->first_line];
                     info->last_active = jiffies;
-                    save_car = base_addr[CyCAR];
-                    base_addr[CyCAR] = save_xir;
+                    save_car = base_addr[CyCAR<<index];
+                    base_addr[CyCAR<<index] = save_xir;
 
-                    mdm_change = base_addr[CyMISR];
-                    mdm_status = base_addr[CyMSVR1];
+                    mdm_change = base_addr[CyMISR<<index];
+                    mdm_status = base_addr[CyMSVR1<<index];
 
                     if(info->tty == 0){ /* nowhere to put the data, ignore it */
                         ;
@@ -881,14 +919,14 @@
                                 if(mdm_status & CyCTS){
                                     /* !!! cy_start isn't used because... */
                                     info->tty->stopped = 0;
-				    base_addr[CySRER] |= CyTxMpty;
+				    base_addr[CySRER<<index] |= CyTxMpty;
 				    cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
                                 }
                             }else{
                                 if(!(mdm_status & CyCTS)){
                                     /* !!! cy_stop isn't used because... */
                                     info->tty->stopped = 1;
-				    base_addr[CySRER] &= ~CyTxMpty;
+				    base_addr[CySRER<<index] &= ~CyTxMpty;
                                 }
                             }
                         }
@@ -898,16 +936,15 @@
                         }
                     }
                     /* end of service */
-                    base_addr[CyMIR] = (save_xir & 0x3f);
-                    base_addr[CyCAR] = save_car;
+                    base_addr[CyMIR<<index] = (save_xir & 0x3f);
+                    base_addr[CyCAR<<index] = save_car;
                 }
             }          /* end while status != 0 */
         }            /* end loop for chips... */
     } while(had_work);
 
    /* clear interrupts */
-    card_base_addr = (unsigned char *)cinfo->base_addr;
-   vdata = *(card_base_addr + Cy_ClrIntr); /* Cy_ClrIntr is 0x1800 */
+   *(card_base_addr + (Cy_ClrIntr<<index)) = 0; /* Cy_ClrIntr is 0x1800 */
 
 } /* cy_interrupt */
 
@@ -1025,13 +1062,13 @@
 	 * Delay for 0.1 seconds -- we use a busy loop since this may 
 	 * occur during the bootup sequence
 	 */
-	timeout = jiffies+HZ/10;
+	timeout = jiffies+10;
 	while (timeout >= jiffies)
 	    ;
 	
 	cy_triggered = 0;	/* Reset after letting things settle */
 
-	timeout = jiffies+HZ/10;
+	timeout = jiffies+10;
 	while (timeout >= jiffies)
 		;
 	
@@ -1052,49 +1089,31 @@
  * fool-proof, but it works a large part of the time.
  */
 static int
-get_auto_irq(int card)
+get_auto_irq(unsigned char *address)
 {
   unsigned long timeout;
   unsigned char *base_addr;
-  int save_xir, save_car;
-  volatile char vdata;
+  int		index;
 
-    base_addr = (unsigned char*) (cy_card[card].base_addr);
-    intr_base_addr = base_addr;
+    index = 0;	/* IRQ probing is only for ISA */
+    base_addr = address;
+    intr_base_addr = address;
 	
     /*
      * Enable interrupts and see who answers
      */
     cy_irq_triggered = 0;
     cli();
-	base_addr[CyCAR] = 0;
-	write_cy_cmd(base_addr,CyCHAN_CTL|CyENB_XMTR);
-	base_addr[CySRER] |= CyTxMpty;
+	base_addr[CyCAR<<index] = 0;
+	write_cy_cmd(base_addr,CyCHAN_CTL|CyENB_XMTR,index);
+	base_addr[CySRER<<index] |= CyTxMpty;
     sti();
     
-    timeout = jiffies+2*HZ/100;
+    timeout = jiffies+2;
     while (timeout >= jiffies) {
 	if (cy_irq_triggered)
 	    break;
     }
-    /*
-     * Now check to see if we got any business, and clean up.
-     */
-    cli();
-	if(intr_base_addr[CySVRR] != 0){
-	    save_xir = (u_char) intr_base_addr[CyTIR];
-	    save_car = intr_base_addr[CyCAR];
-	    if ((save_xir & 0x3) != 0){
-		printk("channel %x requesting unexpected interrupt\n",save_xir);
-	    }
-	    intr_base_addr[CyCAR] = (save_xir & 0x3);
-	    intr_base_addr[CySRER] &= ~CyTxMpty;
-	    intr_base_addr[CyTIR] = (save_xir & 0x3f);
-	    intr_base_addr[CyCAR] = (save_car);
-	    vdata = *(intr_base_addr + Cy_ClrIntr); /* Cy_ClrIntr is 0x1800 */
-	}
-    sti();
-
     return(cy_irq_triggered);
 } /* get_auto_irq */
 
@@ -1103,7 +1122,7 @@
  * faked out by random interrupts
  */
 static int
-do_auto_irq(int card)
+do_auto_irq(unsigned char *address)
 {
   int 			irq_lines = 0;
   int			irq_try_1 = 0, irq_try_2 = 0;
@@ -1119,9 +1138,9 @@
 	
 	for (retries = 0; retries < 5; retries++) {
 	    if (!irq_try_1)
-		irq_try_1 = get_auto_irq(card);
+		irq_try_1 = get_auto_irq(address);
 	    if (!irq_try_2)
-		irq_try_2 = get_auto_irq(card);
+		irq_try_2 = get_auto_irq(address);
 	    if (irq_try_1 && irq_try_2) {
 		if (irq_try_1 == irq_try_2)
 		    break;
@@ -1142,7 +1161,7 @@
 {
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 
     if (info->flags & ASYNC_INITIALIZED){
 	return 0;
@@ -1167,8 +1186,9 @@
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
 #ifdef SERIAL_DEBUG_OPEN
     printk("startup card %d, chip %d, channel %d, base_addr %lx",
@@ -1176,25 +1196,25 @@
 #endif
 
     save_flags(flags); cli();
-	base_addr[CyCAR] = (u_char)channel;
+	base_addr[CyCAR<<index] = (u_char)channel;
 
-	base_addr[CyRTPR] = (info->default_timeout
+	base_addr[CyRTPR<<index] = (info->default_timeout
 			     ? info->default_timeout
 			     : 0x02); /* 10ms rx timeout */
 
-	write_cy_cmd(base_addr,CyCHAN_CTL|CyENB_RCVR|CyENB_XMTR);
+	write_cy_cmd(base_addr,CyCHAN_CTL|CyENB_RCVR|CyENB_XMTR,index);
 
-	base_addr[CyCAR] = (u_char)channel; /* !!! Is this needed? */
-	base_addr[CyMSVR1] = CyRTS;
+	base_addr[CyCAR<<index] = (u_char)channel; /* !!! Is this needed? */
+	base_addr[CyMSVR1<<index] = CyRTS;
 /* CP('S');CP('1'); */
-	base_addr[CyMSVR2] = CyDTR;
+	base_addr[CyMSVR2<<index] = CyDTR;
 
 #ifdef SERIAL_DEBUG_DTR
         printk("cyc: %d: raising DTR\n", __LINE__);
-        printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+        printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 
-	base_addr[CySRER] |= CyRxData;
+	base_addr[CySRER<<index] |= CyRxData;
 	info->flags |= ASYNC_INITIALIZED;
 
 	if (info->tty){
@@ -1215,17 +1235,19 @@
 {
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 
     card = info->card;
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
+
     save_flags(flags); cli();
-	base_addr[CyCAR] = channel;
-	base_addr[CySRER] |= CyTxMpty;
+	base_addr[CyCAR<<index] = channel;
+	base_addr[CySRER<<index] |= CyTxMpty;
     restore_flags(flags);
 } /* start_xmit */
 
@@ -1238,7 +1260,7 @@
 {
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 
     if (!(info->flags & ASYNC_INITIALIZED)){
 /* CP('$'); */
@@ -1249,8 +1271,9 @@
     channel = info->line - cy_card[card].first_line;
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
 #ifdef SERIAL_DEBUG_OPEN
     printk("shutdown card %d, chip %d, channel %d, base_addr %lx\n",
@@ -1269,17 +1292,16 @@
 	    info->xmit_buf = 0;
 	}
 
-	base_addr[CyCAR] = (u_char)channel;
+	base_addr[CyCAR<<index] = (u_char)channel;
 	if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
-	    base_addr[CyMSVR1] = ~CyRTS;
-/* CP('C');CP('1'); */
-	    base_addr[CyMSVR2] = ~CyDTR;
+	    base_addr[CyMSVR1<<index] = ~CyRTS;
+	    base_addr[CyMSVR2<<index] = ~CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
         }
-	write_cy_cmd(base_addr,CyCHAN_CTL|CyDIS_RCVR);
+	write_cy_cmd(base_addr,CyCHAN_CTL|CyDIS_RCVR,index);
          /* it may be appropriate to clear _XMIT at
            some later date (after testing)!!! */
 
@@ -1303,7 +1325,7 @@
 {
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
   unsigned cflag;
   int   i;
 
@@ -1423,62 +1445,63 @@
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-	base_addr[CyCAR] = (u_char)channel;
+	base_addr[CyCAR<<index] = (u_char)channel;
 
        /* tx and rx baud rate */
 
-	base_addr[CyTCOR] = info->tco;
-	base_addr[CyTBPR] = info->tbpr;
-	base_addr[CyRCOR] = info->rco;
-	base_addr[CyRBPR] = info->rbpr;
+	base_addr[CyTCOR<<index] = info->tco;
+	base_addr[CyTBPR<<index] = info->tbpr;
+	base_addr[CyRCOR<<index] = info->rco;
+	base_addr[CyRBPR<<index] = info->rbpr;
 
 	/* set line characteristics  according configuration */
 
-	base_addr[CySCHR1] = START_CHAR(info->tty);
-	base_addr[CySCHR2] = STOP_CHAR(info->tty);
-	base_addr[CyCOR1] = info->cor1;
-	base_addr[CyCOR2] = info->cor2;
-	base_addr[CyCOR3] = info->cor3;
-	base_addr[CyCOR4] = info->cor4;
-	base_addr[CyCOR5] = info->cor5;
+	base_addr[CySCHR1<<index] = START_CHAR(info->tty);
+	base_addr[CySCHR2<<index] = STOP_CHAR(info->tty);
+	base_addr[CyCOR1<<index] = info->cor1;
+	base_addr[CyCOR2<<index] = info->cor2;
+	base_addr[CyCOR3<<index] = info->cor3;
+	base_addr[CyCOR4<<index] = info->cor4;
+	base_addr[CyCOR5<<index] = info->cor5;
 
-	write_cy_cmd(base_addr,CyCOR_CHANGE|CyCOR1ch|CyCOR2ch|CyCOR3ch);
+	write_cy_cmd(base_addr,CyCOR_CHANGE|CyCOR1ch|CyCOR2ch|CyCOR3ch,index);
 
-	base_addr[CyCAR] = (u_char)channel; /* !!! Is this needed? */
+	base_addr[CyCAR<<index] = (u_char)channel; /* !!! Is this needed? */
 
-	base_addr[CyRTPR] = (info->default_timeout
+	base_addr[CyRTPR<<index] = (info->default_timeout
 			     ? info->default_timeout
 			     : 0x02); /* 10ms rx timeout */
 
 	if (C_CLOCAL(info->tty)) {
-	    base_addr[CySRER] |= 0; /* without modem intr */
+	    base_addr[CySRER<<index] |= 0; /* without modem intr */
 				    /* ignore 1->0 modem transitions */
-	    base_addr[CyMCOR1] = 0x0;
+	    base_addr[CyMCOR1<<index] = 0x0;
 				    /* ignore 0->1 modem transitions */
-	    base_addr[CyMCOR2] = 0x0;
+	    base_addr[CyMCOR2<<index] = 0x0;
 	} else {
-	    base_addr[CySRER] |= CyMdmCh; /* with modem intr */
+	    base_addr[CySRER<<index] |= CyMdmCh; /* with modem intr */
 				    /* act on 1->0 modem transitions */
-	    base_addr[CyMCOR1] = CyDSR|CyCTS|CyRI|CyDCD;
+	    base_addr[CyMCOR1<<index] = CyDSR|CyCTS|CyRI|CyDCD;
 				    /* act on 0->1 modem transitions */
-	    base_addr[CyMCOR2] = CyDSR|CyCTS|CyRI|CyDCD;
+	    base_addr[CyMCOR2<<index] = CyDSR|CyCTS|CyRI|CyDCD;
 	}
 
 	if(i == 0){ /* baud rate is zero, turn off line */
-	    base_addr[CyMSVR2] = ~CyDTR;
+	    base_addr[CyMSVR2<<index] = ~CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	}else{
-	    base_addr[CyMSVR2] = CyDTR;
+	    base_addr[CyMSVR2<<index] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: raising DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	}
 
@@ -1526,7 +1549,7 @@
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 				
 #ifdef SERIAL_DEBUG_IO
     printk("cy_flush_chars ttyC%d\n", info->line); /* */
@@ -1543,12 +1566,13 @@
     channel = info->line - cy_card[card].first_line;
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-	base_addr[CyCAR] = channel;
-	base_addr[CySRER] |= CyTxMpty;
+	base_addr[CyCAR<<index] = channel;
+	base_addr[CySRER<<index] |= CyTxMpty;
     restore_flags(flags);
 } /* cy_flush_chars */
 
@@ -1561,7 +1585,7 @@
  */
 static int
 cy_write(struct tty_struct * tty, int from_user,
-          const unsigned char *buf, int count)
+           unsigned char *buf, int count)
 {
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned long flags;
@@ -1682,7 +1706,7 @@
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 
 #ifdef SERIAL_DEBUG_THROTTLE
   char buf[64];
@@ -1705,12 +1729,13 @@
     channel = info->line - cy_card[card].first_line;
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-	base_addr[CyCAR] = (u_char)channel;
-	base_addr[CyMSVR1] = ~CyRTS;
+	base_addr[CyCAR<<index] = (u_char)channel;
+	base_addr[CyMSVR1<<index] = ~CyRTS;
     restore_flags(flags);
 
     return;
@@ -1723,7 +1748,7 @@
   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
 
 #ifdef SERIAL_DEBUG_THROTTLE
   char buf[64];
@@ -1746,12 +1771,13 @@
     channel = info->line - cy_card[card].first_line;
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-	base_addr[CyCAR] = (u_char)channel;
-	base_addr[CyMSVR1] = CyRTS;
+	base_addr[CyCAR<<index] = (u_char)channel;
+	base_addr[CyMSVR1<<index] = CyRTS;
     restore_flags(flags);
 
     return;
@@ -1827,7 +1853,7 @@
 static int
 get_modem_info(struct cyclades_port * info, unsigned int *value)
 {
-  int card,chip,channel;
+  int card,chip,channel,index;
   unsigned char *base_addr;
   unsigned long flags;
   unsigned char status;
@@ -1837,12 +1863,14 @@
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-                   (cy_card[card].base_addr + cy_chip_offset[chip]);
+                   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     save_flags(flags); cli();
-        base_addr[CyCAR] = (u_char)channel;
-        status = base_addr[CyMSVR1] | base_addr[CyMSVR2];
+        base_addr[CyCAR<<index] = (u_char)channel;
+        status = base_addr[CyMSVR1<<index];
+	status |= base_addr[CyMSVR2<<index];
     restore_flags(flags);
 
     result =  ((status  & CyRTS) ? TIOCM_RTS : 0)
@@ -1851,7 +1879,7 @@
             | ((status  & CyRI) ? TIOCM_RNG : 0)
             | ((status  & CyDSR) ? TIOCM_DSR : 0)
             | ((status  & CyCTS) ? TIOCM_CTS : 0);
-    put_user(result,value);
+    put_fs_long(result,(unsigned long *) value);
     return 0;
 } /* get_modem_info */
 
@@ -1859,34 +1887,35 @@
 set_modem_info(struct cyclades_port * info, unsigned int cmd,
                           unsigned int *value)
 {
-  int card,chip,channel;
+  int card,chip,channel,index;
   unsigned char *base_addr;
   unsigned long flags;
-  unsigned int arg = get_user(value);
+  unsigned int arg = get_fs_long((unsigned long *) value);
 
     card = info->card;
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
+    index = cy_card[card].bus_index;
     base_addr = (unsigned char*)
-                   (cy_card[card].base_addr + cy_chip_offset[chip]);
+                   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
     switch (cmd) {
     case TIOCMBIS:
 	if (arg & TIOCM_RTS){
 	    save_flags(flags); cli();
-		base_addr[CyCAR] = (u_char)channel;
-		base_addr[CyMSVR1] = CyRTS;
+		base_addr[CyCAR<<index] = (u_char)channel;
+		base_addr[CyMSVR1<<index] = CyRTS;
 	    restore_flags(flags);
 	}
 	if (arg & TIOCM_DTR){
 	    save_flags(flags); cli();
-	    base_addr[CyCAR] = (u_char)channel;
+	    base_addr[CyCAR<<index] = (u_char)channel;
 /* CP('S');CP('2'); */
-	    base_addr[CyMSVR2] = CyDTR;
+	    base_addr[CyMSVR2<<index] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: raising DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	    restore_flags(flags);
 	}
@@ -1894,18 +1923,18 @@
     case TIOCMBIC:
 	if (arg & TIOCM_RTS){
 	    save_flags(flags); cli();
-		base_addr[CyCAR] = (u_char)channel;
-		base_addr[CyMSVR1] = ~CyRTS;
+		base_addr[CyCAR<<index] = (u_char)channel;
+		base_addr[CyMSVR1<<index] = ~CyRTS;
 	    restore_flags(flags);
 	}
 	if (arg & TIOCM_DTR){
 	    save_flags(flags); cli();
-	    base_addr[CyCAR] = (u_char)channel;
+	    base_addr[CyCAR<<index] = (u_char)channel;
 /* CP('C');CP('2'); */
-	    base_addr[CyMSVR2] = ~CyDTR;
+	    base_addr[CyMSVR2<<index] = ~CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	    restore_flags(flags);
 	}
@@ -1913,33 +1942,33 @@
     case TIOCMSET:
 	if (arg & TIOCM_RTS){
 	    save_flags(flags); cli();
-		base_addr[CyCAR] = (u_char)channel;
-		base_addr[CyMSVR1] = CyRTS;
+		base_addr[CyCAR<<index] = (u_char)channel;
+		base_addr[CyMSVR1<<index] = CyRTS;
 	    restore_flags(flags);
 	}else{
 	    save_flags(flags); cli();
-		base_addr[CyCAR] = (u_char)channel;
-		base_addr[CyMSVR1] = ~CyRTS;
+		base_addr[CyCAR<<index] = (u_char)channel;
+		base_addr[CyMSVR1<<index] = ~CyRTS;
 	    restore_flags(flags);
 	}
 	if (arg & TIOCM_DTR){
 	    save_flags(flags); cli();
-	    base_addr[CyCAR] = (u_char)channel;
+	    base_addr[CyCAR<<index] = (u_char)channel;
 /* CP('S');CP('3'); */
-	    base_addr[CyMSVR2] = CyDTR;
+	    base_addr[CyMSVR2<<index] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: raising DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	    restore_flags(flags);
 	}else{
 	    save_flags(flags); cli();
-	    base_addr[CyCAR] = (u_char)channel;
+	    base_addr[CyCAR<<index] = (u_char)channel;
 /* CP('C');CP('3'); */
-	    base_addr[CyMSVR2] = ~CyDTR;
+	    base_addr[CyMSVR2<<index] = ~CyDTR;
 #ifdef SERIAL_DEBUG_DTR
             printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	    restore_flags(flags);
 	}
@@ -1977,19 +2006,20 @@
 set_threshold(struct cyclades_port * info, unsigned long value)
 {
    unsigned char *base_addr;
-   int card,channel,chip;
+   int card,channel,chip,index;
    
    card = info->card;
    channel = info->line - cy_card[card].first_line;
    chip = channel>>2;
    channel &= 0x03;
+   index = cy_card[card].bus_index;
    base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
    info->cor3 &= ~CyREC_FIFO;
    info->cor3 |= value & CyREC_FIFO;
-   base_addr[CyCOR3] = info->cor3;
-   write_cy_cmd(base_addr,CyCOR_CHANGE|CyCOR3ch);
+   base_addr[CyCOR3<<index] = info->cor3;
+   write_cy_cmd(base_addr,CyCOR_CHANGE|CyCOR3ch,index);
    return 0;
 }
 
@@ -1997,17 +2027,18 @@
 get_threshold(struct cyclades_port * info, unsigned long *value)
 {
    unsigned char *base_addr;
-   int card,channel,chip;
+   int card,channel,chip,index;
    unsigned long tmp;
    
    card = info->card;
    channel = info->line - cy_card[card].first_line;
    chip = channel>>2;
    channel &= 0x03;
+   index = cy_card[card].bus_index;
    base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
-   tmp = base_addr[CyCOR3] & CyREC_FIFO;
+   tmp = base_addr[CyCOR3<<index] & CyREC_FIFO;
    put_fs_long(tmp,value);
    return 0;
 }
@@ -2030,16 +2061,17 @@
 set_timeout(struct cyclades_port * info, unsigned long value)
 {
    unsigned char *base_addr;
-   int card,channel,chip;
+   int card,channel,chip,index;
    
    card = info->card;
    channel = info->line - cy_card[card].first_line;
    chip = channel>>2;
    channel &= 0x03;
+   index = cy_card[card].bus_index;
    base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
-   base_addr[CyRTPR] = value & 0xff;
+   base_addr[CyRTPR<<index] = value & 0xff;
    return 0;
 }
 
@@ -2047,17 +2079,18 @@
 get_timeout(struct cyclades_port * info, unsigned long *value)
 {
    unsigned char *base_addr;
-   int card,channel,chip;
+   int card,channel,chip,index;
    unsigned long tmp;
    
    card = info->card;
    channel = info->line - cy_card[card].first_line;
    chip = channel>>2;
    channel &= 0x03;
+   index = cy_card[card].bus_index;
    base_addr = (unsigned char*)
-		   (cy_card[card].base_addr + cy_chip_offset[chip]);
+		   (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
-   tmp = base_addr[CyRTPR];
+   tmp = base_addr[CyRTPR<<index];
    put_fs_long(tmp,value);
    return 0;
 }
@@ -2175,8 +2208,8 @@
                 ret_val = error;
                 break;
             }
-            put_user(C_CLOCAL(tty) ? 1 : 0,
-                        (unsigned int *) arg);
+            put_fs_long(C_CLOCAL(tty) ? 1 : 0,
+                        (unsigned long *) arg);
             break;
         case TIOCSSOFTCAR:
             arg = get_fs_long((unsigned long *) arg);
@@ -2283,8 +2316,6 @@
     printk("cyc: %d: decrementing count to %d\n", __LINE__, info->count - 1);
 #endif
     if (--info->count < 0) {
-	printk("cy_close: bad serial port count for ttys%d: %d\n",
-	       info->line, info->count);
 #ifdef SERIAL_DEBUG_COUNT
     printk("cyc: %d: setting count to 0\n", __LINE__);
 #endif
@@ -2302,7 +2333,7 @@
     if (info->flags & ASYNC_CALLOUT_ACTIVE)
 	info->callout_termios = *tty->termios;
     if (info->flags & ASYNC_INITIALIZED)
-	tty_wait_until_sent(tty, 30*HZ); /* 30 seconds timeout */
+	tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
     shutdown(info);
     if (tty->driver.flush_buffer)
 	tty->driver.flush_buffer(tty);
@@ -2380,7 +2411,7 @@
   struct wait_queue wait = { current, NULL };
   struct cyclades_card *cinfo;
   unsigned long flags;
-  int chip, channel;
+  int chip, channel,index;
   int retval;
   char *base_addr;
 
@@ -2454,18 +2485,19 @@
     channel = info->line - cinfo->first_line;
     chip = channel>>2;
     channel &= 0x03;
-    base_addr = (char *) (cinfo->base_addr + cy_chip_offset[chip]);
+    index = cinfo->bus_index;
+    base_addr = (char *) (cinfo->base_addr + (cy_chip_offset[chip]<<index));
 
     while (1) {
 	save_flags(flags); cli();
 	    if (!(info->flags & ASYNC_CALLOUT_ACTIVE)){
-		base_addr[CyCAR] = (u_char)channel;
-		base_addr[CyMSVR1] = CyRTS;
+		base_addr[CyCAR<<index] = (u_char)channel;
+		base_addr[CyMSVR1<<index] = CyRTS;
 /* CP('S');CP('4'); */
-		base_addr[CyMSVR2] = CyDTR;
+		base_addr[CyMSVR2<<index] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
                 printk("cyc: %d: raising DTR\n", __LINE__);
-                printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+                printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1<<index], base_addr[CyMSVR2<<index]);
 #endif
 	    }
 	restore_flags(flags);
@@ -2480,12 +2512,12 @@
 	    break;
 	}
 	save_flags(flags); cli();
-	    base_addr[CyCAR] = (u_char)channel;
-/* CP('L');CP1(1 && C_CLOCAL(tty)); CP1(1 && (base_addr[CyMSVR1] & CyDCD) ); */
+	    base_addr[CyCAR<<index] = (u_char)channel;
+/* CP('L');CP1(1 && C_CLOCAL(tty)); CP1(1 && (base_addr[CyMSVR1<<index] & CyDCD) ); */
 	    if (!(info->flags & ASYNC_CALLOUT_ACTIVE)
 	    && !(info->flags & ASYNC_CLOSING)
 	    && (C_CLOCAL(tty)
-	        || (base_addr[CyMSVR1] & CyDCD))) {
+	        || (base_addr[CyMSVR1<<index] & CyDCD))) {
 		    restore_flags(flags);
 		    break;
 	    }
@@ -2617,20 +2649,19 @@
 /* initialize chips on card -- return number of valid
    chips (which is number of ports/4) */
 int
-cy_init_card(unsigned char *true_base_addr)
+cy_init_card(unsigned char *true_base_addr,int index)
 {
-  volatile unsigned short discard;
   unsigned int chip_number;
   unsigned char* base_addr;
 
-    discard = true_base_addr[Cy_HwReset]; /* Cy_HwReset is 0x1400 */
-    discard = true_base_addr[Cy_ClrIntr]; /* Cy_ClrIntr is 0x1800 */
+    true_base_addr[Cy_HwReset<<index] = 0; /* Cy_HwReset is 0x1400 */
+    true_base_addr[Cy_ClrIntr<<index] = 0; /* Cy_ClrIntr is 0x1800 */
     udelay(500L);
 
     for(chip_number=0; chip_number<CyMaxChipsPerCard; chip_number++){
-        base_addr = true_base_addr + cy_chip_offset[chip_number];
+        base_addr = true_base_addr + (cy_chip_offset[chip_number]<<index);
         udelay(1000L);
-        if(base_addr[CyCCR] != 0x00){
+        if(base_addr[CyCCR<<index] != 0x00){
             /*************
             printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
                chip_number, (unsigned long)base_addr);
@@ -2638,7 +2669,7 @@
             return chip_number;
         }
 
-        base_addr[CyGFRCR] = 0;
+        base_addr[CyGFRCR<<index] = 0;
         udelay(10L);
 
         /* The Cyclom-16Y does not decode address bit 9 and therefore
@@ -2652,25 +2683,31 @@
 	    return chip_number;
         }
 
-        base_addr[CyCCR] = CyCHIP_RESET;
+        base_addr[CyCCR<<index] = CyCHIP_RESET;
         udelay(1000L);
 
-        if(base_addr[CyGFRCR] == 0x00){
+        if(base_addr[CyGFRCR<<index] == 0x00){
+	    /*
             printk(" chip #%d at %#6lx is not responding (GFRCR stayed 0)\n",
                chip_number, (unsigned long)base_addr);
+	    */
             return chip_number;
         }
-        if((0xf0 & base_addr[CyGFRCR]) != 0x40){
+        if((0xf0 & base_addr[CyGFRCR<<index]) != 0x40){
+	    /*
             printk(" chip #%d at %#6lx is not valid (GFRCR == %#2x)\n",
-               chip_number, (unsigned long)base_addr, base_addr[CyGFRCR]);
+               chip_number, (unsigned long)base_addr, base_addr[CyGFRCR<<index]);
+	    */
             return chip_number;
         }
-        base_addr[CyGCR] = CyCH0_SERIAL;
-        base_addr[CyPPR] = 244; /* better value than CyCLOCK_25_1MS * 5
+        base_addr[CyGCR<<index] = CyCH0_SERIAL;
+        base_addr[CyPPR<<index] = 244; /* better value than CyCLOCK_25_1MS * 5
                                                   to run clock at 200 Hz */
 
+	/*
         printk(" chip #%d at %#6lx is rev 0x%2x\n",
-               chip_number, (unsigned long)base_addr, base_addr[CyGFRCR]);
+               chip_number, (unsigned long)base_addr, base_addr[CyGFRCR<<index]);
+	*/
     }
 
     return chip_number;
@@ -2695,15 +2732,9 @@
 long
 cy_init(long kmem_start)
 {
-  struct cyclades_port *info;
+  struct cyclades_port	*info;
   struct cyclades_card *cinfo;
-  int good_ports = 0;
-  int port_num = 0;
-  int index;
-#ifdef notyet
-  struct sigaction sa;
-#endif
-  int retval;
+  int			board,port,i;
 
 scrn[1] = '\0';
     show_version();
@@ -2759,50 +2790,54 @@
     bh_base[CYCLADES_BH].routine = do_cyclades_bh;
     enable_bh(CYCLADES_BH);
 
-    for (index = 0; index < 16; index++) {
-	    IRQ_cards[index] = 0;
+    for (i = 0; i < 16; i++) {
+	    IRQ_cards[i] = 0;
     }
 
-    port_num = 0;
-    info = cy_port;
-    for (index = 0, cinfo = cy_card; index < NR_CARDS; index++,cinfo++) {
-	/*** initialize card ***/
-	if(0 == (cinfo->num_chips =
-		    cy_init_card((unsigned char *)cinfo->base_addr))){
-	    /* this card is not present */
-	    continue;
-	}
-
-#ifndef CY_DONT_PROBE
-	/* find out the board's irq by probing */
-	cinfo->irq = do_auto_irq(index);
-#endif
-
-	/** bind IRQ to card **/
-	if (cinfo->irq) {
-	    retval = request_irq(cinfo->irq, cy_interrupt,
-				SA_INTERRUPT, "cyclades");
-	    if (retval){
-		printk("request_irq returned %d\n",retval);
-		/* return retval; */
-	    }
-	    IRQ_cards[cinfo->irq] = cinfo;
-        }else{
-	    printk("couldn't get board's irq\n");
-	    continue;
-	}
+    for (i = 0; i < NR_CARDS; i++) {
+	    /* base_addr=0 indicates board not found */
+	    cy_card[i].base_addr = 0;
+    }
+
+    /* the code below is responsible to find the boards. Each different
+       type of board has its own detection routine. If a board is found,
+       the next cy_card structure available is set by the detection
+       routine. These funcions are responsible for checking the availability
+       of cy_card and cy_port data structures and updating the
+       cy_next_channel. */
+
+    /* look for isa boards */
+    cy_isa_nboard = cy_detect_isa();
+
+    /* look for pci boards */
+    cy_pci_nboard = cy_detect_pci();
 
-	printk("  share IRQ %d: ", cinfo->irq);
-	good_ports = 4 * cinfo->num_chips;
+    cy_nboard = cy_isa_nboard + cy_pci_nboard;
 
-	if(port_num < NR_PORTS){
-	    cinfo->first_line = port_num;
-	    while( good_ports-- && port_num < NR_PORTS){
-		/*** initialize port ***/
+    /* invalidate remaining cy_card structures */
+    for (i = 0 ; i < NR_CARDS ; i++) {
+	if (cy_card[i].base_addr == 0) {
+		cy_card[i].first_line = -1;
+	}
+    }
+    /* invalidate remaining cy_port structures */
+    for (i = cy_next_channel ; i < NR_PORTS ; i++) {
+	cy_port[i].line = -1;
+	cy_port[i].magic = -1;
+    }
+
+    /* initialize per-port data structures for each valid board found */
+    for (board = 0 ; board < cy_nboard ; board++) {
+	    cinfo = &cy_card[board];
+	    for (port = cinfo->first_line ;
+		 port < cinfo->first_line + 4*cinfo->num_chips ;
+		 port++)
+	    {
+		info = &cy_port[port];
 		info->magic = CYCLADES_MAGIC;
 		info->type = PORT_CIRRUS;
-		info->card = index;
-		info->line = port_num;
+		info->card = board;
+		info->line = port;
 		info->flags = STD_COM_FLAGS;
 		info->tty = 0;
 		info->xmit_fifo_size = 12;
@@ -2833,41 +2868,208 @@
 		info->close_wait = 0;
 		/* info->session */
 		/* info->pgrp */
-/*** !!!!!!!! this may expose new bugs !!!!!!!!! *********/
 		info->read_status_mask = CyTIMEOUT| CySPECHAR| CyBREAK
                                        | CyPARITY| CyFRAME| CyOVERRUN;
 		/* info->timeout */
-
-		printk("ttyC%1d ", info->line);
-		port_num++;info++;
-		if(!(port_num & 7)){
-		    printk("\n               ");
-		}
 	    }
-	}else{
-	    cinfo->first_line = -1;
-	}
-	printk("\n");
-    }
-    while( port_num < NR_PORTS){
-	info->line = -1;
-	port_num++;info++;
     }
     return kmem_start;
     
 } /* cy_init */
 
+/*
+ * ---------------------------------------------------------------------
+ * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
+ * sets global variables and return the number of ISA boards found.
+ * ---------------------------------------------------------------------
+ */
+int
+cy_detect_isa()
+{
+  unsigned int		cy_isa_irq,nboard;
+  unsigned char		*cy_isa_address;
+  unsigned short	i,j,cy_isa_nchan;
+
+	nboard = 0;
+
+	/* scan the address table probing for Cyclom-Y/ISA boards */
+	for (i = 0 ; i < NR_ISA_ADDRESSES ; i++) {
+		cy_isa_address = cy_isa_addresses[i];
+		if (cy_isa_address  == 0x0000) {
+			return(nboard);
+		}
+
+		/* probe for CD1400... */
+		cy_isa_nchan = 4 * cy_init_card(cy_isa_address,0);
+		if (cy_isa_nchan == 0) {
+			continue;
+		}
+
+		/* find out the board's irq by probing */
+		cy_isa_irq = do_auto_irq(cy_isa_address);
+		if (cy_isa_irq == 0) {
+			printk("Cyclom-Y/ISA found at 0x%x but the IRQ could not be detected.\n",
+				(unsigned int) cy_isa_address);
+			continue;
+		}
+
+		if((cy_next_channel+cy_isa_nchan) > NR_PORTS) {
+			printk("Cyclom-Y/ISA found at 0x%x but no more channel structures are available.\n",
+				(unsigned int) cy_isa_address);
+			return(nboard);
+		}
+		/* fill the next cy_card structure available */
+		for (j = 0 ; j < NR_CARDS ; j++) {
+			if (cy_card[j].base_addr == 0)	break;
+		}
+		if (j == NR_CARDS) {	/* no more cy_cards available */
+			printk("Cyclom-Y/ISA found at 0x%x but no more card structures are available.\n",
+				(unsigned int) cy_isa_address);
+			return(nboard);
+		}
+
+		/* allocate IRQ */
+		if(request_irq(cy_isa_irq,cy_interrupt,SA_INTERRUPT,"cyclades"))
+		{
+			printk("Cyclom-Y/ISA found at 0x%x but could not allocate interrupt IRQ#%d.\n",
+				(unsigned int) cy_isa_address,cy_isa_irq);
+			return(nboard);
+		}
+
+		/* set cy_card */
+		cy_card[j].base_addr = (int) cy_isa_address;
+		cy_card[j].irq = (int) cy_isa_irq;
+		cy_card[j].bus_index = 0;
+		cy_card[j].first_line = cy_next_channel;
+		cy_card[j].num_chips = cy_isa_nchan/4;
+	        IRQ_cards[cy_isa_irq] = &cy_card[j];
+		nboard++;
+			
+		/* print message */
+		printk("Cyclom-Y/ISA #%d: 0x%x-0x%x, IRQ%d, %d channels starting from port %d.\n",
+			j+1,(unsigned int) cy_isa_address,
+			(unsigned int)(cy_isa_address + 0x1fff),
+			cy_isa_irq,cy_isa_nchan,cy_next_channel);
+		cy_next_channel += cy_isa_nchan;
+	}
+	return(nboard);
+
+}
+
+/*
+ * ---------------------------------------------------------------------
+ * cy_detect_pci() - Test PCI bus presence and Cyclom-Ye/PCI.
+ * sets global variables and return the number of PCI boards found.
+ * ---------------------------------------------------------------------
+ */
+int
+cy_detect_pci()
+{
+  unsigned char		cyy_bus, cyy_dev_fn, cyy_rev_id;
+  unsigned long		pci_intr_ctrl;
+  unsigned char		cy_pci_irq;
+  unsigned long		cy_pci_address,cy_pci_io;
+  unsigned short	i,j,cy_pci_nchan;
+
+#ifndef CONFIG_PCI
+	printk ("Kernel without PCI support.\n");
+	return(0);
+#else
+	if(pcibios_present() == 0) {	/* PCI bus not present */
+	 	return(0);
+	}
+	for (i = 0; i < NR_CARDS; i++) {
+		/* look for a Cyclom-Y card by vendor and device id */
+		if(pcibios_find_device (PCI_VENDOR_ID_CYCLADES,
+					PCI_DEVICE_ID_CYCLOMY,i,
+					&cyy_bus, &cyy_dev_fn) != 0)
+		{
+			break;
+		}
+		/* read PCI configuration area */
+		pcibios_read_config_byte(cyy_bus, cyy_dev_fn,
+				 PCI_INTERRUPT_LINE, &cy_pci_irq);
+		pcibios_read_config_dword(cyy_bus, cyy_dev_fn,
+				  PCI_BASE_ADDRESS_1, &cy_pci_io);
+		pcibios_read_config_dword(cyy_bus, cyy_dev_fn,
+				  PCI_BASE_ADDRESS_2, &cy_pci_address);
+		pcibios_read_config_byte(cyy_bus, cyy_dev_fn,
+				  PCI_REVISION_ID, &cyy_rev_id);
+		cy_pci_address &= 0xfffffff0;
+		cy_pci_io  &= 0xfffffffc;
+		cy_pci_nchan = 4 * cy_init_card((unsigned char *)
+						cy_pci_address,1);
+		if(cy_pci_nchan == 0) {
+			printk("Cyclom-Y PCI host card with no Serial-Modules at 0x%x.\n",
+				(unsigned int) cy_pci_address);
+			continue;
+		}
+		if((cy_next_channel+cy_pci_nchan) > NR_PORTS) {
+			printk("Cyclom-Y/PCI found at 0x%x but no more channel structures are available.\n",
+				(unsigned int) cy_pci_address);
+			return(i);
+		}
+#ifdef CY_PCI_DEBUG
+		printk("Cyclom-Ye/PCI #%d (bus=0x0%x, pci_id=0x%x, rev_id=%d).\n",
+			i+1,cyy_bus,cyy_dev_fn,cyy_rev_id);
+		printk("Cyclom-Ye/PCI: found at 0x%x, IRQ%d, ioaddr = 0x%lx.\n",
+			cy_pci_address,(int)cy_pci_irq,cy_pci_io);
+#endif
+		/* fill the next cy_card structure available */
+		for (j = 0 ; j < NR_CARDS ; j++) {
+			if (cy_card[j].base_addr == 0)	break;
+		}
+		if (j == NR_CARDS) {	/* no more cy_cards available */
+			printk("Cyclom-Y/PCI found at 0x%x but no more card structures are available.\n",
+				(unsigned int) cy_pci_address);
+			return(i);
+		}
+
+		/* allocate IRQ */
+		if(request_irq(cy_pci_irq,cy_interrupt,SA_INTERRUPT,"cyclades"))
+		{
+			printk("Cyclom-Y/PCI found at 0x%x but could not allocate interrupt IRQ%d.\n",
+				(unsigned int) cy_pci_address,cy_pci_irq);
+			return(i);
+		}
+
+		/* set cy_card */
+		cy_card[j].base_addr = (int) cy_pci_address;
+		cy_card[j].irq = (int) cy_pci_irq;
+		cy_card[j].bus_index = 1;
+		cy_card[j].first_line = cy_next_channel;
+		cy_card[j].num_chips = cy_pci_nchan/4;
+	        IRQ_cards[cy_pci_irq] = &cy_card[j];
+
+		/* enable interrupts in the PCI interface */
+		outw(inw(cy_pci_io+0x68)|0x0900,cy_pci_io+0x68);
+		pci_intr_ctrl = (unsigned long)(inw(cy_pci_io+0x68) | inw(cy_pci_io+0x6a)<<16);
+
+		/* print message */
+		printk("Cyclom-Y/PCI #%d: 0x%x-0x%x, IRQ%d, %d channels starting from port %d.\n",
+			j+1,(unsigned int) cy_pci_address,
+			(unsigned int)(cy_pci_address + 0x3fff),
+			(int)cy_pci_irq,cy_pci_nchan,cy_next_channel);
+
+		cy_next_channel += cy_pci_nchan;
+	}
+	return(i);
+#endif /* ifndef CONFIG_PCI */
+}
+
+
 #ifdef CYCLOM_SHOW_STATUS
 static void
 show_status(int line_num)
 {
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
   struct cyclades_port * info;
   unsigned long flags;
 
     info = &cy_port[line_num];
     card = info->card;
+    index = cy_card[card].bus_index;
     channel = (info->line) - (cy_card[card].first_line);
     chip = channel>>2;
     channel &= 0x03;
@@ -2899,58 +3101,58 @@
     save_flags(flags); cli();
 
 	base_addr = (unsigned char*)
-		       (cy_card[card].base_addr + cy_chip_offset[chip]);
+		       (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
 
 /* Global Registers */
 
-	printk(" CyGFRCR %x\n", base_addr[CyGFRCR]);
-	printk(" CyCAR %x\n", base_addr[CyCAR]);
-	printk(" CyGCR %x\n", base_addr[CyGCR]);
-	printk(" CySVRR %x\n", base_addr[CySVRR]);
-	printk(" CyRICR %x\n", base_addr[CyRICR]);
-	printk(" CyTICR %x\n", base_addr[CyTICR]);
-	printk(" CyMICR %x\n", base_addr[CyMICR]);
-	printk(" CyRIR %x\n", base_addr[CyRIR]);
-	printk(" CyTIR %x\n", base_addr[CyTIR]);
-	printk(" CyMIR %x\n", base_addr[CyMIR]);
-	printk(" CyPPR %x\n", base_addr[CyPPR]);
+	printk(" CyGFRCR %x\n", base_addr[CyGFRCR<<index]);
+	printk(" CyCAR %x\n", base_addr[CyCAR<<index]);
+	printk(" CyGCR %x\n", base_addr[CyGCR<<index]);
+	printk(" CySVRR %x\n", base_addr[CySVRR<<index]);
+	printk(" CyRICR %x\n", base_addr[CyRICR<<index]);
+	printk(" CyTICR %x\n", base_addr[CyTICR<<index]);
+	printk(" CyMICR %x\n", base_addr[CyMICR<<index]);
+	printk(" CyRIR %x\n", base_addr[CyRIR<<index]);
+	printk(" CyTIR %x\n", base_addr[CyTIR<<index]);
+	printk(" CyMIR %x\n", base_addr[CyMIR<<index]);
+	printk(" CyPPR %x\n", base_addr[CyPPR<<index]);
 
-	base_addr[CyCAR] = (u_char)channel;
+	base_addr[CyCAR<<index] = (u_char)channel;
 
 /* Virtual Registers */
 
-	printk(" CyRIVR %x\n", base_addr[CyRIVR]);
-	printk(" CyTIVR %x\n", base_addr[CyTIVR]);
-	printk(" CyMIVR %x\n", base_addr[CyMIVR]);
-	printk(" CyMISR %x\n", base_addr[CyMISR]);
+	printk(" CyRIVR %x\n", base_addr[CyRIVR<<index]);
+	printk(" CyTIVR %x\n", base_addr[CyTIVR<<index]);
+	printk(" CyMIVR %x\n", base_addr[CyMIVR<<index]);
+	printk(" CyMISR %x\n", base_addr[CyMISR<<index]);
 
 /* Channel Registers */
 
-	printk(" CyCCR %x\n", base_addr[CyCCR]);
-	printk(" CySRER %x\n", base_addr[CySRER]);
-	printk(" CyCOR1 %x\n", base_addr[CyCOR1]);
-	printk(" CyCOR2 %x\n", base_addr[CyCOR2]);
-	printk(" CyCOR3 %x\n", base_addr[CyCOR3]);
-	printk(" CyCOR4 %x\n", base_addr[CyCOR4]);
-	printk(" CyCOR5 %x\n", base_addr[CyCOR5]);
-	printk(" CyCCSR %x\n", base_addr[CyCCSR]);
-	printk(" CyRDCR %x\n", base_addr[CyRDCR]);
-	printk(" CySCHR1 %x\n", base_addr[CySCHR1]);
-	printk(" CySCHR2 %x\n", base_addr[CySCHR2]);
-	printk(" CySCHR3 %x\n", base_addr[CySCHR3]);
-	printk(" CySCHR4 %x\n", base_addr[CySCHR4]);
-	printk(" CySCRL %x\n", base_addr[CySCRL]);
-	printk(" CySCRH %x\n", base_addr[CySCRH]);
-	printk(" CyLNC %x\n", base_addr[CyLNC]);
-	printk(" CyMCOR1 %x\n", base_addr[CyMCOR1]);
-	printk(" CyMCOR2 %x\n", base_addr[CyMCOR2]);
-	printk(" CyRTPR %x\n", base_addr[CyRTPR]);
-	printk(" CyMSVR1 %x\n", base_addr[CyMSVR1]);
-	printk(" CyMSVR2 %x\n", base_addr[CyMSVR2]);
-	printk(" CyRBPR %x\n", base_addr[CyRBPR]);
-	printk(" CyRCOR %x\n", base_addr[CyRCOR]);
-	printk(" CyTBPR %x\n", base_addr[CyTBPR]);
-	printk(" CyTCOR %x\n", base_addr[CyTCOR]);
+	printk(" CyCCR %x\n", base_addr[CyCCR<<index]);
+	printk(" CySRER %x\n", base_addr[CySRER<<index]);
+	printk(" CyCOR1 %x\n", base_addr[CyCOR1<<index]);
+	printk(" CyCOR2 %x\n", base_addr[CyCOR2<<index]);
+	printk(" CyCOR3 %x\n", base_addr[CyCOR3<<index]);
+	printk(" CyCOR4 %x\n", base_addr[CyCOR4<<index]);
+	printk(" CyCOR5 %x\n", base_addr[CyCOR5<<index]);
+	printk(" CyCCSR %x\n", base_addr[CyCCSR<<index]);
+	printk(" CyRDCR %x\n", base_addr[CyRDCR<<index]);
+	printk(" CySCHR1 %x\n", base_addr[CySCHR1<<index]);
+	printk(" CySCHR2 %x\n", base_addr[CySCHR2<<index]);
+	printk(" CySCHR3 %x\n", base_addr[CySCHR3<<index]);
+	printk(" CySCHR4 %x\n", base_addr[CySCHR4<<index]);
+	printk(" CySCRL %x\n", base_addr[CySCRL<<index]);
+	printk(" CySCRH %x\n", base_addr[CySCRH<<index]);
+	printk(" CyLNC %x\n", base_addr[CyLNC<<index]);
+	printk(" CyMCOR1 %x\n", base_addr[CyMCOR1<<index]);
+	printk(" CyMCOR2 %x\n", base_addr[CyMCOR2<<index]);
+	printk(" CyRTPR %x\n", base_addr[CyRTPR<<index]);
+	printk(" CyMSVR1 %x\n", base_addr[CyMSVR1<<index]);
+	printk(" CyMSVR2 %x\n", base_addr[CyMSVR2<<index]);
+	printk(" CyRBPR %x\n", base_addr[CyRBPR<<index]);
+	printk(" CyRCOR %x\n", base_addr[CyRCOR<<index]);
+	printk(" CyTBPR %x\n", base_addr[CyTBPR<<index]);
+	printk(" CyTCOR %x\n", base_addr[CyTCOR<<index]);
 
     restore_flags(flags);
 } /* show_status */
diff -u --recursive --new-file v1.3.24/linux/drivers/char/scc.c linux/drivers/char/scc.c
--- v1.3.24/linux/drivers/char/scc.c	Sun Sep  3 12:26:52 1995
+++ linux/drivers/char/scc.c	Fri Sep  8 08:02:05 1995
@@ -1,7 +1,7 @@
 #include <linux/autoconf.h>	/* fastest method */
 #ifdef CONFIG_SCC
 
-#define RCS_ID "$Id: scc.c,v 1.25 1995/08/24 21:05:00 jreuter Exp jreuter $"
+#define RCS_ID "$Id: scc.c,v 1.26 1995/09/07 14:46:19 jreuter Exp jreuter $"
 
 #define BANNER "Z8530 SCC driver v1.9.dl1bke (beta) by dl1bke\n"
 
@@ -155,7 +155,7 @@
 #include <linux/kernel.h>
 
 #ifndef Z8530_MAJOR
-#define Z8530_MAJOR 22
+#define Z8530_MAJOR 34
 #endif
 
 long scc_init(long kmem_start);
diff -u --recursive --new-file v1.3.24/linux/drivers/net/3c501.c linux/drivers/net/3c501.c
--- v1.3.24/linux/drivers/net/3c501.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/3c501.c	Thu Sep  7 17:11:47 1995
@@ -289,8 +289,9 @@
 	printk("%s", version);
 
     /* Initialize the device structure. */
+    dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
     if (dev->priv == NULL)
-	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+	return -ENOMEM;
     memset(dev->priv, 0, sizeof(struct net_local));
 
     /* The EL1-specific entries in the device structure. */
diff -u --recursive --new-file v1.3.24/linux/drivers/net/3c505.c linux/drivers/net/3c505.c
--- v1.3.24/linux/drivers/net/3c505.c	Sun Sep  3 12:26:53 1995
+++ linux/drivers/net/3c505.c	Thu Sep  7 17:11:47 1995
@@ -1257,6 +1257,8 @@
 	 */
 	adapter = (elp_device *)(dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL));
 	CHECK_NULL(adapter);
+	if (adapter == NULL)
+		return -ENOMEM;
 	memset(&(adapter->stats), 0, sizeof(struct enet_statistics));
 
 	/*
@@ -1492,6 +1494,8 @@
 	else
 	{
 		unregister_netdev(&dev_3c505);
+		kfree(dev_3c505.priv);
+		dev_3c505.priv = NULL;
 
 		/* If we don't do this, we can't re-insmod it later. */
 		release_region(dev_3c505.base_addr, ELP_IO_EXTENT);
diff -u --recursive --new-file v1.3.24/linux/drivers/net/3c507.c linux/drivers/net/3c507.c
--- v1.3.24/linux/drivers/net/3c507.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/3c507.c	Thu Sep  7 17:11:47 1995
@@ -416,8 +416,9 @@
 		printk(version);
 
 	/* Initialize the device structure. */
+	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 	if (dev->priv == NULL)
-		dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 
 	dev->open		= el16_open;
@@ -914,6 +915,8 @@
 	else
 	{
 		unregister_netdev(&dev_3c507);
+		kfree(dev_3c507.priv);
+		dev_3c507.priv = NULL;
 
 		/* If we don't do this, we can't re-insmod it later. */
 		free_irq(dev_3c507.irq);
diff -u --recursive --new-file v1.3.24/linux/drivers/net/3c509.c linux/drivers/net/3c509.c
--- v1.3.24/linux/drivers/net/3c509.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/3c509.c	Thu Sep  7 17:11:47 1995
@@ -249,6 +249,8 @@
 
 	/* Make up a EL3-specific-data structure. */
 	dev->priv = kmalloc(sizeof(struct el3_private), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct el3_private));
 
 	if (el3_debug > 0)
diff -u --recursive --new-file v1.3.24/linux/drivers/net/8390.c linux/drivers/net/8390.c
--- v1.3.24/linux/drivers/net/8390.c	Sun Aug 13 14:45:30 1995
+++ linux/drivers/net/8390.c	Thu Sep  7 17:11:47 1995
@@ -597,6 +597,8 @@
 		struct ei_device *ei_local;
 		
 		dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
+		if (dev->priv == NULL)
+			return -ENOMEM;
 		memset(dev->priv, 0, sizeof(struct ei_device));
 		ei_local = (struct ei_device *)dev->priv;
 		ei_local->pingpong = ei_pingpong;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v1.3.24/linux/drivers/net/Makefile	Thu Sep  7 17:17:17 1995
+++ linux/drivers/net/Makefile	Sat Sep  9 09:37:24 1995
@@ -12,6 +12,13 @@
 M_OBJS   :=
 MOD_LIST_NAME := NET_MODULES
 
+# Need these to keep track of whether the 8390 and SLHC modules should
+# really go in the kernel or a module.
+CONFIG_8390_BUILTIN :=
+CONFIG_8390_MODULE  :=
+CONFIG_SLHC_BUILTIN :=
+CONFIG_SLHC_MODULE  :=
+
 ifeq ($(CONFIG_SEEQ8005),y)
 L_OBJS += seeq8005.o
 endif
@@ -46,70 +53,70 @@
 
 ifeq ($(CONFIG_WD80x3),y)
 L_OBJS += wd.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_WD80x3),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += wd.o
   endif
 endif
 
 ifeq ($(CONFIG_EL2),y)
 L_OBJS += 3c503.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_EL2),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += 3c503.o
   endif
 endif
 
 ifeq ($(CONFIG_NE2000),y)
 L_OBJS += ne.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_NE2000),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += ne.o
   endif
 endif
 
 ifeq ($(CONFIG_HPLAN),y)
 L_OBJS += hp.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_HPLAN),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += hp.o
   endif
 endif
 
 ifeq ($(CONFIG_HPLAN_PLUS),y)
 L_OBJS += hp-plus.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_HPLAN_PLUS),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += hp-plus.o
   endif
 endif
 
 ifeq ($(CONFIG_ULTRA),y)
 L_OBJS += smc-ultra.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_ULTRA),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += smc-ultra.o
   endif
 endif
 
 ifeq ($(CONFIG_E2100),y)
 L_OBJS += e2100.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_E2100),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += e2100.o
   endif
 endif
@@ -124,27 +131,27 @@
 
 ifeq ($(CONFIG_PPP),y)
 L_OBJS += ppp.o
-CONFIG_SLHC = y
+CONFIG_SLHC_BUILTIN = y
 else
   ifeq ($(CONFIG_PPP),m)
-  CONFIG_SLHC = m
+  CONFIG_SLHC_MODULE = y
   M_OBJS += ppp.o
   endif
 endif
 
 ifeq ($(CONFIG_SLIP),y)
 L_OBJS += slip.o
-CONFIG_SLHC = y
+CONFIG_SLHC_BUILTIN = y
 else
   ifeq ($(CONFIG_SLIP),m)
-  CONFIG_SLHC = m
+  CONFIG_SLHC_MODULE = y
   M_OBJS += slip.o
   endif
 endif
 
 ifeq ($(CONFIG_DE650),y)
 ETDRV_OBJS := $(L_OBJS) de650.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 endif
 
 ifeq ($(CONFIG_3C589),y)
@@ -289,10 +296,10 @@
 
 ifeq ($(CONFIG_AC3200),y)
 L_OBJS += ac3200.o
-CONFIG_8390 = y
+CONFIG_8390_BUILTIN = y
 else
   ifeq ($(CONFIG_AC3200),m)
-  CONFIG_8390 = m
+  CONFIG_8390_MODULE = y
   M_OBJS += ac3200.o
   endif
 endif
@@ -326,21 +333,28 @@
 CONFIG_PI = CONFIG_PI
 endif
 
-ifeq ($(CONFIG_SLHC),y)
+
+# If anything built-in uses slhc, then build it into the kernel also.
+# If not, but a module uses it, build as a module.
+ifdef CONFIG_SLHC_BUILTIN
 L_OBJS += slhc.o
 else
-  ifeq ($(CONFIG_SLHC),m)
+  ifdef CONFIG_SLHC_MODULE
   M_OBJS += slhc.o
   endif
 endif
 
-ifeq ($(CONFIG_8390),y)
+
+# If anything built-in uses the 8390, then build it into the kernel also.
+# If not, but a module uses it, build as a module.
+ifdef CONFIG_8390_BUILTIN
 L_OBJS += 8390.o
 else
-  ifeq ($(CONFIG_8390),m)
+  ifdef CONFIG_8390_MODULE
   M_OBJS += 8390.o
   endif
 endif
+
 
 ifeq ($(CONFIG_EQUALIZER),y)
 L_OBJS += eql.o
diff -u --recursive --new-file v1.3.24/linux/drivers/net/arcnet.c linux/drivers/net/arcnet.c
--- v1.3.24/linux/drivers/net/arcnet.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/arcnet.c	Fri Sep  8 07:42:57 1995
@@ -16,79 +16,40 @@
         modified by SRC, incorporated herein by reference.
          
 	**********************
-	
-	v1.93 ALPHA (95/08/10)
-	  - Should work with both 1.2.x and 1.3.x now. (I hope)
-	  - Renamed arc0w ("Windows" protocol) to arc0e ("Ethernet-Encap")
-	    because the protocol used isn't necessarily limited to
-	    Microsoft.
-
-	v1.92 ALPHA (95/07/11)
-	  - Fixes to make things work with kernel 1.3.x.  Completely broke
-	    1.2.x support.  Oops?  1.2.x users keep using 1.91 ALPHA until I
-	    get out a version that supports both.
-
-	v1.91 ALPHA (95/07/02)
-	  - Oops.  Exception packets hit us again!  I remembered to test
-	    them in ethernet-protocol mode, but due to the many various
-	    changes they broke in RFC1201 instead.  All fixed.
-	  - A long-standing bug with "exception" packets not setting
-	    protocol_id properly has been corrected.  This would have caused
-	    random problems talking to non-Linux servers.  I've also sent in
-	    a patch to fix this in the latest stable ARCnet (now 1.02).
-	  - ARC_P_IPX is an RFC1201 protocol too.  Thanks, Tomasz.
-	  - We're now "properly" (I think) handling the multiple 'tbusy' and
-	    'start' flags (one for each protocol device) better.
-	  - The driver should now start without a NULL-pointer dereference
-	    if you aren't connected to the network.
+
+	v2.00 (95/09/06)
+	  - THIS IS ONLY A SUMMARY.  The complete changelog is available
+	    from me upon request.
+
+	  - ARCnet RECON messages are now detected and logged.  These occur
+	    when a new computer is powered up on the network, or in a
+	    constant stream when the network cable is broken.  Thanks to
+	    Tomasz Motylewski for this.  You must have D_EXTRA enabled
+	    if you want these messages sent to syslog, otherwise they will
+	    only show up in the network statistics (/proc/net/dev).
+	  - The TX Acknowledge flag is now checked, and a log message is sent
+	    if a completed transmit is not ACK'd.  (I have yet to have this
+	    happen to me.)
+	  - Debug levels are now completely different.  See the README.
+	  - Many code cleanups, with several no-longer-necessary and some
+	    completely useless options removed.
+	  - Multiprotocol support.  You can now use the "arc0e" device to
+	    send "Ethernet-Encapsulation" packets, which are compatible with
+	    Windows for Workgroups and LAN Manager, and possibly other
+	    software.  See the README for more information.
+	  - Documentation updates and improvements.
 	  
-	v1.90 ALPHA (95/06/18)
-	  - Removal of some outdated and messy config options (no one has
-	    ever complained about the defaults since they were introduced):
-	    DANGER_PROBE, EXTRA_DELAYS, IRQ_XMIT, CAREFUL_XMIT,
-	    STRICT_MEM_DETECT, LIMIT_MTU, USE_TIMER_HANDLER.  Also took out
-	    a few "#if 0" sections which are no longer useful.
-	  - Cleaned up debug levels - now instead of levels, there are
-	    individual flags.  Watch out when changing with ifconfig.
-	  - More cleanups and beautification.  Removed more dead code and
-	    made sure every function was commented.
-	  - Fixed the DETECT_RECONFIGS option so that it actually _won't_
-	    detect reconfigs.  Previously, the RECON irq would be disabled
-	    but the recon messages would still be logged on the next normal
-	    IRQ.
-	  - Initial support for "multiprotocol" ARCnet (this involved a LOT
-	    of reorganizing!).  Added an arc0w device, which allows us to
-	    talk to ethernet-over-ARCnet TCP/IP protocol.  To use it, ifconfig
-	    arc0 and arc0w (in that order).  For now, ethernet-protocol
-	    hosts should have routes through arc0w - eventually I hope to
-	    make things more automatic.
-	v1.11 ALPHA (95/06/07)
-	  - Tomasz saves the day again with patches to fix operation if the
-	    new VERIFY_ACK option is disabled.
-	  - LOTS of little code cleanups/improvements by Tomasz.
-	  - Changed autoprobe, since the "never-changing command port"
-	    probe was causing problems for some people.  I also reset the
-	    card fewer times during the probe if DANGER_PROBE is defined,
-	    since DANGER_PROBE seems to be a more reliable method anyway.
-	  - It looks like the null-pointer problem was finally REALLY fixed
-	    by some change from Linux 1.2.8 to 1.2.9.  How handy!
-	v1.10 ALPHA (95/04/15)
-	  - Fixed (?) some null-pointer dereference bugs
-	  - Added better network error detection (from Tomasz) - in
-	    particular, we now notice when our network isn't connected,
-	    also known as a "network reconfiguration."
-	  - We now increment lp->stats.tx_dropped in several more places,
-	    on a suggestion from Tomasz.
-	  - Minor cleanups/spelling fixes.
-	  - We now monitor the TXACK bit in the status register: we don't do
-	    anything with it yet, just notice when a transmitted packet isn't
-	    acknowledged.
-	  - Minor fix with sequence numbers (sometimes they were being sent in
-	    the wrong order due to Linux's packet queuing).
+	v1.02 (95/06/21)
+          - A fix to make "exception" packets sent from Linux receivable
+	    on other systems.  (The protocol_id byte was sometimes being set
+	    incorrectly, and Linux wasn't checking it on receive so it
+	    didn't show up)
+
 	v1.01 (95/03/24)
 	  - Fixed some IPX-related bugs. (Thanks to Tomasz Motylewski
             <motyl@tichy.ch.uj.edu.pl> for the patches to make arcnet work
             with dosemu!)
+            
 	v1.00 (95/02/15)
 	  - Initial non-alpha release.
 	
@@ -96,14 +57,15 @@
 	TO DO:
 	
          - Test in systems with NON-ARCnet network cards, just to see if
-           autoprobe kills anything.  Currently, we do cause some NE2000's to
-           die.
+           autoprobe kills anything.  Currently, we do cause some NE2000's
+           to die.  Autoprobe is also way too slow and verbose, particularly
+           if there ARE no ARCnet cards.
          - What about cards with shared memory that can be "turned off?"
          - NFS mount freezes after several megabytes to SOSS for DOS. 
  	   unmount/remount fixes it.  Is this arcnet-specific?  I don't know.
          - Add support for "old" (RFC1051) protocol arcnet, such as AmiTCP
            and NetBSD.  Work in Tomasz' initial support for this.
-         - How about TCP/IP over netbios?
+         - How about TCP/IP over netbios?  Or vice versa?
          - Some newer ARCnets support promiscuous mode, supposedly. 
            If someone sends me information, I'll try to implement it.
          - Remove excess lock variables that are probably not necessary
@@ -131,7 +93,7 @@
 */
 
 static const char *version =
- "arcnet.c:v1.93 ALPHA 95/08/10 Avery Pennarun <apenwarr@foxnet.net>\n";
+ "arcnet.c:v2.00 95/09/06 Avery Pennarun <apenwarr@foxnet.net>\n";
 
 /**************************************************************************/
 
@@ -159,7 +121,8 @@
 #define VERIFY_ACK
 
 /* Define this if you want to make it easier to use the "call trace" when
- * a kernel NULL pointer assignment occurs.
+ * a kernel NULL pointer assignment occurs.  Hopefully unnecessary, most of
+ * the time.
  */
 #undef static
 
@@ -204,7 +167,11 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 
+#ifdef LINUX12
+#include "arp.h"
+#else
 #include <net/arp.h>
+#endif
 
 
 /* new debugging bitflags: each option can be enabled individually.
@@ -215,7 +182,7 @@
  *		and HOSTNAME is your hostname/ip address
  * and then resetting your routes.
  */
-#define D_NORMAL	1	/* D_NORMAL  startup announcement	*/
+#define D_NORMAL	1	/* D_NORMAL  normal operational info	*/
 #define	D_INIT		2	/* D_INIT    show init/probe messages	*/
 #define D_EXTRA		4	/* D_EXTRA   extra information		*/
 /* debug levels past this point give LOTS of output! */
@@ -224,10 +191,11 @@
 #define D_RX		32	/* D_RX	     show rx packets		*/
 #define D_SKB		64	/* D_SKB     dump skb's			*/
 
-#ifndef NET_DEBUG
-#define NET_DEBUG D_NORMAL|D_INIT|D_EXTRA
+#ifndef ARCNET_DEBUG
+/*#define ARCNET_DEBUG D_NORMAL|D_INIT|D_EXTRA*/
+#define ARCNET_DEBUG D_NORMAL|D_INIT
 #endif
-int arcnet_debug = NET_DEBUG;
+int arcnet_debug = ARCNET_DEBUG;
 
 #ifndef HAVE_AUTOIRQ
 /* From auto_irq.c, in ioport.h for later versions. */
@@ -342,7 +310,7 @@
 #define ARC_P_IPX	250		/* 0xFA */
 
 	/* MS LanMan/WfWg protocol */
-#define ARC_P_MS_TCPIP	0xE8
+#define ARC_P_ETHER	0xE8
 
 	/* Unsupported/indirectly supported protocols */
 #define ARC_P_LANSOFT	251		/* 0xFB */
@@ -542,16 +510,29 @@
 	int delayval;
 	struct arcnet_local *lp;
 
+#if 0
 	BUGLVL(D_NORMAL)
 	{
 		printk(version);
 		printk("arcnet: ***\n");
-		printk("arcnet: * Read linux/drivers/net/README.arcnet for important release notes!\n");
+		printk("arcnet: * Read README.arcnet for important release notes!\n");
 		printk("arcnet: *\n");
-		printk("arcnet: * This is an ALPHA version!  (Last stable release: v1.02)  E-mail me if\n");
+		printk("arcnet: * This is an ALPHA version!  (Last stable release: v2.00)  E-mail me if\n");
 		printk("arcnet: * you have any questions, comments, or bug reports.\n");
 		printk("arcnet: ***\n");
 	}
+#else
+	BUGLVL(D_INIT)
+	{
+		printk(version);
+		printk("arcnet: ***\n");
+		printk("arcnet: * Read README.arcnet for important release notes!\n");
+		printk("arcnet: *\n");
+		printk("arcnet: * This version should be stable, but please e-mail\n");
+		printk("arcnet: * me if you have any questions or comments.\n");
+		printk("arcnet: ***\n");
+	}
+#endif
 
 	BUGLVL(D_INIT)
 		printk("arcnet: given: base %lXh, IRQ %Xh, shmem %lXh\n",
@@ -633,6 +614,8 @@
 
 	/* Initialize the device structure. */
 	dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct arcnet_local));
 	lp=(struct arcnet_local *)(dev->priv);
 
@@ -985,8 +968,15 @@
 	
 	/* Initialize the ethernet-encap protocol driver */
 	lp->edev=(struct device *)kmalloc(sizeof(struct device),GFP_KERNEL);
+	if (lp->edev == NULL)
+		return -ENOMEM;
 	memcpy(lp->edev,dev,sizeof(struct device));
 	lp->edev->name=(char *)kmalloc(10,GFP_KERNEL);
+	if (lp->edev->name == NULL) {
+		kfree(lp->edev);
+		lp->edev = NULL;
+		return -ENOMEM;
+	}
 	sprintf(lp->edev->name,"%se",dev->name);
 	lp->edev->init=arcnetE_init;
 	register_netdev(lp->edev);
@@ -1009,7 +999,7 @@
 {
 	int ioaddr = dev->base_addr;
 	struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
-
+	
 	TBUSY=1;
 	START=0;
 	
@@ -1025,13 +1015,14 @@
 	/* free the ethernet-encap protocol device */
 	lp->edev->start=0;
 	lp->edev->priv=NULL;
+	dev_close(lp->edev);
 	unregister_netdev(lp->edev);
 	kfree(lp->edev->name);
 	kfree(lp->edev);
 	lp->edev=NULL;
 
 	/* Update the statistics here. */
-	
+
 #ifdef MODULE
 	MOD_DEC_USE_COUNT;
 #endif
@@ -1530,7 +1521,7 @@
 				arcpacket->hardheader.offset2);
 		
 		arcsoft=&arcpacket->raw[offset];
-		arcsoft[0]=ARC_P_MS_TCPIP;
+		arcsoft[0]=ARC_P_ETHER;
 		arcsoft++;
 		
 		/* copy the packet into ARCnet shmem
@@ -1856,7 +1847,7 @@
 		arcnetA_rx(dev,(struct ClientData*)arcsoft,
 			length,saddr,daddr);
 		break;
-	case ARC_P_MS_TCPIP:
+	case ARC_P_ETHER:
 		arcnetE_rx(dev,arcsoft,length,saddr,daddr);
 		break;		
 	default:
@@ -2465,9 +2456,6 @@
 int
 init_module(void)
 {
-	if (io == 0)
-	  printk("arcnet: You should not use auto-probing with insmod!\n");
-
 	sprintf(thiscard.name,"arc%d",num);
 
 	thiscard.base_addr=io;
@@ -2502,6 +2490,8 @@
 		if (thiscard.base_addr) release_region(thiscard.base_addr,
 						ARCNET_TOTAL_SIZE);
 		unregister_netdev(&thiscard);
+		kfree(thiscard.priv);
+		thiscard.priv = NULL;
 	}
 }
 
diff -u --recursive --new-file v1.3.24/linux/drivers/net/at1700.c linux/drivers/net/at1700.c
--- v1.3.24/linux/drivers/net/at1700.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/at1700.c	Thu Sep  7 17:11:47 1995
@@ -263,8 +263,9 @@
 		printk(version);
 
 	/* Initialize the device structure. */
+	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 	if (dev->priv == NULL)
-		dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 
 	dev->open		= net_open;
@@ -660,6 +661,8 @@
 	else
 	{
 		unregister_netdev(&dev_at1700);
+		kfree(dev_at1700.priv);
+		dev_at1700.priv = NULL;
 
 		/* If we don't do this, we can't re-insmod it later. */
 		free_irq(dev_at1700.irq);
diff -u --recursive --new-file v1.3.24/linux/drivers/net/atp.c linux/drivers/net/atp.c
--- v1.3.24/linux/drivers/net/atp.c	Tue Aug  8 12:31:35 1995
+++ linux/drivers/net/atp.c	Thu Sep  7 17:11:47 1995
@@ -227,6 +227,8 @@
 	/* Initialize the device structure. */
 	ether_setup(dev);
 	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 
 
diff -u --recursive --new-file v1.3.24/linux/drivers/net/de4x5.c linux/drivers/net/de4x5.c
--- v1.3.24/linux/drivers/net/de4x5.c	Tue Aug 15 20:39:02 1995
+++ linux/drivers/net/de4x5.c	Thu Sep  7 17:11:47 1995
@@ -588,6 +588,8 @@
 	*/
 	dev->priv = (void *) kmalloc(sizeof(struct de4x5_private) + ALIGN, 
 				                                   GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	/*
 	** Align to a longword boundary
 	*/
diff -u --recursive --new-file v1.3.24/linux/drivers/net/depca.c linux/drivers/net/depca.c
--- v1.3.24/linux/drivers/net/depca.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/depca.c	Thu Sep  7 17:11:47 1995
@@ -511,6 +511,8 @@
  
 	  /* Define the device private memory */
 	  dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL);
+	  if (dev->priv == NULL)
+	    return -ENOMEM;
 	  lp = (struct depca_private *)dev->priv;
 	  memset((char *)dev->priv, 0, sizeof(struct depca_private));
 	  lp->adapter = adapter;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/dummy.c linux/drivers/net/dummy.c
--- v1.3.24/linux/drivers/net/dummy.c	Mon Jan 23 10:38:28 1995
+++ linux/drivers/net/dummy.c	Thu Sep  7 17:11:47 1995
@@ -88,6 +88,8 @@
 
 #if DUMMY_STATS
 	dev->priv = kmalloc(sizeof(struct enet_statistics), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct enet_statistics));
 	dev->get_stats		= dummy_get_stats;
 #endif
@@ -170,6 +172,8 @@
 	else
 	{
 		unregister_netdev(&dev_dummy);
+		kfree(dev_dummy.priv);
+		dev_dummy.priv = NULL;
 	}
 }
 #endif /* MODULE */
diff -u --recursive --new-file v1.3.24/linux/drivers/net/eepro.c linux/drivers/net/eepro.c
--- v1.3.24/linux/drivers/net/eepro.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/eepro.c	Thu Sep  7 17:11:48 1995
@@ -407,8 +407,9 @@
 			request_region(ioaddr, EEPRO_IO_EXTENT, "eepro");
 
 			/* Initialize the device structure */
+			dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
 			if (dev->priv == NULL)
-				dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
+				return -ENOMEM;
 			memset(dev->priv, 0, sizeof(struct eepro_local));
 
 			dev->open = eepro_open;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/eexpress.c linux/drivers/net/eexpress.c
--- v1.3.24/linux/drivers/net/eexpress.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/eexpress.c	Thu Sep  7 17:11:47 1995
@@ -400,6 +400,8 @@
 
 	/* Initialize the device structure. */
 	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 
 	dev->open		= eexp_open;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/eql.c linux/drivers/net/eql.c
--- v1.3.24/linux/drivers/net/eql.c	Sun Sep  3 12:26:54 1995
+++ linux/drivers/net/eql.c	Thu Sep  7 17:11:47 1995
@@ -219,10 +219,17 @@
 
   /* Initialize the device structure. */
   dev->priv = kmalloc (sizeof (equalizer_t), GFP_KERNEL);
+  if (dev->priv == NULL)
+      return -ENOMEM;
   memset (dev->priv, 0, sizeof (equalizer_t));
   eql = (equalizer_t *) dev->priv;
 
   eql->stats = kmalloc (sizeof (struct enet_statistics), GFP_KERNEL);
+  if (eql->stats == NULL) {
+      kfree(dev->priv);
+      dev->priv = NULL;
+      return -ENOMEM;
+  }
   memset (eql->stats, 0, sizeof (struct enet_statistics));
 
   init_timer (&eql->timer);
@@ -761,6 +768,8 @@
   slave_t *tail_slave;
 
   queue = (slave_queue_t *) kmalloc (sizeof (slave_queue_t), GFP_KERNEL);
+  if (queue == NULL)
+    return 0;
   memset (queue, 0, sizeof (slave_queue_t));
 
   head_slave = eql_new_slave ();
@@ -777,6 +786,10 @@
     }
   else
     {
+      if (head_slave)
+         kfree(head_slave);
+      if (tail_slave)
+         kfree(tail_slave);
       kfree (queue);
       return 0;
     }
diff -u --recursive --new-file v1.3.24/linux/drivers/net/ewrk3.c linux/drivers/net/ewrk3.c
--- v1.3.24/linux/drivers/net/ewrk3.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/ewrk3.c	Thu Sep  7 17:11:47 1995
@@ -548,6 +548,8 @@
 	      /* private area & initialise */
 	      dev->priv = (void *) kmalloc(sizeof(struct ewrk3_private), 
 					                           GFP_KERNEL);
+	      if (dev->priv == NULL)
+		  return -ENOMEM;
 	      lp = (struct ewrk3_private *)dev->priv;
 	      memset(dev->priv, 0, sizeof(struct ewrk3_private));
 	      lp->shmem_base = mem_start;
@@ -1883,6 +1885,8 @@
   } else {
     release_region(thisEthwrk.base_addr, EWRK3_TOTAL_SIZE);
     unregister_netdev(&thisEthwrk);
+    free(thisEthwrk.priv);
+    thisEthwrk.priv = NULL;
   }
 }
 #endif /* MODULE */
diff -u --recursive --new-file v1.3.24/linux/drivers/net/ibmtr.c linux/drivers/net/ibmtr.c
--- v1.3.24/linux/drivers/net/ibmtr.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/ibmtr.c	Fri Sep  8 07:53:36 1995
@@ -24,6 +24,16 @@
                  - Add comments, misc reorg for clarity
                  - Flatten interrupt handler levels
 
+   Changes by Farzad Farid (farzy@zen.via.ecp.fr)
+   and Pascal Andre (andre@chimay.via.ecp.fr) (March 9 1995) :
+        - multi ring support clean up
+        - RFC1042 compliance enhanced
+
+   Changes by Pascal Andre (andre@chimay.via.ecp.fr) (September 7 1995) :
+        - bug correction in tr_tx
+        - removed redundant information display
+        - some code reworking
+
    Warnings !!!!!!!!!!!!!!
       This driver is only partially sanitized for support of multiple
       adapters.  It will almost definately fail if more than one
@@ -42,8 +52,15 @@
 #define FALSE 0
 #define TRUE (!FALSE)
 
-static const char *version = "ibmtr.c:v1.1.48 8/7/94 Peter De Schrijver and Mark Swanson\n"
-                       "           modified 10/3/94 David W. Morris\n";
+/* changes the output format of driver initialisation */
+#define TR_NEWFORMAT	1
+
+/* some 95 OS send many non UI frame; this allow removing the warning */
+#define TR_FILTERNONUI	1
+
+/* version and credits */
+static const char *version = "ibmtr.c: v1.3.24 8/7/94 Peter De Schrijver and Mark Swanson\n"
+"   modified 10/3/94 DW Morris, 3/9/95 F Farid and P Andre, 9/7/95 P Andre\n";
 
 static char pcchannelid[]={0x05, 0x00, 0x04, 0x09,
 			 0x04, 0x03, 0x04, 0x0f,
@@ -82,6 +99,23 @@
 #define DPRINTK(format, args...) printk("%s: " format, dev->name , ## args)
 #define DPRINTD(format, args...) DummyCall("%s: " format, dev->name , ## args)
 
+#ifdef TR_NEWFORMAT
+/* this allows displaying full adapter information */
+const char *channel_def[] = { "ISA", "MCA", "ISA P&P" };
+char *adapter_def(char type)
+{
+       switch (type)
+       {
+               case 'f':
+               case 'F' : return "Adapter/A";
+               case 'e':
+               case 'E' : return "16/4 Adapter/II";
+               default :
+                       printk("Unknow adapter %c\n", type);
+                       return "adapter";
+       };
+};
+#endif
 
 #if 0
 struct tok_info tok_info1;   /*  WARNING: this area must be replicated
@@ -91,8 +125,12 @@
 void (*do_tok_int)(struct device *dev)=NULL;
 #endif
 
+#ifndef TR_NEWFORMAT
 unsigned char ibmtr_debug_trace=1;  /*  Patch or otherwise alter to
                                          control tokenring tracing.  */
+#else
+unsigned char ibmtr_debug_trace=0;
+#endif
 #define TRC_INIT 0x01              /*  Trace initialization & PROBEs */
 #define TRC_INITV 0x02             /*  verbose init trace points     */
 
@@ -250,9 +288,11 @@
 
   /*?? Now, allocate some of the pl0 buffers for this driver.. */
 
-  if (!badti)
+  if (!badti) {
     ti = (struct tok_info *)kmalloc(sizeof(struct tok_info), GFP_KERNEL);
-  else {
+    if (ti == NULL)
+          return -ENOMEM;
+  } else {
     ti = badti; badti = NULL;
   }/*?? dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); */
 
@@ -274,7 +314,9 @@
       if (intr==3) irq=7;
       ti->global_int_enable=GLOBAL_INT_ENABLE+((irq==9) ? 2 : irq);
       ti->sram=NULL;
+#ifndef TR_NEWFORMAT
       DPRINTK("ti->global_int_enable: %04X\n",ti->global_int_enable);
+#endif
       break;
     case TR_MCA:
       if (intr==0) irq=9;
@@ -306,17 +348,26 @@
     printk(".\n");
   }
 
-  DPRINTK("hw address: ");
   /* Get hw address of token ring card */
+#ifndef TR_NEWFORMAT 
+  DPRINTK("hw address: ");
+#endif
   j=0;
   for (i=0; i<0x18; i=i+2) {
     temp = *(char *)((ulong)AIP + (ulong)i + ti->mmio) & 0x0f; /* Tech ref states must do this */
+#ifndef TR_NEWFORMAT
     printk("%1X",ti->hw_address[j]=temp);
+#else
+    ti->hw_address[j]=temp;
+#endif
     if(j&1)
       dev->dev_addr[(j/2)]=ti->hw_address[j]+(ti->hw_address[j-1]<<4);
     ++j;
   }
+#ifndef TR_NEWFORMAT
   printk("\n");
+#endif
+
 
   /* get Adapter type:  'F' = Adapter/A, 'E' = 16/4 Adapter II,...*/
   ti->adapter_type = *(char *)(ti->mmio + AIPADAPTYPE);
@@ -340,9 +391,11 @@
   /* Available DHB 16Mb size:  F=2048, E=4096, D=8192, C=16384, B=17960 */
   ti->dhb_size16mb = *(char *)(ti->mmio + AIP16MBDHB);
 
+#ifndef TR_NEWFORMAT
   DPRINTK("atype=%x, drate=%x, trel=%x, asram=%dK, srp=%x, dhb(4mb=%x, 16mb=%x)\n",ti->adapter_type,
 	  ti->data_rate, ti->token_release, ti->avail_shared_ram/2, ti->shared_ram_paging,
 	  ti->dhb_size4mb, ti->dhb_size16mb);
+#endif
 
   /* We must figure out how much shared memory space this adapter
      will occupy so that if there are two adapters we can fit both
@@ -362,7 +415,9 @@
     unsigned char pg_size;
 #endif
 
+#ifndef TR_NEWFORMAT
     DPRINTK("shared ram page size: %dK\n",ti->mapped_ram_size/2);
+#endif
 #ifdef ENABLE_PAGING
     switch(ti->shared_ram_paging) {
       case 0xf:
@@ -430,8 +485,9 @@
         bail out in a rather benign fashion.    */
 
   if (badti) return ENODEV;
-
+#ifndef TR_NEWFORMAT
   DPRINTK("Using %dK shared RAM\n",ti->mapped_ram_size/2);
+#endif
 
   if (request_irq (dev->irq = irq, &tok_interrupt,0,"IBM TR") != 0) {
     DPRINTK("Could not grab irq %d.  Halting Token Ring driver.\n",irq);
@@ -443,9 +499,19 @@
   /*?? Now, allocate some of the PIO PORTs for this driver.. */
   request_region(PIOaddr,TR_IO_EXTENT,"ibmtr");  /* record PIOaddr range
 						    as busy */
+#ifndef TR_NEWFORMAT
+   DPRINTK("%s",version); /* As we have passed card identification,
+                             let the world know we're here! */
+#else
+  printk("%s",version);
+  DPRINTK("%s %s found using irq %d, PIOaddr %4hx, %dK shared RAM.\n",
+       channel_def[cardpresent-1], adapter_def(ti->adapter_type), irq,
+        PIOaddr, ti->mapped_ram_size/2);
+  DPRINTK("Hardware address : %02X:%02X:%02X:%02X:%02X:%02X\n",
+       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+        dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+#endif
 
-  DPRINTK("%s",version); /* As we have passed card identification,
-                            let the world know we're here! */
   dev->base_addr=PIOaddr; /* set the value for device */
 
   dev->open=tok_open;
@@ -646,7 +712,11 @@
 						else DPRINTK("Unrecoverable error: error code = %02X\n",open_response->error_code);
 					}
 					else if(!open_response->ret_code) {
+#ifndef TR_NEWFORMAT
 						DPRINTK("board opened...\n");
+#else
+						DPRINTK("Adapter initialized and opened.\n");
+#endif
 						*(unsigned char *)(ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD)=~(SRB_RESP_INT);
 						*(unsigned char *)(ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD)=~(CMD_IN_SRB);
 						open_sap(EXTENDED_SAP,dev);
@@ -821,7 +891,9 @@
 
 static void initial_tok_int(struct device *dev) {
 
+#ifndef TR_NEWFORMAT
   int i;
+#endif
   unsigned char *encoded_addr;
   struct tok_info *ti;
 
@@ -835,7 +907,9 @@
 
 	ti->do_tok_int=NOT_FIRST;
 
+#ifndef TR_NEWFORMAT
 	DPRINTK("Initial tok int received\n");
+#endif
 
 	if(!ti->sram) {  /* we assign the address for ISA devices */
 			/* set RRR even to D000 for shared ram address */
@@ -846,27 +920,34 @@
 	ti->init_srb=ti->sram+ntohs(*(unsigned short *)(ti->mmio+ ACA_OFFSET + WRBR_EVEN));
 	SET_PAGE(ntohs(*(unsigned short *)(ti->mmio+ ACA_OFFSET + WRBR_EVEN)));
 
-#if 1
+#if 0
 	DPRINTK("init_srb(%p):",ti->init_srb);
 	for(i=0;i<17;i++)
 		printk("%02X ",*(ti->init_srb+i));
 	printk("\n");
 #endif
 
-		
+#ifndef TR_NEWFORMAT		
 	DPRINTK("srb_init_response->encoded_address: %04X\n",((struct srb_init_response *)ti->init_srb)->encoded_address);
 	DPRINTK("ntohs(srb_init_response->encoded_address): %04X\n",ntohs(((struct srb_init_response *)ti->init_srb)->encoded_address));
+#endif
 	encoded_addr=(unsigned char *)(ti->sram + ntohs(((struct srb_init_response *)ti->init_srb)->encoded_address));
 
+#ifndef TR_NEWFORMAT
 	DPRINTK("encoded addr (%04X,%04X,%p): ",
 			((struct srb_init_response *)ti->init_srb)->encoded_address,
 			ntohs(((struct srb_init_response *)ti->init_srb)->encoded_address),	
 			encoded_addr);
+#else
+       DPRINTK("Initial interrupt : shared RAM located at %p.\n", encoded_addr);
+#endif
 	ti->auto_ringspeedsave=((struct srb_init_response *)ti->init_srb)->init_status_2 & 0x4 ? TRUE : FALSE;
 
+#ifndef TR_NEWFORMAT
 	for(i=0;i<TR_ALEN;i++)
 		printk("%02X%s",dev->dev_addr[i]=encoded_addr[i],(i==TR_ALEN-1) ? "" : ":" );
 	printk("\n");
+#endif
 
 	tok_open_adapter((unsigned long)dev);
 
@@ -895,11 +976,15 @@
 #endif
 
 	*(unsigned char *)(ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN)=~(INT_ENABLE);
+#ifndef TR_NEWFORMAT
 	DPRINTK("resetting card\n");
+#endif
 	outb(0,PIOaddr+ADAPTRESET);
 	for(i=jiffies+5;jiffies<=i;); /* wait 50ms */
 	outb(0,PIOaddr+ADAPTRESETREL);
+#ifndef TR_NEWFORMAT
 	DPRINTK("card reset\n");
+#endif
 
         ti->open_status=IN_PROGRESS;
 
@@ -962,6 +1047,7 @@
 	struct asb_xmit_resp *xmit_resp=(struct asb_xmit_resp *)ti->asb;
 	struct arb_xmit_req *xmit_req=(struct arb_xmit_req *)ti->arb;
 	struct srb_xmit *xmit=(struct srb_xmit *)ti->srb;
+	struct trh_hdr *trhdr=(struct trh_hdr *)ti->current_skb->data;
 	unsigned int hdr_len;
 	unsigned char *dhb;
 
@@ -1011,7 +1097,7 @@
 
      /*  TR arch. identifies if RIF present by high bit of source
          address.  So here we check if RIF present */
-  if(!(((struct trh_hdr *)(&ti->current_skb->data))->saddr[0] & 0x80)) {
+  if(!(trhdr->saddr[0] & 0x80)) {
     hdr_len=sizeof(struct trh_hdr)-18;
 #if 0
 DPRINTK(("hdr_length: %d, frame length: %ld\n",hdr_len,
@@ -1019,11 +1105,11 @@
 #endif
   }   /*  TR packet includes RIF data ... preserve it */
   else {
-    hdr_len=((ntohs(((struct trh_hdr *)(&ti->current_skb->data))->rcf)
+    hdr_len=((ntohs(trhdr->rcf)
              & TR_RCF_LEN_MASK)>>8)+sizeof(struct trh_hdr)-18;
 #if 0
 /* rework the following if activated, hdr_len <> rif_len */
-DPRINTK("rcf: %02X rif_len: %d\n",((struct trh_hdr *)&ti->current_skb->data)->rcf,wrk_len);
+DPRINTK("rcf: %02X rif_len: %d\n", trhdr->rcf,wrk_len);
 DPRINTK("hdr_length: %d, frame length: %ld\n",sizeof(struct trh_hdr)-18+hdr_len,
       ti->current_skb->len-18+hdr_len);
 #endif
@@ -1082,8 +1168,9 @@
 #endif
 
 	if(llc->llc!=UI_CMD) {
-		
+#ifndef TR_FILTERNONUI		
 		DPRINTK("non-UI frame arrived. dropped. llc= %02X\n",llc->llc);
+#endif
 		rec_resp->ret_code=DATA_LOST;
 		ti->tr_stats.rx_dropped++;
 		*(unsigned char *)(ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD)=RESP_IN_ASB;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/loopback.c linux/drivers/net/loopback.c
--- v1.3.24/linux/drivers/net/loopback.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/loopback.c	Thu Sep  7 17:11:47 1995
@@ -144,6 +144,8 @@
 	dev->pa_alen		= 4;
 #endif  
 	dev->priv = kmalloc(sizeof(struct enet_statistics), GFP_KERNEL);
+	if (dev->priv == NULL)
+			return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct enet_statistics));
 	dev->get_stats = get_stats;
 
diff -u --recursive --new-file v1.3.24/linux/drivers/net/ni52.c linux/drivers/net/ni52.c
--- v1.3.24/linux/drivers/net/ni52.c	Tue Aug  8 12:31:36 1995
+++ linux/drivers/net/ni52.c	Thu Sep  7 17:11:47 1995
@@ -360,6 +360,8 @@
 
   dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL); 
                                   /* warning: we don't free it on errors */
+  if (dev->priv == NULL)
+     return -ENOMEM;
   memset((char *) dev->priv,0,sizeof(struct priv));
 
   /* 
diff -u --recursive --new-file v1.3.24/linux/drivers/net/ni65.c linux/drivers/net/ni65.c
--- v1.3.24/linux/drivers/net/ni65.c	Tue Aug  8 12:31:37 1995
+++ linux/drivers/net/ni65.c	Thu Sep  7 17:11:47 1995
@@ -244,6 +244,8 @@
         request_region(ioaddr,NI65_TOTAL_SIZE,"ni65");
 
   p = dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
+  if (p == NULL)
+   	return -ENOMEM;
   memset((char *) dev->priv,0,sizeof(struct priv));
 
   dev->open               = ni65_open;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/plip.c linux/drivers/net/plip.c
--- v1.3.24/linux/drivers/net/plip.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/plip.c	Thu Sep  7 17:11:47 1995
@@ -261,7 +261,7 @@
 	/* Set the private structure */
 	dev->priv = kmalloc(sizeof (struct net_local), GFP_KERNEL);
 	if (dev->priv == NULL)
-		return EAGAIN;
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 	nl = (struct net_local *) dev->priv;
 
diff -u --recursive --new-file v1.3.24/linux/drivers/net/seeq8005.c linux/drivers/net/seeq8005.c
--- v1.3.24/linux/drivers/net/seeq8005.c	Wed Aug  2 13:21:05 1995
+++ linux/drivers/net/seeq8005.c	Thu Sep  7 17:11:48 1995
@@ -323,8 +323,9 @@
 	request_region(ioaddr, SEEQ8005_IO_EXTENT,"seeq8005");
 
 	/* Initialize the device structure. */
+	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 	if (dev->priv == NULL)
-		dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
+		return -ENOMEM;
 	memset(dev->priv, 0, sizeof(struct net_local));
 
 	dev->open		= seeq8005_open;
diff -u --recursive --new-file v1.3.24/linux/drivers/net/sk_g16.c linux/drivers/net/sk_g16.c
--- v1.3.24/linux/drivers/net/sk_g16.c	Tue Aug  8 12:31:37 1995
+++ linux/drivers/net/sk_g16.c	Thu Sep  7 17:11:47 1995
@@ -788,6 +788,8 @@
 
     /* Allocate memory for private structure */
     p = dev->priv = (void *) kmalloc(sizeof(struct priv), GFP_KERNEL);
+    if (p == NULL)
+	   return -ENOMEM;
     memset((char *) dev->priv, 0, sizeof(struct priv)); /* clear memory */
 
     /* Assign our Device Driver functions */
diff -u --recursive --new-file v1.3.24/linux/drivers/net/tunnel.c linux/drivers/net/tunnel.c
--- v1.3.24/linux/drivers/net/tunnel.c	Fri Aug 18 08:44:57 1995
+++ linux/drivers/net/tunnel.c	Thu Sep  7 17:11:48 1995
@@ -79,17 +79,23 @@
 	dev->hard_start_xmit = tunnel_xmit;
 	dev->get_stats = tunnel_get_stats;
 	dev->priv = kmalloc(sizeof(struct enet_statistics), GFP_KERNEL);
-	 memset(dev->priv, 0, sizeof(struct enet_statistics));
+	if (dev->priv == NULL)
+		return -ENOMEM;
+	memset(dev->priv, 0, sizeof(struct enet_statistics));
 #ifdef MODULE
 	dev->open = &tunnel_open;
 	dev->stop = &tunnel_close;
 #endif
+	/* Now stomp the bits that are different */
 	dev->type = ARPHRD_TUNNEL; /* IP tunnel hardware type (Linux 1.1.89) */
 	dev->flags |= IFF_NOARP;
 	dev->flags |= IFF_LOOPBACK; /* Why doesn't tunnel work without this? [ should do now - AC]*/
 	dev->addr_len=0;
 	dev->hard_header_len=0;
 	dev->hard_header=NULL;
+	dev->header_cache=NULL;
+	dev->rebuild_header=NULL;
+	/* End of stomp 8) */
 	return 0;
 }
 
@@ -218,6 +224,7 @@
 	skb2->free=1;
 	skb_put(skb2,newlen);
 	iph=skb2->h.iph=(struct iphdr *)skb2->data;
+	skb2->ip_hdr=iph;
 	memcpy(skb2->h.iph, skb->data, ip_header_len );
 	memcpy(skb2->data + ip_header_len, skb->data, skb->len);
 	/* Free the old packet, we no longer need it */
diff -u --recursive --new-file v1.3.24/linux/drivers/net/wavelan.c linux/drivers/net/wavelan.c
--- v1.3.24/linux/drivers/net/wavelan.c	Tue Aug 15 20:39:03 1995
+++ linux/drivers/net/wavelan.c	Thu Sep  7 17:11:47 1995
@@ -1015,6 +1015,8 @@
 		printk(version);
 
 	dev->priv = kmalloc(sizeof(net_local), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 	memset(dev->priv, 0x00, sizeof(net_local));
 	lp = (net_local *)dev->priv;
 
diff -u --recursive --new-file v1.3.24/linux/drivers/pci/pci.c linux/drivers/pci/pci.c
--- v1.3.24/linux/drivers/pci/pci.c	Sun Sep  3 12:26:54 1995
+++ linux/drivers/pci/pci.c	Fri Sep  8 09:23:37 1995
@@ -19,7 +19,7 @@
 struct pci_dev *pci_devices = 0;
 
 
-/* 
+/*
  * The bridge_id field is an offset of an item into the array
  * BRIDGE_MAPPING_TYPE. 0xff indicates that the device is not a PCI
  * bridge, or that we don't know for the moment how to configure it.
@@ -34,126 +34,131 @@
 #define BRIDGE(vid,did,name,bridge) \
   {PCI_VENDOR_ID_##vid, PCI_DEVICE_ID_##did, (name), (bridge)}
 
+/*
+ * Sorted in ascending order by vendor and device.
+ * Use binary search for lookup. If you add a device make sure
+ * it is sequential by both vendor and device id.
+ */
 struct pci_dev_info dev_info[] = {
 	DEVICE( NCR,		NCR_53C810,	"53c810"),
-	DEVICE( NCR,		NCR_53C815,	"53c815"),
 	DEVICE( NCR,		NCR_53C820,	"53c820"),
 	DEVICE( NCR,		NCR_53C825,	"53c825"),
-	DEVICE( ADAPTEC,	ADAPTEC_2940,	"2940"),
-	DEVICE( ADAPTEC,	ADAPTEC_294x,	"294x"),
-	DEVICE( ADAPTEC,	ADAPTEC_7850,	"AIC-7850"),
-	DEVICE( DPT,		DPT,		"SmartCache/Raid"),
-	DEVICE( S3,		S3_864_1,	"Vision 864-P"),
-	DEVICE( S3,		S3_864_2,	"Vision 864-P"),
-	DEVICE( S3,		S3_868,	"Vision 868"),
-	DEVICE( S3,		S3_928,		"Vision 928-P"),
-	DEVICE( S3,		S3_964_1,	"Vision 964-P"),
-	DEVICE( S3,		S3_964_2,	"Vision 964-P"),
-	DEVICE( S3,		S3_811,		"Trio32/Trio64"),
-	DEVICE( S3,		S3_968,		"Vision 968"),
-	DEVICE( OPTI,		OPTI_82C822,	"82C822"),
-	DEVICE( OPTI,		OPTI_82C621,	"82C621"),
-	DEVICE( OPTI,		OPTI_82C557,	"82C557"),
-	DEVICE( OPTI,		OPTI_82C558,	"82C558"),
-	BRIDGE( UMC,		UMC_UM8881F,	"UM8881F",		0x02),
-	BRIDGE( UMC,		UMC_UM8891A,	"UM8891A", 		0x01),
-	DEVICE( UMC,		UMC_UM8886F,	"UM8886F"),
-	DEVICE( UMC,		UMC_UM8886A,	"UM8886A"),
-	DEVICE( UMC,		UMC_UM8673F,	"UM8673F"),
+	DEVICE( NCR,		NCR_53C815,	"53c815"),
+	DEVICE( ATI,		ATI_68800,      "68800AX"),
+	DEVICE( ATI,		ATI_215CT222,   "215CT222"),
+	DEVICE( ATI,		ATI_210888CX,   "210888CX"),
+	DEVICE( ATI,		ATI_210888GX,   "210888GX"),
+	DEVICE( VLSI,		VLSI_82C592,	"82C592-FC1"),
+	DEVICE( VLSI,		VLSI_82C593,	"82C593-FC1"),
+	DEVICE( ADL,		ADL_2301,	"2301"),
+	DEVICE( NS,		NS_87410,	"87410"),
+	DEVICE( TSENG,		TSENG_W32P_2,	"ET4000W32P"),
+	DEVICE( TSENG,		TSENG_W32P_b,	"ET4000W32P rev B"),
+	DEVICE( TSENG,		TSENG_W32P_c,	"ET4000W32P rev C"),
+	DEVICE( TSENG,		TSENG_W32P_d,	"ET4000W32P rev D"),
+	DEVICE( WEITEK,		WEITEK_P9000,	"P9000"),
+	DEVICE( WEITEK,		WEITEK_P9100,	"P9100"),
+	DEVICE( DEC,		DEC_BRD,	"DC21050"),
 	DEVICE( DEC,		DEC_TULIP,	"DC21040"),
 	DEVICE( DEC,		DEC_TULIP_FAST,	"DC21140"),
-	DEVICE( DEC,		DEC_TULIP_PLUS,	"DC21041"),
 	DEVICE( DEC,		DEC_FDDI,	"DEFPA"),
-	DEVICE( DEC,		DEC_BRD,	"DC21050"),
-	DEVICE( MATROX,		MATROX_MGA_2,	"Atlas PX2085"),
-	DEVICE( MATROX,		MATROX_MGA_IMP,	"MGA Impression"),
-	DEVICE( MATROX,		MATROX_MIL	,"Millenium"),
-	DEVICE( INTEL,		INTEL_82378,	"82378IB"),
-	BRIDGE( INTEL,		INTEL_82424,	"82424ZX Saturn",	0x00),
-	DEVICE( INTEL,		INTEL_82375,	"82375EB"),
-	BRIDGE( INTEL,		INTEL_82434,	"82434LX Mercury/Neptune", 0x00),
-	DEVICE( INTEL,		INTEL_82430,	"82430ZX Aries"),
-	DEVICE( INTEL,		INTEL_82437,	"82437 Triton"),
-	DEVICE( INTEL,		INTEL_82371,	"82371 Triton"),
-	DEVICE( INTEL,		INTEL_82438,	"82438/82371"),
-	DEVICE( INTEL,		INTEL_7116,	"SAA7116"),
-	DEVICE( INTEL,		INTEL_82865,	"82865"),
-	DEVICE( INTEL,		INTEL_P6,	"Experimental P6 bridge"),
-#if 0
-	DEVICE( SMC,		SMC_37C665,	"FDC 37C665"),
-	DEVICE( SMC,		SMC_37C922,	"FDC 37C922"),
-#else
-	DEVICE( PCTECH,		PCTECH_RZ1000,	"RZ1000 (buggy)"),
-#endif
-	DEVICE( ATI,		ATI_68800,	"68800AX"),
-	DEVICE( ATI,		ATI_215CT222,	"215CT222"),
-	DEVICE( ATI,		ATI_210888GX,	"210888GX"),
-	DEVICE( ATI,		ATI_210888CX,	"210888CX"),
-	DEVICE( WEITEK,		WEITEK_P9000,	"P9000"),
-	DEVICE( WEITEK,		WEITEK_P9100,	"P9100"),
+	DEVICE( DEC,		DEC_TULIP_PLUS,	"DC21041"),
 	DEVICE( CIRRUS,		CIRRUS_5430,	"GD 5430"),
 	DEVICE( CIRRUS,		CIRRUS_5434_4,	"GD 5434"),
 	DEVICE( CIRRUS,		CIRRUS_5434_8,	"GD 5434"),
 	DEVICE( CIRRUS,		CIRRUS_6729,	"CL 6729"),
 	DEVICE( CIRRUS,		CIRRUS_7542,	"CL 7542"),
-	DEVICE( BUSLOGIC,	BUSLOGIC_946C,	"946C"),
-	DEVICE( BUSLOGIC,	BUSLOGIC_946C_2,"946C"),
-	DEVICE( N9,		N9_I128,	"Imagine 128"),
-	DEVICE( AI,		AI_M1435,	"M1435"),
-	DEVICE( AL,		AL_M1445,	"M1445"),
-	DEVICE( AL,		AL_M1449,	"M1449"),
-	DEVICE( AL,		AL_M1451,	"M1451"),
-	DEVICE( AL,		AL_M1461,	"M1461"),
-	DEVICE( AL,		AL_M4803,	"M4803"),
-	DEVICE( TSENG,		TSENG_W32P_2,	"ET4000W32P"),
-	DEVICE( TSENG,		TSENG_W32P_b,	"ET4000W32P rev B"),
-	DEVICE( TSENG,		TSENG_W32P_c,	"ET4000W32P rev C"),
-	DEVICE( TSENG,		TSENG_W32P_d,	"ET4000W32P rev D"),
-	DEVICE( CMD,		CMD_640,	"640 (buggy)"),
-	DEVICE( VISION,		VISION_QD8500,	"QD-8500"),
-	DEVICE( VISION,		VISION_QD8580,	"QD-8580"),
 	DEVICE( AMD,		AMD_LANCE,	"79C970"),
 	DEVICE( AMD,		AMD_SCSI,	"53C974"),
-	DEVICE( VLSI,		VLSI_82C593,	"82C593-FC1"),
-	DEVICE( VLSI,		VLSI_82C592,	"82C592-FC1"),
-	DEVICE( ADL,		ADL_2301,	"2301"),
-	DEVICE( SYMPHONY,	SYMPHONY_101,	"82C101"),
 	DEVICE( TRIDENT,	TRIDENT_9420,	"TG 9420"),
 	DEVICE( TRIDENT,	TRIDENT_9440,	"TG 9440"),
-	DEVICE( CONTAQ,		CONTAQ_82C599,	"82C599"),
-	DEVICE( NS,		NS_87410,	"87410"),
-	DEVICE( VIA,		VIA_82C505,	"VT 82C505"),
-	DEVICE( VIA,		VIA_82C576,	"VT 82C576 3V"),
-	DEVICE( VIA,		VIA_82C561,	"VT 82C561"),
-	DEVICE( SI,		SI_496,		"85C496"),
-	DEVICE( SI,		SI_501,		"85C501"),
+	DEVICE( AI,		AI_M1435,	"M1435"),
+	DEVICE( MATROX,		MATROX_MGA_2,	"Atlas PX2085"),
+	DEVICE( MATROX,		MATROX_MIL     ,"Millenium"),
+	DEVICE( MATROX,		MATROX_MGA_IMP,	"MGA Impression"),
+	DEVICE( CT,		CT_65545,	"65545"),
+	DEVICE( FD,		FD_36C70,	"TMC-18C30"),
 	DEVICE( SI,		SI_503,		"85C503"),
+	DEVICE( SI,		SI_501,		"85C501"),
+	DEVICE( SI,		SI_496,		"85C496"),
 	DEVICE( SI,		SI_601,		"85C601"),
+	DEVICE( HP,		HP_J2585A,	"J2585A"),
+#if 0
+	DEVICE( SMC,		SMC_37C665,	"FDC 37C665"),  /* 1042 ? */
+	DEVICE( SMC,		SMC_37C922,	"FDC 37C922"),
+#else
+	DEVICE( PCTECH,		PCTECH_RZ1000,  "RZ1000 (buggy)"), /* 1042 */
+#endif
+	DEVICE( DPT,		DPT,		"SmartCache/Raid"),
+	DEVICE( OPTI,		OPTI_82C557,	"82C557"),
+	DEVICE( OPTI,		OPTI_82C558,	"82C558"),
+	DEVICE( OPTI,		OPTI_82C621,	"82C621"),
+	DEVICE( OPTI,		OPTI_82C822,	"82C822"),
+	DEVICE( BUSLOGIC,	BUSLOGIC_946C_2,"946C"),
+	DEVICE( BUSLOGIC,	BUSLOGIC_946C,	"946C"),
+	DEVICE( PROMISE,	PROMISE_5300,	"DC5030"),
+	DEVICE( N9,		N9_I128,	"Imagine 128"),
+	DEVICE( UMC,		UMC_UM8673F,	"UM8673F"),
+	BRIDGE( UMC,		UMC_UM8891A,	"UM8891A", 		0x01),
+	DEVICE( UMC,		UMC_UM8886A,	"UM8886A"),
+	BRIDGE( UMC,		UMC_UM8881F,	"UM8881F",		0x02),
+	DEVICE( UMC,		UMC_UM8886F,	"UM8886F"),
+	DEVICE( X,		X_AGX016,	"ITT AGX016"),
+	DEVICE( QLOGIC,		QLOGIC_ISP1020,	"ISP1020"),
+	DEVICE( QLOGIC,		QLOGIC_ISP1022,	"ISP1022"),
 	DEVICE( LEADTEK,	LEADTEK_805,	"S3 805"),
-	DEVICE( IMS,		IMS_8849,	"8849"),
-	DEVICE( ZEINET,		ZEINET_1221,	"1221"),
-	DEVICE( EF,		EF_ATM,		"155P-MF1"),
-	DEVICE( HER,		HER_STING,	"Stingray"),
-	DEVICE( HER,		HER_STINGARK,	"Stingray ARK 2000PV"),
-  	DEVICE( ATRONICS,	ATRONICS_2015,	"IDE-2015PL"),
-	DEVICE( CT,		CT_65545,	"65545"),
-	DEVICE( FD,		FD_36C70,	"TMC-18C30"),
+	DEVICE( CONTAQ,		CONTAQ_82C599,	"82C599"),
+	DEVICE( CMD,		CMD_640,	"640A"),
+	DEVICE( VISION,		VISION_QD8500,	"QD-8500"),
+	DEVICE( VISION,		VISION_QD8580,	"QD-8580"),
 	DEVICE( WINBOND,	WINBOND_83769,	"W83769F"),
 	DEVICE( 3COM,		3COM_3C590,	"3C590 10bT"),
 	DEVICE( 3COM,		3COM_3C595TX,	"3C595 100bTX"),
 	DEVICE( 3COM,		3COM_3C595T4,	"3C595 100bT4"),
 	DEVICE( 3COM,		3COM_3C595MII,	"3C595 100b-MII"),
-	DEVICE( PROMISE,	PROMISE_5300,	"DC5030"),
-	DEVICE( QLOGIC,		QLOGIC_ISP1020,	"ISP1020"),
-	DEVICE( QLOGIC,		QLOGIC_ISP1022,	"ISP1022"),
-	DEVICE( X,		X_AGX016,	"ITT AGX016"),
+	DEVICE( AL,		AL_M1445,	"M1445"),
+	DEVICE( AL,		AL_M1449,	"M1449"),
+	DEVICE( AL,		AL_M1451,	"M1451"),
+	DEVICE( AL,		AL_M1461,	"M1461"),
+	DEVICE( AL,		AL_M4803,	"M4803"),
+	DEVICE( IMS,		IMS_8849,	"8849"),
+	DEVICE( VIA,		VIA_82C505,	"VT 82C505"),
+	DEVICE( VIA,		VIA_82C561,	"VT 82C561"),
+	DEVICE( VIA,		VIA_82C576,	"VT 82C576 3V"),
 	DEVICE( VORTEX,		VORTEX_GDT,	"GDT 6000b"),
-	DEVICE( HP,		HP_J2585A,	"J2585A"),
-	DEVICE( MUTECH,		MUTECH_MV1000,	"MV-1000"),
-	DEVICE( TEKRAM,		TEKRAM_DC290,	"DC-290"),
+	DEVICE( EF,		EF_ATM,		"155P-MF1"),
 	DEVICE( IMAGINGTECH,	IMAGINGTECH_ICPCI, "MVC IC-PCI"),
+	DEVICE( PLX,		PLX_9060,	"PCI9060 i960 bridge"),
+	DEVICE( MUTECH,		MUTECH_MV1000,	"MV-1000"),
+	DEVICE( ZEINET,		ZEINET_1221,	"1221"),
 	DEVICE( CYCLADES,	CYCLADES_Y,	"Cyclome-Y"),
-	DEVICE( PLX,		PLX_9060,	"PCI9060 i960 bridge")
+	DEVICE( SYMPHONY,	SYMPHONY_101,	"82C101"),
+	DEVICE( TEKRAM,		TEKRAM_DC290,	"DC-290"),
+	DEVICE( S3,		S3_811,		"Trio32/Trio64"),
+	DEVICE( S3,		S3_868,	"Vision 868"),
+	DEVICE( S3,		S3_928,		"Vision 928-P"),
+	DEVICE( S3,		S3_864_1,	"Vision 864-P"),
+	DEVICE( S3,		S3_864_2,	"Vision 864-P"),
+	DEVICE( S3,		S3_964_1,	"Vision 964-P"),
+	DEVICE( S3,		S3_964_2,	"Vision 964-P"),
+	DEVICE( S3,		S3_968,		"Vision 968"),
+	DEVICE( INTEL,		INTEL_82375,	"82375EB"),
+	BRIDGE( INTEL,		INTEL_82424,	"82424ZX Saturn",	0x00),
+	DEVICE( INTEL,		INTEL_82378,	"82378IB"),
+	DEVICE( INTEL,		INTEL_82430,	"82430ZX Aries"),
+	BRIDGE( INTEL,		INTEL_82434,	"82434LX Mercury/Neptune", 0x00),
+	DEVICE( INTEL,		INTEL_7116,	"SAA7116"),
+	DEVICE( INTEL,		INTEL_82865,	"82865"),
+	DEVICE( INTEL,		INTEL_82437,	"82437 Triton"),
+	DEVICE( INTEL,		INTEL_82371,	"82371 Triton"),
+	DEVICE( INTEL,		INTEL_82438,	"82438"),
+	DEVICE( INTEL,		INTEL_P6,	"Experimental P6 bridge"),
+	DEVICE( ADAPTEC,	ADAPTEC_7850,	"AIC-7850"),
+	DEVICE( ADAPTEC,	ADAPTEC_294x,	"294x"),
+	DEVICE( ADAPTEC,	ADAPTEC_2940,	"2940"),
+  	DEVICE( ATRONICS,	ATRONICS_2015,	"IDE-2015PL"),
+	DEVICE( HER,		HER_STING,	"Stingray"),
+	DEVICE( HER,		HER_STINGARK,	"Stingray ARK 2000PV")
 };
 
 
@@ -233,21 +238,40 @@
 
 
 /*
- * If performance ever becomes important, device_info[] could be
- * sorted by key and this could be replaced by a binary search.
+ * device_info[] is sorted so we can use binary search
  */
 struct pci_dev_info *pci_lookup_dev(unsigned int vendor, unsigned int dev)
 {
-	int i;
+	int min = 0,
+	    max = sizeof(dev_info)/sizeof(dev_info[0]) - 1;
 
-	for (i = 0; i < sizeof(dev_info)/sizeof(dev_info[0]); ++i) {
-		if (dev_info[i].vendor == vendor &&
-		    dev_info[i].device == dev)
-		{
-			return &dev_info[i];
-		}
+	for ( ; ; )
+	{
+	    int i = (min + max) >> 1;
+	    long order;
+
+	    order = dev_info[i].vendor - (long) vendor;
+	    if (!order)
+		order = dev_info[i].device - (long) dev;
+	
+	    if (order < 0)
+	    {
+		    min = i + 1;
+		    if ( min > max )
+		       return 0;
+		    continue;
+	    }
+
+	    if (order > 0)
+	    {
+		    max = i - 1;
+		    if ( min > max )
+		       return 0;
+		    continue;
+	    }
+
+	    return & dev_info[ i ];
 	}
-	return 0;
 }
 
 
@@ -402,7 +426,7 @@
 }
 
 
-const char *pci_strdev(unsigned int vendor, unsigned int device) 
+const char *pci_strdev(unsigned int vendor, unsigned int device)
 {
 	struct pci_dev_info *info;
 
@@ -545,7 +569,7 @@
 		}
 		len += sprintf(buf + len, "Master Capable.  ");
 		if (latency)
-		  len += sprintf(buf + len, "Latency=%d.  ", latency); 
+		  len += sprintf(buf + len, "Latency=%d.  ", latency);
 		else
 		  len += sprintf(buf + len, "No bursts.  ");
 		if (min_gnt)
@@ -695,7 +719,8 @@
 		 */
 		info = pci_lookup_dev(dev->vendor, dev->device);
 		if (!info) {
-			printk("Warning : Unknown PCI device.  Please read include/linux/pci.h \n");
+			printk("Warning : Unknown PCI device (%x:%x).  Please read include/linux/pci.h \n",
+				dev->vendor, dev->device);
 		} else {
 			/* Some BIOS' are lazy. Let's do their job: */
 			if (info->bridge_type != 0xff) {
diff -u --recursive --new-file v1.3.24/linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c
--- v1.3.24/linux/fs/binfmt_elf.c	Thu Sep  7 17:17:17 1995
+++ linux/fs/binfmt_elf.c	Thu Sep  7 17:11:47 1995
@@ -389,6 +389,10 @@
 	
 	elf_phdata = (struct elf_phdr *) kmalloc(elf_ex.e_phentsize * 
 						 elf_ex.e_phnum, GFP_KERNEL);
+	if (elf_phdata == NULL) {
+		MOD_DEC_USE_COUNT;
+		return -ENOMEM;
+	}
 	
 	retval = read_exec(bprm->inode, elf_ex.e_phoff, (char *) elf_phdata,
 			   elf_ex.e_phentsize * elf_ex.e_phnum, 1);
@@ -426,6 +430,11 @@
 			
 			elf_interpreter = (char *) kmalloc(elf_ppnt->p_filesz, 
 							   GFP_KERNEL);
+			if (elf_interpreter == NULL) {
+				kfree (elf_phdata);
+				MOD_DEC_USE_COUNT;
+				return -ENOMEM;
+			}
 			
 			retval = read_exec(bprm->inode,elf_ppnt->p_offset,elf_interpreter,
 					   elf_ppnt->p_filesz, 1);
@@ -738,6 +747,10 @@
 	
 	elf_phdata =  (struct elf_phdr *) 
 		kmalloc(sizeof(struct elf_phdr) * elf_ex.e_phnum, GFP_KERNEL);
+	if (elf_phdata == NULL) {
+		MOD_DEC_USE_COUNT;
+		return -ENOMEM;
+	}
 	
 	retval = read_exec(inode, elf_ex.e_phoff, (char *) elf_phdata,
 			   sizeof(struct elf_phdr) * elf_ex.e_phnum, 1);
diff -u --recursive --new-file v1.3.24/linux/fs/exec.c linux/fs/exec.c
--- v1.3.24/linux/fs/exec.c	Thu Sep  7 17:17:17 1995
+++ linux/fs/exec.c	Fri Sep  8 11:47:46 1995
@@ -226,6 +226,13 @@
 	    current->rlim[RLIMIT_CORE].rlim_cur)
 		dump.u_ssize = 0;
 
+/* make sure we actually have a data and stack area to dump */
+	set_fs(USER_DS);
+	if (verify_area(VERIFY_READ, (void *) (dump.u_tsize << PAGE_SHIFT), dump.u_dsize << PAGE_SHIFT))
+		dump.u_dsize = 0;
+	if (verify_area(VERIFY_READ, (void *) dump.start_stack, dump.u_ssize << PAGE_SHIFT))
+		dump.u_ssize = 0;
+
 	set_fs(KERNEL_DS);
 /* struct user */
 	DUMP_WRITE(&dump,sizeof(dump));
diff -u --recursive --new-file v1.3.24/linux/fs/nfs/dir.c linux/fs/nfs/dir.c
--- v1.3.24/linux/fs/nfs/dir.c	Wed Aug  2 13:21:15 1995
+++ linux/fs/nfs/dir.c	Thu Sep  7 17:11:47 1995
@@ -79,6 +79,8 @@
 	return -EISDIR;
 }
 
+static struct nfs_entry *c_entry = NULL;
+
 /*
  * We need to do caching of directory entries to prevent an
  * incredible amount of RPC traffic.  Only the most recent open
@@ -93,7 +95,6 @@
 	static int c_dev = 0;
 	static int c_ino;
 	static int c_size;
-	static struct nfs_entry *c_entry = NULL;
 
 	int result;
 	int i, index = 0;
@@ -109,9 +110,21 @@
 	if (c_entry == NULL) {
 		i = sizeof (struct nfs_entry)*NFS_READDIR_CACHE_SIZE;
 		c_entry = (struct nfs_entry *) kmalloc(i, GFP_KERNEL);
+		if (c_entry == NULL) {
+			printk("nfs_readdir: no MEMORY for cache\n");
+			return -ENOMEM;
+		}
 		for (i = 0; i < NFS_READDIR_CACHE_SIZE; i++) {
 			c_entry[i].name = (char *) kmalloc(NFS_MAXNAMLEN + 1,
 				GFP_KERNEL);
+			if (c_entry[i].name == NULL) {
+				printk("nfs_readdir: no MEMORY for cache\n");
+				while (--i>=0)
+					kfree(c_entry[i].name);
+				kfree(c_entry);
+				c_entry = NULL;
+				return -ENOMEM;
+			}
 		}
 	}
 	entry = NULL;
@@ -169,6 +182,24 @@
 	}
 	return 0;
 }
+
+/*
+ * free cache memory
+ * called from cleanup_module
+ */
+
+void nfs_kfree_cache(void)
+{
+        int i;
+
+	if (c_entry == NULL)
+		return;
+	for (i = 0; i < NFS_READDIR_CACHE_SIZE; i++)
+		kfree(c_entry[i].name);
+	kfree(c_entry);
+	c_entry = NULL;
+}
+ 
 
 /*
  * Lookup caching is a big win for performance but this is just
diff -u --recursive --new-file v1.3.24/linux/fs/nfs/inode.c linux/fs/nfs/inode.c
--- v1.3.24/linux/fs/nfs/inode.c	Mon Aug 28 14:52:22 1995
+++ linux/fs/nfs/inode.c	Thu Sep  7 17:11:47 1995
@@ -306,6 +306,7 @@
 void cleanup_module(void)
 {
 	unregister_filesystem(&nfs_fs_type);
+	nfs_kfree_cache();
 }
 
 #endif
diff -u --recursive --new-file v1.3.24/linux/fs/proc/array.c linux/fs/proc/array.c
--- v1.3.24/linux/fs/proc/array.c	Thu Sep  7 17:17:18 1995
+++ linux/fs/proc/array.c	Sat Sep  9 09:38:30 1995
@@ -110,10 +110,9 @@
 };
 
 
-#ifdef CONFIG_PROFILE
-
 extern unsigned long prof_len;
 extern unsigned long * prof_buffer;
+extern unsigned long prof_shift;
 /*
  * This function accesses profiling information. The returned data is
  * binary: the sampling step and the actual contents of the profile
@@ -125,7 +124,7 @@
     unsigned long p = file->f_pos;
 	int read;
 	char * pnt;
-	unsigned long sample_step = 1 << CONFIG_PROFILE_SHIFT;
+	unsigned long sample_step = 1 << prof_shift;
 
 	if (count < 0)
 	    return -EINVAL;
@@ -165,8 +164,6 @@
 struct inode_operations proc_profile_inode_operations = {
 	&proc_profile_operations, 
 };
-
-#endif /* CONFIG_PROFILE */
 
 
 static int get_loadavg(char * buffer)
diff -u --recursive --new-file v1.3.24/linux/fs/proc/inode.c linux/fs/proc/inode.c
--- v1.3.24/linux/fs/proc/inode.c	Sun Sep  3 12:27:01 1995
+++ linux/fs/proc/inode.c	Sat Sep  9 10:00:27 1995
@@ -17,8 +17,6 @@
 #include <asm/system.h>
 #include <asm/segment.h>
 
-extern unsigned long prof_len;
-
 static void proc_put_inode(struct inode *inode)
 {
 	if (inode->i_nlink)
@@ -212,13 +210,11 @@
 				inode->i_op = &proc_kcore_inode_operations;
 				inode->i_size = (MAP_NR(high_memory) << PAGE_SHIFT) + PAGE_SIZE;
 				break;
-#ifdef CONFIG_PROFILE
 			case PROC_PROFILE:
 				inode->i_mode = S_IFREG | S_IRUGO | S_IWUSR;
 				inode->i_op = &proc_profile_inode_operations;
 				inode->i_size = (1+prof_len) * sizeof(unsigned long);
 				break;
-#endif
 			default:
 				inode->i_mode = S_IFREG | S_IRUGO;
 				inode->i_op = &proc_array_inode_operations;
diff -u --recursive --new-file v1.3.24/linux/fs/proc/root.c linux/fs/proc/root.c
--- v1.3.24/linux/fs/proc/root.c	Mon Aug 28 14:52:22 1995
+++ linux/fs/proc/root.c	Sat Sep  9 10:01:06 1995
@@ -292,12 +292,13 @@
 		PROC_IOPORTS, 7, "ioports",
 		S_IFREG | S_IRUGO, 1, 0, 0,
 	});
-#ifdef CONFIG_PROFILE
-	proc_register(&proc_root, &(struct proc_dir_entry) {
-		PROC_PROFILE, 7, "profile",
-		S_IFREG | S_IRUGO | S_IWUSR, 1, 0, 0,
-	});
-#endif
+
+	if (prof_shift) {
+		proc_register(&proc_root, &(struct proc_dir_entry) {
+			PROC_PROFILE, 7, "profile",
+			S_IFREG | S_IRUGO | S_IWUSR, 1, 0, 0,
+		});
+	}
 }
 
 
diff -u --recursive --new-file v1.3.24/linux/fs/smbfs/dir.c linux/fs/smbfs/dir.c
--- v1.3.24/linux/fs/smbfs/dir.c	Mon Aug 28 14:52:22 1995
+++ linux/fs/smbfs/dir.c	Thu Sep  7 17:11:47 1995
@@ -180,12 +180,21 @@
 	{
 		i = sizeof (struct smb_dirent) * SMB_READDIR_CACHE_SIZE;
 		c_entry = (struct smb_dirent *) smb_kmalloc(i, GFP_KERNEL);
+		if (c_entry == NULL) {
+			printk("smb_readdir: no MEMORY for cache\n");
+			return -ENOMEM;
+		}
 		for (i = 0; i < SMB_READDIR_CACHE_SIZE; i++) {
 			c_entry[i].path =
                                 (char *) smb_kmalloc(SMB_MAXNAMELEN + 1,
                                                      GFP_KERNEL);
                         if (c_entry[i].path == NULL) {
                                 DPRINTK("smb_readdir: could not alloc path\n");
+				while (--i>=0)
+					kfree(c_entry[i].path);
+				kfree(c_entry);
+				c_entry = NULL;
+				return -ENOMEM;
                         }
                 }
 	}
diff -u --recursive --new-file v1.3.24/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- v1.3.24/linux/include/asm-alpha/pgtable.h	Fri Jun  2 13:51:17 1995
+++ linux/include/asm-alpha/pgtable.h	Thu Sep  7 13:04:00 1995
@@ -249,10 +249,9 @@
 #define PAGE_DIR_OFFSET(tsk,address) pgd_offset((tsk),(address))
 
 /* to find an entry in a page-table-directory. */
-extern inline pgd_t * pgd_offset(struct task_struct * tsk, unsigned long address)
+extern inline pgd_t * pgd_offset(struct mm_struct * mm, unsigned long address)
 {
-	return (pgd_t *) ((tsk->tss.ptbr << PAGE_SHIFT) + PAGE_OFFSET) +
-		((address >> PGDIR_SHIFT) & (PTRS_PER_PAGE - 1));
+	return mm->pgd + ((address >> PGDIR_SHIFT) & (PTRS_PER_PAGE - 1));
 }
 
 /* Find an entry in the second-level page table.. */
diff -u --recursive --new-file v1.3.24/linux/include/linux/cyclades.h linux/include/linux/cyclades.h
--- v1.3.24/linux/include/linux/cyclades.h	Fri Mar 24 17:18:01 1995
+++ linux/include/linux/cyclades.h	Sat Sep  9 09:36:09 1995
@@ -1,8 +1,30 @@
+/*
+ * linux/include/linux/cyclades.h
+ *
+ * This file is maintained by Marcio Saito <marcio@cyclades.com> and
+ * Randolph Bentson <bentson@grieg.seaslug.org>.
+ *
+ * This file contains the general definitions for the cyclades.c driver
+ */
+
+/* PCI vendor and device ID's */
+
+#ifndef PCI_VENDOR_ID_CYCLADES
+#define	PCI_VENDOR_ID_CYCLADES	0x120e
+#endif
+
+#ifndef PCI_DEVICE_ID_CYCLOMY
+#define	PCI_DEVICE_ID_CYCLOMY	0x0100
+#endif
+
+/* Per card data structure */
+
 struct cyclades_card {
     int base_addr;
     int irq;
-    int num_chips; /* implies card type, 0 if card is absent */
-    int first_line; /* line number of first channel of first chip on card */
+    int num_chips;	/* 0 if card is absent */
+    int first_line;	/* minor number of first channel on card */
+    int bus_index;	/* address shift - 0 for ISA, 1 for PCI */
 };
 
 struct cyclades_chip {
@@ -93,6 +115,7 @@
 #define CyRegSize  0x0400
 #define Cy_HwReset 0x1400
 #define Cy_ClrIntr 0x1800
+#define Cy_EpldRev 0x1e00
 
 /* Global Registers */
 
diff -u --recursive --new-file v1.3.24/linux/include/linux/netdevice.h linux/include/linux/netdevice.h
--- v1.3.24/linux/include/linux/netdevice.h	Sun Sep  3 12:27:02 1995
+++ linux/include/linux/netdevice.h	Sat Sep  9 10:43:59 1995
@@ -32,7 +32,11 @@
 #define DEV_NUMBUFFS	3
 #define MAX_ADDR_LEN	7
 #ifndef CONFIG_AX25
+#ifndef CONFIG_TR
 #define MAX_HEADER	32		/* We really need about 18 worst case .. so 32 is aligned */
+#else
+#define MAX_HEADER	48		/* Token Ring header needs 40 bytes ... 48 is aligned */ 
+#endif
 #else
 #define MAX_HEADER	96		/* AX.25 + NetROM */
 #endif
diff -u --recursive --new-file v1.3.24/linux/include/linux/nfs_fs.h linux/include/linux/nfs_fs.h
--- v1.3.24/linux/include/linux/nfs_fs.h	Sun Sep  3 12:27:02 1995
+++ linux/include/linux/nfs_fs.h	Thu Sep  7 17:11:47 1995
@@ -106,6 +106,7 @@
 /* linux/fs/nfs/dir.c */
 
 extern struct inode_operations nfs_dir_inode_operations;
+extern void nfs_kfree_cache(void);
 
 /* linux/fs/nfs/symlink.c */
 
diff -u --recursive --new-file v1.3.24/linux/include/linux/pci.h linux/include/linux/pci.h
--- v1.3.24/linux/include/linux/pci.h	Thu Sep  7 17:17:19 1995
+++ linux/include/linux/pci.h	Fri Sep  8 09:16:36 1995
@@ -208,69 +208,86 @@
 
 #define PCI_CLASS_OTHERS		0xff
 
-
+/*
+ * Vendor and card ID's: sort these numerically according to vendor
+ * (and according to card ID within vendor)
+ */
 #define PCI_VENDOR_ID_NCR		0x1000
 #define PCI_DEVICE_ID_NCR_53C810	0x0001
-#define PCI_DEVICE_ID_NCR_53C815	0x0004
 #define PCI_DEVICE_ID_NCR_53C820	0x0002
 #define PCI_DEVICE_ID_NCR_53C825	0x0003
+#define PCI_DEVICE_ID_NCR_53C815	0x0004
 
-#define PCI_VENDOR_ID_ADAPTEC		0x9004
-#define PCI_DEVICE_ID_ADAPTEC_2940	0x7178
-#define PCI_DEVICE_ID_ADAPTEC_294x	0x7078
-#define PCI_DEVICE_ID_ADAPTEC_7850	0x5078
-#define PCI_DEVICE_ID_ADAPTEC_7872	0x7278
+#define PCI_VENDOR_ID_ATI		0x1002
+#define PCI_DEVICE_ID_ATI_68800		0x4158
+#define PCI_DEVICE_ID_ATI_215CT222	0x4354
+#define PCI_DEVICE_ID_ATI_210888CX	0x4358
+#define PCI_DEVICE_ID_ATI_210888GX	0x4758
 
-#define PCI_VENDOR_ID_DPT               0x1044   
-#define PCI_DEVICE_ID_DPT               0xa400  
+#define PCI_VENDOR_ID_VLSI		0x1004
+#define PCI_DEVICE_ID_VLSI_82C592	0x0005
+#define PCI_DEVICE_ID_VLSI_82C593	0x0006
 
-#define PCI_VENDOR_ID_S3		0x5333
-#define PCI_DEVICE_ID_S3_864_1		0x88c0
-#define PCI_DEVICE_ID_S3_864_2		0x88c1
-#define PCI_DEVICE_ID_S3_868		0x8880
-#define PCI_DEVICE_ID_S3_928		0x88b0
-#define PCI_DEVICE_ID_S3_964_1		0x88d0
-#define PCI_DEVICE_ID_S3_964_2		0x88d1
-#define PCI_DEVICE_ID_S3_811		0x8811
-#define PCI_DEVICE_ID_S3_968		0x88f0
+#define PCI_VENDOR_ID_ADL		0x1005
+#define PCI_DEVICE_ID_ADL_2301		0x2301
 
-#define PCI_VENDOR_ID_OPTI		0x1045
-#define PCI_DEVICE_ID_OPTI_82C822	0xc822
-#define PCI_DEVICE_ID_OPTI_82C621	0xc621
-#define PCI_DEVICE_ID_OPTI_82C557	0xc557
-#define PCI_DEVICE_ID_OPTI_82C558	0xc558
+#define PCI_VENDOR_ID_NS		0x100b
+#define PCI_DEVICE_ID_NS_87410		0xd001
 
-#define PCI_VENDOR_ID_UMC		0x1060
-#define PCI_DEVICE_ID_UMC_UM8881F	0x8881
-#define PCI_DEVICE_ID_UMC_UM8891A	0x0891
-#define PCI_DEVICE_ID_UMC_UM8886F	0x8886
-#define PCI_DEVICE_ID_UMC_UM8886A	0x886a
-#define PCI_DEVICE_ID_UMC_UM8673F	0x0101
+#define PCI_VENDOR_ID_TSENG		0x100c
+#define PCI_DEVICE_ID_TSENG_W32P_2	0x3202
+#define PCI_DEVICE_ID_TSENG_W32P_b	0x3205
+#define PCI_DEVICE_ID_TSENG_W32P_c	0x3206
+#define PCI_DEVICE_ID_TSENG_W32P_d	0x3207
+
+#define PCI_VENDOR_ID_WEITEK		0x100e
+#define PCI_DEVICE_ID_WEITEK_P9000	0x9001
+#define PCI_DEVICE_ID_WEITEK_P9100	0x9100
 
 #define PCI_VENDOR_ID_DEC		0x1011
+#define PCI_DEVICE_ID_DEC_BRD		0x0001
 #define PCI_DEVICE_ID_DEC_TULIP		0x0002
 #define PCI_DEVICE_ID_DEC_TULIP_FAST	0x0009
-#define PCI_DEVICE_ID_DEC_TULIP_PLUS	0x0014
 #define PCI_DEVICE_ID_DEC_FDDI		0x000F
-#define PCI_DEVICE_ID_DEC_BRD		0x0001
+#define PCI_DEVICE_ID_DEC_TULIP_PLUS	0x0014
+
+#define PCI_VENDOR_ID_CIRRUS		0x1013
+#define PCI_DEVICE_ID_CIRRUS_5430	0x00A0
+#define PCI_DEVICE_ID_CIRRUS_5434_4	0x00A4
+#define PCI_DEVICE_ID_CIRRUS_5434_8	0x00A8
+#define PCI_DEVICE_ID_CIRRUS_6729	0x1100
+#define PCI_DEVICE_ID_CIRRUS_7542	0x1200
+
+#define PCI_VENDOR_ID_AMD		0x1022
+#define PCI_DEVICE_ID_AMD_LANCE		0x2000
+#define PCI_DEVICE_ID_AMD_SCSI		0x2020
+
+#define PCI_VENDOR_ID_TRIDENT		0x1023
+#define PCI_DEVICE_ID_TRIDENT_9420	0x9420
+#define PCI_DEVICE_ID_TRIDENT_9440	0x9440
+
+#define PCI_VENDOR_ID_AI		0x1025
+#define PCI_DEVICE_ID_AI_M1435		0x1435
 
 #define PCI_VENDOR_ID_MATROX		0x102B
 #define PCI_DEVICE_ID_MATROX_MGA_2	0x0518
 #define PCI_DEVICE_ID_MATROX_MIL	0x0519
 #define PCI_DEVICE_ID_MATROX_MGA_IMP	0x0d10
 
-#define PCI_VENDOR_ID_INTEL		0x8086
-#define PCI_DEVICE_ID_INTEL_82378	0x0484
-#define PCI_DEVICE_ID_INTEL_82424	0x0483
-#define PCI_DEVICE_ID_INTEL_82375	0x0482
-#define PCI_DEVICE_ID_INTEL_82434	0x04a3
-#define PCI_DEVICE_ID_INTEL_82430	0x0486
-#define PCI_DEVICE_ID_INTEL_82437	0x122d
-#define PCI_DEVICE_ID_INTEL_82371	0x122e
-#define PCI_DEVICE_ID_INTEL_82438	0x1230
-#define PCI_DEVICE_ID_INTEL_7116	0x1223
-#define PCI_DEVICE_ID_INTEL_82865	0x1227
-#define PCI_DEVICE_ID_INTEL_P6		0x84c4
+#define PCI_VENDOR_ID_CT		0x102c
+#define PCI_DEVICE_ID_CT_65545		0x00d8
+
+#define PCI_VENDOR_ID_FD		0x1036
+#define PCI_DEVICE_ID_FD_36C70		0x0000
+
+#define PCI_VENDOR_ID_SI		0x1039
+#define PCI_DEVICE_ID_SI_503		0x0008
+#define PCI_DEVICE_ID_SI_501		0x0406
+#define PCI_DEVICE_ID_SI_496		0x0496
+#define PCI_DEVICE_ID_SI_601		0x0601
+
+#define PCI_VENDOR_ID_HP		0x103c
+#define PCI_DEVICE_ID_HP_J2585A		0x1030
 
 #if 0
 
@@ -285,112 +302,55 @@
 
 #endif
 
-#define PCI_VENDOR_ID_ATI		0x1002
-#define PCI_DEVICE_ID_ATI_68800		0x4158
-#define PCI_DEVICE_ID_ATI_215CT222	0x4354
-#define PCI_DEVICE_ID_ATI_210888CX	0x4358
-#define PCI_DEVICE_ID_ATI_210888GX	0x4758
-
-#define PCI_VENDOR_ID_WEITEK		0x100e
-#define PCI_DEVICE_ID_WEITEK_P9000	0x9001
-#define PCI_DEVICE_ID_WEITEK_P9100	0x9100
+#define PCI_VENDOR_ID_DPT               0x1044   
+#define PCI_DEVICE_ID_DPT               0xa400  
 
-#define PCI_VENDOR_ID_CIRRUS		0x1013
-#define PCI_DEVICE_ID_CIRRUS_5430	0x00A0
-#define PCI_DEVICE_ID_CIRRUS_5434_4	0x00A4
-#define PCI_DEVICE_ID_CIRRUS_5434_8	0x00A8
-#define PCI_DEVICE_ID_CIRRUS_6729	0x1100
-#define PCI_DEVICE_ID_CIRRUS_7542	0x1200
+#define PCI_VENDOR_ID_OPTI		0x1045
+#define PCI_DEVICE_ID_OPTI_82C557	0xc557
+#define PCI_DEVICE_ID_OPTI_82C558	0xc558
+#define PCI_DEVICE_ID_OPTI_82C621	0xc621
+#define PCI_DEVICE_ID_OPTI_82C822	0xc822
 
 #define PCI_VENDOR_ID_BUSLOGIC		0x104B
-#define PCI_DEVICE_ID_BUSLOGIC_946C	0x1040
 #define PCI_DEVICE_ID_BUSLOGIC_946C_2	0x0140
+#define PCI_DEVICE_ID_BUSLOGIC_946C	0x1040
+
+#define PCI_VENDOR_ID_PROMISE		0x105a
+#define PCI_DEVICE_ID_PROMISE_5300	0x5300
 
 #define PCI_VENDOR_ID_N9		0x105D
 #define PCI_DEVICE_ID_N9_I128		0x2309
 
-#define PCI_VENDOR_ID_AI		0x1025
-#define PCI_DEVICE_ID_AI_M1435		0x1435
-
-#define PCI_VENDOR_ID_AL		0x10b9
-#define PCI_DEVICE_ID_AL_M1445		0x1445
-#define PCI_DEVICE_ID_AL_M1449		0x1449
-#define PCI_DEVICE_ID_AL_M1451		0x1451
-#define PCI_DEVICE_ID_AL_M1461		0x1461
-#define PCI_DEVICE_ID_AL_M4803		0x5215
-
-#define PCI_VENDOR_ID_TSENG		0x100c
-#define PCI_DEVICE_ID_TSENG_W32P_2	0x3202
-#define PCI_DEVICE_ID_TSENG_W32P_b	0x3205
-#define PCI_DEVICE_ID_TSENG_W32P_c	0x3206
-#define PCI_DEVICE_ID_TSENG_W32P_d	0x3207
-
-#define PCI_VENDOR_ID_CMD		0x1095
-#define PCI_DEVICE_ID_CMD_640		0x0640
-
-#define PCI_VENDOR_ID_VISION		0x1098
-#define PCI_DEVICE_ID_VISION_QD8500	0x0001
-#define PCI_DEVICE_ID_VISION_QD8580	0x0002
-
-#define PCI_VENDOR_ID_AMD		0x1022
-#define PCI_DEVICE_ID_AMD_LANCE		0x2000
-#define PCI_DEVICE_ID_AMD_SCSI		0x2020
-
-#define PCI_VENDOR_ID_VLSI		0x1004
-#define PCI_DEVICE_ID_VLSI_82C593	0x0006
-#define PCI_DEVICE_ID_VLSI_82C592	0x0005
-
-#define PCI_VENDOR_ID_ADL		0x1005
-#define PCI_DEVICE_ID_ADL_2301		0x2301
-
-#define PCI_VENDOR_ID_SYMPHONY		0x1c1c
-#define PCI_DEVICE_ID_SYMPHONY_101	0x0001
-
-#define PCI_VENDOR_ID_TRIDENT		0x1023
-#define PCI_DEVICE_ID_TRIDENT_9420	0x9420
-#define PCI_DEVICE_ID_TRIDENT_9440	0x9440
-
-#define PCI_VENDOR_ID_CONTAQ		0x1080
-#define PCI_DEVICE_ID_CONTAQ_82C599	0x0600
-
-#define PCI_VENDOR_ID_NS		0x100b
-#define PCI_DEVICE_ID_NS_87410		0xd001
+#define PCI_VENDOR_ID_UMC		0x1060
+#define PCI_DEVICE_ID_UMC_UM8673F	0x0101
+#define PCI_DEVICE_ID_UMC_UM8891A	0x0891
+#define PCI_DEVICE_ID_UMC_UM8886A	0x886a
+#define PCI_DEVICE_ID_UMC_UM8881F	0x8881
+#define PCI_DEVICE_ID_UMC_UM8886F	0x8886
 
-#define PCI_VENDOR_ID_VIA		0x1106
-#define PCI_DEVICE_ID_VIA_82C505	0x0505
-#define PCI_DEVICE_ID_VIA_82C576	0x0576
-#define PCI_DEVICE_ID_VIA_82C561	0x0561
+#define PCI_VENDOR_ID_X			0x1061
+#define PCI_DEVICE_ID_X_AGX016		0x0001
 
-#define PCI_VENDOR_ID_SI		0x1039
-#define PCI_DEVICE_ID_SI_496		0x0496
-#define PCI_DEVICE_ID_SI_501		0x0406
-#define PCI_DEVICE_ID_SI_503		0x0008
-#define PCI_DEVICE_ID_SI_601		0x0601
+#define PCI_VENDOR_ID_QLOGIC		0x1077
+#define PCI_DEVICE_ID_QLOGIC_ISP1020	0x1020
+#define PCI_DEVICE_ID_QLOGIC_ISP1022	0x1022
 
 #define PCI_VENDOR_ID_LEADTEK		0x107d
 #define PCI_DEVICE_ID_LEADTEK_805	0x0000
 
-#define PCI_VENDOR_ID_IMS		0x10e0
-#define PCI_DEVICE_ID_IMS_8849		0x8849
-
-#define PCI_VENDOR_ID_ZEINET		0x1193
-#define PCI_DEVICE_ID_ZEINET_1221	0x0001
-
-#define PCI_VENDOR_ID_EF		0x111a
-#define PCI_DEVICE_ID_EF_ATM		0x0000
+#define PCI_VENDOR_ID_CONTAQ		0x1080
+#define PCI_DEVICE_ID_CONTAQ_82C599	0x0600
 
-#define PCI_VENDOR_ID_HER		0xedd8
-#define PCI_DEVICE_ID_HER_STING		0xa091
-#define PCI_DEVICE_ID_HER_STINGARK	0xa099
+#define PCI_VENDOR_ID_OLICOM		0x108d
 
-#define PCI_VENDOR_ID_ATRONICS		0x907f
-#define PCI_DEVICE_ID_ATRONICS_2015	0x2015
+#define PCI_VENDOR_ID_CMD		0x1095
+#define PCI_DEVICE_ID_CMD_640		0x0640
 
-#define PCI_VENDOR_ID_CT		0x102c
-#define PCI_DEVICE_ID_CT_65545		0x00d8
+#define PCI_VENDOR_ID_VISION		0x1098
+#define PCI_DEVICE_ID_VISION_QD8500	0x0001
+#define PCI_DEVICE_ID_VISION_QD8580	0x0002
 
-#define PCI_VENDOR_ID_FD		0x1036
-#define PCI_DEVICE_ID_FD_36C70		0x0000
+#define PCI_VENDOR_ID_ACC		0x10aa
 
 #define PCI_VENDOR_ID_WINBOND		0x10ad
 #define PCI_DEVICE_ID_WINBOND_83769	0x0001
@@ -401,40 +361,83 @@
 #define PCI_DEVICE_ID_3COM_3C595T4	0x5951
 #define PCI_DEVICE_ID_3COM_3C595MII	0x5952
 
-#define PCI_VENDOR_ID_PROMISE		0x105a
-#define PCI_DEVICE_ID_PROMISE_5300	0x5300
-
-#define PCI_VENDOR_ID_QLOGIC		0x1077
-#define PCI_DEVICE_ID_QLOGIC_ISP1020	0x1020
-#define PCI_DEVICE_ID_QLOGIC_ISP1022	0x1022
+#define PCI_VENDOR_ID_AL		0x10b9
+#define PCI_DEVICE_ID_AL_M1445		0x1445
+#define PCI_DEVICE_ID_AL_M1449		0x1449
+#define PCI_DEVICE_ID_AL_M1451		0x1451
+#define PCI_DEVICE_ID_AL_M1461		0x1461
+#define PCI_DEVICE_ID_AL_M4803		0x5215
 
-#define PCI_VENDOR_ID_X			0x1061
-#define PCI_DEVICE_ID_X_AGX016		0x0001
+#define PCI_VENDOR_ID_IMS		0x10e0
+#define PCI_DEVICE_ID_IMS_8849		0x8849
 
-#define PCI_VENDOR_ID_ACC		0x10aa
+#define PCI_VENDOR_ID_VIA		0x1106
+#define PCI_DEVICE_ID_VIA_82C505	0x0505
+#define PCI_DEVICE_ID_VIA_82C561	0x0561
+#define PCI_DEVICE_ID_VIA_82C576	0x0576
 
 #define PCI_VENDOR_ID_VORTEX		0x1119
 #define PCI_DEVICE_ID_VORTEX_GDT	0x0001
 
-#define PCI_VENDOR_ID_HP		0x103c
-#define PCI_DEVICE_ID_HP_J2585A		0x1030
+#define PCI_VENDOR_ID_EF		0x111a
+#define PCI_DEVICE_ID_EF_ATM		0x0000
 
-#define PCI_VENDOR_ID_TEKRAM		0x1de1
-#define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
+#define PCI_VENDOR_ID_IMAGINGTECH	0x112f
+#define PCI_DEVICE_ID_IMAGINGTECH_ICPCI	0x0000
+
+#define PCI_VENDOR_ID_PLX		0x113c
+#define PCI_DEVICE_ID_PLX_9060		0x0001
 
 #define PCI_VENDOR_ID_MUTECH		0x1159
 #define PCI_DEVICE_ID_MUTECH_MV1000	0x0001
 
-#define PCI_VENDOR_ID_IMAGINGTECH	0x112f
-#define PCI_DEVICE_ID_IMAGINGTECH_ICPCI	0x0000
+#define PCI_VENDOR_ID_ZEINET		0x1193
+#define PCI_DEVICE_ID_ZEINET_1221	0x0001
 
 #define PCI_VENDOR_ID_CYCLADES		0x120e
 #define PCI_DEVICE_ID_CYCLADES_Y	0x0100
 
-#define PCI_VENDOR_ID_PLX		0x113c
-#define PCI_DEVICE_ID_PLX_9060		0x0001
+#define PCI_VENDOR_ID_SYMPHONY		0x1c1c
+#define PCI_DEVICE_ID_SYMPHONY_101	0x0001
 
-#define PCI_VENDOR_ID_OLICOM		0x108d
+#define PCI_VENDOR_ID_TEKRAM		0x1de1
+#define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
+
+#define PCI_VENDOR_ID_S3		0x5333
+#define PCI_DEVICE_ID_S3_811		0x8811
+#define PCI_DEVICE_ID_S3_868		0x8880
+#define PCI_DEVICE_ID_S3_928		0x88b0
+#define PCI_DEVICE_ID_S3_864_1		0x88c0
+#define PCI_DEVICE_ID_S3_864_2		0x88c1
+#define PCI_DEVICE_ID_S3_964_1		0x88d0
+#define PCI_DEVICE_ID_S3_964_2		0x88d1
+#define PCI_DEVICE_ID_S3_968		0x88f0
+
+#define PCI_VENDOR_ID_INTEL		0x8086
+#define PCI_DEVICE_ID_INTEL_82375	0x0482
+#define PCI_DEVICE_ID_INTEL_82424	0x0483
+#define PCI_DEVICE_ID_INTEL_82378	0x0484
+#define PCI_DEVICE_ID_INTEL_82430	0x0486
+#define PCI_DEVICE_ID_INTEL_82434	0x04a3
+#define PCI_DEVICE_ID_INTEL_7116	0x1223
+#define PCI_DEVICE_ID_INTEL_82865	0x1227
+#define PCI_DEVICE_ID_INTEL_82437	0x122d
+#define PCI_DEVICE_ID_INTEL_82371	0x122e
+#define PCI_DEVICE_ID_INTEL_82438	0x1230
+#define PCI_DEVICE_ID_INTEL_P6		0x84c4
+
+#define PCI_VENDOR_ID_ADAPTEC		0x9004
+#define PCI_DEVICE_ID_ADAPTEC_7850	0x5078
+#define PCI_DEVICE_ID_ADAPTEC_294x	0x7078
+#define PCI_DEVICE_ID_ADAPTEC_2940	0x7178
+#define PCI_DEVICE_ID_ADAPTEC_7872	0x7278
+
+#define PCI_VENDOR_ID_ATRONICS		0x907f
+#define PCI_DEVICE_ID_ATRONICS_2015	0x2015
+
+#define PCI_VENDOR_ID_HER		0xedd8
+#define PCI_DEVICE_ID_HER_STING		0xa091
+#define PCI_DEVICE_ID_HER_STINGARK	0xa099
 
 /*
  * The PCI interface treats multi-function devices as independent
diff -u --recursive --new-file v1.3.24/linux/include/linux/sched.h linux/include/linux/sched.h
--- v1.3.24/linux/include/linux/sched.h	Thu Sep  7 17:17:19 1995
+++ linux/include/linux/sched.h	Sat Sep  9 09:59:37 1995
@@ -275,6 +275,10 @@
 extern struct timeval xtime;
 extern int need_resched;
 
+extern unsigned long * prof_buffer;
+extern unsigned long prof_len;
+extern unsigned long prof_shift;
+
 #define CURRENT_TIME (xtime.tv_sec)
 
 extern void sleep_on(struct wait_queue ** p);
diff -u --recursive --new-file v1.3.24/linux/init/main.c linux/init/main.c
--- v1.3.24/linux/init/main.c	Sun Sep  3 12:27:03 1995
+++ linux/init/main.c	Sat Sep  9 09:59:37 1995
@@ -29,8 +29,6 @@
 
 #include <asm/bugs.h>
 
-extern unsigned long * prof_buffer;
-extern unsigned long prof_len;
 extern char _stext, _etext;
 extern char *linux_banner;
 
@@ -144,11 +142,24 @@
 	return(cur);
 }
 
+static void profile_setup(char *str, int *ints)
+{
+	if (ints[0] > 0)
+		prof_shift = (unsigned long) ints[1];
+	else
+#ifdef CONFIG_PROFILE_SHIFT
+		prof_shift = CONFIG_PROFILE_SHIFT;
+#else
+		prof_shift = 2;
+#endif
+}
+
 struct {
 	const char *str;
 	void (*setup_func)(char *, int *);
 } bootsetups[] = {
 	{ "reserve=", reserve_setup },
+	{ "profile=", profile_setup },
 	{ "ramdisk=", ramdisk_setup },
 #ifdef CONFIG_BUGi386
 	{ "no-hlt", no_halt },
@@ -387,12 +398,20 @@
 	parse_options(command_line);
 	init_modules();
 #ifdef CONFIG_PROFILE
-	prof_buffer = (unsigned long *) memory_start;
-	/* only text is profiled */
-	prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
-	prof_len >>= CONFIG_PROFILE_SHIFT;
-	memory_start += prof_len * sizeof(unsigned long);
+	if (!prof_shift)
+#ifdef CONFIG_PROFILE_SHIFT
+		prof_shift = CONFIG_PROFILE_SHIFT;
+#else
+		prof_shift = 2;
+#endif
 #endif
+	if (prof_shift) {
+		prof_buffer = (unsigned long *) memory_start;
+		/* only text is profiled */
+		prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
+		prof_len >>= prof_shift;
+		memory_start += prof_len * sizeof(unsigned long);
+	}
 	memory_start = console_init(memory_start,memory_end);
 #ifdef CONFIG_PCI
 	memory_start = pci_init(memory_start,memory_end);
diff -u --recursive --new-file v1.3.24/linux/kernel/fork.c linux/kernel/fork.c
--- v1.3.24/linux/kernel/fork.c	Thu Sep  7 17:17:19 1995
+++ linux/kernel/fork.c	Sat Sep  9 11:19:51 1995
@@ -188,6 +188,7 @@
 int do_fork(unsigned long clone_flags, unsigned long usp, struct pt_regs *regs)
 {
 	int nr;
+	int error = -ENOMEM;
 	unsigned long new_stack;
 	struct task_struct *p;
 	struct allocation_struct *alloc;
@@ -199,6 +200,7 @@
 	new_stack = get_free_page(GFP_KERNEL);
 	if (!new_stack)
 		goto bad_fork_free;
+	error = -EAGAIN;
 	nr = find_empty_process();
 	if (nr < 0)
 		goto bad_fork_free;
@@ -234,6 +236,7 @@
 	SET_LINKS(p);
 	nr_tasks++;
 
+	error = -ENOMEM;
 	/* copy all the process information */
 	copy_thread(nr, clone_flags, usp, p, regs);
 	if (copy_mm(clone_flags, alloc))
@@ -249,7 +252,12 @@
 	p->counter = current->counter >> 1;
 	wake_up_process(p);			/* do this last, just in case */
 	return p->pid;
+
 bad_fork_cleanup:
+	if (p->exec_domain && p->exec_domain->use_count)
+		(*p->exec_domain->use_count)--;
+	if (p->binfmt && p->binfmt->use_count)
+		(*p->binfmt->use_count)--;
 	task[nr] = NULL;
 	REMOVE_LINKS(p);
 	nr_tasks--;
@@ -257,5 +265,5 @@
 	free_page(new_stack);
 	free_page((long) p);
 bad_fork:
-	return -EAGAIN;
+	return error;
 }
diff -u --recursive --new-file v1.3.24/linux/kernel/sched.c linux/kernel/sched.c
--- v1.3.24/linux/kernel/sched.c	Thu Sep  7 17:17:19 1995
+++ linux/kernel/sched.c	Sat Sep  9 09:38:30 1995
@@ -71,6 +71,7 @@
 extern int _setitimer(int, struct itimerval *, struct itimerval *);
 unsigned long * prof_buffer = NULL;
 unsigned long prof_len = 0;
+unsigned long prof_shift = 0;
 
 #define _S(nr) (1<<((nr)-1))
 
@@ -536,7 +537,7 @@
 	struct timer_list * timer;
 
 	cli();
-	while ((timer = timer_head.next) != &timer_head && timer->expires < jiffies) {
+	while ((timer = timer_head.next) != &timer_head && timer->expires <= jiffies) {
 		void (*fn)(unsigned long) = timer->function;
 		unsigned long data = timer->data;
 		timer->next->prev = timer->prev;
@@ -664,15 +665,13 @@
 		current->stime++;
 		if(current != task[0])
 			kstat.cpu_system++;
-#ifdef CONFIG_PROFILE
 		if (prof_buffer && current != task[0]) {
 			extern int _stext;
 			unsigned long eip = regs->eip - (unsigned long) &_stext;
-			eip >>= CONFIG_PROFILE_SHIFT;
+			eip >>= prof_shift;
 			if (eip < prof_len)
 				prof_buffer[eip]++;
 		}
-#endif
 	}
 	/*
 	 * check the cpu time limit on the process.
@@ -711,7 +710,7 @@
 		mark_bh(TIMER_BH);
 	}
 	cli();
-	if (timer_head.next->expires < jiffies)
+	if (timer_head.next->expires <= jiffies)
 		mark_bh(TIMER_BH);
 	if (tq_timer != &tq_last)
 		mark_bh(TQUEUE_BH);
diff -u --recursive --new-file v1.3.24/linux/mm/filemap.c linux/mm/filemap.c
--- v1.3.24/linux/mm/filemap.c	Thu Sep  7 17:17:19 1995
+++ linux/mm/filemap.c	Sat Sep  9 10:47:18 1995
@@ -178,6 +178,7 @@
 		if (pte_none(pte))
 			return 0;
 		pte_clear(ptep);
+		invalidate();
 		if (!pte_present(pte)) {
 			swap_free(pte_val(pte));
 			return 0;
diff -u --recursive --new-file v1.3.24/linux/mm/memory.c linux/mm/memory.c
--- v1.3.24/linux/mm/memory.c	Thu Sep  7 17:17:20 1995
+++ linux/mm/memory.c	Sat Sep  9 09:37:24 1995
@@ -199,11 +199,11 @@
 		return;
 	}
 	SET_PAGE_DIR(tsk, swapper_pg_dir);
-	tsk->mm->pgd = swapper_pg_dir;
 	if (pgd_inuse(page_dir)) {
 		pgd_free(page_dir);
 		return;
 	}
+	tsk->mm->pgd = swapper_pg_dir;	/* or else... */
 	for (i = 0 ; i < PTRS_PER_PGD ; i++)
 		free_one_pgd(page_dir + i);
 	pgd_free(page_dir);
diff -u --recursive --new-file v1.3.24/linux/net/Changes linux/net/Changes
--- v1.3.24/linux/net/Changes	Thu Sep  7 17:17:20 1995
+++ linux/net/Changes	Thu Sep  7 17:11:48 1995
@@ -188,7 +188,7 @@
 o	Generate BSD ENETDOWN errors			[TESTED]
 o	Clean device unload bug<Walter Wolfgang>	[IN]
 
--------->>>>> 1.3.23 <<<<<-------
+-------->>>>> 1.3.24 <<<<<-------
 
 o	Missing IGMP includes fixes			[TESTED]
 o	Smarter buffer use options for sockets		[IN]
@@ -197,6 +197,11 @@
 o	IOVEC's support repeated calls to copy more	[IN]
 o	Zero fragment 'solaris nfs' bug fixed <Werner>  [IN]
 o	NetROM supports sendmsg/recvmsg			[IN]
+o	Sendmsg verify_iovec bugfix			[IN]
+o	ARP PERM is really permanent now <Craig>	[IN]
+o	IPIP tunnels work fully we hope			[IN]
+o	Closing socket change (Marc Tamsky)		[IN]
+o	RFC1122 verification of tcp.c <Mike Shaver>	[IN]
 
 ---------- Things Linus had for a while and not merged ----------------
 
@@ -211,9 +216,10 @@
 o	IPFW support for TOS changing (Al Longyear)
 o	/dev/skip /dev/ipah etc - Kernel/Usermode communications module (me)
 o	AF_UNIX garbage collect code
-o	Closing socket change (Marc Tamsky)
 o	Faster closedown option for heavy use sites (me)
 
+o	NEW NET TOOLS..... - wanted one net tools maintainer....
+
 --------------- Tbings That Need Doing Before 1.4 ------------------
 
 o	Finish merging the bridge code
@@ -223,6 +229,7 @@
 o	Fast dev_grab_next() transmit reload function
 	and dev_push_failed() ??
 o	Faster ip_forward last hit cache		[PENDING(GuruA0)]
+o	L2 ip routing cache				[PENDING(btv)]
 o	Forwarding queue control (+ fairness algorithms ??)
 o	IP forward flow control.
 o	Infinite PPP devices.
@@ -230,7 +237,7 @@
 o	Clean up RAW AX.25 sockets.
 o	Finish 802.2 Class I code to be compliant to the oddities of 802.2
 o	Full variable length AX.25 support		[JSN doing]
-o	Tidy BPQ support to use an bpqip tunnel device
+o	Tidy BPQ support to use a bpqip tunnel device
 o	Strange eth0-eth3 bug 
 o	Finish IPIP bug fixes
 o	Why doesnt the PROTO_UNREACH get sent ?
@@ -257,8 +264,8 @@
 o	IP firewalling performance - caching and radix trees.
 o	Zebedee
 o	802.2 Class 2 services (eg netbios).
-o	Multidrop KISS
-o	Multicast routing
+o	Multidrop KISS					[NOW AVAILABLE IN USER MODE]
+o	Multicast routing				[STARTED BITS]
 o	IPX/Atalk/Netrom firewalling
 
 Possible projects for victim^H^H^H^H^Holunteers
@@ -266,7 +273,7 @@
 
 1.	Verifying the correctness of implementation against RFC1122 and
 making a list of violations (BSD is sufficiently screwed up you can't
-implement all of RFC1122 and talk to it usefully). [In progress - Mike
+implement all of RFC1122 and talk to it usefully). [Done - Mike
 Shaver]
 
 2.	Verifying all the error returns match the BSD ones (grotty job I
@@ -302,7 +309,7 @@
 from term].
 
 8.	Making SLIP/PPP dynamically allocate devices so you never run out
-of channels.	[Taken/Done pending inclusion]
+of channels.	[Done (pending inclusion in the PPP case)]
 
 9.	Implementing streams. Not as a blind slow SYS5.4 style copy but actually
 working out how to do it so it runs like greased lightning. Quite a big
@@ -319,13 +326,14 @@
 
 13.	Mrouted Multicast routing. Or possibly MOSPF and others
 	as they become available
-	[Some interest: see/join linux-multicast@www.linux.org.uk
+	[Started: see/join linux-multicast@www.linux.org.uk
          if you wish to join in]
 
 14.	Bidirectional PLIP. Also PLIP for the newer style parallel ports.
 
 15.	802.2LLC and thus Netbeui sockets. Becoming less important since the
-rumour is microsoft are phasing out netbeui for netbios/IP.	
+rumour is microsoft are phasing out netbeui for netbios/IP. Microsoft have
+gone for netbios/funny-ipx-variant it seems in Win95, but TCP is selectable.
 	[Tentatively in progress]
 
 16.	X.25. This is one for a real head case with far too much time on 
diff -u --recursive --new-file v1.3.24/linux/net/ax25/af_ax25.c linux/net/ax25/af_ax25.c
--- v1.3.24/linux/net/ax25/af_ax25.c	Thu Sep  7 17:17:20 1995
+++ linux/net/ax25/af_ax25.c	Thu Sep  7 17:11:47 1995
@@ -476,6 +476,8 @@
 			if (ax25_findbyuid(sax->sax25_uid))
 				return -EEXIST;
 			a = (ax25_uid_assoc *)kmalloc(sizeof(*a), GFP_KERNEL);
+			if (a == NULL)
+				return -ENOMEM;
 			a->uid  = sax->sax25_uid;
 			a->call = sax->sax25_call;
 			a->next = ax25_uid_list;
diff -u --recursive --new-file v1.3.24/linux/net/core/dev.c linux/net/core/dev.c
--- v1.3.24/linux/net/core/dev.c	Sun Sep  3 16:12:49 1995
+++ linux/net/core/dev.c	Thu Sep  7 17:11:48 1995
@@ -37,6 +37,7 @@
  *	Richard Kooijman	:	Timestamp fixes.
  *		Alan Cox	:	Wrong field in SIOCGIFDSTADDR
  *		Alan Cox	:	Device lock protection.
+ *		Alan Cox	: 	Fixed nasty side effect of device close changes.
  *
  *	Cleaned up and recommented by Alan Cox 2nd April 1994. I hope to have
  *	the rest as well commented in the end.
@@ -1024,6 +1025,11 @@
 		
 				if ((old_flags & IFF_UP) && ((dev->flags & IFF_UP) == 0)) 
 				{
+					/*
+					 *	Restore IFF_UP so dev_close knows to shut
+					 *	it down. FIXME: Tidy me up sometime.
+					 */
+					dev->flags|=IFF_UP;
 					ret = dev_close(dev);
 				}
 				else
diff -u --recursive --new-file v1.3.24/linux/net/core/iovec.c linux/net/core/iovec.c
--- v1.3.24/linux/net/core/iovec.c	Thu Sep  7 17:17:20 1995
+++ linux/net/core/iovec.c	Thu Sep  7 17:11:46 1995
@@ -50,12 +50,16 @@
 	
 	for(ct=0;ct<m->msg_iovlen;ct++)
 	{
-		err=verify_area(mode, m->msg_iov[ct].iov_base, m->msg_iov[ct].iov_len);
+		err=verify_area(VERIFY_READ, &m->msg_iov[ct], sizeof(struct iovec));
 		if(err)
 			return err;
-		len+=m->msg_iov[ct].iov_len;
+		memcpy_fromfs(&iov[ct], &m->msg_iov[ct], sizeof(struct iovec));
+		err=verify_area(mode, iov[ct].iov_base, iov[ct].iov_len);
+		if(err)
+			return err;
+		len+=iov[ct].iov_len;
 	}
-	
+	m->msg_iov=&iov[0];
 	return len;
 }
 
diff -u --recursive --new-file v1.3.24/linux/net/ipv4/arp.c linux/net/ipv4/arp.c
--- v1.3.24/linux/net/ipv4/arp.c	Sun Sep  3 12:27:05 1995
+++ linux/net/ipv4/arp.c	Thu Sep  7 17:11:48 1995
@@ -42,7 +42,9 @@
  *		Mike Shaver     :       RFC1122 checks.
  *		Jonathan Naylor :	Only lookup the hardware address for
  *					the correct hardware type.
- *		Germano Caronni	:	Assorted subtle races
+ *		Germano Caronni	:	Assorted subtle races.
+ *		Craig Schlenter :	Don't modify permanent entry 
+ *					during arp_rcv.
  */
 
 /* RFC1122 Status:
@@ -93,9 +95,9 @@
 
 /*
  *	This structure defines the ARP mapping cache. As long as we make changes
- *	in this structure, we keep interrupts of. But normally we can copy the
- *	hardware address and the device pointer in a local variable and then make
- *	any "long calls" to send a packet out.
+ *	in this structure, we keep interrupts off. But normally we can copy the
+ *	hardware address and the device pointer in a local variable and then 
+ *	make any "long calls" to send a packet out.
  */
 
 struct arp_table
@@ -811,11 +813,13 @@
 	if(entry)
 	{
 /*
- *	Entry found; update it.
+ *	Entry found; update it only if it is not a permanent entry.
  */
-		memcpy(entry->ha, sha, hlen);
-		entry->hlen = hlen;
-		entry->last_used = jiffies;
+		if (!(entry->flags & ATF_PERM)) {
+			memcpy(entry->ha, sha, hlen);
+			entry->hlen = hlen;
+			entry->last_used = jiffies;
+		}
 		if (!(entry->flags & ATF_COM))
 		{
 /*
diff -u --recursive --new-file v1.3.24/linux/net/ipv4/ip.c linux/net/ipv4/ip.c
--- v1.3.24/linux/net/ipv4/ip.c	Thu Sep  7 17:17:21 1995
+++ linux/net/ipv4/ip.c	Thu Sep  7 17:11:48 1995
@@ -1055,6 +1055,9 @@
 	unsigned long raddr;	/* Router IP address */
 #ifdef CONFIG_IP_FIREWALL
 	int fw_res = 0;		/* Forwarding result */	
+#ifdef CONFIG_IP_MASQUERADE	
+	struct sk_buff *skb_in = skb;	/* So we can remember if the masquerader did some swaps */
+#endif	
 	
 	/* 
 	 *	See if we are allowed to forward this.
@@ -1295,10 +1298,22 @@
 	
 	/*
 	 *	Tell the caller if their buffer is free.
-	 */
+	 */	 
 	 
 	if(skb==skb2)
+		return 0;	
+
+#ifdef CONFIG_IP_MASQUERADE	
+	/*
+	 *	The original is free. Free our copy and
+	 *	tell the caller not to free.
+	 */
+	if(skb!=skb_in)
+	{
+		kfree_skb(skb_in, FREE_WRITE);
 		return 0;
+	}
+#endif	
 	return 1;
 }
 
@@ -2557,6 +2572,8 @@
 			if(dev->hard_header(skb,dev,ETH_P_IP,NULL,NULL,0)>0)
 				skb->arp=1;
 		}
+		else
+			skb->arp=1;
 		skb->ip_hdr=iph=(struct iphdr *)skb_put(skb,length);
 		dev_lock_list();
 		if(!sk->ip_hdrincl)
diff -u --recursive --new-file v1.3.24/linux/net/ipv4/ip_fw.c linux/net/ipv4/ip_fw.c
--- v1.3.24/linux/net/ipv4/ip_fw.c	Sun Sep  3 12:27:05 1995
+++ linux/net/ipv4/ip_fw.c	Thu Sep  7 17:11:46 1995
@@ -38,9 +38,8 @@
  * Fixes:
  *	Pauline Middelink	:	Added masquerading.
  *	Alan Cox		:	Fixed an error in the merge.
- *
- * TODO:
- *	Fix the PORT spoof crash.
+ *	Thomas Quinot		:	Fixed port spoofing.
+ *	Alan Cox		:	Cleaned up retransmits in spoofing.
  *
  *	All the real work was done by .....
  *
@@ -586,7 +585,8 @@
 	unsigned long from;
 	unsigned short port;
 	struct ip_masq *ms;
-	char buf[20];		/* xxx.xxx.xxx.xxx\r\n */
+	char buf[24];		/* xxx.xxx.xxx.xxx,ppp,ppp\000 */
+	int diff;
 	
 	/*
 	 * Adjust seq and ack_seq with delta-offset for
@@ -600,9 +600,9 @@
 
 	while (skb->len - ((unsigned char *)data - skb->h.raw) > 18)
 	{
-		if (memcmp(data,"PORT ",5)!=0 && memcmp(data,"port ",5)!=0) 
+		if (memcmp(data,"PORT ",5) && memcmp(data,"port ",5)) 
 		{
-			data += 5;
+			data ++;
 			continue;
 		}
 		p = data+5;
@@ -655,8 +655,14 @@
 		/*
 		 * Calculate required delta-offset to keep TCP happy
 		 */
-		ftp->delta += strlen(buf) - (data-p);
-		if (ftp->delta==0) 
+		
+		diff = strlen(buf) - (data-p);
+		
+		/*
+		 *	No shift.
+		 */
+		 
+		if (diff==0) 
 		{
 			/*
 			 * simple case, just replace the old PORT cmd
@@ -667,6 +673,18 @@
  		}
  
  		/*
+ 		 *	If the PORT command we have fiddled is the first, or is a
+ 		 *	resend don't do the delta shift again. Doesn't work for
+ 		 *	pathological cases, but we would need a history for that.
+ 		 *	Also fails if you send 2^31 bytes of data down the link 
+ 		 *	after the first port command.
+ 		 *
+ 		 *	FIXME: use ftp->init_seq_valid - 0 is a valid sequence.
+ 		 */
+ 		 
+ 		if(!ftp->init_seq || after(ftp->init_seq,th->seq))
+ 			ftp->delta+=diff;
+ 		/*
  		 * Sizes differ, make a copy
  		 */
  printk("MASQUERADE: resizing needed for %d bytes (%ld)\n",ftp->delta, skb->len);
@@ -681,7 +699,9 @@
  		skb2->free = skb->free;
  		skb_reserve(skb2,MAX_HEADER);
  		skb_put(skb2,skb->len + ftp->delta);
- 		skb2->h.raw = &skb2->data[skb->h.raw - skb->data];
+/* 		skb2->h.raw = &skb2->data[skb->h.raw - skb->data];*/
+		skb2->h.raw = skb2->data + (skb->h.raw - skb->data);
+		iph=skb2->h.iph;
  
  		/*
  		 *	Copy the packet data into the new buffer.
@@ -690,7 +710,7 @@
  		memcpy(skb2->data, skb->data, (p - (char *)skb->data));
  		memcpy(&skb2->data[(p - (char *)skb->data)], buf, strlen(buf));
 		memcpy(&skb2->data[(p - (char *)skb->data) + strlen(buf)], data,
-			skb->len - ((char *)skb->h.raw - data));
+			skb->len - (data-(char *)skb->data));
 
 		/*
 		 * Problem, how to replace the new skb with old one,
@@ -798,6 +818,7 @@
  			*skb_ptr = skb;
  			iph = skb->h.iph;
  			portptr = (unsigned short *)&(((char *)iph)[iph->ihl*4]);
+ 			size = skb->len - ((unsigned char *)portptr-skb->h.raw);
  		}
  		th = (struct tcphdr *)portptr;
  
diff -u --recursive --new-file v1.3.24/linux/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- v1.3.24/linux/net/ipv4/tcp.c	Thu Sep  7 17:17:21 1995
+++ linux/net/ipv4/tcp.c	Thu Sep  7 17:11:46 1995
@@ -22,47 +22,61 @@
  * Fixes:	
  *		Alan Cox	:	Numerous verify_area() calls
  *		Alan Cox	:	Set the ACK bit on a reset
- *		Alan Cox	:	Stopped it crashing if it closed while sk->inuse=1
- *					and was trying to connect (tcp_err()).
+ *		Alan Cox	:	Stopped it crashing if it closed while
+ *					sk->inuse=1 and was trying to connect 
+ *					(tcp_err()).
  *		Alan Cox	:	All icmp error handling was broken
  *					pointers passed where wrong and the
  *					socket was looked up backwards. Nobody
  *					tested any icmp error code obviously.
- *		Alan Cox	:	tcp_err() now handled properly. It wakes people
- *					on errors. select behaves and the icmp error race
+ *		Alan Cox	:	tcp_err() now handled properly. It 
+ *					wakes people on errors. select 
+ *					behaves and the icmp error race
  *					has gone by moving it into sock.c
- *		Alan Cox	:	tcp_reset() fixed to work for everything not just
- *					packets for unknown sockets.
+ *		Alan Cox	:	tcp_reset() fixed to work for 
+ *					everything not just packets for 
+ *					unknown sockets.
  *		Alan Cox	:	tcp option processing.
- *		Alan Cox	:	Reset tweaked (still not 100%) [Had syn rule wrong]
+ *		Alan Cox	:	Reset tweaked (still not 100%) [Had 
+ *					syn rule wrong]
  *		Herp Rosmanith  :	More reset fixes
- *		Alan Cox	:	No longer acks invalid rst frames. Acking
- *					any kind of RST is right out.
- *		Alan Cox	:	Sets an ignore me flag on an rst receive
- *					otherwise odd bits of prattle escape still
- *		Alan Cox	:	Fixed another acking RST frame bug. Should stop
- *					LAN workplace lockups.
- *		Alan Cox	: 	Some tidyups using the new skb list facilities
+ *		Alan Cox	:	No longer acks invalid rst frames. 
+ *					Acking any kind of RST is right out.
+ *		Alan Cox	:	Sets an ignore me flag on an rst 
+ *					receive otherwise odd bits of prattle 
+ *					escape still
+ *		Alan Cox	:	Fixed another acking RST frame bug. 
+ *					Should stop LAN workplace lockups.
+ *		Alan Cox	: 	Some tidyups using the new skb list 
+ *					facilities
  *		Alan Cox	:	sk->keepopen now seems to work
  *		Alan Cox	:	Pulls options out correctly on accepts
  *		Alan Cox	:	Fixed assorted sk->rqueue->next errors
- *		Alan Cox	:	PSH doesn't end a TCP read. Switched a bit to skb ops.
- *		Alan Cox	:	Tidied tcp_data to avoid a potential nasty.
- *		Alan Cox	:	Added some better commenting, as the tcp is hard to follow
+ *		Alan Cox	:	PSH doesn't end a TCP read. Switched a
+ *					bit to skb ops.
+ *		Alan Cox	:	Tidied tcp_data to avoid a potential 
+ *					nasty.
+ *		Alan Cox	:	Added some better commenting, as the 
+ *					tcp is hard to follow
  *		Alan Cox	:	Removed incorrect check for 20 * psh
  *	Michael O'Reilly	:	ack < copied bug fix.
  *	Johannes Stille		:	Misc tcp fixes (not all in yet).
  *		Alan Cox	:	FIN with no memory -> CRASH
- *		Alan Cox	:	Added socket option proto entries. Also added awareness of them to accept.
+ *		Alan Cox	:	Added socket option proto entries. 
+ *					Also added awareness of them to accept.
  *		Alan Cox	:	Added TCP options (SOL_TCP)
- *		Alan Cox	:	Switched wakeup calls to callbacks, so the kernel can layer network sockets.
+ *		Alan Cox	:	Switched wakeup calls to callbacks, 
+ *					so the kernel can layer network 
+ *					sockets.
  *		Alan Cox	:	Use ip_tos/ip_ttl settings.
  *		Alan Cox	:	Handle FIN (more) properly (we hope).
- *		Alan Cox	:	RST frames sent on unsynchronised state ack error/
+ *		Alan Cox	:	RST frames sent on unsynchronised 
+ *					state ack error.
  *		Alan Cox	:	Put in missing check for SYN bit.
  *		Alan Cox	:	Added tcp_select_window() aka NET2E 
  *					window non shrink trick.
- *		Alan Cox	:	Added a couple of small NET2E timer fixes
+ *		Alan Cox	:	Added a couple of small NET2E timer 
+ *					fixes
  *		Charles Hedrick :	TCP fixes
  *		Toomas Tamm	:	TCP window fixes
  *		Alan Cox	:	Small URG fix to rlogin ^C ack fight
@@ -75,21 +89,28 @@
  *		Adam Caldwell	:	Assorted timer/timing errors
  *		Matthew Dillon	:	Fixed another RST bug
  *		Alan Cox	:	Move to kernel side addressing changes.
- *		Alan Cox	:	Beginning work on TCP fastpathing (not yet usable)
+ *		Alan Cox	:	Beginning work on TCP fastpathing 
+ *					(not yet usable)
  *		Arnt Gulbrandsen:	Turbocharged tcp_check() routine.
  *		Alan Cox	:	TCP fast path debugging
  *		Alan Cox	:	Window clamping
  *		Michael Riepe	:	Bug in tcp_check()
  *		Matt Dillon	:	More TCP improvements and RST bug fixes
- *		Matt Dillon	:	Yet more small nasties remove from the TCP code
- *					(Be very nice to this man if tcp finally works 100%) 8)
+ *		Matt Dillon	:	Yet more small nasties remove from the
+ *					TCP code (Be very nice to this man if 
+ *					tcp finally works 100%) 8)
  *		Alan Cox	:	BSD accept semantics. 
  *		Alan Cox	:	Reset on closedown bug.
  *	Peter De Schrijver	:	ENOTCONN check missing in tcp_sendto().
- *		Michael Pall	:	Handle select() after URG properly in all cases.
- *		Michael Pall	:	Undo the last fix in tcp_read_urg() (multi URG PUSH broke rlogin).
- *		Michael Pall	:	Fix the multi URG PUSH problem in tcp_readable(), select() after URG works now.
- *		Michael Pall	:	recv(...,MSG_OOB) never blocks in the BSD api.
+ *		Michael Pall	:	Handle select() after URG properly in 
+ *					all cases.
+ *		Michael Pall	:	Undo the last fix in tcp_read_urg() 
+ *					(multi URG PUSH broke rlogin).
+ *		Michael Pall	:	Fix the multi URG PUSH problem in 
+ *					tcp_readable(), select() after URG 
+ *					works now.
+ *		Michael Pall	:	recv(...,MSG_OOB) never blocks in the 
+ *					BSD api.
  *		Alan Cox	:	Changed the semantics of sk->socket to 
  *					fix a race and a signal problem with
  *					accept() and async I/O.
@@ -107,21 +128,23 @@
  *		Alan Cox	:	Reset tracing code.
  *		Alan Cox	:	Spurious resets on shutdown.
  *		Alan Cox	:	Giant 15 minute/60 second timer error
- *		Alan Cox	:	Small whoops in selecting before an accept.
- *		Alan Cox	:	Kept the state trace facility since it's
- *					handy for debugging.
+ *		Alan Cox	:	Small whoops in selecting before an 
+ *					accept.
+ *		Alan Cox	:	Kept the state trace facility since 
+ *					it's handy for debugging.
  *		Alan Cox	:	More reset handler fixes.
- *		Alan Cox	:	Started rewriting the code based on the RFC's
- *					for other useful protocol references see:  
- *					Comer, KA9Q NOS, and for a reference on the
- *					difference between specifications and how BSD
+ *		Alan Cox	:	Started rewriting the code based on 
+ *					the RFC's for other useful protocol 
+ *					references see: Comer, KA9Q NOS, and 
+ *					for a reference on the difference 
+ *					between specifications and how BSD
  *					works see the 4.4lite source.
  *		A.N.Kuznetsov	:	Don't time wait on completion of tidy 
  *					close.
  *		Linus Torvalds	:	Fin/Shutdown & copied_seq changes.
  *		Linus Torvalds	:	Fixed BSD port reuse to work first syn
- *		Alan Cox	:	Reimplemented timers as per the RFC and using multiple
- *					timers for sanity. 
+ *		Alan Cox	:	Reimplemented timers as per the RFC 
+ *					and using multiple timers for sanity. 
  *		Alan Cox	:	Small bug fixes, and a lot of new
  *					comments.
  *		Alan Cox	:	Fixed dual reader crash by locking
@@ -150,6 +173,8 @@
  *		Alan Cox	:	Look up device on a retransmit - routes may
  *					change. Doesn't yet cope with MSS shrink right
  *					but its a start!
+ *		Marc Tamsky	:	Closing in closing fixes.
+ *		Mike Shaver	:	RFC1122 verifications
  *
  *
  * To Fix:
@@ -218,6 +243,168 @@
  *	TCP_CLOSE		socket is finished
  */
 
+/*
+ * RFC1122 status:
+ * NOTE: I'm not going to be doing comments in the code for this one except
+ * for violations and the like.  tcp.c is just too big... If I say something
+ * "does?" or "doesn't?", it means I'm not sure, and will have to hash it out
+ * with Alan. -- MS 950903
+ * 
+ * Use of PSH (4.2.2.2)
+ *   MAY aggregate data sent without the PSH flag. (does)
+ *   MAY queue data recieved without the PSH flag. (does)
+ *   SHOULD collapse successive PSH flags when it packetizes data. (doesn't)
+ *   MAY implement PSH on send calls. (doesn't, thus:)
+ *     MUST NOT buffer data indefinitely (doesn't [1 second])
+ *     MUST set PSH on last segment (does)
+ *   MAY pass received PSH to application layer (doesn't)
+ *   SHOULD send maximum-sized segment whenever possible. (almost always does)
+ * 
+ * Window Size (4.2.2.3, 4.2.2.16)
+ *   MUST treat window size as an unsigned number (does)
+ *   SHOULD treat window size as a 32-bit number (does not)
+ *   MUST NOT shrink window once it is offered (does not normally)
+ *   
+ * Urgent Pointer (4.2.2.4)
+ * **MUST point urgent pointer to last byte of urgent data (not right
+ *     after). (doesn't, to be like BSD)
+ *   MUST inform application layer asynchronously of incoming urgent
+ *     data. (does)
+ *   MUST provide application with means of determining the amount of
+ *     urgent data pending. (does)
+ * **MUST support urgent data sequence of arbitrary length. (doesn't, but
+ *   it's sort of tricky to fix, as urg_ptr is a 16-bit quantity)
+ *	[Follows BSD 1 byte of urgent data]
+ * 
+ * TCP Options (4.2.2.5)
+ *   MUST be able to recieve TCP options in any segment. (does)
+ *   MUST ignore unsupported options (does)
+ *   
+ * Maximum Segment Size Option (4.2.2.6)
+ *   MUST implement both sending and receiving MSS. (does)
+ *   SHOULD send an MSS with every SYN where recieve MSS != 536 (MAY send
+ *     it always). (does, even when MSS == 536, which is legal)
+ *   MUST assume MSS == 536 if no MSS received at connection setup (does)
+ *   MUST calculate "effective send MSS" correctly:
+ *     min(physical_MTU, remote_MSS+20) - sizeof(tcphdr) - sizeof(ipopts)
+ *     (does - but allows operator override)
+ *  
+ * TCP Checksum (4.2.2.7)
+ *   MUST generate and check TCP checksum. (does)
+ * 
+ * Initial Sequence Number Selection (4.2.2.8)
+ *   MUST use the RFC 793 clock selection mechanism.  (doesn't, but it's
+ *     OK: RFC 793 specifies a 250KHz clock, while we use 1MHz, which is
+ *     necessary for 10Mbps networks - and harder than BSD to spoof!)
+ * 
+ * Simultaneous Open Attempts (4.2.2.10)
+ *   MUST support simultaneous open attempts (does)
+ * 
+ * Recovery from Old Duplicate SYN (4.2.2.11)
+ *   MUST keep track of active vs. passive open (does)
+ * 
+ * RST segment (4.2.2.12)
+ *   SHOULD allow an RST segment to contain data (does, but doesn't do
+ *     anything with it, which is standard)
+ * 
+ * Closing a Connection (4.2.2.13)
+ *   MUST inform application of whether connectin was closed by RST or
+ *     normal close. (does)
+ *   MAY allow "half-duplex" close (treat connection as closed for the
+ *     local app, even before handshake is done). (does)
+ *   MUST linger in TIME_WAIT for 2 * MSL (does)
+ * 
+ * Retransmission Timeout (4.2.2.15)
+ *   MUST implement Jacobson's slow start and congestion avoidance
+ *     stuff. (does) 
+ * 
+ * Probing Zero Windows (4.2.2.17)
+ *   MUST support probing of zero windows. (does)
+ *   MAY keep offered window closed indefinitely. (does)
+ *   MUST allow remote window to stay closed indefinitely. (does)
+ * 
+ * Passive Open Calls (4.2.2.18)
+ *   MUST NOT let new passive open affect other connections. (doesn't)
+ *   MUST support passive opens (LISTENs) concurrently. (does)
+ *   
+ * Time to Live (4.2.2.19)
+ *   MUST make TCP TTL configurable. (does - IP_TTL option)
+ * 
+ * Event Processing (4.2.2.20)
+ *   SHOULD queue out-of-order segments. (does)
+ *   MUST aggregate ACK segments whenever possible. (does but badly)
+ *   
+ * Retransmission Timeout Calculation (4.2.3.1)
+ *   MUST implement Karn's algorithm and Jacobson's algorithm for RTO
+ *     calculation. (does, or at least explains them in the comments 8*b)
+ *  SHOULD initialize RTO to 0 and RTT to 3. (does)
+ * 
+ * When to Send an ACK Segment (4.2.3.2)
+ *   SHOULD implement delayed ACK. (does not)
+ *   MUST keep ACK delay < 0.5 sec. (N/A)
+ * 
+ * When to Send a Window Update (4.2.3.3)
+ *   MUST implement receiver-side SWS. (does)
+ *   
+ * When to Send Data (4.2.3.4)
+ *   MUST implement sender-side SWS. (does - imperfectly)
+ *   SHOULD implement Nagle algorithm. (does)
+ * 
+ * TCP Connection Failures (4.2.3.5)
+ *  MUST handle excessive retransmissions "properly" (see the RFC). (does)
+ *   SHOULD inform application layer of soft errors. (doesn't)
+ *   
+ * TCP Keep-Alives (4.2.3.6)
+ *   MAY provide keep-alives. (does)
+ *   MUST make keep-alives configurable on a per-connection basis. (does)
+ *   MUST default to no keep-alives. (does)
+ * **MUST make keep-alive interval configurable. (doesn't)
+ * **MUST make default keep-alive interval > 2 hours. (doesn't)
+ *   MUST NOT interpret failure to ACK keep-alive packet as dead
+ *     connection. (doesn't)
+ *   SHOULD send keep-alive with no data. (does)
+ * 
+ * TCP Multihoming (4.2.3.7)
+ *   MUST get source address from IP layer before sending first
+ *     SYN. (does)
+ *   MUST use same local address for all segments of a connection. (does)
+ * 
+ * IP Options (4.2.3.8)
+ *   (I don't think the IP layer sees the IP options, yet.)
+ *   MUST ignore unsupported IP options. (does, I guess 8*b)
+ *   MAY support Time Stamp and Record Route. (doesn't)
+ * **MUST allow application to specify a source route. (doesn't?)
+ * **MUST allow receieved Source Route option to set route for all future
+ *     segments on this connection. (doesn't, not that I think it's a
+ *     huge problem)
+ * 
+ * ICMP messages (4.2.3.9)
+ *   MUST act on ICMP errors. (does)
+ *   MUST slow transmission upon receipt of a Source Quench. (does)
+ *   MUST NOT abort connection upon receipt of soft Destination
+ *     Unreachables (0, 1, 5), Time Exceededs and Parameter
+ *     Problems. (doesn't)
+ *   SHOULD report soft Destination Unreachables etc. to the
+ *     application. (doesn't)
+ *   SHOULD abort connection upon receipt of hard Destination Unreachable
+ *     messages (2, 3, 4). (does)
+ * 
+ * Remote Address Validation (4.2.3.10)
+ *   MUST reject as an error OPEN for invalid remote IP address. (does)
+ *   MUST ignore SYN with invalid source address. (does)
+ *   MUST silently discard incoming SYN for broadcast/multicast
+ *     address. (does) 
+ * 
+ * Asynchronous Reports (4.2.4.1)
+ * **MUST provide mechanism for reporting soft errors to application
+ *     layer. (doesn't)
+ * 
+ * Type of Service (4.2.4.2)
+ *   MUST allow application layer to set Type of Service. (does IP_TOS)
+ * 
+ * (Whew. -- MS 950903)
+ **/
+
 #include <linux/types.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
@@ -808,6 +995,8 @@
 				/*
 				 *	Retransmission
 				 */
+				sk->retransmits++;
+				sk->prot->retransmits++;
 				sk->prot->retransmit (sk, 0);
 				tcp_write_timeout(sk);
 			}
diff -u --recursive --new-file v1.3.24/linux/net/netrom/nr_dev.c linux/net/netrom/nr_dev.c
--- v1.3.24/linux/net/netrom/nr_dev.c	Mon Aug 28 14:52:26 1995
+++ linux/net/netrom/nr_dev.c	Thu Sep  7 17:11:47 1995
@@ -228,6 +228,8 @@
 	dev->pa_alen		= sizeof(unsigned long);
 
 	dev->priv = kmalloc(sizeof(struct enet_statistics), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
 
 	memset(dev->priv, 0, sizeof(struct enet_statistics));
 
