mlxcontrol(8): Sync with FreeBSD.
[dragonfly.git] / usr.sbin / mlxcontrol / util.c
CommitLineData
984263bc
MD
1/*-
2 * Copyright (c) 1999 Michael Smith
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
13 *
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
24 * SUCH DAMAGE.
25 *
c6aff4f7 26 * $FreeBSD: src/usr.sbin/mlxcontrol/util.c,v 1.2 2000/04/11 23:04:17 msmith Exp $
984263bc
MD
27 */
28
29#include <sys/types.h>
30#include <stdio.h>
31#include <paths.h>
32#include <string.h>
33
38a690d7
MD
34#include <dev/raid/mlx/mlxio.h>
35#include <dev/raid/mlx/mlxreg.h>
984263bc
MD
36
37#include "mlxcontrol.h"
38
39/********************************************************************************
40 * Various name-producing and -parsing functions
41 */
42
43/* return path of controller (unit) */
44char *
45ctrlrpath(int unit)
46{
47 static char buf[32];
48
49 sprintf(buf, "%s%s", _PATH_DEV, ctrlrname(unit));
50 return(buf);
51}
52
53/* return name of controller (unit) */
54char *
55ctrlrname(int unit)
56{
57 static char buf[32];
58
59 sprintf(buf, "mlx%d", unit);
60 return(buf);
61}
62
63/* return path of drive (unit) */
64char *
65drivepath(int unit)
66{
67 static char buf[32];
68
69 sprintf(buf, "%s%s", _PATH_DEV, drivename(unit));
70 return(buf);
71}
72
73/* return name of drive (unit) */
74char *
75drivename(int unit)
76{
77 static char buf[32];
78
79 sprintf(buf, "mlxd%d", unit);
80 return(buf);
81}
82
83/* get controller unit number from name in (str) */
84int
85ctrlrunit(char *str)
86{
87 int unit;
88
89 if (sscanf(str, "mlx%d", &unit) == 1)
90 return(unit);
91 return(-1);
92}
93
94/* get drive unit number from name in (str) */
95int
96driveunit(char *str)
97{
98 int unit;
99
100 if (sscanf(str, "mlxd%d", &unit) == 1)
101 return(unit);
102 return(-1);
103}
104
105/********************************************************************************
106 * Standardised output of various data structures.
107 */
108
109void
c6aff4f7 110mlx_print_phys_drv(struct mlx_phys_drv *drv, int chn, int targ, const char *prefix, int verbose)
984263bc 111{
c6aff4f7
SW
112 const char *type;
113 char *device, *vendor, *revision;
984263bc
MD
114
115 switch(drv->pd_flags2 & 0x03) {
116 case MLX_PHYS_DRV_DISK:
117 type = "disk";
118 break;
119 case MLX_PHYS_DRV_SEQUENTIAL:
120 type = "tape";
121 break;
122 case MLX_PHYS_DRV_CDROM:
123 type= "cdrom";
124 break;
125 case MLX_PHYS_DRV_OTHER:
126 default:
127 type = "unknown";
128 break;
129 }
130 printf("%s%s%02d%02d ", prefix, type, chn, targ);
131 switch(drv->pd_status) {
132 case MLX_PHYS_DRV_DEAD:
133 printf(" (dead) ");
134 break;
135 case MLX_PHYS_DRV_WRONLY:
136 printf(" (write-only) ");
137 break;
138 case MLX_PHYS_DRV_ONLINE:
139 printf(" (online) ");
140 break;
141 case MLX_PHYS_DRV_STANDBY:
142 printf(" (standby) ");
143 break;
144 default:
145 printf(" (0x%02x) ", drv->pd_status);
146 }
147 printf("\n");
148
149 if (verbose) {
150
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);
154 } else {
155 printf("<IDENTIFY FAILED>");
156 }
157
158 printf(" %dMB ", drv->pd_config_size / 2048);
159
160 if (drv->pd_flags2 & MLX_PHYS_DRV_FAST20) {
161 printf(" fast20");
162 } else if (drv->pd_flags2 & MLX_PHYS_DRV_FAST) {
163 printf(" fast");
164 }
165 if (drv->pd_flags2 & MLX_PHYS_DRV_WIDE)
166 printf(" wide");
167 if (drv->pd_flags2 & MLX_PHYS_DRV_SYNC)
168 printf(" sync");
169 if (drv->pd_flags2 & MLX_PHYS_DRV_TAG)
170 printf(" tag-enabled");
171 printf("\n");
172 }
173}