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