hc.c revision ac88567a7a5bb7f01cf22cf366bc9d6203e24d7a
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * CDDL HEADER START
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * The contents of this file are subject to the terms of the
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * Common Development and Distribution License (the "License").
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * You may not use this file except in compliance with the License.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * See the License for the specific language governing permissions
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * and limitations under the License.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * When distributing Covered Code, include this CDDL HEADER in each
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * If applicable, add the following below this CDDL HEADER, with the
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * fields enclosed by brackets "[]" replaced with your own identifying
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * information: Portions Copyright [yyyy] [name of copyright owner]
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * CDDL HEADER END
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
13faa91230bde46da937bf33010b9accc5bdeb59sdstatic int hc_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien topo_instance_t, void *, void *);
13faa91230bde46da937bf33010b9accc5bdeb59sdstatic int hc_fmri_nvl2str(topo_mod_t *, tnode_t *, topo_version_t,
13faa91230bde46da937bf33010b9accc5bdeb59sdstatic int hc_fmri_str2nvl(topo_mod_t *, tnode_t *, topo_version_t,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_compare(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_present(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_replaced(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_unusable(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_expand(topo_mod_t *, tnode_t *, topo_version_t,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_retire(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
13faa91230bde46da937bf33010b9accc5bdeb59sdstatic int hc_fmri_unretire(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsienstatic int hc_fmri_service_state(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int hc_fmri_create_meth(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int hc_fmri_prop_get(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int hc_fmri_prop_set(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int hc_fmri_pgrp_get(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int hc_fmri_facility(topo_mod_t *, tnode_t *, topo_version_t,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic nvlist_t *hc_fmri_create(topo_mod_t *, nvlist_t *, int, const char *,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd topo_instance_t inst, const nvlist_t *, const char *, const char *,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd const char *);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd { TOPO_METH_NVL2STR, TOPO_METH_NVL2STR_DESC, TOPO_METH_NVL2STR_VERSION,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd { TOPO_METH_STR2NVL, TOPO_METH_STR2NVL_DESC, TOPO_METH_STR2NVL_VERSION,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd { TOPO_METH_COMPARE, TOPO_METH_COMPARE_DESC, TOPO_METH_COMPARE_VERSION,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd { TOPO_METH_PRESENT, TOPO_METH_PRESENT_DESC, TOPO_METH_PRESENT_VERSION,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien { TOPO_METH_SERVICE_STATE, TOPO_METH_SERVICE_STATE_DESC,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd TOPO_METH_SERVICE_STATE_VERSION, TOPO_STABILITY_INTERNAL,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd { TOPO_METH_FMRI, TOPO_METH_FMRI_DESC, TOPO_METH_FMRI_VERSION,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsienstatic int hc_ncanon = sizeof (hc_canon) / sizeof (hcc_t);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * Turn on module debugging output
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien if (topo_mod_register(mod, &hc_info, TOPO_VERSION) != 0) {
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien return (0);
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (topo_pgroup_create(node, &auth_pgroup, &err) != 0) {
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * Inherit if we can, it saves memory
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if ((topo_prop_inherit(node, FM_FMRI_AUTHORITY, FM_FMRI_AUTH_PRODUCT,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (nvlist_lookup_string(auth, FM_FMRI_AUTH_PRODUCT, &prod)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien (void) topo_prop_set_string(node, FM_FMRI_AUTHORITY,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien FM_FMRI_AUTH_PRODUCT, TOPO_PROP_IMMUTABLE, prod,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if ((topo_prop_inherit(node, FM_FMRI_AUTHORITY, FM_FMRI_AUTH_PRODUCT_SN,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (nvlist_lookup_string(auth, FM_FMRI_AUTH_PRODUCT_SN, &psn)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien (void) topo_prop_set_string(node, FM_FMRI_AUTHORITY,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien FM_FMRI_AUTH_PRODUCT_SN, TOPO_PROP_IMMUTABLE, psn,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if ((topo_prop_inherit(node, FM_FMRI_AUTHORITY, FM_FMRI_AUTH_CHASSIS,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (nvlist_lookup_string(auth, FM_FMRI_AUTH_CHASSIS, &csn) == 0)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien (void) topo_prop_set_string(node, FM_FMRI_AUTHORITY,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if ((topo_prop_inherit(node, FM_FMRI_AUTHORITY, FM_FMRI_AUTH_SERVER,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (nvlist_lookup_string(auth, FM_FMRI_AUTH_SERVER, &server)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien (void) topo_prop_set_string(node, FM_FMRI_AUTHORITY,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien FM_FMRI_AUTH_SERVER, TOPO_PROP_IMMUTABLE, server,
13faa91230bde46da937bf33010b9accc5bdeb59sd (void) topo_prop_set_string(node, TOPO_PGROUP_SYSTEM, TOPO_PROP_ISA,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) topo_prop_set_string(node, TOPO_PGROUP_SYSTEM, TOPO_PROP_MACHINE,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdhc_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, topo_instance_t min,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * Register root node methods
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien (void) topo_method_register(mod, pnode, hc_methods);
13faa91230bde46da937bf33010b9accc5bdeb59sd "Request to enumerate %s component with an "
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien "ambiguous instance number, min (%d) != max (%d).\n",
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien nvl = hc_fmri_create(mod, pfmri, FM_HC_SCHEME_VERSION, name, min,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (-1);
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if ((node = topo_node_bind(mod, pnode, name, min, nvl)) == NULL) {
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien topo_mod_dprintf(mod, "topo_node_bind failed: %s\n",
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (-1);
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * Set FRU for the motherboard node
13faa91230bde46da937bf33010b9accc5bdeb59sd return (0);
13faa91230bde46da937bf33010b9accc5bdeb59sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic void
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdfmri_compare(topo_mod_t *mod, nvlist_t *nv1, nvlist_t *nv2)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd err = nvlist_lookup_nvlist_array(nv1, FM_FMRI_HC_LIST, &hcp1, &nhcp1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd err |= nvlist_lookup_nvlist_array(nv2, FM_FMRI_HC_LIST, &hcp2, &nhcp2);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd for (i = 0; i < nhcp1; i++) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcp1[i], FM_FMRI_HC_NAME, &nm1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcp2[i], FM_FMRI_HC_NAME, &nm2);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcp1[i], FM_FMRI_HC_ID, &id1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcp2[i], FM_FMRI_HC_ID, &id2);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nm1 == NULL || nm2 == NULL || id1 == NULL || id2 == NULL)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * Finally, check if the FMRI's represent a facility node. If so, then
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * verify that the facilty type ("sensor"|"indicator") and facility
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * name match.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_string(f1, FM_FMRI_FACILITY_NAME, &f1str) == 0 &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_lookup_string(f2, FM_FMRI_FACILITY_NAME, &f2str) == 0 &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_lookup_string(f1, FM_FMRI_FACILITY_TYPE, &f1str) == 0 &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_lookup_string(f2, FM_FMRI_FACILITY_TYPE, &f2str) == 0 &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdhc_compare(topo_mod_t *mod, tnode_t *node, topo_version_t version,
13faa91230bde46da937bf33010b9accc5bdeb59sd if (nvlist_lookup_nvlist(in, TOPO_METH_FMRI_ARG_NV1, &nv1) != 0 ||
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_lookup_nvlist(in, TOPO_METH_FMRI_ARG_NV2, &nv2) != 0)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 ||
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* Get authority, if present */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if ((err = nvlist_lookup_string(nvl, FM_FMRI_HC_ROOT, &root)) != 0)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd err = nvlist_lookup_nvlist_array(nvl, FM_FMRI_HC_LIST, &hcprs, &hcnprs);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(nvl, FM_FMRI_HC_SERIAL_ID, &serial);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(nvl, FM_FMRI_HC_PART, &part);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(nvl, FM_FMRI_HC_REVISION, &rev);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* hc:// */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd topo_fmristr_build(&size, buf, buflen, FM_FMRI_SCHEME_HC, NULL, "://");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* authority, if any */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd apair != NULL; apair = nvlist_next_nvpair(anvl, apair)) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* hardware-id part */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd buf, buflen, serial, ":" FM_FMRI_HC_SERIAL_ID "=", NULL);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* separating slash */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* hc-root */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd topo_fmristr_build(&size, buf, buflen, root, NULL, NULL);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* all the pairs */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd for (i = 0; i < hcnprs; i++) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (i > 0)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcprs[i], FM_FMRI_HC_NAME, &nm);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_string(hcprs[i], FM_FMRI_HC_ID, &id);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /* append offset/physaddr if it exists in hc-specific */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_FMRI_HC_SPECIFIC, &hcsp) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint64(hcsp, FM_FMRI_HC_SPECIFIC_OFFSET,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * If the nvlist represents a facility node, then we append the
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * facility type and name to the end of the string representation using
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * the format below:
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * ?<ftype>=<fname>
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_FMRI_FACILITY, &fnvl) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd topo_fmristr_build(&size, buf, buflen, "=", ftype, fname);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdhc_fmri_nvl2str(topo_mod_t *mod, tnode_t *node, topo_version_t version,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien if (topo_mod_nvalloc(mod, &fmristr, NV_UNIQUE_NAME) != 0) {
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien if (nvlist_add_string(fmristr, "fmri-string", name) != 0) {
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien return (0);
70818f5837509317d1f5dac4d82d7b5a2d547c29tsienhc_base_fmri_create(topo_mod_t *mod, const nvlist_t *auth, const char *part,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien * Create base HC nvlist
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien if (topo_mod_nvalloc(mod, &fmri, NV_UNIQUE_NAME) != 0)
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien err = nvlist_add_uint8(fmri, FM_VERSION, FM_HC_SCHEME_VERSION);
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien err |= nvlist_add_string(fmri, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC);
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien if (err != 0) {
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien * Add optional payload members
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien (void) nvlist_add_string(fmri, FM_FMRI_HC_SERIAL_ID, serial);
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien (void) nvlist_add_string(fmri, FM_FMRI_HC_PART, part);
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien (void) nvlist_add_string(fmri, FM_FMRI_HC_REVISION, rev);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * Count equal signs and slashes to determine how many
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * hc-pairs will be present in the final FMRI. There should
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * be at least as many slashes as equal signs. There can be
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * more, though if the string after an = includes them.
nslashes++;
return (NULL);
return (NULL);
for (i = 0; i < npairs; i++) {
startn++;
if (i < npairs) {
for (i = 0; i < npairs; i++)
return (NULL);
return (pa);
goto hcabail;
goto hcabail;
goto hcabail;
goto hcabail;
goto hcabail;
NV_UNIQUE_NAME) == 0) {
aid);
++fac;
++fname;
char *str;
int npairs, n;
goto hcfmbail;
goto hcfmbail;
n = npairs;
char *hcid;
&hcid);
goto hcfmbail;
goto hcfmbail;
goto hcfmbail;
for (i = 0; i < npairs; i++)
goto hcfmbail;
goto hcfmbail;
for (i = 0; i < npairs; i++)
static nvlist_t *
int err;
return (NULL);
if (err != 0) {
return (NULL);
return (hc);
static nvlist_t *
int err)
return (NULL);
for (i = 0; i < hc_ncanon; i++) {
if (i >= hc_ncanon) {
name);
static nvlist_t *
EMOD_NOMEM));
for (i = 0; i < pelems; ++i)
return (fmri);
int ret;
&pfmri);
&auth);
&part);
&serial);
struct hc_walk {
void *hcw_priv;
int err;
rsrc) != 0 ||
fmri) != 0) {
&match) != 0) {
int status;
return (status);
return (TOPO_WALK_TERMINATE);
int i, err;
return (TOPO_WALK_ERR);
return (TOPO_WALK_TERMINATE);
return (TOPO_WALK_TERMINATE);
if (err != 0) {
return (TOPO_WALK_ERR);
return (TOPO_WALK_ERR);
if (!match)
if (err != 0) {
return (TOPO_WALK_ERR);
return (TOPO_WALK_ERR);
return (TOPO_WALK_TERMINATE);
if (err != 0) {
return (TOPO_WALK_ERR);
static struct hc_walk *
return (NULL);
&sz) != 0) {
return (NULL);
return (NULL);
== NULL) {
return (NULL);
return (hwp);
struct prop_lookup {
const char *pl_pgroup;
const char *pl_pname;
int pl_flag;
int err = 0;
return (err);
int err;
if (err != 0) {
err = 0;
return (err);
int err = 0;
return (err);
int err;
if (err != 0) {
err = 0;
return (err);
int err = 0;
return (err);
int err;
if (err != 0) {
err = 0;
return (err);
struct hc_args {
char *ha_method_name;
return (FMD_OBJ_STATE_UNKNOWN);
return (FMD_OBJ_STATE_REPLACED);
return (FMD_OBJ_STATE_STILL_PRESENT);
int err;
&err) < 0) {
return (err);
return (err);
return (EMOD_NOMEM);
return (EMOD_NOMEM);
int err;
err = 0;
return (err);
int err;
&err) < 0) {
return (err);
&err) < 0) {
return (err);
return (err);
NV_UNIQUE_NAME) != 0)
return (EMOD_NOMEM);
return (ETOPO_PROP_NVL);
FMD_OBJ_STATE_NOT_PRESENT) != 0) {
return (ETOPO_PROP_NVL);
int err;
err = 0;
return (err);
int err;
&err) < 0) {
TOPO_METH_UNUSABLE_RET, 0) == 0)
return (ETOPO_PROP_NVL);
int err;
err = 0;
return (err);
struct fac_lookup {
const char *fl_fac_type;
#ifdef _LP64
return (TOPO_WALK_ERR);
return (ret);
int err = 0;
#ifdef _LP64
if (err != 0) {
err = 0;
return (err);
int err;
const char **namep;
const char *names[] = {
return (ETOPO_METHOD_FAIL);
return (ETOPO_PROP_NVL);
int err;
err = 0;
return (err);
int err;
err = 0;
return (err);