157580Smjacob/* $FreeBSD$ */
257580Smjacob/*
357580Smjacob * Copyright (c) 2000 by Matthew Jacob
457580Smjacob * All rights reserved.
557580Smjacob *
657580Smjacob * Redistribution and use in source and binary forms, with or without
757580Smjacob * modification, are permitted provided that the following conditions
857580Smjacob * are met:
957580Smjacob * 1. Redistributions of source code must retain the above copyright
1057580Smjacob *    notice, this list of conditions, and the following disclaimer,
1157580Smjacob *    without modification, immediately at the beginning of the file.
1257580Smjacob * 2. The name of the author may not be used to endorse or promote products
1357580Smjacob *    derived from this software without specific prior written permission.
1457580Smjacob *
1557580Smjacob * Alternatively, this software may be distributed under the terms of the
1657580Smjacob * the GNU Public License ("GPL").
1757580Smjacob *
1857580Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1957580Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2057580Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2157580Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2257580Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2357580Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2457580Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2557580Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2657580Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2757580Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2857580Smjacob * SUCH DAMAGE.
2957580Smjacob *
3057580Smjacob * Matthew Jacob
3157580Smjacob * Feral Software
3257580Smjacob * mjacob@feral.com
3357580Smjacob */
3457580Smjacob
35293865Sallanjude#include <sys/endian.h>
36293865Sallanjude#include <sys/types.h>
37293865Sallanjude#include <sys/sbuf.h>
38293865Sallanjude
39293865Sallanjude#include <err.h>
4057580Smjacob#include <unistd.h>
41235911Smav#include <stddef.h>
42235911Smav#include <stdint.h>
4357580Smjacob#include <stdlib.h>
4457580Smjacob#include <stdio.h>
4557580Smjacob#include <sys/ioctl.h>
46235911Smav#include <cam/scsi/scsi_all.h>
47235911Smav#include <cam/scsi/scsi_enc.h>
4857580Smjacob
49198934Sdelphij#include "eltsub.h"
50198934Sdelphij
51293865Sallanjude/*
52293865Sallanjude * offset by +20 degrees.
53293865Sallanjude * The range of the value expresses a temperature between -19 and +235 degrees
54293865Sallanjude * Celsius. A value of 00h is reserved.
55293865Sallanjude */
56293865Sallanjude#define TEMPERATURE_OFFSET 20
57293865Sallanjude
5857580Smjacobchar *
59198934Sdelphijgeteltnm(int type)
6057580Smjacob{
6157580Smjacob	static char rbuf[132];
6257580Smjacob
6357580Smjacob	switch (type) {
64235911Smav	case ELMTYP_UNSPECIFIED:
6557580Smjacob		sprintf(rbuf, "Unspecified");
6657580Smjacob		break;
67235911Smav	case ELMTYP_DEVICE:
68235911Smav		sprintf(rbuf, "Device Slot");
6957580Smjacob		break;
70235911Smav	case ELMTYP_POWER:
71235911Smav		sprintf(rbuf, "Power Supply");
7257580Smjacob		break;
73235911Smav	case ELMTYP_FAN:
74235911Smav		sprintf(rbuf, "Cooling");
7557580Smjacob		break;
76235911Smav	case ELMTYP_THERM:
77235911Smav		sprintf(rbuf, "Temperature Sensors");
7857580Smjacob		break;
79235911Smav	case ELMTYP_DOORLOCK:
8057580Smjacob		sprintf(rbuf, "Door Lock");
8157580Smjacob		break;
82235911Smav	case ELMTYP_ALARM:
8357580Smjacob		sprintf(rbuf, "Audible alarm");
8457580Smjacob		break;
85235911Smav	case ELMTYP_ESCC:
86242621Smav		sprintf(rbuf, "Enclosure Services Controller Electronics");
8757580Smjacob		break;
88235911Smav	case ELMTYP_SCC:
89235911Smav		sprintf(rbuf, "SCC Controller Electronics");
9057580Smjacob		break;
91235911Smav	case ELMTYP_NVRAM:
92235911Smav		sprintf(rbuf, "Nonvolatile Cache");
9357580Smjacob		break;
94235911Smav	case ELMTYP_INV_OP_REASON:
95235911Smav		sprintf(rbuf, "Invalid Operation Reason");
9657580Smjacob		break;
97235911Smav	case ELMTYP_UPS:
98235911Smav		sprintf(rbuf, "Uninterruptible Power Supply");
99235911Smav		break;
100235911Smav	case ELMTYP_DISPLAY:
10157580Smjacob		sprintf(rbuf, "Display");
10257580Smjacob		break;
103235911Smav	case ELMTYP_KEYPAD:
104235911Smav		sprintf(rbuf, "Key Pad Entry");
10557580Smjacob		break;
106235911Smav	case ELMTYP_ENCLOSURE:
107222336Smav		sprintf(rbuf, "Enclosure");
108222336Smav		break;
109235911Smav	case ELMTYP_SCSIXVR:
110235911Smav		sprintf(rbuf, "SCSI Port/Transceiver");
11157580Smjacob		break;
112235911Smav	case ELMTYP_LANGUAGE:
11357580Smjacob		sprintf(rbuf, "Language");
11457580Smjacob		break;
115235911Smav	case ELMTYP_COMPORT:
11657580Smjacob		sprintf(rbuf, "Communication Port");
11757580Smjacob		break;
118235911Smav	case ELMTYP_VOM:
11957580Smjacob		sprintf(rbuf, "Voltage Sensor");
12057580Smjacob		break;
121235911Smav	case ELMTYP_AMMETER:
12257580Smjacob		sprintf(rbuf, "Current Sensor");
12357580Smjacob		break;
124235911Smav	case ELMTYP_SCSI_TGT:
125235911Smav		sprintf(rbuf, "SCSI Target Port");
12657580Smjacob		break;
127235911Smav	case ELMTYP_SCSI_INI:
128235911Smav		sprintf(rbuf, "SCSI Initiator Port");
12957580Smjacob		break;
130235911Smav	case ELMTYP_SUBENC:
131235911Smav		sprintf(rbuf, "Simple Subenclosure");
13257580Smjacob		break;
133235911Smav	case ELMTYP_ARRAY_DEV:
134235911Smav		sprintf(rbuf, "Array Device Slot");
135222336Smav		break;
136235911Smav	case ELMTYP_SAS_EXP:
137222338Smav		sprintf(rbuf, "SAS Expander");
138222336Smav		break;
139235911Smav	case ELMTYP_SAS_CONN:
140222336Smav		sprintf(rbuf, "SAS Connector");
141222336Smav		break;
14257580Smjacob	default:
14357580Smjacob		(void) sprintf(rbuf, "<Type 0x%x>", type);
14457580Smjacob		break;
14557580Smjacob	}
14657580Smjacob	return (rbuf);
14757580Smjacob}
14857580Smjacob
149293865Sallanjudechar *
150198934Sdelphijscode2ascii(u_char code)
15157580Smjacob{
15257580Smjacob	static char rbuf[32];
15357580Smjacob	switch (code & 0xf) {
15457580Smjacob	case SES_OBJSTAT_UNSUPPORTED:
155235911Smav		sprintf(rbuf, "Unsupported");
15657580Smjacob		break;
15757580Smjacob	case SES_OBJSTAT_OK:
158235911Smav		sprintf(rbuf, "OK");
15957580Smjacob		break;
16057580Smjacob	case SES_OBJSTAT_CRIT:
161235911Smav		sprintf(rbuf, "Critical");
16257580Smjacob		break;
16357580Smjacob	case SES_OBJSTAT_NONCRIT:
164235911Smav		sprintf(rbuf, "Noncritical");
16557580Smjacob		break;
16657580Smjacob	case SES_OBJSTAT_UNRECOV:
167235911Smav		sprintf(rbuf, "Unrecoverable");
16857580Smjacob		break;
16957580Smjacob	case SES_OBJSTAT_NOTINSTALLED:
170235911Smav		sprintf(rbuf, "Not Installed");
17157580Smjacob		break;
17257580Smjacob	case SES_OBJSTAT_UNKNOWN:
173235911Smav		sprintf(rbuf, "Unknown");
17457580Smjacob		break;
17557580Smjacob	case SES_OBJSTAT_NOTAVAIL:
176235911Smav		sprintf(rbuf, "Not Available");
17757580Smjacob		break;
178235911Smav	case SES_OBJSTAT_NOACCESS:
179235911Smav		sprintf(rbuf, "No Access Allowed");
180235911Smav		break;
18157580Smjacob	default:
182235911Smav		sprintf(rbuf, "<Status 0x%x>", code & 0xf);
18357580Smjacob		break;
18457580Smjacob	}
18557580Smjacob	return (rbuf);
18657580Smjacob}
18757580Smjacob
188293865Sallanjudestruct sbuf *
189293865Sallanjudestat2sbuf(int eletype, u_char *cstat)
19057580Smjacob{
191293865Sallanjude	struct sbuf *buf;
19257580Smjacob
193293865Sallanjude	buf = sbuf_new_auto();
194293865Sallanjude	if (buf == NULL)
195293865Sallanjude		err(EXIT_FAILURE, "sbuf_new_auto()");
196293865Sallanjude
197293865Sallanjude	if (cstat[0] & 0x40)
198293865Sallanjude		sbuf_printf(buf, "\t\t- Predicted Failure\n");
199293865Sallanjude	if (cstat[0] & 0x20)
200293865Sallanjude		sbuf_printf(buf, "\t\t- Disabled\n");
201293865Sallanjude	if (cstat[0] & 0x10)
202293865Sallanjude		sbuf_printf(buf, "\t\t- Swapped\n");
203293865Sallanjude	switch (eletype) {
204293865Sallanjude	case ELMTYP_DEVICE:
205293865Sallanjude		if (cstat[2] & 0x02)
206293865Sallanjude			sbuf_printf(buf, "\t\t- LED=locate\n");
207293865Sallanjude		if (cstat[2] & 0x20)
208293865Sallanjude			sbuf_printf(buf, "\t\t- LED=fault\n");
209293865Sallanjude		break;
210293865Sallanjude	case ELMTYP_ARRAY_DEV:
211293865Sallanjude		if (cstat[2] & 0x02)
212293865Sallanjude			sbuf_printf(buf, "\t\t- LED=locate\n");
213293865Sallanjude		if (cstat[2] & 0x20)
214293865Sallanjude			sbuf_printf(buf, "\t\t- LED=fault\n");
215293865Sallanjude		break;
216293865Sallanjude	case ELMTYP_FAN:
217293865Sallanjude		sbuf_printf(buf, "\t\t- Speed: %d rpm\n",
218293865Sallanjude		    (((0x7 & cstat[1]) << 8) + cstat[2]) * 10);
219293865Sallanjude		break;
220293865Sallanjude	case ELMTYP_THERM:
221293865Sallanjude		if (cstat[2]) {
222293865Sallanjude			sbuf_printf(buf, "\t\t- Temperature: %d C\n",
223293865Sallanjude			    cstat[2] - TEMPERATURE_OFFSET);
224293865Sallanjude		} else {
225293865Sallanjude			sbuf_printf(buf, "\t\t- Temperature: -reserved-\n");
226293865Sallanjude		}
227293865Sallanjude		break;
228293865Sallanjude	case ELMTYP_VOM:
229293865Sallanjude		sbuf_printf(buf, "\t\t- Voltage: %.2f V\n",
230293865Sallanjude		    be16dec(cstat + 2) / 100.0);
231293865Sallanjude		break;
232293865Sallanjude	}
233293865Sallanjude	sbuf_finish(buf);
234293865Sallanjude	return (buf);
23557580Smjacob}
236