2 * Copyright (c) 1999 Michael Smith
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/usr.sbin/mlxcontrol/util.c,v 1.2.2.1 2000/04/24 19:44:47 msmith Exp $
27 * $DragonFly: src/usr.sbin/mlxcontrol/util.c,v 1.3 2003/08/08 04:18:46 dillon Exp $
30 #include <sys/types.h>
35 #include <dev/raid/mlx/mlxio.h>
36 #include <dev/raid/mlx/mlxreg.h>
38 #include "mlxcontrol.h"
40 /********************************************************************************
41 * Various name-producing and -parsing functions
44 /* return path of controller (unit) */
50 sprintf(buf
, "%s%s", _PATH_DEV
, ctrlrname(unit
));
54 /* return name of controller (unit) */
60 sprintf(buf
, "mlx%d", unit
);
64 /* return path of drive (unit) */
70 sprintf(buf
, "%s%s", _PATH_DEV
, drivename(unit
));
74 /* return name of drive (unit) */
80 sprintf(buf
, "mlxd%d", unit
);
84 /* get controller unit number from name in (str) */
90 if (sscanf(str
, "mlx%d", &unit
) == 1)
95 /* get drive unit number from name in (str) */
101 if (sscanf(str
, "mlxd%d", &unit
) == 1)
106 /********************************************************************************
107 * Standardised output of various data structures.
111 mlx_print_phys_drv(struct mlx_phys_drv
*drv
, int chn
, int targ
, char *prefix
, int verbose
)
113 char *type
, *device
, *vendor
, *revision
;
115 switch(drv
->pd_flags2
& 0x03) {
116 case MLX_PHYS_DRV_DISK
:
119 case MLX_PHYS_DRV_SEQUENTIAL
:
122 case MLX_PHYS_DRV_CDROM
:
125 case MLX_PHYS_DRV_OTHER
:
130 printf("%s%s%02d%02d ", prefix
, type
, chn
, targ
);
131 switch(drv
->pd_status
) {
132 case MLX_PHYS_DRV_DEAD
:
135 case MLX_PHYS_DRV_WRONLY
:
136 printf(" (write-only) ");
138 case MLX_PHYS_DRV_ONLINE
:
139 printf(" (online) ");
141 case MLX_PHYS_DRV_STANDBY
:
142 printf(" (standby) ");
145 printf(" (0x%02x) ", drv
->pd_status
);
151 printf("%s ", prefix
);
152 if (!mlx_scsi_inquiry(0, chn
, targ
, &vendor
, &device
, &revision
)) {
153 printf("'%8.8s' '%16.16s' '%4.4s'", vendor
, device
, revision
);
155 printf("<IDENTIFY FAILED>");
158 printf(" %dMB ", drv
->pd_config_size
/ 2048);
160 if (drv
->pd_flags2
& MLX_PHYS_DRV_FAST20
) {
162 } else if (drv
->pd_flags2
& MLX_PHYS_DRV_FAST
) {
165 if (drv
->pd_flags2
& MLX_PHYS_DRV_WIDE
)
167 if (drv
->pd_flags2
& MLX_PHYS_DRV_SYNC
)
169 if (drv
->pd_flags2
& MLX_PHYS_DRV_TAG
)
170 printf(" tag-enabled");