summaryrefslogtreecommitdiff
path: root/sys/dev/ic
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ic')
-rw-r--r--sys/dev/ic/mpi.c74
-rw-r--r--sys/dev/ic/mpireg.h48
2 files changed, 118 insertions, 4 deletions
diff --git a/sys/dev/ic/mpi.c b/sys/dev/ic/mpi.c
index 6eb2203fc5f..1712936b5ed 100644
--- a/sys/dev/ic/mpi.c
+++ b/sys/dev/ic/mpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpi.c,v 1.44 2006/06/16 05:36:46 dlg Exp $ */
+/* $OpenBSD: mpi.c,v 1.45 2006/06/18 00:08:00 marco Exp $ */
/*
* Copyright (c) 2005, 2006 David Gwynne <dlg@openbsd.org>
@@ -44,7 +44,7 @@ uint32_t mpi_debug = 0
/* | MPI_D_MEM */
/* | MPI_D_CCB */
/* | MPI_D_PPR */
- | MPI_D_RAID
+/* | MPI_D_RAID */
;
#endif
@@ -79,6 +79,7 @@ void mpi_start(struct mpi_softc *, struct mpi_ccb *);
int mpi_complete(struct mpi_softc *, struct mpi_ccb *, int);
int mpi_poll(struct mpi_softc *, struct mpi_ccb *, int);
+void mpi_fc_print(struct mpi_softc *);
void mpi_run_ppr(struct mpi_softc *);
int mpi_ppr(struct mpi_softc *, struct scsi_link *,
int, int, int);
@@ -214,6 +215,8 @@ mpi_attach(struct mpi_softc *sc)
/* do domain validation */
if (sc->sc_porttype == MPI_PORTFACTS_PORTTYPE_SCSI)
mpi_run_ppr(sc);
+ if (sc->sc_porttype == MPI_PORTFACTS_PORTTYPE_FC)
+ mpi_fc_print(sc);
/* XXX enable interrupts */
mpi_write(sc, MPI_INTR_MASK, MPI_INTR_MASK_DOORBELL);
@@ -234,6 +237,72 @@ free_ccbs:
}
void
+mpi_fc_print(struct mpi_softc *sc)
+{
+ struct mpi_cfg_hdr hdr;
+ struct mpi_cfg_fc_port_pg0 pg;
+ struct mpi_cfg_fc_device_pg0 dpg;
+ struct device *dev;
+ struct scsibus_softc *ssc;
+ struct scsi_link *link;
+ int i;
+ u_int32_t btid;
+
+ if (mpi_cfg_header(sc, MPI_CONFIG_REQ_PAGE_TYPE_FC_PORT, 0, 0,
+ &hdr) != 0) {
+ DNPRINTF(MPI_D_PPR, "%s: mpi_fc_print unable to fetch header\n",
+ DEVNAME(sc));
+ return;
+ }
+
+ if (mpi_cfg_page(sc, 0, &hdr, 1, &pg, sizeof(pg)) != 0) {
+ DNPRINTF(MPI_D_PPR, "%s: mpi_fc_print unable to fetch page\n",
+ DEVNAME(sc));
+ return;
+ }
+
+ printf("%s: at: %dGHz WWNN: %016llx WWPN: %016llx\n", DEVNAME(sc),
+ letoh32(pg.current_speed), letoh64(pg.wwnn), letoh64(pg.wwpn));
+
+ TAILQ_FOREACH(dev, &alldevs, dv_list) {
+ if (dev->dv_parent == &sc->sc_dev)
+ break;
+ }
+
+ /* im too nice to punish idiots who don't configure scsibus */
+ if (dev == NULL)
+ return;
+
+ ssc = (struct scsibus_softc *)dev;
+ for (i = 0; i < sc->sc_link.adapter_buswidth; i++) {
+
+ link = ssc->sc_link[i][0];
+
+ if (link == NULL)
+ continue;
+
+ btid = i | MPI_PAGE_ADDRESS_FC_BTID;
+ if (mpi_cfg_header(sc, MPI_CONFIG_REQ_PAGE_TYPE_FC_DEV, 0,
+ btid, &hdr) != 0) {
+ DNPRINTF(MPI_D_PPR, "%s: mpi_fc_print unable to fetch "
+ "device header 0\n", DEVNAME(sc));
+ return;
+ }
+
+ bzero(&dpg, sizeof(dpg));
+ if (mpi_cfg_page(sc, btid, &hdr, 1, &dpg, sizeof(dpg)) != 0) {
+ DNPRINTF(MPI_D_PPR, "%s: mpi_fc_print unable to fetch "
+ "device page 0\n", DEVNAME(sc));
+ continue;
+ }
+
+ printf("%s: target %d WWNN: %016llx WWPN: %016llx\n",
+ DEVNAME(sc), i, letoh64(dpg.wwnn),
+ letoh64(dpg.wwpn));
+ }
+}
+
+void
mpi_run_ppr(struct mpi_softc *sc)
{
struct mpi_cfg_hdr hdr;
@@ -295,7 +364,6 @@ mpi_run_ppr(struct mpi_softc *sc)
}
}
-
int
mpi_ppr(struct mpi_softc *sc, struct scsi_link *link, int period, int offset,
int try)
diff --git a/sys/dev/ic/mpireg.h b/sys/dev/ic/mpireg.h
index fac91fd167f..65570239f6a 100644
--- a/sys/dev/ic/mpireg.h
+++ b/sys/dev/ic/mpireg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpireg.h,v 1.16 2006/06/15 06:45:53 marco Exp $ */
+/* $OpenBSD: mpireg.h,v 1.17 2006/06/18 00:08:00 marco Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -304,6 +304,9 @@ struct mpi_sgl_tce {
#define MPI_WHOINIT_HOST_DRIVER 0x04
#define MPI_WHOINIT_MANUFACTURER 0x05
+/* page address fields */
+#define MPI_PAGE_ADDRESS_FC_BTID (1<<24) /* Bus Target ID */
+
/* default messages */
struct mpi_msg_request {
@@ -1052,3 +1055,46 @@ struct mpi_cfg_ioc_pg3 {
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;
+
+ u_int32_t flags;
+ u_int8_t mpi_port_nr;
+ u_int8_t link_type;
+ u_int8_t port_state;
+ u_int8_t reserved1;
+ u_int32_t port_id;
+ u_int64_t wwnn;
+ u_int64_t wwpn;
+ u_int32_t supported_service_class;
+ u_int32_t supported_speeds;
+ u_int32_t current_speed;
+ u_int32_t max_frame_size;
+ u_int64_t fabric_wwnn;
+ u_int64_t fabric_wwpn;
+ u_int32_t discovered_port_count;
+ u_int32_t max_initiators;
+ u_int8_t max_aliases_supported;
+ u_int8_t max_hard_aliases_supported;
+ u_int8_t num_current_aliases;
+ u_int8_t reserved2;
+} __packed;
+
+struct mpi_cfg_fc_device_pg0 {
+ struct mpi_cfg_hdr config_header;
+
+ u_int64_t wwnn;
+ u_int64_t wwpn;
+ u_int32_t port_id;
+ u_int8_t protocol;
+ u_int8_t flags;
+ u_int16_t bb_credit;
+ u_int16_t max_rx_frame_size;
+ u_int8_t adisc_hard_alpa;
+ u_int8_t port_nr;
+ u_int8_t fc_ph_low_version;
+ u_int8_t fc_ph_high_version;
+ u_int8_t current_target_id;
+ u_int8_t current_bus;
+} __packed;