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