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