Add a control utility for `mlx' devices. Derived from FreeBSD's `mlxcontrol'.

This commit is contained in:
ad 2001-02-04 17:30:35 +00:00
parent 8067f991df
commit ea0d957018
11 changed files with 1604 additions and 4 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: mi,v 1.224 2001/02/03 02:57:12 jwise Exp $ # $NetBSD: mi,v 1.225 2001/02/04 17:30:36 ad Exp $
. base-sys-root . base-sys-root
./altroot base-sys-root ./altroot base-sys-root
./bin base-sys-root ./bin base-sys-root
@ -646,6 +646,7 @@
./usr/sbin/mkalias base-nis-bin ./usr/sbin/mkalias base-nis-bin
./usr/sbin/mknetid base-nis-bin ./usr/sbin/mknetid base-nis-bin
./usr/sbin/mld6query base-netutil-bin ./usr/sbin/mld6query base-netutil-bin
./usr/sbin/mlxctl base-sysutil-bin
./usr/sbin/mopa.out base-bootserver-bin ./usr/sbin/mopa.out base-bootserver-bin
./usr/sbin/mopchk base-bootserver-bin ./usr/sbin/mopchk base-bootserver-bin
./usr/sbin/mopd base-bootserver-bin ./usr/sbin/mopd base-bootserver-bin

View File

@ -1,4 +1,4 @@
# $NetBSD: mi,v 1.319 2001/02/04 17:05:14 ad Exp $ # $NetBSD: mi,v 1.320 2001/02/04 17:30:36 ad Exp $
./usr/share/info/am-utils.info man-amd-info ./usr/share/info/am-utils.info man-amd-info
./usr/share/info/as.info man-computil-info ./usr/share/info/as.info man-computil-info
./usr/share/info/awk.info man-util-info ./usr/share/info/awk.info man-util-info
@ -2718,6 +2718,7 @@
./usr/share/man/man8/mknetid.8 man-nis-man ./usr/share/man/man8/mknetid.8 man-nis-man
./usr/share/man/man8/mknod.8 man-sysutil-man ./usr/share/man/man8/mknod.8 man-sysutil-man
./usr/share/man/man8/mld6query.8 man-netutil-man ./usr/share/man/man8/mld6query.8 man-netutil-man
./usr/share/man/man8/mlxctl.8 man-sysutil-man
./usr/share/man/man8/modload.8 man-sysutil-man ./usr/share/man/man8/modload.8 man-sysutil-man
./usr/share/man/man8/modstat.8 man-sysutil-man ./usr/share/man/man8/modstat.8 man-sysutil-man
./usr/share/man/man8/modunload.8 man-sysutil-man ./usr/share/man/man8/modunload.8 man-sysutil-man

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.154 2001/01/06 13:03:49 martin Exp $ # $NetBSD: Makefile,v 1.155 2001/02/04 17:30:35 ad Exp $
# from: @(#)Makefile 5.20 (Berkeley) 6/12/93 # from: @(#)Makefile 5.20 (Berkeley) 6/12/93
.include <bsd.own.mk> .include <bsd.own.mk>
@ -10,7 +10,7 @@ SUBDIR= ac accton altq amd apm apmd arp bad144 bind bootp catman \
grfconfig grfinfo gspa hilinfo inetd iopctl iostat ipf isdn iteconfig \ grfconfig grfinfo gspa hilinfo inetd iopctl iostat ipf isdn iteconfig \
kgmon kvm_mkdb lastlogin link lpr mailwrapper map-mbone \ kgmon kvm_mkdb lastlogin link lpr mailwrapper map-mbone \
mdconfig mdsetimage \ mdconfig mdsetimage \
memswitch mopd mountd mrinfo mrouted mtrace mtree \ memswitch mlxctl mopd mountd mrinfo mrouted mtrace mtree \
netgroup_mkdb nfsd ntp pkg_install pppd pstat \ netgroup_mkdb nfsd ntp pkg_install pppd pstat \
pwd_mkdb quot quotacheck quotaon rarpd rbootd rdate \ pwd_mkdb quot quotacheck quotaon rarpd rbootd rdate \
repquota rmt rpc.bootparamd rpc.lockd rpc.pcnfsd \ repquota rmt rpc.bootparamd rpc.lockd rpc.pcnfsd \

10
usr.sbin/mlxctl/Makefile Normal file
View File

@ -0,0 +1,10 @@
# $NetBSD: Makefile,v 1.1 2001/02/04 17:30:37 ad Exp $
PROG= mlxctl
SRCS= cmds.c config.c dklist.c main.c util.c
MAN= mlxctl.8
LDADD= -lkvm
DPADD= ${LIBKVM}
.include <bsd.prog.mk>

406
usr.sbin/mlxctl/cmds.c Normal file
View File

