Blame view

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