3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER START
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The contents of this file are subject to the terms of the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Common Development and Distribution License, Version 1.0 only
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (the "License"). You may not use this file except in compliance
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * with the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * or http://www.opensolaris.org/os/licensing.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * See the License for the specific language governing permissions
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and limitations under the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * When distributing Covered Code, include this CDDL HEADER in each
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If applicable, add the following below this CDDL HEADER, with the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * fields enclosed by brackets "[]" replaced with your own identifying
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * information: Portions Copyright [yyyy] [name of copyright owner]
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER END
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Use is subject to license terms.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#pragma ident "%Z%%M% %I% %E% SMI"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stddef.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <locale.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <ctype.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdio.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdlib.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <string.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <fcntl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <unistd.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <errno.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <locale.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <langinfo.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <time.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <stdarg.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/types.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/ioctl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/dditypes.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/modctl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/obpdefs.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/fhc.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysctrl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/openpromio.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef SIM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/stat.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CFGA_PLUGIN_LIB
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <config_admin.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef DEBUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG1 printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG3 printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG4 printf
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG(a, b)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG1(a)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG3(a, b, c)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DBG4(a, b, c, d)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_CPU 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_MEM 2
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_IO_2SBUS 3
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_IO_SBUS_FFB 4
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_IO_PCI 5
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_DISK 6
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_IO_2SBUS_SOCPLUS 7
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_IO_SBUS_FFB_SOCPLUS 8
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BD_UNKNOWN 9
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_GETSTAT 10
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_LIST 11
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_CONNECT 12
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_DISCONNECT 13
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_CONFIGURE 14
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_UNCONFIGURE 15
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_QUIESCE 16
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_INSERT 17
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_REMOVE 18
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define CMD_SET_COND 19
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_ENABLE 20
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define OPT_DISABLE 21
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_PROM_OPEN 22
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_PROM_GETPROP 23
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_PROM_SETPROP 24
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_TRANS 25
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_CMD_INVAL 26
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_OPT_INVAL 27
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_AP_INVAL 28
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ERR_DISABLED 29
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_FORCE 30
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_TRANS_OK 31
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_FAILED 32
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_WAS_ENABLED 33
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_WAS_DISABLED 34
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_WILL_ENABLE 35
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DIAG_WILL_DISABLE 36
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_HEADER 37
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_QUIESCE 38
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_INSERT 39
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_REMOVE 40
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_SET_COND 41
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_ENABLE 42
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_DISABLE 43
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define HELP_UNKNOWN 44
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ASK_CONNECT 45
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define STR_BD 46
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define STR_COL 47
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define COND_UNKNOWN 48
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define COND_OK 49
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define COND_FAILING 50
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define COND_FAILED 51
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define COND_UNUSABLE 52
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_COOLING 53
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_POWER 54
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_PRECHARGE 55
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_INTRANS 56
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_UTHREAD 57
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_KTHREAD 58
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_DEV_ATTACH 59
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_DEV_DETACH 60
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_NDI_ATTACH 61
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_NDI_DETACH 62
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_CORE_RESOURCE 63
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_OSTATE 64
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_RSTATE 65
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_COND 66
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_PROM 67
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_NOMEM 68
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_HOTPLUG 69
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_HW_COMPAT 70
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_NON_DR_PROM 71
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_SUSPEND 72
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_RESUME 73
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_UNKNOWN 74
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define SYSC_DEVSTR 75
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The string table contains all the strings used by the platform
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * library. The comment next to each string specifies whether the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * string should be internationalized (y) or not (n).
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Note that there are calls to dgettext() with strings other than
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the ones below, they are marked by the li18 symbol.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_strs[] = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* */ NULL,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "cpu/mem ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "mem ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "dual-sbus ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "sbus-upa ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "dual-pci ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "disk ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "soc+sbus ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "soc+upa ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "unknown ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "get-status",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "list",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "connect",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "disconnect",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "configure",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "unconfigure",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "quiesce-test",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "insert-test",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "remove-test",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "set-condition-test",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "enable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "disable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "prom open",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "prom getprop",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "prom setprop",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid transition",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid command: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid option: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid attachment point: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "board is disabled: must override with ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "[-f][-o enable-at-boot]",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "transition succeeded but ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ " failed: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "was already enabled at boot time",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "was already disabled at boot time",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "will be enabled at boot time",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "will be disabled at boot time",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "\nSysctrl specific commands/options:",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-x quiesce-test ap_id [ap_id...]",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-x insert-test ap_id [ap_id...]",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-x remove-test ap_id [ap_id...]",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-x set-condition-test=<condition>",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-o enable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "\t-o disable-at-boot",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "\tunknown command or option: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "system will be temporarily suspended to connect a board: proceed",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "board ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ ": ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "unknown",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "ok",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "failing",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "failed",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* n */ "unusable",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "not enough cooling for a new board",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "not enough power for a new board",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "not enough precharge power for a new board",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "configuration operation already in progress on this board",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "could not suspend user process: ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "could not suspend system processes",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "device did not attach",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "device did not detach",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "nexus error during attach",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "nexus error during detach",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "attempt to remove core system resource",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid occupant state",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "invalid receptacle state",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "insufficient condition",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "firmware operation error",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "not enough memory",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "hotplug feature unavailable on this machine",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "board does not support dynamic reconfiguration",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "firmware does not support dynamic reconfiguration",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "system suspend error",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "system resume error",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* y */ "unknown system error",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* */ NULL
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define cfga_str(i) cfga_strs[(i)]
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define cfga_eid(a, b) (((a) << 8) + (b))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Translation table for mapping from an <errno,sysc_err>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * pair to an error string.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_COOLING, EAGAIN, SYSC_ERR_COOLING
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_POWER, EAGAIN, SYSC_ERR_POWER
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_PRECHARGE, EAGAIN, SYSC_ERR_PRECHARGE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_INTRANS, EBUSY, SYSC_ERR_INTRANS
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_KTHREAD, EBUSY, SYSC_ERR_KTHREAD
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_DEV_ATTACH, EBUSY, SYSC_ERR_NDI_ATTACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_DEV_DETACH, EBUSY, SYSC_ERR_NDI_DETACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NDI_ATTACH, EFAULT, SYSC_ERR_NDI_ATTACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NDI_DETACH, EFAULT, SYSC_ERR_NDI_DETACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_CORE_RESOURCE, EINVAL, SYSC_ERR_CORE_RESOURCE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_OSTATE, EINVAL, SYSC_ERR_OSTATE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_RSTATE, EINVAL, SYSC_ERR_RSTATE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_COND, EINVAL, SYSC_ERR_COND
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_PROM, EIO, SYSC_ERR_PROM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NOMEM, ENOMEM, SYSC_ERR_DR_INIT
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NOMEM, ENOMEM, SYSC_ERR_NDI_ATTACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NOMEM, ENOMEM, SYSC_ERR_NDI_DETACH
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_HOTPLUG, ENOTSUP, SYSC_ERR_HOTPLUG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_HW_COMPAT, ENOTSUP, SYSC_ERR_HW_COMPAT
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_NON_DR_PROM, ENOTSUP, SYSC_ERR_NON_DR_PROM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_SUSPEND, ENXIO, SYSC_ERR_SUSPEND
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_RESUME, ENXIO, SYSC_ERR_RESUME
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * SYSC_UTHREAD, ESRCH, SYSC_ERR_UTHREAD
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_sid(int err, int scerr)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (scerr == SYSC_ERR_DEFAULT)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_UNKNOWN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cfga_eid(err, scerr)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EAGAIN, SYSC_ERR_COOLING):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_COOLING);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EAGAIN, SYSC_ERR_POWER):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_POWER);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EAGAIN, SYSC_ERR_PRECHARGE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_PRECHARGE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EBUSY, SYSC_ERR_INTRANS):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_INTRANS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EBUSY, SYSC_ERR_KTHREAD):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_KTHREAD);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EBUSY, SYSC_ERR_NDI_ATTACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_DEV_ATTACH);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EBUSY, SYSC_ERR_NDI_DETACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_DEV_DETACH);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EFAULT, SYSC_ERR_NDI_ATTACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NDI_ATTACH);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EFAULT, SYSC_ERR_NDI_DETACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NDI_DETACH);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EINVAL, SYSC_ERR_CORE_RESOURCE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_CORE_RESOURCE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EINVAL, SYSC_ERR_OSTATE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_OSTATE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EINVAL, SYSC_ERR_RSTATE):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_RSTATE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EINVAL, SYSC_ERR_COND):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_COND);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(EIO, SYSC_ERR_PROM):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_PROM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOMEM, SYSC_ERR_DR_INIT):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NOMEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOMEM, SYSC_ERR_NDI_ATTACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NOMEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOMEM, SYSC_ERR_NDI_DETACH):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NOMEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOTSUP, SYSC_ERR_HOTPLUG):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_HOTPLUG);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOTSUP, SYSC_ERR_HW_COMPAT):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_HW_COMPAT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENOTSUP, SYSC_ERR_NON_DR_PROM):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_NON_DR_PROM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENXIO, SYSC_ERR_SUSPEND):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_SUSPEND);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ENXIO, SYSC_ERR_RESUME):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_RESUME);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case cfga_eid(ESRCH, SYSC_ERR_UTHREAD):
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_UTHREAD);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (SYSC_UNKNOWN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsysc_cmd_init(sysc_cfga_cmd_t *sc, char *outputstr, int force)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc->force = force;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc->outputstr = outputstr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc->errtype = SYSC_ERR_DEFAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) memset((void *)outputstr, 0, sizeof (outputstr));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_str(SYSC_DEVSTR) = outputstr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cfga_err() accepts a variable number of message IDs and constructs
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * a corresponding error string which is returned via the errstring argument.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cfga_err() calls dgettext() to internationalize proper messages.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err(sysc_cfga_cmd_t *sc, char **errstring, ...)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int a;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int flen;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *q;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *s[32];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *failed;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_list ap;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char syserr_num[20];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If errstring is null it means user in not interested in getting
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * error status. So we don't do all the work
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_start(ap, errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel failed = dgettext(TEXT_DOMAIN, cfga_str(DIAG_FAILED));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel flen = strlen(failed);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (n = len = 0; (a = va_arg(ap, int)) != 0; n++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (a) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_PROM_OPEN:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_PROM_GETPROP:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_PROM_SETPROP:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_GETSTAT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_LIST:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_CONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_DISCONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_QUIESCE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_INSERT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_REMOVE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CMD_SET_COND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = cfga_str(a);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += (strlen(p) + flen);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[++n] = failed;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", failed);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case OPT_ENABLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case OPT_DISABLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = dgettext(TEXT_DOMAIN, cfga_str(DIAG_TRANS_OK));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel q = cfga_str(a);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += (strlen(p) + strlen(q) + flen);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[++n] = q;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[++n] = failed;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", q);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", failed);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_CMD_INVAL:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_AP_INVAL:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_OPT_INVAL:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = dgettext(TEXT_DOMAIN, cfga_str(a));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel q = va_arg(ap, char *);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += (strlen(p) + strlen(q));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[++n] = q;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", q);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_TRANS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ERR_DISABLED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = dgettext(TEXT_DOMAIN, cfga_str(a));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DIAG_FORCE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = cfga_str(a);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%s>", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG1("\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_end(ap);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errno) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sc)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel i = cfga_sid(errno, (int)sc->errtype);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel i = SYSC_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG4("cfga_sid(%d,%d)=%d\n", errno, sc->errtype, i);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (i == SYSC_UNKNOWN) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = strerror(errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (p == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) sprintf(syserr_num, "errno=%d", errno);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = syserr_num;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = dgettext(TEXT_DOMAIN, cfga_str(i));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n++] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = cfga_str(SYSC_DEVSTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (p && p[0]) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel q = cfga_str(STR_COL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(q);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n++] = q;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n++] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((p = (char *)calloc(len, 1)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < n; i++)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(p, s[i]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef SIM_MSG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel printf("%s\n", *errstring);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * This routine accepts a variable number of message IDs and constructs
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * a corresponding error string which is printed via the message print routine
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * argument. The HELP_UNKNOWN message ID has an argument string (the unknown
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * help topic) that follows.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_msg(struct cfga_msg *msgp, ...)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int a;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *s[32];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_list ap;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_start(ap, msgp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (n = len = 0; (a = va_arg(ap, int)) != 0; n++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("<%d>", a);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = dgettext(TEXT_DOMAIN, cfga_str(a));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (a == HELP_UNKNOWN) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = va_arg(ap, char *);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len += strlen(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s[++n] = p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel va_end(ap);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((p = (char *)calloc(len + 1, 1)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < n; i++)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(p, s[i]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcat(p, "\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef SIM_MSG
3db86aab554edbb4244c8d1a1c90f152eee768afstevel printf("%s", p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*msgp->message_routine)(msgp->appdata_ptr, p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free(p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic sysc_cfga_stat_t *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsysc_stat(const char *ap_id, int *fdp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static sysc_cfga_stat_t sc_list[MAX_BOARDS];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((fd = open(ap_id, O_RDWR, 0)) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (ioctl(fd, SYSC_CFGA_CMD_GETSTATUS, sc_list) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (fdp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *fdp = fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (sc_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * This code implementes the simulation of the ioctls that transition state.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The GETSTAT ioctl is not simulated. In this way a snapshot of the system
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * state is read and manipulated by the simulation routines. It is basically
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * a useful debugging tool.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef SIM
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int sim_idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int sim_fd = -1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int sim_size = MAX_BOARDS * sizeof (sysc_cfga_stat_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic sysc_cfga_stat_t sim_sc_list[MAX_BOARDS];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic sysc_cfga_stat_t *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsim_sysc_stat(const char *ap_id, int *fdp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct stat buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sim_fd != -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (sim_sc_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sim_fd = open("/tmp/cfga_simdata", O_RDWR|O_CREAT)) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_open");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (fstat(sim_fd, &buf) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_stat");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (buf.st_size) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (buf.st_size != sim_size) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_size");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (read(sim_fd, sim_sc_list, sim_size) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_read");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if ((fd = open(ap_id, O_RDWR, 0)) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (ioctl(fd, SYSC_CFGA_CMD_GETSTATUS, sim_sc_list) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (fdp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *fdp = fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (sim_sc_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsim_open(char *a, int b, int c)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel printf("sim_open(%s)\n", a);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(a, "/dev/openprom") == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (open(a, b, c));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsim_close(int a) { return (0); }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsim_ioctl(int fd, int cmd, void *a)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel printf("sim_ioctl(%d)\n", sim_idx);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_CONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sim_sc_list[sim_idx].rstate = SYSC_CFGA_RSTATE_CONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sim_sc_list[sim_idx].ostate = SYSC_CFGA_OSTATE_CONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sim_sc_list[sim_idx].ostate = SYSC_CFGA_OSTATE_UNCONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_DISCONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sim_sc_list[sim_idx].rstate = SYSC_CFGA_RSTATE_DISCONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_QUIESCE_TEST:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_CMD_TEST:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case OPROMGETOPT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ioctl(fd, OPROMGETOPT, a));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case OPROMSETOPT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ioctl(fd, OPROMSETOPT, a));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (lseek(sim_fd, SEEK_SET, 0) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_seek");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (write(sim_fd, sim_sc_list, sim_size) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel perror("sim_write");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel exit(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define open(a, b, c) sim_open((char *)(a), (int)(b), (int)(c))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define close(a) sim_close(a)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ioctl(a, b, c) sim_ioctl((int)(a), (int)(b), (void *)(c))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define sysc_stat(a, b) sim_sysc_stat(a, b)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif /* SIM */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *promdev = "/dev/openprom";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *dlprop = "disabled-board-list";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define BUFSIZE 128
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afsteveltypedef union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char buf[BUFSIZE];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct openpromio opp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel} oppbuf_t;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelprom_get_prop(int prom_fd, char *var, char **val)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static oppbuf_t oppbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct openpromio *opp = &(oppbuf.opp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strncpy(opp->oprom_array, var, OBP_MAXPROPNAME);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opp->oprom_array[OBP_MAXPROPNAME + 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opp->oprom_size = BUFSIZE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG3("getprop(%s, %d)\n", opp->oprom_array, opp->oprom_size);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ioctl(prom_fd, OPROMGETOPT, opp) < 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ERR_PROM_GETPROP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (opp->oprom_size > 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *val = opp->oprom_array;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *val = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelprom_set_prop(int prom_fd, char *var, char *val)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel oppbuf_t oppbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct openpromio *opp = &(oppbuf.opp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int varlen = strlen(var) + 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int vallen = strlen(val);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("prom_set_prop(%s)\n", val);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcpy(opp->oprom_array, var);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcpy(opp->oprom_array + varlen, val);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opp->oprom_size = varlen + vallen;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ioctl(prom_fd, OPROMSETOPT, opp) < 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ERR_PROM_SETPROP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldlist_find(int board, char **dlist, int *disabled)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int prom_fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *dl;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char b[2];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((prom_fd = open(promdev, O_RDWR, 0)) < 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ERR_PROM_OPEN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (err = prom_get_prop(prom_fd, dlprop, dlist)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(prom_fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (err);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(prom_fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel b[1] = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *disabled = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((dl = *dlist) != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len = strlen(dl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < len; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int bd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel b[0] = dl[i];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bd = strtol(b, &p, 16);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (p != b && bd == board)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*disabled)++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldlist_update(int board, int disable, char *dlist, struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i, j, n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int found;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int update;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int prom_fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char b[2];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char ndlist[64];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel b[1] = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ndlist[0] = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel j = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel found = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel update = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((prom_fd = open(promdev, O_RDWR, 0)) < 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ERR_PROM_OPEN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (dlist) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len = strlen(dlist);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < len; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int bd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel b[0] = dlist[i];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bd = strtol(b, &p, 16);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (p != b && bd == board) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel found++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disable) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, STR_BD,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DIAG_WAS_DISABLED, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, STR_BD,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DIAG_WILL_ENABLE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel update++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ndlist[j++] = dlist[i];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ndlist[j] = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!found)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disable) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, STR_BD, DIAG_WILL_DISABLE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p = &ndlist[j];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n = sprintf(p, "%x", board);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel p[n] = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel update++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, STR_BD, DIAG_WAS_ENABLED, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (update)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = prom_set_prop(prom_fd, dlprop, ndlist);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(prom_fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (err);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelap_idx(const char *ap_id)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int id;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *s;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static char *slot = "slot";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG("ap_idx(%s)\n", ap_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((s = strstr(ap_id, slot)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int n;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel s += strlen(slot);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel n = strlen(s);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG3("ap_idx: s=%s, n=%d\n", s, n);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (n) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case 2:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!isdigit(s[1]))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* FALLTHROUGH */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case 1:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!isdigit(s[0]))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((id = atoi(s)) > MAX_BOARDS)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DBG3("ap_idx(%s)=%d\n", s, id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_change_state(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_cmd_t state_change_cmd,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_confirm *confp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int force;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int verbose;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int opterr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disable;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disabled;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t rc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_stat_t *ss;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_cmd_t *sc, sysc_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_rstate_t rs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_ostate_t os;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *dlist;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[SYSC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(options, cfga_str(OPT_DISABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(OPT_ENABLE))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_OPT_INVAL, options, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((idx = ap_idx(ap_id)) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_AP_INVAL, ap_id, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if ((ss = sysc_stat(ap_id, &fd)) == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_GETSTAT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef SIM
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sim_idx = idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * We disallow connecting on the disabled list unless
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * either the FORCE flag or the enable-at-boot option
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * is set. The check is made further below
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opterr = dlist_find(idx, &dlist, &disabled)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel force = flags & CFGA_FLAG_FORCE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rs = ss[idx].rstate;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel os = ss[idx].ostate;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc = &sysc_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cmd_init(sc, outputstr, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel verbose = flags & CFGA_FLAG_VERBOSE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (state_change_cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_CONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rs != SYSC_CFGA_RSTATE_DISCONNECTED)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_TRANS, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (disabled && !(force || (options && !disable)))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_CONNECT,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ERR_DISABLED, DIAG_FORCE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (!(*confp->confirm)(confp->appdata_ptr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_str(ASK_CONNECT))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_NACK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (ioctl(fd, SYSC_CFGA_CMD_CONNECT, sc) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_CONNECT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (options && (opterr = dlist_update(idx, disable,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dlist, msgp, verbose))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_DISCONNECT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((os == SYSC_CFGA_OSTATE_CONFIGURED) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (ioctl(fd, SYSC_CFGA_CMD_UNCONFIGURE, sc) == -1)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_UNCONFIGURE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cmd_init(sc, outputstr, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rs == SYSC_CFGA_RSTATE_CONNECTED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ioctl(fd, SYSC_CFGA_CMD_DISCONNECT, sc) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_DISCONNECT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (options && (opterr = dlist_update(idx, disable,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dlist, msgp, verbose))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_TRANS, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_CONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rs == SYSC_CFGA_RSTATE_DISCONNECTED)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disabled && !(force || (options && !disable))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_CONFIGURE,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ERR_DISABLED, DIAG_FORCE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (!(*confp->confirm)(confp->appdata_ptr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_str(ASK_CONNECT))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_NACK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (ioctl(fd, SYSC_CFGA_CMD_CONNECT, sc) == -1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_CONNECT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_ERROR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cmd_init(sc, outputstr, force);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (os == SYSC_CFGA_OSTATE_UNCONFIGURED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ioctl(fd, SYSC_CFGA_CMD_CONFIGURE, sc) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_CONFIGURE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (options && (opterr = dlist_update(idx,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable, dlist, msgp, verbose))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_TRANS, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CFGA_CMD_UNCONFIGURE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (os != SYSC_CFGA_OSTATE_CONFIGURED)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_TRANS, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (ioctl(fd, SYSC_CFGA_CMD_UNCONFIGURE, sc) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(sc, errstring, CMD_UNCONFIGURE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (options && (opterr = dlist_update(idx, disable,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dlist, msgp, verbose))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OPNOTSUPP;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstr2cond(const char *cond)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int c;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(cond, cfga_str(COND_UNKNOWN)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = SYSC_CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(cond, cfga_str(COND_OK)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = SYSC_CFGA_COND_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(cond, cfga_str(COND_FAILING)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = SYSC_CFGA_COND_FAILING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(cond, cfga_str(COND_FAILED)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = SYSC_CFGA_COND_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(cond, cfga_str(COND_UNUSABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = SYSC_CFGA_COND_UNUSABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel c = -1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (c);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_private_func(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *function,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_confirm *confp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int fd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int cond;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int opterr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int verbose;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disable;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disabled;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t rc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *str;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *dlist;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char outputstr[SYSC_OUTPUT_LEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_cmd_t *sc, sysc_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel verbose = flags & CFGA_FLAG_VERBOSE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(options, cfga_str(OPT_DISABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(OPT_ENABLE))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_OPT_INVAL, options, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc = &sysc_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str = cfga_str(CMD_SET_COND);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel len = strlen(str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((strncmp(function, str, len) == 0) && (function[len++] == '=') &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((cond = (str2cond(&function[len]))) != -1)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd = SYSC_CFGA_CMD_TEST_SET_COND;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = CMD_SET_COND;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sc->arg = cond;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (strcmp(function, cfga_str(CMD_QUIESCE)) == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd = SYSC_CFGA_CMD_QUIESCE_TEST;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = CMD_QUIESCE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (strcmp(function, cfga_str(CMD_INSERT)) == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd = SYSC_CFGA_CMD_TEST;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = CMD_INSERT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (strcmp(function, cfga_str(CMD_REMOVE)) == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmd = SYSC_CFGA_CMD_TEST;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = CMD_REMOVE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_CMD_INVAL, (char *)function, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cmd_init(sc, outputstr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((idx = ap_idx(ap_id)) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_AP_INVAL, ap_id, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (((fd = open(ap_id, O_RDWR, 0)) == -1) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (ioctl(fd, cmd, sc) == -1))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opterr = (dlist_find(idx, &dlist, &disabled) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dlist_update(idx, disable, dlist, msgp, verbose));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (opterr) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (verbose)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) close(fd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_test(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_msg *msgp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OPNOTSUPP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_stat_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrstate_cvt(sysc_cfga_rstate_t rs)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_t cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (rs) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_EMPTY:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_EMPTY;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_DISCONNECTED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_DISCONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_RSTATE_CONNECTED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_CONNECTED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_stat_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelostate_cvt(sysc_cfga_ostate_t os)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_t cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (os) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_OSTATE_UNCONFIGURED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_UNCONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_OSTATE_CONFIGURED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_CONFIGURED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs = CFGA_STAT_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cs);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic cfga_cond_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcond_cvt(sysc_cfga_cond_t sc)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_cond_t cc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (sc) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_OK:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_FAILING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_FAILING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_FAILED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_UNUSABLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_UNUSABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case SYSC_CFGA_COND_UNKNOWN:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cc = CFGA_COND_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (cc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afsteveltype_str(enum board_type type)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *type_str;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (type) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case MEM_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_MEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CPU_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_CPU);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_2SBUS_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_IO_2SBUS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_SBUS_FFB_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_IO_SBUS_FFB);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_PCI_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_IO_PCI);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DISK_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_DISK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_2SBUS_SOCPLUS_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_IO_2SBUS_SOCPLUS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_SBUS_FFB_SOCPLUS_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_IO_SBUS_FFB_SOCPLUS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case UNKNOWN_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel type_str = cfga_str(BD_UNKNOWN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (type_str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelinfo_set(sysc_cfga_stat_t *sc, cfga_info_t info, int disabled)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cpu_info *cpu;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel union bd_un *bd = &sc->bd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *info = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (sc->type) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case CPU_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0, cpu = bd->cpu; i < 2; i++, cpu++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (cpu->cpu_speed > 1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "cpu %d: ", i);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "%3d MHz ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cpu->cpu_speed);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (cpu->cache_size)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "%0.1fM ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (float)cpu->cache_size /
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (float)(1024 * 1024));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case IO_SBUS_FFB_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (bd->io2.ffb_size) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case FFB_SINGLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "single buffered ffb ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case FFB_DOUBLE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "double buffered ffb ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case FFB_NOT_FOUND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#ifdef FFB_DR_SUPPORT
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "no ffb installed ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#endif
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "illegal ffb size ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DISK_BOARD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < 2; i++)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (bd->dsk.disk_pres[i])
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "target: %2d ",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bd->dsk.disk_id[i]);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "no disk ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (disabled)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "disabled at boot ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sc->no_detach)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "non-detachable ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sc->plus_board)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info += sprintf(info, "100 MHz capable ");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsysc_cvt(sysc_cfga_stat_t *sc, cfga_stat_data_t *cs, int disabled)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strcpy(cs->ap_type, type_str(sc->type));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_r_state = rstate_cvt(sc->rstate);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_o_state = ostate_cvt(sc->ostate);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_cond = cond_cvt(sc->condition);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_busy = (cfga_busy_t)sc->in_transition;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_status_time = sc->last_change;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel info_set(sc, cs->ap_info, disabled);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_log_id[0] = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cs->ap_phys_id[0] = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_list(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_data_t **ap_list,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *nlist,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t rc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_stat_t *sc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_stat_data_t *cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ap_idx(ap_id) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_AP_INVAL, ap_id, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if ((sc = sysc_stat(ap_id, NULL)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_LIST, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (!(cs = (cfga_stat_data_t *)malloc(MAX_BOARDS * sizeof (*cs))))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_LIST, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *ap_list = cs;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (*nlist = 0, i = 0; i < MAX_BOARDS; i++, sc++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sc->board == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cvt(sc, cs++, 0); /* XXX - disable */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*nlist)++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_stat(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *ap_id,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel struct cfga_stat_data *cs,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *options,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char **errstring)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err_t rc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int idx;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int opterr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disable;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int disabled;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *dlist;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cfga_stat_t *sc;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (errstring != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *errstring = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_ERROR;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options && options[0]) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(options, cfga_str(OPT_DISABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel disable++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(OPT_ENABLE))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_OPT_INVAL, options, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((idx = ap_idx(ap_id)) == -1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, ERR_AP_INVAL, ap_id, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if ((sc = sysc_stat(ap_id, NULL)) == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, CMD_GETSTAT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel opterr = dlist_find(idx, &dlist, &disabled);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sysc_cvt(sc + idx, cs, disabled);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rc = CFGA_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options && options[0] && ((opterr != 0) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((opterr = dlist_update(idx, disable, dlist, NULL, 0))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel != 0))) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = disable ? OPT_DISABLE : OPT_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_err(NULL, errstring, err, opterr, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (rc);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_err_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcfga_help(struct cfga_msg *msgp, const char *options, cfga_flags_t flags)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int help = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (options) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(options, cfga_str(OPT_DISABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_DISABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(OPT_ENABLE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_ENABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(CMD_INSERT)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_INSERT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(CMD_REMOVE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_REMOVE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else if (strcmp(options, cfga_str(CMD_QUIESCE)) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_QUIESCE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel help = HELP_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (help) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (help == HELP_UNKNOWN)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, help, options, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, help, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_HEADER, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_DISABLE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_ENABLE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_INSERT, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_REMOVE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_QUIESCE, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cfga_msg(msgp, HELP_SET_COND, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (CFGA_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cfga_ap_id_cmp -- use default_ap_id_cmp() in libcfgadm
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */