b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * CDDL HEADER START
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * The contents of this file are subject to the terms of the
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Common Development and Distribution License (the "License").
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * You may not use this file except in compliance with the License.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * or http://www.opensolaris.org/os/licensing.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * See the License for the specific language governing permissions
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * and limitations under the License.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * When distributing Covered Code, include this CDDL HEADER in each
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * If applicable, add the following below this CDDL HEADER, with the
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * fields enclosed by brackets "[]" replaced with your own identifying
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * information: Portions Copyright [yyyy] [name of copyright owner]
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * CDDL HEADER END
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Use is subject to license terms.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <strings.h>
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#include <fm/topo_mod.h>
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#include <fm/topo_hc.h>
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#include <sys/fm/protocol.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/fm/ldom.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/mdesc.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <assert.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/systeminfo.h>
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#include "xaui.h"
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * xaui.c
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * sun4v specific xaui enumerators
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#ifdef __cplusplus
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxextern "C" {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx#endif
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define XAUI_VERSION TOPO_VERSION
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define XFP_MAX 1 /* max number of xfp per xaui card */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic int xaui_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_instance_t, void *, void *);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic const topo_modops_t xaui_ops =
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx { xaui_enum, NULL };
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxconst topo_modinfo_t xaui_info =
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx {XAUI, FM_FMRI_SCHEME_HC, XAUI_VERSION, &xaui_ops};
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic const topo_pgroup_info_t xaui_auth_pgroup = {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx FM_FMRI_AUTHORITY,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx TOPO_STABILITY_PRIVATE,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx TOPO_STABILITY_PRIVATE,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx 1
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx};
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic topo_mod_t *xaui_mod_hdl = NULL;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic int freeprilabel = 0;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic int ispci = 0;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxvoid
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx_topo_init(topo_mod_t *mod, topo_version_t version)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /*
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Turn on module debugging output
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (getenv("TOPOXAUIDBG") != NULL)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_setdebug(mod);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod, "initializing xaui enumerator\n");
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_mod_register(mod, &xaui_info, TOPO_VERSION) < 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod, "xaui registration failed: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_errmsg(mod));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return; /* mod errno already set */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod, "xaui enum initd\n");
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxvoid
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx_topo_fini(topo_mod_t *mod)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_unregister(mod);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic tnode_t *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_tnode_create(topo_mod_t *mod, tnode_t *parent,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx const char *name, topo_instance_t i, void *priv)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx int err;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_t *fmri;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx tnode_t *ntn;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_t *auth = topo_mod_auth(mod, parent);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx fmri = topo_mod_hcfmri(mod, parent, FM_HC_SCHEME_VERSION, name, i,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx NULL, auth, NULL, NULL, NULL);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_free(auth);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (fmri == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "Unable to make nvlist for %s bind: %s.\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx name, topo_mod_errmsg(mod));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (NULL);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx ntn = topo_node_bind(mod, parent, name, i, fmri);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_free(fmri);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (ntn == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "topo_node_bind (%s%d/%s%d) failed: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_node_name(parent), topo_node_instance(parent),
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx name, i,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_strerror(topo_mod_errno(mod)));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (NULL);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_node_setspecific(ntn, priv);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_pgroup_create(ntn, &xaui_auth_pgroup, &err) == 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx FM_FMRI_AUTH_PRODUCT, &err);
9c94f155585ea35e938fea603bc227c685223abdCheng Sean Ye (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
9c94f155585ea35e938fea603bc227c685223abdCheng Sean Ye FM_FMRI_AUTH_PRODUCT_SN, &err);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx FM_FMRI_AUTH_CHASSIS, &err);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx FM_FMRI_AUTH_SERVER, &err);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (ntn);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic int
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_fru_set(topo_mod_t *mp, tnode_t *tn)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_t *fmri;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx int err, e;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_node_resource(tn, &fmri, &err) < 0 ||
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx fmri == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mp, "FRU_fmri_set error: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_strerror(topo_mod_errno(mp)));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (topo_mod_seterrno(mp, err));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx e = topo_node_fru_set(tn, fmri, 0, &err);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_free(fmri);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (e < 0)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (topo_mod_seterrno(mp, err));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic void *
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_topo_alloc(size_t size)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu assert(xaui_mod_hdl != NULL);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (topo_mod_alloc(xaui_mod_hdl, size));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic void
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_topo_free(void *data, size_t size)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu assert(xaui_mod_hdl != NULL);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_free(xaui_mod_hdl, data, size);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier/*
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier * Remove the 3 character device name (pci/niu) from devfs path.
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic char *
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierxaui_trans_str(topo_mod_t *mod, char *dn, char *p, size_t buf_len)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu int i = 0;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier int j = 0;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier char buf[MAXPATHLEN];
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_trans_str: dev path(%s) dev name(%s)\n",
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier dn, p);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier do {
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* strip out either "pci" or "niu" */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier if (dn[i] == p[0] && dn[i + 1] == p[1] && dn[i + 2] == p[2])
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier i += 3;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier else
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf[j++] = dn[i++];
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier } while (i < buf_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_trans_str: return(%s)\n", buf);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier return (topo_mod_strdup(mod, (char *)buf));
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier}
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierstatic char *
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierxaui_get_path(topo_mod_t *mod, void *priv, topo_instance_t inst)
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu di_node_t dnode;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char *devfs_path;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char *path;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char *buf = NULL;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu size_t buf_len;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier size_t dev_path_len;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier size_t path_len;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * There are two ways to get here:
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * 1. niu enum - private data is the di_node_t for this xaui
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - instance is the ethernet function number
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * device path looks like: /niu@80/network@0:nxge@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path looks like: /@80/@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * 2. pcibus enum - private data is the parent tnode_t
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - instance is the pci function number
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * device path looks like: /pci@500/pci@0/pci@8/network@0:nxge0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path looks like: /@500/@0/@8/@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path for pciex is /@Bus/@Dev/@Func/@Instance
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (ispci == 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* coming from pcibus */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "from pcibus\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu dnode = topo_node_getspecific((tnode_t *)priv);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu } else {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* coming from niu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "from niu\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu dnode = (struct di_node *)priv;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (dnode == DI_NODE_NIL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "DI_NODE_NIL\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (NULL);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* get device path */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu devfs_path = di_devfs_path(dnode);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (devfs_path == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "NULL devfs_path\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (NULL);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "devfs_path (%s)\n", devfs_path);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier dev_path_len = strlen(devfs_path) + 1;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* remove device name from path */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (ispci == 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "ispci\n");
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf = xaui_trans_str(mod, devfs_path, "pci", dev_path_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf_len = strlen(buf) + 1;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu } else {
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf = xaui_trans_str(mod, devfs_path, "niu", dev_path_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf_len = strlen(buf) + 1;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier di_devfs_path_free(devfs_path);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* lop off "/network@" */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf[(strstr(buf, "/network@") - buf)] = '\0';
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* path: transposed address + '/@instance' (0/1) + '\0' */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier path_len = strlen(buf) + 3 + 1;
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier path = (char *)xaui_topo_alloc(path_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier if (snprintf(path, path_len, "%s/@%d", buf, inst) < 0) {
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "snprintf failed\n");
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier path = NULL;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier xaui_topo_free(buf, buf_len);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* should return something like /@500/@0/@8/@0 or /@80/@0 */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_get_path: path(%s)\n", path);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (path);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic int
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_get_pri_label(topo_mod_t *mod, topo_instance_t n, void *priv,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char **labelp)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_hdl_t *hdlp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu uint32_t type = 0;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ssize_t bufsize = 0;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu uint64_t *bufp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu md_t *mdp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu int num_nodes, ncomp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu mde_cookie_t *listp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char *pstr = NULL;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu int i;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu char *path;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* Get device path minus the device names */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu path = xaui_get_path(mod, priv, n);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (path == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "can't get path\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu hdlp = ldom_init(xaui_topo_alloc, xaui_topo_free);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (hdlp == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "ldom_init failed\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) ldom_get_type(hdlp, &type);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((type & LDOM_TYPE_CONTROL) != 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu bufsize = ldom_get_core_md(hdlp, &bufp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu } else {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu bufsize = ldom_get_local_md(hdlp, &bufp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (bufsize < 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "failed to get pri/md (%d)\n", bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_fini(hdlp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((mdp = md_init_intern(bufp, xaui_topo_alloc, xaui_topo_free)) ==
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NULL || (num_nodes = md_node_count(mdp)) < 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "md_init_intern failed\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(bufp, (size_t)bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_fini(hdlp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((listp = (mde_cookie_t *)xaui_topo_alloc(
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu sizeof (mde_cookie_t) * num_nodes)) == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "can't alloc listp\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(bufp, (size_t)bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) md_fini(mdp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_fini(hdlp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ncomp = md_scan_dag(mdp, MDE_INVAL_ELEM_COOKIE,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu md_find_name(mdp, "component"),
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu md_find_name(mdp, "fwd"), listp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (ncomp <= 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "no component nodes found\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(listp, sizeof (mde_cookie_t) * num_nodes);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(bufp, (size_t)bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) md_fini(mdp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_fini(hdlp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "number of comps (%d)\n", ncomp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu for (i = 0; i < ncomp; i++) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Look for type == "io", topo-hc-name == "xaui";
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * match "path" md property.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((md_get_prop_str(mdp, listp[i], "type", &pstr) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (pstr != NULL) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (strncmp(pstr, "io", strlen(pstr)) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (md_get_prop_str(mdp, listp[i], "topo-hc-name", &pstr)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu == 0) && (pstr != NULL) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (strncmp(pstr, "xaui", strlen(pstr)) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (md_get_prop_str(mdp, listp[i], "path", &pstr) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (pstr != NULL)) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* check node path */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (strncmp(pstr, path, sizeof (path)) == 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* this is the node, grab the label */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (md_get_prop_str(mdp, listp[i], "nac",
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu &pstr) == 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *labelp = topo_mod_strdup(mod, pstr);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* need to free this later */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu freeprilabel = 1;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu break;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(listp, sizeof (mde_cookie_t) * num_nodes);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(bufp, (size_t)bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) md_fini(mdp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ldom_fini(hdlp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (path != NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(path, strlen(path) + 1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (0);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic int
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_label_set(topo_mod_t *mod, tnode_t *node, topo_instance_t n, void *priv)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx const char *label = NULL;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx char *plat, *pp;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx int err;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx int i, p;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) xaui_get_pri_label(mod, n, priv, (char **)&label);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (label == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "no PRI node for label\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (Phyxaui_Names == NULL)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (topo_prop_get_string(node,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu FM_FMRI_AUTHORITY, FM_FMRI_AUTH_PRODUCT, &plat, &err) < 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (topo_mod_seterrno(mod, err));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Trim SUNW, from the platform name
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu pp = strchr(plat, ',');
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (pp == NULL)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu pp = plat;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu else
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ++pp;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu for (p = 0; p < Phyxaui_Names->psn_nplats; p++) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (strcmp(Phyxaui_Names->psn_names[p].pnm_platform,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu pp) != 0)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu continue;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu for (i = 0; i < Phyxaui_Names->psn_names[p].pnm_nnames;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu i++) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu physnm_t ps;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ps = Phyxaui_Names->psn_names[p].pnm_names[i];
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (ps.ps_num == n) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu label = ps.ps_label;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu break;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu break;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_strfree(mod, plat);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (label != NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_prop_set_string(node, TOPO_PGROUP_PROTOCOL,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx TOPO_PROP_LABEL, TOPO_PROP_IMMUTABLE,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx label, &err) != 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (freeprilabel == 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_strfree(mod, (char *)label);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (topo_mod_seterrno(mod, err));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (freeprilabel == 1) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_strfree(mod, (char *)label);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic tnode_t *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_declare(tnode_t *parent, const char *name, topo_instance_t i,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx void *priv, topo_mod_t *mod)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx tnode_t *ntn;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_t *fmri = NULL;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx int e;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if ((ntn = xaui_tnode_create(mod, parent, name, i, NULL)) == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod, "%s ntn = NULL\n", name);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (NULL);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx (void) xaui_fru_set(mod, ntn);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* when coming from pcibus: private data == parent tnode */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (priv == (void *)parent) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ispci = 1;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) xaui_label_set(mod, ntn, i, priv);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* reset pcibus/niu switch */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ispci = 0;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /* set ASRU to resource fmri */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_prop_get_fmri(ntn, TOPO_PGROUP_PROTOCOL,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx TOPO_PROP_RESOURCE, &fmri, &e) == 0)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx (void) topo_node_asru_set(ntn, fmri, 0, &e);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx nvlist_free(fmri);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_node_range_create(mod, ntn, XFP,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx 0, XFP_MAX) < 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_node_unbind(ntn);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod, "child_range_add of XFP"
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "failed: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_strerror(topo_mod_errno(mod)));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (NULL); /* mod_errno already set */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (ntn);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic topo_mod_t *
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxfp_enum_load(topo_mod_t *mp)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_t *rp = NULL;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if ((rp = topo_mod_load(mp, XFP, TOPO_VERSION)) == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mp,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "%s enumerator could not load %s enum.\n", XAUI, XFP);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (rp);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic int
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_enum(topo_mod_t *mod, tnode_t *rnode, const char *name,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_instance_t min, topo_instance_t max, void *arg, void *priv)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx{
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx tnode_t *xauin;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (strcmp(name, XAUI) != 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_mod_dprintf(mod,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "Currently only know how to enumerate %s components.\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx XAUI);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_mod_hdl = mod;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /*
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Load XFP enum
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (xfp_enum_load(mod) == NULL)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (-1);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((xauin = xaui_declare(rnode, name, min, priv, mod)) == NULL)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (-1);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /* set the private data to be the instance number of niufn */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_mod_enumerate(mod,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx xauin, XFP, XFP, 0, 0, NULL) != 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (topo_mod_seterrno(mod, EMOD_PARTIAL_ENUM));
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx }
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx}