156027Smjacob/* $FreeBSD: stable/10/sys/cam/scsi/scsi_ses.h 309042 2016-11-23 09:10:45Z mav $ */
2139743Simp/*-
356027Smjacob * Copyright (c) 2000 by Matthew Jacob
456027Smjacob * All rights reserved.
556027Smjacob *
656027Smjacob * Redistribution and use in source and binary forms, with or without
756027Smjacob * modification, are permitted provided that the following conditions
856027Smjacob * are met:
956027Smjacob * 1. Redistributions of source code must retain the above copyright
1056027Smjacob *    notice, this list of conditions, and the following disclaimer,
1156027Smjacob *    without modification, immediately at the beginning of the file.
1256027Smjacob * 2. The name of the author may not be used to endorse or promote products
1356027Smjacob *    derived from this software without specific prior written permission.
1456027Smjacob *
1556027Smjacob * Alternatively, this software may be distributed under the terms of the
1656027Smjacob * the GNU Public License ("GPL").
1756027Smjacob *
1856027Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1956027Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2056027Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2156027Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2256027Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2356027Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2456027Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2556027Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2656027Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2756027Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2856027Smjacob * SUCH DAMAGE.
2956027Smjacob *
3056027Smjacob */
3156027Smjacob
32235911Smav#ifndef	_SCSI_SES_H_
33235911Smav#define	_SCSI_SES_H_
3456027Smjacob
35235911Smav#include <cam/scsi/scsi_all.h>
3656027Smjacob
37235911Smav/*========================== Field Extraction Macros =========================*/
38235911Smav#define MK_ENUM(S, F, SUFFIX) S ## _ ## F ## SUFFIX
3956027Smjacob
40235911Smav#define GEN_GETTER(LS, US, LF, UF)					    \
41235911Smavstatic inline int							    \
42235911SmavLS ## _get_ ## LF(struct LS *elem) {					    \
43235911Smav	return ((elem->bytes[MK_ENUM(US,UF,_BYTE)] & MK_ENUM(US,UF,_MASK))  \
44235911Smav	     >> MK_ENUM(US,UF,_SHIFT));					    \
45235911Smav}
4656027Smjacob
47235911Smav#define GEN_SETTER(LS, US, LF, UF)					    \
48235911Smavstatic inline void							    \
49235911SmavLS ## _set_ ## LF(struct LS *elem, int val) {				    \
50235911Smav	elem->bytes[MK_ENUM(US,UF,_BYTE)] &= ~MK_ENUM(US,UF,_MASK);	    \
51235911Smav	elem->bytes[MK_ENUM(US,UF,_BYTE)] |=				    \
52235911Smav	    (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK);	    \
53235911Smav}
5456027Smjacob
55235911Smav#define GEN_HDR_GETTER(LS, US, LF, UF)					    \
56235911Smavstatic inline int							    \
57235911SmavLS ## _get_ ## LF(struct LS *page) {					    \
58235911Smav	return ((page->hdr.page_specific_flags & MK_ENUM(US,UF,_MASK))	    \
59235911Smav	     >> MK_ENUM(US,UF,_SHIFT));					    \
60235911Smav}
61235911Smav
62235911Smav#define GEN_HDR_SETTER(LS, US, LF, UF)					    \
63235911Smavstatic inline void							    \
64235911SmavLS ## _set_ ## LF(struct LS *page, int val) {				    \
65235911Smav	page->hdr.page_specific_flags &= ~MK_ENUM(US,UF,_MASK);		    \
66235911Smav	page->hdr.page_specific_flags |=				    \
67235911Smav	    (val << MK_ENUM(US,UF,_SHIFT)) & MK_ENUM(US,UF,_MASK);	    \
68235911Smav}
69235911Smav
70235911Smav#define GEN_ACCESSORS(LS, US, LF, UF)					    \
71235911SmavGEN_GETTER(LS, US, LF, UF)						    \
72235911SmavGEN_SETTER(LS, US, LF, UF)
73235911Smav
74235911Smav#define GEN_HDR_ACCESSORS(LS, US, LF, UF)				    \
75235911SmavGEN_HDR_GETTER(LS, US, LF, UF)						    \
76235911SmavGEN_HDR_SETTER(LS, US, LF, UF)
77235911Smav
78235911Smav/*===============  Common SCSI ENC Diagnostic Page Structures ===============*/
79235911Smavstruct ses_page_hdr {
80235911Smav	uint8_t page_code;
81235911Smav	uint8_t page_specific_flags;
82235911Smav	uint8_t length[2];
83235911Smav	uint8_t gen_code[4];
84235911Smav};
85235911Smav
86235911Smavstatic inline size_t
87235911Smavses_page_length(const struct ses_page_hdr *hdr)
88235911Smav{
89235911Smav	/*
90235911Smav	 * The page length as received only accounts for bytes that
91235911Smav	 * follow the length field, namely starting with the generation
92235911Smav	 * code field.
93235911Smav	 */
94235911Smav	return (scsi_2btoul(hdr->length)
95235911Smav	      + offsetof(struct ses_page_hdr, gen_code));
96235911Smav}
97235911Smav
98235911Smav/*============= SCSI ENC Configuration Diagnostic Page Structures ============*/
99235911Smavstruct ses_enc_desc {
100235911Smav	uint8_t byte0;
101235911Smav	/*
102235911Smav	 * reserved0	: 1,
103235911Smav	 * rel_id	: 3,	relative enclosure process id
104235911Smav	 * reserved1	: 1,
105235911Smav	 * num_procs	: 3;	number of enclosure procesenc
106235911Smav	 */
107235911Smav	uint8_t	subenc_id;	/* Sub-enclosure Identifier */
108235911Smav	uint8_t	num_types;	/* # of supported types */
109235911Smav	uint8_t	length;		/* Enclosure Descriptor Length */
110235911Smav	uint8_t	logical_id[8];	/* formerly wwn */
111235911Smav	uint8_t	vendor_id[8];
112235911Smav	uint8_t	product_id[16];
113235911Smav	uint8_t	product_rev[4];
114235911Smav	uint8_t vendor_bytes[];
115235911Smav};
116235911Smav
117235911Smavstatic inline uint8_t *
118235911Smavses_enc_desc_last_byte(struct ses_enc_desc *encdesc)
119235911Smav{
120238740Smav	return (&encdesc->length + encdesc->length);
121235911Smav}
122235911Smav
123235911Smavstatic inline struct ses_enc_desc *
124235911Smavses_enc_desc_next(struct ses_enc_desc *encdesc)
125235911Smav{
126235911Smav	return ((struct ses_enc_desc *)(ses_enc_desc_last_byte(encdesc) + 1));
127235911Smav}
128235911Smav
129235911Smavstatic inline int
130235911Smavses_enc_desc_is_complete(struct ses_enc_desc *encdesc, uint8_t *last_buf_byte)
131235911Smav{
132235911Smav	return (&encdesc->length <= last_buf_byte
133235911Smav	     && ses_enc_desc_last_byte(encdesc) <= last_buf_byte);
134235911Smav}
135235911Smav
136235911Smavstruct ses_elm_type_desc {
137235911Smav	uint8_t	etype_elm_type;	/* type of element */
138235911Smav	uint8_t	etype_maxelt;	/* maximum supported */
139235911Smav	uint8_t	etype_subenc;	/* in sub-enclosure #n */
140235911Smav	uint8_t	etype_txt_len;	/* Type Descriptor Text Length */
141235911Smav};
142235911Smav
143235911Smavstruct ses_cfg_page {
144235911Smav	struct ses_page_hdr hdr;
145235911Smav	struct ses_enc_desc subencs[];
146235911Smav	/* type descriptors */
147235911Smav	/* type text */
148235911Smav};
149235911Smav
150235911Smavstatic inline int
151235911Smavses_cfg_page_get_num_subenc(struct ses_cfg_page *page)
152235911Smav{
153235911Smav	return (page->hdr.page_specific_flags + 1);
154235911Smav}
155235911Smav
156235911Smav
157235911Smav/*================ SCSI SES Control Diagnostic Page Structures ==============*/
158235911Smavstruct ses_ctrl_common {
159235911Smav	uint8_t bytes[1];
160235911Smav};
161235911Smav
162235911Smavenum ses_ctrl_common_field_data {
163235911Smav	SES_CTRL_COMMON_SELECT_BYTE		= 0,
164235911Smav	SES_CTRL_COMMON_SELECT_MASK		= 0x80,
165235911Smav	SES_CTRL_COMMON_SELECT_SHIFT		= 7,
166235911Smav
167235911Smav	SES_CTRL_COMMON_PRDFAIL_BYTE		= 0,
168235911Smav	SES_CTRL_COMMON_PRDFAIL_MASK		= 0x40,
169235911Smav	SES_CTRL_COMMON_PRDFAIL_SHIFT		= 6,
170235911Smav
171235911Smav	SES_CTRL_COMMON_DISABLE_BYTE		= 0,
172235911Smav	SES_CTRL_COMMON_DISABLE_MASK		= 0x20,
173235911Smav	SES_CTRL_COMMON_DISABLE_SHIFT		= 5,
174235911Smav
175235911Smav	SES_CTRL_COMMON_RST_SWAP_BYTE		= 0,
176235911Smav	SES_CTRL_COMMON_RST_SWAP_MASK		= 0x10,
177235911Smav	SES_CTRL_COMMON_RST_SWAP_SHIFT		= 4
178235911Smav};
179235911Smav
180235911Smav#define GEN_SES_CTRL_COMMON_ACCESSORS(LCASE, UCASE) \
181235911Smav    GEN_ACCESSORS(ses_ctrl_common, SES_CTRL_COMMON, LCASE, UCASE)
182235911SmavGEN_SES_CTRL_COMMON_ACCESSORS(select,   SELECT)
183235911SmavGEN_SES_CTRL_COMMON_ACCESSORS(prdfail,  PRDFAIL)
184235911SmavGEN_SES_CTRL_COMMON_ACCESSORS(disable,  DISABLE)
185235911SmavGEN_SES_CTRL_COMMON_ACCESSORS(rst_swap, RST_SWAP)
186235911Smav#undef GEN_SES_CTRL_COMMON_ACCESSORS
187235911Smav
188235911Smav/*------------------------ Device Slot Control Element ----------------------*/
189235911Smavstruct ses_ctrl_dev_slot {
190235911Smav	struct ses_ctrl_common common;
191235911Smav	uint8_t bytes[3];
192235911Smav};
193235911Smav
194235911Smavenum ses_ctrl_dev_slot_field_data {
195235911Smav	SES_CTRL_DEV_SLOT_RQST_ACTIVE_BYTE	= 1,
196235911Smav	SES_CTRL_DEV_SLOT_RQST_ACTIVE_MASK	= 0x80,
197235911Smav	SES_CTRL_DEV_SLOT_RQST_ACTIVE_SHIFT	= 7,
198235911Smav
199235911Smav	SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_BYTE	= 1,
200235911Smav	SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_MASK	= 0x40,
201235911Smav	SES_CTRL_DEV_SLOT_DO_NOT_REMOVE_SHIFT	= 6,
202235911Smav
203235911Smav	SES_CTRL_DEV_SLOT_RQST_MISSING_BYTE	= 1,
204235911Smav	SES_CTRL_DEV_SLOT_RQST_MISSING_MASK	= 0x10,
205235911Smav	SES_CTRL_DEV_SLOT_RQST_MISSING_SHIFT	= 4,
206235911Smav
207235911Smav	SES_CTRL_DEV_SLOT_RQST_INSERT_BYTE	= 1,
208235911Smav	SES_CTRL_DEV_SLOT_RQST_INSERT_MASK	= 0x08,
209235911Smav	SES_CTRL_DEV_SLOT_RQST_INSERT_SHIFT	= 3,
210235911Smav
211235911Smav	SES_CTRL_DEV_SLOT_RQST_REMOVE_BYTE	= 1,
212235911Smav	SES_CTRL_DEV_SLOT_RQST_REMOVE_MASK	= 0x04,
213235911Smav	SES_CTRL_DEV_SLOT_RQST_REMOVE_SHIFT	= 2,
214235911Smav
215235911Smav	SES_CTRL_DEV_SLOT_RQST_IDENT_BYTE	= 1,
216235911Smav	SES_CTRL_DEV_SLOT_RQST_IDENT_MASK	= 0x02,
217235911Smav	SES_CTRL_DEV_SLOT_RQST_IDENT_SHIFT	= 1,
218235911Smav
219235911Smav	SES_CTRL_DEV_SLOT_RQST_FAULT_BYTE	= 2,
220235911Smav	SES_CTRL_DEV_SLOT_RQST_FAULT_MASK	= 0x20,
221235911Smav	SES_CTRL_DEV_SLOT_RQST_FAULT_SHIFT	= 5,
222235911Smav
223235911Smav	SES_CTRL_DEV_SLOT_DEVICE_OFF_BYTE	= 2,
224235911Smav	SES_CTRL_DEV_SLOT_DEVICE_OFF_MASK	= 0x10,
225235911Smav	SES_CTRL_DEV_SLOT_DEVICE_OFF_SHIFT	= 4,
226235911Smav
227235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_A_BYTE	= 2,
228235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_A_MASK	= 0x08,
229235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_A_SHIFT	= 3,
230235911Smav
231235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_B_BYTE	= 2,
232235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_B_MASK	= 0x04,
233235911Smav	SES_CTRL_DEV_SLOT_ENABLE_BYP_B_SHIFT	= 2
234235911Smav};
235235911Smav#define GEN_SES_CTRL_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
236235911Smav    GEN_ACCESSORS(ses_ctrl_dev_slot, SES_CTRL_DEV_SLOT, LCASE, UCASE)
237235911Smav
238235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_active,   RQST_ACTIVE)
239235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(do_not_remove, DO_NOT_REMOVE)
240235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_missing,  RQST_MISSING)
241235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_insert,   RQST_INSERT)
242235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_remove,   RQST_REMOVE)
243235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_ident,    RQST_IDENT)
244235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(rqst_fault,    RQST_FAULT)
245235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(device_off,    DEVICE_OFF)
246235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_a,  ENABLE_BYP_A)
247235911SmavGEN_SES_CTRL_DEV_SLOT_ACCESSORS(enable_byp_b,  ENABLE_BYP_B)
248235911Smav#undef GEN_SES_CTRL_DEV_SLOT_ACCESSORS
249235911Smav
250235911Smav/*--------------------- Array Device Slot Control Element --------------------*/
251235911Smavstruct ses_ctrl_array_dev_slot {
252235911Smav	struct ses_ctrl_common common;
253235911Smav	uint8_t bytes[3];
254235911Smav};
255235911Smav
256235911Smavenum ses_ctrl_array_dev_slot_field_data {
257235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_BYTE			= 0,
258235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_MASK			= 0x80,
259235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_OK_SHIFT			= 7,
260235911Smav
261235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_BYTE		= 0,
262235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_MASK		= 0x40,
263235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_RSVD_DEVICE_SHIFT		= 6,
264235911Smav
265235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_BYTE		= 0,
266235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_MASK		= 0x20,
267235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_HOT_SPARE_SHIFT		= 5,
268235911Smav
269235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_BYTE		= 0,
270235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_MASK		= 0x10,
271235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_CONS_CHECK_SHIFT		= 4,
272235911Smav
273235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_BYTE		= 0,
274235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_MASK		= 0x08,
275235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_CRIT_ARRAY_SHIFT	= 3,
276235911Smav
277235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_BYTE	= 0,
278235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_MASK	= 0x04,
279235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_IN_FAILED_ARRAY_SHIFT	= 2,
280235911Smav
281235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_BYTE		= 0,
282235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_MASK		= 0x02,
283235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_SHIFT	= 1,
284235911Smav
285235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_BYTE	= 0,
286235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_MASK	= 0x01,
287235911Smav	SES_CTRL_ARRAY_DEV_SLOT_RQST_REBUILD_REMAP_ABORT_SHIFT	= 0
288235911Smav
289235911Smav	/*
290235911Smav	 * The remaining fields are identical to the device
291235911Smav	 * slot element type.  Access them through the device slot
292235911Smav	 * element type and its accessors.
293235911Smav	 */
294235911Smav};
295235911Smav#define GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE)		\
296235911Smav    GEN_ACCESSORS(ses_ctrl_array_dev_slot, SES_CTRL_ARRAY_DEV_SLOT,	\
297235911Smav		  LCASE, UCASE)
298235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_ok,             RQST_OK)
299235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rsvd_device,    RQST_RSVD_DEVICE)
300235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_hot_spare,      RQST_HOT_SPARE)
301235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_cons_check,     RQST_CONS_CHECK)
302235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_crit_array,  RQST_IN_CRIT_ARRAY)
303235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_in_failed_array,
304235911Smav				      RQST_IN_FAILED_ARRAY)
305235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap,  RQST_REBUILD_REMAP)
306235911SmavGEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS(rqst_rebuild_remap_abort,
307235911Smav				      RQST_REBUILD_REMAP_ABORT)
308235911Smav#undef GEN_SES_CTRL_ARRAY_DEV_SLOT_ACCESSORS
309235911Smav
310235911Smav/*----------------------- Power Supply Control Element -----------------------*/
311235911Smavstruct ses_ctrl_power_supply {
312235911Smav	struct ses_ctrl_common common;
313235911Smav	uint8_t bytes[3];
314235911Smav};
315235911Smav
316235911Smavenum ses_ctrl_power_supply_field_data {
317235911Smav	SES_CTRL_POWER_SUPPLY_RQST_IDENT_BYTE	= 0,
318235911Smav	SES_CTRL_POWER_SUPPLY_RQST_IDENT_MASK	= 0x80,
319235911Smav	SES_CTRL_POWER_SUPPLY_RQST_IDENT_SHIFT	= 7,
320235911Smav
321235911Smav	SES_CTRL_POWER_SUPPLY_RQST_FAIL_BYTE	= 2,
322235911Smav	SES_CTRL_POWER_SUPPLY_RQST_FAIL_MASK	= 0x40,
323235911Smav	SES_CTRL_POWER_SUPPLY_RQST_FAIL_SHIFT	= 6,
324235911Smav
325235911Smav	SES_CTRL_POWER_SUPPLY_RQST_ON_BYTE	= 2,
326235911Smav	SES_CTRL_POWER_SUPPLY_RQST_ON_MASK	= 0x20,
327235911Smav	SES_CTRL_POWER_SUPPLY_RQST_ON_SHIFT	= 5
328235911Smav};
329235911Smav
330235911Smav#define GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(LCASE, UCASE)	\
331235911Smav    GEN_ACCESSORS(ses_ctrl_power_supply, SES_CTRL_POWER_SUPPLY, LCASE, UCASE)
332235911SmavGEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_ident, RQST_IDENT)
333235911SmavGEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_fail,  RQST_FAIL)
334235911SmavGEN_SES_CTRL_POWER_SUPPLY_ACCESSORS(rqst_on,    RQST_ON)
335235911Smav#undef GEN_SES_CTRL_POWER_SUPPLY_ACCESSORS
336235911Smav
337235911Smav/*-------------------------- Cooling Control Element -------------------------*/
338235911Smavstruct ses_ctrl_cooling {
339235911Smav	struct ses_ctrl_common common;
340235911Smav	uint8_t bytes[3];
341235911Smav};
342235911Smav
343235911Smavenum ses_ctrl_cooling_field_data {
344235911Smav	SES_CTRL_COOLING_RQST_IDENT_BYTE		= 0,
345235911Smav	SES_CTRL_COOLING_RQST_IDENT_MASK		= 0x80,
346235911Smav	SES_CTRL_COOLING_RQST_IDENT_SHIFT		= 7,
347235911Smav
348235911Smav	SES_CTRL_COOLING_RQST_FAIL_BYTE			= 2,
349235911Smav	SES_CTRL_COOLING_RQST_FAIL_MASK			= 0x40,
350235911Smav	SES_CTRL_COOLING_RQST_FAIL_SHIFT		= 6,
351235911Smav
352235911Smav	SES_CTRL_COOLING_RQST_ON_BYTE			= 2,
353235911Smav	SES_CTRL_COOLING_RQST_ON_MASK			= 0x20,
354235911Smav	SES_CTRL_COOLING_RQST_ON_SHIFT			= 5,
355235911Smav
356235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_BYTE		= 2,
357235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_MASK		= 0x07,
358235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_SHIFT	= 2,
359235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_UNCHANGED	= 0x00,
360235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_LOWEST	= 0x01,
361235911Smav	SES_CTRL_COOLING_RQSTED_SPEED_CODE_HIGHEST	= 0x07
362235911Smav};
363235911Smav
364235911Smav#define GEN_SES_CTRL_COOLING_ACCESSORS(LCASE, UCASE)	\
365235911Smav    GEN_ACCESSORS(ses_ctrl_cooling, SES_CTRL_COOLING, LCASE, UCASE)
366235911SmavGEN_SES_CTRL_COOLING_ACCESSORS(rqst_ident,        RQST_IDENT)
367235911SmavGEN_SES_CTRL_COOLING_ACCESSORS(rqst_fail,         RQST_FAIL)
368235911SmavGEN_SES_CTRL_COOLING_ACCESSORS(rqst_on,           RQST_ON)
369235911SmavGEN_SES_CTRL_COOLING_ACCESSORS(rqsted_speed_code, RQSTED_SPEED_CODE)
370235911Smav#undef GEN_SES_CTRL_COOLING_ACCESSORS
371235911Smav
372235911Smav/*-------------------- Temperature Sensor Control Element --------------------*/
373235911Smavstruct ses_ctrl_temp_sensor {
374235911Smav	struct ses_ctrl_common common;
375235911Smav	uint8_t bytes[3];
376235911Smav};
377235911Smav
378235911Smavenum ses_ctrl_temp_sensor_field_data {
379235911Smav	SES_CTRL_TEMP_SENSOR_RQST_IDENT_BYTE	= 0,
380235911Smav	SES_CTRL_TEMP_SENSOR_RQST_IDENT_MASK	= 0x80,
381235911Smav	SES_CTRL_TEMP_SENSOR_RQST_IDENT_SHIFT	= 7,
382235911Smav
383235911Smav	SES_CTRL_TEMP_SENSOR_RQST_FAIL_BYTE	= 0,
384235911Smav	SES_CTRL_TEMP_SENSOR_RQST_FAIL_MASK	= 0x40,
385235911Smav	SES_CTRL_TEMP_SENSOR_RQST_FAIL_SHIFT	= 6
386235911Smav};
387235911Smav
388235911Smav#define GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(LCASE, UCASE)	\
389235911Smav    GEN_ACCESSORS(ses_ctrl_temp_sensor, SES_CTRL_TEMP_SENSOR, LCASE, UCASE)
390235911SmavGEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
391235911SmavGEN_SES_CTRL_TEMP_SENSOR_ACCESSORS(rqst_fail,  RQST_FAIL)
392235911Smav#undef GEN_SES_CTRL_TEMP_SENSOR_ACCESSORS
393235911Smav
394235911Smav/*------------------------- Door Lock Control Element ------------------------*/
395235911Smavstruct ses_ctrl_door_lock {
396235911Smav	struct ses_ctrl_common common;
397235911Smav	uint8_t bytes[3];
398235911Smav};
399235911Smav
400235911Smavenum ses_ctrl_door_lock_field_data {
401235911Smav	SES_CTRL_DOOR_LOCK_RQST_IDENT_BYTE	= 0,
402235911Smav	SES_CTRL_DOOR_LOCK_RQST_IDENT_MASK	= 0x80,
403235911Smav	SES_CTRL_DOOR_LOCK_RQST_IDENT_SHIFT	= 7,
404235911Smav
405235911Smav	SES_CTRL_DOOR_LOCK_RQST_FAIL_BYTE	= 0,
406235911Smav	SES_CTRL_DOOR_LOCK_RQST_FAIL_MASK	= 0x40,
407235911Smav	SES_CTRL_DOOR_LOCK_RQST_FAIL_SHIFT	= 6,
408235911Smav
409235911Smav	SES_CTRL_DOOR_LOCK_UNLOCK_BYTE		= 2,
410235911Smav	SES_CTRL_DOOR_LOCK_UNLOCK_MASK		= 0x01,
411235911Smav	SES_CTRL_DOOR_LOCK_UNLOCK_SHIFT		= 0
412235911Smav};
413235911Smav
414235911Smav#define GEN_SES_CTRL_DOOR_LOCK_ACCESSORS(LCASE, UCASE)	\
415235911Smav    GEN_ACCESSORS(ses_ctrl_door_lock, SES_CTRL_DOOR_LOCK, LCASE, UCASE)
416235911SmavGEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_ident, RQST_IDENT)
417235911SmavGEN_SES_CTRL_DOOR_LOCK_ACCESSORS(rqst_fail,  RQST_FAIL)
418235911SmavGEN_SES_CTRL_DOOR_LOCK_ACCESSORS(unlock,     UNLOCK)
419235911Smav#undef GEN_SES_CTRL_DOOR_LOCK_ACCESSORS
420235911Smav
421235911Smav/*----------------------- Audible Alarm Control Element ----------------------*/
422235911Smavstruct ses_ctrl_audible_alarm {
423235911Smav	struct ses_ctrl_common common;
424235911Smav	uint8_t bytes[3];
425235911Smav};
426235911Smav
427235911Smavenum ses_ctrl_audible_alarm_field_data {
428235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_BYTE		= 0,
429235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_MASK		= 0x80,
430235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_IDENT_SHIFT		= 7,
431235911Smav
432235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_BYTE		= 0,
433235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_MASK		= 0x40,
434235911Smav	SES_CTRL_AUDIBLE_ALARM_RQST_FAIL_SHIFT		= 6,
435235911Smav
436235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_MUTE_BYTE		= 2,
437235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_MUTE_MASK		= 0x40,
438235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_MUTE_SHIFT		= 6,
439235911Smav
440235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_REMIND_BYTE		= 2,
441235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_REMIND_MASK		= 0x10,
442235911Smav	SES_CTRL_AUDIBLE_ALARM_SET_REMIND_SHIFT		= 4,
443235911Smav
444235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_BYTE	= 2,
445235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_MASK	= 0x0F,
446235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_SHIFT	= 0,
447235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_INFO	= 0x08,
448235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_NON_CRIT	= 0x04,
449235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_CRIT	= 0x02,
450235911Smav	SES_CTRL_AUDIBLE_ALARM_TONE_CONTROL_UNRECOV	= 0x01
451235911Smav};
452235911Smav
453235911Smav#define GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE)	\
454235911Smav    GEN_ACCESSORS(ses_ctrl_audible_alarm, SES_CTRL_AUDIBLE_ALARM, LCASE, UCASE)
455235911SmavGEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_ident,   RQST_IDENT)
456235911SmavGEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(rqst_fail,    RQST_FAIL)
457235911SmavGEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_mute,     SET_MUTE)
458235911SmavGEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(set_remind,   SET_REMIND)
459235911SmavGEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS(tone_control, TONE_CONTROL)
460235911Smav#undef GEN_SES_CTRL_AUDIBLE_ALARM_ACCESSORS
461235911Smav
462235911Smav/*--------- Enclosure Services Controller Electronics Control Element --------*/
463235911Smavstruct ses_ctrl_ecc_electronics {
464235911Smav	struct ses_ctrl_common common;
465235911Smav	uint8_t bytes[3];
466235911Smav};
467235911Smav
468235911Smavenum ses_ctrl_ecc_electronics_field_data {
469235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_BYTE	= 0,
470235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_MASK	= 0x80,
471235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_IDENT_SHIFT	= 7,
472235911Smav
473235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_BYTE		= 0,
474235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_MASK		= 0x40,
475235911Smav	SES_CTRL_ECC_ELECTRONICS_RQST_FAIL_SHIFT	= 6,
476235911Smav
477235911Smav	SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_BYTE	= 1,
478235911Smav	SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_MASK	= 0x01,
479235911Smav	SES_CTRL_ECC_ELECTRONICS_SELECT_ELEMENT_SHIFT	= 0
480235911Smav};
481235911Smav
482235911Smav#define GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE)		\
483235911Smav    GEN_ACCESSORS(ses_ctrl_ecc_electronics, SES_CTRL_ECC_ELECTRONICS,	\
484235911Smav		  LCASE, UCASE)
485235911SmavGEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_ident,     RQST_IDENT)
486235911SmavGEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(rqst_fail,      RQST_FAIL)
487235911SmavGEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS(select_element, SELECT_ELEMENT)
488235911Smav#undef GEN_SES_CTRL_ECC_ELECTRONICS_ACCESSORS
489235911Smav
490235911Smav/*----------- SCSI Services Controller Electronics Control Element -----------*/
491235911Smavstruct ses_ctrl_scc_electronics {
492235911Smav	struct ses_ctrl_common common;
493235911Smav	uint8_t bytes[3];
494235911Smav};
495235911Smav
496235911Smavenum ses_ctrl_scc_electronics_field_data {
497235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_BYTE	= 0,
498235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_MASK	= 0x80,
499235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_IDENT_SHIFT	= 7,
500235911Smav
501235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_BYTE		= 0,
502235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_MASK		= 0x40,
503235911Smav	SES_CTRL_SCC_ELECTRONICS_RQST_FAIL_SHIFT	= 6
504235911Smav};
505235911Smav
506235911Smav#define GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE)		\
507235911Smav    GEN_ACCESSORS(ses_ctrl_scc_electronics, SES_CTRL_SCC_ELECTRONICS,	\
508235911Smav		  LCASE, UCASE)
509235911SmavGEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_ident, RQST_IDENT)
510235911SmavGEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS(rqst_fail,  RQST_FAIL)
511235911Smav#undef GEN_SES_CTRL_SCC_ELECTRONICS_ACCESSORS
512235911Smav
513235911Smav/*--------------------- Nonvolatile Cache Control Element --------------------*/
514235911Smavstruct ses_ctrl_nv_cache {
515235911Smav	struct ses_ctrl_common common;
516235911Smav	uint8_t bytes[3];
517235911Smav};
518235911Smav
519235911Smavenum ses_ctrl_nv_cache_field_data {
520235911Smav	SES_CTRL_NV_CACHE_RQST_IDENT_BYTE	= 0,
521235911Smav	SES_CTRL_NV_CACHE_RQST_IDENT_MASK	= 0x80,
522235911Smav	SES_CTRL_NV_CACHE_RQST_IDENT_SHIFT	= 7,
523235911Smav
524235911Smav	SES_CTRL_NV_CACHE_RQST_FAIL_BYTE	= 0,
525235911Smav	SES_CTRL_NV_CACHE_RQST_FAIL_MASK	= 0x40,
526235911Smav	SES_CTRL_NV_CACHE_RQST_FAIL_SHIFT	= 6
527235911Smav};
528235911Smav
529235911Smav#define GEN_SES_CTRL_NV_CACHE_ACCESSORS(LCASE, UCASE)		\
530235911Smav    GEN_ACCESSORS(ses_ctrl_nv_cache, SES_CTRL_NV_CACHE,	LCASE, UCASE)
531235911SmavGEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_ident, RQST_IDENT)
532235911SmavGEN_SES_CTRL_NV_CACHE_ACCESSORS(rqst_fail,  RQST_FAIL)
533235911Smav#undef GEN_SES_CTRL_NV_CACHE_ACCESSORS
534235911Smav
535235911Smav/*----------------- Invalid Operation Reason Control Element -----------------*/
536235911Smavstruct ses_ctrl_invalid_op_reason {
537235911Smav	struct ses_ctrl_common common;
538235911Smav	uint8_t bytes[3];
539235911Smav};
540235911Smav
541235911Smav/* There are no element specific fields currently defined in the spec. */
542235911Smav
543235911Smav/*--------------- Uninterruptible Power Supply Control Element ---------------*/
544235911Smavstruct ses_ctrl_ups {
545235911Smav	struct ses_ctrl_common common;
546235911Smav	uint8_t bytes[3];
547235911Smav};
548235911Smav
549235911Smavenum ses_ctrl_ups_field_data {
550235911Smav	SES_CTRL_UPS_RQST_IDENT_BYTE	= 2,
551235911Smav	SES_CTRL_UPS_RQST_IDENT_MASK	= 0x80,
552235911Smav	SES_CTRL_UPS_RQST_IDENT_SHIFT	= 7,
553235911Smav
554235911Smav	SES_CTRL_UPS_RQST_FAIL_BYTE	= 2,
555235911Smav	SES_CTRL_UPS_RQST_FAIL_MASK	= 0x40,
556235911Smav	SES_CTRL_UPS_RQST_FAIL_SHIFT	= 6
557235911Smav};
558235911Smav
559235911Smav#define GEN_SES_CTRL_UPS_ACCESSORS(LCASE, UCASE)	\
560235911Smav    GEN_ACCESSORS(ses_ctrl_ups, SES_CTRL_UPS, LCASE, UCASE)
561235911SmavGEN_SES_CTRL_UPS_ACCESSORS(rqst_ident, RQST_IDENT)
562235911SmavGEN_SES_CTRL_UPS_ACCESSORS(rqst_fail,  RQST_FAIL)
563235911Smav#undef GEN_SES_CTRL_UPS_ACCESSORS
564235911Smav
565235911Smav/*-------------------------- Display Control Element -------------------------*/
566235911Smavstruct ses_ctrl_display {
567235911Smav	struct ses_ctrl_common common;
568235911Smav	uint8_t bytes[1];
569235911Smav	uint8_t display_character[2];
570235911Smav};
571235911Smav
572235911Smavenum ses_ctrl_display_field_data {
573235911Smav	SES_CTRL_DISPLAY_RQST_IDENT_BYTE	= 0,
574235911Smav	SES_CTRL_DISPLAY_RQST_IDENT_MASK	= 0x80,
575235911Smav	SES_CTRL_DISPLAY_RQST_IDENT_SHIFT	= 7,
576235911Smav
577235911Smav	SES_CTRL_DISPLAY_RQST_FAIL_BYTE		= 0,
578235911Smav	SES_CTRL_DISPLAY_RQST_FAIL_MASK		= 0x40,
579235911Smav	SES_CTRL_DISPLAY_RQST_FAIL_SHIFT	= 6,
580235911Smav
581235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_BYTE	= 0,
582235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_MASK	= 0x03,
583235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_SHIFT	= 6,
584235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_UNCHANGED = 0x0,
585235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_ESP	= 0x1,
586235911Smav	SES_CTRL_DISPLAY_DISPLAY_MODE_DC_FIELD	= 0x2
587235911Smav};
588235911Smav
589235911Smav#define GEN_SES_CTRL_DISPLAY_ACCESSORS(LCASE, UCASE)	\
590235911Smav    GEN_ACCESSORS(ses_ctrl_display, SES_CTRL_DISPLAY, LCASE, UCASE)
591235911SmavGEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_ident,   RQST_IDENT)
592235911SmavGEN_SES_CTRL_DISPLAY_ACCESSORS(rqst_fail,    RQST_FAIL)
593235911SmavGEN_SES_CTRL_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE)
594235911Smav#undef GEN_SES_CTRL_DISPLAY_ACCESSORS
595235911Smav
596235911Smav/*----------------------- Key Pad Entry Control Element ----------------------*/
597235911Smavstruct ses_ctrl_key_pad_entry {
598235911Smav	struct ses_ctrl_common common;
599235911Smav	uint8_t bytes[3];
600235911Smav};
601235911Smav
602235911Smavenum ses_ctrl_key_pad_entry_field_data {
603235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_BYTE	= 0,
604235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_MASK	= 0x80,
605235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_IDENT_SHIFT	= 7,
606235911Smav
607235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_BYTE	= 0,
608235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_MASK	= 0x40,
609235911Smav	SES_CTRL_KEY_PAD_ENTRY_RQST_FAIL_SHIFT	= 6
610235911Smav};
611235911Smav
612235911Smav#define GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE)	\
613235911Smav    GEN_ACCESSORS(ses_ctrl_key_pad_entry, SES_CTRL_KEY_PAD_ENTRY, LCASE, UCASE)
614235911SmavGEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_ident,   RQST_IDENT)
615235911SmavGEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS(rqst_fail,    RQST_FAIL)
616235911Smav#undef GEN_SES_CTRL_KEY_PAD_ENTRY_ACCESSORS
617235911Smav
618235911Smav/*------------------------- Enclosure Control Element ------------------------*/
619235911Smavstruct ses_ctrl_enclosure {
620235911Smav	struct ses_ctrl_common common;
621235911Smav	uint8_t bytes[3];
622235911Smav};
623235911Smav
624235911Smavenum ses_ctrl_enclosure_field_data {
625235911Smav	SES_CTRL_ENCLOSURE_RQST_IDENT_BYTE		= 0,
626235911Smav	SES_CTRL_ENCLOSURE_RQST_IDENT_MASK		= 0x80,
627235911Smav	SES_CTRL_ENCLOSURE_RQST_IDENT_SHIFT		= 7,
628235911Smav
629235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_BYTE	= 1,
630235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_MASK	= 0xC0,
631235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_SHIFT	= 6,
632235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_NONE	= 0x0,
633235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_AFTER_DELAY	= 0x1,
634235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_RQST_CANCEL	= 0x2,
635235911Smav
636235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_BYTE	= 1,
637235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MASK	= 0x3F,
638235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_SHIFT	= 0,
639235911Smav	SES_CTRL_ENCLOSURE_POWER_CYCLE_DELAY_MAX	= 60,/*minutes*/
640235911Smav
641235911Smav	SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_BYTE	= 2,
642235911Smav	SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MASK	= 0xFC,
643235911Smav	SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_SHIFT	= 2,
644235911Smav	SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MAX_AUTO	= 60,
645235911Smav	SES_CTRL_ENCLOSURE_POWER_OFF_DURATION_MANUAL	= 63,
646235911Smav
647235911Smav	SES_CTRL_ENCLOSURE_RQST_FAIL_BYTE		= 2,
648235911Smav	SES_CTRL_ENCLOSURE_RQST_FAIL_MASK		= 0x02,
649235911Smav	SES_CTRL_ENCLOSURE_RQST_FAIL_SHIFT		= 1,
650235911Smav
651235911Smav	SES_CTRL_ENCLOSURE_RQST_WARN_BYTE		= 2,
652235911Smav	SES_CTRL_ENCLOSURE_RQST_WARN_MASK		= 0x01,
653235911Smav	SES_CTRL_ENCLOSURE_RQST_WARN_SHIFT		= 0
654235911Smav};
655235911Smav
656235911Smav#define GEN_SES_CTRL_ENCLOSURE_ACCESSORS(LCASE, UCASE)		\
657235911Smav    GEN_ACCESSORS(ses_ctrl_enclosure, SES_CTRL_ENCLOSURE, LCASE, UCASE)
658235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_ident,         RQST_IDENT)
659235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_rqst,   POWER_CYCLE_RQST)
660235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_cycle_delay,  POWER_CYCLE_DELAY)
661235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(power_off_duration, POWER_OFF_DURATION)
662235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_fail,          RQST_FAIL)
663235911SmavGEN_SES_CTRL_ENCLOSURE_ACCESSORS(rqst_warn,          RQST_WARN)
664235911Smav#undef GEN_SES_CTRL_ENCLOSURE_ACCESSORS
665235911Smav
666235911Smav/*------------------- SCSI Port/Transceiver Control Element ------------------*/
667235911Smavstruct ses_ctrl_scsi_port_or_xcvr {
668235911Smav	struct ses_ctrl_common common;
669235911Smav	uint8_t bytes[3];
670235911Smav};
671235911Smav
672235911Smavenum ses_ctrl_scsi_port_or_xcvr_field_data {
673235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_BYTE	= 0,
674235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_MASK	= 0x80,
675235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_IDENT_SHIFT	= 7,
676235911Smav
677235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_BYTE	= 0,
678235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_MASK	= 0x40,
679235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_RQST_FAIL_SHIFT	= 6,
680235911Smav
681235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_BYTE		= 2,
682235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_MASK		= 0x10,
683235911Smav	SES_CTRL_SCSI_PORT_OR_XCVR_DISABLE_SHIFT	= 4
684235911Smav};
685235911Smav
686235911Smav#define GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE)		 \
687235911Smav    GEN_ACCESSORS(ses_ctrl_scsi_port_or_xcvr, SES_CTRL_SCSI_PORT_OR_XCVR,\
688235911Smav		  LCASE, UCASE)
689235911SmavGEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_ident, RQST_IDENT)
690235911SmavGEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(disable,    DISABLE)
691235911SmavGEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS(rqst_fail,  RQST_FAIL)
692235911Smav#undef GEN_SES_CTRL_SCSI_PORT_OR_XCVR_ACCESSORS
693235911Smav
694235911Smav/*------------------------- Language Control Element -------------------------*/
695235911Smavstruct ses_ctrl_language {
696235911Smav	struct ses_ctrl_common common;
697235911Smav	uint8_t bytes[1];
698235911Smav	uint8_t language_code[2];
699235911Smav};
700235911Smav
701235911Smavenum ses_ctrl_language_field_data {
702235911Smav	SES_CTRL_LANGUAGE_RQST_IDENT_BYTE	= 0,
703235911Smav	SES_CTRL_LANGUAGE_RQST_IDENT_MASK	= 0x80,
704235911Smav	SES_CTRL_LANGUAGE_RQST_IDENT_SHIFT	= 7
705235911Smav};
706235911Smav
707235911Smav#define GEN_SES_CTRL_LANGUAGE_ACCESSORS(LCASE, UCASE)		 \
708235911Smav    GEN_ACCESSORS(ses_ctrl_language, SES_CTRL_LANGUAGE, LCASE, UCASE)
709235911SmavGEN_SES_CTRL_LANGUAGE_ACCESSORS(rqst_ident, RQST_IDENT)
710235911Smav#undef GEN_SES_CTRL_LANGUAGE_ACCESSORS
711235911Smav
712235911Smav/*-------------------- Communication Port Control Element --------------------*/
713235911Smavstruct ses_ctrl_comm_port {
714235911Smav	struct ses_ctrl_common common;
715235911Smav	uint8_t bytes[3];
716235911Smav};
717235911Smav
718235911Smavenum ses_ctrl_comm_port_field_data {
719235911Smav	SES_CTRL_COMM_PORT_RQST_IDENT_BYTE	= 0,
720235911Smav	SES_CTRL_COMM_PORT_RQST_IDENT_MASK	= 0x80,
721235911Smav	SES_CTRL_COMM_PORT_RQST_IDENT_SHIFT	= 7,
722235911Smav
723235911Smav	SES_CTRL_COMM_PORT_RQST_FAIL_BYTE	= 0,
724235911Smav	SES_CTRL_COMM_PORT_RQST_FAIL_MASK	= 0x40,
725235911Smav	SES_CTRL_COMM_PORT_RQST_FAIL_SHIFT	= 6,
726235911Smav
727235911Smav	SES_CTRL_COMM_PORT_DISABLE_BYTE		= 2,
728235911Smav	SES_CTRL_COMM_PORT_DISABLE_MASK		= 0x01,
729235911Smav	SES_CTRL_COMM_PORT_DISABLE_SHIFT	= 0
730235911Smav};
731235911Smav
732235911Smav#define GEN_SES_CTRL_COMM_PORT_ACCESSORS(LCASE, UCASE)		 \
733235911Smav    GEN_ACCESSORS(ses_ctrl_comm_port, SES_CTRL_COMM_PORT, LCASE, UCASE)
734235911SmavGEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
735235911SmavGEN_SES_CTRL_COMM_PORT_ACCESSORS(rqst_fail,  RQST_FAIL)
736235911SmavGEN_SES_CTRL_COMM_PORT_ACCESSORS(disable,    DISABLE)
737235911Smav#undef GEN_SES_CTRL_COMM_PORT_ACCESSORS
738235911Smav
739235911Smav/*---------------------- Voltage Sensor Control Element ----------------------*/
740235911Smavstruct ses_ctrl_voltage_sensor {
741235911Smav	struct ses_ctrl_common common;
742235911Smav	uint8_t bytes[3];
743235911Smav};
744235911Smav
745235911Smavenum ses_ctrl_voltage_sensor_field_data {
746235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_BYTE		= 0,
747235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_MASK		= 0x80,
748235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_IDENT_SHIFT	= 7,
749235911Smav
750235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_BYTE		= 0,
751235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_MASK		= 0x40,
752235911Smav	SES_CTRL_VOLTAGE_SENSOR_RQST_FAIL_SHIFT		= 6
753235911Smav};
754235911Smav
755235911Smav#define GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE)		\
756235911Smav    GEN_ACCESSORS(ses_ctrl_voltage_sensor, SES_CTRL_VOLTAGE_SENSOR,	\
757235911Smav		  LCASE, UCASE)
758235911SmavGEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
759235911SmavGEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS(rqst_fail,  RQST_FAIL)
760235911Smav#undef GEN_SES_CTRL_VOLTAGE_SENSOR_ACCESSORS
761235911Smav
762235911Smav/*---------------------- Current Sensor Control Element ----------------------*/
763235911Smavstruct ses_ctrl_current_sensor {
764235911Smav	struct ses_ctrl_common common;
765235911Smav	uint8_t bytes[3];
766235911Smav};
767235911Smav
768235911Smavenum ses_ctrl_current_sensor_field_data {
769235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_IDENT_BYTE		= 0,
770235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_IDENT_MASK		= 0x80,
771235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_IDENT_SHIFT	= 7,
772235911Smav
773235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_FAIL_BYTE		= 0,
774235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_FAIL_MASK		= 0x40,
775235911Smav	SES_CTRL_CURRENT_SENSOR_RQST_FAIL_SHIFT		= 6
776235911Smav};
777235911Smav
778235911Smav#define GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE)		\
779235911Smav    GEN_ACCESSORS(ses_ctrl_current_sensor, SES_CTRL_CURRENT_SENSOR,	\
780235911Smav		  LCASE, UCASE)
781235911SmavGEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_ident, RQST_IDENT)
782235911SmavGEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS(rqst_fail,  RQST_FAIL)
783235911Smav#undef GEN_SES_CTRL_CURRENT_SENSOR_ACCESSORS
784235911Smav
785235911Smav/*--------------------- SCSI Target Port Control Element ---------------------*/
786235911Smavstruct ses_ctrl_target_port {
787235911Smav	struct ses_ctrl_common common;
788235911Smav	uint8_t bytes[3];
789235911Smav};
790235911Smav
791235911Smavenum ses_ctrl_scsi_target_port_field_data {
792235911Smav	SES_CTRL_TARGET_PORT_RQST_IDENT_BYTE	= 0,
793235911Smav	SES_CTRL_TARGET_PORT_RQST_IDENT_MASK	= 0x80,
794235911Smav	SES_CTRL_TARGET_PORT_RQST_IDENT_SHIFT	= 7,
795235911Smav
796235911Smav	SES_CTRL_TARGET_PORT_RQST_FAIL_BYTE	= 0,
797235911Smav	SES_CTRL_TARGET_PORT_RQST_FAIL_MASK	= 0x40,
798235911Smav	SES_CTRL_TARGET_PORT_RQST_FAIL_SHIFT	= 6,
799235911Smav
800235911Smav	SES_CTRL_TARGET_PORT_ENABLE_BYTE	= 2,
801235911Smav	SES_CTRL_TARGET_PORT_ENABLE_MASK	= 0x01,
802235911Smav	SES_CTRL_TARGET_PORT_ENABLE_SHIFT	= 0
803235911Smav};
804235911Smav
805235911Smav#define GEN_SES_CTRL_TARGET_PORT_ACCESSORS(LCASE, UCASE)	\
806235911Smav    GEN_ACCESSORS(ses_ctrl_target_port, SES_CTRL_TARGET_PORT, LCASE, UCASE)
807235911SmavGEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
808235911SmavGEN_SES_CTRL_TARGET_PORT_ACCESSORS(rqst_fail,  RQST_FAIL)
809235911SmavGEN_SES_CTRL_TARGET_PORT_ACCESSORS(enable,     ENABLE)
810235911Smav#undef GEN_SES_CTRL_TARGET_PORT_ACCESSORS
811235911Smav
812235911Smav/*-------------------- SCSI Initiator Port Control Element -------------------*/
813235911Smavstruct ses_ctrl_initiator_port {
814235911Smav	struct ses_ctrl_common common;
815235911Smav	uint8_t bytes[3];
816235911Smav};
817235911Smav
818235911Smavenum ses_ctrl_initiator_port_field_data {
819235911Smav	SES_CTRL_INITIATOR_PORT_RQST_IDENT_BYTE		= 0,
820235911Smav	SES_CTRL_INITIATOR_PORT_RQST_IDENT_MASK		= 0x80,
821235911Smav	SES_CTRL_INITIATOR_PORT_RQST_IDENT_SHIFT	= 7,
822235911Smav
823235911Smav	SES_CTRL_INITIATOR_PORT_RQST_FAIL_BYTE		= 0,
824235911Smav	SES_CTRL_INITIATOR_PORT_RQST_FAIL_MASK		= 0x40,
825235911Smav	SES_CTRL_INITIATOR_PORT_RQST_FAIL_SHIFT		= 6,
826235911Smav
827235911Smav	SES_CTRL_INITIATOR_PORT_ENABLE_BYTE		= 2,
828235911Smav	SES_CTRL_INITIATOR_PORT_ENABLE_MASK		= 0x01,
829235911Smav	SES_CTRL_INITIATOR_PORT_ENABLE_SHIFT		= 0
830235911Smav};
831235911Smav
832235911Smav#define GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(LCASE, UCASE)		\
833235911Smav    GEN_ACCESSORS(ses_ctrl_initiator_port, SES_CTRL_INITIATOR_PORT,	\
834235911Smav		  LCASE, UCASE)
835235911SmavGEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_ident, RQST_IDENT)
836235911SmavGEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(rqst_fail,  RQST_FAIL)
837235911SmavGEN_SES_CTRL_INITIATOR_PORT_ACCESSORS(enable,     ENABLE)
838235911Smav#undef GEN_SES_CTRL_INITIATOR_PORT_ACCESSORS
839235911Smav
840235911Smav/*-------------------- Simple Subenclosure Control Element -------------------*/
841235911Smavstruct ses_ctrl_simple_subenc {
842235911Smav	struct ses_ctrl_common common;
843235911Smav	uint8_t bytes[3];
844235911Smav};
845235911Smav
846235911Smavenum ses_ctrl_simple_subenc_field_data {
847235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_BYTE	= 0,
848235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_MASK	= 0x80,
849235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_IDENT_SHIFT	= 7,
850235911Smav
851235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_BYTE	= 0,
852235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_MASK	= 0x40,
853235911Smav	SES_CTRL_SIMPlE_SUBSES_RQST_FAIL_SHIFT	= 6
854235911Smav};
855235911Smav
856235911Smav#define GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE)		\
857235911Smav    GEN_ACCESSORS(ses_ctrl_simple_subenc, SES_CTRL_SIMPlE_SUBSES,	\
858235911Smav		  LCASE, UCASE)
859235911SmavGEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_ident, RQST_IDENT)
860235911SmavGEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS(rqst_fail,  RQST_FAIL)
861235911Smav#undef GEN_SES_CTRL_SIMPlE_SUBSES_ACCESSORS
862235911Smav
863235911Smav/*----------------------- SAS Expander Control Element -----------------------*/
864235911Smavstruct ses_ctrl_sas_expander {
865235911Smav	struct ses_ctrl_common common;
866235911Smav	uint8_t bytes[3];
867235911Smav};
868235911Smav
869235911Smavenum ses_ctrl_sas_expander_field_data {
870235911Smav	SES_CTRL_SAS_EXPANDER_RQST_IDENT_BYTE	= 0,
871235911Smav	SES_CTRL_SAS_EXPANDER_RQST_IDENT_MASK	= 0x80,
872235911Smav	SES_CTRL_SAS_EXPANDER_RQST_IDENT_SHIFT	= 7,
873235911Smav
874235911Smav	SES_CTRL_SAS_EXPANDER_RQST_FAIL_BYTE	= 0,
875235911Smav	SES_CTRL_SAS_EXPANDER_RQST_FAIL_MASK	= 0x40,
876235911Smav	SES_CTRL_SAS_EXPANDER_RQST_FAIL_SHIFT	= 6
877235911Smav};
878235911Smav
879235911Smav#define GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(LCASE, UCASE)	\
880235911Smav    GEN_ACCESSORS(ses_ctrl_sas_expander, SES_CTRL_SAS_EXPANDER,	LCASE, UCASE)
881235911SmavGEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_ident, RQST_IDENT)
882235911SmavGEN_SES_CTRL_SAS_EXPANDER_ACCESSORS(rqst_fail,  RQST_FAIL)
883235911Smav#undef GEN_SES_CTRL_SAS_EXPANDER_ACCESSORS
884235911Smav
885235911Smav/*----------------------- SAS Connector Control Element ----------------------*/
886235911Smavstruct ses_ctrl_sas_connector {
887235911Smav	struct ses_ctrl_common common;
888235911Smav	uint8_t bytes[3];
889235911Smav};
890235911Smav
891235911Smavenum ses_ctrl_sas_connector_field_data {
892235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_IDENT_BYTE		= 0,
893235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_IDENT_MASK		= 0x80,
894235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_IDENT_SHIFT		= 7,
895235911Smav
896235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_FAIL_BYTE		= 2,
897235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_FAIL_MASK		= 0x40,
898235911Smav	SES_CTRL_SAS_CONNECTOR_RQST_FAIL_SHIFT		= 6
899235911Smav};
900235911Smav
901235911Smav#define GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE)		\
902235911Smav    GEN_ACCESSORS(ses_ctrl_sas_connector, SES_CTRL_SAS_CONNECTOR,	\
903235911Smav		  LCASE, UCASE)
904235911SmavGEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_ident, RQST_IDENT)
905235911SmavGEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS(rqst_fail,  RQST_FAIL)
906235911Smav#undef GEN_SES_CTRL_SAS_CONNECTOR_ACCESSORS
907235911Smav
908235911Smav/*------------------------- Universal Control Element ------------------------*/
909235911Smavunion ses_ctrl_element {
910235911Smav	struct ses_ctrl_common            common;
911235911Smav	struct ses_ctrl_dev_slot          dev_slot;
912235911Smav	struct ses_ctrl_array_dev_slot    array_dev_slot;
913235911Smav	struct ses_ctrl_power_supply      power_supply;
914235911Smav	struct ses_ctrl_cooling           cooling;
915235911Smav	struct ses_ctrl_temp_sensor       temp_sensor;
916235911Smav	struct ses_ctrl_door_lock         door_lock;
917235911Smav	struct ses_ctrl_audible_alarm     audible_alarm;
918235911Smav	struct ses_ctrl_ecc_electronics   ecc_electronics;
919235911Smav	struct ses_ctrl_scc_electronics   scc_electronics;
920235911Smav	struct ses_ctrl_nv_cache          nv_cache;
921235911Smav	struct ses_ctrl_invalid_op_reason invalid_op_reason;
922235911Smav	struct ses_ctrl_ups               ups;
923235911Smav	struct ses_ctrl_display           display;
924235911Smav	struct ses_ctrl_key_pad_entry     key_pad_entry;
925235911Smav	struct ses_ctrl_scsi_port_or_xcvr scsi_port_or_xcvr;
926235911Smav	struct ses_ctrl_language          language;
927235911Smav	struct ses_ctrl_comm_port         comm_port;
928235911Smav	struct ses_ctrl_voltage_sensor    voltage_sensor;
929235911Smav	struct ses_ctrl_current_sensor    current_sensor;
930235911Smav	struct ses_ctrl_target_port	  target_port;
931235911Smav	struct ses_ctrl_initiator_port    initiator_port;
932235911Smav	struct ses_ctrl_simple_subenc	  simple_subenc;
933235911Smav	struct ses_ctrl_sas_expander      sas_expander;
934235911Smav	struct ses_ctrl_sas_connector     sas_connector;
935235911Smav};
936235911Smav
937235911Smav/*--------------------- SCSI SES Control Diagnostic Page ---------------------*/
938235911Smavstruct ses_ctrl_page {
939235911Smav	struct ses_page_hdr hdr;
940235911Smav	union ses_ctrl_element   elements[];
941235911Smav};
942235911Smav
943235911Smavenum ses_ctrl_page_field_data {
944235911Smav	SES_CTRL_PAGE_INFO_MASK		= 0x08,
945235911Smav	SES_CTRL_PAGE_INFO_SHIFT	= 3,
946235911Smav
947235911Smav	SES_CTRL_PAGE_NON_CRIT_MASK	= 0x04,
948235911Smav	SES_CTRL_PAGE_NON_CRIT_SHIFT	= 2,
949235911Smav
950235911Smav	SES_CTRL_PAGE_CRIT_MASK		= 0x02,
951235911Smav	SES_CTRL_PAGE_CRIT_SHIFT	= 1,
952235911Smav
953235911Smav	SES_CTRL_PAGE_UNRECOV_MASK	= 0x01,
954235911Smav	SES_CTRL_PAGE_UNRECOV_SHIFT	= 0
955235911Smav};
956235911Smav
957235911Smav#define GEN_SES_CTRL_PAGE_ACCESSORS(LCASE, UCASE) \
958235911Smav    GEN_HDR_ACCESSORS(ses_ctrl_page, SES_CTRL_PAGE, LCASE, UCASE)
959235911Smav
960235911SmavGEN_SES_CTRL_PAGE_ACCESSORS(info,     INFO)
961235911SmavGEN_SES_CTRL_PAGE_ACCESSORS(non_crit, NON_CRIT)
962235911SmavGEN_SES_CTRL_PAGE_ACCESSORS(crit,     CRIT)
963235911SmavGEN_SES_CTRL_PAGE_ACCESSORS(unrecov,  UNRECOV)
964235911Smav#undef GEN_SES_CTRL_PAGE_ACCESSORS
965235911Smav
966235911Smav/*================= SCSI SES Status Diagnostic Page Structures ===============*/
967235911Smavstruct ses_status_common {
968235911Smav	uint8_t bytes[1];
969235911Smav};
970235911Smav
971235911Smavenum ses_status_common_field_data {
972235911Smav	SES_STATUS_COMMON_PRDFAIL_BYTE			= 0,
973235911Smav	SES_STATUS_COMMON_PRDFAIL_MASK			= 0x40,
974235911Smav	SES_STATUS_COMMON_PRDFAIL_SHIFT			= 6,
975235911Smav
976235911Smav	SES_STATUS_COMMON_DISABLED_BYTE			= 0,
977235911Smav	SES_STATUS_COMMON_DISABLED_MASK			= 0x20,
978235911Smav	SES_STATUS_COMMON_DISABLED_SHIFT		= 5,
979235911Smav
980235911Smav	SES_STATUS_COMMON_SWAP_BYTE			= 0,
981235911Smav	SES_STATUS_COMMON_SWAP_MASK			= 0x10,
982235911Smav	SES_STATUS_COMMON_SWAP_SHIFT			= 4,
983235911Smav
984235911Smav	SES_STATUS_COMMON_ELEMENT_STATUS_CODE_BYTE	= 0,
985235911Smav	SES_STATUS_COMMON_ELEMENT_STATUS_CODE_MASK	= 0x0F,
986235911Smav	SES_STATUS_COMMON_ELEMENT_STATUS_CODE_SHIFT	= 0
987235911Smav};
988235911Smav
989235911Smav#define GEN_SES_STATUS_COMMON_ACCESSORS(LCASE, UCASE) \
990235911Smav    GEN_GETTER(ses_status_common, SES_STATUS_COMMON, LCASE, UCASE)
991235911Smav
992235911SmavGEN_SES_STATUS_COMMON_ACCESSORS(prdfail,             PRDFAIL)
993235911SmavGEN_SES_STATUS_COMMON_ACCESSORS(disabled,            DISABLED)
994235911SmavGEN_SES_STATUS_COMMON_ACCESSORS(swap,                SWAP)
995235911SmavGEN_SES_STATUS_COMMON_ACCESSORS(element_status_code, ELEMENT_STATUS_CODE)
996235911Smav#undef GEN_SES_STATUS_COMMON_ACCESSORS
997235911Smav
998235911Smav/*------------------------- Device Slot Status Element -----------------------*/
999235911Smavstruct ses_status_dev_slot {
1000235911Smav	struct ses_status_common common;
1001235911Smav	uint8_t slot_address;
1002235911Smav	uint8_t bytes[2];
1003235911Smav};
1004235911Smav
1005235911Smavenum ses_status_dev_slot_field_data {
1006235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_BYTE	= 0,
1007235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_MASK	= 0x80,
1008235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_A_SHIFT	= 7,
1009235911Smav
1010235911Smav	SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_BYTE		= 0,
1011235911Smav	SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_MASK		= 0x40,
1012235911Smav	SES_STATUS_DEV_SLOT_DO_NOT_REMOVE_SHIFT		= 6,
1013235911Smav
1014235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_BYTE	= 0,
1015235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_MASK	= 0x20,
1016235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_A_SHIFT	= 5,
1017235911Smav
1018235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_BYTE	= 0,
1019235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_MASK	= 0x10,
1020235911Smav	SES_STATUS_DEV_SLOT_ENCLOSURE_BYPED_B_SHIFT	= 4,
1021235911Smav
1022235911Smav	SES_STATUS_DEV_SLOT_INSERT_READY_BYTE		= 0,
1023235911Smav	SES_STATUS_DEV_SLOT_INSERT_READY_MASK		= 0x08,
1024235911Smav	SES_STATUS_DEV_SLOT_INSERT_READY_SHIFT		= 3,
1025235911Smav
1026235911Smav	SES_STATUS_DEV_SLOT_REMOVE_BYTE			= 0,
1027235911Smav	SES_STATUS_DEV_SLOT_REMOVE_MASK			= 0x04,
1028235911Smav	SES_STATUS_DEV_SLOT_REMOVE_SHIFT		= 2,
1029235911Smav
1030235911Smav	SES_STATUS_DEV_SLOT_IDENT_BYTE			= 0,
1031235911Smav	SES_STATUS_DEV_SLOT_IDENT_MASK			= 0x02,
1032235911Smav	SES_STATUS_DEV_SLOT_IDENT_SHIFT			= 1,
1033235911Smav
1034235911Smav	SES_STATUS_DEV_SLOT_REPORT_BYTE			= 0,
1035235911Smav	SES_STATUS_DEV_SLOT_REPORT_MASK			= 0x01,
1036235911Smav	SES_STATUS_DEV_SLOT_REPORT_SHIFT		= 0,
1037235911Smav
1038235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_BYTE	= 1,
1039235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_MASK	= 0x80,
1040235911Smav	SES_STATUS_DEV_SLOT_APP_CLIENT_BYPED_B_SHIFT	= 7,
1041235911Smav
1042235911Smav	SES_STATUS_DEV_SLOT_FAULT_SENSED_BYTE		= 1,
1043235911Smav	SES_STATUS_DEV_SLOT_FAULT_SENSED_MASK		= 0x40,
1044235911Smav	SES_STATUS_DEV_SLOT_FAULT_SENSED_SHIFT		= 6,
1045235911Smav
1046235911Smav	SES_STATUS_DEV_SLOT_FAULT_REQUESTED_BYTE	= 1,
1047235911Smav	SES_STATUS_DEV_SLOT_FAULT_REQUESTED_MASK	= 0x20,
1048235911Smav	SES_STATUS_DEV_SLOT_FAULT_REQUESTED_SHIFT	= 5,
1049235911Smav
1050235911Smav	SES_STATUS_DEV_SLOT_DEVICE_OFF_BYTE		= 1,
1051235911Smav	SES_STATUS_DEV_SLOT_DEVICE_OFF_MASK		= 0x10,
1052235911Smav	SES_STATUS_DEV_SLOT_DEVICE_OFF_SHIFT		= 4,
1053235911Smav
1054235911Smav	SES_STATUS_DEV_SLOT_BYPED_A_BYTE		= 1,
1055235911Smav	SES_STATUS_DEV_SLOT_BYPED_A_MASK		= 0x08,
1056235911Smav	SES_STATUS_DEV_SLOT_BYPED_A_SHIFT		= 3,
1057235911Smav
1058235911Smav	SES_STATUS_DEV_SLOT_BYPED_B_BYTE		= 1,
1059235911Smav	SES_STATUS_DEV_SLOT_BYPED_B_MASK		= 0x04,
1060235911Smav	SES_STATUS_DEV_SLOT_BYPED_B_SHIFT		= 2,
1061235911Smav
1062235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_BYTE		= 1,
1063235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_MASK		= 0x02,
1064235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_A_SHIFT	= 1,
1065235911Smav
1066235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_BYTE		= 1,
1067235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_MASK		= 0x01,
1068235911Smav	SES_STATUS_DEV_SLOT_DEVICE_BYPED_B_SHIFT	= 0
1069235911Smav};
1070235911Smav#define GEN_SES_STATUS_DEV_SLOT_ACCESSORS(LCASE, UCASE) \
1071235911Smav    GEN_GETTER(ses_status_dev_slot, SES_STATUS_DEV_SLOT, LCASE, UCASE)
1072235911Smav
1073235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_a, APP_CLIENT_BYPED_A)
1074235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(do_not_remove,      DO_NOT_REMOVE)
1075235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_a,  ENCLOSURE_BYPED_A)
1076235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(enclosure_byped_b,  ENCLOSURE_BYPED_B)
1077235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(insert_ready,       INSERT_READY)
1078235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(remove,             REMOVE)
1079235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(ident,              IDENT)
1080235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(report,             REPORT)
1081235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(app_client_byped_b, APP_CLIENT_BYPED_B)
1082235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_sensed,       FAULT_SENSED)
1083235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(fault_requested,    FAULT_REQUESTED)
1084235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_off,         DEVICE_OFF)
1085235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_a,            BYPED_A)
1086235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(byped_b,            BYPED_B)
1087235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_a,     DEVICE_BYPED_A)
1088235911SmavGEN_SES_STATUS_DEV_SLOT_ACCESSORS(device_byped_b,     DEVICE_BYPED_B)
1089235911Smav#undef GEN_SES_STATUS_DEV_SLOT_ACCESSORS
1090235911Smav
1091235911Smav/*---------------------- Array Device Slot Status Element --------------------*/
1092235911Smavstruct ses_status_array_dev_slot {
1093235911Smav	struct ses_status_common common;
1094235911Smav	uint8_t bytes[3];
1095235911Smav};
1096235911Smav
1097235911Smavenum ses_status_array_dev_slot_field_data {
1098235911Smav	SES_STATUS_ARRAY_DEV_SLOT_OK_BYTE			= 0,
1099235911Smav	SES_STATUS_ARRAY_DEV_SLOT_OK_MASK			= 0x80,
1100235911Smav	SES_STATUS_ARRAY_DEV_SLOT_OK_SHIFT			= 7,
1101235911Smav
1102235911Smav	SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_BYTE		= 0,
1103235911Smav	SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_MASK		= 0x40,
1104235911Smav	SES_STATUS_ARRAY_DEV_SLOT_RSVD_DEVICE_SHIFT		= 6,
1105235911Smav
1106235911Smav	SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_BYTE		= 0,
1107235911Smav	SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_MASK		= 0x20,
1108235911Smav	SES_STATUS_ARRAY_DEV_SLOT_HOT_SPARE_SHIFT		= 5,
1109235911Smav
1110235911Smav	SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_BYTE		= 0,
1111235911Smav	SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_MASK		= 0x10,
1112235911Smav	SES_STATUS_ARRAY_DEV_SLOT_CONS_CHECK_SHIFT		= 4,
1113235911Smav
1114235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_BYTE		= 0,
1115235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_MASK		= 0x08,
1116235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_CRIT_ARRAY_SHIFT		= 3,
1117235911Smav
1118235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_BYTE		= 0,
1119235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_MASK		= 0x04,
1120235911Smav	SES_STATUS_ARRAY_DEV_SLOT_IN_FAILED_ARRAY_SHIFT		= 2,
1121235911Smav
1122235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_BYTE		= 0,
1123235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_MASK		= 0x02,
1124235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_SHIFT		= 1,
1125235911Smav
1126235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_BYTE	= 0,
1127235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_MASK	= 0x01,
1128235911Smav	SES_STATUS_ARRAY_DEV_SLOT_REBUILD_REMAP_ABORT_SHIFT	= 0
1129235911Smav
1130235911Smav	/*
1131235911Smav	 * The remaining fields are identical to the device
1132235911Smav	 * slot element type.  Access them through the device slot
1133235911Smav	 * element type and its accessors.
1134235911Smav	 */
1135235911Smav};
1136235911Smav#define GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(LCASE, UCASE)		\
1137235911Smav    GEN_GETTER(ses_status_array_dev_slot, SES_STATUS_ARRAY_DEV_SLOT,	\
1138235911Smav	       LCASE, UCASE)
1139235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(ok,              OK)
1140235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rsvd_device,     RSVD_DEVICE)
1141235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(hot_spare,       HOT_SPARE)
1142235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(cons_check,      CONS_CHECK)
1143235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_crit_array,   IN_CRIT_ARRAY)
1144235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(in_failed_array, IN_FAILED_ARRAY)
1145235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap,   REBUILD_REMAP)
1146235911SmavGEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS(rebuild_remap_abort,
1147235911Smav					REBUILD_REMAP_ABORT)
1148235911Smav#undef GEN_SES_STATUS_ARRAY_DEV_SLOT_ACCESSORS
1149235911Smav
1150235911Smav/*----------------------- Power Supply Status Element ------------------------*/
1151235911Smavstruct ses_status_power_supply {
1152235911Smav	struct ses_status_common common;
1153235911Smav	uint8_t bytes[3];
1154235911Smav};
1155235911Smav
1156235911Smavenum ses_status_power_supply_field_data {
1157235911Smav	SES_STATUS_POWER_SUPPLY_IDENT_BYTE		= 0,
1158235911Smav	SES_STATUS_POWER_SUPPLY_IDENT_MASK		= 0x80,
1159235911Smav	SES_STATUS_POWER_SUPPLY_IDENT_SHIFT		= 7,
1160235911Smav
1161235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_BYTE	= 1,
1162235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_MASK	= 0x08,
1163235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_VOLTAGE_SHIFT	= 3,
1164235911Smav
1165235911Smav	SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_BYTE	= 1,
1166235911Smav	SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_MASK	= 0x04,
1167235911Smav	SES_STATUS_POWER_SUPPLY_DC_UNDER_VOLTAGE_SHIFT	= 2,
1168235911Smav
1169235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_BYTE	= 1,
1170235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_MASK	= 0x02,
1171235911Smav	SES_STATUS_POWER_SUPPLY_DC_OVER_CURRENT_SHIFT	= 1,
1172235911Smav
1173235911Smav	SES_STATUS_POWER_SUPPLY_HOT_SWAP_BYTE		= 2,
1174235911Smav	SES_STATUS_POWER_SUPPLY_HOT_SWAP_MASK		= 0x80,
1175235911Smav	SES_STATUS_POWER_SUPPLY_HOT_SWAP_SHIFT		= 7,
1176235911Smav
1177235911Smav	SES_STATUS_POWER_SUPPLY_FAIL_BYTE		= 2,
1178235911Smav	SES_STATUS_POWER_SUPPLY_FAIL_MASK		= 0x40,
1179235911Smav	SES_STATUS_POWER_SUPPLY_FAIL_SHIFT		= 6,
1180235911Smav
1181235911Smav	SES_STATUS_POWER_SUPPLY_REQUESTED_ON_BYTE	= 2,
1182235911Smav	SES_STATUS_POWER_SUPPLY_REQUESTED_ON_MASK	= 0x20,
1183235911Smav	SES_STATUS_POWER_SUPPLY_REQUESTED_ON_SHIFT	= 5,
1184235911Smav
1185235911Smav	SES_STATUS_POWER_SUPPLY_OFF_BYTE		= 2,
1186235911Smav	SES_STATUS_POWER_SUPPLY_OFF_MASK		= 0x10,
1187235911Smav	SES_STATUS_POWER_SUPPLY_OFF_SHIFT		= 4,
1188235911Smav
1189235911Smav	SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_BYTE	= 2,
1190235911Smav	SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_MASK	= 0x08,
1191235911Smav	SES_STATUS_POWER_SUPPLY_OVERTMP_FAIL_SHIFT	= 3,
1192235911Smav
1193235911Smav	SES_STATUS_POWER_SUPPLY_TEMP_WARN_BYTE		= 2,
1194235911Smav	SES_STATUS_POWER_SUPPLY_TEMP_WARN_MASK		= 0x04,
1195235911Smav	SES_STATUS_POWER_SUPPLY_TEMP_WARN_SHIFT		= 2,
1196235911Smav
1197235911Smav	SES_STATUS_POWER_SUPPLY_AC_FAIL_BYTE		= 2,
1198235911Smav	SES_STATUS_POWER_SUPPLY_AC_FAIL_MASK		= 0x02,
1199235911Smav	SES_STATUS_POWER_SUPPLY_AC_FAIL_SHIFT		= 1,
1200235911Smav
1201235911Smav	SES_STATUS_POWER_SUPPLY_DC_FAIL_BYTE		= 2,
1202235911Smav	SES_STATUS_POWER_SUPPLY_DC_FAIL_MASK		= 0x01,
1203235911Smav	SES_STATUS_POWER_SUPPLY_DC_FAIL_SHIFT		= 0
1204235911Smav};
1205235911Smav
1206235911Smav#define GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(LCASE, UCASE)	\
1207235911Smav    GEN_GETTER(ses_status_power_supply, SES_STATUS_POWER_SUPPLY, LCASE, UCASE)
1208235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ident,            IDENT)
1209235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_voltage,  DC_OVER_VOLTAGE)
1210235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_under_voltage, DC_UNDER_VOLTAGE)
1211235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_over_current,  DC_OVER_CURRENT)
1212235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(hot_swap,         HOT_SWAP)
1213235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(fail,             FAIL)
1214235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(requested_on,     REQUESTED_ON)
1215235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(off,              OFF)
1216235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(overtmp_fail,     OVERTMP_FAIL)
1217235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(temp_warn,        TEMP_WARN)
1218235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(ac_fail,          AC_FAIL)
1219235911SmavGEN_SES_STATUS_POWER_SUPPLY_ACCESSORS(dc_fail,          DC_FAIL)
1220235911Smav#undef GEN_SES_STATUS_POWER_SUPPLY_ACCESSORS
1221235911Smav
1222235911Smav/*-------------------------- Cooling Status Element --------------------------*/
1223235911Smavstruct ses_status_cooling {
1224235911Smav	struct ses_status_common common;
1225235911Smav	uint8_t bytes[3];
1226235911Smav};
1227235911Smav
1228235911Smavenum ses_status_cooling_field_data {
1229235911Smav	SES_STATUS_COOLING_IDENT_BYTE			= 0,
1230235911Smav	SES_STATUS_COOLING_IDENT_MASK			= 0x80,
1231235911Smav	SES_STATUS_COOLING_IDENT_SHIFT			= 7,
1232235911Smav
1233235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_BYTE	= 0,
1234235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_MASK	= 0x07,
1235235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_MSB_SHIFT	= 0,
1236235911Smav
1237235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_BYTE	= 1,
1238235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_MASK	= 0xFF,
1239235911Smav	SES_STATUS_COOLING_ACTUAL_FAN_SPEED_LSB_SHIFT	= 0,
1240235911Smav
1241235911Smav	SES_STATUS_COOLING_HOT_SWAP_BYTE		= 2,
1242235911Smav	SES_STATUS_COOLING_HOT_SWAP_MASK		= 0x40,
1243235911Smav	SES_STATUS_COOLING_HOT_SWAP_SHIFT		= 6,
1244235911Smav
1245235911Smav	SES_STATUS_COOLING_FAIL_BYTE			= 2,
1246235911Smav	SES_STATUS_COOLING_FAIL_MASK			= 0x40,
1247235911Smav	SES_STATUS_COOLING_FAIL_SHIFT			= 6,
1248235911Smav
1249235911Smav	SES_STATUS_COOLING_REQUESTED_ON_BYTE		= 2,
1250235911Smav	SES_STATUS_COOLING_REQUESTED_ON_MASK		= 0x20,
1251235911Smav	SES_STATUS_COOLING_REQUESTED_ON_SHIFT		= 5,
1252235911Smav
1253235911Smav	SES_STATUS_COOLING_OFF_BYTE			= 2,
1254235911Smav	SES_STATUS_COOLING_OFF_MASK			= 0x20,
1255235911Smav	SES_STATUS_COOLING_OFF_SHIFT			= 5,
1256235911Smav
1257235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_BYTE	= 2,
1258235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_MASK	= 0x07,
1259235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_SHIFT	= 2,
1260235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_STOPPED	= 0x00,
1261235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_LOWEST	= 0x01,
1262235911Smav	SES_STATUS_COOLING_ACTUAL_SPEED_CODE_HIGHEST	= 0x07
1263235911Smav};
1264235911Smav
1265235911Smav#define GEN_SES_STATUS_COOLING_ACCESSORS(LCASE, UCASE)	\
1266235911Smav    GEN_GETTER(ses_status_cooling, SES_STATUS_COOLING, LCASE, UCASE)
1267235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(ident,                IDENT)
1268235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_msb, ACTUAL_FAN_SPEED_MSB)
1269235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(actual_fan_speed_lsb, ACTUAL_FAN_SPEED_LSB)
1270235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(hot_swap,             HOT_SWAP)
1271235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(fail,                 FAIL)
1272235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(requested_on,         REQUESTED_ON)
1273235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(off,                  OFF)
1274235911SmavGEN_SES_STATUS_COOLING_ACCESSORS(actual_speed_code,    ACTUAL_SPEED_CODE)
1275235911Smav#undef GEN_SES_STATUS_COOLING_ACCESSORS
1276235911Smav
1277235911Smavstatic inline int
1278235911Smavses_status_cooling_get_actual_fan_speed(struct ses_status_cooling *elem)
1279235911Smav{
1280235911Smav	return (ses_status_cooling_get_actual_fan_speed_msb(elem) << 8
1281235911Smav	      | ses_status_cooling_get_actual_fan_speed_lsb(elem));
1282235911Smav}
1283235911Smav
1284235911Smav/*-------------------- Temperature Sensor Status Element ---------------------*/
1285235911Smavstruct ses_status_temp_sensor {
1286235911Smav	struct ses_status_common common;
1287235911Smav	uint8_t bytes[3];
1288235911Smav};
1289235911Smav
1290235911Smavenum ses_status_temp_sensor_field_data {
1291235911Smav	SES_STATUS_TEMP_SENSOR_IDENT_BYTE		= 0,
1292235911Smav	SES_STATUS_TEMP_SENSOR_IDENT_MASK		= 0x80,
1293235911Smav	SES_STATUS_TEMP_SENSOR_IDENT_SHIFT		= 7,
1294235911Smav
1295235911Smav	SES_STATUS_TEMP_SENSOR_FAIL_BYTE		= 0,
1296235911Smav	SES_STATUS_TEMP_SENSOR_FAIL_MASK		= 0x40,
1297235911Smav	SES_STATUS_TEMP_SENSOR_FAIL_SHIFT		= 6,
1298235911Smav
1299235911Smav	SES_STATUS_TEMP_SENSOR_TEMPERATURE_BYTE		= 1,
1300235911Smav	SES_STATUS_TEMP_SENSOR_TEMPERATURE_MASK		= 0xFF,
1301235911Smav	SES_STATUS_TEMP_SENSOR_TEMPERATURE_SHIFT	= 0,
1302235911Smav
1303235911Smav	SES_STATUS_TEMP_SENSOR_OT_FAILURE_BYTE		= 2,
1304235911Smav	SES_STATUS_TEMP_SENSOR_OT_FAILURE_MASK		= 0x08,
1305235911Smav	SES_STATUS_TEMP_SENSOR_OT_FAILURE_SHIFT		= 3,
1306235911Smav
1307235911Smav	SES_STATUS_TEMP_SENSOR_OT_WARNING_BYTE		= 2,
1308235911Smav	SES_STATUS_TEMP_SENSOR_OT_WARNING_MASK		= 0x04,
1309235911Smav	SES_STATUS_TEMP_SENSOR_OT_WARNING_SHIFT		= 2,
1310235911Smav
1311235911Smav	SES_STATUS_TEMP_SENSOR_UT_FAILURE_BYTE		= 2,
1312235911Smav	SES_STATUS_TEMP_SENSOR_UT_FAILURE_MASK		= 0x02,
1313235911Smav	SES_STATUS_TEMP_SENSOR_UT_FAILURE_SHIFT		= 1,
1314235911Smav
1315235911Smav	SES_STATUS_TEMP_SENSOR_UT_WARNING_BYTE		= 2,
1316235911Smav	SES_STATUS_TEMP_SENSOR_UT_WARNING_MASK		= 0x01,
1317235911Smav	SES_STATUS_TEMP_SENSOR_UT_WARNING_SHIFT		= 0
1318235911Smav};
1319235911Smav
1320235911Smav#define GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(LCASE, UCASE)	\
1321235911Smav    GEN_GETTER(ses_status_temp_sensor, SES_STATUS_TEMP_SENSOR, LCASE, UCASE)
1322235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ident,       IDENT)
1323235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(fail,        FAIL)
1324235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(temperature, TEMPERATURE)
1325235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_failure,  OT_FAILURE)
1326235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ot_warning,  OT_WARNING)
1327235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_failure,  UT_FAILURE)
1328235911SmavGEN_SES_STATUS_TEMP_SENSOR_ACCESSORS(ut_warning,  UT_WARNING)
1329235911Smav#undef GEN_SES_STATUS_TEMP_SENSOR_ACCESSORS
1330235911Smav
1331235911Smav/*------------------------- Door Lock Status Element -------------------------*/
1332235911Smavstruct ses_status_door_lock {
1333235911Smav	struct ses_status_common common;
1334235911Smav	uint8_t bytes[3];
1335235911Smav};
1336235911Smav
1337235911Smavenum ses_status_door_lock_field_data {
1338235911Smav	SES_STATUS_DOOR_LOCK_IDENT_BYTE		= 0,
1339235911Smav	SES_STATUS_DOOR_LOCK_IDENT_MASK		= 0x80,
1340235911Smav	SES_STATUS_DOOR_LOCK_IDENT_SHIFT	= 7,
1341235911Smav
1342235911Smav	SES_STATUS_DOOR_LOCK_FAIL_BYTE		= 0,
1343235911Smav	SES_STATUS_DOOR_LOCK_FAIL_MASK		= 0x40,
1344235911Smav	SES_STATUS_DOOR_LOCK_FAIL_SHIFT		= 6,
1345235911Smav
1346235911Smav	SES_STATUS_DOOR_LOCK_UNLOCKED_BYTE	= 2,
1347235911Smav	SES_STATUS_DOOR_LOCK_UNLOCKED_MASK	= 0x01,
1348235911Smav	SES_STATUS_DOOR_LOCK_UNLOCKED_SHIFT	= 0
1349235911Smav};
1350235911Smav
1351235911Smav#define GEN_SES_STATUS_DOOR_LOCK_ACCESSORS(LCASE, UCASE)	\
1352235911Smav    GEN_GETTER(ses_status_door_lock, SES_STATUS_DOOR_LOCK, LCASE, UCASE)
1353235911SmavGEN_SES_STATUS_DOOR_LOCK_ACCESSORS(ident,    IDENT)
1354235911SmavGEN_SES_STATUS_DOOR_LOCK_ACCESSORS(fail,     FAIL)
1355235911SmavGEN_SES_STATUS_DOOR_LOCK_ACCESSORS(unlocked, UNLOCKED)
1356235911Smav#undef GEN_SES_STATUS_DOOR_LOCK_ACCESSORS
1357235911Smav
1358235911Smav/*----------------------- Audible Alarm Status Element -----------------------*/
1359235911Smavstruct ses_status_audible_alarm {
1360235911Smav	struct ses_status_common common;
1361235911Smav	uint8_t bytes[3];
1362235911Smav};
1363235911Smav
1364235911Smavenum ses_status_audible_alarm_field_data {
1365235911Smav	SES_STATUS_AUDIBLE_ALARM_IDENT_BYTE			= 0,
1366235911Smav	SES_STATUS_AUDIBLE_ALARM_IDENT_MASK			= 0x80,
1367235911Smav	SES_STATUS_AUDIBLE_ALARM_IDENT_SHIFT			= 7,
1368235911Smav
1369235911Smav	SES_STATUS_AUDIBLE_ALARM_FAIL_BYTE			= 0,
1370235911Smav	SES_STATUS_AUDIBLE_ALARM_FAIL_MASK			= 0x40,
1371235911Smav	SES_STATUS_AUDIBLE_ALARM_FAIL_SHIFT			= 6,
1372235911Smav
1373235911Smav	SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_BYTE			= 2,
1374235911Smav	SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_MASK			= 0x80,
1375235911Smav	SES_STATUS_AUDIBLE_ALARM_RQST_MUTE_SHIFT		= 7,
1376235911Smav
1377235911Smav	SES_STATUS_AUDIBLE_ALARM_MUTED_BYTE			= 2,
1378235911Smav	SES_STATUS_AUDIBLE_ALARM_MUTED_MASK			= 0x40,
1379235911Smav	SES_STATUS_AUDIBLE_ALARM_MUTED_SHIFT			= 6,
1380235911Smav
1381235911Smav	SES_STATUS_AUDIBLE_ALARM_REMIND_BYTE			= 2,
1382235911Smav	SES_STATUS_AUDIBLE_ALARM_REMIND_MASK			= 0x10,
1383235911Smav	SES_STATUS_AUDIBLE_ALARM_REMIND_SHIFT			= 4,
1384235911Smav
1385235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_BYTE		= 2,
1386235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_MASK		= 0x0F,
1387235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_SHIFT		= 0,
1388235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_INFO		= 0x08,
1389235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_NON_CRIT	= 0x04,
1390235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_CRIT		= 0x02,
1391235911Smav	SES_STATUS_AUDIBLE_ALARM_TONE_INDICATOR_UNRECOV		= 0x01
1392235911Smav};
1393235911Smav
1394235911Smav#define GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(LCASE, UCASE)	\
1395235911Smav    GEN_GETTER(ses_status_audible_alarm, SES_STATUS_AUDIBLE_ALARM, LCASE, UCASE)
1396235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(ident,          IDENT)
1397235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(fail,           FAIL)
1398235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(rqst_mute,      RQST_MUTE)
1399235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(muted,          MUTED)
1400235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(remind,         REMIND)
1401235911SmavGEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS(tone_indicator, TONE_INDICATOR)
1402235911Smav#undef GEN_SES_STATUS_AUDIBLE_ALARM_ACCESSORS
1403235911Smav
1404235911Smav/*---------- Enclosure Services Statusler Electronics Status Element ---------*/
1405235911Smavstruct ses_status_ecc_electronics {
1406235911Smav	struct ses_status_common common;
1407235911Smav	uint8_t bytes[3];
1408235911Smav};
1409235911Smav
1410235911Smavenum ses_status_ecc_electronics_field_data {
1411235911Smav	SES_STATUS_ECC_ELECTRONICS_IDENT_BYTE		= 0,
1412235911Smav	SES_STATUS_ECC_ELECTRONICS_IDENT_MASK		= 0x80,
1413235911Smav	SES_STATUS_ECC_ELECTRONICS_IDENT_SHIFT		= 7,
1414235911Smav
1415235911Smav	SES_STATUS_ECC_ELECTRONICS_FAIL_BYTE		= 0,
1416235911Smav	SES_STATUS_ECC_ELECTRONICS_FAIL_MASK		= 0x40,
1417235911Smav	SES_STATUS_ECC_ELECTRONICS_FAIL_SHIFT		= 6,
1418235911Smav
1419235911Smav	SES_STATUS_ECC_ELECTRONICS_REPORT_BYTE		= 1,
1420235911Smav	SES_STATUS_ECC_ELECTRONICS_REPORT_MASK		= 0x01,
1421235911Smav	SES_STATUS_ECC_ELECTRONICS_REPORT_SHIFT		= 0,
1422235911Smav
1423235911Smav	SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_BYTE	= 2,
1424235911Smav	SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_MASK	= 0x80,
1425235911Smav	SES_STATUS_ECC_ELECTRONICS_HOT_SWAP_SHIFT	= 7
1426235911Smav};
1427235911Smav
1428235911Smav#define GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(LCASE, UCASE)		\
1429235911Smav    GEN_GETTER(ses_status_ecc_electronics, SES_STATUS_ECC_ELECTRONICS,	\
1430235911Smav		  LCASE, UCASE)
1431235911SmavGEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(ident,     IDENT)
1432235911SmavGEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(fail,      FAIL)
1433235911SmavGEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(report,    REPORT)
1434235911SmavGEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS(hot_swap,  HOT_SWAP)
1435235911Smav#undef GEN_SES_STATUS_ECC_ELECTRONICS_ACCESSORS
1436235911Smav
1437235911Smav/*------------ SCSI Services Statusler Electronics Status Element ------------*/
1438235911Smavstruct ses_status_scc_electronics {
1439235911Smav	struct ses_status_common common;
1440235911Smav	uint8_t bytes[3];
1441235911Smav};
1442235911Smav
1443235911Smavenum ses_status_scc_electronics_field_data {
1444235911Smav	SES_STATUS_SCC_ELECTRONICS_IDENT_BYTE	= 0,
1445235911Smav	SES_STATUS_SCC_ELECTRONICS_IDENT_MASK	= 0x80,
1446235911Smav	SES_STATUS_SCC_ELECTRONICS_IDENT_SHIFT	= 7,
1447235911Smav
1448235911Smav	SES_STATUS_SCC_ELECTRONICS_FAIL_BYTE	= 0,
1449235911Smav	SES_STATUS_SCC_ELECTRONICS_FAIL_MASK	= 0x40,
1450235911Smav	SES_STATUS_SCC_ELECTRONICS_FAIL_SHIFT	= 6,
1451235911Smav
1452235911Smav	SES_STATUS_SCC_ELECTRONICS_REPORT_BYTE	= 1,
1453235911Smav	SES_STATUS_SCC_ELECTRONICS_REPORT_MASK	= 0x01,
1454235911Smav	SES_STATUS_SCC_ELECTRONICS_REPORT_SHIFT	= 0
1455235911Smav};
1456235911Smav
1457235911Smav#define GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(LCASE, UCASE)		\
1458235911Smav    GEN_GETTER(ses_status_scc_electronics, SES_STATUS_SCC_ELECTRONICS,	\
1459235911Smav		  LCASE, UCASE)
1460235911SmavGEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(ident,     IDENT)
1461235911SmavGEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(fail,      FAIL)
1462235911SmavGEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS(report,    REPORT)
1463235911Smav#undef GEN_SES_STATUS_SCC_ELECTRONICS_ACCESSORS
1464235911Smav
1465235911Smav/*--------------------- Nonvolatile Cache Status Element ---------------------*/
1466235911Smavstruct ses_status_nv_cache {
1467235911Smav	struct ses_status_common common;
1468235911Smav	uint8_t bytes[1];
1469235911Smav	uint8_t cache_size[2];
1470235911Smav};
1471235911Smav
1472235911Smavenum ses_status_nv_cache_field_data {
1473235911Smav	SES_STATUS_NV_CACHE_IDENT_BYTE			= 0,
1474235911Smav	SES_STATUS_NV_CACHE_IDENT_MASK			= 0x80,
1475235911Smav	SES_STATUS_NV_CACHE_IDENT_SHIFT			= 7,
1476235911Smav
1477235911Smav	SES_STATUS_NV_CACHE_FAIL_BYTE			= 0,
1478235911Smav	SES_STATUS_NV_CACHE_FAIL_MASK			= 0x40,
1479235911Smav	SES_STATUS_NV_CACHE_FAIL_SHIFT			= 6,
1480235911Smav
1481235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTE	= 0,
1482235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MASK	= 0x03,
1483235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_SHIFT	= 0,
1484235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_BYTES	= 0x0,
1485235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_KBYTES	= 0x1,
1486235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_MBYTES	= 0x2,
1487235911Smav	SES_STATUS_NV_CACHE_SIZE_MULTIPLIER_GBYTES	= 0x3
1488235911Smav};
1489235911Smav
1490235911Smav#define GEN_SES_STATUS_NV_CACHE_ACCESSORS(LCASE, UCASE)		\
1491235911Smav    GEN_GETTER(ses_status_nv_cache, SES_STATUS_NV_CACHE, LCASE, UCASE)
1492235911SmavGEN_SES_STATUS_NV_CACHE_ACCESSORS(ident,           IDENT)
1493235911SmavGEN_SES_STATUS_NV_CACHE_ACCESSORS(fail,            FAIL)
1494235911SmavGEN_SES_STATUS_NV_CACHE_ACCESSORS(size_multiplier, SIZE_MULTIPLIER)
1495235911Smav#undef GEN_SES_STATUS_NV_CACHE_ACCESSORS
1496235911Smav
1497235911Smavstatic inline uintmax_t
1498235911Smavses_status_nv_cache_get_cache_size(struct ses_status_nv_cache *elem)
1499235911Smav{
1500235911Smav	uintmax_t cache_size;
1501235911Smav	int multiplier;
1502235911Smav
1503235911Smav	/* Multiplier is in units of 2^10 */
1504235911Smav	cache_size = scsi_2btoul(elem->cache_size);
1505235911Smav	multiplier = 10 * ses_status_nv_cache_get_size_multiplier(elem);
1506235911Smav	return (cache_size << multiplier);
1507235911Smav}
1508235911Smav
1509235911Smav/*----------------- Invalid Operation Reason Status Element ------------------*/
1510235911Smavstruct ses_status_invalid_op_reason {
1511235911Smav	struct ses_status_common common;
1512235911Smav	uint8_t bytes[3];
1513235911Smav};
1514235911Smav
1515235911Smavenum ses_status_invalid_op_field_data {
1516235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_BYTE				= 0,
1517235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_MASK				= 0xC0,
1518235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_SHIFT				= 6,
1519235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_PC_ERROR			= 0x00,
1520235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_PF_ERROR			= 0x01,
1521235911Smav	SES_STATUS_INVALID_OP_REASON_TYPE_VS_ERROR			= 0x03,
1522235911Smav
1523235911Smav	SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_BYTE	= 0,
1524235911Smav	SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_MASK	= 0x01,
1525235911Smav	SES_STATUS_INVALID_OP_REASON_PC_ERROR_PC_NOT_SUPPORTED_SHIFT	= 0,
1526235911Smav
1527235911Smav	SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_BYTE		= 0,
1528235911Smav	SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_MASK		= 0x03,
1529235911Smav	SES_STATUS_INVALID_OP_REASON_PF_ERROR_BIT_NUMBER_SHIFT		= 0
1530235911Smav};
1531235911Smav
1532235911Smav#define GEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(LCASE, UCASE)	   \
1533235911Smav    GEN_GETTER(ses_status_invalid_op_reason, SES_STATUS_INVALID_OP_REASON, \
1534235911Smav	       LCASE, UCASE)
1535235911SmavGEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(type, TYPE)
1536235911SmavGEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pc_error_pc_not_supported,
1537235911Smav					   PC_ERROR_PC_NOT_SUPPORTED)
1538235911SmavGEN_SES_STATUS_INVALID_OP_REASON_ACCESSORS(pf_error_bit_number,
1539235911Smav					   PF_ERROR_BIT_NUMBER)
1540235911Smav#undef GEN_SES_STATUS_INVALID_OP_ACCESSORS
1541235911Smav
1542235911Smav/*--------------- Uninterruptible Power Supply Status Element ----------------*/
1543235911Smavstruct ses_status_ups {
1544235911Smav	struct ses_status_common common;
1545235911Smav	/* Minutes of remaining capacity. */
1546235911Smav	uint8_t battery_status;
1547235911Smav	uint8_t bytes[2];
1548235911Smav};
1549235911Smav
1550235911Smavenum ses_status_ups_field_data {
1551235911Smav	SES_STATUS_UPS_AC_LO_BYTE	= 0,
1552235911Smav	SES_STATUS_UPS_AC_LO_MASK	= 0x80,
1553235911Smav	SES_STATUS_UPS_AC_LO_SHIFT	= 7,
1554235911Smav
1555235911Smav	SES_STATUS_UPS_AC_HI_BYTE	= 0,
1556235911Smav	SES_STATUS_UPS_AC_HI_MASK	= 0x40,
1557235911Smav	SES_STATUS_UPS_AC_HI_SHIFT	= 6,
1558235911Smav
1559235911Smav	SES_STATUS_UPS_AC_QUAL_BYTE	= 0,
1560235911Smav	SES_STATUS_UPS_AC_QUAL_MASK	= 0x20,
1561235911Smav	SES_STATUS_UPS_AC_QUAL_SHIFT	= 5,
1562235911Smav
1563235911Smav	SES_STATUS_UPS_AC_FAIL_BYTE	= 0,
1564235911Smav	SES_STATUS_UPS_AC_FAIL_MASK	= 0x10,
1565235911Smav	SES_STATUS_UPS_AC_FAIL_SHIFT	= 4,
1566235911Smav
1567235911Smav	SES_STATUS_UPS_DC_FAIL_BYTE	= 0,
1568235911Smav	SES_STATUS_UPS_DC_FAIL_MASK	= 0x08,
1569235911Smav	SES_STATUS_UPS_DC_FAIL_SHIFT	= 3,
1570235911Smav
1571235911Smav	SES_STATUS_UPS_UPS_FAIL_BYTE	= 0,
1572235911Smav	SES_STATUS_UPS_UPS_FAIL_MASK	= 0x04,
1573235911Smav	SES_STATUS_UPS_UPS_FAIL_SHIFT	= 2,
1574235911Smav
1575235911Smav	SES_STATUS_UPS_WARN_BYTE	= 0,
1576235911Smav	SES_STATUS_UPS_WARN_MASK	= 0x02,
1577235911Smav	SES_STATUS_UPS_WARN_SHIFT	= 1,
1578235911Smav
1579235911Smav	SES_STATUS_UPS_INTF_FAIL_BYTE	= 0,
1580235911Smav	SES_STATUS_UPS_INTF_FAIL_MASK	= 0x01,
1581235911Smav	SES_STATUS_UPS_INTF_FAIL_SHIFT	= 0,
1582235911Smav
1583235911Smav	SES_STATUS_UPS_IDENT_BYTE	= 0,
1584235911Smav	SES_STATUS_UPS_IDENT_MASK	= 0x80,
1585235911Smav	SES_STATUS_UPS_IDENT_SHIFT	= 7,
1586235911Smav
1587235911Smav	SES_STATUS_UPS_FAIL_BYTE	= 1,
1588235911Smav	SES_STATUS_UPS_FAIL_MASK	= 0x40,
1589235911Smav	SES_STATUS_UPS_FAIL_SHIFT	= 6,
1590235911Smav
1591235911Smav	SES_STATUS_UPS_BATT_FAIL_BYTE	= 1,
1592235911Smav	SES_STATUS_UPS_BATT_FAIL_MASK	= 0x02,
1593235911Smav	SES_STATUS_UPS_BATT_FAIL_SHIFT	= 1,
1594235911Smav
1595235911Smav	SES_STATUS_UPS_BPF_BYTE		= 1,
1596235911Smav	SES_STATUS_UPS_BPF_MASK		= 0x01,
1597235911Smav	SES_STATUS_UPS_BPF_SHIFT	= 0
1598235911Smav};
1599235911Smav
1600235911Smav#define GEN_SES_STATUS_UPS_ACCESSORS(LCASE, UCASE)	\
1601235911Smav    GEN_GETTER(ses_status_ups, SES_STATUS_UPS, LCASE, UCASE)
1602235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ac_lo,           AC_LO)
1603235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ac_hi,            AC_HI)
1604235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ac_qual,          AC_QUAL)
1605235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ac_fail,          AC_FAIL)
1606235911SmavGEN_SES_STATUS_UPS_ACCESSORS(dc_fail,          DC_FAIL)
1607235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ups_fail,         UPS_FAIL)
1608235911SmavGEN_SES_STATUS_UPS_ACCESSORS(warn,             WARN)
1609235911SmavGEN_SES_STATUS_UPS_ACCESSORS(intf_fail,        INTF_FAIL)
1610235911SmavGEN_SES_STATUS_UPS_ACCESSORS(ident,            IDENT)
1611235911SmavGEN_SES_STATUS_UPS_ACCESSORS(fail,             FAIL)
1612235911SmavGEN_SES_STATUS_UPS_ACCESSORS(batt_fail,        BATT_FAIL)
1613235911SmavGEN_SES_STATUS_UPS_ACCESSORS(bpf,              BPF)
1614235911Smav#undef GEN_SES_STATUS_UPS_ACCESSORS
1615235911Smav
1616235911Smav/*-------------------------- Display Status Element --------------------------*/
1617235911Smavstruct ses_status_display {
1618235911Smav	struct ses_status_common common;
1619235911Smav	uint8_t bytes[1];
1620235911Smav	uint8_t display_character[2];
1621235911Smav};
1622235911Smav
1623235911Smavenum ses_status_display_field_data {
1624235911Smav	SES_STATUS_DISPLAY_IDENT_BYTE			= 0,
1625235911Smav	SES_STATUS_DISPLAY_IDENT_MASK			= 0x80,
1626235911Smav	SES_STATUS_DISPLAY_IDENT_SHIFT			= 7,
1627235911Smav
1628235911Smav	SES_STATUS_DISPLAY_FAIL_BYTE			= 0,
1629235911Smav	SES_STATUS_DISPLAY_FAIL_MASK			= 0x40,
1630235911Smav	SES_STATUS_DISPLAY_FAIL_SHIFT			= 6,
1631235911Smav
1632235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_BYTE		= 0,
1633235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_MASK		= 0x03,
1634235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_SHIFT		= 6,
1635235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_UNSUPP	= 0x0,
1636235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD_SUPP	= 0x1,
1637235911Smav	SES_STATUS_DISPLAY_DISPLAY_MODE_DC_FIELD	= 0x2
1638235911Smav};
1639235911Smav
1640235911Smav#define GEN_SES_STATUS_DISPLAY_ACCESSORS(LCASE, UCASE)	\
1641235911Smav    GEN_GETTER(ses_status_display, SES_STATUS_DISPLAY, LCASE, UCASE)
1642235911SmavGEN_SES_STATUS_DISPLAY_ACCESSORS(ident,        IDENT)
1643235911SmavGEN_SES_STATUS_DISPLAY_ACCESSORS(fail,         FAIL)
1644235911SmavGEN_SES_STATUS_DISPLAY_ACCESSORS(display_mode, DISPLAY_MODE)
1645235911Smav#undef GEN_SES_STATUS_DISPLAY_ACCESSORS
1646235911Smav
1647235911Smav/*----------------------- Key Pad Entry Status Element -----------------------*/
1648235911Smavstruct ses_status_key_pad_entry {
1649235911Smav	struct ses_status_common common;
1650235911Smav	uint8_t bytes[3];
1651235911Smav};
1652235911Smav
1653235911Smavenum ses_status_key_pad_entry_field_data {
1654235911Smav	SES_STATUS_KEY_PAD_ENTRY_IDENT_BYTE	= 0,
1655235911Smav	SES_STATUS_KEY_PAD_ENTRY_IDENT_MASK	= 0x80,
1656235911Smav	SES_STATUS_KEY_PAD_ENTRY_IDENT_SHIFT	= 7,
1657235911Smav
1658235911Smav	SES_STATUS_KEY_PAD_ENTRY_FAIL_BYTE	= 0,
1659235911Smav	SES_STATUS_KEY_PAD_ENTRY_FAIL_MASK	= 0x40,
1660235911Smav	SES_STATUS_KEY_PAD_ENTRY_FAIL_SHIFT	= 6
1661235911Smav};
1662235911Smav
1663235911Smav#define GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(LCASE, UCASE)	\
1664235911Smav    GEN_GETTER(ses_status_key_pad_entry, SES_STATUS_KEY_PAD_ENTRY, LCASE, UCASE)
1665235911SmavGEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(ident, IDENT)
1666235911SmavGEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS(fail,  FAIL)
1667235911Smav#undef GEN_SES_STATUS_KEY_PAD_ENTRY_ACCESSORS
1668235911Smav
1669235911Smav/*------------------------- Enclosure Status Element -------------------------*/
1670235911Smavstruct ses_status_enclosure {
1671235911Smav	struct ses_status_common common;
1672235911Smav	uint8_t bytes[3];
1673235911Smav};
1674235911Smav
1675235911Smavenum ses_status_enclosure_field_data {
1676235911Smav	SES_STATUS_ENCLOSURE_IDENT_BYTE					= 0,
1677235911Smav	SES_STATUS_ENCLOSURE_IDENT_MASK					= 0x80,
1678235911Smav	SES_STATUS_ENCLOSURE_IDENT_SHIFT				= 7,
1679235911Smav
1680235911Smav	SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_BYTE		= 1,
1681235911Smav	SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_MASK		= 0xFC,
1682235911Smav	SES_STATUS_ENCLOSURE_TIME_UNTIL_POWER_CYCLE_SHIFT		= 2,
1683235911Smav
1684235911Smav	SES_STATUS_ENCLOSURE_FAIL_BYTE					= 1,
1685235911Smav	SES_STATUS_ENCLOSURE_FAIL_MASK					= 0x02,
1686235911Smav	SES_STATUS_ENCLOSURE_FAIL_SHIFT					= 1,
1687235911Smav
1688235911Smav	SES_STATUS_ENCLOSURE_WARN_BYTE					= 1,
1689235911Smav	SES_STATUS_ENCLOSURE_WARN_MASK					= 0x01,
1690235911Smav	SES_STATUS_ENCLOSURE_WARN_SHIFT					= 0,
1691235911Smav
1692235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_BYTE		= 2,
1693235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MASK		= 0xFC,
1694235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_SHIFT		= 2,
1695235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MAX_AUTO	= 60,
1696235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_POWER_OFF_DURATION_MANUAL	= 63,
1697235911Smav
1698235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_FAIL_BYTE			= 2,
1699235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_FAIL_MASK			= 0x02,
1700235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_FAIL_SHIFT			= 1,
1701235911Smav
1702235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_WARN_BYTE			= 2,
1703235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_WARN_MASK			= 0x01,
1704235911Smav	SES_STATUS_ENCLOSURE_REQUESTED_WARN_SHIFT			= 0
1705235911Smav};
1706235911Smav
1707235911Smav#define GEN_SES_STATUS_ENCLOSURE_ACCESSORS(LCASE, UCASE)		\
1708235911Smav    GEN_GETTER(ses_status_enclosure, SES_STATUS_ENCLOSURE, LCASE, UCASE)
1709235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(ident,          IDENT)
1710235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(time_until_power_cycle,
1711235911Smav				   TIME_UNTIL_POWER_CYCLE)
1712235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(fail,           FAIL)
1713235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(warn,           WARN)
1714235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_power_off_duration,
1715235911Smav				   REQUESTED_POWER_OFF_DURATION)
1716235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_fail, REQUESTED_FAIL)
1717235911SmavGEN_SES_STATUS_ENCLOSURE_ACCESSORS(requested_warn, REQUESTED_WARN)
1718235911Smav#undef GEN_SES_STATUS_ENCLOSURE_ACCESSORS
1719235911Smav
1720235911Smav/*------------------- SCSI Port/Transceiver Status Element -------------------*/
1721235911Smavstruct ses_status_scsi_port_or_xcvr {
1722235911Smav	struct ses_status_common common;
1723235911Smav	uint8_t bytes[3];
1724235911Smav};
1725235911Smav
1726235911Smavenum ses_status_scsi_port_or_xcvr_field_data {
1727235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_BYTE		= 0,
1728235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_MASK		= 0x80,
1729235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_IDENT_SHIFT	= 7,
1730235911Smav
1731235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_BYTE		= 0,
1732235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_MASK		= 0x40,
1733235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_FAIL_SHIFT		= 6,
1734235911Smav
1735235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_BYTE	= 1,
1736235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_MASK	= 0x01,
1737235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_REPORT_SHIFT	= 0,
1738235911Smav
1739235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_BYTE	= 2,
1740235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_MASK	= 0x10,
1741235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_DISABLED_SHIFT	= 4,
1742235911Smav
1743235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_LOL_BYTE		= 2,
1744235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_LOL_MASK		= 0x02,
1745235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_LOL_SHIFT		= 1,
1746235911Smav
1747235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_BYTE	= 2,
1748235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_MASK	= 0x01,
1749235911Smav	SES_STATUS_SCSI_PORT_OR_XCVR_XMIT_FAIL_SHIFT	= 0
1750235911Smav};
1751235911Smav
1752235911Smav#define GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(LCASE, UCASE)	 \
1753235911Smav    GEN_GETTER(ses_status_scsi_port_or_xcvr, SES_STATUS_SCSI_PORT_OR_XCVR,\
1754235911Smav	       LCASE, UCASE)
1755235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(ident,     IDENT)
1756235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(fail,      FAIL)
1757235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(report,    REPORT)
1758235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(disable,   DISABLED)
1759235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(lol,       LOL)
1760235911SmavGEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS(xmit_fail, XMIT_FAIL)
1761235911Smav#undef GEN_SES_STATUS_SCSI_PORT_OR_XCVR_ACCESSORS
1762235911Smav
1763235911Smav/*------------------------- Language Status Element --------------------------*/
1764235911Smavstruct ses_status_language {
1765235911Smav	struct ses_status_common common;
1766235911Smav	uint8_t bytes[1];
1767235911Smav	uint8_t language_code[2];
1768235911Smav};
1769235911Smav
1770235911Smavenum ses_status_language_field_data {
1771235911Smav	SES_STATUS_LANGUAGE_IDENT_BYTE	= 0,
1772235911Smav	SES_STATUS_LANGUAGE_IDENT_MASK	= 0x80,
1773235911Smav	SES_STATUS_LANGUAGE_IDENT_SHIFT	= 7
1774235911Smav};
1775235911Smav
1776235911Smav#define GEN_SES_STATUS_LANGUAGE_ACCESSORS(LCASE, UCASE)		 \
1777235911Smav    GEN_GETTER(ses_status_language, SES_STATUS_LANGUAGE, LCASE, UCASE)
1778235911SmavGEN_SES_STATUS_LANGUAGE_ACCESSORS(ident, IDENT)
1779235911Smav#undef GEN_SES_STATUS_LANGUAGE_ACCESSORS
1780235911Smav
1781235911Smav/*-------------------- Communication Port Status Element ---------------------*/
1782235911Smavstruct ses_status_comm_port {
1783235911Smav	struct ses_status_common common;
1784235911Smav	uint8_t bytes[3];
1785235911Smav};
1786235911Smav
1787235911Smavenum ses_status_comm_port_field_data {
1788235911Smav	SES_STATUS_COMM_PORT_IDENT_BYTE		= 0,
1789235911Smav	SES_STATUS_COMM_PORT_IDENT_MASK		= 0x80,
1790235911Smav	SES_STATUS_COMM_PORT_IDENT_SHIFT	= 7,
1791235911Smav
1792235911Smav	SES_STATUS_COMM_PORT_FAIL_BYTE		= 0,
1793235911Smav	SES_STATUS_COMM_PORT_FAIL_MASK		= 0x40,
1794235911Smav	SES_STATUS_COMM_PORT_FAIL_SHIFT		= 6,
1795235911Smav
1796235911Smav	SES_STATUS_COMM_PORT_DISABLED_BYTE	= 2,
1797235911Smav	SES_STATUS_COMM_PORT_DISABLED_MASK	= 0x01,
1798235911Smav	SES_STATUS_COMM_PORT_DISABLED_SHIFT	= 0
1799235911Smav};
1800235911Smav
1801235911Smav#define GEN_SES_STATUS_COMM_PORT_ACCESSORS(LCASE, UCASE)		 \
1802235911Smav    GEN_GETTER(ses_status_comm_port, SES_STATUS_COMM_PORT, LCASE, UCASE)
1803235911SmavGEN_SES_STATUS_COMM_PORT_ACCESSORS(ident,    IDENT)
1804235911SmavGEN_SES_STATUS_COMM_PORT_ACCESSORS(fail,     FAIL)
1805235911SmavGEN_SES_STATUS_COMM_PORT_ACCESSORS(disabled, DISABLED)
1806235911Smav#undef GEN_SES_STATUS_COMM_PORT_ACCESSORS
1807235911Smav
1808235911Smav/*---------------------- Voltage Sensor Status Element -----------------------*/
1809235911Smavstruct ses_status_voltage_sensor {
1810235911Smav	struct ses_status_common common;
1811235911Smav	uint8_t bytes[1];
1812235911Smav	uint8_t voltage[2];
1813235911Smav};
1814235911Smav
1815235911Smavenum ses_status_voltage_sensor_field_data {
1816235911Smav	SES_STATUS_VOLTAGE_SENSOR_IDENT_BYTE		= 0,
1817235911Smav	SES_STATUS_VOLTAGE_SENSOR_IDENT_MASK		= 0x80,
1818235911Smav	SES_STATUS_VOLTAGE_SENSOR_IDENT_SHIFT		= 7,
1819235911Smav
1820235911Smav	SES_STATUS_VOLTAGE_SENSOR_FAIL_BYTE		= 0,
1821235911Smav	SES_STATUS_VOLTAGE_SENSOR_FAIL_MASK		= 0x40,
1822235911Smav	SES_STATUS_VOLTAGE_SENSOR_FAIL_SHIFT		= 6,
1823235911Smav
1824235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_BYTE	= 0,
1825235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_MASK	= 0x08,
1826235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_OVER_SHIFT	= 3,
1827235911Smav
1828235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_BYTE	= 0,
1829235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_MASK	= 0x04,
1830235911Smav	SES_STATUS_VOLTAGE_SENSOR_WARN_UNDER_SHIFT	= 2,
1831235911Smav
1832235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_BYTE	= 0,
1833235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_MASK	= 0x02,
1834235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_OVER_SHIFT	= 1,
1835235911Smav
1836235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_BYTE	= 0,
1837235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_MASK	= 0x01,
1838235911Smav	SES_STATUS_VOLTAGE_SENSOR_CRIT_UNDER_SHIFT	= 0
1839235911Smav};
1840235911Smav
1841235911Smav#define GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(LCASE, UCASE)		\
1842235911Smav    GEN_GETTER(ses_status_voltage_sensor, SES_STATUS_VOLTAGE_SENSOR,	\
1843235911Smav		  LCASE, UCASE)
1844235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(ident,      IDENT)
1845235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(fail,       FAIL)
1846235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_over,  WARN_OVER)
1847235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(warn_under, WARN_UNDER)
1848235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_over,  CRIT_OVER)
1849235911SmavGEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS(crit_under, CRIT_UNDER)
1850235911Smav#undef GEN_SES_STATUS_VOLTAGE_SENSOR_ACCESSORS
1851235911Smav
1852235911Smav/*---------------------- Current Sensor Status Element -----------------------*/
1853235911Smavstruct ses_status_current_sensor {
1854235911Smav	struct ses_status_common common;
1855235911Smav	uint8_t bytes[3];
1856235911Smav};
1857235911Smav
1858235911Smavenum ses_status_current_sensor_field_data {
1859235911Smav	SES_STATUS_CURRENT_SENSOR_IDENT_BYTE		= 0,
1860235911Smav	SES_STATUS_CURRENT_SENSOR_IDENT_MASK		= 0x80,
1861235911Smav	SES_STATUS_CURRENT_SENSOR_IDENT_SHIFT		= 7,
1862235911Smav
1863235911Smav	SES_STATUS_CURRENT_SENSOR_FAIL_BYTE		= 0,
1864235911Smav	SES_STATUS_CURRENT_SENSOR_FAIL_MASK		= 0x40,
1865235911Smav	SES_STATUS_CURRENT_SENSOR_FAIL_SHIFT		= 6,
1866235911Smav
1867235911Smav	SES_STATUS_CURRENT_SENSOR_WARN_OVER_BYTE	= 0,
1868235911Smav	SES_STATUS_CURRENT_SENSOR_WARN_OVER_MASK	= 0x08,
1869235911Smav	SES_STATUS_CURRENT_SENSOR_WARN_OVER_SHIFT	= 3,
1870235911Smav
1871235911Smav	SES_STATUS_CURRENT_SENSOR_CRIT_OVER_BYTE	= 0,
1872235911Smav	SES_STATUS_CURRENT_SENSOR_CRIT_OVER_MASK	= 0x02,
1873235911Smav	SES_STATUS_CURRENT_SENSOR_CRIT_OVER_SHIFT	= 1
1874235911Smav};
1875235911Smav
1876235911Smav#define GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(LCASE, UCASE)		\
1877235911Smav    GEN_GETTER(ses_status_current_sensor, SES_STATUS_CURRENT_SENSOR,	\
1878235911Smav		  LCASE, UCASE)
1879235911SmavGEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(ident,      IDENT)
1880235911SmavGEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(fail,       FAIL)
1881235911SmavGEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(warn_over,  WARN_OVER)
1882235911SmavGEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS(crit_over,  CRIT_OVER)
1883235911Smav#undef GEN_SES_STATUS_CURRENT_SENSOR_ACCESSORS
1884235911Smav
1885235911Smav/*--------------------- SCSI Target Port Status Element ----------------------*/
1886235911Smavstruct ses_status_target_port {
1887235911Smav	struct ses_status_common common;
1888235911Smav	uint8_t bytes[3];
1889235911Smav};
1890235911Smav
1891235911Smavenum ses_status_scsi_target_port_field_data {
1892235911Smav	SES_STATUS_TARGET_PORT_IDENT_BYTE	= 0,
1893235911Smav	SES_STATUS_TARGET_PORT_IDENT_MASK	= 0x80,
1894235911Smav	SES_STATUS_TARGET_PORT_IDENT_SHIFT	= 7,
1895235911Smav
1896235911Smav	SES_STATUS_TARGET_PORT_FAIL_BYTE	= 0,
1897235911Smav	SES_STATUS_TARGET_PORT_FAIL_MASK	= 0x40,
1898235911Smav	SES_STATUS_TARGET_PORT_FAIL_SHIFT	= 6,
1899235911Smav
1900235911Smav	SES_STATUS_TARGET_PORT_REPORT_BYTE	= 1,
1901235911Smav	SES_STATUS_TARGET_PORT_REPORT_MASK	= 0x01,
1902235911Smav	SES_STATUS_TARGET_PORT_REPORT_SHIFT	= 0,
1903235911Smav
1904235911Smav	SES_STATUS_TARGET_PORT_ENABLED_BYTE	= 2,
1905235911Smav	SES_STATUS_TARGET_PORT_ENABLED_MASK	= 0x01,
1906235911Smav	SES_STATUS_TARGET_PORT_ENABLED_SHIFT	= 0
1907235911Smav};
1908235911Smav
1909235911Smav#define GEN_SES_STATUS_TARGET_PORT_ACCESSORS(LCASE, UCASE)	\
1910235911Smav    GEN_GETTER(ses_status_target_port, SES_STATUS_TARGET_PORT, LCASE, UCASE)
1911235911SmavGEN_SES_STATUS_TARGET_PORT_ACCESSORS(ident,   IDENT)
1912235911SmavGEN_SES_STATUS_TARGET_PORT_ACCESSORS(fail,    FAIL)
1913235911SmavGEN_SES_STATUS_TARGET_PORT_ACCESSORS(report,  REPORT)
1914235911SmavGEN_SES_STATUS_TARGET_PORT_ACCESSORS(enabled, ENABLED)
1915235911Smav#undef GEN_SES_STATUS_TARGET_PORT_ACCESSORS
1916235911Smav
1917235911Smav/*-------------------- SCSI Initiator Port Status Element --------------------*/
1918235911Smavstruct ses_status_initiator_port {
1919235911Smav	struct ses_status_common common;
1920235911Smav	uint8_t bytes[3];
1921235911Smav};
1922235911Smav
1923235911Smavenum ses_status_scsi_initiator_port_field_data {
1924235911Smav	SES_STATUS_INITIATOR_PORT_IDENT_BYTE	= 0,
1925235911Smav	SES_STATUS_INITIATOR_PORT_IDENT_MASK	= 0x80,
1926235911Smav	SES_STATUS_INITIATOR_PORT_IDENT_SHIFT	= 7,
1927235911Smav
1928235911Smav	SES_STATUS_INITIATOR_PORT_FAIL_BYTE	= 0,
1929235911Smav	SES_STATUS_INITIATOR_PORT_FAIL_MASK	= 0x40,
1930235911Smav	SES_STATUS_INITIATOR_PORT_FAIL_SHIFT	= 6,
1931235911Smav
1932235911Smav	SES_STATUS_INITIATOR_PORT_REPORT_BYTE	= 1,
1933235911Smav	SES_STATUS_INITIATOR_PORT_REPORT_MASK	= 0x01,
1934235911Smav	SES_STATUS_INITIATOR_PORT_REPORT_SHIFT	= 0,
1935235911Smav
1936235911Smav	SES_STATUS_INITIATOR_PORT_ENABLED_BYTE	= 2,
1937235911Smav	SES_STATUS_INITIATOR_PORT_ENABLED_MASK	= 0x01,
1938235911Smav	SES_STATUS_INITIATOR_PORT_ENABLED_SHIFT	= 0
1939235911Smav};
1940235911Smav
1941235911Smav#define GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(LCASE, UCASE)		\
1942235911Smav    GEN_GETTER(ses_status_initiator_port, SES_STATUS_INITIATOR_PORT,	\
1943235911Smav	       LCASE, UCASE)
1944235911SmavGEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(ident,   IDENT)
1945235911SmavGEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(fail,    FAIL)
1946235911SmavGEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(report,  REPORT)
1947235911SmavGEN_SES_STATUS_INITIATOR_PORT_ACCESSORS(enabled, ENABLED)
1948235911Smav#undef GEN_SES_STATUS_INITIATOR_PORT_ACCESSORS
1949235911Smav
1950235911Smav/*-------------------- Simple Subenclosure Status Element --------------------*/
1951235911Smavstruct ses_status_simple_subses {
1952235911Smav	struct ses_status_common common;
1953235911Smav	uint8_t bytes[2];
1954235911Smav	uint8_t short_enclosure_status;
1955235911Smav};
1956235911Smav
1957235911Smavenum ses_status_simple_subses_field_data {
1958235911Smav	SES_STATUS_SIMPlE_SUBSES_IDENT_BYTE	= 0,
1959235911Smav	SES_STATUS_SIMPlE_SUBSES_IDENT_MASK	= 0x80,
1960235911Smav	SES_STATUS_SIMPlE_SUBSES_IDENT_SHIFT	= 7,
1961235911Smav
1962235911Smav	SES_STATUS_SIMPlE_SUBSES_FAIL_BYTE	= 0,
1963235911Smav	SES_STATUS_SIMPlE_SUBSES_FAIL_MASK	= 0x40,
1964235911Smav	SES_STATUS_SIMPlE_SUBSES_FAIL_SHIFT	= 6
1965235911Smav};
1966235911Smav
1967235911Smav#define GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(LCASE, UCASE)		\
1968235911Smav    GEN_GETTER(ses_status_simple_subses, SES_STATUS_SIMPlE_SUBSES,	\
1969235911Smav		  LCASE, UCASE)
1970235911SmavGEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(ident, IDENT)
1971235911SmavGEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS(fail,  FAIL)
1972235911Smav#undef GEN_SES_STATUS_SIMPlE_SUBSES_ACCESSORS
1973235911Smav
1974235911Smav/*----------------------- SAS Expander Status Element ------------------------*/
1975235911Smavstruct ses_status_sas_expander {
1976235911Smav	struct ses_status_common common;
1977235911Smav	uint8_t bytes[3];
1978235911Smav};
1979235911Smav
1980235911Smavenum ses_status_sas_expander_field_data {
1981235911Smav	SES_STATUS_SAS_EXPANDER_IDENT_BYTE	= 0,
1982235911Smav	SES_STATUS_SAS_EXPANDER_IDENT_MASK	= 0x80,
1983235911Smav	SES_STATUS_SAS_EXPANDER_IDENT_SHIFT	= 7,
1984235911Smav
1985235911Smav	SES_STATUS_SAS_EXPANDER_FAIL_BYTE	= 0,
1986235911Smav	SES_STATUS_SAS_EXPANDER_FAIL_MASK	= 0x40,
1987235911Smav	SES_STATUS_SAS_EXPANDER_FAIL_SHIFT	= 6
1988235911Smav};
1989235911Smav
1990235911Smav#define GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(LCASE, UCASE)	\
1991235911Smav    GEN_GETTER(ses_status_sas_expander, SES_STATUS_SAS_EXPANDER,	LCASE, UCASE)
1992235911SmavGEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(ident, IDENT)
1993235911SmavGEN_SES_STATUS_SAS_EXPANDER_ACCESSORS(fail,  FAIL)
1994235911Smav#undef GEN_SES_STATUS_SAS_EXPANDER_ACCESSORS
1995235911Smav
1996235911Smav/*----------------------- SAS Connector Status Element -----------------------*/
1997235911Smavstruct ses_status_sas_connector {
1998235911Smav	struct ses_status_common common;
1999235911Smav	uint8_t bytes[3];
2000235911Smav};
2001235911Smav
2002235911Smavenum ses_status_sas_connector_field_data {
2003235911Smav	SES_STATUS_SAS_CONNECTOR_IDENT_BYTE		= 0,
2004235911Smav	SES_STATUS_SAS_CONNECTOR_IDENT_MASK		= 0x80,
2005235911Smav	SES_STATUS_SAS_CONNECTOR_IDENT_SHIFT		= 7,
2006235911Smav
2007235911Smav	SES_STATUS_SAS_CONNECTOR_TYPE_BYTE		= 0,
2008235911Smav	SES_STATUS_SAS_CONNECTOR_TYPE_MASK		= 0x7F,
2009235911Smav	SES_STATUS_SAS_CONNECTOR_TYPE_SHIFT		= 0,
2010235911Smav
2011235911Smav	SES_STATUS_SAS_CONNECTOR_PHYS_LINK_BYTE		= 1,
2012235911Smav	SES_STATUS_SAS_CONNECTOR_PHYS_LINK_MASK		= 0xFF,
2013235911Smav	SES_STATUS_SAS_CONNECTOR_PHYS_LINK_SHIFT	= 0,
2014235911Smav	SES_STATUS_SAS_CONNECTOR_PHYS_LINK_ALL		= 0xFF,
2015235911Smav
2016235911Smav	SES_STATUS_SAS_CONNECTOR_FAIL_BYTE		= 2,
2017235911Smav	SES_STATUS_SAS_CONNECTOR_FAIL_MASK		= 0x40,
2018235911Smav	SES_STATUS_SAS_CONNECTOR_FAIL_SHIFT		= 6,
2019235911Smav};
2020235911Smav
2021235911Smav#define GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(LCASE, UCASE)		\
2022235911Smav    GEN_GETTER(ses_status_sas_connector, SES_STATUS_SAS_CONNECTOR,	\
2023235911Smav		  LCASE, UCASE)
2024235911SmavGEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(ident,     IDENT)
2025235911SmavGEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(type,      TYPE)
2026235911SmavGEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(phys_link, PHYS_LINK)
2027235911SmavGEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS(fail,      FAIL)
2028235911Smav#undef GEN_SES_STATUS_SAS_CONNECTOR_ACCESSORS
2029235911Smav
2030235911Smav/*------------------------- Universal Status Element -------------------------*/
2031235911Smavunion ses_status_element {
2032235911Smav	struct ses_status_common            common;
2033235911Smav	struct ses_status_dev_slot          dev_slot;
2034235911Smav	struct ses_status_array_dev_slot    array_dev_slot;
2035235911Smav	struct ses_status_power_supply      power_supply;
2036235911Smav	struct ses_status_cooling           cooling;
2037235911Smav	struct ses_status_temp_sensor       temp_sensor;
2038235911Smav	struct ses_status_door_lock         door_lock;
2039235911Smav	struct ses_status_audible_alarm     audible_alarm;
2040235911Smav	struct ses_status_ecc_electronics   ecc_electronics;
2041235911Smav	struct ses_status_scc_electronics   scc_electronics;
2042235911Smav	struct ses_status_nv_cache          nv_cache;
2043235911Smav	struct ses_status_invalid_op_reason invalid_op_reason;
2044235911Smav	struct ses_status_ups               ups;
2045235911Smav	struct ses_status_display           display;
2046235911Smav	struct ses_status_key_pad_entry     key_pad_entry;
2047235911Smav	struct ses_status_scsi_port_or_xcvr scsi_port_or_xcvr;
2048235911Smav	struct ses_status_language          language;
2049235911Smav	struct ses_status_comm_port         comm_port;
2050235911Smav	struct ses_status_voltage_sensor    voltage_sensor;
2051235911Smav	struct ses_status_current_sensor    current_sensor;
2052235911Smav	struct ses_status_target_port       target_port;
2053235911Smav	struct ses_status_initiator_port    initiator_port;
2054235911Smav	struct ses_status_simple_subses     simple_subses;
2055235911Smav	struct ses_status_sas_expander      sas_expander;
2056235911Smav	struct ses_status_sas_connector     sas_connector;
2057235911Smav	uint8_t				    bytes[4];
2058235911Smav};
2059235911Smav
2060235911Smav/*===================== SCSI SES Status Diagnostic Page =====================*/
2061235911Smavstruct ses_status_page {
2062235911Smav	struct ses_page_hdr  hdr;
2063235911Smav	union ses_status_element  elements[];
2064235911Smav};
2065235911Smav
2066235911Smavenum ses_status_page_field_data {
2067235911Smav	SES_STATUS_PAGE_INVOP_MASK	= 0x10,
2068235911Smav	SES_STATUS_PAGE_INVOP_SHIFT	= 4,
2069235911Smav
2070235911Smav	SES_STATUS_PAGE_INFO_MASK	= 0x08,
2071235911Smav	SES_STATUS_PAGE_INFO_SHIFT	= 3,
2072235911Smav
2073235911Smav	SES_STATUS_PAGE_NON_CRIT_MASK	= 0x04,
2074235911Smav	SES_STATUS_PAGE_NON_CRIT_SHIFT	= 2,
2075235911Smav
2076235911Smav	SES_STATUS_PAGE_CRIT_MASK	= 0x02,
2077235911Smav	SES_STATUS_PAGE_CRIT_SHIFT	= 1,
2078235911Smav
2079235911Smav	SES_STATUS_PAGE_UNRECOV_MASK	= 0x01,
2080235911Smav	SES_STATUS_PAGE_UNRECOV_SHIFT	= 0,
2081235911Smav
2082235911Smav	SES_STATUS_PAGE_CHANGED_MASK	= SES_STATUS_PAGE_INVOP_MASK
2083235911Smav					| SES_STATUS_PAGE_INFO_MASK
2084235911Smav					| SES_STATUS_PAGE_NON_CRIT_MASK
2085235911Smav					| SES_STATUS_PAGE_CRIT_MASK
2086235911Smav					| SES_STATUS_PAGE_UNRECOV_MASK,
2087235911Smav	SES_STATUS_PAGE_CHANGED_SHIFT	= 0,
2088235911Smav};
2089235911Smav
2090235911Smav#define GEN_SES_STATUS_PAGE_ACCESSORS(LCASE, UCASE) \
2091235911Smav    GEN_HDR_ACCESSORS(ses_status_page, SES_STATUS_PAGE, LCASE, UCASE)
2092235911Smav
2093235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(invop,    INVOP)
2094235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(info,     INFO)
2095235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(non_crit, NON_CRIT)
2096235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(crit,     CRIT)
2097235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(unrecov,  UNRECOV)
2098235911SmavGEN_SES_STATUS_PAGE_ACCESSORS(changed,  CHANGED)
2099235911Smav#undef GEN_SES_STATUS_PAGE_ACCESSORS
2100235911Smav
2101235911Smav/*================ SCSI SES Element Descriptor Diagnostic Page ===============*/
2102235911Smavstruct ses_elem_descr {
2103235911Smav	uint8_t	reserved[2];
2104235911Smav	uint8_t	length[2];
2105235911Smav	char	description[];
2106235911Smav};
2107235911Smav
2108235911Smavstruct ses_elem_descr_page {
2109235911Smav	struct ses_page_hdr   hdr;
2110235911Smav	struct ses_elem_descr descrs[];
2111235911Smav};
2112235911Smav
2113235911Smav/*============ SCSI SES Additional Element Status Diagnostic Page ============*/
2114235911Smavstruct ses_addl_elem_status_page {
2115235911Smav	struct ses_page_hdr   hdr;
2116235911Smav};
2117235911Smav
2118235911Smav/*====================== Legacy (Deprecated) Structures ======================*/
2119235911Smavstruct ses_control_page_hdr {
2120235911Smav	uint8_t page_code;
2121235911Smav	uint8_t control_flags;
2122235911Smav	uint8_t length[2];
2123235911Smav	uint8_t gen_code[4];
2124235911Smav/* Followed by variable length array of descriptors. */
2125235911Smav};
2126235911Smav
2127235911Smavstruct ses_status_page_hdr {
2128235911Smav	uint8_t page_code;
2129235911Smav	uint8_t status_flags;
2130235911Smav	uint8_t length[2];
2131235911Smav	uint8_t gen_code[4];
2132235911Smav/* Followed by variable length array of descriptors. */
2133235911Smav};
2134235911Smav
2135235911Smav/* ses_page_hdr.reserved values */
213656027Smjacob/*
2137235911Smav * Enclosure Status Diagnostic Page:
2138235911Smav * uint8_t	reserved : 3,
2139235911Smav * 		invop : 1,
2140235911Smav * 		info : 1,
2141235911Smav * 		noncritical : 1,
2142235911Smav * 		critical : 1,
2143235911Smav * 		unrecov : 1;
214456027Smjacob */
2145235911Smav#define	SES_ENCSTAT_UNRECOV		0x01
2146235911Smav#define	SES_ENCSTAT_CRITICAL		0x02
2147235911Smav#define	SES_ENCSTAT_NONCRITICAL		0x04
2148235911Smav#define	SES_ENCSTAT_INFO		0x08
2149235911Smav#define	SES_ENCSTAT_INVOP		0x10
2150235911Smav/* Status mask: All of the above OR'd together */
2151235911Smav#define	SES_STATUS_MASK			0x1f
2152235911Smav#define	SES_SET_STATUS_MASK		0xf
2153235911Smav/* Element Descriptor Diagnostic Page: unused */
2154235911Smav/* Additional Element Status Diagnostic Page: unused */
215556027Smjacob
2156235911Smav
2157235911Smav
215856027Smjacob/* Summary SES Status Defines, Common Status Codes */
215956027Smjacob#define	SES_OBJSTAT_UNSUPPORTED		0
216056027Smjacob#define	SES_OBJSTAT_OK			1
216156027Smjacob#define	SES_OBJSTAT_CRIT		2
216256027Smjacob#define	SES_OBJSTAT_NONCRIT		3
216356027Smjacob#define	SES_OBJSTAT_UNRECOV		4
216456027Smjacob#define	SES_OBJSTAT_NOTINSTALLED	5
216556027Smjacob#define	SES_OBJSTAT_UNKNOWN		6
216656027Smjacob#define	SES_OBJSTAT_NOTAVAIL		7
2167235911Smav#define	SES_OBJSTAT_NOACCESS		8
216856027Smjacob
216956027Smjacob/*
217056027Smjacob * For control pages, cstat[0] is the same for the
217156027Smjacob * enclosure and is common across all device types.
217256027Smjacob *
217356027Smjacob * If SESCTL_CSEL is set, then PRDFAIL, DISABLE and RSTSWAP
217456027Smjacob * are checked, otherwise bits that are specific to the device
217556027Smjacob * type in the other 3 bytes of cstat or checked.
217656027Smjacob */
217756027Smjacob#define	SESCTL_CSEL		0x80
217856027Smjacob#define	SESCTL_PRDFAIL		0x40
217956027Smjacob#define	SESCTL_DISABLE		0x20
218056027Smjacob#define	SESCTL_RSTSWAP		0x10
218156027Smjacob
218256027Smjacob
218356027Smjacob/* Control bits, Device Elements, byte 2 */
218456027Smjacob#define	SESCTL_DRVLCK	0x40	/* "DO NOT REMOVE" */
218556027Smjacob#define	SESCTL_RQSINS	0x08	/* RQST INSERT */
218656027Smjacob#define	SESCTL_RQSRMV	0x04	/* RQST REMOVE */
218756027Smjacob#define	SESCTL_RQSID	0x02	/* RQST IDENT */
218856027Smjacob/* Control bits, Device Elements, byte 3 */
218956027Smjacob#define	SESCTL_RQSFLT	0x20	/* RQST FAULT */
219056027Smjacob#define	SESCTL_DEVOFF	0x10	/* DEVICE OFF */
219156027Smjacob
219256027Smjacob/* Control bits, Generic, byte 3 */
219356027Smjacob#define	SESCTL_RQSTFAIL	0x40
219456027Smjacob#define	SESCTL_RQSTON	0x20
219556069Smjacob
219656027Smjacob/*
219756069Smjacob * Getting text for an object type is a little
219856069Smjacob * trickier because it's string data that can
219956069Smjacob * go up to 64 KBytes. Build this union and
220056069Smjacob * fill the obj_id with the id of the object who's
220156069Smjacob * help text you want, and if text is available,
220256069Smjacob * obj_text will be filled in, null terminated.
220356027Smjacob */
220456027Smjacob
220556069Smjacobtypedef union {
220656069Smjacob	unsigned int obj_id;
220756069Smjacob	char obj_text[1];
220856069Smjacob} ses_hlptxt;
2209235911Smav
2210235911Smav/*============================================================================*/
2211235911Smavstruct ses_elm_desc_hdr {
2212235911Smav	uint8_t reserved[2];
2213235911Smav	uint8_t length[2];
2214235911Smav};
2215235911Smav
2216235911Smav/*
2217235911Smav * SES v2 r20 6.1.13 - Element Additional Status diagnostic page
2218235911Smav * Tables 26-28 (general), 29-32 (FC), 33-41 (SAS)
2219235911Smav *
2220235911Smav * Protocol identifier uses definitions in scsi_all.h;
2221235911Smav * SPSP_PROTO_FC, SPSP_PROTO_SAS are the only ones used here.
2222235911Smav */
2223235911Smav
2224235911Smavstruct ses_elm_fc_eip_hdr {
2225235911Smav	uint8_t num_phys;
2226235911Smav	uint8_t reserved[2];
2227235911Smav	uint8_t dev_slot_num;
2228235911Smav	uint8_t node_name[8];
2229235911Smav};
2230235911Smav
2231235911Smavstruct ses_elm_fc_noneip_hdr {
2232235911Smav	uint8_t num_phys;
2233235911Smav	uint8_t reserved;
2234235911Smav	uint8_t node_name[8];
2235235911Smav};
2236235911Smav
2237235911Smavstruct ses_elm_fc_base_hdr {
2238235911Smav	uint8_t num_phys;
2239235911Smav};
2240235911Smav
2241235911Smavunion ses_elm_fc_hdr {
2242235911Smav	struct ses_elm_fc_base_hdr	base_hdr;
2243235911Smav	struct ses_elm_fc_eip_hdr	eip_hdr;
2244235911Smav	struct ses_elm_fc_noneip_hdr	noneip_hdr;
2245235911Smav};
2246235911Smav
2247235911Smavstruct ses_elm_fc_port {
2248235911Smav	uint8_t port_loop_position;
2249235911Smav	uint8_t bypass_reason;
2250235911Smav#define SES_FC_PORT_BYPASS_UNBYPASSED			0x00
2251235911Smav
2252235911Smav#define	SES_FC_PORT_BYPASS_LINKFAIL_RATE_TOO_HIGH	0x10
2253235911Smav#define	SES_FC_PORT_BYPASS_SYNC_LOSS_RATE_TOO_HIGH	0x11
2254235911Smav#define	SES_FC_PORT_BYPASS_SIGNAL_LOSS_RATE_TOO_HIGH	0x12
2255235911Smav#define	SES_FC_PORT_BYPASS_SEQPROTO_ERR_RATE_TOO_HIGH	0x13
2256235911Smav#define	SES_FC_PORT_BYPASS_INVAL_XMIT_RATE_TOO_HIGH	0x14
2257235911Smav#define	SES_FC_PORT_BYPASS_CRC_ERR_RATE_TOO_HIGH	0x15
2258235911Smav
2259235911Smav#define	SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_BEGIN	0x16
2260235911Smav#define	SES_FC_PORT_BYPASS_ERR_RATE_RESERVED_END	0x1F
2261235911Smav
2262235911Smav#define	SES_FC_PORT_BYPASS_LINKFAIL_COUNT_TOO_HIGH	0x20
2263235911Smav#define	SES_FC_PORT_BYPASS_SYNC_LOSS_COUNT_TOO_HIGH	0x21
2264235911Smav#define	SES_FC_PORT_BYPASS_SIGNAL_LOSS_COUNT_TOO_HIGH	0x22
2265235911Smav#define	SES_FC_PORT_BYPASS_SEQPROTO_ERR_COUNT_TOO_HIGH	0x23
2266235911Smav#define	SES_FC_PORT_BYPASS_INVAL_XMIT_COUNT_TOO_HIGH	0x24
2267235911Smav#define	SES_FC_PORT_BYPASS_CRC_ERR_COUNT_TOO_HIGH	0x25
2268235911Smav
2269235911Smav#define	SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_BEGIN	0x26
2270235911Smav#define	SES_FC_PORT_BYPASS_ERR_COUNT_RESERVED_END	0x2F
2271235911Smav
2272235911Smav#define	SES_FC_PORT_BYPASS_RESERVED_BEGIN		0x30
2273235911Smav#define	SES_FC_PORT_BYPASS_RESERVED_END			0xBF
2274235911Smav
2275235911Smav#define	SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_BEGIN	0xC0
2276235911Smav#define	SES_FC_PORT_BYPASS_VENDOR_SPECIFIC_END		0xFF
2277235911Smav	uint8_t port_req_hard_addr;
2278235911Smav	uint8_t n_port_id[3];
2279235911Smav	uint8_t n_port_name[8];
2280235911Smav};
2281235911Smav
2282235911Smavstruct ses_elm_sas_device_phy {
2283235911Smav	uint8_t byte0;
2284235911Smav	/*
2285235911Smav	 * uint8_t reserved0 : 1,
2286235911Smav	 * uint8_t device_type : 3,
2287235911Smav	 * uint8_t reserved1 : 4;
2288235911Smav	 */
2289235911Smav
2290235911Smav	uint8_t reserved0;
2291235911Smav
2292235911Smav	/* Bit positions for initiator and target port protocols */
2293235911Smav#define	SES_SASOBJ_DEV_PHY_SMP		0x2
2294235911Smav#define	SES_SASOBJ_DEV_PHY_STP		0x4
2295235911Smav#define	SES_SASOBJ_DEV_PHY_SSP		0x8
2296235911Smav	/* Select all of the above protocols */
2297235911Smav#define	SES_SASOBJ_DEV_PHY_PROTOMASK	0xe
2298235911Smav	uint8_t initiator_ports;
2299235911Smav	/*
2300235911Smav	 * uint8_t reserved0 : 4,
2301235911Smav	 * uint8_t ssp : 1,
2302235911Smav	 * uint8_t stp : 1,
2303235911Smav	 * uint8_t smp : 1,
2304235911Smav	 * uint8_t reserved1 : 3;
2305235911Smav	 */
2306235911Smav	uint8_t target_ports;
2307235911Smav	/*
2308235911Smav	 * uint8_t sata_port_selector : 1,
2309235911Smav	 * uint8_t reserved : 3,
2310235911Smav	 * uint8_t ssp : 1,
2311235911Smav	 * uint8_t stp : 1,
2312235911Smav	 * uint8_t smp : 1,
2313235911Smav	 * uint8_t sata_device : 1;
2314235911Smav	 */
2315235911Smav	uint8_t parent_addr[8];		/* SAS address of parent */
2316235911Smav	uint8_t phy_addr[8];		/* SAS address of this phy */
2317235911Smav	uint8_t phy_id;
2318235911Smav	uint8_t reserved1[7];
2319235911Smav};
2320235911Smav#ifdef _KERNEL
2321235911Smavint ses_elm_sas_dev_phy_sata_dev(struct ses_elm_sas_device_phy *);
2322235911Smavint ses_elm_sas_dev_phy_sata_port(struct ses_elm_sas_device_phy *);
2323235911Smavint ses_elm_sas_dev_phy_dev_type(struct ses_elm_sas_device_phy *);
2324235911Smav#endif	/* _KERNEL */
2325235911Smav
2326235911Smavstruct ses_elm_sas_expander_phy {
2327235911Smav	uint8_t connector_index;
2328235911Smav	uint8_t other_index;
2329235911Smav};
2330235911Smav
2331235911Smavstruct ses_elm_sas_port_phy {
2332235911Smav	uint8_t phy_id;
2333235911Smav	uint8_t reserved;
2334235911Smav	uint8_t connector_index;
2335235911Smav	uint8_t other_index;
2336235911Smav	uint8_t phy_addr[8];
2337235911Smav};
2338235911Smav
2339235911Smavstruct ses_elm_sas_type0_base_hdr {
2340235911Smav	uint8_t num_phys;
2341235911Smav	uint8_t byte1;
2342235911Smav	/*
2343235911Smav	 * uint8_t descriptor_type : 2,
2344235911Smav	 * uint8_t reserved : 5,
2345235911Smav	 * uint8_t not_all_phys : 1;
2346235911Smav	 */
2347235911Smav#define	SES_SASOBJ_TYPE0_NOT_ALL_PHYS(obj)	\
2348235911Smav	((obj)->byte1 & 0x1)
2349235911Smav};
2350235911Smav
2351235911Smavstruct ses_elm_sas_type0_eip_hdr {
2352235911Smav	struct ses_elm_sas_type0_base_hdr base;
2353235911Smav	uint8_t reserved;
2354235911Smav	uint8_t dev_slot_num;
2355235911Smav};
2356235911Smav
2357235911Smavstruct ses_elm_sas_type1_expander_hdr {
2358235911Smav	uint8_t num_phys;
2359235911Smav	uint8_t byte1;
2360235911Smav	/*
2361235911Smav	 * uint8_t descriptor_type : 2,
2362235911Smav	 * uint8_t reserved : 6;
2363235911Smav	 */
2364235911Smav	uint8_t reserved[2];
2365235911Smav	uint8_t sas_addr[8];
2366235911Smav};
2367235911Smav
2368235911Smavstruct ses_elm_sas_type1_nonexpander_hdr {
2369235911Smav	uint8_t num_phys;
2370235911Smav	uint8_t byte1;
2371235911Smav	/*
2372235911Smav	 * uint8_t descriptor_type : 2,
2373235911Smav	 * uint8_t reserved : 6;
2374235911Smav	 */
2375235911Smav	uint8_t reserved[2];
2376235911Smav};
2377235911Smav
2378235911Smav/* NB: This is only usable for as long as the headers happen to match */
2379235911Smavstruct ses_elm_sas_base_hdr {
2380235911Smav	uint8_t num_phys;
2381235911Smav	uint8_t byte1;
2382235911Smav	/*
2383235911Smav	 * uint8_t descriptor_type : 2,
2384235911Smav	 * uint8_t descr_specific : 6;
2385235911Smav	 */
2386235911Smav#define	SES_SASOBJ_TYPE_SLOT	0
2387235911Smav#define	SES_SASOBJ_TYPE_OTHER	1
2388235911Smav};
2389235911Smav
2390235911Smavunion ses_elm_sas_hdr {
2391235911Smav	struct ses_elm_sas_base_hdr 			base_hdr;
2392235911Smav	struct ses_elm_sas_type0_base_hdr		type0_noneip;
2393235911Smav	struct ses_elm_sas_type0_eip_hdr		type0_eip;
2394235911Smav	struct ses_elm_sas_type1_expander_hdr		type1_exp;
2395235911Smav	struct ses_elm_sas_type1_nonexpander_hdr	type1_nonexp;
2396235911Smav};
2397235911Smavint ses_elm_sas_type0_not_all_phys(union ses_elm_sas_hdr *);
2398235911Smavint ses_elm_sas_descr_type(union ses_elm_sas_hdr *);
2399235911Smav
2400235911Smavstruct ses_elm_addlstatus_base_hdr {
2401235911Smav	uint8_t byte0;
2402235911Smav	/*
2403235911Smav	 * uint8_t invalid : 1,
2404235911Smav	 * uint8_t reserved : 2,
2405235911Smav	 * uint8_t eip : 1,
2406235911Smav	 * uint8_t proto_id : 4;
2407235911Smav	 */
2408235911Smav	uint8_t length;
2409235911Smav};
2410235911Smavint ses_elm_addlstatus_proto(struct ses_elm_addlstatus_base_hdr *);
2411235911Smavint ses_elm_addlstatus_eip(struct ses_elm_addlstatus_base_hdr *);
2412235911Smavint ses_elm_addlstatus_invalid(struct ses_elm_addlstatus_base_hdr *);
2413235911Smav
2414235911Smavstruct ses_elm_addlstatus_eip_hdr {
2415235911Smav	struct ses_elm_addlstatus_base_hdr base;
2416309042Smav	uint8_t byte2;
2417309042Smav#define	SES_ADDL_EIP_EIIOE	1
2418235911Smav	uint8_t element_index;
2419235911Smav	/* NB: This define (currently) applies to all eip=1 headers */
2420235911Smav#define	SES_EIP_HDR_EXTRA_LEN	2
2421235911Smav};
2422235911Smav
2423235911Smavunion ses_elm_addlstatus_descr_hdr {
2424235911Smav	struct ses_elm_addlstatus_base_hdr	base;
2425235911Smav	struct ses_elm_addlstatus_eip_hdr	eip;
2426235911Smav};
2427235911Smav
2428235911Smavunion ses_elm_addlstatus_proto_hdr {
2429235911Smav	union ses_elm_fc_hdr	fc;
2430235911Smav	union ses_elm_sas_hdr	sas;
2431235911Smav};
2432235911Smav
2433235911Smav/*============================= Namespace Cleanup ============================*/
2434235911Smav#undef GEN_HDR_ACCESSORS
2435235911Smav#undef GEN_ACCESSORS
2436235911Smav#undef GEN_HDR_SETTER
2437235911Smav#undef GEN_HDR_GETTER
2438235911Smav#undef GEN_SETTER
2439235911Smav#undef GEN_GETTER
2440235911Smav#undef MK_ENUM
2441235911Smav
2442235911Smav#endif	/* _SCSI_SES_H_ */
2443