[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [OpenBSD 2.9] HP NetRAID 4M (aac driver) Undetected



Ok, here's a patch to src/sys that might make the HP NetRAID 4M work.
Furthermore I discovered that all the StrongARM-based aac device
were probably wrongly probed for.  So if you have an Adaptec 364,
Adaptec 3642, Dell PERC 2/QC or Dell PERC 3/QC Raid controller
this patch might make them attach correctly.  Yet one more thing
which I believe also hits ami, cac and puc; they don't do endian
conversion of their sub-ids, which ought to make them unusable
on powerpc.  mickey@ should be able to test that suspicion, at least
for ami and cac.

Niklas

Index: dev/pci/pcidevs
===================================================================
RCS file: /cvs/src/sys/dev/pci/pcidevs,v
retrieving revision 1.413
diff -u -r1.413 pcidevs
--- dev/pci/pcidevs	2001/07/06 17:06:48	1.413
+++ dev/pci/pcidevs	2001/07/07 10:44:37
@@ -722,6 +722,7 @@
 product ADP2 AAC364		0x0364	AAC-364
 product ADP2 AAC3642		0x0365	AAC-3642
 product ADP2 PERC_2QC		0x1364	Dell PERC 2/QC
+/* XXX guess */
 product ADP2 PERC_3QC		0x1365	Dell PERC 3/QC
 
 /* Advanced System Products */
@@ -1013,6 +1014,13 @@
 product DELL PERC_2SI		0x0001	PERC 2/Si
 product DELL PERC_3DI		0x0002	PERC 3/Di
 product DELL PERC_3SI		0x0003	PERC 3/Si
+product DELL PERC_3SI_2		0x0004	PERC 3/Si
+product DELL PERC_3DI_2		0x0008	PERC 3/Di
+product DELL PERC_3SI		0x0003	PERC 3/Si
+product DELL PERC_3DI_2_SUB	0x00cf	PERC 3/Di
+product DELL PERC_3SI_2_SUB	0x00d0	PERC 3/Si
+product DELL PERC_3DI_SUB2	0x00d1	PERC 3/Di
+product DELL PERC_3DI_SUB3	0x00d9	PERC 3/Di
 
 /* D-Link products */
 product DLINK 550TX		0x1002	550TX
@@ -1110,7 +1118,6 @@
 /* Hewlett-Packard products */
 product HP J2585A		0x1030	J2585A
 product HP J2585B		0x1031	J2585B
-/* XXX guess */
 product HP NETRAID_4M		0x10c2	NetRaid-4M
 
 /* Hi/Fn products */
Index: dev/pci/pcidevs.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/pcidevs.h,v
retrieving revision 1.417
diff -u -r1.417 pcidevs.h
--- dev/pci/pcidevs.h	2001/07/06 17:07:30	1.417
+++ dev/pci/pcidevs.h	2001/07/07 10:44:45
@@ -727,6 +727,7 @@
 #define	PCI_PRODUCT_ADP2_AAC364	0x0364		/* AAC-364 */
 #define	PCI_PRODUCT_ADP2_AAC3642	0x0365		/* AAC-3642 */
 #define	PCI_PRODUCT_ADP2_PERC_2QC	0x1364		/* Dell PERC 2/QC */
+/* XXX guess */
 #define	PCI_PRODUCT_ADP2_PERC_3QC	0x1365		/* Dell PERC 3/QC */
 
 /* Advanced System Products */
@@ -1018,6 +1019,13 @@
 #define	PCI_PRODUCT_DELL_PERC_2SI	0x0001		/* PERC 2/Si */
 #define	PCI_PRODUCT_DELL_PERC_3DI	0x0002		/* PERC 3/Di */
 #define	PCI_PRODUCT_DELL_PERC_3SI	0x0003		/* PERC 3/Si */
+#define	PCI_PRODUCT_DELL_PERC_3SI_2	0x0004		/* PERC 3/Si */
+#define	PCI_PRODUCT_DELL_PERC_3DI_2	0x0008		/* PERC 3/Di */
+#define	PCI_PRODUCT_DELL_PERC_3SI	0x0003		/* PERC 3/Si */
+#define	PCI_PRODUCT_DELL_PERC_3DI_2_SUB	0x00cf		/* PERC 3/Di */
+#define	PCI_PRODUCT_DELL_PERC_3SI_2_SUB	0x00d0		/* PERC 3/Si */
+#define	PCI_PRODUCT_DELL_PERC_3DI_SUB2	0x00d1		/* PERC 3/Di */
+#define	PCI_PRODUCT_DELL_PERC_3DI_SUB3	0x00d9		/* PERC 3/Di */
 
 /* D-Link products */
 #define	PCI_PRODUCT_DLINK_550TX	0x1002		/* 550TX */
@@ -1115,7 +1123,6 @@
 /* Hewlett-Packard products */
 #define	PCI_PRODUCT_HP_J2585A	0x1030		/* J2585A */
 #define	PCI_PRODUCT_HP_J2585B	0x1031		/* J2585B */
-/* XXX guess */
 #define	PCI_PRODUCT_HP_NETRAID_4M	0x10c2		/* NetRaid-4M */
 
 /* Hi/Fn products */
Index: dev/pci/pcidevs_data.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/pcidevs_data.h,v
retrieving revision 1.417
diff -u -r1.417 pcidevs_data.h
--- dev/pci/pcidevs_data.h	2001/07/06 17:07:31	1.417
+++ dev/pci/pcidevs_data.h	2001/07/07 10:44:45
@@ -1423,6 +1423,34 @@
 	    "PERC 3/Si",
 	},
 	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI_2,
+	    "PERC 3/Si",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI_2,
+	    "PERC 3/Di",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI,
+	    "PERC 3/Si",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI_2_SUB,
+	    "PERC 3/Di",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI_2_SUB,
+	    "PERC 3/Si",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI_SUB2,
+	    "PERC 3/Di",
+	},
+	{
+	    PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI_SUB3,
+	    "PERC 3/Di",
+	},
+	{
 	    PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_550TX,
 	    "550TX",
 	},
Index: dev/pci/aac_pci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/aac_pci.c,v
retrieving revision 1.2
diff -u -r1.2 aac_pci.c
--- dev/pci/aac_pci.c	2001/06/12 15:40:29	1.2
+++ dev/pci/aac_pci.c	2001/07/07 10:57:48
@@ -65,18 +65,46 @@
 struct aac_ident {
 	u_int16_t vendor;
 	u_int16_t device;
+	u_int16_t subvendor;
+	u_int16_t subdevice;
 	int	hwif;
 } aac_identifiers[] = {
-	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_2SI, AAC_HWIF_I960RX },
-	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI, AAC_HWIF_I960RX },
-	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI, AAC_HWIF_I960RX },
-	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_AAC2622, AAC_HWIF_I960RX },
-	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_AAC364, AAC_HWIF_STRONGARM },
-	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_AAC3642, AAC_HWIF_STRONGARM },
-	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_PERC_2QC, AAC_HWIF_STRONGARM },
-	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_PERC_3QC, AAC_HWIF_STRONGARM },
-	{ PCI_VENDOR_HP, PCI_PRODUCT_HP_NETRAID_4M, AAC_HWIF_STRONGARM },
-	{ 0, 0, 0 }
+	/* Dell PERC 2/Si models */
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_2SI, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_2SI, AAC_HWIF_I960RX },
+	/* Dell PERC 3/Di models */
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3DI, AAC_HWIF_I960RX },
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3DI_SUB2, AAC_HWIF_I960RX },
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3DI_SUB3, AAC_HWIF_I960RX },
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3DI_2, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3DI_2_SUB, AAC_HWIF_I960RX },
+	/* Dell PERC 3/Si models */
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3SI, AAC_HWIF_I960RX },
+	{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC_3SI_2, PCI_VENDOR_DELL,
+	    PCI_PRODUCT_DELL_PERC_3SI_2_SUB, AAC_HWIF_I960RX },
+	/* Adaptec ADP-2622 */
+	{ PCI_VENDOR_ADP2, PCI_PRODUCT_ADP2_AAC2622, PCI_VENDOR_ADP2,
+	    PCI_PRODUCT_ADP2_AAC2622, AAC_HWIF_I960RX },
+	/* Adaptec ADP-364 */
+	{ PCI_VENDOR_DEC, PCI_PRODUCT_DEC_CPQ42XX, PCI_VENDOR_ADP2,
+	    PCI_PRODUCT_ADP2_AAC364, AAC_HWIF_STRONGARM },
+	/* Adaptec ADP-3642 */
+	{ PCI_VENDOR_DEC, PCI_PRODUCT_DEC_CPQ42XX, PCI_VENDOR_ADP2,
+	    PCI_PRODUCT_ADP2_AAC3642, AAC_HWIF_STRONGARM },
+	/* Dell PERC 2/QC */
+	{ PCI_VENDOR_DEC, PCI_PRODUCT_DEC_CPQ42XX, PCI_VENDOR_ADP2,
+	    PCI_PRODUCT_ADP2_PERC_2QC, AAC_HWIF_STRONGARM },
+	/* Dell PERC 3/QC */
+	{ PCI_VENDOR_DEC, PCI_PRODUCT_DEC_CPQ42XX, PCI_VENDOR_ADP2,
+	    PCI_PRODUCT_ADP2_PERC_3QC, AAC_HWIF_STRONGARM },
+	/* HP NetRAID-4M */
+	{ PCI_VENDOR_DEC, PCI_PRODUCT_DEC_CPQ42XX, PCI_VENDOR_HP,
+	    PCI_PRODUCT_HP_NETRAID_4M, AAC_HWIF_STRONGARM },
+	{ 0, 0, 0, 0 }
 };
 
 struct cfattach aac_pci_ca = {
@@ -94,11 +122,17 @@
 {
         struct pci_attach_args *pa = aux;
 	struct aac_ident *m;
+	u_int32_t subsysid;
 
 	for (m = aac_identifiers; m->vendor != 0; m++)
 		if (m->vendor == PCI_VENDOR(pa->pa_id) &&
-		    m->device == PCI_PRODUCT(pa->pa_id))
-			return (1);
+		    m->device == PCI_PRODUCT(pa->pa_id)) {
+			subsysid = letoh32(pci_conf_read(pa->pa_pc, pa->pa_tag,
+			    PCI_SUBSYS_ID_REG));
+			if (m->subvendor == PCI_VENDOR(subsysid) &&
+			    m->subdevice == PCI_PRODUCT(subsysid))
+				return (1);
+		}
 	return (0);
 }
 
@@ -117,6 +151,7 @@
 	const char *intrstr;
 	int state = 0;
 	struct aac_ident *m;
+	u_int32_t subsysid;
 
 	printf(": ");
 
@@ -172,21 +207,26 @@
 	for (m = aac_identifiers; m->vendor != 0; m++)
 		if (m->vendor == PCI_VENDOR(pa->pa_id) &&
 		    m->device == PCI_PRODUCT(pa->pa_id)) {
-			sc->sc_hwif = m->hwif;
-			switch(sc->sc_hwif) {
-			case AAC_HWIF_I960RX:
-				AAC_DPRINTF(AAC_D_MISC,
-				    ("set hardware up for i960Rx"));
-				sc->sc_if = aac_rx_interface;
-				break;
-
-			case AAC_HWIF_STRONGARM:
-				AAC_DPRINTF(AAC_D_MISC,
-				    ("set hardware up for StrongARM"));
-				sc->sc_if = aac_sa_interface;
+			subsysid = letoh32(pci_conf_read(pa->pa_pc, pa->pa_tag,
+			    PCI_SUBSYS_ID_REG));
+			if (m->subvendor == PCI_VENDOR(subsysid) &&
+			    m->subdevice == PCI_PRODUCT(subsysid)) {
+				sc->sc_hwif = m->hwif;
+				switch(sc->sc_hwif) {
+				case AAC_HWIF_I960RX:
+					AAC_DPRINTF(AAC_D_MISC,
+					    ("set hardware up for i960Rx"));
+					sc->sc_if = aac_rx_interface;
+					break;
+
+				case AAC_HWIF_STRONGARM:
+					AAC_DPRINTF(AAC_D_MISC,
+					    ("set hardware up for StrongARM"));
+					sc->sc_if = aac_sa_interface;
+					break;
+				}
 				break;
 			}
-			break;
 		}
 
 	if (aac_attach(sc))