@ -0,0 +1,406 @@
/* $NetBSD: cmds.c,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*-
* Copyright (c) 1999 Michael Smith
* 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.
* 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.
*
* 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.
*
* from FreeBSD: command.c,v 1.2 2000/04/11 23:04:17 msmith Exp
*/
#ifndef lint
#include <sys/cdefs.h>
__RCSID("$NetBSD: cmds.c,v 1.1 2001/02/04 17:30:37 ad Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
#include <sys/endian.h>
#include <dev/ic/mlxreg.h>
#include <dev/ic/mlxio.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <getopt.h>
#include "extern.h"
static void cmd_status0(struct mlx_disk *);
static void cmd_check0(struct mlx_disk *);
static void cmd_detach0(struct mlx_disk *);
static struct mlx_rebuild_status rs;
static int rstatus;
struct {
int hwid;
const char *name;
} static const mlx_ctlr_names[] = {
{ 0x01, "960P/PD" },
{ 0x02, "960PL" },
{ 0x10, "960PG" },
{ 0x11, "960PJ" },
{ 0x12, "960PR" },
{ 0x13, "960PT" },
{ 0x14, "960PTL0" },
{ 0x15, "960PRL" } ,
{ 0x16, "960PTL1" },
{ 0x20, "1100PVX" },
{ -1, NULL },
};
/*
* Status output
*/
static void
cmd_status0(struct mlx_disk *md)
{
const char *statusfmt;
int result;
result = md->hwunit;
if (ioctl(mlxfd, MLXD_STATUS, &result) < 0)
err(EXIT_FAILURE, "ioctl(MLXD_STATUS)");
switch(result) {
case MLX_SYSD_ONLINE:
statusfmt = "%s: online\n";
break;
case MLX_SYSD_CRITICAL:
statusfmt = "%s: critical\n";
if (!rstatus)
rstatus = 1;
break;
case MLX_SYSD_OFFLINE:
statusfmt = "%s: offline\n";
rstatus = 2;
break;
default:
statusfmt = "%s: unknown status 0x%02x\n";
break;
}
printf(statusfmt, md->name, result);
/* Rebuild/check in progress on this drive? */
if (rs.rs_drive == md->hwunit &&
rs.rs_code != MLX_REBUILDSTAT_IDLE) {
switch(rs.rs_code) {
case MLX_REBUILDSTAT_REBUILDCHECK:
printf(" [consistency check");
break;
case MLX_REBUILDSTAT_ADDCAPACITY:
printf(" [add capacity");
break;
case MLX_REBUILDSTAT_ADDCAPACITYINIT:
printf(" [add capacity init");
break;
default:
printf(" [unknown operation");
break;
}
printf(": %d/%d, %d%% complete]\n", rs.rs_remaining, rs.rs_size,
((rs.rs_size - rs.rs_remaining) / (rs.rs_size / 100)));
}
}
int
cmd_status(char **argv)
{
if (ioctl(mlxfd, MLX_REBUILDSTAT, &rs) < 0)
err(EXIT_FAILURE, "ioctl(MLX_REBUILDSTAT)");
mlx_disk_iterate(cmd_status0);
return (rstatus);
}
/*
* Display controller status.
*/
int
cmd_cstatus(char **argv)
{
struct mlx_enquiry2 enq;
struct mlx_phys_drv pd;
static char buf[80];
const char *model;
int i, channel, target;
mlx_enquiry(&enq);
for (i = 0; i < sizeof(mlx_ctlr_names) / sizeof(mlx_ctlr_names[0]); i++)
if (enq.me_hardware_id[0] == mlx_ctlr_names[i].hwid) {
model = mlx_ctlr_names[i].name;
break;
}
if (i == sizeof(mlx_ctlr_names) / sizeof(mlx_ctlr_names[0])) {
sprintf(buf, " model 0x%x", enq.me_hardware_id[0]);
model = buf;
}
printf("DAC%s, %d channel%s, firmware %d.%02d-%c-%02d, %dMB RAM\n",
model, enq.me_actual_channels,
enq.me_actual_channels > 1 ? "s" : "",
enq.me_firmware_id[0], enq.me_firmware_id[1],
enq.me_firmware_id[2], enq.me_firmware_id[3],
le32toh(enq.me_mem_size) / (1024 * 1024));
if (verbosity > 0) {
printf(" Hardware ID\t\t\t0x%08x\n",
le32toh(*(u_int32_t *)enq.me_hardware_id));
printf(" Firmware ID\t\t\t0x%08x\n",
le32toh(*(u_int32_t *)enq.me_firmware_id));
printf(" Configured/Actual channels\t%d/%d\n",
enq.me_configured_channels, enq.me_actual_channels);
printf(" Max Targets\t\t\t%d\n", enq.me_max_targets);
printf(" Max Tags\t\t\t%d\n", enq.me_max_tags);
printf(" Max System Drives\t\t%d\n", enq.me_max_sys_drives);
printf(" Max Arms\t\t\t%d\n", enq.me_max_arms);
printf(" Max Spans\t\t\t%d\n", enq.me_max_spans);
printf(" DRAM/cache/flash/NVRAM size\t%d/%d/%d/%d\n",
le32toh(enq.me_mem_size), le32toh(enq.me_cache_size),
le32toh(enq.me_flash_size), le32toh(enq.me_nvram_size));
printf(" DRAM type\t\t\t%d\n", le16toh(enq.me_mem_type));
printf(" Clock Speed\t\t\t%dns\n",
le16toh(enq.me_clock_speed));
printf(" Hardware Speed\t\t%dns\n",
le16toh(enq.me_hardware_speed));
printf(" Max Commands\t\t\t%d\n",
le16toh(enq.me_max_commands));
printf(" Max SG Entries\t\t%d\n", le16toh(enq.me_max_sg));
printf(" Max DP\t\t\t%d\n", le16toh(enq.me_max_dp));
printf(" Max IOD\t\t\t%d\n", le16toh(enq.me_max_iod));
printf(" Max Comb\t\t\t%d\n", le16toh(enq.me_max_comb));
printf(" Latency\t\t\t%ds\n", enq.me_latency);
printf(" SCSI Timeout\t\t\t%ds\n", enq.me_scsi_timeout);
printf(" Min Free Lines\t\t%d\n",
le16toh(enq.me_min_freelines));
printf(" Rate Constant\t\t\t%d\n", enq.me_rate_const);
printf(" MAXBLK\t\t\t%d\n", le16toh(enq.me_maxblk));
printf(" Blocking Factor\t\t%d sectors\n",
le16toh(enq.me_blocking_factor));
printf(" Cache Line Size\t\t%d blocks\n",
le16toh(enq.me_cacheline));
printf(" SCSI Capability\t\t%s%dMHz, %d bit\n",
enq.me_scsi_cap & (1<<4) ? "differential " : "",
(1 << ((enq.me_scsi_cap >> 2) & 3)) * 10,
8 << (enq.me_scsi_cap & 0x3));
printf(" Firmware Build Number\t\t%d\n",
le16toh(enq.me_firmware_build));
printf(" Fault Management Type\t\t%d\n",
enq.me_fault_mgmt_type);
#if 0
printf(" Features\t\t\t%b\n", enq.me_firmware_features,
"\20\4Background Init\3Read Ahead\2MORE\1Cluster\n");
#endif
}
fflush(stdout);
/*
* Fetch and print physical drive data.
*/
for (channel = 0; channel < enq.me_configured_channels; channel++) {
for (target = 0; target < enq.me_max_targets; target++)
if (mlx_get_device_state(channel, target, &pd) == 0 &&
(pd.pd_flags1 & MLX_PHYS_DRV_PRESENT) != 0)
mlx_print_phys_drv(&pd, channel, target, " ");
}
return (0);
}
/*
* Recscan for new or changed system drives.
*/
int
cmd_rescan(char **argv)
{
if (ioctl(mlxfd, MLX_RESCAN_DRIVES) < 0)
err(EXIT_FAILURE, "rescan failed");
return (0);
}
/*
* Detach one or more system drives from a controller.
*/
static void
cmd_detach0(struct mlx_disk *md)
{
if (ioctl(mlxfd, MLXD_DETACH, &md->hwunit) < 0)
warn("can't detach %s", md->name);
}
int
cmd_detach(char **argv)
{
mlx_disk_iterate(cmd_detach0);
return (0);
}
/*
* Initiate a consistency check on a system drive.
*/
static void
cmd_check0(struct mlx_disk *md)
{
int result;
if (ioctl(mlxfd, MLXD_CHECKASYNC, &result) == 0)
return;
switch (result) {
case 0x0002:
warnx("one or more of the SCSI disks on which %s", md->name);
warnx("depends is DEAD.", md->name);
break;
case 0x0105:
warnx("drive %s is invalid, or not a drive which ", md->name);
warnx("can be checked.");
break;
case 0x0106:
warnx("drive rebuild or consistency check is already ");
warnx("in progress on this controller.");
break;
default:
err(EXIT_FAILURE, "ioctl(MLXD_CHECKASYNC)");
/* NOTREACHED */
}
}
int
cmd_check(char **argv)
{
mlx_disk_iterate(cmd_check0);
return (0);
}
/*
* Initiate a physical drive rebuild.
*/
int
cmd_rebuild(char **argv)
{
struct mlx_rebuild_request rb;
char *p;
if (argv[0] == NULL || argv[1] != NULL)
usage();
rb.rr_channel = strtol(*argv, &p, 0);
if (p[0] != ':' || p[1] == '\0')
usage();
rb.rr_target = strtol(*argv, &p, 0);
if (p[0] != '\0')
usage();
if (ioctl(mlxfd, MLX_REBUILDASYNC, &rb) == 0)
return (0);
switch (rb.rr_status) {
case 0x0002:
warnx("the drive at %d:%d is already ONLINE", rb.rr_channel,
rb.rr_target);
break;
case 0x0004:
warnx("drive failed during rebuild");
break;
case 0x0105:
warnx("there is no drive at %d:%d", rb.rr_channel,
rb.rr_target);
break;
case 0x0106:
warnx("drive rebuild or consistency check is already in ");
warnx("progress on this controller");
break;
default:
err(EXIT_FAILURE, "ioctl(MLXD_CHECKASYNC)");
/* NOTREACHED */
}
return(0);
}

237
usr.sbin/mlxctl/config.c Normal file
View File

@ -0,0 +1,237 @@
/* $NetBSD: config.c,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*-
* Copyright (c) 1999 Michael Smith
* 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.
* 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.
*
* 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.
*
* from FreeBSD: config.c,v 1.2 2000/04/11 23:04:17 msmith Exp
*/
#ifndef lint
#include <sys/cdefs.h>
__RCSID("$NetBSD: config.c,v 1.1 2001/02/04 17:30:37 ad Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
#include <dev/ic/mlxreg.h>
#include <dev/ic/mlxio.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <getopt.h>
#include "extern.h"
struct conf_phys_drv {
TAILQ_ENTRY(conf_phys_drv) pd_link;
int pd_bus;
int pd_target;
struct mlx_phys_drv pd_drv;
};
struct conf_span {
TAILQ_ENTRY(conf_span) s_link;
struct conf_phys_drv *s_drvs[8];
struct mlx_sys_drv_span s_span;
};
struct conf_sys_drv {
TAILQ_ENTRY(conf_sys_drv) sd_link;
struct conf_span *sd_spans[4];
struct mlx_sys_drv sd_drv;
};
struct conf_config {
TAILQ_HEAD(,conf_phys_drv) cc_phys_drvs;
TAILQ_HEAD(,conf_span) cc_spans;
TAILQ_HEAD(,conf_sys_drv) cc_sys_drvs;
struct conf_sys_drv *cc_drives[32];
struct mlx_core_cfg cc_cfg;
};
static void print_span(struct mlx_sys_drv_span *, int);
static void print_sys_drive(struct conf_config *, int);
static void print_phys_drive(struct conf_config *, int, int);
/*
* Get the configuration from the selected controller.
*
* config <controller>
* Print the configuration for <controller>
*
* XXX update to support adding/deleting drives.
*/
int
cmd_config(char **argv)
{
char hostname[MAXHOSTNAMELEN];
struct conf_config conf;
int i, j;
memset(&conf.cc_cfg, 0, sizeof(conf.cc_cfg));
mlx_configuration(&conf.cc_cfg, 0);
gethostname(hostname, sizeof(hostname));
printf("# controller %s on %s\n", mlxname, hostname);
printf("#\n# physical devices connected:\n");
for (i = 0; i < 5; i++)
for (j = 0; j < 16; j++)
print_phys_drive(&conf, i, j);
printf("#\n# system drives defined:\n");
for (i = 0; i < conf.cc_cfg.cc_num_sys_drives; i++)
print_sys_drive(&conf, i);
return(0);
}
/*
* Print details for the system drive (drvno) in a format that we will be
* able to parse later.
*
* drive?? <raidlevel> <writemode>
* span? 0x????????-0x???????? ????blks on <disk> [...]
* ...
*/
static void
print_span(struct mlx_sys_drv_span *span, int arms)
{
int i;
printf("0x%08x-0x%08x %u blks on", span->sp_start_lba,
span->sp_start_lba + span->sp_nblks, span->sp_nblks);
for (i = 0; i < arms; i++)
printf(" disk%02d%02d", span->sp_arm[i] >> 4,
span->sp_arm[i] & 0x0f);
printf("\n");
}
static void
print_sys_drive(struct conf_config *conf, int drvno)
{
struct mlx_sys_drv *drv;
int i;
drv = &conf->cc_cfg.cc_sys_drives[drvno];
printf("drive%02d ", drvno);
switch(drv->sd_raidlevel & 0xf) {
case MLX_SYS_DRV_RAID0:
printf("RAID0");
break;
case MLX_SYS_DRV_RAID1:
printf("RAID1");
break;
case MLX_SYS_DRV_RAID3:
printf("RAID3");
break;
case MLX_SYS_DRV_RAID5:
printf("RAID5");
break;
case MLX_SYS_DRV_RAID6:
printf("RAID6");
break;
case MLX_SYS_DRV_JBOD:
printf("JBOD");
break;
default:
printf("RAID?");
break;
}
printf(" write%s\n",
drv->sd_raidlevel & MLX_SYS_DRV_WRITEBACK ? "back" : "through");
for (i = 0; i < drv->sd_valid_spans; i++) {
printf(" span%d ", i);
print_span(&drv->sd_span[i], drv->sd_valid_arms);
}
}
/*
* Print details for the physical drive at chn/targ in a format suitable for
* human consumption.
*/
static void
print_phys_drive(struct conf_config *conf, int chn, int targ)
{
struct mlx_phys_drv *pd;
pd = &conf->cc_cfg.cc_phys_drives[chn * 16 + targ];
/* If the drive isn't present, don't print it. */
if ((pd->pd_flags1 & MLX_PHYS_DRV_PRESENT) == 0)
return;
mlx_print_phys_drv(pd, chn, targ, "# ");
}

234
usr.sbin/mlxctl/dklist.c Normal file
View File

@ -0,0 +1,234 @@
/* $NetBSD: dklist.c,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*
* Copyright (c) 1996 John M. Vinopal
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project
* by John M. Vinopal.
* 4. 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 ``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 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.
*/
#ifndef lint
#include <sys/cdefs.h>
__RCSID("$NetBSD: dklist.c,v 1.1 2001/02/04 17:30:37 ad Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/disk.h>
#include <sys/ioctl.h>
#include <dev/ic/mlxreg.h>
#include <dev/ic/mlxio.h>
#include <err.h>
#include <fcntl.h>
#include <kvm.h>
#include <limits.h>
#include <nlist.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include "extern.h"
static SIMPLEQ_HEAD(, mlx_disk) mlx_disks;
static struct nlist namelist[] = {
#define X_DISK_COUNT 4
{ "_disk_count" }, /* number of disks */
#define X_DISKLIST 5
{ "_disklist" }, /* TAILQ of disks */
{ NULL },
};
#define KVM_ERROR(_string) { \
warnx("%s", (_string)); \
errx(1, "%s", kvm_geterr(kd)); \
}
/*
* Dereference the namelist pointer `v' and fill in the local copy
* 'p' which is of size 's'.
*/
#define deref_nl(kd, v, p, s) \
deref_kptr(kd, (void *)namelist[(v)].n_value, (p), (s));
static void deref_kptr(kvm_t *, void *, void *, size_t);
void
mlx_disk_init(void)
{
SIMPLEQ_INIT(&mlx_disks);
}
int
mlx_disk_empty(void)
{
return (SIMPLEQ_FIRST(&mlx_disks) == NULL);
}
void
mlx_disk_iterate(void (*func)(struct mlx_disk *))
{
struct mlx_disk *md;
SIMPLEQ_FOREACH(md, &mlx_disks, chain)
(*func)(md);
}
static int
mlx_disk_add0(const char *name)
{
struct mlx_disk *md;
int unit;
if (name[0] != 'l' || name[1] != 'd' || !isdigit(name[2]))
return (-1);
SIMPLEQ_FOREACH(md, &mlx_disks, chain)
if (strcmp(md->name, name) == 0)
return (0);
unit = atoi(name + 2);
if (ioctl(mlxfd, MLX_GET_SYSDRIVE, &unit) < 0)
return (-1);
if ((md = malloc(sizeof(*md))) == NULL)
err(EXIT_FAILURE, "mlx_disk_add()");
strlcpy(md->name, name, sizeof(md->name));
md->hwunit = unit;
SIMPLEQ_INSERT_TAIL(&mlx_disks, md, chain);
return (0);
}
void
mlx_disk_add(const char *name)
{
if (mlx_disk_add0(name) != 0)
errx(EXIT_FAILURE, "%s is not attached to %s", name, mlxname);
}
void
mlx_disk_add_all(void)
{
struct disklist_head disk_head;
struct disk cur_disk, *dk;
char errbuf[_POSIX2_LINE_MAX];
char buf[12];
int i, ndrives;
kvm_t *kd;
/* Open the kernel. */
if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf)) == NULL)
errx(1, "kvm_openfiles: %s", errbuf);
/* Obtain the namelist symbols from the kernel. */
if (kvm_nlist(kd, namelist))
KVM_ERROR("kvm_nlist failed to read symbols.");
/* Get the number of attached drives. */
deref_nl(kd, X_DISK_COUNT, &ndrives, sizeof(ndrives));
if (ndrives < 0)
errx(EXIT_FAILURE, "invalid _disk_count %d.", ndrives);
if (ndrives == 0)
errx(EXIT_FAILURE, "no drives attached.");
/* Get a pointer to the first disk. */
deref_nl(kd, X_DISKLIST, &disk_head, sizeof(disk_head));
dk = TAILQ_FIRST(&disk_head);
/* Try to add each disk to the list. */
for (i = 0; i < ndrives; i++) {
deref_kptr(kd, dk, &cur_disk, sizeof(cur_disk));
deref_kptr(kd, cur_disk.dk_name, buf, sizeof(buf));
mlx_disk_add0(buf);
dk = TAILQ_NEXT(dk, dk_link);
}
kvm_close(kd);
}
/*
* Dereference the kernel pointer `kptr' and fill in the local copy pointed
* to by `ptr'. The storage space must be pre-allocated, and the size of
* the copy passed in `len'.
*/
static void
deref_kptr(kvm_t *kd, void *kptr, void *ptr, size_t len)
{
char buf[128];
if (kvm_read(kd, (u_long)kptr, (char *)ptr, len) != len) {
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof buf, "can't dereference kptr 0x%lx",
(u_long)kptr);
KVM_ERROR(buf);
}
}

88
usr.sbin/mlxctl/extern.h Normal file
View File

@ -0,0 +1,88 @@
/* $NetBSD: extern.h,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*
* main.c
*/
extern int mlxfd;
extern const char *mlxname;
extern const char *nlistf;
extern const char *memf;
extern int verbosity;
void usage(void) __attribute__ ((__noreturn__));
/*
* dklist.c
*/
struct mlx_disk {
SIMPLEQ_ENTRY(mlx_disk) chain;
int hwunit;
char name[8];
};
void mlx_disk_init(void);
int mlx_disk_empty(void);
void mlx_disk_add(const char *);
void mlx_disk_add_all(void);
void mlx_disk_iterate(void (*)(struct mlx_disk *));
/*
* util.c
*/
int mlx_command(struct mlx_usercommand *, int);
void mlx_enquiry(struct mlx_enquiry2 *enq);
void mlx_configuration(struct mlx_core_cfg *, int);
int mlx_scsi_inquiry(int, int, char **, char **, char **);
int mlx_get_device_state(int, int, struct mlx_phys_drv *);
void mlx_print_phys_drv(struct mlx_phys_drv *, int, int, const char *);
/*
* cmds.c
*/
int cmd_check(char **);
int cmd_cstatus(char **);
int cmd_detach(char **);
int cmd_rebuild(char **);
int cmd_rescan(char **);
int cmd_status(char **);
/*
* config.c
*/
int cmd_config(char **);

160
usr.sbin/mlxctl/main.c Normal file
View File

@ -0,0 +1,160 @@
/* $NetBSD: main.c,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
#ifndef lint
#include <sys/cdefs.h>
__RCSID("$NetBSD: main.c,v 1.1 2001/02/04 17:30:37 ad Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
#include <dev/ic/mlxreg.h>
#include <dev/ic/mlxio.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <getopt.h>
#include "extern.h"
const char *mlxname;
const char *memf;
const char *nlistf;
int mlxfd = -1;
int verbosity;
struct cmd {
const char *label;
int flags;
int (*func)(char **);
};
#define CMD_DISKS 0x01
#define CMD_NOARGS 0x02
static const struct cmd cmdtab[] = {
{ "check", CMD_DISKS, cmd_check },
{ "config", CMD_NOARGS, cmd_config },
{ "cstatus", CMD_NOARGS, cmd_cstatus },
{ "detach", CMD_DISKS, cmd_detach },
{ "rebuild", 0, cmd_rebuild },
{ "rescan", CMD_NOARGS, cmd_rescan },
{ "status", CMD_DISKS, cmd_status },
};
int
main(int argc, char **argv)
{
const struct cmd *cmd, *maxcmd;
const char *cmdname, *dv;
int ch, i, rv;
dv = "/dev/mlx0";
mlx_disk_init();
while ((ch = getopt(argc, argv, "af:v")) != -1) {
switch (ch) {
case 'a':
mlx_disk_add_all();
break;
case 'f':
dv = optarg;
break;
case 'v':
verbosity++;
break;
default:
usage();
/* NOTREACHED */
}
}
if ((cmdname = argv[optind++]) == NULL)
usage();
for (i = 0; dv[i] != '\0'; i++)
if (dv[i] == '/')
mlxname = &dv[i + 1];
if ((mlxfd = open(dv, O_RDWR)) < 0)
err(EXIT_FAILURE, "%s", dv);
cmd = &cmdtab[0];
maxcmd = &cmdtab[sizeof(cmdtab) / sizeof(cmdtab[0])];
while (cmd < maxcmd) {
if (strcmp(cmdname, cmd->label) == 0)
break;
cmd++;
}
if (cmd == maxcmd)
usage();
if ((cmd->flags & CMD_DISKS) != 0) {
while (argv[optind] != NULL)
mlx_disk_add(argv[optind++]);
if (mlx_disk_empty())
usage();
} else if ((cmd->flags & CMD_NOARGS) != 0)
if (argv[optind] != NULL)
usage();
rv = (*cmd->func)(&argv[optind]);
close(mlxfd);
exit(rv);
/* NOTREACHED */
}
void
usage(void)
{
extern char *__progname;
(void)fprintf(stderr, "usage: %s [-f dev] [-av] command [...]\n",
__progname);
exit(EXIT_FAILURE);
/* NOTREACHED */
}

