ac2be9d99a
* remove nephos sonic-platform-modules-ingrasys module * [Ingrasys]Add platform drivers and device to support Debian Stretch * fix gpio init issue
1929 lines
63 KiB
Bash
Executable File
1929 lines
63 KiB
Bash
Executable File
#!/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 <http://www.gnu.org/licenses/>.
|
|
|
|
# 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
|