#!/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 . # trun on for more debug output #DEBUG="on" VERSION="1.0.0" TRUE=200 FALSE=404 EXEC_FUNC=${1} COLOR_LED=${2} QSFP_PORT=${2} SFP_PORT=${2} QSFP_ACTION=${2} SFP_ACTION=${2} MB_EEPROM_ACTION=${2} 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 ### NUM_I801_DEVICE=0 # PCA9548#0 0x70 NUM_MUX_9548_0_CH0=$(( ${NUM_I801_DEVICE} + 1 )) # CPLD1 NUM_MUX_9548_0_CH1=$(( ${NUM_I801_DEVICE} + 2 )) # CPLD2 NUM_MUX_9548_0_CH2=$(( ${NUM_I801_DEVICE} + 3 )) # CPLD3 NUM_MUX_9548_0_CH3=$(( ${NUM_I801_DEVICE} + 4 )) # CPLD4 NUM_MUX_9548_0_CH4=$(( ${NUM_I801_DEVICE} + 5 )) # CPLD5 NUM_MUX_9548_0_CH5=$(( ${NUM_I801_DEVICE} + 6 )) # LM75_1 LM75_2 LM86 NUM_MUX_9548_0_CH6=$(( ${NUM_I801_DEVICE} + 7 )) # LM75_3 LM75_4 # PCA9548#1 0x73 NUM_MUX_9548_1_CH0=$(( ${NUM_I801_DEVICE} + 9 )) # UCD9090 NUM_MUX_9548_1_CH1=$(( ${NUM_I801_DEVICE} + 10 )) # PCA9539#0 0x76 for FP LED & HW ID NUM_MUX_9548_1_CH2=$(( ${NUM_I801_DEVICE} + 11 )) # NONE NUM_MUX_9548_1_CH3=$(( ${NUM_I801_DEVICE} + 12 )) # EEPROM for debug 0x57 #NUM_MUX_9548_1_CH4=$(( ${NUM_I801_DEVICE} + 13 )) # NONE NUM_MUX_9548_1_CH5=$(( ${NUM_I801_DEVICE} + 14 )) # CLK gen NUM_MUX_9548_1_CH6=$(( ${NUM_I801_DEVICE} + 15 )) # ROV NUM_MUX_9548_1_CH7=$(( ${NUM_I801_DEVICE} + 16 )) # HWM on BMC # PCA9546#0 0X72 NUM_MUX_9546_0_CH0=$(( ${NUM_I801_DEVICE} + 17 )) # PSU1 0x58 NUM_MUX_9546_0_CH1=$(( ${NUM_I801_DEVICE} + 18 )) # PSU2 0x58 NUM_MUX_9546_0_CH2=$(( ${NUM_I801_DEVICE} + 19 )) # NONE NUM_MUX_9546_0_CH3=$(( ${NUM_I801_DEVICE} + 20 )) # NONE # PCA9548#2 0X71 NUM_MUX_9548_2_CH0=$(( ${NUM_I801_DEVICE} + 21 )) # PCA9548#3 0x74 NUM_MUX_9548_2_CH1=$(( ${NUM_I801_DEVICE} + 22 )) # PCA9548#4 0x74 NUM_MUX_9548_2_CH2=$(( ${NUM_I801_DEVICE} + 23 )) # PCA9548#5 0x74 NUM_MUX_9548_2_CH3=$(( ${NUM_I801_DEVICE} + 24 )) # PCA9548#6 0x74 NUM_MUX_9548_2_CH4=$(( ${NUM_I801_DEVICE} + 25 )) # PCA9548#7 0x74 NUM_MUX_9548_2_CH5=$(( ${NUM_I801_DEVICE} + 26 )) # PCA9548#8 0x74 NUM_MUX_9548_2_CH6=$(( ${NUM_I801_DEVICE} + 27 )) # PCA9548#9 0x74 NUM_MUX_9548_2_CH7=$(( ${NUM_I801_DEVICE} + 28 )) # PCA9548#10 0x74 # PCA9546#1 0X77 NUM_MUX_9546_1_CH0=$(( ${NUM_I801_DEVICE} + 29 )) # SFP0 EEPROM 0x50 NUM_MUX_9546_1_CH1=$(( ${NUM_I801_DEVICE} + 30 )) # SFP1 EEPROM 0x50 NUM_MUX_9546_1_CH2=$(( ${NUM_I801_DEVICE} + 31 )) # NONE NUM_MUX_9546_1_CH3=$(( ${NUM_I801_DEVICE} + 32 )) # PCA9539#1 0x76 for sys control # PCA9548#11 0X75 NUM_MUX_9548_11_CH0=$(( ${NUM_I801_DEVICE} + 33 )) # SW upgrade for CPLD1 NUM_MUX_9548_11_CH1=$(( ${NUM_I801_DEVICE} + 34 )) # SW upgrade for CPLD2 NUM_MUX_9548_11_CH2=$(( ${NUM_I801_DEVICE} + 35 )) # SW upgrade for CPLD3 NUM_MUX_9548_11_CH3=$(( ${NUM_I801_DEVICE} + 36 )) # SW upgrade for CPLD4 NUM_MUX_9548_11_CH4=$(( ${NUM_I801_DEVICE} + 37 )) # SW upgrade for CPLD5 NUM_MUX_9548_11_CH5=$(( ${NUM_I801_DEVICE} + 38 )) # EEPROM for debug 0x57 NUM_MUX_9548_11_CH6=$(( ${NUM_I801_DEVICE} + 39 )) # Retimer#0~3 NUM_MUX_9548_11_CH7=$(( ${NUM_I801_DEVICE} + 40 )) # Retimer#4~7 # PCA9548#3~10 0X74 NUM_MUX_9548_3_CH0=$(( ${NUM_I801_DEVICE} + 41 )) # QSFP 0 EEPROM NUM_MUX_9548_4_CH0=$(( ${NUM_I801_DEVICE} + 49 )) # QSFP 8 EEPROM NUM_MUX_9548_5_CH0=$(( ${NUM_I801_DEVICE} + 57 )) # QSFP 16 EEPROM NUM_MUX_9548_6_CH0=$(( ${NUM_I801_DEVICE} + 65 )) # QSFP 24 EEPROM NUM_MUX_9548_7_CH0=$(( ${NUM_I801_DEVICE} + 73 )) # QSFP 32 EEPROM NUM_MUX_9548_8_CH0=$(( ${NUM_I801_DEVICE} + 81 )) # QSFP 40 EEPROM NUM_MUX_9548_9_CH0=$(( ${NUM_I801_DEVICE} + 89 )) # QSFP 48 EEPROM NUM_MUX_9548_10_CH0=$(( ${NUM_I801_DEVICE} + 97 )) # QSFP 56 EEPROM # MUX Alias I2C_BUS_MAIN=${NUM_I801_DEVICE} I2C_BUS_HWM=${NUM_MUX_9548_1_CH7} I2C_BUS_FAN_STATUS=${I2C_BUS_MAIN} I2C_BUS_SYS_LED=${NUM_MUX_9548_1_CH1} I2C_BUS_HW_ID=${NUM_MUX_9548_1_CH1} I2C_BUS_BMC_HW_ID=${I2C_BUS_MAIN} I2C_BUS_PSU_STAT=${I2C_BUS_MAIN} I2C_BUS_FANTRAY_LED=${I2C_BUS_MAIN} I2C_BUS_MB_EEPROM=${I2C_BUS_MAIN} I2C_BUS_CB_EEPROM=${I2C_BUS_MAIN} # TODO: check i2c channel of PSU1/PSU2, it swap in s9230 I2C_BUS_PSU1_EEPROM=${NUM_MUX_9546_0_CH1} I2C_BUS_PSU2_EEPROM=${NUM_MUX_9546_0_CH0} I2C_BUS_CPLD1=${NUM_MUX_9548_0_CH0} I2C_BUS_CPLD2=${NUM_MUX_9548_0_CH1} I2C_BUS_CPLD3=${NUM_MUX_9548_0_CH2} I2C_BUS_CPLD4=${NUM_MUX_9548_0_CH3} I2C_BUS_CPLD5=${NUM_MUX_9548_0_CH4} I2C_BUS_ROV=${NUM_MUX_9548_1_CH6} # I2C BUS path PATH_SYS_I2C_DEVICES="/sys/bus/i2c/devices" PATH_HWMON_ROOT_DEVICES="/sys/class/hwmon" # TODO: need to verify HWM deivce path after board ready PATH_HWMON_W83795_DEVICE="${PATH_HWMON_ROOT_DEVICES}/hwmon1" PATH_I801_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_I801_DEVICE}" PATH_MUX_9548_0_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH0}" PATH_MUX_9548_0_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH1}" PATH_MUX_9548_0_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH2}" PATH_MUX_9548_0_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH3}" PATH_MUX_9548_0_CH4="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH4}" PATH_MUX_9548_0_CH5="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH5}" PATH_MUX_9548_0_CH6="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH6}" PATH_MUX_9548_0_CH7="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_0_CH7}" PATH_MUX_9548_1_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH0}" PATH_MUX_9548_1_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH1}" PATH_MUX_9548_1_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH2}" PATH_MUX_9548_1_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH3}" PATH_MUX_9548_1_CH4="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH4}" PATH_MUX_9548_1_CH5="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH5}" PATH_MUX_9548_1_CH6="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH6}" PATH_MUX_9548_1_CH7="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_1_CH7}" PATH_MUX_9548_2_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH0}" PATH_MUX_9548_2_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH1}" PATH_MUX_9548_2_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH2}" PATH_MUX_9548_2_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH3}" PATH_MUX_9548_2_CH4="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH4}" PATH_MUX_9548_2_CH5="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH5}" PATH_MUX_9548_2_CH6="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH6}" PATH_MUX_9548_2_CH7="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_2_CH7}" PATH_MUX_9546_0_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_0_CH0}" PATH_MUX_9546_0_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_0_CH1}" PATH_MUX_9546_0_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_0_CH2}" PATH_MUX_9546_0_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_0_CH3}" PATH_MUX_9546_1_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_1_CH0}" PATH_MUX_9546_1_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_1_CH1}" PATH_MUX_9546_1_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_1_CH2}" PATH_MUX_9546_1_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9546_1_CH3}" PATH_MUX_9548_11_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_11_CH0}" PATH_MUX_9548_3_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_3_CH0}" PATH_MUX_9548_4_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_4_CH0}" PATH_MUX_9548_5_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_5_CH0}" PATH_MUX_9548_6_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_6_CH0}" PATH_MUX_9548_7_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_7_CH0}" PATH_MUX_9548_8_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_8_CH0}" PATH_MUX_9548_9_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_9_CH0}" PATH_MUX_9548_10_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_10_CH0}" PATH_CPLD1_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CPLD1}" PATH_CPLD2_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CPLD2}" PATH_CPLD3_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CPLD3}" PATH_CPLD4_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CPLD4}" PATH_CPLD5_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CPLD5}" # I2C Address ### I2C MUX I2C_ADDR_MUX_9548_0=0x70 I2C_ADDR_MUX_9548_1=0x73 I2C_ADDR_MUX_9548_2=0x71 I2C_ADDR_MUX_9546_0=0x72 I2C_ADDR_MUX_9546_1=0x71 I2C_ADDR_MUX_9548_11=0x75 I2C_ADDR_MUX_9548_3=0x74 I2C_ADDR_MUX_9548_4=0x74 I2C_ADDR_MUX_9548_5=0x74 I2C_ADDR_MUX_9548_6=0x74 I2C_ADDR_MUX_9548_7=0x74 I2C_ADDR_MUX_9548_8=0x74 I2C_ADDR_MUX_9548_9=0x74 I2C_ADDR_MUX_9548_10=0x74 ### GPIO Expander I2C_ADDR_MUX_9539_0=0x76 # LED & HW ID I2C_ADDR_MUX_9539_1=0x76 # SYS config I2C_ADDR_MUX_9539_2=0x76 # on CPU board, STATUS and ERR from CPLD I2C_ADDR_MUX_9555_0=0x20 # on FAN board, fan status and led config I2C_ADDR_MUX_9555_1=0x24 # on BMC board, INT and HW ID I2C_ADDR_MUX_9555_2=0x25 # on BMC board, PSU status I2C_ADDR_MUX_9555_3=0x26 # on BMC board, RST and SEL ### peripheral I2C_ADDR_MB_EEPROM=0x55 # on main board I2C_ADDR_CB_EEPROM=0x51 # on cpu board I2C_ADDR_UCD9090=0x34 I2C_ADDR_W83795=0x2F I2C_ADDR_PSU1_EEPROM=0x50 I2C_ADDR_PSU2_EEPROM=0x50 I2C_ADDR_LM75_1=0x4D # Rear Panel I2C_ADDR_LM75_2=0x4E # Rear MAC I2C_ADDR_LM86=0x4C # TBD I2C_ADDR_LM75_3=0x4D # Front Panel I2C_ADDR_LM75_4=0x4E # Front MAC I2C_ADDR_TMP75_CB=0x4F # on cpu board I2C_ADDR_TMP75_BB=0x4A # on bmc board I2C_ADDR_QSFP_EEPROM=0x50 I2C_ADDR_SFP_EEPROM=0x50 I2C_ADDR_CPLD=0x33 I2C_ADDR_ROV=0x76 #sysfs PATH_SYSFS_PSU1="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU1_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU1_EEPROM)" PATH_SYSFS_PSU2="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_PSU2_EEPROM}-$(printf "%04x" $I2C_ADDR_PSU2_EEPROM)" #ACTIVE LOW enable flag ACTIVE_LOW_EN=1 ACTIVE_HIGH_EN=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 # IO expander register # direction REG_PORT0_DIR=6 REG_PORT1_DIR=7 # polarity REG_PORT0_POL=4 REG_PORT1_POL=5 # output REG_PORT0_OUT=2 REG_PORT1_OUT=3 # input REG_PORT0_IN=0 REG_PORT1_IN=1 # qsfp port number range MIN_QSFP_PORT_NUM=1 MAX_QSFP_PORT_NUM=64 # sfp+ port number range MIN_SFP_PORT_NUM=1 MAX_SFP_PORT_NUM=2 # CPLD access # ROV status CPLD_ROV_STATUS_KEY=cpld_rov_status # port status CPLD_QSFP_STATUS_KEY=cpld_qsfp_port_status CPLD_SFP_STATUS_KEY=cpld_sfp_port_status # bit define CPLD_QSFP_STATUS_ABS_BIT=1 CPLD_SFP0_STATUS_PRES_BIT=0 CPLD_SFP1_STATUS_PRES_BIT=4 # fp port to phy port mapping fp2phy_array=( 0 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 32 33 36 37 40 41 44 45 48 49 52 53 56 57 60 61 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 34 35 38 39 42 43 46 47 50 51 54 55 58 59 62 63) # fp port to led port mapping fp2led_array=( 1 2 5 6 9 10 13 14 1 2 5 6 9 10 13 14 1 2 5 6 9 10 13 14 1 2 5 6 9 10 13 14 3 4 7 8 11 12 15 16 3 4 7 8 11 12 15 16 3 4 7 8 11 12 15 16 3 4 7 8 11 12 15 16) # vdd value for mac rov_val_array=( 0.85 0.82 0.77 0.87 0.74 0.84 0.79 0.89 ) rov_reg_array=( 0x79 0x73 0x69 0x7D 0x63 0x77 0x6D 0x81 ) # 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_fan_speed_init" echo " : ${0} i2c_io_exp_init" echo " : ${0} i2c_led_test" echo " : ${0} i2c_psu_eeprom_get" echo " : ${0} i2c_mb_eeprom_get" echo " : ${0} i2c_cb_eeprom_get" echo " : ${0} i2c_qsfp_eeprom_get [${MIN_QSFP_PORT_NUM}-${MAX_QSFP_PORT_NUM}]" echo " : ${0} i2c_sfp_eeprom_get [${MIN_SFP_PORT_NUM}-${MAX_SFP_PORT_NUM}]" echo " : ${0} i2c_qsfp_eeprom_init new|delete" echo " : ${0} i2c_sfp_eeprom_init new|delete" echo " : ${0} i2c_mb_eeprom_init new|delete" echo " : ${0} i2c_cb_eeprom_init new|delete" echo " : ${0} i2c_qsfp_status_get [${MIN_QSFP_PORT_NUM}-${MAX_QSFP_PORT_NUM}]" echo " : ${0} i2c_sfp_status_get [${MIN_SFP_PORT_NUM}-${MAX_SFP_PORT_NUM}]" echo " : ${0} i2c_qsfp_type_get [${MIN_QSFP_PORT_NUM}-${MAX_QSFP_PORT_NUM}]" echo " : ${0} i2c_sfp_type_get [${MIN_SFP_PORT_NUM}-${MAX_SFP_PORT_NUM}]" echo " : ${0} i2c_qsfp_ddm_get [${MIN_QSFP_PORT_NUM}-${MAX_QSFP_PORT_NUM}]" echo " : ${0} i2c_board_type_get" echo " : ${0} i2c_bmc_board_type_get" echo " : ${0} i2c_cpld_version" 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_test_all" echo " : ${0} i2c_sys_led green|amber" echo " : ${0} i2c_fan_led green|amber|off" echo " : ${0} i2c_psu1_led green|amber|off" echo " : ${0} i2c_psu2_led green|amber|off" echo " : ${0} i2c_fan_tray_led green|amber on|off [1-4]" echo "----------------------------------------------------" } #Pause function function _pause { read -p "$*" } #Retry command function function _retry { local i for i in {1..5}; do echo "${*}" eval "${*}" && break || echo "retry"; sleep 1; done } # front panel port to physical port mapping function _port_fp2phy { local fp_port=$1 local phy_port=0 local index=$((${fp_port} - 1)) # change to 1 base index for internal use phy_port=$((${fp2phy_array[$index]} + 1)) #phy_port=${fp2phy_array[$index]} echo $phy_port } #front panel port to led port mapping function _port_fp2led { local logic_port=$1 local led_port=0 led_port=${fp2led_array[$logic_port]} echo $led_port } #I2C Init function _i2c_init { echo "=========================================================" echo "# Description: I2C Init" echo "=========================================================" #remove optoe module rmmod optoe #rmmod i2c_ismt _util_rmmod i2c_i801 modprobe i2c_i801 modprobe i2c_dev modprobe i2c_mux_pca954x force_deselect_on_exit=1 # add MUX PCA9548#0 on I801, assume to be i2c-1~8 if [ ! -e ${PATH_MUX_9548_0_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_0}' > ${PATH_I801_DEVICE}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_0} already init." fi # add MUX PCA9548#1 on I801, assume to be i2c-9~16 if [ ! -e ${PATH_MUX_9548_1_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_1}' > ${PATH_I801_DEVICE}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_1} already init." fi # add MUX PCA9546#0 on I801, assume to be i2c-17~20 if [ ! -e ${PATH_MUX_9546_0_CH0} ]; then _retry "echo 'pca9546 ${I2C_ADDR_MUX_9546_0}' > ${PATH_I801_DEVICE}/new_device" else echo "pca9546 ${I2C_ADDR_MUX_9546_0} already init." fi # add MUX PCA9548#2 on I801, assume to be i2c-21~28 if [ ! -e ${PATH_MUX_9548_2_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_2}' > ${PATH_MUX_9546_0_CH2}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_2} already init." fi # add MUX PCA9546#1 on I801, assume to be i2c-29~32 if [ ! -e ${PATH_MUX_9546_1_CH0} ]; then _retry "echo 'pca9546 ${I2C_ADDR_MUX_9546_1}' > ${PATH_MUX_9546_0_CH3}/new_device" else echo "pca9546 ${I2C_ADDR_MUX_9546_1} already init." fi # add MUX PCA9548#11 on I801, assume to be i2c-33~40 if [ ! -e ${PATH_MUX_9548_11_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_11}' > ${PATH_I801_DEVICE}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_11} already init." fi # add MUX PCA9548#3 on PCA9548#2 CH0, assume to be i2c-41~48 if [ ! -e ${PATH_MUX_9548_3_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_3}' > ${PATH_MUX_9548_2_CH0}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_4} already init." fi # add MUX PCA9548#4 on PCA9548#2 CH1, assume to be i2c-49~56 if [ ! -e ${PATH_MUX_9548_4_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_4}' > ${PATH_MUX_9548_2_CH1}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_4} already init." fi # add MUX PCA9548#5 on PCA9548#2 CH2, assume to be i2c-57~64 if [ ! -e ${PATH_MUX_9548_5_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_5}' > ${PATH_MUX_9548_2_CH2}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_5} already init." fi # add MUX PCA9548#6 on PCA9548#2 CH3, assume to be i2c-65~72 if [ ! -e ${PATH_MUX_9548_6_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_6}' > ${PATH_MUX_9548_2_CH3}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_6} already init." fi # add MUX PCA9548#7 on PCA9548#2 CH4, assume to be i2c-73~80 if [ ! -e ${PATH_MUX_9548_7_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_7}' > ${PATH_MUX_9548_2_CH4}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_7} already init." fi # add MUX PCA9548#8 on PCA9548#2 CH5, assume to be i2c-81~88 if [ ! -e ${PATH_MUX_9548_8_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_8}' > ${PATH_MUX_9548_2_CH5}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_8} already init." fi # add MUX PCA9548#9 on PCA9548#2 CH6, assume to be i2c-89~96 if [ ! -e ${PATH_MUX_9548_9_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_9}' > ${PATH_MUX_9548_2_CH6}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_9} already init." fi # add MUX PCA9548#10 on PCA9548#2 CH7, assume to be i2c-97~104 if [ ! -e ${PATH_MUX_9548_10_CH0} ]; then _retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_10}' > ${PATH_MUX_9548_2_CH7}/new_device" else echo "pca9548 ${I2C_ADDR_MUX_9548_10} already init." fi _i2c_hwm_init _util_rmmod eeprom modprobe eeprom_mb modprobe gpio-pca953x _i2c_io_exp_init _i2c_sensors_init _i2c_cpld_init _i2c_psu_init _i2c_qsfp_eeprom_init "new" _i2c_sfp_eeprom_init "new" _i2c_mb_eeprom_init "new" _i2c_cb_eeprom_init "new" _i2c_fan_speed_init _i2c_led_psu_status_set _i2c_led_fan_status_set # clear port led _util_port_led_clear # rov for mac init _mac_vdd_init # trun on sys led echo "led_sys setup..." COLOR_LED="green" ONOFF_LED="on" echo "${COLOR_LED} ${ONOFF_LED}" _i2c_sys_led _config_rmem } function _mac_vdd_init { # read mac vid register value from CPLD cpld_index=1 _i2c_cpld_reg_read ${cpld_index} ${CPLD_ROV_STATUS_KEY} # get vid form register value [0:2] vid=$(($cpld_reg_val & 0x7)) # get rov val and reg according to vid rov_val=${rov_val_array[$vid]} rov_reg=${rov_reg_array[$vid]} echo "vid=${vid}, rov_val=${rov_val}, rov_reg=${rov_reg}" # write the rov reg to rov i2cset -y -r ${I2C_BUS_ROV} ${I2C_ADDR_ROV} 0x21 ${rov_reg} w if [ $? -eq 0 ]; then echo "set ROV for mac vdd done" else echo "set ROV for mac vdd fail" fi } #I2C Deinit function _i2c_deinit { echo "i2c deinit..." for mod in coretemp jc42 w83795 ingrasys_s9280_64x_psu ingrasys_s9280_64x_i2c_cpld eeprom eeprom_mb gpio-pca953x i2c_mux_pca954x i2c_i801; do _util_rmmod $mod done echo "Done" } function _i2c_cpld_init { echo "CPLD init..." _util_rmmod ingrasys_s9280_64x_i2c_cpld modprobe ingrasys_s9280_64x_i2c_cpld # add cpld 1~5 to sysfs for i in {1..5}; do local cpld_bus="I2C_BUS_CPLD${i}" local cpld_path="PATH_CPLD${i}_DEVICE" dev_path="${PATH_SYS_I2C_DEVICES}/${!cpld_bus}-$(printf "%04x" ${I2C_ADDR_CPLD})" if ! [ -L ${dev_path} ]; then echo "ingrasys_cpld${i} ${I2C_ADDR_CPLD}" > ${!cpld_path}/new_device else echo "${dev_path} already exist" fi done echo "Done" } function _i2c_sensors_init { echo "SENSORS init..." local dev_path # to make sure hwmon index in sysfs as expected, # need to remove kernel module and then probe them in expected order # remove all sensors kernel module _util_rmmod coretemp _util_rmmod jc42 _util_rmmod w83795 # probe coretemp kernel module modprobe coretemp #hwmon0 # probe hwmon kernel module modprobe w83795 # add w83795 to sysfs dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_1_CH7}-$(printf "%04x" ${I2C_ADDR_W83795})" if ! [ -L ${dev_path} ]; then echo "w83795adg ${I2C_ADDR_W83795}" > ${PATH_MUX_9548_1_CH7}/new_device #hwmon1 sleep 0.1 else echo "${dev_path} already exist" fi # add lm75/lm86 to sysfs ####Main board thermal ####lm75_1 dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH5}-$(printf "%04x" ${I2C_ADDR_LM75_1})" if ! [ -L ${dev_path} ]; then echo "lm75 ${I2C_ADDR_LM75_1}" > ${PATH_MUX_9548_0_CH5}/new_device # hwmon2 sleep 0.1 else echo "${dev_path} already exist" fi ####lm75_2 dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH5}-$(printf "%04x" ${I2C_ADDR_LM75_2})" if ! [ -L ${dev_path} ]; then echo "lm75 ${I2C_ADDR_LM75_2}" > ${PATH_MUX_9548_0_CH5}/new_device #hwmon3 sleep 0.1 else echo "${dev_path} already exist" fi ####lm86 dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH5}-$(printf "%04x" ${I2C_ADDR_LM86})" if ! [ -L ${dev_path} ]; then echo "lm86 ${I2C_ADDR_LM86}" > ${PATH_MUX_9548_0_CH5}/new_device #hwmon4 sleep 0.1 else echo "${dev_path} already exist" fi ####lm75_3 dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH6}-$(printf "%04x" ${I2C_ADDR_LM75_3})" if ! [ -L ${dev_path} ]; then echo "lm75 ${I2C_ADDR_LM75_3}" > ${PATH_MUX_9548_0_CH6}/new_device # hwmon5 sleep 0.1 else echo "${dev_path} already exist" fi ####lm75_4 dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_0_CH6}-$(printf "%04x" ${I2C_ADDR_LM75_4})" if ! [ -L ${dev_path} ]; then echo "lm75 ${I2C_ADDR_LM75_4}" > ${PATH_MUX_9548_0_CH6}/new_device #hwmon6 sleep 0.1 else echo "${dev_path} already exist" fi ####BMC board thermal dev_path="${PATH_SYS_I2C_DEVICES}/${NUM_MUX_9548_1_CH7}-$(printf "%04x" ${I2C_ADDR_TMP75_BB})" if ! [ -L ${dev_path} ]; then echo "tmp75 ${I2C_ADDR_TMP75_BB}" > ${PATH_MUX_9548_1_CH7}/new_device #hwmon7 sleep 0.1 else echo "${dev_path} already exist" fi ####CPU board thermal dev_path="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MAIN}-$(printf "%04x" ${I2C_ADDR_TMP75_CB})" if ! [ -L ${dev_path} ]; then echo "tmp75 ${I2C_ADDR_TMP75_CB}" > ${PATH_I801_DEVICE}/new_device #hwmon8 sleep 0.1 else echo "${dev_path} already exist" fi # probe jc42 kernel module modprobe jc42 #hwmon9 echo "Done" } #FAN Speed Init function _i2c_fan_speed_init { echo -n "FAN SPEED INIT..." if [ -e "${PATH_HWMON_W83795_DEVICE}" ]; then # init fan speed echo 120 > ${PATH_HWMON_W83795_DEVICE}/device/pwm2 echo "SUCCESS" else echo "FAIL" fi } # HWM init function _i2c_hwm_init { echo "HWM INIT..." # select bank0 _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x80 # SW reset, Disable monitor _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x01 0x9C # disable TR5/TR6 DTS _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x04 0x0 # enable FANIN1~8 _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x06 0xFF # disable FANIN9~14 _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x07 0x00 # CLKIN clock frequency set as 48Mhz _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x01 0x1C # select bank 2 _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x00 0x82 # set PWM mode in FOMC _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x0F 0x00 # set 25KHz fan output frequency in F1OPFP&F2OPFP _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x18 0x84 _util_i2cset -y -r ${I2C_BUS_HWM} ${I2C_ADDR_W83795} 0x19 0x84 } #IO Expander Init function _i2c_io_exp_init { echo "=========================================================" echo "# Description: I2C IO Expender Init" echo "=========================================================" # need to init BMC io expander first due to some io expander are reset default echo "Init BMC INT & HW ID IO Expander" # all input _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_1} ${REG_PORT0_DIR} 0xFF _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_1} ${REG_PORT1_DIR} 0xFF _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_1} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_1} ${REG_PORT1_POL} 0x00 echo "Init BMC PSU status IO Expander" # PWRON default 0 (ACTIVE_LOW) _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT0_OUT} 0x00 # default 0 (ACTIVE_LOW) _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT1_OUT} 0x00 # I/O 0.2 0.5 output(PWRON), rest input _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT0_DIR} 0xDB # I/O 1.0~1.1 input, 1.2~1.4 output (1.5~1.7 not enable) _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT1_DIR} 0xE3 _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_2} ${REG_PORT1_POL} 0x00 echo "Init BMC RST and SEL IO Expander" # RST default is 1 (ACTIVE_LOW) _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT0_OUT} 0x3F # SEL default is 0 (HOST), EN default is 1 (ACTIVE_HIGH) _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT1_OUT} 0x1F # I/O 0.0~0.5 output, 0.6~0.7 not use _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT0_DIR} 0xD0 # all output _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT1_DIR} 0x00 _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${I2C_BUS_MAIN} ${I2C_ADDR_MUX_9555_3} ${REG_PORT1_POL} 0x00 echo "Init System LED & HW ID IO Expander" # I/O_0.x for System LED default 0, I/O_1.x for HW ID _util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_OUT} 0x00 # System LED => all output _util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_DIR} 0x00 # HW ID => all input _util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT1_DIR} 0xFF _util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${REG_PORT1_POL} 0x00 echo "Init FAN Board Status IO Expander" # LED_G_H set to 1, LED_Y_G set to 0 (ACTIVE_HIGH) _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT0_OUT} 0x11 _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT1_OUT} 0x11 # DIR/ABS is input, LED_Y/LED_G is output _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT0_DIR} 0xCC _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT1_DIR} 0xCC _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${I2C_BUS_FAN_STATUS} ${I2C_ADDR_MUX_9555_0} ${REG_PORT1_POL} 0x00 echo "Init System SEL and RST IO Expander" # default 0 (ACTIVE high) # 0.4~0.5 SEL set to value 0 (host) # 0.2 LED_CLR set to 0 will clear all switch LED bitmap, set to 1 here _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_OUT} 0x04 # RST 1.6~1.7 default 1 (ACTIVE low), INT 1.0~1.4 default 1 (ACTIVE low) _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_OUT} 0xDF # all output, but ISO_TF_CORE_RST_N 0.0 need to set as input to prevent reboot issue _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_DIR} 0x09 # RST 1.6~1.7 output, rest are input _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_DIR} 0x3F _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_POL} 0x00 _util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_POL} 0x00 echo "Init CPU CPLD IO Expander (FIXME)" # all input #echo "NUM_MUX_9546_1_CH3=${NUM_MUX_9546_1_CH3}, I2C_ADDR_MUX_9539_2=${I2C_ADDR_MUX_9539_2}" #_util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_DIR} 0xFF # all input #_util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_DIR} 0xFF #_util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT0_POL} 0x00 #_util_i2cset -y -r ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_2} ${REG_PORT1_POL} 0x00 } #Set FAN Tray LED function _i2c_led_fan_tray_status_set { echo "FAN Tray Status Setup" #FAN Status get FAN1_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan1_alarm` FAN2_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan3_alarm` FAN3_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan5_alarm` FAN4_ALARM=`cat ${PATH_HWMON_W83795_DEVICE}/device/fan7_alarm` # check if io expander for fan tray exist result=`i2cget -y ${I2C_BUS_FANTRAY_LED} ${I2C_ADDR_MUX_9555_0} ${REG_PORT0_IN} 2>/dev/null` err_code=$? if [ "$err_code" != "0" ]; then echo "fan tray not exist!" return fi for FAN_TRAY in {1..4}; do FAN_ALARM="FAN${FAN_TRAY}_ALARM" if [ "${!FAN_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 ${FAN_TRAY}] [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 ${FAN_TRAY}] [Green]=off [Amber]=on" fi done } #Set FAN LED function _i2c_led_fan_status_set { echo "FAN Status Setup" #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` echo "led_fan setup..." # all fan ok if [ "${FAN1_ALARM}" == "0" ] \ && [ "${FAN3_ALARM}" == "0" ] \ && [ "${FAN5_ALARM}" == "0" ] \ && [ "${FAN7_ALARM}" == "0" ]; then COLOR_LED="green" echo "${COLOR_LED}" _i2c_fan_led # all fan fail elif [ "${FAN1_ALARM}" == "1" ] \ && [ "${FAN3_ALARM}" == "1" ] \ && [ "${FAN5_ALARM}" == "1" ] \ && [ "${FAN7_ALARM}" == "1" ] ; then COLOR_LED="amber" echo "${COLOR_LED}" _i2c_fan_led # partial fan fail else COLOR_LED="amber" echo "${COLOR_LED}" _i2c_fan_led fi # if fan not present, no led need to be set } #Set Power Supply LED function _i2c_led_psu_status_set { echo "PSU LED Status Setup" #PSU Status set _i2c_psu_status #PSU1 Status echo "led_psu1 setup..." if [ "${psu1Exist}" == ${PSU_EXIST} ]; then if [ "${psu1PwGood}" == ${PSU_DC_ON} ]; then COLOR_LED="green" echo "${COLOR_LED}" _i2c_psu1_led else COLOR_LED="amber" echo "${COLOR_LED}" _i2c_psu1_led fi else COLOR_LED="off" echo "${COLOR_LED}" _i2c_psu1_led fi #PSU2 Status echo "led_psu2 setup..." if [ "${psu2Exist}" == ${PSU_EXIST} ]; then if [ "${psu2PwGood}" == ${PSU_DC_ON} ]; then COLOR_LED="green" echo "${COLOR_LED}" _i2c_psu2_led else COLOR_LED="amber" echo "${COLOR_LED}" _i2c_psu2_led fi else COLOR_LED="off" echo "${COLOR_LED}" _i2c_psu2_led fi } #LED Test function _i2c_led_test { echo "=========================================================" echo "# Description: I2C SYSTEM LED TEST..." echo "=========================================================" #sys led (green) COLOR_LED="green" _i2c_sys_led _pause 'Check SYS LED green light and Press [Enter] key to continue...' #sys led (amber) COLOR_LED="amber" _i2c_sys_led _pause 'Check SYS LED amber light and Press [Enter] key to continue...' #FAN led (green) COLOR_LED="green" _i2c_fan_led _pause 'Check FAN LED green light and Press [Enter] key to continue...' #FAN led (amber) COLOR_LED="amber" _i2c_fan_led _pause 'Check FAN LED amber light and Press [Enter] key to continue...' #PSU1 led (green) COLOR_LED="green" _i2c_psu1_led _pause 'Check PSU1 LED green light and Press [Enter] key to continue...' #PSU1 led (amber) COLOR_LED="amber" _i2c_psu1_led _pause 'Check PSU1 LED amber light and Press [Enter] key to continue...' #PSU2 led (green) COLOR_LED="green" _i2c_psu2_led _pause 'Check PSU2 LED green light and Press [Enter] key to continue...' #PSU2 led (amber) COLOR_LED="amber" _i2c_psu2_led _pause 'Check PSU2 LED amber light and Press [Enter] key to continue...' #Turn OFF All LED (can't trun off system led) COLOR_LED="off" #_i2c_sys_led _i2c_fan_led _i2c_psu1_led _i2c_psu2_led _pause 'Check turn off all LEDs (exclude SYS LED) and Press [Enter] key to continue...' # restore sys led COLOR_LED="green" _i2c_sys_led } #Set QSFP Port cpld variable function _qsfp_cpld_var_set { local port=$1 local reg_port_base local reg_port_shift if [[ $1 -le 12 && $1 -ge 1 ]]; then cpld_index=1 reg_port_base=0 elif [[ $1 -le 25 && $1 -ge 13 ]]; then cpld_index=2 reg_port_base=12 elif [[ $1 -le 38 && $1 -ge 26 ]]; then cpld_index=3 reg_port_base=25 elif [[ $1 -le 51 && $1 -ge 39 ]]; then cpld_index=4 reg_port_base=38 elif [[ $1 -le 64 && $1 -ge 52 ]]; then cpld_index=5 reg_port_base=51 else echo "invalid port number" fi cpld_port_index=$(( $port - $reg_port_base )) } #Set QSFP Port eeporm variable function _qsfp_eeprom_var_set { local port=$1 local eeprombusbase local eeprombusshift # port 1 => zqsfp0 # port 2 => zqsfp1 # ... local port_group=$(( ($port - 1) / 8 )) case ${port_group} in 0) eeprombusbase=${NUM_MUX_9548_3_CH0} ;; 1) eeprombusbase=${NUM_MUX_9548_4_CH0} ;; 2) eeprombusbase=${NUM_MUX_9548_5_CH0} ;; 3) eeprombusbase=${NUM_MUX_9548_6_CH0} ;; 4) eeprombusbase=${NUM_MUX_9548_7_CH0} ;; 5) eeprombusbase=${NUM_MUX_9548_8_CH0} ;; 6) eeprombusbase=${NUM_MUX_9548_9_CH0} ;; 7) eeprombusbase=${NUM_MUX_9548_10_CH0} ;; *) ;; esac eeprombusshift=$(( (${port} - 1) % 8)) eepromBus=$(( ${eeprombusbase} + ${eeprombusshift} )) eepromAddr=${I2C_ADDR_QSFP_EEPROM} } #Set SFP Port cpld variable function _sfp_cpld_var_set { local port=$1 case ${port} in 1) cpld_index=1 ;; 2) cpld_index=1 ;; *) ;; esac } #Set QSFP Port eeporm variable function _sfp_eeprom_var_set { local port=$1 case ${port} in 1) eepromBus=${NUM_MUX_9546_1_CH0} ;; 2) eepromBus=${NUM_MUX_9546_1_CH1} ;; *) ;; esac eepromAddr=${I2C_ADDR_SFP_EEPROM} } #Get QSFP EEPROM Information function _i2c_qsfp_eeprom_get { local phy_port=0 # input parameter validation _util_input_check "${QSFP_PORT}" "${MIN_QSFP_PORT_NUM}" "${MAX_QSFP_PORT_NUM}" #get physical port phy_port=$(_port_fp2phy $QSFP_PORT) _qsfp_eeprom_var_set ${phy_port} _util_get_qsfp_abs if [ $status = 0 ]; then exit fi # debug echo "${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf '%04x' $eepromAddr)/eeprom | hexdump -C" cat ${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr)/eeprom | hexdump -C } #Init QSFP EEPROM function _i2c_qsfp_eeprom_init { echo "QSFP EEPROM INIT..." #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 1-64 ports EEPROM local i for i in {1..64}; do #get physical port phy_port=$(_port_fp2phy $i) _qsfp_eeprom_var_set ${phy_port} if [ "${action}" == "new" ] && \ ! [ -L ${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr) ]; then #echo "sff8436 $eepromAddr" > ${PATH_SYS_I2C_DEVICES}/i2c-$eepromBus/new_device echo "optoe1 $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 echo "Done" } #Get SFP EEPROM Information function _i2c_sfp_eeprom_get { # input parameter validation _util_input_check "${SFP_PORT}" "${MIN_SFP_PORT_NUM}" "${MAX_SFP_PORT_NUM}" _util_get_sfp_pres if [ $status = 0 ]; then exit fi _sfp_eeprom_var_set ${SFP_PORT} cat ${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr)/eeprom | hexdump -C } #Init SFP EEPROM function _i2c_sfp_eeprom_init { echo "SFP EEPROM INIT..." #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 1-2 sfp+ EEPROM local i for i in {1..2}; do _sfp_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 echo "optoe1 $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 echo "Done" } #Init Main Board EEPROM function _i2c_mb_eeprom_init { echo -n "Main Board EEPROM INIT..." #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 mb EEPROM if [ "${action}" == "new" ] && \ ! [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM) ]; then echo "mb_eeprom ${I2C_ADDR_MB_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_MB_EEPROM}/new_device elif [ "${action}" == "delete" ] && \ [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM) ]; then echo "$I2C_ADDR_MB_EEPROM" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_MB_EEPROM}/delete_device fi echo "Done" } #Init CPU Board EEPROM function _i2c_cb_eeprom_init { echo -n "CPU Board EEPROM INIT..." #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 cpu EEPROM if [ "${action}" == "new" ] && \ ! [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM) ]; then echo "mb_eeprom ${I2C_ADDR_CB_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CB_EEPROM}/new_device elif [ "${action}" == "delete" ] && \ [ -L ${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM) ]; then echo "$I2C_ADDR_CB_EEPROM" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_CB_EEPROM}/delete_device fi echo "Done" } #Init PSU Kernel Module function _i2c_psu_init { echo "=========================================================" echo "# Description: I2C PSU Init" echo "=========================================================" modprobe ingrasys_s9280_64x_psu echo "psu1 ${I2C_ADDR_PSU1_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU1_EEPROM}/new_device echo "psu2 ${I2C_ADDR_PSU2_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU2_EEPROM}/new_device } #Deinit PSU Kernel Module function _i2c_psu_deinit { echo "${I2C_ADDR_PSU1_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU1_EEPROM}/delete_device echo "${I2C_ADDR_PSU2_EEPROM}" > ${PATH_SYS_I2C_DEVICES}/i2c-${I2C_BUS_PSU2_EEPROM}/delete_device _util_rmmod ingrasys_s9280_64x_psu } #get QSFP Status function _i2c_qsfp_status_get { # input parameter validation _util_input_check "${QSFP_PORT}" "${MIN_QSFP_PORT_NUM}" "${MAX_QSFP_PORT_NUM}" local stat _util_get_qsfp_abs echo "status=$status" } #get QSFP Type function _i2c_qsfp_type_get { local phy_port=0 phy_port=$(_port_fp2phy ${QSFP_PORT}) # input parameter validation _util_input_check "${QSFP_PORT}" "${MIN_QSFP_PORT_NUM}" "${MAX_QSFP_PORT_NUM}" _qsfp_eeprom_var_set ${phy_port} #Get QSFP EEPROM info local size=255 eeprom_path="${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr)/eeprom" #echo "get ${eeprom_path}" qsfp_info=$(dd if=${eeprom_path} bs=${size} count=1 2>/dev/null | base64) 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 "identifier=$identifier" echo "connector=$connector" echo "transceiver=$transceiver" } function _i2c_sfp_status_get { # input parameter validation _util_input_check "${SFP_PORT}" "${MIN_SFP_PORT_NUM}" "${MAX_SFP_PORT_NUM}" local stat _util_get_sfp_pres #status: 0 -> Down, 1 -> Up if [ $status = 0 ]; then stat="down" else stat="up" fi echo "status is $stat" } #get SFP Type function _i2c_sfp_type_get { # input parameter validation _util_input_check "${SFP_PORT}" "${MIN_SFP_PORT_NUM}" "${MAX_SFP_PORT_NUM}" _sfp_eeprom_var_set ${SFP_PORT} #Get QSFP EEPROM info sfp_info=$(base64 ${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr)/eeprom) identifier=$(echo $sfp_info | base64 -d -i | hexdump -s 128 -n 1 -e '"%x"') connector=$(echo $sfp_info | base64 -d -i | hexdump -s 130 -n 1 -e '"%x"') transceiver=$(echo $sfp_info | base64 -d -i | hexdump -s 131 -n 1 -e '"%x"') echo "identifier=$identifier" echo "connector=$connector" echo "transceiver=$transceiver" } #Get PSU EEPROM Information function _i2c_psu_eeprom_get { local eeprom_psu1="" local eeprom_psu2="" echo "=========================================================" echo "# Description: I2C PSU EEPROM Get..." echo "=========================================================" eeprom_psu1="${PATH_SYSFS_PSU1}/psu_eeprom" cat ${eeprom_psu1} | hexdump -C eeprom_psu2="${PATH_SYSFS_PSU2}/psu_eeprom" cat ${eeprom_psu2} | hexdump -C } #Get Main Board EEPROM Information function _i2c_mb_eeprom_get { echo "=========================================================" echo "# Description: I2C MB EEPROM Get..." echo "=========================================================" _i2c_sys_eeprom_get mb } #Get CPU Board EEPROM Information function _i2c_cb_eeprom_get { echo "=========================================================" echo "# Description: I2C CB EEPROM Get..." echo "=========================================================" _i2c_sys_eeprom_get cb } #Get system EEPROM Information ##input: "cb" for cpu board, "mb" for main board function _i2c_sys_eeprom_get { local eeprom_dev if [ "$1" == "cb" ]; then eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM)/eeprom" elif [ "$1" == "mb" ]; then eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM)/eeprom" else echo "wrong eeprom type" return fi # check if eeprom device exist in sysfs if [ ! -f ${eeprom_dev} ]; then echo "eeprom device not init" return fi cat ${eeprom_dev} | hexdump -C echo "Done" } #sync eeprom content between mb and cb eeprom function _i2c_eeprom_sync { echo "=========================================================" echo "# Description: EEPROM sync..." echo "=========================================================" local mb_eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_MB_EEPROM}-$(printf "%04x" $I2C_ADDR_MB_EEPROM)/eeprom" local cb_eeprom_dev="${PATH_SYS_I2C_DEVICES}/${I2C_BUS_CB_EEPROM}-$(printf "%04x" $I2C_ADDR_CB_EEPROM)/eeprom" # check if eeprom device exist in sysfs if [[ ! -f ${mb_eeprom_dev} || ! -f ${cb_eeprom_dev} ]]; then echo "eeprom device not init" return fi ## check if MB eeprom is empty if [ ! -z "$(cat ${mb_eeprom_dev} | hexdump -n2 | grep ffff)" ]; then echo "copy cb eeprom to mb eeprom..." cat ${cb_eeprom_dev} > ${mb_eeprom_dev} else echo "no need to sync" fi echo "Done" } #Set System Status LED function _i2c_sys_led { # only green/amber, on/off can't control if [ "${COLOR_LED}" == "green" ]; then # set sys_led_g (0.7) = 1 output_reg=${REG_PORT0_OUT} mask=0x80 value=0x80 elif [ "${COLOR_LED}" == "amber" ]; then # set sys_led_g (0.7) = 0 output_reg=${REG_PORT0_OUT} mask=0x80 value=0x00 else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi #apply to io expander _util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value} echo "Done" } #Set FAN LED function _i2c_fan_led { if [ "${COLOR_LED}" == "green" ]; then # set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 0 output_reg=${REG_PORT0_OUT} mask=0x60 value=0x40 elif [ "${COLOR_LED}" == "amber" ]; then # set fan_led_en (0.6) = 1 & fan_led_y (0.5) = 1 output_reg=${REG_PORT0_OUT} mask=0x60 value=0x60 elif [ "${COLOR_LED}" == "off" ]; then # set fan_led_en (0.6) = 0 & fan_led_y (0.5) = 0 output_reg=${REG_PORT0_OUT} mask=0x60 value=0x00 else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi #apply to io expander _util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value} echo "Done" } #Set PSU1 LED function _i2c_psu1_led { if [ "${COLOR_LED}" == "green" ]; then # set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 0 output_reg=${REG_PORT0_OUT} mask=0x18 value=0x10 elif [ "${COLOR_LED}" == "amber" ]; then # set psu1_pwr_ok_oe (0.4) = 1 & psu1_led_y (0.3) = 1 output_reg=${REG_PORT0_OUT} mask=0x18 value=0x18 elif [ "${COLOR_LED}" == "off" ]; then # set psu1_pwr_ok_oe (0.4) = 0 & psu1_led_y (0.3) = 0 output_reg=${REG_PORT0_OUT} mask=0x18 value=0x00 else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi #apply to io expander _util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value} echo "Done" } #Set PSU2 LED function _i2c_psu2_led { if [ "${COLOR_LED}" == "green" ]; then # set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 0 output_reg=${REG_PORT0_OUT} mask=0x06 value=0x04 elif [ "${COLOR_LED}" == "amber" ]; then # set psu0_pwr_ok_oe (0.2) = 1 & psu0_led_y (0.1) = 1 output_reg=${REG_PORT0_OUT} mask=0x06 value=0x06 elif [ "${COLOR_LED}" == "off" ]; then # set psu0_pwr_ok_oe (0.2) = 0 & psu0_led_y (0.1) = 0 output_reg=${REG_PORT0_OUT} mask=0x06 value=0x00 else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi #apply to io expander _util_i2cset -m ${mask} -y ${I2C_BUS_SYS_LED} ${I2C_ADDR_MUX_9539_0} ${output_reg} ${value} echo "Done" } #Set FAN Tray LED function _i2c_fan_tray_led { i2cAddr=${I2C_ADDR_MUX_9555_0} output_reg=${REG_PORT0_OUT} case ${FAN_TRAY} in 1) output_reg=${REG_PORT0_OUT} if [ "${COLOR_LED}" == "green" ]; then mask=0x01 elif [ "${COLOR_LED}" == "amber" ]; then mask=0x02 fi ;; 2) output_reg=${REG_PORT0_OUT} if [ "${COLOR_LED}" == "green" ]; then mask=0x10 elif [ "${COLOR_LED}" == "amber" ]; then mask=0x20 fi ;; 3) output_reg=${REG_PORT1_OUT} if [ "${COLOR_LED}" == "green" ]; then mask=0x01 elif [ "${COLOR_LED}" == "amber" ]; then mask=0x02 fi ;; 4) output_reg=${REG_PORT1_OUT} if [ "${COLOR_LED}" == "green" ]; then mask=0x10 elif [ "${COLOR_LED}" == "amber" ]; then mask=0x20 fi ;; *) echo "Please input 1~4" exit ;; esac # LED PIN value is ACTIVE HIGH if [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "on" ]; then _util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0xff elif [ "${COLOR_LED}" == "green" ] && [ "${ONOFF_LED}" == "off" ]; then _util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x00 elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "on" ]; then _util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0xff elif [ "${COLOR_LED}" == "amber" ] && [ "${ONOFF_LED}" == "off" ]; then _util_i2cset -m $mask -y -r ${I2C_BUS_FANTRAY_LED} $i2cAddr ${output_reg} 0x00 else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi echo "Done" } #Get Board Version and Type function _i2c_board_type_get { # read input port 1 value from io expander input_reg=${REG_PORT1_IN} boardType=`i2cget -y ${I2C_BUS_HW_ID} ${I2C_ADDR_MUX_9539_0} ${input_reg}` boardBuildRev=$((($boardType) & 0x03)) boardHwRev=$((($boardType) >> 2 & 0x03)) boardId=$((($boardType) >> 4)) printf "MAIN_BOARD BOARD_ID is 0x%02x, HW Rev 0x%02x, Build Rev 0x%02x\n" $boardId $boardHwRev $boardBuildRev } #Get BMC Board Version and Type function _i2c_bmc_board_type_get { # read input port 1 value from io expander input_reg=${REG_PORT1_IN} boardType=`i2cget -y ${I2C_BUS_BMC_HW_ID} ${I2C_ADDR_MUX_9555_1} ${input_reg}` boardBuildRev=$((($boardType) & 0x03)) boardHwRev=$((($boardType) >> 2 & 0x03)) boardId=$((($boardType) >> 4)) printf "BMC_BOARD BOARD_ID is 0x%02x, HW Rev 0x%02x, Build Rev 0x%02x\n" $boardId $boardHwRev $boardBuildRev } #Get CPLD Version function _i2c_cpld_version { echo "=========================================================" echo "# Description: CPLD Version" echo "=========================================================" for i in {1..5}; do local cpld_bus="I2C_BUS_CPLD${i}" local cpld_path="PATH_CPLD${i}_DEVICE" local file_path="${PATH_SYS_I2C_DEVICES}/${!cpld_bus}-$(printf "%04x" ${I2C_ADDR_CPLD})/cpld_version" printf "[CPLD %d] %s\n" ${i} $(cat ${file_path}) done } #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 } #Get register value from CPLD function _i2c_cpld_reg_read { local idx=$1 local file_name=$2 local cpld_i2c_addr=${I2C_ADDR_CPLD} local reg_file_path case ${idx} in 1) cpld_i2c_bus=${I2C_BUS_CPLD1} ;; 2) cpld_i2c_bus=${I2C_BUS_CPLD2} ;; 3) cpld_i2c_bus=${I2C_BUS_CPLD3} ;; 4) cpld_i2c_bus=${I2C_BUS_CPLD4} ;; 5) cpld_i2c_bus=${I2C_BUS_CPLD5} ;; *) echo "invalid cpld index" exit ;; esac reg_file_path="${PATH_SYS_I2C_DEVICES}/${cpld_i2c_bus}-$(printf "%04x" ${cpld_i2c_addr})/${file_name}" cpld_reg_val=`cat ${reg_file_path}` } #util functions function _util_i2cset { if [ "$DEBUG" == "on" ]; then i2cset $@ else i2cset $@ 1>/dev/null fi } 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}` } function _util_rmmod { local mod=$1 [ "$(lsmod | grep "^$mod ")" != "" ] && rmmod $mod } # get qsfp presence function _util_get_qsfp_abs { local phy_port=0 #get physical port phy_port=$(_port_fp2phy $QSFP_PORT) # read status from cpld _qsfp_cpld_var_set ${phy_port} cpld_reg_file_name="${CPLD_QSFP_STATUS_KEY}_${cpld_port_index}" _i2c_cpld_reg_read ${cpld_index} ${cpld_reg_file_name} #status: 0 -> Down, 1 -> Up (ACTIVE_LOW in ABS_BIT) status=$(( $(( $((${cpld_reg_val})) & (1 << ($CPLD_QSFP_STATUS_ABS_BIT)) ))?0:1 )) } # get sfp presence function _util_get_sfp_pres { local pres_bit # read status from cpld _sfp_cpld_var_set ${SFP_PORT} cpld_reg_file_name="${CPLD_SFP_STATUS_KEY}" _i2c_cpld_reg_read ${cpld_index} ${cpld_reg_file_name} if [ "${SFP_PORT}" == "1" ]; then pres_bit=${CPLD_SFP0_STATUS_PRES_BIT} else pres_bit=${CPLD_SFP1_STATUS_PRES_BIT} fi #status: 0 -> Down, 1 -> Up (ACTIVE_LOW in PRES_BIT) status=$(( $(( $((${cpld_reg_val})) & (1 << ($pres_bit)) ))?0:1 )) } # valid input number function _util_input_check { # input parameter validation if [[ $1 -lt $2 || $1 -gt $3 ]]; then echo "Please input number $2~$3" exit fi } # clear all switch port led bitmap function _util_port_led_clear { echo "port led clear..." # gpio pin on GPIO MUX PCA9539#1 I/O 0.2 # pull low to reset bitamp output_reg=${REG_PORT0_OUT} mask=0x04 value=0x00 _util_i2cset -m ${mask} -y ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_1} ${output_reg} ${value} sleep 1 # pull high to out of reset value=0xFF _util_i2cset -m ${mask} -y ${NUM_MUX_9546_1_CH3} ${I2C_ADDR_MUX_9539_1} ${output_reg} ${value} echo "Done" } #Increase read socket buffer for CoPP Test function _config_rmem { echo "109430400" > /proc/sys/net/core/rmem_max } # util function to get logx value function logx { v=$1 n=$2 logx_res=$(echo "${v} ${n}" | awk '{printf "%f\n",log($1)/log($2)}') } # get qsfp ddm data function _i2c_qsfp_ddm_get { local phy_port=0 phy_port=$(_port_fp2phy ${QSFP_PORT}) # input parameter validation _util_input_check "${QSFP_PORT}" "${MIN_QSFP_PORT_NUM}" "${MAX_QSFP_PORT_NUM}" # check if port presence #status: 0 -> Down, 1 -> Up _util_get_qsfp_abs if [ "${status}" == "0" ]; then echo "port ${QSFP_PORT} not presence" return fi _qsfp_eeprom_var_set ${phy_port} # Get QSFP EEPROM info # only need first 128 bytes (page0) for ddm parsing local size=128 eeprom_path="${PATH_SYS_I2C_DEVICES}/$eepromBus-$(printf "%04x" $eepromAddr)/eeprom" #echo "get ${eeprom_path}" qsfp_info=$(dd if=${eeprom_path} bs=${size} count=1 2>/dev/null | base64) # temperature temp_val1=$(echo $qsfp_info | base64 -d -i | hexdump -s 22 -n 1 -e '"%d"') temp_val2=$(echo $qsfp_info | base64 -d -i | hexdump -s 23 -n 1 -e '"%d"') temp=$(echo "$temp_val1 $temp_val2" | awk '{printf "%f\n", $1 + $2/256.0}') #temp=$(( ${temp_val1} + ${temp_val2}/256.0 )) echo "temp=$temp" # voltage volt_val1=$(echo $qsfp_info | base64 -d -i | hexdump -s 26 -n 1 -e '"%d"') volt_val2=$(echo $qsfp_info | base64 -d -i | hexdump -s 27 -n 1 -e '"%d"') #volt=$(((($volt_val1 << 8) | volt_val2) / 10000)) volt_val3=$(( ($volt_val1 << 8) | $volt_val2 )) volt=$(echo "$volt_val3" | awk '{printf "%f\n", $1/10000.0}') echo "volt=$volt" # 4 channels for i in {0..3}; do echo "channel $i:" # txBias offset=$(( 42 + $i*2 )) txBias_val1=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') offset=$(( 43 + $i*2 )) txBias_val2=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') txBias_val3=$(( ($txBias_val1 << 8) | $txBias_val2 )) txBias=$(echo "$txBias_val3" | awk '{printf "%f\n", (131.0*$1)/65535}') echo " txBias=$txBias" # txPower offset=$(( 50 + $i*2 )) txPower_val1=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') offset=$(( 51 + $i*2 )) txPower_val2=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') txPower_val3=$(( ($txPower_val1 << 8) | $txPower_val2 )) txPower_val4=$(echo "$txPower_val3" | awk '{printf "%f\n", $1*0.0001}') logx $txPower_val4 10 txPower=$(echo "$logx_res" | awk '{printf "%f\n", $1*10}') echo " txPower=$txPower" # rxPower offset=$(( 34 + $i*2 )) rxPower_val1=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') offset=$(( 35 + $i*2 )) rxPower_val2=$(echo $qsfp_info | base64 -d -i | hexdump -s $offset -n 1 -e '"%d"') rxPower_val3=$(( ($rxPower_val1 << 8) | $rxPower_val2 )) rxPower_val4=$(echo "$rxPower_val3" | awk '{printf "%f\n", $1*0.0001}') logx $rxPower_val4 10 rxPower=$(echo "$logx_res" | awk '{printf "%f\n", $1*10}') echo " rxPower=$rxPower" done } #Main Function function _main { tart_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_fan_speed_init" ]; then _i2c_fan_speed_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_cb_eeprom_get" ]; then _i2c_cb_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_eeprom_sync" ]; then _i2c_eeprom_sync 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_sfp_eeprom_get" ]; then _i2c_sfp_eeprom_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_eeprom_init" ]; then _i2c_qsfp_eeprom_init ${QSFP_ACTION} elif [ "${EXEC_FUNC}" == "i2c_sfp_eeprom_init" ]; then _i2c_sfp_eeprom_init ${SFP_ACTION} elif [ "${EXEC_FUNC}" == "i2c_mb_eeprom_init" ]; then _i2c_mb_eeprom_init ${MB_EEPROM_ACTION} elif [ "${EXEC_FUNC}" == "i2c_cb_eeprom_init" ]; then _i2c_cb_eeprom_init ${MB_EEPROM_ACTION} elif [ "${EXEC_FUNC}" == "i2c_qsfp_status_get" ]; then _i2c_qsfp_status_get elif [ "${EXEC_FUNC}" == "i2c_sfp_status_get" ]; then _i2c_sfp_status_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_type_get" ]; then _i2c_qsfp_type_get elif [ "${EXEC_FUNC}" == "i2c_sfp_type_get" ]; then _i2c_sfp_type_get elif [ "${EXEC_FUNC}" == "i2c_qsfp_ddm_get" ]; then _i2c_qsfp_ddm_get 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_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_init _i2c_led_test _i2c_psu_eeprom_get _i2c_mb_eeprom_get _i2c_cb_eeprom_get _i2c_board_type_get _i2c_bmc_board_type_get _i2c_cpld_version _i2c_psu_status else echo "Invalid Parameters, Exit!!!" _help exit ${FALSE} fi if [ "$DEBUG" == "on" ]; then echo "-----------------------------------------------------" end_time_str=`date` end_time_sec=$(date +%s) diff_time=$[ ${end_time_sec} - ${start_time_sec} ] echo "Start Time: ${start_time_str} (${start_time_sec})" echo "End Time : ${end_time_str} (${end_time_sec})" echo "Total Execution Time: ${diff_time} sec" echo "done!!!" fi } _main