Commit 188db2b9 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://linux-voyager.bkbits.net/eisa-sysfs-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 91f5fe70 eb420b6f
...@@ -535,6 +535,7 @@ config VERBOSE_MCHECK ...@@ -535,6 +535,7 @@ config VERBOSE_MCHECK
bool "Verbose Machine Checks" bool "Verbose Machine Checks"
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/eisa/Kconfig"
config HOTPLUG config HOTPLUG
bool "Support for hot-pluggable devices" bool "Support for hot-pluggable devices"
......
...@@ -1181,6 +1181,8 @@ config EISA ...@@ -1181,6 +1181,8 @@ config EISA
Otherwise, say N. Otherwise, say N.
source "drivers/eisa/Kconfig"
config MCA config MCA
bool "MCA support" bool "MCA support"
depends on !(X86_VISWS || X86_VOYAGER) depends on !(X86_VISWS || X86_VOYAGER)
......
...@@ -44,3 +44,4 @@ obj-$(CONFIG_BT) += bluetooth/ ...@@ -44,3 +44,4 @@ obj-$(CONFIG_BT) += bluetooth/
obj-$(CONFIG_HOTPLUG_PCI) += hotplug/ obj-$(CONFIG_HOTPLUG_PCI) += hotplug/
obj-$(CONFIG_ISDN_BOOL) += isdn/ obj-$(CONFIG_ISDN_BOOL) += isdn/
obj-$(CONFIG_MCA) += mca/ obj-$(CONFIG_MCA) += mca/
obj-$(CONFIG_EISA) += eisa/
#
# PCI configuration
#
config EISA_NAMES
bool "EISA device name database"
depends on EISA
default y
---help---
By default, the kernel contains a database of all known EISA
device names to make the information in sysfs comprehensible
to the user. This database increases size of the kernel
image by about 40KB, but it gets freed after the system
boots up, so it doesn't take up kernel memory. Anyway, if
you are building an installation floppy or kernel for an
embedded system where kernel image size really matters, you
can disable this feature and you'll get device ID instead of
names.
When in doubt, say Y.
# Makefile for the Linux device tree
obj-$(CONFIG_EISA) += eisa-bus.o
export-objs := eisa-bus.o
clean-files:= devlist.h
# Ugly hack to get DEVICE_NAME_SIZE value...
DEVICE_NAME_SIZE:=$(shell awk '$$1=="\#define" && $$2=="DEVICE_NAME_SIZE" {print $$3-1}' $(srctree)/include/linux/device.h)
$(obj)/eisa-bus.o: $(obj)/devlist.h
$(obj)/devlist.h: $(src)/eisa.ids $(srctree)/include/linux/device.h
sed -e '/^#/D' -e 's/^\([[:alnum:]]\{7\}\) \+"\([^"]\{1,$(DEVICE_NAME_SIZE)\}\).*"/EISA_DEVINFO ("\1", "\2"),/' $< > $@
$(src)/eisa.ids:
touch $@
/*
* EISA bus support functions for sysfs.
*
* (C) 2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
*
* This code is released under the GPL version 2.
*/
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/eisa.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <asm/io.h>
#define EISA_DEVINFO(i,s) { .id = { .sig = i }, .name = s }
struct eisa_device_info {
struct eisa_device_id id;
char name[DEVICE_NAME_SIZE];
};
struct eisa_device_info __initdata eisa_table[] = {
#ifdef CONFIG_EISA_NAMES
#include "devlist.h"
#endif
};
#define EISA_INFOS (sizeof (eisa_table) / (sizeof (struct eisa_device_info)))
static void __init eisa_name_device (struct eisa_device *edev)
{
int i;
for (i = 0; i < EISA_INFOS; i++) {
if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) {
strncpy (edev->dev.name,
eisa_table[i].name,
DEVICE_NAME_SIZE - 1);
return;
}
}
/* No name was found */
sprintf (edev->dev.name, "EISA device %.7s", edev->id.sig);
}
static char __init *decode_eisa_sig(unsigned long addr)
{
static char sig_str[EISA_SIG_LEN];
u8 sig[4];
u16 rev;
int i;
sig[0] = inb (addr);
if (sig[0] & 0x80)
return NULL;
for (i = 1; i < 4; i++)
sig[i] = inb (addr + i);
sig_str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1);
sig_str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1);
sig_str[2] = (sig[1] & 0x1f) + ('A' - 1);
rev = (sig[2] << 8) | sig[3];
sprintf(sig_str + 3, "%04X", rev);
return sig_str;
}
static int eisa_bus_match (struct device *dev, struct device_driver *drv)
{
struct eisa_device *edev = to_eisa_device (dev);
struct eisa_driver *edrv = to_eisa_driver (drv);
const struct eisa_device_id *eids = edrv->id_table;
if (!eids)
return 0;
while (strlen (eids->sig)) {
if (!strcmp (eids->sig, edev->id.sig))
return 1;
eids++;
}
return 0;
}
struct bus_type eisa_bus_type = {
.name = "eisa",
.match = eisa_bus_match,
};
/* The default EISA device parent (virtual root device). */
static struct device eisa_bus_root = {
.name = "EISA Bridge",
.bus_id = "eisa",
};
int eisa_driver_register (struct eisa_driver *edrv)
{
int r;
edrv->driver.bus = &eisa_bus_type;
if ((r = driver_register (&edrv->driver)) < 0)
return r;
return 1;
}
void eisa_driver_unregister (struct eisa_driver *edrv)
{
driver_unregister (&edrv->driver);
}
static ssize_t eisa_show_sig (struct device *dev, char *buf)
{
struct eisa_device *edev = to_eisa_device (dev);
return sprintf (buf,"%s\n", edev->id.sig);
}
static DEVICE_ATTR(signature, S_IRUGO, eisa_show_sig, NULL);
static void __init eisa_register_device (char *sig, int slot)
{
struct eisa_device *edev;
if (!(edev = kmalloc (sizeof (*edev), GFP_KERNEL)))
return;
memset (edev, 0, sizeof (*edev));
memcpy (edev->id.sig, sig, 7);
edev->slot = slot;
edev->base_addr = 0x1000 * slot;
eisa_name_device (edev);
edev->dev.parent = &eisa_bus_root;
edev->dev.bus = &eisa_bus_type;
sprintf (edev->dev.bus_id, "00:%02X", slot);
/* Don't register resource for slot 0, since this will surely
* fail... :-( */
if (slot) {
edev->res.name = edev->dev.name;
edev->res.start = edev->base_addr;
edev->res.end = edev->res.start + 0xfff;
edev->res.flags = IORESOURCE_IO;
if (request_resource (&ioport_resource, &edev->res)) {
printk (KERN_WARNING \
"Cannot allocate resource for EISA slot %d\n",
slot);
kfree (edev);
return;
}
}
if (device_register (&edev->dev)) {
kfree (edev);
return;
}
device_create_file (&edev->dev, &dev_attr_signature);
}
static int __init eisa_probe (void)
{
int i, c;
char *str;
unsigned long slot_addr;
printk (KERN_INFO "EISA: Probing bus...\n");
for (c = 0, i = 0; i <= EISA_MAX_SLOTS; i++) {
slot_addr = (0x1000 * i) + EISA_VENDOR_ID_OFFSET;
if ((str = decode_eisa_sig (slot_addr))) {
if (!i)
printk (KERN_INFO "EISA: Motherboard %s detected\n",
str);
else {
printk (KERN_INFO "EISA: slot %d : %s detected.\n",
i, str);
c++;
}
eisa_register_device (str, i);
}
}
printk (KERN_INFO "EISA: Detected %d card%s.\n", c, c < 2 ? "" : "s");
return 0;
}
static int __init eisa_init (void)
{
int r;
if ((r = bus_register (&eisa_bus_type)))
return r;
if ((r = device_register (&eisa_bus_root))) {
bus_unregister (&eisa_bus_type);
return r;
}
printk (KERN_INFO "EISA bus registered\n");
return eisa_probe ();
}
postcore_initcall (eisa_init);
EXPORT_SYMBOL (eisa_bus_type);
EXPORT_SYMBOL (eisa_driver_register);
EXPORT_SYMBOL (eisa_driver_unregister);
# This list is a compilation of EISA ids.
# It also includes numerous ISA cards for which an EISA id
# has been allocated.
#
# Please send any patch/addition/correction to
# Marc Zyngier <maz@wild-wind.fr.eu.org>
#
# Many entries were contributed by Andries.Brouwer@cwi.nl
ABP0510 "Advansys ABP-510 ISA SCSI Host Adapter"
ABP0540 "Advansys ABP-540/542 ISA SCSI Host Adapter"
ABP7401 "AdvanSys ABP-740/742 EISA Single Channel SCSI Host Adapter"
ABP7501 "AdvanSys ABP-750/752 EISA Dual Channel SCSI Host Adapter"
ACC1200 "ACCTON EtherCombo-32 Ethernet Adapter"
ACC120A "ACCTON EtherCombo-32 Ethernet Adapter"
ACC1650 "Accton MPX Ethernet Adapter (EN165x)"
ACC1660 "Accton MPX Ethernet Adapter (EN166x)"
ACE1010 "ACME Super Fast System Board"
ACE2010 "ACME PC Network"
ACE3010 "ACME Arcnet Plan"
ACE3030 "ACME Sample VS Board 1"
ACE4010 "ACME Tape Controller"
ACE5010 "ACME VDU Video Board"
ACE6010 "ACME Disk Controller"
ACE7010 "ACME Multi-Function Board"
ACR1201 "Acer 1200 486/25 EISA System Board"
ACR1211 "AcerFrame 3000SP33 486/33 EISA System Board"
ACR1341 "M1 486SX/20 CPU Board"
ACR1351 "M1 486SX/20 CPU Board"
ACR1361 "M1 487/20 CPU Board"
ACR1371 "M1 487/20 CPU Board"
ACR1381 "M1 486/20 CPU Board"
ACR1391 "M1 486/20 CPU Board"
ACR1581 "M1 486/33 CPU Board"
ACR1591 "M1 486/33 CPU Board"
ACR15A1 "M1 486/33 CPU Board"
ACR15B1 "M1 486/33 CPU Board"
ACR1701 "AcerFrame 1000"
ACR1711 "AcerFrame 1000 486/33 SYSTEM-2"
ACR1801 "Acer P43WE EISA System Board"
ACR3211 "AcerFrame 3000MP 486 SYSTEM-1"
ACR3221 "AcerFrame 486 Series SYSTEM-2"
ACR3231 "AcerFrame 486 Series SYSTEM-3"
ACR3241 "AcerFrame 486 Series SYSTEM-4"
ACR3261 "AcerFrame 3000MP 486 SYSTEM-1"
ACR3271 "AcerFrame 486 Series SYSTEM-2"
ACR3281 "AcerFrame 486 Series SYSTEM-3"
ACR3291 "AcerFrame 486 Series SYSTEM-4"
ACR4509 "ACER/Altos M1 System Board"
ADI0001 "Lightning Networks 32-Bit EISA Ethernet LAN Adapter"
ADP0000 "Adaptec AHA-1740 SCSI"
ADP0001 "Adaptec AHA-1740A SCSI"
ADP0002 "Adaptec AHA-1742A SCSI"
ADP0100 "Adaptec AHA-1540/1542 ISA SCSI Host Adapter"
AIM0002 "AUVA OPTi/EISA 32-Bit 486 All-in-One System Board"
ADP0200 "Adaptec AHA-1520/1522 ISA SCSI Host Adapter"
ADP0400 "Adaptec AHA-1744 SCSI"
ADP7756 "Adaptec AHA-284x SCSI (BIOS enabled)"
ADP7757 "Adaptec AHA-284x SCSI (BIOS disabled)"
ADP7770 "Adaptec AIC-7770 SCSI (on motherboard)"
ADP7771 "Adaptec AHA-274x SCSI"
AEI0401 "486EI EISA System Board"
AEO0301 "486EO EISA System Board"
AIR0101 "AIR486SE/25/33 EISA Baby AT-foot print motherboard."
AIR0103 "AIR486SE/25/33/50"
AIR0201 "AIR486LE/25/33/50"
AIR0301 "AIR 486EO EISA System Board"
AIR0401 "486EI EISA System Board"
AIR0501 "AIR 586EP PCI/EISA System Board"
AIR0601 "AIR 54CEP PCI/EISA System Board"
AIR0701 "AIR 54CDP PCI/EISA System Board"
AIR0702 "AIR 54CDP PCI/EISA Dual-Processors System Board"
AIR0901 "AIR 54TDP PCI/EISA Dual-Processors System Board"
AIR1001 "AIR P6NDP PCI/EISA Dual-Pentium Processor System Board"
AIR2001 "AIR SCSI-2E"
AIR2101 "AIR SCSI-2V"
AIR3001 "ENET2E EISA BUS MASTER ETHERNET ADAPTER"
AIR3101 "ENET-2V LOCAL BUS MASTER ETHERNET ADAPTER"
ALR0001 "Power/Business VEISA System Board"
ALR0041 "PowerPro System Board"
ALR0181 "PowerPro System Board"
ALR0241 "Evolution V Pentium Tower System Board"
ALR0341 "EISA PCI base System Board"
ALR3000 "80486 Processor Module"
ALR3010 "Pentium Processor Board"
ALR3023 "ALR 16-bit VGA without Parallel port"
ALR8580 "Advanced Disk Array Caching EISA Controller"
ALRA0C1 "System Board"
ALRA301 "Revolution Q-SMP System Board"
ALRA311 "Revolution Q-2SMP System Board"
ALRB0A0 "Primary System Processor Board - 80486DX2/66"
ALRB0B0 "Secondary System Processor Board - 80486DX2/66"
AMI44C1 "AMI SCSI Host Adapter - Series 44"
AMI15C1 "AMI SCSI Host Adapter"
AMI15D1 "AMI SCSI Host Adapter - Rev 2"
AMI15E1 "AMI Normal Single Ended EISA SCSI CACHING Controller-Ver 1.22"
AMI16B1 "AMI ENTERPRISE EISA system board"
AMI2509 "AMI ENTERPRISE EISA system board"
AMI25B1 "AMI ENTERPRISE EISA system board"
AMI28A1 "AMI EZ-FLEX EISA System Board"
AMI44D2 "AMI Fast Single Ended EISA SCSI CACHING Controller"
AMI4801 "AMI Series 48 EISA Fast SCSI Host Adapter"
AMI68B1 "AMI Enterprise III 486 EISA System Board"
APS0101 "EISA PIP INTERFACE"
APS0102 "EISA PIP INTERFACE"
APS0103 "EISA PIP INTERFACE"
ARC0010 "Alta EtherTPI/Combo"
ARC0020 "Alta TokenCombo-16 S/U"
ASU0100 "ASUS EISA-SC100 SCSI Cache Host Adapter (CFG file V2.0)"
ASU0500 "ASUS EISA-L500 Ethernet LAN ADAPTER"
ASU4001 "EISA-486C Main Board"
ASU4101 "EISA-486E Main Board"
ASU4201 "EISA-486A Main Board"
ASU4301 "EISA-486SI Main Board"
ASU4501 "Mini EISA-486H Main Board"
ASU4701 "Mini EISA-486AS Main Board"
ASU4901 "VL/EISA-486SV1 Main Board"
ASU5101 "PCI/E-P5MP4 or PCI/E-P54NP4 Main Board V2.3"
ASU5201 "P/E-P55T2P4D Main Board (CFG File V1.2)"
ATI1500 "ATI AT-1500 Ethernet Adapter Card"
ATI1700 "ATI AT-1700 Ethernet Adapter Card"
ATI4400 "mach32 EISA Video Accelerator Card"
ATI4402 "mach32 EISA Video Accelerator Card"
ATI4410 "mach32 Video Accelerator Card"
ATI4420 "mach32 Video Accelerator Card"
ATI4430 "mach32 VLB Video Accelerator Card"
ATT2402 "AT&T SCSI Host Adapter A (StarServer E)"
ATT2404 "DPT SCSI Host Bus Adapter (PM2012B/9X)"
AVI2E01 "AVIEW2E EISA SVGA Adapter"
AVM0001 "AVM ISDN-Controller A1"
BAN0440 "Banyan ICA"
BAN0670 "Banyan ICAplus"
BAN0680 "Banyan ICA/RM"
BUS4201 "BusTek/BusLogic Bt74xB 32-Bit Bus Master EISA-to-SCSI Host Adapter"
BUS4202 "BusTek/BusLogic Bt74xC 32-Bit Bus Master EISA-to-SCSI Host Adapter"
BUS6001 "BusTek/BusLogic Bt760 32-Bit Bus Master EISA-to-Ethernet Controller"
BUS6301 "BusTek/BusLogic Bt763E EISA 32-Bit 82596-based Ethernet Controller"
CCI0000 "Cache Computers, Inc. Memory Refresh Controller"
CCI1001 "Cache Computers Inc. 486/25 EISA System Board"
CCI2001 "Cache Computers Inc. 486/33 EISA System Board"
CCI3001 "Cache Computers, Inc. Modular EISA System Board"
CCI3009 "Cache Computers Inc. Modular EISA System Board"
CCI4000 "Cache Computers, Inc. 486/33 CPU Board"
CCI4001 "Cache Computers, Inc. 486/33 CPU Board"
CCI5001 "Cache Computers, Inc. 486/50 CPU Board"
CCI6001 "Cache Computer EISA Ethernet LAN Adapter"
CCI7001 "Cache Computers, Inc. EISA System Board"
CCI8001 "Cache Computers, Inc. EISA System Board"
CHAA041 "Chase AT4 Intelligent Serial Controller"
CHAA081 "Chase AT8 Intelligent Serial Controller"
CHAA091 "Chase AT8+ Intelligent Serial Controller"
CHAA161 "Chase AT16 Intelligent Serial Controller"
CHAA171 "Chase AT16+ Intelligent Serial Controller"
CMD0003 "CMD Technology, Inc. EISA SCSI Host Adapter"
CNT2000 "900E/950E EISA Bus 32-bit Ethernet LAN Adapter"
COG5000 "Cogent eMASTER+ AT Combo 16-Bit Workstation Ethernet Adapter"
COG7002 "Cogent eMASTER+ ATS Combo Bus-Mastering Ethernet Adapter"
COG9002 "Cogent eMASTER+ EISA XL 32-Bit Burst-mode Ethernet Adapter"
CPQ0101 "Compaq SYSTEMPRO System Board"
CPQ0109 "Compaq SYSTEMPRO System Board (ASSY # 001981)"
CPQ0401 "Compaq DESKPRO 486/33L or 386/33L System Board"
CPQ0501 "Compaq DESKPRO/M System Board"
CPQ0509 "Compaq DESKPRO/M System Board with Audio"
CPQ0511 "Compaq SYSTEMPRO/LT System Board"
CPQ0601 "Compaq ProSignia Server"
CPQ0609 "Compaq ProSignia Server"
CPQ0611 "Compaq ProSignia Server"
CPQ0621 "Compaq ProSignia Server (ASSY # 3154)"
CPQ0629 "Compaq ProSignia Server (ASSY # 3154)"
CPQ0631 "Compaq ProLiant 1000 Server"
CPQ0639 "Compaq ProLiant 1000 Server"
CPQ1001 "Compaq Portable 486"
CPQ1009 "Compaq Portable 486/66"
CPQ1201 "Compaq DESKPRO 486/25"
CPQ1301 "Compaq DESKPRO 486/50L"
CPQ1401 "Compaq Portable 486c"
CPQ1409 "Compaq Portable 486c/66"
CPQ1501 "Compaq SYSTEMPRO/XL Server"
CPQ1509 "Compaq ProLiant 4000 Server"
CPQ1519 "Compaq ProLiant 2000 Server"
CPQ3001 "Compaq Advanced VGA"
CPQ3011 "Compaq QVision 1024/E Video Controller"
CPQ3021 "Compaq QVision 1024/I Video Controller"
CPQ3111 "Compaq QVision 1024/E Graphics Controller"
CPQ3112 "Compaq QVision 1280/E Graphics Controller"
CPQ3121 "Compaq QVision 1024/I Graphics Controller"
CPQ3122 "Compaq QVision 1280/I Graphics Controller"
CPQ4001 "Compaq 32-Bit Intelligent Drive Array Controller"
CPQ4002 "Compaq Intelligent Drive Array Controller-2"
CPQ4010 "Compaq 32-Bit Intelligent Drive Array Expansion Controller"
CPQ4020 "Compaq SMART Array Controller"
CPQ4300 "Compaq Advanced ESDI Fixed Disk Controller"
CPQ4401 "Compaq Integrated SCSI-2 Options Port"
CPQ4410 "Compaq Integrated 32-Bit Fast-SCSI-2 Controller"
CPQ4411 "Compaq 32-Bit Fast-SCSI-2 Controller"
CPQ4420 "Compaq 6260 SCSI-2 Controller"
CPQ5000 "Compaq 386/33 System Processor Board used as Secondary"
CPQ5281 "Compaq 486/50 System Processor Board used as Secondary"
CPQ5282 "Compaq 486/50 System Processor Board used as Secondary"
CPQ5287 "Compaq 5/66 System Processor Board used as Secondary"
CPQ528F "Compaq 486DX2/66 System Processor Board used as Secondary"
CPQ5900 "Compaq 486/33 System Processor Board used as Secondary"
CPQ5A00 "Compaq 486/33 System Processor Board (ASSY # 002013) used as Secondary"
CPQ5B00 "Compaq 486DX2/66 System Processor Board used as Secondary"
CPQ5C00 "Compaq 486/33 System Processor Board used as Secondary"
CPQ6000 "Compaq 32-Bit DualSpeed Token Ring Controller"
CPQ6001 "Compaq 32-Bit DualSpeed Token Ring Controller"
CPQ6100 "Compaq 32-Bit NetFlex Controller"
CPQ6101 "Compaq NetFlex-2 Controller"
CPQ6200 "Compaq DualPort Ethernet Controller"
CPQ7000 "Compaq 32-Bit Server Manager/R Board"
CPQ7001 "Compaq 32-Bit Server Manager/R Board"
CPQ9004 "Compaq 386/33 Processor Board"
CPQ9005 "Compaq 386/25 Processor Board"
CPQ9013 "Compaq 486DX2/66 System Processor Board used as Primary"
CPQ9014 "Compaq 486/33 System Processor Board used as Primary"
CPQ9015 "Compaq 486/33 Processor Board"
CPQ9016 "Compaq 486DX2/66 Processor Board"
CPQ9017 "Compaq 486DX2/50 Processor Board"
CPQ9018 "Compaq 486/33 Processor Board (8 MB)"
CPQ9034 "Compaq 486SX/25 Processor Board"
CPQ9035 "Compaq 486SX/16 Processor Board"
CPQ9036 "Compaq 486SX/25 Processor Board (8 MB)"
CPQ9037 "Compaq 486SX/16 Processor Board (8 MB)"
CPQ9038 "Compaq 486SX/33 Processor Board (8 MB)"
CPQ903C "Compaq 486SX/33 Processor Board (4 MB)"
CPQ9040 "Compaq 5/66 Processor Board"
CPQ9041 "Compaq 5/66 Processor Board"
CPQ9042 "Compaq 5/66 Processor Board"
CPQ9043 "Compaq 5/66 Processor Board"
CPQ9044 "Compaq 5/60 Processor Board"
CPQ9045 "Compaq 5/60 Processor Board"
CPQ9046 "Compaq 5/60 Processor Board"
CPQ9047 "Compaq 5/60 Processor Board"
CPQ9281 "Compaq 486/50 System Processor Board used as Primary"
CPQ9282 "Compaq 486/50 System Processor Board used as Primary"
CPQ9287 "Compaq 5/66 System Processor Board used as Primary"
CPQ928F "Compaq 486DX2/66 System Processor Board used as Primary"
CPQ9381 "Compaq 486/50 System Processor Board"
CPQ9382 "Compaq 486/50 System Processor Board"
CPQ9387 "Compaq 5/66 System Processor Board"
CPQ9481 "Compaq 486/50 System Processor Board"
CPQ9482 "Compaq 486/50 System Processor Board"
CPQ9487 "Compaq 5/66 System Processor Board"
CPQ9901 "Compaq 486SX/16 Processor Board"
CPQ9902 "Compaq 486SX/16 Processor Board"
CPQ9903 "Compaq 486SX/25 Processor Board"
CPQ9904 "Compaq 486SX/25 Processor Board"
CPQ9905 "Compaq 486SX/25 Processor Board"
CPQ9906 "Compaq 486/33 Processor Board"
CPQ9907 "Compaq 486DX2/66 Processor Board"
CPQ9908 "Compaq 486SX/16 Processor Board"
CPQ9909 "Compaq 486SX/16 Processor Board"
CPQ990A "Compaq 486SX/25 Processor Board"
CPQ990B "Compaq 486SX/25 Processor Board"
CPQ990C "Compaq 486SX/25 Processor Board"
CPQ990D "Compaq 486/33 Processor Board"
CPQ990E "Compaq 486SX/33 Processor Board (8 MB)"
CPQ990F "Compaq 486SX/33 Processor Board (8 MB)"
CPQ9990 "Compaq 386/33 System Processor Board used as Primary"
CPQ9991 "Compaq 386/33 Desktop Processor Board"
CPQ9999 "Compaq 486/33 System Processor Board used as Primary"
CPQ999A "Compaq 486/33 Desktop Processor Board"
CPQA000 "Compaq Enhanced Option Slot Serial Board"
CPQA010 "Compaq Enhanced Option Slot Modem Board"
CPQA020 "Compaq Integrated CD Rom Adapter"
CPQA030 "Compaq Integrated CD Rom Adapter"
CPQF000 "Compaq Fixed Disk Drive Feature"
CPQF100 "Compaq Ethernet 16TP Controller"
CPQFA0D "Compaq SYSTEMPRO 4-Socket System Memory Board"
CPQFA0E "Compaq SYSTEMPRO 6-Socket System Memory Board"
CPQFA0F "Compaq DESKPRO 486/25 System Memory Board"
CPQFA1A "Compaq DESKPRO 3-Socket System Memory Board"
CPQFA1B "Compaq DESKPRO 486/50 System Memory Board"
CPQFA1C "Compaq System Memory Expansion Board"
CPQFA1D "Compaq SYSTEMPRO/XL Memory Expansion Board"
CPQFB03 "Compaq Async/Parallel Printer Intf Assy 000990"
CPQFB07 "Compaq DESKPRO 2400 Baud Modem"
CPQFC0B "Compaq Advanced Graphics 1024 Board"
CPQFD08 "Compaq 135Mb, 150/250Mb Tape Adapter"
CPQFD13 "Compaq 15MHz ESDI Fixed Disk Controller 001283"
CPQFD17 "Compaq SCSI Tape Adapter"
CPX0301 "Universal 10/100VG Selectable EISA LAN Adapter"
CRS3203 "Crescendo 320 FDDI/CDDI EISA Adapter"
CRS3204 "Cisco CDDI/FDDI EISA Adapter"
CSI0690 "CSI F70X9 EISA FDDI DNI adapter card"
CUI0000 "CUI Examples -- Virtual Board"
DBI0101 "Digi C/X Host Adapter - EISA"
DBI0102 "Digi C/X Host Adapter - EISA"
DBI0201 "Digi EISA/Xem Host Adapter"
DBI0301 "Digi EPC/X Host Adapter - EISA"
DBI0501 "Digi Ports/Xem Host Adapter - ISA"
DBI0601 "Digi EPC/X Host Adapter - ISA"
DBI0701 "Digi C/X Host Adapter - ISA"
DBI0801 "Digi PC/Xr - ISA"
DBI0901 "Digi PC/Xt - ISA"
DBI0C01 "Digi DataFire - ISA"
DBI0D01 "Digi DataFire/4 - ISA"
DBI0E01 "Digi PC IMAC - ISA"
DBI0F01 "Digi PC IMAC/4 - ISA"
DBI1001 "Digi PC/Xe - ISA"
DBI1101 "Digi ES/4 Host Adapter - EISA"
DBI1201 "Digi Acceleport Xr 920 - ISA"
DEC1011 "Digital EISA Video Controller (EVC-1)"
DEC1021 "Digital EISA SCSI Controller (ESC-1)"
DEC1031 "DECpc MTE Series System Board"
DEC2030 "Digital Ethernet Controller (DE203)"
DEC2040 "Digital Ethernet Controller (DE204)"
DEC2050 "Digital Ethernet Controller (DE205)"
DEC2400 "DECpc AXP/150 System Board"
DEC2500 "DEC EISA NVRAM for Alpha AXP"
DEC2A01 "Digital AlphaServer 2100 Family System Board"
DEC2E00 "Digital KFESA DSSI EISA Host Adapter"
DEC2F00 "Digital WANcontroller/EISA (DNSES)"
DEC3001 "DEC FDDIcontroller/EISA Adapter"
DEC3002 "DEC FDDIcontroller/EISA Adapter"
DEC3003 "DEC FDDIcontroller/EISA Adapter"
DEC3004 "DEC FDDI Controller"
DEC4220 "Digital EISA Ethernet Controller (DE422-SA)"
DEC4250 "Digital EtherWORKS Turbo EISA (DE425-AA)"
DEC5000 "Digital AlphaServer 1000, 1000A and AlphaStation 600A System Board"
DEC5100 "Digital AlphaStation 600 Family System Board"
DEC5301 "Digital 800 AlphaServer Family System Board"
DEC6000 "Digital AlphaServer 8200 and 8400 Family System Board"
DEC6400 "Digital AlphaServer 4100 System Board"
DEC8101 "DEC VGA 1024 Graphics Adapter"
DEC8102 "DEC 8514/A-Compatible Graphics Adapter"
DEC8103 "DECpc VGA 1024 NI Graphics Adapter"
DEC8300 "DEC DEPCA LC Ethernet Controller"
DEC8301 "DEC DEPCA TURBO Ethernet Controller"
DEL0000 "Generic ISA Board"
DEL0001 "Dell System(R) 425E(TM) System Board"
DEL0002 "Dell System(R) 433E(TM) System Board"
DEL0003 "Dell System(R) 425TE(TM) System Board"
DEL0004 "Dell System(R) 433TE(TM) System Board"
DEL0005 "Dell Powerline(TM) Workstation 433DE(TM) System Board"
DEL0006 "Dell Powerline(TM) Workstation 420DE(TM) System Board"
DEL0007 "Dell Powerline(TM) Workstation 450DE(TM) System Board"
DEL0008 "Dell Powerline(TM) Server 433SE(TM) System Board"
DEL0009 "Dell Powerline(TM) Server 420SE(TM) System Board"
DEL000A "Dell Powerline(TM) Server 450SE(TM) System Board"
DEL000B "Dell PowerLine(TM) Workstation 425DE(TM) System Board"
DEL000C "Dell PowerLine(TM) Server 425SE(TM) System Board"
DEL0011 "Dell Powerline(TM) Server 450SE/2(TM) System Board"
DEL0019 "Dell Powerline(TM) Server 466SE(TM) System Board"
DEL0021 "Dell Powerline(TM) Workstation 450DE/2(TM) System Board"
DEL0029 "Dell Powerline(TM) Workstation 466DE(TM) System Board"
DEL002A "Dell Powerline(TM) Workstation P60/DE(TM) System Board"
DEL002B "Dell Powerline(TM) Workstation P66/DE(TM) System Board"
DEL002C "Dell Powerline(TM) Workstation P60/SE(TM) System Board"
DEL002D "Dell Powerline(TM) Workstation P66/SE(TM) System Board"
DEL0031 "Dell 486/ME System Board"
DEL0036 "Dell 406x/XE System Board"
DEL0038 "Dell 456x/XE System Board"
DEL0054 "Dell System PowerEdge 2100"
DEL0058 "Dell System PowerEdge 4100"
DEL005A "Dell System PowerEdge 2200"
DEL005C "Dell System PowerEdge 4200"
DEL2100 "Dell Remote Server Assistant Card"
DEL4001 "Dell Drive Array"
DEL4002 "Dell SCSI Array Controller"
DEL6001 "Dell DGX Video Subsystem"
DELFC00 "Dell GPX-1024 Graphics Performance Accelerator"
DELFC01 "Dell VGA Professional 16-bit"
DELFC02 "Paradise Hi-Res Graphics Adapter"
DELFC03 "Paradise Hi-Res Graphics Card"
DELFD00 "UltraStor 12F/12F-24 ESDI/Diskette Cntrl"
DELFD02 "Archive XL Tape Host Adapter"
DELFD03 "Wangtek Tape Host Adapter"
DELFD05 "Adaptec AHA-1510 ISA SCSI Host Adapter"
DIS0000 "NETSERVER LH PRO - DISABLE SCSI B - FOR TEST & EVALUATION ONLY"
DPT2402 "DPT SCSI Host Bus Adapter (PM2012A/9X)"
DPT2403 "DPT SCSI Host Bus Adapter (PM2012A/90)"
DPTA401 "DPT SCSI Host Bus Adapter (PM2012B/9X)"
DPTA402 "DPT SCSI Host Bus Adapter (PM2012B2/9X) - Banyan Vines"
DPTA410 "DPT SCSI Host Bus Adapter (PM2X22A/9X)"
DPTA501 "DPT SCSI Host Bus Adapter (PM2012B1/9X)"
DPTA502 "DPT SCSI Host Bus Adapter (PM2012B2/9X)"
DPTA701 "DPT SCSI Host Bus Adapter (PM2011B1/9X)"
DPTBC01 "DPT ESDI Caching Hard Disk Controller (PM3011/7X)"
DTC1101 "DTC2290 EISA IDE Controller"
DTC3101 "DTC3290 Host Adapter"
DTI0000 "Evolution RISC PC"
DTI2000 "DTI ESP2000A/ESP2000 EISA System Processor Board"
DTI2002 "DTI ESP2002 Integrated EISA System Processor"
DTK0001 "DTK PLM-3300I 80486 EISA Board"
DTK0003 "DTK PLM-3331P EISACACHE486 33/25/50 MHZ"
ECS0580 "DI-580A EISA SCSI Host Adapter"
ECS0590 "DI-590 EISA SCSI Cache Host Adapter"
ELS8041 "ELSA WINNER 1000 Enhanced VGA"
ETI1001 "NE3300 Ethernet Rev. C & D"
EVX0002 "PN-3000 System Board"
FCT0001 "EISA SYSTEM BOARD"
FCT0002 "386 EISA SYSTEM BOARD"
FCT0003 "486 EISA SYSTEM BOARD"
FIC0000 "LEO 486VE EISA Main Board"
FIX1516 "15-16MB Memory Hole Patch - Netserver LF/LC 5/66"
FSI2001 "ESA-200 ATM"
FSI2002 "ESA-200A ATM"
FSI2003 "ESA-200E ATM"
GDT2001 "GDT2000/GDT2020 Fast-SCSI Cache Controller - Rev. 1.0"
GDT3001 "GDT3000/GDT3020 Dual Channel SCSI Controller - Rev. 1.0"
GDT3002 "GDT30x0A Cache Controller"
GDT3003 "GDT3000B/GDT3010A EISA SCSI Cache Controller - Rev. 1.0"
GIT0000 "G486PEL EISA & LOCAL Bus Mother Board."
GIT0001 "G486HVL EISA & VESA LOCAL Bus Mother Board."
HCL0801 "HCL-Hewlett Packard Limited PANTHER System Board"
HIT0001 "MCC Mini-EISA486 Board"
HKG0011 "Distributed Signal Conditioning Front-End"
HMS0000 "HMSI ESIC EVALUATION BOARD"
HWP0000 "HP Monochrome Plus Video Board (35732A)"
HWP0010 "HP Multimode Video Adapter (45981A)"
HWP0020 "HP Multimode Color Adapter Board (45984A)"
HWP0030 "HP Enhanced Graphics Adapter Board (45983A)"
HWP0070 "HP Intelligent Graphics Controller 20 (A1083A)"
HWP0C70 "HP-IB Host Adapter"
HWP0C80 "SCSI Host Adapter (Cirrus-II) -- 25525A"
HWP1400 "HP Dual Serial Interface Board (24541B)"
HWP1410 "HP Internal 2400 Baud Modem (24551A)"
HWP1420 "HP Internal 1200 Baud Modem (24550A)"
HWP1440 "HP Terminal Multiplexor Board (D2040A)"
HWP1450 "HP HP-IB Interface board (82335A)"
HWP1460 "HP ScanJet Plus Interface (88290A)"
HWP1461 "HP ScanJet Plus Interface (88290A)"
HWP1801 "HP StarLAN 10 PC Link II (27240A)"
HWP1810 "HP ThinLAN Interface Board (27210B)"
HWP1811 "HP ThinLAN PC Adapter Card (27250A)"
HWP1820 "HP EtherTwist Adapter Card/8 (27245-60002)"
HWP1832 "HP EtherTwist PC LAN Adapter/16 TP Plus (27247B)"
HWP1840 "HP EtherTwist EISA LAN Adapter/32"
HWP1850 "LAN AdapterCard -- 25567A"
HWP18A0 "HP EtherTwist PC LAN Adapter/16 TL Plus (27252A)"
HWP18C0 "HP EtherTwist PC LAN Adapter NC/16 TP (J2405A)"
HWP18E0 "HP 100Mbps EISA ATM Card"
HWP1940 "HP 10/100VG Selectable EISA LAN Adapter (J2577A)"
HWP1980 "ATM Adapter -- J2802A"
HWP1990 "Hewlett-Packard EISA 100VG AnyLAN adapter card"
HWP1C00 "HP Serial/Parallel Interface Board (24540B)"
HWP2002 "HP ScanJet II Interface (C1752A)"
HWP2051 "EISA Test Adapter Card"
HWP2080 "HP ScanJet II Interface (C2502A)"
HWPC000 "Series 700 EISA System Board"
HWPC010 "Series 700 EISA System Board"
HWPC051 "Series 700 EISA System Board"
HWPC091 "EISA System Board"
HWPC0D1 "EISA System Board"
HWPC0E1 "EISA System Board"
IBM0001 "IBM Auto 16/4 Token Ring ISA Adapter"
IBM1000 "IBM 16/4 Busmaster EISA Adapter"
IBM1060 "IBM 100/10 ISA Ethernet Adapter"
IBM1061 "IBM 100/10 ISA Ethernet Adapter"
ICLA080 "ICL EtherTeam 32 EISA 32-bit Ethernet Controller"
ICU0010 "Intel SatisFAXtion Modem/400"
ICU0020 "Intel SatisFAXtion Modem/100"
ICU0030 "DigiBoard DigiChannel PC/4E Serial Adapter"
ICU0040 "Western Digital WD1003V-MM2(WITH FIRMWARE) Hard/Floppy Disk Controller"
ICU0041 "Western Digital WD1003V-MM2(WITHOUT FIRMWARE) Hard/Floppy Disk Controller"
ICU0050 "Western Digital WD1007A-WA2(WITH BIOS) Hard/Floppy Disk Controller"
ICU0051 "Western Digital WD1007A-WA2(WITHOUT BIOS) Hard/Floppy Disk Controller"
ICU0052 "Western Digital WD1007V-SE2 Hard/Floppy Disk Controller"
ICU0060 "Archive SC402/VP402 QIC-02 Tape Controller"
ICU0070 "Wangtek PC-36 Tape Controller"
ICU0080 "Wangtek PC-02 Tape Controller"
ICU0091 "Adaptec 1542B SCSI/Floppy Disk Controller"
ICU0092 "Adaptec 1542C SCSI/Floppy Disk Controller"
ICU00A0 "DPT PM2011B1/9X SCSI Controller"
ICU00B0 "3COM Etherlink II (3C503) Network Adapter"
ICU00C0 "3COM Etherlink 16 (3C507) Network Adapter"
ICU00D0 "SMC PC600WS Network Adapter"
ICU00E0 "SMC PC130E Network Adapter"
ICU00F0 "Novell NE2000 Network Adapter"
ICU0100 "Western Digital WD8003E Network Adapter"
ICU0110 "Paradise VGA Plus 16 Video Adapter "
ICU0120 "Paradise VGA 1024 Video Adapter "
ICU0130 "Orchid Prodesigner IIs Video Adapter"
ICU0140 "ATI Graphics Ultra Pro Video Adapter"
ICU0150 "Orchid Fahrenheit 1280 Video Adapter "
ICU0160 "ATI VGA Wonder XL24 Video Adapter"
ICU0170 "ATI Graphics Ultra Video Adapter"
ICU0180 "Sound Blaster Multi-Media Adapter"
ICU0190 "Sound Blaster Pro Multi-Media Adapter"
ICU01A0 "Sound Blaster 16ASP Multi-Media Adapter"
ICU01B0 "Gravis Ultra Sound Multi-Media Adapter"
ICU01C0 "Logitech Soundman 16 Multi-Media Adapter"
ICU01D0 "Media Vision Thunderboard Multi-Media Adapter"
ICU01E0 "Pro Audio Spectrum 16 Multi-Media Adapter"
ICU01F0 "Microsoft Windows Sound System Multi-Media Adapter"
ICU0200 "Intel Above Board Plus 8 I/O"
ICU0210 "Logitech Bus Mouse"
ICU0220 "Microfield Graphics V8 Video Controller"
ICU0230 "Accton Ringpair-4/16 (TR1605)"
ICU0240 "CNet CN600E/680E"
ICU0250 "CNet CN1000T"
ICU0260 "CNet CN850E"
ICU0270 "CNet CN800E/880E"
ICU0280 "Cogent E/Master II-AT"
ICU0290 "Cogent E/Master I-AT"
ICU02A0 "D-Link DE-100"
ICU02B0 "D-Link DE-200"
ICU02C0 "Eagle/Novell NE1000 (810-160-00X)"
ICU02C1 "Eagle/Novell NE1000 (950-054401)"
ICU02D0 "Eagle/Novell NE1500T"
ICU02E0 "Eagle/Novell NE2100"
ICU02F0 "Gateway Ethertwist 16 (Fujitsu Chipset)"
ICU02F1 "Gateway Ethertwist 16 (National Chipset)"
ICU0300 "Gateway Ethertwist PC/PC-WS(National Chipset)"
ICU0310 "Proteon ProNET-4/16 Model p1390"
ICU0320 "Racal-Datacom InterLan AT"
ICU0330 "SMC PC330"
ICU0340 "SMC PC500"
ICU0350 "SMC PC550"
ICU0360 "SMC PC650"
ICU0370 "SMC PC270E"
ICU0380 "SMC 3008"
ICU0390 "SMC 3016"
ICU03A0 "Thomas-Conrad TC5045-2"
ICU03B0 "Thomas-Conrad TC6042/TC6142/TC6242"
ICU03C0 "Thomas-Conrad TC6045"
ICU03D0 "Thomas-Conrad TC6245"
ICU03E0 "Tiara Lancard 2002/2003"
ICU03F0 "Tiara Lancard AT"
ICU0400 "Tiara Lancard PC"
ICU0410 "Tiara ARCNET Lancard AT"
ICU0420 "Tiara Ethernet Lancard * 2000"
ICU0430 "Tiara Ethernet Lancard E2000"
ICU0440 "Tiara Lancard A-286"
ICU0450 "Tiara Lancard E"
ICU0460 "Tiara Lancard E * AT"
ICU0470 "Tiara Lancard E * AT TP"
ICU0480 "Tiara Lancard E * PC"
ICU0490 "Tiara Lancard E * PC10BT"
ICU04A0 "Tiara Lancard E * PC10TP"
ICU04B0 "Tiara Token Ring Lancard*16 AT"
ICU04C0 "Zenith LAN10E-MAT/FAT/FL-AT"
ICU04D0 "Zenith LAN16TR-AT"
ICU04E0 "Zenith LAN16TR-XT"
ICU04F0 "Zenith LAN4TR-AT"
ICU0500 "Zenith LAN4TR-XT"
ICU0510 "Zenith OfficeNIC"
ICU0520 "Zenith XT Lancard"
ICU0530 "BOCA M1440I 14.4Kbps V.32bis Modem"
ICU0540 "Always Technology IN-2000 SCSI Controller"
ICU0550 "Data Technology DTC3180A/DTC3280A SCSI Controller"
ICU0560 "DTC3150 SCSI Controller"
ICU0561 "DTC3150B SCSI Controller"
ICU0570 "Data Technology DTC3250 SCSI Controller"
ICU0580 "TMC-850M/TMC-850RL SCSI Controller"
ICU0590 "Future Domain TMC-880/TMC-881 SCSI Controller"
ICU05A0 "Future Domain TMC-1650/1660/1670/1680 SCSI Controller V5"
ICU05B0 "Future Domain TMC-1650/1660/1670/1680 SCSI Controller V4"
ICU05C0 "Promise Technology DC-2030 IDE Controller"
ICU05D0 "Promise Technology DC-2031 IDE Controller"
ICU05E0 "Promise Technology DC-2040 SCSI Controller"
ICU05F0 "Ultrastor ULTRA14F SCSI Controller"
ICU0600 "Ultrastor ULTRA12C/12F ESDI Controller"
ICU0610 "Ultrastor ULTRA15C IDE Controller"
ICU0620 "Longshine LCS-6624/6624G IDE Controller"
ICU0630 "Longshine LCS-6631/6631F SCSI Controller"
ICU0640 "Intel EtherExpress TPE Hub Controller"
ICU0650 "US Robotics Sportster 9600/PC Modem w/V.42BIS"
ICU0660 "Zoom AFC FAX Modem"
ICU0680 "DFI DIO-500 Serial/Parallel I/O Card"
ICU0681 "DFI DIO-200 Serial/Parallel I/O Card"
ICU0690 "Practical Peripherals PM9600FX Modem/FAX"
ICU06A0 "Practical Peripherals PM2400 Modem"
ICU06B0 "Zoom VFP V.32bis FAX Modem"
ICU06C0 "Zoom VP V.32bis Modem"
ICU06D0 "Zoom AMC 2400 Modem"
ICU06E0 "Cardinal MVP96IF 9600 Baud FAX/Modem"
ICU06F0 "Cardinal MB2296SR 9600 Baud FAX/Modem"
ICU0700 "Hayes Accura 2400B Modem"
ICU0710 "US Robotics Sportster 2400/PC Modem"
ICU0720 "US Robotics Sportster 14,400/PC FAX/Modem"
ICU0730 "Intel SatisFAXtion Modem/200"
ICU0740 "Racal InterLan NI5210-10BT"
ICU0750 "Racal InterLan NI6510-UTP"
ICU0760 "Intel Smart Video Recorder"
ICU0770 "Diamond Stealth Pro Accelerator"
ICU0780 "Diamond SpeedStar 24X VGA adapter"
ICU0790 "Video Seven WIN.PRO card"
ICU0800 "Video Seven WIN.VGA card"
ICU0810 "BOCA Super X Accelerator VGA"
ICU0820 "Metheus Premier 928"
ICU0830 "GraphicsENGINE ULTRA Series"
ICU0840 "Cardinal VIDEO spectrum"
ICU0850 "SigmaDegins Legend 24LX"
ICU0860 "Hercules Graphite Card"
ICU0870 "Focus GUIVGA"
ICU0880 "AIR AVIEW2V SVGA"
ICU0890 "NDI Volante Warp Series Warp10"
ICU0900 "NDI Volante Warp Series Warp10LB and 24LB"
ICU0910 "Cyber Audio Multi-Media Adapter"
ICU0920 "Genoa SuperVGA 6000 Series"
ICU0930 "Acculogic sIDE-1"
ICU0940 "Acculogic sIDE-1/16"
ICU0950 "Acculogic sIDE-3/plus"
ICU0960 "Alpha Research S4251 ISA"
ICU0970 "CMS Enhancement Universal AT/XT Controller"
ICU0980 "Eastern IDC-747"
ICU0990 "Juko D16-X"
ICU1000 "NCL538/NCL539"
ICU1010 "NCL538B"
ICU1020 "NCL538C"
ICU1030 "easyCACHE IDE/easyCACHEPro IDE"
ICU1040 "Plus Development HARDCARD II XL"
ICU1050 "Plus Development HARDCARD II"
ICU1060 "Seagate ST05A"
ICU1070 "Seagate ST05X"
ICU1080 "Silicon ADP60"
ICU1090 "Silicon ADP65"
ICU1100 "HP ISA SCSI Host Adapter (D1682A)"
ICU1101 "HP SCSI-1 Host Adapter for HP CD-ROM (D2886A)"
ICU1110 "Adaptec AHA-1540A/AHA-1542A"
ICU1120 "Bustek BT-542B"
ICU1130 "Bustek BT-542S/BT-542D"
ICU1140 "Computer Electronik Infosys C5610"
ICU1150 "Computer Electronik Infosys C5630"
ICU1160 "Computer Electronik Infosys C5635"
ICU1170 "Control Concepts HB A8"
ICU1180 "DPT PM2001B/90,PM2001B/95"
ICU1190 "Quantum ISA-200S"
ICU1200 "easyCACHE SCSI/easyCACHEPro SCSI"
ICU1210 "Procom CC-8 SCSI ENABLER"
ICU1220 "Procom CC-16 SCSI ENABLER"
ICU1230 "Procomp S-DCB"
ICU1240 "Procomp USA, Incoprated S-DCB"
ICU1250 "Rancho RT10-AT"
ICU1260 "SMS OMTI-810/812/820/822"
ICU1270 "SMC 4004-PC"
ICU1280 "Sumo SPI 200"
ICU1290 "Trantor T100"
ICU1300 "IBM Token-Ring 16/4 Adapter"
ICU1310 "Thomas TC-4045"
ICU1330 "DPT PM2011/95 SCSI Controller"
ICU1340 "DPT PM2021 SamrtCacheIII Adapter"
INP0010 "Barracuda E/4810"
ICU1360 "SyQuest SQ08 IDE Controller"
ICU1370 "SyQuest ST01 SCSI HOST Adapter"
IDS0100 "EISC960 EISA Caching SCSI Host Adapter"
IIN0B01 "Intel TokenExpress(tm) ISA/8 Network Adapter"
IKN1110 "IKON hardcopy boards: 10092, 10097, or 10111"
IMS1001 "Integrated Micro Solution Inc. 486 EISA System Board"
ING2040 "HCL-Hewlett Packard Limited PANTHER System Board"
INP25D0 "Seahawk 4811 FDDI Controller"
INP5000 "Interphase 4800 EISA->PCI Bridge"
INT0000 "Mercury/Neptune PCI-EISA Main Board"
INT0081 "HCL-Hewlett Packard Limited PANTHER System Board"
INT0701 "Intel TokenExpress(tm) ISA 16/4 Network Adapter"
INT0703 "Intel TokenExpress(tm) ISA/16s Network Adapter"
INT0902 "Intel TokenExpress(tm) EISA 16/4 Network Adapter"
INT0B01 "Intel TokenExpress(tm) ISA/8 Network Adapter"
INT1000 "Intel EtherExpress 16 Family LAN Adapter"
INT1010 "Intel EtherExpress(tm) Flash32 Ethernet Adapter"
INT1030 "Intel EtherExpress(TM) PRO/10 LAN Adapter"
INT1031 "Intel EtherExpress(TM) PRO/10+ LAN Adapter"
INT1060 "Intel EtherExpress(tm) PRO/100 LAN Adapter"
INT1201 "Intel TokenExpress(tm) EISA/32 Network Adapter"
INT3061 "LP486E System Board"
INT3079 "X-Series Desktop System Board"
INT3089 "X-Series Deskside System Board"
INT30A1 "L486 Series System Board"
INT30A9 "L486 Series System Board"
INT30D1 "X-Series System Board"
INT30F1 "X-Series Premium System Board"
INT3132 "ECC Memory Module (BXECCMEM0)"
INT31A0 "System Board"
ISA0000 "Generic ISA Adapter"
ISA0001 "Generic Video Card"
ISA1000 "Serial/Parallel Adapter Board"
ISA1010 "Generic OSF ISA COM/MODEM/LPT"
ISA2000 "Microsoft Sound Board ISA Adapter Definition"
ISA3000 "ISA-PCMCIA Adapter"
ISA4000 "Dialogic Voice Card Adapter"
ISA4010 "Dialogic DTI/2xx, DMX, MSI/C Adapter"
ISA4020 "GammaLink Fax Card Adapter Definitions"
ISA4030 "Dialogic Antares Card Definitions"
ISA6400 "ISA ATI MACH64 VGA controller"
ISA8100 "Attachmate 3270 COAX Adapter (Long Board)"
ISA8101 "Attachmate Advanced 3270 COAX Adapter (Short Board)"
ISA8102 "Attachmate SDLC/Autolink Adapter"
ISA8103 "Attachmate SDLC Adapter"
ISA8200 "AST 3270/COAX II Rev. X4"
ISA8201 "AST 5251/11 Enhanced Plus"
ISA8202 "AST SixPakPlus Version A"
ISA8203 "AST Rampage 286"
ISA8204 "AST RAMvantage"
ISA8300 "IBM Enhanced 5250 Emulator"
ISA8301 "IBM Enhanced 5250 Emulator Rev B"
ISA8302 "IBM SDLC (3270 or 5250 Remote)"
ISA8303 "IBM Advanced 3278/79 Adapter"
ISA8304 "IBM Serial/Parallel Adapter"
ISA8305 "IBM PC Network"
ISA8306 "IBM TOKEN RING Adapter I"
ISA8307 "IBM TOKEN RING Adapter II"
ISA8308 "IBM Monochrome Adapter"
ISA8309 "IBM VGA Display Adapter"
ISA830A "IBM Token Ring II Short Adapter"
ISA830B "IBM Token Ring 16/4 Adapter"
ISA830C "IBM Enhanced Graphics Adapter"
ISA830D "IBM PGA"
ISA830E "IBM Realtime Interface Co-Processor Multiport Adapter, Model 2"
ISA8400 "IDEAssociates IDEAcomm 5250/Remote"
ISA8401 "IDEAssociates IDEAcomm 5251 Twinax Plus Rev D"
ISA8402 "IDEAssociates IDEAcomm 5251 Twinax Plus Rev C"
ISA8403 "IDEAssociates IDEAcomm 5251 Twinax Rev A,B,C"
ISA8500 "DCA IRMA2 Adapter"
ISA8501 "DCA IRMA 3278 Emulation"
ISA8502 "DCA IRMA 3279 Graphics Adapter"
ISA8503 "DCA IRMA3 Convertible"
ISA8505 "DCA Smart Alec 5250"
ISA8506 "DCA IRMA Remote SDLC Adapter"
ISA8507 "DCA 10-NET Adapter"
ISA8508 "DCA IRMA2 3279 Graphics Adapter"
ISA8509 "DCA Intelligent Serial PC Adapter (Long SDLC)"
ISA8700 "Novell Coax Adapter 3270 Connection"
ISA8701 "Novell COAX GRAPHICS Rev. A"
ISA8702 "Novell TWINAX 5250"
ISA8711 "Novell NE1000 Ethernet Adapter"
ISA8712 "Novell NE2000 Ethernet Adapter"
ISA8713 "Novell RX-Net REV B,C,D NIC"
ISA8714 "Novell RX-Net REV E,F,G NIC"
ISA8804 "Tecmar EGA Master 480/800"
ISA8805 "Tecmar Maestro AT"
ISA8900 "SMC ARCNET PC"
ISA8901 "SMC ARCNET PC100"
ISA8902 "SMC ARCNET PC110"
ISA8903 "SMC Arcnet PC130/E"
ISA8904 "SMC Arcnet PC220/120"
ISA8905 "SMC Arcnet PC270/E"
ISA8906 "SMC Arcnet PC500"
ISA8907 "SMC Ethernet PC510"
ISA8A00 "NESTAR ARCNET PLAN 2000"
ISA8B00 "DEC DEPCA EtherLink Adapter, Rev D1"
ISA8B01 "DEC DEPCA EtherLink Adapter, Rev E or F"
ISA8C00 "3COM 3C505-2012 EtherLink Plus 16bit Mode"
ISA8C01 "3COM EtherLink 3C501 ASM 1221"
ISA8C02 "3COM EtherLink 3C500B ASM 34-0780"
ISA8C03 "3COM 3C503 EtherLink II"
ISA8C04 "3COM 3C603 Tokenlink 16bit"
ISA8C05 "3COM 3C605-2065 Tokenlink Plus 8bit"
ISA8C06 "3COM 3C505-2012 EtherLink Plus 8bit Mode"
ISA8C07 "3COM 3C605-2065 Tokenlink Plus 16bit Mode"
ISA8C08 "3COM 3C603 Tokenlink 8bit Mode"
ISA8C09 "3COM 3C507 Etherlink 16"
ISA8C10 "3COM 3C507TP Etherlink 16"
ISA8D00 "Tiara LANCARD/A REV B"
ISA8D01 "Tiara LANCard/E * PC 16"
ISA8E00 "Microsoft Mouse Controller"
ISA8E01 "Scanman Plus by Logitech"
ISA8F00 "AT&T STARLAN Network Adapter"
ISA8F01 "AT&T Truevision Image Capture Board"
ISA9000 "Hercules GB222 InColor Card"
ISA9001 "Hercules Graphics Card Plus"
ISA9002 "Hercules VGA Card"
ISA9100 "Quadram QuadEGA+"
ISA9101 "Quadram QuadVGA Video Adapter"
ISA9102 "Quadram QUADMEG-AT"
ISA9103 "QUADEMS+ W/IO"
ISA9200 "Intel Above Board/AT (no Piggyback)"
ISA9201 "Intel Above Board/AT With 2MB Piggyback"
ISA9202 "Intel Above Board 286 (no Piggyback)"
ISA9203 "Intel Above Board 286 With 2MB Piggyback"
ISA9204 "Intel Above Board PS/286 (no Piggyback)"
ISA9205 "Intel Above Board PS/286 With 2MB Piggyback"
ISA9206 "Intel Above Board Plus 8 (including 6Mb Piggyback)"
ISA9207 "Intel Visual Edge printing enhancement system"
ISA9208 "Intel iMX-LAN/586"
ISA9209 "Intel PC586E"
ISA9300 "MICOM-Interlan NP600A Ethernet 16bit"
ISA9302 "MICOM-Interlan NI5210/8 Ethernet"
ISA9303 "MICOM-Interlan NI5210/16 Ethernet"
ISA9400 "Gateway G/Ethernet AT"
ISA9401 "Gateway G/Ethernet 8-bit PC"
ISA9402 "Gateway G/Token Ring 8-bit "
ISA9403 "Gateway G/Token Ring AT "
ISA9404 "Gateway G/Net VS "
ISA9405 "Gateway G/Net LNIM"
ISA9500 "Proteon ProNET-4/AT P1344"
ISA9600 "Madge AT Ring Node"
ISA9601 "Smart ISA Ringnode"
ISA9700 "IMC PCnic 16bit NIC"
ISA9800 "Video Seven V-RAM VGA"
ISA9801 "Video Seven Vega Deluxe EGA Adapter"
ISA9802 "Video Seven FastWrite VGA Video Adapter"
ISA9803 "Video Seven VGA 1024i Video Adapter"
ISA9900 "Sigma Designs VGA-PC-HP160/162"
ISA9901 "Sigma Designs SigmaVGA or VGA/HP8"
ISA9A00 "Verticom M16/M256E"
ISA9A01 "Verticom MX16/AT & MX256/AT"
ISA9B00 "HP 82328A Intelligent Graphics Controller"
ISA9C01 "Matrox PG-1281"
ISA9C02 "Matrox PG-1024"
ISA9C03 "Matrox PG-641"
ISA9D00 "Renaissance GRX Rendition I"
ISA9D01 "Rendition II Intelligent Graphics Controller"
ISA9E00 "Pixelworks Micro Clipper Graphics"
ISA9E01 "Pixelworks Ultra Clipper Graphics"
ISA9F00 "Genoa Super VGA 16-Bit"
ISA9F02 "Genoa SuperVGA"
ISA9F03 "Genoa SuperEGA HiRes+"
ISA9F04 "Genoa SuperSpectrum Model 4650"
ISA9F05 "Genoa SuperSpectrum Model 4640"
ISA9F07 "Genoa Systems QIC-02 Tape Controller"
ISAA000 "Vermont Page Manager 100"
ISAA100 "Orchid TurboPGA"
ISAA101 "Orchid ProDesigner VGA/VGA+"
ISAA102 "Orchid Enhanced Board OM"
ISAA103 "Orchid Enhanced Board w/IO"
ISAA200 "Paradise VGA Professional 16-bit"
ISAA201 "Paradise VGA Plus 8-bit"
ISAA202 "Paradise Autoswitch EGA"
ISAA300 "Truevision ATVista ICB"
ISAA400 "Excelan EXOS 205E"
ISAA401 "Excelan EXOS 205T 16-Bit"
ISAA500 "Pure Data PDI8025 Token Ring"
ISAA501 "Pure Data PDI508 ArcNet"
ISAA600 "BICC ISOLAN Ethernet"
ISAA700 "Control Systems Artist 10"
ISAA701 "Control Systems Artist XJ10"
ISAA800 "Codenoll Codenet3051"
ISAAB00 "Hayes Smartmodem 1200B"
ISAAB01 "Hayes Smartmodem"
ISAAB02 "Hayes Smartmodem 2400B"
ISAAB03 "Hayes Smartmodem 2400Q"
ISAAC00 "ATI Tech. Inc. EGA WONDER"
ISAAC01 "ATI Tech. Inc. VGA WONDER"
ISAAD00 "TOPS FlashCard"
ISAAE01 "Arnet SMARTPORT Card"
ISAAE02 "Arnet MODULAR SMARTPORT Card"
ISAAE03 "Arnet SMARTPORT 16 Card"
ISAAF00 "Computone INTELLIPORT Multiport Serial Card"
ISAAF01 "Computone IntelliPort ATCC Cluster Controller"
ISAB000 "Anvil Designs Stallion Intelligent I/O Controller"
ISAB100 "Emerald 3XTwin 5250 Twinax"
ISAB101 "Emerald 3XPlus 5250 Remote"
ISAB200 "EVEREX Evercom 24 2400 baud modem"
ISAB300 "Practical Modem 2400"
ISAB401 "STB Systems EGA Plus"
ISAB402 "STB Chauffeur HT"
ISAB403 "STB VGA Extra"
ISAB404 "STB EGA MultiRes"
ISAB500 "Banyan Intelligent Communications Adapter"
ISAB600 "Computer Peripherals Monographic Video"
ISAB601 "Computer Peripherals VisionMaster VGA"
ISAB602 "Graphmaster Plus EGA Video Adapter"
ISAB700 "Iomega Bernoulli PC3B/50 Board"
ISAB701 "Iomega Bernoulli PC2/50, PC2B/50 Boards"
ISAB702 "Iomega Bernoulli II Combo Adapter Board"
ISAB800 "Archive SC499R Tape Controller"
ISAB801 "Archive VP402 Tape Adapter"
ISAB900 "DigiBoard DigiCHANNEL PC/Xe"
ISAB901 "DigiBoard DigiCHANNEL PC/8i"
ISAB903 "Digiboard Digichannel PC/8e"
ISAB904 "DigiBoard Com/8s"
ISAB905 "DigiBoard DigiCHANNEL PC/8"
ISABA00 "Alloy IMP2 Multiuser Port Controller"
ISABA01 "Alloy IMP8 Multiuser Port Controller"
ISABA02 "Alloy PC-HIA XBUS Controller"
ISABA03 "Alloy FTFA Tape & Floppy Controller"
ISABB00 "BIT3 403/404/405 Bus Communications Adaptors"
ISABC00 "Boca Research BOCARAM/AT Plus"
ISABC01 "Boca Research I/O Master AT"
ISABD00 "Racal-Interlan NP600A Ethernet 16bit"
ISABD02 "Racal-Interlan NI5210/8 Ethernet"
ISABD03 "Racal-Interlan NI5210/16 Ethernet"
ISABE00 "Qua Tech PXB-1608 Parallel Expansion Board"
ISABE01 "Qua Tech ES-100 8 Channel Asyncronous"
ISABE02 "Qua Tech QS-100M 4 Channel Asyncronous"
ISABE03 "Qua Tech MXI-100 IEEE 488 GPIB"
ISABE04 "Qua Tech DS-201 Dual Channel RS-422"
ISABE05 "Qua Tech PXB-721 Parallel Expansion"
ISABE06 "Qua Tech DSDP-402 Dual Serial/Dual Parallel"
ISABE07 "Qua Tech WSB-10 Waveform Synthesizer"
ISABE08 "Qua Tech SmartLynx Multiport Adapter"
ISABF00 "EOgraph Plus"
ISAC000 "Corollary 8x4 Mux (Jumpers)"
ISAC001 "Corollary 8x4 Mux (Rotary Switches)"
ISAC002 "Corollary 8x4"
ISAC100 "Bell Technologies' ACE Multiport Serial Card"
ISAC200 "Micro-Integration PC-STWINAX"
ISAC201 "Micro-Integration PC-MICOAX"
ISAC300 "BlueLynx 5251-12"
ISAC301 "BlueLynx 5250"
ISAC302 "BlueLynx 3270 Remote"
ISAC303 "BlueLynx Enhanced 5251-11"
ISAC304 "BlueLynx 3270 Enhanced Coax"
ISAC400 "Core CNT-ATP ESDI Internal FD Ctrl"
ISAC500 "CEC PC 488 IEEE Printer Controller"
ISAC600 "Vector International SCC Async/BSC/SDLC"
ISAC700 "LSE Electronics YC808 Color Graphics Printer Adapter"
ISAC701 "LSE Electronics Platinum VGA16 Card"
ISAC800 "Street Electronics ECHO PC+ Speech Synthesizer"
ISAC900 "SIIG ARCLAN-100 Arcnet Network Board."
ISACA00 "National Instruments GPIB-PCIIA"
ISACA01 "National Instruments AT-GPIB"
ISACA02 "National Instruments GPIB-PC"
ISACB00 "Konan TNT-1050 Caching Disk Controller"
ISACC00 "Packard Bell PB 3270 Coax"
ISACD00 "Digital Storage Systems ARC6000"
ISACE00 "Ideaphone Input Device"
ISACF00 "Atronics Professional Image Board Plus"
ISAD000 "Bi-Tech SCSI 2110 HD/TAPE Controller"
ISAD001 "Bi-Tech SCSI 2200 Controller"
ISAD100 "Equinox Megaport Board"
ISAD200 "Comtrol SMART HOSTESS Multiport Serial Card"
ISAD300 "Emulex MPC-II Comm Controller"
ISAD301 "Altos Wide Area Network Board /2"
ISAD400 "Western Digital WD1004A-WX1 Controller"
ISAD401 "Western Digital WD1006V-MM2 Winchester/Floppy Controller"
ISAD402 "Western Digital WD1006V-SR2 Winchester/Floppy Controller"
ISAD403 "Western Digital WD1007A-WAH Winchester Controller"
ISAD404 "Western Digital WD1007V-SE1 Winchester Controller"
ISAD500 "GammaLink GammaFax NA"
ISAD501 "GammaLink GammaFax CP"
ISAD600 "The Complete FAX/9600"
ISAD601 "The Complete Page Scanner"
ISAD602 "Scanman Plus"
ISAD700 "Hughes 4140 Ethernet Board"
ISAD701 "Hughes 6130 Broadband Network Card"
ISAD702 "Hughes(Sytek) 6140 Token Ring Net. Board"
ISAD800 "AMI SMART PACK 2 W/ PAL 5.1"
ISAD801 "AMI SMART PACK 2 W/ PAL 6.1"
ISAD802 "AMI SMART PACK 2 W/ PAL 6.2"
ISAD900 "NEC Multisync Graphics Board GB-1"
ISADA00 "Torus Systems Ethernet Adapter"
ISADA01 "Torus Systems Ethernet Adapter/SB"
ISADB00 "Rabbit Software RB14 X.25 Adapter"
ISADB01 "Rabbit Software RB24 Multi-Protocol Comm"
ISADC00 "Nth Graphics Nth Engine"
ISADD00 "Chase AT4/AT8/AT16"
ISADE00 "QMS JetScript"
ISADF00 "Altos ACPA/AT"
ISADF01 "SoundBlaster by Creative Labs, Inc."
ISADF02 "Emerald Systems SCSI Tape Adapter"
ISADF03 "Weitek Array Processor, Brd #3002-0046-01"
ISAE000 "Headlands VGA 1024i Video Adapter"
ISAE100 "Scanman Plus"
ISAE300 "Overland Data 9-Track Tape TX-8 Controller"
ISAE401 "Microfield V8 Color Graphics Controller"
ISAE402 "Microfield T8 Color Graphics Controller"
ISY0010 "(SYSTEM) VGA Board"
ISY0020 "(SYSTEM) COM Ports"
ISY0030 "(SYSTEM) Mother Board PS-2 style Mouse"
ISY0040 "(SYSTEM) Hard Disk Controller"
ISY0050 "(SYSTEM) Floppy Drive Controller"
ISY0060 "(SYSTEM) LPT Ports"
ISY0070 "(SYSTEM) IRQ9 Cascaded Interrupt"
ITC0001 "EISA-486C Main Board"
ITK0011 "ITK ixEins Basic S0/Up0 ISDN-Adapter Version 1.1"
ITK0012 "ITK ixEins Basic S0/Up0 ISDN-Adapter Version 1.2"
KCI3201 "ET32EM EISA 32-bit BUS-MASTER Ethernet Adapter"
KCI3202 "ET-32EM 32-bit EISA Bus Master Ethernet Adapter"
LEF8000 "LeafNet LAN Adapter"
MCC0000 "MCC EISA-486 Board"
MCC0001 "MCCI-486 EISA System Board"
MCY2501 "Microdyne NE2500/NE5500 Series Ethernet Lan Adapter"
MDG0002 "Madge Smart 16/4 EISA Ringnode"
MDG0010 "Madge Smart 16/4 AT Ringnode"
MDG0020 "Madge Smart 16/4 ISA Client Ringnode"
MDG2000 "Madge Blue+ 16/4 ISA Token Ring Adapter"
MDG2010 "Madge Blue+ 16/4 ISA PnP Token Ring Adapter"
MET1104 "Metheus UGA 1104 Graphics Controller"
MET1128 "Metheus UGA 1124/1128 Graphics Ctlr."
MIC0001 "MICRONICS EISA 486 66/50/33/25 System Board"
MIC0004 "MICRONICS 486 PCI-EISA System Board"
MIC0005 "MICRONICS M5PE EISA-PCI Pentium System Board"
MIC0021 "FD-0475 EISA Bus Ethernet LAN Adapter"
MIC0054 "Micronics M54Pe Dual Pentium PCI-EISA System Board"
MIC3001 "Micronics EISA3 System Board"
MIC5402 "Micronics M54E2 Dual Pentium PCI-EISA System Board"
MINIADP "Adaptec 32-bit SCSI Host Adapter (with floppy)"
MIR0928 "miroCRYSTAL / miroMAGIC / miroRAINBOW (14-Sep-93) "
MLX0010 "Mylex LNE390A EISA 32-bit Ethernet LAN Adapter"
MLX0011 "Mylex LNE390B EISA 32-bit Ethernet LAN Adapter"
MLX0020 "Mylex DCE376 EISA 32-Bit SCSI Host Adapter"
MLX0021 "Mylex DCE376 EISA 32-Bit SCSI Host Adapter"
MLX0022 "Mylex DCE376 EISA 32-Bit SCSI Host Adapter"
MLX0030 "Mylex LNI390A ISA 16-Bit Ethernet LAN Adapter"
MLX0040 "Mylex GXE020B or GXE020C EISA 32-Bit Graphics Controller"
MLX0050 "Mylex GLE(911) EISA Graphics Adapter"
MLX0070 "Mylex DAC960 EISA Disk Array Controller"
MLX0071 "Mylex DAC960 EISA Disk Array Controller (3-channel)"
MLX0072 "Mylex DAC960 EISA Disk Array Controller (3-channel)"
MLX0073 "Mylex DAC960 EISA Disk Array Controller (2-channel)"
MLX0074 "Mylex DAC960 EISA Disk Array Controller (1-channel)"
MLX0075 "Mylex DAC960-A EISA Disk Array Controller (3-channel)"
MLX0076 "Mylex DAC960-A EISA Disk Array Controller (2-channel)"
MLX0077 "Mylex DAC960-A EISA Disk Array Controller (1-channel)"
MLX0101 "Mylex LME596 EISA 32-bit 4 Channel Ethernet LAN Adapter"
MLXFD01 "Mylex Corporation MDE486 EISA 32-Bit 486 System Board"
MLXFE01 "Mylex MBE486 EISA 32-Bit 486 System Board"
MLXFF01 "Mylex MAE486 EISA 32-Bit 486 System Board"
MLXFF02 "Mylex Corporation MDE486 or MNE486 EISA 32-Bit 486 System Board"
MTX2040 "MATROX IM-1280/EISA"
NEC8201 "DPT SCSI Host Bus Adapter w/ Cache (PM2012B/90)"
NIC0202 "AT-MIO-16 Multi-function Board"
NIC0301 "AT-DIO-32F Digital I/O Board"
NIC0400 "PC-DIO-24 Digital I/O Board"
NIC0501 "LAB-PC/LAB-PC+ Multi-function Board"
NIC0602 "AT-MIO-16F-5 Multi-function Board"
NIC0700 "PC-DIO-96 Digital I/O Board"
NIC0800 "PC-LPM-16 Low Power Multi-function Board"
NIC0900 "PC-TIO-10 Timing I/O Board"
NIC1000 "AT-A2150 16-bit 4 Channel A/D Board"
NIC1100 "AT-DSP2200 DSP Accelerator/Audio I/O Board"
NIC1200 "AT-AO-6/10 ANALOG OUTPUT BOARD"
NIC1300 "AT-MIO-16X Multi-function Board"
NIC1400 "AT-MIO-64F-5 Multi-function Board"
NIC1500 "AT-MIO-16D Multi-function Board"
NICC005 "National Instruments AT-GPIB Interface Board"
NICC105 "National Instruments GPIB-PCIIA Interface Board"
NICC205 "National Instruments GPIB-PCII Interface Board"
NICC304 "National Instruments AT-GPIB/TNT"
NICC502 "National Instruments EISA-GPIB"
NON0101 "c't Universal 16-Bit Multi I/O Adapter"
NON0102 "c't Universal 16-Bit Multi I/O Adapter"
NON0201 "c't Universal 8-Bit Multi I/O Adapter"
NON0301 "c't Universale Graphic Adapter"
NON0401 "c't Universal Ethernet Adapter"
NON0501 "c't Universal 16-Bit Sound Adapter"
NON0601 "c't Universal 8-Bit Adapter"
NSS0011 "Newport Systems Solutions WNIC Adapter"
NVL0701 "Novell NE3200 Bus Master Ethernet"
NVL0901 "Novell NE2100 Ethernet/Cheapernet Adapter"
NVL1001 "Novell NMSL (Netware Mirrored Server Link)"
NVL1201 "Novell NE32HUB 32-bit Base EISA Adapter"
NVL1301 "Novell NE32HUB 32-bit TPE EISA Adapter"
NVL1401 "Novell NE32HUB PME ISA Adapter"
NVL1501 "Novell NE2000PLUS Ethernet Adapter"
OLC0701 "Olicom ISA 16/4 Token-Ring Network Adapter"
OLC0702 "Olicom OC-3117, ISA 16/4 Adapter (NIC)"
OLC0801 "OC-3118 Olicom ISA 16/4 Token-Ring Network Adapter"
OLC0901 "Olicom EISA 16/4 Token-Ring Network Adapter"
OLC0902 "Olicom EISA 16/4 Token-Ring Network Adapter"
OLC0B01 "Olicom PCA 16/4 Token-Ring Network Adapter"
OLC1201 "Olicom 32 Bit EISA 16/4 Token-Ring Network Adapter"
OPT0000 "OPTi HUNTER EISA 32-Bit 486 System Board"
OPT0200 "OPTi LOW_COST EISA 32-Bit 486 System Board"
OTI0011 "Pro II/EISA"
PCI0080 "PIONEER 486WB 8 SLOT EISA SYSTEM BOARD"
PCI0120 "PIONEER 486WB 12 SLOT EISA SYSTEM BOARD"
PCI2080 "PIONEER 486WB 8 SLOT EISA SYSTEM BOARD"
PHI8041 "Standard VGA controller"
PLX1001 "OCEAN EISALink EISA 32-Bit BUS-MASTER Ethernet Controller"
PRO6000 "Proteon ProNET 4/16 Token Ring Adapter"
PRO6001 "Proteon ProNET 4/16 Token Ring Adapter"
PRO6002 "Proteon ProNET 4/16 Token Ring Adapter"
PTI5401 "Poseidon P6 QUAD PCI-EISA Board"
RII0101 "Racal InterLan ES3210 Ethernet Controller"
SEC0010 "SAMSUNG ISA Multifunction Card"
SEC0020 "SAMSUNG VGA Card (GTI VC-004)"
SEC0021 "WD 90C31 Local Bus VGA"
SECFF01 "SAMSUNG MAE486 System Board"
SECFF02 "OPTi/EISA 32-Bit 486 System Board"
SGT0101 "AT&T GIS 8/16 Port Serial Controller"
SIS0000 "4DESD EISA-486 System Board"
SIS0001 "EISA-486 Demo Board"
SKD0100 "SK-NET FDDI-FE EISA 32-Bit FDDI LAN Adapter"
SMC0110 "Standard Microsystems Corp. Elite32 Ethernet"
SMC03E0 "SMC EtherCard PLUS Family LAN Adapters"
SMC13E0 "SMC EtherCard PLUS Elite16 Family LAN Adapters"
SMC8003 "SMC EtherCard PLUS Elite Family LAN Adapters"
SMC8010 "SMC Ethercard Elite32C Ultra"
SMC8013 "SMC EtherCard PLUS Elite16 Family LAN Adapters"
SMC8216 "SMC EtherCard Elite16 ULTRA Family LAN Adapters"
SMCA010 "SMC Ether 10/100"
SNIAAA0 "Siemens Nixdorf Ether-Board EISA T"
SNIAAB0 "Siemens Nixdorf Ether-Board EISA 2"
SNIABF0 "Siemens Nixdorf ETHER-BOARD-AT105T Ethernet/Cheapernet Adapter"
SNIACA0 "Siemens Nixdorf ETHER-BOARD-AT10T Ethernet/Twisted Pair Adapter"
STL0100 "Stallion Technologies - ONboard/E"
STL0120 "Stallion Technologies - ONboard ISA"
STL0130 "Stallion Technologies - Brumby ISA"
STL0200 "Stallion Technologies - EasyIO"
STL0400 "Stallion Technologies - EC 8/64-EI"
STL0410 "Stallion Technologies - EC 8/32-AT"
STL0420 "Stallion Technologies - EC 8/64-AT"
SUK1022 "SK-NET Token Ring LAN Interface Board"
SUK1059 "SK-NET G16 LAN Interface Board"
SUK1072 "SK-FDDI FI LAN Interface Board"
TCC010C "Thomas-Conrad TC6045 ARC-Card/AT"
TCC030D "Thomas-Conrad TC6042 ARC-Card/CE"
TCC040B "Thomas-Conrad TC6142 ARC-Card/CE"
TCC3047 "Thomas-Conrad TC3047 TCNS Adapter/EISA"
TCM3190 "3Com 3C319 TokenLink Velocity ISA NIC"
TCM5030 "3COM EtherLink II Family"
TCM5070 "3COM 3C507 Etherlink 16 or TP v2.0"
TCM5090 "3Com 3C509-TP Network Adapter"
TCM5091 "3Com 3C509 Network Adapter"
TCM5092 "3Com 3C579-TP EISA Network Adapter"
TCM5093 "3Com 3C579 EISA Network Adapter"
TCM5094 "3Com 3C509-Combo Network Adapter"
TCM5095 "3Com 3C509-TPO Network Adapter"
TCM5098 "3Com 3C509-TPC Network Adapter"
TCM5920 "3Com EtherLink III Bus Master EISA (3C592) Network Adapter"
TCM5970 "3Com Fast EtherLink EISA (3C597-TX) Network Adapter"
TCM5971 "3C597 Fast Etherlink T4"
TCM5972 "3C597 Fast Etherlink MII"
TCM7700 "3Com 3C770 FDDI Adapter"
TCO010C "Thomas-Conrad TC6045 ARC-Card/AT"
TCO030D "Thomas-Conrad TC6042 ARC-Card/CE"
TCO040B "Thomas-Conrad TC6142 ARC-Card/CE"
TCO050D "Thomas-Conrad TC4035 TOKEN RING Adapter/AT (Rev D)"
TCO3147 "TC3047 Thomas Conrad Network System (TCNS) EISA Adapter"
TCO345A "TC3045 Thomas-Conrad Network System (TCNS) AT Adapter"
TCO345B "TC3045 Thomas-Conrad Network System (TCNS) AT Adapter"
TEC8000 "Tecmar QIC60 HOST ADAPTER"
TEC8001 "Tecmar QIC PC36 TAPE CONTROLLER"
TEC8002 "Tecmar QT HOST ADAPTER"
TEC8003 "Tecmar QT PC36 TAPE CONTROLLER"
TRM0001 "EISA-486C SYSTEM BOARD"
TRM0320 "DC-320 EISA SCSI Host Adapter"
TRM0620 "DC-620 EISA IDE Cache Controller"
TRM0820 "DC-820 EISA SCSI Cache Host Adapter"
TRM320E "DC-320E EISA SCSI Host Adapter"
TRM820B "DC-820B EISA SCSI Cache Host Adapter"
TRU0210 "Truevision Image Capture Board"
TRU0520 "Truevision ATVista (R) VideoGraphics Adapter"
TRU1100 "Truevision DVR"
TXN0011 "TACT84500 MODULAR EISA SYSTEM BOARD"
TYN0000 "Tyan 486 PRO-EISA Board"
TYN0001 "TYN VL EISA-486 Board"
TYN0003 "Tyn S1452/S1462 PCI-EISA Main Board"
UBIA100 "Ungermann-Bass Personal NIU"
UBIA200 "Ungermann-Bass Personal NIU/ex"
UBIB100 "Ungermann-Bass NIUpc"
UBIB200 "Ungermann-Bass 3270 NIUpc"
UBIC100 "Ungermann-Bass NIC"
UBID100 "Ungermann-Bass NIUpc/Token Ring"
USC0120 "UltraStor - ULTRA-12F ISA ESDI Hard Disk Controller"
USC0125 "UltraStor - ULTRA-12C ESDI Hard Disk Controller"
USC0140 "UltraStor - ULTRA-14F ISA SCSI Host Adapter"
USC0220 "UltraStor - U22C"
USC0225 "UltraStor - ULTRA-22F ESDI Hard Disk Controller"
USC0240 "UltraStor - ULTRA-24F SCSI Host Adapter"
USC0340 "UltraStor - ULTRA-34F VESA VL-BUS Host Adapter"
USR0011 "USROBOTICS 33.6 TELEPHONY MODEM"
USR3401 "U S Robotics V.34-Ready Fax Modem"
VMI0201 "Vermont Image Manager 1024"
VMI0211 "Vermont Cobra"
VMI0601 "Vermont Image Manager 640"
VMI0E01 "Vermont Cobra Plus"
WDC0101 "Western Digital WD1009V-MM1 Winchester Controller"
WDC0102 "Western Digital WD1009V-SE1 Winchester Controller"
WDC0300 "Western Digital StarCard PLUS 8003S"
WDC0301 "Western Digital StarLink PLUS 8003SH"
WDC03E0 "Western Digital EtherCard PLUS 8003E"
WDC03E1 "Western Digital EtherCard PLUS w/Boot 8003EBT"
WDC03E2 "Western Digital EtherCard + 8003EB 61-600245-02"
WDC03E3 "Western Digital EtherCard PLUS TP 8003WT"
WDC03E4 "Western Digital EtherCard + 8003EB 61-600090-00"
WDC0510 "Western Digital TokenCard 8005TR/8005TRWS"
WDC1009 "Western Digital WD1009V-MM1/MM2 Winchester Controller"
WDC13E0 "Western Digital EtherCard PLUS 16 8013EBT"
XTI02B1 "XNET 1800 PARALLEL SWITCH"
...@@ -53,11 +53,13 @@ ...@@ -53,11 +53,13 @@
- Additional ethtool features - Additional ethtool features
v1.19a 28Oct2002 Davud Ruggiero <jdr@farfalle.com> v1.19a 28Oct2002 Davud Ruggiero <jdr@farfalle.com>
- Increase *read_eeprom udelay to workaround oops with 2 cards. - Increase *read_eeprom udelay to workaround oops with 2 cards.
v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
- Introduce driver model for EISA cards.
*/ */
#define DRV_NAME "3c509" #define DRV_NAME "3c509"
#define DRV_VERSION "1.19a" #define DRV_VERSION "1.19b"
#define DRV_RELDATE "28Oct2002" #define DRV_RELDATE "08Nov2002"
/* A few values that may be tweaked. */ /* A few values that may be tweaked. */
...@@ -84,6 +86,8 @@ static int max_interrupt_work = 10; ...@@ -84,6 +86,8 @@ static int max_interrupt_work = 10;
#include <linux/delay.h> /* for udelay() */ #include <linux/delay.h> /* for udelay() */
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/device.h>
#include <linux/eisa.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/bitops.h> #include <asm/bitops.h>
...@@ -170,6 +174,9 @@ struct el3_private { ...@@ -170,6 +174,9 @@ struct el3_private {
#ifdef __ISAPNP__ #ifdef __ISAPNP__
struct pnp_dev *pnpdev; struct pnp_dev *pnpdev;
#endif #endif
#ifdef CONFIG_EISA
struct eisa_device *edev;
#endif
}; };
static int id_port __initdata = 0x110; /* Start with 0x110 to avoid new sound cards.*/ static int id_port __initdata = 0x110; /* Start with 0x110 to avoid new sound cards.*/
static struct net_device *el3_root_dev; static struct net_device *el3_root_dev;
...@@ -194,6 +201,26 @@ static int el3_resume(struct pm_dev *pdev); ...@@ -194,6 +201,26 @@ static int el3_resume(struct pm_dev *pdev);
static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data); static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data);
#endif #endif
#ifdef CONFIG_EISA
struct eisa_device_id el3_eisa_ids[] = {
{ "TCM5092" },
{ "TCM5093" },
{ "" }
};
static int el3_eisa_probe (struct device *device);
static int el3_eisa_remove (struct device *device);
struct eisa_driver el3_eisa_driver = {
.id_table = el3_eisa_ids,
.driver = {
.name = "3c509",
.probe = el3_eisa_probe,
.remove = __devexit_p (el3_eisa_remove)
}
};
#endif
#ifdef CONFIG_MCA #ifdef CONFIG_MCA
struct el3_mca_adapters_struct { struct el3_mca_adapters_struct {
char* name; char* name;
...@@ -240,8 +267,97 @@ static u16 el3_isapnp_phys_addr[8][3]; ...@@ -240,8 +267,97 @@ static u16 el3_isapnp_phys_addr[8][3];
#endif /* __ISAPNP__ */ #endif /* __ISAPNP__ */
static int nopnp; static int nopnp;
int __init el3_probe(struct net_device *dev, int card_idx) /* With the driver model introduction for EISA devices, both init
* and cleanup have been split :
* - EISA devices probe/remove starts in el3_eisa_probe/el3_eisa_remove
* - MCA/ISA still use el3_probe
*
* Both call el3_common_init/el3_common_remove. */
static int __init el3_common_init (struct net_device *dev)
{
struct el3_private *lp = dev->priv;
short i;
#ifdef CONFIG_EISA
if (!lp->edev) /* EISA devices are not chained */
#endif
{
lp->next_dev = el3_root_dev;
el3_root_dev = dev;
}
spin_lock_init(&lp->lock);
if (dev->mem_start & 0x05) { /* xcvr codes 1/3/4/12 */
dev->if_port = (dev->mem_start & 0x0f);
} else { /* xcvr codes 0/8 */
/* use eeprom value, but save user's full-duplex selection */
dev->if_port |= (dev->mem_start & 0x08);
}
{
const char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
printk("%s: 3c5x9 at %#3.3lx, %s port, address ",
dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)]);
}
/* Read in the station address. */
for (i = 0; i < 6; i++)
printk(" %2.2x", dev->dev_addr[i]);
printk(", IRQ %d.\n", dev->irq);
if (el3_debug > 0)
printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB);
/* The EL3-specific entries in the device structure. */
dev->open = &el3_open;
dev->hard_start_xmit = &el3_start_xmit;
dev->stop = &el3_close;
dev->get_stats = &el3_get_stats;
dev->set_multicast_list = &set_multicast_list;
dev->tx_timeout = el3_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT;
dev->do_ioctl = netdev_ioctl;
#ifdef CONFIG_PM
/* register power management */
lp->pmdev = pm_register(PM_ISA_DEV, card_idx, el3_pm_callback);
if (lp->pmdev) {
struct pm_dev *p;
p = lp->pmdev;
p->data = (struct net_device *)dev;
}
#endif
return 0;
}
static void el3_common_remove (struct net_device *dev)
{
struct el3_private *lp = dev->priv;
(void) lp; /* Keep gcc quiet... */
#ifdef CONFIG_MCA
if(lp->mca_slot!=-1)
mca_mark_as_unused(lp->mca_slot);
#endif
#ifdef CONFIG_PM
if (lp->pmdev)
pm_unregister(lp->pmdev);
#endif
#ifdef __ISAPNP__
if (lp->pnpdev)
pnp_device_detach(lp->pnpdev);
#endif
unregister_netdev (dev);
release_region(dev->base_addr, EL3_IO_EXTENT);
kfree (dev);
}
static int __init el3_probe(int card_idx)
{ {
struct net_device *dev;
struct el3_private *lp; struct el3_private *lp;
short lrs_state = 0xff, i; short lrs_state = 0xff, i;
int ioaddr, irq, if_port; int ioaddr, irq, if_port;
...@@ -253,44 +369,6 @@ int __init el3_probe(struct net_device *dev, int card_idx) ...@@ -253,44 +369,6 @@ int __init el3_probe(struct net_device *dev, int card_idx)
struct pnp_dev *idev = NULL; struct pnp_dev *idev = NULL;
#endif /* __ISAPNP__ */ #endif /* __ISAPNP__ */
if (dev) SET_MODULE_OWNER(dev);
/* First check all slots of the EISA bus. The next slot address to
probe is kept in 'eisa_addr' to support multiple probe() calls. */
if (EISA_bus) {
static int eisa_addr = 0x1000;
while (eisa_addr < 0x9000) {
int device_id;
ioaddr = eisa_addr;
eisa_addr += 0x1000;
/* Check the standard EISA ID register for an encoded '3Com'. */
if (inw(ioaddr + 0xC80) != 0x6d50)
continue;
/* Avoid conflict with 3c590, 3c592, 3c597, etc */
device_id = (inb(ioaddr + 0xC82)<<8) + inb(ioaddr + 0xC83);
if ((device_id & 0xFF00) == 0x5900) {
continue;
}
/* Change the register set to the configuration window 0. */
outw(SelectWindow | 0, ioaddr + 0xC80 + EL3_CMD);
irq = inw(ioaddr + WN0_IRQ) >> 12;
if_port = inw(ioaddr + 6)>>14;
for (i = 0; i < 3; i++)
phys_addr[i] = htons(read_eeprom(ioaddr, i));
/* Restore the "Product ID" to the EEPROM read register. */
read_eeprom(ioaddr, 3);
/* Was the EISA code an add-on hack? Nahhhhh... */
goto found;
}
}
#ifdef CONFIG_MCA #ifdef CONFIG_MCA
/* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, heavily /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, heavily
* modified by Chris Beauregard (cpbeaure@csclub.uwaterloo.ca) * modified by Chris Beauregard (cpbeaure@csclub.uwaterloo.ca)
...@@ -469,6 +547,8 @@ int __init el3_probe(struct net_device *dev, int card_idx) ...@@ -469,6 +547,8 @@ int __init el3_probe(struct net_device *dev, int card_idx)
} }
irq = id_read_eeprom(9) >> 12; irq = id_read_eeprom(9) >> 12;
#if 0 /* Huh ?
Can someone explain what is this for ? */
if (dev) { /* Set passed-in IRQ or I/O Addr. */ if (dev) { /* Set passed-in IRQ or I/O Addr. */
if (dev->irq > 1 && dev->irq < 16) if (dev->irq > 1 && dev->irq < 16)
irq = dev->irq; irq = dev->irq;
...@@ -481,6 +561,7 @@ int __init el3_probe(struct net_device *dev, int card_idx) ...@@ -481,6 +561,7 @@ int __init el3_probe(struct net_device *dev, int card_idx)
return -ENODEV; return -ENODEV;
} }
} }
#endif
if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509")) if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509"))
return -EBUSY; return -EBUSY;
...@@ -500,79 +581,86 @@ int __init el3_probe(struct net_device *dev, int card_idx) ...@@ -500,79 +581,86 @@ int __init el3_probe(struct net_device *dev, int card_idx)
/* Free the interrupt so that some other card can use it. */ /* Free the interrupt so that some other card can use it. */
outw(0x0f00, ioaddr + WN0_IRQ); outw(0x0f00, ioaddr + WN0_IRQ);
found: found:
dev = init_etherdev(NULL, sizeof(struct el3_private));
if (dev == NULL) { if (dev == NULL) {
dev = init_etherdev(dev, sizeof(struct el3_private)); release_region(ioaddr, EL3_IO_EXTENT);
if (dev == NULL) { return -ENOMEM;
release_region(ioaddr, EL3_IO_EXTENT);
return -ENOMEM;
}
SET_MODULE_OWNER(dev);
} }
SET_MODULE_OWNER(dev);
memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr)); memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
dev->base_addr = ioaddr; dev->base_addr = ioaddr;
dev->irq = irq; dev->irq = irq;
dev->if_port = if_port;
if (dev->mem_start & 0x05) { /* xcvr codes 1/3/4/12 */
dev->if_port = (dev->mem_start & 0x0f);
} else { /* xcvr codes 0/8 */
/* use eeprom value, but save user's full-duplex selection */
dev->if_port = (if_port | (dev->mem_start & 0x08) );
}
{
const char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
printk("%s: 3c5x9 at %#3.3lx, %s port, address ",
dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)]);
}
/* Read in the station address. */
for (i = 0; i < 6; i++)
printk(" %2.2x", dev->dev_addr[i]);
printk(", IRQ %d.\n", dev->irq);
/* Make up a EL3-specific-data structure. */
if (dev->priv == NULL)
dev->priv = kmalloc(sizeof(struct el3_private), GFP_KERNEL);
if (dev->priv == NULL)
return -ENOMEM;
memset(dev->priv, 0, sizeof(struct el3_private));
lp = dev->priv; lp = dev->priv;
#ifdef __ISAPNP__ #ifdef __ISAPNP__
lp->pnpdev = idev; lp->pnpdev = idev;
#endif #endif
lp->mca_slot = mca_slot; lp->mca_slot = mca_slot;
lp->next_dev = el3_root_dev;
spin_lock_init(&lp->lock);
el3_root_dev = dev;
if (el3_debug > 0) return el3_common_init (dev);
printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB); }
/* The EL3-specific entries in the device structure. */ #ifdef CONFIG_EISA
dev->open = &el3_open; static int __init el3_eisa_probe (struct device *device)
dev->hard_start_xmit = &el3_start_xmit; {
dev->stop = &el3_close; struct el3_private *lp;
dev->get_stats = &el3_get_stats; short i;
dev->set_multicast_list = &set_multicast_list; int ioaddr, irq, if_port;
dev->tx_timeout = el3_tx_timeout; u16 phys_addr[3];
dev->watchdog_timeo = TX_TIMEOUT; struct net_device *dev = NULL;
dev->do_ioctl = netdev_ioctl; struct eisa_device *edev;
#ifdef CONFIG_PM /* Yeepee, The driver framework is calling us ! */
/* register power management */ edev = to_eisa_device (device);
lp->pmdev = pm_register(PM_ISA_DEV, card_idx, el3_pm_callback); ioaddr = edev->base_addr;
if (lp->pmdev) {
struct pm_dev *p; if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509"))
p = lp->pmdev; return -EBUSY;
p->data = (struct net_device *)dev;
/* Change the register set to the configuration window 0. */
outw(SelectWindow | 0, ioaddr + 0xC80 + EL3_CMD);
irq = inw(ioaddr + WN0_IRQ) >> 12;
if_port = inw(ioaddr + 6)>>14;
for (i = 0; i < 3; i++)
phys_addr[i] = htons(read_eeprom(ioaddr, i));
/* Restore the "Product ID" to the EEPROM read register. */
read_eeprom(ioaddr, 3);
dev = init_etherdev(NULL, sizeof(struct el3_private));
if (dev == NULL) {
release_region(ioaddr, EL3_IO_EXTENT);
return -ENOMEM;
} }
#endif
/* Fill in the generic fields of the device structure. */ SET_MODULE_OWNER(dev);
ether_setup(dev);
return 0; memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
dev->base_addr = ioaddr;
dev->irq = irq;
dev->if_port = if_port;
lp = dev->priv;
lp->mca_slot = -1;
lp->edev = edev;
eisa_set_drvdata (edev, dev);
return el3_common_init (dev);
}
static int __devexit el3_eisa_remove (struct device *device)
{
struct eisa_device *edev;
struct net_device *dev;
edev = to_eisa_device (device);
dev = eisa_get_drvdata (edev);
el3_common_remove (dev);
return 0;
} }
#endif
/* Read a word from the EEPROM using the regular EEPROM access register. /* Read a word from the EEPROM using the regular EEPROM access register.
Assume that we are in register window zero. Assume that we are in register window zero.
...@@ -982,7 +1070,8 @@ static int ...@@ -982,7 +1070,8 @@ static int
el3_close(struct net_device *dev) el3_close(struct net_device *dev)
{ {
int ioaddr = dev->base_addr; int ioaddr = dev->base_addr;
struct el3_private *lp = (struct el3_private *)dev->priv;
if (el3_debug > 2) if (el3_debug > 2)
printk("%s: Shutting down ethercard.\n", dev->name); printk("%s: Shutting down ethercard.\n", dev->name);
...@@ -991,8 +1080,12 @@ el3_close(struct net_device *dev) ...@@ -991,8 +1080,12 @@ el3_close(struct net_device *dev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
/* Switching back to window 0 disables the IRQ. */ /* Switching back to window 0 disables the IRQ. */
EL3WINDOW(0); EL3WINDOW(0);
/* But we explicitly zero the IRQ line select anyway. */ if (!lp->edev) {
outw(0x0f00, ioaddr + WN0_IRQ); /* But we explicitly zero the IRQ line select anyway. Don't do
* it on EISA cards, it prevents the module from getting an
* IRQ after unload+reload... */
outw(0x0f00, ioaddr + WN0_IRQ);
}
return 0; return 0;
} }
...@@ -1414,7 +1507,6 @@ el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data) ...@@ -1414,7 +1507,6 @@ el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data)
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
#ifdef MODULE
/* Parameters that may be passed into the module. */ /* Parameters that may be passed into the module. */
static int debug = -1; static int debug = -1;
static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1}; static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
...@@ -1436,8 +1528,7 @@ MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters); ...@@ -1436,8 +1528,7 @@ MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters);
MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B) ISA/PnP ethernet driver"); MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B) ISA/PnP ethernet driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
int static int __init el3_init_module(void)
init_module(void)
{ {
int el3_cards = 0; int el3_cards = 0;
...@@ -1445,7 +1536,7 @@ init_module(void) ...@@ -1445,7 +1536,7 @@ init_module(void)
el3_debug = debug; el3_debug = debug;
el3_root_dev = NULL; el3_root_dev = NULL;
while (el3_probe(0, el3_cards) == 0) { while (el3_probe(el3_cards) == 0) {
if (irq[el3_cards] > 1) if (irq[el3_cards] > 1)
el3_root_dev->irq = irq[el3_cards]; el3_root_dev->irq = irq[el3_cards];
if (xcvr[el3_cards] >= 0) if (xcvr[el3_cards] >= 0)
...@@ -1453,38 +1544,36 @@ init_module(void) ...@@ -1453,38 +1544,36 @@ init_module(void)
el3_cards++; el3_cards++;
} }
#ifdef CONFIG_EISA
if (eisa_driver_register (&el3_eisa_driver) < 0) {
eisa_driver_unregister (&el3_eisa_driver);
}
else
el3_cards++; /* Found an eisa card */
#endif
return el3_cards ? 0 : -ENODEV; return el3_cards ? 0 : -ENODEV;
} }
void static void __exit el3_cleanup_module(void)
cleanup_module(void)
{ {
struct net_device *next_dev; struct net_device *next_dev;
/* No need to check MOD_IN_USE, as sys_delete_module() checks. */ /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
while (el3_root_dev) { while (el3_root_dev) {
struct el3_private *lp = (struct el3_private *)el3_root_dev->priv; struct el3_private *lp = (struct el3_private *)el3_root_dev->priv;
#ifdef CONFIG_MCA
if(lp->mca_slot!=-1)
mca_mark_as_unused(lp->mca_slot);
#endif
#ifdef CONFIG_PM
if (lp->pmdev)
pm_unregister(lp->pmdev);
#endif
next_dev = lp->next_dev; next_dev = lp->next_dev;
unregister_netdev(el3_root_dev); el3_common_remove (el3_root_dev);
release_region(el3_root_dev->base_addr, EL3_IO_EXTENT);
#ifdef __ISAPNP__
if (lp->pnpdev)
pnp_device_detach(lp->pnpdev);
#endif
kfree(el3_root_dev);
el3_root_dev = next_dev; el3_root_dev = next_dev;
} }
#ifdef CONFIG_EISA
eisa_driver_unregister (&el3_eisa_driver);
#endif
} }
#endif /* MODULE */
module_init (el3_init_module);
module_exit (el3_cleanup_module);
/* /*
* Local variables: * Local variables:
......
...@@ -180,6 +180,9 @@ ...@@ -180,6 +180,9 @@
- See http://www.zip.com.au/~akpm/linux/#3c59x-2.3 for more details. - See http://www.zip.com.au/~akpm/linux/#3c59x-2.3 for more details.
- Also see Documentation/networking/vortex.txt - Also see Documentation/networking/vortex.txt
LK1.1.19 10Nov09 Marc Zyngier <maz@wild-wind.fr.eu.org>
- EISA sysfs integration.
*/ */
/* /*
...@@ -193,8 +196,8 @@ ...@@ -193,8 +196,8 @@
#define DRV_NAME "3c59x" #define DRV_NAME "3c59x"
#define DRV_VERSION "LK1.1.18" #define DRV_VERSION "LK1.1.19"
#define DRV_RELDATE "1 Jul 2002" #define DRV_RELDATE "10 Nov 2002"
...@@ -259,7 +262,7 @@ static int vortex_debug = 1; ...@@ -259,7 +262,7 @@ static int vortex_debug = 1;
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/eisa.h>
#include <asm/irq.h> /* For NR_IRQS only. */ #include <asm/irq.h> /* For NR_IRQS only. */
#include <asm/bitops.h> #include <asm/bitops.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -768,7 +771,6 @@ struct vortex_private { ...@@ -768,7 +771,6 @@ struct vortex_private {
/* The addresses of transmit- and receive-in-place skbuffs. */ /* The addresses of transmit- and receive-in-place skbuffs. */
struct sk_buff* rx_skbuff[RX_RING_SIZE]; struct sk_buff* rx_skbuff[RX_RING_SIZE];
struct sk_buff* tx_skbuff[TX_RING_SIZE]; struct sk_buff* tx_skbuff[TX_RING_SIZE];
struct net_device *next_module; /* NULL if PCI device */
unsigned int cur_rx, cur_tx; /* The next free ring entry */ unsigned int cur_rx, cur_tx; /* The next free ring entry */
unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
struct net_device_stats stats; struct net_device_stats stats;
...@@ -776,7 +778,7 @@ struct vortex_private { ...@@ -776,7 +778,7 @@ struct vortex_private {
dma_addr_t tx_skb_dma; /* Allocated DMA address for bus master ctrl DMA. */ dma_addr_t tx_skb_dma; /* Allocated DMA address for bus master ctrl DMA. */
/* PCI configuration space information. */ /* PCI configuration space information. */
struct pci_dev *pdev; struct device *gendev;
char *cb_fn_base; /* CardBus function status addr space. */ char *cb_fn_base; /* CardBus function status addr space. */
/* Some values here only for performance evaluation and path-coverage */ /* Some values here only for performance evaluation and path-coverage */
...@@ -815,6 +817,18 @@ struct vortex_private { ...@@ -815,6 +817,18 @@ struct vortex_private {
u32 power_state[16]; u32 power_state[16];
}; };
#define DEVICE_PCI(dev) (((dev)->bus == &pci_bus_type) ? to_pci_dev((dev)) : NULL)
#define VORTEX_PCI(vp) (((vp)->gendev) ? DEVICE_PCI((vp)->gendev) : NULL)
#ifdef CONFIG_EISA
#define DEVICE_EISA(dev) (((dev)->bus == &eisa_bus_type) ? to_eisa_device((dev)) : NULL)
#else
#define DEVICE_EISA(dev) NULL
#endif
#define VORTEX_EISA(vp) (((vp)->gendev) ? DEVICE_EISA((vp)->gendev) : NULL)
/* The action to take with a media selection timer tick. /* The action to take with a media selection timer tick.
Note that we deviate from the 3Com order by checking 10base2 before AUI. Note that we deviate from the 3Com order by checking 10base2 before AUI.
*/ */
...@@ -843,7 +857,7 @@ static struct media_table { ...@@ -843,7 +857,7 @@ static struct media_table {
{ "Default", 0, 0xFF, XCVR_10baseT, 10000}, { "Default", 0, 0xFF, XCVR_10baseT, 10000},
}; };
static int vortex_probe1(struct pci_dev *pdev, long ioaddr, int irq, static int vortex_probe1(struct device *gendev, long ioaddr, int irq,
int chip_idx, int card_idx); int chip_idx, int card_idx);
static void vortex_up(struct net_device *dev); static void vortex_up(struct net_device *dev);
static void vortex_down(struct net_device *dev); static void vortex_down(struct net_device *dev);
...@@ -882,11 +896,9 @@ static int global_enable_wol = -1; ...@@ -882,11 +896,9 @@ static int global_enable_wol = -1;
/* #define dev_alloc_skb dev_alloc_skb_debug */ /* #define dev_alloc_skb dev_alloc_skb_debug */
/* A list of all installed Vortex EISA devices, for removing the driver module. */
static struct net_device *root_vortex_eisa_dev;
/* Variables to work-around the Compaq PCI BIOS32 problem. */ /* Variables to work-around the Compaq PCI BIOS32 problem. */
static int compaq_ioaddr, compaq_irq, compaq_device_id = 0x5900; static int compaq_ioaddr, compaq_irq, compaq_device_id = 0x5900;
static struct net_device *compaq_net_device;
static int vortex_cards_found; static int vortex_cards_found;
...@@ -920,44 +932,89 @@ static int vortex_resume (struct pci_dev *pdev) ...@@ -920,44 +932,89 @@ static int vortex_resume (struct pci_dev *pdev)
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
/* returns count found (>= 0), or negative on error */ #ifdef CONFIG_EISA
static int __init vortex_eisa_init (void) static struct eisa_device_id vortex_eisa_ids[] = {
{ "TCM5920" },
{ "TCM5970" },
{ "" }
};
static int vortex_eisa_probe (struct device *device);
static int vortex_eisa_remove (struct device *device);
static struct eisa_driver vortex_eisa_driver = {
.id_table = vortex_eisa_ids,
.driver = {
.name = "3c59x",
.probe = vortex_eisa_probe,
.remove = vortex_eisa_remove
}
};
static int vortex_eisa_probe (struct device *device)
{ {
long ioaddr; long ioaddr;
int rc; struct eisa_device *edev;
int orig_cards_found = vortex_cards_found;
/* Now check all slots of the EISA bus. */ edev = to_eisa_device (device);
if (!EISA_bus) ioaddr = edev->base_addr;
return 0;
for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) { if (!request_region(ioaddr, VORTEX_TOTAL_SIZE, DRV_NAME))
int device_id; return -EBUSY;
if (request_region(ioaddr, VORTEX_TOTAL_SIZE, DRV_NAME) == NULL) if (vortex_probe1(device, ioaddr, inw(ioaddr + 0xC88) >> 12,
continue; EISA_TBL_OFFSET, vortex_cards_found)) {
release_region (ioaddr, VORTEX_TOTAL_SIZE);
return -ENODEV;
}
/* Check the standard EISA ID register for an encoded '3Com'. */ vortex_cards_found++;
if (inw(ioaddr + 0xC80) != 0x6d50) {
release_region (ioaddr, VORTEX_TOTAL_SIZE);
continue;
}
/* Check for a product that we support, 3c59{2,7} any rev. */ return 0;
device_id = (inb(ioaddr + 0xC82)<<8) + inb(ioaddr + 0xC83); }
if ((device_id & 0xFF00) != 0x5900) {
release_region (ioaddr, VORTEX_TOTAL_SIZE);
continue;
}
rc = vortex_probe1(NULL, ioaddr, inw(ioaddr + 0xC88) >> 12, static int vortex_eisa_remove (struct device *device)
EISA_TBL_OFFSET, vortex_cards_found); {
if (rc == 0) struct eisa_device *edev;
vortex_cards_found++; struct net_device *dev;
else struct vortex_private *vp;
release_region (ioaddr, VORTEX_TOTAL_SIZE); long ioaddr;
edev = to_eisa_device (device);
dev = eisa_get_drvdata (edev);
if (!dev) {
printk("vortex_eisa_remove called for Compaq device!\n");
BUG();
} }
vp = dev->priv;
ioaddr = dev->base_addr;
unregister_netdev (dev);
outw (TotalReset|0x14, ioaddr + EL3_CMD);
release_region (ioaddr, VORTEX_TOTAL_SIZE);
kfree (dev);
return 0;
}
#endif
/* returns count found (>= 0), or negative on error */
static int __init vortex_eisa_init (void)
{
int orig_cards_found = vortex_cards_found;
/* Now check all slots of the EISA bus. */
if (!EISA_bus)
return 0;
#ifdef CONFIG_EISA
if (eisa_driver_register (&vortex_eisa_driver) < 0) {
eisa_driver_unregister (&vortex_eisa_driver);
}
#endif
/* Special code to work-around the Compaq PCI BIOS32 problem. */ /* Special code to work-around the Compaq PCI BIOS32 problem. */
if (compaq_ioaddr) { if (compaq_ioaddr) {
vortex_probe1(NULL, compaq_ioaddr, compaq_irq, vortex_probe1(NULL, compaq_ioaddr, compaq_irq,
...@@ -977,8 +1034,8 @@ static int __devinit vortex_init_one (struct pci_dev *pdev, ...@@ -977,8 +1034,8 @@ static int __devinit vortex_init_one (struct pci_dev *pdev,
if (pci_enable_device (pdev)) { if (pci_enable_device (pdev)) {
rc = -EIO; rc = -EIO;
} else { } else {
rc = vortex_probe1 (pdev, pci_resource_start (pdev, 0), pdev->irq, rc = vortex_probe1 (&pdev->dev, pci_resource_start (pdev, 0),
ent->driver_data, vortex_cards_found); pdev->irq, ent->driver_data, vortex_cards_found);
if (rc == 0) if (rc == 0)
vortex_cards_found++; vortex_cards_found++;
} }
...@@ -986,12 +1043,12 @@ static int __devinit vortex_init_one (struct pci_dev *pdev, ...@@ -986,12 +1043,12 @@ static int __devinit vortex_init_one (struct pci_dev *pdev,
} }
/* /*
* Start up the PCI device which is described by *pdev. * Start up the PCI/EISA device which is described by *gendev.
* Return 0 on success. * Return 0 on success.
* *
* NOTE: pdev can be NULL, for the case of an EISA driver * NOTE: pdev can be NULL, for the case of a Compaq device
*/ */
static int __devinit vortex_probe1(struct pci_dev *pdev, static int __devinit vortex_probe1(struct device *gendev,
long ioaddr, int irq, long ioaddr, int irq,
int chip_idx, int card_idx) int chip_idx, int card_idx)
{ {
...@@ -1003,14 +1060,24 @@ static int __devinit vortex_probe1(struct pci_dev *pdev, ...@@ -1003,14 +1060,24 @@ static int __devinit vortex_probe1(struct pci_dev *pdev,
static int printed_version; static int printed_version;
int retval, print_info; int retval, print_info;
struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx]; struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx];
char *print_name; char *print_name = "3c59x";
struct pci_dev *pdev = NULL;
struct eisa_device *edev = NULL;
if (!printed_version) { if (!printed_version) {
printk (version); printk (version);
printed_version = 1; printed_version = 1;
} }
print_name = pdev ? pdev->slot_name : "3c59x"; if (gendev) {
if ((pdev = DEVICE_PCI(gendev))) {
print_name = pdev->slot_name;
}
if ((edev = DEVICE_EISA(gendev))) {
print_name = edev->dev.bus_id;
}
}
dev = alloc_etherdev(sizeof(*vp)); dev = alloc_etherdev(sizeof(*vp));
retval = -ENOMEM; retval = -ENOMEM;
...@@ -1063,10 +1130,9 @@ static int __devinit vortex_probe1(struct pci_dev *pdev, ...@@ -1063,10 +1130,9 @@ static int __devinit vortex_probe1(struct pci_dev *pdev,
vp->io_size = vci->io_size; vp->io_size = vci->io_size;
vp->card_idx = card_idx; vp->card_idx = card_idx;
/* module list only for EISA devices */ /* module list only for Compaq device */
if (pdev == NULL) { if (gendev == NULL) {
vp->next_module = root_vortex_eisa_dev; compaq_net_device = dev;
root_vortex_eisa_dev = dev;
} }
/* PCI-only startup logic */ /* PCI-only startup logic */
...@@ -1100,7 +1166,7 @@ static int __devinit vortex_probe1(struct pci_dev *pdev, ...@@ -1100,7 +1166,7 @@ static int __devinit vortex_probe1(struct pci_dev *pdev,
spin_lock_init(&vp->lock); spin_lock_init(&vp->lock);
spin_lock_init(&vp->mdio_lock); spin_lock_init(&vp->mdio_lock);
vp->pdev = pdev; vp->gendev = gendev;
/* Makes sure rings are at least 16 byte aligned. */ /* Makes sure rings are at least 16 byte aligned. */
vp->rx_ring = pci_alloc_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE vp->rx_ring = pci_alloc_consistent(pdev, sizeof(struct boom_rx_desc) * RX_RING_SIZE
...@@ -1117,6 +1183,8 @@ static int __devinit vortex_probe1(struct pci_dev *pdev, ...@@ -1117,6 +1183,8 @@ static int __devinit vortex_probe1(struct pci_dev *pdev,
* instead of a module list */ * instead of a module list */
if (pdev) if (pdev)
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
if (edev)
eisa_set_drvdata (edev, dev);
vp->media_override = 7; vp->media_override = 7;
if (option >= 0) { if (option >= 0) {
...@@ -1367,7 +1435,7 @@ static int __devinit vortex_probe1(struct pci_dev *pdev, ...@@ -1367,7 +1435,7 @@ static int __devinit vortex_probe1(struct pci_dev *pdev,
dev->watchdog_timeo = (watchdog * HZ) / 1000; dev->watchdog_timeo = (watchdog * HZ) / 1000;
if (pdev && vp->enable_wol) { if (pdev && vp->enable_wol) {
vp->pm_state_valid = 1; vp->pm_state_valid = 1;
pci_save_state(vp->pdev, vp->power_state); pci_save_state(VORTEX_PCI(vp), vp->power_state);
acpi_set_WOL(dev); acpi_set_WOL(dev);
} }
retval = register_netdev(dev); retval = register_netdev(dev);
...@@ -1422,9 +1490,9 @@ vortex_up(struct net_device *dev) ...@@ -1422,9 +1490,9 @@ vortex_up(struct net_device *dev)
unsigned int config; unsigned int config;
int i; int i;
if (vp->pdev && vp->enable_wol) { if (VORTEX_PCI(vp) && vp->enable_wol) {
pci_set_power_state(vp->pdev, 0); /* Go active */ pci_set_power_state(VORTEX_PCI(vp), 0); /* Go active */
pci_restore_state(vp->pdev, vp->power_state); pci_restore_state(VORTEX_PCI(vp), vp->power_state);
} }
/* Before initializing select the active media port. */ /* Before initializing select the active media port. */
...@@ -1641,7 +1709,7 @@ vortex_open(struct net_device *dev) ...@@ -1641,7 +1709,7 @@ vortex_open(struct net_device *dev)
break; /* Bad news! */ break; /* Bad news! */
skb->dev = dev; /* Mark as being used by this device. */ skb->dev = dev; /* Mark as being used by this device. */
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->tail, PKT_BUF_SZ, PCI_DMA_FROMDEVICE)); vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->tail, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
} }
if (i != RX_RING_SIZE) { if (i != RX_RING_SIZE) {
int j; int j;
...@@ -1978,7 +2046,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1978,7 +2046,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (vp->bus_master) { if (vp->bus_master) {
/* Set the bus-master controller to transfer the packet. */ /* Set the bus-master controller to transfer the packet. */
int len = (skb->len + 3) & ~3; int len = (skb->len + 3) & ~3;
outl( vp->tx_skb_dma = pci_map_single(vp->pdev, skb->data, len, PCI_DMA_TODEVICE), outl( vp->tx_skb_dma = pci_map_single(VORTEX_PCI(vp), skb->data, len, PCI_DMA_TODEVICE),
ioaddr + Wn7_MasterAddr); ioaddr + Wn7_MasterAddr);
outw(len, ioaddr + Wn7_MasterLen); outw(len, ioaddr + Wn7_MasterLen);
vp->tx_skb = skb; vp->tx_skb = skb;
...@@ -2057,13 +2125,13 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2057,13 +2125,13 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum); vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum);
if (!skb_shinfo(skb)->nr_frags) { if (!skb_shinfo(skb)->nr_frags) {
vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data,
skb->len, PCI_DMA_TODEVICE)); skb->len, PCI_DMA_TODEVICE));
vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len | LAST_FRAG); vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len | LAST_FRAG);
} else { } else {
int i; int i;
vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data,
skb->len-skb->data_len, PCI_DMA_TODEVICE)); skb->len-skb->data_len, PCI_DMA_TODEVICE));
vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len-skb->data_len); vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len-skb->data_len);
...@@ -2071,7 +2139,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2071,7 +2139,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
vp->tx_ring[entry].frag[i+1].addr = vp->tx_ring[entry].frag[i+1].addr =
cpu_to_le32(pci_map_single(vp->pdev, cpu_to_le32(pci_map_single(VORTEX_PCI(vp),
(void*)page_address(frag->page) + frag->page_offset, (void*)page_address(frag->page) + frag->page_offset,
frag->size, PCI_DMA_TODEVICE)); frag->size, PCI_DMA_TODEVICE));
...@@ -2082,7 +2150,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2082,7 +2150,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
} }
} }
#else #else
vp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, skb->len, PCI_DMA_TODEVICE)); vp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE));
vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG); vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG);
vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded);
#endif #endif
...@@ -2170,7 +2238,7 @@ static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -2170,7 +2238,7 @@ static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (status & DMADone) { if (status & DMADone) {
if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) { if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) {
outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
pci_unmap_single(vp->pdev, vp->tx_skb_dma, (vp->tx_skb->len + 3) & ~3, PCI_DMA_TODEVICE); pci_unmap_single(VORTEX_PCI(vp), vp->tx_skb_dma, (vp->tx_skb->len + 3) & ~3, PCI_DMA_TODEVICE);
dev_kfree_skb_irq(vp->tx_skb); /* Release the transferred buffer */ dev_kfree_skb_irq(vp->tx_skb); /* Release the transferred buffer */
if (inw(ioaddr + TxFree) > 1536) { if (inw(ioaddr + TxFree) > 1536) {
/* /*
...@@ -2291,12 +2359,12 @@ static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -2291,12 +2359,12 @@ static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if DO_ZEROCOPY #if DO_ZEROCOPY
int i; int i;
for (i=0; i<=skb_shinfo(skb)->nr_frags; i++) for (i=0; i<=skb_shinfo(skb)->nr_frags; i++)
pci_unmap_single(vp->pdev, pci_unmap_single(VORTEX_PCI(vp),
le32_to_cpu(vp->tx_ring[entry].frag[i].addr), le32_to_cpu(vp->tx_ring[entry].frag[i].addr),
le32_to_cpu(vp->tx_ring[entry].frag[i].length)&0xFFF, le32_to_cpu(vp->tx_ring[entry].frag[i].length)&0xFFF,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
#else #else
pci_unmap_single(vp->pdev, pci_unmap_single(VORTEX_PCI(vp),
le32_to_cpu(vp->tx_ring[entry].addr), skb->len, PCI_DMA_TODEVICE); le32_to_cpu(vp->tx_ring[entry].addr), skb->len, PCI_DMA_TODEVICE);
#endif #endif
dev_kfree_skb_irq(skb); dev_kfree_skb_irq(skb);
...@@ -2383,14 +2451,14 @@ static int vortex_rx(struct net_device *dev) ...@@ -2383,14 +2451,14 @@ static int vortex_rx(struct net_device *dev)
/* 'skb_put()' points to the start of sk_buff data area. */ /* 'skb_put()' points to the start of sk_buff data area. */
if (vp->bus_master && if (vp->bus_master &&
! (inw(ioaddr + Wn7_MasterStatus) & 0x8000)) { ! (inw(ioaddr + Wn7_MasterStatus) & 0x8000)) {
dma_addr_t dma = pci_map_single(vp->pdev, skb_put(skb, pkt_len), dma_addr_t dma = pci_map_single(VORTEX_PCI(vp), skb_put(skb, pkt_len),
pkt_len, PCI_DMA_FROMDEVICE); pkt_len, PCI_DMA_FROMDEVICE);
outl(dma, ioaddr + Wn7_MasterAddr); outl(dma, ioaddr + Wn7_MasterAddr);
outw((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen); outw((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
outw(StartDMAUp, ioaddr + EL3_CMD); outw(StartDMAUp, ioaddr + EL3_CMD);
while (inw(ioaddr + Wn7_MasterStatus) & 0x8000) while (inw(ioaddr + Wn7_MasterStatus) & 0x8000)
; ;
pci_unmap_single(vp->pdev, dma, pkt_len, PCI_DMA_FROMDEVICE); pci_unmap_single(VORTEX_PCI(vp), dma, pkt_len, PCI_DMA_FROMDEVICE);
} else { } else {
insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len), insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
(pkt_len + 3) >> 2); (pkt_len + 3) >> 2);
...@@ -2456,7 +2524,7 @@ boomerang_rx(struct net_device *dev) ...@@ -2456,7 +2524,7 @@ boomerang_rx(struct net_device *dev)
if (pkt_len < rx_copybreak && (skb = dev_alloc_skb(pkt_len + 2)) != 0) { if (pkt_len < rx_copybreak && (skb = dev_alloc_skb(pkt_len + 2)) != 0) {
skb->dev = dev; skb->dev = dev;
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
pci_dma_sync_single(vp->pdev, dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE); pci_dma_sync_single(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
/* 'skb_put()' points to the start of sk_buff data area. */ /* 'skb_put()' points to the start of sk_buff data area. */
memcpy(skb_put(skb, pkt_len), memcpy(skb_put(skb, pkt_len),
vp->rx_skbuff[entry]->tail, vp->rx_skbuff[entry]->tail,
...@@ -2467,7 +2535,7 @@ boomerang_rx(struct net_device *dev) ...@@ -2467,7 +2535,7 @@ boomerang_rx(struct net_device *dev)
skb = vp->rx_skbuff[entry]; skb = vp->rx_skbuff[entry];
vp->rx_skbuff[entry] = NULL; vp->rx_skbuff[entry] = NULL;
skb_put(skb, pkt_len); skb_put(skb, pkt_len);
pci_unmap_single(vp->pdev, dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE); pci_unmap_single(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
vp->rx_nocopy++; vp->rx_nocopy++;
} }
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
...@@ -2504,7 +2572,7 @@ boomerang_rx(struct net_device *dev) ...@@ -2504,7 +2572,7 @@ boomerang_rx(struct net_device *dev)
} }
skb->dev = dev; /* Mark as being used by this device. */ skb->dev = dev; /* Mark as being used by this device. */
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
vp->rx_ring[entry].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->tail, PKT_BUF_SZ, PCI_DMA_FROMDEVICE)); vp->rx_ring[entry].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->tail, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
vp->rx_skbuff[entry] = skb; vp->rx_skbuff[entry] = skb;
} }
vp->rx_ring[entry].status = 0; /* Clear complete bit. */ vp->rx_ring[entry].status = 0; /* Clear complete bit. */
...@@ -2563,8 +2631,8 @@ vortex_down(struct net_device *dev) ...@@ -2563,8 +2631,8 @@ vortex_down(struct net_device *dev)
if (vp->full_bus_master_tx) if (vp->full_bus_master_tx)
outl(0, ioaddr + DownListPtr); outl(0, ioaddr + DownListPtr);
if (vp->pdev && vp->enable_wol) { if (VORTEX_PCI(vp) && vp->enable_wol) {
pci_save_state(vp->pdev, vp->power_state); pci_save_state(VORTEX_PCI(vp), vp->power_state);
acpi_set_WOL(dev); acpi_set_WOL(dev);
} }
} }
...@@ -2600,7 +2668,7 @@ vortex_close(struct net_device *dev) ...@@ -2600,7 +2668,7 @@ vortex_close(struct net_device *dev)
if (vp->full_bus_master_rx) { /* Free Boomerang bus master Rx buffers. */ if (vp->full_bus_master_rx) { /* Free Boomerang bus master Rx buffers. */
for (i = 0; i < RX_RING_SIZE; i++) for (i = 0; i < RX_RING_SIZE; i++)
if (vp->rx_skbuff[i]) { if (vp->rx_skbuff[i]) {
pci_unmap_single( vp->pdev, le32_to_cpu(vp->rx_ring[i].addr), pci_unmap_single( VORTEX_PCI(vp), le32_to_cpu(vp->rx_ring[i].addr),
PKT_BUF_SZ, PCI_DMA_FROMDEVICE); PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
dev_kfree_skb(vp->rx_skbuff[i]); dev_kfree_skb(vp->rx_skbuff[i]);
vp->rx_skbuff[i] = 0; vp->rx_skbuff[i] = 0;
...@@ -2614,12 +2682,12 @@ vortex_close(struct net_device *dev) ...@@ -2614,12 +2682,12 @@ vortex_close(struct net_device *dev)
int k; int k;
for (k=0; k<=skb_shinfo(skb)->nr_frags; k++) for (k=0; k<=skb_shinfo(skb)->nr_frags; k++)
pci_unmap_single(vp->pdev, pci_unmap_single(VORTEX_PCI(vp),
le32_to_cpu(vp->tx_ring[i].frag[k].addr), le32_to_cpu(vp->tx_ring[i].frag[k].addr),
le32_to_cpu(vp->tx_ring[i].frag[k].length)&0xFFF, le32_to_cpu(vp->tx_ring[i].frag[k].length)&0xFFF,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
#else #else
pci_unmap_single(vp->pdev, le32_to_cpu(vp->tx_ring[i].addr), skb->len, PCI_DMA_TODEVICE); pci_unmap_single(VORTEX_PCI(vp), le32_to_cpu(vp->tx_ring[i].addr), skb->len, PCI_DMA_TODEVICE);
#endif #endif
dev_kfree_skb(skb); dev_kfree_skb(skb);
vp->tx_skbuff[i] = 0; vp->tx_skbuff[i] = 0;
...@@ -2738,11 +2806,15 @@ static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) ...@@ -2738,11 +2806,15 @@ static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr)
struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
strcpy(info.driver, DRV_NAME); strcpy(info.driver, DRV_NAME);
strcpy(info.version, DRV_VERSION); strcpy(info.version, DRV_VERSION);
if (vp->pdev) if (VORTEX_PCI(vp))
strcpy(info.bus_info, vp->pdev->slot_name); strcpy(info.bus_info, VORTEX_PCI(vp)->slot_name);
else else {
sprintf(info.bus_info, "EISA 0x%lx %d", if (VORTEX_EISA(vp))
dev->base_addr, dev->irq); sprintf (info.bus_info, vp->gendev->bus_id);
else
sprintf(info.bus_info, "EISA 0x%lx %d",
dev->base_addr, dev->irq);
}
if (copy_to_user(useraddr, &info, sizeof(info))) if (copy_to_user(useraddr, &info, sizeof(info)))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -2924,8 +2996,8 @@ static void acpi_set_WOL(struct net_device *dev) ...@@ -2924,8 +2996,8 @@ static void acpi_set_WOL(struct net_device *dev)
outw(RxEnable, ioaddr + EL3_CMD); outw(RxEnable, ioaddr + EL3_CMD);
/* Change the power state to D3; RxEnable doesn't take effect. */ /* Change the power state to D3; RxEnable doesn't take effect. */
pci_enable_wake(vp->pdev, 0, 1); pci_enable_wake(VORTEX_PCI(vp), 0, 1);
pci_set_power_state(vp->pdev, 3); pci_set_power_state(VORTEX_PCI(vp), 3);
} }
...@@ -2935,7 +3007,7 @@ static void __devexit vortex_remove_one (struct pci_dev *pdev) ...@@ -2935,7 +3007,7 @@ static void __devexit vortex_remove_one (struct pci_dev *pdev)
struct vortex_private *vp; struct vortex_private *vp;
if (!dev) { if (!dev) {
printk("vortex_remove_one called for EISA device!\n"); printk("vortex_remove_one called for Compaq device!\n");
BUG(); BUG();
} }
...@@ -2949,10 +3021,10 @@ static void __devexit vortex_remove_one (struct pci_dev *pdev) ...@@ -2949,10 +3021,10 @@ static void __devexit vortex_remove_one (struct pci_dev *pdev)
/* Should really use issue_and_wait() here */ /* Should really use issue_and_wait() here */
outw(TotalReset|0x14, dev->base_addr + EL3_CMD); outw(TotalReset|0x14, dev->base_addr + EL3_CMD);
if (vp->pdev && vp->enable_wol) { if (VORTEX_PCI(vp) && vp->enable_wol) {
pci_set_power_state(vp->pdev, 0); /* Go active */ pci_set_power_state(VORTEX_PCI(vp), 0); /* Go active */
if (vp->pm_state_valid) if (vp->pm_state_valid)
pci_restore_state(vp->pdev, vp->power_state); pci_restore_state(VORTEX_PCI(vp), vp->power_state);
} }
pci_free_consistent(pdev, pci_free_consistent(pdev,
...@@ -3000,24 +3072,23 @@ static int __init vortex_init (void) ...@@ -3000,24 +3072,23 @@ static int __init vortex_init (void)
static void __exit vortex_eisa_cleanup (void) static void __exit vortex_eisa_cleanup (void)
{ {
struct net_device *dev, *tmp;
struct vortex_private *vp; struct vortex_private *vp;
long ioaddr; long ioaddr;
dev = root_vortex_eisa_dev; #ifdef CONFIG_EISA
/* Take care of the EISA devices */
while (dev) { eisa_driver_unregister (&vortex_eisa_driver);
vp = dev->priv; #endif
ioaddr = dev->base_addr;
if (compaq_net_device) {
vp = compaq_net_device->priv;
ioaddr = compaq_net_device->base_addr;
unregister_netdev (dev); unregister_netdev (compaq_net_device);
outw (TotalReset, ioaddr + EL3_CMD); outw (TotalReset, ioaddr + EL3_CMD);
release_region (ioaddr, VORTEX_TOTAL_SIZE); release_region (ioaddr, VORTEX_TOTAL_SIZE);
tmp = dev; kfree (compaq_net_device);
dev = vp->next_module;
kfree (tmp);
} }
} }
......
...@@ -55,7 +55,6 @@ extern int hp_probe(struct net_device *dev); ...@@ -55,7 +55,6 @@ extern int hp_probe(struct net_device *dev);
extern int hp_plus_probe(struct net_device *dev); extern int hp_plus_probe(struct net_device *dev);
extern int express_probe(struct net_device *); extern int express_probe(struct net_device *);
extern int eepro_probe(struct net_device *); extern int eepro_probe(struct net_device *);
extern int el3_probe(struct net_device *);
extern int at1500_probe(struct net_device *); extern int at1500_probe(struct net_device *);
extern int at1700_probe(struct net_device *); extern int at1700_probe(struct net_device *);
extern int fmv18x_probe(struct net_device *); extern int fmv18x_probe(struct net_device *);
...@@ -210,9 +209,6 @@ static struct devprobe mca_probes[] __initdata = { ...@@ -210,9 +209,6 @@ static struct devprobe mca_probes[] __initdata = {
* look for EISA/PCI/MCA cards in addition to ISA cards). * look for EISA/PCI/MCA cards in addition to ISA cards).
*/ */
static struct devprobe isa_probes[] __initdata = { static struct devprobe isa_probes[] __initdata = {
#ifdef CONFIG_EL3 /* ISA, EISA, MCA 3c5x9 */
{el3_probe, 0},
#endif
#ifdef CONFIG_HP100 /* ISA, EISA & PCI */ #ifdef CONFIG_HP100 /* ISA, EISA & PCI */
{hp100_probe, 0}, {hp100_probe, 0},
#endif #endif
......
...@@ -54,6 +54,8 @@ config EISA ...@@ -54,6 +54,8 @@ config EISA
supports both the Mongoose & Wax EISA adapters. It is sadly supports both the Mongoose & Wax EISA adapters. It is sadly
incomplete and lacks support for card-to-host DMA. incomplete and lacks support for card-to-host DMA.
source "drivers/eisa/Kconfig"
config ISA config ISA
bool bool
depends on EISA depends on EISA
......
#ifndef _LINUX_EISA_H
#define _LINUX_EISA_H
#define EISA_SIG_LEN 8
#define EISA_MAX_SLOTS 8
/* A few EISA constants/offsets... */
#define EISA_DMA1_STATUS 8
#define EISA_INT1_CTRL 0x20
#define EISA_INT1_MASK 0x21
#define EISA_INT2_CTRL 0xA0
#define EISA_INT2_MASK 0xA1
#define EISA_DMA2_STATUS 0xD0
#define EISA_DMA2_WRITE_SINGLE 0xD4
#define EISA_EXT_NMI_RESET_CTRL 0x461
#define EISA_INT1_EDGE_LEVEL 0x4D0
#define EISA_INT2_EDGE_LEVEL 0x4D1
#define EISA_VENDOR_ID_OFFSET 0xC80
/* The EISA signature, in ASCII form, null terminated */
struct eisa_device_id {
char sig[EISA_SIG_LEN];
};
/* There is not much we can say about an EISA device, apart from
* signature, slot number, and base address */
struct eisa_device {
struct eisa_device_id id;
int slot;
unsigned long base_addr;
struct resource res;
struct device dev; /* generic device */
};
#define to_eisa_device(n) container_of(n, struct eisa_device, dev)
struct eisa_driver {
const struct eisa_device_id *id_table;
struct device_driver driver;
};
#define to_eisa_driver(drv) container_of(drv,struct eisa_driver, driver)
extern struct bus_type eisa_bus_type;
int eisa_driver_register (struct eisa_driver *edrv);
void eisa_driver_unregister (struct eisa_driver *edrv);
/* Mimics pci.h... */
static inline void *eisa_get_drvdata (struct eisa_device *edev)
{
return edev->dev.driver_data;
}
static inline void eisa_set_drvdata (struct eisa_device *edev, void *data)
{
edev->dev.driver_data = data;
}
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment