xref: /openbsd/sys/scsi/ses.h (revision 404b540a)
1 /* $OpenBSD: ses.h,v 1.10 2006/05/11 00:45:59 krw Exp $ */
2 /*
3  * Copyright (c) 2005 Marco Peereboom
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
19  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  */
28 
29 #ifndef _SCSI_SES_H_
30 #define _SCSI_SES_H_
31 
32 /* the scsi command */
33 struct ses_scsi_diag {
34 	u_int8_t	opcode; /* SEND_DIAGNOSTIC or RECEIVE_DIAGNOSTIC */
35 	u_int8_t	flags;
36 #define SES_DIAG_PCV		(1<<0)	/* page code valid */
37 #define SES_DIAG_PF		(1<<4)	/* set this bit if page code is valid */
38 	u_int8_t	pgcode;
39 #define SES_PAGE_CONFIG		0x01	/* Configuration */
40 #define SES_PAGE_STATUS		0x02	/* Enclosure Status */
41 #define SES_PAGE_EDESC		0x07	/* Element Descriptor */
42 	u_int16_t	length;
43 	u_int8_t	control;
44 } __packed;
45 
46 
47 /* all the different sensor types */
48 #define SES_T_UNSPEC		0x00
49 #define SES_T_DEVICE		0x01
50 #define SES_T_POWERSUPPLY	0x02
51 #define SES_T_COOLING		0x03
52 #define SES_T_TEMP		0x04
53 #define SES_T_DOORLOCK		0x05
54 #define SES_T_ALARM		0x06
55 #define SES_T_ENC_SRV_CTRL	0x07
56 #define SES_T_SCC_CTRL		0x08
57 #define SES_T_NONVOL_CACHE	0x09
58 #define SES_T_INV_OP_REASON	0x0a
59 #define SES_T_UPS		0x0b
60 #define SES_T_DISPLAY		0x0c
61 #define SES_T_KEYPAD		0x0d
62 #define SES_T_ENCLOSURE		0x0e
63 #define SES_T_SCSI_PORT_TRANS	0x0f
64 #define SES_T_LANGUAGE		0x10
65 #define SES_T_COMM_PORT		0x11
66 #define SES_T_VOLTAGE		0x12
67 #define SES_T_CURRENT		0x13
68 #define SES_T_SCSI_TARGET_PORT	0x14
69 #define SES_T_SCSI_INIT_PORT	0x15
70 #define SES_T_SIMP_SUBENC	0x16
71 #define SES_T_ARRAY_DEVICE	0x17
72 
73 #define SES_NUM_TYPES		256
74 
75 /* diagnostic page header */
76 struct ses_config_hdr {
77 	u_int8_t	pgcode; /* SES_PAGE_CONFIG */
78 	u_int8_t	n_subenc;
79 	u_int16_t	length;
80 	u_int32_t	gencode;
81 } __packed;
82 #define SES_CFG_HDRLEN		sizeof(struct ses_config_hdr)
83 
84 /* enclosure descriptor header */
85 struct ses_enc_hdr {
86 	u_int8_t	enc_id;
87 	u_int8_t	subenc_id;
88 	u_int8_t	n_types;
89 	u_int8_t	vendor_len;
90 } __packed;
91 #define SES_ENC_HDRLEN		sizeof(struct ses_enc_hdr)
92 
93 /* enclosure descriptor strings */
94 struct ses_enc_desc {
95 	u_int8_t	logical_id[8]; /* this isnt a string */
96 	u_int8_t	vendor_id[8];
97 	u_int8_t	prod_id[16];
98 	u_int8_t	prod_rev[4];
99 	u_int8_t	vendor[0];
100 } __packed;
101 
102 /* type descriptor header */
103 struct ses_type_desc {
104 	u_int8_t	type;
105 	u_int8_t	n_elem;
106 	u_int8_t	subenc_id;
107 	u_int8_t	desc_len;
108 } __packed;
109 #define SES_TYPE_DESCLEN	sizeof(struct ses_type_desc)
110 
111 /* status page header */
112 struct ses_status_hdr {
113 	u_int8_t	pgcode;		/* SES_PAGE_STATUS */
114 	u_int8_t	flags;
115 #define SES_STAT_UNRECOV	(1<<0)	/* unrecoverable error */
116 #define SES_STAT_CRIT		(1<<1)	/* critical error */
117 #define SES_STAT_NONCRIT	(1<<2)	/* noncritical error */
118 #define SES_STAT_INFO		(1<<3)	/* info available */
119 #define SES_STAT_INVOP		(1<<4)	/* invalid operation */
120 	u_int16_t	length;
121 	u_int32_t	gencode;
122 } __packed;
123 #define SES_STAT_HDRLEN		sizeof(struct ses_status_hdr)
124 
125 struct ses_status {
126 	u_int8_t	com;
127 #define SES_STAT_CODE_MASK	0x0f
128 #define SES_STAT_CODE(x)	((x) & SES_STAT_CODE_MASK)
129 #define SES_STAT_CODE_UNSUP	0x00 /* unsupported */
130 #define SES_STAT_CODE_OK	0x01 /* installed and ok */
131 #define SES_STAT_CODE_CRIT	0x02 /* critical */
132 #define SES_STAT_CODE_NONCRIT	0x03 /* warning */
133 #define SES_STAT_CODE_UNREC	0x04 /* unrecoverable */
134 #define SES_STAT_CODE_NOTINST	0x05 /* not installed */
135 #define SES_STAT_CODE_UNKNOWN	0x06 /* unknown */
136 #define SES_STAT_CODE_NOTAVAIL	0x07 /* not available */
137 #define SES_STAT_SWAP		(1<<4)	/* element has been swapped */
138 #define SES_STAT_DISABLED	(1<<5)	/* disabled */
139 #define SES_STAT_PRDFAIL	(1<<6)	/* predicted failure */
140 #define SES_STAT_SELECT		(1<<7)	/* set to modify element */
141 
142 	u_int8_t	f1;	/* use of these flags depends on the SES_T */
143 	u_int8_t	f2;
144 	u_int8_t	f3;
145 } __packed;
146 #define SES_STAT_ELEMLEN	sizeof(struct ses_status)
147 
148 /* device status */
149 /* f1 is the device address */
150 /* f2 */
151 #define SES_S_DEV_REPORT	(1<<0)	/* enc report in progress */
152 #define SES_S_DEV_IDENT		(1<<1)	/* currently identifying */
153 #define SES_S_DEV_REMOVE	(1<<2)	/* ready to remove */
154 #define SES_S_DEV_INSERT	(1<<3)	/* ready to insert */
155 #define SES_S_DEV_ENCBYPB	(1<<4)	/* port B bypassed by enc */
156 #define SES_S_DEV_ENCBYPA	(1<<5)	/* port A bypassed by enc */
157 #define SES_S_DEV_DONOTREM	(1<<6)	/* do not remove */
158 #define SES_S_DEV_APPCLBYPA	(1<<7)	/* port A bypassed by app */
159 /* f3 */
160 #define SES_S_DEV_DEVBYPB	(1<<0)	/* port B bypassed by dev */
161 #define SES_S_DEV_DEVBYPA	(1<<1)	/* port A bypassed by dev */
162 #define SES_S_DEV_BYPB		(1<<2)
163 #define SES_S_DEV_BYPA		(1<<3)
164 #define SES_S_DEV_OFF		(1<<4)	/* device is off */
165 #define SES_S_DEV_FAULTRQST	(1<<5)	/* fault indicator rqsted */
166 #define SES_S_DEV_FAULTSENSE	(1<<6)	/* fault sensed */
167 #define SES_S_DEV_APPCLBYPB	(1<<7)	/* port B bypassed by app */
168 
169 /* device configuration */
170 /* f1 is reserved */
171 /* f2 */
172 #define SES_C_DEV_IDENT		(1<<1)	/* ident */
173 #define SES_C_DEV_REMOVE	(1<<2)	/* remove */
174 #define SES_C_DEV_INSERT	(1<<3)	/* insert */
175 #define SES_C_DEV_DONOTREM	(1<<6)	/* do not remove */
176 #define SES_C_DEV_ACTIVE	(1<<7)	/* active indicator */
177 #define SES_C_DEV_F2MASK	(SES_C_DEV_IDENT | SES_C_DEV_REMOVE | \
178     SES_C_DEV_INSERT | SES_C_DEV_DONOTREM | SES_C_DEV_ACTIVE )
179 /* f3 */
180 #define SES_C_DEV_BYPB		(1<<2)	/* port B bypass */
181 #define SES_C_DEV_BYPA		(1<<3)	/* port A bypass */
182 #define SES_C_DEV_OFF		(1<<4)	/* off */
183 #define SES_C_DEV_FAULT		(1<<5)	/* fault indicator */
184 #define SES_C_DEV_F3MASK	(SES_C_DEV_BYPB | SES_C_DEV_BYPA | \
185     SES_C_DEV_OFF | SES_C_DEV_FAULT)
186 
187 /* power supply element */
188 #define SES_S_PSU_IDENT(d)	((d)->f1 & (1<<6)) /* identify */
189 #define SES_S_PSU_DCOC(d)	((d)->f2 & (1<<1)) /* DC over current */
190 #define SES_S_PSU_DCUV(d)	((d)->f2 & (1<<2)) /* DC under voltage */
191 #define SES_S_PSU_DCOV(d)	((d)->f2 & (1<<3)) /* DC over voltage */
192 #define SES_S_PSU_DCFAIL(d)	((d)->f3 & (1<<0)) /* DC fail */
193 #define SES_S_PSU_ACFAIL(d)	((d)->f3 & (1<<1)) /* AC fail */
194 #define SES_S_PSU_TEMPWARN(d)	((d)->f3 & (1<<2)) /* Temp warn */
195 #define SES_S_PSU_OVERTEMP(d)	((d)->f3 & (1<<3)) /* over temp fail */
196 #define SES_S_PSU_OFF(d)	((d)->f3 & (1<<4)) /* is the unit off */
197 #define SES_S_PSU_RQSTON(d)	((d)->f3 & (1<<5)) /* manually on */
198 #define SES_S_PSU_FAIL(d)	((d)->f3 & (1<<6)) /* fail is set on */
199 
200 /* cooling element */
201 #define SES_S_COOL_IDENT(d)	((d)->f1 & (1<<6)) /* identify */
202 #define SES_S_COOL_SPEED_MASK	0x03
203 #define SES_S_COOL_SPEED(d)	((d)->f2 + \
204     ((u_int16_t)((d)->f2 & SES_S_COOL_SPEED_MASK) << 8))
205 #define SES_S_COOL_FACTOR	10
206 #define SES_S_COOL_CODE(d)	((d)->f3 & 0x7) /* actual speed code */
207 #define SES_S_COOL_C_STOPPED	0x0 /* stopped */
208 #define SES_S_COOL_C_LOW1	0x1 /* lowest speed */
209 #define SES_S_COOL_C_LOW2	0x2 /* second lowest speed */
210 #define SES_S_COOL_C_LOW3	0x3 /* third lowest speed */
211 #define SES_S_COOL_C_INTER	0x4 /* intermediate speed */
212 #define SES_S_COOL_C_HI3	0x5 /* third highest speed */
213 #define SES_S_COOL_C_HI2	0x6 /* second highest speed */
214 #define SES_S_COOL_C_HI1	0x7 /* highest speed */
215 #define SES_S_COOL_OFF		((d)->f3 & (1<<4)) /* not cooling */
216 #define SES_S_COOL_RQSTON	((d)->f3 & (1<<5)) /* manually on */
217 #define SES_S_COOL_FAIL		((d)->f3 & (1<<6)) /* fail indic is on */
218 
219 /* temperature sensor */
220 #define SES_S_TEMP_IDENT(d)	((d)->f1 & (1<<7)) /* identify */
221 #define SES_S_TEMP(d)		((d)->f2)
222 #define SES_S_TEMP_OFFSET	(-20)
223 #define SES_S_TEMP_UTWARN	((d)->f3 & (1<<0)) /* under temp warning */
224 #define SES_S_TEMP_UTFAIL	((d)->f3 & (1<<1)) /* under temp failure */
225 #define SES_S_TEMP_OTWARN	((d)->f3 & (1<<2)) /* over temp warning */
226 #define SES_S_TEMP_OTFAIL	((d)->f3 & (1<<3)) /* over temp failure */
227 
228 /*
229  * the length of the status page is the header and a status element for
230  * each type plus the number of elements for each type
231  */
232 #define SES_STAT_LEN(t, e)	\
233     (SES_STAT_HDRLEN + SES_STAT_ELEMLEN * ((t)+(e)))
234 
235 #endif /* _SCSI_SES_H_ */
236