Subject: kern/1959: EISA autoconfiguration doesn't.
To: None <gnats-bugs@gnats.netbsd.org>
From: Chris G. Demetriou <cgd@NetBSD.ORG>
List: netbsd-bugs
Date: 01/18/1996 22:36:14
>Number:         1959
>Category:       kern
>Synopsis:       There is no EISA autoconf code.  EISA device config sucks now
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Thu Jan 18 23:05:02 1996
>Last-Modified:
>Originator:     Chris G. Demetriou
>Organization:
Kernel Hackers 'r' Us
>Release:        NetBSD-current, January 18, 1996
>Environment:
System: NetBSD sun-lamp.pc.cs.cmu.edu 1.1A NetBSD 1.1A (SUN_LAMP) #34: Thu Jan 18 20:53:30 EST 1996 cgd@sun-lamp.pc.cs.cmu.edu:/usr/src/sys/arch/i386/compile/SUN_LAMP i386


>Description:
	There is no proper EISA autconfiguration code.  Because of
	this, EISA device configuration sucks.

	EISA device configuration sucks in a couple of ways:
		(1) because EISA devices are configured in the
		    same way as ISA devices, they can't clone.
		    since EISA is a direct-config bus, they should
		    be able to.
		(2) because there is no special, device-independent EISA
		    configuration code, each EISA device driver must duplicate
		    large chunks of what should be device-independent code,
		    to see what devices are around, and where.

>How-To-Repeat:
	Look at various EISA device drivers.  Note that they all contain
	a loop looking through all EISA slots, for instances of themselves.

	Specify an EISA device as "cloning," i.e. "starred," in your kernel
	config file.  Try 'ahb' for instance.  Note than when you
	boot, the kernel panics while trying to configure that device.

>Fix:
	The following patch fixes all that.

	It includes a machine-independent EISA bus device driver which:
		(1) It makes the 'eisa' a first-class device, which finds and
		    attaches subdevices.
		(2) it includes machinery for conversion of standard EISA
		    ID registers into representative strings.
		(3) when devices are found on the EISA bus, but not configured
		    into the kernel, the EISA bus code prints out what it knows
		    about the device, and notes that it wasn't configured.
		(4) if EISAVERBOSE is defined, code is included to try to
		    determine the real vendor & product name from the encoded
		    vendor & product IDs, using a table of known devices.

	It updates all i386 configuration files to know about that driver,
	as appropriate.

	It updates the ahb driver (the only 'pure' EISA driver) to use the new
	EISA autoconfiguration mechanism, and updates the i386 kernel config
	files, as appropriate, to make it use the new configuration syntax
	and to clone.  (now, ahb specs look like: ahb* at eisa? slot ?.)

	None of the other EISA drivers were updated, because they're not 'pure'
	EISA drivers.  However, because of the way EISA device configuration
	used to work, they will continue working, without modification.  (The
	only side effect is that, for them, the EISA code will now note that
	the device exists, but will call it "not configured.")  Over time,
	the remaining EISA drivers (which also support ISA bus devices), can
	be converted to properly use the new, easier mechanism.  New drivers
	should be written to use the new mechanism.


Index: dev/eisa/Makefile
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/Makefile	Thu Jan 18 18:20:09 1996
***************
*** 0 ****
--- 1,7 ----
+ #	$NetBSD: Makefile,v 1.1 1995/06/18 01:07:04 cgd Exp $
+ 
+ AWK=	awk
+ 
+ eisadevs.h eisadevs_data.h: eisadevs devlist2h.awk
+ 	/bin/rm -f eisadevs.h eisadevs_data.h
+ 	${AWK} -f devlist2h.awk eisadevs
Index: dev/eisa/eisa.c
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/eisa.c	Thu Jan 18 22:02:21 1996
***************
*** 0 ****
--- 1,244 ----
+ /*	$NetBSD$	*/
+ 
+ /*
+  * Copyright (c) 1995, 1996 Christopher G. Demetriou
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in the
+  *    documentation and/or other materials provided with the distribution.
+  * 3. All advertising materials mentioning features or use of this software
+  *    must display the following acknowledgement:
+  *      This product includes software developed by Christopher G. Demetriou
+  *      for the NetBSD Project.
+  * 4. The name of the author may not be used to endorse or promote products
+  *    derived from this software without specific prior written permission
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  */
+ 
+ /*
+  * EISA Bus device
+  *
+  * Makes sure an EISA bus is present, and finds and attaches devices
+  * living on it.
+  */
+ 
+ #include <sys/param.h>
+ #include <sys/systm.h>
+ #include <sys/device.h>
+ 
+ #include <dev/eisa/eisareg.h>
+ #include <dev/eisa/eisavar.h>
+ #include <dev/eisa/eisadevs.h>
+ 
+ #include <machine/pio.h>		/* XXX shouldn't use inb directly */
+ 
+ struct eisa_softc {
+ 	struct	device sc_dev;			/* this is it, for now */
+ };
+ 
+ int	eisamatch __P((struct device *, void *, void *));
+ void	eisaattach __P((struct device *, struct device *, void *));
+ 
+ struct cfdriver eisacd = {
+         NULL, "eisa", eisamatch, eisaattach, DV_DULL, sizeof(struct eisa_softc)
+ };
+ 
+ int	eisasubmatch __P((struct device *, void *, void *));
+ int	eisaprint __P((void *, char *));
+ void	eisa_devinfo __P((const char *, char *));
+ 
+ int
+ eisamatch(parent, match, aux)
+         struct device *parent;
+         void *match, *aux;
+ {
+ 	struct cfdata *cf = match;
+ #if 0 /* XXX When eisa no longer attaches to 'root', something like this */
+ 	struct eisa_attach_args *ea = aux;
+ 
+ 	/*
+ 	 * There are no locators.  Assume the programmer who 'found'
+ 	 * the device was not a moron.  Only fail if they weren't
+ 	 * looking for an EISA bus.
+ 	 */
+ 	if (ea->ea_bus != BUS_EISA)
+ 		return (0);
+ #endif /* XXX */
+         return (1);
+ }
+ 
+ int
+ eisaprint(aux, eisa)
+ 	void *aux;
+ 	char *eisa;
+ {
+ 	register struct eisadev_attach_args *eda = aux;
+ 
+ 	printf(" slot %d", eda->eda_slot);
+ 	return (UNCONF);
+ }
+ 
+ int
+ eisasubmatch(parent, match, aux)
+ 	struct device *parent;
+ 	void *match, *aux;
+ {
+ 	struct cfdata *cf = match;
+ 	struct eisadev_attach_args *eda = aux;
+ 
+ 	if (cf->eisacf_slot != EISA_UNKNOWN_SLOT &&
+ 	    cf->eisacf_slot != eda->eda_slot)
+ 		return 0;
+ 	return ((*cf->cf_driver->cd_match)(parent, match, aux));
+ }
+ 
+ void
+ eisaattach(parent, self, aux)
+         struct device *parent, *self;
+         void *aux;
+ {
+ #if 0 /* XXX */
+ 	struct eisa_attach_args *ea = aux;
+ #endif /* XXX */
+ 	struct eisa_softc *sc = (struct eisa_softc *)self;
+ 	int slot;
+ 
+ 	printf("\n");
+ 
+ 	/*
+ 	 * Search for and attach subdevices.
+ 	 *
+ 	 * Slot 0 is the "motherboard" slot, and the code attaching
+ 	 * the EISA bus should have already attached an ISA bus there.
+ 	 */
+ 	for (slot = 1; slot < EISA_MAX_SLOT; slot++) {
+ 		struct eisadev_attach_args eda;
+ 		struct cfdata *cf;
+ 		u_int slotaddr;
+ 		int i;
+ 
+ 		eda.eda_slot = slot;
+ 		slotaddr = EISA_SLOT_ADDR(slot);
+ #if 0
+ 		printf("%s slot %d: at 0x%x\n", sc->sc_dev.dv_xname, slot,
+ 		    slotaddr);
+ #endif
+ 
+ 		/* Get the vendor ID bytes */
+ 		for (i = 0; i < EISA_NVIDREGS; i++)
+ 			eda.eda_vid[i] = inb(slotaddr + EISA_SLOTOFF_VID + i);
+ 
+ 		/* Check for device existence */
+ 		if (EISA_VENDID_NODEV(eda.eda_vid)) {
+ #if 0
+ 			printf("%s slot %d: no device\n", sc->sc_dev.dv_xname,
+ 			    slot);
+ 			printf("\t(0x%x, 0x%x)\n", eda.eda_vid[0],
+ 			    eda.eda_vid[1]);
+ #endif
+ 			continue;
+ 		}
+ 
+ 		/* And check that the firmware didn't biff something badly */
+ 		if (EISA_VENDID_IDDELAY(eda.eda_vid)) {
+ 			printf("%s slot %d: slot not configured by BIOS?\n",
+ 			    self->dv_xname, slot);
+ 			continue;
+ 		}
+ 
+ 		/* Get the product ID bytes */
+ 		for (i = 0; i < EISA_NPIDREGS; i++)
+ 			eda.eda_pid[i] = inb(slotaddr + EISA_SLOTOFF_PID + i);
+ 
+ 		/* Credate the ID string from the vendor and product IDs */
+ 		eda.eda_idstring[0] = EISA_VENDID_0(eda.eda_vid);
+ 		eda.eda_idstring[1] = EISA_VENDID_1(eda.eda_vid);
+ 		eda.eda_idstring[2] = EISA_VENDID_2(eda.eda_vid);
+ 		eda.eda_idstring[3] = EISA_PRODID_0(eda.eda_pid);
+ 		eda.eda_idstring[4] = EISA_PRODID_1(eda.eda_pid);
+ 		eda.eda_idstring[5] = EISA_PRODID_2(eda.eda_pid);
+ 		eda.eda_idstring[6] = EISA_PRODID_3(eda.eda_pid);
+ 		eda.eda_idstring[7] = '\0';		/* sanity */
+ 
+ 		/* Go hunt for devices that match. */
+ 		if ((cf = config_search(eisasubmatch, self, &eda)) != NULL)
+ 			config_attach(self, cf, &eda, eisaprint);
+ 		else {
+ 			char devinfo[256];
+ 
+                         eisa_devinfo(eda.eda_idstring, devinfo);
+                         printf("%s slot %d: %s not configured\n",
+                             self->dv_xname, slot, devinfo);
+ 		}
+ 	}
+ }
+ 
+ #ifdef EISAVERBOSE
+ /*      
+  * Descriptions of of known vendors and devices ("products").
+  */     
+ struct eisa_knowndev {
+ 	int	flags;
+ 	const char *id, *name;
+ };      
+ #define EISA_KNOWNDEV_NOPROD     0x01            /* match on vendor only */
+ 
+ #include <dev/eisa/eisadevs_data.h>
+ #endif /* EISAVERBOSE */
+ 
+ void
+ eisa_devinfo(id, cp)
+ 	const char *id;
+ 	char *cp;
+ {
+ 	const char *name;
+ 	int onlyvendor;
+ #ifdef EISAVERBOSE
+ 	struct eisa_knowndev *edp;
+ 	int match;
+ #endif
+ 
+ 	onlyvendor = 0;
+ 	name = NULL;
+ 
+ #ifdef EISAVERBOSE
+ 	/* find the device in the table, if possible. */
+ 	edp = eisa_knowndevs;
+ 	while (edp->id != NULL) {
+ 		/* check this entry for a match */
+ 		if ((edp->flags & EISA_KNOWNDEV_NOPROD) != 0)
+ 			match = !strncmp(edp->id, id, 3);
+ 		else
+ 			match = !strcmp(edp->id, id);
+ 		if (match) {
+ 			name = edp->name;
+ 			onlyvendor = (edp->flags & EISA_KNOWNDEV_NOPROD) != 0;
+ 			break;
+ 		}
+ 		edp++;
+ 	}
+ #endif
+ 
+ 	if (name == NULL)
+ 		cp += sprintf(cp, "unknown device %s", id);
+ 	else if (onlyvendor)
+ 		cp += sprintf(cp, "unknown %s device %s", name, id);
+ 	else
+ 		cp += sprintf(cp, "%s", name);
+ }
Index: dev/eisa/eisadevs
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/eisadevs	Thu Jan 18 18:40:59 1996
***************
*** 0 ****
--- 1,66 ----
+ $NetBSD$
+ 
+ /*
+  * Copyright (c) 1995, 1996 Christopher G. Demetriou
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in the
+  *    documentation and/or other materials provided with the distribution.
+  * 3. All advertising materials mentioning features or use of this software
+  *    must display the following acknowledgement:
+  *      This product includes software developed by Christopher G. Demetriou
+  *	for the NetBSD Project.
+  * 4. The name of the author may not be used to endorse or promote products
+  *    derived from this software without specific prior written permission
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  */
+ 
+ /*
+  * List of known EISA vendors
+  */
+ 
+ vendor ADP		Adaptec
+ vendor BUS		BusLogic
+ vendor DEC		Digital Equipment
+ vendor TCM		3Com
+ 
+ /*
+  * List of known products, grouped by vendor.
+  */
+ 
+ /* Adaptec products */
+ product ADP 0000	AHA-1740
+ product ADP 0001	AHA-1740A
+ product ADP 0002	AHA-1742A
+ product ADP 0400	AHA-1744
+ product ADP 7770	AIC-7770 (on motherboard)
+ product ADP 7771	AHA-274x
+ product ADP 7756	AHA-284x (BIOS enabled)
+ product ADP 7757	AHA-284x (BIOS disabled)
+ 
+ /* BusLogic products */
+ /* XXX */
+ 
+ /* Digital Equipment products */
+ product DEC 4250	DE425
+ /* ??? DEC DEFEA */
+ 
+ /* 3Com products */
+ product TCM 5092	3C579-TP
+ product TCM 5093	3C579
Index: dev/eisa/eisadevs.h
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/eisadevs.h	Thu Jan 18 19:29:18 1996
***************
*** 0 ****
--- 1,62 ----
+ /*
+  * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.
+  *
+  * generated from:
+  *	NetBSD
+  */
+ 
+ /*
+  * Copyright (c) 1995, 1996 Christopher G. Demetriou
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in the
+  *    documentation and/or other materials provided with the distribution.
+  * 3. All advertising materials mentioning features or use of this software
+  *    must display the following acknowledgement:
+  *      This product includes software developed by Christopher G. Demetriou
+  *	for the NetBSD Project.
+  * 4. The name of the author may not be used to endorse or promote products
+  *    derived from this software without specific prior written permission
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  */
+ 
+ /*
+  * List of known products, grouped by vendor.
+  */
+ 
+ /* Adaptec products */
+ #define	EISA_PRODUCT_ADP0000	"Adaptec AHA-1740"
+ #define	EISA_PRODUCT_ADP0001	"Adaptec AHA-1740A"
+ #define	EISA_PRODUCT_ADP0002	"Adaptec AHA-1742A"
+ #define	EISA_PRODUCT_ADP0400	"Adaptec AHA-1744"
+ #define	EISA_PRODUCT_ADP7770	"Adaptec AIC-7770 (on motherboard)"
+ #define	EISA_PRODUCT_ADP7771	"Adaptec AHA-274x"
+ #define	EISA_PRODUCT_ADP7756	"Adaptec AHA-284x (BIOS enabled)"
+ #define	EISA_PRODUCT_ADP7757	"Adaptec AHA-284x (BIOS disabled)"
+ 
+ /* BusLogic products */
+ /* XXX */
+ 
+ /* Digital Equipment products */
+ #define	EISA_PRODUCT_DEC4250	"Digital Equipment DE425"
+ /* ??? DEC DEFEA */
+ 
+ /* 3Com products */
+ #define	EISA_PRODUCT_TCM5092	"3Com 3C579-TP"
+ #define	EISA_PRODUCT_TCM5093	"3Com 3C579"
Index: dev/eisa/eisadevs_data.h
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/eisadevs_data.h	Thu Jan 18 19:29:18 1996
***************
*** 0 ****
--- 1,116 ----
+ /*
+  * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.
+  *
+  * generated from:
+  *	NetBSD
+  */
+ 
+ /*
+  * Copyright (c) 1995, 1996 Christopher G. Demetriou
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in the
+  *    documentation and/or other materials provided with the distribution.
+  * 3. All advertising materials mentioning features or use of this software
+  *    must display the following acknowledgement:
+  *      This product includes software developed by Christopher G. Demetriou
+  *	for the NetBSD Project.
+  * 4. The name of the author may not be used to endorse or promote products
+  *    derived from this software without specific prior written permission
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  */
+ 
+ struct eisa_knowndev eisa_knowndevs[] = {
+ 	{
+ 	    0,
+ 	    "ADP0000",
+ 	    EISA_PRODUCT_ADP0000,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP0001",
+ 	    EISA_PRODUCT_ADP0001,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP0002",
+ 	    EISA_PRODUCT_ADP0002,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP0400",
+ 	    EISA_PRODUCT_ADP0400,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP7770",
+ 	    EISA_PRODUCT_ADP7770,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP7771",
+ 	    EISA_PRODUCT_ADP7771,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP7756",
+ 	    EISA_PRODUCT_ADP7756,
+ 	},
+ 	{
+ 	    0,
+ 	    "ADP7757",
+ 	    EISA_PRODUCT_ADP7757,
+ 	},
+ 	{
+ 	    0,
+ 	    "DEC4250",
+ 	    EISA_PRODUCT_DEC4250,
+ 	},
+ 	{
+ 	    0,
+ 	    "TCM5092",
+ 	    EISA_PRODUCT_TCM5092,
+ 	},
+ 	{
+ 	    0,
+ 	    "TCM5093",
+ 	    EISA_PRODUCT_TCM5093,
+ 	},
+ 	{
+ 	    EISA_KNOWNDEV_NOPROD,
+ 	    "ADP",
+ 	    "Adaptec",
+ 	},
+ 	{
+ 	    EISA_KNOWNDEV_NOPROD,
+ 	    "BUS",
+ 	    "BusLogic",
+ 	},
+ 	{
+ 	    EISA_KNOWNDEV_NOPROD,
+ 	    "DEC",
+ 	    "Digital Equipment",
+ 	},
+ 	{
+ 	    EISA_KNOWNDEV_NOPROD,
+ 	    "TCM",
+ 	    "3Com",
+ 	},
+ 	{ 0, NULL, NULL, }
+ };
Index: dev/eisa/devlist2h.awk
*** /dev/null	Thu Jan 18 22:13:51 1996
--- dev/eisa/devlist2h.awk	Thu Jan 18 19:29:05 1996
***************
*** 0 ****
--- 1,189 ----
+ #! /usr/bin/awk -f
+ #	$NetBSD: devlist2h.awk,v 1.1 1995/06/18 01:07:06 cgd Exp $
+ #
+ # Copyright (c) 1995, 1996 Christopher G. Demetriou
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions
+ # are met:
+ # 1. Redistributions of source code must retain the above copyright
+ #    notice, this list of conditions and the following disclaimer.
+ # 2. Redistributions in binary form must reproduce the above copyright
+ #    notice, this list of conditions and the following disclaimer in the
+ #    documentation and/or other materials provided with the distribution.
+ # 3. All advertising materials mentioning features or use of this software
+ #    must display the following acknowledgement:
+ #      This product includes software developed by Christopher G. Demetriou.
+ # 4. The name of the author may not be used to endorse or promote products
+ #    derived from this software without specific prior written permission
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #
+ BEGIN {
+ 	nproducts = nvendors = 0
+ 	dfile="eisadevs_data.h"
+ 	hfile="eisadevs.h"
+ }
+ NR == 1 {
+ 	VERSION = $0
+ 	gsub("\\$", "", VERSION)
+ 
+ 	printf("/*\n") > dfile
+ 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
+ 	    > dfile
+ 	printf(" *\n") > dfile
+ 	printf(" * generated from:\n") > dfile
+ 	printf(" *\t%s\n", VERSION) > dfile
+ 	printf(" */\n") > dfile
+ 
+ 	printf("/*\n") > hfile
+ 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
+ 	    > hfile
+ 	printf(" *\n") > hfile
+ 	printf(" * generated from:\n") > hfile
+ 	printf(" *\t%s\n", VERSION) > hfile
+ 	printf(" */\n") > hfile
+ 
+ 	next
+ }
+ $1 == "vendor" {
+ 	nvendors++
+ 
+ 	vendorindex[$2] = nvendors;	# record index for this name, for later.
+ 	vendors[nvendors, 1] = $2;	# name/ID
+ 	i = 2; f = 3;
+ 
+ 	# comments
+ 	ocomment = oparen = 0
+ 	if (f <= NF) {
+ 		ocomment = 1;
+ 	}
+ 	while (f <= NF) {
+ 		if ($f == "#") {
+ 			oparen = 1
+ 			f++
+ 			continue
+ 		}
+ 		if (oparen) {
+ 			f++
+ 			continue
+ 		}
+ 		vendors[nvendors, i] = $f
+ 		i++; f++;
+ 	}
+ 
+ 	next
+ }
+ $1 == "product" {
+ 	nproducts++
+ 
+ 	products[nproducts, 1] = $2;		# vendor name
+ 	products[nproducts, 2] = $3;		# product id
+ 	printf("#define\tEISA_PRODUCT_%s%s\t\"", products[nproducts, 1],
+             products[nproducts, 2]) > hfile
+ 
+ 	i = vendorindex[products[nproducts, 1]]; j = 2;
+ 	needspace = 0;
+ 	while (vendors[i, j] != "") {
+ 		if (needspace)
+ 			printf(" ") > hfile
+ 		printf("%s", vendors[i, j]) > hfile
+ 		needspace = 1
+ 		j++
+ 	}
+ 
+ 	if (needspace)
+ 		printf(" ") > hfile
+ 
+ 	i=3; f = 4;
+ 
+ 	# comments
+ 	ocomment = oparen = 0
+ 	if (f <= NF) {
+ 		ocomment = 1;
+ 	}
+ 	while (f <= NF) {
+ 		if ($f == "#") {
+ 			printf("(") > hfile
+ 			oparen = 1
+ 			f++
+ 			continue
+ 		}
+ 		if (oparen) {
+ 			printf("%s", $f) > hfile
+ 			if (f < NF)
+ 				printf(" ") > hfile
+ 			f++
+ 			continue
+ 		}
+ 		products[nproducts, i] = $f
+ 		printf("%s", products[nproducts, i]) > hfile
+ 		if (f < NF)
+ 			printf(" ") > hfile
+ 		i++; f++;
+ 	}
+ 	if (oparen)
+ 		printf(")") > hfile
+ 	if (ocomment)
+ 		printf("\"") > hfile
+ 	printf("\n") > hfile
+ 
+ 	next
+ }
+ {
+ 	if ($0 == "")
+ 		blanklines++
+ 	if (blanklines != 2 && blanklines != 3)
+ 		print $0 > hfile
+ 	if (blanklines < 2)
+ 		print $0 > dfile
+ }
+ END {
+ 	# print out the match tables
+ 
+ 	printf("\n") > dfile
+ 
+ 	printf("struct eisa_knowndev eisa_knowndevs[] = {\n") > dfile
+ 	for (i = 1; i <= nproducts; i++) {
+ 		printf("\t{\n") > dfile
+ 		printf("\t    0,\n") > dfile
+ 		printf("\t    \"%s%s\",\n", products[i, 1], products[i, 2]) \
+ 		    > dfile
+ 		printf("\t    EISA_PRODUCT_%s%s,\n", \
+ 		    products[i, 1], products[i, 2]) \
+ 		    > dfile
+ 
+ 		printf("\t},\n") > dfile
+ 	}
+ 	for (i = 1; i <= nvendors; i++) {
+ 		printf("\t{\n") > dfile
+ 		printf("\t    EISA_KNOWNDEV_NOPROD,\n") \
+ 		    > dfile
+ 		printf("\t    \"%s\",\n", vendors[i, 1]) \
+ 		    > dfile
+ 		printf("\t    \"") > dfile
+ 		j = 2;
+ 		needspace = 0;
+ 		while (vendors[i, j] != "") {
+ 			if (needspace)
+ 				printf(" ") > dfile
+ 			printf("%s", vendors[i, j]) > dfile
+ 			needspace = 1
+ 			j++
+ 		}
+ 		printf("\",\n") > dfile
+ 		printf("\t},\n") > dfile
+ 	}
+ 	printf("\t{ 0, NULL, NULL, }\n") > dfile
+ 	printf("};\n") > dfile
+ }
Index: dev/eisa/aha1742.c
===================================================================
RCS file: /a/cvsroot/src/sys/dev/eisa/aha1742.c,v
retrieving revision 1.53
diff -c -r1.53 aha1742.c
*** aha1742.c	1995/12/24 02:31:01	1.53
--- aha1742.c	1996/01/19 03:17:48
***************
*** 62,67 ****
--- 62,68 ----
  
  #include <dev/eisa/eisareg.h>
  #include <dev/eisa/eisavar.h>
+ #include <dev/eisa/eisadevs.h>
  
  #include <scsi/scsi_all.h>
  #include <scsi/scsiconf.h>
***************
*** 283,289 ****
  void ahb_free_ecb __P((struct ahb_softc *, struct ahb_ecb *, int));
  struct ahb_ecb *ahb_get_ecb __P((struct ahb_softc *, int));
  struct ahb_ecb *ahb_ecb_phys_kv __P((struct ahb_softc *, physaddr));
! int ahb_find __P((struct ahb_softc *));
  void ahb_init __P((struct ahb_softc *));
  void ahbminphys __P((struct buf *));
  int ahb_scsi_cmd __P((struct scsi_xfer *));
--- 284,290 ----
  void ahb_free_ecb __P((struct ahb_softc *, struct ahb_ecb *, int));
  struct ahb_ecb *ahb_get_ecb __P((struct ahb_softc *, int));
  struct ahb_ecb *ahb_ecb_phys_kv __P((struct ahb_softc *, physaddr));
! int ahb_find __P((int, struct ahb_softc *));
  void ahb_init __P((struct ahb_softc *));
  void ahbminphys __P((struct buf *));
  int ahb_scsi_cmd __P((struct scsi_xfer *));
***************
*** 314,325 ****
  	NULL,			/* Use default 'done' routine */
  };
  
! int ahbprobe();
! int ahbprobe1 __P((struct ahb_softc *, struct isa_attach_args *));
! void ahbattach();
  
  struct cfdriver ahbcd = {
! 	NULL, "ahb", ahbprobe, ahbattach, DV_DULL, sizeof(struct ahb_softc)
  };
  
  /*
--- 315,325 ----
  	NULL,			/* Use default 'done' routine */
  };
  
! int	ahbmatch();
! void	ahbattach();
  
  struct cfdriver ahbcd = {
! 	NULL, "ahb", ahbmatch, ahbattach, DV_DULL, sizeof(struct ahb_softc)
  };
  
  /*
***************
*** 412,497 ****
   * the actual probe routine to check it out.
   */
  int
! ahbprobe(parent, self, aux)
  	struct device *parent, *self;
  	void *aux;
  {
  	struct ahb_softc *ahb = (void *)self;
! 	struct isa_attach_args *ia = aux;
! 	int iobase;
! 	u_short vendor, model;
  
! #ifdef NEWCONFIG
! 	if (ia->ia_iobase != IOBASEUNK)
! 		return ahbprobe1(ahb, ia);
! #endif
! 
! 	while (ahb_slot < MAX_SLOTS) {
! 		ahb_slot++;
! 		iobase = 0x1000 * ahb_slot;
! 
! 		vendor = htons(inw(iobase + EISA_VENDOR));
! 		if (vendor != 0x0490)	/* `ADP' */
! 			continue;
! 
! 		model = htons(inw(iobase + EISA_MODEL));
! 		if ((model & 0xfff0) != 0x0000 &&
! 		    (model & 0xfff0) != 0x0100) {
! #ifndef trusted
! 			printf("ahbprobe: ignoring model %04x\n", model);
! #endif
! 			continue;
! 		}
  
  #ifdef notyet
! 		outb(iobase + EISA_CONTROL, EISA_ENABLE | EISA_RESET);
! 		delay(10);
! 		outb(iobase + EISA_CONTROL, EISA_ENABLE);
! 		/* Wait for reset? */
! 		delay(1000);
  #endif
  
! 		ia->ia_iobase = iobase;
! 		if (ahbprobe1(ahb, ia))
! 			return 1;
! 	}
! 
! 	return 0;
! }
! 
! /*
!  * Check if the device can be found at the port given
!  * and if so, set it up ready for further work
!  * as an argument, takes the isa_device structure from
!  * autoconf.c.
!  */
! int
! ahbprobe1(ahb, ia)
! 	struct ahb_softc *ahb;
! 	struct isa_attach_args *ia;
! {
! 
! 	ahb->sc_iobase = ia->ia_iobase;
! 
! 	/*
! 	 * Try initialise a unit at this location
! 	 * sets up dma and bus speed, loads ahb->sc_irq
! 	 */
! 	if (ahb_find(ahb) != 0)
! 		return 0;
! 
! 	if (ia->ia_irq != IRQUNK) {
! 		if (ia->ia_irq != ahb->sc_irq) {
! 			printf("%s: irq mismatch; kernel configured %d != board configured %d\n",
! 			    ahb->sc_dev.dv_xname, ia->ia_irq, ahb->sc_irq);
! 			return 0;
! 		}
! 	} else
! 		ia->ia_irq = ahb->sc_irq;
  
- 	ia->ia_drq = DRQUNK;
- 	ia->ia_msize = 0;
- 	ia->ia_iosize = 0x1000;
  	return 1;
  }
  
--- 412,443 ----
   * the actual probe routine to check it out.
   */
  int
! ahbmatch(parent, self, aux)
  	struct device *parent, *self;
  	void *aux;
  {
  	struct ahb_softc *ahb = (void *)self;
! 	struct eisadev_attach_args *eda = aux;
  
! 	/* must match one of our known ID strings */
! 	if (strcmp(eda->eda_idstring, "ADP0000") &&
! 	    strcmp(eda->eda_idstring, "ADP0001") &&
! 	    strcmp(eda->eda_idstring, "ADP0002") &&
! 	    strcmp(eda->eda_idstring, "ADP0400"))
! 		return (0);
  
  #ifdef notyet
! 	/* This won't compile as-is, anyway. */
! 	outb(iobase + EISA_CONTROL, EISA_ENABLE | EISA_RESET);
! 	delay(10);
! 	outb(iobase + EISA_CONTROL, EISA_ENABLE);
! 	/* Wait for reset? */
! 	delay(1000);
  #endif
  
! 	if (ahb_find(eda->eda_slot, NULL))
! 		return (0);
  
  	return 1;
  }
  
***************
*** 508,516 ****
  	struct device *parent, *self;
  	void *aux;
  {
! 	struct isa_attach_args *ia = aux;
  	struct ahb_softc *ahb = (void *)self;
! 	u_short model;
  
  	ahb_init(ahb);
  	TAILQ_INIT(&ahb->free_ecb);
--- 454,466 ----
  	struct device *parent, *self;
  	void *aux;
  {
! 	struct eisadev_attach_args *eda = aux;
  	struct ahb_softc *ahb = (void *)self;
! 	char *model;
! 
! 	if (ahb_find(eda->eda_slot, ahb))
! 		panic("ahbattach: ahb_find failed!");
! 	ahb->sc_iobase = EISA_SLOT_ADDR(eda->eda_slot);
  
  	ahb_init(ahb);
  	TAILQ_INIT(&ahb->free_ecb);
***************
*** 524,545 ****
  	ahb->sc_link.device = &ahb_dev;
  	ahb->sc_link.openings = 2;
  
! 	printf(": ");
! 	model = htons(inw(ahb->sc_iobase + EISA_MODEL));
! 	switch (model & 0xfff0) {
! 	case 0x0000:
! 		printf("model 1740 or 1742");
! 		break;
! 	case 0x0100:
! 		printf("model 1744");
! 		break;
! 	}
! 	printf(", revision %d\n", model & 0x000f);
  
  #ifdef NEWCONFIG
  	isa_establish(&ahb->sc_id, &ahb->sc_dev);
  #endif
! 	ahb->sc_ih = eisa_intr_establish(ia->ia_irq, IST_LEVEL, IPL_BIO,
  	    ahbintr, ahb);
  
  	/*
--- 474,495 ----
  	ahb->sc_link.device = &ahb_dev;
  	ahb->sc_link.openings = 2;
  
! 	if (!strcmp(eda->eda_idstring, "ADP0000"))
! 		model = EISA_PRODUCT_ADP0000;
! 	else if (!strcmp(eda->eda_idstring, "ADP0001"))
! 		model = EISA_PRODUCT_ADP0001;
! 	else if (!strcmp(eda->eda_idstring, "ADP0002"))
! 		model = EISA_PRODUCT_ADP0002;
! 	else if (!strcmp(eda->eda_idstring, "ADP0400"))
! 		model = EISA_PRODUCT_ADP0400;
! 	else
! 		model = "unknown model!";
! 	printf(" irq %d: %s\n", ahb->sc_irq, model);
  
  #ifdef NEWCONFIG
  	isa_establish(&ahb->sc_id, &ahb->sc_dev);
  #endif
! 	ahb->sc_ih = eisa_intr_establish(ahb->sc_irq, IST_LEVEL, IPL_BIO,
  	    ahbintr, ahb);
  
  	/*
***************
*** 823,835 ****
   * Start the board, ready for normal operation
   */
  int
! ahb_find(ahb)
  	struct ahb_softc *ahb;
  {
! 	int iobase = ahb->sc_iobase;
  	int stport = iobase + G2STAT;
  	u_char intdef;
! 	int i;
  	int wait = 1000;	/* 1 sec enough? */
  
  	outb(iobase + PORTADDR, PORTADDR_ENHANCED);
--- 773,786 ----
   * Start the board, ready for normal operation
   */
  int
! ahb_find(slot, ahb)
! 	int slot;
  	struct ahb_softc *ahb;
  {
! 	int iobase = EISA_SLOT_ADDR(slot);
  	int stport = iobase + G2STAT;
  	u_char intdef;
! 	int i, irq, busid;
  	int wait = 1000;	/* 1 sec enough? */
  
  	outb(iobase + PORTADDR, PORTADDR_ENHANCED);
***************
*** 850,856 ****
  		delay(1000);
  	}
  	if (!wait) {
! #ifdef	AHBDEBUG
  		if (ahb_debug & AHB_SHOWMISC)
  			printf("ahb_find: No answer from aha1742 board\n");
  #endif /*AHBDEBUG */
--- 801,807 ----
  		delay(1000);
  	}
  	if (!wait) {
! #ifdef AHBDEBUG
  		if (ahb_debug & AHB_SHOWMISC)
  			printf("ahb_find: No answer from aha1742 board\n");
  #endif /*AHBDEBUG */
***************
*** 875,896 ****
  	intdef = inb(iobase + INTDEF);
  	switch (intdef & 0x07) {
  	case INT9:
! 		ahb->sc_irq = 9;
  		break;
  	case INT10:
! 		ahb->sc_irq = 10;
  		break;
  	case INT11:
! 		ahb->sc_irq = 11;
  		break;
  	case INT12:
! 		ahb->sc_irq = 12;
  		break;
  	case INT14:
! 		ahb->sc_irq = 14;
  		break;
  	case INT15:
! 		ahb->sc_irq = 15;
  		break;
  	default:
  		printf("illegal int setting %x\n", intdef);
--- 826,847 ----
  	intdef = inb(iobase + INTDEF);
  	switch (intdef & 0x07) {
  	case INT9:
! 		irq = 9;
  		break;
  	case INT10:
! 		irq = 10;
  		break;
  	case INT11:
! 		irq = 11;
  		break;
  	case INT12:
! 		irq = 12;
  		break;
  	case INT14:
! 		irq = 14;
  		break;
  	case INT15:
! 		irq = 15;
  		break;
  	default:
  		printf("illegal int setting %x\n", intdef);
***************
*** 900,906 ****
  	outb(iobase + INTDEF, (intdef | INTEN));	/* make sure we can interrupt */
  
  	/* who are we on the scsi bus? */
! 	ahb->ahb_scsi_dev = (inb(iobase + SCSIDEF) & HSCSIID);
  
  	/*
  	 * Note that we are going and return (to probe)
--- 851,863 ----
  	outb(iobase + INTDEF, (intdef | INTEN));	/* make sure we can interrupt */
  
  	/* who are we on the scsi bus? */
! 	busid = (inb(iobase + SCSIDEF) & HSCSIID);
! 
! 	/* if we want to fill in softc, do so now */
! 	if (ahb != NULL) {
! 		ahb->sc_irq = irq;
! 		ahb->ahb_scsi_dev = busid;
! 	}
  
  	/*
  	 * Note that we are going and return (to probe)
Index: dev/eisa/eisareg.h
===================================================================
RCS file: /a/cvsroot/src/sys/dev/eisa/eisareg.h,v
retrieving revision 1.1
diff -c -r1.1 eisareg.h
*** eisareg.h	1995/04/17 12:08:21	1.1
--- eisareg.h	1996/01/19 03:17:48
***************
*** 1,7 ****
  /*	$NetBSD: eisareg.h,v 1.1 1995/04/17 12:08:21 cgd Exp $	*/
  
  /*
!  * Copyright (c) 1995 Christopher G. Demetriou
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
--- 1,7 ----
  /*	$NetBSD: eisareg.h,v 1.1 1995/04/17 12:08:21 cgd Exp $	*/
  
  /*
!  * Copyright (c) 1995, 1996 Christopher G. Demetriou
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
***************
*** 31,36 ****
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  /*
!  * XXX something should go here.  nothing does, yet.
   */
--- 31,105 ----
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
+ #ifndef __DEV_EISA_EISAREG_H__
+ #define	__DEV_EISA_EISAREG_H__
+ 
  /*
!  * Register (etc.) descriptions for the EISA bus.
! 
!  * Mostly culled from EISA chipset descriptions in:
!  *	Intel Peripheral Components Databook (1992)
   */
+ 
+ /*
+  * Max number of EISA slots in a machine.  64K I/O space total.
+  */
+ #define	EISA_MAX_SLOT		16	/* number of slots.  0 -> 0xf */
+ 
+ /*
+  * Slot I/O space size, and I/O address of a given slot.
+  */
+ #define	EISA_SLOT_SIZE		0x1000
+ #define	EISA_SLOT_ADDR(s)	((s) * EISA_SLOT_SIZE)
+ 
+ /*
+  * Slot offsets for important/standard registers.
+  */
+ #define	EISA_SLOTOFF_VID	0xc80		/* offset of vendor id regs */
+ #define	EISA_NVIDREGS		2
+ #define	EISA_SLOTOFF_PID	0xc82		/* offset of product id regs */
+ #define	EISA_NPIDREGS		2
+ 
+ 
+ /*
+  * EISA ID functions, used to manipulate and decode EISA ID registers.
+  * ``Somebody was let out without adult supervision.''
+  */
+ 
+ #define	EISA_IDSTRINGLEN	8	/* length of ID string, incl. NUL */
+ 
+ /*
+  * Vendor ID: three characters, encoded in 16 bits.
+  *
+  * EISA_VENDID_NODEV returns true if there's no device in the slot.
+  * EISA_VENDID_IDDELAY returns true if there's a device in the slot,
+  *	but that device hasn't been configured by system firmware.
+  * EISA_VENDID_n returns the "n"th character of the vendor ID.
+  */
+ #define	EISA_VENDID_NODEV(vid)						\
+ 	    (((vid)[0] & 0x80) != 0)
+ #define	EISA_VENDID_IDDELAY(vid)					\
+ 	    (((vid)[0] & 0xf0) == 0x70)
+ #define	EISA_VENDID_0(vid)						\
+ 	    ((((vid)[0] & 0x7c) >> 2) + '@')
+ #define	EISA_VENDID_1(vid)						\
+ 	    (((((vid)[0] & 0x03) << 3) | (((vid)[1] & 0xe0) >> 5)) + '@')
+ #define	EISA_VENDID_2(vid)						\
+ 	    (((vid)[1] & 0x1f) + '@')
+ 
+ /*
+  * Product ID: four hex digits, encoded in 16 bits (normal, sort of).
+  *
+  * EISA_PRIDID_n returns the "n"th hex digit of the product ID.
+  */
+ #define	__EISA_HEX_MAP	"0123456789ABCDEF"
+ #define	EISA_PRODID_0(pid)						\
+ 	    (__EISA_HEX_MAP[(((pid)[0] >> 4) & 0xf)])
+ #define	EISA_PRODID_1(pid)						\
+ 	    (__EISA_HEX_MAP[(((pid)[0] >> 0) & 0xf)])
+ #define	EISA_PRODID_2(pid)						\
+ 	    (__EISA_HEX_MAP[(((pid)[1] >> 4) & 0xf)])
+ #define	EISA_PRODID_3(pid)						\
+ 	    (__EISA_HEX_MAP[(((pid)[1] >> 0) & 0xf)])
+ 
+ #endif /* !__DEV_EISA_EISAREG_H__ */
Index: dev/eisa/eisavar.h
===================================================================
RCS file: /a/cvsroot/src/sys/dev/eisa/eisavar.h,v
retrieving revision 1.2
diff -c -r1.2 eisavar.h
*** eisavar.h	1995/12/24 02:31:02	1.2
--- eisavar.h	1996/01/19 03:17:49
***************
*** 1,7 ****
  /*	$NetBSD: eisavar.h,v 1.2 1995/12/24 02:31:02 mycroft Exp $	*/
  
  /*
!  * Copyright (c) 1995 Christopher G. Demetriou
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
--- 1,7 ----
  /*	$NetBSD: eisavar.h,v 1.2 1995/12/24 02:31:02 mycroft Exp $	*/
  
  /*
!  * Copyright (c) 1995, 1996 Christopher G. Demetriou
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
***************
*** 31,53 ****
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  /*
!  * XXX
!  * XXX EISA AUTOCONFIG SHOULD BE SEPERATED FROM ISA AUTOCONFIG!!!
!  * XXX
   */
  
  /*
!  * pull in the ISA definitions
   */
! #include <dev/isa/isavar.h>
  
  /*
!  * and bend them to our twisted ways:
!  * map the functions, etc. that are used
   */
  
! #define eisa_attach_args	isa_attach_args			/* XXX */
! #define eisadev			isadev				/* XXX */
  #define	eisa_intr_establish	isa_intr_establish		/* XXX */
  #define	eisa_intr_disestablish	isa_intr_disestablish		/* XXX */
--- 31,94 ----
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
+ #ifndef __DEV_EISA_EISAVAR_H__
+ #define	__DEV_EISA_EISAVAR_H__
+ 
  /*
!  * Definitions for EISA autoconfiguration.
!  *
!  * This file describes types, constants, and functions which are used
!  * for EISA autoconfiguration.
   */
  
+ #include <dev/eisa/eisareg.h>		/* For ID register & string info. */
+ 
+ 
+ typedef int	eisa_slot_t;		/* really only needs to be 4 bits */
+ 
+ 
  /*
!  * EISA device attach arguments.
   */
! 
! struct eisadev_attach_args {
! 	eisa_slot_t	eda_slot;
! 	u_int8_t	eda_vid[EISA_NVIDREGS];
! 	u_int8_t	eda_pid[EISA_NPIDREGS];
! 	char		eda_idstring[EISA_IDSTRINGLEN];
! };
! 
  
  /*
!  * Easy to remember names for EISA device locators.
   */
  
! #define	eisacf_slot		cf_loc[0]		/* slot */
! 
! 
! /*
!  * EISA device locator values that mean "unknown" or "unspecified."
!  * Note that not all are supplied by 'config' and should be filled
!  * in by the device if appropriate.
!  */
! 
! #define	EISA_UNKNOWN_SLOT	((eisa_slot_t)-1)
! 
! /*
!  * The EISA bus cfdriver, so that subdevices can more easily tell
!  * what bus they're on.
!  */
! 
! extern struct cfdriver eisacd;
! 
! /*
!  * XXX interrupt attachment, etc., is done by using the ISA interfaces.
!  * XXX THIS SHOULD CHANGE.
!  */
! 
! #include <dev/isa/isavar.h>
! 
  #define	eisa_intr_establish	isa_intr_establish		/* XXX */
  #define	eisa_intr_disestablish	isa_intr_disestablish		/* XXX */
+ 
+ #endif /* !__DEV_EISA_EISAVAR_H__ */
Index: dev/eisa/files.eisa
===================================================================
RCS file: /a/cvsroot/src/sys/dev/eisa/files.eisa,v
retrieving revision 1.2
diff -c -r1.2 files.eisa
*** files.eisa	1995/04/17 17:54:15	1.2
--- files.eisa	1996/01/19 03:17:49
***************
*** 4,17 ****
  # Included by ports that need it.  Requires that the SCSI files be
  # defined first.
  
! # XXX IN A PERFECT WORLD:
! # ports should define their own "device eisa" line (like the one below,
! # but with the correct bus attachment).
! 
! # XXX there should be MI EISA configuration, but not yet.
! #device	eisa at root {[slot = -1]}
! #file	dev/eisa/eisa.c			eisa
  
  # Adaptec AHA-174x EISA SCSI Host Adapter family
! device	ahb at isa: scsi		# XXX should be at EISA
! file	dev/eisa/aha1742.c	ahb     
--- 4,30 ----
  # Included by ports that need it.  Requires that the SCSI files be
  # defined first.
  
! # The following 'device eisa at root' definition is commented out because
! # 'real' MI EISA attachment isn't ready yet.  There should be:
! #	(1) a MI "eisabus" attribute, which machine-dependent
! #	    "chipsets" supply,
! #	(2) a MI "eisa" device, which attaches to devices which
! #	    supply the "eisabus" attribute.
! #
! # The 'eisabus' attribute may have to be defined in files.isa, so
! # that ISA devices can properly attach to an EISA bus (depending
! # on how configuration is done.)  Another possibility involves
! # setting things up so that 'eisa' attaches 'isa,' or so that
! # whenever 'eisa' is attached, 'isa' is also attached.  (This needs
! # to be done since EISA is supposed to be backward compatible with
! # ISA, so wherever you have an EISA bus you should also have an
! # ISA bus.)
! #
! #define eisabus { }
! #
! #device	eisa at eisabus {[slot = -1]}
! file	dev/eisa/eisa.c			eisa
  
  # Adaptec AHA-174x EISA SCSI Host Adapter family
! device	ahb at eisa: scsi
! file	dev/eisa/aha1742.c		ahb
Index: arch/i386/conf/BOAT_ANCHOR
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/BOAT_ANCHOR,v
retrieving revision 1.51
diff -c -r1.51 BOAT_ANCHOR
*** BOAT_ANCHOR	1995/12/12 01:52:39	1.51
--- BOAT_ANCHOR	1996/01/19 03:17:56
***************
*** 76,81 ****
--- 76,82 ----
  #options	GENERIC
  
  isa0	at root
+ #eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 107,113 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
--- 108,114 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
Index: arch/i386/conf/DISKLESS
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/DISKLESS,v
retrieving revision 1.13
diff -c -r1.13 DISKLESS
*** DISKLESS	1995/08/22 19:43:11	1.13
--- DISKLESS	1996/01/19 03:17:56
***************
*** 74,79 ****
--- 74,80 ----
  #options	GENERIC
  
  isa0	at root
+ #eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 105,111 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
--- 106,112 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
Index: arch/i386/conf/GENERIC
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/GENERIC,v
retrieving revision 1.28
diff -c -r1.28 GENERIC
*** GENERIC	1996/01/13 02:05:24	1.28
--- GENERIC	1996/01/19 03:17:56
***************
*** 77,82 ****
--- 77,83 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 110,116 ****
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
--- 111,117 ----
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
Index: arch/i386/conf/GENERICADP
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/GENERICADP,v
retrieving revision 1.5
diff -c -r1.5 GENERICADP
*** GENERICADP	1996/01/13 02:05:26	1.5
--- GENERICADP	1996/01/19 03:17:56
***************
*** 78,83 ****
--- 78,84 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 111,117 ****
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
--- 112,118 ----
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
Index: arch/i386/conf/GENERICOTHER
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/GENERICOTHER,v
retrieving revision 1.4
diff -c -r1.4 GENERICOTHER
*** GENERICOTHER	1995/12/24 00:22:56	1.4
--- GENERICOTHER	1996/01/19 03:17:56
***************
*** 78,83 ****
--- 78,84 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
Index: arch/i386/conf/INSTADP
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/INSTADP,v
retrieving revision 1.4
diff -c -r1.4 INSTADP
*** INSTADP	1996/01/13 02:05:27	1.4
--- INSTADP	1996/01/19 03:17:56
***************
*** 49,54 ****
--- 49,55 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 76,82 ****
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
--- 77,83 ----
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  ahc*	at pci? bus ? dev ?		# Adaptec 2940 SCSI controllers
  scsibus* at ahc?
Index: arch/i386/conf/INSTOTHER
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/INSTOTHER,v
retrieving revision 1.3
diff -c -r1.3 INSTOTHER
*** INSTOTHER	1995/12/14 01:10:15	1.3
--- INSTOTHER	1996/01/19 03:17:56
***************
*** 49,54 ****
--- 49,55 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
Index: arch/i386/conf/PAIN
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/PAIN,v
retrieving revision 1.54
diff -c -r1.54 PAIN
*** PAIN	1995/08/22 19:43:21	1.54
--- PAIN	1996/01/19 03:17:56
***************
*** 73,78 ****
--- 73,79 ----
  options		GENERIC
  
  isa0	at root
+ eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 107,113 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  scsibus* at aic?
--- 108,114 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  scsibus* at aic?
Index: arch/i386/conf/PATEK
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/PATEK,v
retrieving revision 1.26
diff -c -r1.26 PATEK
*** PATEK	1995/08/22 19:43:23	1.26
--- PATEK	1996/01/19 03:17:56
***************
*** 72,77 ****
--- 72,78 ----
  options		GENERIC
  
  isa0	at root
+ #eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 103,109 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  aic0	at isa? port 0x340 irq 11	# Adaptec 152[02] SCSI controllers
  scsibus* at aic?
--- 104,110 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  aic0	at isa? port 0x340 irq 11	# Adaptec 152[02] SCSI controllers
  scsibus* at aic?
Index: arch/i386/conf/SUN_LAMP
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/SUN_LAMP,v
retrieving revision 1.61
diff -c -r1.61 SUN_LAMP
*** SUN_LAMP	1995/08/22 19:43:25	1.61
--- SUN_LAMP	1996/01/19 03:17:57
***************
*** 72,77 ****
--- 72,78 ----
  #options	GENERIC
  
  isa0	at root
+ eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 103,109 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
--- 104,110 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
Index: arch/i386/conf/TDR
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/TDR,v
retrieving revision 1.54
diff -c -r1.54 TDR
*** TDR	1995/08/22 19:43:28	1.54
--- TDR	1996/01/19 03:17:57
***************
*** 72,77 ****
--- 72,78 ----
  #options	GENERIC
  
  isa0	at root
+ #eisa0	at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 104,110 ****
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
--- 105,111 ----
  #aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #scsibus* at aha?
! #ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
Index: arch/i386/conf/TRINITY
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/TRINITY,v
retrieving revision 1.59
diff -c -r1.59 TRINITY
*** TRINITY	1995/08/22 19:43:30	1.59
--- TRINITY	1996/01/19 03:17:57
***************
*** 74,79 ****
--- 74,80 ----
  #options	GENERIC
  
  isa0	at root
+ #eisa0 at root
  #pci0	at root
  
  npx0	at isa? port 0xf0 irq 13	# math coprocessor
***************
*** 105,111 ****
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! #ahb0	at isa? port ? irq ?		# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
--- 106,112 ----
  aha0	at isa? port 0x330 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  #aha1	at isa? port 0x334 irq ? drq ?	# Adaptec 154[02] SCSI controllers
  scsibus* at aha?
! #ahb*	at eisa? slot ?			# Adaptec 174[024] SCSI controllers
  #scsibus* at ahb?
  #aic0	at isa? port 0x340 irq 12	# Adaptec 152[02] SCSI controllers
  #scsibus* at aic?
Index: arch/i386/conf/files.i386
===================================================================
RCS file: /a/cvsroot/src/sys/arch/i386/conf/files.i386,v
retrieving revision 1.61
diff -c -r1.61 files.i386
*** files.i386	1996/01/08 13:51:30	1.61
--- files.i386	1996/01/19 03:17:57
***************
*** 47,53 ****
  device	isa at root {[port = -1], [size = 0],
  		     [iomem = -1], [iosiz = 0],
  		     [irq = -1], [drq = -1]}
! #device	eisa at root {...}
  device	pci at root {[bus = -1], [dev = -1]}
  #device	mca at root {...}
  
--- 47,53 ----
  device	isa at root {[port = -1], [size = 0],
  		     [iomem = -1], [iosiz = 0],
  		     [irq = -1], [drq = -1]}
! device	eisa at root {[slot = -1]}
  device	pci at root {[bus = -1], [dev = -1]}
  #device	mca at root {...}
  
***************
*** 112,119 ****
  #
  
  include "../../../dev/eisa/files.eisa"
- # XXX not yet:
- # file	arch/i386/eisa/eisa_machdep.c	eisa
  
  #
  # PCI-only drivers
--- 112,117 ----
>Audit-Trail:
>Unformatted: