~ubuntu-branches/ubuntu/maverick/linux-mvl-dove/maverick

1 by Tim Gardner, Andy Whitcroft, Tim Gardner
[ Andy Whitcroft ]
1
i386 Micro Channel Architecture Support
2
=======================================
3
4
MCA support is enabled using the CONFIG_MCA define.  A machine with a MCA
5
bus will have the kernel variable MCA_bus set, assuming the BIOS feature
6
bits are set properly (see arch/i386/boot/setup.S for information on
7
how this detection is done).
8
9
Adapter Detection
10
=================
11
12
The ideal MCA adapter detection is done through the use of the
13
Programmable Option Select registers.  Generic functions for doing
14
this have been added in include/linux/mca.h and arch/i386/kernel/mca.c.
15
Everything needed to detect adapters and read (and write) configuration
16
information is there.  A number of MCA-specific drivers already use
17
this.  The typical probe code looks like the following:
18
19
	#include <linux/mca.h>
20
21
	unsigned char pos2, pos3, pos4, pos5;
22
	struct net_device* dev;
23
	int slot;
24
25
	if( MCA_bus ) {
26
		slot = mca_find_adapter( ADAPTER_ID, 0 );
27
		if( slot == MCA_NOTFOUND ) {
28
			return -ENODEV;
29
		}
30
		/* optional - see below */
31
		mca_set_adapter_name( slot, "adapter name & description" );
32
		mca_set_adapter_procfn( slot, dev_getinfo, dev );
33
34
		/* read the POS registers.  Most devices only use 2 and 3 */
35
		pos2 = mca_read_stored_pos( slot, 2 );
36
		pos3 = mca_read_stored_pos( slot, 3 );
37
		pos4 = mca_read_stored_pos( slot, 4 );
38
		pos5 = mca_read_stored_pos( slot, 5 );
39
	} else {
40
		return -ENODEV;
41
	}
42
43
	/* extract configuration from pos[2345] and set everything up */
44
45
Loadable modules should modify this to test that the specified IRQ and
46
IO ports (plus whatever other stuff) match.  See 3c523.c for example
47
code (actually, smc-mca.c has a slightly more complex example that can
48
handle a list of adapter ids).
49
50
Keep in mind that devices should never directly access the POS registers
51
(via inb(), outb(), etc).  While it's generally safe, there is a small
52
potential for blowing up hardware when it's done at the wrong time.
53
Furthermore, accessing a POS register disables a device temporarily.
54
This is usually okay during startup, but do _you_ want to rely on it?
55
During initial configuration, mca_init() reads all the POS registers
56
into memory.  mca_read_stored_pos() accesses that data.  mca_read_pos()
57
and mca_write_pos() are also available for (safer) direct POS access,
58
but their use is _highly_ discouraged.  mca_write_pos() is particularly
59
dangerous, as it is possible for adapters to be put in inconsistent
60
states (i.e. sharing IO address, etc) and may result in crashes, toasted
61
hardware, and blindness.
62
63
User level drivers (such as the AGX X server) can use /proc/mca/pos to
64
find adapters (see below).
65
66
Some MCA adapters can also be detected via the usual ISA-style device
67
probing (many SCSI adapters, for example).  This sort of thing is highly
68
discouraged.  Perfectly good information is available telling you what's
69
there, so there's no excuse for messing with random IO ports.  However,
70
we MCA people still appreciate any ISA-style driver that will work with
71
our hardware.  You take what you can get...
72
73
Level-Triggered Interrupts
74
==========================
75
76
Because MCA uses level-triggered interrupts, a few problems arise with
77
what might best be described as the ISA mindset and its effects on
78
drivers.  These sorts of problems are expected to become less common as
79
more people use shared IRQs on PCI machines.
80
81
In general, an interrupt must be acknowledged not only at the ICU (which
82
is done automagically by the kernel), but at the device level.  In
83
particular, IRQ 0 must be reset after a timer interrupt (now done in
84
arch/i386/kernel/time.c) or the first timer interrupt hangs the system.
85
There were also problems with the 1.3.x floppy drivers, but that seems
86
to have been fixed.
87
88
IRQs are also shareable, and most MCA-specific devices should be coded
89
with shared IRQs in mind.
90
91
/proc/mca
92
=========
93
94
/proc/mca is a directory containing various files for adapters and
95
other stuff.
96
97
	/proc/mca/pos		Straight listing of POS registers
98
	/proc/mca/slot[1-8]	Information on adapter in specific slot
99
	/proc/mca/video		Same for integrated video
100
	/proc/mca/scsi		Same for integrated SCSI
101
	/proc/mca/machine	Machine information
102
103
See Appendix A for a sample.
104
105
Device drivers can easily add their own information function for
106
specific slots (including integrated ones) via the
107
mca_set_adapter_procfn() call.  Drivers that support this are ESDI, IBM
108
SCSI, and 3c523.  If a device is also a module, make sure that the proc
109
function is removed in the module cleanup.  This will require storing
110
the slot information in a private structure somewhere.  See the 3c523
111
driver for details.
112
113
Your typical proc function will look something like this:
114
115
	static int
116
	dev_getinfo( char* buf, int slot, void* d ) {
117
		struct net_device* dev = (struct net_device*) d;
118
		int len = 0;
119
120
		len += sprintf( buf+len, "Device: %s\n", dev->name );
121
		len += sprintf( buf+len, "IRQ: %d\n", dev->irq );
122
		len += sprintf( buf+len, "IO Port: %#lx-%#lx\n", ... );
123
		...
124
125
		return len;
126
	}
127
128
Some of the standard MCA information will already be printed, so don't
129
bother repeating it.  Don't try putting in more than 3K of information.
130
131
Enable this function with:
132
	mca_set_adapter_procfn( slot, dev_getinfo, dev );
133
134
Disable it with:
135
	mca_set_adapter_procfn( slot, NULL, NULL );
136
137
It is also recommended that, even if you don't write a proc function, to
138
set the name of the adapter (i.e. "PS/2 ESDI Controller") via
139
mca_set_adapter_name( int slot, char* name ).
140
141
MCA Device Drivers
142
==================
143
144
Currently, there are a number of MCA-specific device drivers.
145
146
1) PS/2 SCSI
147
	drivers/scsi/ibmmca.c
148
	drivers/scsi/ibmmca.h
149
   The driver for the IBM SCSI subsystem.  Includes both integrated
150
   controllers and adapter cards.  May require command-line arg
151
   "ibmmcascsi=io_port" to force detection of an adapter.  If you have a
152
   machine with a front-panel display (i.e. model 95), you can use
153
   "ibmmcascsi=display" to enable a drive activity indicator.
154
155
2) 3c523
156
	drivers/net/3c523.c
157
	drivers/net/3c523.h
158
   3Com 3c523 Etherlink/MC ethernet driver.
159
160
3) SMC Ultra/MCA and IBM Adapter/A
161
	drivers/net/smc-mca.c
162
	drivers/net/smc-mca.h
163
	Driver for the MCA version of the SMC Ultra and various other
164
	OEM'ed and work-alike cards (Elite, Adapter/A, etc).
165
166
4) NE/2
167
	driver/net/ne2.c
168
	driver/net/ne2.h
169
	The NE/2 is the MCA version of the NE2000.  This may not work
170
	with clones that have a different adapter id than the original
171
	NE/2.
172
173
5) Future Domain MCS-600/700, OEM'd IBM Fast SCSI Adapter/A and
174
   Reply Sound Blaster/SCSI (SCSI part)
175
	Better support for these cards than the driver for ISA.
176
   Supports multiple cards with IRQ sharing.
177
178
Also added boot time option of scsi-probe, which can do reordering of
179
SCSI host adapters. This will direct the kernel on the order which
180
SCSI adapter should be detected. Example:
181
  scsi-probe=ibmmca,fd_mcs,adaptec1542,buslogic
182
183
The serial drivers were modified to support the extended IO port range
184
of the typical MCA system (also #ifdef CONFIG_MCA).
185
186
The following devices work with existing drivers:
187
1) Token-ring
188
2) Future Domain SCSI (MCS-600, MCS-700, not MCS-350, OEM'ed IBM SCSI)
189
3) Adaptec 1640 SCSI (using the aha1542 driver)
190
4) Bustek/Buslogic SCSI (various)
191
5) Probably all Arcnet cards.
192
6) Some, possibly all, MCA IDE controllers.
193
7) 3Com 3c529 (MCA version of 3c509) (patched)
194
195
8) Intel EtherExpressMC  (patched version)
196
   You need to have CONFIG_MCA defined to have EtherExpressMC support.
