xref: /freebsd/usr.sbin/mlxcontrol/util.c (revision 6829dae12bb055451fa467da4589c43bd03b1e64)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1999 Michael Smith
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  *	$FreeBSD$
29  */
30 
31 #include <sys/types.h>
32 #include <stdio.h>
33 #include <paths.h>
34 #include <string.h>
35 
36 #include <dev/mlx/mlxio.h>
37 #include <dev/mlx/mlxreg.h>
38 
39 #include "mlxcontrol.h"
40 
41 /********************************************************************************
42  * Various name-producing and -parsing functions
43  */
44 
45 /* return path of controller (unit) */
46 char *
47 ctrlrpath(int unit)
48 {
49     static char	buf[32];
50 
51     sprintf(buf, "%s%s", _PATH_DEV, ctrlrname(unit));
52     return(buf);
53 }
54 
55 /* return name of controller (unit) */
56 char *
57 ctrlrname(int unit)
58 {
59     static char	buf[32];
60 
61     sprintf(buf, "mlx%d", unit);
62     return(buf);
63 }
64 
65 /* return path of drive (unit) */
66 char *
67 drivepath(int unit)
68 {
69     static char	buf[32];
70 
71     sprintf(buf, "%s%s", _PATH_DEV, drivename(unit));
72     return(buf);
73 }
74 
75 /* return name of drive (unit) */
76 char *
77 drivename(int unit)
78 {
79     static char	buf[32];
80 
81     sprintf(buf, "mlxd%d", unit);
82     return(buf);
83 }
84 
85 /* get controller unit number from name in (str) */
86 int
87 ctrlrunit(char *str)
88 {
89     int		unit;
90 
91     if (sscanf(str, "mlx%d", &unit) == 1)
92 	return(unit);
93     return(-1);
94 }
95 
96 /* get drive unit number from name in (str) */
97 int
98 driveunit(char *str)
99 {
100     int		unit;
101 
102     if (sscanf(str, "mlxd%d", &unit) == 1)
103 	return(unit);
104     return(-1);
105 }
106 
107 /********************************************************************************
108  * Standardised output of various data structures.
109  */
110 
111 void
112 mlx_print_phys_drv(struct mlx_phys_drv *drv, int chn, int targ, char *prefix, int verbose)
113 {
114     char	*type, *device, *vendor, *revision;
115 
116     switch(drv->pd_flags2 & 0x03) {
117     case MLX_PHYS_DRV_DISK:
118 	type = "disk";
119 	break;
120     case MLX_PHYS_DRV_SEQUENTIAL:
121 	type = "tape";
122 	break;
123     case MLX_PHYS_DRV_CDROM:
124 	type= "cdrom";
125 	break;
126     case MLX_PHYS_DRV_OTHER:
127     default:
128 	type = "unknown";
129 	break;
130     }
131     printf("%s%s%02d%02d ", prefix, type, chn, targ);
132     switch(drv->pd_status) {
133     case MLX_PHYS_DRV_DEAD:
134 	printf(" (dead)       ");
135 	break;
136     case MLX_PHYS_DRV_WRONLY:
137 	printf(" (write-only) ");
138 	break;
139     case MLX_PHYS_DRV_ONLINE:
140 	printf(" (online)     ");
141 	break;
142     case MLX_PHYS_DRV_STANDBY:
143 	printf(" (standby)    ");
144 	break;
145     default:
146 	printf(" (0x%02x)   ", drv->pd_status);
147     }
148     printf("\n");
149 
150     if (verbose) {
151 
152 	printf("%s   ", prefix);
153 	if (!mlx_scsi_inquiry(0, chn, targ, &vendor, &device, &revision)) {
154 	    printf("'%8.8s' '%16.16s' '%4.4s'", vendor, device, revision);
155 	} else {
156 	    printf("<IDENTIFY FAILED>");
157 	}
158 
159 	printf(" %dMB ", drv->pd_config_size / 2048);
160 
161 	if (drv->pd_flags2 & MLX_PHYS_DRV_FAST20) {
162 	    printf(" fast20");
163 	} else if (drv->pd_flags2 & MLX_PHYS_DRV_FAST) {
164 	    printf(" fast");
165 	}
166 	if (drv->pd_flags2 & MLX_PHYS_DRV_WIDE)
167 	    printf(" wide");
168 	if (drv->pd_flags2 & MLX_PHYS_DRV_SYNC)
169 	    printf(" sync");
170 	if (drv->pd_flags2 & MLX_PHYS_DRV_TAG)
171 	    printf(" tag-enabled");
172 	printf("\n");
173     }
174 }
175