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,
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
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
--- /dev/null
+
+-----------------------------------------------------------------------------
+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.
+++ /dev/null
-
------------------------------------------------------------------------------
-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.
----------------------------------------------------------------------------
-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.
(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?
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
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:
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.
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?
-------------------
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?
-------------------------------
--- /dev/null
+// 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
VERSION = 1
PATCHLEVEL = 3
-SUBLEVEL = 24
+SUBLEVEL = 25
ARCH = i386
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
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
# 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
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
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
comment 'SCSI support'
-bool 'SCSI support?' CONFIG_SCSI y
+bool 'SCSI support' CONFIG_SCSI y
if [ "$CONFIG_SCSI" = "n" ]; then
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'
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
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
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
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!'
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'
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
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'
#endif
return memory_start;
}
-
-
-
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;
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. */
#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;
}
// 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
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,
* 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;
*
#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++;
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,
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;
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];
/*
#endif
-
static inline int
serial_paranoia_check(struct cyclades_port *info,
dev_t device, const char *routine)
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;
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 */
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
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;
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
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;
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 */
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;
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
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
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;
}
*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);
}
*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;
*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. */
}
} 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;
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
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);
}
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;
}
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;
}
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
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{
}
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 */
;
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;
}
}
}
}
}
/* 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 */
* 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)
;
* 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 */
* 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;
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;
{
unsigned long flags;
unsigned char *base_addr;
- int card,chip,channel;
+ int card,chip,channel,index;
if (info->flags & ASYNC_INITIALIZED){
return 0;
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",
#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){
{
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 */
{
unsigned long flags;
unsigned char *base_addr;
- int card,chip,channel;
+ int card,chip,channel,index;
if (!(info->flags & ASYNC_INITIALIZED)){
/* CP('$'); */
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",
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)!!! */
{
unsigned long flags;
unsigned char *base_addr;
- int card,chip,channel;
+ int card,chip,channel,index;
unsigned cflag;
int i;
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
}
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); /* */
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 */
*/
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;
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];
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;
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];
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;
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;
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)
| ((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 */
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);
}
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);
}
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);
}
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;
}
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;
}
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;
}
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;
}
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);
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
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);
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;
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);
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;
}
/* 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);
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
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;
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();
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;
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;
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 */
#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);
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. */
*/
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));
/*
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);
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;
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);
/* 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)
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;
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
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
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)
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
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
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";
/**************************************************************************/
#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
#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.
* 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! */
#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. */
#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 */
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",
/* 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);
/* 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);
{
int ioaddr = dev->base_addr;
struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
-
+
TBUSY=1;
START=0;
/* 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
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
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:
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;
if (thiscard.base_addr) release_region(thiscard.base_addr,
ARCNET_TOTAL_SIZE);
unregister_netdev(&thiscard);
+ kfree(thiscard.priv);
+ thiscard.priv = NULL;
}
}
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;
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);
/* 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));
*/
dev->priv = (void *) kmalloc(sizeof(struct de4x5_private) + ALIGN,
GFP_KERNEL);
+ if (dev->priv == NULL)
+ return -ENOMEM;
/*
** Align to a longword boundary
*/
/* 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;
#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
else
{
unregister_netdev(&dev_dummy);
+ kfree(dev_dummy.priv);
+ dev_dummy.priv = NULL;
}
}
#endif /* MODULE */
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;
/* 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;
/* 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);
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 ();
}
else
{
+ if (head_slave)
+ kfree(head_slave);
+ if (tail_slave)
+ kfree(tail_slave);
kfree (queue);
return 0;
}
/* 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;
} else {
release_region(thisEthwrk.base_addr, EWRK3_TOTAL_SIZE);
unregister_netdev(&thisEthwrk);
+ free(thisEthwrk.priv);
+ thisEthwrk.priv = NULL;
}
}
#endif /* MODULE */
- 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,
#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
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 */
/*?? 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); */
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;
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);
/* 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
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:
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);
/*?? 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;
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);
static void initial_tok_int(struct device *dev) {
+#ifndef TR_NEWFORMAT
int i;
+#endif
unsigned char *encoded_addr;
struct tok_info *ti;
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 */
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);
#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;
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;
/* 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,
#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
#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;
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;
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));
/*
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;
/* 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;
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;
/* 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 */
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;
}
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 */
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;
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.
#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")
};
/*
- * 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;
}
}
-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;
}
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)
*/
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) {
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);
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);
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);
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));
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
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;
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;
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.
void cleanup_module(void)
{
unregister_filesystem(&nfs_fs_type);
+ nfs_kfree_cache();
}
#endif
};
-#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
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;
&proc_profile_operations,
};
-#endif /* CONFIG_PROFILE */
-
static int get_loadavg(char * buffer)
{
#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)
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;
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,
+ });
+ }
}
{
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;
}
}
}
#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.. */
+/*
+ * 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 {
#define CyRegSize 0x0400
#define Cy_HwReset 0x1400
#define Cy_ClrIntr 0x1800
+#define Cy_EpldRev 0x1e00
/* Global Registers */
#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
/* linux/fs/nfs/dir.c */
extern struct inode_operations nfs_dir_inode_operations;
+extern void nfs_kfree_cache(void);
/* linux/fs/nfs/symlink.c */
#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
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);
#include <asm/bugs.h>
-extern unsigned long * prof_buffer;
-extern unsigned long prof_len;
extern char _stext, _etext;
extern char *linux_banner;
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 },
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);
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;
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;
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))
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--;
free_page(new_stack);
free_page((long) p);
bad_fork:
- return -EAGAIN;
+ return error;
}
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))
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;
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.
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);
if (pte_none(pte))
return 0;
pte_clear(ptep);
+ invalidate();
if (!pte_present(pte)) {
swap_free(pte_val(pte));
return 0;
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);
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]
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 ----------------
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
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.
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 ?
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
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
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
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
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;
* 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.
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
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;
}
* 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:
/*
* 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
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))
{
/*
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.
/*
* 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;
}
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)
* 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 .....
*
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
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;
/*
* 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
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
*/
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.
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,
*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;
* 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>
/*
* Retransmission
*/
+ sk->retransmits++;
+ sk->prot->retransmits++;
sk->prot->retransmit (sk, 0);
tcp_write_timeout(sk);
}
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));