The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/cam/scsi/scsi_ses.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 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_ */

Cache object: 41d3c72c07e40fef0c54c279cf0945d2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.