176
usr.sbin/mlxctl/mlxctl.8 Normal file
View File

@ -0,0 +1,176 @@
.\" $NetBSD: mlxctl.8,v 1.1 2001/02/04 17:30:37 ad Exp $
.\"
.\" Copyright (c) 2001 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
.\" by Andrew Doran.
.\"
.\" 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.
.\" 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. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the NetBSD
.\" Foundation, Inc. and its contributors.
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
.\" contributors may be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
.\"
.\" Copyright (c) 2000 Michael Smith
.\" 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.
.\" 2. 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 ``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 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.
.\"
.\" from FreeBSD: mlxcontrol.8,v 1.6 2000/11/20 20:10:07 ru Exp
.\"
.Dd April 10, 2000
.Dt MLXCTL 8
.Os
.Sh NAME
.Nm mlxctl
.Nd Mylex DAC960 family management utility
.Sh SYNOPSIS
.Nm mlxctl
.Op Fl f Ar dev
.Op Fl v
.Op Fl a
status
.Op Ar drive
.Op Ar ...
.Nm mlxctl
.Op Fl f Ar dev
.Op Fl a
detach
.Op Ar drive
.Op Ar ...
.Nm mlxctl
.Op Fl f Ar dev
.Op Fl a
check
.Op Ar drive
.Op Ar ...
.Nm mlxctl
.Op Fl f Ar dev
rebuild
.Ar channel:target
.Nm mlxctl
.Op Fl f Ar dev
cstatus
.Nm mlxctl
.Op Fl f Ar dev
rescan
.Nm mlxctl
.Op Fl f Ar dev
config
.Sh DESCRIPTION
The
.Nm
utility performs status monitoring and management functions for Mylex DAC960
RAID controllers and attached devices.
.Pp
The following options are available:
.Bl -tag -width xxxxxxx
.It Fl a
Apply the action to all drives attached to the controller.
.It Fl f Ar dev
Specify the control device to use. The default is
.Pa /dev/mlx0 .
.It Fl v
Incresed verbosity.
.El
.Pp
The following commands are available:
.Bl -tag -width rebuild
.It cstatus
Display the controller's current status.
.It status
Display the status of the specified drives.
This command returns
0 if all drives tested are online,
1 if one or more drives are critical and
2 if one or more are offline.
.It rescan
Rescan the controller for new, unattached or changed drives.
.It detach
Detach the specified drives. Drives must be unmounted and unopened for this
command to succeed.
.It check
Initiate a consistency check and repair pass on a redundant drive
(eg. RAID1 or RAID5).
The controller will scan the drive and repair any inconsistencies. This
command returns immediately. The
.Ar status
command can be used to monitor the progress of the check.
.It rebuild
Rebuild onto the specified physical drive. Note that there can be only one
running rebuild operation per controller at any given time.
This command returns immediately. The
.Ar cstatus
command can be used to monitor the progress of the rebuild.
.It config
Write the current system drive configuration to stdout.
.El
.Sh EXAMPLES
Display the status of drive ld3 attached to the controller mlx1:
.sp
.D1 Li "mlxctl -f /dev/mlx1 -v status ld3"
.Sh SEE ALSO
.Xr ld 4 ,
.Xr mlx 4
.Sh HISTORY
The
.Nm
command first appeared in
.Nx 1.6 .
.Sh AUTHORS
The
.Nm
command was written by Micheal Smith
.Aq msmith@freebsd.org ,
and appeared in FreeBSD under the guise of
.Nm mlxcontrol .
It was modified for
.Nx
by Andrew Doran
.Aq ad@netbsd.org .
.Sh BUGS
Modifying drive configuration is not yet supported.
.Pp
The cstatus and config commands don't work with all firmware revisions.
.Pp
Error log extraction is not yet supported.

287
usr.sbin/mlxctl/util.c Normal file
View File

@ -0,0 +1,287 @@
/* $NetBSD: util.c,v 1.1 2001/02/04 17:30:37 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Andrew Doran.
*
* 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.
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*-
* Copyright (c) 1999 Michael Smith
* 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.
* 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.
*
* 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.
*/
#ifndef lint
#include <sys/cdefs.h>
__RCSID("$NetBSD: util.c,v 1.1 2001/02/04 17:30:37 ad Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
#include <dev/ic/mlxreg.h>
#include <dev/ic/mlxio.h>
#include <dev/scsipi/scsipi_all.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include "extern.h"
int
mlx_command(struct mlx_usercommand *mu, int bomb)
{
int rv;
if ((rv = ioctl(mlxfd, MLX_COMMAND, mu)) != 0 && bomb)
err(EXIT_FAILURE, "cmd 0x%02x failed",
mu->mu_command[0]);
return (rv);
}
void
mlx_enquiry(struct mlx_enquiry2 *enq)
{
struct mlx_usercommand mu;
struct mlx_enquiry_old meo;
memset(&mu, 0, sizeof(mu));
mu.mu_datasize = sizeof(*enq);
mu.mu_buf = enq;
mu.mu_bufptr = 8;
mu.mu_bufdir = MU_XFER_IN;
mu.mu_command[0] = MLX_CMD_ENQUIRY2;
mlx_command(&mu, 1);
/*
* If we get back a firmware major of 0, this is (probably) an old
* controller, so we need to pull the firmware version from the old
* enquiry structure.
*/
if (enq->me_firmware_id[0] == 0) {
memset(&mu, 0, sizeof(mu));
mu.mu_datasize = sizeof(meo);
mu.mu_buf = &meo;
mu.mu_bufptr = 8;
mu.mu_bufdir = MU_XFER_IN;
mu.mu_command[0] = MLX_CMD_ENQUIRY_OLD;
mlx_command(&mu, 1);
enq->me_firmware_id[0] = meo.me_fwmajor;
enq->me_firmware_id[1] = meo.me_fwminor;
enq->me_firmware_id[2] = '0';
enq->me_firmware_id[3] = 0;
}
}
void
mlx_configuration(struct mlx_core_cfg *cfg, int wr)
{
struct mlx_usercommand mu;
memset(&mu, 0, sizeof(mu));
mu.mu_datasize = sizeof(*cfg);
mu.mu_buf = cfg;
mu.mu_bufptr = 8;
mu.mu_bufdir = (wr ? MU_XFER_OUT : MU_XFER_IN);
mu.mu_command[0] = (wr ? MLX_CMD_WRITE_CONFIG : MLX_CMD_READ_CONFIG);
mlx_command(&mu, 1);
}
int
mlx_get_device_state(int chan, int targ, struct mlx_phys_drv *pd)
{
struct mlx_usercommand mu;
memset(&mu, 0, sizeof(mu));
mu.mu_datasize = sizeof(*pd);
mu.mu_buf = pd;
mu.mu_bufptr = 8;
mu.mu_bufdir = MU_XFER_IN;
mu.mu_command[0] = MLX_CMD_DEVICE_STATE;
mu.mu_command[2] = chan;
mu.mu_command[3] = targ;
return (mlx_command(&mu, 0));
}
int
mlx_scsi_inquiry(int chan, int targ, char **vendor, char **device,
char **revision)
{
struct mlx_usercommand mu;
static struct {
struct mlx_dcdb dcdb;
struct scsipi_inquiry_data inq;
} __attribute__ ((__packed__)) dcdb_cmd;
struct scsipi_inquiry *inq_cmd;
int rv;
inq_cmd = (struct scsipi_inquiry *)&dcdb_cmd.dcdb.dcdb_cdb[0];
memset(&mu, 0, sizeof(mu));
mu.mu_datasize = sizeof(dcdb_cmd);
mu.mu_buf = &dcdb_cmd;
mu.mu_command[0] = MLX_CMD_DIRECT_CDB;
mu.mu_bufdir = MU_XFER_IN | MU_XFER_OUT;
memset(&dcdb_cmd, 0, sizeof(dcdb_cmd));
dcdb_cmd.dcdb.dcdb_target = (chan << 4) | targ;
dcdb_cmd.dcdb.dcdb_flags = MLX_DCDB_DATA_IN | MLX_DCDB_TIMEOUT_10S;
dcdb_cmd.dcdb.dcdb_datasize = sizeof(dcdb_cmd.inq);
dcdb_cmd.dcdb.dcdb_length = 6;
dcdb_cmd.dcdb.dcdb_sense_length = 40;
inq_cmd->opcode = INQUIRY;
inq_cmd->length = sizeof(dcdb_cmd.inq);
if ((rv = mlx_command(&mu, 0)) == 0) {
*vendor = &dcdb_cmd.inq.vendor[0];
*device = &dcdb_cmd.inq.product[0];
*revision = &dcdb_cmd.inq.revision[0];
}
return (rv);
}
void
mlx_print_phys_drv(struct mlx_phys_drv *pd, int chn, int targ,
const char *prefix)
{
char *type, *device, *vendor, *revision;
switch(pd->pd_flags2 & 0x03) {
case MLX_PHYS_DRV_DISK:
type = "disk";
break;
case MLX_PHYS_DRV_SEQUENTIAL:
type = "tape";
break;
case MLX_PHYS_DRV_CDROM:
type= "cdrom";
break;
case MLX_PHYS_DRV_OTHER:
default:
type = "unknown";
break;
}
printf("%s%s%02d%02d ", prefix, type, chn, targ);
switch(pd->pd_status) {
case MLX_PHYS_DRV_DEAD:
printf(" (dead) ");
break;
case MLX_PHYS_DRV_WRONLY:
printf(" (write-only) ");
break;
case MLX_PHYS_DRV_ONLINE:
printf(" (online) ");
break;
case MLX_PHYS_DRV_STANDBY:
printf(" (standby) ");
break;
default:
printf(" (0x%02x) ", pd->pd_status);
break;
}
printf("\n");
if (verbosity == 0)
return;
printf("%s ", prefix);
if (!mlx_scsi_inquiry(chn, targ, &vendor, &device, &revision))
printf("'%8.8s' '%16.16s' '%4.4s'", vendor, device, revision);
else
printf("<IDENTIFY FAILED>");
printf(" %dMB ", pd->pd_config_size / 2048);
if ((pd->pd_flags2 & MLX_PHYS_DRV_FAST20) != 0)
printf(" ultra");
else if ((pd->pd_flags2 & MLX_PHYS_DRV_FAST) != 0)
printf(" fast");
if ((pd->pd_flags2 & MLX_PHYS_DRV_WIDE) != 0)
printf(" wide");
if ((pd->pd_flags2 & MLX_PHYS_DRV_SYNC) != 0)
printf(" sync");
if ((pd->pd_flags2 & MLX_PHYS_DRV_TAG) != 0)
printf(" tag-enabled");
printf("\n");
}