summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Long <scottl@FreeBSD.org>2016-02-04 23:38:55 +0000
committerScott Long <scottl@FreeBSD.org>2016-02-04 23:38:55 +0000
commitee5c196b0a2a07647f4eb36deaceb11087d213d6 (patch)
tree803898c75c04b92d836be88279ec32fd89699053
parent3f84dfc1cde5594500e2cee4b1db17c2fc1c2ab2 (diff)
Notes
-rw-r--r--sys/dev/mps/mps.c8
-rw-r--r--sys/dev/mps/mps_mapping.c59
-rw-r--r--sys/dev/mps/mpsvar.h2
3 files changed, 69 insertions, 0 deletions
diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c
index 4080fc678fc1..5f183416e5ea 100644
--- a/sys/dev/mps/mps.c
+++ b/sys/dev/mps/mps.c
@@ -1476,6 +1476,14 @@ mps_setup_sysctl(struct mps_softc *sc)
OID_AUTO, "spinup_wait_time", CTLFLAG_RD,
&sc->spinup_wait_time, DEFAULT_SPINUP_WAIT, "seconds to wait for "
"spinup after SATA ID error");
+
+ SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+ OID_AUTO, "mapping_table_dump", CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
+ mps_mapping_dump, "A", "Mapping Table Dump");
+
+ SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+ OID_AUTO, "encl_table_dump", CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
+ mps_mapping_encl_dump, "A", "Enclosure Table Dump");
}
int
diff --git a/sys/dev/mps/mps_mapping.c b/sys/dev/mps/mps_mapping.c
index d96f33cdd919..351625be4817 100644
--- a/sys/dev/mps/mps_mapping.c
+++ b/sys/dev/mps/mps_mapping.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/endian.h>
#include <sys/sysctl.h>
+#include <sys/sbuf.h>
#include <sys/eventhandler.h>
#include <sys/uio.h>
#include <machine/bus.h>
@@ -2263,3 +2264,61 @@ out:
if (sc->pending_map_events)
sc->pending_map_events--;
}
+
+int
+mps_mapping_dump(SYSCTL_HANDLER_ARGS)
+{
+ struct mps_softc *sc;
+ struct dev_mapping_table *mt_entry;
+ struct sbuf sbuf;
+ int i, error;
+
+ sc = (struct mps_softc *)arg1;
+
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error != 0)
+ return (error);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
+
+ sbuf_printf(&sbuf, "\nindex physical_id handle id\n");
+ for (i = 0; i < sc->max_devices; i++) {
+ mt_entry = &sc->mapping_table[i];
+ if (mt_entry->physical_id == 0)
+ continue;
+ sbuf_printf(&sbuf, "%4d %jx %04x %hd\n",
+ i, mt_entry->physical_id, mt_entry->dev_handle,
+ mt_entry->id);
+ }
+ error = sbuf_finish(&sbuf);
+ sbuf_delete(&sbuf);
+ return (error);
+}
+
+int
+mps_mapping_encl_dump(SYSCTL_HANDLER_ARGS)
+{
+ struct mps_softc *sc;
+ struct enc_mapping_table *enc_entry;
+ struct sbuf sbuf;
+ int i, error;
+
+ sc = (struct mps_softc *)arg1;
+
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error != 0)
+ return (error);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
+
+ sbuf_printf(&sbuf, "\nindex enclosure_id handle map_index\n");
+ for (i = 0; i < sc->max_enclosures; i++) {
+ enc_entry = &sc->enclosure_table[i];
+ if (enc_entry->enclosure_id == 0)
+ continue;
+ sbuf_printf(&sbuf, "%4d %jx %04x %d\n",
+ i, enc_entry->enclosure_id, enc_entry->enc_handle,
+ enc_entry->start_index);
+ }
+ error = sbuf_finish(&sbuf);
+ sbuf_delete(&sbuf);
+ return (error);
+}
diff --git a/sys/dev/mps/mpsvar.h b/sys/dev/mps/mpsvar.h
index 96bb4e1cfa64..0cb51a0a3b19 100644
--- a/sys/dev/mps/mpsvar.h
+++ b/sys/dev/mps/mpsvar.h
@@ -756,6 +756,8 @@ void mps_mapping_enclosure_dev_status_change_event(struct mps_softc *,
Mpi2EventDataSasEnclDevStatusChange_t *event_data);
void mps_mapping_ir_config_change_event(struct mps_softc *sc,
Mpi2EventDataIrConfigChangeList_t *event_data);
+int mps_mapping_dump(SYSCTL_HANDLER_ARGS);
+int mps_mapping_encl_dump(SYSCTL_HANDLER_ARGS);
void mpssas_evt_handler(struct mps_softc *sc, uintptr_t data,
MPI2_EVENT_NOTIFICATION_REPLY *event);