Add a control utility for `mlx' devices. Derived from FreeBSD's `mlxcontrol'.
This commit is contained in:
parent
8067f991df
commit
ea0d957018
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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>
|
|
@ -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);
|
||||||
|
}
|
|
@ -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, "# ");
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 **);
|
|
@ -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 */
|
||||||
|
}
|
|
@ -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.
|
|
@ -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");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue