diff options
Diffstat (limited to 'util/ialarms.c')
-rw-r--r-- | util/ialarms.c | 689 |
1 files changed, 689 insertions, 0 deletions
diff --git a/util/ialarms.c b/util/ialarms.c new file mode 100644 index 0000000..dbbdf0c --- /dev/null +++ b/util/ialarms.c @@ -0,0 +1,689 @@ +/* + * ialarms.c + * + * This tool reads and sets the alarms panel on an Intel Telco chassis. + * Note that the Intel Server Management software will set these alarms + * based on firmware-detected thresholds and events. + * + * Author: Andy Cress arcress at users.sourceforge.net + * Copyright (c) 2003-2006 Intel Corporation. + * Copyright (c) 2009 Kontron America, Inc. + * + * 02/25/03 Andy Cress - created + * 04/08/03 Andy Cress - added -i for ChassisIdentify + * 04/30/03 Andy Cress - only try to set ID on/off if option specified + * 01/20/04 Andy Cress - mods for mBMC w Chesnee platform + * 05/05/04 Andy Cress - call ipmi_close before exit + * 10/11/04 Andy Cress 1.4 - if -o set relays too (fsetall) + * 11/01/04 Andy Cress 1.5 - add -N / -R for remote nodes + * 03/07/05 Andy Cress 1.6 - add bus for Intel TIGI2U + * 03/28/05 Andy Cress 1.7 - add check for BMC TAM if setting alarms + * 06/22/05 Andy Cress 1.8 - adding fpicmg for ATCA alarm LEDs + * 03/17/06 Andy Cress 1.9 - adding BUS_ID7 for Harbison + * 04/20/07 Andy Cress 1.25 - adding disk Enclosure HSC LEDs + */ +/*M* +Copyright (c) 2003-2006, Intel Corporation +Copyright (c) 2009 Kontron America, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a.. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b.. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + c.. Neither the name of Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *M*/ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#ifdef WIN32 +#include "getopt.h" +#elif defined(DOS) +#include <dos.h> +#include "getopt.h" +#elif defined(HPUX) +/* getopt is defined in stdio.h */ +#elif defined(MACOS) +/* getopt is defined in unistd.h */ +#include <unistd.h> +#else +#include <getopt.h> +#endif +#include "ipmicmd.h" +#include "oem_intel.h" + +/* + * Global variables + */ +static char * progver = "2.93"; +static char * progname = "ialarms"; +static char fdebug = 0; +static char fbmctam = 0; +static char fpicmg = 0; +static char fHasAlarms = 0; +static char fNSC = 0; +static char fHasEnc = 0; /* Has disk Enclosure HSC? */ +static int maxdisks = 6; /* default to max of 6 disks */ +static uchar fdoencl = 1; +static uchar picmg_id = 0; /* always 0 for picmg */ +static uchar fru_id = 0; /* fru device id */ +//static uchar led_id = 0; /* 0 = blue led, 1,2,3=led1,2,3 */ +static uchar ipmi_maj, ipmi_min; + +#define ENC_LED_WRITE 0x21 // only used for Ballenger-CT HSC +#define ENC_LED_READ 0x20 // only used for Ballenger-CT HSC + +#define NETFN_ENC 0x30 +#define NETFN_PICMG 0x2c +#define PICMG_GET_LED_PROPERTIES 0x05 +#define PICMG_SET_LED_STATE 0x07 +#define PICMG_GET_LED_STATE 0x08 + +#ifdef METACOMMAND +extern int get_alarms_fujitsu(uchar *rgalarms); +extern int show_alarms_fujitsu(uchar *rgalarms); +extern int set_alarms_fujitsu(uchar num, uchar val); +extern int get_led_status_intel(uchar *pstate); +#endif +#ifdef ALONE +extern int get_led_status_intel(uchar *pstate); +#endif + +static uchar busid = PRIVATE_BUS_ID; +static uchar enc_sa = HSC_SA; +static char fRomley = 0; + +static int get_enc_leds(uchar *val) +{ + uchar idata[16]; + uchar rdata[16]; + int rlen, i; + int rv = 0; + uchar cc; + char *pstr = NULL; + rlen = sizeof(rdata); + for (i = 0; i < 3; i++) { + rv = ipmi_cmdraw( ENC_LED_READ, NETFN_ENC, enc_sa, PUBLIC_BUS,BMC_LUN, + idata,0, rdata, &rlen, &cc, fdebug); + if (fdebug) + printf("get_enc_leds() rv=%d cc=%x val=%02x\n",rv,cc,rdata[0]); + if (rv == 0 && cc == 0x83) os_usleep(0,50000); /* HSC busy, wait 50ms */ + else break; + } + if (rv != 0) pstr = decode_rv(rv); + else if (cc != 0) pstr = decode_cc(0,cc); + /* if get cc==0x83 here, the power state may be soft-off */ + if (rv == 0 && cc != 0) rv = cc; + if (rv == 0) { /*success*/ + *val = rdata[0]; + } else /*error*/ + printf("get_enc_leds: error %s\n",pstr); + return(rv); +} + +static int set_enc_leds(uchar val) +{ + uchar idata[16]; + uchar rdata[16]; + int rlen; + int rv = 0; + uchar cc; + + idata[0] = val; + rlen = sizeof(rdata); + rv = ipmi_cmdraw( ENC_LED_WRITE, NETFN_ENC, enc_sa, PUBLIC_BUS,BMC_LUN, + idata,1, rdata, &rlen, &cc, fdebug); + if (fdebug) printf("set_enc_leds(%02x) rv = %d, cc = %x\n",val,rv,cc); + if (rv == 0 && cc != 0) rv = cc; + return(rv); +} + +static void show_enc_leds(uchar val) +{ + char *enc_pattn = "disk slot %d LED: %s\n"; + uchar mask; + int i, n; + if (fdebug) printf("val = %02x\n",val); + n = maxdisks; + if (n > 8) n = 8; + mask = 0x01; + /* Ballenger HSC only supports 6 slots, some support 8 */ + for (i = 0; i < n; i++) { + if (val & mask) printf(enc_pattn,i,"ON"); + else printf(enc_pattn,i,"off"); + mask = (mask << 1); + } +} + +static int set_chassis_id(uchar val) +{ + uchar inputData[4]; + uchar responseData[16]; + int responseLength = 4; + uchar completionCode; + int ret; + uchar ilen; + + ilen = 1; + inputData[0] = val; /* #seconds to turn on id, 0=turn off */ + /* IPMI 2.0 has an optional 2nd byte, + * if 01, turn ID on indefinitely. */ + if (val == 255 && ipmi_maj >= 2) { + inputData[1] = 1; + ilen = 2; + } + /* CHASSIS_IDENTIFY=0x04, using NETFN_CHAS (=00) */ + ret = ipmi_cmd(CHASSIS_IDENTIFY, inputData, ilen, responseData, + &responseLength, &completionCode, fdebug); + if (ret == 0 && completionCode != 0) ret = completionCode; + if (ret != 0) { + printf("set_chassis_id: ret = %d, ccode %02x, value = %02x\n", + ret, completionCode, val); + } + return(ret); +} /*end set_chassis_id*/ + + +static int get_alarms_picmg(uchar *rgv, uchar picmgid, uchar fruid, uchar led) +{ + uchar inputData[4]; + uchar responseData[16]; + int responseLength; + uchar completionCode; + int ret, i; + + if (rgv == NULL) return(ERR_BAD_PARAM); + inputData[0] = picmgid; + inputData[1] = fruid; + inputData[2] = led; // 0 = blue led + responseLength = sizeof(responseData); + ret = ipmi_cmdraw( PICMG_GET_LED_STATE, NETFN_PICMG, + BMC_SA, PUBLIC_BUS,BMC_LUN, + inputData,3, responseData, &responseLength, + &completionCode, fdebug); + if ((ret != 0) || (completionCode != 0)) { + if (fdebug) + printf("get_alarms_picmg(%d,%d,%d): ret = %d, ccode %02x\n", + picmgid,fruid,led,ret, completionCode); + if (ret == 0) ret = completionCode; + return(ret); + } + /* if here, success */ + if (fdebug) { + printf("get_alarms_picmg(%d,%d,%d): ", picmgid,fruid,led); + for (i = 0; i < responseLength; i++) + printf("%02x ",responseData[i]); + printf("\n"); + } + memcpy(rgv,responseData,responseLength); + return(ret); +} + +static int set_alarms_picmg(uchar val, uchar picmgid, uchar fruid, uchar led, + char color) +{ + uchar inputData[6]; + uchar responseData[16]; + int responseLength; + uchar completionCode; + int ret, i; + + inputData[0] = picmgid; + inputData[1] = fruid; + inputData[2] = led; // 0 = blue led + inputData[3] = val; + inputData[4] = 0; + switch(color) { + case 'w': i = 6; break; + case 'o': i = 5; break; + case 'a': i = 4; break; + case 'g': i = 3; break; + case 'r': i = 2; break; + case 'b': + default: i = 1; break; + } + inputData[5] = (uchar)i; // 1 = blue + responseLength = sizeof(responseData); + ret = ipmi_cmdraw( PICMG_SET_LED_STATE, NETFN_PICMG, + BMC_SA, PUBLIC_BUS,BMC_LUN, + inputData,6, responseData, &responseLength, + &completionCode, fdebug); + if ((ret != 0) || (completionCode != 0)) { + printf("set_alarms_picmg(%02x,%d,%d,%d): ret = %d, ccode %02x\n", + val,picmgid,fruid,led,ret, completionCode); + if (ret == 0) ret = completionCode; + return(ret); + } + printf("set_alarms_picmg(%02x,%d,%d,%d): ", val,picmgid,fruid,led); + for (i = 0; i < responseLength; i++) + printf("%02x ",responseData[i]); + printf("\n"); + return(ret); /* success */ +} + +static void show_alarms_picmg(uchar *v, uchar pid, uchar fruid, uchar led) +{ + char led_str[10]; + char state_str[20]; + char *func_str; + char *color_str; + if (v == NULL) return; + if (fdebug) + printf("picmg(%d,%d,%d) alarm LED state is %02x %02x %02x %02x %02x\n", + pid,fruid,led,v[0],v[1],v[2],v[3],v[4]); + switch(led) { + case 0: strcpy(led_str,"HSLed"); break; /*Blue LED*/ + default: sprintf(led_str," Led%d",led); break; + } + state_str[0] = 0; + if (v[1] & 0x01) strcat(state_str,"local"); + if (v[1] & 0x02) strcat(state_str," override"); + if (v[1] & 0x04) strcat(state_str," lamptest"); + switch(v[2]) { + case 0x00: func_str = "off"; break; + case 0xFF: func_str = "ON"; break; + default: func_str = "Blink"; break; /*duration of blink/off*/ + } + /* v[3] is duration of blink/on in tens of msec */ + switch(v[4]) { + case 6: color_str = "white"; break; + case 5: color_str = "orange"; break; + case 4: color_str = "amber"; break; + case 3: color_str = "green"; break; + case 2: color_str = "red"; break; + case 1: + default: color_str = "blue"; break; + } + printf("picmg(%d,%d) %s is %s,%s,%s\n",fruid,led,led_str, + state_str,func_str,color_str); +} + + +#ifdef METACOMMAND +int i_alarms(int argc, char **argv) +#else +#ifdef WIN32 +int __cdecl +#else +int +#endif +main(int argc, char **argv) +#endif +{ + int ret = 0; + int c; + uchar fsetled = 0; + uchar fsetall = 0; + uchar fsetdisk = 0; + uchar fsetid = 0; + uchar fcrit = 2; + uchar fmaj = 2; + uchar fmin = 2; + uchar fpow = 2; + uchar fdiska = 2; + uchar fdiskb = 2; + uchar fdiskn = 2; + uchar ndisk = 0; + int fid = 0; + uchar alarms = 0; + uchar rgalarms[10] = {0,0,0,0,0,0}; + uchar newvalue = 0xff; + uchar diskled = 0xff; + uchar encled = 0; + uchar devrec[16]; + uchar ledn = 0; + uchar ledv = 0; + char ledc = 'c'; + int i; + int flags = 0; + int prod_id, vend_id; + + printf("%s ver %s\n", progname,progver); + /* default to admin privilege if get/set alarms remotely */ + parse_lan_options('V',"4",0); + + while ( (c = getopt( argc, argv,"rxa:b:c:d:efm:n:p:i:ow:Z:EF:P:N:R:U:T:V:J:Y?")) != EOF ) + switch(c) { + case 'r': fsetled=0; fsetid=0; fsetdisk = 0; break; /* read only */ + case 'a': fdiska = atob(optarg); /* set disk A LED value */ + fsetdisk = 1; break; + case 'b': fdiskb = atob(optarg); /* set disk B LED value */ + fsetdisk = 2; break; + case 'c': fcrit = atob(optarg); /* set critical alarm value */ + fsetled = 1; break; + case 'd': ndisk = optarg[0] & 0x0f; /* set disk N LED on or off */ + fdiskn = optarg[1] & 0x0f; + fsetdisk = 3; break; + case 'e': fdoencl = 0; /* skip disk/enclosure LEDs */ + case 'f': fdiska = 10; /* set all disk LEDs off */ + fsetdisk = 1; break; + case 'm': fmaj = atob(optarg); /* set major alarm value */ + fsetled = 1; break; + case 'n': fmin = atob(optarg); /* set minor alarm value */ + fsetled = 1; break; + case 'p': fpow = atob(optarg); /* set power alarm value */ + fsetled = 1; break; + case 'w': ledn = optarg[0] & 0x0f; /* set picmg LED N on or off */ + ledv = optarg[1] & 0x0f; + ledc = optarg[2]; /*color char, usu 'b' for blue*/ + fsetled = 1; break; + case 'i': fid = atoi(optarg); /* set chassis id on/off */ + if (fid > 255) { + printf("Adjusting %d to max 255 sec for ID\n",fid); + fid = 255; + } + fsetid=1; break; + case 'o': fcrit=0; fmaj=0; fmin=0; fpow=0; /* set all alarms off */ + fsetdisk = 1; fdiska = 0; fdiskb = 0; fsetall=1; + fsetled = 1; fsetid=1; fid=0; break; + case 'x': fdebug = 1; break; /* debug messages */ + case 'N': /* nodename */ + case 'U': /* remote username */ + case 'P': /* remote password */ + case 'R': /* remote password */ + case 'E': /* get password from IPMI_PASSWORD environment var */ + case 'F': /* force driver type */ + case 'T': /* auth type */ + case 'J': /* cipher suite */ + case 'V': /* priv level */ + case 'Y': /* prompt for remote password */ + case 'Z': /* set local MC address */ + parse_lan_options(c,optarg,fdebug); + break; + default: + printf("Usage: %s [-abcdfimnoprx -NUPRETVFY]\n", progname); + printf(" where -r means read-only\n"); + printf(" -i5 sets Chassis ID on for 5 sec\n"); + printf(" -i0 sets Chassis ID off\n"); + printf(" -a1 sets Disk A Fault on\n"); + printf(" -a0 sets Disk A Fault off\n"); + printf(" -b1 sets Disk B Fault on\n"); + printf(" -b0 sets Disk B Fault off\n"); + printf(" -c1 sets Critical Alarm on\n"); + printf(" -c0 sets Critical Alarm off\n"); + printf(" -d31 sets Disk 3 Fault on (disks 0-6)\n"); + printf(" -d30 sets Disk 3 Fault off\n"); + printf(" -e skip disk Enclosure LEDs\n"); + printf(" -f sets all Disk Fault LEDs off\n"); + printf(" -m1 sets Major Alarm on\n"); + printf(" -m0 sets Major Alarm off\n"); + printf(" -n1 sets Minor Alarm on\n"); + printf(" -n0 sets Minor Alarm off\n"); + printf(" -p1 sets Power Alarm on\n"); + printf(" -p0 sets Power Alarm off\n"); + printf(" -o sets all Alarms off\n"); + printf(" -w21b writes picmg LED 2 on(1) color=blue(b)\n"); + printf(" -x show eXtra debug messages\n"); + print_lan_opt_usage(); + ret = ERR_USAGE; + goto do_exit; + } + + /* + * Check the Device ID to determine which bus id to use. + */ + ret = ipmi_getdeviceid(devrec,16,fdebug); + if (ret != 0) { + goto do_exit; + } else { + int j; + + if (fdebug) { + printf("devid: "); + for (j = 0; j < 16; j++) printf("%02x ",devrec[j]); + printf("\n"); + } + ipmi_maj = devrec[4] & 0x0f; + ipmi_min = devrec[4] >> 4; + prod_id = devrec[9] + (devrec[10] << 8); + vend_id = devrec[6] + (devrec[7] << 8) + (devrec[8] << 16); + + printf("-- %s version %x.%x, IPMI version %d.%d \n", + "BMC", devrec[2], devrec[3], ipmi_maj, ipmi_min); + } + +#ifdef TEST_ENC + fHasEnc = 1; + fHasAlarms = 0; + fbmctam = 0; + fpicmg = 0; + fRomley = 1; + maxdisks = 8; +#else + ret = ipmi_getpicmg(devrec,16,fdebug); + if (ret == 0) { + fpicmg = 1; + fHasAlarms = 1; + } else ret = 0; /* ignore error if not picmg */ + +#if defined(METACOMMAND) || defined(ALONE) + { + uchar rgalarms[3]; + uchar idstate; + char *pmsg; + switch(vend_id) { + case VENDOR_NSC: /* for Intel TIGPT1U */ + case VENDOR_INTEL: /* requires oem_intel.c */ + /* check_prod_capab */ + ret = detect_capab_intel(vend_id,prod_id,&flags,&maxdisks,fdebug); + busid = (uchar)ret; + if (fdebug) printf("prod_capab: busid=%x, flags=%02x\n",busid,flags); + if ((flags & HAS_ALARMS_MASK) != 0) fHasAlarms = 1; + if ((flags & HAS_BMCTAM_MASK) != 0) fbmctam = 1; + if ((flags & HAS_ENCL_MASK) != 0) fHasEnc = 1; + if ((flags & HAS_PICMG_MASK) != 0) fpicmg = 1; + if ((flags & HAS_NSC_MASK) != 0) fNSC = 1; + if ((flags & HAS_ROMLEY_MASK) != 0) fRomley = 1; + /* get ID LED status */ + ret = get_led_status_intel(&idstate); + if (ret == 0) { + switch(idstate) { + case 1: pmsg = "ON"; break; + case 2: pmsg = "Blink"; break; + default: pmsg = "off"; break; + } + printf("ID LED: %s\n",pmsg); + } + break; +#ifdef METACOMMAND + case VENDOR_KONTRON: + if (prod_id == 1590) { fHasEnc = 1; maxdisks = 8; } + break; + case VENDOR_FUJITSU: + printf("Getting Fujitsu alarm LEDs ...\n"); + ret = get_alarms_fujitsu(rgalarms); + if (fdebug) printf("get_alarms_fujitsu ret = %d\n",ret); + /* if ret != 0, fall through and try default methods */ + if (ret == 0) { + show_alarms_fujitsu(rgalarms); + if (fsetid) { + printf("\nSetting fujitsu ID LED to %02x ...\n", fid); + ret = set_alarms_fujitsu(0, (uchar)fid); + printf("set_alarms_fujitsu ret = %d\n",ret); + ret = get_alarms_fujitsu(rgalarms); + if (ret == 0) show_alarms_fujitsu(rgalarms); + } + fHasAlarms = 0; /*skip the other LED functions*/ + } + break; + case VENDOR_SUN: + printf("Do get_alarms_sun() \n"); // TODO: add this +/* + ret = get_alarms_sun(); + if (ret == 0) show_alarms_sun() + if (fsetled) { + printf("\nSetting sun(%d) alarm LED to %02x %c...\n", + ledn,ledv,ledc); + ret = set_alarms_sun(ledv,ledn,ledc); + printf("set_alarms_sun ret = %d\n",ret); + ret = get_alarms_sun(rgalarms,ledn); + if (ret == 0) show_alarms_sun(rgalarms,ledn); + } +*/ + break; +#endif + default: + break; + } + } +#endif + +#endif + if (fHasAlarms) + { /* get the telco picmg or intel alarm LED states */ + if (fpicmg) { + for (i = 0; i < 5; i++) { + ret = get_alarms_picmg(rgalarms,picmg_id,fru_id,(uchar)i); + if (ret == 0) + show_alarms_picmg(rgalarms,picmg_id,fru_id,(uchar)i); + } + } else { + alarms = get_alarms_intel(busid); + if (alarms == 0) { /* failed to get alarm panel data */ + if (fHasAlarms) { /* baseboard which may have Telco alarm panel*/ + printf("Could not obtain Telco LED states, Telco alarm panel " + "may not be present.\n\n"); + } + fHasAlarms = 0; + } else { /* have Telco alarm panel data */ + ret = 0; + show_alarms_intel(alarms); + } + } + + if (fsetled) { + if (fpicmg) { + printf("\nSetting picmg(%d,%d) alarm LED to %02x %c...\n", + fru_id,ledn,ledv,ledc); + ret = set_alarms_picmg(ledv,picmg_id,fru_id,ledn,ledc); + printf("set_alarms_picmg ret = %d\n",ret); + ret = get_alarms_picmg(rgalarms,picmg_id,fru_id,ledn); + if (ret == 0) show_alarms_picmg(rgalarms,picmg_id,fru_id,ledn); + } else { /* not picmg, set Intel Telco Alarm LEDs */ + if (fbmctam) { /* Platform supports BMC Telco Alarms Manager */ + ret = check_bmctam_intel(); + } /*endif fbmctam*/ + if (ret == LAN_ERR_ABORT) { + printf("Conflict with BMC TAM - Skipping TAM LEDs.\n"); + } else { + if (fsetall) newvalue = 0xFF; /* alarms and relays */ + else { + newvalue = alarms; + if (fcrit == 1) newvalue &= 0xFD; /*bit1 = 0*/ + else if (fcrit == 0) newvalue |= 0xF2; + if (fmaj == 1) newvalue &= 0xFB; /*bit2 = 0*/ + else if (fmaj == 0) newvalue |= 0xF4; + if (fmin == 1) newvalue &= 0xF7; /*bit3 = 0*/ + else if (fmin == 0) newvalue |= 0xF8; + if (fpow == 1) newvalue &= 0xFE; /*bit0 = 0*/ + else if (fpow == 0) newvalue |= 0xF1; + } + printf("\nSetting alarms to %02x ...\n",newvalue); + ret = set_alarms_intel(newvalue,busid); + alarms = get_alarms_intel(busid); + show_alarms_intel(alarms); + } + } /*end else Intel*/ + } /*endif fsetled*/ + } /*endif fHasAlarms*/ + + if (fsetid) { + printf("Setting ID LED to %d ...\n\n",fid); + ret = set_chassis_id((uchar)fid); + } + + if (fHasEnc && fdoencl) { /* disk enclosure exists */ + if (fRomley) { /* Romley (Patsburg) */ + int rv; /*do not change ret*/ + rv = get_enc_leds_intel(&encled); + if (rv == 0) { + show_enc_leds_intel(encled,maxdisks); + if (fsetdisk) { + /* Set fault if user param, and disk is present. */ + if (fsetall) newvalue = 0x00; /* all LEDs off */ + else if (fdiska == 10) newvalue = 0x00; + else { + newvalue = encled; + if (fdiskb == 1) newvalue |= 0x02; + else if (fdiskb == 0) newvalue &= 0xFD; + if (fdiska == 1) newvalue |= 0x01; + else if (fdiska == 0) newvalue &= 0xFE; + if (fdiskn == 1) newvalue |= (0x01 << ndisk); + else if (fdiskn == 0) newvalue &= ~(0x01 << ndisk); + } + printf("\nSetting Enclosure LEDs to %02x ...\n",newvalue); + ret = set_enc_leds_intel(newvalue); + ret = get_enc_leds_intel(&encled); + show_enc_leds_intel(encled,maxdisks); + } + } + } else { /* Vitesse disk Enclosure chipset */ + ret = get_enc_leds(&encled); + if (ret == 0) { + show_enc_leds(encled); + if (fsetdisk) { + /* Set fault if user param, and disk is present. */ + if (fsetall) newvalue = 0x00; /* all LEDs off */ + else if (fdiska == 10) newvalue = 0x00; + else { + newvalue = encled; + if (fdiskb == 1) newvalue |= 0x02; + else if (fdiskb == 0) newvalue &= 0xFD; + if (fdiska == 1) newvalue |= 0x01; + else if (fdiska == 0) newvalue &= 0xFE; + if (fdiskn == 1) newvalue |= (0x01 << ndisk); + else if (fdiskn == 0) newvalue &= ~(0x01 << ndisk); + } + printf("\nSetting Enclosure LEDs to %02x ...\n",newvalue); + ret = set_enc_leds(newvalue); + ret = get_enc_leds(&encled); + show_enc_leds(encled); + } + } + } /*end-else Vitesse*/ + } /*endif fHasEnc*/ + else if (fNSC && fdoencl) { /*Chesnee NSC platform has special disk LEDs*/ + diskled = get_nsc_diskleds(busid); + show_nsc_diskleds(diskled); + if (fsetdisk) { + newvalue = diskled; + // newvalue |= 0xFC; /*leave upper bits high (off) */ + /* Set fault if user param, and disk is present. */ + if (fdiskb == 1) newvalue &= 0xFE; /*bit0=0*/ + else if (fdiskb == 0) newvalue |= 0x01; + if (fdiska == 1) newvalue &= 0xFD; /*bit1=0*/ + else if (fdiska == 0) newvalue |= 0x02; + else if (fdiska == 10) newvalue = 0x00; + printf("\nSetting Disk LEDs to %02x ...\n",newvalue); + ret = set_nsc_diskleds(newvalue,busid); + diskled = get_nsc_diskleds(busid); + show_nsc_diskleds(diskled); + } + } +do_exit: + ipmi_close_(); + // show_outcome(progname,ret); + return (ret); +} /* end main()*/ + +/* end ialarms.c */ |