summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2006-06-16 05:36:47 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2006-06-16 05:36:47 +0000
commit5cea5eca15fe46f4bab0e4dda217c299dfaaaec7 (patch)
treef6800db2b1bab694b09560db1dd86557e46bd8c3
parent3041ce04daa2195926b48a18c5b2c5dd81427f4c (diff)
vmware emulates mpi, but it does a half arsed job of it. half the fields
we read off the hardware and use to configure the driver with are set to zero, so things dont really work like we want them to. one of these fields is the pci subsystem id which is something we can fetch really early in the attach process. so if the subsys is 0 then we go on and fix up some of the values we get off the "hardware". now we can attach disks on vmware. "sneaky" and ok marco@ tested by and ok brad@
-rw-r--r--sys/dev/ic/mpi.c8
-rw-r--r--sys/dev/ic/mpivar.h5
-rw-r--r--sys/dev/pci/mpi_pci.c6
3 files changed, 15 insertions, 4 deletions
diff --git a/sys/dev/ic/mpi.c b/sys/dev/ic/mpi.c
index a9a8982a97c..6eb2203fc5f 100644
--- a/sys/dev/ic/mpi.c
+++ b/sys/dev/ic/mpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpi.c,v 1.43 2006/06/15 07:35:44 marco Exp $ */
+/* $OpenBSD: mpi.c,v 1.44 2006/06/16 05:36:46 dlg Exp $ */
/*
* Copyright (c) 2005, 2006 David Gwynne <dlg@openbsd.org>
@@ -1583,9 +1583,13 @@ mpi_iocfacts(struct mpi_softc *sc)
letoh32(ifp.host_page_buffer_sge.sg_lo_addr));
sc->sc_maxcmds = letoh16(ifp.global_credits);
- sc->sc_buswidth = (ifp.max_devices == 0) ? 256 : ifp.max_devices;
sc->sc_maxchdepth = ifp.max_chain_depth;
sc->sc_ioc_number = ifp.ioc_number;
+ if (sc->sc_flags & MPI_F_VMWARE)
+ sc->sc_buswidth = 16;
+ else
+ sc->sc_buswidth =
+ (ifp.max_devices == 0) ? 256 : ifp.max_devices;
/*
* you can fit sg elements on the end of the io cmd if they fit in the
diff --git a/sys/dev/ic/mpivar.h b/sys/dev/ic/mpivar.h
index ce797a9ecb3..96e0df6e6f4 100644
--- a/sys/dev/ic/mpivar.h
+++ b/sys/dev/ic/mpivar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpivar.h,v 1.14 2006/06/15 07:35:44 marco Exp $ */
+/* $OpenBSD: mpivar.h,v 1.15 2006/06/16 05:36:46 dlg Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -94,6 +94,9 @@ struct mpi_softc {
struct device sc_dev;
struct scsi_link sc_link;
+ int sc_flags;
+#define MPI_F_VMWARE (1<<0)
+
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
bus_size_t sc_ios;
diff --git a/sys/dev/pci/mpi_pci.c b/sys/dev/pci/mpi_pci.c
index 3521d24f916..3955a7ffc0d 100644
--- a/sys/dev/pci/mpi_pci.c
+++ b/sys/dev/pci/mpi_pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpi_pci.c,v 1.7 2006/06/14 08:26:31 dlg Exp $ */
+/* $OpenBSD: mpi_pci.c,v 1.8 2006/06/16 05:36:46 dlg Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -136,6 +136,10 @@ mpi_pci_attach(struct device *parent, struct device *self, void *aux)
}
printf(": %s", intrstr);
+ /* vmware doesn't fill in the pci subsystem register */
+ if (pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG) == 0x0)
+ sc->sc_flags |= MPI_F_VMWARE;
+
if (mpi_attach(sc) != 0) {
/* error printed by mpi_attach */
goto deintr;