197
9) Reply Sound Blaster/SCSI (SB part) (patched version)
198
199
Bugs & Other Weirdness
200
======================
201
202
NMIs tend to occur with MCA machines because of various hardware
203
weirdness, bus timeouts, and many other non-critical things.  Some basic
204
code to handle them (inspired by the NetBSD MCA code) has been added to
205
detect the guilty device, but it's pretty incomplete.  If NMIs are a
206
persistent problem (on some model 70 or 80s, they occur every couple
207
shell commands), the CONFIG_IGNORE_NMI flag will take care of that.
208
209
Various Pentium machines have had serious problems with the FPU test in
210
bugs.h.  Basically, the machine hangs after the HLT test.  This occurs,
211
as far as we know, on the Pentium-equipped 85s, 95s, and some PC Servers.
212
The PCI/MCA PC 750s are fine as far as I can tell.  The ``mca-pentium''
213
boot-prompt flag will disable the FPU bug check if this is a problem
214
with your machine.
215
216
The model 80 has a raft of problems that are just too weird and unique
217
to get into here.  Some people have no trouble while others have nothing
218
but problems.  I'd suspect some problems are related to the age of the
219
average 80 and accompanying hardware deterioration, although others
220
are definitely design problems with the hardware.  Among the problems
221
include SCSI controller problems, ESDI controller problems, and serious
222
screw-ups in the floppy controller.  Oh, and the parallel port is also
223
pretty flaky.  There were about 5 or 6 different model 80 motherboards
224
produced to fix various obscure problems.  As far as I know, it's pretty
225
much impossible to tell which bugs a particular model 80 has (other than
226
triggering them, that is).
227
228
Drivers are required for some MCA memory adapters.  If you're suddenly
229
short a few megs of RAM, this might be the reason.  The (I think) Enhanced
230
Memory Adapter commonly found on the model 70 is one.  There's a very
231
alpha driver floating around, but it's pretty ugly (disassembled from
232
the DOS driver, actually).  See the MCA Linux web page (URL below)
233
for more current memory info.
234
235
The Thinkpad 700 and 720 will work, but various components are either
236
non-functional, flaky, or we don't know anything about them.  The
237
graphics controller is supposed to be some WD, but we can't get things
238
working properly.  The PCMCIA slots don't seem to work.  Ditto for APM.
239
The serial ports work, but detection seems to be flaky.
240
241
Credits
242
=======
243
A whole pile of people have contributed to the MCA code.  I'd include
244
their names here, but I don't have a list handy.  Check the MCA Linux
245
home page (URL below) for a perpetually out-of-date list.
246
247
=====================================================================
248
MCA Linux Home Page: http://www.dgmicro.com/mca/
249
250
Christophe Beauregard
251
chrisb@truespectra.com
252
cpbeaure@calum.csclub.uwaterloo.ca
253
254
=====================================================================
255
Appendix A: Sample /proc/mca
256
257
This is from my model 8595.  Slot 1 contains the standard IBM SCSI
258
adapter, slot 3 is an Adaptec AHA-1640, slot 5 is a XGA-1 video adapter,
259
and slot 7 is the 3c523 Etherlink/MC.
260
261
/proc/mca/machine:
262
Model Id: 0xf8
263
Submodel Id: 0x14
264
BIOS Revision: 0x5
265
266
/proc/mca/pos:
267
Slot 1: ff 8e f1 fc a0 ff ff ff  IBM SCSI Adapter w/Cache
268
Slot 2: ff ff ff ff ff ff ff ff  
269
Slot 3: 1f 0f 81 3b bf b6 ff ff  
270
Slot 4: ff ff ff ff ff ff ff ff  
271
Slot 5: db 8f 1d 5e fd c0 00 00  
272
Slot 6: ff ff ff ff ff ff ff ff  
273
Slot 7: 42 60 ff 08 ff ff ff ff  3Com 3c523 Etherlink/MC
274
Slot 8: ff ff ff ff ff ff ff ff  
275
Video : ff ff ff ff ff ff ff ff  
276
SCSI  : ff ff ff ff ff ff ff ff  
277
278
/proc/mca/slot1:
279
Slot: 1
280
Adapter Name: IBM SCSI Adapter w/Cache
281
Id: 8eff
282
Enabled: Yes
283
POS: ff 8e f1 fc a0 ff ff ff 
284
Subsystem PUN: 7
285
Detected at boot: Yes
286
287
/proc/mca/slot3:
288
Slot: 3
289
Adapter Name: Unknown
290
Id: 0f1f
291
Enabled: Yes
292
POS: 1f 0f 81 3b bf b6 ff ff 
293
294
/proc/mca/slot5:
295
Slot: 5
296
Adapter Name: Unknown
297
Id: 8fdb
298
Enabled: Yes
299
POS: db 8f 1d 5e fd c0 00 00 
300
301
/proc/mca/slot7:
302
Slot: 7
303
Adapter Name: 3Com 3c523 Etherlink/MC
304
Id: 6042
305
Enabled: Yes
306
POS: 42 60 ff 08 ff ff ff ff 
307
Revision: 0xe
308
IRQ: 9
309
IO Address: 0x3300-0x3308
310
Memory: 0xd8000-0xdbfff
311
Transceiver: External
312
Device: eth0
313
Hardware Address: 02 60 8c 45 c4 2a