diff options
Diffstat (limited to 'usr.sbin/dpt/dpt_softc/dpt_softc.c')
-rw-r--r-- | usr.sbin/dpt/dpt_softc/dpt_softc.c | 188 |
1 files changed, 188 insertions, 0 deletions
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); +} |