diff options
Diffstat (limited to 'sys/dev/ic')
-rw-r--r-- | sys/dev/ic/mpi.c | 74 | ||||
-rw-r--r-- | sys/dev/ic/mpireg.h | 48 |
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; |