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