*BSD News Article 53027


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!simtel!zombie.ncsc.mil!news.mathworks.com!uunet!in1.uu.net!news.iij.ad.jp!sranha.sra.co.jp!sranhc.sra.co.jp!sran230.sra.co.jp!soda
From: soda@sra.CO.JP (Noriyuki Soda)
Newsgroups: comp.unix.bsd.netbsd.misc
Subject: Re: aha2840 port
Date: 13 Oct 1995 20:13:34 GMT
Organization: Software Research Associates, Inc., Japan
Lines: 300
Distribution: world
Message-ID: <SODA.95Oct14051335@sran230.sra.CO.JP>
References: <4560u2$ad7@boson.epita.fr>
NNTP-Posting-Host: sran230.sra.co.jp
In-reply-to: laurent@epita.epita.fr's message of 7 Oct 1995 13:56:18 GMT

>>>>> On 7 Oct 1995 13:56:18 GMT,
	laurent@epita.epita.fr (Laurent Genier) said:

> I 'm looking for someone who succeeded in installing an adaptec 2840
> VLB under NetBSD-1.0 ou NetBSD-current.

I'm using AHA-2840 VLB on NetBSD-current.
Patches to Stefan's driver (*1) is the following.
(This patch is based on FreeBSD's aic7770.c revision 1.15 by Justin T. Gibbs.)

--- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE ---
--- aic7870.c.org	Sat Oct 14 05:19:31 1995
+++ aic7870.c	Sat Oct 14 05:19:54 1995
@@ -29,103 +29,218 @@
 #include <sys/device.h>
 #include <scsi/scsi_all.h>
 #include <scsi/scsiconf.h>
+
+#include "isa.h"
+#include "pci.h"
+
+#include <dev/isa/isareg.h>
+#if NISA > 0
+#include <dev/isa/isavar.h>
+#include <dev/isa/isadmavar.h>
+#endif
+
+#if NPCI > 0
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
+#endif
+
 #include <dev/ic/aic7xxx.h>
-#include <dev/isa/isareg.h>
 #include <i386/include/pio.h>   
 #define DELAY(x)        delay(x)
 
+#if NISA > 0
+/*
+ * Standard EISA Host ID regs  (Offset from slot base)
+ */
+
+#define HID0		0xC80	/* 0,1: msb of ID2, 2-7: ID1      */
+#define HID1		0xC81	/* 0-4: ID3, 5-7: LSB ID2         */
+#define HID2		0xC82	/* product                        */
+#define HID3		0xC83	/* firmware revision              */
+
+#define CHAR1(B1,B2) (((B1>>2) & 0x1F) | '@')
+#define CHAR2(B1,B2) (((B1<<3) & 0x18) | ((B2>>5) & 0x7)|'@')
+#define CHAR3(B1,B2) ((B2 & 0x1F) | '@')
+
+#define	EISA_MAX_SLOTS	16	/* XXX should be defined in a common header */
+static	ahc_slot = 0;		/* slot last board was found in */
+
+typedef struct
+{
+  ahc_type type;
+  unsigned char id; /* The Last EISA Host ID reg */
+} aic7770_sig;
+
+#endif /* NISA */
 
+#if NPCI > 0
 #define PCI_BASEADR0	PCI_MAP_REG_START
 #define PCI_DEVICE_ID_ADAPTEC_2940	0x71789004ul
 #define PCI_DEVICE_ID_ADAPTEC_AIC7870	0x70789004ul
 
-
 static u_long aic7870_count;
+#endif
 
-static int aic7870_probe();
-static void aic7870_attach();
+static int aic7870_probe __P((struct device *parent, void *match, void *aux));
+static void aic7870_attach __P((struct device *parent, struct device *self,
+			    void *aux));
 
 struct cfdriver ahccd = {
         NULL, "ahc", aic7870_probe, aic7870_attach, DV_DULL, 
         sizeof(struct ahc_softc)
 }; 
 
-extern
-ahcintr();
-      
-
 int
-aic7870_probe(parent, self, aux)
-        struct device *parent, *self;
-        void *aux; 
+aic7870_probe(parent, match, aux)
+        struct device *parent;
+        void *match, *aux; 
 {       
-        struct cfdata *cf = self->dv_cfdata;
-        struct pci_attach_args *pa = aux;
-        struct ahc_softc *ahc = (void *)self;
+        struct ahc_softc *sc = match;
+	extern struct cfdriver isacd, pcicd;
 
+#if NISA > 0
+        u_long  port;
+	int	i;
+        u_char  sig_id[4];
+
+	aic7770_sig valid_ids[] = {
+	/* Entries of other tested adaptors should be added here */
+		{ AHC_274,	0x71 }, /*274x*/
+		{ AHC_274,	0x70 }, /*aic7770 on Motherboard*/
+		{ AHC_284,	0x56 }, /*284x, BIOS enabled*/
+		{ AHC_284,	0x57 }  /*284x, BIOS disabled*/
+	};
+
+	if (parent->dv_cfdata->cf_driver == &isacd) {
+		struct isa_attach_args *ia = aux;
+
+		ahc_slot++;
+		while (ahc_slot < EISA_MAX_SLOTS) {
+			port = 0x1000 * ahc_slot;
+			for( i = 0; i < sizeof(sig_id); i++ )
+			{
+				/*
+				 * An outb is required to prime these
+				 * registers on VL cards
+				 */
+				outb( port + HID0, HID0 + i );
+				sig_id[i] = inb(port + HID0 + i);
+			}
+			if (sig_id[0] == 0xff) {
+				ahc_slot++;
+				continue;
+			}
+			/* Check manufacturer's ID. */
+			if ((CHAR1(sig_id[0], sig_id[1]) == 'A')
+			    && (CHAR2(sig_id[0], sig_id[1]) == 'D')
+			    && (CHAR3(sig_id[0], sig_id[1]) == 'P')
+			    && (sig_id[2] == 0x77)) {
+				for(i=0; i < sizeof(valid_ids)/sizeof(aic7770_sig);i++)
+					if ( sig_id[3] == valid_ids[i].id ) {
+						sc->type = valid_ids[i].type;
+						if (ahcprobe(sc, port)) {
+							if (ia->ia_irq != IRQUNK) {
+								if (ia->ia_irq !=
+								    sc->vect) {
+									printf("%s: irq mismatch; kernel configured %d != board configured %d\n",
+									       sc->sc_dev.dv_xname, ia->ia_irq, sc->vect);
+									return 0;
+								}
+							} else
+								ia->ia_irq = sc->vect;
+							ia->ia_msize = 0;
+							ia->ia_iobase =
+								port + 0xc00;
+							/* XXX - should #def */
+							ia->ia_iosize = 256;
+							/* IO_EISASIZE */
+							return 1;
+						}
+					}
+			}
+			ahc_slot++;
+		}
+	}
+#endif /* NISA */
+
+#if NPCI > 0
+	if (parent->dv_cfdata->cf_driver == &pcicd) {
+		struct pci_attach_args *pa = aux;
 #if 0        
-        if (!pci_targmatch(cf, pa))
-                return 0;
+		if (!pci_targmatch(cf, pa))
+			return 0;
 #endif
-        switch(pa->pa_id) {
+		switch(pa->pa_id) {
                 case PCI_DEVICE_ID_ADAPTEC_2940:
     	    	    	return 1;
                         break;
                 case PCI_DEVICE_ID_ADAPTEC_AIC7870:
     	    	    	return 1;
                         break;
-                default:
-			return (0);
-                        break;
-        }
+		}
+	}
+#endif /* NPCI */
+        return 0;
 }
 void    
 aic7870_attach(parent, self, aux)
         struct device *parent, *self;
         void *aux;
 {       
-        struct pci_attach_args *pa = aux;
-        int retval;
-        struct ahc_softc *ahc = (void *)self;
-	u_long io_port; 
-	unsigned opri = 0;
+        struct ahc_softc *sc = (void *)self;
+	unsigned opri;
+	extern struct cfdriver isacd, pcicd;
+
+#if NPCI > 0
+	if (parent->dv_cfdata->cf_driver == &pcicd) {
+		struct pci_attach_args *pa = aux;
+		u_long io_port; 
 
-        switch(pa->pa_id) {
+		switch(pa->pa_id) {
                 case PCI_DEVICE_ID_ADAPTEC_2940:
-			ahc->type=AHC_294;
+			sc->type=AHC_294;
                         break;
                 case PCI_DEVICE_ID_ADAPTEC_AIC7870:
-			ahc->type=AHC_AIC7870;
+			sc->type=AHC_AIC7870;
                         break;
                 default:
                         break;
-        }
-        if(!(io_port = pci_conf_read(pa->pa_tag, PCI_BASEADR0)))
-		return;
-	/*
-	 * Make the offsets the same as for EISA
-	 * The first bit of PCI_BASEADR0 is always
-	 * set hence we subtract 0xc01 instead of the
-	 * 0xc00 that you would expect.
-	 */
-	io_port -= 0xc01ul; 
-	/*printf("ioport %x\n",io_port);/**/
-
-	if(ahcprobe(ahc,io_port)){
-		if((ahc->sc_ih=
-		    pci_map_int(pa->pa_tag, PCI_IPL_BIO, ahcintr, ahc))==NULL) {
-			return;
 		}
+		if(!(io_port = pci_conf_read(pa->pa_tag, PCI_BASEADR0)))
+			return;
 		/*
-		 * Since ahc_attach will poll, protect ourself
-		 * from the registered interrupt handler.
+		 * Make the offsets the same as for EISA
+		 * The first bit of PCI_BASEADR0 is always
+		 * set hence we subtract 0xc01 instead of the
+		 * 0xc00 that you would expect.
 		 */
-		opri = splbio();
-		ahc_attach(ahc);
-		splx(opri);
+		io_port -= 0xc01ul; 
+		/*printf("ioport %x\n",io_port);/**/
+
+		if(!ahcprobe(sc,io_port))
+			return;
+		if((sc->sc_ih = pci_map_int(pa->pa_tag, PCI_IPL_BIO,
+					     ahcintr, sc)) == NULL)
+			return;
+	}
+#endif /* NPCI */
+
+#if NISA > 0
+	if (parent->dv_cfdata->cf_driver == &isacd) {
+		struct isa_attach_args *ia = aux;
+
+		sc->sc_ih = isa_intr_establish(ia->ia_irq,
+					       ISA_IST_EDGE, ISA_IPL_BIO,
+					       ahcintr, sc);
 	}
-	return;
+#endif /* NISA */
+
+	/*
+	 * Since ahc_attach will poll, protect ourself
+	 * from the registered interrupt handler.
+	 */
+	opri = splbio();
+	ahc_attach(sc);
+	splx(opri);
 }       
 
--- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE ---

You must add the following to /usr/src/sys/dev/pci/files.pci.
(this is slightly different from Stefan's files.pci.add)

--- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE ---
# Adaptec AIC-7770/7870 ICs
device	ahc at isa, pci: scsi
file	dev/pci/aic7870.c		ahc
file	dev/ic/aic7xxx.c		ahc
--- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE ---

(*1) Stefan's AHA-2940 driver is found in 
ftp://ftp.uni-mainz.de/pub/NetBSD/misc_features/Stefan/kernel/scsi/aic7xxx_4NetBSD-current.tar.gz
--
soda@sra.co.jp		Software Research Associates, Inc., Japan
(Noriyuki Soda)		   software tools and technology group