1275c9da8Seschrock /* 2275c9da8Seschrock * CDDL HEADER START 3275c9da8Seschrock * 4275c9da8Seschrock * The contents of this file are subject to the terms of the 5275c9da8Seschrock * Common Development and Distribution License (the "License"). 6275c9da8Seschrock * You may not use this file except in compliance with the License. 7275c9da8Seschrock * 8275c9da8Seschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9275c9da8Seschrock * or http://www.opensolaris.org/os/licensing. 10275c9da8Seschrock * See the License for the specific language governing permissions 11275c9da8Seschrock * and limitations under the License. 12275c9da8Seschrock * 13275c9da8Seschrock * When distributing Covered Code, include this CDDL HEADER in each 14275c9da8Seschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15275c9da8Seschrock * If applicable, add the following below this CDDL HEADER, with the 16275c9da8Seschrock * fields enclosed by brackets "[]" replaced with your own identifying 17275c9da8Seschrock * information: Portions Copyright [yyyy] [name of copyright owner] 18275c9da8Seschrock * 19275c9da8Seschrock * CDDL HEADER END 20275c9da8Seschrock */ 21275c9da8Seschrock 22275c9da8Seschrock /* 23ac88567aSHyon Kim * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 24275c9da8Seschrock */ 25*3fa8bc2dSGarrett D'Amore /* 26*3fa8bc2dSGarrett D'Amore * Copyright 2019 RackTop Systems 27*3fa8bc2dSGarrett D'Amore */ 28275c9da8Seschrock 29275c9da8Seschrock #ifndef _PLUGIN_SES_IMPL_H 30275c9da8Seschrock #define _PLUGIN_SES_IMPL_H 31275c9da8Seschrock 32275c9da8Seschrock #ifdef __cplusplus 33275c9da8Seschrock extern "C" { 34275c9da8Seschrock #endif 35275c9da8Seschrock 36275c9da8Seschrock #include <sys/types.h> 37275c9da8Seschrock #include <sys/sysmacros.h> 38275c9da8Seschrock #include <sys/scsi/impl/uscsi.h> 39275c9da8Seschrock #include <sys/scsi/generic/commands.h> 40275c9da8Seschrock #include <sys/scsi/impl/spc3_types.h> 41275c9da8Seschrock #include <sys/ccompile.h> 42275c9da8Seschrock #include <stdarg.h> 43275c9da8Seschrock #include <libnvpair.h> 44275c9da8Seschrock 45275c9da8Seschrock #include <scsi/libscsi.h> 46275c9da8Seschrock #include <scsi/libses_plugin.h> 47275c9da8Seschrock 48275c9da8Seschrock #pragma pack(1) 49275c9da8Seschrock 50275c9da8Seschrock /* 51275c9da8Seschrock * Generic IO timeout in seconds, from <sys/scsi/targets/ses.h>. 52275c9da8Seschrock */ 53275c9da8Seschrock #define SES2_TIMEOUT 60 54275c9da8Seschrock 55275c9da8Seschrock /* 56275c9da8Seschrock * SES-2 Enclosure Descriptor Header (Table 8, 6.1.2.2) 57275c9da8Seschrock */ 58275c9da8Seschrock typedef struct ses2_ed_hdr_impl { 59275c9da8Seschrock DECL_BITFIELD4( 60275c9da8Seschrock sehi_n_esps :3, 61275c9da8Seschrock _reserved1 :1, 62275c9da8Seschrock sehi_rel_esp_id :3, 63275c9da8Seschrock _reserved2 :1); 64275c9da8Seschrock uint8_t sehi_subenclosure_id; 65275c9da8Seschrock uint8_t sehi_n_etd_hdrs; 66275c9da8Seschrock uint8_t sehi_ed_len; 67275c9da8Seschrock } ses2_ed_hdr_impl_t; 68275c9da8Seschrock 69275c9da8Seschrock /* 70275c9da8Seschrock * SES-2 Enclosure Descriptor (Table 8, 6.1.2.2) 71275c9da8Seschrock */ 72275c9da8Seschrock typedef struct ses2_ed_impl { 73275c9da8Seschrock ses2_ed_hdr_impl_t st_hdr; 74275c9da8Seschrock spc3_naa_id_8_impl_t st_logical_id; 75275c9da8Seschrock char st_vendor_id[8]; 76275c9da8Seschrock char st_product_id[16]; 77275c9da8Seschrock char st_product_revision[4]; 78275c9da8Seschrock uint8_t st_priv[1]; 79275c9da8Seschrock } ses2_ed_impl_t; 80275c9da8Seschrock 81275c9da8Seschrock /* 82275c9da8Seschrock * SES-2 Type Descriptor Header (Table 9, 6.1.2.3) 83275c9da8Seschrock */ 84275c9da8Seschrock typedef struct ses2_td_hdr_impl { 85275c9da8Seschrock uint8_t sthi_element_type; 86275c9da8Seschrock uint8_t sthi_max_elements; 87275c9da8Seschrock uint8_t sthi_subenclosure_id; 88275c9da8Seschrock uint8_t sthi_text_len; 89275c9da8Seschrock } ses2_td_hdr_impl_t; 90275c9da8Seschrock 91275c9da8Seschrock /* 92275c9da8Seschrock * SES-2 Configuration diagnostic page (Table 7, 6.1.2.1) 93275c9da8Seschrock */ 94275c9da8Seschrock typedef struct ses2_config_page_impl { 95275c9da8Seschrock uint8_t scpi_page_code; 96275c9da8Seschrock uint8_t scpi_n_subenclosures; 97275c9da8Seschrock uint16_t scpi_page_length; 98275c9da8Seschrock uint32_t scpi_generation_code; 99275c9da8Seschrock uint8_t scpi_data[1]; 100275c9da8Seschrock } ses2_config_page_impl_t; 101275c9da8Seschrock 102275c9da8Seschrock /* 103275c9da8Seschrock * Logically we should be able to use 4 or 8 bytes for a minimum allocation; 104275c9da8Seschrock * however, it seems at least some devices will fail the request in that case. 105275c9da8Seschrock */ 106275c9da8Seschrock #define SES2_MIN_DIAGPAGE_ALLOC 512 107275c9da8Seschrock 108275c9da8Seschrock /* 109275c9da8Seschrock * SES-2 Element Control and Overall Control fields (Table 59, 7.2.2) 110275c9da8Seschrock */ 111275c9da8Seschrock typedef struct ses2_cmn_elem_ctl_impl { 112275c9da8Seschrock DECL_BITFIELD5( 113275c9da8Seschrock _reserved1 :4, 114275c9da8Seschrock seci_rst_swap :1, 115275c9da8Seschrock seci_disable :1, 116275c9da8Seschrock seci_prdfail :1, 117275c9da8Seschrock seci_select :1); 118275c9da8Seschrock } ses2_cmn_elem_ctl_impl_t; 119275c9da8Seschrock 120275c9da8Seschrock typedef struct ses2_elem_ctl_impl { 121275c9da8Seschrock ses2_cmn_elem_ctl_impl_t seci_common; 122275c9da8Seschrock uint8_t seci_data[3]; 123275c9da8Seschrock } ses2_elem_ctl_impl_t; 124275c9da8Seschrock 125275c9da8Seschrock /* 126275c9da8Seschrock * SES-2 Element Status and Overall Status fields (Table 60, 7.2.3) 127275c9da8Seschrock */ 128275c9da8Seschrock typedef struct ses2_cmn_elem_status_impl { 129275c9da8Seschrock DECL_BITFIELD5( 130275c9da8Seschrock sesi_status_code :4, 131275c9da8Seschrock sesi_swap :1, 132275c9da8Seschrock sesi_disabled :1, 133275c9da8Seschrock sesi_prdfail :1, 134275c9da8Seschrock _reserved1 :1); 135275c9da8Seschrock } ses2_cmn_elem_status_impl_t; 136275c9da8Seschrock 137275c9da8Seschrock typedef struct ses2_elem_status_impl { 138275c9da8Seschrock ses2_cmn_elem_status_impl_t sesi_common; 139275c9da8Seschrock uint8_t sesi_data[3]; 140275c9da8Seschrock } ses2_elem_status_impl_t; 141275c9da8Seschrock 142275c9da8Seschrock /* 143275c9da8Seschrock * SES-2 Device element for the Enclosure Control diagnostic page. 144275c9da8Seschrock */ 145275c9da8Seschrock typedef struct ses2_device_ctl_impl { 146275c9da8Seschrock ses2_cmn_elem_ctl_impl_t sdci_common; 147275c9da8Seschrock uint8_t _reserved1; 148275c9da8Seschrock DECL_BITFIELD8( 149275c9da8Seschrock _reserved2 :1, 150275c9da8Seschrock sdci_rqst_ident :1, 151275c9da8Seschrock sdci_rqst_remove :1, 152275c9da8Seschrock sdci_rqst_insert :1, 153275c9da8Seschrock sdci_rqst_missing :1, 154275c9da8Seschrock _reserved3 :1, 155275c9da8Seschrock sdci_do_not_remove :1, 156275c9da8Seschrock sdci_rqst_active :1); 157275c9da8Seschrock DECL_BITFIELD6( 158275c9da8Seschrock _reserved4 :2, 159275c9da8Seschrock sdci_enable_byp_b :1, 160275c9da8Seschrock sdci_enable_byp_a :1, 161275c9da8Seschrock sdci_device_off :1, 162275c9da8Seschrock sdci_rqst_fault :1, 163275c9da8Seschrock _reserved5 :2); 164275c9da8Seschrock } ses2_device_ctl_impl_t; 165275c9da8Seschrock 166275c9da8Seschrock /* 167275c9da8Seschrock * SES-2 Device element for the Enclosure Status diagnostic page 168275c9da8Seschrock * (Table 64, 7.3.2). 169275c9da8Seschrock */ 170275c9da8Seschrock typedef struct ses2_device_status_impl { 171275c9da8Seschrock ses2_cmn_elem_status_impl_t sdsi_common; 172275c9da8Seschrock uint8_t sdsi_slot_addr; 173275c9da8Seschrock DECL_BITFIELD8( 174275c9da8Seschrock sdsi_report :1, 175275c9da8Seschrock sdsi_ident :1, 176275c9da8Seschrock sdsi_rmv :1, 177275c9da8Seschrock sdsi_ready_to_insert :1, 178275c9da8Seschrock sdsi_enclosure_bypassed_b :1, 179275c9da8Seschrock sdsi_enclosure_bypassed_a :1, 180275c9da8Seschrock sdsi_do_not_remove :1, 181275c9da8Seschrock sdsi_app_client_bypassed_a :1); 182275c9da8Seschrock DECL_BITFIELD8( 183275c9da8Seschrock sdsi_device_bypassed_b :1, 184275c9da8Seschrock sdsi_device_bypassed_a :1, 185275c9da8Seschrock sdsi_bypassed_b :1, 186275c9da8Seschrock sdsi_bypassed_a :1, 187275c9da8Seschrock sdsi_device_off :1, 188275c9da8Seschrock sdsi_fault_reqstd :1, 189275c9da8Seschrock sdsi_fault_sensed :1, 190275c9da8Seschrock sdsi_app_client_bypassed_b :1); 191275c9da8Seschrock } ses2_device_status_impl_t; 192275c9da8Seschrock 193275c9da8Seschrock typedef struct ses2_array_device_ctl_impl { 194275c9da8Seschrock ses2_cmn_elem_ctl_impl_t sadci_common; 195275c9da8Seschrock DECL_BITFIELD8( 196275c9da8Seschrock sadci_rqst_rr_abort :1, 197275c9da8Seschrock sadci_rqst_rebuild :1, 198275c9da8Seschrock sadci_rqst_in_failed_array :1, 199275c9da8Seschrock sadci_rqst_in_crit_array :1, 200275c9da8Seschrock sadci_rqst_cons_check :1, 201275c9da8Seschrock sadci_rqst_hot_spare :1, 202275c9da8Seschrock sadci_rqst_rsvd_device :1, 203275c9da8Seschrock sadci_rqst_ok :1); 204275c9da8Seschrock DECL_BITFIELD8( 205275c9da8Seschrock _reserved1 :1, 206275c9da8Seschrock sadci_rqst_ident :1, 207275c9da8Seschrock sadci_rqst_remove :1, 208275c9da8Seschrock sadci_rqst_insert :1, 209275c9da8Seschrock sadci_rqst_missing :1, 210275c9da8Seschrock _reserved2 :1, 211275c9da8Seschrock sadci_do_not_remove :1, 212275c9da8Seschrock sadci_rqst_active :1); 213275c9da8Seschrock DECL_BITFIELD6( 214275c9da8Seschrock _reserved3 :2, 215275c9da8Seschrock sadci_enable_byp_b :1, 216275c9da8Seschrock sadci_enable_byp_a :1, 217275c9da8Seschrock sadci_device_off :1, 218275c9da8Seschrock sadci_rqst_fault :1, 219275c9da8Seschrock _reserved4 :2); 220275c9da8Seschrock } ses2_array_device_ctl_impl_t; 221275c9da8Seschrock 222275c9da8Seschrock /* 223275c9da8Seschrock * SES-2 Array Device element for the Enclosure Status diagnostic page 224275c9da8Seschrock * (Table 66, 7.3.3) 225275c9da8Seschrock */ 226275c9da8Seschrock typedef struct ses2_array_device_status_impl { 227275c9da8Seschrock ses2_cmn_elem_status_impl_t sadsi_common; 228275c9da8Seschrock DECL_BITFIELD8( 229275c9da8Seschrock sadsi_rr_abort :1, 230275c9da8Seschrock sadsi_rebuild :1, 231275c9da8Seschrock sadsi_in_failed_array :1, 232275c9da8Seschrock sadsi_in_crit_array :1, 233275c9da8Seschrock sadsi_cons_chk :1, 234275c9da8Seschrock sadsi_hot_spare :1, 235275c9da8Seschrock sadsi_rsvd_device :1, 236275c9da8Seschrock sadsi_ok :1); 237275c9da8Seschrock DECL_BITFIELD8( 238275c9da8Seschrock sadsi_report :1, 239275c9da8Seschrock sadsi_ident :1, 240275c9da8Seschrock sadsi_rmv :1, 241275c9da8Seschrock sadsi_ready_to_insert :1, 242275c9da8Seschrock sadsi_enclosure_bypassed_b :1, 243275c9da8Seschrock sadsi_enclosure_bypassed_a :1, 244275c9da8Seschrock sadsi_do_not_remove :1, 245275c9da8Seschrock sadsi_app_client_bypassed_a :1); 246275c9da8Seschrock DECL_BITFIELD8( 247275c9da8Seschrock sadsi_device_bypassed_b :1, 248275c9da8Seschrock sadsi_device_bypassed_a :1, 249275c9da8Seschrock sadsi_bypassed_b :1, 250275c9da8Seschrock sadsi_bypassed_a :1, 251275c9da8Seschrock sadsi_device_off :1, 252275c9da8Seschrock sadsi_fault_reqstd :1, 253275c9da8Seschrock sadsi_fault_sensed :1, 254275c9da8Seschrock sadsi_app_client_bypassed_b :1); 255275c9da8Seschrock } ses2_array_device_status_impl_t; 256275c9da8Seschrock 257275c9da8Seschrock /* 258275c9da8Seschrock * SES-2 Power Supply element for control-type diagnostic pages (T68). 259275c9da8Seschrock */ 260275c9da8Seschrock typedef struct ses2_psu_ctl_impl { 261275c9da8Seschrock ses2_cmn_elem_ctl_impl_t spci_common; 262275c9da8Seschrock DECL_BITFIELD2( 263275c9da8Seschrock _reserved1 :7, 264275c9da8Seschrock spci_rqst_ident :1); 265275c9da8Seschrock uint8_t _reserved2; 266275c9da8Seschrock DECL_BITFIELD4( 267275c9da8Seschrock _reserved3 :5, 268275c9da8Seschrock spci_rqst_on :1, 269275c9da8Seschrock spci_rqst_fail :1, 270275c9da8Seschrock _reserved4 :1); 271275c9da8Seschrock } ses2_psu_ctl_impl_t; 272275c9da8Seschrock 273275c9da8Seschrock /* 274275c9da8Seschrock * SES-2 Power Supply element for status-type diagnostic pages (Table 69, 7.3.4) 275275c9da8Seschrock */ 276275c9da8Seschrock typedef struct ses2_psu_status_impl { 277275c9da8Seschrock ses2_cmn_elem_status_impl_t spsi_common; 278275c9da8Seschrock DECL_BITFIELD2( 279275c9da8Seschrock _reserved1 :7, 280275c9da8Seschrock spsi_ident :1); 281275c9da8Seschrock DECL_BITFIELD5( 282275c9da8Seschrock _reserved2 :1, 283275c9da8Seschrock spsi_dc_over_current :1, 284275c9da8Seschrock spsi_dc_under_voltage :1, 285275c9da8Seschrock spsi_dc_over_voltage :1, 286275c9da8Seschrock _reserved3 :4); 287275c9da8Seschrock DECL_BITFIELD8( 288275c9da8Seschrock spsi_dc_fail :1, 289275c9da8Seschrock spsi_ac_fail :1, 290275c9da8Seschrock spsi_temp_warn :1, 291275c9da8Seschrock spsi_overtmp_fail :1, 292275c9da8Seschrock spsi_off :1, 293275c9da8Seschrock spsi_rqsted_on :1, 294275c9da8Seschrock spsi_fail :1, 295275c9da8Seschrock spsi_hot_swap :1); 296275c9da8Seschrock } ses2_psu_status_impl_t; 297275c9da8Seschrock 298275c9da8Seschrock /* 299275c9da8Seschrock * SES-2 Cooling element for control-type diagnostic pages (Table 70). 300275c9da8Seschrock */ 301275c9da8Seschrock typedef struct ses2_cooling_ctl_impl { 302275c9da8Seschrock ses2_cmn_elem_ctl_impl_t scci_common; 303275c9da8Seschrock DECL_BITFIELD2( 304275c9da8Seschrock _reserved1 :7, 305275c9da8Seschrock scci_rqst_ident :1); 306275c9da8Seschrock uint8_t _reserved2; 307275c9da8Seschrock DECL_BITFIELD5( 308275c9da8Seschrock scci_requested_speed_code :3, 309275c9da8Seschrock _reserved3 :2, 310275c9da8Seschrock scci_rqst_on :1, 311275c9da8Seschrock scci_rqst_fail :1, 312275c9da8Seschrock _reserved4 :1); 313275c9da8Seschrock } ses2_cooling_ctl_impl_t; 314275c9da8Seschrock 315275c9da8Seschrock /* 316275c9da8Seschrock * SES-2 Cooling element for status-type diagnostic pages (Table 71, 7.3.5) 317275c9da8Seschrock */ 318275c9da8Seschrock typedef struct ses2_cooling_status_impl { 319275c9da8Seschrock ses2_cmn_elem_status_impl_t scsi_common; 320275c9da8Seschrock DECL_BITFIELD3( 321275c9da8Seschrock scsi_fan_speed_ms3 :3, 322275c9da8Seschrock _reserved1 :4, 323275c9da8Seschrock scsi_ident :1); 324275c9da8Seschrock uint8_t scsi_fan_speed_lsb; 325275c9da8Seschrock DECL_BITFIELD6( 326275c9da8Seschrock scsi_actual_speed_code :3, 327275c9da8Seschrock _reserved2 :1, 328275c9da8Seschrock scsi_off :1, 329275c9da8Seschrock scsi_requested_on :1, 330275c9da8Seschrock scsi_fail :1, 331275c9da8Seschrock _reserved3 :1); 332275c9da8Seschrock } ses2_cooling_status_impl_t; 333275c9da8Seschrock 334275c9da8Seschrock /* 335275c9da8Seschrock * The fan_speed fields are multiplied by this factor to obtain the actual 336275c9da8Seschrock * number of RPMs. 337275c9da8Seschrock */ 338275c9da8Seschrock #define SES2_ES_COOLING_SPEED_FACTOR 10 339275c9da8Seschrock 340275c9da8Seschrock #define SES2_ES_COOLING_ST_FAN_SPEED(csip) \ 341275c9da8Seschrock (((((uint16_t)(csip)->scsi_fan_speed_ms3) << 8) | \ 342275c9da8Seschrock ((uint16_t)(csip)->scsi_fan_speed_lsb)) * \ 343275c9da8Seschrock (uint16_t)SES2_ES_COOLING_SPEED_FACTOR) 344275c9da8Seschrock 345275c9da8Seschrock /* 346275c9da8Seschrock * SES-2 Temperature Sensor element for control-type diagnostic pages (T74). 347275c9da8Seschrock */ 348275c9da8Seschrock typedef struct ses2_temp_ctl_impl { 349275c9da8Seschrock ses2_cmn_elem_ctl_impl_t stci_common; 350275c9da8Seschrock DECL_BITFIELD3( 351275c9da8Seschrock _reserved1 :6, 352275c9da8Seschrock stci_rqst_fail :1, 353275c9da8Seschrock stci_rqst_ident :1); 354275c9da8Seschrock uint8_t _reserved2[2]; 355275c9da8Seschrock } ses2_temp_ctl_impl_t; 356275c9da8Seschrock 357275c9da8Seschrock /* 358275c9da8Seschrock * SES-2 Temperature Sensor element for status-type diagnostic pages 359275c9da8Seschrock * (Table 74, 7.3.6) 360275c9da8Seschrock */ 361275c9da8Seschrock typedef struct ses2_temp_status_impl { 362275c9da8Seschrock ses2_cmn_elem_status_impl_t stsi_common; 363275c9da8Seschrock DECL_BITFIELD3( 364275c9da8Seschrock _reserved1 :6, 365275c9da8Seschrock stsi_fail :1, 366275c9da8Seschrock stsi_ident :1); 367275c9da8Seschrock uint8_t stsi_temperature; 368275c9da8Seschrock DECL_BITFIELD4( 369275c9da8Seschrock stsi_ut_warn :1, 370275c9da8Seschrock stsi_ut_fail :1, 371275c9da8Seschrock stsi_ot_warn :1, 372275c9da8Seschrock stsi_ot_fail :1); 373275c9da8Seschrock } ses2_temp_status_impl_t; 374275c9da8Seschrock 375275c9da8Seschrock #define SES2_ES_TEMP_OFFSET (-20) 376275c9da8Seschrock 377275c9da8Seschrock #define SES2_ES_TEMP_ST_TEMPERATURE(tsip) \ 378275c9da8Seschrock ((tsip)->stsi_temperature + SES2_ES_TEMP_OFFSET) 379275c9da8Seschrock 380275c9da8Seschrock /* 381275c9da8Seschrock * SES-2 Door Lock element for control-type diagnostic pages (T76). 382275c9da8Seschrock */ 383275c9da8Seschrock typedef struct ses2_lock_ctl_impl { 384275c9da8Seschrock ses2_cmn_elem_ctl_impl_t slci_common; 385275c9da8Seschrock DECL_BITFIELD3( 386275c9da8Seschrock _reserved1 :6, 387275c9da8Seschrock slci_rqst_fail :1, 388275c9da8Seschrock slci_rqst_ident :1); 389275c9da8Seschrock uint8_t _reserved2; 390275c9da8Seschrock DECL_BITFIELD2( 391275c9da8Seschrock slci_unlock :1, 392275c9da8Seschrock _reserved3 :7); 393275c9da8Seschrock } ses2_lock_ctl_impl_t; 394275c9da8Seschrock 395275c9da8Seschrock /* 396275c9da8Seschrock * SES-2 Door Lock element for status-type diagnostic pages (Table 77, 7.3.7) 397275c9da8Seschrock */ 398275c9da8Seschrock typedef struct ses2_lock_status_impl { 399275c9da8Seschrock ses2_cmn_elem_status_impl_t slsi_common; 400275c9da8Seschrock DECL_BITFIELD3( 401275c9da8Seschrock _reserved1 :6, 402275c9da8Seschrock slsi_fail :1, 403275c9da8Seschrock slsi_ident :1); 404275c9da8Seschrock uint8_t _reserved2; 405275c9da8Seschrock DECL_BITFIELD2( 406275c9da8Seschrock slsi_unlocked :1, 407275c9da8Seschrock _reserved3 :7); 408275c9da8Seschrock } ses2_lock_status_impl_t; 409275c9da8Seschrock 410275c9da8Seschrock /* 411275c9da8Seschrock * SES-2 Audible Alarm element for control-type diagnostic pages (T78). 412275c9da8Seschrock */ 413275c9da8Seschrock typedef struct ses2_alarm_ctl_impl { 414275c9da8Seschrock ses2_cmn_elem_ctl_impl_t saci_common; 415275c9da8Seschrock DECL_BITFIELD3( 416275c9da8Seschrock _reserved1 :6, 417275c9da8Seschrock saci_rqst_fail :1, 418275c9da8Seschrock saci_rqst_ident :1); 419275c9da8Seschrock uint8_t _reserved2; 420275c9da8Seschrock DECL_BITFIELD8( 421275c9da8Seschrock saci_unrecov :1, 422275c9da8Seschrock saci_crit :1, 423275c9da8Seschrock saci_noncrit :1, 424275c9da8Seschrock saci_info :1, 425275c9da8Seschrock saci_set_remind :1, 426275c9da8Seschrock _reserved3 :1, 427275c9da8Seschrock saci_set_mute :1, 428275c9da8Seschrock _reserved4 :1); 429275c9da8Seschrock } ses2_alarm_ctl_impl_t; 430275c9da8Seschrock 431275c9da8Seschrock /* 432275c9da8Seschrock * SES-2 Audible Alarm element for status-type diagnostic pages 433275c9da8Seschrock * (Table 79, 7.3.8) 434275c9da8Seschrock */ 435275c9da8Seschrock typedef struct ses2_alarm_status_impl { 436275c9da8Seschrock ses2_cmn_elem_status_impl_t sasi_common; 437275c9da8Seschrock DECL_BITFIELD3( 438275c9da8Seschrock _reserved1 :6, 439275c9da8Seschrock sasi_fail :1, 440275c9da8Seschrock sasi_ident :1); 441275c9da8Seschrock uint8_t _reserved2; 442275c9da8Seschrock DECL_BITFIELD8( 443275c9da8Seschrock sasi_unrecov :1, 444275c9da8Seschrock sasi_crit :1, 445275c9da8Seschrock sasi_noncrit :1, 446275c9da8Seschrock sasi_info :1, 447275c9da8Seschrock sasi_remind :1, 448275c9da8Seschrock _reserved3 :1, 449275c9da8Seschrock sasi_muted :1, 450275c9da8Seschrock sasi_rqst_mute :1); 451275c9da8Seschrock } ses2_alarm_status_impl_t; 452275c9da8Seschrock 453275c9da8Seschrock /* 454275c9da8Seschrock * SES-2 Enclosure Services Controller Electronics element for control-type 455275c9da8Seschrock * diagnostic pages (Table 80, 7.3.9). 456275c9da8Seschrock */ 457275c9da8Seschrock typedef struct ses2_controller_ctl_impl { 458275c9da8Seschrock ses2_cmn_elem_ctl_impl_t scci_common; 459275c9da8Seschrock DECL_BITFIELD3( 460275c9da8Seschrock _reserved1 :6, 461275c9da8Seschrock scci_rqst_fail :1, 462275c9da8Seschrock scci_rqst_ident :1); 463275c9da8Seschrock DECL_BITFIELD2( 464275c9da8Seschrock scci_select_element :1, 465275c9da8Seschrock _reserved2 :7); 466275c9da8Seschrock uint8_t _reserved3; 467275c9da8Seschrock } ses2_controller_ctl_impl_t; 468275c9da8Seschrock 469275c9da8Seschrock /* 470275c9da8Seschrock * SES-2 Enclosure Services Controller Electronics element for status-type 471275c9da8Seschrock * diagnostic pages (Table 81, 7.3.9), 472275c9da8Seschrock */ 473275c9da8Seschrock typedef struct ses2_controller_status_impl { 474275c9da8Seschrock ses2_cmn_elem_status_impl_t scsi_common; 475275c9da8Seschrock DECL_BITFIELD3( 476275c9da8Seschrock _reserved1 :6, 477275c9da8Seschrock scsi_fail :1, 478275c9da8Seschrock scsi_ident :1); 479275c9da8Seschrock DECL_BITFIELD2( 480275c9da8Seschrock scsi_report :1, 481275c9da8Seschrock _reserved2 :7); 482275c9da8Seschrock DECL_BITFIELD2( 483275c9da8Seschrock _reserved3 :7, 484275c9da8Seschrock scsi_hot_swap :1); 485275c9da8Seschrock } ses2_controller_status_impl_t; 486275c9da8Seschrock 487275c9da8Seschrock /* 488275c9da8Seschrock * SES-2 SCC Controller Electronics element for control-type diagnostic pages 489275c9da8Seschrock * (Table 82, 7.3.10). 490275c9da8Seschrock */ 491275c9da8Seschrock typedef struct ses2_scc_ctl_impl { 492275c9da8Seschrock ses2_cmn_elem_ctl_impl_t ssci_common; 493275c9da8Seschrock DECL_BITFIELD3( 494275c9da8Seschrock _reserved1 :6, 495275c9da8Seschrock ssci_rqst_fail :1, 496275c9da8Seschrock ssci_rqst_ident :1); 497275c9da8Seschrock uint8_t _reserved2[2]; 498275c9da8Seschrock } ses2_scc_ctl_impl_t; 499275c9da8Seschrock 500275c9da8Seschrock /* 501275c9da8Seschrock * SES-2 SCC Controller Electronics element for status-type diagnostic pages 502275c9da8Seschrock * (Table 83, 7.3.10) 503275c9da8Seschrock */ 504275c9da8Seschrock typedef struct ses2_scc_status_impl { 505275c9da8Seschrock ses2_cmn_elem_status_impl_t sss_common; 506275c9da8Seschrock DECL_BITFIELD3( 507275c9da8Seschrock _reserved1 :6, 508275c9da8Seschrock sss_fail :1, 509275c9da8Seschrock sss_ident :1); 510275c9da8Seschrock DECL_BITFIELD2( 511275c9da8Seschrock sss_report :1, 512275c9da8Seschrock _reserved2 :7); 513275c9da8Seschrock uint8_t _reserved3; 514275c9da8Seschrock } ses2_scc_status_impl_t; 515275c9da8Seschrock 516275c9da8Seschrock /* 517275c9da8Seschrock * SES-2 Nonvolatile Cache element for control-type diagnostic pages 518275c9da8Seschrock * (Table 84, 7.3.11). 519275c9da8Seschrock */ 520275c9da8Seschrock typedef struct ses2_nvcache_ctl_impl { 521275c9da8Seschrock ses2_cmn_elem_ctl_impl_t snci_common; 522275c9da8Seschrock DECL_BITFIELD3( 523275c9da8Seschrock _reserved1 :6, 524275c9da8Seschrock snci_rqst_fail :1, 525275c9da8Seschrock snci_rqst_ident :1); 526275c9da8Seschrock uint8_t _reserved2[2]; 527275c9da8Seschrock } ses2_nvcache_ctl_impl_t; 528275c9da8Seschrock 529275c9da8Seschrock /* 530275c9da8Seschrock * SES-2 Nonvolatile Cache element for status-type diagnostic pages (Table 85, 531275c9da8Seschrock * 7.3.11) 532275c9da8Seschrock */ 533275c9da8Seschrock typedef struct ses2_nvcache_status_impl { 534275c9da8Seschrock ses2_cmn_elem_status_impl_t snsi_common; 535275c9da8Seschrock DECL_BITFIELD4( 536275c9da8Seschrock snsi_size_multiplier :2, 537275c9da8Seschrock _reserved1 :4, 538275c9da8Seschrock snsi_fail :1, 539275c9da8Seschrock snsi_ident :1); 540275c9da8Seschrock uint16_t snsi_nvcache_size; 541275c9da8Seschrock } ses2_nvcache_status_impl_t; 542275c9da8Seschrock 543275c9da8Seschrock /* 544275c9da8Seschrock * Ibid., Table 86 defines the size multipliers as follows: 545275c9da8Seschrock * 546275c9da8Seschrock * 00b - bytes 547275c9da8Seschrock * 01b - 1<<10 bytes 548275c9da8Seschrock * 10b - 1<<20 bytes 549275c9da8Seschrock * 11b - 1<<30 bytes 550275c9da8Seschrock * 551275c9da8Seschrock * We will calculate the actual size in bytes by doing 552275c9da8Seschrock * 553275c9da8Seschrock * nvcache_size << (SES2_NVCACHE_SHIFT * multiplier) 554275c9da8Seschrock */ 555275c9da8Seschrock #define SES2_NVCACHE_SHIFT 10 556275c9da8Seschrock #define SES2_NVCACHE_SIZE(nsip) \ 557275c9da8Seschrock ((uint64_t)SCSI_READ16(&(nsip)->snsi_nvcache_size) << \ 558275c9da8Seschrock (SES2_NVCACHE_SHIFT * (nsip)->snsi_size_multiplier)) 559275c9da8Seschrock 560275c9da8Seschrock /* 561275c9da8Seschrock * SES-2 Invalid Operation Reason element for status-type diagnostic pages 562275c9da8Seschrock * (Table 88, 7.3.12) 563275c9da8Seschrock */ 564275c9da8Seschrock typedef struct ses2_invop_reason_status_impl { 565275c9da8Seschrock ses2_cmn_elem_status_impl_t sirsi_common; 566275c9da8Seschrock DECL_BITFIELD2( 567275c9da8Seschrock sirsi_priv_ms6 :6, 568275c9da8Seschrock sirsi_invop_type :2); 569275c9da8Seschrock uint8_t sirsi_priv[2]; 570275c9da8Seschrock } ses2_invop_reason_status_impl_t; 571275c9da8Seschrock 572275c9da8Seschrock /* 573275c9da8Seschrock * Ibid., Invop Type values (Table 89) 574275c9da8Seschrock */ 575275c9da8Seschrock typedef enum ses2_invop_type { 576275c9da8Seschrock SES2_INVOP_SEND_PAGE_CODE = 0x0, 577275c9da8Seschrock SES2_INVOP_SEND_PAGE_FORMAT = 0x1, 578275c9da8Seschrock SES2_INVOP_VENDOR_SPECIFIC = 0x3 579275c9da8Seschrock } ses2_invop_type_t; 580275c9da8Seschrock 581275c9da8Seschrock /* 582275c9da8Seschrock * Ibid., Invalid Operation Reason element for status-type diagnostic pages 583275c9da8Seschrock * with Invop Type of 00b (Table 90) 584275c9da8Seschrock */ 585275c9da8Seschrock typedef struct ses2_invop_code_status_impl { 586275c9da8Seschrock ses2_cmn_elem_status_impl_t sicsi_common; 587275c9da8Seschrock DECL_BITFIELD3( 588275c9da8Seschrock sicsi_page_not_supported :1, 589275c9da8Seschrock _reserved1 :5, 590275c9da8Seschrock sicsi_invop_type :2); 591275c9da8Seschrock uint8_t _reserved2[2]; 592275c9da8Seschrock } ses2_invop_code_status_impl_t; 593275c9da8Seschrock 594275c9da8Seschrock /* 595275c9da8Seschrock * Ibid., Invalid Operation Reason element for status-type diagnostic pages 596275c9da8Seschrock * with Invop Type of 01b (Table 91) 597275c9da8Seschrock */ 598275c9da8Seschrock typedef struct ses2_invop_format_status_impl { 599275c9da8Seschrock ses2_cmn_elem_status_impl_t sifsi_common; 600275c9da8Seschrock DECL_BITFIELD3( 601275c9da8Seschrock sifsi_bit_number :3, 602275c9da8Seschrock _reserved1 :3, 603275c9da8Seschrock sifsi_invop_type :2); 604275c9da8Seschrock uint16_t sifsi_byte_offset[2]; 605275c9da8Seschrock } ses2_invop_format_status_impl_t; 606275c9da8Seschrock 607275c9da8Seschrock /* 608275c9da8Seschrock * SES-2 Uninterruptible Power Supply element for control-type diagnostic 609275c9da8Seschrock * pages (Table 93, 7.3.13) 610275c9da8Seschrock */ 611275c9da8Seschrock typedef struct ses2_ups_ctl_impl { 612275c9da8Seschrock ses2_cmn_elem_ctl_impl_t suci_common; 613275c9da8Seschrock uint8_t _reserved1[2]; 614275c9da8Seschrock DECL_BITFIELD3( 615275c9da8Seschrock _reserved2 :6, 616275c9da8Seschrock suci_rqst_fail :1, 617275c9da8Seschrock suci_rqst_ident :1); 618275c9da8Seschrock } ses2_ups_ctl_impl_t; 619275c9da8Seschrock 620275c9da8Seschrock /* 621275c9da8Seschrock * SES-2 Uninterruptible Power Supply element for status-type diagnostic pages 622275c9da8Seschrock * (Table 94, 7.3.13) 623275c9da8Seschrock */ 624275c9da8Seschrock typedef struct ses2_ups_status_impl { 625275c9da8Seschrock ses2_cmn_elem_status_impl_t susi_common; 626275c9da8Seschrock uint8_t susi_battery_status; /* Time remaining in minutes */ 627275c9da8Seschrock DECL_BITFIELD8( 628275c9da8Seschrock susi_intf_fail :1, 629275c9da8Seschrock susi_warn :1, 630275c9da8Seschrock susi_ups_fail :1, 631275c9da8Seschrock susi_dc_fail :1, 632275c9da8Seschrock susi_ac_fail :1, 633275c9da8Seschrock susi_ac_qual :1, 634275c9da8Seschrock susi_ac_hi :1, 635275c9da8Seschrock susi_ac_lo :1); 636275c9da8Seschrock DECL_BITFIELD5( 637275c9da8Seschrock susi_bpf :1, 638275c9da8Seschrock susi_batt_fail :1, 639275c9da8Seschrock _reserved1 :4, 640275c9da8Seschrock susi_fail :1, 641275c9da8Seschrock susi_ident :1); 642275c9da8Seschrock } ses2_ups_status_impl_t; 643275c9da8Seschrock 644275c9da8Seschrock /* 645275c9da8Seschrock * SES-2 Display element for control-type diagnostic pages (Table 95, 7.3.14) 646275c9da8Seschrock */ 647275c9da8Seschrock typedef struct ses2_display_ctl_impl { 648275c9da8Seschrock ses2_cmn_elem_ctl_impl_t sdci_common; 649275c9da8Seschrock DECL_BITFIELD4( 650275c9da8Seschrock sdci_display_mode :2, 651275c9da8Seschrock _reserved1 :4, 652275c9da8Seschrock sdci_rqst_fail :1, 653275c9da8Seschrock sdci_rqst_ident :1); 654275c9da8Seschrock uint16_t sdci_display_character; 655275c9da8Seschrock } ses2_display_ctl_impl_t; 656275c9da8Seschrock 657275c9da8Seschrock /* 658275c9da8Seschrock * SES-2 Display element for status-type diagnostic pages (Table 97, 7.3.14) 659275c9da8Seschrock */ 660275c9da8Seschrock typedef struct ses2_display_status_impl { 661275c9da8Seschrock ses2_cmn_elem_status_impl_t sdsi_common; 662275c9da8Seschrock DECL_BITFIELD4( 663275c9da8Seschrock sdsi_display_mode_status :2, 664275c9da8Seschrock _reserved1 :3, 665275c9da8Seschrock sdsi_fail :1, 666275c9da8Seschrock sdsi_ident :1); 667275c9da8Seschrock uint16_t sdsi_display_character_status; 668275c9da8Seschrock } ses2_display_status_impl_t; 669275c9da8Seschrock 670275c9da8Seschrock /* 671275c9da8Seschrock * SES-2 Key Pad Entry element for control-type diagnostic pages (Table 99). 672275c9da8Seschrock */ 673275c9da8Seschrock typedef struct ses2_keypad_ctl_impl { 674275c9da8Seschrock ses2_cmn_elem_ctl_impl_t skci_common; 675275c9da8Seschrock DECL_BITFIELD3( 676275c9da8Seschrock _reserved1 :6, 677275c9da8Seschrock skci_rqst_fail :1, 678275c9da8Seschrock skci_rqst_ident :1); 679275c9da8Seschrock uint8_t _reserved2[2]; 680275c9da8Seschrock } ses2_keypad_ctl_impl_t; 681275c9da8Seschrock 682275c9da8Seschrock /* 683275c9da8Seschrock * SES-2 Key Pad Entry element for status-type diagnostic pages (Table 100, 684275c9da8Seschrock * 7.3.15) 685275c9da8Seschrock */ 686275c9da8Seschrock typedef struct ses2_keypad_status_impl { 687275c9da8Seschrock ses2_cmn_elem_status_impl_t sksi_common; 688275c9da8Seschrock DECL_BITFIELD3( 689275c9da8Seschrock _reserved1 :6, 690275c9da8Seschrock sksi_fail :1, 691275c9da8Seschrock sksi_ident :1); 692275c9da8Seschrock uint8_t _reserved2[2]; 693275c9da8Seschrock } ses2_keypad_status_impl_t; 694275c9da8Seschrock 695275c9da8Seschrock /* 696275c9da8Seschrock * SES-2 Enclosure element for control-type diagnostic pages (Table 101). 697275c9da8Seschrock */ 698275c9da8Seschrock typedef struct ses2_enclosure_ctl_impl { 699275c9da8Seschrock ses2_cmn_elem_ctl_impl_t seci_common; 700275c9da8Seschrock DECL_BITFIELD2( 701275c9da8Seschrock _reserved1 :7, 702275c9da8Seschrock seci_rqst_ident :1); 703275c9da8Seschrock DECL_BITFIELD2( 704275c9da8Seschrock seci_power_cycle_delay :6, 705275c9da8Seschrock seci_power_cycle_request :2); 706275c9da8Seschrock DECL_BITFIELD3( 707275c9da8Seschrock seci_request_warning :1, 708275c9da8Seschrock seci_request_failure :1, 709275c9da8Seschrock seci_power_off_duration :6); 710275c9da8Seschrock } ses2_enclosure_ctl_impl_t; 711275c9da8Seschrock 712275c9da8Seschrock /* 713275c9da8Seschrock * SES-2 Enclosure element for status-type diagnostic pages (Table 101, 7.3.16) 714275c9da8Seschrock */ 715275c9da8Seschrock typedef struct ses2_enclosure_status_impl { 716275c9da8Seschrock ses2_cmn_elem_status_impl_t sesi_common; 717275c9da8Seschrock DECL_BITFIELD2( 718275c9da8Seschrock _reserved1 :7, 719275c9da8Seschrock sesi_ident :1); 720275c9da8Seschrock DECL_BITFIELD3( 721275c9da8Seschrock sesi_warning_indication :1, 722275c9da8Seschrock sesi_failure_indication :1, 723275c9da8Seschrock sesi_power_delay :6); 724275c9da8Seschrock DECL_BITFIELD3( 725275c9da8Seschrock sesi_warning_requested :1, 726275c9da8Seschrock sesi_failure_requested :1, 727275c9da8Seschrock sesi_power_duration :6); 728275c9da8Seschrock } ses2_enclosure_status_impl_t; 729275c9da8Seschrock 730275c9da8Seschrock /* 731275c9da8Seschrock * SES-2 SCSI Port/Transceiver element for control-type diagnostic pages (T103) 732275c9da8Seschrock */ 733275c9da8Seschrock typedef struct ses2_port_ctl_impl { 734275c9da8Seschrock ses2_cmn_elem_ctl_impl_t spci_common; 735275c9da8Seschrock DECL_BITFIELD3( 736275c9da8Seschrock _reserved1 :6, 737275c9da8Seschrock spci_rqst_fail :1, 738275c9da8Seschrock spci_rqst_ident :1); 739275c9da8Seschrock uint8_t _reserved2; 740275c9da8Seschrock DECL_BITFIELD3( 741275c9da8Seschrock _reserved3 :4, 742275c9da8Seschrock spci_disable :1, 743275c9da8Seschrock _reserved4 :3); 744275c9da8Seschrock } ses2_port_ctl_impl_t; 745275c9da8Seschrock 746275c9da8Seschrock /* 747275c9da8Seschrock * SES-2 SCSI Port/Transceiver element for status-type diagnostic pages 748275c9da8Seschrock * (Table 104, 7.3.17) 749275c9da8Seschrock */ 750275c9da8Seschrock typedef struct ses2_port_status_impl { 751275c9da8Seschrock ses2_cmn_elem_status_impl_t spsi_common; 752275c9da8Seschrock DECL_BITFIELD3( 753275c9da8Seschrock _reserved1 :6, 754275c9da8Seschrock spsi_fail :1, 755275c9da8Seschrock spsi_ident :1); 756275c9da8Seschrock DECL_BITFIELD2( 757275c9da8Seschrock spsi_report :1, 758275c9da8Seschrock _reserved2 :7); 759275c9da8Seschrock DECL_BITFIELD5( 760275c9da8Seschrock spsi_xmit_fail :1, 761275c9da8Seschrock spsi_lol :1, 762275c9da8Seschrock _reserved3 :2, 763275c9da8Seschrock spsi_disabled :1, 764275c9da8Seschrock _reserved4 :3); 765275c9da8Seschrock } ses2_port_status_impl_t; 766275c9da8Seschrock 767275c9da8Seschrock /* 768275c9da8Seschrock * SES-2 Language element for control-type diagnostic pages (T105) 769275c9da8Seschrock */ 770275c9da8Seschrock typedef struct ses2_lang_ctl_impl { 771275c9da8Seschrock ses2_cmn_elem_ctl_impl_t slci_common; 772275c9da8Seschrock DECL_BITFIELD2( 773275c9da8Seschrock _reserved1 :7, 774275c9da8Seschrock slci_rqst_ident :1); 775275c9da8Seschrock uint16_t slci_language_code; 776275c9da8Seschrock } ses2_lang_ctl_impl_t; 777275c9da8Seschrock 778275c9da8Seschrock /* 779275c9da8Seschrock * SES-2 Language element for status-type diagnostic pages (Table 105, 7.3.18) 780275c9da8Seschrock */ 781275c9da8Seschrock typedef struct ses2_lang_status_impl { 782275c9da8Seschrock ses2_cmn_elem_status_impl_t slsi_common; 783275c9da8Seschrock DECL_BITFIELD2( 784275c9da8Seschrock _reserved1 :7, 785275c9da8Seschrock slsi_ident :1); 786275c9da8Seschrock uint16_t slsi_language_code; 787275c9da8Seschrock } ses2_lang_status_impl_t; 788275c9da8Seschrock 789275c9da8Seschrock /* 790275c9da8Seschrock * SES-2 Communication Port element for control-type diagnostic pages 791275c9da8Seschrock * (Table 107, 7.3.19). 792275c9da8Seschrock */ 793275c9da8Seschrock typedef struct ses2_comm_ctl_impl { 794275c9da8Seschrock ses2_cmn_elem_ctl_impl_t scci_common; 795275c9da8Seschrock DECL_BITFIELD3( 796275c9da8Seschrock _reserved1 :6, 797275c9da8Seschrock scci_rqst_fail :1, 798275c9da8Seschrock scci_rqst_ident :1); 799275c9da8Seschrock uint8_t _reserved2; 800275c9da8Seschrock DECL_BITFIELD2( 801275c9da8Seschrock scci_disable :1, 802275c9da8Seschrock _reserved3 :7); 803275c9da8Seschrock } ses2_comm_ctl_impl_t; 804275c9da8Seschrock 805275c9da8Seschrock /* 806275c9da8Seschrock * SES-2 Communication Port element for status-type diagnostic pages 807275c9da8Seschrock * (Table 108, 7.3.19) 808275c9da8Seschrock */ 809275c9da8Seschrock typedef struct ses2_comm_status_impl { 810275c9da8Seschrock ses2_cmn_elem_status_impl_t scsi_common; 811275c9da8Seschrock DECL_BITFIELD3( 812275c9da8Seschrock _reserved1 :6, 813275c9da8Seschrock scsi_fail :1, 814275c9da8Seschrock scsi_ident :1); 815275c9da8Seschrock uint8_t _reserved2; 816275c9da8Seschrock DECL_BITFIELD2( 817275c9da8Seschrock scsi_disabled :1, 818275c9da8Seschrock _reserved3 :7); 819275c9da8Seschrock } ses2_comm_status_impl_t; 820275c9da8Seschrock 821275c9da8Seschrock /* 822275c9da8Seschrock * SES-2 Voltage Sensor element for control-type diagnostic pages 823275c9da8Seschrock * (Table 109, 7.3.20). 824275c9da8Seschrock */ 825275c9da8Seschrock typedef struct ses2_voltage_ctl_impl { 826275c9da8Seschrock ses2_cmn_elem_ctl_impl_t svci_common; 827275c9da8Seschrock DECL_BITFIELD3( 828275c9da8Seschrock _reserved1 :6, 829275c9da8Seschrock svci_rqst_fail :1, 830275c9da8Seschrock svci_rqst_ident :1); 831275c9da8Seschrock uint8_t _reserved2[2]; 832275c9da8Seschrock } ses2_voltage_ctl_impl_t; 833275c9da8Seschrock 834275c9da8Seschrock /* 835275c9da8Seschrock * SES-2 Voltage Sensor element for status-type diagnostic pages 836275c9da8Seschrock * (Table 110, 7.3.20). 837275c9da8Seschrock */ 838275c9da8Seschrock typedef struct ses2_voltage_status_impl { 839275c9da8Seschrock ses2_cmn_elem_status_impl_t svsi_common; 840275c9da8Seschrock DECL_BITFIELD7( 841275c9da8Seschrock svsi_crit_under :1, 842275c9da8Seschrock svsi_crit_over :1, 843275c9da8Seschrock svsi_warn_under :1, 844275c9da8Seschrock svsi_warn_over :1, 845275c9da8Seschrock _reserved1 :2, 846275c9da8Seschrock svsi_fail :1, 847275c9da8Seschrock svsi_ident :1); 848275c9da8Seschrock uint16_t svsi_voltage; 849275c9da8Seschrock } ses2_voltage_status_impl_t; 850275c9da8Seschrock 851275c9da8Seschrock /* 852275c9da8Seschrock * Ibid. defines the svsi_voltage field as a 16-bit signed 2's complement 853275c9da8Seschrock * integer, represented in units of 10 mV. AC voltages are RMS. 854275c9da8Seschrock */ 855275c9da8Seschrock #define SES2_VOLTAGE_MULTIPLIER (0.01) 856275c9da8Seschrock #define SES2_VOLTAGE(vsip) \ 857275c9da8Seschrock (SCSI_READ16(&(vsip)->svsi_voltage) * SES2_VOLTAGE_MULTIPLIER) 858275c9da8Seschrock 859275c9da8Seschrock /* 860275c9da8Seschrock * SES-2 Current Sensor element for control-type diagnostic pages 861275c9da8Seschrock * (Table 111, 7.3.21). 862275c9da8Seschrock */ 863275c9da8Seschrock typedef struct ses2_current_ctl_impl { 864275c9da8Seschrock ses2_cmn_elem_ctl_impl_t scci_common; 865275c9da8Seschrock DECL_BITFIELD3( 866275c9da8Seschrock _reserved1 :6, 867275c9da8Seschrock scci_rqst_fail :1, 868275c9da8Seschrock scci_rqst_ident :1); 869275c9da8Seschrock uint8_t _reserved2[2]; 870275c9da8Seschrock } ses2_current_ctl_impl_t; 871275c9da8Seschrock 872275c9da8Seschrock /* 873275c9da8Seschrock * SES-2 Current Sensor element for status-type diagnostic pages 874275c9da8Seschrock * (Table 112, 7.3.21) 875275c9da8Seschrock */ 876275c9da8Seschrock typedef struct ses2_current_status_impl { 877275c9da8Seschrock ses2_cmn_elem_status_impl_t scsi_common; 878275c9da8Seschrock DECL_BITFIELD7( 879275c9da8Seschrock _reserved1 :1, 880275c9da8Seschrock scsi_crit_over :1, 881275c9da8Seschrock _reserved2 :1, 882275c9da8Seschrock scsi_warn_over :1, 883275c9da8Seschrock _reserved3 :2, 884275c9da8Seschrock scsi_fail :1, 885275c9da8Seschrock scsi_ident :1); 886275c9da8Seschrock uint16_t scsi_current; 887275c9da8Seschrock } ses2_current_status_impl_t; 888275c9da8Seschrock 889275c9da8Seschrock /* 890275c9da8Seschrock * Ibid. defines the scsi_voltage field in the same way as for voltage above. 891275c9da8Seschrock * Units here are 10 mA. AC amperages are RMS. 892275c9da8Seschrock */ 893275c9da8Seschrock #define SES2_CURRENT_MULTIPLIER (0.01) 894275c9da8Seschrock #define SES2_CURRENT(csip) \ 895275c9da8Seschrock (SCSI_READ16(&(csip)->scsi_current) * SES2_CURRENT_MULTIPLIER) 896275c9da8Seschrock 897275c9da8Seschrock /* 898275c9da8Seschrock * SES-2 SCSI Target Port element for control-type diagnostic pages 899275c9da8Seschrock * (Table 113, 7.3.22), SCSI Initiator Port element for control-type 900275c9da8Seschrock * diagnostic pages (Table 115, 7.3.23). 901275c9da8Seschrock */ 902275c9da8Seschrock typedef struct ses2_itp_ctl_impl { 903275c9da8Seschrock ses2_cmn_elem_ctl_impl_t sici_common; 904275c9da8Seschrock DECL_BITFIELD3( 905275c9da8Seschrock _reserved1 :6, 906275c9da8Seschrock sici_rqst_fail :1, 907275c9da8Seschrock sici_rqst_ident :1); 908275c9da8Seschrock uint8_t _reserved2; 909275c9da8Seschrock DECL_BITFIELD2( 910275c9da8Seschrock sici_enable :1, 911275c9da8Seschrock _reserved3 :7); 912275c9da8Seschrock } ses2_itp_ctl_impl_t; 913275c9da8Seschrock 914275c9da8Seschrock /* 915275c9da8Seschrock * SES-2 SCSI Target Port element for status-type diagnostic pages (Table 114, 916275c9da8Seschrock * 7.3.22), SCSI Initiator Port element for status-type diagnostic pages 917275c9da8Seschrock * (Table 116, 7.3.23) 918275c9da8Seschrock */ 919275c9da8Seschrock typedef struct ses2_itp_status_impl { 920275c9da8Seschrock ses2_cmn_elem_status_impl_t sisi_common; 921275c9da8Seschrock DECL_BITFIELD3( 922275c9da8Seschrock _reserved1 :6, 923275c9da8Seschrock sisi_fail :1, 924275c9da8Seschrock sisi_ident :1); 925275c9da8Seschrock DECL_BITFIELD2( 926275c9da8Seschrock sisi_report :1, 927275c9da8Seschrock _reserved2 :7); 928275c9da8Seschrock DECL_BITFIELD2( 929275c9da8Seschrock sisi_enabled :1, 930275c9da8Seschrock _reserved3 :7); 931275c9da8Seschrock } ses2_itp_status_impl_t; 932275c9da8Seschrock 933275c9da8Seschrock /* 934275c9da8Seschrock * SES-2 Simple Subenclosure element for control-type diagnostic pages 935275c9da8Seschrock * (Table 117, 7.3.24). 936275c9da8Seschrock */ 937275c9da8Seschrock typedef struct ses2_ss_ctl_impl { 938275c9da8Seschrock ses2_cmn_elem_ctl_impl_t ssci_common; 939275c9da8Seschrock DECL_BITFIELD3( 940275c9da8Seschrock _reserved1 :6, 941275c9da8Seschrock ssci_rqst_fail :1, 942275c9da8Seschrock ssci_rqst_ident :1); 943275c9da8Seschrock uint8_t _reserved2[2]; 944275c9da8Seschrock } ses2_ss_ctl_impl_t; 945275c9da8Seschrock 946275c9da8Seschrock /* 947275c9da8Seschrock * SES-2 Simple Subenclosure element for status-type diagnostic pages 948275c9da8Seschrock * (Table 117, 7.3.24) 949275c9da8Seschrock */ 950275c9da8Seschrock typedef struct ses2_ss_status_impl { 951275c9da8Seschrock ses2_cmn_elem_status_impl_t sss_common; 952275c9da8Seschrock DECL_BITFIELD3( 953275c9da8Seschrock _reserved1 :6, 954275c9da8Seschrock sss_fail :1, 955275c9da8Seschrock sss_ident :1); 956275c9da8Seschrock uint8_t _reserved2; 957275c9da8Seschrock uint8_t sss_short_status; 958275c9da8Seschrock } ses2_ss_status_impl_t; 959275c9da8Seschrock 960275c9da8Seschrock /* 961275c9da8Seschrock * SES-2 SAS Expander element for control-type diagnostic pages 962275c9da8Seschrock * (Table 119, 7.3.25). 963275c9da8Seschrock */ 964275c9da8Seschrock typedef struct ses2_expander_ctl_impl { 965275c9da8Seschrock ses2_cmn_elem_ctl_impl_t seci_common; 966275c9da8Seschrock DECL_BITFIELD3( 967275c9da8Seschrock _reserved1 :6, 968275c9da8Seschrock seci_rqst_fail :1, 969275c9da8Seschrock seci_rqst_ident :1); 970275c9da8Seschrock uint8_t _reserved2[2]; 971275c9da8Seschrock } ses2_expander_ctl_impl_t; 972275c9da8Seschrock 973275c9da8Seschrock /* 974275c9da8Seschrock * SES-2 SAS Expander element for status-type diagnostic pages (Table 120, 975275c9da8Seschrock * 7.3.25) 976275c9da8Seschrock */ 977275c9da8Seschrock typedef struct ses2_expander_status_impl { 978275c9da8Seschrock ses2_cmn_elem_status_impl_t sesi_common; 979275c9da8Seschrock DECL_BITFIELD3( 980275c9da8Seschrock _reserved1 :6, 981275c9da8Seschrock sesi_fail :1, 982275c9da8Seschrock sesi_ident :1); 983275c9da8Seschrock uint8_t _reserved2[2]; 984275c9da8Seschrock } ses2_expander_status_impl_t; 985275c9da8Seschrock 986275c9da8Seschrock /* 987275c9da8Seschrock * SES-2 SAS Connector element for control-type diagnostic pages (Table 121, 988275c9da8Seschrock * 7.3.26). 989275c9da8Seschrock */ 990275c9da8Seschrock typedef struct ses2_sasconn_ctl_impl { 991275c9da8Seschrock ses2_cmn_elem_ctl_impl_t ssci_common; 992275c9da8Seschrock DECL_BITFIELD2( 993275c9da8Seschrock _reserved1 :7, 994275c9da8Seschrock ssci_rqst_ident :1); 995275c9da8Seschrock uint8_t _reserved2; 996275c9da8Seschrock DECL_BITFIELD3( 997275c9da8Seschrock _reserved3 :6, 998275c9da8Seschrock ssci_rqst_fail :1, 999275c9da8Seschrock _reserved4 :1); 1000275c9da8Seschrock } ses2_sasconn_ctl_impl_t; 1001275c9da8Seschrock 1002275c9da8Seschrock /* 1003275c9da8Seschrock * SES-2 SAS Connector element for status-type diagnostic pages (Table 122, 1004275c9da8Seschrock * 7.3.26) 1005275c9da8Seschrock */ 1006275c9da8Seschrock typedef struct ses2_sasconn_status_impl { 1007275c9da8Seschrock ses2_cmn_elem_status_impl_t sss_common; 1008275c9da8Seschrock DECL_BITFIELD2( 1009275c9da8Seschrock sss_connector_type :7, 1010275c9da8Seschrock sss_ident :1); 1011275c9da8Seschrock uint8_t sss_connector_physical_link; 1012275c9da8Seschrock DECL_BITFIELD3( 1013275c9da8Seschrock _reserved1 :6, 1014275c9da8Seschrock sss_fail :1, 1015275c9da8Seschrock _reserved2 :1); 1016275c9da8Seschrock } ses2_sasconn_status_impl_t; 1017275c9da8Seschrock 1018275c9da8Seschrock /* 1019275c9da8Seschrock * SES-2 Enclosure Control diagnostic page (Table 10, 6.1.3) 1020275c9da8Seschrock */ 1021275c9da8Seschrock typedef struct ses2_control_page_impl { 1022275c9da8Seschrock uint8_t scpi_page_code; 1023275c9da8Seschrock DECL_BITFIELD5( 1024275c9da8Seschrock scpi_unrecov :1, 1025275c9da8Seschrock scpi_crit :1, 1026275c9da8Seschrock scpi_noncrit :1, 1027275c9da8Seschrock scpi_info :1, 1028275c9da8Seschrock _reserved1 :4); 1029275c9da8Seschrock uint16_t scpi_page_length; 1030275c9da8Seschrock uint32_t scpi_generation_code; 1031275c9da8Seschrock ses2_elem_ctl_impl_t scpi_data[1]; 1032275c9da8Seschrock } ses2_control_page_impl_t; 1033275c9da8Seschrock 1034275c9da8Seschrock /* 1035275c9da8Seschrock * SES-2 Enclosure Status (Table 11, 6.1.4) 1036275c9da8Seschrock */ 1037275c9da8Seschrock typedef struct ses2_status_page_impl { 1038275c9da8Seschrock uint8_t sspi_page_code; 1039275c9da8Seschrock DECL_BITFIELD6( 1040275c9da8Seschrock sspi_unrecov :1, 1041275c9da8Seschrock sspi_crit :1, 1042275c9da8Seschrock sspi_noncrit :1, 1043275c9da8Seschrock sspi_info :1, 1044275c9da8Seschrock sspi_invop :1, 1045275c9da8Seschrock _reserved1 :3); 1046275c9da8Seschrock uint16_t sspi_page_length; 1047275c9da8Seschrock uint32_t sspi_generation_code; 1048275c9da8Seschrock uint8_t sspi_data[1]; 1049275c9da8Seschrock } ses2_status_page_impl_t; 1050275c9da8Seschrock 1051275c9da8Seschrock /* 1052275c9da8Seschrock * SES-2 Help Text diagnostic page (Table 13, 6.1.5). 1053275c9da8Seschrock */ 1054275c9da8Seschrock typedef struct ses2_help_page_impl { 1055275c9da8Seschrock uint8_t shpi_page_code; 1056275c9da8Seschrock uint8_t _reserved1; 1057275c9da8Seschrock uint16_t shpi_page_length; 1058275c9da8Seschrock char shpi_help_text[1]; 1059275c9da8Seschrock } ses2_help_page_impl_t; 1060275c9da8Seschrock 1061275c9da8Seschrock /* 1062275c9da8Seschrock * SES-2 String Out diagnostic page (Table 14, 6.1.6). 1063275c9da8Seschrock */ 1064275c9da8Seschrock typedef struct ses2_string_out_page_impl { 1065275c9da8Seschrock uint8_t ssopi_page_code; 1066275c9da8Seschrock uint8_t _reserved1; 1067275c9da8Seschrock uint16_t ssopi_page_length; 1068275c9da8Seschrock uint8_t ssopi_data[1]; 1069275c9da8Seschrock } ses2_string_out_page_impl_t; 1070275c9da8Seschrock 1071275c9da8Seschrock /* 1072275c9da8Seschrock * SES-2 String In diagnostic page (Table 15, 6.1.7). 1073275c9da8Seschrock */ 1074275c9da8Seschrock typedef struct ses2_string_in_page_impl { 1075275c9da8Seschrock uint8_t ssipi_page_code; 1076275c9da8Seschrock uint8_t _reserved1; 1077275c9da8Seschrock uint16_t ssipi_page_length; 1078275c9da8Seschrock uint8_t ssipi_data[1]; 1079275c9da8Seschrock } ses2_string_in_page_impl_t; 1080275c9da8Seschrock 1081275c9da8Seschrock /* 1082275c9da8Seschrock * SES-2 Threshold fields - (Table 17, 6.1.8), (Table 19, 6.1.9). 1083275c9da8Seschrock */ 1084275c9da8Seschrock typedef struct ses2_threshold_impl { 1085275c9da8Seschrock uint8_t sti_high_crit; 1086275c9da8Seschrock uint8_t sti_high_warn; 1087275c9da8Seschrock uint8_t sti_low_warn; 1088275c9da8Seschrock uint8_t sti_low_crit; 1089275c9da8Seschrock } ses2_threshold_impl_t; 1090275c9da8Seschrock 1091275c9da8Seschrock /* 1092275c9da8Seschrock * SES-2 Threshold Out diagnostic page (Table 16, 6.1.8). 1093275c9da8Seschrock */ 1094275c9da8Seschrock typedef struct ses2_threshold_out_page_impl { 1095275c9da8Seschrock uint8_t stopi_page_code; 1096275c9da8Seschrock uint8_t _reserved1; 1097275c9da8Seschrock uint16_t stopi_page_length; 1098275c9da8Seschrock uint32_t stopi_generation_code; 1099275c9da8Seschrock ses2_threshold_impl_t stopi_thresholds[1]; 1100275c9da8Seschrock } ses2_threshold_out_page_impl_t; 1101275c9da8Seschrock 1102275c9da8Seschrock /* 1103275c9da8Seschrock * SES-2 Threshold In diagnostic page (Table 18, 6.1.9). 1104275c9da8Seschrock */ 1105275c9da8Seschrock typedef struct ses2_threshold_in_page_impl { 1106275c9da8Seschrock uint8_t stipi_page_code; 1107275c9da8Seschrock DECL_BITFIELD3( 1108275c9da8Seschrock _reserved1 :4, 1109275c9da8Seschrock stipi_invop :1, 1110275c9da8Seschrock _reserved2 :3); 1111275c9da8Seschrock uint16_t stipi_page_length; 1112275c9da8Seschrock uint32_t stipi_generation_code; 1113275c9da8Seschrock ses2_threshold_impl_t stipi_thresholds[1]; 1114275c9da8Seschrock } ses2_threshold_in_page_impl_t; 1115275c9da8Seschrock 1116275c9da8Seschrock /* 1117275c9da8Seschrock * SES-2 Element Descriptor diagnostic page (Table 20, 6.1.10). 1118275c9da8Seschrock */ 1119275c9da8Seschrock typedef struct ses2_elem_desc_page_impl { 1120275c9da8Seschrock uint8_t sedpi_page_code; 1121275c9da8Seschrock uint8_t _reserved1; 1122275c9da8Seschrock uint16_t sedpi_page_length; 1123275c9da8Seschrock uint32_t sedpi_generation_code; 1124275c9da8Seschrock uint8_t sedpi_data[1]; 1125275c9da8Seschrock } ses2_elem_desc_page_impl_t; 1126275c9da8Seschrock 1127275c9da8Seschrock /* 1128275c9da8Seschrock * SES-2 Overall/element descriptor format (Table 22, 6.1.10). 1129275c9da8Seschrock */ 1130275c9da8Seschrock typedef struct ses2_elem_descriptor_impl { 1131275c9da8Seschrock uint8_t _reserved1[2]; 1132275c9da8Seschrock uint16_t sedi_descriptor_length; 1133275c9da8Seschrock char sedi_descriptor[1]; 1134275c9da8Seschrock } ses2_elem_descriptor_impl_t; 1135275c9da8Seschrock 1136275c9da8Seschrock /* 1137275c9da8Seschrock * SES-2 Short Enclosure Status diagnostic page (Table 23, 6.1.11). 1138275c9da8Seschrock */ 1139275c9da8Seschrock typedef struct ses2_short_status_page_impl { 1140275c9da8Seschrock uint8_t ssspi_page_code; 1141275c9da8Seschrock uint8_t ssspi_short_status; 1142275c9da8Seschrock uint16_t ssspi_page_length; 1143275c9da8Seschrock } ses2_short_status_page_impl_t; 1144275c9da8Seschrock 1145275c9da8Seschrock /* 1146275c9da8Seschrock * SES-2 Enclosure Busy diagnostic page (Table 24, 6.1.12). 1147275c9da8Seschrock */ 1148275c9da8Seschrock typedef struct ses2_enclosure_busy_page_impl { 1149275c9da8Seschrock uint8_t sebpi_page_code; 1150275c9da8Seschrock DECL_BITFIELD2( 1151275c9da8Seschrock sebpi_busy :1, 1152275c9da8Seschrock sebpi_vs_1_1 :7); 1153275c9da8Seschrock uint16_t sebpi_page_length; 1154275c9da8Seschrock } ses2_enclosure_busy_page_impl_t; 1155275c9da8Seschrock 1156275c9da8Seschrock /* 1157275c9da8Seschrock * SES-2 Additional Element Status diagnostic page (Table 25, 6.1.13). 1158275c9da8Seschrock */ 1159275c9da8Seschrock typedef struct ses2_aes_page_impl { 1160275c9da8Seschrock uint8_t sapi_page_code; 1161275c9da8Seschrock uint8_t _reserved1; 1162275c9da8Seschrock uint16_t sapi_page_length; 1163275c9da8Seschrock uint32_t sapi_generation_code; 1164275c9da8Seschrock uint8_t sapi_data[1]; 1165275c9da8Seschrock } ses2_aes_page_impl_t; 1166275c9da8Seschrock 1167275c9da8Seschrock /* 1168275c9da8Seschrock * SES-2 Additional Element Status descriptor (EIP == 1) (Table 26, 6.1.13). 1169*3fa8bc2dSGarrett D'Amore * Updated with EIIOE for Table 32 from SES-3, 6.1.13. 1170*3fa8bc2dSGarrett D'Amore * Note that we think later revs of SES-3 probably widen the EIIOE to 2 bits, 1171*3fa8bc2dSGarrett D'Amore * waiting for final document to be sure. 1172275c9da8Seschrock */ 1173275c9da8Seschrock typedef struct ses2_aes_descr_eip_impl { 1174275c9da8Seschrock DECL_BITFIELD4( 1175275c9da8Seschrock sadei_protocol_identifier :4, 1176275c9da8Seschrock sadei_eip :1, 1177275c9da8Seschrock _reserved1 :2, 1178275c9da8Seschrock sadei_invalid :1); 1179275c9da8Seschrock uint8_t sadei_length; 1180*3fa8bc2dSGarrett D'Amore DECL_BITFIELD2( 1181*3fa8bc2dSGarrett D'Amore sadei_eiioe :2, 1182*3fa8bc2dSGarrett D'Amore _reserved2 :6); 1183275c9da8Seschrock uint8_t sadei_element_index; 1184275c9da8Seschrock uint8_t sadei_protocol_specific[1]; 1185275c9da8Seschrock } ses2_aes_descr_eip_impl_t; 1186275c9da8Seschrock 1187275c9da8Seschrock /* 1188275c9da8Seschrock * SES-2 Additional Element Status descriptor (EIP == 0) (Table 27, 6.1.13). 1189275c9da8Seschrock */ 1190275c9da8Seschrock typedef struct ses2_aes_descr_impl { 1191275c9da8Seschrock DECL_BITFIELD4( 1192275c9da8Seschrock sadei_protocol_identifier :4, 1193275c9da8Seschrock sadei_eip :1, 1194275c9da8Seschrock _reserved1 :2, 1195275c9da8Seschrock sadei_invalid :1); 1196275c9da8Seschrock uint8_t sadei_length; 1197275c9da8Seschrock uint8_t sadei_protocol_specific[1]; 1198275c9da8Seschrock } ses2_aes_descr_impl_t; 1199275c9da8Seschrock 1200275c9da8Seschrock /* 1201275c9da8Seschrock * SES-2 Port descriptor (Table 30, 6.1.13.2). 1202275c9da8Seschrock */ 1203275c9da8Seschrock typedef struct ses2_aes_port_descr_impl { 1204275c9da8Seschrock uint8_t sapdi_port_loop_position; 1205275c9da8Seschrock uint8_t _reserved1[3]; 1206275c9da8Seschrock uint8_t sapdi_port_requested_hard_address; 1207275c9da8Seschrock uint8_t sapdi_n_port_identifier[3]; 1208275c9da8Seschrock uint64_t sapdi_n_port_name; 1209275c9da8Seschrock } ses2_aes_port_descr_impl_t; 1210275c9da8Seschrock 1211275c9da8Seschrock /* 1212275c9da8Seschrock * SES-2 Additional Element Status descriptor for FC (Table 28, 6.1.13.2). 1213275c9da8Seschrock */ 1214275c9da8Seschrock typedef struct ses2_aes_descr_fc_eip_impl { 1215275c9da8Seschrock uint8_t sadfi_n_ports; 1216275c9da8Seschrock uint8_t _reserved1[2]; 1217275c9da8Seschrock uint8_t sadfi_bay_number; 1218275c9da8Seschrock uint64_t sadfi_node_name; 1219275c9da8Seschrock ses2_aes_port_descr_impl_t sadfi_ports[1]; 1220275c9da8Seschrock } ses2_aes_descr_fc_eip_impl_t; 1221275c9da8Seschrock 1222275c9da8Seschrock /* 1223275c9da8Seschrock * SES-2 Additional Element Status descriptor for FC (EIP == 0) 1224275c9da8Seschrock * (Table 29, 6.1.13.2). 1225275c9da8Seschrock */ 1226275c9da8Seschrock typedef struct ses2_aes_descr_fc_impl { 1227275c9da8Seschrock uint8_t sadfi_n_ports; 1228275c9da8Seschrock uint8_t _reserved1; 1229275c9da8Seschrock uint64_t sadfi_node_name; 1230275c9da8Seschrock ses2_aes_port_descr_impl_t sadfi_ports[1]; 1231275c9da8Seschrock } ses2_aes_descr_fc_impl_t; 1232275c9da8Seschrock 1233275c9da8Seschrock /* 1234275c9da8Seschrock * SES-2 Additional Element Status descriptor for SAS (Table 31, 6.1.13.3). 1235275c9da8Seschrock */ 1236275c9da8Seschrock typedef struct ses2_aes_descr_sas_impl { 1237275c9da8Seschrock uint8_t _specific1; 1238275c9da8Seschrock DECL_BITFIELD2( 1239275c9da8Seschrock _specific2 :6, 1240275c9da8Seschrock sadsi_descriptor_type :2); 1241275c9da8Seschrock uint8_t _specific3[1]; 1242275c9da8Seschrock } ses2_aes_descr_sas_impl_t; 1243275c9da8Seschrock 1244275c9da8Seschrock typedef enum ses2_aes_descr_sas_type { 1245275c9da8Seschrock SES2_AESD_SAS_DEVICE = 0, 1246275c9da8Seschrock SES2_AESD_SAS_OTHER = 1 1247275c9da8Seschrock } ses2_aes_descr_sas_type_t; 1248275c9da8Seschrock 1249275c9da8Seschrock typedef struct ses2_aes_phy0_descr_impl { 1250275c9da8Seschrock DECL_BITFIELD3( 1251275c9da8Seschrock _reserved1 :4, 1252275c9da8Seschrock sapdi_device_type :3, 1253275c9da8Seschrock _reserved2 :1); 1254275c9da8Seschrock uint8_t _reserved3; 1255275c9da8Seschrock DECL_BITFIELD5( 1256275c9da8Seschrock _reserved4 :1, 1257275c9da8Seschrock sapdi_smp_initiator_port :1, 1258275c9da8Seschrock sapdi_stp_initiator_port :1, 1259275c9da8Seschrock sapdi_ssp_initiator_port :1, 1260275c9da8Seschrock _reserved5 :4); 1261275c9da8Seschrock DECL_BITFIELD6( 1262275c9da8Seschrock sapdi_sata_device :1, 1263275c9da8Seschrock sapdi_smp_target_port :1, 1264275c9da8Seschrock sapdi_stp_target_port :1, 1265275c9da8Seschrock sapdi_ssp_target_port :1, 1266275c9da8Seschrock _reserved6 :3, 1267275c9da8Seschrock sapdi_sata_port_selector :1); 1268275c9da8Seschrock uint64_t sapdi_attached_sas_address; 1269275c9da8Seschrock uint64_t sapdi_sas_address; 1270275c9da8Seschrock uint8_t sapdi_phy_identifier; 1271275c9da8Seschrock uint8_t _reserved7[7]; 1272275c9da8Seschrock } ses2_aes_phy0_descr_impl_t; 1273275c9da8Seschrock 1274275c9da8Seschrock typedef struct ses2_aes_descr_sas0_eip_impl { 1275275c9da8Seschrock uint8_t sadsi_n_phy_descriptors; 1276275c9da8Seschrock DECL_BITFIELD3( 1277275c9da8Seschrock sadsi_not_all_phys :1, 1278275c9da8Seschrock _reserved1 :5, 1279275c9da8Seschrock sadsi_descriptor_type :2); 1280275c9da8Seschrock uint8_t _reserved2; 1281275c9da8Seschrock uint8_t sadsi_bay_number; 1282275c9da8Seschrock ses2_aes_phy0_descr_impl_t sadsi_phys[1]; 1283275c9da8Seschrock } ses2_aes_descr_sas0_eip_impl_t; 1284275c9da8Seschrock 1285275c9da8Seschrock typedef struct ses2_aes_descr_sas0_impl { 1286275c9da8Seschrock uint8_t sadsi_n_phy_descriptors; 1287275c9da8Seschrock DECL_BITFIELD3( 1288275c9da8Seschrock sadsi_not_all_phys :1, 1289275c9da8Seschrock _reserved1 :5, 1290275c9da8Seschrock sadsi_descriptor_type :2); 1291275c9da8Seschrock ses2_aes_phy0_descr_impl_t sadsi_phys[1]; 1292275c9da8Seschrock } ses2_aes_descr_sas0_impl_t; 1293275c9da8Seschrock 1294275c9da8Seschrock /* 1295275c9da8Seschrock * SES-2 Additional Element Status for SAS Expander elements 1296275c9da8Seschrock * (Table 36, 6.1.13.3.3). 1297275c9da8Seschrock */ 1298275c9da8Seschrock typedef struct ses2_aes_exp_phy_descr_impl { 1299275c9da8Seschrock uint8_t saepdi_connector_element_index; 1300275c9da8Seschrock uint8_t saepdi_other_element_index; 1301275c9da8Seschrock } ses2_aes_exp_phy_descr_impl_t; 1302275c9da8Seschrock 1303275c9da8Seschrock typedef struct ses2_aes_descr_exp_impl { 1304275c9da8Seschrock uint8_t sadei_n_exp_phy_descriptors; 1305275c9da8Seschrock DECL_BITFIELD2( 1306275c9da8Seschrock _reserved1 :6, 1307275c9da8Seschrock sadei_descriptor_type :2); 1308275c9da8Seschrock uint8_t _reserved2[2]; 1309275c9da8Seschrock uint64_t sadei_sas_address; 1310275c9da8Seschrock ses2_aes_exp_phy_descr_impl_t sadei_phys[1]; 1311275c9da8Seschrock } ses2_aes_descr_exp_impl_t; 1312275c9da8Seschrock 1313275c9da8Seschrock /* 1314275c9da8Seschrock * SES-2 Additional Element Status for SCSI Initiator/Target Port and 1315275c9da8Seschrock * Enclosure Services Controller Electronics elements (Table 38, 6.1.13.3.4). 1316275c9da8Seschrock */ 1317275c9da8Seschrock typedef struct ses2_aes_phy1_descr_impl { 1318275c9da8Seschrock uint8_t sapdi_phy_identifier; 1319275c9da8Seschrock uint8_t _reserved1; 1320275c9da8Seschrock uint8_t sapdi_connector_element_index; 1321275c9da8Seschrock uint8_t sapdi_other_element_index; 1322275c9da8Seschrock uint64_t sapdi_sas_address; 1323275c9da8Seschrock } ses2_aes_phy1_descr_impl_t; 1324275c9da8Seschrock 1325275c9da8Seschrock typedef struct ses2_aes_descr_sas1_impl { 1326275c9da8Seschrock uint8_t sadsi_n_phy_descriptors; 1327275c9da8Seschrock DECL_BITFIELD2( 1328275c9da8Seschrock _reserved1 :6, 1329275c9da8Seschrock sadsi_descriptor_type :2); 1330275c9da8Seschrock uint8_t _reserved2[2]; 1331275c9da8Seschrock ses2_aes_phy1_descr_impl_t sadsi_phys[1]; 1332275c9da8Seschrock } ses2_aes_descr_sas1_impl_t; 1333275c9da8Seschrock 1334275c9da8Seschrock /* 1335275c9da8Seschrock * SES-2 Subenclosure Help Text diagnostic page (Table 40, 6.1.14). 1336275c9da8Seschrock */ 1337275c9da8Seschrock typedef struct ses2_subhelp_page_impl { 1338275c9da8Seschrock uint8_t sspi_page_code; 1339275c9da8Seschrock uint8_t sspi_n_subenclosures; 1340275c9da8Seschrock uint16_t sspi_page_length; 1341275c9da8Seschrock uint32_t sspi_generation_code; 1342275c9da8Seschrock uint8_t sspi_data[1]; 1343275c9da8Seschrock } ses2_subhelp_page_impl_t; 1344275c9da8Seschrock 1345275c9da8Seschrock /* 1346275c9da8Seschrock * SES-2 Subenclosure help text format (Table 41, 6.1.14). 1347275c9da8Seschrock */ 1348275c9da8Seschrock typedef struct ses2_subhelp_text_impl { 1349275c9da8Seschrock uint8_t _reserved1; 1350275c9da8Seschrock uint8_t ssti_subenclosure_identifier; 1351275c9da8Seschrock uint16_t ssti_subenclosure_help_text_length; 1352275c9da8Seschrock char ssti_subenclosure_help_text[1]; 1353275c9da8Seschrock } ses2_subhelp_text_impl_t; 1354275c9da8Seschrock 1355275c9da8Seschrock #define SES2_SUBHELP_LEN(stip) \ 1356ac88567aSHyon Kim (SCSI_READ16(&(stip)->ssti_subenclosure_help_text_length) + \ 1357275c9da8Seschrock offsetof(ses2_subhelp_text_impl_t, ssti_subenclosure_help_text[0])) 1358275c9da8Seschrock /* 1359275c9da8Seschrock * SES-2 Subenclosure String Out diagnostic page (Table 42, 6.1.15). 1360275c9da8Seschrock */ 1361275c9da8Seschrock typedef struct ses2_substring_out_page_impl { 1362275c9da8Seschrock uint8_t ssopi_page_code; 1363275c9da8Seschrock uint8_t ssopi_subenclosure_identifier; 1364275c9da8Seschrock uint16_t ssopi_page_length; 1365275c9da8Seschrock uint32_t ssopi_generation_code; 1366275c9da8Seschrock uint8_t ssopi_data[1]; 1367275c9da8Seschrock } ses2_substring_out_page_impl_t; 1368275c9da8Seschrock 1369275c9da8Seschrock /* 1370275c9da8Seschrock * SES-2 Subenclosure String In diagnostic page (Table 43, 6.1.16). 1371275c9da8Seschrock */ 1372275c9da8Seschrock typedef struct ses2_substring_in_page_impl { 1373275c9da8Seschrock uint8_t ssipi_page_code; 1374275c9da8Seschrock uint8_t ssipi_n_subenclosures; 1375275c9da8Seschrock uint16_t ssipi_page_length; 1376275c9da8Seschrock uint32_t ssipi_generation_code; 1377275c9da8Seschrock uint8_t ssipi_data[1]; 1378275c9da8Seschrock } ses2_substring_in_page_impl_t; 1379275c9da8Seschrock 1380275c9da8Seschrock /* 1381275c9da8Seschrock * SES-2 Subenclosure string in data format (Table 44, 6.1.16). 1382275c9da8Seschrock */ 1383275c9da8Seschrock typedef struct ses2_substring_in_data_impl { 1384275c9da8Seschrock uint8_t _reserved1; 1385275c9da8Seschrock uint8_t ssidi_subenclosure_identifier; 1386275c9da8Seschrock uint16_t ssidi_substring_data_length; 1387275c9da8Seschrock uint8_t ssidi_data[1]; 1388275c9da8Seschrock } ses2_substring_in_data_impl_t; 1389275c9da8Seschrock 1390275c9da8Seschrock #define SES2_SUBSTR_LEN(sdip) \ 1391ac88567aSHyon Kim (SCSI_READ16(&(sdip)->ssidi_substring_data_length) + \ 1392275c9da8Seschrock offsetof(ses2_substring_in_data_impl_t, ssidi_data[0])) 1393275c9da8Seschrock 1394275c9da8Seschrock /* 1395275c9da8Seschrock * SES-2 Supported SES Diagnostic Pages diagnostic page (Table 45, 6.1.17). 1396275c9da8Seschrock */ 1397275c9da8Seschrock typedef struct ses2_supported_ses_diag_page_impl { 1398275c9da8Seschrock uint8_t sssdpi_page_code; 1399275c9da8Seschrock uint8_t _reserved1; 1400275c9da8Seschrock uint16_t sssdpi_page_length; 1401275c9da8Seschrock uint8_t sssdpi_pages[1]; 1402275c9da8Seschrock } ses2_supported_ses_diag_page_impl_t; 1403275c9da8Seschrock 1404275c9da8Seschrock /* 1405275c9da8Seschrock * SES-2 Download Microcode Control diagnostic page (Table 46, 6.1.18). 1406275c9da8Seschrock */ 1407275c9da8Seschrock typedef struct ses2_ucode_ctl_page_impl { 1408275c9da8Seschrock uint8_t sucpi_page_code; 1409275c9da8Seschrock uint8_t sucpi_subenclosure_identifier; 1410275c9da8Seschrock uint16_t sucpi_page_length; 1411275c9da8Seschrock uint32_t sucpi_generation_code; 1412275c9da8Seschrock uint8_t sucpi_dl_ucode_mode; 1413275c9da8Seschrock uint8_t _reserved1[2]; 1414275c9da8Seschrock uint8_t sucpi_buffer_id; 1415275c9da8Seschrock uint32_t sucpi_buffer_offset; 1416275c9da8Seschrock uint32_t sucpi_ucode_image_length; 1417275c9da8Seschrock uint32_t sucpi_ucode_data_length; 1418275c9da8Seschrock uint8_t sucpi_ucode_data[1]; 1419275c9da8Seschrock } ses2_ucode_ctl_page_impl_t; 1420275c9da8Seschrock 1421275c9da8Seschrock /* 1422275c9da8Seschrock * SES-2 Download Microcode Status diagnostic page (Table 48-49, 6.1.19). 1423275c9da8Seschrock */ 1424275c9da8Seschrock typedef struct ses2_ucode_status_descr_impl { 1425275c9da8Seschrock uint8_t _reserved1; 1426275c9da8Seschrock uint8_t susdi_subenclosure_identifier; 1427275c9da8Seschrock uint8_t susdi_subenclosure_dl_status; 1428275c9da8Seschrock uint8_t susdi_subenclosure_dl_addl_status; 1429275c9da8Seschrock uint32_t susdi_subenclosure_dl_max_size; 1430275c9da8Seschrock uint8_t _reserved2[3]; 1431275c9da8Seschrock uint8_t susdi_subenclosure_dl_buffer_id; 1432275c9da8Seschrock uint32_t susdi_subenclosure_dl_buffer_offset; 1433275c9da8Seschrock } ses2_ucode_status_descr_impl_t; 1434275c9da8Seschrock 1435275c9da8Seschrock typedef struct ses2_ucode_status_page_impl { 1436275c9da8Seschrock uint8_t suspi_page_code; 1437275c9da8Seschrock uint8_t suspi_n_subenclosures; 1438275c9da8Seschrock uint16_t suspi_page_length; 1439275c9da8Seschrock uint32_t suspi_generation_code; 1440275c9da8Seschrock ses2_ucode_status_descr_impl_t suspi_descriptors[1]; 1441275c9da8Seschrock } ses2_ucode_status_page_impl_t; 1442275c9da8Seschrock 1443275c9da8Seschrock /* 1444275c9da8Seschrock * SES-2 Subenclosure Nickname Control diagnostic page (Table 51, 6.1.20). 1445275c9da8Seschrock */ 1446275c9da8Seschrock typedef struct ses2_subnick_ctl_page_impl { 1447275c9da8Seschrock uint8_t sscpi_page_code; 1448275c9da8Seschrock uint8_t sspci_subenclosure_identifier; 1449275c9da8Seschrock uint16_t sspci_page_length; 1450275c9da8Seschrock uint32_t sspci_generation_code; 1451275c9da8Seschrock char sspci_subenclosure_nickname[32]; 1452275c9da8Seschrock } ses2_subnick_ctl_page_impl_t; 1453275c9da8Seschrock 1454275c9da8Seschrock /* 1455275c9da8Seschrock * SES-2 Subenclosure Nickname Status diagnostic page (Table 52-53, 6.1.21). 1456275c9da8Seschrock */ 1457275c9da8Seschrock typedef struct ses2_subnick_descr_impl { 1458275c9da8Seschrock uint8_t _reserved1; 1459275c9da8Seschrock uint8_t ssdi_subenclosure_identifier; 1460275c9da8Seschrock uint8_t ssdi_subenclosure_nick_status; 1461275c9da8Seschrock uint8_t ssdi_subenclosure_nick_addl_status; 1462275c9da8Seschrock uint8_t _reserved2[2]; 1463275c9da8Seschrock uint16_t ssdi_subenclosure_nick_lang_code; 1464275c9da8Seschrock char ssdi_subenclosure_nickname[32]; 1465275c9da8Seschrock } ses2_subnick_descr_impl_t; 1466275c9da8Seschrock 1467275c9da8Seschrock typedef struct ses2_subnick_status_page_impl { 1468275c9da8Seschrock uint8_t sspsi_page_code; 1469275c9da8Seschrock uint8_t sspci_n_subenclosures; 1470275c9da8Seschrock uint16_t sspci_page_length; 1471275c9da8Seschrock uint32_t sspci_generation_code; 1472275c9da8Seschrock ses2_subnick_descr_impl_t sspci_subnicks[1]; 1473275c9da8Seschrock } ses2_subnick_status_page_impl_t; 1474275c9da8Seschrock 1475275c9da8Seschrock /* 1476275c9da8Seschrock * SES-2 Mode page code for enclosure services devices (Table 57, 6.3.2). 1477275c9da8Seschrock */ 1478275c9da8Seschrock typedef struct ses2_esm_mode_page_impl { 1479275c9da8Seschrock DECL_BITFIELD3( 1480275c9da8Seschrock sempi_page_code :6, 1481275c9da8Seschrock _reserved1 :1, 1482275c9da8Seschrock sempi_ps :1); 1483275c9da8Seschrock uint8_t sempi_page_length; 1484275c9da8Seschrock uint8_t _reserved2[3]; 1485275c9da8Seschrock DECL_BITFIELD2( 1486275c9da8Seschrock sempi_enbltc :1, 1487275c9da8Seschrock _reserved3 :7); 1488275c9da8Seschrock uint16_t sempi_max_task_completion_time; 1489275c9da8Seschrock } ses2_esm_mode_page_impl_t; 1490275c9da8Seschrock 1491275c9da8Seschrock #pragma pack() 1492275c9da8Seschrock 1493275c9da8Seschrock extern ses_pagedesc_t ses2_pages[]; 1494275c9da8Seschrock 1495275c9da8Seschrock extern int ses2_fill_element_node(ses_plugin_t *, ses_node_t *); 1496275c9da8Seschrock extern int ses2_fill_enclosure_node(ses_plugin_t *, ses_node_t *); 1497275c9da8Seschrock 1498275c9da8Seschrock typedef int (*ses2_setprop_f)(ses_plugin_t *, ses_node_t *, ses2_diag_page_t, 1499275c9da8Seschrock nvpair_t *); 1500275c9da8Seschrock 1501275c9da8Seschrock typedef struct ses2_ctl_prop { 1502275c9da8Seschrock const char *scp_name; 1503275c9da8Seschrock data_type_t scp_type; 1504275c9da8Seschrock ses2_diag_page_t scp_num; 1505275c9da8Seschrock ses2_setprop_f scp_setprop; 1506275c9da8Seschrock } ses2_ctl_prop_t; 1507275c9da8Seschrock 1508275c9da8Seschrock typedef int (*ses2_setdef_f)(ses_node_t *, ses2_diag_page_t, void *); 1509275c9da8Seschrock 1510275c9da8Seschrock extern int ses2_ctl_common_setprop(ses_plugin_t *sp, ses_node_t *, 1511275c9da8Seschrock ses2_diag_page_t, nvpair_t *); 1512275c9da8Seschrock 1513275c9da8Seschrock #define SES_COMMON_CTL_PROPS \ 1514275c9da8Seschrock { \ 1515275c9da8Seschrock .scp_name = SES_PROP_SWAP, \ 1516275c9da8Seschrock .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1517275c9da8Seschrock .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1518275c9da8Seschrock .scp_setprop = ses2_ctl_common_setprop \ 1519275c9da8Seschrock }, \ 1520275c9da8Seschrock { \ 1521275c9da8Seschrock .scp_name = SES_PROP_DISABLED, \ 1522275c9da8Seschrock .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1523275c9da8Seschrock .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1524275c9da8Seschrock .scp_setprop = ses2_ctl_common_setprop \ 1525275c9da8Seschrock }, \ 1526275c9da8Seschrock { \ 1527275c9da8Seschrock .scp_name = SES_PROP_PRDFAIL, \ 1528275c9da8Seschrock .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1529275c9da8Seschrock .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1530275c9da8Seschrock .scp_setprop = ses2_ctl_common_setprop \ 1531275c9da8Seschrock } 1532275c9da8Seschrock 1533275c9da8Seschrock typedef struct ses2_ctl_desc { 1534275c9da8Seschrock ses2_element_type_t scd_et; 1535275c9da8Seschrock const ses2_ctl_prop_t *scd_props; 1536275c9da8Seschrock ses2_setdef_f scd_setdef; 1537275c9da8Seschrock } ses2_ctl_desc_t; 1538275c9da8Seschrock 1539275c9da8Seschrock extern int ses2_setprop(ses_plugin_t *, ses_node_t *, const ses2_ctl_prop_t *, 1540275c9da8Seschrock nvlist_t *); 1541275c9da8Seschrock 1542275c9da8Seschrock extern int ses2_element_setdef(ses_node_t *, ses2_diag_page_t, void *); 1543275c9da8Seschrock extern int ses2_enclosure_setdef(ses_node_t *, ses2_diag_page_t, void *); 1544275c9da8Seschrock 1545275c9da8Seschrock extern int ses2_element_ctl(ses_plugin_t *, ses_node_t *, const char *, 1546275c9da8Seschrock nvlist_t *); 1547275c9da8Seschrock extern int ses2_enclosure_ctl(ses_plugin_t *, ses_node_t *, const char *, 1548275c9da8Seschrock nvlist_t *); 1549275c9da8Seschrock 1550275c9da8Seschrock #ifdef __cplusplus 1551275c9da8Seschrock } 1552275c9da8Seschrock #endif 1553275c9da8Seschrock 1554275c9da8Seschrock #endif /* _PLUGIN_SES_IMPL_H */ 1555