From 07f4139e70633e4e892b7141fe5f7186eb8c9507 Mon Sep 17 00:00:00 2001 From: Francois Isabelle Date: Tue, 12 Jul 2005 13:19:03 +0000 Subject: [PATCH] added selftest support --- ipmitool/lib/ipmi_mc.c | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/ipmitool/lib/ipmi_mc.c b/ipmitool/lib/ipmi_mc.c index 93691bf..266b13f 100644 --- a/ipmitool/lib/ipmi_mc.c +++ b/ipmitool/lib/ipmi_mc.c @@ -160,6 +160,7 @@ printf_mc_usage(void) printf("MC Commands:\n"); printf(" reset \n"); printf(" info\n"); + printf(" selftest\n"); printf(" getenables\n"); printf(" setenables ...\n"); @@ -434,6 +435,92 @@ ipmi_mc_get_guid(struct ipmi_intf * intf) return 0; } +/* ipmi_mc_get_selftest - returns and print selftest results + * + * @intf: ipmi interface + */ +static int ipmi_mc_get_selftest(struct ipmi_intf * intf) +{ + int rv = 0; + struct ipmi_rs * rsp; + struct ipmi_rq req; + struct ipm_selftest_rsp *sft_res; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_APP; + req.msg.cmd = BMC_GET_SELF_TEST; + req.msg.data_len = 0; + + rsp = intf->sendrecv(intf, &req); + if (!rsp) { + lprintf(LOG_ERR, "No response from devices\n"); + return -1; + } + if (rsp->ccode) { + lprintf(LOG_ERR, "Bad response: (%s)", + val2str(rsp->ccode, completion_code_vals)); + return -1; + } + + sft_res = (struct ipm_selftest_rsp *) rsp->data; + + if (sft_res->code == IPM_SFT_CODE_OK) { + printf("Selftest: passed\n"); + rv = 0; + } + + else if (sft_res->code == IPM_SFT_CODE_NOT_IMPLEMENTED) { + printf("Selftest: not implemented\n"); + rv = -1; + } + + else if (sft_res->code == IPM_SFT_CODE_DEV_CORRUPTED) { + printf("Selftest: device corrupted\n"); + rv = -1; + + if (sft_res->test & IPM_SELFTEST_SEL_ERROR) { + printf(" -> SEL device not accessible\n"); + } + if (sft_res->test & IPM_SELFTEST_SDR_ERROR) { + printf(" -> SDR repository not accesible\n"); + } + if (sft_res->test & IPM_SELFTEST_FRU_ERROR) { + printf("FRU device not accessible\n"); + } + if (sft_res->test & IPM_SELFTEST_IPMB_ERROR) { + printf("IPMB signal lines do not respond\n"); + } + if (sft_res->test & IPM_SELFTEST_SDRR_EMPTY) { + printf("SDR repository empty\n"); + } + if (sft_res->test & IPM_SELFTEST_INTERNAL_USE) { + printf("Internal Use Area corrupted\n"); + } + if (sft_res->test & IPM_SELFTEST_FW_BOOTBLOCK) { + printf("Controller update boot block corrupted\n"); + } + if (sft_res->test & IPM_SELFTEST_FW_CORRUPTED) { + printf("controller operational firmware corrupted\n"); + } + } + else if (sft_res->code == IPM_SFT_CODE_FATAL_ERROR) { + printf("Selftest : fatal error\n"); + printf("Failure code : %02x\n", sft_res->test); + rv = -1; + } + else if (sft_res->code == IPM_SFT_CODE_RESERVED) { + printf("Selftest: N/A"); + rv = -1; + } + else { + printf("Selttest : device specific\n"); + printf("Failure code : %02x\n", sft_res->test); + rv = 0; + } + + return rv; +} + /* ipmi_mc_main - top-level handler for MC functions * * @intf: ipmi interface @@ -477,6 +564,9 @@ ipmi_mc_main(struct ipmi_intf * intf, int argc, char ** argv) else if (strncmp(argv[0], "setenables", 10) == 0) { rc = ipmi_mc_set_enables(intf, argc-1, &(argv[1])); } + else if (!strncmp(argv[0], "selftest", 8)) { + rc = ipmi_mc_get_selftest(intf); + } return rc; }