ses2_impl.h revision 6316:40d5384cc8b2
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _PLUGIN_SES_IMPL_H 28#define _PLUGIN_SES_IMPL_H 29 30#pragma ident "%Z%%M% %I% %E% SMI" 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36#include <sys/types.h> 37#include <sys/sysmacros.h> 38#include <sys/scsi/impl/uscsi.h> 39#include <sys/scsi/generic/commands.h> 40#include <sys/scsi/impl/spc3_types.h> 41#include <sys/ccompile.h> 42#include <stdarg.h> 43#include <libnvpair.h> 44 45#include <scsi/libscsi.h> 46#include <scsi/libses_plugin.h> 47 48#pragma pack(1) 49 50/* 51 * Generic IO timeout in seconds, from <sys/scsi/targets/ses.h>. 52 */ 53#define SES2_TIMEOUT 60 54 55/* 56 * SES-2 Enclosure Descriptor Header (Table 8, 6.1.2.2) 57 */ 58typedef struct ses2_ed_hdr_impl { 59 DECL_BITFIELD4( 60 sehi_n_esps :3, 61 _reserved1 :1, 62 sehi_rel_esp_id :3, 63 _reserved2 :1); 64 uint8_t sehi_subenclosure_id; 65 uint8_t sehi_n_etd_hdrs; 66 uint8_t sehi_ed_len; 67} ses2_ed_hdr_impl_t; 68 69/* 70 * SES-2 Enclosure Descriptor (Table 8, 6.1.2.2) 71 */ 72typedef struct ses2_ed_impl { 73 ses2_ed_hdr_impl_t st_hdr; 74 spc3_naa_id_8_impl_t st_logical_id; 75 char st_vendor_id[8]; 76 char st_product_id[16]; 77 char st_product_revision[4]; 78 uint8_t st_priv[1]; 79} ses2_ed_impl_t; 80 81/* 82 * SES-2 Type Descriptor Header (Table 9, 6.1.2.3) 83 */ 84typedef struct ses2_td_hdr_impl { 85 uint8_t sthi_element_type; 86 uint8_t sthi_max_elements; 87 uint8_t sthi_subenclosure_id; 88 uint8_t sthi_text_len; 89} ses2_td_hdr_impl_t; 90 91/* 92 * SES-2 Configuration diagnostic page (Table 7, 6.1.2.1) 93 */ 94typedef struct ses2_config_page_impl { 95 uint8_t scpi_page_code; 96 uint8_t scpi_n_subenclosures; 97 uint16_t scpi_page_length; 98 uint32_t scpi_generation_code; 99 uint8_t scpi_data[1]; 100} ses2_config_page_impl_t; 101 102/* 103 * Logically we should be able to use 4 or 8 bytes for a minimum allocation; 104 * however, it seems at least some devices will fail the request in that case. 105 */ 106#define SES2_MIN_DIAGPAGE_ALLOC 512 107 108/* 109 * SES-2 Element Control and Overall Control fields (Table 59, 7.2.2) 110 */ 111typedef struct ses2_cmn_elem_ctl_impl { 112 DECL_BITFIELD5( 113 _reserved1 :4, 114 seci_rst_swap :1, 115 seci_disable :1, 116 seci_prdfail :1, 117 seci_select :1); 118} ses2_cmn_elem_ctl_impl_t; 119 120typedef struct ses2_elem_ctl_impl { 121 ses2_cmn_elem_ctl_impl_t seci_common; 122 uint8_t seci_data[3]; 123} ses2_elem_ctl_impl_t; 124 125/* 126 * SES-2 Element Status and Overall Status fields (Table 60, 7.2.3) 127 */ 128typedef struct ses2_cmn_elem_status_impl { 129 DECL_BITFIELD5( 130 sesi_status_code :4, 131 sesi_swap :1, 132 sesi_disabled :1, 133 sesi_prdfail :1, 134 _reserved1 :1); 135} ses2_cmn_elem_status_impl_t; 136 137typedef struct ses2_elem_status_impl { 138 ses2_cmn_elem_status_impl_t sesi_common; 139 uint8_t sesi_data[3]; 140} ses2_elem_status_impl_t; 141 142/* 143 * SES-2 Device element for the Enclosure Control diagnostic page. 144 */ 145typedef struct ses2_device_ctl_impl { 146 ses2_cmn_elem_ctl_impl_t sdci_common; 147 uint8_t _reserved1; 148 DECL_BITFIELD8( 149 _reserved2 :1, 150 sdci_rqst_ident :1, 151 sdci_rqst_remove :1, 152 sdci_rqst_insert :1, 153 sdci_rqst_missing :1, 154 _reserved3 :1, 155 sdci_do_not_remove :1, 156 sdci_rqst_active :1); 157 DECL_BITFIELD6( 158 _reserved4 :2, 159 sdci_enable_byp_b :1, 160 sdci_enable_byp_a :1, 161 sdci_device_off :1, 162 sdci_rqst_fault :1, 163 _reserved5 :2); 164} ses2_device_ctl_impl_t; 165 166/* 167 * SES-2 Device element for the Enclosure Status diagnostic page 168 * (Table 64, 7.3.2). 169 */ 170typedef struct ses2_device_status_impl { 171 ses2_cmn_elem_status_impl_t sdsi_common; 172 uint8_t sdsi_slot_addr; 173 DECL_BITFIELD8( 174 sdsi_report :1, 175 sdsi_ident :1, 176 sdsi_rmv :1, 177 sdsi_ready_to_insert :1, 178 sdsi_enclosure_bypassed_b :1, 179 sdsi_enclosure_bypassed_a :1, 180 sdsi_do_not_remove :1, 181 sdsi_app_client_bypassed_a :1); 182 DECL_BITFIELD8( 183 sdsi_device_bypassed_b :1, 184 sdsi_device_bypassed_a :1, 185 sdsi_bypassed_b :1, 186 sdsi_bypassed_a :1, 187 sdsi_device_off :1, 188 sdsi_fault_reqstd :1, 189 sdsi_fault_sensed :1, 190 sdsi_app_client_bypassed_b :1); 191} ses2_device_status_impl_t; 192 193typedef struct ses2_array_device_ctl_impl { 194 ses2_cmn_elem_ctl_impl_t sadci_common; 195 DECL_BITFIELD8( 196 sadci_rqst_rr_abort :1, 197 sadci_rqst_rebuild :1, 198 sadci_rqst_in_failed_array :1, 199 sadci_rqst_in_crit_array :1, 200 sadci_rqst_cons_check :1, 201 sadci_rqst_hot_spare :1, 202 sadci_rqst_rsvd_device :1, 203 sadci_rqst_ok :1); 204 DECL_BITFIELD8( 205 _reserved1 :1, 206 sadci_rqst_ident :1, 207 sadci_rqst_remove :1, 208 sadci_rqst_insert :1, 209 sadci_rqst_missing :1, 210 _reserved2 :1, 211 sadci_do_not_remove :1, 212 sadci_rqst_active :1); 213 DECL_BITFIELD6( 214 _reserved3 :2, 215 sadci_enable_byp_b :1, 216 sadci_enable_byp_a :1, 217 sadci_device_off :1, 218 sadci_rqst_fault :1, 219 _reserved4 :2); 220} ses2_array_device_ctl_impl_t; 221 222/* 223 * SES-2 Array Device element for the Enclosure Status diagnostic page 224 * (Table 66, 7.3.3) 225 */ 226typedef struct ses2_array_device_status_impl { 227 ses2_cmn_elem_status_impl_t sadsi_common; 228 DECL_BITFIELD8( 229 sadsi_rr_abort :1, 230 sadsi_rebuild :1, 231 sadsi_in_failed_array :1, 232 sadsi_in_crit_array :1, 233 sadsi_cons_chk :1, 234 sadsi_hot_spare :1, 235 sadsi_rsvd_device :1, 236 sadsi_ok :1); 237 DECL_BITFIELD8( 238 sadsi_report :1, 239 sadsi_ident :1, 240 sadsi_rmv :1, 241 sadsi_ready_to_insert :1, 242 sadsi_enclosure_bypassed_b :1, 243 sadsi_enclosure_bypassed_a :1, 244 sadsi_do_not_remove :1, 245 sadsi_app_client_bypassed_a :1); 246 DECL_BITFIELD8( 247 sadsi_device_bypassed_b :1, 248 sadsi_device_bypassed_a :1, 249 sadsi_bypassed_b :1, 250 sadsi_bypassed_a :1, 251 sadsi_device_off :1, 252 sadsi_fault_reqstd :1, 253 sadsi_fault_sensed :1, 254 sadsi_app_client_bypassed_b :1); 255} ses2_array_device_status_impl_t; 256 257/* 258 * SES-2 Power Supply element for control-type diagnostic pages (T68). 259 */ 260typedef struct ses2_psu_ctl_impl { 261 ses2_cmn_elem_ctl_impl_t spci_common; 262 DECL_BITFIELD2( 263 _reserved1 :7, 264 spci_rqst_ident :1); 265 uint8_t _reserved2; 266 DECL_BITFIELD4( 267 _reserved3 :5, 268 spci_rqst_on :1, 269 spci_rqst_fail :1, 270 _reserved4 :1); 271} ses2_psu_ctl_impl_t; 272 273/* 274 * SES-2 Power Supply element for status-type diagnostic pages (Table 69, 7.3.4) 275 */ 276typedef struct ses2_psu_status_impl { 277 ses2_cmn_elem_status_impl_t spsi_common; 278 DECL_BITFIELD2( 279 _reserved1 :7, 280 spsi_ident :1); 281 DECL_BITFIELD5( 282 _reserved2 :1, 283 spsi_dc_over_current :1, 284 spsi_dc_under_voltage :1, 285 spsi_dc_over_voltage :1, 286 _reserved3 :4); 287 DECL_BITFIELD8( 288 spsi_dc_fail :1, 289 spsi_ac_fail :1, 290 spsi_temp_warn :1, 291 spsi_overtmp_fail :1, 292 spsi_off :1, 293 spsi_rqsted_on :1, 294 spsi_fail :1, 295 spsi_hot_swap :1); 296} ses2_psu_status_impl_t; 297 298/* 299 * SES-2 Cooling element for control-type diagnostic pages (Table 70). 300 */ 301typedef struct ses2_cooling_ctl_impl { 302 ses2_cmn_elem_ctl_impl_t scci_common; 303 DECL_BITFIELD2( 304 _reserved1 :7, 305 scci_rqst_ident :1); 306 uint8_t _reserved2; 307 DECL_BITFIELD5( 308 scci_requested_speed_code :3, 309 _reserved3 :2, 310 scci_rqst_on :1, 311 scci_rqst_fail :1, 312 _reserved4 :1); 313} ses2_cooling_ctl_impl_t; 314 315/* 316 * SES-2 Cooling element for status-type diagnostic pages (Table 71, 7.3.5) 317 */ 318typedef struct ses2_cooling_status_impl { 319 ses2_cmn_elem_status_impl_t scsi_common; 320 DECL_BITFIELD3( 321 scsi_fan_speed_ms3 :3, 322 _reserved1 :4, 323 scsi_ident :1); 324 uint8_t scsi_fan_speed_lsb; 325 DECL_BITFIELD6( 326 scsi_actual_speed_code :3, 327 _reserved2 :1, 328 scsi_off :1, 329 scsi_requested_on :1, 330 scsi_fail :1, 331 _reserved3 :1); 332} ses2_cooling_status_impl_t; 333 334/* 335 * The fan_speed fields are multiplied by this factor to obtain the actual 336 * number of RPMs. 337 */ 338#define SES2_ES_COOLING_SPEED_FACTOR 10 339 340#define SES2_ES_COOLING_ST_FAN_SPEED(csip) \ 341 (((((uint16_t)(csip)->scsi_fan_speed_ms3) << 8) | \ 342 ((uint16_t)(csip)->scsi_fan_speed_lsb)) * \ 343 (uint16_t)SES2_ES_COOLING_SPEED_FACTOR) 344 345/* 346 * SES-2 Temperature Sensor element for control-type diagnostic pages (T74). 347 */ 348typedef struct ses2_temp_ctl_impl { 349 ses2_cmn_elem_ctl_impl_t stci_common; 350 DECL_BITFIELD3( 351 _reserved1 :6, 352 stci_rqst_fail :1, 353 stci_rqst_ident :1); 354 uint8_t _reserved2[2]; 355} ses2_temp_ctl_impl_t; 356 357/* 358 * SES-2 Temperature Sensor element for status-type diagnostic pages 359 * (Table 74, 7.3.6) 360 */ 361typedef struct ses2_temp_status_impl { 362 ses2_cmn_elem_status_impl_t stsi_common; 363 DECL_BITFIELD3( 364 _reserved1 :6, 365 stsi_fail :1, 366 stsi_ident :1); 367 uint8_t stsi_temperature; 368 DECL_BITFIELD4( 369 stsi_ut_warn :1, 370 stsi_ut_fail :1, 371 stsi_ot_warn :1, 372 stsi_ot_fail :1); 373} ses2_temp_status_impl_t; 374 375#define SES2_ES_TEMP_OFFSET (-20) 376 377#define SES2_ES_TEMP_ST_TEMPERATURE(tsip) \ 378 ((tsip)->stsi_temperature + SES2_ES_TEMP_OFFSET) 379 380/* 381 * SES-2 Door Lock element for control-type diagnostic pages (T76). 382 */ 383typedef struct ses2_lock_ctl_impl { 384 ses2_cmn_elem_ctl_impl_t slci_common; 385 DECL_BITFIELD3( 386 _reserved1 :6, 387 slci_rqst_fail :1, 388 slci_rqst_ident :1); 389 uint8_t _reserved2; 390 DECL_BITFIELD2( 391 slci_unlock :1, 392 _reserved3 :7); 393} ses2_lock_ctl_impl_t; 394 395/* 396 * SES-2 Door Lock element for status-type diagnostic pages (Table 77, 7.3.7) 397 */ 398typedef struct ses2_lock_status_impl { 399 ses2_cmn_elem_status_impl_t slsi_common; 400 DECL_BITFIELD3( 401 _reserved1 :6, 402 slsi_fail :1, 403 slsi_ident :1); 404 uint8_t _reserved2; 405 DECL_BITFIELD2( 406 slsi_unlocked :1, 407 _reserved3 :7); 408} ses2_lock_status_impl_t; 409 410/* 411 * SES-2 Audible Alarm element for control-type diagnostic pages (T78). 412 */ 413typedef struct ses2_alarm_ctl_impl { 414 ses2_cmn_elem_ctl_impl_t saci_common; 415 DECL_BITFIELD3( 416 _reserved1 :6, 417 saci_rqst_fail :1, 418 saci_rqst_ident :1); 419 uint8_t _reserved2; 420 DECL_BITFIELD8( 421 saci_unrecov :1, 422 saci_crit :1, 423 saci_noncrit :1, 424 saci_info :1, 425 saci_set_remind :1, 426 _reserved3 :1, 427 saci_set_mute :1, 428 _reserved4 :1); 429} ses2_alarm_ctl_impl_t; 430 431/* 432 * SES-2 Audible Alarm element for status-type diagnostic pages 433 * (Table 79, 7.3.8) 434 */ 435typedef struct ses2_alarm_status_impl { 436 ses2_cmn_elem_status_impl_t sasi_common; 437 DECL_BITFIELD3( 438 _reserved1 :6, 439 sasi_fail :1, 440 sasi_ident :1); 441 uint8_t _reserved2; 442 DECL_BITFIELD8( 443 sasi_unrecov :1, 444 sasi_crit :1, 445 sasi_noncrit :1, 446 sasi_info :1, 447 sasi_remind :1, 448 _reserved3 :1, 449 sasi_muted :1, 450 sasi_rqst_mute :1); 451} ses2_alarm_status_impl_t; 452 453/* 454 * SES-2 Enclosure Services Controller Electronics element for control-type 455 * diagnostic pages (Table 80, 7.3.9). 456 */ 457typedef struct ses2_controller_ctl_impl { 458 ses2_cmn_elem_ctl_impl_t scci_common; 459 DECL_BITFIELD3( 460 _reserved1 :6, 461 scci_rqst_fail :1, 462 scci_rqst_ident :1); 463 DECL_BITFIELD2( 464 scci_select_element :1, 465 _reserved2 :7); 466 uint8_t _reserved3; 467} ses2_controller_ctl_impl_t; 468 469/* 470 * SES-2 Enclosure Services Controller Electronics element for status-type 471 * diagnostic pages (Table 81, 7.3.9), 472 */ 473typedef struct ses2_controller_status_impl { 474 ses2_cmn_elem_status_impl_t scsi_common; 475 DECL_BITFIELD3( 476 _reserved1 :6, 477 scsi_fail :1, 478 scsi_ident :1); 479 DECL_BITFIELD2( 480 scsi_report :1, 481 _reserved2 :7); 482 DECL_BITFIELD2( 483 _reserved3 :7, 484 scsi_hot_swap :1); 485} ses2_controller_status_impl_t; 486 487/* 488 * SES-2 SCC Controller Electronics element for control-type diagnostic pages 489 * (Table 82, 7.3.10). 490 */ 491typedef struct ses2_scc_ctl_impl { 492 ses2_cmn_elem_ctl_impl_t ssci_common; 493 DECL_BITFIELD3( 494 _reserved1 :6, 495 ssci_rqst_fail :1, 496 ssci_rqst_ident :1); 497 uint8_t _reserved2[2]; 498} ses2_scc_ctl_impl_t; 499 500/* 501 * SES-2 SCC Controller Electronics element for status-type diagnostic pages 502 * (Table 83, 7.3.10) 503 */ 504typedef struct ses2_scc_status_impl { 505 ses2_cmn_elem_status_impl_t sss_common; 506 DECL_BITFIELD3( 507 _reserved1 :6, 508 sss_fail :1, 509 sss_ident :1); 510 DECL_BITFIELD2( 511 sss_report :1, 512 _reserved2 :7); 513 uint8_t _reserved3; 514} ses2_scc_status_impl_t; 515 516/* 517 * SES-2 Nonvolatile Cache element for control-type diagnostic pages 518 * (Table 84, 7.3.11). 519 */ 520typedef struct ses2_nvcache_ctl_impl { 521 ses2_cmn_elem_ctl_impl_t snci_common; 522 DECL_BITFIELD3( 523 _reserved1 :6, 524 snci_rqst_fail :1, 525 snci_rqst_ident :1); 526 uint8_t _reserved2[2]; 527} ses2_nvcache_ctl_impl_t; 528 529/* 530 * SES-2 Nonvolatile Cache element for status-type diagnostic pages (Table 85, 531 * 7.3.11) 532 */ 533typedef struct ses2_nvcache_status_impl { 534 ses2_cmn_elem_status_impl_t snsi_common; 535 DECL_BITFIELD4( 536 snsi_size_multiplier :2, 537 _reserved1 :4, 538 snsi_fail :1, 539 snsi_ident :1); 540 uint16_t snsi_nvcache_size; 541} ses2_nvcache_status_impl_t; 542 543/* 544 * Ibid., Table 86 defines the size multipliers as follows: 545 * 546 * 00b - bytes 547 * 01b - 1<<10 bytes 548 * 10b - 1<<20 bytes 549 * 11b - 1<<30 bytes 550 * 551 * We will calculate the actual size in bytes by doing 552 * 553 * nvcache_size << (SES2_NVCACHE_SHIFT * multiplier) 554 */ 555#define SES2_NVCACHE_SHIFT 10 556#define SES2_NVCACHE_SIZE(nsip) \ 557 ((uint64_t)SCSI_READ16(&(nsip)->snsi_nvcache_size) << \ 558 (SES2_NVCACHE_SHIFT * (nsip)->snsi_size_multiplier)) 559 560/* 561 * SES-2 Invalid Operation Reason element for status-type diagnostic pages 562 * (Table 88, 7.3.12) 563 */ 564typedef struct ses2_invop_reason_status_impl { 565 ses2_cmn_elem_status_impl_t sirsi_common; 566 DECL_BITFIELD2( 567 sirsi_priv_ms6 :6, 568 sirsi_invop_type :2); 569 uint8_t sirsi_priv[2]; 570} ses2_invop_reason_status_impl_t; 571 572/* 573 * Ibid., Invop Type values (Table 89) 574 */ 575typedef enum ses2_invop_type { 576 SES2_INVOP_SEND_PAGE_CODE = 0x0, 577 SES2_INVOP_SEND_PAGE_FORMAT = 0x1, 578 SES2_INVOP_VENDOR_SPECIFIC = 0x3 579} ses2_invop_type_t; 580 581/* 582 * Ibid., Invalid Operation Reason element for status-type diagnostic pages 583 * with Invop Type of 00b (Table 90) 584 */ 585typedef struct ses2_invop_code_status_impl { 586 ses2_cmn_elem_status_impl_t sicsi_common; 587 DECL_BITFIELD3( 588 sicsi_page_not_supported :1, 589 _reserved1 :5, 590 sicsi_invop_type :2); 591 uint8_t _reserved2[2]; 592} ses2_invop_code_status_impl_t; 593 594/* 595 * Ibid., Invalid Operation Reason element for status-type diagnostic pages 596 * with Invop Type of 01b (Table 91) 597 */ 598typedef struct ses2_invop_format_status_impl { 599 ses2_cmn_elem_status_impl_t sifsi_common; 600 DECL_BITFIELD3( 601 sifsi_bit_number :3, 602 _reserved1 :3, 603 sifsi_invop_type :2); 604 uint16_t sifsi_byte_offset[2]; 605} ses2_invop_format_status_impl_t; 606 607/* 608 * SES-2 Uninterruptible Power Supply element for control-type diagnostic 609 * pages (Table 93, 7.3.13) 610 */ 611typedef struct ses2_ups_ctl_impl { 612 ses2_cmn_elem_ctl_impl_t suci_common; 613 uint8_t _reserved1[2]; 614 DECL_BITFIELD3( 615 _reserved2 :6, 616 suci_rqst_fail :1, 617 suci_rqst_ident :1); 618} ses2_ups_ctl_impl_t; 619 620/* 621 * SES-2 Uninterruptible Power Supply element for status-type diagnostic pages 622 * (Table 94, 7.3.13) 623 */ 624typedef struct ses2_ups_status_impl { 625 ses2_cmn_elem_status_impl_t susi_common; 626 uint8_t susi_battery_status; /* Time remaining in minutes */ 627 DECL_BITFIELD8( 628 susi_intf_fail :1, 629 susi_warn :1, 630 susi_ups_fail :1, 631 susi_dc_fail :1, 632 susi_ac_fail :1, 633 susi_ac_qual :1, 634 susi_ac_hi :1, 635 susi_ac_lo :1); 636 DECL_BITFIELD5( 637 susi_bpf :1, 638 susi_batt_fail :1, 639 _reserved1 :4, 640 susi_fail :1, 641 susi_ident :1); 642} ses2_ups_status_impl_t; 643 644/* 645 * SES-2 Display element for control-type diagnostic pages (Table 95, 7.3.14) 646 */ 647typedef struct ses2_display_ctl_impl { 648 ses2_cmn_elem_ctl_impl_t sdci_common; 649 DECL_BITFIELD4( 650 sdci_display_mode :2, 651 _reserved1 :4, 652 sdci_rqst_fail :1, 653 sdci_rqst_ident :1); 654 uint16_t sdci_display_character; 655} ses2_display_ctl_impl_t; 656 657/* 658 * SES-2 Display element for status-type diagnostic pages (Table 97, 7.3.14) 659 */ 660typedef struct ses2_display_status_impl { 661 ses2_cmn_elem_status_impl_t sdsi_common; 662 DECL_BITFIELD4( 663 sdsi_display_mode_status :2, 664 _reserved1 :3, 665 sdsi_fail :1, 666 sdsi_ident :1); 667 uint16_t sdsi_display_character_status; 668} ses2_display_status_impl_t; 669 670/* 671 * SES-2 Key Pad Entry element for control-type diagnostic pages (Table 99). 672 */ 673typedef struct ses2_keypad_ctl_impl { 674 ses2_cmn_elem_ctl_impl_t skci_common; 675 DECL_BITFIELD3( 676 _reserved1 :6, 677 skci_rqst_fail :1, 678 skci_rqst_ident :1); 679 uint8_t _reserved2[2]; 680} ses2_keypad_ctl_impl_t; 681 682/* 683 * SES-2 Key Pad Entry element for status-type diagnostic pages (Table 100, 684 * 7.3.15) 685 */ 686typedef struct ses2_keypad_status_impl { 687 ses2_cmn_elem_status_impl_t sksi_common; 688 DECL_BITFIELD3( 689 _reserved1 :6, 690 sksi_fail :1, 691 sksi_ident :1); 692 uint8_t _reserved2[2]; 693} ses2_keypad_status_impl_t; 694 695/* 696 * SES-2 Enclosure element for control-type diagnostic pages (Table 101). 697 */ 698typedef struct ses2_enclosure_ctl_impl { 699 ses2_cmn_elem_ctl_impl_t seci_common; 700 DECL_BITFIELD2( 701 _reserved1 :7, 702 seci_rqst_ident :1); 703 DECL_BITFIELD2( 704 seci_power_cycle_delay :6, 705 seci_power_cycle_request :2); 706 DECL_BITFIELD3( 707 seci_request_warning :1, 708 seci_request_failure :1, 709 seci_power_off_duration :6); 710} ses2_enclosure_ctl_impl_t; 711 712/* 713 * SES-2 Enclosure element for status-type diagnostic pages (Table 101, 7.3.16) 714 */ 715typedef struct ses2_enclosure_status_impl { 716 ses2_cmn_elem_status_impl_t sesi_common; 717 DECL_BITFIELD2( 718 _reserved1 :7, 719 sesi_ident :1); 720 DECL_BITFIELD3( 721 sesi_warning_indication :1, 722 sesi_failure_indication :1, 723 sesi_power_delay :6); 724 DECL_BITFIELD3( 725 sesi_warning_requested :1, 726 sesi_failure_requested :1, 727 sesi_power_duration :6); 728} ses2_enclosure_status_impl_t; 729 730/* 731 * SES-2 SCSI Port/Transceiver element for control-type diagnostic pages (T103) 732 */ 733typedef struct ses2_port_ctl_impl { 734 ses2_cmn_elem_ctl_impl_t spci_common; 735 DECL_BITFIELD3( 736 _reserved1 :6, 737 spci_rqst_fail :1, 738 spci_rqst_ident :1); 739 uint8_t _reserved2; 740 DECL_BITFIELD3( 741 _reserved3 :4, 742 spci_disable :1, 743 _reserved4 :3); 744} ses2_port_ctl_impl_t; 745 746/* 747 * SES-2 SCSI Port/Transceiver element for status-type diagnostic pages 748 * (Table 104, 7.3.17) 749 */ 750typedef struct ses2_port_status_impl { 751 ses2_cmn_elem_status_impl_t spsi_common; 752 DECL_BITFIELD3( 753 _reserved1 :6, 754 spsi_fail :1, 755 spsi_ident :1); 756 DECL_BITFIELD2( 757 spsi_report :1, 758 _reserved2 :7); 759 DECL_BITFIELD5( 760 spsi_xmit_fail :1, 761 spsi_lol :1, 762 _reserved3 :2, 763 spsi_disabled :1, 764 _reserved4 :3); 765} ses2_port_status_impl_t; 766 767/* 768 * SES-2 Language element for control-type diagnostic pages (T105) 769 */ 770typedef struct ses2_lang_ctl_impl { 771 ses2_cmn_elem_ctl_impl_t slci_common; 772 DECL_BITFIELD2( 773 _reserved1 :7, 774 slci_rqst_ident :1); 775 uint16_t slci_language_code; 776} ses2_lang_ctl_impl_t; 777 778/* 779 * SES-2 Language element for status-type diagnostic pages (Table 105, 7.3.18) 780 */ 781typedef struct ses2_lang_status_impl { 782 ses2_cmn_elem_status_impl_t slsi_common; 783 DECL_BITFIELD2( 784 _reserved1 :7, 785 slsi_ident :1); 786 uint16_t slsi_language_code; 787} ses2_lang_status_impl_t; 788 789/* 790 * SES-2 Communication Port element for control-type diagnostic pages 791 * (Table 107, 7.3.19). 792 */ 793typedef struct ses2_comm_ctl_impl { 794 ses2_cmn_elem_ctl_impl_t scci_common; 795 DECL_BITFIELD3( 796 _reserved1 :6, 797 scci_rqst_fail :1, 798 scci_rqst_ident :1); 799 uint8_t _reserved2; 800 DECL_BITFIELD2( 801 scci_disable :1, 802 _reserved3 :7); 803} ses2_comm_ctl_impl_t; 804 805/* 806 * SES-2 Communication Port element for status-type diagnostic pages 807 * (Table 108, 7.3.19) 808 */ 809typedef struct ses2_comm_status_impl { 810 ses2_cmn_elem_status_impl_t scsi_common; 811 DECL_BITFIELD3( 812 _reserved1 :6, 813 scsi_fail :1, 814 scsi_ident :1); 815 uint8_t _reserved2; 816 DECL_BITFIELD2( 817 scsi_disabled :1, 818 _reserved3 :7); 819} ses2_comm_status_impl_t; 820 821/* 822 * SES-2 Voltage Sensor element for control-type diagnostic pages 823 * (Table 109, 7.3.20). 824 */ 825typedef struct ses2_voltage_ctl_impl { 826 ses2_cmn_elem_ctl_impl_t svci_common; 827 DECL_BITFIELD3( 828 _reserved1 :6, 829 svci_rqst_fail :1, 830 svci_rqst_ident :1); 831 uint8_t _reserved2[2]; 832} ses2_voltage_ctl_impl_t; 833 834/* 835 * SES-2 Voltage Sensor element for status-type diagnostic pages 836 * (Table 110, 7.3.20). 837 */ 838typedef struct ses2_voltage_status_impl { 839 ses2_cmn_elem_status_impl_t svsi_common; 840 DECL_BITFIELD7( 841 svsi_crit_under :1, 842 svsi_crit_over :1, 843 svsi_warn_under :1, 844 svsi_warn_over :1, 845 _reserved1 :2, 846 svsi_fail :1, 847 svsi_ident :1); 848 uint16_t svsi_voltage; 849} ses2_voltage_status_impl_t; 850 851/* 852 * Ibid. defines the svsi_voltage field as a 16-bit signed 2's complement 853 * integer, represented in units of 10 mV. AC voltages are RMS. 854 */ 855#define SES2_VOLTAGE_MULTIPLIER (0.01) 856#define SES2_VOLTAGE(vsip) \ 857 (SCSI_READ16(&(vsip)->svsi_voltage) * SES2_VOLTAGE_MULTIPLIER) 858 859/* 860 * SES-2 Current Sensor element for control-type diagnostic pages 861 * (Table 111, 7.3.21). 862 */ 863typedef struct ses2_current_ctl_impl { 864 ses2_cmn_elem_ctl_impl_t scci_common; 865 DECL_BITFIELD3( 866 _reserved1 :6, 867 scci_rqst_fail :1, 868 scci_rqst_ident :1); 869 uint8_t _reserved2[2]; 870} ses2_current_ctl_impl_t; 871 872/* 873 * SES-2 Current Sensor element for status-type diagnostic pages 874 * (Table 112, 7.3.21) 875 */ 876typedef struct ses2_current_status_impl { 877 ses2_cmn_elem_status_impl_t scsi_common; 878 DECL_BITFIELD7( 879 _reserved1 :1, 880 scsi_crit_over :1, 881 _reserved2 :1, 882 scsi_warn_over :1, 883 _reserved3 :2, 884 scsi_fail :1, 885 scsi_ident :1); 886 uint16_t scsi_current; 887} ses2_current_status_impl_t; 888 889/* 890 * Ibid. defines the scsi_voltage field in the same way as for voltage above. 891 * Units here are 10 mA. AC amperages are RMS. 892 */ 893#define SES2_CURRENT_MULTIPLIER (0.01) 894#define SES2_CURRENT(csip) \ 895 (SCSI_READ16(&(csip)->scsi_current) * SES2_CURRENT_MULTIPLIER) 896 897/* 898 * SES-2 SCSI Target Port element for control-type diagnostic pages 899 * (Table 113, 7.3.22), SCSI Initiator Port element for control-type 900 * diagnostic pages (Table 115, 7.3.23). 901 */ 902typedef struct ses2_itp_ctl_impl { 903 ses2_cmn_elem_ctl_impl_t sici_common; 904 DECL_BITFIELD3( 905 _reserved1 :6, 906 sici_rqst_fail :1, 907 sici_rqst_ident :1); 908 uint8_t _reserved2; 909 DECL_BITFIELD2( 910 sici_enable :1, 911 _reserved3 :7); 912} ses2_itp_ctl_impl_t; 913 914/* 915 * SES-2 SCSI Target Port element for status-type diagnostic pages (Table 114, 916 * 7.3.22), SCSI Initiator Port element for status-type diagnostic pages 917 * (Table 116, 7.3.23) 918 */ 919typedef struct ses2_itp_status_impl { 920 ses2_cmn_elem_status_impl_t sisi_common; 921 DECL_BITFIELD3( 922 _reserved1 :6, 923 sisi_fail :1, 924 sisi_ident :1); 925 DECL_BITFIELD2( 926 sisi_report :1, 927 _reserved2 :7); 928 DECL_BITFIELD2( 929 sisi_enabled :1, 930 _reserved3 :7); 931} ses2_itp_status_impl_t; 932 933/* 934 * SES-2 Simple Subenclosure element for control-type diagnostic pages 935 * (Table 117, 7.3.24). 936 */ 937typedef struct ses2_ss_ctl_impl { 938 ses2_cmn_elem_ctl_impl_t ssci_common; 939 DECL_BITFIELD3( 940 _reserved1 :6, 941 ssci_rqst_fail :1, 942 ssci_rqst_ident :1); 943 uint8_t _reserved2[2]; 944} ses2_ss_ctl_impl_t; 945 946/* 947 * SES-2 Simple Subenclosure element for status-type diagnostic pages 948 * (Table 117, 7.3.24) 949 */ 950typedef struct ses2_ss_status_impl { 951 ses2_cmn_elem_status_impl_t sss_common; 952 DECL_BITFIELD3( 953 _reserved1 :6, 954 sss_fail :1, 955 sss_ident :1); 956 uint8_t _reserved2; 957 uint8_t sss_short_status; 958} ses2_ss_status_impl_t; 959 960/* 961 * SES-2 SAS Expander element for control-type diagnostic pages 962 * (Table 119, 7.3.25). 963 */ 964typedef struct ses2_expander_ctl_impl { 965 ses2_cmn_elem_ctl_impl_t seci_common; 966 DECL_BITFIELD3( 967 _reserved1 :6, 968 seci_rqst_fail :1, 969 seci_rqst_ident :1); 970 uint8_t _reserved2[2]; 971} ses2_expander_ctl_impl_t; 972 973/* 974 * SES-2 SAS Expander element for status-type diagnostic pages (Table 120, 975 * 7.3.25) 976 */ 977typedef struct ses2_expander_status_impl { 978 ses2_cmn_elem_status_impl_t sesi_common; 979 DECL_BITFIELD3( 980 _reserved1 :6, 981 sesi_fail :1, 982 sesi_ident :1); 983 uint8_t _reserved2[2]; 984} ses2_expander_status_impl_t; 985 986/* 987 * SES-2 SAS Connector element for control-type diagnostic pages (Table 121, 988 * 7.3.26). 989 */ 990typedef struct ses2_sasconn_ctl_impl { 991 ses2_cmn_elem_ctl_impl_t ssci_common; 992 DECL_BITFIELD2( 993 _reserved1 :7, 994 ssci_rqst_ident :1); 995 uint8_t _reserved2; 996 DECL_BITFIELD3( 997 _reserved3 :6, 998 ssci_rqst_fail :1, 999 _reserved4 :1); 1000} ses2_sasconn_ctl_impl_t; 1001 1002/* 1003 * SES-2 SAS Connector element for status-type diagnostic pages (Table 122, 1004 * 7.3.26) 1005 */ 1006typedef struct ses2_sasconn_status_impl { 1007 ses2_cmn_elem_status_impl_t sss_common; 1008 DECL_BITFIELD2( 1009 sss_connector_type :7, 1010 sss_ident :1); 1011 uint8_t sss_connector_physical_link; 1012 DECL_BITFIELD3( 1013 _reserved1 :6, 1014 sss_fail :1, 1015 _reserved2 :1); 1016} ses2_sasconn_status_impl_t; 1017 1018/* 1019 * SES-2 Enclosure Control diagnostic page (Table 10, 6.1.3) 1020 */ 1021typedef struct ses2_control_page_impl { 1022 uint8_t scpi_page_code; 1023 DECL_BITFIELD5( 1024 scpi_unrecov :1, 1025 scpi_crit :1, 1026 scpi_noncrit :1, 1027 scpi_info :1, 1028 _reserved1 :4); 1029 uint16_t scpi_page_length; 1030 uint32_t scpi_generation_code; 1031 ses2_elem_ctl_impl_t scpi_data[1]; 1032} ses2_control_page_impl_t; 1033 1034/* 1035 * SES-2 Enclosure Status (Table 11, 6.1.4) 1036 */ 1037typedef struct ses2_status_page_impl { 1038 uint8_t sspi_page_code; 1039 DECL_BITFIELD6( 1040 sspi_unrecov :1, 1041 sspi_crit :1, 1042 sspi_noncrit :1, 1043 sspi_info :1, 1044 sspi_invop :1, 1045 _reserved1 :3); 1046 uint16_t sspi_page_length; 1047 uint32_t sspi_generation_code; 1048 uint8_t sspi_data[1]; 1049} ses2_status_page_impl_t; 1050 1051/* 1052 * SES-2 Help Text diagnostic page (Table 13, 6.1.5). 1053 */ 1054typedef struct ses2_help_page_impl { 1055 uint8_t shpi_page_code; 1056 uint8_t _reserved1; 1057 uint16_t shpi_page_length; 1058 char shpi_help_text[1]; 1059} ses2_help_page_impl_t; 1060 1061/* 1062 * SES-2 String Out diagnostic page (Table 14, 6.1.6). 1063 */ 1064typedef struct ses2_string_out_page_impl { 1065 uint8_t ssopi_page_code; 1066 uint8_t _reserved1; 1067 uint16_t ssopi_page_length; 1068 uint8_t ssopi_data[1]; 1069} ses2_string_out_page_impl_t; 1070 1071/* 1072 * SES-2 String In diagnostic page (Table 15, 6.1.7). 1073 */ 1074typedef struct ses2_string_in_page_impl { 1075 uint8_t ssipi_page_code; 1076 uint8_t _reserved1; 1077 uint16_t ssipi_page_length; 1078 uint8_t ssipi_data[1]; 1079} ses2_string_in_page_impl_t; 1080 1081/* 1082 * SES-2 Threshold fields - (Table 17, 6.1.8), (Table 19, 6.1.9). 1083 */ 1084typedef struct ses2_threshold_impl { 1085 uint8_t sti_high_crit; 1086 uint8_t sti_high_warn; 1087 uint8_t sti_low_warn; 1088 uint8_t sti_low_crit; 1089} ses2_threshold_impl_t; 1090 1091/* 1092 * SES-2 Threshold Out diagnostic page (Table 16, 6.1.8). 1093 */ 1094typedef struct ses2_threshold_out_page_impl { 1095 uint8_t stopi_page_code; 1096 uint8_t _reserved1; 1097 uint16_t stopi_page_length; 1098 uint32_t stopi_generation_code; 1099 ses2_threshold_impl_t stopi_thresholds[1]; 1100} ses2_threshold_out_page_impl_t; 1101 1102/* 1103 * SES-2 Threshold In diagnostic page (Table 18, 6.1.9). 1104 */ 1105typedef struct ses2_threshold_in_page_impl { 1106 uint8_t stipi_page_code; 1107 DECL_BITFIELD3( 1108 _reserved1 :4, 1109 stipi_invop :1, 1110 _reserved2 :3); 1111 uint16_t stipi_page_length; 1112 uint32_t stipi_generation_code; 1113 ses2_threshold_impl_t stipi_thresholds[1]; 1114} ses2_threshold_in_page_impl_t; 1115 1116/* 1117 * SES-2 Element Descriptor diagnostic page (Table 20, 6.1.10). 1118 */ 1119typedef struct ses2_elem_desc_page_impl { 1120 uint8_t sedpi_page_code; 1121 uint8_t _reserved1; 1122 uint16_t sedpi_page_length; 1123 uint32_t sedpi_generation_code; 1124 uint8_t sedpi_data[1]; 1125} ses2_elem_desc_page_impl_t; 1126 1127/* 1128 * SES-2 Overall/element descriptor format (Table 22, 6.1.10). 1129 */ 1130typedef struct ses2_elem_descriptor_impl { 1131 uint8_t _reserved1[2]; 1132 uint16_t sedi_descriptor_length; 1133 char sedi_descriptor[1]; 1134} ses2_elem_descriptor_impl_t; 1135 1136/* 1137 * SES-2 Short Enclosure Status diagnostic page (Table 23, 6.1.11). 1138 */ 1139typedef struct ses2_short_status_page_impl { 1140 uint8_t ssspi_page_code; 1141 uint8_t ssspi_short_status; 1142 uint16_t ssspi_page_length; 1143} ses2_short_status_page_impl_t; 1144 1145/* 1146 * SES-2 Enclosure Busy diagnostic page (Table 24, 6.1.12). 1147 */ 1148typedef struct ses2_enclosure_busy_page_impl { 1149 uint8_t sebpi_page_code; 1150 DECL_BITFIELD2( 1151 sebpi_busy :1, 1152 sebpi_vs_1_1 :7); 1153 uint16_t sebpi_page_length; 1154} ses2_enclosure_busy_page_impl_t; 1155 1156/* 1157 * SES-2 Additional Element Status diagnostic page (Table 25, 6.1.13). 1158 */ 1159typedef struct ses2_aes_page_impl { 1160 uint8_t sapi_page_code; 1161 uint8_t _reserved1; 1162 uint16_t sapi_page_length; 1163 uint32_t sapi_generation_code; 1164 uint8_t sapi_data[1]; 1165} ses2_aes_page_impl_t; 1166 1167/* 1168 * SES-2 Additional Element Status descriptor (EIP == 1) (Table 26, 6.1.13). 1169 */ 1170typedef struct ses2_aes_descr_eip_impl { 1171 DECL_BITFIELD4( 1172 sadei_protocol_identifier :4, 1173 sadei_eip :1, 1174 _reserved1 :2, 1175 sadei_invalid :1); 1176 uint8_t sadei_length; 1177 uint8_t _reserved2; 1178 uint8_t sadei_element_index; 1179 uint8_t sadei_protocol_specific[1]; 1180} ses2_aes_descr_eip_impl_t; 1181 1182/* 1183 * SES-2 Additional Element Status descriptor (EIP == 0) (Table 27, 6.1.13). 1184 */ 1185typedef struct ses2_aes_descr_impl { 1186 DECL_BITFIELD4( 1187 sadei_protocol_identifier :4, 1188 sadei_eip :1, 1189 _reserved1 :2, 1190 sadei_invalid :1); 1191 uint8_t sadei_length; 1192 uint8_t sadei_protocol_specific[1]; 1193} ses2_aes_descr_impl_t; 1194 1195/* 1196 * SES-2 Port descriptor (Table 30, 6.1.13.2). 1197 */ 1198typedef struct ses2_aes_port_descr_impl { 1199 uint8_t sapdi_port_loop_position; 1200 uint8_t _reserved1[3]; 1201 uint8_t sapdi_port_requested_hard_address; 1202 uint8_t sapdi_n_port_identifier[3]; 1203 uint64_t sapdi_n_port_name; 1204} ses2_aes_port_descr_impl_t; 1205 1206/* 1207 * SES-2 Additional Element Status descriptor for FC (Table 28, 6.1.13.2). 1208 */ 1209typedef struct ses2_aes_descr_fc_eip_impl { 1210 uint8_t sadfi_n_ports; 1211 uint8_t _reserved1[2]; 1212 uint8_t sadfi_bay_number; 1213 uint64_t sadfi_node_name; 1214 ses2_aes_port_descr_impl_t sadfi_ports[1]; 1215} ses2_aes_descr_fc_eip_impl_t; 1216 1217/* 1218 * SES-2 Additional Element Status descriptor for FC (EIP == 0) 1219 * (Table 29, 6.1.13.2). 1220 */ 1221typedef struct ses2_aes_descr_fc_impl { 1222 uint8_t sadfi_n_ports; 1223 uint8_t _reserved1; 1224 uint64_t sadfi_node_name; 1225 ses2_aes_port_descr_impl_t sadfi_ports[1]; 1226} ses2_aes_descr_fc_impl_t; 1227 1228/* 1229 * SES-2 Additional Element Status descriptor for SAS (Table 31, 6.1.13.3). 1230 */ 1231typedef struct ses2_aes_descr_sas_impl { 1232 uint8_t _specific1; 1233 DECL_BITFIELD2( 1234 _specific2 :6, 1235 sadsi_descriptor_type :2); 1236 uint8_t _specific3[1]; 1237} ses2_aes_descr_sas_impl_t; 1238 1239typedef enum ses2_aes_descr_sas_type { 1240 SES2_AESD_SAS_DEVICE = 0, 1241 SES2_AESD_SAS_OTHER = 1 1242} ses2_aes_descr_sas_type_t; 1243 1244typedef struct ses2_aes_phy0_descr_impl { 1245 DECL_BITFIELD3( 1246 _reserved1 :4, 1247 sapdi_device_type :3, 1248 _reserved2 :1); 1249 uint8_t _reserved3; 1250 DECL_BITFIELD5( 1251 _reserved4 :1, 1252 sapdi_smp_initiator_port :1, 1253 sapdi_stp_initiator_port :1, 1254 sapdi_ssp_initiator_port :1, 1255 _reserved5 :4); 1256 DECL_BITFIELD6( 1257 sapdi_sata_device :1, 1258 sapdi_smp_target_port :1, 1259 sapdi_stp_target_port :1, 1260 sapdi_ssp_target_port :1, 1261 _reserved6 :3, 1262 sapdi_sata_port_selector :1); 1263 uint64_t sapdi_attached_sas_address; 1264 uint64_t sapdi_sas_address; 1265 uint8_t sapdi_phy_identifier; 1266 uint8_t _reserved7[7]; 1267} ses2_aes_phy0_descr_impl_t; 1268 1269typedef struct ses2_aes_descr_sas0_eip_impl { 1270 uint8_t sadsi_n_phy_descriptors; 1271 DECL_BITFIELD3( 1272 sadsi_not_all_phys :1, 1273 _reserved1 :5, 1274 sadsi_descriptor_type :2); 1275 uint8_t _reserved2; 1276 uint8_t sadsi_bay_number; 1277 ses2_aes_phy0_descr_impl_t sadsi_phys[1]; 1278} ses2_aes_descr_sas0_eip_impl_t; 1279 1280typedef struct ses2_aes_descr_sas0_impl { 1281 uint8_t sadsi_n_phy_descriptors; 1282 DECL_BITFIELD3( 1283 sadsi_not_all_phys :1, 1284 _reserved1 :5, 1285 sadsi_descriptor_type :2); 1286 ses2_aes_phy0_descr_impl_t sadsi_phys[1]; 1287} ses2_aes_descr_sas0_impl_t; 1288 1289/* 1290 * SES-2 Additional Element Status for SAS Expander elements 1291 * (Table 36, 6.1.13.3.3). 1292 */ 1293typedef struct ses2_aes_exp_phy_descr_impl { 1294 uint8_t saepdi_connector_element_index; 1295 uint8_t saepdi_other_element_index; 1296} ses2_aes_exp_phy_descr_impl_t; 1297 1298typedef struct ses2_aes_descr_exp_impl { 1299 uint8_t sadei_n_exp_phy_descriptors; 1300 DECL_BITFIELD2( 1301 _reserved1 :6, 1302 sadei_descriptor_type :2); 1303 uint8_t _reserved2[2]; 1304 uint64_t sadei_sas_address; 1305 ses2_aes_exp_phy_descr_impl_t sadei_phys[1]; 1306} ses2_aes_descr_exp_impl_t; 1307 1308/* 1309 * SES-2 Additional Element Status for SCSI Initiator/Target Port and 1310 * Enclosure Services Controller Electronics elements (Table 38, 6.1.13.3.4). 1311 */ 1312typedef struct ses2_aes_phy1_descr_impl { 1313 uint8_t sapdi_phy_identifier; 1314 uint8_t _reserved1; 1315 uint8_t sapdi_connector_element_index; 1316 uint8_t sapdi_other_element_index; 1317 uint64_t sapdi_sas_address; 1318} ses2_aes_phy1_descr_impl_t; 1319 1320typedef struct ses2_aes_descr_sas1_impl { 1321 uint8_t sadsi_n_phy_descriptors; 1322 DECL_BITFIELD2( 1323 _reserved1 :6, 1324 sadsi_descriptor_type :2); 1325 uint8_t _reserved2[2]; 1326 ses2_aes_phy1_descr_impl_t sadsi_phys[1]; 1327} ses2_aes_descr_sas1_impl_t; 1328 1329/* 1330 * SES-2 Subenclosure Help Text diagnostic page (Table 40, 6.1.14). 1331 */ 1332typedef struct ses2_subhelp_page_impl { 1333 uint8_t sspi_page_code; 1334 uint8_t sspi_n_subenclosures; 1335 uint16_t sspi_page_length; 1336 uint32_t sspi_generation_code; 1337 uint8_t sspi_data[1]; 1338} ses2_subhelp_page_impl_t; 1339 1340/* 1341 * SES-2 Subenclosure help text format (Table 41, 6.1.14). 1342 */ 1343typedef struct ses2_subhelp_text_impl { 1344 uint8_t _reserved1; 1345 uint8_t ssti_subenclosure_identifier; 1346 uint16_t ssti_subenclosure_help_text_length; 1347 char ssti_subenclosure_help_text[1]; 1348} ses2_subhelp_text_impl_t; 1349 1350#define SES2_SUBHELP_LEN(stip) \ 1351 ((stip)->ssti_subenclosure_help_text_length + \ 1352 offsetof(ses2_subhelp_text_impl_t, ssti_subenclosure_help_text[0])) 1353/* 1354 * SES-2 Subenclosure String Out diagnostic page (Table 42, 6.1.15). 1355 */ 1356typedef struct ses2_substring_out_page_impl { 1357 uint8_t ssopi_page_code; 1358 uint8_t ssopi_subenclosure_identifier; 1359 uint16_t ssopi_page_length; 1360 uint32_t ssopi_generation_code; 1361 uint8_t ssopi_data[1]; 1362} ses2_substring_out_page_impl_t; 1363 1364/* 1365 * SES-2 Subenclosure String In diagnostic page (Table 43, 6.1.16). 1366 */ 1367typedef struct ses2_substring_in_page_impl { 1368 uint8_t ssipi_page_code; 1369 uint8_t ssipi_n_subenclosures; 1370 uint16_t ssipi_page_length; 1371 uint32_t ssipi_generation_code; 1372 uint8_t ssipi_data[1]; 1373} ses2_substring_in_page_impl_t; 1374 1375/* 1376 * SES-2 Subenclosure string in data format (Table 44, 6.1.16). 1377 */ 1378typedef struct ses2_substring_in_data_impl { 1379 uint8_t _reserved1; 1380 uint8_t ssidi_subenclosure_identifier; 1381 uint16_t ssidi_substring_data_length; 1382 uint8_t ssidi_data[1]; 1383} ses2_substring_in_data_impl_t; 1384 1385#define SES2_SUBSTR_LEN(sdip) \ 1386 ((sdip)->ssidi_substring_data_length + \ 1387 offsetof(ses2_substring_in_data_impl_t, ssidi_data[0])) 1388 1389/* 1390 * SES-2 Supported SES Diagnostic Pages diagnostic page (Table 45, 6.1.17). 1391 */ 1392typedef struct ses2_supported_ses_diag_page_impl { 1393 uint8_t sssdpi_page_code; 1394 uint8_t _reserved1; 1395 uint16_t sssdpi_page_length; 1396 uint8_t sssdpi_pages[1]; 1397} ses2_supported_ses_diag_page_impl_t; 1398 1399/* 1400 * SES-2 Download Microcode Control diagnostic page (Table 46, 6.1.18). 1401 */ 1402typedef struct ses2_ucode_ctl_page_impl { 1403 uint8_t sucpi_page_code; 1404 uint8_t sucpi_subenclosure_identifier; 1405 uint16_t sucpi_page_length; 1406 uint32_t sucpi_generation_code; 1407 uint8_t sucpi_dl_ucode_mode; 1408 uint8_t _reserved1[2]; 1409 uint8_t sucpi_buffer_id; 1410 uint32_t sucpi_buffer_offset; 1411 uint32_t sucpi_ucode_image_length; 1412 uint32_t sucpi_ucode_data_length; 1413 uint8_t sucpi_ucode_data[1]; 1414} ses2_ucode_ctl_page_impl_t; 1415 1416/* 1417 * SES-2 Download Microcode Status diagnostic page (Table 48-49, 6.1.19). 1418 */ 1419typedef struct ses2_ucode_status_descr_impl { 1420 uint8_t _reserved1; 1421 uint8_t susdi_subenclosure_identifier; 1422 uint8_t susdi_subenclosure_dl_status; 1423 uint8_t susdi_subenclosure_dl_addl_status; 1424 uint32_t susdi_subenclosure_dl_max_size; 1425 uint8_t _reserved2[3]; 1426 uint8_t susdi_subenclosure_dl_buffer_id; 1427 uint32_t susdi_subenclosure_dl_buffer_offset; 1428} ses2_ucode_status_descr_impl_t; 1429 1430typedef struct ses2_ucode_status_page_impl { 1431 uint8_t suspi_page_code; 1432 uint8_t suspi_n_subenclosures; 1433 uint16_t suspi_page_length; 1434 uint32_t suspi_generation_code; 1435 ses2_ucode_status_descr_impl_t suspi_descriptors[1]; 1436} ses2_ucode_status_page_impl_t; 1437 1438/* 1439 * SES-2 Subenclosure Nickname Control diagnostic page (Table 51, 6.1.20). 1440 */ 1441typedef struct ses2_subnick_ctl_page_impl { 1442 uint8_t sscpi_page_code; 1443 uint8_t sspci_subenclosure_identifier; 1444 uint16_t sspci_page_length; 1445 uint32_t sspci_generation_code; 1446 char sspci_subenclosure_nickname[32]; 1447} ses2_subnick_ctl_page_impl_t; 1448 1449/* 1450 * SES-2 Subenclosure Nickname Status diagnostic page (Table 52-53, 6.1.21). 1451 */ 1452typedef struct ses2_subnick_descr_impl { 1453 uint8_t _reserved1; 1454 uint8_t ssdi_subenclosure_identifier; 1455 uint8_t ssdi_subenclosure_nick_status; 1456 uint8_t ssdi_subenclosure_nick_addl_status; 1457 uint8_t _reserved2[2]; 1458 uint16_t ssdi_subenclosure_nick_lang_code; 1459 char ssdi_subenclosure_nickname[32]; 1460} ses2_subnick_descr_impl_t; 1461 1462typedef struct ses2_subnick_status_page_impl { 1463 uint8_t sspsi_page_code; 1464 uint8_t sspci_n_subenclosures; 1465 uint16_t sspci_page_length; 1466 uint32_t sspci_generation_code; 1467 ses2_subnick_descr_impl_t sspci_subnicks[1]; 1468} ses2_subnick_status_page_impl_t; 1469 1470/* 1471 * SES-2 Mode page code for enclosure services devices (Table 57, 6.3.2). 1472 */ 1473typedef struct ses2_esm_mode_page_impl { 1474 DECL_BITFIELD3( 1475 sempi_page_code :6, 1476 _reserved1 :1, 1477 sempi_ps :1); 1478 uint8_t sempi_page_length; 1479 uint8_t _reserved2[3]; 1480 DECL_BITFIELD2( 1481 sempi_enbltc :1, 1482 _reserved3 :7); 1483 uint16_t sempi_max_task_completion_time; 1484} ses2_esm_mode_page_impl_t; 1485 1486#pragma pack() 1487 1488extern ses_pagedesc_t ses2_pages[]; 1489 1490extern int ses2_fill_element_node(ses_plugin_t *, ses_node_t *); 1491extern int ses2_fill_enclosure_node(ses_plugin_t *, ses_node_t *); 1492 1493typedef int (*ses2_setprop_f)(ses_plugin_t *, ses_node_t *, ses2_diag_page_t, 1494 nvpair_t *); 1495 1496typedef struct ses2_ctl_prop { 1497 const char *scp_name; 1498 data_type_t scp_type; 1499 ses2_diag_page_t scp_num; 1500 ses2_setprop_f scp_setprop; 1501} ses2_ctl_prop_t; 1502 1503typedef int (*ses2_setdef_f)(ses_node_t *, ses2_diag_page_t, void *); 1504 1505extern int ses2_ctl_common_setprop(ses_plugin_t *sp, ses_node_t *, 1506 ses2_diag_page_t, nvpair_t *); 1507 1508#define SES_COMMON_CTL_PROPS \ 1509{ \ 1510 .scp_name = SES_PROP_SWAP, \ 1511 .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1512 .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1513 .scp_setprop = ses2_ctl_common_setprop \ 1514}, \ 1515{ \ 1516 .scp_name = SES_PROP_DISABLED, \ 1517 .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1518 .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1519 .scp_setprop = ses2_ctl_common_setprop \ 1520}, \ 1521{ \ 1522 .scp_name = SES_PROP_PRDFAIL, \ 1523 .scp_type = DATA_TYPE_BOOLEAN_VALUE, \ 1524 .scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, \ 1525 .scp_setprop = ses2_ctl_common_setprop \ 1526} 1527 1528typedef struct ses2_ctl_desc { 1529 ses2_element_type_t scd_et; 1530 const ses2_ctl_prop_t *scd_props; 1531 ses2_setdef_f scd_setdef; 1532} ses2_ctl_desc_t; 1533 1534extern int ses2_setprop(ses_plugin_t *, ses_node_t *, const ses2_ctl_prop_t *, 1535 nvlist_t *); 1536 1537extern int ses2_element_setdef(ses_node_t *, ses2_diag_page_t, void *); 1538extern int ses2_enclosure_setdef(ses_node_t *, ses2_diag_page_t, void *); 1539 1540extern int ses2_element_ctl(ses_plugin_t *, ses_node_t *, const char *, 1541 nvlist_t *); 1542extern int ses2_enclosure_ctl(ses_plugin_t *, ses_node_t *, const char *, 1543 nvlist_t *); 1544 1545#ifdef __cplusplus 1546} 1547#endif 1548 1549#endif /* _PLUGIN_SES_IMPL_H */ 1550