sonic-buildimage/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-eeprom-monitor
RogerX87 33db298d70
[devices]: Update the Wistron platform support in master branch (#12110)
* Update the Wistron platform support in master branch

Signed-off-by: RogerX87 <RogerX87@gmail.com>
2023-02-23 09:08:13 -08:00

597 lines
15 KiB
Bash
Executable File

#!/bin/bash
debug_flag=0
port_map=('00' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '1a' '1b' '1c' '1d' '1e' '1f' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29' '2a' '2b' '2c' '2d' '2e' '2f')
port_init=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
port_sfp_type=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
board_ver=$(ipmitool raw 0x30 0x25 0x1 0xe0 0x1 0x0 1>/dev/null 2>/dev/null; echo $?) #error will get 1 means EVT, otherwise DVT
byte_hex_test()
{
if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then
return 0
else
return 1
fi
}
pmon_status_check()
{
output=$( docker inspect -f '{{.State.Status}}' pmon 2>/dev/null)
if [ $? -eq 0 ]; then
if [ $output == 'running' ]; then
return 1
else
return 0
fi
else
return 0
fi
}
#$1=mux $2=channel $3=dev_addr, $4=reg, $5=val
bmc_write()
{
if [ $board_ver == 1 ]; then
addr_8b=$(echo $(($3)) | awk '{printf $1}')
addr_8b=`expr $addr_8b \\* 2`
ipmitool raw 0x30 0x85 $1 $2 $addr_8b 2 $4 $5 1>>/dev/null 2>>/dev/null
sleep 1
ipmitool raw 0x30 0x87 1>>/dev/null 2>>/dev/null
else
pmon_status_check
if [ $? -eq 1 ]; then
while [ $(docker exec pmon bash -c 'if [ -e /tmp/pause_eeprom_polling ]; then echo 1; else echo 0; fi') == '1' ]; do
sleep 0.1;
done
fi
mux_addr=$(((0x70 + $1 - 2) * 2))
chan=$((1 << $2))
addr_8b=$(echo $(($3)) | awk '{printf $1}')
addr_8b=`expr $addr_8b \\* 2`
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 $addr_8b 0x0 $4 $5 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
fi
}
#$1=mux $2=channel $3=dev_addr, $4=reg, $5=len
bmc_read()
{
if [ $board_ver == 1 ]; then
addr_8b=$(echo $(($3)) | awk '{printf $1}')
addr_8b=`expr $addr_8b \\* 2`
ipmitool raw 0x30 0x86 $1 $2 $addr_8b $5 $4 1>>/dev/null 2>>/dev/null
sleep 1
val=$(ipmitool raw 0x30 0x87 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
return 1
else
return 0
fi
else
mux_addr=$(((0x70 + $1 - 2) * 2))
chan=$((1 << $2))
addr_8b=$(echo $(($3)) | awk '{printf $1}')
addr_8b=`expr $addr_8b \\* 2`
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 $addr_8b $5 $4 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
return 1
else
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
return 0
fi
fi
}
bmc_dump()
{
err=0
mux_addr=$(((0x70 + $1 - 2) * 2))
chan=$((1 << $2))
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x0 2>>/dev/null)
if [ $? -eq 0 ];then
result1=$val
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result2=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x1 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result3=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x2 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result4=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x3 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result5=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x10 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result6=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x11 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null)
if [ $? -eq 0 ];then
result7=$val
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
if [ $err -eq 0 ];then
return 1
else
return 0
fi
}
bmc_update_dynamic()
{
local port=$1
i2cmux_dev=0
i2cmux_dev=`expr $port / 8`
i2cmux_dev=`expr $i2cmux_dev + 2`
ch=`expr $port % 8`
if [ ${port_sfp_type[$port]} -eq 17 ]; then
err=0
mux_addr=$(((0x70 + $i2cmux_dev - 2) * 2))
chan=$((1 << $ch))
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x3 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/rx_los"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x4 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tx_fault"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x56 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/disable"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x24 0x16 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
result=$(echo $result | sed 's/[[:space:]]//g')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/qsfp_dom_bulk"
result=$(echo $result | sed -e 's/ //g')
echo $result > $result_path
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
if [ $err -eq 0 ];then
return 1
else
return 0
fi
elif [ ${port_sfp_type[$port]} -eq 24 ]; then
err=0
mux_addr=$(((0x70 + $i2cmux_dev - 2) * 2))
chan=$((1 << $ch))
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x2 0xe 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
result=$(echo $result | sed 's/[[:space:]]//g')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tempe"
result=$(echo $result | sed -e 's/ //g')
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x2 0x10 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
result=$(echo $result | sed 's/[[:space:]]//g')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/volte"
result=$(echo $result | sed -e 's/ //g')
echo $result > $result_path
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x10 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x82 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/disable"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x11 1>>/dev/null 2>>/dev/null
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x87 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tx_fault"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x93 2>>/dev/null)
if [ $? -eq 0 ];then
result=$(echo $val | awk '{printf $1}')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/rx_los"
result=$( printf "%d" 0x$result )
echo $result > $result_path
else
err=1
fi
val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x30 0x9a 2>>/dev/null)
if [ $? -eq 0 ];then
result=$val
result=$(echo $result | sed 's/[[:space:]]//g')
result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/qsfp_dd_chan_mon"
result=$(echo $result | sed -e 's/ //g')
echo $result > $result_path
else
err=1
fi
ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null
if [ $err -eq 0 ];then
return 1
else
return 0
fi
fi
}
#$1=port_no
bmc_qsfp_eeprom_read()
{
local port=$1
local eeprom_part1
local eeprom_part2
local eeprom_part3
local eeprom_part4
local eeprom_part5
local eeprom_part6
local eeprom_part7
local eeprom1_full
local eeprom2_full
local eeprom3_full
port=`expr $port - 1`
i2cmux_dev=0
i2cmux_dev=`expr $port / 8`
i2cmux_dev=`expr $i2cmux_dev + 2`
ch=`expr $port % 8`
if [ ${port_init[$port]} -eq 0 ]; then
if [ $board_ver == 1 ]; then
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x00
bmc_read $i2cmux_dev $ch 0x50 0 128
if [ $? -eq 1 ];then
eeprom_part1=$result
else
return 1
fi
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part2=$result
else
return 1
fi
#QSFP-DD page1
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x01
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part3=$result
else
return 1
fi
#QSFP-DD page2
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x2
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part4=$result
else
return 1
fi
#QSFP-DD page3
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x3
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part5=$result
else
return 1
fi
#QSFP-DD page10
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x10
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part6=$result
else
return 1
fi
#QSFP-DD page11
bmc_write $i2cmux_dev $ch 0x50 0x7f 0x11
bmc_read $i2cmux_dev $ch 0x50 128 128
if [ $? -eq 1 ];then
eeprom_part7=$result
else
return 1
fi
else
#pmon_status_check
#if [ $? -eq 1 ]; then
# while [ $(docker exec pmon bash -c 'if [ -e /tmp/pause_eeprom_polling ]; then echo 1; else echo 0; fi') == '1' ]; do
# sleep 0.1;
# done
#fi
bmc_dump $i2cmux_dev $ch
if [ $? -eq 1 ];then
eeprom_part1=$result1
eeprom_part2=$result2
eeprom_part3=$result3
eeprom_part4=$result4
eeprom_part5=$result5
eeprom_part6=$result6
eeprom_part7=$result7
else
return 1
fi
fi
fi
if [ ${port_init[$port]} -eq 1 ]; then
eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1"
check=$(od -An -tx1 -w1 -v $eeprom1_path | head -n 1)
if [ $check != '00' ] && [ $check != 'ff' ] ; then
if [ -e /tmp/plugin_module_event ]; then
return
fi
bmc_update_dynamic $port
if [ $? -eq 0 ];then
return 1
fi
else
port_init[$port]=0
fi
fi
if [ ${port_init[$port]} -eq 0 ]; then
sfp_type=$(echo $eeprom_part1 | awk '{printf $1}')
byte_hex_test $sfp_type
if [ $? -eq 0 ]; then
return
fi
sfp_type=$( printf "%d" 0x$sfp_type )
port_sfp_type[$((i - 1))]=$sfp_type
#get temperature
if [ $sfp_type -eq 24 ];then
temp=$(echo $eeprom_part1 | awk '{printf $15}')
if [ $temp != "" ];then
temp=$( printf "%d" 0x$temp )
temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp"
echo $temp > $temp_path
fi
elif [ $sfp_type -eq 17 ];then
temp=$(echo $eeprom_part1 | awk '{printf $23}')
if [ $temp != "" ];then
temp=$( printf "%d" 0x$temp )
temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp"
echo $temp > $temp_path
fi
fi
#get lp_mode
lpmod_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/lp_mode"
if [ $sfp_type -eq 24 ];then
lpmod=$(echo $eeprom_part1 | awk '{printf $27}')
if [ $lpmod != "" ];then
state=$((lpmod&0x10))
if [ $state -eq 16 ];then
echo 1 > $lpmod_path
else
echo 0 > $lpmod_path
fi
fi
elif [ $sfp_type -eq 17 ];then
lpmod=$(echo $eeprom_part1 | awk '{printf $93}')
if [ $lpmod != "" ];then
state=$((lpmod&0x02))
if [ $state -eq 2 ];then
echo 1 > $lpmod_path
else
echo 0 > $lpmod_path
fi
fi
else
lpmod=""
fi
eeprom1_full=$eeprom_part1$eeprom_part2
eeprom1_full=$(echo $eeprom1_full | sed 's/[[:space:]]//g')
eeprom2_full=$eeprom_part3$eeprom_part4
eeprom2_full=$(echo $eeprom2_full | sed 's/[[:space:]]//g')
eeprom3_full=$eeprom_part5$eeprom_part6$eeprom_part7
eeprom3_full=$(echo $eeprom3_full | sed 's/[[:space:]]//g')
if [ $debug_flag -eq 0 ];then
eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1"
eeprom1_full=$(echo $eeprom1_full | sed -e 's/ //g')
echo $eeprom1_full > $eeprom1_path
eeprom2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom2"
eeprom2_full=$(echo $eeprom2_full | sed -e 's/ //g')
echo $eeprom2_full > $eeprom2_path
eeprom3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom3"
eeprom3_full=$(echo $eeprom3_full | sed -e 's/ //g')
echo $eeprom3_full > $eeprom3_path
else
printf "\nPort %d EEPROM:" $1
printf "\n-----------------------------------------------\n"
for i in $(seq 1 256);
do
printf "%s " ${eeprom1_full:0:2}
eeprom1_full=$(echo $eeprom1_full | sed 's/^..//')
val=`expr $i % 16`
if [ $val -eq 0 ];then
printf "\n"
fi
done
printf "\n-----------------------------------------------\n"
fi
if [ $board_ver == 0 ]; then
port_init[$port]=1
if [ $port -lt 16 ];then
cpld_path="/sys/bus/i2c/devices/0-0006/"
else
cpld_path="/sys/bus/i2c/devices/0-0007/"
fi
echo 1 > $cpld_path"port"$((port + 1))"_data_rdy"
fi
fi
return 0
}
TRANSCEIVER_DATA_READ()
{
first_detect=0
loop_after_plugin=0
while true
do
if [ -e /sys/bus/i2c/devices/0-0006/port1_present ] && [ -e /sys/bus/i2c/devices/0-0007/port32_present ] && [ -e /sys/bus/i2c/devices/0-002f/eeprom1 ];then
if [ $first_detect == 0 ]; then
ipmitool raw 0x30 0x25 0x1 0xe0 0x0 0x0 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xe2 0x0 0x0 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xe4 0x0 0x0 1>>/dev/null 2>>/dev/null
ipmitool raw 0x30 0x25 0x1 0xe6 0x0 0x0 1>>/dev/null 2>>/dev/null
fi
for i in $(seq 1 32);
do
if [ $i -le 16 ];then
cpld_path="/sys/bus/i2c/devices/0-0006/"
else
cpld_path="/sys/bus/i2c/devices/0-0007/"
fi
pre=$(cat $cpld_path"port"$i"_present")
if [ $pre == 1 ]; then
bmc_qsfp_eeprom_read $i
if [ $first_detect == 0 ]; then
first_detect=1
fi
else
port_init[$((i - 1))]=0
port_sfp_type[$((i - 1))]=0
fi
done
if [ $first_detect == 1 ]; then
touch /tmp/eeprom_init_done
fi
if [ -e /tmp/plugin_module_event ]; then
loop_after_plugin=$((loop_after_plugin + 1))
if [ $loop_after_plugin -gt 2 ]; then
rm /tmp/plugin_module_event
loop_after_plugin=0
fi
fi
pmon_status_check
if [ $? -eq 1 ]; then
if [ $first_detect == 1 ]; then
docker exec pmon bash -c 'echo "" > /tmp/eeprom_init_done'
fi
else
first_detect=0
fi
sleep 1;
fi
done
}
TRANSCEIVER_DATA_READ