The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/Documentation/mca.txt

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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

Cache object: 470037acce9ffc42a3d22861d2c66ab0


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.