Merge branch 'delete-mca' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux
Pull the MCA deletion branch from Paul Gortmaker:
"It was good that we could support MCA machines back in the day, but
realistically, nobody is using them anymore. They were mostly limited
to 386-sx 16MHz CPU and some 486 class machines and never more than
64MB of RAM. Even the enthusiast hobbyist community seems to have
dried up close to ten years ago, based on what you can find searching
various websites dedicated to the relatively short lived hardware.
So lets remove the support relating to CONFIG_MCA. There is no point
carrying this forward, wasting cycles doing routine maintenance on it;
wasting allyesconfig build time on validating it, wasting I/O on git
grep'ping over it, and so on."
Let's see if anybody screams. It generally has compiled, and James
Bottomley pointed out that there was a MCA extension from NCR that
allowed for up to 4GB of memory and PPro-class machines. So in *theory*
there may be users out there.
But even James (technically listed as a maintainer) doesn't actually
have a system, and while Alan Cox claims to have a machine in his cellar
that he offered to anybody who wants to take it off his hands, he didn't
argue for keeping MCA support either.
So we could bring it back. But somebody had better speak up and talk
about how they have actually been using said MCA hardware with modern
kernels for us to do that. And David already took the patch to delete
all the networking driver code (commit a5e371f61a
: "drivers/net:
delete all code/drivers depending on CONFIG_MCA").
* 'delete-mca' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux:
MCA: delete all remaining traces of microchannel bus support.
scsi: delete the MCA specific drivers and driver code
serial: delete the MCA specific 8250 support.
arm: remove ability to select CONFIG_MCA
This commit is contained in:
commit
d5b4bb4d10
@ -218,8 +218,6 @@ m68k/
|
||||
- directory with info about Linux on Motorola 68k architecture.
|
||||
magic-number.txt
|
||||
- list of magic numbers used to mark/protect kernel data structures.
|
||||
mca.txt
|
||||
- info on supporting Micro Channel Architecture (e.g. PS/2) systems.
|
||||
md.txt
|
||||
- info on boot arguments for the multiple devices driver.
|
||||
memory-barriers.txt
|
||||
|
@ -6,7 +6,7 @@
|
||||
# To add a new book the only step required is to add the book to the
|
||||
# list of DOCBOOKS.
|
||||
|
||||
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
||||
DOCBOOKS := z8530book.xml device-drivers.xml \
|
||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||
writing_usb_driver.xml networking.xml \
|
||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||
|
@ -212,19 +212,6 @@ X!Edrivers/pci/hotplug.c
|
||||
<sect1><title>PCI Hotplug Support Library</title>
|
||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||
</sect1>
|
||||
<sect1><title>MCA Architecture</title>
|
||||
<sect2><title>MCA Device Functions</title>
|
||||
<para>
|
||||
Refer to the file arch/x86/kernel/mca_32.c for more information.
|
||||
</para>
|
||||
<!-- FIXME: Removed for now since no structured comments in source
|
||||
X!Earch/x86/kernel/mca_32.c
|
||||
-->
|
||||
</sect2>
|
||||
<sect2><title>MCA Bus DMA</title>
|
||||
!Iarch/x86/include/asm/mca_dma.h
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="firmware">
|
||||
|
@ -1,107 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||
|
||||
<book id="MCAGuide">
|
||||
<bookinfo>
|
||||
<title>MCA Driver Programming Interface</title>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Alan</firstname>
|
||||
<surname>Cox</surname>
|
||||
<affiliation>
|
||||
<address>
|
||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>David</firstname>
|
||||
<surname>Weinehall</surname>
|
||||
</author>
|
||||
<author>
|
||||
<firstname>Chris</firstname>
|
||||
<surname>Beauregard</surname>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<copyright>
|
||||
<year>2000</year>
|
||||
<holder>Alan Cox</holder>
|
||||
<holder>David Weinehall</holder>
|
||||
<holder>Chris Beauregard</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
This documentation is free software; you can redistribute
|
||||
it and/or modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later
|
||||
version.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
This program is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this program; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
MA 02111-1307 USA
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more details see the file COPYING in the source
|
||||
distribution of Linux.
|
||||
</para>
|
||||
</legalnotice>
|
||||
</bookinfo>
|
||||
|
||||
<toc></toc>
|
||||
|
||||
<chapter id="intro">
|
||||
<title>Introduction</title>
|
||||
<para>
|
||||
The MCA bus functions provide a generalised interface to find MCA
|
||||
bus cards, to claim them for a driver, and to read and manipulate POS
|
||||
registers without being aware of the motherboard internals or
|
||||
certain deep magic specific to onboard devices.
|
||||
</para>
|
||||
<para>
|
||||
The basic interface to the MCA bus devices is the slot. Each slot
|
||||
is numbered and virtual slot numbers are assigned to the internal
|
||||
devices. Using a pci_dev as other busses do does not really make
|
||||
sense in the MCA context as the MCA bus resources require card
|
||||
specific interpretation.
|
||||
</para>
|
||||
<para>
|
||||
Finally the MCA bus functions provide a parallel set of DMA
|
||||
functions mimicing the ISA bus DMA functions as closely as possible,
|
||||
although also supporting the additional DMA functionality on the
|
||||
MCA bus controllers.
|
||||
</para>
|
||||
</chapter>
|
||||
<chapter id="bugs">
|
||||
<title>Known Bugs And Assumptions</title>
|
||||
<para>
|
||||
None.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="pubfunctions">
|
||||
<title>Public Functions Provided</title>
|
||||
!Edrivers/mca/mca-legacy.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="dmafunctions">
|
||||
<title>DMA Functions Provided</title>
|
||||
!Iarch/x86/include/asm/mca_dma.h
|
||||
</chapter>
|
||||
|
||||
</book>
|
@ -847,13 +847,7 @@ Your cooperation is appreciated.
|
||||
...
|
||||
31 = /dev/tap15 16th Ethertap device
|
||||
|
||||
36 block MCA ESDI hard disk
|
||||
0 = /dev/eda First ESDI disk whole disk
|
||||
64 = /dev/edb Second ESDI disk whole disk
|
||||
...
|
||||
|
||||
Partitions are handled in the same way as IDE disks
|
||||
(see major number 3).
|
||||
36 block OBSOLETE (was MCA ESDI hard disk)
|
||||
|
||||
37 char IDE tape
|
||||
0 = /dev/ht0 First IDE tape
|
||||
|
@ -179,7 +179,7 @@ CONFIG_ALPHA_JENSEN or CONFIG_EISA_VLB_PRIMING are set.
|
||||
|
||||
Converting an EISA driver to the new API mostly involves *deleting*
|
||||
code (since probing is now in the core EISA code). Unfortunately, most
|
||||
drivers share their probing routine between ISA, MCA and EISA. Special
|
||||
drivers share their probing routine between ISA, and EISA. Special
|
||||
care must be taken when ripping out the EISA code, so other busses
|
||||
won't suffer from these surgical strikes...
|
||||
|
||||
|
@ -70,7 +70,6 @@ parameter is applicable:
|
||||
M68k M68k architecture is enabled.
|
||||
These options have more detailed description inside of
|
||||
Documentation/m68k/kernel-options.txt.
|
||||
MCA MCA bus support is enabled.
|
||||
MDA MDA console support is enabled.
|
||||
MIPS MIPS architecture is enabled.
|
||||
MOUSE Appropriate mouse support is enabled.
|
||||
|
@ -1,313 +0,0 @@
|
||||
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
|
||||
this have been added in include/linux/mca.h and arch/x86/kernel/mca_32.c.
|
||||
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
|
||||
arch/x86/kernel/time.c) or the first timer interrupt hangs the system.
|
||||
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\n", dev->name );
|
||||
len += sprintf( buf+len, "IRQ: %d\n", dev->irq );
|
||||
len += sprintf( buf+len, "IO Port: %#lx-%#lx\n", ... );
|
||||
...
|
||||
|
||||
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.
|
||||
|
||||
1) PS/2 SCSI
|
||||
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.
|
||||
|
||||
2) 3c523
|
||||
drivers/net/3c523.c
|
||||
drivers/net/3c523.h
|
||||
3Com 3c523 Etherlink/MC ethernet driver.
|
||||
|
||||
3) SMC Ultra/MCA and IBM Adapter/A
|
||||
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).
|
||||
|
||||
4) NE/2
|
||||
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.
|
||||
|
||||
5) Future Domain MCS-600/700, OEM'd IBM Fast SCSI Adapter/A and
|
||||
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.
|
||||
|
||||
=====================================================================
|
||||
MCA Linux Home Page: http://www.dgmicro.com/mca/
|
||||
|
||||
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
|
@ -56,8 +56,6 @@ g_NCR5380.txt
|
||||
- info on driver for NCR5380 and NCR53c400 based adapters
|
||||
hptiop.txt
|
||||
- HIGHPOINT ROCKETRAID 3xxx RAID DRIVER
|
||||
ibmmca.txt
|
||||
- info on driver for IBM adapters with MCA bus
|
||||
in2000.txt
|
||||
- info on in2000 driver
|
||||
libsas.txt
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -37,9 +37,6 @@ parameters may be changed at runtime by the command
|
||||
|
||||
eata= [HW,SCSI]
|
||||
|
||||
fd_mcs= [HW,SCSI]
|
||||
See header of drivers/scsi/fd_mcs.c.
|
||||
|
||||
fdomain= [HW,SCSI]
|
||||
See header of drivers/scsi/fdomain.c.
|
||||
|
||||
@ -48,9 +45,6 @@ parameters may be changed at runtime by the command
|
||||
|
||||
gvp11= [HW,SCSI]
|
||||
|
||||
ibmmcascsi= [HW,MCA,SCSI] IBM MicroChannel SCSI adapter
|
||||
See Documentation/mca.txt.
|
||||
|
||||
in2000= [HW,SCSI]
|
||||
See header of drivers/scsi/in2000.c.
|
||||
|
||||
|
@ -30,7 +30,7 @@ the motherboard (or both). Some aic7xxx based HBAs are dual controllers
|
||||
and thus represent two hosts. Like most modern HBAs, each aic7xxx host
|
||||
has its own PCI device address. [The one-to-one correspondence between
|
||||
a SCSI host and a PCI device is common but not required (e.g. with
|
||||
ISA or MCA adapters).]
|
||||
ISA adapters).]
|
||||
|
||||
The SCSI mid level isolates an LLD from other layers such as the SCSI
|
||||
upper layer drivers and the block layer.
|
||||
|
@ -20,10 +20,10 @@ There are two drivers that work with the different families of Stallion
|
||||
multiport serial boards. One is for the Stallion smart boards - that is
|
||||
EasyIO, EasyConnection 8/32 and EasyConnection 8/64-PCI, the other for
|
||||
the true Stallion intelligent multiport boards - EasyConnection 8/64
|
||||
(ISA, EISA, MCA), EasyConnection/RA-PCI, ONboard and Brumby.
|
||||
(ISA, EISA), EasyConnection/RA-PCI, ONboard and Brumby.
|
||||
|
||||
If you are using any of the Stallion intelligent multiport boards (Brumby,
|
||||
ONboard, EasyConnection 8/64 (ISA, EISA, MCA), EasyConnection/RA-PCI) with
|
||||
ONboard, EasyConnection 8/64 (ISA, EISA), EasyConnection/RA-PCI) with
|
||||
Linux you will need to get the driver utility package. This contains a
|
||||
firmware loader and the firmware images necessary to make the devices operate.
|
||||
|
||||
@ -40,7 +40,7 @@ If you are using the EasyIO, EasyConnection 8/32 or EasyConnection 8/64-PCI
|
||||
boards then you don't need this package, although it does have a serial stats
|
||||
display program.
|
||||
|
||||
If you require DIP switch settings, EISA or MCA configuration files, or any
|
||||
If you require DIP switch settings, or EISA configuration files, or any
|
||||
other information related to Stallion boards then have a look at Stallion's
|
||||
web pages at http://www.stallion.com.
|
||||
|
||||
@ -51,13 +51,13 @@ web pages at http://www.stallion.com.
|
||||
The drivers can be used as loadable modules or compiled into the kernel.
|
||||
You can choose which when doing a "config" on the kernel.
|
||||
|
||||
All ISA, EISA and MCA boards that you want to use need to be configured into
|
||||
All ISA, and EISA boards that you want to use need to be configured into
|
||||
the driver(s). All PCI boards will be automatically detected when you load
|
||||
the driver - so they do not need to be entered into the driver(s)
|
||||
configuration structure. Note that kernel PCI support is required to use PCI
|
||||
boards.
|
||||
|
||||
There are two methods of configuring ISA, EISA and MCA boards into the drivers.
|
||||
There are two methods of configuring ISA and EISA boards into the drivers.
|
||||
If using the driver as a loadable module then the simplest method is to pass
|
||||
the driver configuration as module arguments. The other method is to modify
|
||||
the driver source to add configuration lines for each board in use.
|
||||
@ -71,12 +71,12 @@ That makes things pretty simple to get going.
|
||||
2.1 MODULE DRIVER CONFIGURATION:
|
||||
|
||||
The simplest configuration for modules is to use the module load arguments
|
||||
to configure any ISA, EISA or MCA boards. PCI boards are automatically
|
||||
to configure any ISA or EISA boards. PCI boards are automatically
|
||||
detected, so do not need any additional configuration at all.
|
||||
|
||||
If using EasyIO, EasyConnection 8/32 ISA or MCA, or EasyConnection 8/63-PCI
|
||||
If using EasyIO, EasyConnection 8/32 ISA, or EasyConnection 8/63-PCI
|
||||
boards then use the "stallion" driver module, Otherwise if you are using
|
||||
an EasyConnection 8/64 ISA, EISA or MCA, EasyConnection/RA-PCI, ONboard,
|
||||
an EasyConnection 8/64 ISA or EISA, EasyConnection/RA-PCI, ONboard,
|
||||
Brumby or original Stallion board then use the "istallion" driver module.
|
||||
|
||||
Typically to load up the smart board driver use:
|
||||
@ -146,7 +146,7 @@ on each system boot. Typically configuration files are put in the
|
||||
2.2 STATIC DRIVER CONFIGURATION:
|
||||
|
||||
For static driver configuration you need to modify the driver source code.
|
||||
Entering ISA, EISA and MCA boards into the driver(s) configuration structure
|
||||
Entering ISA and EISA boards into the driver(s) configuration structure
|
||||
involves editing the driver(s) source file. It's pretty easy if you follow
|
||||
the instructions below. Both drivers can support up to 4 boards. The smart
|
||||
card driver (the stallion.c driver) supports any combination of EasyIO and
|
||||
@ -157,7 +157,7 @@ supports any combination of ONboards, Brumbys, Stallions and EasyConnection
|
||||
To set up the driver(s) for the boards that you want to use you need to
|
||||
edit the appropriate driver file and add configuration entries.
|
||||
|
||||
If using EasyIO or EasyConnection 8/32 ISA or MCA boards,
|
||||
If using EasyIO or EasyConnection 8/32 ISA boards,
|
||||
In drivers/char/stallion.c:
|
||||
- find the definition of the stl_brdconf array (of structures)
|
||||
near the top of the file
|
||||
@ -243,7 +243,7 @@ change it on the board.
|
||||
On EasyIO and EasyConnection 8/32 boards the IRQ is software programmable, so
|
||||
if there is a conflict you may need to change the IRQ used for a board. There
|
||||
are no interrupts to worry about for ONboard, Brumby or EasyConnection 8/64
|
||||
(ISA, EISA and MCA) boards. The memory region on EasyConnection 8/64 and
|
||||
(ISA and EISA) boards. The memory region on EasyConnection 8/64 and
|
||||
ONboard boards is software programmable, but not on the Brumby boards.
|
||||
|
||||
|
||||
|
13
MAINTAINERS
13
MAINTAINERS
@ -3347,12 +3347,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
|
||||
S: Maintained
|
||||
F: arch/ia64/
|
||||
|
||||
IBM MCA SCSI SUBSYSTEM DRIVER
|
||||
M: Michael Lang <langa2@kph.uni-mainz.de>
|
||||
W: http://www.uni-mainz.de/~langm000/linux.html
|
||||
S: Maintained
|
||||
F: drivers/scsi/ibmmca.c
|
||||
|
||||
IBM Power Linux RAID adapter
|
||||
M: Brian King <brking@us.ibm.com>
|
||||
S: Supported
|
||||
@ -4458,13 +4452,6 @@ T: git git://git.monstr.eu/linux-2.6-microblaze.git
|
||||
S: Supported
|
||||
F: arch/microblaze/
|
||||
|
||||
MICROCHANNEL ARCHITECTURE (MCA)
|
||||
M: James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
S: Maintained
|
||||
F: Documentation/mca.txt
|
||||
F: drivers/mca/
|
||||
F: include/linux/mca*
|
||||
|
||||
MICROTEK X6 SCANNER
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
S: Maintained
|
||||
|
@ -107,14 +107,6 @@ config EISA
|
||||
config SBUS
|
||||
bool
|
||||
|
||||
config MCA
|
||||
bool
|
||||
help
|
||||
MicroChannel Architecture is found in some IBM PS/2 machines and
|
||||
laptops. It is a bus system similar to PCI or ISA. See
|
||||
<file:Documentation/mca.txt> (and especially the web page given
|
||||
there) before attempting to build an MCA bus kernel.
|
||||
|
||||
config STACKTRACE_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
@ -54,7 +54,6 @@ extern struct cpuinfo_frv __nongprelbss boot_cpu_data;
|
||||
* Bus types
|
||||
*/
|
||||
#define EISA_bus 0
|
||||
#define MCA_bus 0
|
||||
|
||||
struct thread_struct {
|
||||
struct pt_regs *frame; /* [GR28] exception frame ptr for this thread */
|
||||
|
@ -2037,16 +2037,6 @@ config EISA
|
||||
|
||||
source "drivers/eisa/Kconfig"
|
||||
|
||||
config MCA
|
||||
bool "MCA support"
|
||||
---help---
|
||||
MicroChannel Architecture is found in some IBM PS/2 machines and
|
||||
laptops. It is a bus system similar to PCI or ISA. See
|
||||
<file:Documentation/mca.txt> (and especially the web page given
|
||||
there) before attempting to build an MCA bus kernel.
|
||||
|
||||
source "drivers/mca/Kconfig"
|
||||
|
||||
config SCx200
|
||||
tristate "NatSemi SCx200 support"
|
||||
---help---
|
||||
|
@ -1,43 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/* Platform specific MCA defines */
|
||||
#ifndef _ASM_X86_MCA_H
|
||||
#define _ASM_X86_MCA_H
|
||||
|
||||
/* Maximal number of MCA slots - actually, some machines have less, but
|
||||
* they all have sufficient number of POS registers to cover 8.
|
||||
*/
|
||||
#define MCA_MAX_SLOT_NR 8
|
||||
|
||||
/* Most machines have only one MCA bus. The only multiple bus machines
|
||||
* I know have at most two */
|
||||
#define MAX_MCA_BUSSES 2
|
||||
|
||||
#define MCA_PRIMARY_BUS 0
|
||||
#define MCA_SECONDARY_BUS 1
|
||||
|
||||
/* Dummy slot numbers on primary MCA for integrated functions */
|
||||
#define MCA_INTEGSCSI (MCA_MAX_SLOT_NR)
|
||||
#define MCA_INTEGVIDEO (MCA_MAX_SLOT_NR+1)
|
||||
#define MCA_MOTHERBOARD (MCA_MAX_SLOT_NR+2)
|
||||
|
||||
/* Dummy POS values for integrated functions */
|
||||
#define MCA_DUMMY_POS_START 0x10000
|
||||
#define MCA_INTEGSCSI_POS (MCA_DUMMY_POS_START+1)
|
||||
#define MCA_INTEGVIDEO_POS (MCA_DUMMY_POS_START+2)
|
||||
#define MCA_MOTHERBOARD_POS (MCA_DUMMY_POS_START+3)
|
||||
|
||||
/* MCA registers */
|
||||
|
||||
#define MCA_MOTHERBOARD_SETUP_REG 0x94
|
||||
#define MCA_ADAPTER_SETUP_REG 0x96
|
||||
#define MCA_POS_REG(n) (0x100+(n))
|
||||
|
||||
#define MCA_ENABLED 0x01 /* POS 2, set if adapter enabled */
|
||||
|
||||
/* Max number of adapters, including both slots and various integrated
|
||||
* things.
|
||||
*/
|
||||
#define MCA_NUMADAPTERS (MCA_MAX_SLOT_NR+3)
|
||||
|
||||
#endif /* _ASM_X86_MCA_H */
|
@ -1,201 +0,0 @@
|
||||
#ifndef _ASM_X86_MCA_DMA_H
|
||||
#define _ASM_X86_MCA_DMA_H
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
/*
|
||||
* Microchannel specific DMA stuff. DMA on an MCA machine is fairly similar to
|
||||
* standard PC dma, but it certainly has its quirks. DMA register addresses
|
||||
* are in a different place and there are some added functions. Most of this
|
||||
* should be pretty obvious on inspection. Note that the user must divide
|
||||
* count by 2 when using 16-bit dma; that is not handled by these functions.
|
||||
*
|
||||
* Ramen Noodles are yummy.
|
||||
*
|
||||
* 1998 Tymm Twillman <tymm@computer.org>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Registers that are used by the DMA controller; FN is the function register
|
||||
* (tell the controller what to do) and EXE is the execution register (how
|
||||
* to do it)
|
||||
*/
|
||||
|
||||
#define MCA_DMA_REG_FN 0x18
|
||||
#define MCA_DMA_REG_EXE 0x1A
|
||||
|
||||
/*
|
||||
* Functions that the DMA controller can do
|
||||
*/
|
||||
|
||||
#define MCA_DMA_FN_SET_IO 0x00
|
||||
#define MCA_DMA_FN_SET_ADDR 0x20
|
||||
#define MCA_DMA_FN_GET_ADDR 0x30
|
||||
#define MCA_DMA_FN_SET_COUNT 0x40
|
||||
#define MCA_DMA_FN_GET_COUNT 0x50
|
||||
#define MCA_DMA_FN_GET_STATUS 0x60
|
||||
#define MCA_DMA_FN_SET_MODE 0x70
|
||||
#define MCA_DMA_FN_SET_ARBUS 0x80
|
||||
#define MCA_DMA_FN_MASK 0x90
|
||||
#define MCA_DMA_FN_RESET_MASK 0xA0
|
||||
#define MCA_DMA_FN_MASTER_CLEAR 0xD0
|
||||
|
||||
/*
|
||||
* Modes (used by setting MCA_DMA_FN_MODE in the function register)
|
||||
*
|
||||
* Note that the MODE_READ is read from memory (write to device), and
|
||||
* MODE_WRITE is vice-versa.
|
||||
*/
|
||||
|
||||
#define MCA_DMA_MODE_XFER 0x04 /* read by default */
|
||||
#define MCA_DMA_MODE_READ 0x04 /* same as XFER */
|
||||
#define MCA_DMA_MODE_WRITE 0x08 /* OR with MODE_XFER to use */
|
||||
#define MCA_DMA_MODE_IO 0x01 /* DMA from IO register */
|
||||
#define MCA_DMA_MODE_16 0x40 /* 16 bit xfers */
|
||||
|
||||
|
||||
/**
|
||||
* mca_enable_dma - channel to enable DMA on
|
||||
* @dmanr: DMA channel
|
||||
*
|
||||
* Enable the MCA bus DMA on a channel. This can be called from
|
||||
* IRQ context.
|
||||
*/
|
||||
|
||||
static inline void mca_enable_dma(unsigned int dmanr)
|
||||
{
|
||||
outb(MCA_DMA_FN_RESET_MASK | dmanr, MCA_DMA_REG_FN);
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_disble_dma - channel to disable DMA on
|
||||
* @dmanr: DMA channel
|
||||
*
|
||||
* Enable the MCA bus DMA on a channel. This can be called from
|
||||
* IRQ context.
|
||||
*/
|
||||
|
||||
static inline void mca_disable_dma(unsigned int dmanr)
|
||||
{
|
||||
outb(MCA_DMA_FN_MASK | dmanr, MCA_DMA_REG_FN);
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_set_dma_addr - load a 24bit DMA address
|
||||
* @dmanr: DMA channel
|
||||
* @a: 24bit bus address
|
||||
*
|
||||
* Load the address register in the DMA controller. This has a 24bit
|
||||
* limitation (16Mb).
|
||||
*/
|
||||
|
||||
static inline void mca_set_dma_addr(unsigned int dmanr, unsigned int a)
|
||||
{
|
||||
outb(MCA_DMA_FN_SET_ADDR | dmanr, MCA_DMA_REG_FN);
|
||||
outb(a & 0xff, MCA_DMA_REG_EXE);
|
||||
outb((a >> 8) & 0xff, MCA_DMA_REG_EXE);
|
||||
outb((a >> 16) & 0xff, MCA_DMA_REG_EXE);
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_get_dma_addr - load a 24bit DMA address
|
||||
* @dmanr: DMA channel
|
||||
*
|
||||
* Read the address register in the DMA controller. This has a 24bit
|
||||
* limitation (16Mb). The return is a bus address.
|
||||
*/
|
||||
|
||||
static inline unsigned int mca_get_dma_addr(unsigned int dmanr)
|
||||
{
|
||||
unsigned int addr;
|
||||
|
||||
outb(MCA_DMA_FN_GET_ADDR | dmanr, MCA_DMA_REG_FN);
|
||||
addr = inb(MCA_DMA_REG_EXE);
|
||||
addr |= inb(MCA_DMA_REG_EXE) << 8;
|
||||
addr |= inb(MCA_DMA_REG_EXE) << 16;
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_set_dma_count - load a 16bit transfer count
|
||||
* @dmanr: DMA channel
|
||||
* @count: count
|
||||
*
|
||||
* Set the DMA count for this channel. This can be up to 64Kbytes.
|
||||
* Setting a count of zero will not do what you expect.
|
||||
*/
|
||||
|
||||
static inline void mca_set_dma_count(unsigned int dmanr, unsigned int count)
|
||||
{
|
||||
count--; /* transfers one more than count -- correct for this */
|
||||
|
||||
outb(MCA_DMA_FN_SET_COUNT | dmanr, MCA_DMA_REG_FN);
|
||||
outb(count & 0xff, MCA_DMA_REG_EXE);
|
||||
outb((count >> 8) & 0xff, MCA_DMA_REG_EXE);
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_get_dma_residue - get the remaining bytes to transfer
|
||||
* @dmanr: DMA channel
|
||||
*
|
||||
* This function returns the number of bytes left to transfer
|
||||
* on this DMA channel.
|
||||
*/
|
||||
|
||||
static inline unsigned int mca_get_dma_residue(unsigned int dmanr)
|
||||
{
|
||||
unsigned short count;
|
||||
|
||||
outb(MCA_DMA_FN_GET_COUNT | dmanr, MCA_DMA_REG_FN);
|
||||
count = 1 + inb(MCA_DMA_REG_EXE);
|
||||
count += inb(MCA_DMA_REG_EXE) << 8;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_set_dma_io - set the port for an I/O transfer
|
||||
* @dmanr: DMA channel
|
||||
* @io_addr: an I/O port number
|
||||
*
|
||||
* Unlike the ISA bus DMA controllers the DMA on MCA bus can transfer
|
||||
* with an I/O port target.
|
||||
*/
|
||||
|
||||
static inline void mca_set_dma_io(unsigned int dmanr, unsigned int io_addr)
|
||||
{
|
||||
/*
|
||||
* DMA from a port address -- set the io address
|
||||
*/
|
||||
|
||||
outb(MCA_DMA_FN_SET_IO | dmanr, MCA_DMA_REG_FN);
|
||||
outb(io_addr & 0xff, MCA_DMA_REG_EXE);
|
||||
outb((io_addr >> 8) & 0xff, MCA_DMA_REG_EXE);
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_set_dma_mode - set the DMA mode
|
||||
* @dmanr: DMA channel
|
||||
* @mode: mode to set
|
||||
*
|
||||
* The DMA controller supports several modes. The mode values you can
|
||||
* set are-
|
||||
*
|
||||
* %MCA_DMA_MODE_READ when reading from the DMA device.
|
||||
*
|
||||
* %MCA_DMA_MODE_WRITE to writing to the DMA device.
|
||||
*
|
||||
* %MCA_DMA_MODE_IO to do DMA to or from an I/O port.
|
||||
*
|
||||
* %MCA_DMA_MODE_16 to do 16bit transfers.
|
||||
*/
|
||||
|
||||
static inline void mca_set_dma_mode(unsigned int dmanr, unsigned int mode)
|
||||
{
|
||||
outb(MCA_DMA_FN_SET_MODE | dmanr, MCA_DMA_REG_FN);
|
||||
outb(mode, MCA_DMA_REG_EXE);
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_MCA_DMA_H */
|
@ -40,7 +40,7 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
|
||||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
#if defined(CONFIG_MCA) || defined(CONFIG_EISA)
|
||||
#ifdef CONFIG_EISA
|
||||
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||
#endif
|
||||
|
||||
|
@ -84,7 +84,7 @@ struct mpc_bus {
|
||||
#define BUSTYPE_EISA "EISA"
|
||||
#define BUSTYPE_ISA "ISA"
|
||||
#define BUSTYPE_INTERN "INTERN" /* Internal BUS */
|
||||
#define BUSTYPE_MCA "MCA"
|
||||
#define BUSTYPE_MCA "MCA" /* Obsolete */
|
||||
#define BUSTYPE_VL "VL" /* Local bus */
|
||||
#define BUSTYPE_PCI "PCI"
|
||||
#define BUSTYPE_PCMCIA "PCMCIA"
|
||||
@ -169,6 +169,5 @@ enum mp_bustype {
|
||||
MP_BUS_ISA = 1,
|
||||
MP_BUS_EISA,
|
||||
MP_BUS_PCI,
|
||||
MP_BUS_MCA,
|
||||
};
|
||||
#endif /* _ASM_X86_MPSPEC_DEF_H */
|
||||
|
@ -49,7 +49,6 @@ obj-y += cpu/
|
||||
obj-y += acpi/
|
||||
obj-y += reboot.o
|
||||
obj-$(CONFIG_X86_32) += reboot_32.o
|
||||
obj-$(CONFIG_MCA) += mca_32.o
|
||||
obj-$(CONFIG_X86_MSR) += msr.o
|
||||
obj-$(CONFIG_X86_CPUID) += cpuid.o
|
||||
obj-$(CONFIG_PCI) += early-quirks.o
|
||||
|
@ -990,7 +990,7 @@ void __init mp_config_acpi_legacy_irqs(void)
|
||||
int i;
|
||||
struct mpc_intsrc mp_irq;
|
||||
|
||||
#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
|
||||
#ifdef CONFIG_EISA
|
||||
/*
|
||||
* Fabricate the legacy ISA bus (bus #31).
|
||||
*/
|
||||
|
@ -140,7 +140,7 @@ int mp_irq_entries;
|
||||
/* GSI interrupts */
|
||||
static int nr_irqs_gsi = NR_IRQS_LEGACY;
|
||||
|
||||
#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
|
||||
#ifdef CONFIG_EISA
|
||||
int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||
#endif
|
||||
|
||||
@ -835,7 +835,7 @@ static int __init find_isa_irq_apic(int irq, int type)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
#ifdef CONFIG_EISA
|
||||
/*
|
||||
* EISA Edge/Level control register, ELCR
|
||||
*/
|
||||
@ -872,12 +872,6 @@ static int EISA_ELCR(unsigned int irq)
|
||||
#define default_PCI_trigger(idx) (1)
|
||||
#define default_PCI_polarity(idx) (1)
|
||||
|
||||
/* MCA interrupts are always polarity zero level triggered,
|
||||
* when listed as conforming in the MP table. */
|
||||
|
||||
#define default_MCA_trigger(idx) (1)
|
||||
#define default_MCA_polarity(idx) default_ISA_polarity(idx)
|
||||
|
||||
static int irq_polarity(int idx)
|
||||
{
|
||||
int bus = mp_irqs[idx].srcbus;
|
||||
@ -935,7 +929,7 @@ static int irq_trigger(int idx)
|
||||
trigger = default_ISA_trigger(idx);
|
||||
else
|
||||
trigger = default_PCI_trigger(idx);
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
#ifdef CONFIG_EISA
|
||||
switch (mp_bus_id_to_type[bus]) {
|
||||
case MP_BUS_ISA: /* ISA pin */
|
||||
{
|
||||
@ -952,11 +946,6 @@ static int irq_trigger(int idx)
|
||||
/* set before the switch */
|
||||
break;
|
||||
}
|
||||
case MP_BUS_MCA: /* MCA pin */
|
||||
{
|
||||
trigger = default_MCA_trigger(idx);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
printk(KERN_WARNING "broken BIOS!!\n");
|
||||
|
@ -1,476 +0,0 @@
|
||||
/*
|
||||
* Written by Martin Kolinek, February 1996
|
||||
*
|
||||
* Changes:
|
||||
*
|
||||
* Chris Beauregard July 28th, 1996
|
||||
* - Fixed up integrated SCSI detection
|
||||
*
|
||||
* Chris Beauregard August 3rd, 1996
|
||||
* - Made mca_info local
|
||||
* - Made integrated registers accessible through standard function calls
|
||||
* - Added name field
|
||||
* - More sanity checking
|
||||
*
|
||||
* Chris Beauregard August 9th, 1996
|
||||
* - Rewrote /proc/mca
|
||||
*
|
||||
* Chris Beauregard January 7th, 1997
|
||||
* - Added basic NMI-processing
|
||||
* - Added more information to mca_info structure
|
||||
*
|
||||
* David Weinehall October 12th, 1998
|
||||
* - Made a lot of cleaning up in the source
|
||||
* - Added use of save_flags / restore_flags
|
||||
* - Added the 'driver_loaded' flag in MCA_adapter
|
||||
* - Added an alternative implemention of ZP Gu's mca_find_unused_adapter
|
||||
*
|
||||
* David Weinehall March 24th, 1999
|
||||
* - Fixed the output of 'Driver Installed' in /proc/mca/pos
|
||||
* - Made the Integrated Video & SCSI show up even if they have id 0000
|
||||
*
|
||||
* Alexander Viro November 9th, 1999
|
||||
* - Switched to regular procfs methods
|
||||
*
|
||||
* Alfred Arnold & David Weinehall August 23rd, 2000
|
||||
* - Added support for Planar POS-registers
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
static unsigned char which_scsi;
|
||||
|
||||
int MCA_bus;
|
||||
EXPORT_SYMBOL(MCA_bus);
|
||||
|
||||
/*
|
||||
* Motherboard register spinlock. Untested on SMP at the moment, but
|
||||
* are there any MCA SMP boxes?
|
||||
*
|
||||
* Yes - Alan
|
||||
*/
|
||||
static DEFINE_SPINLOCK(mca_lock);
|
||||
|
||||
/* Build the status info for the adapter */
|
||||
|
||||
static void mca_configure_adapter_status(struct mca_device *mca_dev)
|
||||
{
|
||||
mca_dev->status = MCA_ADAPTER_NONE;
|
||||
|
||||
mca_dev->pos_id = mca_dev->pos[0]
|
||||
+ (mca_dev->pos[1] << 8);
|
||||
|
||||
if (!mca_dev->pos_id && mca_dev->slot < MCA_MAX_SLOT_NR) {
|
||||
|
||||
/*
|
||||
* id = 0x0000 usually indicates hardware failure,
|
||||
* however, ZP Gu (zpg@castle.net> reports that his 9556
|
||||
* has 0x0000 as id and everything still works. There
|
||||
* also seem to be an adapter with id = 0x0000; the
|
||||
* NCR Parallel Bus Memory Card. Until this is confirmed,
|
||||
* however, this code will stay.
|
||||
*/
|
||||
|
||||
mca_dev->status = MCA_ADAPTER_ERROR;
|
||||
|
||||
return;
|
||||
} else if (mca_dev->pos_id != 0xffff) {
|
||||
|
||||
/*
|
||||
* 0xffff usually indicates that there's no adapter,
|
||||
* however, some integrated adapters may have 0xffff as
|
||||
* their id and still be valid. Examples are on-board
|
||||
* VGA of the 55sx, the integrated SCSI of the 56 & 57,
|
||||
* and possibly also the 95 ULTIMEDIA.
|
||||
*/
|
||||
|
||||
mca_dev->status = MCA_ADAPTER_NORMAL;
|
||||
}
|
||||
|
||||
if ((mca_dev->pos_id == 0xffff ||
|
||||
mca_dev->pos_id == 0x0000) && mca_dev->slot >= MCA_MAX_SLOT_NR) {
|
||||
int j;
|
||||
|
||||
for (j = 2; j < 8; j++) {
|
||||
if (mca_dev->pos[j] != 0xff) {
|
||||
mca_dev->status = MCA_ADAPTER_NORMAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!(mca_dev->pos[2] & MCA_ENABLED)) {
|
||||
|
||||
/* enabled bit is in POS 2 */
|
||||
|
||||
mca_dev->status = MCA_ADAPTER_DISABLED;
|
||||
}
|
||||
} /* mca_configure_adapter_status */
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
static struct resource mca_standard_resources[] = {
|
||||
{ .start = 0x60, .end = 0x60, .name = "system control port B (MCA)" },
|
||||
{ .start = 0x90, .end = 0x90, .name = "arbitration (MCA)" },
|
||||
{ .start = 0x91, .end = 0x91, .name = "card Select Feedback (MCA)" },
|
||||
{ .start = 0x92, .end = 0x92, .name = "system Control port A (MCA)" },
|
||||
{ .start = 0x94, .end = 0x94, .name = "system board setup (MCA)" },
|
||||
{ .start = 0x96, .end = 0x97, .name = "POS (MCA)" },
|
||||
{ .start = 0x100, .end = 0x107, .name = "POS (MCA)" }
|
||||
};
|
||||
|
||||
#define MCA_STANDARD_RESOURCES ARRAY_SIZE(mca_standard_resources)
|
||||
|
||||
/*
|
||||
* mca_read_and_store_pos - read the POS registers into a memory buffer
|
||||
* @pos: a char pointer to 8 bytes, contains the POS register value on
|
||||
* successful return
|
||||
*
|
||||
* Returns 1 if a card actually exists (i.e. the pos isn't
|
||||
* all 0xff) or 0 otherwise
|
||||
*/
|
||||
static int mca_read_and_store_pos(unsigned char *pos)
|
||||
{
|
||||
int j;
|
||||
int found = 0;
|
||||
|
||||
for (j = 0; j < 8; j++) {
|
||||
pos[j] = inb_p(MCA_POS_REG(j));
|
||||
if (pos[j] != 0xff) {
|
||||
/* 0xff all across means no device. 0x00 means
|
||||
* something's broken, but a device is
|
||||
* probably there. However, if you get 0x00
|
||||
* from a motherboard register it won't matter
|
||||
* what we find. For the record, on the
|
||||
* 57SLC, the integrated SCSI adapter has
|
||||
* 0xffff for the adapter ID, but nonzero for
|
||||
* other registers. */
|
||||
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
static unsigned char mca_pc_read_pos(struct mca_device *mca_dev, int reg)
|
||||
{
|
||||
unsigned char byte;
|
||||
unsigned long flags;
|
||||
|
||||
if (reg < 0 || reg >= 8)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&mca_lock, flags);
|
||||
if (mca_dev->pos_register) {
|
||||
/* Disable adapter setup, enable motherboard setup */
|
||||
|
||||
outb_p(0, MCA_ADAPTER_SETUP_REG);
|
||||
outb_p(mca_dev->pos_register, MCA_MOTHERBOARD_SETUP_REG);
|
||||
|
||||
byte = inb_p(MCA_POS_REG(reg));
|
||||
outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
|
||||
} else {
|
||||
|
||||
/* Make sure motherboard setup is off */
|
||||
|
||||
outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
|
||||
|
||||
/* Read the appropriate register */
|
||||
|
||||
outb_p(0x8|(mca_dev->slot & 0xf), MCA_ADAPTER_SETUP_REG);
|
||||
byte = inb_p(MCA_POS_REG(reg));
|
||||
outb_p(0, MCA_ADAPTER_SETUP_REG);
|
||||
}
|
||||
spin_unlock_irqrestore(&mca_lock, flags);
|
||||
|
||||
mca_dev->pos[reg] = byte;
|
||||
|
||||
return byte;
|
||||
}
|
||||
|
||||
static void mca_pc_write_pos(struct mca_device *mca_dev, int reg,
|
||||
unsigned char byte)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (reg < 0 || reg >= 8)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&mca_lock, flags);
|
||||
|
||||
/* Make sure motherboard setup is off */
|
||||
|
||||
outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
|
||||
|
||||
/* Read in the appropriate register */
|
||||
|
||||
outb_p(0x8|(mca_dev->slot&0xf), MCA_ADAPTER_SETUP_REG);
|
||||
outb_p(byte, MCA_POS_REG(reg));
|
||||
outb_p(0, MCA_ADAPTER_SETUP_REG);
|
||||
|
||||
spin_unlock_irqrestore(&mca_lock, flags);
|
||||
|
||||
/* Update the global register list, while we have the byte */
|
||||
|
||||
mca_dev->pos[reg] = byte;
|
||||
|
||||
}
|
||||
|
||||
/* for the primary MCA bus, we have identity transforms */
|
||||
static int mca_dummy_transform_irq(struct mca_device *mca_dev, int irq)
|
||||
{
|
||||
return irq;
|
||||
}
|
||||
|
||||
static int mca_dummy_transform_ioport(struct mca_device *mca_dev, int port)
|
||||
{
|
||||
return port;
|
||||
}
|
||||
|
||||
static void *mca_dummy_transform_memory(struct mca_device *mca_dev, void *mem)
|
||||
{
|
||||
return mem;
|
||||
}
|
||||
|
||||
|
||||
static int __init mca_init(void)
|
||||
{
|
||||
unsigned int i, j;
|
||||
struct mca_device *mca_dev;
|
||||
unsigned char pos[8];
|
||||
short mca_builtin_scsi_ports[] = {0xf7, 0xfd, 0x00};
|
||||
struct mca_bus *bus;
|
||||
|
||||
/*
|
||||
* WARNING: Be careful when making changes here. Putting an adapter
|
||||
* and the motherboard simultaneously into setup mode may result in
|
||||
* damage to chips (according to The Indispensable PC Hardware Book
|
||||
* by Hans-Peter Messmer). Also, we disable system interrupts (so
|
||||
* that we are not disturbed in the middle of this).
|
||||
*/
|
||||
|
||||
/* Make sure the MCA bus is present */
|
||||
|
||||
if (mca_system_init()) {
|
||||
printk(KERN_ERR "MCA bus system initialisation failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!MCA_bus)
|
||||
return -ENODEV;
|
||||
|
||||
printk(KERN_INFO "Micro Channel bus detected.\n");
|
||||
|
||||
/* All MCA systems have at least a primary bus */
|
||||
bus = mca_attach_bus(MCA_PRIMARY_BUS);
|
||||
if (!bus)
|
||||
goto out_nomem;
|
||||
bus->default_dma_mask = 0xffffffffLL;
|
||||
bus->f.mca_write_pos = mca_pc_write_pos;
|
||||
bus->f.mca_read_pos = mca_pc_read_pos;
|
||||
bus->f.mca_transform_irq = mca_dummy_transform_irq;
|
||||
bus->f.mca_transform_ioport = mca_dummy_transform_ioport;
|
||||
bus->f.mca_transform_memory = mca_dummy_transform_memory;
|
||||
|
||||
/* get the motherboard device */
|
||||
mca_dev = kzalloc(sizeof(struct mca_device), GFP_KERNEL);
|
||||
if (unlikely(!mca_dev))
|
||||
goto out_nomem;
|
||||
|
||||
/*
|
||||
* We do not expect many MCA interrupts during initialization,
|
||||
* but let us be safe:
|
||||
*/
|
||||
spin_lock_irq(&mca_lock);
|
||||
|
||||
/* Make sure adapter setup is off */
|
||||
|
||||
outb_p(0, MCA_ADAPTER_SETUP_REG);
|
||||
|
||||
/* Read motherboard POS registers */
|
||||
|
||||
mca_dev->pos_register = 0x7f;
|
||||
outb_p(mca_dev->pos_register, MCA_MOTHERBOARD_SETUP_REG);
|
||||
mca_dev->name[0] = 0;
|
||||
mca_read_and_store_pos(mca_dev->pos);
|
||||
mca_configure_adapter_status(mca_dev);
|
||||
/* fake POS and slot for a motherboard */
|
||||
mca_dev->pos_id = MCA_MOTHERBOARD_POS;
|
||||
mca_dev->slot = MCA_MOTHERBOARD;
|
||||
mca_register_device(MCA_PRIMARY_BUS, mca_dev);
|
||||
|
||||
mca_dev = kzalloc(sizeof(struct mca_device), GFP_ATOMIC);
|
||||
if (unlikely(!mca_dev))
|
||||
goto out_unlock_nomem;
|
||||
|
||||
/* Put motherboard into video setup mode, read integrated video
|
||||
* POS registers, and turn motherboard setup off.
|
||||
*/
|
||||
|
||||
mca_dev->pos_register = 0xdf;
|
||||
outb_p(mca_dev->pos_register, MCA_MOTHERBOARD_SETUP_REG);
|
||||
mca_dev->name[0] = 0;
|
||||
mca_read_and_store_pos(mca_dev->pos);
|
||||
mca_configure_adapter_status(mca_dev);
|
||||
/* fake POS and slot for the integrated video */
|
||||
mca_dev->pos_id = MCA_INTEGVIDEO_POS;
|
||||
mca_dev->slot = MCA_INTEGVIDEO;
|
||||
mca_register_device(MCA_PRIMARY_BUS, mca_dev);
|
||||
|
||||
/*
|
||||
* Put motherboard into scsi setup mode, read integrated scsi
|
||||
* POS registers, and turn motherboard setup off.
|
||||
*
|
||||
* It seems there are two possible SCSI registers. Martin says that
|
||||
* for the 56,57, 0xf7 is the one, but fails on the 76.
|
||||
* Alfredo (apena@vnet.ibm.com) says
|
||||
* 0xfd works on his machine. We'll try both of them. I figure it's
|
||||
* a good bet that only one could be valid at a time. This could
|
||||
* screw up though if one is used for something else on the other
|
||||
* machine.
|
||||
*/
|
||||
|
||||
for (i = 0; (which_scsi = mca_builtin_scsi_ports[i]) != 0; i++) {
|
||||
outb_p(which_scsi, MCA_MOTHERBOARD_SETUP_REG);
|
||||
if (mca_read_and_store_pos(pos))
|
||||
break;
|
||||
}
|
||||
if (which_scsi) {
|
||||
/* found a scsi card */
|
||||
mca_dev = kzalloc(sizeof(struct mca_device), GFP_ATOMIC);
|
||||
if (unlikely(!mca_dev))
|
||||
goto out_unlock_nomem;
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
mca_dev->pos[j] = pos[j];
|
||||
|
||||
mca_configure_adapter_status(mca_dev);
|
||||
/* fake POS and slot for integrated SCSI controller */
|
||||
mca_dev->pos_id = MCA_INTEGSCSI_POS;
|
||||
mca_dev->slot = MCA_INTEGSCSI;
|
||||
mca_dev->pos_register = which_scsi;
|
||||
mca_register_device(MCA_PRIMARY_BUS, mca_dev);
|
||||
}
|
||||
|
||||
/* Turn off motherboard setup */
|
||||
|
||||
outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
|
||||
|
||||
/*
|
||||
* Now loop over MCA slots: put each adapter into setup mode, and
|
||||
* read its POS registers. Then put adapter setup off.
|
||||
*/
|
||||
|
||||
for (i = 0; i < MCA_MAX_SLOT_NR; i++) {
|
||||
outb_p(0x8|(i&0xf), MCA_ADAPTER_SETUP_REG);
|
||||
if (!mca_read_and_store_pos(pos))
|
||||
continue;
|
||||
|
||||
mca_dev = kzalloc(sizeof(struct mca_device), GFP_ATOMIC);
|
||||
if (unlikely(!mca_dev))
|
||||
goto out_unlock_nomem;
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
mca_dev->pos[j] = pos[j];
|
||||
|
||||
mca_dev->driver_loaded = 0;
|
||||
mca_dev->slot = i;
|
||||
mca_dev->pos_register = 0;
|
||||
mca_configure_adapter_status(mca_dev);
|
||||
mca_register_device(MCA_PRIMARY_BUS, mca_dev);
|
||||
}
|
||||
outb_p(0, MCA_ADAPTER_SETUP_REG);
|
||||
|
||||
/* Enable interrupts and return memory start */
|
||||
spin_unlock_irq(&mca_lock);
|
||||
|
||||
for (i = 0; i < MCA_STANDARD_RESOURCES; i++)
|
||||
request_resource(&ioport_resource, mca_standard_resources + i);
|
||||
|
||||
mca_do_proc_init();
|
||||
|
||||
return 0;
|
||||
|
||||
out_unlock_nomem:
|
||||
spin_unlock_irq(&mca_lock);
|
||||
out_nomem:
|
||||
printk(KERN_EMERG "Failed memory allocation in MCA setup!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
subsys_initcall(mca_init);
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
static __kprobes void
|
||||
mca_handle_nmi_device(struct mca_device *mca_dev, int check_flag)
|
||||
{
|
||||
int slot = mca_dev->slot;
|
||||
|
||||
if (slot == MCA_INTEGSCSI) {
|
||||
printk(KERN_CRIT "NMI: caused by MCA integrated SCSI adapter (%s)\n",
|
||||
mca_dev->name);
|
||||
} else if (slot == MCA_INTEGVIDEO) {
|
||||
printk(KERN_CRIT "NMI: caused by MCA integrated video adapter (%s)\n",
|
||||
mca_dev->name);
|
||||
} else if (slot == MCA_MOTHERBOARD) {
|
||||
printk(KERN_CRIT "NMI: caused by motherboard (%s)\n",
|
||||
mca_dev->name);
|
||||
}
|
||||
|
||||
/* More info available in POS 6 and 7? */
|
||||
|
||||
if (check_flag) {
|
||||
unsigned char pos6, pos7;
|
||||
|
||||
pos6 = mca_device_read_pos(mca_dev, 6);
|
||||
pos7 = mca_device_read_pos(mca_dev, 7);
|
||||
|
||||
printk(KERN_CRIT "NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7);
|
||||
}
|
||||
|
||||
} /* mca_handle_nmi_slot */
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
static int __kprobes mca_handle_nmi_callback(struct device *dev, void *data)
|
||||
{
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
unsigned char pos5;
|
||||
|
||||
pos5 = mca_device_read_pos(mca_dev, 5);
|
||||
|
||||
if (!(pos5 & 0x80)) {
|
||||
/*
|
||||
* Bit 7 of POS 5 is reset when this adapter has a hardware
|
||||
* error. Bit 7 it reset if there's error information
|
||||
* available in POS 6 and 7.
|
||||
*/
|
||||
mca_handle_nmi_device(mca_dev, !(pos5 & 0x40));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __kprobes mca_handle_nmi(void)
|
||||
{
|
||||
/*
|
||||
* First try - scan the various adapters and see if a specific
|
||||
* adapter was responsible for the error.
|
||||
*/
|
||||
bus_for_each_dev(&mca_bus_type, NULL, NULL, mca_handle_nmi_callback);
|
||||
}
|
@ -97,7 +97,7 @@ static void __init MP_bus_info(struct mpc_bus *m)
|
||||
|
||||
set_bit(m->busid, mp_bus_not_pci);
|
||||
if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) {
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
#ifdef CONFIG_EISA
|
||||
mp_bus_id_to_type[m->busid] = MP_BUS_ISA;
|
||||
#endif
|
||||
} else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) {
|
||||
@ -105,12 +105,10 @@ static void __init MP_bus_info(struct mpc_bus *m)
|
||||
x86_init.mpparse.mpc_oem_pci_bus(m);
|
||||
|
||||
clear_bit(m->busid, mp_bus_not_pci);
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
#ifdef CONFIG_EISA
|
||||
mp_bus_id_to_type[m->busid] = MP_BUS_PCI;
|
||||
} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) {
|
||||
mp_bus_id_to_type[m->busid] = MP_BUS_EISA;
|
||||
} else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA) - 1) == 0) {
|
||||
mp_bus_id_to_type[m->busid] = MP_BUS_MCA;
|
||||
#endif
|
||||
} else
|
||||
printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
|
||||
@ -368,9 +366,6 @@ static void __init construct_ioapic_table(int mpc_default_type)
|
||||
case 3:
|
||||
memcpy(bus.bustype, "EISA ", 6);
|
||||
break;
|
||||
case 4:
|
||||
case 7:
|
||||
memcpy(bus.bustype, "MCA ", 6);
|
||||
}
|
||||
MP_bus_info(&bus);
|
||||
if (mpc_default_type > 4) {
|
||||
@ -623,7 +618,7 @@ void __init default_find_smp_config(void)
|
||||
return;
|
||||
/*
|
||||
* If it is an SMP machine we should know now, unless the
|
||||
* configuration is in an EISA/MCA bus machine with an
|
||||
* configuration is in an EISA bus machine with an
|
||||
* extended bios data area.
|
||||
*
|
||||
* there is a real-mode segmented pointer pointing to the
|
||||
|
@ -19,8 +19,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
#include <linux/mca.h>
|
||||
|
||||
#if defined(CONFIG_EDAC)
|
||||
#include <linux/edac.h>
|
||||
#endif
|
||||
@ -247,16 +245,6 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
|
||||
|
||||
__this_cpu_add(nmi_stats.unknown, 1);
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
/*
|
||||
* Might actually be able to figure out what the guilty party
|
||||
* is:
|
||||
*/
|
||||
if (MCA_bus) {
|
||||
mca_handle_nmi();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
pr_emerg("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
|
||||
reason, smp_processor_id());
|
||||
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/module.h>
|
||||
@ -179,12 +178,6 @@ struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1};
|
||||
/* common cpu data for all cpus */
|
||||
struct cpuinfo_x86 boot_cpu_data __read_mostly = {0, 0, 0, 0, -1, 1, 0, 0, -1};
|
||||
EXPORT_SYMBOL(boot_cpu_data);
|
||||
static void set_mca_bus(int x)
|
||||
{
|
||||
#ifdef CONFIG_MCA
|
||||
MCA_bus = x;
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int def_to_bigsmp;
|
||||
|
||||
@ -716,7 +709,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
apm_info.bios = boot_params.apm_bios_info;
|
||||
ist_info = boot_params.ist_info;
|
||||
if (boot_params.sys_desc_table.length != 0) {
|
||||
set_mca_bus(boot_params.sys_desc_table.table[3] & 0x2);
|
||||
machine_id = boot_params.sys_desc_table.table[0];
|
||||
machine_submodel_id = boot_params.sys_desc_table.table[1];
|
||||
BIOS_revision = boot_params.sys_desc_table.table[2];
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <linux/i8253.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mca.h>
|
||||
|
||||
#include <asm/vsyscall.h>
|
||||
#include <asm/x86_init.h>
|
||||
@ -58,11 +57,6 @@ EXPORT_SYMBOL(profile_pc);
|
||||
static irqreturn_t timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
global_clock_event->event_handler(global_clock_event);
|
||||
|
||||
/* MCA bus quirk: Acknowledge irq0 by setting bit 7 in port 0x61 */
|
||||
if (MCA_bus)
|
||||
outb_p(inb_p(0x61)| 0x80, 0x61);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -37,10 +37,6 @@
|
||||
#include <linux/eisa.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
#include <linux/mca.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_EDAC)
|
||||
#include <linux/edac.h>
|
||||
#endif
|
||||
|
@ -92,7 +92,6 @@ obj-$(CONFIG_BT) += bluetooth/
|
||||
obj-$(CONFIG_ACCESSIBILITY) += accessibility/
|
||||
obj-$(CONFIG_ISDN) += isdn/
|
||||
obj-$(CONFIG_EDAC) += edac/
|
||||
obj-$(CONFIG_MCA) += mca/
|
||||
obj-$(CONFIG_EISA) += eisa/
|
||||
obj-y += lguest/
|
||||
obj-$(CONFIG_CPU_FREQ) += cpufreq/
|
||||
|
@ -1,14 +0,0 @@
|
||||
config MCA_LEGACY
|
||||
bool "Legacy MCA API Support"
|
||||
depends on MCA
|
||||
help
|
||||
This compiles in support for the old slot based MCA API. If you
|
||||
have an unconverted MCA driver, you will need to say Y here. It
|
||||
is safe to say Y anyway.
|
||||
|
||||
config MCA_PROC_FS
|
||||
bool "Support for the mca entry in /proc"
|
||||
depends on MCA_LEGACY && PROC_FS
|
||||
help
|
||||
If you want the old style /proc/mca directory in addition to the
|
||||
new style sysfs say Y here.
|
@ -1,7 +0,0 @@
|
||||
# Makefile for the Linux MCA bus support
|
||||
|
||||
obj-y := mca-bus.o mca-device.o mca-driver.o
|
||||
|
||||
obj-$(CONFIG_MCA_PROC_FS) += mca-proc.o
|
||||
obj-$(CONFIG_MCA_LEGACY) += mca-legacy.o
|
||||
|
@ -1,169 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/*
|
||||
* MCA bus support functions for sysfs.
|
||||
*
|
||||
* (C) 2002 James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
*
|
||||
**-----------------------------------------------------------------------------
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation; either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
**
|
||||
**-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
/* Very few machines have more than one MCA bus. However, there are
|
||||
* those that do (Voyager 35xx/5xxx), so we do it this way for future
|
||||
* expansion. None that I know have more than 2 */
|
||||
static struct mca_bus *mca_root_busses[MAX_MCA_BUSSES];
|
||||
|
||||
#define MCA_DEVINFO(i,s) { .pos = i, .name = s }
|
||||
|
||||
struct mca_device_info {
|
||||
short pos_id; /* the 2 byte pos id for this card */
|
||||
char name[50];
|
||||
};
|
||||
|
||||
static int mca_bus_match (struct device *dev, struct device_driver *drv)
|
||||
{
|
||||
struct mca_device *mca_dev = to_mca_device (dev);
|
||||
struct mca_driver *mca_drv = to_mca_driver (drv);
|
||||
const unsigned short *mca_ids = mca_drv->id_table;
|
||||
int i = 0;
|
||||
|
||||
if (mca_ids) {
|
||||
for(i = 0; mca_ids[i]; i++) {
|
||||
if (mca_ids[i] == mca_dev->pos_id) {
|
||||
mca_dev->index = i;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* If the integrated id is present, treat it as though it were an
|
||||
* additional id in the id_table (it can't be because by definition,
|
||||
* integrated id's overflow a short */
|
||||
if (mca_drv->integrated_id && mca_dev->pos_id ==
|
||||
mca_drv->integrated_id) {
|
||||
mca_dev->index = i;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct bus_type mca_bus_type = {
|
||||
.name = "MCA",
|
||||
.match = mca_bus_match,
|
||||
};
|
||||
EXPORT_SYMBOL (mca_bus_type);
|
||||
|
||||
static ssize_t mca_show_pos_id(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
/* four digits, \n and trailing \0 */
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
int len;
|
||||
|
||||
if(mca_dev->pos_id < MCA_DUMMY_POS_START)
|
||||
len = sprintf(buf, "%04x\n", mca_dev->pos_id);
|
||||
else
|
||||
len = sprintf(buf, "none\n");
|
||||
return len;
|
||||
}
|
||||
static ssize_t mca_show_pos(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
/* enough for 8 two byte hex chars plus space and new line */
|
||||
int j, len=0;
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
|
||||
for(j=0; j<8; j++)
|
||||
len += sprintf(buf+len, "%02x ", mca_dev->pos[j]);
|
||||
/* change last trailing space to new line */
|
||||
buf[len-1] = '\n';
|
||||
return len;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(id, S_IRUGO, mca_show_pos_id, NULL);
|
||||
static DEVICE_ATTR(pos, S_IRUGO, mca_show_pos, NULL);
|
||||
|
||||
int __init mca_register_device(int bus, struct mca_device *mca_dev)
|
||||
{
|
||||
struct mca_bus *mca_bus = mca_root_busses[bus];
|
||||
int rc;
|
||||
|
||||
mca_dev->dev.parent = &mca_bus->dev;
|
||||
mca_dev->dev.bus = &mca_bus_type;
|
||||
dev_set_name(&mca_dev->dev, "%02d:%02X", bus, mca_dev->slot);
|
||||
mca_dev->dma_mask = mca_bus->default_dma_mask;
|
||||
mca_dev->dev.dma_mask = &mca_dev->dma_mask;
|
||||
mca_dev->dev.coherent_dma_mask = mca_dev->dma_mask;
|
||||
|
||||
rc = device_register(&mca_dev->dev);
|
||||
if (rc)
|
||||
goto err_out;
|
||||
|
||||
rc = device_create_file(&mca_dev->dev, &dev_attr_id);
|
||||
if (rc) goto err_out_devreg;
|
||||
rc = device_create_file(&mca_dev->dev, &dev_attr_pos);
|
||||
if (rc) goto err_out_id;
|
||||
|
||||
return 1;
|
||||
|
||||
err_out_id:
|
||||
device_remove_file(&mca_dev->dev, &dev_attr_id);
|
||||
err_out_devreg:
|
||||
device_unregister(&mca_dev->dev);
|
||||
err_out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
struct mca_bus * __devinit mca_attach_bus(int bus)
|
||||
{
|
||||
struct mca_bus *mca_bus;
|
||||
|
||||
if (unlikely(mca_root_busses[bus] != NULL)) {
|
||||
/* This should never happen, but just in case */
|
||||
printk(KERN_EMERG "MCA tried to add already existing bus %d\n",
|
||||
bus);
|
||||
dump_stack();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mca_bus = kzalloc(sizeof(struct mca_bus), GFP_KERNEL);
|
||||
if (!mca_bus)
|
||||
return NULL;
|
||||
|
||||
dev_set_name(&mca_bus->dev, "mca%d", bus);
|
||||
sprintf(mca_bus->name,"Host %s MCA Bridge", bus ? "Secondary" : "Primary");
|
||||
if (device_register(&mca_bus->dev)) {
|
||||
kfree(mca_bus);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mca_root_busses[bus] = mca_bus;
|
||||
|
||||
return mca_bus;
|
||||
}
|
||||
|
||||
int __init mca_system_init (void)
|
||||
{
|
||||
return bus_register(&mca_bus_type);
|
||||
}
|
@ -1,218 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/*
|
||||
* MCA device support functions
|
||||
*
|
||||
* These functions support the ongoing device access API.
|
||||
*
|
||||
* (C) 2002 James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
*
|
||||
**-----------------------------------------------------------------------------
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation; either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
**
|
||||
**-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
/**
|
||||
* mca_device_read_stored_pos - read POS register from stored data
|
||||
* @mca_dev: device to read from
|
||||
* @reg: register to read from
|
||||
*
|
||||
* Fetch a POS value that was stored at boot time by the kernel
|
||||
* when it scanned the MCA space. The register value is returned.
|
||||
* Missing or invalid registers report 0.
|
||||
*/
|
||||
unsigned char mca_device_read_stored_pos(struct mca_device *mca_dev, int reg)
|
||||
{
|
||||
if(reg < 0 || reg >= 8)
|
||||
return 0;
|
||||
|
||||
return mca_dev->pos[reg];
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_read_stored_pos);
|
||||
|
||||
/**
|
||||
* mca_device_read_pos - read POS register from card
|
||||
* @mca_dev: device to read from
|
||||
* @reg: register to read from
|
||||
*
|
||||
* Fetch a POS value directly from the hardware to obtain the
|
||||
* current value. This is much slower than
|
||||
* mca_device_read_stored_pos and may not be invoked from
|
||||
* interrupt context. It handles the deep magic required for
|
||||
* onboard devices transparently.
|
||||
*/
|
||||
unsigned char mca_device_read_pos(struct mca_device *mca_dev, int reg)
|
||||
{
|
||||
struct mca_bus *mca_bus = to_mca_bus(mca_dev->dev.parent);
|
||||
|
||||
return mca_bus->f.mca_read_pos(mca_dev, reg);
|
||||
|
||||
return mca_dev->pos[reg];
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_read_pos);
|
||||
|
||||
|
||||
/**
|
||||
* mca_device_write_pos - read POS register from card
|
||||
* @mca_dev: device to write pos register to
|
||||
* @reg: register to write to
|
||||
* @byte: byte to write to the POS registers
|
||||
*
|
||||
* Store a POS value directly to the hardware. You should not
|
||||
* normally need to use this function and should have a very good
|
||||
* knowledge of MCA bus before you do so. Doing this wrongly can
|
||||
* damage the hardware.
|
||||
*
|
||||
* This function may not be used from interrupt context.
|
||||
*
|
||||
*/
|
||||
void mca_device_write_pos(struct mca_device *mca_dev, int reg,
|
||||
unsigned char byte)
|
||||
{
|
||||
struct mca_bus *mca_bus = to_mca_bus(mca_dev->dev.parent);
|
||||
|
||||
mca_bus->f.mca_write_pos(mca_dev, reg, byte);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_write_pos);
|
||||
|
||||
/**
|
||||
* mca_device_transform_irq - transform the ADF obtained IRQ
|
||||
* @mca_device: device whose irq needs transforming
|
||||
* @irq: input irq from ADF
|
||||
*
|
||||
* MCA Adapter Definition Files (ADF) contain irq, ioport, memory
|
||||
* etc. definitions. In systems with more than one bus, these need
|
||||
* to be transformed through bus mapping functions to get the real
|
||||
* system global quantities.
|
||||
*
|
||||
* This function transforms the interrupt number and returns the
|
||||
* transformed system global interrupt
|
||||
*/
|
||||
int mca_device_transform_irq(struct mca_device *mca_dev, int irq)
|
||||
{
|
||||
struct mca_bus *mca_bus = to_mca_bus(mca_dev->dev.parent);
|
||||
|
||||
return mca_bus->f.mca_transform_irq(mca_dev, irq);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_transform_irq);
|
||||
|
||||
/**
|
||||
* mca_device_transform_ioport - transform the ADF obtained I/O port
|
||||
* @mca_device: device whose port needs transforming
|
||||
* @ioport: input I/O port from ADF
|
||||
*
|
||||
* MCA Adapter Definition Files (ADF) contain irq, ioport, memory
|
||||
* etc. definitions. In systems with more than one bus, these need
|
||||
* to be transformed through bus mapping functions to get the real
|
||||
* system global quantities.
|
||||
*
|
||||
* This function transforms the I/O port number and returns the
|
||||
* transformed system global port number.
|
||||
*
|
||||
* This transformation can be assumed to be linear for port ranges.
|
||||
*/
|
||||
int mca_device_transform_ioport(struct mca_device *mca_dev, int port)
|
||||
{
|
||||
struct mca_bus *mca_bus = to_mca_bus(mca_dev->dev.parent);
|
||||
|
||||
return mca_bus->f.mca_transform_ioport(mca_dev, port);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_transform_ioport);
|
||||
|
||||
/**
|
||||
* mca_device_transform_memory - transform the ADF obtained memory
|
||||
* @mca_device: device whose memory region needs transforming
|
||||
* @mem: memory region start from ADF
|
||||
*
|
||||
* MCA Adapter Definition Files (ADF) contain irq, ioport, memory
|
||||
* etc. definitions. In systems with more than one bus, these need
|
||||
* to be transformed through bus mapping functions to get the real
|
||||
* system global quantities.
|
||||
*
|
||||
* This function transforms the memory region start and returns the
|
||||
* transformed system global memory region (physical).
|
||||
*
|
||||
* This transformation can be assumed to be linear for region ranges.
|
||||
*/
|
||||
void *mca_device_transform_memory(struct mca_device *mca_dev, void *mem)
|
||||
{
|
||||
struct mca_bus *mca_bus = to_mca_bus(mca_dev->dev.parent);
|
||||
|
||||
return mca_bus->f.mca_transform_memory(mca_dev, mem);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_transform_memory);
|
||||
|
||||
|
||||
/**
|
||||
* mca_device_claimed - check if claimed by driver
|
||||
* @mca_dev: device to check
|
||||
*
|
||||
* Returns 1 if the slot has been claimed by a driver
|
||||
*/
|
||||
|
||||
int mca_device_claimed(struct mca_device *mca_dev)
|
||||
{
|
||||
return mca_dev->driver_loaded;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_claimed);
|
||||
|
||||
/**
|
||||
* mca_device_set_claim - set the claim value of the driver
|
||||
* @mca_dev: device to set value for
|
||||
* @val: claim value to set (1 claimed, 0 unclaimed)
|
||||
*/
|
||||
void mca_device_set_claim(struct mca_device *mca_dev, int val)
|
||||
{
|
||||
mca_dev->driver_loaded = val;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_set_claim);
|
||||
|
||||
/**
|
||||
* mca_device_status - get the status of the device
|
||||
* @mca_device: device to get
|
||||
*
|
||||
* returns an enumeration of the device status:
|
||||
*
|
||||
* MCA_ADAPTER_NORMAL adapter is OK.
|
||||
* MCA_ADAPTER_NONE no adapter at device (should never happen).
|
||||
* MCA_ADAPTER_DISABLED adapter is disabled.
|
||||
* MCA_ADAPTER_ERROR adapter cannot be initialised.
|
||||
*/
|
||||
enum MCA_AdapterStatus mca_device_status(struct mca_device *mca_dev)
|
||||
{
|
||||
return mca_dev->status;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_status);
|
||||
|
||||
/**
|
||||
* mca_device_set_name - set the name of the device
|
||||
* @mca_device: device to set the name of
|
||||
* @name: name to set
|
||||
*/
|
||||
void mca_device_set_name(struct mca_device *mca_dev, const char *name)
|
||||
{
|
||||
if(!mca_dev)
|
||||
return;
|
||||
|
||||
strlcpy(mca_dev->name, name, sizeof(mca_dev->name));
|
||||
}
|
||||
EXPORT_SYMBOL(mca_device_set_name);
|
@ -1,63 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/*
|
||||
* MCA driver support functions for sysfs.
|
||||
*
|
||||
* (C) 2002 James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
*
|
||||
**-----------------------------------------------------------------------------
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation; either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
**
|
||||
**-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
int mca_register_driver(struct mca_driver *mca_drv)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (MCA_bus) {
|
||||
mca_drv->driver.bus = &mca_bus_type;
|
||||
if ((r = driver_register(&mca_drv->driver)) < 0)
|
||||
return r;
|
||||
mca_drv->integrated_id = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_register_driver);
|
||||
|
||||
int mca_register_driver_integrated(struct mca_driver *mca_driver,
|
||||
int integrated_id)
|
||||
{
|
||||
int r = mca_register_driver(mca_driver);
|
||||
|
||||
if (!r)
|
||||
mca_driver->integrated_id = integrated_id;
|
||||
|
||||
return r;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_register_driver_integrated);
|
||||
|
||||
void mca_unregister_driver(struct mca_driver *mca_drv)
|
||||
{
|
||||
if (MCA_bus)
|
||||
driver_unregister(&mca_drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_unregister_driver);
|
@ -1,329 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/*
|
||||
* MCA bus support functions for legacy (2.4) API.
|
||||
*
|
||||
* Legacy API means the API that operates in terms of MCA slot number
|
||||
*
|
||||
* (C) 2002 James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
*
|
||||
**-----------------------------------------------------------------------------
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation; either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
**
|
||||
**-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mca-legacy.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* NOTE: This structure is stack allocated */
|
||||
struct mca_find_adapter_info {
|
||||
int id;
|
||||
int slot;
|
||||
struct mca_device *mca_dev;
|
||||
};
|
||||
|
||||
/* The purpose of this iterator is to loop over all the devices and
|
||||
* find the one with the smallest slot number that's just greater than
|
||||
* or equal to the required slot with a matching id */
|
||||
static int mca_find_adapter_callback(struct device *dev, void *data)
|
||||
{
|
||||
struct mca_find_adapter_info *info = data;
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
|
||||
if(mca_dev->pos_id != info->id)
|
||||
return 0;
|
||||
|
||||
if(mca_dev->slot < info->slot)
|
||||
return 0;
|
||||
|
||||
if(!info->mca_dev || info->mca_dev->slot >= mca_dev->slot)
|
||||
info->mca_dev = mca_dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_find_adapter - scan for adapters
|
||||
* @id: MCA identification to search for
|
||||
* @start: starting slot
|
||||
*
|
||||
* Search the MCA configuration for adapters matching the 16bit
|
||||
* ID given. The first time it should be called with start as zero
|
||||
* and then further calls made passing the return value of the
|
||||
* previous call until %MCA_NOTFOUND is returned.
|
||||
*
|
||||
* Disabled adapters are not reported.
|
||||
*/
|
||||
|
||||
int mca_find_adapter(int id, int start)
|
||||
{
|
||||
struct mca_find_adapter_info info;
|
||||
|
||||
if(id == 0xffff)
|
||||
return MCA_NOTFOUND;
|
||||
|
||||
info.slot = start;
|
||||
info.id = id;
|
||||
info.mca_dev = NULL;
|
||||
|
||||
for(;;) {
|
||||
bus_for_each_dev(&mca_bus_type, NULL, &info, mca_find_adapter_callback);
|
||||
|
||||
if(info.mca_dev == NULL)
|
||||
return MCA_NOTFOUND;
|
||||
|
||||
if(info.mca_dev->status != MCA_ADAPTER_DISABLED)
|
||||
break;
|
||||
|
||||
/* OK, found adapter but it was disabled. Go around
|
||||
* again, excluding the slot we just found */
|
||||
|
||||
info.slot = info.mca_dev->slot + 1;
|
||||
info.mca_dev = NULL;
|
||||
}
|
||||
|
||||
return info.mca_dev->slot;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_find_adapter);
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* mca_find_unused_adapter - scan for unused adapters
|
||||
* @id: MCA identification to search for
|
||||
* @start: starting slot
|
||||
*
|
||||
* Search the MCA configuration for adapters matching the 16bit
|
||||
* ID given. The first time it should be called with start as zero
|
||||
* and then further calls made passing the return value of the
|
||||
* previous call until %MCA_NOTFOUND is returned.
|
||||
*
|
||||
* Adapters that have been claimed by drivers and those that
|
||||
* are disabled are not reported. This function thus allows a driver
|
||||
* to scan for further cards when some may already be driven.
|
||||
*/
|
||||
|
||||
int mca_find_unused_adapter(int id, int start)
|
||||
{
|
||||
struct mca_find_adapter_info info = { 0 };
|
||||
|
||||
if (!MCA_bus || id == 0xffff)
|
||||
return MCA_NOTFOUND;
|
||||
|
||||
info.slot = start;
|
||||
info.id = id;
|
||||
info.mca_dev = NULL;
|
||||
|
||||
for(;;) {
|
||||
bus_for_each_dev(&mca_bus_type, NULL, &info, mca_find_adapter_callback);
|
||||
|
||||
if(info.mca_dev == NULL)
|
||||
return MCA_NOTFOUND;
|
||||
|
||||
if(info.mca_dev->status != MCA_ADAPTER_DISABLED
|
||||
&& !info.mca_dev->driver_loaded)
|
||||
break;
|
||||
|
||||
/* OK, found adapter but it was disabled or already in
|
||||
* use. Go around again, excluding the slot we just
|
||||
* found */
|
||||
|
||||
info.slot = info.mca_dev->slot + 1;
|
||||
info.mca_dev = NULL;
|
||||
}
|
||||
|
||||
return info.mca_dev->slot;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_find_unused_adapter);
|
||||
|
||||
/* NOTE: stack allocated structure */
|
||||
struct mca_find_device_by_slot_info {
|
||||
int slot;
|
||||
struct mca_device *mca_dev;
|
||||
};
|
||||
|
||||
static int mca_find_device_by_slot_callback(struct device *dev, void *data)
|
||||
{
|
||||
struct mca_find_device_by_slot_info *info = data;
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
|
||||
if(mca_dev->slot == info->slot)
|
||||
info->mca_dev = mca_dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct mca_device *mca_find_device_by_slot(int slot)
|
||||
{
|
||||
struct mca_find_device_by_slot_info info;
|
||||
|
||||
info.slot = slot;
|
||||
info.mca_dev = NULL;
|
||||
|
||||
bus_for_each_dev(&mca_bus_type, NULL, &info, mca_find_device_by_slot_callback);
|
||||
|
||||
return info.mca_dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* mca_read_stored_pos - read POS register from boot data
|
||||
* @slot: slot number to read from
|
||||
* @reg: register to read from
|
||||
*
|
||||
* Fetch a POS value that was stored at boot time by the kernel
|
||||
* when it scanned the MCA space. The register value is returned.
|
||||
* Missing or invalid registers report 0.
|
||||
*/
|
||||
unsigned char mca_read_stored_pos(int slot, int reg)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return 0;
|
||||
|
||||
return mca_device_read_stored_pos(mca_dev, reg);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_read_stored_pos);
|
||||
|
||||
|
||||
/**
|
||||
* mca_read_pos - read POS register from card
|
||||
* @slot: slot number to read from
|
||||
* @reg: register to read from
|
||||
*
|
||||
* Fetch a POS value directly from the hardware to obtain the
|
||||
* current value. This is much slower than mca_read_stored_pos and
|
||||
* may not be invoked from interrupt context. It handles the
|
||||
* deep magic required for onboard devices transparently.
|
||||
*/
|
||||
|
||||
unsigned char mca_read_pos(int slot, int reg)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return 0;
|
||||
|
||||
return mca_device_read_pos(mca_dev, reg);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_read_pos);
|
||||
|
||||
|
||||
/**
|
||||
* mca_write_pos - read POS register from card
|
||||
* @slot: slot number to read from
|
||||
* @reg: register to read from
|
||||
* @byte: byte to write to the POS registers
|
||||
*
|
||||
* Store a POS value directly from the hardware. You should not
|
||||
* normally need to use this function and should have a very good
|
||||
* knowledge of MCA bus before you do so. Doing this wrongly can
|
||||
* damage the hardware.
|
||||
*
|
||||
* This function may not be used from interrupt context.
|
||||
*
|
||||
* Note that this a technically a Bad Thing, as IBM tech stuff says
|
||||
* you should only set POS values through their utilities.
|
||||
* However, some devices such as the 3c523 recommend that you write
|
||||
* back some data to make sure the configuration is consistent.
|
||||
* I'd say that IBM is right, but I like my drivers to work.
|
||||
*
|
||||
* This function can't do checks to see if multiple devices end up
|
||||
* with the same resources, so you might see magic smoke if someone
|
||||
* screws up.
|
||||
*/
|
||||
|
||||
void mca_write_pos(int slot, int reg, unsigned char byte)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return;
|
||||
|
||||
mca_device_write_pos(mca_dev, reg, byte);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_write_pos);
|
||||
|
||||
/**
|
||||
* mca_set_adapter_name - Set the description of the card
|
||||
* @slot: slot to name
|
||||
* @name: text string for the namen
|
||||
*
|
||||
* This function sets the name reported via /proc for this
|
||||
* adapter slot. This is for user information only. Setting a
|
||||
* name deletes any previous name.
|
||||
*/
|
||||
|
||||
void mca_set_adapter_name(int slot, char* name)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return;
|
||||
|
||||
mca_device_set_name(mca_dev, name);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_set_adapter_name);
|
||||
|
||||
/**
|
||||
* mca_mark_as_used - claim an MCA device
|
||||
* @slot: slot to claim
|
||||
* FIXME: should we make this threadsafe
|
||||
*
|
||||
* Claim an MCA slot for a device driver. If the
|
||||
* slot is already taken the function returns 1,
|
||||
* if it is not taken it is claimed and 0 is
|
||||
* returned.
|
||||
*/
|
||||
|
||||
int mca_mark_as_used(int slot)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
/* FIXME: this is actually a severe error */
|
||||
return 1;
|
||||
|
||||
if(mca_device_claimed(mca_dev))
|
||||
return 1;
|
||||
|
||||
mca_device_set_claim(mca_dev, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_mark_as_used);
|
||||
|
||||
/**
|
||||
* mca_mark_as_unused - release an MCA device
|
||||
* @slot: slot to claim
|
||||
*
|
||||
* Release the slot for other drives to use.
|
||||
*/
|
||||
|
||||
void mca_mark_as_unused(int slot)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return;
|
||||
|
||||
mca_device_set_claim(mca_dev, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(mca_mark_as_unused);
|
||||
|
@ -1,249 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/*
|
||||
* MCA bus support functions for the proc fs.
|
||||
*
|
||||
* NOTE: this code *requires* the legacy MCA api.
|
||||
*
|
||||
* Legacy API means the API that operates in terms of MCA slot number
|
||||
*
|
||||
* (C) 2002 James Bottomley <James.Bottomley@HansenPartnership.com>
|
||||
*
|
||||
**-----------------------------------------------------------------------------
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation; either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
**
|
||||
**-----------------------------------------------------------------------------
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/mca.h>
|
||||
|
||||
static int get_mca_info_helper(struct mca_device *mca_dev, char *page, int len)
|
||||
{
|
||||
int j;
|
||||
|
||||
for(j=0; j<8; j++)
|
||||
len += sprintf(page+len, "%02x ",
|
||||
mca_dev ? mca_dev->pos[j] : 0xff);
|
||||
len += sprintf(page+len, " %s\n", mca_dev ? mca_dev->name : "");
|
||||
return len;
|
||||
}
|
||||
|
||||
static int get_mca_info(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
int i, len = 0;
|
||||
|
||||
if(MCA_bus) {
|
||||
struct mca_device *mca_dev;
|
||||
/* Format POS registers of eight MCA slots */
|
||||
|
||||
for(i=0; i<MCA_MAX_SLOT_NR; i++) {
|
||||
mca_dev = mca_find_device_by_slot(i);
|
||||
|
||||
len += sprintf(page+len, "Slot %d: ", i+1);
|
||||
len = get_mca_info_helper(mca_dev, page, len);
|
||||
}
|
||||
|
||||
/* Format POS registers of integrated video subsystem */
|
||||
|
||||
mca_dev = mca_find_device_by_slot(MCA_INTEGVIDEO);
|
||||
len += sprintf(page+len, "Video : ");
|
||||
len = get_mca_info_helper(mca_dev, page, len);
|
||||
|
||||
/* Format POS registers of integrated SCSI subsystem */
|
||||
|
||||
mca_dev = mca_find_device_by_slot(MCA_INTEGSCSI);
|
||||
len += sprintf(page+len, "SCSI : ");
|
||||
len = get_mca_info_helper(mca_dev, page, len);
|
||||
|
||||
/* Format POS registers of motherboard */
|
||||
|
||||
mca_dev = mca_find_device_by_slot(MCA_MOTHERBOARD);
|
||||
len += sprintf(page+len, "Planar: ");
|
||||
len = get_mca_info_helper(mca_dev, page, len);
|
||||
} else {
|
||||
/* Leave it empty if MCA not detected - this should *never*
|
||||
* happen!
|
||||
*/
|
||||
}
|
||||
|
||||
if (len <= off+count) *eof = 1;
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len>count) len = count;
|
||||
if (len<0) len = 0;
|
||||
return len;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
static int mca_default_procfn(char* buf, struct mca_device *mca_dev)
|
||||
{
|
||||
int len = 0, i;
|
||||
int slot = mca_dev->slot;
|
||||
|
||||
/* Print out the basic information */
|
||||
|
||||
if(slot < MCA_MAX_SLOT_NR) {
|
||||
len += sprintf(buf+len, "Slot: %d\n", slot+1);
|
||||
} else if(slot == MCA_INTEGSCSI) {
|
||||
len += sprintf(buf+len, "Integrated SCSI Adapter\n");
|
||||
} else if(slot == MCA_INTEGVIDEO) {
|
||||
len += sprintf(buf+len, "Integrated Video Adapter\n");
|
||||
} else if(slot == MCA_MOTHERBOARD) {
|
||||
len += sprintf(buf+len, "Motherboard\n");
|
||||
}
|
||||
if (mca_dev->name[0]) {
|
||||
|
||||
/* Drivers might register a name without /proc handler... */
|
||||
|
||||
len += sprintf(buf+len, "Adapter Name: %s\n",
|
||||
mca_dev->name);
|
||||
} else {
|
||||
len += sprintf(buf+len, "Adapter Name: Unknown\n");
|
||||
}
|
||||
len += sprintf(buf+len, "Id: %02x%02x\n",
|
||||
mca_dev->pos[1], mca_dev->pos[0]);
|
||||
len += sprintf(buf+len, "Enabled: %s\nPOS: ",
|
||||
mca_device_status(mca_dev) == MCA_ADAPTER_NORMAL ?
|
||||
"Yes" : "No");
|
||||
for(i=0; i<8; i++) {
|
||||
len += sprintf(buf+len, "%02x ", mca_dev->pos[i]);
|
||||
}
|
||||
len += sprintf(buf+len, "\nDriver Installed: %s",
|
||||
mca_device_claimed(mca_dev) ? "Yes" : "No");
|
||||
buf[len++] = '\n';
|
||||
buf[len] = 0;
|
||||
|
||||
return len;
|
||||
} /* mca_default_procfn() */
|
||||
|
||||
static int get_mca_machine_info(char* page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
len += sprintf(page+len, "Model Id: 0x%x\n", machine_id);
|
||||
len += sprintf(page+len, "Submodel Id: 0x%x\n", machine_submodel_id);
|
||||
len += sprintf(page+len, "BIOS Revision: 0x%x\n", BIOS_revision);
|
||||
|
||||
if (len <= off+count) *eof = 1;
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len>count) len = count;
|
||||
if (len<0) len = 0;
|
||||
return len;
|
||||
}
|
||||
|
||||
static int mca_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
struct mca_device *mca_dev = (struct mca_device *)data;
|
||||
int len = 0;
|
||||
|
||||
/* Get the standard info */
|
||||
|
||||
len = mca_default_procfn(page, mca_dev);
|
||||
|
||||
/* Do any device-specific processing, if there is any */
|
||||
|
||||
if(mca_dev->procfn) {
|
||||
len += mca_dev->procfn(page+len, mca_dev->slot,
|
||||
mca_dev->proc_dev);
|
||||
}
|
||||
if (len <= off+count) *eof = 1;
|
||||
*start = page + off;
|
||||
len -= off;
|
||||
if (len>count) len = count;
|
||||
if (len<0) len = 0;
|
||||
return len;
|
||||
} /* mca_read_proc() */
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
void __init mca_do_proc_init(void)
|
||||
{
|
||||
int i;
|
||||
struct proc_dir_entry *proc_mca;
|
||||
struct proc_dir_entry* node = NULL;
|
||||
struct mca_device *mca_dev;
|
||||
|
||||
proc_mca = proc_mkdir("mca", NULL);
|
||||
create_proc_read_entry("pos",0,proc_mca,get_mca_info,NULL);
|
||||
create_proc_read_entry("machine",0,proc_mca,get_mca_machine_info,NULL);
|
||||
|
||||
/* Initialize /proc/mca entries for existing adapters */
|
||||
|
||||
for(i = 0; i < MCA_NUMADAPTERS; i++) {
|
||||
enum MCA_AdapterStatus status;
|
||||
mca_dev = mca_find_device_by_slot(i);
|
||||
if(!mca_dev)
|
||||
continue;
|
||||
|
||||
mca_dev->procfn = NULL;
|
||||
|
||||
if(i < MCA_MAX_SLOT_NR) sprintf(mca_dev->procname,"slot%d", i+1);
|
||||
else if(i == MCA_INTEGVIDEO) sprintf(mca_dev->procname,"video");
|
||||
else if(i == MCA_INTEGSCSI) sprintf(mca_dev->procname,"scsi");
|
||||
else if(i == MCA_MOTHERBOARD) sprintf(mca_dev->procname,"planar");
|
||||
|
||||
status = mca_device_status(mca_dev);
|
||||
if (status != MCA_ADAPTER_NORMAL &&
|
||||
status != MCA_ADAPTER_DISABLED)
|
||||
continue;
|
||||
|
||||
node = create_proc_read_entry(mca_dev->procname, 0, proc_mca,
|
||||
mca_read_proc, (void *)mca_dev);
|
||||
|
||||
if(node == NULL) {
|
||||
printk("Failed to allocate memory for MCA proc-entries!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
} /* mca_do_proc_init() */
|
||||
|
||||
/**
|
||||
* mca_set_adapter_procfn - Set the /proc callback
|
||||
* @slot: slot to configure
|
||||
* @procfn: callback function to call for /proc
|
||||
* @dev: device information passed to the callback
|
||||
*
|
||||
* This sets up an information callback for /proc/mca/slot?. The
|
||||
* function is called with the buffer, slot, and device pointer (or
|
||||
* some equally informative context information, or nothing, if you
|
||||
* prefer), and is expected to put useful information into the
|
||||
* buffer. The adapter name, ID, and POS registers get printed
|
||||
* before this is called though, so don't do it again.
|
||||
*
|
||||
* This should be called with a %NULL @procfn when a module
|
||||
* unregisters, thus preventing kernel crashes and other such
|
||||
* nastiness.
|
||||
*/
|
||||
|
||||
void mca_set_adapter_procfn(int slot, MCA_ProcFn procfn, void* proc_dev)
|
||||
{
|
||||
struct mca_device *mca_dev = mca_find_device_by_slot(slot);
|
||||
|
||||
if(!mca_dev)
|
||||
return;
|
||||
|
||||
mca_dev->procfn = procfn;
|
||||
mca_dev->proc_dev = proc_dev;
|
||||
}
|
||||
EXPORT_SYMBOL(mca_set_adapter_procfn);
|
@ -283,7 +283,6 @@ static char *bus_strings[] = {
|
||||
"Local Bus",
|
||||
"ISA",
|
||||
"EISA",
|
||||
"MCA",
|
||||
"PCI",
|
||||
"PCMCIA",
|
||||
"NUBUS",
|
||||
@ -351,18 +350,6 @@ static int i2o_seq_show_hrt(struct seq_file *seq, void *v)
|
||||
EisaSlotNumber);
|
||||
break;
|
||||
|
||||
case I2O_BUS_MCA:
|
||||
seq_printf(seq, " IOBase: %0#6x,",
|
||||
hrt->hrt_entry[i].bus.mca_bus.
|
||||
McaBaseIOPort);
|
||||
seq_printf(seq, " MemoryBase: %0#10x,",
|
||||
hrt->hrt_entry[i].bus.mca_bus.
|
||||
McaBaseMemoryAddress);
|
||||
seq_printf(seq, " Slot: %0#4x,",
|
||||
hrt->hrt_entry[i].bus.mca_bus.
|
||||
McaSlotNumber);
|
||||
break;
|
||||
|
||||
case I2O_BUS_PCI:
|
||||
seq_printf(seq, " Bus: %0#4x",
|
||||
hrt->hrt_entry[i].bus.pci_bus.
|
||||
|
@ -808,19 +808,6 @@ config SCSI_FUTURE_DOMAIN
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called fdomain.
|
||||
|
||||
config SCSI_FD_MCS
|
||||
tristate "Future Domain MCS-600/700 SCSI support"
|
||||
depends on MCA_LEGACY && SCSI
|
||||
---help---
|
||||
This is support for Future Domain MCS 600/700 MCA SCSI adapters.
|
||||
Some PS/2 computers are equipped with IBM Fast SCSI Adapter/A which
|
||||
is identical to the MCS 700 and hence also supported by this driver.
|
||||
This driver also supports the Reply SB16/SCSI card (the SCSI part).
|
||||
It supports multiple adapters in the same system.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called fd_mcs.
|
||||
|
||||
config SCSI_GDTH
|
||||
tristate "Intel/ICP (former GDT SCSI Disk Array) RAID Controller support"
|
||||
depends on (ISA || EISA || PCI) && SCSI && ISA_DMA_API
|
||||
@ -890,76 +877,6 @@ config SCSI_GENERIC_NCR53C400
|
||||
not detect your card. See the file
|
||||
<file:Documentation/scsi/g_NCR5380.txt> for details.
|
||||
|
||||
config SCSI_IBMMCA
|
||||
tristate "IBMMCA SCSI support"
|
||||
depends on MCA && SCSI
|
||||
---help---
|
||||
This is support for the IBM SCSI adapter found in many of the PS/2
|
||||
series computers. These machines have an MCA bus, so you need to
|
||||
answer Y to "MCA support" as well and read
|
||||
<file:Documentation/mca.txt>.
|
||||
|
||||
If the adapter isn't found during boot (a common problem for models
|
||||
56, 57, 76, and 77) you'll need to use the 'ibmmcascsi=<pun>' kernel
|
||||
option, where <pun> is the id of the SCSI subsystem (usually 7, but
|
||||
if that doesn't work check your reference diskette). Owners of
|
||||
model 95 with a LED-matrix-display can in addition activate some
|
||||
activity info like under OS/2, but more informative, by setting
|
||||
'ibmmcascsi=display' as an additional kernel parameter. Try "man
|
||||
bootparam" or see the documentation of your boot loader about how to
|
||||
pass options to the kernel.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ibmmca.
|
||||
|
||||
config IBMMCA_SCSI_ORDER_STANDARD
|
||||
bool "Standard SCSI-order"
|
||||
depends on SCSI_IBMMCA
|
||||
---help---
|
||||
In the PC-world and in most modern SCSI-BIOS-setups, SCSI-hard disks
|
||||
are assigned to the drive letters, starting with the lowest SCSI-id
|
||||
(physical number -- pun) to be drive C:, as seen from DOS and
|
||||
similar operating systems. When looking into papers describing the
|
||||
ANSI-SCSI-standard, this assignment of drives appears to be wrong.
|
||||
The SCSI-standard follows a hardware-hierarchy which says that id 7
|
||||
has the highest priority and id 0 the lowest. Therefore, the host
|
||||
adapters are still today everywhere placed as SCSI-id 7 by default.
|
||||
In the SCSI-standard, the drive letters express the priority of the
|
||||
disk. C: should be the hard disk, or a partition on it, with the
|
||||
highest priority. This must therefore be the disk with the highest
|
||||
SCSI-id (e.g. 6) and not the one with the lowest! IBM-BIOS kept the
|
||||
original definition of the SCSI-standard as also industrial- and
|
||||
process-control-machines, like VME-CPUs running under realtime-OSes
|
||||
(e.g. LynxOS, OS9) do.
|
||||
|
||||
If you like to run Linux on your MCA-machine with the same
|
||||
assignment of hard disks as seen from e.g. DOS or OS/2 on your
|
||||
machine, which is in addition conformant to the SCSI-standard, you
|
||||
must say Y here. This is also necessary for MCA-Linux users who want
|
||||
to keep downward compatibility to older releases of the
|
||||
IBM-MCA-SCSI-driver (older than driver-release 2.00 and older than
|
||||
June 1997).
|
||||
|
||||
If you like to have the lowest SCSI-id assigned as drive C:, as
|
||||
modern SCSI-BIOSes do, which does not conform to the standard, but
|
||||
is widespread and common in the PC-world of today, you must say N
|
||||
here. If unsure, say Y.
|
||||
|
||||
config IBMMCA_SCSI_DEV_RESET
|
||||
bool "Reset SCSI-devices at boottime"
|
||||
depends on SCSI_IBMMCA
|
||||
---help---
|
||||
By default, SCSI-devices are reset when the machine is powered on.
|
||||
However, some devices exist, like special-control-devices,
|
||||
SCSI-CNC-machines, SCSI-printer or scanners of older type, that do
|
||||
not reset when switched on. If you say Y here, each device connected
|
||||
to your SCSI-bus will be issued a reset-command after it has been
|
||||
probed, while the kernel is booting. This may cause problems with
|
||||
more modern devices, like hard disks, which do not appreciate these
|
||||
reset commands, and can cause your system to hang. So say Y only if
|
||||
you know that one of your older devices needs it; N is the safe
|
||||
answer.
|
||||
|
||||
config SCSI_IPS
|
||||
tristate "IBM ServeRAID support"
|
||||
depends on PCI && SCSI
|
||||
|
@ -75,7 +75,6 @@ obj-$(CONFIG_SCSI_AIC94XX) += aic94xx/
|
||||
obj-$(CONFIG_SCSI_PM8001) += pm8001/
|
||||
obj-$(CONFIG_SCSI_ISCI) += isci/
|
||||
obj-$(CONFIG_SCSI_IPS) += ips.o
|
||||
obj-$(CONFIG_SCSI_FD_MCS) += fd_mcs.o
|
||||
obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o
|
||||
obj-$(CONFIG_SCSI_IN2000) += in2000.o
|
||||
obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o
|
||||
@ -100,7 +99,6 @@ obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/
|
||||
obj-$(CONFIG_SCSI_ZALON) += zalon7xx.o
|
||||
obj-$(CONFIG_SCSI_EATA_PIO) += eata_pio.o
|
||||
obj-$(CONFIG_SCSI_7000FASST) += wd7000.o
|
||||
obj-$(CONFIG_SCSI_IBMMCA) += ibmmca.o
|
||||
obj-$(CONFIG_SCSI_EATA) += eata.o
|
||||
obj-$(CONFIG_SCSI_DC395x) += dc395x.o
|
||||
obj-$(CONFIG_SCSI_DC390T) += tmscsim.o
|
||||
|
@ -22,7 +22,7 @@
|
||||
* Added module command-line options
|
||||
* 19-Jul-99
|
||||
* Modified by Adam Fritzler
|
||||
* Added proper detection of the AHA-1640 (MCA version of AHA-1540)
|
||||
* Added proper detection of the AHA-1640 (MCA, now deleted)
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -37,8 +37,6 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/isapnp.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/mca-legacy.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/dma.h>
|
||||
@ -71,7 +69,7 @@
|
||||
#define MAXBOARDS 4 /* Increase this and the sizes of the
|
||||
arrays below, if you need more.. */
|
||||
|
||||
/* Boards 3,4 slots are reserved for ISAPnP/MCA scans */
|
||||
/* Boards 3,4 slots are reserved for ISAPnP scans */
|
||||
|
||||
static unsigned int bases[MAXBOARDS] __initdata = {0x330, 0x334, 0, 0};
|
||||
|
||||
@ -1008,66 +1006,6 @@ static int __init aha1542_detect(struct scsi_host_template * tpnt)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Find MicroChannel cards (AHA1640)
|
||||
*/
|
||||
#ifdef CONFIG_MCA_LEGACY
|
||||
if(MCA_bus) {
|
||||
int slot = 0;
|
||||
int pos = 0;
|
||||
|
||||
for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
|
||||
|
||||
if (bases[indx])
|
||||
continue;
|
||||
|
||||
/* Detect only AHA-1640 cards -- MCA ID 0F1F */
|
||||
slot = mca_find_unused_adapter(0x0f1f, slot);
|
||||
if (slot == MCA_NOTFOUND)
|
||||
break;
|
||||
|
||||
/* Found one */
|
||||
pos = mca_read_stored_pos(slot, 3);
|
||||
|
||||
/* Decode address */
|
||||
if (pos & 0x80) {
|
||||
if (pos & 0x02) {
|
||||
if (pos & 0x01)
|
||||
bases[indx] = 0x334;
|
||||
else
|
||||
bases[indx] = 0x234;
|
||||
} else {
|
||||
if (pos & 0x01)
|
||||
bases[indx] = 0x134;
|
||||
}
|
||||
} else {
|
||||
if (pos & 0x02) {
|
||||
if (pos & 0x01)
|
||||
bases[indx] = 0x330;
|
||||
else
|
||||
bases[indx] = 0x230;
|
||||
} else {
|
||||
if (pos & 0x01)
|
||||
bases[indx] = 0x130;
|
||||
}
|
||||
}
|
||||
|
||||
/* No need to decode IRQ and Arb level -- those are
|
||||
* read off the card later.
|
||||
*/
|
||||
printk(KERN_INFO "Found an AHA-1640 in MCA slot %d, I/O 0x%04x\n", slot, bases[indx]);
|
||||
|
||||
mca_set_adapter_name(slot, "Adapter AHA-1640");
|
||||
mca_set_adapter_procfn(slot, NULL, NULL);
|
||||
mca_mark_as_used(slot);
|
||||
|
||||
/* Go on */
|
||||
slot++;
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Hunt for ISA Plug'n'Pray Adaptecs (AHA1535)
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* MCA card detection code by Trent McNair.
|
||||
* MCA card detection code by Trent McNair. (now deleted)
|
||||
* Fixes to not explicitly nul bss data from Xavier Bestel.
|
||||
* Some multiboard fixes from Rolf Eike Beer.
|
||||
* Auto probing of EISA config space from Trevor Hemsley.
|
||||
@ -32,7 +32,6 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/eisa.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
@ -43,7 +42,7 @@
|
||||
#include "53c700.h"
|
||||
|
||||
|
||||
/* Must be enough for both EISA and MCA */
|
||||
/* Must be enough for EISA */
|
||||
#define MAX_SLOTS 8
|
||||
static __u8 __initdata id_array[MAX_SLOTS] = { [0 ... MAX_SLOTS-1] = 7 };
|
||||
|
||||
@ -89,7 +88,7 @@ param_setup(char *str)
|
||||
__setup("sim710=", param_setup);
|
||||
|
||||
static struct scsi_host_template sim710_driver_template = {
|
||||
.name = "LSI (Symbios) 710 MCA/EISA",
|
||||
.name = "LSI (Symbios) 710 EISA",
|
||||
.proc_name = "sim710",
|
||||
.this_id = 7,
|
||||
.module = THIS_MODULE,
|
||||
@ -169,114 +168,6 @@ sim710_device_remove(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
|
||||
/* CARD ID 01BB and 01BA use the same pos values */
|
||||
#define MCA_01BB_IO_PORTS { 0x0000, 0x0000, 0x0800, 0x0C00, 0x1000, 0x1400, \
|
||||
0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, \
|
||||
0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, \
|
||||
0x4000, 0x4400, 0x4800, 0x4C00, 0x5000 }
|
||||
|
||||
#define MCA_01BB_IRQS { 3, 5, 11, 14 }
|
||||
|
||||
/* CARD ID 004f */
|
||||
#define MCA_004F_IO_PORTS { 0x0000, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600 }
|
||||
#define MCA_004F_IRQS { 5, 9, 14 }
|
||||
|
||||
static short sim710_mca_id_table[] = { 0x01bb, 0x01ba, 0x004f, 0};
|
||||
|
||||
static __init int
|
||||
sim710_mca_probe(struct device *dev)
|
||||
{
|
||||
struct mca_device *mca_dev = to_mca_device(dev);
|
||||
int slot = mca_dev->slot;
|
||||
int pos[3];
|
||||
unsigned int base;
|
||||
int irq_vector;
|
||||
short id = sim710_mca_id_table[mca_dev->index];
|
||||
static int io_004f_by_pos[] = MCA_004F_IO_PORTS;
|
||||
static int irq_004f_by_pos[] = MCA_004F_IRQS;
|
||||
static int io_01bb_by_pos[] = MCA_01BB_IO_PORTS;
|
||||
static int irq_01bb_by_pos[] = MCA_01BB_IRQS;
|
||||
char *name;
|
||||
int clock;
|
||||
|
||||
pos[0] = mca_device_read_stored_pos(mca_dev, 2);
|
||||
pos[1] = mca_device_read_stored_pos(mca_dev, 3);
|
||||
pos[2] = mca_device_read_stored_pos(mca_dev, 4);
|
||||
|
||||
/*
|
||||
* 01BB & 01BA port base by bits 7,6,5,4,3,2 in pos[2]
|
||||
*
|
||||
* 000000 <disabled> 001010 0x2800
|
||||
* 000001 <invalid> 001011 0x2C00
|
||||
* 000010 0x0800 001100 0x3000
|
||||
* 000011 0x0C00 001101 0x3400
|
||||
* 000100 0x1000 001110 0x3800
|
||||
* 000101 0x1400 001111 0x3C00
|
||||
* 000110 0x1800 010000 0x4000
|
||||
* 000111 0x1C00 010001 0x4400
|
||||
* 001000 0x2000 010010 0x4800
|
||||
* 001001 0x2400 010011 0x4C00
|
||||
* 010100 0x5000
|
||||
*
|
||||
* 00F4 port base by bits 3,2,1 in pos[0]
|
||||
*
|
||||
* 000 <disabled> 001 0x200
|
||||
* 010 0x300 011 0x400
|
||||
* 100 0x500 101 0x600
|
||||
*
|
||||
* 01BB & 01BA IRQ is specified in pos[0] bits 7 and 6:
|
||||
*
|
||||
* 00 3 10 11
|
||||
* 01 5 11 14
|
||||
*
|
||||
* 00F4 IRQ specified by bits 6,5,4 in pos[0]
|
||||
*
|
||||
* 100 5 101 9
|
||||
* 110 14
|
||||
*/
|
||||
|
||||
if (id == 0x01bb || id == 0x01ba) {
|
||||
base = io_01bb_by_pos[(pos[2] & 0xFC) >> 2];
|
||||
irq_vector =
|
||||
irq_01bb_by_pos[((pos[0] & 0xC0) >> 6)];
|
||||
|
||||
clock = 50;
|
||||
if (id == 0x01bb)
|
||||
name = "NCR 3360/3430 SCSI SubSystem";
|
||||
else
|
||||
name = "NCR Dual SIOP SCSI Host Adapter Board";
|
||||
} else if ( id == 0x004f ) {
|
||||
base = io_004f_by_pos[((pos[0] & 0x0E) >> 1)];
|
||||
irq_vector =
|
||||
irq_004f_by_pos[((pos[0] & 0x70) >> 4) - 4];
|
||||
clock = 50;
|
||||
name = "NCR 53c710 SCSI Host Adapter Board";
|
||||
} else {
|
||||
return -ENODEV;
|
||||
}
|
||||
mca_device_set_name(mca_dev, name);
|
||||
mca_device_set_claim(mca_dev, 1);
|
||||
base = mca_device_transform_ioport(mca_dev, base);
|
||||
irq_vector = mca_device_transform_irq(mca_dev, irq_vector);
|
||||
|
||||
return sim710_probe_common(dev, base, irq_vector, clock,
|
||||
0, id_array[slot]);
|
||||
}
|
||||
|
||||
static struct mca_driver sim710_mca_driver = {
|
||||
.id_table = sim710_mca_id_table,
|
||||
.driver = {
|
||||
.name = "sim710",
|
||||
.bus = &mca_bus_type,
|
||||
.probe = sim710_mca_probe,
|
||||
.remove = __devexit_p(sim710_device_remove),
|
||||
},
|
||||
};
|
||||
|
||||
#endif /* CONFIG_MCA */
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
static struct eisa_device_id sim710_eisa_ids[] = {
|
||||
{ "CPQ4410" },
|
||||
@ -344,10 +235,6 @@ static int __init sim710_init(void)
|
||||
param_setup(sim710);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
err = mca_register_driver(&sim710_mca_driver);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
err = eisa_driver_register(&sim710_eisa_driver);
|
||||
#endif
|
||||
@ -361,11 +248,6 @@ static int __init sim710_init(void)
|
||||
|
||||
static void __exit sim710_exit(void)
|
||||
{
|
||||
#ifdef CONFIG_MCA
|
||||
if (MCA_bus)
|
||||
mca_unregister_driver(&sim710_mca_driver);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
eisa_driver_unregister(&sim710_eisa_driver);
|
||||
#endif
|
||||
|
@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005 Russell King.
|
||||
* Data taken from include/asm-i386/serial.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/serial_8250.h>
|
||||
|
||||
/*
|
||||
* FIXME: Should we be doing AUTO_IRQ here?
|
||||
*/
|
||||
#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
|
||||
#define MCA_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_AUTO_IRQ
|
||||
#else
|
||||
#define MCA_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST
|
||||
#endif
|
||||
|
||||
#define PORT(_base,_irq) \
|
||||
{ \
|
||||
.iobase = _base, \
|
||||
.irq = _irq, \
|
||||
.uartclk = 1843200, \
|
||||
.iotype = UPIO_PORT, \
|
||||
.flags = MCA_FLAGS, \
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port mca_data[] = {
|
||||
PORT(0x3220, 3),
|
||||
PORT(0x3228, 3),
|
||||
PORT(0x4220, 3),
|
||||
PORT(0x4228, 3),
|
||||
PORT(0x5220, 3),
|
||||
PORT(0x5228, 3),
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device mca_device = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_MCA,
|
||||
.dev = {
|
||||
.platform_data = mca_data,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mca_init(void)
|
||||
{
|
||||
if (!MCA_bus)
|
||||
return -ENODEV;
|
||||
return platform_device_register(&mca_device);
|
||||
}
|
||||
|
||||
module_init(mca_init);
|
||||
|
||||
MODULE_AUTHOR("Russell King");
|
||||
MODULE_DESCRIPTION("8250 serial probe module for MCA ports");
|
||||
MODULE_LICENSE("GPL");
|
@ -241,15 +241,6 @@ config SERIAL_8250_RSA
|
||||
help
|
||||
::: To be written :::
|
||||
|
||||
config SERIAL_8250_MCA
|
||||
tristate "Support 8250-type ports on MCA buses"
|
||||
depends on SERIAL_8250 != n && MCA
|
||||
help
|
||||
Say Y here if you have a MCA serial ports.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called 8250_mca.
|
||||
|
||||
config SERIAL_8250_ACORN
|
||||
tristate "Acorn expansion card serial port support"
|
||||
depends on ARCH_ACORN && SERIAL_8250
|
||||
|
@ -15,7 +15,6 @@ obj-$(CONFIG_SERIAL_8250_ACCENT) += 8250_accent.o
|
||||
obj-$(CONFIG_SERIAL_8250_BOCA) += 8250_boca.o
|
||||
obj-$(CONFIG_SERIAL_8250_EXAR_ST16C554) += 8250_exar_st16c554.o
|
||||
obj-$(CONFIG_SERIAL_8250_HUB6) += 8250_hub6.o
|
||||
obj-$(CONFIG_SERIAL_8250_MCA) += 8250_mca.o
|
||||
obj-$(CONFIG_SERIAL_8250_FSL) += 8250_fsl.o
|
||||
obj-$(CONFIG_SERIAL_8250_DW) += 8250_dw.o
|
||||
obj-$(CONFIG_SERIAL_8250_EM) += 8250_em.o
|
||||
|
@ -124,7 +124,7 @@ typedef struct i2o_sg_io_hdr {
|
||||
#define I2O_BUS_LOCAL 0
|
||||
#define I2O_BUS_ISA 1
|
||||
#define I2O_BUS_EISA 2
|
||||
#define I2O_BUS_MCA 3
|
||||
/* was I2O_BUS_MCA 3 */
|
||||
#define I2O_BUS_PCI 4
|
||||
#define I2O_BUS_PCMCIA 5
|
||||
#define I2O_BUS_NUBUS 6
|
||||
|
@ -1,66 +0,0 @@
|
||||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/* This is the function prototypes for the old legacy MCA interface
|
||||
*
|
||||
* Please move your driver to the new sysfs based one instead */
|
||||
|
||||
#ifndef _LINUX_MCA_LEGACY_H
|
||||
#define _LINUX_MCA_LEGACY_H
|
||||
|
||||
#include <linux/mca.h>
|
||||
|
||||
#warning "MCA legacy - please move your driver to the new sysfs api"
|
||||
|
||||
/* MCA_NOTFOUND is an error condition. The other two indicate
|
||||
* motherboard POS registers contain the adapter. They might be
|
||||
* returned by the mca_find_adapter() function, and can be used as
|
||||
* arguments to mca_read_stored_pos(). I'm not going to allow direct
|
||||
* access to the motherboard registers until we run across an adapter
|
||||
* that requires it. We don't know enough about them to know if it's
|
||||
* safe.
|
||||
*
|
||||
* See Documentation/mca.txt or one of the existing drivers for
|
||||
* more information.
|
||||
*/
|
||||
#define MCA_NOTFOUND (-1)
|
||||
|
||||
|
||||
|
||||
/* Returns the slot of the first enabled adapter matching id. User can
|
||||
* specify a starting slot beyond zero, to deal with detecting multiple
|
||||
* devices. Returns MCA_NOTFOUND if id not found. Also checks the
|
||||
* integrated adapters.
|
||||
*/
|
||||
extern int mca_find_adapter(int id, int start);
|
||||
extern int mca_find_unused_adapter(int id, int start);
|
||||
|
||||
extern int mca_mark_as_used(int slot);
|
||||
extern void mca_mark_as_unused(int slot);
|
||||
|
||||
/* gets a byte out of POS register (stored in memory) */
|
||||
extern unsigned char mca_read_stored_pos(int slot, int reg);
|
||||
|
||||
/* This can be expanded later. Right now, it gives us a way of
|
||||
* getting meaningful information into the MCA_info structure,
|
||||
* so we can have a more interesting /proc/mca.
|
||||
*/
|
||||
extern void mca_set_adapter_name(int slot, char* name);
|
||||
|
||||
/* These routines actually mess with the hardware POS registers. They
|
||||
* temporarily disable the device (and interrupts), so make sure you know
|
||||
* what you're doing if you use them. Furthermore, writing to a POS may
|
||||
* result in two devices trying to share a resource, which in turn can
|
||||
* result in multiple devices sharing memory spaces, IRQs, or even trashing
|
||||
* hardware. YOU HAVE BEEN WARNED.
|
||||
*
|
||||
* You can only access slots with this. Motherboard registers are off
|
||||
* limits.
|
||||
*/
|
||||
|
||||
/* read a byte from the specified POS register. */
|
||||
extern unsigned char mca_read_pos(int slot, int reg);
|
||||
|
||||
/* write a byte to the specified POS register. */
|
||||
extern void mca_write_pos(int slot, int reg, unsigned char byte);
|
||||
|
||||
#endif
|
@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Header for Microchannel Architecture Bus
|
||||
* Written by Martin Kolinek, February 1996
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_MCA_H
|
||||
#define _LINUX_MCA_H
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
#include <asm/mca.h>
|
||||
|
||||
extern int MCA_bus;
|
||||
#else
|
||||
#define MCA_bus 0
|
||||
#endif
|
||||
|
||||
/* This sets up an information callback for /proc/mca/slot?. The
|
||||
* function is called with the buffer, slot, and device pointer (or
|
||||
* some equally informative context information, or nothing, if you
|
||||
* prefer), and is expected to put useful information into the
|
||||
* buffer. The adapter name, id, and POS registers get printed
|
||||
* before this is called though, so don't do it again.
|
||||
*
|
||||
* This should be called with a NULL procfn when a module
|
||||
* unregisters, thus preventing kernel crashes and other such
|
||||
* nastiness.
|
||||
*/
|
||||
typedef int (*MCA_ProcFn)(char* buf, int slot, void* dev);
|
||||
|
||||
/* Should only be called by the NMI interrupt handler, this will do some
|
||||
* fancy stuff to figure out what might have generated a NMI.
|
||||
*/
|
||||
extern void mca_handle_nmi(void);
|
||||
|
||||
enum MCA_AdapterStatus {
|
||||
MCA_ADAPTER_NORMAL = 0,
|
||||
MCA_ADAPTER_NONE = 1,
|
||||
MCA_ADAPTER_DISABLED = 2,
|
||||
MCA_ADAPTER_ERROR = 3
|
||||
};
|
||||
|
||||
struct mca_device {
|
||||
u64 dma_mask;
|
||||
int pos_id;
|
||||
int slot;
|
||||
|
||||
/* index into id_table, set by the bus match routine */
|
||||
int index;
|
||||
|
||||
/* is there a driver installed? 0 - No, 1 - Yes */
|
||||
int driver_loaded;
|
||||
/* POS registers */
|
||||
unsigned char pos[8];
|
||||
/* if a pseudo adapter of the motherboard, this is the motherboard
|
||||
* register value to use for setup cycles */
|
||||
short pos_register;
|
||||
|
||||
enum MCA_AdapterStatus status;
|
||||
#ifdef CONFIG_MCA_PROC_FS
|
||||
/* name of the proc/mca file */
|
||||
char procname[8];
|
||||
/* /proc info callback */
|
||||
MCA_ProcFn procfn;
|
||||
/* device/context info for proc callback */
|
||||
void *proc_dev;
|
||||
#endif
|
||||
struct device dev;
|
||||
char name[32];
|
||||
};
|
||||
#define to_mca_device(mdev) container_of(mdev, struct mca_device, dev)
|
||||
|
||||
struct mca_bus_accessor_functions {
|
||||
unsigned char (*mca_read_pos)(struct mca_device *, int reg);
|
||||
void (*mca_write_pos)(struct mca_device *, int reg,
|
||||
unsigned char byte);
|
||||
int (*mca_transform_irq)(struct mca_device *, int irq);
|
||||
int (*mca_transform_ioport)(struct mca_device *,
|
||||
int region);
|
||||
void * (*mca_transform_memory)(struct mca_device *,
|
||||
void *memory);
|
||||
};
|
||||
|
||||
struct mca_bus {
|
||||
u64 default_dma_mask;
|
||||
int number;
|
||||
struct mca_bus_accessor_functions f;
|
||||
struct device dev;
|
||||
char name[32];
|
||||
};
|
||||
#define to_mca_bus(mdev) container_of(mdev, struct mca_bus, dev)
|
||||
|
||||
struct mca_driver {
|
||||
const short *id_table;
|
||||
void *driver_data;
|
||||
int integrated_id;
|
||||
struct device_driver driver;
|
||||
};
|
||||
#define to_mca_driver(mdriver) container_of(mdriver, struct mca_driver, driver)
|
||||
|
||||
/* Ongoing supported API functions */
|
||||
extern struct mca_device *mca_find_device_by_slot(int slot);
|
||||
extern int mca_system_init(void);
|
||||
extern struct mca_bus *mca_attach_bus(int);
|
||||
|
||||
extern unsigned char mca_device_read_stored_pos(struct mca_device *mca_dev,
|
||||
int reg);
|
||||
extern unsigned char mca_device_read_pos(struct mca_device *mca_dev, int reg);
|
||||
extern void mca_device_write_pos(struct mca_device *mca_dev, int reg,
|
||||
unsigned char byte);
|
||||
extern int mca_device_transform_irq(struct mca_device *mca_dev, int irq);
|
||||
extern int mca_device_transform_ioport(struct mca_device *mca_dev, int port);
|
||||
extern void *mca_device_transform_memory(struct mca_device *mca_dev,
|
||||
void *mem);
|
||||
extern int mca_device_claimed(struct mca_device *mca_dev);
|
||||
extern void mca_device_set_claim(struct mca_device *mca_dev, int val);
|
||||
extern void mca_device_set_name(struct mca_device *mca_dev, const char *name);
|
||||
static inline char *mca_device_get_name(struct mca_device *mca_dev)
|
||||
{
|
||||
return mca_dev ? mca_dev->name : NULL;
|
||||
}
|
||||
|
||||
extern enum MCA_AdapterStatus mca_device_status(struct mca_device *mca_dev);
|
||||
|
||||
extern struct bus_type mca_bus_type;
|
||||
|
||||
extern int mca_register_driver(struct mca_driver *drv);
|
||||
extern int mca_register_driver_integrated(struct mca_driver *, int);
|
||||
extern void mca_unregister_driver(struct mca_driver *drv);
|
||||
|
||||
/* WARNING: only called by the boot time device setup */
|
||||
extern int mca_register_device(int bus, struct mca_device *mca_dev);
|
||||
|
||||
#ifdef CONFIG_MCA_PROC_FS
|
||||
extern void mca_do_proc_init(void);
|
||||
extern void mca_set_adapter_procfn(int slot, MCA_ProcFn, void* dev);
|
||||
#else
|
||||
static inline void mca_do_proc_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mca_set_adapter_procfn(int slot, MCA_ProcFn fn, void* dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_MCA_H */
|
@ -130,7 +130,6 @@ struct serial_uart_config {
|
||||
#define ASYNCB_CHECK_CD 25 /* i.e., CLOCAL */
|
||||
#define ASYNCB_SHARE_IRQ 24 /* for multifunction cards, no longer used */
|
||||
#define ASYNCB_CONS_FLOW 23 /* flow control for console */
|
||||
#define ASYNCB_BOOT_ONLYMCA 22 /* Probe only if MCA bus */
|
||||
#define ASYNCB_FIRST_KERNEL 22
|
||||
|
||||
#define ASYNC_HUP_NOTIFY (1U << ASYNCB_HUP_NOTIFY)
|
||||
@ -166,7 +165,6 @@ struct serial_uart_config {
|
||||
#define ASYNC_CHECK_CD (1U << ASYNCB_CHECK_CD)
|
||||
#define ASYNC_SHARE_IRQ (1U << ASYNCB_SHARE_IRQ)
|
||||
#define ASYNC_CONS_FLOW (1U << ASYNCB_CONS_FLOW)
|
||||
#define ASYNC_BOOT_ONLYMCA (1U << ASYNCB_BOOT_ONLYMCA)
|
||||
#define ASYNC_INTERNAL_FLAGS (~((1U << ASYNCB_FIRST_KERNEL) - 1))
|
||||
|
||||
/*
|
||||
|
@ -55,7 +55,6 @@ enum {
|
||||
PLAT8250_DEV_BOCA,
|
||||
PLAT8250_DEV_EXAR_ST16C554,
|
||||
PLAT8250_DEV_HUB6,
|
||||
PLAT8250_DEV_MCA,
|
||||
PLAT8250_DEV_AU1X00,
|
||||
PLAT8250_DEV_SM501,
|
||||
};
|
||||
|
@ -240,7 +240,7 @@ search_help[] = N_(
|
||||
"Defined at drivers/pci/Kconfig:47\n"
|
||||
"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
|
||||
"Location:\n"
|
||||
" -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
|
||||
" -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
|
||||
" -> PCI support (PCI [=y])\n"
|
||||
" -> PCI access mode (<choice> [=y])\n"
|
||||
"Selects: LIBCRC32\n"
|
||||
|
@ -223,7 +223,7 @@ search_help[] = N_(
|
||||
"Defined at drivers/pci/Kconfig:47\n"
|
||||
"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
|
||||
"Location:\n"
|
||||
" -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
|
||||
" -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
|
||||
" -> PCI support (PCI [ = y])\n"
|
||||
" -> PCI access mode (<choice> [ = y])\n"
|
||||
"Selects: LIBCRC32\n"
|
||||
|
Loading…
Reference in New Issue
Block a user