summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1998-01-26 06:20:48 +0000
committerjulian <julian@FreeBSD.org>1998-01-26 06:20:48 +0000
commitc9bbca52f223e86d74e01847ff139b261c26e43e (patch)
treea15145349b399442a61956dd816f62523215784d
parent68abaddf758c534229cbcc68bbd3df497aa5074e (diff)
downloadFreeBSD-src-c9bbca52f223e86d74e01847ff139b261c26e43e.zip
FreeBSD-src-c9bbca52f223e86d74e01847ff139b261c26e43e.tar.gz
Obtained from: Simon Shapiro
Userland utilities to control, and monitor a DPT RAID system.
-rw-r--r--usr.sbin/dpt/Makefile5
-rw-r--r--usr.sbin/dpt/Makefile.inc6
-rw-r--r--usr.sbin/dpt/dpt_ctlinfo/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.83
-rw-r--r--usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.c121
-rw-r--r--usr.sbin/dpt/dpt_ctls/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_ctls/dpt_ctls.83
-rw-r--r--usr.sbin/dpt/dpt_ctls/dpt_ctls.c80
-rw-r--r--usr.sbin/dpt/dpt_dm/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_dm/dpt_dm.86
-rw-r--r--usr.sbin/dpt/dpt_dm/dpt_dm.c391
-rw-r--r--usr.sbin/dpt/dpt_sig/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_sig/dpt_sig.83
-rw-r--r--usr.sbin/dpt/dpt_sig/dpt_sig.c596
-rw-r--r--usr.sbin/dpt/dpt_softc/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_softc/dpt_softc.84
-rw-r--r--usr.sbin/dpt/dpt_softc/dpt_softc.c188
-rw-r--r--usr.sbin/dpt/dpt_sysinfo/Makefile12
-rw-r--r--usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.83
-rw-r--r--usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.c256
20 files changed, 1737 insertions, 0 deletions
diff --git a/usr.sbin/dpt/Makefile b/usr.sbin/dpt/Makefile
new file mode 100644
index 0000000..63b2ffb
--- /dev/null
+++ b/usr.sbin/dpt/Makefile
@@ -0,0 +1,5 @@
+# $Id: Makefile,v 1.2 1998/01/21 07:46:46 ShimonR Exp ShimonR $
+
+SUBDIR= dpt_ctlinfo dpt_ctls dpt_dm dpt_led dpt_sig dpt_softc dpt_sysinfo
+
+.include <bsd.subdir.mk>
diff --git a/usr.sbin/dpt/Makefile.inc b/usr.sbin/dpt/Makefile.inc
new file mode 100644
index 0000000..30a78e5
--- /dev/null
+++ b/usr.sbin/dpt/Makefile.inc
@@ -0,0 +1,6 @@
+# $Id: Makefile.inc,v 1.2 1998/01/21 07:46:46 ShimonR Exp ShimonR $
+
+.include "${.CURDIR}/../../Makefile.inc"
+# $Id: Makefile.inc,v 1.2 1998/01/21 07:46:46 ShimonR Exp ShimonR $
+
+.include "${.CURDIR}/../../Makefile.inc"
diff --git a/usr.sbin/dpt/dpt_ctlinfo/Makefile b/usr.sbin/dpt/dpt_ctlinfo/Makefile
new file mode 100644
index 0000000..690ed8e
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctlinfo/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.1 1998/01/22 23:32:27 ShimonR Exp ShimonR $
+
+PROG= dpt_ctlinfo
+SRCS= dpt_ctlinfo.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_ctlinfo.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.8 b/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.8
new file mode 100644
index 0000000..f9d1530
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.8
@@ -0,0 +1,3 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
diff --git a/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.c b/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.c
new file mode 100644
index 0000000..63073e8
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctlinfo/dpt_ctlinfo.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_ctlinfo.c: Dunp a DPT HBA Information Block */
+
+#ident "$Id: dpt_ctlinfo.c,v 1.1 1998/01/22 23:32:27 ShimonR Exp ShimonR $"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+#define DPT_MEASURE_PERFORMANCE
+
+#include <sys/dpt.h>
+
+
+int
+main(int argc, char **argv, char **argp)
+{
+ eata_pt_t pass_thru;
+ dpt_compat_ha_t compat_softc;
+
+ int result;
+ int fd;
+ int ndx;
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ pass_thru.eataID[0] = 'E';
+ pass_thru.eataID[1] = 'A';
+ pass_thru.eataID[2] = 'T';
+ pass_thru.eataID[3] = 'A';
+ pass_thru.command = DPT_CTRLINFO;
+ pass_thru.command_buffer = (u_int8_t *)&compat_softc;
+
+ if ( (result = ioctl(fd, DPT_IOCTL_SEND, &pass_thru)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_SEND,
+ strerror(errno));
+ exit(1);
+ }
+
+ (void)fprintf(stdout, "%x:", compat_softc.ha_state);
+
+ for (ndx = 0; ndx < MAX_CHANNELS; ndx++)
+ (void)fprintf(stdout, (ndx == (MAX_CHANNELS - 1)) ? "%d:" : "%d,",
+ compat_softc.ha_id[ndx]);
+
+ (void)fprintf(stdout, "%d:", compat_softc.ha_vect);
+ (void)fprintf(stdout, "%x:", compat_softc.ha_base);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_max_jobs);
+
+ switch (compat_softc.ha_cache) {
+ case DPT_NO_CACHE:
+ (void)fprintf(stdout, "No Cache:");
+ break;
+ case DPT_CACHE_WRITETHROUGH:
+ (void)fprintf(stdout, "WriteThrough:");
+ break;
+ case DPT_CACHE_WRITEBACK:
+ (void)fprintf(stdout, "WriteBack:");
+ break;
+ default:
+ (void)fprintf(stdout, "UnKnown (%d):", compat_softc.ha_cache);
+ }
+
+ (void)fprintf(stdout, "%d:", compat_softc.ha_cachesize);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_nbus);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_ntargets);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_nluns);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_tshift);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_bshift);
+
+ (void)fprintf(stdout, "%d:", compat_softc.ha_npend);
+ (void)fprintf(stdout, "%d:", compat_softc.ha_active_jobs);
+
+ (void)fprintf(stdout, "%s\n", compat_softc.ha_fw_version);
+
+
+
+ return(0);
+}
diff --git a/usr.sbin/dpt/dpt_ctls/Makefile b/usr.sbin/dpt/dpt_ctls/Makefile
new file mode 100644
index 0000000..7c2d150
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctls/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.1 1998/01/22 22:07:22 ShimonR Exp ShimonR $
+
+PROG= dpt_ctls
+SRCS= dpt_ctls.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_ctls.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_ctls/dpt_ctls.8 b/usr.sbin/dpt/dpt_ctls/dpt_ctls.8
new file mode 100644
index 0000000..f9d1530
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctls/dpt_ctls.8
@@ -0,0 +1,3 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
diff --git a/usr.sbin/dpt/dpt_ctls/dpt_ctls.c b/usr.sbin/dpt/dpt_ctls/dpt_ctls.c
new file mode 100644
index 0000000..d5ef550
--- /dev/null
+++ b/usr.sbin/dpt/dpt_ctls/dpt_ctls.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_ctls.c: Dunp a the number of configured DPT HBAs */
+
+#ident "$Id: dpt_ctls.c,v 1.1 1998/01/22 22:07:22 ShimonR Exp ShimonR $"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+#include <sys/dpt.h>
+
+int
+main(int argc, char **argv, char **argp)
+{
+ eata_pt_t pass_thru;
+ int controllers_present;
+
+ int result;
+ int fd;
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ pass_thru.eataID[0] = 'E';
+ pass_thru.eataID[1] = 'A';
+ pass_thru.eataID[2] = 'T';
+ pass_thru.eataID[3] = 'A';
+ pass_thru.command = DPT_NUMCTRLS;
+ pass_thru.command_buffer = (u_int8_t *)&controllers_present;
+
+ if ( (result = ioctl(fd, DPT_IOCTL_SEND, &pass_thru)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_SEND,
+ strerror(errno));
+ exit(1);
+ }
+
+ (void)fprintf(stdout, "%d\n", controllers_present);
+ return(0);
+}
diff --git a/usr.sbin/dpt/dpt_dm/Makefile b/usr.sbin/dpt/dpt_dm/Makefile
new file mode 100644
index 0000000..bc7b53f
--- /dev/null
+++ b/usr.sbin/dpt/dpt_dm/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.4 1998/01/21 17:38:32 ShimonR Exp ShimonR $
+
+PROG= dpt_dm
+SRCS= dpt_dm.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_dm.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_dm/dpt_dm.8 b/usr.sbin/dpt/dpt_dm/dpt_dm.8
new file mode 100644
index 0000000..d04a43e
--- /dev/null
+++ b/usr.sbin/dpt/dpt_dm/dpt_dm.8
@@ -0,0 +1,6 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
diff --git a/usr.sbin/dpt/dpt_dm/dpt_dm.c b/usr.sbin/dpt/dpt_dm/dpt_dm.c
new file mode 100644
index 0000000..869007b
--- /dev/null
+++ b/usr.sbin/dpt/dpt_dm/dpt_dm.c
@@ -0,0 +1,391 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_dm.c: Dump a DPT metrics structure */
+
+#ident "$Id: dpt_dm.c,v 1.8 1998/01/21 17:38:32 ShimonR Exp ShimonR $"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+#define DPT_MEASURE_PERFORMANCE
+
+#include <sys/dpt.h>
+
+char *
+scsi_cmd_name(u_int8_t cmd)
+{
+ switch (cmd) {
+ case 0x40:
+ return ("Change Definition [7.1]");
+ break;
+ case 0x39:
+ return ("Compare [7,2]");
+ break;
+ case 0x18:
+ return ("Copy [7.3]");
+ break;
+ case 0x3a:
+ return ("Copy and Verify [7.4]");
+ break;
+ case 0x04:
+ return ("Format Unit [6.1.1]");
+ break;
+ case 0x12:
+ return ("Inquiry [7.5]");
+ break;
+ case 0x36:
+ return ("lock/Unlock Cache [6.1.2]");
+ break;
+ case 0x4c:
+ return ("Log Select [7.6]");
+ break;
+ case 0x4d:
+ return ("Log Sense [7.7]");
+ break;
+ case 0x15:
+ return ("Mode select (6) [7.8]");
+ break;
+ case 0x55:
+ return ("Mode Select (10) [7.9]");
+ break;
+ case 0x1a:
+ return ("Mode Sense (6) [7.10]");
+ break;
+ case 0x5a:
+ return ("Mode Sense (10) [7.11]");
+ break;
+ case 0xa7:
+ return ("Move Medium Attached [SMC]");
+ break;
+ case 0x5e:
+ return ("Persistent Reserve In [7.12]");
+ break;
+ case 0x5f:
+ return ("Persistent Reserve Out [7.13]");
+ break;
+ case 0x1e:
+ return ("Prevent/Allow Medium Removal [7.14]");
+ break;
+ case 0x08:
+ return ("Read, Receive (6) [6.1.5]");
+ break;
+ case 0x28:
+ return ("Read (10) [6.1.5]");
+ break;
+ case 0xa8:
+ return ("Read (12) [6.1.5]");
+ break;
+ case 0x3c:
+ return ("Read Buffer [7.15]");
+ break;
+ case 0x25:
+ return ("Read Capacity [6.1.6]");
+ break;
+ case 0x37:
+ return ("Read Defect Data (10) [6.1.7]");
+ break;
+ case 0xb7:
+ return ("Read Defect Data (12) [6.2.5]");
+ break;
+ case 0xb4:
+ return ("Read Element Status Attached [SMC]");
+ break;
+ case 0x3e:
+ return ("Read Long [6.1.8]");
+ break;
+ case 0x07:
+ return ("Reassign Blocks [6.1.9]");
+ break;
+ case 0x81:
+ return ("Rebuild [6.1.10]");
+ break;
+ case 0x1c:
+ return ("Receive Diagnostics Result [7.16]");
+ break;
+ case 0x82:
+ return ("Regenerate [6.1.11]");
+ break;
+ case 0x17:
+ return ("Release(6) [7.17]");
+ break;
+ case 0x57:
+ return ("Release(10) [7.18]");
+ break;
+ case 0xa0:
+ return ("Report LUNs [7.19]");
+ break;
+ case 0x03:
+ return ("Request Sense [7.20]");
+ break;
+ case 0x16:
+ return ("Resereve (6) [7.21]");
+ break;
+ case 0x56:
+ return ("Reserve(10) [7.22]");
+ break;
+ case 0x2b:
+ return ("Reserve(10) [6.1.12]");
+ break;
+ case 0x1d:
+ return ("Send Disagnostics [7.23]");
+ break;
+ case 0x33:
+ return ("Set Limit (10) [6.1.13]");
+ break;
+ case 0xb3:
+ return ("Set Limit (12) [6.2.8]");
+ break;
+ case 0x1b:
+ return ("Start/Stop Unit [6.1.14]");
+ break;
+ case 0x35:
+ return ("Synchronize Cache [6.1.15]");
+ break;
+ case 0x00:
+ return ("Test Unit Ready [7.24]");
+ break;
+ case 0x3d:
+ return ("Update Block (6.2.9");
+ break;
+ case 0x2f:
+ return ("Verify (10) [6.1.16, 6.2.10]");
+ break;
+ case 0xaf:
+ return ("Verify (12) [6.2.11]");
+ break;
+ case 0x0a:
+ return ("Write, Send (6) [6.1.17, 9.2]");
+ break;
+ case 0x2a:
+ return ("Write (10) [6.1.18]");
+ break;
+ case 0xaa:
+ return ("Write (12) [6.2.13]");
+ break;
+ case 0x2e:
+ return ("Write and Verify (10) [6.1.19, 6.2.14]");
+ break;
+ case 0xae:
+ return ("Write and Verify (12) [6.1.19, 6.2.15]");
+ break;
+ case 0x03b:
+ return ("Write Buffer [7.25]");
+ break;
+ case 0x03f:
+ return ("Write Long [6.1.20]");
+ break;
+ case 0x041:
+ return ("Write Same [6.1.21]");
+ break;
+ case 0x052:
+ return ("XD Read [6.1.22]");
+ break;
+ case 0x050:
+ return ("XD Write [6.1.22]");
+ break;
+ case 0x080:
+ return ("XD Write Extended [6.1.22]");
+ break;
+ case 0x051:
+ return ("XO Write [6.1.22]");
+ break;
+ default:
+ return ("Unknown SCSI Command");
+ }
+}
+
+int
+main(int argc, char **argv, char **argp)
+{
+ dpt_perf_t metrics;
+ int result;
+ int fd;
+ int ndx;
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ if ( (result = ioctl(fd, DPT_IOCTL_INTERNAL_METRICS, &metrics)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_INTERNAL_METRICS,
+ strerror(errno));
+ exit(2);
+ }
+
+ /* Interrupt related measurements */
+ (void)fprintf(stdout, "Interrupts:%d:%d:%d:%d\n\nCommands:\n",
+ metrics.aborted_interrupts,
+ metrics.spurious_interrupts,
+ metrics.min_intr_time,
+ metrics.max_intr_time);
+
+ /* SCSI Commands, can be no more than 256 of them */
+ for (ndx = 0; ndx < 256; ndx++) {
+ if (metrics.command_count[ndx] != 0) {
+ (void)fprintf(stdout, "%d:%s:%d:%d:%d\n",
+ ndx,
+ scsi_cmd_name((u_int8_t)ndx),
+ metrics.command_count[ndx],
+ metrics.min_command_time[ndx],
+ metrics.max_command_time[ndx]);
+ }
+ }
+
+ (void)fprintf(stdout, "\nREAD by size:\n");
+
+ /* READ/WRITE statistics, per block size */
+
+ for ( ndx = 0; ndx < 10; ndx++) {
+ if (metrics.read_by_size_count[ndx] != 0) {
+ char* block_size;
+
+ switch ( ndx ) {
+ case SIZE_512:
+ block_size = "512";
+ break;
+ case SIZE_1K:
+ block_size = "1K";
+ break;
+ case SIZE_2K:
+ block_size = "2K";
+ break;
+ case SIZE_4K:
+ block_size = "4K";
+ break;
+ case SIZE_8K:
+ block_size = "8K";
+ break;
+ case SIZE_16K:
+ block_size = "16K";
+ break;
+ case SIZE_32K:
+ block_size = "32K";
+ break;
+ case SIZE_64K:
+ block_size = "64K";
+ break;
+ case SIZE_BIGGER:
+ block_size = "BIGGER";
+ break;
+ case SIZE_OTHER:
+ block_size = "OTHER";
+ break;
+ default:
+ block_size = "Gcc, shut up!";
+ }
+
+ (void)fprintf(stdout, "%s:%u:%u:%u\n", block_size,
+ metrics.read_by_size_count[ndx],
+ metrics.read_by_size_min_time[ndx],
+ metrics.read_by_size_max_time[ndx]);
+ }
+ }
+
+ (void)fprintf(stdout, "\nWRITE by size:\n");
+
+ for ( ndx = 0; ndx < 10; ndx++) {
+ if (metrics.write_by_size_count[ndx] != 0) {
+ char* block_size;
+
+ switch ( ndx ) {
+ case SIZE_512:
+ block_size = "512";
+ break;
+ case SIZE_1K:
+ block_size = "1K";
+ break;
+ case SIZE_2K:
+ block_size = "2K";
+ break;
+ case SIZE_4K:
+ block_size = "4K";
+ break;
+ case SIZE_8K:
+ block_size = "8K";
+ break;
+ case SIZE_16K:
+ block_size = "16K";
+ break;
+ case SIZE_32K:
+ block_size = "32K";
+ break;
+ case SIZE_64K:
+ block_size = "64K";
+ break;
+ case SIZE_BIGGER:
+ block_size = "BIGGER";
+ break;
+ case SIZE_OTHER:
+ block_size = "OTHER";
+ break;
+ default:
+ block_size = "Gcc, shut up!";
+ }
+
+ (void)fprintf(stdout, "%s:%u:%u:%u\n", block_size,
+ metrics.write_by_size_count[ndx],
+ metrics.write_by_size_min_time[ndx],
+ metrics.write_by_size_max_time[ndx]);
+ }
+
+ }
+
+ (void)fprintf(stdout, "\nQueues:%u:%u:%u:%u:%u:%u:%u:%u:%u\n",
+ metrics.max_waiting_count,
+ metrics.min_waiting_time,
+ metrics.max_waiting_time,
+ metrics.max_submit_count,
+ metrics.min_submit_time,
+ metrics.max_submit_time,
+ metrics.max_complete_count,
+ metrics.min_complete_time,
+ metrics.max_complete_time);
+
+ (void)fprintf(stdout, "Hardware Ports:%u:%u:%u:%u\n",
+ metrics.command_collisions,
+ metrics.command_too_busy,
+ metrics.max_eata_tries,
+ metrics.min_eata_tries);
+
+ return(0);
+}
diff --git a/usr.sbin/dpt/dpt_sig/Makefile b/usr.sbin/dpt/dpt_sig/Makefile
new file mode 100644
index 0000000..3f50486
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sig/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.4 1998/01/21 17:41:39 ShimonR Exp $
+
+PROG= dpt_sig
+SRCS= dpt_sig.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_sig.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_sig/dpt_sig.8 b/usr.sbin/dpt/dpt_sig/dpt_sig.8
new file mode 100644
index 0000000..f9d1530
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sig/dpt_sig.8
@@ -0,0 +1,3 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
diff --git a/usr.sbin/dpt/dpt_sig/dpt_sig.c b/usr.sbin/dpt/dpt_sig/dpt_sig.c
new file mode 100644
index 0000000..340b924
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sig/dpt_sig.c
@@ -0,0 +1,596 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_sig.c: Dunp a DPT Signature */
+
+#ident "$Id: dpt_sig.c,v 1.6 1998/01/22 22:06:30 ShimonR Exp ShimonR $"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+#define DPT_MEASURE_PERFORMANCE
+
+#include <sys/dpt.h>
+
+/* A primitive subset of isgraph. Used by hex_dump below */
+#define IsGraph(val) ( (((val) >= ' ') && ((val) <= '~')) )
+
+/*
+ * This function dumps bytes to the screen in hex format.
+ */
+void
+hex_dump(u_int8_t * data, int length, char *name, int no)
+{
+ int line, column, ndx;
+
+ (void)fprintf(stdout, "Kernel Hex Dump for %s-%d at %p (%d bytes)\n",
+ name, no, data, length);
+
+ /* Zero out all the counters and repeat for as many bytes as we have */
+ for (ndx = 0, column = 0, line = 0; ndx < length; ndx++) {
+ /* Print relative offset at the beginning of every line */
+ if (column == 0)
+ (void)fprintf(stdout, "%04x ", ndx);
+
+ /* Print the byte as two hex digits, followed by a space */
+ (void)fprintf(stdout, "%02x ", data[ndx]);
+
+ /* Split the row of 16 bytes in half */
+ if (++column == 8) {
+ (void)fprintf(stdout, " ");
+ }
+ /* St the end of each row of 16 bytes, put a space ... */
+ if (column == 16) {
+ (void)fprintf(stdout, " ");
+
+ /* ... and then print the ASCII-visible on a line. */
+ for (column = 0; column < 16; column++) {
+ int ascii_pos = ndx - 15 + column;
+
+ /*
+ * Non-printable and non-ASCII are just a
+ * dot. ;-(
+ */
+ if (IsGraph(data[ascii_pos]))
+ (void)fprintf(stdout, "%c", data[ascii_pos]);
+ else
+ (void)fprintf(stdout, ".");
+ }
+
+ /* Each line ends with a new line */
+ (void)fprintf(stdout, "\n");
+ column = 0;
+
+ /*
+ * Every 256 bytes (16 lines of 16 bytes each) have
+ * an empty line, separating them from the next
+ * ``page''. Yes, I programmed on a Z-80, where a
+ * page was 256 bytes :-)
+ */
+ if (++line > 15) {
+ (void)fprintf(stdout, "\n");
+ line = 0;
+ }
+ }
+ }
+
+ /*
+ * We are basically done. We do want, however, to handle the ASCII
+ * translation of fractional lines.
+ */
+ if ((ndx == length) && (column != 0)) {
+ int modulus = 16 - column, spaces = modulus * 3, skip;
+
+ /*
+ * Skip to the right, as many spaces as there are bytes
+ * ``missing'' ...
+ */
+ for (skip = 0; skip < spaces; skip++)
+ (void)fprintf(stdout, " ");
+
+ /* ... And the gap separating the hex dump from the ASCII */
+ (void)fprintf(stdout, " ");
+
+ /*
+ * Do not forget the extra space that splits the hex dump
+ * vertically
+ */
+ if (column < 8)
+ (void)fprintf(stdout, " ");
+
+ for (column = 0; column < (16 - modulus); column++) {
+ int ascii_pos = ndx - (16 - modulus) + column;
+
+ if (IsGraph(data[ascii_pos]))
+ (void)fprintf(stdout, "%c", data[ascii_pos]);
+ else
+ (void)fprintf(stdout, ".");
+ }
+ (void)fprintf(stdout, "\n");
+ }
+}
+
+
+int
+main(int argc, char **argv, char **argp)
+{
+ eata_pt_t pass_thru;
+ dpt_sig_t signature;
+ char *sp1;
+ char *sp2;
+
+ int result;
+ int fd;
+ int ndx;
+
+ /* If we do not do that, gcc complains about uninitialized usage (?) */
+ sp1 = "Unknown";
+ sp2 = "Unknown";
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ pass_thru.eataID[0] = 'E';
+ pass_thru.eataID[1] = 'A';
+ pass_thru.eataID[2] = 'T';
+ pass_thru.eataID[3] = 'A';
+ pass_thru.command = DPT_SIGNATURE;
+ pass_thru.command_buffer = (u_int8_t *)&signature;
+
+ if ( (result = ioctl(fd, DPT_IOCTL_SEND, &pass_thru)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_SEND,
+ strerror(errno));
+ exit(1);
+ }
+
+ /* dsSignature is not null terminated! */
+ for (ndx = 0; ndx < sizeof(signature.dsSignature); ndx++)
+ (void)fputc(signature.dsSignature[ndx], stdout);
+
+ (void)fprintf(stdout, ":%x:", signature.SigVersion);
+
+ switch (signature.ProcessorFamily) {
+ case PROC_INTEL:
+ sp1 = "Intel";
+ switch ( signature.Processor ) {
+ case PROC_8086:
+ sp2 = "8086";
+ break;
+ case PROC_286:
+ sp2 = "80286";
+ break;
+ case PROC_386:
+ sp2 = "386";
+ break;
+ case PROC_486:
+ sp2 = "486";
+ break;
+ case PROC_PENTIUM:
+ sp2 = "Pentium";
+ break;
+ case PROC_P6:
+ sp2 = "PentiumPro";
+ break;
+ default:
+ sp2 = "Unknown Processor";
+ break;
+ }
+ break;
+ case PROC_MOTOROLA:
+ sp1 = "Motorola";
+ switch ( signature.Processor ) {
+ case PROC_68000:
+ sp2 = "68000";
+ break;
+ case PROC_68020:
+ sp2 = "68020";
+ break;
+ case PROC_68030:
+ sp2 = "68030";
+ break;
+ case PROC_68040:
+ sp2 = "68040";
+ break;
+ default:
+ sp2 = "Unknown Processor";
+ break;
+ }
+ break;
+ case PROC_MIPS4000:
+ sp1 = "MIPS/SGI";
+ break;
+ case PROC_ALPHA:
+ sp1 = "DEC Alpha";
+ break;
+ default:
+ sp1 = "Unknown Processor Family";
+ break;
+ }
+
+ (void)fprintf(stdout, "%s:%s:", sp1, sp2);
+
+ switch ( signature.Filetype ) {
+ case FT_EXECUTABLE:
+ sp1 = "Executable";
+ break;
+ case FT_SCRIPT:
+ sp1 = "Script";
+ break;
+ case FT_HBADRVR:
+ sp1 = "HBA Driver";
+ break;
+ case FT_OTHERDRVR:
+ sp1 = "Other Driver";
+ break;
+ case FT_IFS:
+ sp1 = "Installable FileSystem";
+ break;
+ case FT_ENGINE:
+ sp1 = "DPT Engine";
+ break;
+ case FT_COMPDRVR:
+ sp1 = "Compressed Driver";
+ break;
+ case FT_LANGUAGE:
+ sp1 = "Language File";
+ break;
+ case FT_FIRMWARE:
+ sp1 = "DownLoadable Firmware";
+ break;
+ case FT_COMMMODL:
+ sp1 = "Communications Module";
+ break;
+ case FT_INT13:
+ sp1 = "INT13 Type HBA Driver";
+ break;
+ case FT_HELPFILE:
+ sp1 = "Help File";
+ break;
+ case FT_LOGGER:
+ sp1 = "Event Logger";
+ break;
+ case FT_INSTALL:
+ sp1 = "Installation Procedure";
+ break;
+ case FT_LIBRARY:
+ sp1 = "Storage Manager Real-Mode Call";
+ break;
+ case FT_RESOURCE:
+ sp1 = "Storage Manager Resource File";
+ break;
+ case FT_MODEM_DB:
+ sp1 = "Storage Manager Modem Database";
+ break;
+ default:
+ sp1 = "Unknown File Type";
+ break;
+ }
+
+ switch ( signature.FiletypeFlags ) {
+ case FTF_DLL:
+ sp2 = "Dynamically Linked Library";
+ break;
+ case FTF_NLM:
+ sp2 = "NetWare Loadable Module";
+ break;
+ case FTF_OVERLAYS:
+ sp2 = "Uses Overlays";
+ break;
+ case FTF_DEBUG:
+ sp2 = "Debug Version";
+ break;
+ case FTF_TSR:
+ sp2 = "DOS Terminate-n-Stay Resident Thing";
+ break;
+ case FTF_SYS:
+ sp2 = "DOS Loadable Driver";
+ break;
+ case FTF_PROTECTED:
+ sp2 = "Runs in Protected Mode";
+ break;
+ case FTF_APP_SPEC:
+ sp2 = "Application Specific";
+ break;
+ default:
+ sp2 = "Unknown File Type Flag";
+ break;
+ }
+
+ (void)fprintf(stdout, "%s:%s:", sp1, sp2);
+
+ switch ( signature.OEM ) {
+ case OEM_DPT:
+ sp1 = "DPT";
+ break;
+ case OEM_ATT:
+ sp1 = "AT&T";
+ break;
+ case OEM_NEC:
+ sp1 = "NEC";
+ break;
+ case OEM_ALPHA:
+ sp1 = "Alphatronix";
+ break;
+ case OEM_AST:
+ sp1 = "AST";
+ break;
+ case OEM_OLIVETTI:
+ sp1 = "Olivetti";
+ break;
+ case OEM_SNI:
+ sp1 = "Siemens/Nixdorf";
+ break;
+ default:
+ sp1 = "Unknown OEM";
+ break;
+ }
+
+ switch ( signature.OS ) {
+ case OS_DOS:
+ sp2 = "DOS";
+ break;
+ case OS_WINDOWS:
+ sp2 = "Microsoft Windows 3.x";
+ break;
+ case OS_WINDOWS_NT:
+ sp2 = "Microsoft Windows NT";
+ break;
+ case OS_OS2M:
+ sp2 = "OS/2 1.2.x,MS 1.3.0,IBM 1.3.x";
+ break;
+ case OS_OS2L:
+ sp2 = "Microsoft OS/2 1.301 - LADDR";
+ break;
+ case OS_OS22x:
+ sp2 = "IBM OS/2 2.x";
+ break;
+ case OS_NW286:
+ sp2 = "Novell NetWare 286";
+ break;
+ case OS_NW386:
+ sp2 = "Novell NetWare 386";
+ break;
+ case OS_GEN_UNIX:
+ sp2 = "Generic Unix";
+ break;
+ case OS_SCO_UNIX:
+ sp2 = "SCO Unix";
+ break;
+ case OS_ATT_UNIX:
+ sp2 = "AT&T Unix";
+ break;
+ case OS_UNIXWARE:
+ sp2 = "UnixWare Unix";
+ break;
+ case OS_INT_UNIX:
+ sp2 = "Interactive Unix";
+ break;
+ case OS_SOLARIS:
+ sp2 = "SunSoft Solaris";
+ break;
+ case OS_QNX:
+ sp2 = "QNX for Tom Moch";
+ break;
+ case OS_NEXTSTEP:
+ sp2 = "NeXTSTEP";
+ break;
+ case OS_BANYAN:
+ sp2 = "Banyan Vines";
+ break;
+ case OS_OLIVETTI_UNIX:
+ sp2 = "Olivetti Unix";
+ break;
+ case OS_FREEBSD:
+ sp2 = "FreeBSD 2.2 and later";
+ break;
+ case OS_OTHER:
+ sp2 = "Other";
+ break;
+ default:
+ sp2 = "Unknown O/S";
+ break;
+ }
+
+ (void)fprintf(stdout, "%s:%s:\n", sp1, sp2);
+
+ if ( signature.Capabilities & CAP_RAID0 )
+ (void)fprintf(stdout, "RAID-0:");
+
+ if ( signature.Capabilities & CAP_RAID1 )
+ (void)fprintf(stdout, "RAID-1:");
+
+ if ( signature.Capabilities & CAP_RAID3 )
+ (void)fprintf(stdout, "RAID-3:");
+
+ if ( signature.Capabilities & CAP_RAID5 )
+ (void)fprintf(stdout, "RAID-5:");
+
+ if ( signature.Capabilities & CAP_SPAN )
+ (void)fprintf(stdout, "SPAN:");
+
+ if ( signature.Capabilities & CAP_PASS )
+ (void)fprintf(stdout, "PASS:");
+
+ if ( signature.Capabilities & CAP_OVERLAP )
+ (void)fprintf(stdout, "OVERLAP:");
+
+ if ( signature.Capabilities & CAP_ASPI )
+ (void)fprintf(stdout, "ASPI:");
+
+ if ( signature.Capabilities & CAP_ABOVE16MB )
+ (void)fprintf(stdout, "ISA16MB:");
+
+ if ( signature.Capabilities & CAP_EXTEND )
+ (void)fprintf(stdout, "ISA16MB:");
+
+ (void)fprintf(stdout, "\n");
+
+ if ( signature.DeviceSupp & DEV_DASD )
+ (void)fprintf(stdout, "DASD:");
+
+ if ( signature.DeviceSupp & DEV_TAPE )
+ (void)fprintf(stdout, "Tape:");
+
+ if ( signature.DeviceSupp & DEV_PRINTER )
+ (void)fprintf(stdout, "Printer:");
+
+ if ( signature.DeviceSupp & DEV_PROC )
+ (void)fprintf(stdout, "CPU:");
+
+ if ( signature.DeviceSupp & DEV_WORM )
+ (void)fprintf(stdout, "WORM:");
+
+ if ( signature.DeviceSupp & DEV_CDROM )
+ (void)fprintf(stdout, "CDROM:");
+
+ if ( signature.DeviceSupp & DEV_SCANNER )
+ (void)fprintf(stdout, "Scanner:");
+
+ if ( signature.DeviceSupp & DEV_OPTICAL )
+ (void)fprintf(stdout, "Optical:");
+
+ if ( signature.DeviceSupp & DEV_JUKEBOX )
+ (void)fprintf(stdout, "Jukebox:");
+
+ if ( signature.DeviceSupp & DEV_COMM )
+ (void)fprintf(stdout, "Comm:");
+
+ if ( signature.DeviceSupp & DEV_OTHER )
+ (void)fprintf(stdout, "Other:");
+
+ if ( signature.DeviceSupp & DEV_ALL )
+ (void)fprintf(stdout, "All:");
+
+ (void)fprintf(stdout, "\n");
+
+ if ( signature.AdapterSupp & ADF_2001 )
+ (void)fprintf(stdout, "PM2001:");
+
+ if ( signature.AdapterSupp & ADF_2012A )
+ (void)fprintf(stdout, "PM2012A:");
+
+ if ( signature.AdapterSupp & ADF_PLUS_ISA )
+ (void)fprintf(stdout, "PM2011+PM2021:");
+
+ if ( signature.AdapterSupp & ADF_PLUS_EISA )
+ (void)fprintf(stdout, "PM2012B+PM2022:");
+
+ if ( signature.AdapterSupp & ADF_SC3_ISA )
+ (void)fprintf(stdout, "PM2021:");
+
+ if ( signature.AdapterSupp & ADF_SC3_EISA )
+ (void)fprintf(stdout, "PM2022+PM2122:");
+
+ if ( signature.AdapterSupp & ADF_SC3_PCI )
+ (void)fprintf(stdout, "SmartCache III PCI:");
+
+ if ( signature.AdapterSupp & ADF_SC4_ISA )
+ (void)fprintf(stdout, "SmartCache IV ISA:");
+
+ if ( signature.AdapterSupp & ADF_SC4_EISA )
+ (void)fprintf(stdout, "SmartCache IV EISA:");
+
+ if ( signature.AdapterSupp & ADF_SC4_PCI )
+ (void)fprintf(stdout, "SmartCache IV PCI:");
+
+ if ( signature.AdapterSupp & ADF_ALL_MASTER )
+ (void)fprintf(stdout, "All Bus Mastering:");
+
+ if ( signature.AdapterSupp & ADF_ALL_CACHE )
+ (void)fprintf(stdout, "All Caching:");
+
+ if ( signature.AdapterSupp & ADF_ALL )
+ (void)fprintf(stdout, "All HBAs:");
+
+ (void)fprintf(stdout, "\n");
+
+ if ( signature.Application & APP_DPTMGR )
+ (void)fprintf(stdout, "DPTMGR:");
+
+ if ( signature.Application & APP_ENGINE )
+ (void)fprintf(stdout, "Engine:");
+
+ if ( signature.Application & APP_SYTOS )
+ (void)fprintf(stdout, "Systron Sytos Plus:");
+
+ if ( signature.Application & APP_CHEYENNE )
+ (void)fprintf(stdout, "Cheyenne ARCServe + ARCSolo:");
+
+ if ( signature.Application & APP_MSCDEX )
+ (void)fprintf(stdout, "Microsoft CD-ROM extensions:");
+
+ if ( signature.Application & APP_NOVABACK )
+ (void)fprintf(stdout, "NovaStor Novaback:");
+
+ if ( signature.Application & APP_AIM )
+ (void)fprintf(stdout, "Archive Information Manager:");
+
+ (void)fprintf(stdout, "\n");
+
+ if ( signature.Requirements & REQ_SMARTROM )
+ (void)fprintf(stdout, "SmartROM:");
+
+ if ( signature.Requirements & REQ_DPTDDL )
+ (void)fprintf(stdout, "DPTDDL.SYS:");
+
+ if ( signature.Requirements & REQ_HBA_DRIVER )
+ (void)fprintf(stdout, "HBA Driver:");
+
+ if ( signature.Requirements & REQ_ASPI_TRAN )
+ (void)fprintf(stdout, "ASPI Transport Modules:");
+
+ if ( signature.Requirements & REQ_ENGINE )
+ (void)fprintf(stdout, "DPT Engine:");
+
+ if ( signature.Requirements & REQ_COMM_ENG )
+ (void)fprintf(stdout, "DPT Comm Engine:");
+
+ (void)fprintf(stdout, "\n");
+
+ (void)fprintf(stdout, "%x.%x.%x:%d.%d.%d\n",
+ signature.Version, signature.Revision,
+ signature.SubRevision,
+ signature.Month, signature.Day, signature.Year + 1980);
+
+ return(0);
+}
diff --git a/usr.sbin/dpt/dpt_softc/Makefile b/usr.sbin/dpt/dpt_softc/Makefile
new file mode 100644
index 0000000..9977e47
--- /dev/null
+++ b/usr.sbin/dpt/dpt_softc/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.3 1998/01/21 07:50:38 ShimonR Exp ShimonR $
+
+PROG= dpt_softc
+SRCS= dpt_softc.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_softc.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_softc/dpt_softc.8 b/usr.sbin/dpt/dpt_softc/dpt_softc.8
new file mode 100644
index 0000000..6dfeb0f
--- /dev/null
+++ b/usr.sbin/dpt/dpt_softc/dpt_softc.8
@@ -0,0 +1,4 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
+
diff --git a/usr.sbin/dpt/dpt_softc/dpt_softc.c b/usr.sbin/dpt/dpt_softc/dpt_softc.c
new file mode 100644
index 0000000..6f1726f
--- /dev/null
+++ b/usr.sbin/dpt/dpt_softc/dpt_softc.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_softc.c: Dunp a DPT control structure */
+
+#ident "$Id: dpt_softc.c,v 1.7 1998/01/22 21:37:40 ShimonR Exp $"
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+/*
+ * The following two defines alter the size and composition of dpt_softc_t.
+ * If useland does not match the kenel, disaster will ensue.
+ * Since we do not know how to pick up kernel options from here,
+ * and since we always use these options, we will enable them here.
+ *
+ * If you build a kernel without these options, edit here and recompile.
+ */
+#define DPT_MEASURE_PERFORMANCE
+#define DEVFS
+
+#include <sys/dpt.h>
+
+static char i2bin_bitmap[48]; /* Used for binary dump of registers */
+
+char *
+i2bin(unsigned int no, int length)
+{
+ int ndx, rind;
+
+ for (ndx = 0, rind = 0; ndx < 32; ndx++, rind++) {
+ i2bin_bitmap[rind] = (((no << ndx) & 0x80000000) ? '1' : '0');
+
+ if (((ndx % 4) == 3))
+ i2bin_bitmap[++rind] = ' ';
+ }
+
+ if ((ndx % 4) == 3)
+ i2bin_bitmap[rind - 1] = '\0';
+ else
+ i2bin_bitmap[rind] = '\0';
+
+ switch (length) {
+ case 8:
+ return (i2bin_bitmap + 30);
+ break;
+ case 16:
+ return (i2bin_bitmap + 20);
+ break;
+ case 24:
+ return (i2bin_bitmap + 10);
+ break;
+ case 32:
+ return (i2bin_bitmap);
+ default:
+ return ("i2bin: Invalid length Specs");
+ break;
+ }
+}
+int
+main(int argc, char **argv, char **argp)
+{
+ dpt_user_softc_t udpt;
+ int result;
+ int fd;
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ if ( (result = ioctl(fd, DPT_IOCTL_SOFTC, &udpt)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_SOFTC,
+ strerror(errno));
+ exit(2);
+ }
+
+ (void)fprintf(stdout, "Counters:%d:%d:%d:%d:%d:%d:%d\n",
+ udpt.total_ccbs_count,
+ udpt.free_ccbs_count,
+ udpt.waiting_ccbs_count,
+ udpt.submitted_ccbs_count,
+ udpt.completed_ccbs_count,
+ udpt.commands_processed,
+ udpt.lost_interrupts);
+
+ (void)fprintf(stdout, "Queue Status:%s\n",
+ i2bin(udpt.queue_status, sizeof(udpt.queue_status) * 8));
+
+ (void)fprintf(stdout, "Free lock:%s\n",
+ i2bin(udpt.free_lock, sizeof(udpt.free_lock) * 8));
+
+ (void)fprintf(stdout, "Waiting lock:%s\n",
+ i2bin(udpt.waiting_lock, sizeof(udpt.waiting_lock) * 8));
+
+ (void)fprintf(stdout, "Submitted lock:%s\n",
+ i2bin(udpt.submitted_lock, sizeof(udpt.submitted_lock) * 8));
+
+ (void)fprintf(stdout, "Completed lock:%s\n",
+ i2bin(udpt.completed_lock, sizeof(udpt.completed_lock) * 8));
+
+ (void)fprintf(stdout, "Configuration:%s:%d:%d:%d:%x:%d:%d\n",
+ udpt.handle_interrupts ? "Yes" : "No",
+ udpt.max_id,
+ udpt.max_lun,
+ udpt.channels,
+ udpt.io_base,
+ udpt.irq,
+ udpt.dma_channel);
+
+ (void)fprintf(stdout, "ID:%x:%x:%s:%s:%s:%s:%x\n",
+ udpt.board_data.deviceType,
+ udpt.board_data.rm_dtq,
+ udpt.board_data.vendor,
+ udpt.board_data.modelNum,
+ udpt.board_data.firmware,
+ udpt.board_data.protocol,
+ udpt.EATA_revision);
+
+ (void)fprintf(stdout,"Capabilities:%x:%d:%s:%s:%s:%s:%s\n",
+ udpt.bustype,
+ udpt.channels,
+ i2bin((u_int32_t)udpt.state, sizeof(udpt.state) * 8),
+ udpt.primary ? "Yes" : "No",
+ udpt.more_support ? "Yes" : "No",
+ udpt.immediate_support ? "Yes" : "No",
+ udpt.broken_INQUIRY ? "Yes" : "No");
+
+ (void)fprintf(stdout,"More Config:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+ udpt.resetlevel[0],
+ udpt.resetlevel[1],
+ udpt.resetlevel[2],
+ udpt.cplen,
+ udpt.cppadlen,
+ udpt.queuesize,
+ udpt.sgsize,
+ udpt.hostid[0],
+ udpt.hostid[1],
+ udpt.hostid[2]);
+
+ (void)fprintf(stdout,"Cache:%s:%d\n",
+ (udpt.cache_type == DPT_NO_CACHE)
+ ? "None"
+ : (udpt.cache_type == DPT_CACHE_WRITETHROUGH)
+ ? "Write-Through" : "Write-Back",
+ udpt.cache_size);
+
+ return(0);
+}
diff --git a/usr.sbin/dpt/dpt_sysinfo/Makefile b/usr.sbin/dpt/dpt_sysinfo/Makefile
new file mode 100644
index 0000000..f5d570a
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sysinfo/Makefile
@@ -0,0 +1,12 @@
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+# $Id: Makefile,v 1.1 1998/01/22 23:32:27 ShimonR Exp ShimonR $
+
+PROG= dpt_sysinfo
+SRCS= dpt_sysinfo.c
+
+CFLAGS+=-Wall -I../../../sys -I/usr/src/sys
+BINMODE=500
+BINOWN= root
+MAN8= dpt_sysinfo.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.8 b/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.8
new file mode 100644
index 0000000..f9d1530
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.8
@@ -0,0 +1,3 @@
+.\" Copyright (c) 1997 Simon Shapiro. All rights reserved.
+.\"
+.\" There is nothing here yet, but an empty file will not patch
diff --git a/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.c b/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.c
new file mode 100644
index 0000000..13cfef7
--- /dev/null
+++ b/usr.sbin/dpt/dpt_sysinfo/dpt_sysinfo.c
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 1997 by Simon Shapiro
+ * All Rights Reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* dpt_ctlinfo.c: Dunp a DPT HBA Information Block */
+
+#ident "$Id: dpt_ctlinfo.c,v 1.1 1998/01/22 23:32:27 ShimonR Exp ShimonR $"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/queue.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi_all.h>
+#include <scsi/scsi_message.h>
+#include <scsi/scsiconf.h>
+
+#define DPT_MEASURE_PERFORMANCE
+
+#include <sys/dpt.h>
+
+
+int
+main(int argc, char **argv, char **argp)
+{
+ eata_pt_t pass_thru;
+ dpt_sysinfo_t sysinfo;
+
+ int result;
+ int fd;
+ int ndx;
+
+ if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n",
+ argv[0], argv[1], strerror(errno));
+ exit(1);
+ }
+
+ pass_thru.eataID[0] = 'E';
+ pass_thru.eataID[1] = 'A';
+ pass_thru.eataID[2] = 'T';
+ pass_thru.eataID[3] = 'A';
+ pass_thru.command = DPT_SYSINFO;
+ pass_thru.command_buffer = (u_int8_t *)&sysinfo;
+
+ if ( (result = ioctl(fd, DPT_IOCTL_SEND, &pass_thru)) != 0 ) {
+ (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n",
+ argv[0], DPT_IOCTL_SEND,
+ strerror(errno));
+ exit(1);
+ }
+
+ (void)fprintf(stdout, "%x:%x:%d:",
+ sysinfo.drive0CMOS, sysinfo.drive1CMOS, sysinfo.numDrives);
+
+ switch (sysinfo.processorFamily) {
+ case PROC_INTEL:
+ (void)fprintf(stdout, "Intel:");
+ switch (sysinfo.processorType) {
+ case PROC_8086:
+ (void)fprintf(stdout, "8086:");
+ break;
+ case PROC_286:
+ (void)fprintf(stdout, "80286:");
+ break;
+ case PROC_386:
+ (void)fprintf(stdout, "i386:");
+ break;
+ case PROC_486:
+ (void)fprintf(stdout, "80486:");
+ break;
+ case PROC_PENTIUM:
+ (void)fprintf(stdout, "Pentium:");
+ break;
+ case PROC_P6:
+ (void)fprintf(stdout, "Pentium-Pro:");
+ break;
+ default:
+ (void)fprintf(stdout, "Unknown (%d):", sysinfo.processorType);
+ }
+ break;
+ case PROC_MOTOROLA:
+ (void)fprintf(stdout, "Motorola:");
+ switch (sysinfo.processorType) {
+ case PROC_68000:
+ (void)fprintf(stdout, "M68000");
+ break;
+ case PROC_68020:
+ (void)fprintf(stdout, "M68020");
+ break;
+ case PROC_68030:
+ (void)fprintf(stdout, "M68030");
+ break;
+ case PROC_68040:
+ (void)fprintf(stdout, "M68040");
+ break;
+ default:
+ (void)fprintf(stdout, "Unknown (%d):", sysinfo.processorType);
+ }
+ break;
+ case PROC_MIPS4000:
+ (void)fprintf(stdout, "MIPS:Any:");
+ break;
+ case PROC_ALPHA:
+ (void)fprintf(stdout, "Alpha:Any:");
+ break;
+ default:
+ (void)fprintf(stdout, "Unknown (%d):Any:", sysinfo.processorFamily);
+ }
+
+ (void)fprintf(stdout, "%d.%d.%d:",
+ sysinfo.smartROMMajorVersion,
+ sysinfo.smartROMMinorVersion,
+ sysinfo.smartROMRevision);
+
+ (void)fprintf(stdout, "%c%c%c%c%c%c%c%c%c%c%c:",
+ (sysinfo.flags & SI_CMOS_Valid) ? '+' : '-',
+ (sysinfo.flags & SI_NumDrivesValid) ? '+' : '-',
+ (sysinfo.flags & SI_ProcessorValid) ? '+' : '-',
+ (sysinfo.flags & SI_MemorySizeValid) ? '+' : '-',
+ (sysinfo.flags & SI_DriveParamsValid) ? '+' : '-',
+ (sysinfo.flags & SI_SmartROMverValid) ? '+' : '-',
+ (sysinfo.flags & SI_OSversionValid) ? '+' : '-',
+ (sysinfo.flags & SI_OSspecificValid) ? '+' : '-',
+ (sysinfo.flags & SI_BusTypeValid) ? '+' : '-',
+ (sysinfo.flags & SI_ALL_VALID) ? '+' : '-',
+ (sysinfo.flags & SI_NO_SmartROM) ? '+' : '-');
+
+ (void)fprintf(stdout, "%d:", sysinfo.conventionalMemSize);
+ (void)fprintf(stdout, "%d:", sysinfo.extendedMemSize);
+
+ switch (sysinfo.osType) {
+ case OS_DOS:
+ (void)fprintf(stdout, "DOS:");
+ break;
+ case OS_WINDOWS:
+ (void)fprintf(stdout, "Win3.1:");
+ break;
+ case OS_WINDOWS_NT:
+ (void)fprintf(stdout, "NT:");
+ break;
+ case OS_OS2M:
+ (void)fprintf(stdout, "OS/2-std:");
+ break;
+ case OS_OS2L:
+ (void)fprintf(stdout, "OS/2-LADDR:");
+ break;
+ case OS_OS22x:
+ (void)fprintf(stdout, "OS/2-2.x:");
+ break;
+ case OS_NW286:
+ (void)fprintf(stdout, "NetWare-286:");
+ break;
+ case OS_NW386:
+ (void)fprintf(stdout, "NetWare-386:");
+ break;
+ case OS_GEN_UNIX:
+ (void)fprintf(stdout, "Unix:");
+ break;
+ case OS_SCO_UNIX:
+ (void)fprintf(stdout, "SCO Unix:");
+ break;
+ case OS_ATT_UNIX:
+ (void)fprintf(stdout, "AT&T Unix:");
+ break;
+ case OS_UNIXWARE:
+ (void)fprintf(stdout, "UnixWare:");
+ break;
+ case OS_INT_UNIX:
+ (void)fprintf(stdout, "IAC Unix:");
+ break;
+ case OS_SOLARIS:
+ (void)fprintf(stdout, "Solaris:");
+ break;
+ case OS_QNX:
+ (void)fprintf(stdout, "Qnx:");
+ break;
+ case OS_NEXTSTEP:
+ (void)fprintf(stdout, "NextStep:");
+ break;
+ case OS_BANYAN:
+ (void)fprintf(stdout, "Banyan:");
+ break;
+ case OS_OLIVETTI_UNIX:
+ (void)fprintf(stdout, "Olivetti Unix:");
+ break;
+ case OS_FREEBSD:
+ (void)fprintf(stdout, "FreeBSD:");
+ break;
+ case OS_OTHER:
+ (void)fprintf(stdout, "Other (%d):", sysinfo.osType);
+ break;
+ default:
+ (void)fprintf(stdout, "Unknown (%d):", sysinfo.osType);
+ }
+
+ (void)fprintf(stdout, "%d.%d.%d.%d:", sysinfo.osMajorVersion,
+ sysinfo.osMinorVersion, sysinfo.osRevision,
+ sysinfo.osSubRevision);
+
+ switch (sysinfo.busType) {
+ case HBA_BUS_ISA:
+ (void)fprintf(stdout, "ISA:");
+ break;
+ case HBA_BUS_EISA:
+ (void)fprintf(stdout, "EISA:");
+ break;
+ case HBA_BUS_PCI:
+ (void)fprintf(stdout, "PCI:");
+ break;
+ default:
+ (void)fprintf(stdout, "Unknown (%d):", sysinfo.busType);
+ }
+
+ for (ndx = 0; ndx < 16; ndx++) {
+ if (sysinfo.drives[ndx].cylinders == 0)
+ continue;
+ (void)fprintf(stdout, "d%dc%dh%ds%d:", ndx,
+ sysinfo.drives[ndx].cylinders,
+ sysinfo.drives[ndx].heads,
+ sysinfo.drives[ndx].sectors);
+ }
+
+ (void)fprintf(stdout, "\n");
+
+ return(0);
+}
OpenPOWER on IntegriCloud