157580Smjacob/* $FreeBSD: releng/10.3/share/examples/ses/srcs/eltsub.c 242647 2012-11-06 01:29:26Z mav $ */ 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