1 /*-
2 * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
3 *
4 * Copyright (c) 2000 by Matthew Jacob
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions, and the following disclaimer,
12 * without modification, immediately at the beginning of the file.
13 * 2. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * Alternatively, this software may be distributed under the terms of the
17 * the GNU Public License ("GPL").
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 */
32
33 #ifndef _SCSI_SES_H_
34 #define _SCSI_SES_H_
35
36 #include <cam/scsi/scsi_all.h>
37
38 /*========================== Field Extraction Macros =========================*/
39 #define MK_ENUM(S, F, SUFFIX) S ## _ ## F ## SUFFIX
40
41 #define GEN_GETTER(LS, US, LF, UF) \
42 static inline int \
43 LS ## _get_ ## LF(struct LS *elem) { \
44 return ((elem->bytes[MK_ENUM(US,UF,_BYTE)] & MK_ENUM(US,UF,_MASK)) \
45 >> MK_ENUM(US,UF,_SHIFT)); \
46 }
47
48 #define GEN_SETTER(LS, US, LF, UF) \
49 static inline void \
50 LS ## _set_ ## LF(struct LS *elem, int val) { \
51 elem->bytes[MK_ENUM(US,UF,_BYTE)] &= ~MK_ENUM(US,UF,_MASK); \
52 elem->bytes[MK_ENUM(US,UF,_BYTE)] |= \
53 (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK); \
54 }
55
56 #define GEN_HDR_GETTER(LS, US, LF, UF) \
57 static inline int \
58 LS ## _get_ ## LF(struct LS *page) { \
59 return ((page->hdr.page_specific_flags & MK_ENUM(US,UF,_MASK)) \
60 >> MK_ENUM(US,UF,_SHIFT)); \
61 }
62
63 #define GEN_HDR_SETTER(LS, US, LF, UF) \
64 static inline void \
65 LS ## _set_ ## LF(struct LS *page, int val) { \
66 page->hdr.page_specific_flags &= ~MK_ENUM(US,UF,_MASK); \
67 page->hdr.page_specific_flags |= \
68 (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK); \
69 }
70
71 #define GEN_ACCESSORS(LS, US, LF, UF) \
72 GEN_GETTER(LS, US, LF, UF) \
73 GEN_SETTER(LS, US, LF, UF)
74
75 #define GEN_HDR_ACCESSORS(LS, US, LF, UF) \
76 GEN_HDR_GETTER(LS, US, LF, UF) \
77 GEN_HDR_SETTER(LS, US, LF, UF)
78
79 /*=============== Common SCSI ENC Diagnostic Page Structures ===============*/
80 struct ses_page_hdr {
81 uint8_t page_code;
82 uint8_t page_specific_flags;
83 uint8_t length[2];
84 uint8_t gen_code[4];
85 };
86
87 static inline size_t
ses_page_length(const struct ses_page_hdr * hdr)88 ses_page_length(const struct ses_page_hdr *hdr)
89 {
90 /*
91 * The page length as received only accounts for bytes that
92 * follow the length field, namely starting with the generation
93 * code field.
94 */
95 return (scsi_2btoul(hdr->length)
96 + offsetof(struct ses_page_hdr, gen_code));
97 }
98
99 /*============= SCSI ENC Configuration Diagnostic Page Structures ============*/
100 struct ses_enc_desc {
101 uint8_t byte0;
102 /*
103 * reserved0 : 1,
104 * rel_id : 3, relative enclosure process id
105 * reserved1 : 1,
106 * num_procs : 3; number of enclosure procesenc
107 */
108 uint8_t subenc_id; /* Sub-enclosure Identifier */
109 uint8_t num_types; /* # of supported types */
110 uint8_t length; /* Enclosure Descriptor Length */
111 uint8_t logical_id[8]; /* formerly wwn */
112 uint8_t vendor_id[8];
113 uint8_t product_id[16];
114 uint8_t product_rev[4];
115 uint8_t vendor_bytes[];
116 };
117
118 static inline uint8_t *
ses_enc_desc_last_byte(struct ses_enc_desc * encdesc)119 ses_enc_desc_last_byte(struct ses_enc_desc *encdesc)
120 {
121 return (&encdesc->length + encdesc->length);
122 }
123
124 static inline struct ses_enc_desc *
ses_enc_desc_next(struct ses_enc_desc * encdesc)125 ses_enc_desc_next(struct ses_enc_desc *encdesc)
126 {
127 return ((struct ses_enc_desc *)(ses_enc_desc_last_byte(encdesc) + 1));
128 }
129
130 static inline int
ses_enc_desc_is_complete(struct ses_enc_desc * encdesc,uint8_t * last_buf_byte)131 ses_enc_desc_is_complete(struct ses_enc_desc *encdesc, uint8_t *last_buf_byte)
132 {
133 return (&encdesc->length <= last_buf_byte
134 && ses_enc_desc_last_byte(encdesc) <= last_buf_byte);
135 }
136
137 struct ses_elm_type_desc {
138 uint8_t etype_elm_type; /* type of element */
139 uint8_t etype_maxelt; /* maximum supported */
140 uint8_t etype_subenc; /* in sub-enclosure #n */
141 uint8_t etype_txt_len; /* Type Descriptor Text Length */
142 };
143
144 struct ses_cfg_page {
145 struct ses_page_hdr hdr;
146 struct ses_enc_desc subencs[];
147 /* type descriptors */
148 /* type text */
149 };
150
151 static inline int
ses_cfg_page_get_num_subenc(struct ses_cfg_page * page)152 ses_cfg_page_get_num_subenc(struct ses_cfg_page *page)
153 {
154 return (page->hdr.page_specific_flags + 1);
155 }
156
157 /*================ SCSI SES Control Diagnostic Page Structures ==============*/
158 struct ses_ctrl_common {
159 uint8_t bytes[1];
160 };
161
162 enum ses_ctrl_common_field_data {
163 SES_CTRL_COMMON_SELECT_BYTE = 0,
164 SES_CTRL_COMMON_SELECT_MASK = 0x80,
165 SES_CTRL_COMMON_SELECT_SHIFT = 7,
166
167 SES_CTRL_COMMON_PRDFAIL_BYTE = 0,
168 SES_CTRL_COMMON_PRDFAIL_MASK = 0x40,
169 SES_CTRL_COMMON_PRDFAIL_SHIFT = 6,
170
171 SES_CTRL_COMMON_DISABLE_BYTE = 0,
172 SES_CTRL_COMMON_DISABLE_MASK = 0x20,
173 SES_CTRL_COMMON_DISABLE_SHIFT = 5,
174
175 SES_CTRL_COMMON_RST_SWAP_BYTE = 0,
176 SES_CTRL_COMMON_RST_SWAP_MASK = 0x10,
177 SES_CTRL_COMMON_RST_SWAP_SHIFT = 4
178 };
179
180 #define GEN_SES_CTRL_COMMON_ACCESSORS(LCASE, UCASE) \
181 GEN_ACCESSORS(ses_ctrl_common, SES_CTRL_COMMON, LCASE, UCASE)
182 GEN_SES_CTRL_COMMON_ACCESSORS(select, SELECT)
183 GEN_SES_CTRL_COMMON_ACCESSORS(prdfail, PRDFAIL)
184 GEN_SES_CTRL_COMMON_ACCESSORS(disable, DISABLE)
185 GEN_SES_CTRL_COMMON_ACCESSORS(rst_swap, RST_SWAP)
186 #undef GEN_SES_CTRL_COMMON_ACCESSORS
187
188 /*------------------------ Device Slot Control Element ----------------------*/
189 struct ses_ctrl_dev_slot {
190 struct ses_ctrl_common common;
191 uint8_t bytes[3];
192 };
193
194 enum ses_ctrl_dev_slot_field_data {
195 SES_CTRL_DEV_SLOT_RQST_ACTIVE_BYTE = 1,
196 SES_CTRL_DEV_SLOT_RQST_ACTIVE_MASK = 0x80,
197 SES_CTRL_DEV_SLOT_RQST_ACTIVE_SHIFT = 7,
198
199 SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_BYTE = 1,
200 SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_MASK = 0x40,
201 SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_SHIFT = 6,
202
203 SES_CTRL_DEV_SLOT_RQST_MISSING_BYTE = 1,
204 SES_CTRL_DEV_SLOT_RQST_MISSING_MASK = 0x10,
205 SES_CTRL_DEV_SLOT_RQST_MISSING_SHIFT = 4,
206
207 SES_CTRL_DEV_SLOT_RQST_INSERT_BYTE = 1,
208 SES_CTRL_DEV_SLOT_RQST_INSERT_MASK = 0x08,
209 SES_CTRL_DEV_SLOT_RQST_INSERT_SHIFT = 3,
210
211 SES_CTRL_DEV_SLOT_RQST_REMOVE_BYTE = 1,
212 SES_CTRL_DEV_SLOT_RQST_REMOVE_MASK = 0x04,
213 SES_CTRL_DEV_SLOT_RQST_REMOVE_SHIFT = 2,
214
215 SES_CTRL_DEV_SLOT_RQST_IDENT_BYTE = 1,
216 SES_CTRL_DEV_SLOT_RQST_IDENT_MASK = 0x02,
217 SES_CTRL_DEV_SLOT_RQST_IDENT_SHIFT = 1,
218
219 SES_CTRL_DEV_SLOT_RQST_FAULT_BYTE = 2,
220 SES_CTRL_DEV_SLOT_RQST_FAULT_MASK = 0x20,
221 SES_CTRL_DEV_SLOT_RQST_FAULT_SHIFT = 5,
222
223 SES_CTRL_DEV_SLOT_DEVICE_OFF_BYTE = 2,
224 SES_CTRL_DEV_SLOT_DEVICE_OFF_MASK = 0x10,
225 SES_CTRL_DEV_SLOT_DEVICE_OFF_SHIFT = 4,
226
227 SES_CTRL_DEV_SLOT_ENABLE_BYP_A_BYTE = 2,
228 SES_CTRL_DEV_SLOT_ENABLE_BYP_A_MASK = 0x08,
229 SES_CTRL_DEV_SLOT_ENABLE_BYP_A_SHIFT = 3,
230
231 SES_CTRL_DEV_SLOT_ENABLE_BYP_B_BYTE = 2,
232 SES_CTRL_DEV_SLOT_ENABLE_BYP_B_MASK = 0x04,
233 SES_CTRL_DEV_SLOT_ENABLE_BYP_B_SHIFT = 2
234 };
235 #define GEN_SES_CTRL_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
236 GEN_ACCESSORS(ses_ctrl_dev_slot, SES_CTRL_DEV_SLOT, LCASE, UCASE)
237
238 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_active, RQST_ACTIVE)
239 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(do_not_remove, DO_NOT_REMOVE)
240 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_missing, RQST_MISSING)
241 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_insert, RQST_INSERT)
242 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_remove, RQST_REMOVE)
243 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_ident, RQST_IDENT)
244 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_fault, RQST_FAULT)
245 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(device_off, DEVICE_OFF)
246 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_a, ENABLE_BYP_A)
247 GEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_b, ENABLE_BYP_B)
248 #undef GEN_SES_CTRL_DEV_SLOT_ACCESSORS
249
250 /*--------------------- Array Device Slot Control Element --------------------*/
251 struct ses_ctrl_array_dev_slot {
252 struct ses_ctrl_common common;
253 uint8_t bytes[3];
254 };
255
256 enum ses_ctrl_array_dev_slot_field_data {
257 SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_BYTE = 0,
258 SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_MASK = 0x80,
259 SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_SHIFT = 7,
260
261 SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_BYTE = 0,
262 SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_MASK = 0x40,
263 SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_SHIFT = 6,
264
265 SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_BYTE = 0,
266 SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_MASK = 0x20,
267 SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_SHIFT = 5,
268
269 SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_BYTE = 0,
270 SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_MASK = 0x10,
271 SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_SHIFT = 4,
272
273 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_BYTE = 0,
274 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_MASK = 0x08,
275 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_SHIFT = 3,
276
277 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_BYTE = 0,
278 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_MASK = 0x04,
279 SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_SHIFT = 2,
280
281 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_BYTE = 0,
282 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_MASK = 0x02,
283 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_SHIFT = 1,
284
285 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_BYTE = 0,
286 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_MASK = 0x01,
287 SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_SHIFT = 0
288
289 /*
290 * The remaining fields are identical to the device
291 * slot element type. Access them through the device slot
292 * element type and its accessors.
293 */
294 };
295 #define GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
296 GEN_ACCESSORS(ses_ctrl_array_dev_slot, SES_CTRL_ARRAY_DEV_SLOT, \
297 LCASE, UCASE)
298 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_ok, RQST_OK)
299 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rsvd_device, RQST_RSVD_DEVICE)
300 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_hot_spare, RQST_HOT_SPARE)
301 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_cons_check, RQST_CONS_CHECK)
302 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_crit_array, RQST_IN_CRIT_ARRAY)
303 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_failed_array,
304 RQST_IN_FAILED_ARRAY)
305 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap, RQST_REBUILD_REMAP)
306 GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap_abort,
307 RQST_REBUILD_REMAP_ABORT)
308 #undef GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS
309
310 /*----------------------- Power Supply Control Element -----------------------*/
311 struct ses_ctrl_power_supply {
312 struct ses_ctrl_common common;
313 uint8_t bytes[3];
314 };
315
316 enum ses_ctrl_power_supply_field_data {
317 SES_CTRL_POWER_SUPPLY_RQST_IDENT_BYTE = 0,
318 SES_CTRL_POWER_SUPPLY_RQST_IDENT_MASK = 0x80,
319 SES_CTRL_POWER_SUPPLY_RQST_IDENT_SHIFT = 7,
320
321 SES_CTRL_POWER_SUPPLY_RQST_FAIL_BYTE = 2,
322 SES_CTRL_POWER_SUPPLY_RQST_FAIL_MASK = 0x40,
323 SES_CTRL_POWER_SUPPLY_RQST_FAIL_SHIFT = 6,
324
325 SES_CTRL_POWER_SUPPLY_RQST_ON_BYTE = 2,
326 SES_CTRL_POWER_SUPPLY_RQST_ON_MASK = 0x20,
327 SES_CTRL_POWER_SUPPLY_RQST_ON_SHIFT = 5
328 };
329
330 #define GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(LCASE, UCASE) \
331 GEN_ACCESSORS(ses_ctrl_power_supply, SES_CTRL_POWER_SUPPLY, LCASE, UCASE)
332 GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_ident, RQST_IDENT)
333 GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_fail, RQST_FAIL)
334 GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_on, RQST_ON)
335 #undef GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS
336
337 /*-------------------------- Cooling Control Element -------------------------*/
338 struct ses_ctrl_cooling {
339 struct ses_ctrl_common common;
340 uint8_t bytes[3];
341 };
342
343 enum ses_ctrl_cooling_field_data {
344 SES_CTRL_COOLING_RQST_IDENT_BYTE = 0,
345 SES_CTRL_COOLING_RQST_IDENT_MASK = 0x80,
346 SES_CTRL_COOLING_RQST_IDENT_SHIFT = 7,
347
348 SES_CTRL_COOLING_RQST_FAIL_BYTE = 2,
349 SES_CTRL_COOLING_RQST_FAIL_MASK = 0x40,
350 SES_CTRL_COOLING_RQST_FAIL_SHIFT = 6,
351
352 SES_CTRL_COOLING_RQST_ON_BYTE = 2,
353 SES_CTRL_COOLING_RQST_ON_MASK = 0x20,
354 SES_CTRL_COOLING_RQST_ON_SHIFT = 5,
355
356 SES_CTRL_COOLING_RQSTED_SPEED_CODE_BYTE = 2,
357 SES_CTRL_COOLING_RQSTED_SPEED_CODE_MASK = 0x07,
358 SES_CTRL_COOLING_RQSTED_SPEED_CODE_SHIFT = 2,
359 SES_CTRL_COOLING_RQSTED_SPEED_CODE_UNCHANGED = 0x00,
360 SES_CTRL_COOLING_RQSTED_SPEED_CODE_LOWEST = 0x01,
361 SES_CTRL_COOLING_RQSTED_SPEED_CODE_HIGHEST = 0x07
362 };
363
364 #define GEN_SES_CTRL_COOLING_ACCESSORS(LCASE, UCASE) \
365 GEN_ACCESSORS(ses_ctrl_cooling, SES_CTRL_COOLING, LCASE, UCASE)
366 GEN_SES_CTRL_COOLING_ACCESSORS(rqst_ident, RQST_IDENT)
367 GEN_SES_CTRL_COOLING_ACCESSORS(rqst_fail, RQST_FAIL)
368 GEN_SES_CTRL_COOLING_ACCESSORS(rqst_on, RQST_ON)
369 GEN_SES_CTRL_COOLING_ACCESSORS(rqsted_speed_code, RQSTED_SPEED_CODE)
370 #undef GEN_SES_CTRL_COOLING_ACCESSORS
371
372 /*-------------------- Temperature Sensor Control Element --------------------*/
373 struct ses_ctrl_temp_sensor {
374 struct ses_ctrl_common common;
375 uint8_t bytes[3];
376 };
377
378 enum ses_ctrl_temp_sensor_field_data {
379 SES_CTRL_TEMP_SENSOR_RQST_IDENT_BYTE = 0,
380 SES_CTRL_TEMP_SENSOR_RQST_IDENT_MASK = 0x80,
381 SES_CTRL_TEMP_SENSOR_RQST_IDENT_SHIFT = 7,
382
383 SES_CTRL_TEMP_SENSOR_RQST_FAIL_BYTE = 0,
384 SES_CTRL_TEMP_SENSOR_RQST_FAIL_MASK = 0x40,
385 SES_CTRL_TEMP_SENSOR_RQST_FAIL_SHIFT = 6
386 };
387
388 #define GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(LCASE, UCASE) \
389 GEN_ACCESSORS(ses_ctrl_temp_sensor, SES_CTRL_TEMP_SENSOR, LCASE, UCASE)
390 GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
391 GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL)
392 #undef GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS
393
394 /*------------------------- Door Lock Control Element ------------------------*/
395 struct ses_ctrl_door_lock {
396 struct ses_ctrl_common common;
397 uint8_t bytes[3];
398 };
399
400 enum ses_ctrl_door_lock_field_data {
401 SES_CTRL_DOOR_LOCK_RQST_IDENT_BYTE = 0,
402 SES_CTRL_DOOR_LOCK_RQST_IDENT_MASK = 0x80,
403 SES_CTRL_DOOR_LOCK_RQST_IDENT_SHIFT = 7,
404
405 SES_CTRL_DOOR_LOCK_RQST_FAIL_BYTE = 0,
406 SES_CTRL_DOOR_LOCK_RQST_FAIL_MASK = 0x40,
407 SES_CTRL_DOOR_LOCK_RQST_FAIL_SHIFT = 6,
408
409 SES_CTRL_DOOR_LOCK_UNLOCK_BYTE = 2,
410 SES_CTRL_DOOR_LOCK_UNLOCK_MASK = 0x01,
411 SES_CTRL_DOOR_LOCK_UNLOCK_SHIFT = 0
412 };
413
414 #define GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(LCASE, UCASE) \
415 GEN_ACCESSORS(ses_ctrl_door_lock, SES_CTRL_DOOR_LOCK, LCASE, UCASE)
416 GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_ident, RQST_IDENT)
417 GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_fail, RQST_FAIL)
418 GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(unlock, UNLOCK)
419 #undef GEN_SES_CTRL_DOOR_LOCK_ACCESSORS
420
421 /*----------------------- Audible Alarm Control Element ----------------------*/
422 struct ses_ctrl_audible_alarm {
423 struct ses_ctrl_common common;
424 uint8_t bytes[3];
425 };
426
427 enum ses_ctrl_audible_alarm_field_data {
428 SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_BYTE = 0,
429 SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_MASK = 0x80,
430 SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_SHIFT = 7,
431
432 SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_BYTE = 0,
433 SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_MASK = 0x40,
434 SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_SHIFT = 6,
435
436 SES_CTRL_AUDIBLE_ALARM_SET_MUTE_BYTE = 2,
437 SES_CTRL_AUDIBLE_ALARM_SET_MUTE_MASK = 0x40,
438 SES_CTRL_AUDIBLE_ALARM_SET_MUTE_SHIFT = 6,
439
440 SES_CTRL_AUDIBLE_ALARM_SET_REMIND_BYTE = 2,
441 SES_CTRL_AUDIBLE_ALARM_SET_REMIND_MASK = 0x10,
442 SES_CTRL_AUDIBLE_ALARM_SET_REMIND_SHIFT = 4,
443
444 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_BYTE = 2,
445 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_MASK = 0x0F,
446 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_SHIFT = 0,
447 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_INFO = 0x08,
448 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_NON_CRIT = 0x04,
449 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_CRIT = 0x02,
450 SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_UNRECOV = 0x01
451 };
452
453 #define GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE) \
454 GEN_ACCESSORS(ses_ctrl_audible_alarm, SES_CTRL_AUDIBLE_ALARM, LCASE, UCASE)
455 GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_ident, RQST_IDENT)
456 GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_fail, RQST_FAIL)
457 GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_mute, SET_MUTE)
458 GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_remind, SET_REMIND)
459 GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(tone_control, TONE_CONTROL)
460 #undef GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS
461
462 /*--------- Enclosure Services Controller Electronics Control Element --------*/
463 struct ses_ctrl_ecc_electronics {
464 struct ses_ctrl_common common;
465 uint8_t bytes[3];
466 };
467
468 enum ses_ctrl_ecc_electronics_field_data {
469 SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_BYTE = 0,
470 SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_MASK = 0x80,
471 SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_SHIFT = 7,
472
473 SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_BYTE = 0,
474 SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_MASK = 0x40,
475 SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_SHIFT = 6,
476
477 SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_BYTE = 1,
478 SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_MASK = 0x01,
479 SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_SHIFT = 0
480 };
481
482 #define GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \
483 GEN_ACCESSORS(ses_ctrl_ecc_electronics, SES_CTRL_ECC_ELECTRONICS, \
484 LCASE, UCASE)
485 GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_ident, RQST_IDENT)
486 GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_fail, RQST_FAIL)
487 GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(select_element, SELECT_ELEMENT)
488 #undef GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS
489
490 /*----------- SCSI Services Controller Electronics Control Element -----------*/
491 struct ses_ctrl_scc_electronics {
492 struct ses_ctrl_common common;
493 uint8_t bytes[3];
494 };
495
496 enum ses_ctrl_scc_electronics_field_data {
497 SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_BYTE = 0,
498 SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_MASK = 0x80,
499 SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_SHIFT = 7,
500
501 SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_BYTE = 0,
502 SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_MASK = 0x40,
503 SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_SHIFT = 6
504 };
505
506 #define GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \
507 GEN_ACCESSORS(ses_ctrl_scc_electronics, SES_CTRL_SCC_ELECTRONICS, \
508 LCASE, UCASE)
509 GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_ident, RQST_IDENT)
510 GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_fail, RQST_FAIL)
511 #undef GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS
512
513 /*--------------------- Nonvolatile Cache Control Element --------------------*/
514 struct ses_ctrl_nv_cache {
515 struct ses_ctrl_common common;
516 uint8_t bytes[3];
517 };
518
519 enum ses_ctrl_nv_cache_field_data {
520 SES_CTRL_NV_CACHE_RQST_IDENT_BYTE = 0,
521 SES_CTRL_NV_CACHE_RQST_IDENT_MASK = 0x80,
522 SES_CTRL_NV_CACHE_RQST_IDENT_SHIFT = 7,
523
524 SES_CTRL_NV_CACHE_RQST_FAIL_BYTE = 0,
525 SES_CTRL_NV_CACHE_RQST_FAIL_MASK = 0x40,
526 SES_CTRL_NV_CACHE_RQST_FAIL_SHIFT = 6
527 };
528
529 #define GEN_SES_CTRL_NV_CACHE_ACCESSORS(LCASE, UCASE) \
530 GEN_ACCESSORS(ses_ctrl_nv_cache, SES_CTRL_NV_CACHE, LCASE, UCASE)
531 GEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_ident, RQST_IDENT)
532 GEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_fail, RQST_FAIL)
533 #undef GEN_SES_CTRL_NV_CACHE_ACCESSORS
534
535 /*----------------- Invalid Operation Reason Control Element -----------------*/
536 struct ses_ctrl_invalid_op_reason {
537 struct ses_ctrl_common common;
538 uint8_t bytes[3];
539 };
540
541 /* There are no element specific fields currently defined in the spec. */
542
543 /*--------------- Uninterruptible Power Supply Control Element ---------------*/
544 struct ses_ctrl_ups {
545 struct ses_ctrl_common common;
546 uint8_t bytes[3];
547 };
548
549 enum ses_ctrl_ups_field_data {
550 SES_CTRL_UPS_RQST_IDENT_BYTE = 2,
551 SES_CTRL_UPS_RQST_IDENT_MASK = 0x80,
552 SES_CTRL_UPS_RQST_IDENT_SHIFT = 7,
553
554 SES_CTRL_UPS_RQST_FAIL_BYTE = 2,
555 SES_CTRL_UPS_RQST_FAIL_MASK = 0x40,
556 SES_CTRL_UPS_RQST_FAIL_SHIFT = 6
557 };
558
559 #define GEN_SES_CTRL_UPS_ACCESSORS(LCASE, UCASE) \
560 GEN_ACCESSORS(ses_ctrl_ups, SES_CTRL_UPS, LCASE, UCASE)
561 GEN_SES_CTRL_UPS_ACCESSORS(rqst_ident, RQST_IDENT)
562 GEN_SES_CTRL_UPS_ACCESSORS(rqst_fail, RQST_FAIL)
563 #undef GEN_SES_CTRL_UPS_ACCESSORS
564
565 /*-------------------------- Display Control Element -------------------------*/
566 struct ses_ctrl_display {
567 struct ses_ctrl_common common;
568 uint8_t bytes[1];
569 uint8_t display_character[2];
570 };
571
572 enum ses_ctrl_display_field_data {
573 SES_CTRL_DISPLAY_RQST_IDENT_BYTE = 0,
574 SES_CTRL_DISPLAY_RQST_IDENT_MASK = 0x80,
575 SES_CTRL_DISPLAY_RQST_IDENT_SHIFT = 7,
576
577 SES_CTRL_DISPLAY_RQST_FAIL_BYTE = 0,
578 SES_CTRL_DISPLAY_RQST_FAIL_MASK = 0x40,
579 SES_CTRL_DISPLAY_RQST_FAIL_SHIFT = 6,
580
581 SES_CTRL_DISPLAY_DISPLAY_MODE_BYTE = 0,
582 SES_CTRL_DISPLAY_DISPLAY_MODE_MASK = 0x03,
583 SES_CTRL_DISPLAY_DISPLAY_MODE_SHIFT = 6,
584 SES_CTRL_DISPLAY_DISPLAY_MODE_UNCHANGED = 0x0,
585 SES_CTRL_DISPLAY_DISPLAY_MODE_ESP = 0x1,
586 SES_CTRL_DISPLAY_DISPLAY_MODE_DC_FIELD = 0x2
587 };
588
589 #define GEN_SES_CTRL_DISPLAY_ACCESSORS(LCASE, UCASE) \
590 GEN_ACCESSORS(ses_ctrl_display, SES_CTRL_DISPLAY, LCASE, UCASE)
591 GEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_ident, RQST_IDENT)
592 GEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_fail, RQST_FAIL)
593 GEN_SES_CTRL_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE)
594 #undef GEN_SES_CTRL_DISPLAY_ACCESSORS
595
596 /*----------------------- Key Pad Entry Control Element ----------------------*/
597 struct ses_ctrl_key_pad_entry {
598 struct ses_ctrl_common common;
599 uint8_t bytes[3];
600 };
601
602 enum ses_ctrl_key_pad_entry_field_data {
603 SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_BYTE = 0,
604 SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_MASK = 0x80,
605 SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_SHIFT = 7,
606
607 SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_BYTE = 0,
608 SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_MASK = 0x40,
609 SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_SHIFT = 6
610 };
611
612 #define GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE) \
613 GEN_ACCESSORS(ses_ctrl_key_pad_entry, SES_CTRL_KEY_PAD_ENTRY, LCASE, UCASE)
614 GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_ident, RQST_IDENT)
615 GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_fail, RQST_FAIL)
616 #undef GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS
617
618 /*------------------------- Enclosure Control Element ------------------------*/
619 struct ses_ctrl_enclosure {
620 struct ses_ctrl_common common;
621 uint8_t bytes[3];
622 };
623
624 enum ses_ctrl_enclosure_field_data {
625 SES_CTRL_ENCLOSURE_RQST_IDENT_BYTE = 0,
626 SES_CTRL_ENCLOSURE_RQST_IDENT_MASK = 0x80,
627 SES_CTRL_ENCLOSURE_RQST_IDENT_SHIFT = 7,
628
629 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_BYTE = 1,
630 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_MASK = 0xC0,
631 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_SHIFT = 6,
632 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_NONE = 0x0,
633 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_AFTER_DELAY = 0x1,
634 SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_CANCEL = 0x2,
635
636 SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_BYTE = 1,
637 SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MASK = 0x3F,
638 SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_SHIFT = 0,
639 SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MAX = 60,/*minutes*/
640
641 SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_BYTE = 2,
642 SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MASK = 0xFC,
643 SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_SHIFT = 2,
644 SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MAX_AUTO = 60,
645 SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MANUAL = 63,
646
647 SES_CTRL_ENCLOSURE_RQST_FAIL_BYTE = 2,
648 SES_CTRL_ENCLOSURE_RQST_FAIL_MASK = 0x02,
649 SES_CTRL_ENCLOSURE_RQST_FAIL_SHIFT = 1,
650
651 SES_CTRL_ENCLOSURE_RQST_WARN_BYTE = 2,
652 SES_CTRL_ENCLOSURE_RQST_WARN_MASK = 0x01,
653 SES_CTRL_ENCLOSURE_RQST_WARN_SHIFT = 0
654 };
655
656 #define GEN_SES_CTRL_ENCLOSURE_ACCESSORS(LCASE, UCASE) \
657 GEN_ACCESSORS(ses_ctrl_enclosure, SES_CTRL_ENCLOSURE, LCASE, UCASE)
658 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_ident, RQST_IDENT)
659 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_rqst, POWER_CYCLE_RQST)
660 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_delay, POWER_CYCLE_DELAY)
661 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_off_duration, POWER_OFF_DURATION)
662 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_fail, RQST_FAIL)
663 GEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_warn, RQST_WARN)
664 #undef GEN_SES_CTRL_ENCLOSURE_ACCESSORS
665
666 /*------------------- SCSI Port/Transceiver Control Element ------------------*/
667 struct ses_ctrl_scsi_port_or_xcvr {
668 struct ses_ctrl_common common;
669 uint8_t bytes[3];
670 };
671
672 enum ses_ctrl_scsi_port_or_xcvr_field_data {
673 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_BYTE = 0,
674 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_MASK = 0x80,
675 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_SHIFT = 7,
676
677 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_BYTE = 0,
678 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_MASK = 0x40,
679 SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_SHIFT = 6,
680
681 SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_BYTE = 2,
682 SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_MASK = 0x10,
683 SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_SHIFT = 4
684 };
685
686 #define GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE) \
687 GEN_ACCESSORS(ses_ctrl_scsi_port_or_xcvr, SES_CTRL_SCSI_PORT_OR_XCVR,\
688 LCASE, UCASE)
689 GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_ident, RQST_IDENT)
690 GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(disable, DISABLE)
691 GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_fail, RQST_FAIL)
692 #undef GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS
693
694 /*------------------------- Language Control Element -------------------------*/
695 struct ses_ctrl_language {
696 struct ses_ctrl_common common;
697 uint8_t bytes[1];
698 uint8_t language_code[2];
699 };
700
701 enum ses_ctrl_language_field_data {
702 SES_CTRL_LANGUAGE_RQST_IDENT_BYTE = 0,
703 SES_CTRL_LANGUAGE_RQST_IDENT_MASK = 0x80,
704 SES_CTRL_LANGUAGE_RQST_IDENT_SHIFT = 7
705 };
706
707 #define GEN_SES_CTRL_LANGUAGE_ACCESSORS(LCASE, UCASE) \
708 GEN_ACCESSORS(ses_ctrl_language, SES_CTRL_LANGUAGE, LCASE, UCASE)
709 GEN_SES_CTRL_LANGUAGE_ACCESSORS(rqst_ident, RQST_IDENT)
710 #undef GEN_SES_CTRL_LANGUAGE_ACCESSORS
711
712 /*-------------------- Communication Port Control Element --------------------*/
713 struct ses_ctrl_comm_port {
714 struct ses_ctrl_common common;
715 uint8_t bytes[3];
716 };
717
718 enum ses_ctrl_comm_port_field_data {
719 SES_CTRL_COMM_PORT_RQST_IDENT_BYTE = 0,
720 SES_CTRL_COMM_PORT_RQST_IDENT_MASK = 0x80,
721 SES_CTRL_COMM_PORT_RQST_IDENT_SHIFT = 7,
722
723 SES_CTRL_COMM_PORT_RQST_FAIL_BYTE = 0,
724 SES_CTRL_COMM_PORT_RQST_FAIL_MASK = 0x40,
725 SES_CTRL_COMM_PORT_RQST_FAIL_SHIFT = 6,
726
727 SES_CTRL_COMM_PORT_DISABLE_BYTE = 2,
728 SES_CTRL_COMM_PORT_DISABLE_MASK = 0x01,
729 SES_CTRL_COMM_PORT_DISABLE_SHIFT = 0
730 };
731
732 #define GEN_SES_CTRL_COMM_PORT_ACCESSORS(LCASE, UCASE) \
733 GEN_ACCESSORS(ses_ctrl_comm_port, SES_CTRL_COMM_PORT, LCASE, UCASE)
734 GEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
735 GEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_fail, RQST_FAIL)
736 GEN_SES_CTRL_COMM_PORT_ACCESSORS(disable, DISABLE)
737 #undef GEN_SES_CTRL_COMM_PORT_ACCESSORS
738
739 /*---------------------- Voltage Sensor Control Element ----------------------*/
740 struct ses_ctrl_voltage_sensor {
741 struct ses_ctrl_common common;
742 uint8_t bytes[3];
743 };
744
745 enum ses_ctrl_voltage_sensor_field_data {
746 SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_BYTE = 0,
747 SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_MASK = 0x80,
748 SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_SHIFT = 7,
749
750 SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_BYTE = 0,
751 SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_MASK = 0x40,
752 SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_SHIFT = 6
753 };
754
755 #define GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE) \
756 GEN_ACCESSORS(ses_ctrl_voltage_sensor, SES_CTRL_VOLTAGE_SENSOR, \
757 LCASE, UCASE)
758 GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
759 GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL)
760 #undef GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS
761
762 /*---------------------- Current Sensor Control Element ----------------------*/
763 struct ses_ctrl_current_sensor {
764 struct ses_ctrl_common common;
765 uint8_t bytes[3];
766 };
767
768 enum ses_ctrl_current_sensor_field_data {
769 SES_CTRL_CURRENT_SENSOR_RQST_IDENT_BYTE = 0,
770 SES_CTRL_CURRENT_SENSOR_RQST_IDENT_MASK = 0x80,
771 SES_CTRL_CURRENT_SENSOR_RQST_IDENT_SHIFT = 7,
772
773 SES_CTRL_CURRENT_SENSOR_RQST_FAIL_BYTE = 0,
774 SES_CTRL_CURRENT_SENSOR_RQST_FAIL_MASK = 0x40,
775 SES_CTRL_CURRENT_SENSOR_RQST_FAIL_SHIFT = 6
776 };
777
778 #define GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE) \
779 GEN_ACCESSORS(ses_ctrl_current_sensor, SES_CTRL_CURRENT_SENSOR, \
780 LCASE, UCASE)
781 GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
782 GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_fail, RQST_FAIL)
783 #undef GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS
784
785 /*--------------------- SCSI Target Port Control Element ---------------------*/
786 struct ses_ctrl_target_port {
787 struct ses_ctrl_common common;
788 uint8_t bytes[3];
789 };
790
791 enum ses_ctrl_scsi_target_port_field_data {
792 SES_CTRL_TARGET_PORT_RQST_IDENT_BYTE = 0,
793 SES_CTRL_TARGET_PORT_RQST_IDENT_MASK = 0x80,
794 SES_CTRL_TARGET_PORT_RQST_IDENT_SHIFT = 7,
795
796 SES_CTRL_TARGET_PORT_RQST_FAIL_BYTE = 0,
797 SES_CTRL_TARGET_PORT_RQST_FAIL_MASK = 0x40,
798 SES_CTRL_TARGET_PORT_RQST_FAIL_SHIFT = 6,
799
800 SES_CTRL_TARGET_PORT_ENABLE_BYTE = 2,
801 SES_CTRL_TARGET_PORT_ENABLE_MASK = 0x01,
802 SES_CTRL_TARGET_PORT_ENABLE_SHIFT = 0
803 };
804
805 #define GEN_SES_CTRL_TARGET_PORT_ACCESSORS(LCASE, UCASE) \
806 GEN_ACCESSORS(ses_ctrl_target_port, SES_CTRL_TARGET_PORT, LCASE, UCASE)
807 GEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
808 GEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_fail, RQST_FAIL)
809 GEN_SES_CTRL_TARGET_PORT_ACCESSORS(enable, ENABLE)
810 #undef GEN_SES_CTRL_TARGET_PORT_ACCESSORS
811
812 /*-------------------- SCSI Initiator Port Control Element -------------------*/
813 struct ses_ctrl_initiator_port {
814 struct ses_ctrl_common common;
815 uint8_t bytes[3];
816 };
817
818 enum ses_ctrl_initiator_port_field_data {
819 SES_CTRL_INITIATOR_PORT_RQST_IDENT_BYTE = 0,
820 SES_CTRL_INITIATOR_PORT_RQST_IDENT_MASK = 0x80,
821 SES_CTRL_INITIATOR_PORT_RQST_IDENT_SHIFT = 7,
822
823 SES_CTRL_INITIATOR_PORT_RQST_FAIL_BYTE = 0,
824 SES_CTRL_INITIATOR_PORT_RQST_FAIL_MASK = 0x40,
825 SES_CTRL_INITIATOR_PORT_RQST_FAIL_SHIFT = 6,
826
827 SES_CTRL_INITIATOR_PORT_ENABLE_BYTE = 2,
828 SES_CTRL_INITIATOR_PORT_ENABLE_MASK = 0x01,
829 SES_CTRL_INITIATOR_PORT_ENABLE_SHIFT = 0
830 };
831
832 #define GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(LCASE, UCASE) \
833 GEN_ACCESSORS(ses_ctrl_initiator_port, SES_CTRL_INITIATOR_PORT, \
834 LCASE, UCASE)
835 GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
836 GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_fail, RQST_FAIL)
837 GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(enable, ENABLE)
838 #undef GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS
839
840 /*-------------------- Simple Subenclosure Control Element -------------------*/
841 struct ses_ctrl_simple_subenc {
842 struct ses_ctrl_common common;
843 uint8_t bytes[3];
844 };
845
846 enum ses_ctrl_simple_subenc_field_data {
847 SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_BYTE = 0,
848 SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_MASK = 0x80,
849 SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_SHIFT = 7,
850
851 SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_BYTE = 0,
852 SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_MASK = 0x40,
853 SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_SHIFT = 6
854 };
855
856 #define GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE) \
857 GEN_ACCESSORS(ses_ctrl_simple_subenc, SES_CTRL_SIMPlE_SUBSES, \
858 LCASE, UCASE)
859 GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_ident, RQST_IDENT)
860 GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_fail, RQST_FAIL)
861 #undef GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS
862
863 /*----------------------- SAS Expander Control Element -----------------------*/
864 struct ses_ctrl_sas_expander {
865 struct ses_ctrl_common common;
866 uint8_t bytes[3];
867 };
868
869 enum ses_ctrl_sas_expander_field_data {
870 SES_CTRL_SAS_EXPANDER_RQST_IDENT_BYTE = 0,
871 SES_CTRL_SAS_EXPANDER_RQST_IDENT_MASK = 0x80,
872 SES_CTRL_SAS_EXPANDER_RQST_IDENT_SHIFT = 7,
873
874 SES_CTRL_SAS_EXPANDER_RQST_FAIL_BYTE = 0,
875 SES_CTRL_SAS_EXPANDER_RQST_FAIL_MASK = 0x40,
876 SES_CTRL_SAS_EXPANDER_RQST_FAIL_SHIFT = 6
877 };
878
879 #define GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(LCASE, UCASE) \
880 GEN_ACCESSORS(ses_ctrl_sas_expander, SES_CTRL_SAS_EXPANDER, LCASE, UCASE)
881 GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_ident, RQST_IDENT)
882 GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_fail, RQST_FAIL)
883 #undef GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS
884
885 /*----------------------- SAS Connector Control Element ----------------------*/
886 struct ses_ctrl_sas_connector {
887 struct ses_ctrl_common common;
888 uint8_t bytes[3];
889 };
890
891 enum ses_ctrl_sas_connector_field_data {
892 SES_CTRL_SAS_CONNECTOR_RQST_IDENT_BYTE = 0,
893 SES_CTRL_SAS_CONNECTOR_RQST_IDENT_MASK = 0x80,
894 SES_CTRL_SAS_CONNECTOR_RQST_IDENT_SHIFT = 7,
895
896 SES_CTRL_SAS_CONNECTOR_RQST_FAIL_BYTE = 2,
897 SES_CTRL_SAS_CONNECTOR_RQST_FAIL_MASK = 0x40,
898 SES_CTRL_SAS_CONNECTOR_RQST_FAIL_SHIFT = 6
899 };
900
901 #define GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE) \
902 GEN_ACCESSORS(ses_ctrl_sas_connector, SES_CTRL_SAS_CONNECTOR, \
903 LCASE, UCASE)
904 GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_ident, RQST_IDENT)
905 GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_fail, RQST_FAIL)
906 #undef GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS
907
908 /*------------------------- Universal Control Element ------------------------*/
909 union ses_ctrl_element {
910 struct ses_ctrl_common common;
911 struct ses_ctrl_dev_slot dev_slot;
912 struct ses_ctrl_array_dev_slot array_dev_slot;
913 struct ses_ctrl_power_supply power_supply;
914 struct ses_ctrl_cooling cooling;
915 struct ses_ctrl_temp_sensor temp_sensor;
916 struct ses_ctrl_door_lock door_lock;
917 struct ses_ctrl_audible_alarm audible_alarm;
918 struct ses_ctrl_ecc_electronics ecc_electronics;
919 struct ses_ctrl_scc_electronics scc_electronics;
920 struct ses_ctrl_nv_cache nv_cache;
921 struct ses_ctrl_invalid_op_reason invalid_op_reason;
922 struct ses_ctrl_ups ups;
923 struct ses_ctrl_display display;
924 struct ses_ctrl_key_pad_entry key_pad_entry;
925 struct ses_ctrl_scsi_port_or_xcvr scsi_port_or_xcvr;
926 struct ses_ctrl_language language;
927 struct ses_ctrl_comm_port comm_port;
928 struct ses_ctrl_voltage_sensor voltage_sensor;
929 struct ses_ctrl_current_sensor current_sensor;
930 struct ses_ctrl_target_port target_port;
931 struct ses_ctrl_initiator_port initiator_port;
932 struct ses_ctrl_simple_subenc simple_subenc;
933 struct ses_ctrl_sas_expander sas_expander;
934 struct ses_ctrl_sas_connector sas_connector;
935 };
936
937 /*--------------------- SCSI SES Control Diagnostic Page ---------------------*/
938 struct ses_ctrl_page {
939 struct ses_page_hdr hdr;
940 union ses_ctrl_element elements[];
941 };
942
943 enum ses_ctrl_page_field_data {
944 SES_CTRL_PAGE_INFO_MASK = 0x08,
945 SES_CTRL_PAGE_INFO_SHIFT = 3,
946
947 SES_CTRL_PAGE_NON_CRIT_MASK = 0x04,
948 SES_CTRL_PAGE_NON_CRIT_SHIFT = 2,
949
950 SES_CTRL_PAGE_CRIT_MASK = 0x02,
951 SES_CTRL_PAGE_CRIT_SHIFT = 1,
952
953 SES_CTRL_PAGE_UNRECOV_MASK = 0x01,
954 SES_CTRL_PAGE_UNRECOV_SHIFT = 0
955 };
956
957 #define GEN_SES_CTRL_PAGE_ACCESSORS(LCASE, UCASE) \
958 GEN_HDR_ACCESSORS(ses_ctrl_page, SES_CTRL_PAGE, LCASE, UCASE)
959
960 GEN_SES_CTRL_PAGE_ACCESSORS(info, INFO)
961 GEN_SES_CTRL_PAGE_ACCESSORS(non_crit, NON_CRIT)
962 GEN_SES_CTRL_PAGE_ACCESSORS(crit, CRIT)
963 GEN_SES_CTRL_PAGE_ACCESSORS(unrecov, UNRECOV)
964 #undef GEN_SES_CTRL_PAGE_ACCESSORS
965
966 /*================= SCSI SES Status Diagnostic Page Structures ===============*/
967 struct ses_status_common {
968 uint8_t bytes[1];
969 };
970
971 enum ses_status_common_field_data {
972 SES_STATUS_COMMON_PRDFAIL_BYTE = 0,
973 SES_STATUS_COMMON_PRDFAIL_MASK = 0x40,
974 SES_STATUS_COMMON_PRDFAIL_SHIFT = 6,
975
976 SES_STATUS_COMMON_DISABLED_BYTE = 0,
977 SES_STATUS_COMMON_DISABLED_MASK = 0x20,
978 SES_STATUS_COMMON_DISABLED_SHIFT = 5,
979
980 SES_STATUS_COMMON_SWAP_BYTE = 0,
981 SES_STATUS_COMMON_SWAP_MASK = 0x10,
982 SES_STATUS_COMMON_SWAP_SHIFT = 4,
983
984 SES_STATUS_COMMON_ELEMENT_STATUS_CODE_BYTE = 0,
985 SES_STATUS_COMMON_ELEMENT_STATUS_CODE_MASK = 0x0F,
986 SES_STATUS_COMMON_ELEMENT_STATUS_CODE_SHIFT = 0
987 };
988
989 #define GEN_SES_STATUS_COMMON_ACCESSORS(LCASE, UCASE) \
990 GEN_GETTER(ses_status_common, SES_STATUS_COMMON, LCASE, UCASE)
991
992 GEN_SES_STATUS_COMMON_ACCESSORS(prdfail, PRDFAIL)
993 GEN_SES_STATUS_COMMON_ACCESSORS(disabled, DISABLED)
994 GEN_SES_STATUS_COMMON_ACCESSORS(swap, SWAP)
995 GEN_SES_STATUS_COMMON_ACCESSORS(element_status_code, ELEMENT_STATUS_CODE)
996 #undef GEN_SES_STATUS_COMMON_ACCESSORS
997
998 /*------------------------- Device Slot Status Element -----------------------*/
999 struct ses_status_dev_slot {
1000 struct ses_status_common common;
1001 uint8_t slot_address;
1002 uint8_t bytes[2];
1003 };
1004
1005 enum ses_status_dev_slot_field_data {
1006 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_BYTE = 0,
1007 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_MASK = 0x80,
1008 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_SHIFT = 7,
1009
1010 SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_BYTE = 0,
1011 SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_MASK = 0x40,
1012 SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_SHIFT = 6,
1013
1014 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_BYTE = 0,
1015 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_MASK = 0x20,
1016 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_SHIFT = 5,
1017
1018 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_BYTE = 0,
1019 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_MASK = 0x10,
1020 SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_SHIFT = 4,
1021
1022 SES_STATUS_DEV_SLOT_INSERT_READY_BYTE = 0,
1023 SES_STATUS_DEV_SLOT_INSERT_READY_MASK = 0x08,
1024 SES_STATUS_DEV_SLOT_INSERT_READY_SHIFT = 3,
1025
1026 SES_STATUS_DEV_SLOT_REMOVE_BYTE = 0,
1027 SES_STATUS_DEV_SLOT_REMOVE_MASK = 0x04,
1028 SES_STATUS_DEV_SLOT_REMOVE_SHIFT = 2,
1029
1030 SES_STATUS_DEV_SLOT_IDENT_BYTE = 0,
1031 SES_STATUS_DEV_SLOT_IDENT_MASK = 0x02,
1032 SES_STATUS_DEV_SLOT_IDENT_SHIFT = 1,
1033
1034 SES_STATUS_DEV_SLOT_REPORT_BYTE = 0,
1035 SES_STATUS_DEV_SLOT_REPORT_MASK = 0x01,
1036 SES_STATUS_DEV_SLOT_REPORT_SHIFT = 0,
1037
1038 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_BYTE = 1,
1039 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_MASK = 0x80,
1040 SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_SHIFT = 7,
1041
1042 SES_STATUS_DEV_SLOT_FAULT_SENSED_BYTE = 1,
1043 SES_STATUS_DEV_SLOT_FAULT_SENSED_MASK = 0x40,
1044 SES_STATUS_DEV_SLOT_FAULT_SENSED_SHIFT = 6,
1045
1046 SES_STATUS_DEV_SLOT_FAULT_REQUESTED_BYTE = 1,
1047 SES_STATUS_DEV_SLOT_FAULT_REQUESTED_MASK = 0x20,
1048 SES_STATUS_DEV_SLOT_FAULT_REQUESTED_SHIFT = 5,
1049
1050 SES_STATUS_DEV_SLOT_DEVICE_OFF_BYTE = 1,
1051 SES_STATUS_DEV_SLOT_DEVICE_OFF_MASK = 0x10,
1052 SES_STATUS_DEV_SLOT_DEVICE_OFF_SHIFT = 4,
1053
1054 SES_STATUS_DEV_SLOT_BYPED_A_BYTE = 1,
1055 SES_STATUS_DEV_SLOT_BYPED_A_MASK = 0x08,
1056 SES_STATUS_DEV_SLOT_BYPED_A_SHIFT = 3,
1057
1058 SES_STATUS_DEV_SLOT_BYPED_B_BYTE = 1,
1059 SES_STATUS_DEV_SLOT_BYPED_B_MASK = 0x04,
1060 SES_STATUS_DEV_SLOT_BYPED_B_SHIFT = 2,
1061
1062 SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_BYTE = 1,
1063 SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_MASK = 0x02,
1064 SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_SHIFT = 1,
1065
1066 SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_BYTE = 1,
1067 SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_MASK = 0x01,
1068 SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_SHIFT = 0
1069 };
1070 #define GEN_SES_STATUS_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
1071 GEN_GETTER(ses_status_dev_slot, SES_STATUS_DEV_SLOT, LCASE, UCASE)
1072
1073 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_a, APP_CLIENT_BYPED_A)
1074 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(do_not_remove, DO_NOT_REMOVE)
1075 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_a, ENCLOSURE_BYPED_A)
1076 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_b, ENCLOSURE_BYPED_B)
1077 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(insert_ready, INSERT_READY)
1078 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(remove, REMOVE)
1079 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(ident, IDENT)
1080 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(report, REPORT)
1081 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_b, APP_CLIENT_BYPED_B)
1082 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_sensed, FAULT_SENSED)
1083 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_requested, FAULT_REQUESTED)
1084 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_off, DEVICE_OFF)
1085 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_a, BYPED_A)
1086 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_b, BYPED_B)
1087 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_a, DEVICE_BYPED_A)
1088 GEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_b, DEVICE_BYPED_B)
1089 #undef GEN_SES_STATUS_DEV_SLOT_ACCESSORS
1090
1091 /*---------------------- Array Device Slot Status Element --------------------*/
1092 struct ses_status_array_dev_slot {
1093 struct ses_status_common common;
1094 uint8_t bytes[3];
1095 };
1096
1097 enum ses_status_array_dev_slot_field_data {
1098 SES_STATUS_ARRAY_DEV_SLOT_OK_BYTE = 0,
1099 SES_STATUS_ARRAY_DEV_SLOT_OK_MASK = 0x80,
1100 SES_STATUS_ARRAY_DEV_SLOT_OK_SHIFT = 7,
1101
1102 SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_BYTE = 0,
1103 SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_MASK = 0x40,
1104 SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_SHIFT = 6,
1105
1106 SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_BYTE = 0,
1107 SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_MASK = 0x20,
1108 SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_SHIFT = 5,
1109
1110 SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_BYTE = 0,
1111 SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_MASK = 0x10,
1112 SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_SHIFT = 4,
1113
1114 SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_BYTE = 0,
1115 SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_MASK = 0x08,
1116 SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_SHIFT = 3,
1117
1118 SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_BYTE = 0,
1119 SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_MASK = 0x04,
1120 SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_SHIFT = 2,
1121
1122 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_BYTE = 0,
1123 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_MASK = 0x02,
1124 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_SHIFT = 1,
1125
1126 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_BYTE = 0,
1127 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_MASK = 0x01,
1128 SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_SHIFT = 0
1129
1130 /*
1131 * The remaining fields are identical to the device
1132 * slot element type. Access them through the device slot
1133 * element type and its accessors.
1134 */
1135 };
1136 #define GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
1137 GEN_GETTER(ses_status_array_dev_slot, SES_STATUS_ARRAY_DEV_SLOT, \
1138 LCASE, UCASE)
1139 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(ok, OK)
1140 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rsvd_device, RSVD_DEVICE)
1141 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(hot_spare, HOT_SPARE)
1142 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(cons_check, CONS_CHECK)
1143 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_crit_array, IN_CRIT_ARRAY)
1144 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_failed_array, IN_FAILED_ARRAY)
1145 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap, REBUILD_REMAP)
1146 GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap_abort,
1147 REBUILD_REMAP_ABORT)
1148 #undef GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS
1149
1150 /*----------------------- Power Supply Status Element ------------------------*/
1151 struct ses_status_power_supply {
1152 struct ses_status_common common;
1153 uint8_t bytes[3];
1154 };
1155
1156 enum ses_status_power_supply_field_data {
1157 SES_STATUS_POWER_SUPPLY_IDENT_BYTE = 0,
1158 SES_STATUS_POWER_SUPPLY_IDENT_MASK = 0x80,
1159 SES_STATUS_POWER_SUPPLY_IDENT_SHIFT = 7,
1160
1161 SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_BYTE = 1,
1162 SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_MASK = 0x08,
1163 SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_SHIFT = 3,
1164
1165 SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_BYTE = 1,
1166 SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_MASK = 0x04,
1167 SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_SHIFT = 2,
1168
1169 SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_BYTE = 1,
1170 SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_MASK = 0x02,
1171 SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_SHIFT = 1,
1172
1173 SES_STATUS_POWER_SUPPLY_HOT_SWAP_BYTE = 2,
1174 SES_STATUS_POWER_SUPPLY_HOT_SWAP_MASK = 0x80,
1175 SES_STATUS_POWER_SUPPLY_HOT_SWAP_SHIFT = 7,
1176
1177 SES_STATUS_POWER_SUPPLY_FAIL_BYTE = 2,
1178 SES_STATUS_POWER_SUPPLY_FAIL_MASK = 0x40,
1179 SES_STATUS_POWER_SUPPLY_FAIL_SHIFT = 6,
1180
1181 SES_STATUS_POWER_SUPPLY_REQUESTED_ON_BYTE = 2,
1182 SES_STATUS_POWER_SUPPLY_REQUESTED_ON_MASK = 0x20,
1183 SES_STATUS_POWER_SUPPLY_REQUESTED_ON_SHIFT = 5,
1184
1185 SES_STATUS_POWER_SUPPLY_OFF_BYTE = 2,
1186 SES_STATUS_POWER_SUPPLY_OFF_MASK = 0x10,
1187 SES_STATUS_POWER_SUPPLY_OFF_SHIFT = 4,
1188
1189 SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_BYTE = 2,
1190 SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_MASK = 0x08,
1191 SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_SHIFT = 3,
1192
1193 SES_STATUS_POWER_SUPPLY_TEMP_WARN_BYTE = 2,
1194 SES_STATUS_POWER_SUPPLY_TEMP_WARN_MASK = 0x04,
1195 SES_STATUS_POWER_SUPPLY_TEMP_WARN_SHIFT = 2,
1196
1197 SES_STATUS_POWER_SUPPLY_AC_FAIL_BYTE = 2,
1198 SES_STATUS_POWER_SUPPLY_AC_FAIL_MASK = 0x02,
1199 SES_STATUS_POWER_SUPPLY_AC_FAIL_SHIFT = 1,
1200
1201 SES_STATUS_POWER_SUPPLY_DC_FAIL_BYTE = 2,
1202 SES_STATUS_POWER_SUPPLY_DC_FAIL_MASK = 0x01,
1203 SES_STATUS_POWER_SUPPLY_DC_FAIL_SHIFT = 0
1204 };
1205
1206 #define GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(LCASE, UCASE) \
1207 GEN_GETTER(ses_status_power_supply, SES_STATUS_POWER_SUPPLY, LCASE, UCASE)
1208 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ident, IDENT)
1209 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_voltage, DC_OVER_VOLTAGE)
1210 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_under_voltage, DC_UNDER_VOLTAGE)
1211 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_current, DC_OVER_CURRENT)
1212 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(hot_swap, HOT_SWAP)
1213 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(fail, FAIL)
1214 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(requested_on, REQUESTED_ON)
1215 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(off, OFF)
1216 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(overtmp_fail, OVERTMP_FAIL)
1217 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(temp_warn, TEMP_WARN)
1218 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ac_fail, AC_FAIL)
1219 GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_fail, DC_FAIL)
1220 #undef GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS
1221
1222 /*-------------------------- Cooling Status Element --------------------------*/
1223 struct ses_status_cooling {
1224 struct ses_status_common common;
1225 uint8_t bytes[3];
1226 };
1227
1228 enum ses_status_cooling_field_data {
1229 SES_STATUS_COOLING_IDENT_BYTE = 0,
1230 SES_STATUS_COOLING_IDENT_MASK = 0x80,
1231 SES_STATUS_COOLING_IDENT_SHIFT = 7,
1232
1233 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_BYTE = 0,
1234 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_MASK = 0x07,
1235 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_SHIFT = 0,
1236
1237 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_BYTE = 1,
1238 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_MASK = 0xFF,
1239 SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_SHIFT = 0,
1240
1241 SES_STATUS_COOLING_HOT_SWAP_BYTE = 2,
1242 SES_STATUS_COOLING_HOT_SWAP_MASK = 0x40,
1243 SES_STATUS_COOLING_HOT_SWAP_SHIFT = 6,
1244
1245 SES_STATUS_COOLING_FAIL_BYTE = 2,
1246 SES_STATUS_COOLING_FAIL_MASK = 0x40,
1247 SES_STATUS_COOLING_FAIL_SHIFT = 6,
1248
1249 SES_STATUS_COOLING_REQUESTED_ON_BYTE = 2,
1250 SES_STATUS_COOLING_REQUESTED_ON_MASK = 0x20,
1251 SES_STATUS_COOLING_REQUESTED_ON_SHIFT = 5,
1252
1253 SES_STATUS_COOLING_OFF_BYTE = 2,
1254 SES_STATUS_COOLING_OFF_MASK = 0x20,
1255 SES_STATUS_COOLING_OFF_SHIFT = 5,
1256
1257 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_BYTE = 2,
1258 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_MASK = 0x07,
1259 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_SHIFT = 2,
1260 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_STOPPED = 0x00,
1261 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_LOWEST = 0x01,
1262 SES_STATUS_COOLING_ACTUAL_SPEED_CODE_HIGHEST = 0x07
1263 };
1264
1265 #define GEN_SES_STATUS_COOLING_ACCESSORS(LCASE, UCASE) \
1266 GEN_GETTER(ses_status_cooling, SES_STATUS_COOLING, LCASE, UCASE)
GEN_SES_STATUS_COOLING_ACCESSORS(ident,IDENT)1267 GEN_SES_STATUS_COOLING_ACCESSORS(ident, IDENT)
1268 GEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_msb, ACTUAL_FAN_SPEED_MSB)
1269 GEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_lsb, ACTUAL_FAN_SPEED_LSB)
1270 GEN_SES_STATUS_COOLING_ACCESSORS(hot_swap, HOT_SWAP)
1271 GEN_SES_STATUS_COOLING_ACCESSORS(fail, FAIL)
1272 GEN_SES_STATUS_COOLING_ACCESSORS(requested_on, REQUESTED_ON)
1273 GEN_SES_STATUS_COOLING_ACCESSORS(off, OFF)
1274 GEN_SES_STATUS_COOLING_ACCESSORS(actual_speed_code, ACTUAL_SPEED_CODE)
1275 #undef GEN_SES_STATUS_COOLING_ACCESSORS
1276
1277 static inline int
1278 ses_status_cooling_get_actual_fan_speed(struct ses_status_cooling *elem)
1279 {
1280 return (ses_status_cooling_get_actual_fan_speed_msb(elem) << 8
1281 | ses_status_cooling_get_actual_fan_speed_lsb(elem));
1282 }
1283
1284 /*-------------------- Temperature Sensor Status Element ---------------------*/
1285 struct ses_status_temp_sensor {
1286 struct ses_status_common common;
1287 uint8_t bytes[3];
1288 };
1289
1290 enum ses_status_temp_sensor_field_data {
1291 SES_STATUS_TEMP_SENSOR_IDENT_BYTE = 0,
1292 SES_STATUS_TEMP_SENSOR_IDENT_MASK = 0x80,
1293 SES_STATUS_TEMP_SENSOR_IDENT_SHIFT = 7,
1294
1295 SES_STATUS_TEMP_SENSOR_FAIL_BYTE = 0,
1296 SES_STATUS_TEMP_SENSOR_FAIL_MASK = 0x40,
1297 SES_STATUS_TEMP_SENSOR_FAIL_SHIFT = 6,
1298
1299 SES_STATUS_TEMP_SENSOR_TEMPERATURE_BYTE = 1,
1300 SES_STATUS_TEMP_SENSOR_TEMPERATURE_MASK = 0xFF,
1301 SES_STATUS_TEMP_SENSOR_TEMPERATURE_SHIFT = 0,
1302
1303 SES_STATUS_TEMP_SENSOR_OT_FAILURE_BYTE = 2,
1304 SES_STATUS_TEMP_SENSOR_OT_FAILURE_MASK = 0x08,
1305 SES_STATUS_TEMP_SENSOR_OT_FAILURE_SHIFT = 3,
1306
1307 SES_STATUS_TEMP_SENSOR_OT_WARNING_BYTE = 2,
1308 SES_STATUS_TEMP_SENSOR_OT_WARNING_MASK = 0x04,
1309 SES_STATUS_TEMP_SENSOR_OT_WARNING_SHIFT = 2,
1310
1311 SES_STATUS_TEMP_SENSOR_UT_FAILURE_BYTE = 2,
1312 SES_STATUS_TEMP_SENSOR_UT_FAILURE_MASK = 0x02,
1313 SES_STATUS_TEMP_SENSOR_UT_FAILURE_SHIFT = 1,
1314
1315 SES_STATUS_TEMP_SENSOR_UT_WARNING_BYTE = 2,
1316 SES_STATUS_TEMP_SENSOR_UT_WARNING_MASK = 0x01,
1317 SES_STATUS_TEMP_SENSOR_UT_WARNING_SHIFT = 0
1318 };
1319
1320 #define GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(LCASE, UCASE) \
1321 GEN_GETTER(ses_status_temp_sensor, SES_STATUS_TEMP_SENSOR, LCASE, UCASE)
1322 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ident, IDENT)
1323 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(fail, FAIL)
1324 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(temperature, TEMPERATURE)
1325 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_failure, OT_FAILURE)
1326 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_warning, OT_WARNING)
1327 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_failure, UT_FAILURE)
1328 GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_warning, UT_WARNING)
1329 #undef GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS
1330
1331 /*------------------------- Door Lock Status Element -------------------------*/
1332 struct ses_status_door_lock {
1333 struct ses_status_common common;
1334 uint8_t bytes[3];
1335 };
1336
1337 enum ses_status_door_lock_field_data {
1338 SES_STATUS_DOOR_LOCK_IDENT_BYTE = 0,
1339 SES_STATUS_DOOR_LOCK_IDENT_MASK = 0x80,
1340 SES_STATUS_DOOR_LOCK_IDENT_SHIFT = 7,
1341
1342 SES_STATUS_DOOR_LOCK_FAIL_BYTE = 0,
1343 SES_STATUS_DOOR_LOCK_FAIL_MASK = 0x40,
1344 SES_STATUS_DOOR_LOCK_FAIL_SHIFT = 6,
1345
1346 SES_STATUS_DOOR_LOCK_UNLOCKED_BYTE = 2,
1347 SES_STATUS_DOOR_LOCK_UNLOCKED_MASK = 0x01,
1348 SES_STATUS_DOOR_LOCK_UNLOCKED_SHIFT = 0
1349 };
1350
1351 #define GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(LCASE, UCASE) \
1352 GEN_GETTER(ses_status_door_lock, SES_STATUS_DOOR_LOCK, LCASE, UCASE)
1353 GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(ident, IDENT)
1354 GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(fail, FAIL)
1355 GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(unlocked, UNLOCKED)
1356 #undef GEN_SES_STATUS_DOOR_LOCK_ACCESSORS
1357
1358 /*----------------------- Audible Alarm Status Element -----------------------*/
1359 struct ses_status_audible_alarm {
1360 struct ses_status_common common;
1361 uint8_t bytes[3];
1362 };
1363
1364 enum ses_status_audible_alarm_field_data {
1365 SES_STATUS_AUDIBLE_ALARM_IDENT_BYTE = 0,
1366 SES_STATUS_AUDIBLE_ALARM_IDENT_MASK = 0x80,
1367 SES_STATUS_AUDIBLE_ALARM_IDENT_SHIFT = 7,
1368
1369 SES_STATUS_AUDIBLE_ALARM_FAIL_BYTE = 0,
1370 SES_STATUS_AUDIBLE_ALARM_FAIL_MASK = 0x40,
1371 SES_STATUS_AUDIBLE_ALARM_FAIL_SHIFT = 6,
1372
1373 SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_BYTE = 2,
1374 SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_MASK = 0x80,
1375 SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_SHIFT = 7,
1376
1377 SES_STATUS_AUDIBLE_ALARM_MUTED_BYTE = 2,
1378 SES_STATUS_AUDIBLE_ALARM_MUTED_MASK = 0x40,
1379 SES_STATUS_AUDIBLE_ALARM_MUTED_SHIFT = 6,
1380
1381 SES_STATUS_AUDIBLE_ALARM_REMIND_BYTE = 2,
1382 SES_STATUS_AUDIBLE_ALARM_REMIND_MASK = 0x10,
1383 SES_STATUS_AUDIBLE_ALARM_REMIND_SHIFT = 4,
1384
1385 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_BYTE = 2,
1386 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_MASK = 0x0F,
1387 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_SHIFT = 0,
1388 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_INFO = 0x08,
1389 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_NON_CRIT = 0x04,
1390 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_CRIT = 0x02,
1391 SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_UNRECOV = 0x01
1392 };
1393
1394 #define GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE) \
1395 GEN_GETTER(ses_status_audible_alarm, SES_STATUS_AUDIBLE_ALARM, LCASE, UCASE)
1396 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(ident, IDENT)
1397 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(fail, FAIL)
1398 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(rqst_mute, RQST_MUTE)
1399 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(muted, MUTED)
1400 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(remind, REMIND)
1401 GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(tone_indicator, TONE_INDICATOR)
1402 #undef GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS
1403
1404 /*---------- Enclosure Services Statusler Electronics Status Element ---------*/
1405 struct ses_status_ecc_electronics {
1406 struct ses_status_common common;
1407 uint8_t bytes[3];
1408 };
1409
1410 enum ses_status_ecc_electronics_field_data {
1411 SES_STATUS_ECC_ELECTRONICS_IDENT_BYTE = 0,
1412 SES_STATUS_ECC_ELECTRONICS_IDENT_MASK = 0x80,
1413 SES_STATUS_ECC_ELECTRONICS_IDENT_SHIFT = 7,
1414
1415 SES_STATUS_ECC_ELECTRONICS_FAIL_BYTE = 0,
1416 SES_STATUS_ECC_ELECTRONICS_FAIL_MASK = 0x40,
1417 SES_STATUS_ECC_ELECTRONICS_FAIL_SHIFT = 6,
1418
1419 SES_STATUS_ECC_ELECTRONICS_REPORT_BYTE = 1,
1420 SES_STATUS_ECC_ELECTRONICS_REPORT_MASK = 0x01,
1421 SES_STATUS_ECC_ELECTRONICS_REPORT_SHIFT = 0,
1422
1423 SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_BYTE = 2,
1424 SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_MASK = 0x80,
1425 SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_SHIFT = 7
1426 };
1427
1428 #define GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \
1429 GEN_GETTER(ses_status_ecc_electronics, SES_STATUS_ECC_ELECTRONICS, \
1430 LCASE, UCASE)
1431 GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(ident, IDENT)
1432 GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(fail, FAIL)
1433 GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(report, REPORT)
1434 GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(hot_swap, HOT_SWAP)
1435 #undef GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS
1436
1437 /*------------ SCSI Services Statusler Electronics Status Element ------------*/
1438 struct ses_status_scc_electronics {
1439 struct ses_status_common common;
1440 uint8_t bytes[3];
1441 };
1442
1443 enum ses_status_scc_electronics_field_data {
1444 SES_STATUS_SCC_ELECTRONICS_IDENT_BYTE = 0,
1445 SES_STATUS_SCC_ELECTRONICS_IDENT_MASK = 0x80,
1446 SES_STATUS_SCC_ELECTRONICS_IDENT_SHIFT = 7,
1447
1448 SES_STATUS_SCC_ELECTRONICS_FAIL_BYTE = 0,
1449 SES_STATUS_SCC_ELECTRONICS_FAIL_MASK = 0x40,
1450 SES_STATUS_SCC_ELECTRONICS_FAIL_SHIFT = 6,
1451
1452 SES_STATUS_SCC_ELECTRONICS_REPORT_BYTE = 1,
1453 SES_STATUS_SCC_ELECTRONICS_REPORT_MASK = 0x01,
1454 SES_STATUS_SCC_ELECTRONICS_REPORT_SHIFT = 0
1455 };
1456
1457 #define GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE) \
1458 GEN_GETTER(ses_status_scc_electronics, SES_STATUS_SCC_ELECTRONICS, \
1459 LCASE, UCASE)
1460 GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(ident, IDENT)
1461 GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(fail, FAIL)
1462 GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(report, REPORT)
1463 #undef GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS
1464
1465 /*--------------------- Nonvolatile Cache Status Element ---------------------*/
1466 struct ses_status_nv_cache {
1467 struct ses_status_common common;
1468 uint8_t bytes[1];
1469 uint8_t cache_size[2];
1470 };
1471
1472 enum ses_status_nv_cache_field_data {
1473 SES_STATUS_NV_CACHE_IDENT_BYTE = 0,
1474 SES_STATUS_NV_CACHE_IDENT_MASK = 0x80,
1475 SES_STATUS_NV_CACHE_IDENT_SHIFT = 7,
1476
1477 SES_STATUS_NV_CACHE_FAIL_BYTE = 0,
1478 SES_STATUS_NV_CACHE_FAIL_MASK = 0x40,
1479 SES_STATUS_NV_CACHE_FAIL_SHIFT = 6,
1480
1481 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTE = 0,
1482 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MASK = 0x03,
1483 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_SHIFT = 0,
1484 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTES = 0x0,
1485 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_KBYTES = 0x1,
1486 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MBYTES = 0x2,
1487 SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_GBYTES = 0x3
1488 };
1489
1490 #define GEN_SES_STATUS_NV_CACHE_ACCESSORS(LCASE, UCASE) \
1491 GEN_GETTER(ses_status_nv_cache, SES_STATUS_NV_CACHE, LCASE, UCASE)
GEN_SES_STATUS_NV_CACHE_ACCESSORS(ident,IDENT)1492 GEN_SES_STATUS_NV_CACHE_ACCESSORS(ident, IDENT)
1493 GEN_SES_STATUS_NV_CACHE_ACCESSORS(fail, FAIL)
1494 GEN_SES_STATUS_NV_CACHE_ACCESSORS(size_multiplier, SIZE_MULTIPLIER)
1495 #undef GEN_SES_STATUS_NV_CACHE_ACCESSORS
1496
1497 static inline uintmax_t
1498 ses_status_nv_cache_get_cache_size(struct ses_status_nv_cache *elem)
1499 {
1500 uintmax_t cache_size;
1501 int multiplier;
1502
1503 /* Multiplier is in units of 2^10 */
1504 cache_size = scsi_2btoul(elem->cache_size);
1505 multiplier = 10 * ses_status_nv_cache_get_size_multiplier(elem);
1506 return (cache_size << multiplier);
1507 }
1508
1509 /*----------------- Invalid Operation Reason Status Element ------------------*/
1510 struct ses_status_invalid_op_reason {
1511 struct ses_status_common common;
1512 uint8_t bytes[3];
1513 };
1514
1515 enum ses_status_invalid_op_field_data {
1516 SES_STATUS_INVALID_OP_REASON_TYPE_BYTE = 0,
1517 SES_STATUS_INVALID_OP_REASON_TYPE_MASK = 0xC0,
1518 SES_STATUS_INVALID_OP_REASON_TYPE_SHIFT = 6,
1519 SES_STATUS_INVALID_OP_REASON_TYPE_PC_ERROR = 0x00,
1520 SES_STATUS_INVALID_OP_REASON_TYPE_PF_ERROR = 0x01,
1521 SES_STATUS_INVALID_OP_REASON_TYPE_VS_ERROR = 0x03,
1522
1523 SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_BYTE = 0,
1524 SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_MASK = 0x01,
1525 SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_SHIFT = 0,
1526
1527 SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_BYTE = 0,
1528 SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_MASK = 0x03,
1529 SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_SHIFT = 0
1530 };
1531
1532 #define GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(LCASE, UCASE) \
1533 GEN_GETTER(ses_status_invalid_op_reason, SES_STATUS_INVALID_OP_REASON, \
1534 LCASE, UCASE)
1535 GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(type, TYPE)
1536 GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pc_error_pc_not_supported,
1537 PC_ERROR_PC_NOT_SUPPORTED)
1538 GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pf_error_bit_number,
1539 PF_ERROR_BIT_NUMBER)
1540 #undef GEN_SES_STATUS_INVALID_OP_ACCESSORS
1541
1542 /*--------------- Uninterruptible Power Supply Status Element ----------------*/
1543 struct ses_status_ups {
1544 struct ses_status_common common;
1545 /* Minutes of remaining capacity. */
1546 uint8_t battery_status;
1547 uint8_t bytes[2];
1548 };
1549
1550 enum ses_status_ups_field_data {
1551 SES_STATUS_UPS_AC_LO_BYTE = 0,
1552 SES_STATUS_UPS_AC_LO_MASK = 0x80,
1553 SES_STATUS_UPS_AC_LO_SHIFT = 7,
1554
1555 SES_STATUS_UPS_AC_HI_BYTE = 0,
1556 SES_STATUS_UPS_AC_HI_MASK = 0x40,
1557 SES_STATUS_UPS_AC_HI_SHIFT = 6,
1558
1559 SES_STATUS_UPS_AC_QUAL_BYTE = 0,
1560 SES_STATUS_UPS_AC_QUAL_MASK = 0x20,
1561 SES_STATUS_UPS_AC_QUAL_SHIFT = 5,
1562
1563 SES_STATUS_UPS_AC_FAIL_BYTE = 0,
1564 SES_STATUS_UPS_AC_FAIL_MASK = 0x10,
1565 SES_STATUS_UPS_AC_FAIL_SHIFT = 4,
1566
1567 SES_STATUS_UPS_DC_FAIL_BYTE = 0,
1568 SES_STATUS_UPS_DC_FAIL_MASK = 0x08,
1569 SES_STATUS_UPS_DC_FAIL_SHIFT = 3,
1570
1571 SES_STATUS_UPS_UPS_FAIL_BYTE = 0,
1572 SES_STATUS_UPS_UPS_FAIL_MASK = 0x04,
1573 SES_STATUS_UPS_UPS_FAIL_SHIFT = 2,
1574
1575 SES_STATUS_UPS_WARN_BYTE = 0,
1576 SES_STATUS_UPS_WARN_MASK = 0x02,
1577 SES_STATUS_UPS_WARN_SHIFT = 1,
1578
1579 SES_STATUS_UPS_INTF_FAIL_BYTE = 0,
1580 SES_STATUS_UPS_INTF_FAIL_MASK = 0x01,
1581 SES_STATUS_UPS_INTF_FAIL_SHIFT = 0,
1582
1583 SES_STATUS_UPS_IDENT_BYTE = 0,
1584 SES_STATUS_UPS_IDENT_MASK = 0x80,
1585 SES_STATUS_UPS_IDENT_SHIFT = 7,
1586
1587 SES_STATUS_UPS_FAIL_BYTE = 1,
1588 SES_STATUS_UPS_FAIL_MASK = 0x40,
1589 SES_STATUS_UPS_FAIL_SHIFT = 6,
1590
1591 SES_STATUS_UPS_BATT_FAIL_BYTE = 1,
1592 SES_STATUS_UPS_BATT_FAIL_MASK = 0x02,
1593 SES_STATUS_UPS_BATT_FAIL_SHIFT = 1,
1594
1595 SES_STATUS_UPS_BPF_BYTE = 1,
1596 SES_STATUS_UPS_BPF_MASK = 0x01,
1597 SES_STATUS_UPS_BPF_SHIFT = 0
1598 };
1599
1600 #define GEN_SES_STATUS_UPS_ACCESSORS(LCASE, UCASE) \
1601 GEN_GETTER(ses_status_ups, SES_STATUS_UPS, LCASE, UCASE)
1602 GEN_SES_STATUS_UPS_ACCESSORS(ac_lo, AC_LO)
1603 GEN_SES_STATUS_UPS_ACCESSORS(ac_hi, AC_HI)
1604 GEN_SES_STATUS_UPS_ACCESSORS(ac_qual, AC_QUAL)
1605 GEN_SES_STATUS_UPS_ACCESSORS(ac_fail, AC_FAIL)
1606 GEN_SES_STATUS_UPS_ACCESSORS(dc_fail, DC_FAIL)
1607 GEN_SES_STATUS_UPS_ACCESSORS(ups_fail, UPS_FAIL)
1608 GEN_SES_STATUS_UPS_ACCESSORS(warn, WARN)
1609 GEN_SES_STATUS_UPS_ACCESSORS(intf_fail, INTF_FAIL)
1610 GEN_SES_STATUS_UPS_ACCESSORS(ident, IDENT)
1611 GEN_SES_STATUS_UPS_ACCESSORS(fail, FAIL)
1612 GEN_SES_STATUS_UPS_ACCESSORS(batt_fail, BATT_FAIL)
1613 GEN_SES_STATUS_UPS_ACCESSORS(bpf, BPF)
1614 #undef GEN_SES_STATUS_UPS_ACCESSORS
1615
1616 /*-------------------------- Display Status Element --------------------------*/
1617 struct ses_status_display {
1618 struct ses_status_common common;
1619 uint8_t bytes[1];
1620 uint8_t display_character[2];
1621 };
1622
1623 enum ses_status_display_field_data {
1624 SES_STATUS_DISPLAY_IDENT_BYTE = 0,
1625 SES_STATUS_DISPLAY_IDENT_MASK = 0x80,
1626 SES_STATUS_DISPLAY_IDENT_SHIFT = 7,
1627
1628 SES_STATUS_DISPLAY_FAIL_BYTE = 0,
1629 SES_STATUS_DISPLAY_FAIL_MASK = 0x40,
1630 SES_STATUS_DISPLAY_FAIL_SHIFT = 6,
1631
1632 SES_STATUS_DISPLAY_DISPLAY_MODE_BYTE = 0,
1633 SES_STATUS_DISPLAY_DISPLAY_MODE_MASK = 0x03,
1634 SES_STATUS_DISPLAY_DISPLAY_MODE_SHIFT = 6,
1635 SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_UNSUPP = 0x0,
1636 SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_SUPP = 0x1,
1637 SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD = 0x2
1638 };
1639
1640 #define GEN_SES_STATUS_DISPLAY_ACCESSORS(LCASE, UCASE) \
1641 GEN_GETTER(ses_status_display, SES_STATUS_DISPLAY, LCASE, UCASE)
1642 GEN_SES_STATUS_DISPLAY_ACCESSORS(ident, IDENT)
1643 GEN_SES_STATUS_DISPLAY_ACCESSORS(fail, FAIL)
1644 GEN_SES_STATUS_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE)
1645 #undef GEN_SES_STATUS_DISPLAY_ACCESSORS
1646
1647 /*----------------------- Key Pad Entry Status Element -----------------------*/
1648 struct ses_status_key_pad_entry {
1649 struct ses_status_common common;
1650 uint8_t bytes[3];
1651 };
1652
1653 enum ses_status_key_pad_entry_field_data {
1654 SES_STATUS_KEY_PAD_ENTRY_IDENT_BYTE = 0,
1655 SES_STATUS_KEY_PAD_ENTRY_IDENT_MASK = 0x80,
1656 SES_STATUS_KEY_PAD_ENTRY_IDENT_SHIFT = 7,
1657
1658 SES_STATUS_KEY_PAD_ENTRY_FAIL_BYTE = 0,
1659 SES_STATUS_KEY_PAD_ENTRY_FAIL_MASK = 0x40,
1660 SES_STATUS_KEY_PAD_ENTRY_FAIL_SHIFT = 6
1661 };
1662
1663 #define GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE) \
1664 GEN_GETTER(ses_status_key_pad_entry, SES_STATUS_KEY_PAD_ENTRY, LCASE, UCASE)
1665 GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(ident, IDENT)
1666 GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(fail, FAIL)
1667 #undef GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS
1668
1669 /*------------------------- Enclosure Status Element -------------------------*/
1670 struct ses_status_enclosure {
1671 struct ses_status_common common;
1672 uint8_t bytes[3];
1673 };
1674
1675 enum ses_status_enclosure_field_data {
1676 SES_STATUS_ENCLOSURE_IDENT_BYTE = 0,
1677 SES_STATUS_ENCLOSURE_IDENT_MASK = 0x80,
1678 SES_STATUS_ENCLOSURE_IDENT_SHIFT = 7,
1679
1680 SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_BYTE = 1,
1681 SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_MASK = 0xFC,
1682 SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_SHIFT = 2,
1683
1684 SES_STATUS_ENCLOSURE_FAIL_BYTE = 1,
1685 SES_STATUS_ENCLOSURE_FAIL_MASK = 0x02,
1686 SES_STATUS_ENCLOSURE_FAIL_SHIFT = 1,
1687
1688 SES_STATUS_ENCLOSURE_WARN_BYTE = 1,
1689 SES_STATUS_ENCLOSURE_WARN_MASK = 0x01,
1690 SES_STATUS_ENCLOSURE_WARN_SHIFT = 0,
1691
1692 SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_BYTE = 2,
1693 SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MASK = 0xFC,
1694 SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_SHIFT = 2,
1695 SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MAX_AUTO = 60,
1696 SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MANUAL = 63,
1697
1698 SES_STATUS_ENCLOSURE_REQUESTED_FAIL_BYTE = 2,
1699 SES_STATUS_ENCLOSURE_REQUESTED_FAIL_MASK = 0x02,
1700 SES_STATUS_ENCLOSURE_REQUESTED_FAIL_SHIFT = 1,
1701
1702 SES_STATUS_ENCLOSURE_REQUESTED_WARN_BYTE = 2,
1703 SES_STATUS_ENCLOSURE_REQUESTED_WARN_MASK = 0x01,
1704 SES_STATUS_ENCLOSURE_REQUESTED_WARN_SHIFT = 0
1705 };
1706
1707 #define GEN_SES_STATUS_ENCLOSURE_ACCESSORS(LCASE, UCASE) \
1708 GEN_GETTER(ses_status_enclosure, SES_STATUS_ENCLOSURE, LCASE, UCASE)
1709 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(ident, IDENT)
1710 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(time_until_power_cycle,
1711 TIME_UNTIL_POWER_CYCLE)
1712 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(fail, FAIL)
1713 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(warn, WARN)
1714 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_power_off_duration,
1715 REQUESTED_POWER_OFF_DURATION)
1716 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_fail, REQUESTED_FAIL)
1717 GEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_warn, REQUESTED_WARN)
1718 #undef GEN_SES_STATUS_ENCLOSURE_ACCESSORS
1719
1720 /*------------------- SCSI Port/Transceiver Status Element -------------------*/
1721 struct ses_status_scsi_port_or_xcvr {
1722 struct ses_status_common common;
1723 uint8_t bytes[3];
1724 };
1725
1726 enum ses_status_scsi_port_or_xcvr_field_data {
1727 SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_BYTE = 0,
1728 SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_MASK = 0x80,
1729 SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_SHIFT = 7,
1730
1731 SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_BYTE = 0,
1732 SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_MASK = 0x40,
1733 SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_SHIFT = 6,
1734
1735 SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_BYTE = 1,
1736 SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_MASK = 0x01,
1737 SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_SHIFT = 0,
1738
1739 SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_BYTE = 2,
1740 SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_MASK = 0x10,
1741 SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_SHIFT = 4,
1742
1743 SES_STATUS_SCSI_PORT_OR_XCVR_LOL_BYTE = 2,
1744 SES_STATUS_SCSI_PORT_OR_XCVR_LOL_MASK = 0x02,
1745 SES_STATUS_SCSI_PORT_OR_XCVR_LOL_SHIFT = 1,
1746
1747 SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_BYTE = 2,
1748 SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_MASK = 0x01,
1749 SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_SHIFT = 0
1750 };
1751
1752 #define GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE) \
1753 GEN_GETTER(ses_status_scsi_port_or_xcvr, SES_STATUS_SCSI_PORT_OR_XCVR,\
1754 LCASE, UCASE)
1755 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(ident, IDENT)
1756 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(fail, FAIL)
1757 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(report, REPORT)
1758 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(disable, DISABLED)
1759 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(lol, LOL)
1760 GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(xmit_fail, XMIT_FAIL)
1761 #undef GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS
1762
1763 /*------------------------- Language Status Element --------------------------*/
1764 struct ses_status_language {
1765 struct ses_status_common common;
1766 uint8_t bytes[1];
1767 uint8_t language_code[2];
1768 };
1769
1770 enum ses_status_language_field_data {
1771 SES_STATUS_LANGUAGE_IDENT_BYTE = 0,
1772 SES_STATUS_LANGUAGE_IDENT_MASK = 0x80,
1773 SES_STATUS_LANGUAGE_IDENT_SHIFT = 7
1774 };
1775
1776 #define GEN_SES_STATUS_LANGUAGE_ACCESSORS(LCASE, UCASE) \
1777 GEN_GETTER(ses_status_language, SES_STATUS_LANGUAGE, LCASE, UCASE)
1778 GEN_SES_STATUS_LANGUAGE_ACCESSORS(ident, IDENT)
1779 #undef GEN_SES_STATUS_LANGUAGE_ACCESSORS
1780
1781 /*-------------------- Communication Port Status Element ---------------------*/
1782 struct ses_status_comm_port {
1783 struct ses_status_common common;
1784 uint8_t bytes[3];
1785 };
1786
1787 enum ses_status_comm_port_field_data {
1788 SES_STATUS_COMM_PORT_IDENT_BYTE = 0,
1789 SES_STATUS_COMM_PORT_IDENT_MASK = 0x80,
1790 SES_STATUS_COMM_PORT_IDENT_SHIFT = 7,
1791
1792 SES_STATUS_COMM_PORT_FAIL_BYTE = 0,
1793 SES_STATUS_COMM_PORT_FAIL_MASK = 0x40,
1794 SES_STATUS_COMM_PORT_FAIL_SHIFT = 6,
1795
1796 SES_STATUS_COMM_PORT_DISABLED_BYTE = 2,
1797 SES_STATUS_COMM_PORT_DISABLED_MASK = 0x01,
1798 SES_STATUS_COMM_PORT_DISABLED_SHIFT = 0
1799 };
1800
1801 #define GEN_SES_STATUS_COMM_PORT_ACCESSORS(LCASE, UCASE) \
1802 GEN_GETTER(ses_status_comm_port, SES_STATUS_COMM_PORT, LCASE, UCASE)
1803 GEN_SES_STATUS_COMM_PORT_ACCESSORS(ident, IDENT)
1804 GEN_SES_STATUS_COMM_PORT_ACCESSORS(fail, FAIL)
1805 GEN_SES_STATUS_COMM_PORT_ACCESSORS(disabled, DISABLED)
1806 #undef GEN_SES_STATUS_COMM_PORT_ACCESSORS
1807
1808 /*---------------------- Voltage Sensor Status Element -----------------------*/
1809 struct ses_status_voltage_sensor {
1810 struct ses_status_common common;
1811 uint8_t bytes[1];
1812 uint8_t voltage[2];
1813 };
1814
1815 enum ses_status_voltage_sensor_field_data {
1816 SES_STATUS_VOLTAGE_SENSOR_IDENT_BYTE = 0,
1817 SES_STATUS_VOLTAGE_SENSOR_IDENT_MASK = 0x80,
1818 SES_STATUS_VOLTAGE_SENSOR_IDENT_SHIFT = 7,
1819
1820 SES_STATUS_VOLTAGE_SENSOR_FAIL_BYTE = 0,
1821 SES_STATUS_VOLTAGE_SENSOR_FAIL_MASK = 0x40,
1822 SES_STATUS_VOLTAGE_SENSOR_FAIL_SHIFT = 6,
1823
1824 SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_BYTE = 0,
1825 SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_MASK = 0x08,
1826 SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_SHIFT = 3,
1827
1828 SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_BYTE = 0,
1829 SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_MASK = 0x04,
1830 SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_SHIFT = 2,
1831
1832 SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_BYTE = 0,
1833 SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_MASK = 0x02,
1834 SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_SHIFT = 1,
1835
1836 SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_BYTE = 0,
1837 SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_MASK = 0x01,
1838 SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_SHIFT = 0
1839 };
1840
1841 #define GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE) \
1842 GEN_GETTER(ses_status_voltage_sensor, SES_STATUS_VOLTAGE_SENSOR, \
1843 LCASE, UCASE)
1844 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(ident, IDENT)
1845 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(fail, FAIL)
1846 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_over, WARN_OVER)
1847 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_under, WARN_UNDER)
1848 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_over, CRIT_OVER)
1849 GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_under, CRIT_UNDER)
1850 #undef GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS
1851
1852 /*---------------------- Current Sensor Status Element -----------------------*/
1853 struct ses_status_current_sensor {
1854 struct ses_status_common common;
1855 uint8_t bytes[3];
1856 };
1857
1858 enum ses_status_current_sensor_field_data {
1859 SES_STATUS_CURRENT_SENSOR_IDENT_BYTE = 0,
1860 SES_STATUS_CURRENT_SENSOR_IDENT_MASK = 0x80,
1861 SES_STATUS_CURRENT_SENSOR_IDENT_SHIFT = 7,
1862
1863 SES_STATUS_CURRENT_SENSOR_FAIL_BYTE = 0,
1864 SES_STATUS_CURRENT_SENSOR_FAIL_MASK = 0x40,
1865 SES_STATUS_CURRENT_SENSOR_FAIL_SHIFT = 6,
1866
1867 SES_STATUS_CURRENT_SENSOR_WARN_OVER_BYTE = 0,
1868 SES_STATUS_CURRENT_SENSOR_WARN_OVER_MASK = 0x08,
1869 SES_STATUS_CURRENT_SENSOR_WARN_OVER_SHIFT = 3,
1870
1871 SES_STATUS_CURRENT_SENSOR_CRIT_OVER_BYTE = 0,
1872 SES_STATUS_CURRENT_SENSOR_CRIT_OVER_MASK = 0x02,
1873 SES_STATUS_CURRENT_SENSOR_CRIT_OVER_SHIFT = 1
1874 };
1875
1876 #define GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE) \
1877 GEN_GETTER(ses_status_current_sensor, SES_STATUS_CURRENT_SENSOR, \
1878 LCASE, UCASE)
1879 GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(ident, IDENT)
1880 GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(fail, FAIL)
1881 GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(warn_over, WARN_OVER)
1882 GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(crit_over, CRIT_OVER)
1883 #undef GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS
1884
1885 /*--------------------- SCSI Target Port Status Element ----------------------*/
1886 struct ses_status_target_port {
1887 struct ses_status_common common;
1888 uint8_t bytes[3];
1889 };
1890
1891 enum ses_status_scsi_target_port_field_data {
1892 SES_STATUS_TARGET_PORT_IDENT_BYTE = 0,
1893 SES_STATUS_TARGET_PORT_IDENT_MASK = 0x80,
1894 SES_STATUS_TARGET_PORT_IDENT_SHIFT = 7,
1895
1896 SES_STATUS_TARGET_PORT_FAIL_BYTE = 0,
1897 SES_STATUS_TARGET_PORT_FAIL_MASK = 0x40,
1898 SES_STATUS_TARGET_PORT_FAIL_SHIFT = 6,
1899
1900 SES_STATUS_TARGET_PORT_REPORT_BYTE = 1,
1901 SES_STATUS_TARGET_PORT_REPORT_MASK = 0x01,
1902 SES_STATUS_TARGET_PORT_REPORT_SHIFT = 0,
1903
1904 SES_STATUS_TARGET_PORT_ENABLED_BYTE = 2,
1905 SES_STATUS_TARGET_PORT_ENABLED_MASK = 0x01,
1906 SES_STATUS_TARGET_PORT_ENABLED_SHIFT = 0
1907 };
1908
1909 #define GEN_SES_STATUS_TARGET_PORT_ACCESSORS(LCASE, UCASE) \
1910 GEN_GETTER(ses_status_target_port, SES_STATUS_TARGET_PORT, LCASE, UCASE)
1911 GEN_SES_STATUS_TARGET_PORT_ACCESSORS(ident, IDENT)
1912 GEN_SES_STATUS_TARGET_PORT_ACCESSORS(fail, FAIL)
1913 GEN_SES_STATUS_TARGET_PORT_ACCESSORS(report, REPORT)
1914 GEN_SES_STATUS_TARGET_PORT_ACCESSORS(enabled, ENABLED)
1915 #undef GEN_SES_STATUS_TARGET_PORT_ACCESSORS
1916
1917 /*-------------------- SCSI Initiator Port Status Element --------------------*/
1918 struct ses_status_initiator_port {
1919 struct ses_status_common common;
1920 uint8_t bytes[3];
1921 };
1922
1923 enum ses_status_scsi_initiator_port_field_data {
1924 SES_STATUS_INITIATOR_PORT_IDENT_BYTE = 0,
1925 SES_STATUS_INITIATOR_PORT_IDENT_MASK = 0x80,
1926 SES_STATUS_INITIATOR_PORT_IDENT_SHIFT = 7,
1927
1928 SES_STATUS_INITIATOR_PORT_FAIL_BYTE = 0,
1929 SES_STATUS_INITIATOR_PORT_FAIL_MASK = 0x40,
1930 SES_STATUS_INITIATOR_PORT_FAIL_SHIFT = 6,
1931
1932 SES_STATUS_INITIATOR_PORT_REPORT_BYTE = 1,
1933 SES_STATUS_INITIATOR_PORT_REPORT_MASK = 0x01,
1934 SES_STATUS_INITIATOR_PORT_REPORT_SHIFT = 0,
1935
1936 SES_STATUS_INITIATOR_PORT_ENABLED_BYTE = 2,
1937 SES_STATUS_INITIATOR_PORT_ENABLED_MASK = 0x01,
1938 SES_STATUS_INITIATOR_PORT_ENABLED_SHIFT = 0
1939 };
1940
1941 #define GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(LCASE, UCASE) \
1942 GEN_GETTER(ses_status_initiator_port, SES_STATUS_INITIATOR_PORT, \
1943 LCASE, UCASE)
1944 GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(ident, IDENT)
1945 GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(fail, FAIL)
1946 GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(report, REPORT)
1947 GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(enabled, ENABLED)
1948 #undef GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS
1949
1950 /*-------------------- Simple Subenclosure Status Element --------------------*/
1951 struct ses_status_simple_subses {
1952 struct ses_status_common common;
1953 uint8_t bytes[2];
1954 uint8_t short_enclosure_status;
1955 };
1956
1957 enum ses_status_simple_subses_field_data {
1958 SES_STATUS_SIMPlE_SUBSES_IDENT_BYTE = 0,
1959 SES_STATUS_SIMPlE_SUBSES_IDENT_MASK = 0x80,
1960 SES_STATUS_SIMPlE_SUBSES_IDENT_SHIFT = 7,
1961
1962 SES_STATUS_SIMPlE_SUBSES_FAIL_BYTE = 0,
1963 SES_STATUS_SIMPlE_SUBSES_FAIL_MASK = 0x40,
1964 SES_STATUS_SIMPlE_SUBSES_FAIL_SHIFT = 6
1965 };
1966
1967 #define GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE) \
1968 GEN_GETTER(ses_status_simple_subses, SES_STATUS_SIMPlE_SUBSES, \
1969 LCASE, UCASE)
1970 GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(ident, IDENT)
1971 GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(fail, FAIL)
1972 #undef GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS
1973
1974 /*----------------------- SAS Expander Status Element ------------------------*/
1975 struct ses_status_sas_expander {
1976 struct ses_status_common common;
1977 uint8_t bytes[3];
1978 };
1979
1980 enum ses_status_sas_expander_field_data {
1981 SES_STATUS_SAS_EXPANDER_IDENT_BYTE = 0,
1982 SES_STATUS_SAS_EXPANDER_IDENT_MASK = 0x80,
1983 SES_STATUS_SAS_EXPANDER_IDENT_SHIFT = 7,
1984
1985 SES_STATUS_SAS_EXPANDER_FAIL_BYTE = 0,
1986 SES_STATUS_SAS_EXPANDER_FAIL_MASK = 0x40,
1987 SES_STATUS_SAS_EXPANDER_FAIL_SHIFT = 6
1988 };
1989
1990 #define GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(LCASE, UCASE) \
1991 GEN_GETTER(ses_status_sas_expander, SES_STATUS_SAS_EXPANDER, LCASE, UCASE)
1992 GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(ident, IDENT)
1993 GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(fail, FAIL)
1994 #undef GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS
1995
1996 /*----------------------- SAS Connector Status Element -----------------------*/
1997 struct ses_status_sas_connector {
1998 struct ses_status_common common;
1999 uint8_t bytes[3];
2000 };
2001
2002 enum ses_status_sas_connector_field_data {
2003 SES_STATUS_SAS_CONNECTOR_IDENT_BYTE = 0,
2004 SES_STATUS_SAS_CONNECTOR_IDENT_MASK = 0x80,
2005 SES_STATUS_SAS_CONNECTOR_IDENT_SHIFT = 7,
2006
2007 SES_STATUS_SAS_CONNECTOR_TYPE_BYTE = 0,
2008 SES_STATUS_SAS_CONNECTOR_TYPE_MASK = 0x7F,
2009 SES_STATUS_SAS_CONNECTOR_TYPE_SHIFT = 0,
2010
2011 SES_STATUS_SAS_CONNECTOR_PHYS_LINK_BYTE = 1,
2012 SES_STATUS_SAS_CONNECTOR_PHYS_LINK_MASK = 0xFF,
2013 SES_STATUS_SAS_CONNECTOR_PHYS_LINK_SHIFT = 0,
2014 SES_STATUS_SAS_CONNECTOR_PHYS_LINK_ALL = 0xFF,
2015
2016 SES_STATUS_SAS_CONNECTOR_FAIL_BYTE = 2,
2017 SES_STATUS_SAS_CONNECTOR_FAIL_MASK = 0x40,
2018 SES_STATUS_SAS_CONNECTOR_FAIL_SHIFT = 6,
2019 };
2020
2021 #define GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE) \
2022 GEN_GETTER(ses_status_sas_connector, SES_STATUS_SAS_CONNECTOR, \
2023 LCASE, UCASE)
2024 GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(ident, IDENT)
2025 GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(type, TYPE)
2026 GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(phys_link, PHYS_LINK)
2027 GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(fail, FAIL)
2028 #undef GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS
2029
2030 /*------------------------- Universal Status Element -------------------------*/
2031 union ses_status_element {
2032 struct ses_status_common common;
2033 struct ses_status_dev_slot dev_slot;
2034 struct ses_status_array_dev_slot array_dev_slot;
2035 struct ses_status_power_supply power_supply;
2036 struct ses_status_cooling cooling;
2037 struct ses_status_temp_sensor temp_sensor;
2038 struct ses_status_door_lock door_lock;
2039 struct ses_status_audible_alarm audible_alarm;
2040 struct ses_status_ecc_electronics ecc_electronics;
2041 struct ses_status_scc_electronics scc_electronics;
2042 struct ses_status_nv_cache nv_cache;
2043 struct ses_status_invalid_op_reason invalid_op_reason;
2044 struct ses_status_ups ups;
2045 struct ses_status_display display;
2046 struct ses_status_key_pad_entry key_pad_entry;
2047 struct ses_status_scsi_port_or_xcvr scsi_port_or_xcvr;
2048 struct ses_status_language language;
2049 struct ses_status_comm_port comm_port;
2050 struct ses_status_voltage_sensor voltage_sensor;
2051 struct ses_status_current_sensor current_sensor;
2052 struct ses_status_target_port target_port;
2053 struct ses_status_initiator_port initiator_port;
2054 struct ses_status_simple_subses simple_subses;
2055 struct ses_status_sas_expander sas_expander;
2056 struct ses_status_sas_connector sas_connector;
2057 uint8_t bytes[4];
2058 };
2059
2060 /*
2061 * Convert element status into control as much as possible.
2062 * Some bits have different meaning in status and control,
2063 * while others have the same and should be preserved.
2064 */
2065 static inline void
ses_status_to_ctrl(uint8_t type,uint8_t * bytes)2066 ses_status_to_ctrl(uint8_t type, uint8_t *bytes)
2067 {
2068 /* Updated to SES4r5. */
2069 static const uint8_t mask[][4] = {
2070 { 0x60, 0x00, 0x00, 0x00 }, /* UNSPECIFIED */
2071 { 0x60, 0x00, 0x4e, 0x3c }, /* DEVICE */
2072 { 0x60, 0xc0, 0x00, 0x60 }, /* POWER */
2073 { 0x60, 0xc0, 0x00, 0x60 }, /* COOLING/FAN */
2074 { 0x60, 0xc0, 0x00, 0x80 }, /* THERM */
2075 { 0x60, 0xc0, 0x00, 0x01 }, /* DOORLOCK */
2076 { 0x60, 0xc0, 0x00, 0x5f }, /* ALARM */
2077 { 0x60, 0xf0, 0x01, 0x00 }, /* ESSC */
2078 { 0x60, 0xc0, 0x00, 0x00 }, /* SCC */
2079 { 0x60, 0xc0, 0x00, 0x00 }, /* NVRAM */
2080 { 0x60, 0x00, 0x00, 0x00 }, /* INV_OP_REASON */
2081 { 0x60, 0x00, 0x00, 0xe0 }, /* UPS */
2082 { 0x60, 0xc0, 0xff, 0xff }, /* DISPLAY */
2083 { 0x60, 0xc0, 0x00, 0x00 }, /* KEYPAD */
2084 { 0x60, 0x80, 0x00, 0xff }, /* ENCLOSURE */
2085 { 0x60, 0xc0, 0x00, 0x10 }, /* SCSIXVR */
2086 { 0x60, 0x80, 0xff, 0xff }, /* LANGUAGE */
2087 { 0x60, 0xc0, 0x00, 0x01 }, /* COMPORT */
2088 { 0x60, 0xc0, 0x00, 0x00 }, /* VOM */
2089 { 0x60, 0xc0, 0x00, 0x00 }, /* AMMETER */
2090 { 0x60, 0xc0, 0x00, 0x01 }, /* SCSI_TGT */
2091 { 0x60, 0xc0, 0x00, 0x01 }, /* SCSI_INI*/
2092 { 0x60, 0xc0, 0x00, 0x00 }, /* SUBENC */
2093 { 0x60, 0xff, 0x4e, 0x3c }, /* ARRAY_DEV */
2094 { 0x60, 0xc0, 0x00, 0x00 }, /* SAS_EXP */
2095 { 0x60, 0x80, 0x00, 0x40 }, /* SAS_CONN */
2096 };
2097
2098 if (type >= sizeof(mask) / sizeof(mask[0]))
2099 type = 0;
2100 for (int i = 0; i < 4; i++)
2101 bytes[i] &= mask[type][i];
2102 }
2103
2104 /*===================== SCSI SES Status Diagnostic Page =====================*/
2105 struct ses_status_page {
2106 struct ses_page_hdr hdr;
2107 union ses_status_element elements[];
2108 };
2109
2110 enum ses_status_page_field_data {
2111 SES_STATUS_PAGE_INVOP_MASK = 0x10,
2112 SES_STATUS_PAGE_INVOP_SHIFT = 4,
2113
2114 SES_STATUS_PAGE_INFO_MASK = 0x08,
2115 SES_STATUS_PAGE_INFO_SHIFT = 3,
2116
2117 SES_STATUS_PAGE_NON_CRIT_MASK = 0x04,
2118 SES_STATUS_PAGE_NON_CRIT_SHIFT = 2,
2119
2120 SES_STATUS_PAGE_CRIT_MASK = 0x02,
2121 SES_STATUS_PAGE_CRIT_SHIFT = 1,
2122
2123 SES_STATUS_PAGE_UNRECOV_MASK = 0x01,
2124 SES_STATUS_PAGE_UNRECOV_SHIFT = 0,
2125
2126 SES_STATUS_PAGE_CHANGED_MASK = SES_STATUS_PAGE_INVOP_MASK
2127 | SES_STATUS_PAGE_INFO_MASK
2128 | SES_STATUS_PAGE_NON_CRIT_MASK
2129 | SES_STATUS_PAGE_CRIT_MASK
2130 | SES_STATUS_PAGE_UNRECOV_MASK,
2131 SES_STATUS_PAGE_CHANGED_SHIFT = 0,
2132 };
2133
2134 #define GEN_SES_STATUS_PAGE_ACCESSORS(LCASE, UCASE) \
2135 GEN_HDR_ACCESSORS(ses_status_page, SES_STATUS_PAGE, LCASE, UCASE)
2136
2137 GEN_SES_STATUS_PAGE_ACCESSORS(invop, INVOP)
2138 GEN_SES_STATUS_PAGE_ACCESSORS(info, INFO)
2139 GEN_SES_STATUS_PAGE_ACCESSORS(non_crit, NON_CRIT)
2140 GEN_SES_STATUS_PAGE_ACCESSORS(crit, CRIT)
2141 GEN_SES_STATUS_PAGE_ACCESSORS(unrecov, UNRECOV)
2142 GEN_SES_STATUS_PAGE_ACCESSORS(changed, CHANGED)
2143 #undef GEN_SES_STATUS_PAGE_ACCESSORS
2144
2145 /*================ SCSI SES Element Descriptor Diagnostic Page ===============*/
2146 struct ses_elem_descr {
2147 uint8_t reserved[2];
2148 uint8_t length[2];
2149 char description[];
2150 };
2151
2152 struct ses_elem_descr_page {
2153 struct ses_page_hdr hdr;
2154 struct ses_elem_descr descrs[];
2155 };
2156
2157 /*============ SCSI SES Additional Element Status Diagnostic Page ============*/
2158 struct ses_addl_elem_status_page {
2159 struct ses_page_hdr hdr;
2160 };
2161
2162 /*====================== Legacy (Deprecated) Structures ======================*/
2163 struct ses_control_page_hdr {
2164 uint8_t page_code;
2165 uint8_t control_flags;
2166 uint8_t length[2];
2167 uint8_t gen_code[4];
2168 /* Followed by variable length array of descriptors. */
2169 };
2170
2171 struct ses_status_page_hdr {
2172 uint8_t page_code;
2173 uint8_t status_flags;
2174 uint8_t length[2];
2175 uint8_t gen_code[4];
2176 /* Followed by variable length array of descriptors. */
2177 };
2178
2179 /* ses_page_hdr.reserved values */
2180 /*
2181 * Enclosure Status Diagnostic Page:
2182 * uint8_t reserved : 3,
2183 * invop : 1,
2184 * info : 1,
2185 * noncritical : 1,
2186 * critical : 1,
2187 * unrecov : 1;
2188 */
2189 #define SES_ENCSTAT_UNRECOV 0x01
2190 #define SES_ENCSTAT_CRITICAL 0x02
2191 #define SES_ENCSTAT_NONCRITICAL 0x04
2192 #define SES_ENCSTAT_INFO 0x08
2193 #define SES_ENCSTAT_INVOP 0x10
2194 /* Status mask: All of the above OR'd together */
2195 #define SES_STATUS_MASK 0x1f
2196 #define SES_SET_STATUS_MASK 0xf
2197 /* Element Descriptor Diagnostic Page: unused */
2198 /* Additional Element Status Diagnostic Page: unused */
2199
2200 /* Summary SES Status Defines, Common Status Codes */
2201 #define SES_OBJSTAT_UNSUPPORTED 0
2202 #define SES_OBJSTAT_OK 1
2203 #define SES_OBJSTAT_CRIT 2
2204 #define SES_OBJSTAT_NONCRIT 3
2205 #define SES_OBJSTAT_UNRECOV 4
2206 #define SES_OBJSTAT_NOTINSTALLED 5
2207 #define SES_OBJSTAT_UNKNOWN 6
2208 #define SES_OBJSTAT_NOTAVAIL 7
2209 #define SES_OBJSTAT_NOACCESS 8
2210
2211 /*
2212 * For control pages, cstat[0] is the same for the
2213 * enclosure and is common across all device types.
2214 *
2215 * If SESCTL_CSEL is set, then PRDFAIL, DISABLE and RSTSWAP
2216 * are checked, otherwise bits that are specific to the device
2217 * type in the other 3 bytes of cstat or checked.
2218 */
2219 #define SESCTL_CSEL 0x80
2220 #define SESCTL_PRDFAIL 0x40
2221 #define SESCTL_DISABLE 0x20
2222 #define SESCTL_RSTSWAP 0x10
2223
2224 /* Control bits, Array Device Slot Elements, byte 1 */
2225 #define SESCTL_RQSOK 0x80 /* RQST OK */
2226 #define SESCTL_RQSRSV 0x40 /* RQST RSVD DEVICE */
2227 #define SESCTL_RQSSPR 0x20 /* RQST HOT SPARE */
2228 #define SESCTL_RQSCCH 0x10 /* RQST CONS CHECK */
2229 #define SESCTL_RQSCRA 0x08 /* RQST IN CRIT ARRAY */
2230 #define SESCTL_RQSFAA 0x04 /* RQST IN FAILED ARRAY */
2231 #define SESCTL_RQSRR 0x02 /* RQST REBUI/REMAP */
2232 #define SESCTL_RQSRRA 0x01 /* RQST R/R ABORT */
2233 /* Control bits, [Array] Device Slot Elements, byte 2 */
2234 #define SESCTL_RQSACT 0x80 /* RQST ACTIVE */
2235 #define SESCTL_DRVLCK 0x40 /* DO NOT REMOVE */
2236 #define SESCTL_RQSMSN 0x10 /* RQST MISSING */
2237 #define SESCTL_RQSINS 0x08 /* RQST INSERT */
2238 #define SESCTL_RQSRMV 0x04 /* RQST REMOVE */
2239 #define SESCTL_RQSID 0x02 /* RQST IDENT */
2240 /* Control bits, [Array] Device Slot Elements, byte 3 */
2241 #define SESCTL_RQSFLT 0x20 /* RQST FAULT */
2242 #define SESCTL_DEVOFF 0x10 /* DEVICE OFF */
2243 #define SESCTL_ENBYPA 0x08 /* ENABLE BYP A */
2244 #define SESCTL_ENBYPB 0x04 /* ENABLE BYP B */
2245
2246 /* Control bits, Generic, byte 3 */
2247 #define SESCTL_RQSTFAIL 0x40
2248 #define SESCTL_RQSTON 0x20
2249
2250 /*
2251 * Getting text for an object type is a little
2252 * trickier because it's string data that can
2253 * go up to 64 KBytes. Build this union and
2254 * fill the obj_id with the id of the object who's
2255 * help text you want, and if text is available,
2256 * obj_text will be filled in, null terminated.
2257 */
2258
2259 typedef union {
2260 unsigned int obj_id;
2261 char obj_text[1];
2262 } ses_hlptxt;
2263
2264 /*============================================================================*/
2265 struct ses_elm_desc_hdr {
2266 uint8_t reserved[2];
2267 uint8_t length[2];
2268 };
2269
2270 /*
2271 * SES v2 r20 6.1.13 - Element Additional Status diagnostic page
2272 * Tables 26-28 (general), 29-32 (FC), 33-41 (SAS)
2273 *
2274 * Protocol identifier uses definitions in scsi_all.h;
2275 * SPSP_PROTO_FC, SPSP_PROTO_SAS are the only ones used here.
2276 */
2277
2278 struct ses_elm_fc_eip_hdr {
2279 uint8_t num_phys;
2280 uint8_t reserved[2];
2281 uint8_t dev_slot_num;
2282 uint8_t node_name[8];
2283 };
2284
2285 struct ses_elm_fc_noneip_hdr {
2286 uint8_t num_phys;
2287 uint8_t reserved;
2288 uint8_t node_name[8];
2289 };
2290
2291 struct ses_elm_fc_base_hdr {
2292 uint8_t num_phys;
2293 };
2294
2295 union ses_elm_fc_hdr {
2296 struct ses_elm_fc_base_hdr base_hdr;
2297 struct ses_elm_fc_eip_hdr eip_hdr;
2298 struct ses_elm_fc_noneip_hdr noneip_hdr;
2299 };
2300
2301 struct ses_elm_fc_port {
2302 uint8_t port_loop_position;
2303 uint8_t bypass_reason;
2304 #define SES_FC_PORT_BYPASS_UNBYPASSED 0x00
2305
2306 #define SES_FC_PORT_BYPASS_LINKFAIL_RATE_TOO_HIGH 0x10
2307 #define SES_FC_PORT_BYPASS_SYNC_LOSS_RATE_TOO_HIGH 0x11
2308 #define SES_FC_PORT_BYPASS_SIGNAL_LOSS_RATE_TOO_HIGH 0x12
2309 #define SES_FC_PORT_BYPASS_SEQPROTO_ERR_RATE_TOO_HIGH 0x13
2310 #define SES_FC_PORT_BYPASS_INVAL_XMIT_RATE_TOO_HIGH 0x14
2311 #define SES_FC_PORT_BYPASS_CRC_ERR_RATE_TOO_HIGH 0x15
2312
2313 #define SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_BEGIN 0x16
2314 #define SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_END 0x1F
2315
2316 #define SES_FC_PORT_BYPASS_LINKFAIL_COUNT_TOO_HIGH 0x20
2317 #define SES_FC_PORT_BYPASS_SYNC_LOSS_COUNT_TOO_HIGH 0x21
2318 #define SES_FC_PORT_BYPASS_SIGNAL_LOSS_COUNT_TOO_HIGH 0x22
2319 #define SES_FC_PORT_BYPASS_SEQPROTO_ERR_COUNT_TOO_HIGH 0x23
2320 #define SES_FC_PORT_BYPASS_INVAL_XMIT_COUNT_TOO_HIGH 0x24
2321 #define SES_FC_PORT_BYPASS_CRC_ERR_COUNT_TOO_HIGH 0x25
2322
2323 #define SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_BEGIN 0x26
2324 #define SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_END 0x2F
2325
2326 #define SES_FC_PORT_BYPASS_RESERVED_BEGIN 0x30
2327 #define SES_FC_PORT_BYPASS_RESERVED_END 0xBF
2328
2329 #define SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_BEGIN 0xC0
2330 #define SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_END 0xFF
2331 uint8_t port_req_hard_addr;
2332 uint8_t n_port_id[3];
2333 uint8_t n_port_name[8];
2334 };
2335
2336 struct ses_elm_sas_device_phy {
2337 uint8_t byte0;
2338 /*
2339 * uint8_t reserved0 : 1,
2340 * uint8_t device_type : 3,
2341 * uint8_t reserved1 : 4;
2342 */
2343
2344 uint8_t reserved0;
2345
2346 /* Bit positions for initiator and target port protocols */
2347 #define SES_SASOBJ_DEV_PHY_SMP 0x2
2348 #define SES_SASOBJ_DEV_PHY_STP 0x4
2349 #define SES_SASOBJ_DEV_PHY_SSP 0x8
2350 /* Select all of the above protocols */
2351 #define SES_SASOBJ_DEV_PHY_PROTOMASK 0xe
2352 uint8_t initiator_ports;
2353 /*
2354 * uint8_t reserved0 : 4,
2355 * uint8_t ssp : 1,
2356 * uint8_t stp : 1,
2357 * uint8_t smp : 1,
2358 * uint8_t reserved1 : 3;
2359 */
2360 uint8_t target_ports;
2361 /*
2362 * uint8_t sata_port_selector : 1,
2363 * uint8_t reserved : 3,
2364 * uint8_t ssp : 1,
2365 * uint8_t stp : 1,
2366 * uint8_t smp : 1,
2367 * uint8_t sata_device : 1;
2368 */
2369 uint8_t parent_addr[8]; /* SAS address of parent */
2370 uint8_t phy_addr[8]; /* SAS address of this phy */
2371 uint8_t phy_id;
2372 uint8_t reserved1[7];
2373 };
2374 #ifdef _KERNEL
2375 int ses_elm_sas_dev_phy_sata_dev(struct ses_elm_sas_device_phy *);
2376 int ses_elm_sas_dev_phy_sata_port(struct ses_elm_sas_device_phy *);
2377 int ses_elm_sas_dev_phy_dev_type(struct ses_elm_sas_device_phy *);
2378 #endif /* _KERNEL */
2379
2380 struct ses_elm_sas_expander_phy {
2381 uint8_t connector_index;
2382 uint8_t other_index;
2383 };
2384
2385 struct ses_elm_sas_port_phy {
2386 uint8_t phy_id;
2387 uint8_t reserved;
2388 uint8_t connector_index;
2389 uint8_t other_index;
2390 uint8_t phy_addr[8];
2391 };
2392
2393 struct ses_elm_sas_type0_base_hdr {
2394 uint8_t num_phys;
2395 uint8_t byte1;
2396 /*
2397 * uint8_t descriptor_type : 2,
2398 * uint8_t reserved : 5,
2399 * uint8_t not_all_phys : 1;
2400 */
2401 #define SES_SASOBJ_TYPE0_NOT_ALL_PHYS(obj) \
2402 ((obj)->byte1 & 0x1)
2403 };
2404
2405 struct ses_elm_sas_type0_eip_hdr {
2406 struct ses_elm_sas_type0_base_hdr base;
2407 uint8_t reserved;
2408 uint8_t dev_slot_num;
2409 };
2410
2411 struct ses_elm_sas_type1_expander_hdr {
2412 uint8_t num_phys;
2413 uint8_t byte1;
2414 /*
2415 * uint8_t descriptor_type : 2,
2416 * uint8_t reserved : 6;
2417 */
2418 uint8_t reserved[2];
2419 uint8_t sas_addr[8];
2420 };
2421
2422 struct ses_elm_sas_type1_nonexpander_hdr {
2423 uint8_t num_phys;
2424 uint8_t byte1;
2425 /*
2426 * uint8_t descriptor_type : 2,
2427 * uint8_t reserved : 6;
2428 */
2429 uint8_t reserved[2];
2430 };
2431
2432 /* NB: This is only usable for as long as the headers happen to match */
2433 struct ses_elm_sas_base_hdr {
2434 uint8_t num_phys;
2435 uint8_t byte1;
2436 /*
2437 * uint8_t descriptor_type : 2,
2438 * uint8_t descr_specific : 6;
2439 */
2440 #define SES_SASOBJ_TYPE_SLOT 0
2441 #define SES_SASOBJ_TYPE_OTHER 1
2442 };
2443
2444 union ses_elm_sas_hdr {
2445 struct ses_elm_sas_base_hdr base_hdr;
2446 struct ses_elm_sas_type0_base_hdr type0_noneip;
2447 struct ses_elm_sas_type0_eip_hdr type0_eip;
2448 struct ses_elm_sas_type1_expander_hdr type1_exp;
2449 struct ses_elm_sas_type1_nonexpander_hdr type1_nonexp;
2450 };
2451 int ses_elm_sas_type0_not_all_phys(union ses_elm_sas_hdr *);
2452 int ses_elm_sas_descr_type(union ses_elm_sas_hdr *);
2453
2454 /*
2455 * This structure for SPSP_PROTO_ATA is not defined by SES specs,
2456 * but purely my own design to make AHCI EM interoperate with SES.
2457 * Since no other software I know can talk to SEMB, and we do not
2458 * expose this outside, it should be safe to do what we want.
2459 */
2460 struct ses_elm_ata_hdr {
2461 uint8_t bus[4];
2462 uint8_t target[4];
2463 };
2464
2465 struct ses_elm_addlstatus_base_hdr {
2466 uint8_t byte0;
2467 /*
2468 * uint8_t invalid : 1,
2469 * uint8_t reserved : 2,
2470 * uint8_t eip : 1,
2471 * uint8_t proto_id : 4;
2472 */
2473 uint8_t length;
2474 };
2475 int ses_elm_addlstatus_proto(struct ses_elm_addlstatus_base_hdr *);
2476 int ses_elm_addlstatus_eip(struct ses_elm_addlstatus_base_hdr *);
2477 int ses_elm_addlstatus_invalid(struct ses_elm_addlstatus_base_hdr *);
2478
2479 struct ses_elm_addlstatus_eip_hdr {
2480 struct ses_elm_addlstatus_base_hdr base;
2481 uint8_t byte2;
2482 #define SES_ADDL_EIP_EIIOE_MASK 3
2483 #define SES_ADDL_EIP_EIIOE_SES2 0
2484 #define SES_ADDL_EIP_EIIOE_GLOB 1
2485 #define SES_ADDL_EIP_EIIOE_IND 2
2486 #define SES_ADDL_EIP_EIIOE_MIX 3
2487 #define SES_ADDL_EIP_EIIOE_EI_GLOB(x) \
2488 (((x) & SES_ADDL_EIP_EIIOE_MASK) == SES_ADDL_EIP_EIIOE_GLOB)
2489 uint8_t element_index;
2490 /* NB: This define (currently) applies to all eip=1 headers */
2491 #define SES_EIP_HDR_EXTRA_LEN 2
2492 };
2493
2494 union ses_elm_addlstatus_descr_hdr {
2495 struct ses_elm_addlstatus_base_hdr base;
2496 struct ses_elm_addlstatus_eip_hdr eip;
2497 };
2498
2499 union ses_elm_addlstatus_proto_hdr {
2500 union ses_elm_fc_hdr fc;
2501 union ses_elm_sas_hdr sas;
2502 };
2503
2504 /*============================= Namespace Cleanup ============================*/
2505 #undef GEN_HDR_ACCESSORS
2506 #undef GEN_ACCESSORS
2507 #undef GEN_HDR_SETTER
2508 #undef GEN_HDR_GETTER
2509 #undef GEN_SETTER
2510 #undef GEN_GETTER
2511 #undef MK_ENUM
2512
2513 #endif /* _SCSI_SES_H_ */
2514