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