]> git.neil.brown.name Git - history.git/commitdiff
Import 1.3.25 1.3.25
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:10:13 +0000 (15:10 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:10:13 +0000 (15:10 -0500)
71 files changed:
CREDITS
Documentation/networking/arcnet-hardware.txt [new file with mode: 0644]
Documentation/networking/arcnet-jumpers.txt [deleted file]
Documentation/networking/arcnet.txt
Documentation/networking/z8530drv.txt [new file with mode: 0644]
Makefile
Rules.make
arch/alpha/boot/Makefile
arch/alpha/config.in
arch/i386/config.in
arch/i386/kernel/bios32.c
arch/i386/kernel/process.c
arch/i386/kernel/ptrace.c
drivers/block/sonycd535.c
drivers/char/README.scc
drivers/char/cyclades.c
drivers/char/scc.c
drivers/net/3c501.c
drivers/net/3c505.c
drivers/net/3c507.c
drivers/net/3c509.c
drivers/net/8390.c
drivers/net/Makefile
drivers/net/arcnet.c
drivers/net/at1700.c
drivers/net/atp.c
drivers/net/de4x5.c
drivers/net/depca.c
drivers/net/dummy.c
drivers/net/eepro.c
drivers/net/eexpress.c
drivers/net/eql.c
drivers/net/ewrk3.c
drivers/net/ibmtr.c
drivers/net/loopback.c
drivers/net/ni52.c
drivers/net/ni65.c
drivers/net/plip.c
drivers/net/seeq8005.c
drivers/net/sk_g16.c
drivers/net/tunnel.c
drivers/net/wavelan.c
drivers/pci/pci.c
fs/binfmt_elf.c
fs/exec.c
fs/nfs/dir.c
fs/nfs/inode.c
fs/proc/array.c
fs/proc/inode.c
fs/proc/root.c
fs/smbfs/dir.c
include/asm-alpha/pgtable.h
include/linux/cyclades.h
include/linux/netdevice.h
include/linux/nfs_fs.h
include/linux/pci.h
include/linux/sched.h
init/main.c
kernel/fork.c
kernel/sched.c
mm/filemap.c
mm/memory.c
net/Changes
net/ax25/af_ax25.c
net/core/dev.c
net/core/iovec.c
net/ipv4/arp.c
net/ipv4/ip.c
net/ipv4/ip_fw.c
net/ipv4/tcp.c
net/netrom/nr_dev.c

diff --git a/CREDITS b/CREDITS
index 98ba55d838ae7a5c1dca0c15a8bc8cdd275ed922..704d44de7365754991af5cf7d0a88e72faaf0c4b 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -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: and other hacks..
 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 
@@ -673,6 +678,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
 D: Creator of Debian distribution
diff --git a/Documentation/networking/arcnet-hardware.txt b/Documentation/networking/arcnet-hardware.txt
new file mode 100644 (file)
index 0000000..ae4b303
--- /dev/null
@@ -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 --git a/Documentation/networking/arcnet-jumpers.txt b/Documentation/networking/arcnet-jumpers.txt
deleted file mode 100644 (file)
index 09c4a69..0000000
+++ /dev/null
@@ -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.
index 0ff778bab97eb6cf405ba6635d61ca88c2d87107..0fa3286fec2fb449f3a2dee14ac6609570d9e580 100644 (file)
@@ -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 @@ Come on, be a sport!  Send me a success report!
 
 (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 @@ Remember to remove your signature, or you'll get an error back.
 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 @@ want loadable module support.
        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 @@ command line.  For example:
 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 @@ Windows:  See DOS :)  Trumpet Winsock works fine with either the Novell or
 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,13 +399,16 @@ You can change the debug level without recompiling the kernel by typing:
        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 --git a/Documentation/networking/z8530drv.txt b/Documentation/networking/z8530drv.txt
new file mode 100644 (file)
index 0000000..61f47b0
--- /dev/null
@@ -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
index bafb48c610aa4f4b450b41dd927492c30f4a41b7..217239824fadabcffa272367f6a2c1baf0997bf0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 3
-SUBLEVEL = 24
+SUBLEVEL = 25
 
 ARCH = i386
 
index 95dbbded2fc64b923f4b8c2cf7a8e5428020b1d5..70c91b485d920db4c9c852df50b2e2c8765d7be8 100644 (file)
@@ -69,7 +69,9 @@ endif
 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
index 61801b661f07764966cf70b4f7c8cf79af241bf3..6fc2535f5f9a9f916d4da4ba1d364cbbe04ddc44 100644 (file)
@@ -32,8 +32,9 @@ vmlinux.gz: vmlinux
        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
index acf96a95428c7b9ee1d0b0cefc50a4bbfc21c026..8a5e0dc48baf1441d29e1b9de36dd514fdf021dc 100644 (file)
@@ -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 @@ then
 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: forwarding/gatewaying' CONFIG_IP_FORWARD n
 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 @@ fi
 
 comment 'SCSI support'
 
-bool 'SCSI support?' CONFIG_SCSI y
+bool 'SCSI support' CONFIG_SCSI y
 
 if [ "$CONFIG_SCSI" = "n" ]; then
 
@@ -89,10 +97,10 @@ else
 
 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 @@ bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN n
 
 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 @@ if [ "$CONFIG_NET" = "y" ]; then
 
 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 @@ fi
 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 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n
 
 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 @@ fi
 
 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'
index 081cfc7bb62b1e62f8891582fa998f2aad0f68f0..17b5552b674f34994952c90f055ffedc17427f7b 100644 (file)
@@ -187,7 +187,7 @@ if [ "$CONFIG_NET_ISA" = "y" ]; then
        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 @@ fi
 
 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'
 
index 640f0c9bc9fdc1efbf6dce47c8e75e004715c03a..85d40575063b3e3b54d980eed55b7d01189ea22c 100644 (file)
@@ -452,6 +452,3 @@ unsigned long pcibios_init(unsigned long memory_start, unsigned long memory_end)
 #endif
        return memory_start;
 }
-
-
-
index f7f70426c9d51524bde3d60b557caf8b5dfa813c..6a93f27f21decb3a9c96da4b50378ecbf99ce7fa 100644 (file)
@@ -232,16 +232,12 @@ void dump_thread(struct pt_regs * regs, struct user * dump)
        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;
index 8ac30e292d8df3e7256f84903dd288d71b6ea8ec..ba79503b09326eddae6c120bcff88c75837505be 100644 (file)
@@ -480,6 +480,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
                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. */
index 7a3f90f922c34a7da4e7c2a86e06432336883668..cfe42530715326f59c4a46ed0a8d29d8b6a68428 100644 (file)
@@ -1659,12 +1659,32 @@ init_module(void)
 #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;
                        }
index 9d3f2f91313dab8c80117cb968e7505b6b58c525..c4d21dc48373cfcd8894b1a1370a314ceb955515 100644 (file)
 // 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
index e52e8f1993132042af0d30cd035f2e82b17d85e3..8ef658fa26f0de73ac67ee7fbf3a963d07ff969a 100644 (file)
@@ -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 @@ static char rcsid[] =
  *   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 @@ static char rcsid[] =
 #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 volatile int cy_triggered;
 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 *))
 
-#define NR_CARDS        (sizeof(cy_card)/sizeof(struct cyclades_card))
+/* 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       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 @@ int cy_chip_offset [] =
       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 tty_struct *serial_table[NR_PORTS];
 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 @@ static void show_status(int);
 #endif
 
 
-
 static inline int
 serial_paranoia_check(struct cyclades_port *info,
                        dev_t device, const char *routine)
@@ -456,7 +473,7 @@ void CP8(long data) { CP4((data>>16) & 0xffff); CP4(data & 0xffff); }/* CP8 */
    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 @@ write_cy_cmd(u_char *base_addr, u_char cmd)
     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 @@ cy_stop(struct tty_struct *tty)
   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 @@ cy_stop(struct tty_struct *tty)
        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 @@ cy_start(struct tty_struct *tty)
   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 @@ cy_start(struct tty_struct *tty)
        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 @@ cy_sched_event(struct cyclades_port *info, int event)
 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 @@ cy_interrupt(int irq, struct pt_regs *regs)
   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 @@ cy_interrupt(int irq, struct pt_regs *regs)
         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                     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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                                        *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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                                        *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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                                            *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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                             }
                         } 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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                                         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
 
                     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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                            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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                            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 @@ cy_interrupt(int irq, struct pt_regs *regs)
 
         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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                                 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 @@ cy_interrupt(int irq, struct pt_regs *regs)
                         }
                     }
                     /* 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 @@ check_wild_interrupts(void)
         * 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 @@ check_wild_interrupts(void)
  * 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 @@ get_auto_irq(int card)
  * 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 @@ do_auto_irq(int card)
        
        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 @@ startup(struct cyclades_port * info)
 {
   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 @@ startup(struct cyclades_port * info)
     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 @@ startup(struct cyclades_port * info)
 #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 @@ start_xmit( struct cyclades_port *info )
 {
   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 @@ shutdown(struct cyclades_port * info)
 {
   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 @@ shutdown(struct cyclades_port * info)
     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 @@ shutdown(struct cyclades_port * info)
            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 @@ config_setup(struct cyclades_port * info)
 {
   unsigned long flags;
   unsigned char *base_addr;
-  int card,chip,channel;
+  int card,chip,channel,index;
   unsigned cflag;
   int   i;
 
@@ -1423,62 +1445,63 @@ config_setup(struct cyclades_port * info)
     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 @@ cy_flush_chars(struct tty_struct *tty)
   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 @@ cy_flush_chars(struct tty_struct *tty)
     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 @@ cy_flush_chars(struct tty_struct *tty)
  */
 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 @@ cy_throttle(struct tty_struct * tty)
   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 @@ cy_throttle(struct tty_struct * tty)
     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 @@ cy_unthrottle(struct tty_struct * tty)
   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 @@ cy_unthrottle(struct tty_struct * tty)
     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 @@ check_and_exit:
 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 @@ get_modem_info(struct cyclades_port * info, unsigned int *value)
     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 @@ get_modem_info(struct cyclades_port * info, unsigned int *value)
             | ((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 @@ static int
 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 @@ set_modem_info(struct cyclades_port * info, unsigned int cmd,
     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 @@ set_modem_info(struct cyclades_port * info, unsigned int cmd,
     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 @@ static int
 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 @@ static int
 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 @@ static int
 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 @@ static int
 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 @@ cy_ioctl(struct tty_struct *tty, struct file * file,
                 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 @@ cy_close(struct tty_struct * tty, struct file * filp)
     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 @@ cy_close(struct tty_struct * tty, struct file * filp)
     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 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
   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 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
     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 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
            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 @@ show_version(void)
 /* 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 @@ cy_init_card(unsigned char *true_base_addr)
             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 @@ cy_init_card(unsigned char *true_base_addr)
            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 @@ cy_init_card(unsigned char *true_base_addr)
 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 @@ scrn[1] = '\0';
     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;
-       }
+    for (i = 0; i < NR_CARDS; i++) {
+           /* base_addr=0 indicates board not found */
+           cy_card[i].base_addr = 0;
+    }
 
-#ifndef CY_DONT_PROBE
-       /* find out the board's irq by probing */
-       cinfo->irq = do_auto_irq(index);
-#endif
+    /* 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. */
 
-       /** 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;
-       }
+    /* look for isa boards */
+    cy_isa_nboard = cy_detect_isa();
+
+    /* look for pci boards */
+    cy_pci_nboard = cy_detect_pci();
+
+    cy_nboard = cy_isa_nboard + cy_pci_nboard;
 
-       printk("  share IRQ %d: ", cinfo->irq);
-       good_ports = 4 * cinfo->num_chips;
+    /* 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;
+    }
 
-       if(port_num < NR_PORTS){
-           cinfo->first_line = port_num;
-           while( good_ports-- && port_num < NR_PORTS){
-               /*** initialize port ***/
+    /* 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 @@ scrn[1] = '\0';
                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 @@ show_status(int line_num)
     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 */
index cd9b70fa436e3fa89fe5ba12238223e10574dc84..b6c71e03d0378e484820992e5c4df1959c1c6598 100644 (file)
@@ -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"
 
 #include <linux/kernel.h>
 
 #ifndef Z8530_MAJOR
-#define Z8530_MAJOR 22
+#define Z8530_MAJOR 34
 #endif
 
 long scc_init(long kmem_start);
index bd55c6c48213db93f4ed81f570e0805254ad98f9..b3afd64de9ce2cf830ad8895b0b993d5c1c71070 100644 (file)
@@ -289,8 +289,9 @@ el1_probe1(struct device *dev, int ioaddr)
        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. */
index 0b3d016e5c0ace8e9ff148673017b45423419694..887070b561d695a1afa44d70dabee2cf57562dc8 100644 (file)
@@ -1257,6 +1257,8 @@ elp_init (struct device *dev)
         */
        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 @@ cleanup_module(void)
        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);
index b78f8fb8bafaa951928f969c7326fdf6e71a1629..204cc76c94c63634989011452ad204142f622f2c 100644 (file)
@@ -416,8 +416,9 @@ int el16_probe1(struct device *dev, int ioaddr)
                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 @@ cleanup_module(void)
        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);
index 0bd9071f31f8564960cdea48504c2f936c3c996b..6e9a13a7f3905da80f36cd862d5946d8097f3a7c 100644 (file)
@@ -249,6 +249,8 @@ int el3_probe(struct device *dev)
 
        /* 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)
index 025310ef6e983d7790b6986049ab3cc92fc9bcf0..44403377c0f6c9a6fcf9154473710e1d55c115bd 100644 (file)
@@ -597,6 +597,8 @@ int ethdev_init(struct device *dev)
                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;
index cb577064ea3fa37cbcd3e529fd66a24955b7e3c1..1421990cb4c07da31a98c308f13c9ea8164eaaa3 100644 (file)
@@ -12,6 +12,13 @@ L_OBJS   := Space.o auto_irq.o net_init.o loopback.o
 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 @@ endif
 
 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 @@ endif
 
 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 @@ endif
 
 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,22 +333,29 @@ L_OBJS += pi2.o
 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
 else
index 147764f4f7855ee7075cd58b801a7b8400c85377..5ebdeeb074ced7d1bc4f22f44b42f50b3050b857 100644 (file)
         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.
        
        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
 */
 
 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 @@ static const char *version =
 #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 @@ static const char *version =
 #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 @@ static const char *version =
  *             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 @@ static const char *version =
 #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 @@ extern struct device *irq2dev_map[16];
 #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 @@ arcnet_probe(struct device *dev)
        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 @@ arcnet_probe(struct device *dev)
 
        /* 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 @@ arcnet_open(struct device *dev)
        
        /* 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 @@ arcnet_close(struct device *dev)
 {
        int ioaddr = dev->base_addr;
        struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
-
+       
        TBUSY=1;
        START=0;
        
@@ -1025,13 +1015,14 @@ arcnet_close(struct device *dev)
        /* 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 @@ arcnetE_send_packet(struct sk_buff *skb, struct device *dev)
                                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 @@ arcnet_rx(struct device *dev,int recbuf)
                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 num=0;        /* number of device (ie for 0 for arc0, 1 for arc1...) */
 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 @@ cleanup_module(void)
                if (thiscard.base_addr) release_region(thiscard.base_addr,
                                                ARCNET_TOTAL_SIZE);
                unregister_netdev(&thiscard);
+               kfree(thiscard.priv);
+               thiscard.priv = NULL;
        }
 }
 
