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