70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * CDDL HEADER START
70025d765b044c6d8594bb965a2247a61e991a99johnny *
70025d765b044c6d8594bb965a2247a61e991a99johnny * The contents of this file are subject to the terms of the
70025d765b044c6d8594bb965a2247a61e991a99johnny * Common Development and Distribution License, Version 1.0 only
70025d765b044c6d8594bb965a2247a61e991a99johnny * (the "License"). You may not use this file except in compliance
70025d765b044c6d8594bb965a2247a61e991a99johnny * with the License.
70025d765b044c6d8594bb965a2247a61e991a99johnny *
70025d765b044c6d8594bb965a2247a61e991a99johnny * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
70025d765b044c6d8594bb965a2247a61e991a99johnny * or http://www.opensolaris.org/os/licensing.
70025d765b044c6d8594bb965a2247a61e991a99johnny * See the License for the specific language governing permissions
70025d765b044c6d8594bb965a2247a61e991a99johnny * and limitations under the License.
70025d765b044c6d8594bb965a2247a61e991a99johnny *
70025d765b044c6d8594bb965a2247a61e991a99johnny * When distributing Covered Code, include this CDDL HEADER in each
70025d765b044c6d8594bb965a2247a61e991a99johnny * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
70025d765b044c6d8594bb965a2247a61e991a99johnny * If applicable, add the following below this CDDL HEADER, with the
70025d765b044c6d8594bb965a2247a61e991a99johnny * fields enclosed by brackets "[]" replaced with your own identifying
70025d765b044c6d8594bb965a2247a61e991a99johnny * information: Portions Copyright [yyyy] [name of copyright owner]
70025d765b044c6d8594bb965a2247a61e991a99johnny *
70025d765b044c6d8594bb965a2247a61e991a99johnny * CDDL HEADER END
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
70025d765b044c6d8594bb965a2247a61e991a99johnny * Use is subject to license terms.
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny#include <string.h>
70025d765b044c6d8594bb965a2247a61e991a99johnny#include <sys/param.h>
70025d765b044c6d8594bb965a2247a61e991a99johnny#include <assert.h>
70025d765b044c6d8594bb965a2247a61e991a99johnny#include <pcidr.h>
70025d765b044c6d8594bb965a2247a61e991a99johnny#include <pcidr_cfga.h>
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * misc config_admin(3cfgadm) related routines
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic struct {
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_stat_t stat;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *name;
70025d765b044c6d8594bb965a2247a61e991a99johnny} pcidr_cfga_stat_nametab[] = {
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_NONE, "CFGA_STAT_NONE"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_EMPTY, "CFGA_STAT_EMPTY"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_DISCONNECTED, "CFGA_STAT_DISCONNECTED"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_CONNECTED, "CFGA_STAT_CONNECTED"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_UNCONFIGURED, "CFGA_STAT_UNCONFIGURED"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_STAT_CONFIGURED, "CFGA_STAT_CONFIGURED"},
70025d765b044c6d8594bb965a2247a61e991a99johnny};
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic int pcidr_cfga_stat_nametab_len =
70025d765b044c6d8594bb965a2247a61e991a99johnny sizeof (pcidr_cfga_stat_nametab) / sizeof (pcidr_cfga_stat_nametab[0]);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnychar *
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_stat_name(cfga_stat_t val)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny int i;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny for (i = 0; i < pcidr_cfga_stat_nametab_len; i++) {
70025d765b044c6d8594bb965a2247a61e991a99johnny if (pcidr_cfga_stat_nametab[i].stat == val)
70025d765b044c6d8594bb965a2247a61e991a99johnny return (pcidr_cfga_stat_nametab[i].name);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny return (NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic struct {
2c2d21e98a95cba5687ec6574c974a5c6c4a6adbRichard Lowe cfga_cmd_t cmd;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *name;
70025d765b044c6d8594bb965a2247a61e991a99johnny} pcidr_cfga_cmd_nametab[] = {
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_NONE, "CFGA_CMD_NONE"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_LOAD, "CFGA_CMD_LOAD"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_UNLOAD, "CFGA_CMD_UNLOAD"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_CONNECT, "CFGA_CMD_CONNECT"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_DISCONNECT, "CFGA_CMD_DISCONNECT"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_CONFIGURE, "CFGA_CMD_CONFIGURE"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_CMD_UNCONFIGURE, "CFGA_CMD_UNCONFIGURE"},
70025d765b044c6d8594bb965a2247a61e991a99johnny};
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic int pcidr_cfga_cmd_nametab_len =
70025d765b044c6d8594bb965a2247a61e991a99johnny sizeof (pcidr_cfga_cmd_nametab) / sizeof (pcidr_cfga_cmd_nametab[0]);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnychar *
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_cmd_name(cfga_cmd_t val)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny int i;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny for (i = 0; i < pcidr_cfga_cmd_nametab_len; i++) {
70025d765b044c6d8594bb965a2247a61e991a99johnny if (pcidr_cfga_cmd_nametab[i].cmd == val)
70025d765b044c6d8594bb965a2247a61e991a99johnny return (pcidr_cfga_cmd_nametab[i].name);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny return (NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic struct {
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_cond_t cond;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *name;
70025d765b044c6d8594bb965a2247a61e991a99johnny} pcidr_cfga_cond_nametab[] = {
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_COND_UNKNOWN, "CFGA_COND_UNKNOWN"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_COND_OK, "CFGA_COND_OK"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_COND_FAILING, "CFGA_COND_FAILING"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_COND_FAILED, "CFGA_COND_FAILED"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_COND_UNUSABLE, "CFGA_COND_UNUSABLE"},
70025d765b044c6d8594bb965a2247a61e991a99johnny};
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic int pcidr_cfga_cond_nametab_len =
70025d765b044c6d8594bb965a2247a61e991a99johnny sizeof (pcidr_cfga_cond_nametab) / sizeof (pcidr_cfga_cond_nametab[0]);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnychar *
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_cond_name(cfga_cond_t val)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny int i;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny for (i = 0; i < pcidr_cfga_cond_nametab_len; i++) {
70025d765b044c6d8594bb965a2247a61e991a99johnny if (pcidr_cfga_cond_nametab[i].cond == val)
70025d765b044c6d8594bb965a2247a61e991a99johnny return (pcidr_cfga_cond_nametab[i].name);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny return (NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic struct {
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_err_t err;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *name;
70025d765b044c6d8594bb965a2247a61e991a99johnny} pcidr_cfga_err_nametab[] = {
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_OK, "CFGA_OK"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_NACK, "CFGA_NACK"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_NOTSUPP, "CFGA_NOTSUPP"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_OPNOTSUPP, "CFGA_OPNOTSUPP"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_PRIV, "CFGA_PRIV"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_BUSY, "CFGA_BUSY"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_SYSTEM_BUSY, "CFGA_SYSTEM_BUSY"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_DATA_ERROR, "CFGA_DATA_ERROR"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_LIB_ERROR, "CFGA_LIB_ERROR"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_NO_LIB, "CFGA_NO_LIB"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_INSUFFICENT_CONDITION, "CFGA_INSUFFICENT_CONDITION"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_INVAL, "CFGA_INVAL"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_ERROR, "CFGA_ERROR"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_APID_NOEXIST, "CFGA_APID_NOEXIST"},
70025d765b044c6d8594bb965a2247a61e991a99johnny {CFGA_ATTR_INVAL, "CFGA_ATTR_INVAL"},
70025d765b044c6d8594bb965a2247a61e991a99johnny};
70025d765b044c6d8594bb965a2247a61e991a99johnnystatic int pcidr_cfga_err_nametab_len =
70025d765b044c6d8594bb965a2247a61e991a99johnny sizeof (pcidr_cfga_err_nametab) / sizeof (pcidr_cfga_err_nametab[0]);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnychar *
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_err_name(cfga_err_t val)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny int i;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny for (i = 0; i < pcidr_cfga_err_nametab_len; i++) {
70025d765b044c6d8594bb965a2247a61e991a99johnny if (pcidr_cfga_err_nametab[i].err == val)
70025d765b044c6d8594bb965a2247a61e991a99johnny return (pcidr_cfga_err_nametab[i].name);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny return (NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnnyvoid
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_print_cfga(dlvl_t lvl, cfga_list_data_t *datap, char *prestr)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny char *str;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny if (prestr == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny prestr = "";
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%slogical APID = %s\n", prestr, datap->ap_log_id);
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sphyiscal APID = %s\n", prestr, datap->ap_phys_id);
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP class = %s\n", prestr, datap->ap_class);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny str = pcidr_cfga_stat_name(datap->ap_r_state);
70025d765b044c6d8594bb965a2247a61e991a99johnny if (str == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny str = "(unrecognized cfga_stat_t value!)";
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP receptacle state = %s\n", prestr, str);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny str = pcidr_cfga_stat_name(datap->ap_o_state);
70025d765b044c6d8594bb965a2247a61e991a99johnny if (str == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny str = "(unrecognized cfga_stat_t value!)";
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP occupant state = %s\n", prestr, str);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny str = pcidr_cfga_cond_name(datap->ap_cond);
70025d765b044c6d8594bb965a2247a61e991a99johnny if (str == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny str = "(unrecognized cfga_cond_t value!)";
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP condition = %s\n", prestr, str);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP busy indicator = %d\n", prestr, datap->ap_busy);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny str = ctime(&datap->ap_status_time);
70025d765b044c6d8594bb965a2247a61e991a99johnny str[strlen(str) - 1] = '\0'; /* get rid of newline */
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP last change time = %ld (%s)\n", prestr,
70025d765b044c6d8594bb965a2247a61e991a99johnny datap->ap_status_time, str);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP info = %s\n", prestr, datap->ap_info);
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(lvl, "%sAP type = %s\n", prestr, datap->ap_type);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * for use with config_admin(3cfgadm) functions in their
70025d765b044c6d8594bb965a2247a61e991a99johnny * <struct cfga_msg *msgp> parameter
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnnyint
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_msg_func(void *datap, const char *msg)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny pcidr_cfga_msg_data_t *dp = (pcidr_cfga_msg_data_t *)datap;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *prestr = dp->prestr;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny if (prestr == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny prestr = "";
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(dp->dlvl, "%s%s", prestr, msg);
70025d765b044c6d8594bb965a2247a61e991a99johnny return (0);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * for use with config_admin(3cfgadm) functions in their
70025d765b044c6d8594bb965a2247a61e991a99johnny * <struct cfga_confirm *confp> parameter
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnny/*ARGSUSED*/
70025d765b044c6d8594bb965a2247a61e991a99johnnyint
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_confirm_func(void *datap, const char *msg)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny return (1);
70025d765b044c6d8594bb965a2247a61e991a99johnny}
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny/*
70025d765b044c6d8594bb965a2247a61e991a99johnny * returns 0 if successful, -1 if unusuccesful, 1 if the AP already had
70025d765b044c6d8594bb965a2247a61e991a99johnny * <cmd> performed on it
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnnyint
70025d765b044c6d8594bb965a2247a61e991a99johnnypcidr_cfga_do_cmd(cfga_cmd_t cmd, cfga_list_data_t *cfga_listp)
70025d765b044c6d8594bb965a2247a61e991a99johnny{
70025d765b044c6d8594bb965a2247a61e991a99johnny char *fn = "pcidr_cfga_do_cmd";
70025d765b044c6d8594bb965a2247a61e991a99johnny int rv, i, j;
70025d765b044c6d8594bb965a2247a61e991a99johnny char *cmdnm, *cfga_errstr, *apid, *str;
70025d765b044c6d8594bb965a2247a61e991a99johnny int cmdarr[2];
70025d765b044c6d8594bb965a2247a61e991a99johnny int cmdarr_len = sizeof (cmdarr) / sizeof (cmdarr[0]);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny struct cfga_msg cfga_msg;
70025d765b044c6d8594bb965a2247a61e991a99johnny pcidr_cfga_msg_data_t cfga_msg_data;
70025d765b044c6d8594bb965a2247a61e991a99johnny struct cfga_confirm cfga_confirm;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_flags_t cfga_flags;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdnm = pcidr_cfga_cmd_name(cmd);
70025d765b044c6d8594bb965a2247a61e991a99johnny assert(cmdnm != NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny apid = cfga_listp->ap_phys_id;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_msg_data.dlvl = DDEBUG;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_msg_data.prestr = "pcidr_cfga_do_cmd(msg): ";
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_msg.message_routine = pcidr_cfga_msg_func;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_msg.appdata_ptr = (void *)&cfga_msg_data;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_confirm.confirm = pcidr_cfga_confirm_func;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_confirm.appdata_ptr = NULL;
70025d765b044c6d8594bb965a2247a61e991a99johnny cfga_flags = CFGA_FLAG_VERBOSE;
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_busy != 0) {
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, "%s: apid = %s is busy\n",
70025d765b044c6d8594bb965a2247a61e991a99johnny fn, cfga_listp->ap_phys_id);
70025d765b044c6d8594bb965a2247a61e991a99johnny return (-1);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny /*
70025d765b044c6d8594bb965a2247a61e991a99johnny * explicitly perform each step that would otherwise be done
70025d765b044c6d8594bb965a2247a61e991a99johnny * implicitly by cfgadm to isolate errors
70025d765b044c6d8594bb965a2247a61e991a99johnny */
70025d765b044c6d8594bb965a2247a61e991a99johnny j = 0;
70025d765b044c6d8594bb965a2247a61e991a99johnny switch (cmd) {
70025d765b044c6d8594bb965a2247a61e991a99johnny case CFGA_CMD_CONFIGURE:
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_o_state < CFGA_STAT_CONNECTED) {
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdarr[j] = CFGA_CMD_CONNECT;
70025d765b044c6d8594bb965a2247a61e991a99johnny j++;
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_o_state < CFGA_STAT_CONFIGURED) {
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdarr[j] = CFGA_CMD_CONFIGURE;
70025d765b044c6d8594bb965a2247a61e991a99johnny j++;
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_o_state >= CFGA_STAT_CONFIGURED)
70025d765b044c6d8594bb965a2247a61e991a99johnny goto ALREADY;
70025d765b044c6d8594bb965a2247a61e991a99johnny break;
70025d765b044c6d8594bb965a2247a61e991a99johnny case CFGA_CMD_DISCONNECT:
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_o_state >= CFGA_STAT_CONFIGURED) {
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdarr[j] = CFGA_CMD_UNCONFIGURE;
70025d765b044c6d8594bb965a2247a61e991a99johnny j++;
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_o_state >= CFGA_STAT_CONNECTED) {
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdarr[j] = CFGA_CMD_DISCONNECT;
70025d765b044c6d8594bb965a2247a61e991a99johnny j++;
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_listp->ap_r_state <= CFGA_STAT_DISCONNECTED)
70025d765b044c6d8594bb965a2247a61e991a99johnny goto ALREADY;
70025d765b044c6d8594bb965a2247a61e991a99johnny break;
70025d765b044c6d8594bb965a2247a61e991a99johnny default:
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, "%s: unsupported cmd %d\n", cmd);
70025d765b044c6d8594bb965a2247a61e991a99johnny return (-1);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny assert(j <= cmdarr_len);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny for (i = 0; i < j; i++) {
70025d765b044c6d8594bb965a2247a61e991a99johnny cmd = cmdarr[i];
70025d765b044c6d8594bb965a2247a61e991a99johnny cmdnm = pcidr_cfga_cmd_name(cmd);
70025d765b044c6d8594bb965a2247a61e991a99johnny assert(cmdnm != NULL);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny rv = config_change_state(cmd, 1, &apid, NULL, &cfga_confirm,
70025d765b044c6d8594bb965a2247a61e991a99johnny &cfga_msg, &cfga_errstr, cfga_flags);
70025d765b044c6d8594bb965a2247a61e991a99johnny if (rv != CFGA_OK) {
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, "%s: command %s failed on apid %s",
70025d765b044c6d8594bb965a2247a61e991a99johnny fn, cmdnm, apid);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny str = pcidr_cfga_err_name(rv);
70025d765b044c6d8594bb965a2247a61e991a99johnny if (str == NULL)
70025d765b044c6d8594bb965a2247a61e991a99johnny str = "unrecognized rv!";
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, ": rv = %d (%s)", rv, str);
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny if (cfga_errstr != NULL) {
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, ", error string = "
70025d765b044c6d8594bb965a2247a61e991a99johnny "\"%s\"", cfga_errstr);
70025d765b044c6d8594bb965a2247a61e991a99johnny free(cfga_errstr);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, "\n");
70025d765b044c6d8594bb965a2247a61e991a99johnny return (-1);
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny }
70025d765b044c6d8594bb965a2247a61e991a99johnny
70025d765b044c6d8594bb965a2247a61e991a99johnny return (0);
70025d765b044c6d8594bb965a2247a61e991a99johnny /*NOTREACHED*/
70025d765b044c6d8594bb965a2247a61e991a99johnnyALREADY:
70025d765b044c6d8594bb965a2247a61e991a99johnny dprint(DDEBUG, "%s: command %s already done on apid %s\n",
70025d765b044c6d8594bb965a2247a61e991a99johnny fn, cmdnm, apid);
70025d765b044c6d8594bb965a2247a61e991a99johnny return (1);
70025d765b044c6d8594bb965a2247a61e991a99johnny}