index 15c975d3d1a656531da750c31299db2bf2ba8d25..52c5e210c0b2df1709744e136853e3c9db822bb0 100644 (file)
@@ -263,8 +263,9 @@ int at1700_probe1(struct device *dev, short ioaddr)
                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 @@ cleanup_module(void)
        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);
index 2750e28a2e620263554b6ff97df7a85cb5ea9450..e93df14e8fdd15dd8569ef8e60b0e2addd95c7e1 100644 (file)
@@ -227,6 +227,8 @@ static int atp_probe1(struct device *dev, short ioaddr)
        /* 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));
 
 
index 89bfd7d7efcedecb1faa44918c201258830cbc50..cc6d90d2889708210de2ab11233c4d23f76d40f5 100644 (file)
@@ -588,6 +588,8 @@ de4x5_hw_init(struct device *dev, u_long iobase)
        */
        dev->priv = (void *) kmalloc(sizeof(struct de4x5_private) + ALIGN, 
                                                                   GFP_KERNEL);
+       if (dev->priv == NULL)
+               return -ENOMEM;
        /*
        ** Align to a longword boundary
        */
index 3a15e48f701eaff1d9b1197226dba2cae66278e4..e4b119450d503406a54361ee7bbb83e70138412b 100644 (file)
@@ -511,6 +511,8 @@ depca_hw_init(struct device *dev, u_long ioaddr)
  
          /* 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;
index 24c4102970aa84ef94a3cda3454e8459dfb97535..c4d12a4abad6d13f5f398eba969cdbf92ec5f2b2 100644 (file)
@@ -88,6 +88,8 @@ int dummy_init(struct device *dev)
 
 #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 @@ void cleanup_module(void)
        else
        {
                unregister_netdev(&dev_dummy);
+               kfree(dev_dummy.priv);
+               dev_dummy.priv = NULL;
        }
 }
 #endif /* MODULE */
index 6279f9711efe9107ac1fc2c2d57f081a35bacf38..30fffdd795ba21d0b5c90f02fc654c67f3681a88 100644 (file)
@@ -407,8 +407,9 @@ int eepro_probe1(struct device *dev, short ioaddr)
                        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;
index 50fb1a6ef4c43ec7b49352ca262cd628d62a957e..93e4fd417a7bbb5279570f8f511145ac3c553d65 100644 (file)
@@ -400,6 +400,8 @@ int eexp_probe1(struct device *dev, short ioaddr)
 
        /* 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;
index 37f61cf20147761baa56ceb1147c9488d195e274..de613e3f3499577805f8db649f81b546345199be 100644 (file)
@@ -219,10 +219,17 @@ eql_init(struct device *dev)
 
   /* 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 @@ eql_new_slave_queue(struct device *dev)
   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 @@ eql_new_slave_queue(struct device *dev)
     }
   else
     {
+      if (head_slave)
+         kfree(head_slave);
+      if (tail_slave)
+         kfree(tail_slave);
       kfree (queue);
       return 0;
     }
index ec0523925f24814c0fd31d1ceaf258c1666f00f2..86e3bfa1066ffbf10b1c669f5b00fbd50176e1a3 100644 (file)
@@ -548,6 +548,8 @@ ewrk3_hw_init(struct device *dev, short iobase)
              /* 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 @@ cleanup_module(void)
   } else {
     release_region(thisEthwrk.base_addr, EWRK3_TOTAL_SIZE);
     unregister_netdev(&thisEthwrk);
+    free(thisEthwrk.priv);
+    thisEthwrk.priv = NULL;
   }
 }
 #endif /* MODULE */
index d1040e051c8c0fbccf2bf212aed1b20b9ef3e9b3..1c74712628df486b9b11b1c81b8d48bcf68ef0cc 100644 (file)
                  - 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
 #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 @@ static char mcchannelid[]={0x04, 0x0d, 0x04, 0x01,
 #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 @@ static struct wait_queue *wait_for_tok_int=NULL, *wait_for_reset;
 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 @@ int tok_probe(struct device *dev)
 
   /*?? 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 @@ int tok_probe(struct device *dev)
       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 @@ int tok_probe(struct device *dev)
     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 @@ int tok_probe(struct device *dev)
   /* 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 @@ int tok_probe(struct device *dev)
     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 @@ int tok_probe(struct device *dev)
         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 @@ int tok_probe(struct device *dev)
   /*?? 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 @@ static void tok_interrupt (int irq, struct pt_regs *regs)
                                                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 @@ skip_reset:
 
 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 @@ static void initial_tok_int(struct device *dev) {
 
        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 @@ static void initial_tok_int(struct device *dev) {
        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 @@ static void tok_init_card(unsigned long dev_addr) {
 #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 @@ static void tr_tx(struct device *dev) {
        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 @@ DPRINTK("transmitting...\n");
 
      /*  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 @@ DPRINTK(("hdr_length: %d, frame length: %ld\n",hdr_len,
 #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 @@ DPRINTK("dsap: %02X, ssap: %02X, llc: %02X, protid: %02X%02X%02X, ethertype: %04
 #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;
index 8f69ebb93d88254f402cc27de93e12f88bb32919..6f413f376e9f33bc75b95c2b381a20e4f681141a 100644 (file)
@@ -144,6 +144,8 @@ int loopback_init(struct device *dev)
        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;
 
index 4ba45e7a131c8ddfb8e3752902d7bf136983c4f2..12a2cc55a323c7f73aa9cd53a76b7ec3e9500de0 100644 (file)
@@ -360,6 +360,8 @@ static int ni52_probe1(struct device *dev,int ioaddr)
 
   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));
 
   /* 
index 342a48d1845f7f3da83548ac7cc6430e60ff0e46..7891ac01f9c076e3fabb06f54b75d137d52f694f 100644 (file)
@@ -244,6 +244,8 @@ static int ni65_probe1(struct device *dev,int ioaddr)
         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;
index 750d9c15ad299e7d2e3d1ee9c316f9d9b2eb4264..87b25c81299cb64cf02da232fa2aedb05c88274c 100644 (file)
@@ -261,7 +261,7 @@ plip_init(struct device *dev)
        /* 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;
 
index 0dc794d4301c17e698574cf3a56f3cb8f192d7a4..1097beeb885e4785f0768f1a19add671650f827b 100644 (file)
@@ -323,8 +323,9 @@ static int seeq8005_probe1(struct device *dev, int ioaddr)
        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;
index 0924fd350d90b92e53b567ac0d6f701dacd339f4..2641a3807791605f7190859d70225a70c9d65c58 100644 (file)
@@ -788,6 +788,8 @@ int SK_probe(struct device *dev, short ioaddr)
 
     /* 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 */
index 45e02a2f200316b1d9933466beb824fa04200f49..946263a47eba9692dee73ace4af5dd00498e175e 100644 (file)
@@ -79,17 +79,23 @@ int tunnel_init(struct device *dev)
        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 @@ print_ip(iph);
        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 */
index 34b59fd6690ca336dc20c4ef4bf2d921aeebefd6..62d1a5f5a0a745851f0df7d248c09c0e7b537cb3 100644 (file)
@@ -1015,6 +1015,8 @@ Leave this out until I can get it to work -- BJ.
                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;
 
index 8baf79ba91a6b6fde5a8499391a31fbb8803db15..e167d4d56f6efb07d4c27883142835470ee43ca2 100644 (file)
@@ -19,7 +19,7 @@ struct pci_bus pci_root;
 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 @@ struct pci_dev *pci_devices = 0;
 #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 @@ struct bridge_mapping_type {
 
 
 /*
- * 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_strvendor(unsigned int vendor)
 }
 
 
-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 @@ static int sprint_dev_config(struct pci_dev *dev, char *buf, int size)
                }
                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 @@ static unsigned int scan_bus(struct pci_bus *bus, unsigned long *mem_startp)
                 */
                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) {
index 15f6642e043bb9b5eab9defd6badc9bb064d721c..6632cf5b4e3229e07b9d8da1c6923058fa3e1b81 100644 (file)
@@ -389,6 +389,10 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        
        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 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
                        
                        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 @@ load_elf_library(int fd){
        
        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);
index f4bd18f8c70f4e9052b7858680bfa919a11af07a..0af381c854895b2b68e3cb70f2cb89502907e953 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -226,6 +226,13 @@ int aout_core_dump(long signr, struct pt_regs * regs)
            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));
index 990add80f8512c384b9a96a77294ca0cb0a84238..aaf1c4147107f5a05242af50712abed255fc6f44 100644 (file)
@@ -79,6 +79,8 @@ static int nfs_dir_read(struct inode *inode, struct file *filp, char *buf,
        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 nfs_readdir(struct inode *inode, struct file *filp,
        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 @@ static int nfs_readdir(struct inode *inode, struct file *filp,
        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;
@@ -170,6 +183,24 @@ static int nfs_readdir(struct inode *inode, struct file *filp,
        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
  * a trial to see how well it works on a small scale.
index 258637cf2a11911ceccc3001ded2fa6486855ce5..e62cdc5ad8003d1259b14b3eecbbb497d126a659 100644 (file)
@@ -306,6 +306,7 @@ int init_module(void)
 void cleanup_module(void)
 {
        unregister_filesystem(&nfs_fs_type);
+       nfs_kfree_cache();
 }
 
 #endif
index ceb12133998a6fee62c84ee1b23df5849cefb86c..2b35342d623412c1a810eb0f9205052c39eada81 100644 (file)
@@ -110,10 +110,9 @@ struct inode_operations proc_kcore_inode_operations = {
 };
 
 
-#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 @@ static int read_profile(struct inode *inode, struct file *file, char *buf, int c
     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;
@@ -166,8 +165,6 @@ struct inode_operations proc_profile_inode_operations = {
        &proc_profile_operations, 
 };
 
-#endif /* CONFIG_PROFILE */
-
 
 static int get_loadavg(char * buffer)
 {
index 0c9d4d3b6a137c40f38bd7b843eef8007b447e56..0618a1384b9e13d000bba117dae3a6fa973d935f 100644 (file)
@@ -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 @@ void proc_read_inode(struct inode * inode)
                                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;
index e51f222df45a7bbf31208d5abc8fc1b62325f8e9..c879a918e966979f39a2231b40b6e7463597eafe 100644 (file)
@@ -292,12 +292,13 @@ void proc_root_init(void)
                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,
+               });
+       }
 }
 
 
index 9802e3958aa4964a2c76c620ed8724ffb3926ff9..4d9346924d7d346e5cd70fc7e15cd102da98e3ba 100644 (file)
@@ -180,12 +180,21 @@ smb_readdir(struct inode *inode, struct file *filp,
        {
                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;
                         }
                 }
        }
index 51425af466e7fe799d1b127b778aa7c3d6205469..e51051357e014d6bcb8bc225d0511762b452d166 100644 (file)
@@ -249,10 +249,9 @@ extern inline void SET_PAGE_DIR(struct task_struct * tsk, pgd_t * pgdir)
 #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.. */
index 73f01e26a832613643417b6e8c8af306bc19ec18..182a8949a014260599a771e840d6e79260f33a1d 100644 (file)
@@ -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 @@ struct cyclades_port {
 #define CyRegSize  0x0400
 #define Cy_HwReset 0x1400
 #define Cy_ClrIntr 0x1800
+#define Cy_EpldRev 0x1e00
 
 /* Global Registers */
 
index 0a2978bf631acc8c7b1883c0816c6f6d40d2b0d8..5449e35f7b67eb67420ab820cea91be6c5fe325b 100644 (file)
 #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
 
index 573afc7ea0676dbc2bcbf9eded0b37141c98e5b1..2ff70c025ac3baa188146c2c7f6edeac0a23527c 100644 (file)
@@ -106,6 +106,7 @@ extern struct inode_operations nfs_file_inode_operations;
 /* linux/fs/nfs/dir.c */
 
 extern struct inode_operations nfs_dir_inode_operations;
+extern void nfs_kfree_cache(void);
 
 /* linux/fs/nfs/symlink.c */
 
index c260b75ab98db6b75655d9ff4ea9846d1a559391..7a25b31bb50dd48eb1f2b100cec4de5af5a37952 100644 (file)
 
 #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
 
 
 #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
 #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
index 79bdd9039826e6b05f6dd8317d462a373e772ad2..bbed73583d0cbc768012421012e797917faf79c0 100644 (file)
@@ -275,6 +275,10 @@ extern unsigned long itimer_next;
 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);
index 012eff471fd3dcdc6d72f8bf29646d53904b6013..0ff10fad372f890edea0a5d10ad2626c3f5a6169 100644 (file)
@@ -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 @@ char *get_options(char *str, int *ints)
        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 @@ asmlinkage void start_kernel(void)
        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);
index 5d82f0f01b8ea47dd5d53b92cbae6b40baaca1b8..2edcae7bca07b220a96306783abb608b28496c3b 100644 (file)
@@ -188,6 +188,7 @@ static void copy_sighand(unsigned long clone_flags, struct allocation_struct * u
 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 @@ int do_fork(unsigned long clone_flags, unsigned long usp, struct pt_regs *regs)
        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 @@ int do_fork(unsigned long clone_flags, unsigned long usp, struct pt_regs *regs)
        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 @@ int do_fork(unsigned long clone_flags, unsigned long usp, struct pt_regs *regs)
        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 @@ bad_fork_free:
        free_page(new_stack);
        free_page((long) p);
 bad_fork:
-       return -EAGAIN;
+       return error;
 }
index b1f9ccde947d23f70044d0782bea6aac7b4e2848..0dcf2856ade114af707456e7cdf485ab559b5a2a 100644 (file)
@@ -71,6 +71,7 @@ unsigned long event = 0;
 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 @@ static void timer_bh(void * unused)
        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 @@ static void do_timer(int irq, struct pt_regs * regs)
                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 @@ static void do_timer(int irq, struct pt_regs * regs)
                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);
index de4f7a181c82d3794f2db1993828ca5006d97701..18860ac64119cbba7cc7c6b5a38858af9ae79a48 100644 (file)
@@ -178,6 +178,7 @@ static inline int filemap_sync_pte(pte_t * ptep, struct vm_area_struct *vma,
                if (pte_none(pte))
                        return 0;
                pte_clear(ptep);
+               invalidate();
                if (!pte_present(pte)) {
                        swap_free(pte_val(pte));
                        return 0;
index 111a39fa2a5c8b7d425c7d8745de1122b843f0cb..195c0b3737a2dc901a36d18d58797b845ac9493f 100644 (file)
@@ -199,11 +199,11 @@ void free_page_tables(struct task_struct * tsk)
                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);
index 77896e864c267fcf9bc8270203f1130505283761..418aa26aa90cc5c1eaffef0e1d67f73ec26c6434 100644 (file)
@@ -188,7 +188,7 @@ o   First parts of IP multicast routing code        [IN]
 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  AF_UNIX full BSD semantics on STREAM writes     [IN]
 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  Tom May's insw_and_checksum()
 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 checksum/copy on outgoing TCP
 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   AX.25 set protocol type
 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   Merge the layered protocol support.             [ABANDONED TOO SLOW]
 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 @@ Possible projects for victim^H^H^H^H^Holunteers
 
 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 @@ is SLIP6) SLIP mode that does packet data compression [maybe use the code
 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 @@ a maybe (so is finishing it ;))][Jim Freeman is working on Frame Relay].
 
 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 
index 21ee1b5d5e6bd1276f644dbb479ac750887fe93e..dd0345a313180a1ab55b54db2bf018f4b3a36d2e 100644 (file)
@@ -476,6 +476,8 @@ static int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
                        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;
index d237777000070cfb0457226d51684af8296523ff..c6846d17ac219d471094cde1776ee008257cd1eb 100644 (file)
@@ -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 @@ static int dev_ifsioc(void *arg, unsigned int getset)
                
                                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
index 166cc719189d1238e52099159dc90d6a02b27c18..54a9c3579c1ba60a213397575c49cafa8daa6386 100644 (file)
@@ -50,12 +50,16 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int mode)
        
        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;
 }
 
index 7a8cdc0a1996b82ffe1cedad65820141fbb38202..39ade7d7d02f7fce31107426771e7eca2b307556 100644 (file)
@@ -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 @@ int arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
        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))
                {
 /*
index 8efeeb57865f6a067e29d79247c326b089527ff1..84bfe8baae004d5253b75c02855184682cd0bab2 100644 (file)
@@ -1055,6 +1055,9 @@ int ip_forward(struct sk_buff *skb, struct device *dev, int is_frag, unsigned lo
        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 @@ int ip_forward(struct sk_buff *skb, struct device *dev, int is_frag, unsigned lo
        
        /*
         *      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 @@ int ip_build_xmit(struct sock *sk,
                        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)
index 32a78f00a410d64b74bd46670a54d238eae09986..0b3cd3c5497ca60af8f0a8d25512a11e8047b151 100644 (file)
@@ -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 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
        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 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
 
        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 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
                /*
                 * 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
@@ -666,6 +672,18 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
                        return skb;
                }
  
+               /*
+                *      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
                 */
@@ -681,7 +699,9 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
                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 @@ static struct sk_buff *revamp(struct sk_buff *skb, struct device *dev, struct ip
                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 @@ void ip_fw_masquerade(struct sk_buff **skb_ptr, struct device *dev)
                        *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;
  
index d97fadafef1b4f1f3c98e56fd457fbbd952ef944..99f508f14225b658182212a5d14518ca3af5b3be 100644 (file)
  * 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
  *             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.
  *             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
  *             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:
  *     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 @@ static void retransmit_timer(unsigned long data)
                                /*
                                 *      Retransmission
                                 */
+                               sk->retransmits++;
+                               sk->prot->retransmits++;
                                sk->prot->retransmit (sk, 0);
                                tcp_write_timeout(sk);
                        }
index 683c39d8264dcb6b1b97c54fc0a8a79a5e794161..f41d5107d7ba43e50a38983ed288e632b10abcf8 100644 (file)
@@ -228,6 +228,8 @@ int nr_init(struct device *dev)
        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));