xref: /illumos-gate/usr/src/lib/scsi/plugins/ses/ses2/common/ses2_element_ctl.c (revision 9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829)
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  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <sys/types.h>
29 #include <stddef.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <libnvpair.h>
33 
34 #include <scsi/libses.h>
35 #include "ses2_impl.h"
36 
37 static int
38 elem_setprop_device(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
39     nvpair_t *nvp)
40 {
41 	ses2_device_ctl_impl_t *dip;
42 	const char *name;
43 	boolean_t v;
44 
45 	if ((dip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
46 	    page, 0, np, B_FALSE)) == NULL)
47 		return (-1);
48 
49 	name = nvpair_name(nvp);
50 	(void) nvpair_value_boolean_value(nvp, &v);
51 
52 	if (strcmp(name, SES_PROP_IDENT) == 0)
53 		dip->sdci_rqst_ident = v;
54 	else if (strcmp(name, SES_PROP_RMV) == 0)
55 		dip->sdci_rqst_remove = v;
56 	else if (strcmp(name, SES_DEV_PROP_READY_TO_INSERT) == 0)
57 		dip->sdci_rqst_insert = v;
58 	else if (strcmp(name, SES_DEV_PROP_REQ_MISSING) == 0)
59 		dip->sdci_rqst_missing = v;
60 	else if (strcmp(name, SES_DEV_PROP_DO_NOT_REMOVE) == 0)
61 		dip->sdci_do_not_remove = v;
62 	else if (strcmp(name, SES_DEV_PROP_REQ_ACTIVE) == 0)
63 		dip->sdci_rqst_active = v;
64 	else if (strcmp(name, SES_DEV_PROP_BYP_B) == 0)
65 		dip->sdci_enable_byp_b = v;
66 	else if (strcmp(name, SES_DEV_PROP_BYP_A) == 0)
67 		dip->sdci_enable_byp_a = v;
68 	else if (strcmp(name, SES_PROP_OFF) == 0)
69 		dip->sdci_device_off = v;
70 	else if (strcmp(name, SES_DEV_PROP_FAULT_RQSTD) == 0)
71 		dip->sdci_rqst_fault = v;
72 	else
73 		ses_panic("Bad property %s", name);
74 
75 	return (0);
76 }
77 
78 static int
79 elem_setprop_psu(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
80     nvpair_t *nvp)
81 {
82 	ses2_psu_ctl_impl_t *pip;
83 	const char *name;
84 	boolean_t v;
85 
86 	if ((pip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
87 	    page, 0, np, B_FALSE)) == NULL)
88 		return (-1);
89 
90 	name = nvpair_name(nvp);
91 	(void) nvpair_value_boolean_value(nvp, &v);
92 
93 	if (strcmp(name, SES_PROP_IDENT) == 0)
94 		pip->spci_rqst_ident = v;
95 	else if (strcmp(name, SES_PROP_REQUESTED_ON) == 0)
96 		pip->spci_rqst_on = v;
97 	else if (strcmp(name, SES_PROP_FAIL) == 0)
98 		pip->spci_rqst_fail = v;
99 	else
100 		ses_panic("Bad property %s", name);
101 
102 	return (0);
103 }
104 
105 static int
106 elem_setprop_cooling(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
107     nvpair_t *nvp)
108 {
109 	ses2_cooling_ctl_impl_t *cip;
110 	const char *name;
111 	boolean_t v1;
112 	uint64_t v64;
113 
114 	if ((cip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
115 	    page, 0, np, B_FALSE)) == NULL)
116 		return (-1);
117 
118 	name = nvpair_name(nvp);
119 
120 	if (strcmp(name, SES_COOLING_PROP_SPEED_CODE) == 0) {
121 		(void) nvpair_value_uint64(nvp, &v64);
122 		cip->scci_requested_speed_code = v64;
123 		return (0);
124 	}
125 
126 	(void) nvpair_value_boolean_value(nvp, &v1);
127 
128 	if (strcmp(name, SES_PROP_IDENT) == 0)
129 		cip->scci_rqst_ident = v1;
130 	else if (strcmp(name, SES_PROP_REQUESTED_ON) == 0)
131 		cip->scci_rqst_on = v1;
132 	else if (strcmp(name, SES_PROP_FAIL) == 0)
133 		cip->scci_rqst_fail = v1;
134 	else
135 		ses_panic("Bad property %s", name);
136 
137 	return (0);
138 }
139 
140 static int
141 elem_setprop_temp(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
142     nvpair_t *nvp)
143 {
144 	ses2_temp_ctl_impl_t *tip;
145 	const char *name;
146 	boolean_t v;
147 
148 	if ((tip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
149 	    page, 0, np, B_FALSE)) == NULL)
150 		return (-1);
151 
152 	name = nvpair_name(nvp);
153 	(void) nvpair_value_boolean_value(nvp, &v);
154 
155 	if (strcmp(name, SES_PROP_FAIL) == 0)
156 		tip->stci_rqst_fail = v;
157 	else if (strcmp(name, SES_PROP_IDENT) == 0)
158 		tip->stci_rqst_ident = v;
159 	else
160 		ses_panic("Bad property %s", name);
161 
162 	return (0);
163 }
164 
165 static int
166 elem_setprop_lock(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
167     nvpair_t *nvp)
168 {
169 	ses2_lock_ctl_impl_t *lip;
170 	const char *name;
171 	boolean_t v;
172 
173 	if ((lip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
174 	    page, 0, np, B_FALSE)) == NULL)
175 		return (-1);
176 
177 	name = nvpair_name(nvp);
178 	(void) nvpair_value_boolean_value(nvp, &v);
179 
180 	if (strcmp(name, SES_PROP_FAIL) == 0)
181 		lip->slci_rqst_fail = v;
182 	else if (strcmp(name, SES_PROP_IDENT) == 0)
183 		lip->slci_rqst_ident = v;
184 	else if (strcmp(name, SES_LOCK_PROP_UNLOCKED) == 0)
185 		lip->slci_unlock = v;
186 	else
187 		ses_panic("Bad property %s", name);
188 
189 	return (0);
190 }
191 
192 static int
193 elem_setprop_alarm(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
194     nvpair_t *nvp)
195 {
196 	ses2_alarm_ctl_impl_t *aip;
197 	const char *name;
198 	boolean_t v;
199 
200 	if ((aip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
201 	    page, 0, np, B_FALSE)) == NULL)
202 		return (-1);
203 
204 	name = nvpair_name(nvp);
205 	(void) nvpair_value_boolean_value(nvp, &v);
206 
207 	if (strcmp(name, SES_PROP_FAIL) == 0)
208 		aip->saci_rqst_fail = v;
209 	else if (strcmp(name, SES_PROP_IDENT) == 0)
210 		aip->saci_rqst_ident = v;
211 	else if (strcmp(name, SES_ALARM_PROP_UNRECOV) == 0)
212 		aip->saci_unrecov = v;
213 	else if (strcmp(name, SES_ALARM_PROP_CRIT) == 0)
214 		aip->saci_crit = v;
215 	else if (strcmp(name, SES_ALARM_PROP_NONCRIT) == 0)
216 		aip->saci_noncrit = v;
217 	else if (strcmp(name, SES_ALARM_PROP_INFO) == 0)
218 		aip->saci_info = v;
219 	else if (strcmp(name, SES_ALARM_PROP_REMIND) == 0)
220 		aip->saci_set_remind = v;
221 	else if (strcmp(name, SES_ALARM_PROP_MUTED) == 0)
222 		aip->saci_set_mute = v;
223 	else
224 		ses_panic("Bad property %s", name);
225 
226 	return (0);
227 }
228 
229 static int
230 elem_setprop_esc(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
231     nvpair_t *nvp)
232 {
233 	ses2_controller_ctl_impl_t *cip;
234 	const char *name;
235 	boolean_t v;
236 
237 	if ((cip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
238 	    page, 0, np, B_FALSE)) == NULL)
239 		return (-1);
240 
241 	name = nvpair_name(nvp);
242 	(void) nvpair_value_boolean_value(nvp, &v);
243 
244 	if (strcmp(name, SES_PROP_FAIL) == 0)
245 		cip->scci_rqst_fail = v;
246 	else if (strcmp(name, SES_PROP_IDENT) == 0)
247 		cip->scci_rqst_ident = v;
248 	else if (strcmp(name, SES_ESC_PROP_SELECT) == 0)
249 		cip->scci_select_element = v;
250 	else
251 		ses_panic("Bad property %s", name);
252 
253 	return (0);
254 }
255 
256 static int
257 elem_setprop_scc(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
258     nvpair_t *nvp)
259 {
260 	ses2_scc_ctl_impl_t *sip;
261 	const char *name;
262 	boolean_t v;
263 
264 	if ((sip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
265 	    page, 0, np, B_FALSE)) == NULL)
266 		return (-1);
267 
268 	name = nvpair_name(nvp);
269 	(void) nvpair_value_boolean_value(nvp, &v);
270 
271 	if (strcmp(name, SES_PROP_FAIL) == 0)
272 		sip->ssci_rqst_fail = v;
273 	else if (strcmp(name, SES_PROP_IDENT) == 0)
274 		sip->ssci_rqst_ident = v;
275 	else
276 		ses_panic("Bad property %s", name);
277 
278 	return (0);
279 }
280 
281 static int
282 elem_setprop_ups(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
283     nvpair_t *nvp)
284 {
285 	ses2_ups_ctl_impl_t *uip;
286 	const char *name;
287 	boolean_t v;
288 
289 	if ((uip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
290 	    page, 0, np, B_FALSE)) == NULL)
291 		return (-1);
292 
293 	name = nvpair_name(nvp);
294 	(void) nvpair_value_boolean_value(nvp, &v);
295 
296 	if (strcmp(name, SES_PROP_FAIL) == 0)
297 		uip->suci_rqst_fail = v;
298 	else if (strcmp(name, SES_PROP_IDENT) == 0)
299 		uip->suci_rqst_ident = v;
300 	else
301 		ses_panic("Bad property %s", name);
302 
303 	return (0);
304 }
305 
306 static int
307 elem_setprop_cache(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
308     nvpair_t *nvp)
309 {
310 	ses2_nvcache_ctl_impl_t *cip;
311 	const char *name;
312 	boolean_t v;
313 
314 	if ((cip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
315 	    page, 0, np, B_FALSE)) == NULL)
316 		return (-1);
317 
318 	name = nvpair_name(nvp);
319 	(void) nvpair_value_boolean_value(nvp, &v);
320 
321 	if (strcmp(name, SES_PROP_FAIL) == 0)
322 		cip->snci_rqst_fail = v;
323 	else if (strcmp(name, SES_PROP_IDENT) == 0)
324 		cip->snci_rqst_ident = v;
325 	else
326 		ses_panic("Bad property %s", name);
327 
328 	return (0);
329 }
330 
331 static int
332 elem_setprop_keypad(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
333     nvpair_t *nvp)
334 {
335 	ses2_keypad_ctl_impl_t *kip;
336 	const char *name;
337 	boolean_t v;
338 
339 	if ((kip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
340 	    page, 0, np, B_FALSE)) == NULL)
341 		return (-1);
342 
343 	name = nvpair_name(nvp);
344 	(void) nvpair_value_boolean_value(nvp, &v);
345 
346 	if (strcmp(name, SES_PROP_FAIL) == 0)
347 		kip->skci_rqst_fail = v;
348 	else if (strcmp(name, SES_PROP_IDENT) == 0)
349 		kip->skci_rqst_ident = v;
350 	else
351 		ses_panic("Bad property %s", name);
352 
353 	return (0);
354 }
355 
356 static int
357 elem_setprop_display(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
358     nvpair_t *nvp)
359 {
360 	ses2_display_ctl_impl_t *dip;
361 	const char *name;
362 	boolean_t v1;
363 	uint16_t v16;
364 	uint64_t v64;
365 
366 	if ((dip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
367 	    page, 0, np, B_FALSE)) == NULL)
368 		return (-1);
369 
370 
371 	name = nvpair_name(nvp);
372 
373 	if (strcmp(name, SES_DPY_PROP_MODE) == 0) {
374 		(void) nvpair_value_uint64(nvp, &v64);
375 		dip->sdci_display_mode = v64;
376 		return (0);
377 	} else if (strcmp(name, SES_DPY_PROP_CHAR) == 0) {
378 		(void) nvpair_value_uint16(nvp, &v16);
379 		SCSI_WRITE16(&dip->sdci_display_character, v16);
380 		return (0);
381 	}
382 
383 	(void) nvpair_value_boolean_value(nvp, &v1);
384 
385 	if (strcmp(name, SES_PROP_FAIL) == 0)
386 		dip->sdci_rqst_fail = v1;
387 	else if (strcmp(name, SES_PROP_IDENT) == 0)
388 		dip->sdci_rqst_ident = v1;
389 	else
390 		ses_panic("Bad property %s", name);
391 	return (0);
392 }
393 
394 static int
395 elem_setprop_px(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
396     nvpair_t *nvp)
397 {
398 	ses2_port_ctl_impl_t *pip;
399 	const char *name;
400 	boolean_t v;
401 
402 	if ((pip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
403 	    page, 0, np, B_FALSE)) == NULL)
404 		return (-1);
405 
406 	name = nvpair_name(nvp);
407 
408 	(void) nvpair_value_boolean_value(nvp, &v);
409 
410 	if (strcmp(name, SES_PROP_FAIL) == 0)
411 		pip->spci_rqst_fail = v;
412 	else if (strcmp(name, SES_PROP_IDENT) == 0)
413 		pip->spci_rqst_ident = v;
414 	else if (strcmp(name, SES_PROP_DISABLED) == 0)
415 		pip->spci_disable = v;
416 	else
417 		ses_panic("Bad property %s", name);
418 
419 	return (0);
420 }
421 
422 static int
423 elem_setprop_lang(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
424     nvpair_t *nvp)
425 {
426 	ses2_lang_ctl_impl_t *lip;
427 	const char *name;
428 	boolean_t v1;
429 	uint64_t v64;
430 
431 	if ((lip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
432 	    page, 0, np, B_FALSE)) == NULL)
433 		return (-1);
434 
435 	name = nvpair_name(nvp);
436 
437 	if (strcmp(name, SES_LANG_PROP_LANGCODE) == 0) {
438 		(void) nvpair_value_uint64(nvp, &v64);
439 		SCSI_WRITE16(&lip->slci_language_code, v64);
440 		return (0);
441 	}
442 
443 	(void) nvpair_value_boolean_value(nvp, &v1);
444 
445 	if (strcmp(name, SES_PROP_IDENT) == 0)
446 		lip->slci_rqst_ident = v1;
447 	else
448 		ses_panic("Bad property %s", name);
449 
450 	return (0);
451 }
452 
453 static int
454 elem_setprop_comm(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
455     nvpair_t *nvp)
456 {
457 	ses2_comm_ctl_impl_t *cip;
458 	const char *name;
459 	boolean_t v;
460 
461 	if ((cip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
462 	    page, 0, np, B_FALSE)) == NULL)
463 		return (-1);
464 
465 	name = nvpair_name(nvp);
466 	(void) nvpair_value_boolean_value(nvp, &v);
467 
468 	if (strcmp(name, SES_PROP_FAIL) == 0)
469 		cip->scci_rqst_fail = v;
470 	else if (strcmp(name, SES_PROP_IDENT) == 0)
471 		cip->scci_rqst_ident = v;
472 	else if (strcmp(name, SES_PROP_DISABLED) == 0)
473 		cip->scci_disable = v;
474 	else
475 		ses_panic("Bad property %s", name);
476 
477 	return (0);
478 }
479 
480 static int
481 elem_setprop_voltage(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
482     nvpair_t *nvp)
483 {
484 	ses2_voltage_ctl_impl_t *vip;
485 	const char *name;
486 	boolean_t v;
487 
488 	if ((vip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
489 	    page, 0, np, B_FALSE)) == NULL)
490 		return (-1);
491 
492 	name = nvpair_name(nvp);
493 	(void) nvpair_value_boolean_value(nvp, &v);
494 
495 	if (strcmp(name, SES_PROP_FAIL) == 0)
496 		vip->svci_rqst_fail = v;
497 	else if (strcmp(name, SES_PROP_IDENT) == 0)
498 		vip->svci_rqst_ident = v;
499 	else
500 		ses_panic("Bad property %s", name);
501 
502 	return (0);
503 }
504 
505 static int
506 elem_setprop_current(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
507     nvpair_t *nvp)
508 {
509 	ses2_current_ctl_impl_t *cip;
510 	const char *name;
511 	boolean_t v;
512 
513 	if ((cip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
514 	    page, 0, np, B_FALSE)) == NULL)
515 		return (-1);
516 
517 	name = nvpair_name(nvp);
518 	(void) nvpair_value_boolean_value(nvp, &v);
519 
520 	if (strcmp(name, SES_PROP_FAIL) == 0)
521 		cip->scci_rqst_fail = v;
522 	else if (strcmp(name, SES_PROP_IDENT) == 0)
523 		cip->scci_rqst_ident = v;
524 	else
525 		ses_panic("Bad property %s", name);
526 
527 	return (0);
528 }
529 
530 static int
531 elem_setprop_itp(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
532     nvpair_t *nvp)
533 {
534 	ses2_itp_ctl_impl_t *iip;
535 	const char *name;
536 	boolean_t v;
537 
538 	if ((iip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
539 	    page, 0, np, B_FALSE)) == NULL)
540 		return (-1);
541 
542 	name = nvpair_name(nvp);
543 	(void) nvpair_value_boolean_value(nvp, &v);
544 
545 	if (strcmp(name, SES_PROP_FAIL) == 0)
546 		iip->sici_rqst_fail = v;
547 	else if (strcmp(name, SES_PROP_IDENT) == 0)
548 		iip->sici_rqst_ident = v;
549 	else if (strcmp(name, SES_ITP_PROP_ENABLED) == 0)
550 		iip->sici_enable = v;
551 	else
552 		ses_panic("Bad property %s", name);
553 
554 	return (0);
555 }
556 
557 static int
558 elem_setprop_sse(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
559     nvpair_t *nvp)
560 {
561 	ses2_ss_ctl_impl_t *sip;
562 	const char *name;
563 	boolean_t v;
564 
565 	if ((sip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
566 	    page, 0, np, B_FALSE)) == NULL)
567 		return (-1);
568 
569 	name = nvpair_name(nvp);
570 	(void) nvpair_value_boolean_value(nvp, &v);
571 
572 	if (strcmp(name, SES_PROP_FAIL) == 0)
573 		sip->ssci_rqst_fail = v;
574 	else if (strcmp(name, SES_PROP_IDENT) == 0)
575 		sip->ssci_rqst_ident = v;
576 	else
577 		ses_panic("Bad property %s", name);
578 
579 	return (0);
580 }
581 
582 static int
583 elem_setprop_arraydev(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
584     nvpair_t *nvp)
585 {
586 	ses2_array_device_ctl_impl_t *aip;
587 	const char *name;
588 	boolean_t v;
589 
590 	if ((aip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
591 	    page, 0, np, B_FALSE)) == NULL)
592 		return (-1);
593 
594 	name = nvpair_name(nvp);
595 	(void) nvpair_value_boolean_value(nvp, &v);
596 
597 	if (strcmp(name, SES_AD_PROP_RR_ABORT) == 0)
598 		aip->sadci_rqst_rr_abort = v;
599 	else if (strcmp(name, SES_AD_PROP_REBUILD) == 0)
600 		aip->sadci_rqst_rebuild = v;
601 	else if (strcmp(name, SES_AD_PROP_IN_FAILED_ARRAY) == 0)
602 		aip->sadci_rqst_in_failed_array = v;
603 	else if (strcmp(name, SES_AD_PROP_IN_CRIT_ARRAY) == 0)
604 		aip->sadci_rqst_in_crit_array = v;
605 	else if (strcmp(name, SES_AD_PROP_CONS_CHK) == 0)
606 		aip->sadci_rqst_cons_check = v;
607 	else if (strcmp(name, SES_AD_PROP_HOT_SPARE) == 0)
608 		aip->sadci_rqst_hot_spare = v;
609 	else if (strcmp(name, SES_AD_PROP_RSVD_DEVICE) == 0)
610 		aip->sadci_rqst_rsvd_device = v;
611 	else if (strcmp(name, SES_PROP_IDENT) == 0)
612 		aip->sadci_rqst_ident = v;
613 	else if (strcmp(name, SES_PROP_RMV) == 0)
614 		aip->sadci_rqst_remove = v;
615 	else if (strcmp(name, SES_DEV_PROP_READY_TO_INSERT) == 0)
616 		aip->sadci_rqst_insert = v;
617 	else if (strcmp(name, SES_DEV_PROP_REQ_MISSING) == 0)
618 		aip->sadci_rqst_missing = v;
619 	else if (strcmp(name, SES_DEV_PROP_DO_NOT_REMOVE) == 0)
620 		aip->sadci_do_not_remove = v;
621 	else if (strcmp(name, SES_DEV_PROP_REQ_ACTIVE) == 0)
622 		aip->sadci_rqst_active = v;
623 	else if (strcmp(name, SES_DEV_PROP_BYP_B) == 0)
624 		aip->sadci_enable_byp_b = v;
625 	else if (strcmp(name, SES_DEV_PROP_BYP_A) == 0)
626 		aip->sadci_enable_byp_a = v;
627 	else if (strcmp(name, SES_PROP_OFF) == 0)
628 		aip->sadci_device_off = v;
629 	else if (strcmp(name, SES_DEV_PROP_FAULT_RQSTD) == 0)
630 		aip->sadci_rqst_fault = v;
631 	else
632 		ses_panic("Bad property %s", name);
633 
634 	return (0);
635 }
636 
637 static int
638 elem_setprop_expander(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
639     nvpair_t *nvp)
640 {
641 	ses2_expander_ctl_impl_t *eip;
642 	const char *name;
643 	boolean_t v;
644 
645 	if ((eip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
646 	    page, 0, np, B_FALSE)) == NULL)
647 		return (-1);
648 
649 	name = nvpair_name(nvp);
650 	(void) nvpair_value_boolean_value(nvp, &v);
651 
652 	if (strcmp(name, SES_PROP_FAIL) == 0)
653 		eip->seci_rqst_fail = v;
654 	else if (strcmp(name, SES_PROP_IDENT) == 0)
655 		eip->seci_rqst_ident = v;
656 	else
657 		ses_panic("Bad property %s", name);
658 
659 	return (0);
660 }
661 
662 static int
663 elem_setprop_sasconn(ses_plugin_t *sp, ses_node_t *np, ses2_diag_page_t page,
664     nvpair_t *nvp)
665 {
666 	ses2_sasconn_ctl_impl_t *sip;
667 	const char *name;
668 	boolean_t v;
669 
670 	if ((sip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
671 	    page, 0, np, B_FALSE)) == NULL)
672 		return (-1);
673 
674 	name = nvpair_name(nvp);
675 	(void) nvpair_value_boolean_value(nvp, &v);
676 
677 	if (strcmp(name, SES_PROP_IDENT) == 0)
678 		sip->ssci_rqst_ident = v;
679 	else if (strcmp(name, SES_PROP_FAIL) == 0)
680 		sip->ssci_rqst_fail = v;
681 	else
682 		ses_panic("Bad property %s", name);
683 
684 	return (0);
685 }
686 
687 static int
688 elem_common_setprop_threshold(ses_plugin_t *sp, ses_node_t *np,
689     ses2_diag_page_t page, nvpair_t *nvp)
690 {
691 	ses2_threshold_impl_t *tip;
692 	const char *name;
693 	uint64_t v;
694 
695 	ASSERT(page == SES2_DIAGPAGE_THRESHOLD_IO);
696 
697 	if ((tip = ses_plugin_ctlpage_lookup(sp, ses_node_snapshot(np),
698 	    page, 0, np, B_FALSE)) == NULL)
699 		return (-1);
700 
701 	name = nvpair_name(nvp);
702 	(void) nvpair_value_uint64(nvp, &v);
703 
704 	if (strcmp(name, SES_PROP_THRESH_CRIT_HI) == 0)
705 		tip->sti_high_crit = v;
706 	else if (strcmp(name, SES_PROP_THRESH_CRIT_LO) == 0)
707 		tip->sti_low_crit = v;
708 	else if (strcmp(name, SES_PROP_THRESH_WARN_HI) == 0)
709 		tip->sti_high_warn = v;
710 	else if (strcmp(name, SES_PROP_THRESH_WARN_LO) == 0)
711 		tip->sti_low_warn = v;
712 	else
713 		ses_panic("Bad property %s", name);
714 
715 	return (0);
716 }
717 
718 #define	SES_THRESHOLD_CTL_PROPS	\
719 {	\
720 	.scp_name = SES_PROP_THRESH_CRIT_HI,	\
721 	.scp_type = DATA_TYPE_UINT64,	\
722 	.scp_num = SES2_DIAGPAGE_THRESHOLD_IO,	\
723 	.scp_setprop = elem_common_setprop_threshold	\
724 },	\
725 {	\
726 	.scp_name = SES_PROP_THRESH_WARN_HI,	\
727 	.scp_type = DATA_TYPE_UINT64,	\
728 	.scp_num = SES2_DIAGPAGE_THRESHOLD_IO,	\
729 	.scp_setprop = elem_common_setprop_threshold	\
730 },	\
731 {	\
732 	.scp_name = SES_PROP_THRESH_CRIT_LO,	\
733 	.scp_type = DATA_TYPE_UINT64,	\
734 	.scp_num = SES2_DIAGPAGE_THRESHOLD_IO,	\
735 	.scp_setprop = elem_common_setprop_threshold	\
736 },	\
737 {	\
738 	.scp_name = SES_PROP_THRESH_WARN_LO,	\
739 	.scp_type = DATA_TYPE_UINT64,	\
740 	.scp_num = SES2_DIAGPAGE_THRESHOLD_IO,	\
741 	.scp_setprop = elem_common_setprop_threshold	\
742 }
743 
744 static const ses2_ctl_prop_t device_props[] = {
745 	SES_COMMON_CTL_PROPS,
746 {
747 	.scp_name = SES_PROP_IDENT,
748 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
749 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
750 	.scp_setprop = elem_setprop_device,
751 },
752 {
753 	.scp_name = SES_PROP_RMV,
754 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
755 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
756 	.scp_setprop = elem_setprop_device,
757 },
758 {
759 	.scp_name = SES_DEV_PROP_READY_TO_INSERT,
760 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
761 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
762 	.scp_setprop = elem_setprop_device,
763 },
764 {
765 	.scp_name = SES_DEV_PROP_REQ_MISSING,
766 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
767 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
768 	.scp_setprop = elem_setprop_device,
769 },
770 {
771 	.scp_name = SES_DEV_PROP_DO_NOT_REMOVE,
772 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
773 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
774 	.scp_setprop = elem_setprop_device,
775 },
776 {
777 	.scp_name = SES_DEV_PROP_REQ_ACTIVE,
778 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
779 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
780 	.scp_setprop = elem_setprop_device,
781 },
782 {
783 	.scp_name = SES_DEV_PROP_BYP_B,
784 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
785 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
786 	.scp_setprop = elem_setprop_device,
787 },
788 {
789 	.scp_name = SES_DEV_PROP_BYP_A,
790 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
791 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
792 	.scp_setprop = elem_setprop_device,
793 },
794 {
795 	.scp_name = SES_PROP_OFF,
796 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
797 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
798 	.scp_setprop = elem_setprop_device,
799 },
800 {
801 	.scp_name = SES_DEV_PROP_FAULT_RQSTD,
802 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
803 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
804 	.scp_setprop = elem_setprop_device,
805 },
806 {
807 	NULL
808 }
809 };
810 
811 static const ses2_ctl_prop_t psu_props[] = {
812 	SES_COMMON_CTL_PROPS,
813 {
814 	.scp_name = SES_PROP_IDENT,
815 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
816 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
817 	.scp_setprop = elem_setprop_psu
818 },
819 {
820 	.scp_name = SES_PROP_REQUESTED_ON,
821 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
822 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
823 	.scp_setprop = elem_setprop_psu
824 },
825 {
826 	.scp_name = SES_PROP_FAIL,
827 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
828 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
829 	.scp_setprop = elem_setprop_psu
830 },
831 {
832 	NULL
833 }
834 };
835 
836 static const ses2_ctl_prop_t cooling_props[] = {
837 	SES_COMMON_CTL_PROPS,
838 {
839 	.scp_name = SES_PROP_IDENT,
840 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
841 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
842 	.scp_setprop = elem_setprop_cooling
843 },
844 {
845 	.scp_name = SES_COOLING_PROP_SPEED_CODE,
846 	.scp_type = DATA_TYPE_UINT64,
847 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
848 	.scp_setprop = elem_setprop_cooling
849 },
850 {
851 	.scp_name = SES_PROP_REQUESTED_ON,
852 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
853 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
854 	.scp_setprop = elem_setprop_cooling
855 },
856 {
857 	.scp_name = SES_PROP_FAIL,
858 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
859 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
860 	.scp_setprop = elem_setprop_cooling
861 },
862 {
863 	NULL
864 }
865 };
866 
867 static const ses2_ctl_prop_t temp_props[] = {
868 	SES_COMMON_CTL_PROPS,
869 	SES_THRESHOLD_CTL_PROPS,
870 {
871 	.scp_name = SES_PROP_FAIL,
872 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
873 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
874 	.scp_setprop = elem_setprop_temp
875 },
876 {
877 	.scp_name = SES_PROP_IDENT,
878 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
879 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
880 	.scp_setprop = elem_setprop_temp
881 },
882 {
883 	NULL
884 }
885 };
886 
887 static const ses2_ctl_prop_t lock_props[] = {
888 	SES_COMMON_CTL_PROPS,
889 {
890 	.scp_name = SES_PROP_FAIL,
891 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
892 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
893 	.scp_setprop = elem_setprop_lock
894 },
895 {
896 	.scp_name = SES_PROP_IDENT,
897 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
898 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
899 	.scp_setprop = elem_setprop_lock
900 },
901 {
902 	.scp_name = SES_LOCK_PROP_UNLOCKED,
903 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
904 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
905 	.scp_setprop = elem_setprop_lock
906 },
907 {
908 	NULL
909 }
910 };
911 
912 static const ses2_ctl_prop_t alarm_props[] = {
913 	SES_COMMON_CTL_PROPS,
914 {
915 	.scp_name = SES_PROP_FAIL,
916 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
917 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
918 	.scp_setprop = elem_setprop_alarm
919 },
920 {
921 	.scp_name = SES_PROP_IDENT,
922 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
923 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
924 	.scp_setprop = elem_setprop_alarm
925 },
926 {
927 	.scp_name = SES_ALARM_PROP_UNRECOV,
928 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
929 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
930 	.scp_setprop = elem_setprop_alarm
931 },
932 {
933 	.scp_name = SES_ALARM_PROP_CRIT,
934 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
935 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
936 	.scp_setprop = elem_setprop_alarm
937 },
938 {
939 	.scp_name = SES_ALARM_PROP_NONCRIT,
940 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
941 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
942 	.scp_setprop = elem_setprop_alarm
943 },
944 {
945 	.scp_name = SES_ALARM_PROP_INFO,
946 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
947 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
948 	.scp_setprop = elem_setprop_alarm
949 },
950 {
951 	.scp_name = SES_ALARM_PROP_REMIND,
952 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
953 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
954 	.scp_setprop = elem_setprop_alarm
955 },
956 {
957 	.scp_name = SES_ALARM_PROP_MUTED,
958 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
959 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
960 	.scp_setprop = elem_setprop_alarm
961 },
962 {
963 	NULL
964 }
965 };
966 
967 static const ses2_ctl_prop_t esc_props[] = {
968 	SES_COMMON_CTL_PROPS,
969 {
970 	.scp_name = SES_PROP_FAIL,
971 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
972 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
973 	.scp_setprop = elem_setprop_esc
974 },
975 {
976 	.scp_name = SES_PROP_IDENT,
977 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
978 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
979 	.scp_setprop = elem_setprop_esc
980 },
981 {
982 	.scp_name = SES_ESC_PROP_SELECT,
983 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
984 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
985 	.scp_setprop = elem_setprop_esc
986 },
987 {
988 	NULL
989 }
990 };
991 
992 static const ses2_ctl_prop_t scc_props[] = {
993 	SES_COMMON_CTL_PROPS,
994 {
995 	.scp_name = SES_PROP_FAIL,
996 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
997 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
998 	.scp_setprop = elem_setprop_scc
999 },
1000 {
1001 	.scp_name = SES_PROP_IDENT,
1002 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1003 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1004 	.scp_setprop = elem_setprop_scc
1005 },
1006 {
1007 	NULL
1008 }
1009 };
1010 
1011 static const ses2_ctl_prop_t cache_props[] = {
1012 	SES_COMMON_CTL_PROPS,
1013 {
1014 	.scp_name = SES_PROP_FAIL,
1015 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1016 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1017 	.scp_setprop = elem_setprop_cache
1018 },
1019 {
1020 	.scp_name = SES_PROP_IDENT,
1021 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1022 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1023 	.scp_setprop = elem_setprop_cache
1024 },
1025 {
1026 	NULL
1027 }
1028 };
1029 
1030 static const ses2_ctl_prop_t ups_props[] = {
1031 	SES_COMMON_CTL_PROPS,
1032 	SES_THRESHOLD_CTL_PROPS,
1033 {
1034 	.scp_name = SES_PROP_FAIL,
1035 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1036 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1037 	.scp_setprop = elem_setprop_ups
1038 },
1039 {
1040 	.scp_name = SES_PROP_IDENT,
1041 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1042 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1043 	.scp_setprop = elem_setprop_ups
1044 },
1045 {
1046 	NULL
1047 }
1048 };
1049 
1050 static const ses2_ctl_prop_t display_props[] = {
1051 	SES_COMMON_CTL_PROPS,
1052 {
1053 	.scp_name = SES_DPY_PROP_MODE,
1054 	.scp_type = DATA_TYPE_UINT64,
1055 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1056 	.scp_setprop = elem_setprop_display
1057 },
1058 {
1059 	.scp_name = SES_PROP_FAIL,
1060 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1061 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1062 	.scp_setprop = elem_setprop_display
1063 },
1064 {
1065 	.scp_name = SES_PROP_IDENT,
1066 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1067 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1068 	.scp_setprop = elem_setprop_display
1069 },
1070 {
1071 	.scp_name = SES_DPY_PROP_CHAR,
1072 	.scp_type = DATA_TYPE_UINT16,
1073 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1074 	.scp_setprop = elem_setprop_display
1075 },
1076 {
1077 	NULL
1078 }
1079 };
1080 
1081 static const ses2_ctl_prop_t keypad_props[] = {
1082 	SES_COMMON_CTL_PROPS,
1083 {
1084 	.scp_name = SES_PROP_FAIL,
1085 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1086 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1087 	.scp_setprop = elem_setprop_keypad
1088 },
1089 {
1090 	.scp_name = SES_PROP_IDENT,
1091 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1092 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1093 	.scp_setprop = elem_setprop_keypad
1094 },
1095 {
1096 	NULL
1097 }
1098 };
1099 
1100 static const ses2_ctl_prop_t px_props[] = {
1101 	SES_COMMON_CTL_PROPS,
1102 {
1103 	.scp_name = SES_PROP_FAIL,
1104 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1105 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1106 	.scp_setprop = elem_setprop_px
1107 },
1108 {
1109 	.scp_name = SES_PROP_IDENT,
1110 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1111 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1112 	.scp_setprop = elem_setprop_px
1113 },
1114 {
1115 	.scp_name = SES_PROP_DISABLED,
1116 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1117 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1118 	.scp_setprop = elem_setprop_px
1119 },
1120 {
1121 	NULL
1122 }
1123 };
1124 
1125 static const ses2_ctl_prop_t lang_props[] = {
1126 	SES_COMMON_CTL_PROPS,
1127 {
1128 	.scp_name = SES_PROP_IDENT,
1129 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1130 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1131 	.scp_setprop = elem_setprop_lang
1132 },
1133 {
1134 	.scp_name = SES_LANG_PROP_LANGCODE,
1135 	.scp_type = DATA_TYPE_UINT64,
1136 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1137 	.scp_setprop = elem_setprop_lang
1138 },
1139 {
1140 	NULL
1141 }
1142 };
1143 
1144 static const ses2_ctl_prop_t comm_props[] = {
1145 	SES_COMMON_CTL_PROPS,
1146 {
1147 	.scp_name = SES_PROP_FAIL,
1148 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1149 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1150 	.scp_setprop = elem_setprop_comm
1151 },
1152 {
1153 	.scp_name = SES_PROP_IDENT,
1154 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1155 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1156 	.scp_setprop = elem_setprop_comm
1157 },
1158 {
1159 	.scp_name = SES_PROP_DISABLED,
1160 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1161 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1162 	.scp_setprop = elem_setprop_comm
1163 },
1164 {
1165 	NULL
1166 }
1167 };
1168 
1169 static const ses2_ctl_prop_t voltage_props[] = {
1170 	SES_COMMON_CTL_PROPS,
1171 	SES_THRESHOLD_CTL_PROPS,
1172 {
1173 	.scp_name = SES_PROP_FAIL,
1174 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1175 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1176 	.scp_setprop = elem_setprop_voltage
1177 },
1178 {
1179 	.scp_name = SES_PROP_IDENT,
1180 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1181 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1182 	.scp_setprop = elem_setprop_voltage
1183 },
1184 {
1185 	NULL
1186 }
1187 };
1188 
1189 static const ses2_ctl_prop_t current_props[] = {
1190 	SES_COMMON_CTL_PROPS,
1191 	SES_THRESHOLD_CTL_PROPS,
1192 {
1193 	.scp_name = SES_PROP_FAIL,
1194 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1195 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1196 	.scp_setprop = elem_setprop_current
1197 },
1198 {
1199 	.scp_name = SES_PROP_IDENT,
1200 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1201 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1202 	.scp_setprop = elem_setprop_current
1203 },
1204 {
1205 	NULL
1206 }
1207 };
1208 
1209 static const ses2_ctl_prop_t itp_props[] = {
1210 	SES_COMMON_CTL_PROPS,
1211 {
1212 	.scp_name = SES_PROP_FAIL,
1213 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1214 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1215 	.scp_setprop = elem_setprop_itp
1216 },
1217 {
1218 	.scp_name = SES_PROP_IDENT,
1219 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1220 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1221 	.scp_setprop = elem_setprop_itp
1222 },
1223 {
1224 	.scp_name = SES_ITP_PROP_ENABLED,
1225 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1226 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1227 	.scp_setprop = elem_setprop_itp
1228 },
1229 {
1230 	NULL
1231 }
1232 };
1233 
1234 static const ses2_ctl_prop_t sse_props[] = {
1235 	SES_COMMON_CTL_PROPS,
1236 {
1237 	.scp_name = SES_PROP_FAIL,
1238 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1239 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1240 	.scp_setprop = elem_setprop_sse
1241 },
1242 {
1243 	.scp_name = SES_PROP_IDENT,
1244 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1245 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1246 	.scp_setprop = elem_setprop_sse
1247 },
1248 {
1249 	NULL
1250 }
1251 };
1252 
1253 static const ses2_ctl_prop_t arraydev_props[] = {
1254 	SES_COMMON_CTL_PROPS,
1255 {
1256 	.scp_name = SES_AD_PROP_RR_ABORT,
1257 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1258 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1259 	.scp_setprop = elem_setprop_arraydev
1260 },
1261 {
1262 	.scp_name = SES_AD_PROP_REBUILD,
1263 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1264 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1265 	.scp_setprop = elem_setprop_arraydev
1266 },
1267 {
1268 	.scp_name = SES_AD_PROP_IN_FAILED_ARRAY,
1269 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1270 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1271 	.scp_setprop = elem_setprop_arraydev
1272 },
1273 {
1274 	.scp_name = SES_AD_PROP_IN_CRIT_ARRAY,
1275 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1276 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1277 	.scp_setprop = elem_setprop_arraydev
1278 },
1279 {
1280 	.scp_name = SES_AD_PROP_CONS_CHK,
1281 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1282 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1283 	.scp_setprop = elem_setprop_arraydev
1284 },
1285 {
1286 	.scp_name = SES_AD_PROP_HOT_SPARE,
1287 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1288 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1289 	.scp_setprop = elem_setprop_arraydev
1290 },
1291 {
1292 	.scp_name = SES_AD_PROP_RSVD_DEVICE,
1293 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1294 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1295 	.scp_setprop = elem_setprop_arraydev
1296 },
1297 {
1298 	.scp_name = SES_AD_PROP_OK,
1299 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1300 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1301 	.scp_setprop = elem_setprop_arraydev
1302 },
1303 {
1304 	.scp_name = SES_PROP_IDENT,
1305 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1306 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1307 	.scp_setprop = elem_setprop_arraydev
1308 },
1309 {
1310 	.scp_name = SES_PROP_RMV,
1311 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1312 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1313 	.scp_setprop = elem_setprop_arraydev
1314 },
1315 {
1316 	.scp_name = SES_DEV_PROP_READY_TO_INSERT,
1317 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1318 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1319 	.scp_setprop = elem_setprop_arraydev
1320 },
1321 {
1322 	.scp_name = SES_DEV_PROP_REQ_MISSING,
1323 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1324 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1325 	.scp_setprop = elem_setprop_arraydev
1326 },
1327 {
1328 	.scp_name = SES_DEV_PROP_DO_NOT_REMOVE,
1329 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1330 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1331 	.scp_setprop = elem_setprop_arraydev
1332 },
1333 {
1334 	.scp_name = SES_DEV_PROP_REQ_ACTIVE,
1335 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1336 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1337 	.scp_setprop = elem_setprop_arraydev
1338 },
1339 {
1340 	.scp_name = SES_DEV_PROP_BYP_B,
1341 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1342 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1343 	.scp_setprop = elem_setprop_arraydev
1344 },
1345 {
1346 	.scp_name = SES_DEV_PROP_BYP_A,
1347 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1348 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1349 	.scp_setprop = elem_setprop_arraydev
1350 },
1351 {
1352 	.scp_name = SES_PROP_OFF,
1353 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1354 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1355 	.scp_setprop = elem_setprop_arraydev
1356 },
1357 {
1358 	.scp_name = SES_DEV_PROP_FAULT_RQSTD,
1359 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1360 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1361 	.scp_setprop = elem_setprop_arraydev
1362 },
1363 {
1364 	NULL
1365 }
1366 };
1367 
1368 static const ses2_ctl_prop_t expander_props[] = {
1369 	SES_COMMON_CTL_PROPS,
1370 {
1371 	.scp_name = SES_PROP_FAIL,
1372 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1373 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1374 	.scp_setprop = elem_setprop_expander
1375 },
1376 {
1377 	.scp_name = SES_PROP_IDENT,
1378 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1379 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1380 	.scp_setprop = elem_setprop_expander
1381 },
1382 {
1383 	NULL
1384 }
1385 };
1386 
1387 static const ses2_ctl_prop_t sasconn_props[] = {
1388 	SES_COMMON_CTL_PROPS,
1389 {
1390 	.scp_name = SES_PROP_IDENT,
1391 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1392 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1393 	.scp_setprop = elem_setprop_sasconn
1394 },
1395 {
1396 	.scp_name = SES_PROP_FAIL,
1397 	.scp_type = DATA_TYPE_BOOLEAN_VALUE,
1398 	.scp_num = SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS,
1399 	.scp_setprop = elem_setprop_sasconn
1400 },
1401 {
1402 	NULL
1403 }
1404 };
1405 
1406 /*ARGSUSED*/
1407 static int
1408 elem_setdef_threshold(ses_node_t *np, ses2_diag_page_t page, void *data)
1409 {
1410 	ses2_threshold_impl_t *tip = data;
1411 	nvlist_t *props = ses_node_props(np);
1412 
1413 	SES_NV_CTL64(props, SES_PROP_THRESH_CRIT_HI, tip->sti_high_crit);
1414 	SES_NV_CTL64(props, SES_PROP_THRESH_CRIT_LO, tip->sti_low_crit);
1415 	SES_NV_CTL64(props, SES_PROP_THRESH_WARN_HI, tip->sti_high_warn);
1416 	SES_NV_CTL64(props, SES_PROP_THRESH_WARN_LO, tip->sti_low_warn);
1417 
1418 	return (0);
1419 }
1420 
1421 /*ARGSUSED*/
1422 static int
1423 elem_setdef_device(ses_node_t *np, ses2_diag_page_t page, void *data)
1424 {
1425 	ses2_device_ctl_impl_t *dip = data;
1426 	nvlist_t *props = ses_node_props(np);
1427 
1428 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, dip->sdci_rqst_ident);
1429 	SES_NV_CTLBOOL(props, SES_PROP_RMV, dip->sdci_rqst_remove);
1430 	SES_NV_CTLBOOL(props, SES_DEV_PROP_READY_TO_INSERT,
1431 	    dip->sdci_rqst_insert);
1432 	SES_NV_CTLBOOL(props, SES_DEV_PROP_REQ_MISSING,
1433 	    dip->sdci_rqst_missing);
1434 	SES_NV_CTLBOOL(props, SES_DEV_PROP_DO_NOT_REMOVE,
1435 	    dip->sdci_do_not_remove);
1436 	SES_NV_CTLBOOL(props, SES_DEV_PROP_REQ_ACTIVE,
1437 	    dip->sdci_rqst_active);
1438 	SES_NV_CTLBOOL(props, SES_DEV_PROP_BYP_B, dip->sdci_enable_byp_b);
1439 	SES_NV_CTLBOOL(props, SES_DEV_PROP_BYP_A, dip->sdci_enable_byp_a);
1440 	SES_NV_CTLBOOL(props, SES_PROP_OFF, dip->sdci_device_off);
1441 	SES_NV_CTLBOOL(props, SES_DEV_PROP_FAULT_RQSTD,
1442 	    dip->sdci_rqst_fault);
1443 
1444 	return (0);
1445 }
1446 
1447 /*ARGSUSED*/
1448 static int
1449 elem_setdef_psu(ses_node_t *np, ses2_diag_page_t page, void *data)
1450 {
1451 	ses2_psu_ctl_impl_t *pip = data;
1452 	nvlist_t *props = ses_node_props(np);
1453 
1454 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, pip->spci_rqst_ident);
1455 	SES_NV_CTLBOOL(props, SES_PROP_REQUESTED_ON, pip->spci_rqst_on);
1456 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, pip->spci_rqst_fail);
1457 
1458 	return (0);
1459 }
1460 
1461 /*ARGSUSED*/
1462 static int
1463 elem_setdef_cooling(ses_node_t *np, ses2_diag_page_t page, void *data)
1464 {
1465 	ses2_cooling_ctl_impl_t *cip = data;
1466 	nvlist_t *props = ses_node_props(np);
1467 
1468 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, cip->scci_rqst_ident);
1469 	SES_NV_CTL64(props, SES_COOLING_PROP_SPEED_CODE,
1470 	    cip->scci_requested_speed_code);
1471 	SES_NV_CTLBOOL(props, SES_PROP_REQUESTED_ON, cip->scci_rqst_on);
1472 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, cip->scci_rqst_fail);
1473 
1474 	return (0);
1475 }
1476 
1477 /*ARGSUSED*/
1478 static int
1479 elem_setdef_temp(ses_node_t *np, ses2_diag_page_t page, void *data)
1480 {
1481 	ses2_temp_ctl_impl_t *tip = data;
1482 	nvlist_t *props = ses_node_props(np);
1483 
1484 	if (page == SES2_DIAGPAGE_THRESHOLD_IO)
1485 		return (elem_setdef_threshold(np, page, data));
1486 
1487 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, tip->stci_rqst_fail);
1488 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, tip->stci_rqst_ident);
1489 
1490 	return (0);
1491 }
1492 
1493 /*ARGSUSED*/
1494 static int
1495 elem_setdef_lock(ses_node_t *np, ses2_diag_page_t page, void *data)
1496 {
1497 	ses2_lock_ctl_impl_t *lip = data;
1498 	nvlist_t *props = ses_node_props(np);
1499 
1500 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, lip->slci_rqst_fail);
1501 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, lip->slci_rqst_ident);
1502 	SES_NV_CTLBOOL(props, SES_LOCK_PROP_UNLOCKED, lip->slci_unlock);
1503 
1504 	return (0);
1505 }
1506 
1507 /*ARGSUSED*/
1508 static int
1509 elem_setdef_alarm(ses_node_t *np, ses2_diag_page_t page, void *data)
1510 {
1511 	ses2_alarm_ctl_impl_t *aip = data;
1512 	nvlist_t *props = ses_node_props(np);
1513 
1514 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, aip->saci_rqst_fail);
1515 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, aip->saci_rqst_ident);
1516 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_UNRECOV, aip->saci_unrecov);
1517 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_CRIT, aip->saci_crit);
1518 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_NONCRIT, aip->saci_noncrit);
1519 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_INFO, aip->saci_info);
1520 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_REMIND, aip->saci_set_remind);
1521 	SES_NV_CTLBOOL(props, SES_ALARM_PROP_MUTED, aip->saci_set_mute);
1522 
1523 	return (0);
1524 }
1525 
1526 /*ARGSUSED*/
1527 static int
1528 elem_setdef_esc(ses_node_t *np, ses2_diag_page_t page, void *data)
1529 {
1530 	ses2_controller_ctl_impl_t *cip = data;
1531 	nvlist_t *props = ses_node_props(np);
1532 
1533 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, cip->scci_rqst_fail);
1534 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, cip->scci_rqst_ident);
1535 	SES_NV_CTLBOOL(props, SES_ESC_PROP_SELECT,
1536 	    cip->scci_select_element);
1537 
1538 	return (0);
1539 }
1540 
1541 /*ARGSUSED*/
1542 static int
1543 elem_setdef_scc(ses_node_t *np, ses2_diag_page_t page, void *data)
1544 {
1545 	ses2_scc_ctl_impl_t *sip = data;
1546 	nvlist_t *props = ses_node_props(np);
1547 
1548 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, sip->ssci_rqst_fail);
1549 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, sip->ssci_rqst_ident);
1550 
1551 	return (0);
1552 }
1553 
1554 /*ARGSUSED*/
1555 static int
1556 elem_setdef_cache(ses_node_t *np, ses2_diag_page_t page, void *data)
1557 {
1558 	ses2_nvcache_ctl_impl_t *cip = data;
1559 	nvlist_t *props = ses_node_props(np);
1560 
1561 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, cip->snci_rqst_fail);
1562 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, cip->snci_rqst_ident);
1563 
1564 	return (0);
1565 }
1566 
1567 static int
1568 elem_setdef_ups(ses_node_t *np, ses2_diag_page_t page, void *data)
1569 {
1570 	ses2_ups_ctl_impl_t *uip = data;
1571 	nvlist_t *props = ses_node_props(np);
1572 
1573 	if (page == SES2_DIAGPAGE_THRESHOLD_IO)
1574 		return (elem_setdef_threshold(np, page, data));
1575 
1576 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, uip->suci_rqst_fail);
1577 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, uip->suci_rqst_ident);
1578 
1579 	return (0);
1580 }
1581 
1582 /*ARGSUSED*/
1583 static int
1584 elem_setdef_display(ses_node_t *np, ses2_diag_page_t page, void *data)
1585 {
1586 	ses2_display_ctl_impl_t *dip = data;
1587 	nvlist_t *props = ses_node_props(np);
1588 
1589 	SES_NV_CTL64(props, SES_DPY_PROP_MODE, dip->sdci_display_mode);
1590 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, dip->sdci_rqst_fail);
1591 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, dip->sdci_rqst_ident);
1592 	SES_NV_CTL16(props, SES_DPY_PROP_CHAR,
1593 	    dip->sdci_display_character);
1594 
1595 	return (0);
1596 }
1597 
1598 /*ARGSUSED*/
1599 static int
1600 elem_setdef_keypad(ses_node_t *np, ses2_diag_page_t page, void *data)
1601 {
1602 	ses2_keypad_ctl_impl_t *kip = data;
1603 	nvlist_t *props = ses_node_props(np);
1604 
1605 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, kip->skci_rqst_fail);
1606 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, kip->skci_rqst_ident);
1607 
1608 	return (0);
1609 }
1610 
1611 /*ARGSUSED*/
1612 static int
1613 elem_setdef_px(ses_node_t *np, ses2_diag_page_t page, void *data)
1614 {
1615 	ses2_port_ctl_impl_t *pip = data;
1616 	nvlist_t *props = ses_node_props(np);
1617 
1618 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, pip->spci_rqst_fail);
1619 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, pip->spci_rqst_ident);
1620 	SES_NV_CTLBOOL(props, SES_PROP_DISABLED, pip->spci_disable);
1621 
1622 	return (0);
1623 }
1624 
1625 /*ARGSUSED*/
1626 static int
1627 elem_setdef_lang(ses_node_t *np, ses2_diag_page_t page, void *data)
1628 {
1629 	ses2_lang_ctl_impl_t *lip = data;
1630 	nvlist_t *props = ses_node_props(np);
1631 
1632 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, lip->slci_rqst_ident);
1633 	SES_NV_CTL16(props, SES_LANG_PROP_LANGCODE,
1634 	    lip->slci_language_code);
1635 
1636 	return (0);
1637 }
1638 
1639 /*ARGSUSED*/
1640 static int
1641 elem_setdef_comm(ses_node_t *np, ses2_diag_page_t page, void *data)
1642 {
1643 	ses2_comm_ctl_impl_t *cip = data;
1644 	nvlist_t *props = ses_node_props(np);
1645 
1646 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, cip->scci_rqst_fail);
1647 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, cip->scci_rqst_ident);
1648 	SES_NV_CTLBOOL(props, SES_PROP_DISABLED, cip->scci_disable);
1649 
1650 	return (0);
1651 }
1652 
1653 static int
1654 elem_setdef_voltage(ses_node_t *np, ses2_diag_page_t page, void *data)
1655 {
1656 	ses2_voltage_ctl_impl_t *vip = data;
1657 	nvlist_t *props = ses_node_props(np);
1658 
1659 	if (page == SES2_DIAGPAGE_THRESHOLD_IO)
1660 		return (elem_setdef_threshold(np, page, data));
1661 
1662 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, vip->svci_rqst_fail);
1663 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, vip->svci_rqst_ident);
1664 
1665 	return (0);
1666 }
1667 
1668 static int
1669 elem_setdef_current(ses_node_t *np, ses2_diag_page_t page, void *data)
1670 {
1671 	ses2_current_ctl_impl_t *cip = data;
1672 	nvlist_t *props = ses_node_props(np);
1673 
1674 	if (page == SES2_DIAGPAGE_THRESHOLD_IO)
1675 		return (elem_setdef_threshold(np, page, data));
1676 
1677 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, cip->scci_rqst_fail);
1678 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, cip->scci_rqst_ident);
1679 
1680 	return (0);
1681 }
1682 
1683 /*ARGSUSED*/
1684 static int
1685 elem_setdef_itp(ses_node_t *np, ses2_diag_page_t page, void *data)
1686 {
1687 	ses2_itp_ctl_impl_t *iip = data;
1688 	nvlist_t *props = ses_node_props(np);
1689 
1690 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, iip->sici_rqst_fail);
1691 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, iip->sici_rqst_ident);
1692 	SES_NV_CTLBOOL(props, SES_ITP_PROP_ENABLED, iip->sici_enable);
1693 
1694 	return (0);
1695 }
1696 
1697 /*ARGSUSED*/
1698 static int
1699 elem_setdef_sse(ses_node_t *np, ses2_diag_page_t page, void *data)
1700 {
1701 	ses2_ss_ctl_impl_t *sip = data;
1702 	nvlist_t *props = ses_node_props(np);
1703 
1704 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, sip->ssci_rqst_fail);
1705 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, sip->ssci_rqst_ident);
1706 
1707 	return (0);
1708 }
1709 
1710 /*ARGSUSED*/
1711 static int
1712 elem_setdef_arraydev(ses_node_t *np, ses2_diag_page_t page, void *data)
1713 {
1714 	ses2_array_device_ctl_impl_t *aip = data;
1715 	nvlist_t *props = ses_node_props(np);
1716 
1717 	SES_NV_CTLBOOL(props, SES_AD_PROP_RR_ABORT,
1718 	    aip->sadci_rqst_rr_abort);
1719 	SES_NV_CTLBOOL(props, SES_AD_PROP_REBUILD,
1720 	    aip->sadci_rqst_rebuild);
1721 	SES_NV_CTLBOOL(props, SES_AD_PROP_IN_FAILED_ARRAY,
1722 	    aip->sadci_rqst_in_failed_array);
1723 	SES_NV_CTLBOOL(props, SES_AD_PROP_IN_CRIT_ARRAY,
1724 	    aip->sadci_rqst_in_crit_array);
1725 	SES_NV_CTLBOOL(props, SES_AD_PROP_CONS_CHK,
1726 	    aip->sadci_rqst_cons_check);
1727 	SES_NV_CTLBOOL(props, SES_AD_PROP_HOT_SPARE,
1728 	    aip->sadci_rqst_hot_spare);
1729 	SES_NV_CTLBOOL(props, SES_AD_PROP_RSVD_DEVICE,
1730 	    aip->sadci_rqst_rsvd_device);
1731 
1732 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, aip->sadci_rqst_ident);
1733 	SES_NV_CTLBOOL(props, SES_PROP_RMV, aip->sadci_rqst_remove);
1734 	SES_NV_CTLBOOL(props, SES_DEV_PROP_READY_TO_INSERT,
1735 	    aip->sadci_rqst_insert);
1736 	SES_NV_CTLBOOL(props, SES_DEV_PROP_REQ_MISSING,
1737 	    aip->sadci_rqst_missing);
1738 	SES_NV_CTLBOOL(props, SES_DEV_PROP_DO_NOT_REMOVE,
1739 	    aip->sadci_do_not_remove);
1740 	SES_NV_CTLBOOL(props, SES_DEV_PROP_REQ_ACTIVE,
1741 	    aip->sadci_rqst_active);
1742 
1743 	SES_NV_CTLBOOL(props, SES_DEV_PROP_BYP_B, aip->sadci_enable_byp_b);
1744 	SES_NV_CTLBOOL(props, SES_DEV_PROP_BYP_A, aip->sadci_enable_byp_a);
1745 	SES_NV_CTLBOOL(props, SES_PROP_OFF, aip->sadci_device_off);
1746 	SES_NV_CTLBOOL(props, SES_DEV_PROP_FAULT_RQSTD,
1747 	    aip->sadci_rqst_fault);
1748 
1749 	return (0);
1750 }
1751 
1752 /*ARGSUSED*/
1753 static int
1754 elem_setdef_expander(ses_node_t *np, ses2_diag_page_t page, void *data)
1755 {
1756 	ses2_expander_ctl_impl_t *eip = data;
1757 	nvlist_t *props = ses_node_props(np);
1758 
1759 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, eip->seci_rqst_fail);
1760 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, eip->seci_rqst_ident);
1761 
1762 	return (0);
1763 }
1764 
1765 /*ARGSUSED*/
1766 static int
1767 elem_setdef_sasconn(ses_node_t *np, ses2_diag_page_t page, void *data)
1768 {
1769 	ses2_sasconn_ctl_impl_t *sip = data;
1770 	nvlist_t *props = ses_node_props(np);
1771 
1772 	SES_NV_CTLBOOL(props, SES_PROP_IDENT, sip->ssci_rqst_ident);
1773 	SES_NV_CTLBOOL(props, SES_PROP_FAIL, sip->ssci_rqst_fail);
1774 
1775 	return (0);
1776 }
1777 
1778 #define	CTL_DESC(_e, _n)	\
1779 	{	\
1780 		.scd_et = _e,	\
1781 		.scd_props = _n##_props,	\
1782 		.scd_setdef = elem_setdef_##_n	\
1783 	}
1784 
1785 static const ses2_ctl_desc_t ctl_descs[] = {
1786 	CTL_DESC(SES_ET_DEVICE, device),
1787 	CTL_DESC(SES_ET_POWER_SUPPLY, psu),
1788 	CTL_DESC(SES_ET_COOLING, cooling),
1789 	CTL_DESC(SES_ET_TEMPERATURE_SENSOR, temp),
1790 	CTL_DESC(SES_ET_DOOR_LOCK, lock),
1791 	CTL_DESC(SES_ET_AUDIBLE_ALARM, alarm),
1792 	CTL_DESC(SES_ET_ESC_ELECTRONICS, esc),
1793 	CTL_DESC(SES_ET_SCC_ELECTRONICS, scc),
1794 	CTL_DESC(SES_ET_NONVOLATILE_CACHE, cache),
1795 	CTL_DESC(SES_ET_UPS, ups),
1796 	CTL_DESC(SES_ET_DISPLAY, display),
1797 	CTL_DESC(SES_ET_KEY_PAD_ENTRY, keypad),
1798 	CTL_DESC(SES_ET_SCSI_PORT_XCVR, px),
1799 	CTL_DESC(SES_ET_LANGUAGE, lang),
1800 	CTL_DESC(SES_ET_COMMUNICATION_PORT, comm),
1801 	CTL_DESC(SES_ET_VOLTAGE_SENSOR, voltage),
1802 	CTL_DESC(SES_ET_CURRENT_SENSOR, current),
1803 	CTL_DESC(SES_ET_SCSI_TARGET_PORT, itp),
1804 	CTL_DESC(SES_ET_SCSI_INITIATOR_PORT, itp),
1805 	CTL_DESC(SES_ET_SIMPLE_SUBENCLOSURE, sse),
1806 	CTL_DESC(SES_ET_ARRAY_DEVICE, arraydev),
1807 	CTL_DESC(SES_ET_SAS_EXPANDER, expander),
1808 	CTL_DESC(SES_ET_SAS_CONNECTOR, sasconn),
1809 	{ .scd_et = -1 }
1810 };
1811 
1812 int
1813 ses2_element_ctl(ses_plugin_t *sp, ses_node_t *np, const char *op,
1814     nvlist_t *nvl)
1815 {
1816 	const ses2_ctl_desc_t *dp;
1817 	nvlist_t *props = ses_node_props(np);
1818 	uint64_t type;
1819 
1820 	if (strcmp(op, SES_CTL_OP_SETPROP) != 0)
1821 		return (0);
1822 
1823 	VERIFY(nvlist_lookup_uint64(props, SES_PROP_ELEMENT_TYPE,
1824 	    &type) == 0);
1825 
1826 	for (dp = &ctl_descs[0]; dp->scd_et != -1; dp++)
1827 		if (dp->scd_et == type)
1828 			break;
1829 
1830 	if (dp->scd_et == -1)
1831 		return (0);
1832 
1833 	return (ses2_setprop(sp, np, dp->scd_props, nvl));
1834 }
1835 
1836 int
1837 ses2_element_setdef(ses_node_t *np, ses2_diag_page_t page, void *data)
1838 {
1839 	const ses2_ctl_desc_t *dp;
1840 	nvlist_t *props = ses_node_props(np);
1841 	uint64_t type;
1842 
1843 	VERIFY(nvlist_lookup_uint64(props, SES_PROP_ELEMENT_TYPE, &type) == 0);
1844 
1845 	for (dp = &ctl_descs[0]; dp->scd_et != -1; dp++)
1846 		if (dp->scd_et == type)
1847 			break;
1848 
1849 	if (dp->scd_et == -1)
1850 		return (0);
1851 
1852 	if (dp->scd_setdef(np, page, data) != 0)
1853 		return (-1);
1854 
1855 	return (0);
1856 }
1857