#!/bin/bash # Copyright (C) 2016 Ingrasys, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . VERSION="1.0.0" TRUE=200 FALSE=404 EXEC_FUNC=${1} COLOR_LED=${2} QSFP_PORT=${2} QSFP_INIT_ACTION=${2} MB_EEPROM_ACTION=${2} TARGET_10G_MUX=${2} QSFP_ACTION=${3} QSFP_VALUE=${4} ONOFF_LED=${3} FAN_TRAY=${4} ############################################################ # Distributor ID: Debian # Description: Debian GNU/Linux 8.6 (jessie) # Release: 8.6 # Codename: jessie # Linux debian 3.16.0-4-amd64 #1 # SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux ############################################################ # Color Definition COLOR_TITLE="\e[1;32m" ### Green ### COLOR_WARNING="\e[1;33m" ### Yellow ### COLOR_ERROR="\e[1;31m" ### Red ### COLOR_END="\e[0m" ### END ### I2C_NUM=0 NUM_I801_DEVICE=$((I2C_NUM++)) #0 #MUX PCA9548#0 CPLD (I2C_NUM 1~8) NUM_MUX_9548_CPLD_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_CPLD_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548#1 UCD (I2C_NUM 9~16) NUM_MUX_9548_UCD_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_UCD_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9545 PSU (I2C_NUM 17~20) NUM_MUX_9545_PSU_CHAN=() for (( i=0; i<4; ++i )) do NUM_MUX_9545_PSU_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP ROOT (I2C_NUM 21~28) NUM_MUX_9548_QSFP_ROOT_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_ROOT_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 0~7 (I2C_NUM 29~36) NUM_MUX_9548_QSFP_0_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_0_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 8~15 (I2C_NUM 37~44) NUM_MUX_9548_QSFP_1_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_1_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 16~23 (I2C_NUM 45~52) NUM_MUX_9548_QSFP_2_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_2_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 24~31 (I2C_NUM 53~60) NUM_MUX_9548_QSFP_3_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_3_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 32~39 (I2C_NUM 61~68) NUM_MUX_9548_QSFP_4_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_4_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 40~47 (I2C_NUM 69~76) NUM_MUX_9548_QSFP_5_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_5_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 48~55 (I2C_NUM 77~84) NUM_MUX_9548_QSFP_6_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_6_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 QSFP Port 56~63 (I2C_NUM 85~92) NUM_MUX_9548_QSFP_7_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_QSFP_7_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9545 SFP (I2C_NUM 93~96) NUM_MUX_9545_SFP_CHAN=() for (( i=0; i<4; ++i )) do NUM_MUX_9545_SFP_CHAN[i]=$((I2C_NUM++)) done #MUX PCA9548 CPLD SW Upgrade (I2C_NUM 97~104) NUM_MUX_9548_CPLD_SW_CHAN=() for (( i=0; i<8; ++i )) do NUM_MUX_9548_CPLD_SW_CHAN[i]=$((I2C_NUM++)) done #MUX Alias I2C_BUS_PSU1_EEPROM=${NUM_MUX_9545_PSU_CHAN[1]} I2C_BUS_PSU2_EEPROM=${NUM_MUX_9545_PSU_CHAN[0]} I2C_BUS_LED_BOARD=${NUM_MUX_9548_UCD_CHAN[1]} I2C_BUS_ID_GPIO=${NUM_MUX_9548_UCD_CHAN[2]} I2C_BUS_10GMUX=${NUM_MUX_9548_UCD_CHAN[4]} I2C_BUS_HWM=${NUM_MUX_9548_UCD_CHAN[7]} I2C_BUS_FAN_BOARD=${NUM_I801_DEVICE} I2C_BUS_MB_EEPROM=${NUM_I801_DEVICE} I2C_BUS_TH_RESET=${NUM_I801_DEVICE} I2C_BUS_BOARD_TYPE=${NUM_I801_DEVICE} I2C_BUS_BMC_BOARD_TYPE=${NUM_I801_DEVICE} I2C_BUS_LM75_MAC=${NUM_MUX_9548_CPLD_CHAN[5]} I2C_BUS_LM75_FRONT=${NUM_MUX_9548_CPLD_CHAN[6]} I2C_BUS_LM75_REAR=${NUM_MUX_9548_CPLD_CHAN[5]} I2C_BUS_PSU_INT=${NUM_I801_DEVICE} I2C_BUS_PSU_STATUS=${NUM_I801_DEVICE} I2C_BUS_MUX_RST=${NUM_I801_DEVICE} #CPU Board I2C_BUS_CPU_EEPROM=${NUM_I801_DEVICE} I2C_BUS_CPU_TMP75=${NUM_I801_DEVICE} I2C_BUS_MUX_CPU_CPLD=${NUM_I801_DEVICE} PATH_SYS_I2C_DEVICES="/sys/bus/i2c/devices" PATH_SYS_CPLD="/sys/devices/platform/ingrasys-s9200-cpld.0" PATH_HWMON_ROOT_DEVICES="/sys/class/hwmon" PATH_HWMON_W83795_DEVICE="${PATH_HWMON_ROOT_DEVICES}/hwmon5" PATH_I801_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_I801_DEVICE}" PATH_LM75_MAC="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_LM75_MAC}" PATH_LM75_FRONT="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_LM75_FRONT}" PATH_LM75_REAR="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_LM75_REAR}" PATH_CPU_TMP75="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_I801_DEVICE}" PATH_BMC_TMP75="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_HWM}" PATH_PSU1_EERPOM=${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU1_EEPROM} PATH_PSU2_EEPROM=${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU2_EEPROM} PATH_10GMUX=${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_10GMUX} #PATH for MUX PCA9548_QSFP_ROOT PATH_MUX_9548_QSFP_ROOT="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_PSU_CHAN[2]}" PATH_MUX_9548_QSFP_ROOT_CHAN=() for (( i=0; i<8; ++i )) do PATH_MUX_9548_QSFP_ROOT_CHAN[i]="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_QSFP_ROOT_CHAN[i]}" done PATH_MUX_9545_SFP="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_PSU_CHAN[3]}" PATH_MUX_9545_SFP_CHAN=() for (( i=0; i<4; ++i )) do PATH_MUX_9545_SFP_CHAN[i]="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9545_SFP_CHAN[i]}" done #i2cmap and gpiomap path PATH_I2CMAP=/tmp/i2cmap #Mother Board I2C_ADDR_MUX_9539_TH_RST=0x74 I2C_ADDR_LED_BOARD=0x75 I2C_ADDR_FAN_BOARD=0x20 I2C_ADDR_ID_GPIO=0x27 I2C_ADDR_MUX_9548_CPLD=0x70 I2C_ADDR_MUX_9548_UCD=0x76 I2C_ADDR_MUX_9545_PSU=0x72 I2C_ADDR_MUX_9548_QSFP_ROOT=0x71 I2C_ADDR_MUX_9548_QSFP=0x73 I2C_ADDR_MUX_9545_SFP=0x73 I2C_ADDR_CPLD=0x33 I2C_ADDR_MB_EEPROM=0x55 I2C_ADDR_QSFP_EEPROM=0x50 I2C_ADDR_PSU_EEPROM=0x50 I2C_ADDR_LM75_MAC=0x4E I2C_ADDR_LM75_FRONT=0x4D I2C_ADDR_LM75_REAR=0x4D I2C_ADDR_10GMUX=0x67 #Dummy BMC Board I2C_ADDR_HWM=0x2F I2C_ADDR_PSU_INT=0x24 #PSU Interrup on Dummy BMC Board I2C_ADDR_BMC_BOARD_TYPE=0x24 #PSU Status on Dummy BMC Board I2C_ADDR_PSU_STATUS=0x25 #PSU Status on Dummy BMC Board I2C_ADDR_MUX_RST=0x26 #MUX RST on Dummy BMC Board I2C_ADDR_TMP75_BB=0x4A #CPU Board I2C_ADDR_CPU_EEPROM=0x51 I2C_ADDR_CPU_TMP75=0x4F I2C_ADDR_MUX_CPU_CPLD=0x77 #sysfs PATH_SYSFS_PSU1="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU1_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU_EEPROM)" PATH_SYSFS_PSU2="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU2_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU_EEPROM)" #Active High/Low ACTIVE_LOW=1 ACTIVE_HIGH=0 #GPIO Direction In/Out DIR_IN=in DIR_OUT=out #Power Supply Status PSU_DC_ON=1 PSU_DC_OFF=0 PSU_EXIST=1 PSU_NOT_EXIST=0 #W83795 Registers REG_BANK_SEL=0x00 REG_VOLT_CTRL1=0x02 REG_VOLT_CTRL2=0x03 REG_TEMP_CTRL1=0x04 REG_TEMP_CTRL2=0x05 #PCA9535 Registers REG_IN_0=0 REG_IN_1=1 REG_OUT_0=2 REG_OUT_1=3 REG_POLARITY_0=4 REG_POLARITY_1=5 REG_CFG_0=6 REG_CFG_1=7 #LM75 Registers LM75_REG_TEMP=0x00 LM75_REG_CONF=0x01 LM75_REG_HYST=0x02 LM75_REG_TOS=0x03 #Bit Mask BIT_MASK=(1 2 4 8 16 32 64 128) #MUX Type PCA9545="pca9545" PCA9548="pca9548" #PLATFORM Variables PORT_NUM=64 #CPLD Variables CPLD_QSFP_GROUP=(12 25 38 51 64) CPLD_QSFP_STATUS_REG_BASE=0x20 CPLD_QSFP_MODE_SELECT_REG_BASE=0x30 CPLD_QSFP_ABS="abs" CPLD_QSFP_INT="int" CPLD_QSFP_RST="rst" CPLD_QSFP_LP="lp" # Help usage function function _help { echo "=========================================================" echo "# Description: Help Function" echo "=========================================================" echo "----------------------------------------------------" echo "EX : ${0} help" echo " : ${0} i2c_init" echo " : ${0} i2c_deinit" echo " : ${0} i2c_temp_init" echo " : ${0} i2c_fan_init" echo " : ${0} i2c_volmon_init" echo " : ${0} i2c_io_exp_init" echo " : ${0} i2c_psu_eeprom_get" echo " : ${0} i2c_mb_eeprom_get" echo " : ${0} i2c_cpu_eeprom_get" echo " : ${0} i2c_qsfp_eeprom_get [1-${PORT_NUM}]" echo " : ${0} i2c_qsfp_eeprom_init new|delete" echo " : ${0} i2c_mb_eeprom_init new|delete" echo " : ${0} i2c_cpu_eeprom_init new|delete" echo " : ${0} i2c_qsfp_status_get [1-${PORT_NUM}]" echo " : ${0} i2c_qsfp_type_get [1-${PORT_NUM}]" echo " : ${0} i2c_qsfp_signal_get [1-${PORT_NUM}] [abs|int|rst|lp]" echo " : ${0} i2c_qsfp_signal_set [1-${PORT_NUM}] [rst|lp] [0|1] (low_active)" echo " : ${0} i2c_board_type_get" echo " : ${0} i2c_bmc_board_type_get" echo " : ${0} i2c_psu_status" echo " : ${0} i2c_led_psu_status_set" echo " : ${0} i2c_led_fan_status_set" echo " : ${0} i2c_led_fan_tray_status_set" echo " : ${0} i2c_led_fan_tray_test" echo " : ${0} i2c_cpld_version" echo " : ${0} i2c_test_all" echo " : ${0} i2c_led_test" echo " : ${0} i2c_sys_led green|amber" echo " : ${0} i2c_fan_led green|amber" echo " : ${0} i2c_psu1_led green|amber" echo " : ${0} i2c_psu2_led green|amber" echo " : ${0} i2c_fan_tray_led green|amber on|off [1-4]" echo " : ${0} i2c_10g_mux cpu|fp" echo "----------------------------------------------------" } #Pause function function _pause { read -p "$*" } #Retry command function function _retry { local i for i in {1..5}; do eval "${*}" && break || echo "retry"; sleep 1; done } #logical(front panel) to physical (falcon core) port mapping function _port_logic2phy { local logic_port=$1 local phy_port=0 if (( $logic_port >=1 && $logic_port <= 32 )) ; then phy_port=$(( (logic_port-1)/2*4 + (logic_port-1)%2 + 1)) elif (( $logic_port >=33 && $logic_port <= 64 )) ; then phy_port=$(( (((logic_port-1)%32))/2*4 + (logic_port-1)%2 + 3)) fi echo $phy_port } #set i2cmap function _set_i2cmap { local i2c_n=$1 local alias=$2 #create i2cmap dir if not exist mkdir -p $PATH_I2CMAP #check i2c_n exists in sysfs if [ ! -L ${PATH_SYS_I2C_DEVICES}/i2c-${i2c_n} ]; then echo "${PATH_SYS_I2C_DEVICES}/i2c-${i2c_n} does not exist." return fi #create or update link ln -sf ${PATH_SYS_I2C_DEVICES}/i2c-${i2c_n} ${PATH_I2CMAP}/${alias} } #clear i2cmap function _clear_i2cmap { #delete i2cmap dir rm -rf ${PATH_I2CMAP}/ } #remove kernel module if exists function _util_rmmod { local mod=$1 [ "$(lsmod | grep "^$mod ")" != "" ] && rmmod $mod } function _create_i2c_mux_device { local mux_type=$1 local mux_addr=$2 local mux_parent_chan=$3 local mux_chan0=$4 local mux_desc=$5 if [ ! -e "${PATH_SYS_I2C_DEVICES}/i2c-${mux_chan0}" ]; then _retry "echo '$mux_type ${mux_addr}' > ${mux_parent_chan}/new_device" _set_i2cmap ${mux_chan0} "${mux_desc}" else echo "${mux_desc} ${mux_addr} already init." fi } #I2C Init function _i2c_init { echo "=========================================================" echo "# Description: I2C Init" echo "=========================================================" _util_rmmod i2c_i801 modprobe i2c_i801 #disable_features=0x10 modprobe i2c_dev modprobe i2c_mux_pca954x force_deselect_on_exit=1 #add MUX_9548_CPLD on I801 _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_CPLD ${PATH_I801_DEVICE} ${NUM_MUX_9548_CPLD_CHAN[0]} "PCA9548_CPLD" #add MUX_9548_UCD on I801 _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_UCD ${PATH_I801_DEVICE} ${NUM_MUX_9548_UCD_CHAN[0]} "PCA9548_UCD" #add MUX_9545_PSU on I801 _create_i2c_mux_device $PCA9545 $I2C_ADDR_MUX_9545_PSU ${PATH_I801_DEVICE} ${NUM_MUX_9545_PSU_CHAN[0]} "PCA9545_PSU" #add MUX_9548_QSFP_ROOT on MUX_9545_PSU_CHAN[2] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP_ROOT ${PATH_MUX_9548_QSFP_ROOT} ${NUM_MUX_9548_QSFP_ROOT_CHAN[0]} "PCA9548_QSPF_ROOT" #add MUX_9548_QSFP_0 on MUX_9548_QSFP_ROOT_CHAN[0] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[0]} ${NUM_MUX_9548_QSFP_0_CHAN[0]} "PCA9548_QSPF_0" #add MUX_9548_QSFP_1 on MUX_9548_QSFP_ROOT_CHAN[1] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[1]} ${NUM_MUX_9548_QSFP_1_CHAN[0]} "PCA9548_QSPF_1" #add MUX_9548_QSFP_2 on MUX_9548_QSFP_ROOT_CHAN[2] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[2]} ${NUM_MUX_9548_QSFP_2_CHAN[0]} "PCA9548_QSPF_2" #add MUX_9548_QSFP_3 on MUX_9548_QSFP_ROOT_CHAN[3] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[3]} ${NUM_MUX_9548_QSFP_3_CHAN[0]} "PCA9548_QSPF_3" #add MUX_9548_QSFP_4 on MUX_9548_QSFP_ROOT_CHAN[4] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[4]} ${NUM_MUX_9548_QSFP_4_CHAN[0]} "PCA9548_QSPF_4" #add MUX_9548_QSFP_5 on MUX_9548_QSFP_ROOT_CHAN[5] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[5]} ${NUM_MUX_9548_QSFP_5_CHAN[0]} "PCA9548_QSPF_5" #add MUX_9548_QSFP_6 on MUX_9548_QSFP_ROOT_CHAN[6] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[6]} ${NUM_MUX_9548_QSFP_6_CHAN[0]} "PCA9548_QSPF_6" #add MUX_9548_QSFP_7 on MUX_9548_QSFP_ROOT_CHAN[7] _create_i2c_mux_device $PCA9548 $I2C_ADDR_MUX_9548_QSFP ${PATH_MUX_9548_QSFP_ROOT_CHAN[7]} ${NUM_MUX_9548_QSFP_7_CHAN[0]} "PCA9548_QSPF_7" #add MUX_9545_SFP on QSFP_ROOT _create_i2c_mux_device $PCA9545 $I2C_ADDR_MUX_9545_SFP ${PATH_MUX_9545_SFP} ${NUM_MUX_9545_SFP_CHAN[0]} "PCA9545_SPF" #Init CPLD LED_CLR Register (QSFP LED) i2cset -y -m ${BIT_MASK[2]} ${NUM_I801_DEVICE} ${I2C_ADDR_MUX_9539_TH_RST} ${REG_OUT_0} 0xFF _util_rmmod coretemp _util_rmmod jc42 _util_rmmod w83795 _util_rmmod lm75 _i2c_temp_init _i2c_volmon_init modprobe coretemp modprobe lm75 modprobe jc42 modprobe eeprom_mb _i2c_mb_eeprom_init "new" _i2c_cpu_eeprom_init "new" modprobe eeprom modprobe gpio-pca953x _i2c_sensors_init _i2c_fan_init _i2c_io_exp_init _i2c_psu_init _i2c_qsfp_eeprom_init "new" _i2c_led_psu_status_set _i2c_led_fan_status_set COLOR_LED="green" echo "${COLOR_LED}" _i2c_sys_led modprobe cpld _config_rmem } #I2C Deinit function _i2c_deinit { for mod in cpld coretemp jc42 w83795 lm75 eeprom eeprom_mb gpio-pca953x i2c_mux_pca954x i2c_i801 ingrasys_s9200_64x_psu; do _util_rmmod $mod done _clear_i2cmap } #Temperature sensor Init function _i2c_temp_init { local lm="lm75" local tmp="tmp75" local i2c_bus=${I2C_BUS_HWM} local i2c_addr=${I2C_ADDR_HWM} echo "=========================================================" echo "# Description: TEMP INIT" echo "=========================================================" # select bank0 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_BANK_SEL} 0x80 echo "enable VDSEN14, VDSEN15, VDSEN16, and TR4 temperature monitoring" i2cset -y -r ${i2c_bus=} ${i2c_addr} ${REG_TEMP_CTRL2} 0x6A echo "export CPU sensor TMP75 to sysfs" echo "${tmp} ${I2C_ADDR_CPU_TMP75}" > ${PATH_CPU_TMP75}/new_device echo "Add Dummy Board LM75 to sysfs" echo "${lm} ${I2C_ADDR_LM75_MAC}" > ${PATH_LM75_MAC}/new_device echo "${lm} ${I2C_ADDR_LM75_FRONT}" > ${PATH_LM75_FRONT}/new_device echo "${lm} ${I2C_ADDR_LM75_REAR}" > ${PATH_LM75_REAR}/new_device echo "CLKIN clock frequency set as 48Mhz" i2cset -y -r ${i2c_bus} ${i2c_addr} 0x01 0x1C # select bank 2 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_BANK_SEL} 0x82 echo "set PWM mode in FOMC" i2cset -y -r ${i2c_bus} ${i2c_addr} 0x0F 0x00 } #FAN Init function _i2c_fan_init { local init_fan_speed=120 echo "=========================================================" echo "# Description: FAN INIT" echo "=========================================================" if [ -e "${PATH_HWMON_W83795_DEVICE}" ]; then echo "Init Fan Speed to ${init_fan_speed} (MAX is 255)" echo $init_fan_speed > ${PATH_HWMON_W83795_DEVICE}/device/pwm1 echo $init_fan_speed > ${PATH_HWMON_W83795_DEVICE}/device/pwm2 else echo "FAIL, W83795 not found in path ${PATH_HWMON_W83795_DEVICE}" fi } #VOLMON Init function _i2c_volmon_init { echo -n "VOLMON INIT" local i2c_bus=${I2C_BUS_HWM} local i2c_addr=${I2C_ADDR_HWM} #select bank0 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_BANK_SEL} 0x80 #enable voltage monitoring VSEN 1~8 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_VOLT_CTRL1} 0xFF #enable voltage monitoring 3VDD and 3VBAT i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_VOLT_CTRL2} 0x50 #eable voltage monitoring VSEN12 and VSEN13 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_TEMP_CTRL1} 0x0A echo "Done" } #IO Expander Init function _i2c_io_exp_init { local i2c_bus=0 local i2c_addr=0 echo "=========================================================" echo "# Description: I2C IO Expander Init" echo "=========================================================" echo "Init PCA9539 TH RESET IO Expander" #PCA9539 TH RESET #0.0 TH_RST_L OUT 1 #0.1 TH_PCIE_RST_L OUT 1 #0.2 LED_CLR OUT 1 #0.3 HOST_TO_BMC_I2C_GPIO OUT 0 #0.4 USB_MUX_SEL OUT 0 #0.5 UART_MUX_SEL OUT 0 #0.6 FIN0 OUT 0 #0.7 FIN7 OUT 0 #1.0 TH_INT_L IN #1.1 CPLD4_TO_CPU_INT_L IN #1.2 CPLD3_TO_CPU_INT_L IN #1.3 CPLD2_TO_CPU_INT_L IN #1.4 CPLD1_TO_CPU_INT_L IN #1.5 REF_SEL OUT 0 #1.6 I210_PE_RST_L OUT 1 #1.7 I210_RST_L OUT 1 i2c_bus=${I2C_BUS_TH_RESET} i2c_addr=${I2C_ADDR_MUX_9539_TH_RST} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_0} $((2#00000111)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_1} $((2#11000000)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} $((2#00011111)) echo "Init PCA9539 LED BOARD IO Expander" #PCA9539 LED BOARD #0.0 SYS_LED_G OUT 1 #0.1 FAN_LED_EN OUT 1 #0.2 FAN_LED_Y OUT 0 #0.3 PSU1_LED_Y OUT 0 #0.4 PSU0_LED_Y OUT 0 #0.5~0.7 X #1.0 PSU1_PWROK OUT 1 #1.1 PSU0_PWROK OUT 1 i2c_bus=${I2C_BUS_LED_BOARD} i2c_addr=${I2C_ADDR_LED_BOARD} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_0} $((2#00000011)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_1} $((2#00000011)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} 0x00 echo "Init PCA9535 ID_GPIO IO Expander" #PCA9535 ID_GPIO #0.0 ~ 0.7 X #1.0 Build_REV_0 IN #1.1 Build_REV_1 IN #1.2 HW_REV_0 IN #1.3 HW_REV_1 IN #1.4 Board_ID_0 IN #1.5 Board_ID_1 IN #1.6 Board_ID_2 IN #1.7 Board_ID_3 IN i2c_bus=${I2C_BUS_ID_GPIO} i2c_addr=${I2C_ADDR_ID_GPIO} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} 0xFF i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} 0xFF #I2C_ADDR_FAN_BOARD echo "Init PCA9535 FAN_BOARD IO Expander" #PCA9535 FAN_BOARD #0.0 EN_FAN1_LED_G_H OUT 1 #0.1 EN_FAN1_LED_Y_H OUT 0 #0.2 FAN1_ABS# IN 0 #0.3 FAN1_DIR# IN 0 #0.4 EN_FAN2_LED_G_H OUT 1 #0.5 EN_FAN2_LED_Y_H OUT 0 #0.6 FAN2_ABS# IN 0 #0.7 FAN2_DIR# IN 0 #1.0 EN_FAN3_LED_G_H OUT 1 #1.1 EN_FAN3_LED_Y_H OUT 0 #1.2 FAN3_ABS# IN 0 #1.3 FAN3_DIR# IN 0 #1.4 EN_FAN4_LED_G_H OUT 1 #1.5 EN_FAN4_LED_Y_H OUT 0 #1.6 FAN4_ABS# IN 0 #1.7 FAN4_DIR# IN 0 i2c_bus=${I2C_BUS_FAN_BOARD} i2c_addr=${I2C_ADDR_FAN_BOARD} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_0} $((2#00010001)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_1} $((2#00010001)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} $((2#11001100)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} $((2#11001100)) #PCA9555 on BMC Dummy Board echo "Init PCA9555 Interrupt IO Expander" #PCA9555 Interrupt Expander #0.0 HWM_INT_L IN #0.1 UCD9090_INT_L IN #0.2 ETHX_INT_L IN #0.3 HOST_TO_BMC_INT_L IN #0.4 THERMAL_ALT1# IN #0.5 FAN_STATUS_INT_L IN #0.6 PSU0_INT_L IN #0.7 PSU1_INT_L IN #1.0 Build_REV_0 IN #1.1 Build_REV_1 IN #1.2 HW_REV_0 IN #1.3 HW_REV_1 IN #1.4 Board_ID_0 IN #1.5 Board_ID_1 IN #1.6 Board_ID_2 IN #1.7 Board_ID_3 IN i2c_bus=${I2C_BUS_PSU_INT} i2c_addr=${I2C_ADDR_PSU_INT} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} 0xFF i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} 0xFF #PCA9555 on BMC Dummy Board echo "Init PCA9555 PSU0_PWROK IO Expander" #PCA9555 PSU0_PWROK Expander #0.0 PSU0_PWROK IN #0.1 PSU0_PRSNT_L IN #0.2 PSU0_PWRON_L OUT 0 #0.3 PSU1_PWROK IN #0.4 PSU1_PRSNT_L IN #0.5 PSU1_PWRON_L OUT 0 #0.6 TMP75_INT_L IN #0.7 GPIOF7 IN #1.0 ALL_PWR_GOOD IN #1.1 CPU_PRSNT_L IN #1.2 FP_BTN_UARTSEL_EN_L OUT 0 #1.3 HOST_TO_BMC_I2C_GPIO OUT 0 #1.4 HOST_CPU_PWRBTN_L OUT 1 #1.5 N/A #1.6 N/A #1.7 N/A i2c_bus=${I2C_BUS_PSU_STATUS} i2c_addr=${I2C_ADDR_PSU_STATUS} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_1} $((2#00010000)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} $((2#11011011)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} $((2#11100011)) #PCA9555 on BMC Dummy Board echo "Init PCA9555 MUX RST IO Expander" #PCA9555 MUX RST Expander #0.0 FRU_I2C_MUX_RST_L OUT 1 #0.1 MAIN_I2C_MUX_RST_L OUT 1 #0.2 SYSTEM_LED_RST_L OUT 1 #0.3 BMC_TO_UCD_RST_L OUT 1 #0.4 BMC_TO_HOST_RST_L OUT 1 #0.5 ETHX_RST_L OUT 1 #0.6 GPIOF4 IN #0.7 N/A #1.0 CPU_to_FRU_I2C_EN OUT 1 #1.1 CPU_to_MAIN_I2C_EN OUT 1 #1.2 P3V3_FAN_EN OUT 1 #1.3 P3V3_I2C_EN OUT 1 #1.4 UCD9090_CNTRL OUT 1 #1.5 UART_MUX_SEL OUT 0 #1.6 USB_MUX_SEL OUT 0 #1.7 ETHX_CPU_EEPROM_SEL OUT 0 i2c_bus=${I2C_BUS_MUX_RST} i2c_addr=${I2C_ADDR_MUX_RST} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_0} $((2#00111111)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_OUT_1} $((2#00011111)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_0} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_POLARITY_1} 0x00 i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} $((2#01000000)) i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} 0x00 #PCA9539 on CPU Board echo "Init PCA9539 CPLD IO Expander on CPU" i2c_bus=${I2C_BUS_MUX_CPU_CPLD} i2c_addr=${I2C_ADDR_MUX_CPU_CPLD} i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_0} 0xFF i2cset -y -r ${i2c_bus} ${i2c_addr} ${REG_CFG_1} 0xFF } function _i2c_sensors_init { echo "SENSORS init" local dev_path # add w83795 to sysfs dev_path="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_HWM}-$(printf "%04x" ${I2C_ADDR_HWM})" if ! [ -L ${dev_path} ]; then echo "w83795adg ${I2C_ADDR_HWM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_HWM}/new_device while [ ! -e "${PATH_HWMON_W83795_DEVICE}" ]; do sleep 1 done else echo "${dev_path} already exist (w83795)" fi # BMC board thermal dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_I801_DEVICE}-$(printf "%04x" ${I2C_ADDR_TMP75_BB})" if ! [ -L ${dev_path} ]; then echo "tmp75 ${I2C_ADDR_TMP75_BB}" > ${PATH_BMC_TMP75}/new_device else echo "${dev_path} already exist" fi echo "Done" } #Set FAN Tray LED function _i2c_led_fan_tray_status_set { echo "=========================================================" echo "# Description: FAN Tray Status Setup" echo "=========================================================" #check W83795 exists if [ ! -e "${PATH_HWMON_W83795_DEVICE}" ]; then echo "FAIL, W83795 not found in path ${PATH_HWMON_W83795_DEVICE}" return fi #FAN Status get FAN1_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan1_alarm` FAN3_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan3_alarm` FAN5_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan5_alarm` FAN7_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan7_alarm` FAN_TRAY=1 if [ "${FAN1_ALARM}" == "0" ]; then COLOR_LED="green" ONOFF_LED="on" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="off" _i2c_fan_tray_led echo "set [FAN TRAY 1] [Green]=on [Amber]=off" else COLOR_LED="green" ONOFF_LED="off" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="on" _i2c_fan_tray_led echo "set [FAN TRAY 1] [Green]=off [Amber]=on" fi FAN_TRAY=2 if [ "${FAN3_ALARM}" == "0" ]; then COLOR_LED="green" ONOFF_LED="on" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="off" _i2c_fan_tray_led echo "set [FAN TRAY 2] [Green]=on [Amber]=off" else COLOR_LED="green" ONOFF_LED="off" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="on" _i2c_fan_tray_led echo "set [FAN TRAY 2] [Green]=off [Amber]=on" fi FAN_TRAY=3 if [ "${FAN5_ALARM}" == "0" ]; then COLOR_LED="green" ONOFF_LED="on" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="off" _i2c_fan_tray_led echo "set [FAN TRAY 3] [Green]=on [Amber]=off" else COLOR_LED="green" ONOFF_LED="off" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="on" _i2c_fan_tray_led echo "set [FAN TRAY 3] [Green]=off [Amber]=on" fi FAN_TRAY=4 if [ "${FAN7_ALARM}" == "0" ]; then COLOR_LED="green" ONOFF_LED="on" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="off" _i2c_fan_tray_led echo "set [FAN TRAY 4] [Green]=on [Amber]=off" else COLOR_LED="green" ONOFF_LED="off" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="on" _i2c_fan_tray_led echo "set [FAN TRAY 4] [Green]=off [Amber]=on" fi } #Test FAN Tray LED function _i2c_led_fan_tray_test { echo "=========================================================" echo "# Description: FAN Tray LED Test" echo "=========================================================" for i in {1..4} do FAN_TRAY=$i COLOR_LED="green" ONOFF_LED="on" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="off" _i2c_fan_tray_led _pause "Check [Fan Tray ${i} LED] = Green and Press [Enter] key to continue..." COLOR_LED="green" ONOFF_LED="off" _i2c_fan_tray_led COLOR_LED="amber" ONOFF_LED="on" _i2c_fan_tray_led _pause "Check [Fan Tray ${i} LED] = Amber and Press [Enter] key to continue..." done } #Set FAN LED function _i2c_led_fan_status_set { echo "=========================================================" echo "# Description: FAN Status Setup" echo "=========================================================" #check W83795 exists in hwmon2 if [ ! -e "${PATH_HWMON_W83795_DEVICE}" ]; then echo "FAIL, W83795 not found in path ${PATH_HWMON_W83795_DEVICE}" return fi #PSU Status set FAN1_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan1_alarm` FAN3_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan3_alarm` FAN5_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan5_alarm` FAN7_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan7_alarm` if [ "${FAN1_ALARM}" == "0" ] \ && [ "${FAN3_ALARM}" == "0" ] \ && [ "${FAN5_ALARM}" == "0" ] \ && [ "${FAN7_ALARM}" == "0" ] ; then COLOR_LED="green" _i2c_fan_led else COLOR_LED="amber" _i2c_fan_led fi echo "set [FAN LED] = ${COLOR_LED}" } #Set PSU LED on LED Board function _i2c_led_psu_status_set { echo "=========================================================" echo "# Description: PSU LED Status Setup" echo "=========================================================" #Get PSU Status _i2c_psu_status #PSU1 Status echo "------------------------------" if [ "${psu1Exist}" == ${PSU_EXIST} ]; then if [ "${psu1PwGood}" == ${PSU_DC_ON} ]; then COLOR_LED="green" _i2c_psu1_led else COLOR_LED="amber" _i2c_psu1_led fi else COLOR_LED="amber" _i2c_psu1_led fi echo "set [PSU1 LED] = ${COLOR_LED}" #PSU2 Status echo "------------------------------" if [ "${psu2Exist}" == ${PSU_EXIST} ]; then if [ "${psu2PwGood}" == ${PSU_DC_ON} ]; then COLOR_LED="green" _i2c_psu2_led else COLOR_LED="amber" #ONOFF_LED="on" _i2c_psu2_led fi else COLOR_LED="amber" _i2c_psu2_led fi echo "set [PSU2 LED] = ${COLOR_LED}" } #LED Test function _i2c_led_test { echo "=========================================================" echo "# Description: I2C LED TEST" echo "=========================================================" #sys led (green) _i2c_reset_led COLOR_LED="green" _i2c_sys_led _pause 'Check [SYS LED] = Green and Press [Enter] key to continue...' #sys led (amber) _i2c_reset_led COLOR_LED="amber" _i2c_sys_led _pause 'Check [SYS LED] = Amber and Press [Enter] key to continue...' #FAN led (green) _i2c_reset_led COLOR_LED="green" _i2c_fan_led _pause 'Check [FAN LED] Green and Press [Enter] key to continue...' #FAN led (amber) _i2c_reset_led COLOR_LED="amber" _i2c_fan_led _pause 'Check [FAN LED] = Amber and Press [Enter] key to continue...' #PSU2 led (green) _i2c_reset_led COLOR_LED="green" _i2c_psu2_led _pause 'Check [PSU2 LED] = Green and Press [Enter] key to continue...' #PSU2 led (amber) _i2c_reset_led COLOR_LED="amber" _i2c_psu2_led _pause 'Check [PSU2 LED] = Amber and Press [Enter] key to continue...' #PSU1 led (green) _i2c_reset_led COLOR_LED="green" _i2c_psu1_led _pause 'Check [PSU1 LED] = Green and Press [Enter] key to continue...' #PSU2 led (amber) _i2c_reset_led COLOR_LED="amber" _i2c_psu1_led _pause 'Check [PSU1 LED] = Amber and Press [Enter] key to continue...' #Turn OFF All LED _i2c_reset_led _pause 'Check turn off all LEDs and Press [Enter] key to continue...' } #Set QSFP Port variable function _qsfp_port_i2c_var_set { #global variables cpld_group=0 cpld_i2c_bus=0 cpld_i2c_addr=$I2C_ADDR_CPLD cpld_qsfp_status_reg_offset=0 cpld_qsfp_mode_reg_offset=0 #local variables local i=0 local port=$1 local port_group=$(( (port - 1)/8 )) case ${port_group} in 0) #the i2c expander base bus num to read qsfp eeprom eeprombusbase=${NUM_MUX_9548_QSFP_0_CHAN[0]} ;; 1) eeprombusbase=${NUM_MUX_9548_QSFP_1_CHAN[0]} ;; 2) eeprombusbase=${NUM_MUX_9548_QSFP_2_CHAN[0]} ;; 3) eeprombusbase=${NUM_MUX_9548_QSFP_3_CHAN[0]} ;; 4) eeprombusbase=${NUM_MUX_9548_QSFP_4_CHAN[0]} ;; 5) eeprombusbase=${NUM_MUX_9548_QSFP_5_CHAN[0]} ;; 6) eeprombusbase=${NUM_MUX_9548_QSFP_6_CHAN[0]} ;; 7) eeprombusbase=${NUM_MUX_9548_QSFP_7_CHAN[0]} ;; *) echo "Please input 1~${PORT_NUM}" ;; esac #set cpld_group and cpld_i2c_bus according to port for ((i=0; i<5; ++i)) do if (("${port}" <= "${CPLD_QSFP_GROUP[i]}")); then local port_offset=0 cpld_group=$i cpld_i2c_bus=${NUM_MUX_9548_CPLD_CHAN[i]} if ((i>0)) then port_offset=$(( port - CPLD_QSFP_GROUP[i-1] )) else port_offset=$port fi cpld_qsfp_status_reg_offset=$((CPLD_QSFP_STATUS_REG_BASE + port_offset)) cpld_qsfp_mode_reg_offset=$((CPLD_QSFP_MODE_SELECT_REG_BASE + port_offset)) break fi done } function _i2c_get { local i2c_bus=$1 local i2c_addr=$2 local reg=$3 echo `i2cget -y ${i2c_bus} ${i2c_addr} ${reg}` } function _i2c_set { local i2c_bus=$1 local i2c_addr=$2 local reg=$3 local mask=$4 local value=$5 echo `i2cset -m $mask -y -r ${i2c_bus} ${i2c_addr} ${reg} ${value}` } #Set QSFP Port variable function _qsfp_eeprom_var_set { #local variables local port=$1 #global variables eeprombusidx=$(( (port - 1)%8 )) case $eeprombusidx in 0) eeprombus=$(( $eeprombusbase + 0 )) ;; 1) eeprombus=$(( $eeprombusbase + 1 )) ;; 2) eeprombus=$(( $eeprombusbase + 2 )) ;; 3) eeprombus=$(( $eeprombusbase + 3 )) ;; 4) eeprombus=$(( $eeprombusbase + 4 )) ;; 5) eeprombus=$(( $eeprombusbase + 5 )) ;; 6) eeprombus=$(( $eeprombusbase + 6 )) ;; 7) eeprombus=$(( $eeprombusbase + 7 )) ;; esac eepromAddr=${I2C_ADDR_QSFP_EEPROM} } #Get QSFP EEPROM Information function _i2c_qsfp_eeprom_get { local value=0 local status=0 echo "=========================================================" echo "# Description: QSFP EEPROM GET" echo "=========================================================" #status: 0 -> Down, 1 -> Up _i2c_qsfp_signal_get ${QSFP_PORT} ${CPLD_QSFP_ABS} value=$qsfp_signal status=$(( value?0:1 )) if [ $status = 0 ]; then echo "[Fail] QSFP ${QSFP_PORT} is not present" exit fi echo "------------------------------" cat ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr)/eeprom | hexdump -C } #Init QSFP EEPROM function _i2c_qsfp_eeprom_init { echo "=========================================================" echo "# Description: QSFP EEPROM INIT" echo "=========================================================" #Action check action=$1 if [ -z "${action}" ]; then echo "No action, skip" return elif [ "${action}" != "new" ] && [ "${action}" != "delete" ]; then echo "Error action, skip" return fi #Init EEPROM local i for (( i=1; i<=${PORT_NUM}; i++ )) do _qsfp_port_i2c_var_set ${i} _qsfp_eeprom_var_set ${i} if [ "${action}" == "new" ] && \ ! [ -L ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr) ]; then echo "sff8436 $eepromAddr" > ${PATH_SYS_I2C_DEVICES}/i2c-$eeprombus/new_device elif [ "${action}" == "delete" ] && \ [ -L ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr) ]; then echo "$eepromAddr" > ${PATH_SYS_I2C_DEVICES}/i2c-$eeprombus/delete_device fi done } #get qsfp singals (ABS, INT, RST, LP) from CPLD function _i2c_qsfp_signal_get { local port=$1 #port start from 1 local signal=$2 local attr_file="" local phy_port=0 local active="low_active" #global qsfp_signal=0 qsfp_signals=0 #verify port if [ -z "${port}" ]; then echo "No port, skip" return fi #verify port if (( $port < 1 || $port > $PORT_NUM )) ; then echo "invalid port, skip" fi #get physical port phy_port=$(_port_logic2phy $port) _qsfp_port_i2c_var_set ${phy_port} _qsfp_eeprom_var_set ${phy_port} #verify signal if [ -z "${signal}" ]; then echo "No signal, skip" return elif [ "${signal}" == "${CPLD_QSFP_ABS}" ]; then attr_file="qsfp_modprs" elif [ "${signal}" == "${CPLD_QSFP_INT}" ]; then attr_file="qsfp_int" elif [ "${signal}" == "${CPLD_QSFP_RST}" ]; then attr_file="qsfp_reset" elif [ "${signal}" == "${CPLD_QSFP_LP}" ]; then attr_file="qsfp_lpmode" active="high_active" else echo "invalid signal ${signal}, skip" return fi mask=${BIT_MASK[bit_shift]} #signals of all ports qsfp_signals=`cat ${PATH_SYS_CPLD}/${attr_file}` #signal of single port qsfp_signal=$(( (qsfp_signals >> (phy_port-1)) & 0x1)) #print signals printf "[port]=%d, [signal]=%s, [value]=%d (${active}), [qsfp_signals]=%016x\n" $port $signal $qsfp_signal $qsfp_signals } #set qsfp singals (RST, LP) via CPLD function _i2c_qsfp_signal_set { local port=$1 #port start from 1 local signal=$2 local value=$3 local values_ori=0 local value_ori=0 local values=0 local attr_file="" #verify port if [ -z "${port}" ]; then echo "No port, skip" return fi #verify port if (( $port < 1 || $port > $PORT_NUM )) ; then echo "invalid port, skip" fi #verify signal if [ -z "${signal}" ]; then echo "No signal, skip" return elif [ "${signal}" == "${CPLD_QSFP_RST}" ]; then attr_file="qsfp_reset" elif [ "${signal}" == "${CPLD_QSFP_LP}" ]; then attr_file="qsfp_lpmode" else echo "invalid signal ${signal}, skip" return fi #get current signal values _i2c_qsfp_signal_get $port $signal value_ori=$qsfp_signal values_ori=$qsfp_signals #if signal value is not changed, return if [ "${value}" == "${value_ori}" ]; then echo "value not changed, skip set operation" return fi #toggle the bit for update values=$(( values_ori ^ (1 << (port-1)))) #set value to register echo "$(printf "%016x" $values)" > ${PATH_SYS_CPLD}/${attr_file} #get updated signal values _i2c_qsfp_signal_get $port $signal values=$qsfp_signals #result printf "Before: %016x\n" $values_ori printf "After: %016x\n" $values } #Init EEPROM function _i2c_eeprom_init { local i2c_bus=$1 local i2c_addr=$2 local action=$3 local desc=$4 local sys_i2c_dev=$PATH_SYS_I2C_DEVICES echo -n "${desc} EEPROM INIT" #Action check if [ -z "${action}" ]; then echo "No action, skip" return elif [ "${action}" != "new" ] && [ "${action}" != "delete" ]; then echo "Error action, skip" return fi #Init EEPROM if [ "${action}" == "new" ] && \ ! [ -L ${sys_i2c_dev}/${i2c_bus}-$(printf "%04x" $i2c_addr) ]; then echo "mb_eeprom ${i2c_addr}" > ${sys_i2c_dev}/i2c-${i2c_bus}/new_device elif [ "${action}" == "delete" ] && \ [ -L ${sys_i2c_dev}/${i2c_bus}-$(printf "%04x" $i2c_addr) ]; then echo "${i2c_addr}" > ${sys_i2c_dev}/i2c-${i2c_bus}/delete_device fi echo "DONE" } #Init Main Board EEPROM function _i2c_mb_eeprom_init { local action=$1 local i2c_bus=$I2C_BUS_MB_EEPROM local i2c_addr=$I2C_ADDR_MB_EEPROM local desc="Main Board" _i2c_eeprom_init $i2c_bus $i2c_addr $action $desc } #Init CPU EEPROM function _i2c_cpu_eeprom_init { local action=$1 local i2c_bus=$I2C_BUS_CPU_EEPROM local i2c_addr=$I2C_ADDR_CPU_EEPROM local desc="CPU Board" _i2c_eeprom_init $i2c_bus $i2c_addr $action $desc } #get QSFP Status function _i2c_qsfp_status_get { local value=0 local status=0 #status: 0 -> Down, 1 -> Up _i2c_qsfp_signal_get ${QSFP_PORT} ${CPLD_QSFP_ABS} value=$qsfp_signal status=$(( value?0:1 )) echo "status=$status" } #get QSFP Type function _i2c_qsfp_type_get { local phy_port=0 local value=0 local status=0 echo "=========================================================" echo "# Description: QSFP TYPE Get" echo "=========================================================" phy_port=$(_port_logic2phy ${QSFP_PORT}) _qsfp_port_i2c_var_set ${phy_port} _qsfp_eeprom_var_set ${phy_port} #get abs signal _i2c_qsfp_signal_get ${QSFP_PORT} ${CPLD_QSFP_ABS} value=$qsfp_signal status=$(( value?0:1 )) #check qsfp is present if [ $status = 0 ]; then echo "[Fail] QSFP ${QSFP_PORT} is not present" exit fi #Get QSFP EEPROM info if [ ! -e "${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf '%04x' $eepromAddr)/eeprom" ]; then echo "FAIL, qsfp eeprom file does not exist. " echo "qsfp eeprom file path: ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf '%04x' $eepromAddr)/eeprom" return fi qsfp_info=$(base64 ${PATH_SYS_I2C_DEVICES}/$eeprombus-$(printf "%04x" $eepromAddr)/eeprom) identifier=$(echo $qsfp_info | base64 -d -i | hexdump -s 128 -n 1 -e '"%x"') connector=$(echo $qsfp_info | base64 -d -i | hexdump -s 130 -n 1 -e '"%x"') transceiver=$(echo $qsfp_info | base64 -d -i | hexdump -s 131 -n 1 -e '"%x"') echo "------------------------------" echo "identifier = $identifier" echo "connector = $connector" echo "transceiver = $transceiver" } #Init PSU Kernel Module function _i2c_psu_init { echo "=========================================================" echo "# Description: I2C PSU Init" echo "=========================================================" modprobe ingrasys_s9200_64x_psu echo "psu1 ${I2C_ADDR_PSU_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU1_EEPROM}/new_device echo "psu2 ${I2C_ADDR_PSU_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU2_EEPROM}/new_device } #Get PSU EEPROM Information function _i2c_psu_eeprom_get { local eeprom_psu1="" local eeprom_psu2="" echo "=========================================================" echo "# Description: I2C PSU EEPROM Get..." echo "=========================================================" echo "PUS1 EEPROM" eeprom_psu1="${PATH_SYSFS_PSU1}/psu_eeprom" cat ${eeprom_psu1} | hexdump -C echo "------------------------------" echo "PUS2 EEPROM" eeprom_psu2="${PATH_SYSFS_PSU2}/psu_eeprom" cat ${eeprom_psu2} | hexdump -C } #Get MotherBoard EEPROM Information function _i2c_mb_eeprom_get { local path_i2c_dev=${PATH_SYS_I2C_DEVICES} local i2c_bus=${I2C_BUS_MB_EEPROM} local i2c_addr=${I2C_ADDR_MB_EEPROM} echo "=========================================================" echo "# Description: I2C MB EEPROM Get" echo "=========================================================" ## MB EEPROM cat ${path_i2c_dev}/${i2c_bus}-$(printf "%04x" ${i2c_addr})/eeprom | hexdump -v -C } #Get CPU EEPROM Information function _i2c_cpu_eeprom_get { local path_i2c_dev=${PATH_SYS_I2C_DEVICES} local i2c_bus=${I2C_BUS_CPU_EEPROM} local i2c_addr=${I2C_ADDR_CPU_EEPROM} echo "=========================================================" echo "# Description: I2C CPU EEPROM Get" echo "=========================================================" ## CPU EEPROM cat ${path_i2c_dev}/${i2c_bus}-$(printf "%04x" ${i2c_addr})/eeprom | hexdump -v -C } #Set FAN Tray LED function _i2c_fan_tray_led { local value=0 echo "=========================================================" echo "# Description: Set Fan Tray LED" echo "=========================================================" case ${FAN_TRAY} in 1) ioPort=$REG_OUT_0 if [ "${COLOR_LED}" == "green" ]; then mask=${BIT_MASK[0]} elif [ "${COLOR_LED}" == "amber" ]; then mask=${BIT_MASK[1]} fi ;; 2) ioPort=$REG_OUT_0 if [ "${COLOR_LED}" == "green" ]; then mask=${BIT_MASK[4]} elif [ "${COLOR_LED}" == "amber" ]; then mask=${BIT_MASK[5]} fi ;; 3) ioPort=$REG_OUT_1 if [ "${COLOR_LED}" == "green" ]; then mask=${BIT_MASK[0]} elif [ "${COLOR_LED}" == "amber" ]; then mask=${BIT_MASK[1]} fi ;; 4) ioPort=$REG_OUT_1 if [ "${COLOR_LED}" == "green" ]; then mask=${BIT_MASK[4]} elif [ "${COLOR_LED}" == "amber" ]; then mask=${BIT_MASK[5]} fi ;; *) echo "Please input 1~4" exit ;; esac if [ "${ONOFF_LED}" == "on" ]; then value=0xFF elif [ "${ONOFF_LED}" == "off" ]; then value=0x00 else echo "Invalid Parameters ${ONOFF_LED}, Exit!!!" _help exit ${FALSE} fi i2cset -m $mask -y -r ${I2C_BUS_FAN_BOARD} ${I2C_ADDR_FAN_BOARD} $ioPort $value } #Set System Status LED function _i2c_sys_led { local value=0 local mask=${BIT_MASK[0]} if [ "${COLOR_LED}" == "green" ]; then value=0xFF elif [ "${COLOR_LED}" == "amber" ]; then value=0x00 else echo "Invalid Parameters ${COLOR_LED}, Exit!!!" _help exit ${FALSE} fi _i2c_set_led $value $mask } #Set FAN LED function _i2c_fan_led { local value=0 local mask=${BIT_MASK[2]} if [ "${COLOR_LED}" == "green" ]; then value=0x00 elif [ "${COLOR_LED}" == "amber" ]; then value=0xFF else echo "Invalid Parameters ${COLOR_LED}, Exit!!!" _help exit ${FALSE} fi _i2c_set_led $value $mask } #Set PSU1 LED function _i2c_psu1_led { local value=0 local mask=${BIT_MASK[3]} if [ "${COLOR_LED}" == "green" ]; then value=0x00 elif [ "${COLOR_LED}" == "amber" ]; then value=0xFF else echo "Invalid Parameters ${COLOR_LED}, Exit!!!" _help exit ${FALSE} fi _i2c_set_led $value $mask } #Set PSU2 LED function _i2c_psu2_led { local reg=${REG_OUT_0} local value=0 local mask=${BIT_MASK[4]} if [ "${COLOR_LED}" == "green" ]; then value=0x00 elif [ "${COLOR_LED}" == "amber" ]; then value=0xFF else echo "Invalid Parameters ${COLOR_LED}, Exit!!!" _help exit ${FALSE} fi _i2c_set_led $value $mask } #Set LEDs in LED Board function _i2c_set_led { local value=$1 local mask=$2 local reg=${REG_OUT_0} local i2c_bus=$I2C_BUS_LED_BOARD local i2c_addr=$I2C_ADDR_LED_BOARD _i2c_set $i2c_bus $i2c_addr $reg $mask $value } #Reset all system leds function _i2c_reset_led { local mask=0xFF local value=$((2#00000011)) local reg=${REG_OUT_0} local i2c_bus=$I2C_BUS_LED_BOARD local i2c_addr=$I2C_ADDR_LED_BOARD _i2c_set $i2c_bus $i2c_addr $reg $mask $value } #Get Mother Board Version and Type function _i2c_board_type_get { echo "=========================================================" echo "# Description: I2C MB Board Type Get" echo "=========================================================" local i2c_bus=${I2C_BUS_ID_GPIO} local i2c_addr=${I2C_ADDR_ID_GPIO} local reg=${REG_IN_1} local value=0 value=$(_i2c_get $i2c_bus $i2c_addr $reg) #Bit 0-1 boardBuildRev=$((value & 0x03)) #Bit 2-3 boardHwRev=$((value >> 2 & 0x03)) #Bit 4-7 boardId=$((value>>4)) printf "[MB BOARD_ID] = 0x%02x, [HW Rev] = %d, [Build Rev] = %d\n" $boardId $boardHwRev $boardBuildRev } #Get Board Version and Type from Dummy BMC Board function _i2c_bmc_board_type_get { echo "=========================================================" echo "# Description: I2C BMC Board Type Get" echo "=========================================================" local i2c_bus=${I2C_BUS_BMC_BOARD_TYPE} local i2c_addr=${I2C_ADDR_BMC_BOARD_TYPE} local reg=${REG_IN_1} local value=0 value=$(_i2c_get $i2c_bus $i2c_addr $reg) #Bit 0-1 boardBuildRev=$((($value) & 0x03)) #Bit 2-3 boardHwRev=$((($value) >> 2 & 0x03)) #Bit 4-7 boardId=$((($value) >> 4)) printf "[BMC BOARD_ID] = 0x%02x, [HW Rev] = %d, [Build Rev] = %d\n" $boardId $boardHwRev $boardBuildRev } #Get CPLD Version function _i2c_cpld_version { echo "=========================================================" echo "# Description: CPLD Version" echo "=========================================================" cat ${PATH_SYS_CPLD}/cpld_version } #Get PSU Status function _i2c_psu_status { local psu_abs="" psu1PwGood=`cat ${PATH_SYSFS_PSU1}/psu_pg` psu_abs=`cat ${PATH_SYSFS_PSU1}/psu_abs` if [ "$psu_abs" == "0" ]; then psu1Exist=1 else psu1Exist=0 fi psu2PwGood=`cat ${PATH_SYSFS_PSU2}/psu_pg` psu_abs=`cat ${PATH_SYSFS_PSU2}/psu_abs` if [ "$psu_abs" == "0" ]; then psu2Exist=1 else psu2Exist=0 fi printf "PSU1 Exist:%x PSU1 PW Good:%d\n" $psu1Exist $psu1PwGood printf "PSU2 Exist:%d PSU2 PW Good:%d\n" $psu2Exist $psu2PwGood } #Set 10G Mux to CPU or Front Panel function _i2c_10g_mux { echo "=========================================================" echo "# Description: 10G Mux" echo "=========================================================" local target=${TARGET_10G_MUX} local i2c_bus=${I2C_BUS_10GMUX} local i2c_addr=${I2C_ADDR_10GMUX} local reg=0 local mask=0xff local value=0 local file_10g_mux="${PATH_SYS_CPLD}/cpld_10g_mux" #get current 10g mux register value on CPLD value=`cat ${file_10g_mux}` if [ "${target}" == "cpu" ]; then #Set XE0: slave address access _i2c_set $i2c_bus $i2c_addr 0x06 $mask 0x18 #Set XE0: CH4 D_IN0-S_OUTA0 EQ _i2c_set $i2c_bus $i2c_addr 0x2c $mask 0x00 #Set XE0: CH5 NC-S_OUTB0 DEM _i2c_set $i2c_bus $i2c_addr 0x35 $mask 0x80 #Set XE0: CH5 NC-S_OUTB0 VOD _i2c_set $i2c_bus $i2c_addr 0x34 $mask 0xab #Set XE0: CH1 D_OUT0-S_INB0 EQ _i2c_set $i2c_bus $i2c_addr 0x16 $mask 0x01 #Set XE0: CH1 D_OUT0-S_INB0 DEM _i2c_set $i2c_bus $i2c_addr 0x18 $mask 0x80 #Set XE0: CH1 D_OUT0-S_INB0 VOD _i2c_set $i2c_bus $i2c_addr 0x17 $mask 0xab #Set XE1: CH6 D_IN1-S_OUTA1 EQ _i2c_set $i2c_bus $i2c_addr 0x3a $mask 0x00 #Set XE1: CH7 NC-S_OUTB1 EQ _i2c_set $i2c_bus $i2c_addr 0x41 $mask 0x00 #Set XE1: CH7 NC-S_OUTB1 DEM _i2c_set $i2c_bus $i2c_addr 0x43 $mask 0x80 #Set XE1: CH7 NC-S_OUTB1 VOD _i2c_set $i2c_bus $i2c_addr 0x42 $mask 0xab #Set XE1: CH3 D_OUT1-S_INB1 EQ _i2c_set $i2c_bus $i2c_addr 0x24 $mask 0x01 #Set XE1: CH3 D_OUT1-S_INB1 DEM _i2c_set $i2c_bus $i2c_addr 0x26 $mask 0x80 #Set XE1: CH3 D_OUT1-S_INB1 VOD _i2c_set $i2c_bus $i2c_addr 0x25 $mask 0xab #Enable auto negotiation of XE ports eval "bcmcmd 'port xe0,xe1 an=1 if=kr en=1'" #delay 1 sec sleep 1 #switch 10G MUX to cpu on CPLD value=$(( value & 0xf3 )) echo "$(printf "%x" ${value})" > ${file_10g_mux} echo "Switch 10G Mux to [CPU]" elif [ "${COLOR_LED}" == "fp" ]; then #Set XE0: slave address access _i2c_set $i2c_bus $i2c_addr 0x06 $mask 0x18 #Set XE0: CH4 D_IN0-S_OUTA0 EQ _i2c_set $i2c_bus $i2c_addr 0x2c $mask 0x00 #Set XE0: CH4 D_IN0-S_OUTA0 DEM _i2c_set $i2c_bus $i2c_addr 0x2e $mask 0x80 #Set XE0: CH4 D_IN0-S_OUTA0 VOD _i2c_set $i2c_bus $i2c_addr 0x2d $mask 0xab #Set XE0: CH0 NC-S_INA0 EQ _i2c_set $i2c_bus $i2c_addr 0x0f $mask 0x00 #Set XE0: CH1 D_OUT0-S_INB0 DEM _i2c_set $i2c_bus $i2c_addr 0x18 $mask 0x80 #Set XE0: CH1 D_OUT0-S_INB0 VOD _i2c_set $i2c_bus $i2c_addr 0x17 $mask 0xab #Set XE1: CH6 D_IN1-S_OUTA1 EQ _i2c_set $i2c_bus $i2c_addr 0x3a $mask 0x00 #Set XE1: CH6 D_IN1-S_OUTA1 DEM _i2c_set $i2c_bus $i2c_addr 0x3c $mask 0x80 #Set XE1: CH6 D_IN1-S_OUTA1 VOD _i2c_set $i2c_bus $i2c_addr 0x3b $mask 0xab #Set XE1: CH2 NC-S_INA1 EQ _i2c_set $i2c_bus $i2c_addr 0x1d $mask 0x00 #Set XE1: CH3 D_OUT1-S_INB1 DEM _i2c_set $i2c_bus $i2c_addr 0x26 $mask 0x80 #Set XE1: CH3 D_OUT1-S_INB1 VOD _i2c_set $i2c_bus $i2c_addr 0x25 $mask 0xab #Enable auto negotiation of XE ports eval "bcmcmd 'port xe0,xe1 an=0 if=kr en=1'" #delay 1 sec sleep 1 #switch 10G MUX to front panel on CPLD value=$(( value | 0x0c )) echo "$(printf "%x" ${value})" > ${file_10g_mux} echo "Switch 10G Mux to [Front Panel]" else echo "invalid target, please set target to cpu/fp" fi } #Increase read socket buffer for CoPP Test function _config_rmem { echo "109430400" > /proc/sys/net/core/rmem_max } #Main Function function _main { start_time_str=`date` start_time_sec=$(date +%s) if [ "${EXEC_FUNC}" == "help" ]; then _help elif [ "${EXEC_FUNC}" == "i2c_init" ]; then _i2c_init elif [ "${EXEC_FUNC}" == "i2c_deinit" ]; then _i2c_deinit elif [ "${EXEC_FUNC}" == "i2c_temp_init" ]; then _i2c_temp_init elif [ "${EXEC_FUNC}" == "i2c_fan_init" ]; then _i2c_fan_init elif [ "${EXEC_FUNC}" == "i2c_volmon_init" ]; then _i2c_volmon_init elif [ "${EXEC_FUNC}" == "i2c_io_exp_init" ]; then _i2c_io_exp_init elif [ "${EXEC_FUNC}" == "i2c_led_test" ]; then _i2c_led_test elif [ "${EXEC_FUNC}" == "i2c_mb_eeprom_get" ]; then _i2c_mb_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_cpu_eeprom_get" ]; then _i2c_cpu_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_psu_eeprom_get" ]; then _i2c_psu_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_eeprom_get" ]; then _i2c_qsfp_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_eeprom_init" ]; then _i2c_qsfp_eeprom_init ${QSFP_INIT_ACTION} elif [ "${EXEC_FUNC}" == "i2c_mb_eeprom_init" ]; then _i2c_mb_eeprom_init ${MB_EEPROM_ACTION} elif [ "${EXEC_FUNC}" == "i2c_cpu_eeprom_init" ]; then _i2c_cpu_eeprom_init ${MB_EEPROM_ACTION} elif [ "${EXEC_FUNC}" == "i2c_qsfp_status_get" ]; then _i2c_qsfp_status_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_type_get" ]; then _i2c_qsfp_type_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_signal_get" ]; then _i2c_qsfp_signal_get ${QSFP_PORT} ${QSFP_ACTION} elif [ "${EXEC_FUNC}" == "i2c_qsfp_signal_set" ]; then _i2c_qsfp_signal_set ${QSFP_PORT} ${QSFP_ACTION} ${QSFP_VALUE} elif [ "${EXEC_FUNC}" == "i2c_led_psu_status_set" ]; then _i2c_led_psu_status_set elif [ "${EXEC_FUNC}" == "i2c_led_fan_status_set" ]; then _i2c_led_fan_status_set elif [ "${EXEC_FUNC}" == "i2c_led_fan_tray_status_set" ]; then _i2c_led_fan_tray_status_set elif [ "${EXEC_FUNC}" == "i2c_led_fan_tray_test" ]; then _i2c_led_fan_tray_test elif [ "${EXEC_FUNC}" == "i2c_sys_led" ]; then _i2c_sys_led elif [ "${EXEC_FUNC}" == "i2c_fan_led" ]; then _i2c_fan_led elif [ "${EXEC_FUNC}" == "i2c_fan_tray_led" ]; then _i2c_fan_tray_led elif [ "${EXEC_FUNC}" == "i2c_psu1_led" ]; then _i2c_psu1_led elif [ "${EXEC_FUNC}" == "i2c_psu2_led" ]; then _i2c_psu2_led elif [ "${EXEC_FUNC}" == "i2c_board_type_get" ]; then _i2c_board_type_get elif [ "${EXEC_FUNC}" == "i2c_bmc_board_type_get" ]; then _i2c_bmc_board_type_get elif [ "${EXEC_FUNC}" == "i2c_cpld_version" ]; then _i2c_cpld_version elif [ "${EXEC_FUNC}" == "i2c_psu_status" ]; then _i2c_psu_status elif [ "${EXEC_FUNC}" == "i2c_test_all" ]; then _i2c_deinit _i2c_init _i2c_led_test _i2c_psu_eeprom_get _i2c_mb_eeprom_get _i2c_cpu_eeprom_get _i2c_board_type_get _i2c_bmc_board_type_get _i2c_cpld_version _i2c_psu_status elif [ "${EXEC_FUNC}" == "i2c_10g_mux" ]; then _i2c_10g_mux else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi end_time_str=`date` end_time_sec=$(date +%s) diff_time=$[ ${end_time_sec} - ${start_time_sec} ] echo "------------------------------" echo "Total Execution Time: ${diff_time} sec" echo "DONE" } _main