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