From f862e4d733eb527d5a30eee5193e963fabf5bedb Mon Sep 17 00:00:00 2001
From: mjacob <mjacob@FreeBSD.org>
Date: Fri, 23 Aug 2002 06:56:08 +0000
Subject: [PATCH] Pick a cleaner method (and put in a separate function) for
 finding the peer device on a dual board.

---
 sys/dev/mpt/mpt_pci.c | 64 +++++++++++++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 21 deletions(-)

diff --git a/sys/dev/mpt/mpt_pci.c b/sys/dev/mpt/mpt_pci.c
index 6012eb45fd1d..3f1d48a22e02 100644
--- a/sys/dev/mpt/mpt_pci.c
+++ b/sys/dev/mpt/mpt_pci.c
@@ -65,6 +65,10 @@
 #define	PCI_PRODUCT_LSI_1030		0x0030
 #endif
 
+#ifndef	PCIM_CMD_SERRESPEN
+#define	PCIM_CMD_SERRESPEN	0x0100
+#endif
+
 
 
 #define	MEM_MAP_REG	0x14
@@ -166,7 +170,6 @@ mpt_set_options(mpt_softc_t *mpt)
 		}
 	}
 
-	cmd = pci_read_config(dev, PCIR_COMMAND, 2);
 }
 #else
 static void
@@ -188,6 +191,38 @@ mpt_set_options(mpt_softc_t *mpt)
 #endif
 
 
+static void
+mpt_link_peer(mpt_softc_t *mpt)
+{
+	mpt_softc_t *mpt2;
+
+	if (mpt->unit == 0) {
+		return;
+	}
+
+	/*
+	 * XXX: depends on probe order
+	 */
+	mpt2 = (mpt_softc_t *) devclass_get_softc(mpt_devclass, mpt->unit-1);
+
+	if (mpt2 == NULL) {
+		return;
+	}
+	if (pci_get_vendor(mpt2->dev) != pci_get_vendor(mpt->dev)) {
+		return;
+	}
+	if (pci_get_device(mpt2->dev) != pci_get_device(mpt->dev)) {
+		return;
+	}
+	mpt->mpt2 = mpt2;
+	mpt2->mpt2 = mpt;
+	if (mpt->verbose) {
+		device_printf(mpt->dev, "linking with peer (mpt%d)\n",
+		    device_get_unit(mpt2->dev));
+	}
+}
+
+
 static int
 mpt_attach(device_t dev)
 {
@@ -238,26 +273,13 @@ mpt_attach(device_t dev)
 	pci_write_config(dev, PCIR_BIOS, data, 4);
 
 
-	/* Is this part a dual? */
-	if ((pci_get_device(dev) & ~1) == PCI_PRODUCT_LSI_FC929) {
-		/* Yes; is the previous device the counterpart? */
-		if (mpt->unit) {
-			mpt->mpt2 = (mpt_softc_t *)
-				devclass_get_softc(mpt_devclass, mpt->unit-1);
-
-			if ((mpt->mpt2->mpt2 == NULL)
-			  && (pci_get_vendor(mpt->mpt2->dev) == PCI_VENDOR_LSI)
-			  && ((pci_get_device(mpt->mpt2->dev) & ~1) == PCI_PRODUCT_LSI_FC929) ) {
-				/* Yes */
-				mpt->mpt2->mpt2 = mpt;
-				if (mpt->verbose) {
-					device_printf(dev, "Detected dual\n");
-				}
-			} else {
-				/* Nope */
-				mpt->mpt2 = NULL;
-			}
-		}
+	/*
+	 * Is this part a dual?
+	 * If so, link with our partner (around yet)
+	 */
+	if ((pci_get_device(dev) & ~1) == PCI_PRODUCT_LSI_FC929 ||
+	    (pci_get_device(dev) & ~1) == PCI_PRODUCT_LSI_1030) {
+		mpt_link_peer(mpt);
 	}
 
 	/* Set up the memory regions */