1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
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
29#include <sys/types.h>
30#include <stdio.h>
31#include <paths.h>
32#include <string.h>
33
34#include <dev/mlx/mlxio.h>
35#include <dev/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) */
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
110mlx_print_phys_drv(struct mlx_phys_drv *drv, int chn, int targ, char *prefix, int verbose)
111{
112    char	*type, *device, *vendor, *revision;
113
114    switch(drv->pd_flags2 & 0x03) {
115    case MLX_PHYS_DRV_DISK:
116	type = "disk";
117	break;
118    case MLX_PHYS_DRV_SEQUENTIAL:
119	type = "tape";
120	break;
121    case MLX_PHYS_DRV_CDROM:
122	type= "cdrom";
123	break;
124    case MLX_PHYS_DRV_OTHER:
125    default:
126	type = "unknown";
127	break;
128    }
129    printf("%s%s%02d%02d ", prefix, type, chn, targ);
130    switch(drv->pd_status) {
131    case MLX_PHYS_DRV_DEAD:
132	printf(" (dead)       ");
133	break;
134    case MLX_PHYS_DRV_WRONLY:
135	printf(" (write-only) ");
136	break;
137    case MLX_PHYS_DRV_ONLINE:
138	printf(" (online)     ");
139	break;
140    case MLX_PHYS_DRV_STANDBY:
141	printf(" (standby)    ");
142	break;
143    default:
144	printf(" (0x%02x)   ", drv->pd_status);
145    }
146    printf("\n");
147
148    if (verbose) {
149
150	printf("%s   ", prefix);
151	if (!mlx_scsi_inquiry(0, chn, targ, &vendor, &device, &revision)) {
152	    printf("'%8.8s' '%16.16s' '%4.4s'", vendor, device, revision);
153	} else {
154	    printf("<IDENTIFY FAILED>");
155	}
156
157	printf(" %dMB ", drv->pd_config_size / 2048);
158
159	if (drv->pd_flags2 & MLX_PHYS_DRV_FAST20) {
160	    printf(" fast20");
161	} else if (drv->pd_flags2 & MLX_PHYS_DRV_FAST) {
162	    printf(" fast");
163	}
164	if (drv->pd_flags2 & MLX_PHYS_DRV_WIDE)
165	    printf(" wide");
166	if (drv->pd_flags2 & MLX_PHYS_DRV_SYNC)
167	    printf(" sync");
168	if (drv->pd_flags2 & MLX_PHYS_DRV_TAG)
169	    printf(" tag-enabled");
170	printf("\n");
171    }
172}
173