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
3557580Smjacob#include <unistd.h>
36235911Smav#include <stddef.h>
37235911Smav#include <stdint.h>
3857580Smjacob#include <stdlib.h>
3957580Smjacob#include <stdio.h>
4057580Smjacob#include <sys/ioctl.h>
41235911Smav#include <cam/scsi/scsi_all.h>
42235911Smav#include <cam/scsi/scsi_enc.h>
4357580Smjacob
44198934Sdelphij#include "eltsub.h"
45198934Sdelphij
4657580Smjacobchar *
47198934Sdelphijgeteltnm(int type)
4857580Smjacob{
4957580Smjacob	static char rbuf[132];
5057580Smjacob
5157580Smjacob	switch (type) {
52235911Smav	case ELMTYP_UNSPECIFIED:
5357580Smjacob		sprintf(rbuf, "Unspecified");
5457580Smjacob		break;
55235911Smav	case ELMTYP_DEVICE:
56235911Smav		sprintf(rbuf, "Device Slot");
5757580Smjacob		break;
58235911Smav	case ELMTYP_POWER:
59235911Smav		sprintf(rbuf, "Power Supply");
6057580Smjacob		break;
61235911Smav	case ELMTYP_FAN:
62235911Smav		sprintf(rbuf, "Cooling");
6357580Smjacob		break;
64235911Smav	case ELMTYP_THERM:
65235911Smav		sprintf(rbuf, "Temperature Sensors");
6657580Smjacob		break;
67235911Smav	case ELMTYP_DOORLOCK:
6857580Smjacob		sprintf(rbuf, "Door Lock");
6957580Smjacob		break;
70235911Smav	case ELMTYP_ALARM:
7157580Smjacob		sprintf(rbuf, "Audible alarm");
7257580Smjacob		break;
73235911Smav	case ELMTYP_ESCC:
74242621Smav		sprintf(rbuf, "Enclosure Services Controller Electronics");
7557580Smjacob		break;
76235911Smav	case ELMTYP_SCC:
77235911Smav		sprintf(rbuf, "SCC Controller Electronics");
7857580Smjacob		break;
79235911Smav	case ELMTYP_NVRAM:
80235911Smav		sprintf(rbuf, "Nonvolatile Cache");
8157580Smjacob		break;
82235911Smav	case ELMTYP_INV_OP_REASON:
83235911Smav		sprintf(rbuf, "Invalid Operation Reason");
8457580Smjacob		break;
85235911Smav	case ELMTYP_UPS:
86235911Smav		sprintf(rbuf, "Uninterruptible Power Supply");
87235911Smav		break;
88235911Smav	case ELMTYP_DISPLAY:
8957580Smjacob		sprintf(rbuf, "Display");
9057580Smjacob		break;
91235911Smav	case ELMTYP_KEYPAD:
92235911Smav		sprintf(rbuf, "Key Pad Entry");
9357580Smjacob		break;
94235911Smav	case ELMTYP_ENCLOSURE:
95222336Smav		sprintf(rbuf, "Enclosure");
96222336Smav		break;
97235911Smav	case ELMTYP_SCSIXVR:
98235911Smav		sprintf(rbuf, "SCSI Port/Transceiver");
9957580Smjacob		break;
100235911Smav	case ELMTYP_LANGUAGE:
10157580Smjacob		sprintf(rbuf, "Language");
10257580Smjacob		break;
103235911Smav	case ELMTYP_COMPORT:
10457580Smjacob		sprintf(rbuf, "Communication Port");
10557580Smjacob		break;
106235911Smav	case ELMTYP_VOM:
10757580Smjacob		sprintf(rbuf, "Voltage Sensor");
10857580Smjacob		break;
109235911Smav	case ELMTYP_AMMETER:
11057580Smjacob		sprintf(rbuf, "Current Sensor");
11157580Smjacob		break;
112235911Smav	case ELMTYP_SCSI_TGT:
113235911Smav		sprintf(rbuf, "SCSI Target Port");
11457580Smjacob		break;
115235911Smav	case ELMTYP_SCSI_INI:
116235911Smav		sprintf(rbuf, "SCSI Initiator Port");
11757580Smjacob		break;
118235911Smav	case ELMTYP_SUBENC:
119235911Smav		sprintf(rbuf, "Simple Subenclosure");
12057580Smjacob		break;
121235911Smav	case ELMTYP_ARRAY_DEV:
122235911Smav		sprintf(rbuf, "Array Device Slot");
123222336Smav		break;
124235911Smav	case ELMTYP_SAS_EXP:
125222338Smav		sprintf(rbuf, "SAS Expander");
126222336Smav		break;
127235911Smav	case ELMTYP_SAS_CONN:
128222336Smav		sprintf(rbuf, "SAS Connector");
129222336Smav		break;
13057580Smjacob	default:
13157580Smjacob		(void) sprintf(rbuf, "<Type 0x%x>", type);
13257580Smjacob		break;
13357580Smjacob	}
13457580Smjacob	return (rbuf);
13557580Smjacob}
13657580Smjacob
13757580Smjacobstatic char *
138198934Sdelphijscode2ascii(u_char code)
13957580Smjacob{
14057580Smjacob	static char rbuf[32];
14157580Smjacob	switch (code & 0xf) {
14257580Smjacob	case SES_OBJSTAT_UNSUPPORTED:
143235911Smav		sprintf(rbuf, "Unsupported");
14457580Smjacob		break;
14557580Smjacob	case SES_OBJSTAT_OK:
146235911Smav		sprintf(rbuf, "OK");
14757580Smjacob		break;
14857580Smjacob	case SES_OBJSTAT_CRIT:
149235911Smav		sprintf(rbuf, "Critical");
15057580Smjacob		break;
15157580Smjacob	case SES_OBJSTAT_NONCRIT:
152235911Smav		sprintf(rbuf, "Noncritical");
15357580Smjacob		break;
15457580Smjacob	case SES_OBJSTAT_UNRECOV:
155235911Smav		sprintf(rbuf, "Unrecoverable");
15657580Smjacob		break;
15757580Smjacob	case SES_OBJSTAT_NOTINSTALLED:
158235911Smav		sprintf(rbuf, "Not Installed");
15957580Smjacob		break;
16057580Smjacob	case SES_OBJSTAT_UNKNOWN:
161235911Smav		sprintf(rbuf, "Unknown");
16257580Smjacob		break;
16357580Smjacob	case SES_OBJSTAT_NOTAVAIL:
164235911Smav		sprintf(rbuf, "Not Available");
16557580Smjacob		break;
166235911Smav	case SES_OBJSTAT_NOACCESS:
167235911Smav		sprintf(rbuf, "No Access Allowed");
168235911Smav		break;
16957580Smjacob	default:
170235911Smav		sprintf(rbuf, "<Status 0x%x>", code & 0xf);
17157580Smjacob		break;
17257580Smjacob	}
17357580Smjacob	return (rbuf);
17457580Smjacob}
17557580Smjacob
17657580Smjacob
17757580Smjacobchar *
178198934Sdelphijstat2ascii(int eletype __unused, u_char *cstat)
17957580Smjacob{
18057580Smjacob	static char ebuf[256], *scode;
18157580Smjacob
18257580Smjacob	scode = scode2ascii(cstat[0]);
183242647Smav	sprintf(ebuf, "status: %s%s%s%s (0x%02x 0x%02x 0x%02x 0x%02x)",
184242647Smav	    scode,
185242647Smav	    (cstat[0] & 0x40) ? ", Prd.Fail" : "",
186242647Smav	    (cstat[0] & 0x20) ? ", Disabled" : "",
187242647Smav	    (cstat[0] & 0x10) ? ", Swapped" : "",
188242647Smav	    cstat[0], cstat[1], cstat[2], cstat[3]);
18957580Smjacob	return (ebuf);
19057580Smjacob}
191