summaryrefslogtreecommitdiff
path: root/sys/dev/ic
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2006-07-06 09:04:46 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2006-07-06 09:04:46 +0000
commitcc8013991fd3163afa7e24d7b9e389bbd12c8efb (patch)
tree7030ccfc94875bf2baa78c48dbdc04c021ec94df /sys/dev/ic
parent3f5787ccb5f7b0d484b51a8d83901633836fbde2 (diff)
do not stash pages 2 and 3 (the volume and physdisk pages respectively)
of the ioc config in the softc. instead, we only walk page 2 when we get the raid config and mark each disks scsi_link structure with the SDEV_LOGICAL flag when we find volumes. while there we mark this instance of the driver as being capable of doing raid so later on we can conditionally hook up bio. when we walk the devices attached to mpi to do ppr, we now skip the logical disks.
Diffstat (limited to 'sys/dev/ic')
-rw-r--r--sys/dev/ic/mpi.c112
-rw-r--r--sys/dev/ic/mpireg.h58
-rw-r--r--sys/dev/ic/mpivar.h7
3 files changed, 90 insertions, 87 deletions
diff --git a/sys/dev/ic/mpi.c b/sys/dev/ic/mpi.c
index efa0f3d073a..70132a157bc 100644
--- a/sys/dev/ic/mpi.c
+++ b/sys/dev/ic/mpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpi.c,v 1.55 2006/07/06 00:55:03 dlg Exp $ */
+/* $OpenBSD: mpi.c,v 1.56 2006/07/06 09:04:45 dlg Exp $ */
/*
* Copyright (c) 2005, 2006 David Gwynne <dlg@openbsd.org>
@@ -322,7 +322,7 @@ mpi_run_ppr(struct mpi_softc *sc)
struct mpi_cfg_hdr hdr;
struct mpi_cfg_spi_port_pg0 pg;
struct scsi_link *link;
- int i, r, tries;
+ int i, tries;
if (mpi_cfg_header(sc, MPI_CONFIG_REQ_PAGE_TYPE_SCSI_SPI_PORT, 0, 0x0,
&hdr) != 0) {
@@ -342,16 +342,11 @@ mpi_run_ppr(struct mpi_softc *sc)
if (link == NULL)
continue;
- /* is this a RAID device? */
- tries = 0;
- for (r = 0; r < sc->sc_ioc_pg2->max_vols; r++)
- if (i == sc->sc_ioc_pg2->raid_vol[r].vol_id) {
- DNPRINTF(MPI_D_PPR, "%s: mpi_run_ppr scsibus "
- "%d ioc %d target %d RAID\n", DEVNAME(sc),
- sc->sc_link.scsibus, sc->sc_ioc_number, i);
- /* XXX fan out ppr */
- }
+ /* do not ppr volumes */
+ if (link->flags & SDEV_VIRTUAL)
+ continue;
+ tries = 0;
while (mpi_ppr(sc, link, pg.min_period, pg.max_offset,
tries) == EAGAIN)
tries++;
@@ -2015,71 +2010,78 @@ void
mpi_get_raid(struct mpi_softc *sc)
{
struct mpi_cfg_hdr hdr;
- struct mpi_cfg_raid_vol *raidvol;
+ struct mpi_cfg_ioc_pg2 *vol_page;
+ struct mpi_cfg_raid_vol *vol_list, *vol;
+ size_t pagelen;
+ u_int32_t capabilities;
+ struct scsi_link *link;
int i;
DNPRINTF(MPI_D_RAID, "%s: mpi_get_raid\n", DEVNAME(sc));
if (mpi_cfg_header(sc, MPI_CONFIG_REQ_PAGE_TYPE_IOC, 2, 0, &hdr) != 0) {
- DNPRINTF(MPI_D_PPR, "%s: mpi_get_raid unable to fetch header"
+ DNPRINTF(MPI_D_RAID, "%s: mpi_get_raid unable to fetch header"
"for IOC page 2\n", DEVNAME(sc));
return;
}
- /* make page length bytes instead of dwords */
- sc->sc_ioc_pg2 = malloc(hdr.page_length * 4, M_DEVBUF, M_WAITOK);
- if (mpi_cfg_page(sc, 0, &hdr, 1, sc->sc_ioc_pg2,
- hdr.page_length * 4) != 0) {
+ pagelen = hdr.page_length * 4; /* dwords to bytes */
+ vol_page = malloc(pagelen, M_TEMP, M_WAITOK);
+ if (vol_page == NULL) {
+ DNPRINTF(MPI_D_RAID, "%s: mpi_get_raid unable to allocate "
+ "space for ioc config page 2\n", DEVNAME(sc));
+ return;
+ }
+ vol_list = (struct mpi_cfg_raid_vol *)(vol_page + 1);
+
+ if (mpi_cfg_page(sc, 0, &hdr, 1, vol_page, pagelen) != 0) {
DNPRINTF(MPI_D_RAID, "%s: mpi_get_raid unable to fetch IOC "
"page 2\n", DEVNAME(sc));
- return;
+ goto out;
}
- DNPRINTF(MPI_D_RAID, "%s: capabilities: %x active vols %d "
- "max vols: %d\n", DEVNAME(sc),
- letoh32(sc->sc_ioc_pg2->capabilities),
- sc->sc_ioc_pg2->no_active_vols, sc->sc_ioc_pg2->max_vols);
- DNPRINTF(MPI_D_RAID, "%s: active phys disks: %d max disks: %d\n",
- DEVNAME(sc), sc->sc_ioc_pg2->no_active_phys_disks,
- sc->sc_ioc_pg2->max_phys_disks);
+ capabilities = letoh32(vol_page->capabilities);
+
+ DNPRINTF(MPI_D_RAID, "%s: capabilities: 0x08%x\n", DEVNAME(sc),
+ letoh32(vol_page->capabilities));
+ DNPRINTF(MPI_D_RAID, "%s: active_vols: %d max_vols: %d "
+ "active_physdisks: %d max_physdisks: %d\n", DEVNAME(sc),
+ vol_page->active_vols, vol_page->max_vols,
+ vol_page->active_physdisks, vol->max_physdisks);
/* don't walk list if there are no RAID capability */
- if (letoh32(sc->sc_ioc_pg2->capabilities) == 0xdeadbeef)
- return;
+ if (capabilities == 0xdeadbeef) {
+ printf("%s: deadbeef in raid configuration\n", DEVNAME(sc));
+ goto out;
+ }
- for (i = 0; i < sc->sc_ioc_pg2->max_vols; i++) {
- raidvol = &sc->sc_ioc_pg2->raid_vol[i];
- DNPRINTF(MPI_D_RAID, "%s: id: %#02x bus: %d ioc: %d page: %d "
- "type: %#02x flags: %#02x\n", DEVNAME(sc), raidvol->vol_id,
- raidvol->vol_bus, raidvol->vol_ioc, raidvol->vol_page,
- raidvol->vol_type, raidvol->flags);
+ if ((capabilities & MPI_CFG_IOC_2_CAPABILITIES_RAID) == 0 ||
+ (vol_page->active_vols == 0))
+ goto out;
- }
+ sc->sc_flags |= MPI_F_RAID;
- /* reuse hdr */
- if (mpi_cfg_header(sc, MPI_CONFIG_REQ_PAGE_TYPE_IOC, 3, 0, &hdr) != 0) {
- DNPRINTF(MPI_D_PPR, "%s: mpi_get_raid unable to fetch header"
- "for IOC page 3\n", DEVNAME(sc));
- return;
- }
+ for (i = 0; i < vol_page->active_vols; i++) {
+ vol = &vol_list[i];
- /* make page length bytes instead of dwords */
- sc->sc_ioc_pg3 = malloc(hdr.page_length * 4, M_DEVBUF, M_WAITOK);
- if (mpi_cfg_page(sc, 0, &hdr, 1, sc->sc_ioc_pg3,
- hdr.page_length * 4) != 0) {
- DNPRINTF(MPI_D_RAID, "%s: mpi_get_raid unable to fetch IOC "
- "page 3\n", DEVNAME(sc));
- return;
- }
+ DNPRINTF(MPI_D_RAID, "%s: id: %d bus: %d ioc: %d pg: %d\n",
+ DEVNAME(sc), vol->vol_id, vol->vol_bus, vol->vol_ioc,
+ vol->vol_page);
+ DNPRINTF(MPI_D_RAID, "%s: type: 0x%02x flags: 0x%02x\n",
+ DEVNAME(sc), vol->vol_type, vol->flags);
- for (i = 0; i < sc->sc_ioc_pg3->no_phys_disks; i++) {
- DNPRINTF(MPI_D_RAID, "%s: id: %#02x bus: %d ioc: %d "
- "num: %#02x\n", DEVNAME(sc),
- sc->sc_ioc_pg3->phys_disks[i].phys_disk_id,
- sc->sc_ioc_pg3->phys_disks[i].phys_disk_bus,
- sc->sc_ioc_pg3->phys_disks[i].phys_disk_ioc,
- sc->sc_ioc_pg3->phys_disks[i].phys_disk_num);
+ if (vol->vol_ioc != sc->sc_ioc_number || vol->vol_bus != 0)
+ continue;
+
+ link = sc->sc_scsibus->sc_link[vol->vol_id][0];
+ if (link == NULL)
+ continue;
+
+ link->flags |= SDEV_VIRTUAL;
}
+
+out:
+ free(vol_page, M_TEMP);
}
int
diff --git a/sys/dev/ic/mpireg.h b/sys/dev/ic/mpireg.h
index 461deb9754d..a7bf6b7615c 100644
--- a/sys/dev/ic/mpireg.h
+++ b/sys/dev/ic/mpireg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpireg.h,v 1.24 2006/07/01 13:23:14 dlg Exp $ */
+/* $OpenBSD: mpireg.h,v 1.25 2006/07/06 09:04:45 dlg Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -1007,6 +1007,28 @@ struct mpi_cfg_manufacturing_pg0 {
char board_tracer_number[16];
} __packed;
+struct mpi_cfg_ioc_pg2 {
+ struct mpi_cfg_hdr config_header;
+
+ u_int32_t capabilities;
+#define MPI_CFG_IOC_2_CAPABILITIES_IS (1<<0)
+#define MPI_CFG_IOC_2_CAPABILITIES_IME (1<<1)
+#define MPI_CFG_IOC_2_CAPABILITIES_IM (1<<2)
+#define MPI_CFG_IOC_2_CAPABILITIES_RAID ( \
+ MPI_CFG_IOC_2_CAPABILITIES_IS | MPI_CFG_IOC_2_CAPABILITIES_IME | \
+ MPI_CFG_IOC_2_CAPABILITIES_IM)
+#define MPI_CFG_IOC_2_CAPABILITIES_SES (1<<29)
+#define MPI_CFG_IOC_2_CAPABILITIES_SAFTE (1<<30)
+#define MPI_CFG_IOC_2_CAPABILITIES_XCHANNEL (1<<31)
+
+ u_int8_t active_vols;
+ u_int8_t max_vols;
+ u_int8_t active_physdisks;
+ u_int8_t physdisks;
+
+ /* followed by a list of mpi_cf_raid_vol structs */
+} __packed;
+
struct mpi_cfg_raid_vol {
u_int8_t vol_id;
u_int8_t vol_bus;
@@ -1014,48 +1036,30 @@ struct mpi_cfg_raid_vol {
u_int8_t vol_page;
u_int8_t vol_type;
-#define MPI_CFG_RAID_TYPE_RAID_IS (1<<0) /* RAID 0 */
-#define MPI_CFG_RAID_TYPE_RAID_IME (1<<1) /* RAID 1 */
-#define MPI_CFG_RAID_TYPE_RAID_IM (1<<2) /* RAID 1 */
-#define MPI_CFG_RAID_TYPE_RAID5 (1<<3)
-#define MPI_CFG_RAID_TYPE_RAID6 (1<<4)
-#define MPI_CFG_RAID_TYPE_RAID10 (1<<5)
-#define MPI_CFG_RAID_TYPE_RAID50 (1<<6)
-#define MPI_CFG_RAID_TYPE_UNKNOWN (0xff)
+#define MPI_CFG_RAID_TYPE_RAID_IS (0x00)
+#define MPI_CFG_RAID_TYPE_RAID_IME (0x01)
+#define MPI_CFG_RAID_TYPE_RAID_IM (0x02)
u_int8_t flags;
-#define MPI_CFG_RAID_VOL_ACTIVE (0<<3)
#define MPI_CFG_RAID_VOL_INACTIVE (1<<3)
u_int16_t reserved;
} __packed;
-struct mpi_cfg_ioc_pg2 {
+struct mpi_cfg_ioc_pg3 {
struct mpi_cfg_hdr config_header;
- u_int32_t capabilities;
+ u_int8_t no_phys_disks;
+ u_int8_t reserved[3];
- u_int8_t no_active_vols;
- u_int8_t max_vols;
- u_int8_t no_active_phys_disks;
- u_int8_t max_phys_disks;
- struct mpi_cfg_raid_vol raid_vol[1]; /* length is stored in header */
+ /* followed by a list of mpi_cf_raid_physdisk structs */
} __packed;
-struct mpi_cfg_raid_pd {
+struct mpi_cfg_raid_physdisk {
u_int8_t phys_disk_id;
u_int8_t phys_disk_bus;
u_int8_t phys_disk_ioc;
u_int8_t phys_disk_num;
} __packed;
-struct mpi_cfg_ioc_pg3 {
- struct mpi_cfg_hdr config_header;
-
- u_int8_t no_phys_disks;
- u_int8_t reserved[3];
-
- struct mpi_cfg_raid_pd phys_disks[1]; /* length stored in header */
-} __packed;
-
struct mpi_cfg_fc_port_pg0 {
struct mpi_cfg_hdr config_header;
diff --git a/sys/dev/ic/mpivar.h b/sys/dev/ic/mpivar.h
index e019923e1ed..51111dda0b4 100644
--- a/sys/dev/ic/mpivar.h
+++ b/sys/dev/ic/mpivar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpivar.h,v 1.16 2006/07/06 00:55:03 dlg Exp $ */
+/* $OpenBSD: mpivar.h,v 1.17 2006/07/06 09:04:45 dlg Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -96,6 +96,7 @@ struct mpi_softc {
int sc_flags;
#define MPI_F_VMWARE (1<<0)
+#define MPI_F_RAID (1<<1)
struct scsibus_softc *sc_scsibus;
@@ -120,10 +121,6 @@ struct mpi_softc {
struct mpi_ccb_list sc_ccb_free;
struct mpi_dmamem *sc_replies;
-
- /* RAID pages */
- struct mpi_cfg_ioc_pg2 *sc_ioc_pg2;
- struct mpi_cfg_ioc_pg3 *sc_ioc_pg3;
};
int mpi_attach(struct mpi_softc *);