275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock/*
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * CDDL HEADER START
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock *
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * The contents of this file are subject to the terms of the
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Common Development and Distribution License (the "License").
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * You may not use this file except in compliance with the License.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock *
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * or http://www.opensolaris.org/os/licensing.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * See the License for the specific language governing permissions
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * and limitations under the License.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock *
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * When distributing Covered Code, include this CDDL HEADER in each
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * If applicable, add the following below this CDDL HEADER, with the
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * fields enclosed by brackets "[]" replaced with your own identifying
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock *
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * CDDL HEADER END
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock */
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock/*
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock */
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <stddef.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <string.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <strings.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <libnvpair.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <scsi/libses.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include <scsi/plugins/ses/framework/ses2_impl.h>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_sd(ses2_elem_status_impl_t *esip, nvlist_t *nvl)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_enclosure_status_impl_t *sdp;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp = (ses2_enclosure_status_impl_t *)esip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_PROP_STATUS_CODE,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_common.sesi_status_code);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_SWAP,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_common.sesi_swap);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_DISABLED,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_common.sesi_disabled);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_PRDFAIL,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_common.sesi_prdfail);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_IDENT, sdp->sesi_ident);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_WARN,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_warning_indication);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_FAIL,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_failure_indication);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_POWER_DELAY,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_power_delay);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_WARN_REQ,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_warning_requested);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(boolean_value, nverr, nvl, SES_PROP_FAIL_REQ,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_warning_requested);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_POWER_DURATION,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sdp->sesi_power_duration);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_help(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_snap_t *snap = ses_node_snapshot(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_help_page_impl_t *hpip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_subhelp_page_impl_t *shpip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_subhelp_text_impl_t *tip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *nvl = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock uint64_t eid;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim size_t len, textlen;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock off_t pos;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (nvlist_lookup_uint64(nvl, SES_EN_PROP_EID, &eid) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((shpip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_SUBENCLOSURE_HELP_TEXT, np, &len)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos = 0;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (tip = (ses2_subhelp_text_impl_t *)shpip->sspi_data;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos < SCSI_READ16(&shpip->sspi_page_length);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos += SES2_SUBHELP_LEN(tip),
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock tip = (ses2_subhelp_text_impl_t *)((uint8_t *)tip + pos)) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(tip, shpip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (tip->ssti_subenclosure_identifier != eid)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock continue;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim textlen = SCSI_READ16(
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim &tip->ssti_subenclosure_help_text_length);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE(tip->ssti_subenclosure_help_text,
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim textlen, shpip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(fixed_string, nverr, nvl, SES_EN_PROP_HELP,
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim tip->ssti_subenclosure_help_text, textlen);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (eid == 0 && (hpip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_HELP_TEXT, np, &len)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(hpip, hpip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE(hpip->shpi_help_text,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SCSI_READ16(&hpip->shpi_page_length), hpip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(fixed_string, nverr, nvl, SES_EN_PROP_HELP,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock hpip->shpi_help_text, SCSI_READ16(&hpip->shpi_page_length));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_string_in(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_snap_t *snap = ses_node_snapshot(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_string_in_page_impl_t *sip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_substring_in_page_impl_t *ssip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_substring_in_data_impl_t *dip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *nvl = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock uint64_t eid;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock off_t pos;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock size_t len, textlen;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (nvlist_lookup_uint64(nvl, SES_EN_PROP_EID, &eid) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((ssip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_SUBENCLOSURE_STRING_IO, np, &len)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos = 0;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (dip = (ses2_substring_in_data_impl_t *)ssip->ssipi_data;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos < SCSI_READ16(&ssip->ssipi_page_length);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pos += SES2_SUBSTR_LEN(dip),
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip = (ses2_substring_in_data_impl_t *)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ((uint8_t *)dip + pos)) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(dip, ssip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (dip->ssidi_subenclosure_identifier != eid)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock continue;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim textlen =
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim SCSI_READ16(&dip->ssidi_substring_data_length);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if (!SES_WITHIN_PAGE(dip->ssidi_data, textlen,
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim ssip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(fixed_string, nverr, nvl, SES_EN_PROP_STRING,
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (char *)dip->ssidi_data, textlen);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (eid == 0 && (sip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_STRING_IO, np, &len)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(sip, sip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock textlen = SCSI_READ16(&sip->ssipi_page_length);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE(sip->ssipi_data, textlen, sip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(byte_array, nverr, nvl, SES_EN_PROP_STRING,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sip->ssipi_data, textlen);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_descr(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock char *desc;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *props = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock size_t len;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((desc = ses_plugin_page_lookup(sp, ses_node_snapshot(np),
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_ELEMENT_DESC, np, &len)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(fixed_string, nverr, props, SES_PROP_DESCRIPTION,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock desc, len);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_dlucode(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_snap_t *snap = ses_node_snapshot(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_ucode_status_page_impl_t *upip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_ucode_status_descr_impl_t *dip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *nvl = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr, i;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock size_t len;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock uint64_t eid;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((upip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_DL_MICROCODE_CTL_STATUS, np, &len)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (nvlist_lookup_uint64(nvl, SES_EN_PROP_EID, &eid) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(upip, upip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock /*
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * The number of subenclosures excludes the primary subenclosure, which
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * is always part of the response.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock */
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (dip = &upip->suspi_descriptors[0], i = 0;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock i <= upip->suspi_n_subenclosures;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock i++, dip++) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(dip, upip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (dip->susdi_subenclosure_identifier != eid)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock continue;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_UCODE,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->susdi_subenclosure_dl_status);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_UCODE_A,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->susdi_subenclosure_dl_addl_status);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_UCODE_SZ,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SCSI_READ32(&dip->susdi_subenclosure_dl_max_size));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_UCODE_BUF,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->susdi_subenclosure_dl_buffer_id);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_UCODE_OFF,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->susdi_subenclosure_dl_buffer_offset);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockstatic int
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockenc_parse_subnick(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_snap_t *snap = ses_node_snapshot(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_subnick_status_page_impl_t *spip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_subnick_descr_impl_t *dip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *nvl = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int nverr, i;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock size_t len;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock uint64_t eid;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (nvlist_lookup_uint64(nvl, SES_EN_PROP_EID, &eid) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((spip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_SUBENCLOSURE_NICKNAME_CTL_STATUS,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock np, &len)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(spip, spip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (dip = &spip->sspci_subnicks[0], i = 0;
51ece83525fa18f5e72627610f480dffc7e492fdeschrock i <= spip->sspci_n_subenclosures;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock i++, dip++) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (!SES_WITHIN_PAGE_STRUCT(dip, spip, len))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (dip->ssdi_subenclosure_identifier != eid)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock continue;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_NICK_STATUS,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->ssdi_subenclosure_nick_status);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_NICK_ADDL_STATUS,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->ssdi_subenclosure_nick_addl_status);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD_FS(nverr, nvl, SES_EN_PROP_NICK,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->ssdi_subenclosure_nickname);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES_NV_ADD(uint64, nverr, nvl, SES_EN_PROP_NICK_LANG,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock dip->ssdi_subenclosure_nick_lang_code);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock break;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockint
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses2_fill_enclosure_node(ses_plugin_t *sp, ses_node_t *np)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock{
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_snap_t *snap = ses_node_snapshot(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock nvlist_t *props = ses_node_props(np);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses2_elem_status_impl_t *esip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int err;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock size_t len;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((esip = ses_plugin_page_lookup(sp, snap,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock SES2_DIAGPAGE_ENCLOSURE_CTL_STATUS, np, &len)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_sd(esip, props)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock }
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_help(sp, np)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_string_in(sp, np)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_descr(sp, np)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_dlucode(sp, np)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((err = enc_parse_subnick(sp, np)) != 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (err);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock}