66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER START
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The contents of this file are subject to the terms of the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Common Development and Distribution License (the "License").
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You may not use this file except in compliance with the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * or http://www.opensolaris.org/os/licensing.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * See the License for the specific language governing permissions
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * and limitations under the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * When distributing Covered Code, include this CDDL HEADER in each
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * If applicable, add the following below this CDDL HEADER, with the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * fields enclosed by brackets "[]" replaced with your own identifying
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * information: Portions Copyright [yyyy] [name of copyright owner]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER END
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
c75976d12071ddd21443266260066ba036671682pawelw * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <string.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <strings.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <scsi/libses.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <scsi/libses_plugin.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <scsi/plugins/ses/framework/ses2_impl.h>
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic int
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsun_loki_fix_bay(ses_plugin_t *sp, ses_node_t *np)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ses2_aes_descr_eip_impl_t *dep;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ses2_aes_descr_sas0_eip_impl_t *s0ep;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int nverr;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf nvlist_t *props = ses_node_props(np);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * The spec conveniently defines the bay number as part of the
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * additional element status descriptor. However, the AES descriptor
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * is technically only valid if the device is inserted. This is a
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw * problem for loki because the bay numbers don't match the element
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * class index, so when a device is removed we have no way of knowing
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * *which* bay is empty. Thankfully, loki defines this value even if
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * the invalid bit is set, so we override this value, even for empty
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * bays.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((dep = ses_plugin_page_lookup(sp, ses_node_snapshot(np),
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES2_DIAGPAGE_ADDL_ELEM_STATUS, np, &len)) == NULL)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
ae8faf9c0cd738ab78a672de5bf7e7f7d004ebb2ls
2038334ab26baaa43c9083f35def041511c3cc1fUnknown if (dep->sadei_protocol_identifier != SPC4_PROTO_SAS ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf !dep->sadei_eip || !dep->sadei_invalid)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf s0ep = (ses2_aes_descr_sas0_eip_impl_t *)dep->sadei_protocol_specific;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES_NV_ADD(uint64, nverr, props, SES_PROP_BAY_NUMBER,
37a077ef1920ee044b2887247b2a802e726d3368ls s0ep->sadsi_bay_number);
37a077ef1920ee044b2887247b2a802e726d3368ls
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw}
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelwstatic int
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelwsun_loki_parse_node(ses_plugin_t *sp, ses_node_t *np)
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw{
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw ses_node_t *encp;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw nvlist_t *props = ses_node_props(np);
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw nvlist_t *encprops;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw uint8_t *stringin;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw uint_t len;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw nvlist_t *lid;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw int nverr;
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw char serial[17];
6f9b9bf43c10fb1741a40302efe9db1a139745c8pawelw uint8_t fieldlen;
c75976d12071ddd21443266260066ba036671682pawelw char *field;
c75976d12071ddd21443266260066ba036671682pawelw uint64_t wwn;
c75976d12071ddd21443266260066ba036671682pawelw uint64_t type, index;
c75976d12071ddd21443266260066ba036671682pawelw int i;
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelw if (ses_node_type(np) != SES_NODE_ENCLOSURE &&
c75976d12071ddd21443266260066ba036671682pawelw ses_node_type(np) != SES_NODE_ELEMENT)
c75976d12071ddd21443266260066ba036671682pawelw return (0);
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelw if (ses_node_type(np) == SES_NODE_ELEMENT) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf VERIFY(nvlist_lookup_uint64(props, SES_PROP_ELEMENT_TYPE,
2038334ab26baaa43c9083f35def041511c3cc1fUnknown &type) == 0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
7a70ede882eacbae00c8d5209afb443e7755684cpawelw if (type == SES_ET_ARRAY_DEVICE)
7a70ede882eacbae00c8d5209afb443e7755684cpawelw return (sun_loki_fix_bay(sp, np));
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
2038334ab26baaa43c9083f35def041511c3cc1fUnknown if (type != SES_ET_COOLING &&
2038334ab26baaa43c9083f35def041511c3cc1fUnknown type != SES_ET_POWER_SUPPLY)
2038334ab26baaa43c9083f35def041511c3cc1fUnknown return (0);
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
2038334ab26baaa43c9083f35def041511c3cc1fUnknown VERIFY(nvlist_lookup_uint64(props, SES_PROP_ELEMENT_CLASS_INDEX,
2038334ab26baaa43c9083f35def041511c3cc1fUnknown &index) == 0);
2038334ab26baaa43c9083f35def041511c3cc1fUnknown }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
2038334ab26baaa43c9083f35def041511c3cc1fUnknown * Find the containing enclosure node and extract the STRING IN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * information.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown for (encp = np; ses_node_type(encp) != SES_NODE_ENCLOSURE;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown encp = ses_node_parent(encp))
2038334ab26baaa43c9083f35def041511c3cc1fUnknown ;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
8d483882aa3390058094b043f3d62187b5d1de03mlf encprops = ses_node_props(encp);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw if (nvlist_lookup_byte_array(encprops, SES_EN_PROP_STRING,
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw &stringin, &len) != 0 || len < 4)
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw return (0);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw /*
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw * If this is an enclosure, then calculate the chassis WWN by masking
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw * off the bottom 8 bits of the WWN.
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw if (ses_node_type(np) == SES_NODE_ENCLOSURE) {
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw VERIFY(nvlist_lookup_nvlist(props, SES_EN_PROP_LID, &lid) == 0);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw VERIFY(nvlist_lookup_uint64(lid, SPC3_NAA_INT, &wwn) == 0);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw (void) snprintf(serial, sizeof (serial), "%llx",
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw wwn & ~0xFFULL);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw SES_NV_ADD(string, nverr, props, LIBSES_EN_PROP_CSN, serial);
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * J4500 has 4 expanders and two of them provides
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * only ARRAY DEVICE elements while the other two provides
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * fully populated SES element information.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This behavior may cause missing corresponding enclosure
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * element for an enclousre descriptor so no element type
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * is added to the enclosure node.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The enclosure element type is added here. Note that
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * even if the enclosure element is found and the associated
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * prop is created by libses the plugin based prop
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * overrides so there should be no side effect doing this.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES_NV_ADD(uint64, nverr, props, SES_PROP_ELEMENT_TYPE,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES_ET_ENCLOSURE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The STRING IN data is organized into a series of variable-length
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * fields, where each field can be either a key ("Fan PartNUM") or a
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * value. If the field length is less than our shortest expected
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * identifier, then something has gone awry and we assume that the data
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * is corrupt.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf fieldlen = stringin[3];
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (fieldlen < 11)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (field = (char *)stringin + 4;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field + fieldlen <= (char *)stringin + len; field += fieldlen) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (strncmp(field, "Storage J4500", 13) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
2038334ab26baaa43c9083f35def041511c3cc1fUnknown * This is the part number for the enclosure itself.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ses_node_type(np) != SES_NODE_ENCLOSURE)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf continue;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field += fieldlen;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (field + fieldlen > (char *)stringin + len)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ses_node_type(np) == SES_NODE_ENCLOSURE) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES_NV_ADD(fixed_string_trunc, nverr, props,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf LIBSES_PROP_PART, field, fieldlen);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strncmp(field, "Fan PartNUM", 11) == 0) {
4360436b3c604bc28d37be269ad152b4c38157c3pawelw /*
4360436b3c604bc28d37be269ad152b4c38157c3pawelw * Part numbers for the fans, of which there are 5.
c75976d12071ddd21443266260066ba036671682pawelw */
c75976d12071ddd21443266260066ba036671682pawelw if (ses_node_type(np) != SES_NODE_ELEMENT ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf type != SES_ET_COOLING) {
2038334ab26baaa43c9083f35def041511c3cc1fUnknown field += fieldlen * 5;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown continue;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field += fieldlen;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (i = 0; i < 5 &&
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field + fieldlen <= (char *)stringin + len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf i++, field += fieldlen) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (index == i &&
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strncmp(field, "Unknown", 7) != 0 &&
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strncmp(field, "Not Installed", 13) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SES_NV_ADD(fixed_string_trunc, nverr,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf props, LIBSES_PROP_PART,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field, fieldlen);
a022fe3e0bc959fae460b8b5b818cd1265bf4c66ls return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strncmp(field, "PS PartNUM", 10) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Part numbers for the power supplies, of which there
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * are 2.
a022fe3e0bc959fae460b8b5b818cd1265bf4c66ls */
4360436b3c604bc28d37be269ad152b4c38157c3pawelw if (ses_node_type(np) != SES_NODE_ELEMENT ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf type != SES_ET_POWER_SUPPLY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf field += fieldlen * 2;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf continue;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
2038334ab26baaa43c9083f35def041511c3cc1fUnknown field += fieldlen;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
2038334ab26baaa43c9083f35def041511c3cc1fUnknown for (i = 0; i < 2 &&
2038334ab26baaa43c9083f35def041511c3cc1fUnknown field + fieldlen <= (char *)stringin + len;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown i++, field += fieldlen) {
2038334ab26baaa43c9083f35def041511c3cc1fUnknown if (index == i &&
2038334ab26baaa43c9083f35def041511c3cc1fUnknown strncmp(field, "Unknown", 7) != 0 &&
2038334ab26baaa43c9083f35def041511c3cc1fUnknown strncmp(field, "Not Installed", 13) != 0) {
2038334ab26baaa43c9083f35def041511c3cc1fUnknown SES_NV_ADD(fixed_string_trunc, nverr,
c75976d12071ddd21443266260066ba036671682pawelw props, LIBSES_PROP_PART,
2038334ab26baaa43c9083f35def041511c3cc1fUnknown field, fieldlen);
c75976d12071ddd21443266260066ba036671682pawelw return (0);
c75976d12071ddd21443266260066ba036671682pawelw }
c75976d12071ddd21443266260066ba036671682pawelw }
c75976d12071ddd21443266260066ba036671682pawelw }
c75976d12071ddd21443266260066ba036671682pawelw }
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelw return (0);
c75976d12071ddd21443266260066ba036671682pawelw}
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelwint
c75976d12071ddd21443266260066ba036671682pawelw_ses_init(ses_plugin_t *sp)
c75976d12071ddd21443266260066ba036671682pawelw{
c75976d12071ddd21443266260066ba036671682pawelw ses_plugin_config_t config = {
c75976d12071ddd21443266260066ba036671682pawelw .spc_node_parse = sun_loki_parse_node
c75976d12071ddd21443266260066ba036671682pawelw };
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelw return (ses_plugin_register(sp, LIBSES_PLUGIN_VERSION,
c75976d12071ddd21443266260066ba036671682pawelw &config) != 0);
c75976d12071ddd21443266260066ba036671682pawelw}
c75976d12071ddd21443266260066ba036671682pawelw