display_sun4v.c revision a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64da
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <kvm.h>
#include <varargs.h>
#include <time.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/openpromio.h>
#include <libintl.h>
#include <syslog.h>
#include <sys/systeminfo.h>
#include <picldefs.h>
#include <math.h>
#include <errno.h>
#include "pdevinfo.h"
#include "display.h"
#include "display_sun4v.h"
#include "libprtdiag.h"
#if !defined(TEXT_DOMAIN)
#define TEXT_DOMAIN "SYS_TEST"
#endif
#define MOTHERBOARD "MB"
#define NETWORK "network"
#define PCIE_COMPATIBLE_STR "pciex"
#define PCIX_COMPATIBLE_STR "pci"
#define SUN4V_MACHINE "sun4v"
#define PARENT_NAMES 10
/*
* Additional OBP properties
*/
#define OBP_PROP_COMPATIBLE "compatible"
#define OBP_PROP_MODEL "model"
#define OBP_PROP_SLOT_NAMES "slot-names"
#define PICL_NODE_PHYSICAL_PLATFORM "physical-platform"
#define PICL_NODE_CHASSIS "chassis"
#define MEMORY_SIZE_FIELD 11
#define INVALID_THRESHOLD 1000000
/*
* Additional picl classes
*/
#ifndef PICL_CLASS_SUN4V
#define PICL_CLASS_SUN4V "sun4v"
#endif
#ifndef PICL_PROP_NAC
#define PICL_PROP_NAC "nac"
#endif
extern int sys_clk;
picl_nodehdl_t *);
static picl_nodehdl_t chassish = 0;
static int class_node_found;
static int syserrlog;
static int all_status_ok;
/* local functions */
static int sun4v_get_first_compatible_value(picl_nodehdl_t, char **);
static void sun4v_display_memory_conf(picl_nodehdl_t);
static void sun4v_disp_env_status();
static void sun4v_env_print_fan_sensors();
static void sun4v_env_print_fan_indicators();
static void sun4v_env_print_temp_sensors();
static void sun4v_env_print_temp_indicators();
static void sun4v_env_print_current_sensors();
static void sun4v_env_print_current_indicators();
static void sun4v_env_print_voltage_sensors();
static void sun4v_env_print_voltage_indicators();
static void sun4v_env_print_LEDs();
static void sun4v_print_fru_status();
static void sun4v_print_fw_rev();
static void sun4v_print_chassis_serial_no();
int
{
void *value; /* used for opaque PROM data */
return (1);
return (1);
/*
* Now display the machine's configuration. We do this if we
* are not logging.
*/
if (!logging) {
/*
* Display system banner
*/
/* display system clock frequency */
"frequency: %d MHz\n"), sys_clk, 0);
}
/* Display the Memory Size */
/* Display the CPU devices */
/* Display the Memory configuration */
class_node_found = 0;
/* Display all the IO cards. */
(void) sun4v_display_pci(plafh);
return (1);
&phyplatformh) != PICL_SUCCESS)
return (1);
PICL_PTYPE_CHARSTRING, (void *)PICL_CLASS_CHASSIS,
return (1);
}
return (0);
}
static void
{
char *compatible;
== PICL_SUCCESS) {
strlen(PCIE_COMPATIBLE_STR)) == 0)
}
}
static picl_errno_t
{
char val[PICL_PROPNAMELEN_MAX];
sizeof (val));
if (err != PICL_SUCCESS)
return (err);
return (PICL_SUCCESS);
}
static void
{
int i;
return;
err = PICL_SUCCESS;
while (err == PICL_SUCCESS) {
sizeof (pnodeh)) != PICL_SUCCESS) {
return;
}
break;
}
}
sizeof (uaddr)) != PICL_SUCCESS) {
return;
}
if (!pval) {
return;
}
return;
}
dev_mask = 0;
for (i = 0; i < sizeof (dev_mask); i++)
if (uaddr[i] == ',') {
uaddr[i] = '\0';
break;
}
}
} else {
int count = 0; /* count # of 1's in x */
int i = 0;
while (x != 0) {
count++;
x &= x-1;
}
while (count > 1) {
while (p[i++] != '\0')
;
count--;
}
}
}
/*
* add all io devices under pci in io list
*/
/* ARGSUSED */
static int
{
char path[PICL_PROPNAMELEN_MAX];
char class[PICL_CLASSNAMELEN_MAX];
char name[PICL_PROPNAMELEN_MAX];
char model[PICL_PROPNAMELEN_MAX];
char binding_name[PICL_PROPNAMELEN_MAX];
char val[PICL_PROPNAMELEN_MAX];
char *compatible;
/* Walk through the children */
sizeof (picl_nodehdl_t));
while (err == PICL_SUCCESS) {
if (err != PICL_SUCCESS)
return (err);
if (args) {
sizeof (picl_nodehdl_t));
continue;
sizeof (picl_nodehdl_t));
continue;
sizeof (picl_nodehdl_t));
continue;
}
}
if (err != PICL_SUCCESS)
return (err);
sizeof (name));
if (err == PICL_PROPNOTFOUND)
else if (err != PICL_SUCCESS)
return (err);
sizeof (val));
if (err == PICL_PROPNOTFOUND)
else if (err != PICL_SUCCESS)
return (err);
/* Figure NAC name */
else
/*
* Get the name of this card. If binding_name is found,
* name will be <nodename>-<binding_name>.
*/
binding_name, sizeof (binding_name));
if (err == PICL_SUCCESS) {
sizeof (name));
}
} else if (err == PICL_PROPNOTFOUND) {
/*
* if compatible prop is not found, name will be
* <nodename>-<compatible>
*/
&compatible);
if (err == PICL_SUCCESS) {
sizeof (name));
}
} else
return (err);
/* Get the model of this card */
if (err == PICL_PROPNOTFOUND)
else if (err != PICL_SUCCESS)
return (err);
/* Print NAC name */
/* Print IO Type */
/* Printf Card Name */
/* Print Card Model */
log_printf("\n");
/* Print Status */
/* Print IO Type */
/* Print Parent Path */
log_printf("\n");
sizeof (picl_nodehdl_t));
}
return (PICL_WALK_CONTINUE);
}
/*
* display_pci
* Display all the PCI IO cards on this board.
*/
void
{
char *fmt = "%-17s %-5s %-44s %-8s";
/* Have we printed the column headings? */
log_printf("\n");
log_printf("================================");
log_printf(" IO Devices ");
log_printf("================================");
log_printf("\n");
log_printf("\n");
log_printf("\n");
log_printf("---------------------------------"
"-------------------------------------------\n");
}
}
/*
* return the first compatible value
*/
static int
{
char *pval;
if (err != PICL_SUCCESS)
return (err);
return (PICL_FAILURE);
if (err != PICL_SUCCESS) {
return (err);
}
return (PICL_SUCCESS);
}
return (PICL_FAILURE);
/* get first string from table */
if (err != PICL_SUCCESS)
return (err);
if (err != PICL_SUCCESS)
return (err);
if (err != PICL_SUCCESS)
return (err);
return (PICL_FAILURE);
if (err != PICL_SUCCESS) {
return (err);
}
return (PICL_SUCCESS);
}
/*
* print size of a memory segment
*/
static void
{
char buf[MEMORY_SIZE_FIELD];
else
else
} else {
else
}
}
/*
* Enumerate banks and dimms within a memory segment. We're handed
* the first bank within the segment - we assume there are dimms
* (memory-module) nodes underneath.
*/
static void
{
char val[PICL_PROPNAMELEN_MAX];
int flag = 0;
do {
continue;
do {
continue;
else {
if (!flag) {
flag = 1;
} else
}
&module_nodeh, sizeof (picl_nodehdl_t)) ==
}
/*
* Search node where _class=="memory-segment"
* print "Base Address", "Size", etc
*/
/*ARGSUSED*/
static int
{
if (class_node_found == 0) {
class_node_found = 1;
return (PICL_WALK_TERMINATE);
}
while (err == PICL_SUCCESS) {
if (err != PICL_SUCCESS)
break;
if (err != PICL_SUCCESS)
break;
sizeof (ifactor));
if (err != PICL_SUCCESS)
break;
if (err == PICL_SUCCESS)
log_printf("\n");
sizeof (picl_nodehdl_t));
}
return (PICL_WALK_CONTINUE);
}
/*ARGSUSED*/
void
{
char *fmt = "%-12s %-7s %-9s %-20s";
if (class_node_found == 0)
return;
log_printf("\n");
log_printf("============================");
log_printf(" Memory Configuration ");
log_printf("============================");
log_printf("\n");
log_printf("Segment Table:\n");
"---------------------------------------------------------\n");
"Contains", 0);
log_printf("\n");
"---------------------------------------------------------\n");
}
void
{
char *fmt = "%-12s %-5s %-8s %-19s %-5s";
/*
* Display the table header for CPUs . Then display the CPU
* frequency, cache size, and processor revision of all cpus.
*/
"\n"
"========================="
" CPUs "
"==============================================="
"\n"
"\n"));
log_printf("\n");
"Implementation", "Mask", 0);
log_printf("\n");
"-------------------", "-----", 0);
log_printf("\n");
}
/*
* Display the CPUs present on this board.
*/
/*ARGSUSED*/
int
{
int status;
int *int_value;
char *comp_value;
char *no_prop_value = " ";
/*
* Get cpuid property and print it and the NAC name
*/
if (status == PICL_SUCCESS) {
if (status != PICL_SUCCESS) {
} else {
CPU_STRAND_NAC, (int)cpuid);
}
} else {
}
&proph);
if (status == PICL_SUCCESS) {
goto compatible;
}
if (status != PICL_SUCCESS) {
} else {
/* Running frequency */
}
} else
&proph);
if (status == PICL_SUCCESS) {
/*
* Compatible Property only has 1 value
*/
if (comp_value == NULL) {
goto mask;
}
if (status != PICL_SUCCESS)
else
/*
* Compatible Property has multiple values
*/
if (status != PICL_SUCCESS) {
goto mask;
}
if (status != PICL_SUCCESS) {
goto mask;
}
if (status != PICL_SUCCESS) {
goto mask;
}
if (comp_value == NULL) {
goto mask;
}
if (status != PICL_SUCCESS)
else
}
} else
mask:
if (status == PICL_SUCCESS) {
if (status != PICL_SUCCESS) {
} else {
}
} else
done:
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
void
{
#ifdef lint
#endif
/*
* This function is intentionally empty
*/
}
void
display_boardnum(int num)
{
}
static void
{
if (phyplatformh == 0)
return;
log_printf("\n");
log_printf("============================");
log_printf(" Environmental Status ");
log_printf("============================");
log_printf("\n");
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
class_node_found = 0;
all_status_ok = 1;
class_node_found = 0;
}
/*ARGSUSED*/
static int
{
char val[PICL_PROPNAMELEN_MAX];
char *names[PARENT_NAMES];
char *base_units[PICL_PROPNAMELEN_MAX];
char *loc;
int i;
char *prop;
double display_val;
if (class_node_found == 0) {
class_node_found = 1;
return (PICL_WALK_TERMINATE);
}
if (!prop) {
all_status_ok = 0;
} else {
sizeof (val));
if (err == PICL_SUCCESS) {
}
}
}
if (sensor_status != SENSOR_DISABLED &&
sensor_status != SENSOR_UNKNOWN) {
sizeof (current_val)) != PICL_SUCCESS) {
}
if ((lo_shutdown != INVALID_THRESHOLD &&
current_val <= lo_shutdown) ||
(hi_shutdown != INVALID_THRESHOLD &&
current_val >= hi_shutdown)) {
} else if ((lo_warning != INVALID_THRESHOLD &&
current_val <= lo_warning) ||
(hi_warning != INVALID_THRESHOLD &&
current_val >= hi_warning)) {
} else {
}
}
if (syserrlog == 0) {
all_status_ok = 0;
return (PICL_WALK_TERMINATE);
}
if (sensor_status == SENSOR_OK) {
return (PICL_WALK_CONTINUE);
}
}
/*
* If we're here then prtdiag was invoked with "-v" or we have
* a sensor that is beyond a threshold, so give them a book to
* read instead of the Cliff Notes.
*/
sizeof (parenth));
if (err != PICL_SUCCESS) {
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
/* gather up the path name for the sensor */
for (i = 0; i < PARENT_NAMES; i++) {
NULL) {
while (--i > -1)
}
}
}
i = 0;
if (loc != 0) {
while (err == PICL_SUCCESS) {
if (parenth == phyplatformh)
break;
names[i++], PICL_PROPNAMELEN_MAX);
if (err != PICL_SUCCESS) {
i--;
break;
}
if (i == PARENT_NAMES)
break;
}
loc[0] = '\0';
if (--i > -1) {
}
while (--i > -1) {
}
for (i = 0; i < PARENT_NAMES; i++)
} else {
}
sizeof (val));
if (err == PICL_SUCCESS)
/*
* Get the exponent if present, and do a little math so that
* if we need to we can print a normalized value for the
* sensor reading.
*/
exponent = 0;
if (exponent == 0)
display_val = (double)current_val;
else
display_val = (double)current_val *
base_units, sizeof (base_units));
if (err != PICL_SUCCESS)
base_units[0] = '\0';
switch (sensor_status) {
case SENSOR_FAILED:
break;
case SENSOR_WARN:
break;
case SENSOR_DISABLED:
break;
case SENSOR_OK:
break;
default:
break;
}
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
/*ARGSUSED*/
static int
{
char current_val[PICL_PROPNAMELEN_MAX];
char expected_val[PICL_PROPNAMELEN_MAX];
char label[PICL_PROPNAMELEN_MAX];
char *names[PARENT_NAMES];
char *loc;
int i = 0;
if (class_node_found == 0) {
class_node_found = 1;
return (PICL_WALK_TERMINATE);
}
if (!prop) {
all_status_ok = 0;
} else {
sizeof (current_val));
if (err == PICL_SUCCESS) {
}
}
}
if (sensor_status != SENSOR_DISABLED &&
sensor_status != SENSOR_UNKNOWN) {
sizeof (current_val)) != PICL_SUCCESS) {
sizeof (current_val));
} else {
&expected_val, sizeof (expected_val)) !=
PICL_SUCCESS) {
} else {
sizeof (current_val)) == 0) {
} else {
}
}
}
}
if (syserrlog == 0) {
all_status_ok = 0;
return (PICL_WALK_TERMINATE);
}
if (sensor_status == SENSOR_OK) {
return (PICL_WALK_CONTINUE);
}
}
/*
* If we're here then prtdiag was invoked with "-v" or we have
* a sensor that is beyond a threshold, so give them a book to
* read instead of the Cliff Notes.
*/
sizeof (parenth));
if (err != PICL_SUCCESS) {
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
for (i = 0; i < PARENT_NAMES; i++) {
NULL) {
while (--i > -1)
}
}
}
i = 0;
if (loc) {
while (err == PICL_SUCCESS) {
if (parenth == phyplatformh)
break;
names[i++], PICL_PROPNAMELEN_MAX);
if (err != PICL_SUCCESS) {
i--;
break;
}
if (i == PARENT_NAMES)
break;
}
loc[0] = '\0';
if (--i > -1) {
}
while (--i > -1) {
}
for (i = 0; i < PARENT_NAMES; i++)
} else {
}
sizeof (label));
if (err != PICL_SUCCESS)
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
static void
{
char *fmt = "%-30s %-14s %-10s\n";
/*
* If there isn't any fan sensor node, return now.
*/
(void) picl_walk_tree_by_class(phyplatformh,
PICL_CLASS_RPM_SENSOR, (void *)PICL_PROP_SPEED,
if (!class_node_found)
return;
log_printf("Fan sensors:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All fan sensors are OK.\n");
return;
}
}
log_printf("----------------------------------------------------\n");
log_printf("----------------------------------------------------\n");
}
static void
{
char *fmt = "%-30s %-14s %-10s\n";
(void) picl_walk_tree_by_class(phyplatformh,
PICL_CLASS_RPM_INDICATOR, (void *)PICL_PROP_CONDITION,
if (!class_node_found)
return;
log_printf("\nFan indicators:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
if (all_status_ok) {
log_printf("All fan indicators are OK.\n");
return;
}
}
log_printf("-------------------------------------------------------\n");
log_printf("-------------------------------------------------------\n");
}
static void
{
char *fmt = "%-30s %-14s %-10s\n";
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_TEMPERATURE,
if (!class_node_found)
return;
log_printf("\nTemperature sensors:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All temperature sensors are OK.\n");
return;
}
}
log_printf("----------------------------------------------------\n");
log_printf("----------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
}
static void
{
char *fmt = "%-30s %-14s %-8s\n";
(void) picl_walk_tree_by_class(phyplatformh,
if (!class_node_found)
return;
log_printf("\nTemperature indicators:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
if (all_status_ok) {
log_printf("All temperature indicators are OK.\n");
return;
}
}
log_printf("-------------------------------------------------\n");
log_printf("-------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
}
static void
{
char *fmt = "%-30s %-14s %-10s\n";
(void *)PICL_PROP_CURRENT, sun4v_env_print_sensor_callback);
if (!class_node_found)
return;
log_printf("\nCurrent sensors:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All current sensors are OK.\n");
return;
}
}
log_printf("----------------------------------------------------\n");
log_printf("----------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
PICL_CLASS_CURRENT_SENSOR, (void *)PICL_PROP_CURRENT,
}
static void
{
char *fmt = "%-30s %-14s %-8s\n";
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
if (!class_node_found)
return;
log_printf("\nCurrent indicators:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All current indicators are OK.\n");
return;
}
}
log_printf("-------------------------------------------------------\n");
log_printf("-------------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
}
static void
{
char *fmt = "%-30s %-14s %-10s\n";
(void) picl_walk_tree_by_class(phyplatformh,
if (!class_node_found)
return;
log_printf("\nVoltage sensors:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All voltage sensors are OK.\n");
return;
}
}
log_printf("----------------------------------------------------\n");
log_printf("----------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_VOLTAGE,
}
static void
{
char *fmt = "%-30s %-14s %-8s\n";
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
if (!class_node_found)
return;
log_printf("\nVoltage indicators:\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All voltage indicators are OK.\n");
return;
}
}
log_printf("-------------------------------------------------------\n");
log_printf("-------------------------------------------------------\n");
(void) picl_walk_tree_by_class(phyplatformh,
(void *)PICL_PROP_CONDITION,
}
static void
{
char *fmt = "%-30s %-14s %-8s\n";
if (syserrlog == 0)
return;
if (!class_node_found)
return;
log_printf("\nLEDs:\n");
log_printf("---------------------------------------------------\n");
log_printf("---------------------------------------------------\n");
}
/*ARGSUSED*/
static int
{
char label[PICL_PROPNAMELEN_MAX];
char status[PICL_PROPNAMELEN_MAX];
char *names[PARENT_NAMES];
char *loc;
int i;
if (!class_node_found) {
class_node_found = 1;
return (PICL_WALK_TERMINATE);
}
if (err != PICL_SUCCESS)
return (PICL_WALK_CONTINUE);
sizeof (label));
if (err != PICL_SUCCESS)
return (PICL_WALK_CONTINUE);
if (err != PICL_SUCCESS)
return (PICL_WALK_CONTINUE);
if (syserrlog == 0) {
if (all_status_ok) {
all_status_ok = 0;
return (PICL_WALK_TERMINATE);
}
} else
return (PICL_WALK_CONTINUE);
}
sizeof (parenth));
if (err != PICL_SUCCESS) {
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
return (PICL_WALK_TERMINATE);
for (i = 0; i < PARENT_NAMES; i++)
while (--i > -1)
return (PICL_WALK_TERMINATE);
}
i = 0;
while (err == PICL_SUCCESS) {
if (parenth == phyplatformh)
break;
names[i++], PICL_PROPNAMELEN_MAX);
if (err != PICL_SUCCESS) {
i--;
break;
}
if (i == PARENT_NAMES)
break;
}
loc[0] = '\0';
if (--i > -1) {
}
while (--i > -1) {
}
for (i = 0; i < PARENT_NAMES; i++)
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
static void
{
char *fmt = "%-30s %-9s %-8s\n";
if (!class_node_found)
return;
log_printf("\n");
log_printf("============================");
log_printf(" FRU Status ");
log_printf("============================");
log_printf("\n");
if (syserrlog == 0) {
(void) picl_walk_tree_by_class(phyplatformh,
if (all_status_ok) {
log_printf("All FRUs are enabled.\n");
return;
}
}
log_printf("--------------------------------------------------\n");
}
/*ARGSUSED*/
static int
{
char label[PICL_PROPNAMELEN_MAX];
char rev[PICL_PROPNAMELEN_MAX];
if (!class_node_found) {
class_node_found = 1;
return (PICL_WALK_TERMINATE);
}
sizeof (label));
if (err != PICL_SUCCESS)
return (PICL_WALK_CONTINUE);
sizeof (rev));
if (err != PICL_SUCCESS)
return (PICL_WALK_CONTINUE);
return (PICL_WALK_CONTINUE);
log_printf("\n");
return (PICL_WALK_CONTINUE);
}
static void
{
char *fmt = "%-20s %-10s\n";
if (syserrlog == 0)
return;
if (!class_node_found)
return;
log_printf("\n");
log_printf("============================");
log_printf(" FW Version ");
log_printf("============================");
log_printf("\n");
log_printf("----------------------------\n");
}
static void
{
char val[PICL_PROPNAMELEN_MAX];
return;
log_printf("\n");
log_printf("Chassis Serial Number");
log_printf("\n");
log_printf("---------------------\n");
if (err == PICL_SUCCESS)
log_printf("\n");
}