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>
36246437Smav#include <stddef.h>
37246437Smav#include <stdint.h>
3857580Smjacob#include <stdlib.h>
3957580Smjacob#include <stdio.h>
4057580Smjacob#include <sys/ioctl.h>
41246437Smav#include <cam/scsi/scsi_all.h>
42246437Smav#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) {
52246437Smav	case ELMTYP_UNSPECIFIED:
5357580Smjacob		sprintf(rbuf, "Unspecified");
5457580Smjacob		break;
55246437Smav	case ELMTYP_DEVICE:
56246437Smav		sprintf(rbuf, "Device Slot");
5757580Smjacob		break;
58246437Smav	case ELMTYP_POWER:
59246437Smav		sprintf(rbuf, "Power Supply");
6057580Smjacob		break;
61246437Smav	case ELMTYP_FAN:
62246437Smav		sprintf(rbuf, "Cooling");
6357580Smjacob		break;
64246437Smav	case ELMTYP_THERM:
65246437Smav		sprintf(rbuf, "Temperature Sensors");
6657580Smjacob		break;
67246437Smav	case ELMTYP_DOORLOCK:
6857580Smjacob		sprintf(rbuf, "Door Lock");
6957580Smjacob		break;
70246437Smav	case ELMTYP_ALARM:
7157580Smjacob		sprintf(rbuf, "Audible alarm");
7257580Smjacob		break;
73246437Smav	case ELMTYP_ESCC:
74246437Smav		sprintf(rbuf, "Enclosure Services Controller Electronics");
7557580Smjacob		break;
76246437Smav	case ELMTYP_SCC:
77246437Smav		sprintf(rbuf, "SCC Controller Electronics");
7857580Smjacob		break;
79246437Smav	case ELMTYP_NVRAM:
80246437Smav		sprintf(rbuf, "Nonvolatile Cache");
8157580Smjacob		break;
82246437Smav	case ELMTYP_INV_OP_REASON:
83246437Smav		sprintf(rbuf, "Invalid Operation Reason");
8457580Smjacob		break;
85246437Smav	case ELMTYP_UPS:
86246437Smav		sprintf(rbuf, "Uninterruptible Power Supply");
87246437Smav		break;
88246437Smav	case ELMTYP_DISPLAY:
8957580Smjacob		sprintf(rbuf, "Display");
9057580Smjacob		break;
91246437Smav	case ELMTYP_KEYPAD:
92246437Smav		sprintf(rbuf, "Key Pad Entry");
9357580Smjacob		break;
94246437Smav	case ELMTYP_ENCLOSURE:
95222336Smav		sprintf(rbuf, "Enclosure");
96222336Smav		break;
97246437Smav	case ELMTYP_SCSIXVR:
98246437Smav		sprintf(rbuf, "SCSI Port/Transceiver");
9957580Smjacob		break;
100246437Smav	case ELMTYP_LANGUAGE:
10157580Smjacob		sprintf(rbuf, "Language");
10257580Smjacob		break;
103246437Smav	case ELMTYP_COMPORT:
10457580Smjacob		sprintf(rbuf, "Communication Port");
10557580Smjacob		break;
106246437Smav	case ELMTYP_VOM:
10757580Smjacob		sprintf(rbuf, "Voltage Sensor");
10857580Smjacob		break;
109246437Smav	case ELMTYP_AMMETER:
11057580Smjacob		sprintf(rbuf, "Current Sensor");
11157580Smjacob		break;
112246437Smav	case ELMTYP_SCSI_TGT:
113246437Smav		sprintf(rbuf, "SCSI Target Port");
11457580Smjacob		break;
115246437Smav	case ELMTYP_SCSI_INI:
116246437Smav		sprintf(rbuf, "SCSI Initiator Port");
11757580Smjacob		break;
118246437Smav	case ELMTYP_SUBENC:
119246437Smav		sprintf(rbuf, "Simple Subenclosure");
12057580Smjacob		break;
121246437Smav	case ELMTYP_ARRAY_DEV:
122246437Smav		sprintf(rbuf, "Array Device Slot");
123222336Smav		break;
124246437Smav	case ELMTYP_SAS_EXP:
125222338Smav		sprintf(rbuf, "SAS Expander");
126222336Smav		break;
127246437Smav	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:
143246437Smav		sprintf(rbuf, "Unsupported");
14457580Smjacob		break;
14557580Smjacob	case SES_OBJSTAT_OK:
146246437Smav		sprintf(rbuf, "OK");
14757580Smjacob		break;
14857580Smjacob	case SES_OBJSTAT_CRIT:
149246437Smav		sprintf(rbuf, "Critical");
15057580Smjacob		break;
15157580Smjacob	case SES_OBJSTAT_NONCRIT:
152246437Smav		sprintf(rbuf, "Noncritical");
15357580Smjacob		break;
15457580Smjacob	case SES_OBJSTAT_UNRECOV:
155246437Smav		sprintf(rbuf, "Unrecoverable");
15657580Smjacob		break;
15757580Smjacob	case SES_OBJSTAT_NOTINSTALLED:
158246437Smav		sprintf(rbuf, "Not Installed");
15957580Smjacob		break;
16057580Smjacob	case SES_OBJSTAT_UNKNOWN:
161246437Smav		sprintf(rbuf, "Unknown");
16257580Smjacob		break;
16357580Smjacob	case SES_OBJSTAT_NOTAVAIL:
164246437Smav		sprintf(rbuf, "Not Available");
16557580Smjacob		break;
166246437Smav	case SES_OBJSTAT_NOACCESS:
167246437Smav		sprintf(rbuf, "No Access Allowed");
168246437Smav		break;
16957580Smjacob	default:
170246437Smav		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]);
183246437Smav	sprintf(ebuf, "status: %s%s%s%s (0x%02x 0x%02x 0x%02x 0x%02x)",
184246437Smav	    scode,
185246437Smav	    (cstat[0] & 0x40) ? ", Prd.Fail" : "",
186246437Smav	    (cstat[0] & 0x20) ? ", Disabled" : "",
187246437Smav	    (cstat[0] & 0x10) ? ", Swapped" : "",
188246437Smav	    cstat[0], cstat[1], cstat[2], cstat[3]);
18957580Smjacob	return (ebuf);
19057580Smjacob}
191