mlxcontrol(8): Sync with FreeBSD.
[dragonfly.git] / usr.sbin / mlxcontrol / util.c
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  *
26  *      $FreeBSD: src/usr.sbin/mlxcontrol/util.c,v 1.2 2000/04/11 23:04:17 msmith Exp $
27  */
28
29 #include <sys/types.h>
30 #include <stdio.h>
31 #include <paths.h>
32 #include <string.h>
33
34 #include <dev/raid/mlx/mlxio.h>
35 #include <dev/raid/mlx/mlxreg.h>
36
37 #include "mlxcontrol.h"
38
39 /********************************************************************************
40  * Various name-producing and -parsing functions
41  */
42
43 /* return path of controller (unit) */
44 char *
45 ctrlrpath(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) */
54 char *
55 ctrlrname(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) */
64 char *
65 drivepath(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) */
74 char *
75 drivename(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) */
84 int
85 ctrlrunit(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) */
95 int
96 driveunit(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
109 void
110 mlx_print_phys_drv(struct mlx_phys_drv *drv, int chn, int targ, const char *prefix, int verbose)
111 {
112     const char  *type;
113     char        *device, *vendor, *revision;
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 }