About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / mca.txt


Based on kernel version 3.4. Page generated on 2012-05-21 22:07 EST.

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/x86/kernel/mca_32.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/x86/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
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog