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